From ea93e1f5f6d28e0d0dc73804143254aa7b0a7264 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98-st?= <14942170+liu-st-lucky@user.noreply.gitee.com> Date: Fri, 8 Nov 2024 22:39:42 +0800 Subject: [PATCH] new newfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘-st <14942170+liu-st-lucky@user.noreply.gitee.com> --- .../demo/5-tim_adc/demo/.vscode/.attachinit | 16 + .../demo/5-tim_adc/demo/.vscode/.launchinit | 17 + .../demo/.vscode/c_cpp_properties.json | 21 + .../demo/5-tim_adc/demo/.vscode/launch.json | 52 + .../demo/5-tim_adc/demo/.vscode/problems.json | 1 + .../demo/5-tim_adc/demo/.vscode/settings.json | 6 + .../demo/analyzerJson/assembleFile.asm | 8978 ++ .../demo/analyzerJson/cfg/funcptr.txt | 39 + .../demo/analyzerJson/funcstack.json | 3755 + .../demo/analyzerJson/memoryDetails.json | 26732 ++++ vendor/others/demo/5-tim_adc/demo/board.bak | 1 + vendor/others/demo/5-tim_adc/demo/board.json | 1 + vendor/others/demo/5-tim_adc/demo/build/.gn | 21 + .../others/demo/5-tim_adc/demo/build/BUILD.gn | 339 + .../others/demo/5-tim_adc/demo/build/build.py | 586 + .../demo/5-tim_adc/demo/build/build_gn.py | 819 + .../demo/5-tim_adc/demo/build/config.ini | 16 + .../demo/build/config/BUILDCONFIG.gn | 25 + .../demo/build/config/hcc/userconfig.json | 127 + .../demo/build/config/hcc_fpu/userconfig.json | 129 + .../demo/build/createxml/mk_dfx_xml.json | 10 + .../demo/build/createxml/mk_prim_xml_step1.py | 171 + .../demo/build/createxml/mk_prim_xml_step2.py | 184 + .../demo/build/createxml/mss_prim_db.xml | 12 + .../demo/5-tim_adc/demo/build/ide_entry.py | 204 + .../5-tim_adc/demo/build/packet_create.py | 460 + .../5-tim_adc/demo/build/toolchain/BUILD.gn | 28 + .../5-tim_adc/demo/build/toolchain/config.gni | 131 + .../demo/5-tim_adc/demo/chip/3061m/anavref.h | 92 + .../demo/5-tim_adc/demo/chip/3061m/baseaddr.h | 202 + .../demo/5-tim_adc/demo/chip/3061m/chipinc.h | 37 + .../chip/3061m/chipinit/anatrim/anatrim.c | 128 + .../chip/3061m/chipinit/anatrim/anatrim.h | 36 + .../3061m/chipinit/anavrefinit/anavrefinit.c | 39 + .../3061m/chipinit/anavrefinit/anavrefinit.h | 32 + .../demo/chip/3061m/chipinit/chipinit.c | 69 + .../demo/chip/3061m/chipinit/chipinit.h | 31 + .../chip/3061m/chipinit/crginit/crginit.c | 65 + .../chip/3061m/chipinit/crginit/crginit.h | 33 + .../chip/3061m/chipinit/flashinit/flashinit.c | 111 + .../chip/3061m/chipinit/flashinit/flashinit.h | 32 + .../3061m/chipinit/systickinit/systickinit.c | 48 + .../3061m/chipinit/systickinit/systickinit.h | 29 + .../5-tim_adc/demo/chip/3061m/codecopy.json | 50 + .../demo/5-tim_adc/demo/chip/3061m/flash.lds | 202 + .../5-tim_adc/demo/chip/3061m/fotp/fotp.h | 499 + .../demo/chip/3061m/fotp/fotp_info_read.c | 106 + .../demo/chip/3061m/fotp/fotp_info_read.h | 31 + .../demo/5-tim_adc/demo/chip/3061m/info.h | 30 + .../5-tim_adc/demo/chip/3061m/interrupt_ip.h | 183 + .../demo/5-tim_adc/demo/chip/3061m/ioconfig.h | 126 + .../5-tim_adc/demo/chip/3061m/iomap/iomap.h | 320 + .../demo/chip/3061m/ip_crg/ip_crg_common.c | 127 + .../demo/chip/3061m/ip_crg/ip_crg_common.h | 82 + .../demo/5-tim_adc/demo/chip/3061m/locktype.h | 43 + .../demo/5-tim_adc/demo/chip/3061m/startup.S | 720 + .../demo/5-tim_adc/demo/chip/3061m/sysctrl.h | 563 + .../demo/5-tim_adc/demo/chip/3061m/systick.h | 110 + .../demo/chip/target/userconfig.json | 132 + vendor/others/demo/5-tim_adc/demo/demo.hiproj | 75 + .../demo/drivers/acmp/common/inc/acmp.h | 101 + .../5-tim_adc/demo/drivers/acmp/inc/acmp_ex.h | 51 + .../5-tim_adc/demo/drivers/acmp/inc/acmp_ip.h | 673 + .../5-tim_adc/demo/drivers/acmp/src/acmp.c | 313 + .../5-tim_adc/demo/drivers/acmp/src/acmp_ex.c | 45 + .../demo/drivers/adc/common/inc/adc.h | 128 + .../5-tim_adc/demo/drivers/adc/inc/adc_ex.h | 65 + .../5-tim_adc/demo/drivers/adc/inc/adc_ip.h | 3052 + .../demo/5-tim_adc/demo/drivers/adc/src/adc.c | 620 + .../5-tim_adc/demo/drivers/adc/src/adc_ex.c | 338 + .../demo/drivers/apt/common/inc/apt.h | 357 + .../5-tim_adc/demo/drivers/apt/inc/apt_ip.h | 3470 + .../demo/5-tim_adc/demo/drivers/apt/src/apt.c | 1432 + .../demo/drivers/base/common/inc/baseinc.h | 39 + .../5-tim_adc/demo/drivers/base/inc/assert.h | 96 + .../demo/drivers/base/inc/base_math.h | 116 + .../5-tim_adc/demo/drivers/base/inc/clock.h | 105 + .../demo/drivers/base/inc/generalfunc.h | 109 + .../demo/drivers/base/inc/interrupt.h | 318 + .../5-tim_adc/demo/drivers/base/inc/lock.h | 83 + .../5-tim_adc/demo/drivers/base/inc/reset.h | 60 + .../demo/drivers/base/inc/typedefs.h | 137 + .../5-tim_adc/demo/drivers/base/src/assert.c | 38 + .../demo/drivers/base/src/base_math.c | 392 + .../5-tim_adc/demo/drivers/base/src/clock.c | 103 + .../demo/drivers/base/src/generalfunc.c | 223 + .../demo/drivers/base/src/interrupt.c | 555 + .../5-tim_adc/demo/drivers/base/src/lock.c | 82 + .../5-tim_adc/demo/drivers/base/src/reset.c | 41 + .../demo/drivers/can/common/inc/can.h | 110 + .../5-tim_adc/demo/drivers/can/inc/can_ip.h | 1738 + .../demo/5-tim_adc/demo/drivers/can/src/can.c | 663 + .../demo/drivers/capm/common/inc/capm.h | 186 + .../5-tim_adc/demo/drivers/capm/inc/capm_ip.h | 1854 + .../5-tim_adc/demo/drivers/capm/src/capm.c | 439 + .../demo/drivers/cfd/common/inc/cfd.h | 111 + .../5-tim_adc/demo/drivers/cfd/inc/cfd_ip.h | 284 + .../demo/5-tim_adc/demo/drivers/cfd/src/cfd.c | 181 + .../demo/drivers/cmm/common/inc/cmm.h | 121 + .../5-tim_adc/demo/drivers/cmm/inc/cmm_ip.h | 612 + .../demo/5-tim_adc/demo/drivers/cmm/src/cmm.c | 235 + .../demo/drivers/crc/common/inc/crc.h | 100 + .../5-tim_adc/demo/drivers/crc/inc/crc_ip.h | 613 + .../demo/5-tim_adc/demo/drivers/crc/src/crc.c | 441 + .../demo/drivers/crg/common/inc/crg.h | 123 + .../5-tim_adc/demo/drivers/crg/inc/crg_ip.h | 1730 + .../demo/5-tim_adc/demo/drivers/crg/src/crg.c | 1130 + .../demo/drivers/dac/common/inc/dac.h | 81 + .../5-tim_adc/demo/drivers/dac/inc/dac_ip.h | 180 + .../demo/5-tim_adc/demo/drivers/dac/src/dac.c | 77 + .../5-tim_adc/demo/drivers/debug/inc/debug.h | 90 + .../demo/drivers/debug/log/inc/cmd.h | 89 + .../demo/drivers/debug/log/inc/cmd_common.h | 109 + .../demo/drivers/debug/log/inc/command.h | 91 + .../demo/drivers/debug/log/inc/common.h | 90 + .../demo/drivers/debug/log/inc/config.h | 114 + .../demo/drivers/debug/log/inc/console.h | 73 + .../demo/drivers/debug/log/inc/dfx_debug.h | 74 + .../demo/drivers/debug/log/inc/dfx_log.h | 142 + .../demo/drivers/debug/log/inc/errno.h | 65 + .../demo/drivers/debug/log/inc/event.h | 143 + .../demo/drivers/debug/log/inc/ext_log.h | 275 + .../demo/drivers/debug/log/inc/file_id_defs.h | 63 + .../demo/drivers/debug/log/inc/log.h | 146 + .../demo/drivers/debug/log/inc/module.h | 96 + .../demo/drivers/debug/log/inc/type.h | 73 + .../demo/drivers/debug/log/src/app_command.c | 525 + .../demo/drivers/debug/log/src/cmd.c | 56 + .../demo/drivers/debug/log/src/cmd_common.c | 67 + .../demo/drivers/debug/log/src/config.c | 143 + .../demo/drivers/debug/log/src/console.c | 442 + .../demo/drivers/debug/log/src/dfx_debug.c | 43 + .../demo/drivers/debug/log/src/dfx_log.c | 468 + .../demo/drivers/debug/log/src/dfx_log_proc.c | 195 + .../demo/drivers/debug/log/src/event.c | 91 + .../demo/drivers/debug/log/src/ext_command.c | 123 + .../5-tim_adc/demo/drivers/debug/src/debug.c | 416 + .../demo/drivers/dma/common/inc/dma.h | 134 + .../5-tim_adc/demo/drivers/dma/inc/dma_ex.h | 50 + .../5-tim_adc/demo/drivers/dma/inc/dma_ip.h | 919 + .../demo/5-tim_adc/demo/drivers/dma/src/dma.c | 722 + .../5-tim_adc/demo/drivers/dma/src/dma_ex.c | 42 + .../demo/drivers/flash/common/inc/flash.h | 124 + .../demo/drivers/flash/inc/flash_ip.h | 1156 + .../5-tim_adc/demo/drivers/flash/src/flash.c | 749 + .../demo/drivers/gpio/common/inc/gpio.h | 95 + .../5-tim_adc/demo/drivers/gpio/inc/gpio_ip.h | 678 + .../5-tim_adc/demo/drivers/gpio/src/gpio.c | 330 + .../demo/drivers/gpt/common/inc/gpt.h | 134 + .../5-tim_adc/demo/drivers/gpt/inc/gpt_ex.h | 68 + .../5-tim_adc/demo/drivers/gpt/inc/gpt_ip.h | 950 + .../demo/5-tim_adc/demo/drivers/gpt/src/gpt.c | 446 + .../5-tim_adc/demo/drivers/gpt/src/gpt_ex.c | 243 + .../demo/drivers/i2c/common/inc/i2c.h | 169 + .../5-tim_adc/demo/drivers/i2c/inc/i2c_ex.h | 57 + .../5-tim_adc/demo/drivers/i2c/inc/i2c_ip.h | 1960 + .../demo/5-tim_adc/demo/drivers/i2c/src/i2c.c | 2037 + .../5-tim_adc/demo/drivers/i2c/src/i2c_ex.c | 166 + .../demo/drivers/iocmg/common/iocmg.h | 92 + .../demo/drivers/iocmg/inc/iocmg_ip.h | 348 + .../5-tim_adc/demo/drivers/iocmg/src/iocmg.c | 283 + .../demo/drivers/iwdg/common/inc/iwdg.h | 97 + .../5-tim_adc/demo/drivers/iwdg/inc/iwdg_ex.h | 50 + .../5-tim_adc/demo/drivers/iwdg/inc/iwdg_ip.h | 439 + .../5-tim_adc/demo/drivers/iwdg/src/iwdg.c | 220 + .../5-tim_adc/demo/drivers/iwdg/src/iwdg_ex.c | 129 + .../demo/drivers/pga/common/inc/pga.h | 81 + .../5-tim_adc/demo/drivers/pga/inc/pga_ip.h | 333 + .../demo/5-tim_adc/demo/drivers/pga/src/pga.c | 101 + .../demo/drivers/pmc/common/inc/pmc.h | 96 + .../5-tim_adc/demo/drivers/pmc/inc/pmc_ip.h | 632 + .../demo/5-tim_adc/demo/drivers/pmc/src/pmc.c | 199 + .../demo/drivers/qdm/common/inc/qdm.h | 156 + .../5-tim_adc/demo/drivers/qdm/inc/qdm_ip.h | 1663 + .../demo/5-tim_adc/demo/drivers/qdm/src/qdm.c | 550 + .../demo/drivers/spi/common/inc/spi.h | 188 + .../5-tim_adc/demo/drivers/spi/inc/spi_ex.h | 49 + .../5-tim_adc/demo/drivers/spi/inc/spi_ip.h | 1237 + .../demo/5-tim_adc/demo/drivers/spi/src/spi.c | 1171 + .../5-tim_adc/demo/drivers/spi/src/spi_ex.c | 54 + .../demo/drivers/timer/common/inc/timer.h | 112 + .../demo/drivers/timer/inc/timer_ex.h | 48 + .../demo/drivers/timer/inc/timer_ip.h | 666 + .../5-tim_adc/demo/drivers/timer/src/timer.c | 290 + .../demo/drivers/timer/src/timer_ex.c | 57 + .../demo/drivers/tsensor/common/inc/tsensor.h | 53 + .../demo/drivers/tsensor/inc/tsensor_ip.h | 80 + .../demo/drivers/tsensor/src/tsensor.c | 152 + .../demo/drivers/uart/common/inc/uart.h | 134 + .../5-tim_adc/demo/drivers/uart/inc/uart_ex.h | 65 + .../5-tim_adc/demo/drivers/uart/inc/uart_ip.h | 1118 + .../5-tim_adc/demo/drivers/uart/src/uart.c | 884 + .../5-tim_adc/demo/drivers/uart/src/uart_ex.c | 142 + .../demo/drivers/wwdg/common/inc/wwdg.h | 99 + .../5-tim_adc/demo/drivers/wwdg/inc/wwdg_ex.h | 49 + .../5-tim_adc/demo/drivers/wwdg/inc/wwdg_ip.h | 516 + .../5-tim_adc/demo/drivers/wwdg/src/wwdg.c | 256 + .../5-tim_adc/demo/drivers/wwdg/src/wwdg_ex.c | 52 + .../adc_calibra/mcs_adcCalibr.c | 98 + .../adc_calibra/mcs_adcCalibr.h | 55 + .../control_library/brake/mcs_brake.c | 105 + .../control_library/brake/mcs_brake.h | 61 + .../control_library/filter/mcs_filter.c | 94 + .../control_library/filter/mcs_filter.h | 61 + .../control_library/filter/mcs_lpfRk4.c | 82 + .../control_library/filter/mcs_lpfRk4.h | 39 + .../control_library/filter/mcs_pll.c | 142 + .../control_library/filter/mcs_pll.h | 72 + .../foc_loop_ctrl/mcs_curr_ctrl.c | 148 + .../foc_loop_ctrl/mcs_curr_ctrl.h | 87 + .../foc_loop_ctrl/mcs_curr_ff.c | 50 + .../foc_loop_ctrl/mcs_curr_ff.h | 31 + .../foc_loop_ctrl/mcs_fw_ctrl.c | 130 + .../foc_loop_ctrl/mcs_fw_ctrl.h | 45 + .../foc_loop_ctrl/mcs_if_ctrl.c | 115 + .../foc_loop_ctrl/mcs_if_ctrl.h | 76 + .../foc_loop_ctrl/mcs_pos_ctrl.c | 218 + .../foc_loop_ctrl/mcs_pos_ctrl.h | 97 + .../foc_loop_ctrl/mcs_spd_ctrl.c | 96 + .../foc_loop_ctrl/mcs_spd_ctrl.h | 49 + .../foc_loop_ctrl/mcs_startup.c | 75 + .../foc_loop_ctrl/mcs_startup.h | 63 + .../control_library/math/mcs_math.c | 557 + .../control_library/math/mcs_math.h | 63 + .../control_library/math/mcs_math_const.h | 72 + .../control_library/modulation/mcs_r1_svpwm.c | 234 + .../control_library/modulation/mcs_r1_svpwm.h | 90 + .../control_library/modulation/mcs_svpwm.c | 217 + .../control_library/modulation/mcs_svpwm.h | 117 + .../control_library/observer/mcs_fosmo.c | 199 + .../control_library/observer/mcs_fosmo.h | 106 + .../control_library/pfc/pfc_curr_ctrl.c | 50 + .../control_library/pfc/pfc_curr_ctrl.h | 79 + .../control_library/pfc/pfc_volt_ctrl.c | 51 + .../control_library/pfc/pfc_volt_ctrl.h | 72 + .../pid_controller/mcs_pid_ctrl.c | 199 + .../pid_controller/mcs_pid_ctrl.h | 105 + .../control_library/power/mcs_power_mgmt.c | 71 + .../control_library/power/mcs_power_mgmt.h | 44 + .../protection/mcs_openphs_det.c | 87 + .../protection/mcs_openphs_det.h | 51 + .../protection/mcs_stall_det.c | 90 + .../protection/mcs_stall_det.h | 44 + .../protection/mcs_unbalance_det.c | 225 + .../protection/mcs_unbalance_det.h | 55 + .../control_library/ramp/mcs_ramp_mgmt.c | 96 + .../control_library/ramp/mcs_ramp_mgmt.h | 49 + .../control_library/utilities/mcs_assert.h | 57 + .../control_library/utilities/mcs_mtr_param.c | 47 + .../control_library/utilities/mcs_mtr_param.h | 59 + .../utilities/mcs_sys_status.h | 188 + .../control_library/utilities/mcs_typedef.h | 59 + .../control_library/vf/mcs_vf_ctrl.c | 155 + .../control_library/vf/mcs_vf_ctrl.h | 53 + .../hisilicon/libboundscheck_v1.1.16/LICENSE | 124 + .../hisilicon/libboundscheck_v1.1.16/Makefile | 44 + .../libboundscheck_v1.1.16/README.en.md | 59 + .../libboundscheck_v1.1.16/README.md | 56 + .../libboundscheck_v1.1.16/include/securec.h | 637 + .../include/securectype.h | 585 + .../libboundscheck_v1.1.16/src/fscanf_s.c | 53 + .../libboundscheck_v1.1.16/src/fwscanf_s.c | 52 + .../libboundscheck_v1.1.16/src/gets_s.c | 71 + .../libboundscheck_v1.1.16/src/input.inl | 2229 + .../libboundscheck_v1.1.16/src/memcpy_s.c | 555 + .../libboundscheck_v1.1.16/src/memmove_s.c | 123 + .../libboundscheck_v1.1.16/src/memset_s.c | 510 + .../libboundscheck_v1.1.16/src/output.inl | 1720 + .../libboundscheck_v1.1.16/src/scanf_s.c | 51 + .../libboundscheck_v1.1.16/src/secinput.h | 181 + .../libboundscheck_v1.1.16/src/securecutil.c | 81 + .../libboundscheck_v1.1.16/src/securecutil.h | 574 + .../src/secureinput_a.c | 38 + .../src/secureinput_w.c | 75 + .../src/secureprintoutput.h | 153 + .../src/secureprintoutput_a.c | 112 + .../src/secureprintoutput_w.c | 41 + .../libboundscheck_v1.1.16/src/snprintf_s.c | 110 + .../libboundscheck_v1.1.16/src/sprintf_s.c | 58 + .../libboundscheck_v1.1.16/src/sscanf_s.c | 58 + .../libboundscheck_v1.1.16/src/strcat_s.c | 101 + .../libboundscheck_v1.1.16/src/strcpy_s.c | 353 + .../libboundscheck_v1.1.16/src/strncat_s.c | 119 + .../libboundscheck_v1.1.16/src/strncpy_s.c | 145 + .../libboundscheck_v1.1.16/src/strtok_s.c | 116 + .../libboundscheck_v1.1.16/src/swprintf_s.c | 48 + .../libboundscheck_v1.1.16/src/swscanf_s.c | 54 + .../libboundscheck_v1.1.16/src/vfscanf_s.c | 64 + .../libboundscheck_v1.1.16/src/vfwscanf_s.c | 67 + .../libboundscheck_v1.1.16/src/vscanf_s.c | 63 + .../libboundscheck_v1.1.16/src/vsnprintf_s.c | 138 + .../libboundscheck_v1.1.16/src/vsprintf_s.c | 67 + .../libboundscheck_v1.1.16/src/vsscanf_s.c | 87 + .../libboundscheck_v1.1.16/src/vswprintf_s.c | 62 + .../libboundscheck_v1.1.16/src/vswscanf_s.c | 79 + .../libboundscheck_v1.1.16/src/vwscanf_s.c | 64 + .../libboundscheck_v1.1.16/src/wcscat_s.c | 107 + .../libboundscheck_v1.1.16/src/wcscpy_s.c | 86 + .../libboundscheck_v1.1.16/src/wcsncat_s.c | 113 + .../libboundscheck_v1.1.16/src/wcsncpy_s.c | 107 + .../libboundscheck_v1.1.16/src/wcstok_s.c | 112 + .../libboundscheck_v1.1.16/src/wmemcpy_s.c | 71 + .../libboundscheck_v1.1.16/src/wmemmove_s.c | 70 + .../libboundscheck_v1.1.16/src/wscanf_s.c | 52 + .../thirdparty/sysroot/include/mcs_smo_4th.h | 71 + .../thirdparty/sysroot/include/nos_task.h | 84 + .../thirdparty/sysroot/lib/libmcs_smo_4th.a | Bin 0 -> 3834 bytes .../thirdparty/sysroot/lib/libnostask.a | Bin 0 -> 54870 bytes .../demo/5-tim_adc/demo/out/.ninja_deps | Bin 0 -> 76332 bytes .../others/demo/5-tim_adc/demo/out/.ninja_log | 136 + vendor/others/demo/5-tim_adc/demo/out/args.gn | 2 + .../demo/5-tim_adc/demo/out/bin/target.bin | Bin 0 -> 26752 bytes .../demo/5-tim_adc/demo/out/bin/target.elf | Bin 0 -> 384968 bytes .../demo/5-tim_adc/demo/out/bin/target.hex | 1676 + .../demo/5-tim_adc/demo/out/bin/target.list | 123991 +++++++++++++++ .../demo/5-tim_adc/demo/out/bin/target.map | 7335 + .../others/demo/5-tim_adc/demo/out/build.log | 12 + .../demo/5-tim_adc/demo/out/build.ninja | 20 + .../demo/5-tim_adc/demo/out/build.ninja.d | 1 + vendor/others/demo/5-tim_adc/demo/out/log.xml | 8 + .../demo/out/obj/build/target.elf.ninja | 404 + .../obj/chip/3061m/chipinit/anatrim/anatrim.o | Bin 0 -> 73424 bytes .../3061m/chipinit/anavrefinit/anavrefinit.o | Bin 0 -> 6760 bytes .../out/obj/chip/3061m/chipinit/chipinit.o | Bin 0 -> 58336 bytes .../obj/chip/3061m/chipinit/crginit/crginit.o | Bin 0 -> 34320 bytes .../chip/3061m/chipinit/flashinit/flashinit.o | Bin 0 -> 20932 bytes .../3061m/chipinit/systickinit/systickinit.o | Bin 0 -> 6040 bytes .../out/obj/chip/3061m/fotp/fotp_info_read.o | Bin 0 -> 21580 bytes .../out/obj/chip/3061m/ip_crg/ip_crg_common.o | Bin 0 -> 6284 bytes .../demo/out/obj/chip/3061m/startup.o | Bin 0 -> 24292 bytes .../demo/out/obj/drivers/acmp/src/acmp.o | Bin 0 -> 40904 bytes .../demo/out/obj/drivers/acmp/src/acmp_ex.o | Bin 0 -> 14448 bytes .../demo/out/obj/drivers/adc/src/adc.o | Bin 0 -> 181660 bytes .../demo/out/obj/drivers/adc/src/adc_ex.o | Bin 0 -> 142480 bytes .../demo/out/obj/drivers/apt/src/apt.o | Bin 0 -> 202308 bytes .../demo/out/obj/drivers/base/src/assert.o | Bin 0 -> 3972 bytes .../demo/out/obj/drivers/base/src/base_math.o | Bin 0 -> 23680 bytes .../demo/out/obj/drivers/base/src/clock.o | Bin 0 -> 11852 bytes .../out/obj/drivers/base/src/generalfunc.o | Bin 0 -> 24712 bytes .../demo/out/obj/drivers/base/src/interrupt.o | Bin 0 -> 48924 bytes .../demo/out/obj/drivers/base/src/lock.o | Bin 0 -> 9516 bytes .../demo/out/obj/drivers/base/src/reset.o | Bin 0 -> 37284 bytes .../demo/out/obj/drivers/can/src/can.o | Bin 0 -> 60404 bytes .../demo/out/obj/drivers/capm/src/capm.o | Bin 0 -> 126476 bytes .../demo/out/obj/drivers/cfd/src/cfd.o | Bin 0 -> 61104 bytes .../demo/out/obj/drivers/cmm/src/cmm.o | Bin 0 -> 53720 bytes .../demo/out/obj/drivers/crc/src/crc.o | Bin 0 -> 70932 bytes .../demo/out/obj/drivers/crg/src/crg.o | Bin 0 -> 150996 bytes .../demo/out/obj/drivers/dac/src/dac.o | Bin 0 -> 11588 bytes .../obj/drivers/debug/log/src/app_command.o | Bin 0 -> 40952 bytes .../demo/out/obj/drivers/debug/log/src/cmd.o | Bin 0 -> 7148 bytes .../obj/drivers/debug/log/src/cmd_common.o | Bin 0 -> 5540 bytes .../out/obj/drivers/debug/log/src/config.o | Bin 0 -> 13740 bytes .../out/obj/drivers/debug/log/src/console.o | Bin 0 -> 67940 bytes .../out/obj/drivers/debug/log/src/dfx_debug.o | Bin 0 -> 6172 bytes .../out/obj/drivers/debug/log/src/dfx_log.o | Bin 0 -> 40008 bytes .../obj/drivers/debug/log/src/dfx_log_proc.o | Bin 0 -> 21028 bytes .../out/obj/drivers/debug/log/src/event.o | Bin 0 -> 10092 bytes .../obj/drivers/debug/log/src/ext_command.o | Bin 0 -> 12188 bytes .../demo/out/obj/drivers/debug/src/debug.o | Bin 0 -> 65420 bytes .../demo/out/obj/drivers/dma/src/dma.o | Bin 0 -> 95084 bytes .../demo/out/obj/drivers/dma/src/dma_ex.o | Bin 0 -> 25088 bytes .../demo/out/obj/drivers/flash/src/flash.o | Bin 0 -> 83804 bytes .../demo/out/obj/drivers/gpio/src/gpio.o | Bin 0 -> 67048 bytes .../demo/out/obj/drivers/gpt/src/gpt.o | Bin 0 -> 60644 bytes .../demo/out/obj/drivers/gpt/src/gpt_ex.o | Bin 0 -> 33588 bytes .../demo/out/obj/drivers/i2c/src/i2c.o | Bin 0 -> 196136 bytes .../demo/out/obj/drivers/i2c/src/i2c_ex.o | Bin 0 -> 58688 bytes .../demo/out/obj/drivers/iocmg/src/iocmg.o | Bin 0 -> 56484 bytes .../demo/out/obj/drivers/iwdg/src/iwdg.o | Bin 0 -> 38952 bytes .../demo/out/obj/drivers/iwdg/src/iwdg_ex.o | Bin 0 -> 24292 bytes .../demo/out/obj/drivers/pga/src/pga.o | Bin 0 -> 17668 bytes .../demo/out/obj/drivers/pmc/src/pmc.o | Bin 0 -> 38096 bytes .../demo/out/obj/drivers/qdm/src/qdm.o | Bin 0 -> 84848 bytes .../demo/out/obj/drivers/spi/src/spi.o | Bin 0 -> 142416 bytes .../demo/out/obj/drivers/spi/src/spi_ex.o | Bin 0 -> 32548 bytes .../demo/out/obj/drivers/timer/src/timer.o | Bin 0 -> 41576 bytes .../demo/out/obj/drivers/timer/src/timer_ex.o | Bin 0 -> 12008 bytes .../out/obj/drivers/tsensor/src/tsensor.o | Bin 0 -> 97676 bytes .../demo/out/obj/drivers/uart/src/uart.o | Bin 0 -> 127308 bytes .../demo/out/obj/drivers/uart/src/uart_ex.o | Bin 0 -> 52904 bytes .../demo/out/obj/drivers/wwdg/src/wwdg.o | Bin 0 -> 47772 bytes .../demo/out/obj/drivers/wwdg/src/wwdg_ex.o | Bin 0 -> 12792 bytes .../adc_calibra/mcs_adcCalibr.o | Bin 0 -> 84032 bytes .../control_library/brake/mcs_brake.o | Bin 0 -> 11372 bytes .../control_library/filter/mcs_filter.o | Bin 0 -> 10552 bytes .../control_library/filter/mcs_lpfRk4.o | Bin 0 -> 8324 bytes .../control_library/filter/mcs_pll.o | Bin 0 -> 16100 bytes .../foc_loop_ctrl/mcs_curr_ctrl.o | Bin 0 -> 15992 bytes .../foc_loop_ctrl/mcs_curr_ff.o | Bin 0 -> 6664 bytes .../foc_loop_ctrl/mcs_fw_ctrl.o | Bin 0 -> 13560 bytes .../foc_loop_ctrl/mcs_if_ctrl.o | Bin 0 -> 12632 bytes .../foc_loop_ctrl/mcs_pos_ctrl.o | Bin 0 -> 20060 bytes .../foc_loop_ctrl/mcs_spd_ctrl.o | Bin 0 -> 11748 bytes .../foc_loop_ctrl/mcs_startup.o | Bin 0 -> 9268 bytes .../control_library/math/mcs_math.o | Bin 0 -> 42120 bytes .../control_library/modulation/mcs_r1_svpwm.o | Bin 0 -> 20700 bytes .../control_library/modulation/mcs_svpwm.o | Bin 0 -> 18864 bytes .../control_library/observer/mcs_fosmo.o | Bin 0 -> 23472 bytes .../control_library/pfc/pfc_curr_ctrl.o | Bin 0 -> 7416 bytes .../control_library/pfc/pfc_volt_ctrl.o | Bin 0 -> 7052 bytes .../pid_controller/mcs_pid_ctrl.o | Bin 0 -> 18920 bytes .../control_library/power/mcs_power_mgmt.o | Bin 0 -> 8340 bytes .../protection/mcs_openphs_det.o | Bin 0 -> 9764 bytes .../protection/mcs_stall_det.o | Bin 0 -> 9940 bytes .../protection/mcs_unbalance_det.o | Bin 0 -> 19476 bytes .../control_library/ramp/mcs_ramp_mgmt.o | Bin 0 -> 10784 bytes .../control_library/utilities/mcs_mtr_param.o | Bin 0 -> 6060 bytes .../control_library/vf/mcs_vf_ctrl.o | Bin 0 -> 16776 bytes .../libboundscheck_v1.1.16/src/fscanf_s.o | Bin 0 -> 5224 bytes .../libboundscheck_v1.1.16/src/fwscanf_s.o | Bin 0 -> 5296 bytes .../libboundscheck_v1.1.16/src/gets_s.o | Bin 0 -> 7220 bytes .../libboundscheck_v1.1.16/src/memcpy_s.o | Bin 0 -> 59132 bytes .../libboundscheck_v1.1.16/src/memmove_s.o | Bin 0 -> 6504 bytes .../libboundscheck_v1.1.16/src/memset_s.o | Bin 0 -> 62772 bytes .../libboundscheck_v1.1.16/src/scanf_s.o | Bin 0 -> 5152 bytes .../libboundscheck_v1.1.16/src/securecutil.o | Bin 0 -> 5188 bytes .../src/secureinput_a.o | Bin 0 -> 132252 bytes .../src/secureinput_w.o | Bin 0 -> 135216 bytes .../src/secureprintoutput_a.o | Bin 0 -> 108444 bytes .../src/secureprintoutput_w.o | Bin 0 -> 108992 bytes .../libboundscheck_v1.1.16/src/snprintf_s.o | Bin 0 -> 6576 bytes .../libboundscheck_v1.1.16/src/sprintf_s.o | Bin 0 -> 5368 bytes .../libboundscheck_v1.1.16/src/sscanf_s.o | Bin 0 -> 5224 bytes .../libboundscheck_v1.1.16/src/strcat_s.o | Bin 0 -> 9544 bytes .../libboundscheck_v1.1.16/src/strcpy_s.o | Bin 0 -> 22992 bytes .../libboundscheck_v1.1.16/src/strncat_s.o | Bin 0 -> 9804 bytes .../libboundscheck_v1.1.16/src/strncpy_s.o | Bin 0 -> 12396 bytes .../libboundscheck_v1.1.16/src/strtok_s.o | Bin 0 -> 11112 bytes .../libboundscheck_v1.1.16/src/swprintf_s.o | Bin 0 -> 5432 bytes .../libboundscheck_v1.1.16/src/swscanf_s.o | Bin 0 -> 5296 bytes .../libboundscheck_v1.1.16/src/vfscanf_s.o | Bin 0 -> 6576 bytes .../libboundscheck_v1.1.16/src/vfwscanf_s.o | Bin 0 -> 6656 bytes .../libboundscheck_v1.1.16/src/vscanf_s.o | Bin 0 -> 6292 bytes .../libboundscheck_v1.1.16/src/vsnprintf_s.o | Bin 0 -> 8856 bytes .../libboundscheck_v1.1.16/src/vsprintf_s.o | Bin 0 -> 6272 bytes .../libboundscheck_v1.1.16/src/vsscanf_s.o | Bin 0 -> 6784 bytes .../libboundscheck_v1.1.16/src/vswprintf_s.o | Bin 0 -> 6344 bytes .../libboundscheck_v1.1.16/src/vswscanf_s.o | Bin 0 -> 7968 bytes .../libboundscheck_v1.1.16/src/vwscanf_s.o | Bin 0 -> 6368 bytes .../libboundscheck_v1.1.16/src/wcscat_s.o | Bin 0 -> 9588 bytes .../libboundscheck_v1.1.16/src/wcscpy_s.o | Bin 0 -> 8476 bytes .../libboundscheck_v1.1.16/src/wcsncat_s.o | Bin 0 -> 9856 bytes .../libboundscheck_v1.1.16/src/wcsncpy_s.o | Bin 0 -> 9756 bytes .../libboundscheck_v1.1.16/src/wcstok_s.o | Bin 0 -> 11176 bytes .../libboundscheck_v1.1.16/src/wmemcpy_s.o | Bin 0 -> 5956 bytes .../libboundscheck_v1.1.16/src/wmemmove_s.o | Bin 0 -> 5968 bytes .../libboundscheck_v1.1.16/src/wscanf_s.o | Bin 0 -> 5224 bytes .../out/obj/user/generatecode/system_init.o | Bin 0 -> 150044 bytes .../demo/out/obj/user/generatecode/tim_adc.o | Bin 0 -> 98460 bytes .../demo/5-tim_adc/demo/out/obj/user/main.o | Bin 0 -> 96848 bytes .../demo/5-tim_adc/demo/out/toolchain.ninja | 38 + .../demo/user/generatecode/feature.h | 119 + .../5-tim_adc/demo/user/generatecode/main.h | 63 + .../demo/user/generatecode/system_init.c | 152 + .../demo/user/generatecode/tim_adc.c | 27 + .../demo/user/generatecode/tim_adc.h | 9 + vendor/others/demo/5-tim_adc/demo/user/main.c | 59 + .../5-tim_adc/\350\257\264\346\230\216.txt" | 2 + 459 files changed, 250521 insertions(+) create mode 100644 vendor/others/demo/5-tim_adc/demo/.vscode/.attachinit create mode 100644 vendor/others/demo/5-tim_adc/demo/.vscode/.launchinit create mode 100644 vendor/others/demo/5-tim_adc/demo/.vscode/c_cpp_properties.json create mode 100644 vendor/others/demo/5-tim_adc/demo/.vscode/launch.json create mode 100644 vendor/others/demo/5-tim_adc/demo/.vscode/problems.json create mode 100644 vendor/others/demo/5-tim_adc/demo/.vscode/settings.json create mode 100644 vendor/others/demo/5-tim_adc/demo/analyzerJson/assembleFile.asm create mode 100644 vendor/others/demo/5-tim_adc/demo/analyzerJson/cfg/funcptr.txt create mode 100644 vendor/others/demo/5-tim_adc/demo/analyzerJson/funcstack.json create mode 100644 vendor/others/demo/5-tim_adc/demo/analyzerJson/memoryDetails.json create mode 100644 vendor/others/demo/5-tim_adc/demo/board.bak create mode 100644 vendor/others/demo/5-tim_adc/demo/board.json create mode 100644 vendor/others/demo/5-tim_adc/demo/build/.gn create mode 100644 vendor/others/demo/5-tim_adc/demo/build/BUILD.gn create mode 100644 vendor/others/demo/5-tim_adc/demo/build/build.py create mode 100644 vendor/others/demo/5-tim_adc/demo/build/build_gn.py create mode 100644 vendor/others/demo/5-tim_adc/demo/build/config.ini create mode 100644 vendor/others/demo/5-tim_adc/demo/build/config/BUILDCONFIG.gn create mode 100644 vendor/others/demo/5-tim_adc/demo/build/config/hcc/userconfig.json create mode 100644 vendor/others/demo/5-tim_adc/demo/build/config/hcc_fpu/userconfig.json create mode 100644 vendor/others/demo/5-tim_adc/demo/build/createxml/mk_dfx_xml.json create mode 100644 vendor/others/demo/5-tim_adc/demo/build/createxml/mk_prim_xml_step1.py create mode 100644 vendor/others/demo/5-tim_adc/demo/build/createxml/mk_prim_xml_step2.py create mode 100644 vendor/others/demo/5-tim_adc/demo/build/createxml/mss_prim_db.xml create mode 100644 vendor/others/demo/5-tim_adc/demo/build/ide_entry.py create mode 100644 vendor/others/demo/5-tim_adc/demo/build/packet_create.py create mode 100644 vendor/others/demo/5-tim_adc/demo/build/toolchain/BUILD.gn create mode 100644 vendor/others/demo/5-tim_adc/demo/build/toolchain/config.gni create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/anavref.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/baseaddr.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinc.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/anatrim/anatrim.c create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/anatrim/anatrim.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/anavrefinit/anavrefinit.c create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/anavrefinit/anavrefinit.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/chipinit.c create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/chipinit.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/crginit/crginit.c create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/crginit/crginit.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/flashinit/flashinit.c create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/flashinit/flashinit.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/systickinit/systickinit.c create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/systickinit/systickinit.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/codecopy.json create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/flash.lds create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/fotp/fotp.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/fotp/fotp_info_read.c create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/fotp/fotp_info_read.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/info.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/interrupt_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/ioconfig.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/iomap/iomap.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/ip_crg/ip_crg_common.c create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/ip_crg/ip_crg_common.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/locktype.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/startup.S create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/sysctrl.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/3061m/systick.h create mode 100644 vendor/others/demo/5-tim_adc/demo/chip/target/userconfig.json create mode 100644 vendor/others/demo/5-tim_adc/demo/demo.hiproj create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/acmp/common/inc/acmp.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/acmp/inc/acmp_ex.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/acmp/inc/acmp_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/acmp/src/acmp.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/acmp/src/acmp_ex.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/adc/common/inc/adc.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/adc/inc/adc_ex.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/adc/inc/adc_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/adc/src/adc.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/adc/src/adc_ex.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/apt/common/inc/apt.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/apt/inc/apt_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/apt/src/apt.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/base/common/inc/baseinc.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/base/inc/assert.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/base/inc/base_math.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/base/inc/clock.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/base/inc/generalfunc.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/base/inc/interrupt.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/base/inc/lock.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/base/inc/reset.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/base/inc/typedefs.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/base/src/assert.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/base/src/base_math.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/base/src/clock.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/base/src/generalfunc.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/base/src/interrupt.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/base/src/lock.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/base/src/reset.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/can/common/inc/can.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/can/inc/can_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/can/src/can.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/capm/common/inc/capm.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/capm/inc/capm_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/capm/src/capm.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/cfd/common/inc/cfd.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/cfd/inc/cfd_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/cfd/src/cfd.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/cmm/common/inc/cmm.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/cmm/inc/cmm_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/cmm/src/cmm.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/crc/common/inc/crc.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/crc/inc/crc_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/crc/src/crc.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/crg/common/inc/crg.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/crg/inc/crg_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/crg/src/crg.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/dac/common/inc/dac.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/dac/inc/dac_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/dac/src/dac.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/inc/debug.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/cmd.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/cmd_common.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/command.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/common.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/config.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/console.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/dfx_debug.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/dfx_log.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/errno.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/event.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/ext_log.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/file_id_defs.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/log.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/module.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/type.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/app_command.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/cmd.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/cmd_common.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/config.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/console.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/dfx_debug.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/dfx_log.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/dfx_log_proc.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/event.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/ext_command.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/debug/src/debug.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/dma/common/inc/dma.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/dma/inc/dma_ex.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/dma/inc/dma_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/dma/src/dma.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/dma/src/dma_ex.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/flash/common/inc/flash.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/flash/inc/flash_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/flash/src/flash.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/gpio/common/inc/gpio.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/gpio/inc/gpio_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/gpio/src/gpio.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/gpt/common/inc/gpt.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/gpt/inc/gpt_ex.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/gpt/inc/gpt_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/gpt/src/gpt.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/gpt/src/gpt_ex.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/i2c/common/inc/i2c.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/i2c/inc/i2c_ex.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/i2c/inc/i2c_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/i2c/src/i2c.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/i2c/src/i2c_ex.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/iocmg/common/iocmg.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/iocmg/inc/iocmg_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/iocmg/src/iocmg.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/iwdg/common/inc/iwdg.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/iwdg/inc/iwdg_ex.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/iwdg/inc/iwdg_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/iwdg/src/iwdg.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/iwdg/src/iwdg_ex.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/pga/common/inc/pga.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/pga/inc/pga_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/pga/src/pga.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/pmc/common/inc/pmc.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/pmc/inc/pmc_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/pmc/src/pmc.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/qdm/common/inc/qdm.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/qdm/inc/qdm_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/qdm/src/qdm.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/spi/common/inc/spi.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/spi/inc/spi_ex.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/spi/inc/spi_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/spi/src/spi.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/spi/src/spi_ex.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/timer/common/inc/timer.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/timer/inc/timer_ex.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/timer/inc/timer_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/timer/src/timer.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/timer/src/timer_ex.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/tsensor/common/inc/tsensor.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/tsensor/inc/tsensor_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/tsensor/src/tsensor.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/uart/common/inc/uart.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/uart/inc/uart_ex.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/uart/inc/uart_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/uart/src/uart.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/uart/src/uart_ex.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/wwdg/common/inc/wwdg.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/wwdg/inc/wwdg_ex.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/wwdg/inc/wwdg_ip.h create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/wwdg/src/wwdg.c create mode 100644 vendor/others/demo/5-tim_adc/demo/drivers/wwdg/src/wwdg_ex.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/adc_calibra/mcs_adcCalibr.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/adc_calibra/mcs_adcCalibr.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/brake/mcs_brake.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/brake/mcs_brake.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_filter.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_filter.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_lpfRk4.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_lpfRk4.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_pll.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_pll.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_startup.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_startup.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/math/mcs_math.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/math/mcs_math.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/math/mcs_math_const.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/modulation/mcs_r1_svpwm.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/modulation/mcs_r1_svpwm.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/modulation/mcs_svpwm.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/modulation/mcs_svpwm.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/observer/mcs_fosmo.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/observer/mcs_fosmo.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/pfc/pfc_curr_ctrl.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/pfc/pfc_curr_ctrl.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/pfc/pfc_volt_ctrl.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/pfc/pfc_volt_ctrl.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/pid_controller/mcs_pid_ctrl.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/pid_controller/mcs_pid_ctrl.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/power/mcs_power_mgmt.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/power/mcs_power_mgmt.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_openphs_det.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_openphs_det.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_stall_det.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_stall_det.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_unbalance_det.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_unbalance_det.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/ramp/mcs_ramp_mgmt.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/ramp/mcs_ramp_mgmt.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_assert.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_mtr_param.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_mtr_param.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_sys_status.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_typedef.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/vf/mcs_vf_ctrl.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/control_library/vf/mcs_vf_ctrl.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/LICENSE create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/Makefile create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/README.en.md create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/README.md create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/include/securec.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/include/securectype.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/input.inl create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/output.inl create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secinput.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.c create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/thirdparty/sysroot/include/mcs_smo_4th.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/thirdparty/sysroot/include/nos_task.h create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/thirdparty/sysroot/lib/libmcs_smo_4th.a create mode 100644 vendor/others/demo/5-tim_adc/demo/middleware/thirdparty/sysroot/lib/libnostask.a create mode 100644 vendor/others/demo/5-tim_adc/demo/out/.ninja_deps create mode 100644 vendor/others/demo/5-tim_adc/demo/out/.ninja_log create mode 100644 vendor/others/demo/5-tim_adc/demo/out/args.gn create mode 100644 vendor/others/demo/5-tim_adc/demo/out/bin/target.bin create mode 100644 vendor/others/demo/5-tim_adc/demo/out/bin/target.elf create mode 100644 vendor/others/demo/5-tim_adc/demo/out/bin/target.hex create mode 100644 vendor/others/demo/5-tim_adc/demo/out/bin/target.list create mode 100644 vendor/others/demo/5-tim_adc/demo/out/bin/target.map create mode 100644 vendor/others/demo/5-tim_adc/demo/out/build.log create mode 100644 vendor/others/demo/5-tim_adc/demo/out/build.ninja create mode 100644 vendor/others/demo/5-tim_adc/demo/out/build.ninja.d create mode 100644 vendor/others/demo/5-tim_adc/demo/out/log.xml create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/build/target.elf.ninja create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/chipinit/anatrim/anatrim.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/chipinit/chipinit.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/chipinit/crginit/crginit.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/chipinit/flashinit/flashinit.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/chipinit/systickinit/systickinit.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/fotp/fotp_info_read.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/ip_crg/ip_crg_common.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/startup.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/acmp/src/acmp.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/acmp/src/acmp_ex.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/adc/src/adc.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/adc/src/adc_ex.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/apt/src/apt.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/base/src/assert.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/base/src/base_math.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/base/src/clock.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/base/src/generalfunc.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/base/src/interrupt.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/base/src/lock.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/base/src/reset.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/can/src/can.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/capm/src/capm.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/cfd/src/cfd.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/cmm/src/cmm.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/crc/src/crc.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/crg/src/crg.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/dac/src/dac.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/app_command.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/cmd.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/cmd_common.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/config.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/console.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/dfx_debug.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/dfx_log.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/dfx_log_proc.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/event.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/ext_command.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/src/debug.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/dma/src/dma.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/dma/src/dma_ex.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/flash/src/flash.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/gpio/src/gpio.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/gpt/src/gpt.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/gpt/src/gpt_ex.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/i2c/src/i2c.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/i2c/src/i2c_ex.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/iocmg/src/iocmg.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/iwdg/src/iwdg.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/iwdg/src/iwdg_ex.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/pga/src/pga.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/pmc/src/pmc.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/qdm/src/qdm.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/spi/src/spi.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/spi/src/spi_ex.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/timer/src/timer.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/timer/src/timer_ex.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/tsensor/src/tsensor.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/uart/src/uart.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/uart/src/uart_ex.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/wwdg/src/wwdg.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/drivers/wwdg/src/wwdg_ex.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/brake/mcs_brake.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/filter/mcs_filter.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/filter/mcs_lpfRk4.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/filter/mcs_pll.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/math/mcs_math.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/modulation/mcs_r1_svpwm.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/modulation/mcs_svpwm.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/observer/mcs_fosmo.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/pfc/pfc_curr_ctrl.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/pfc/pfc_volt_ctrl.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/power/mcs_power_mgmt.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/protection/mcs_openphs_det.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/protection/mcs_stall_det.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/protection/mcs_unbalance_det.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/ramp/mcs_ramp_mgmt.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/utilities/mcs_mtr_param.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/vf/mcs_vf_ctrl.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/user/generatecode/system_init.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/user/generatecode/tim_adc.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/obj/user/main.o create mode 100644 vendor/others/demo/5-tim_adc/demo/out/toolchain.ninja create mode 100644 vendor/others/demo/5-tim_adc/demo/user/generatecode/feature.h create mode 100644 vendor/others/demo/5-tim_adc/demo/user/generatecode/main.h create mode 100644 vendor/others/demo/5-tim_adc/demo/user/generatecode/system_init.c create mode 100644 vendor/others/demo/5-tim_adc/demo/user/generatecode/tim_adc.c create mode 100644 vendor/others/demo/5-tim_adc/demo/user/generatecode/tim_adc.h create mode 100644 vendor/others/demo/5-tim_adc/demo/user/main.c create mode 100644 "vendor/others/demo/5-tim_adc/\350\257\264\346\230\216.txt" diff --git a/vendor/others/demo/5-tim_adc/demo/.vscode/.attachinit b/vendor/others/demo/5-tim_adc/demo/.vscode/.attachinit new file mode 100644 index 000000000..98fc97a1e --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/.vscode/.attachinit @@ -0,0 +1,16 @@ +echo debug_tool = openocd(HiSpark-Trace)\n +echo Initializing remote target...\n +define pio_reset_halt_target +monitor reset halt +set var $pc=0x03000004 +end +define pio_reset_run_target +monitor reset +end +target extended-remote :3333 +monitor init +monitor halt +tbreak main +define pio_restart_target +pio_reset_halt_target +echo Initialization completed\n \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/.vscode/.launchinit b/vendor/others/demo/5-tim_adc/demo/.vscode/.launchinit new file mode 100644 index 000000000..48a239daa --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/.vscode/.launchinit @@ -0,0 +1,17 @@ +echo debug_tool = openocd(HiSpark-Trace)\n +echo Initializing remote target...\n +define pio_reset_halt_target +monitor reset halt +set var $pc=0x03000004 +end +define pio_reset_run_target +monitor reset +end +target extended-remote :3333 +monitor init +load +pio_reset_halt_target +tbreak main +define pio_restart_target +pio_reset_halt_target +echo Initialization completed\n \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/.vscode/c_cpp_properties.json b/vendor/others/demo/5-tim_adc/demo/.vscode/c_cpp_properties.json new file mode 100644 index 000000000..77fb74b6c --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/.vscode/c_cpp_properties.json @@ -0,0 +1,21 @@ +{ + "configurations": [ + { + "name": "c/cpp plugin configurations", + "compilerPath": "d:\\HaiSi\\HiSpark Studio\\tools\\Windows\\cc_riscv32_musl_fp_win\\bin\\riscv32-linux-musl-gcc.exe", + "includePath": [ + "${workspaceFolder}/**" + ], + "browse": { + "limitSymbolsToIncludedHeaders": true, + "path": [ + "${workspaceFolder}/**" + ] + }, + "defines": [ + "FLOAT_SUPPORT" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/.vscode/launch.json b/vendor/others/demo/5-tim_adc/demo/.vscode/launch.json new file mode 100644 index 000000000..3d0758f19 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/.vscode/launch.json @@ -0,0 +1,52 @@ +{ + "configurations": [ + { + "type": "deveco-device-tool-debug", + "request": "launch", + "name": "GDB Launch (Download and Reset Program)", + "debugInitPath": "${workspaceFolder}/.vscode", + "servertype": "openocd(HiSpark-Trace)", + "executable": "./out/bin/target.elf", + "toolchainBinDir": "${command:toolsPath}\\Windows\\cc_riscv32_musl_fp_win\\bin", + "internalConsoleOptions": "openOnSessionStart", + "serverpath": "${command:toolsPath}\\hw_openocd\\bin\\openocd.exe", + "serverArgs": [ + "-c", + "adapter speed 5000", + "-c", + "gdb_port 3333", + "-s", + "${command:toolsPath}\\hw_openocd", + "-f", + "interface\\cmsis-dap.cfg", + "-f", + "target\\3061MNPICA-swd.cfg" + ], + "svdFile": "${command:projectWizardExtensionPath}\\resources\\debug\\svd\\3061MNPICA.svd" + }, + { + "type": "deveco-device-tool-debug", + "request": "attach", + "name": "GDB Attach (Attach to Running Program)", + "debugInitPath": "${workspaceFolder}/.vscode", + "servertype": "openocd(HiSpark-Trace)", + "executable": "./out/bin/target.elf", + "toolchainBinDir": "${command:toolsPath}\\Windows\\cc_riscv32_musl_fp_win\\bin", + "internalConsoleOptions": "openOnSessionStart", + "serverpath": "${command:toolsPath}\\hw_openocd\\bin\\openocd.exe", + "serverArgs": [ + "-c", + "adapter speed 5000", + "-c", + "gdb_port 3333", + "-s", + "${command:toolsPath}\\hw_openocd", + "-f", + "interface\\cmsis-dap.cfg", + "-f", + "target\\3061MNPICA-swd.cfg" + ], + "svdFile": "${command:projectWizardExtensionPath}\\resources\\debug\\svd\\3061MNPICA.svd" + } + ] +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/.vscode/problems.json b/vendor/others/demo/5-tim_adc/demo/.vscode/problems.json new file mode 100644 index 000000000..96e2ebf67 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/.vscode/problems.json @@ -0,0 +1 @@ +[{"key":0,"message":"warning: unused parameter 'handle' [-Wunused-parameter]","file":"d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\user\\generatecode\\tim_adc.c","line":"9","column":"36","displayLine":"9","type":"warning"}] \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/.vscode/settings.json b/vendor/others/demo/5-tim_adc/demo/.vscode/settings.json new file mode 100644 index 000000000..5ee7de529 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "main.h": "c", + "feature.h": "c" + } +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/analyzerJson/assembleFile.asm b/vendor/others/demo/5-tim_adc/demo/analyzerJson/assembleFile.asm new file mode 100644 index 000000000..a9b5523e2 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/analyzerJson/assembleFile.asm @@ -0,0 +1,8978 @@ + +d:\HaiSi\Projects\1-Demo\5-tim_adc\demo\out\bin\target.elf: file format elf32-littleriscv + + +Disassembly of section .text.entry: + +03000004 <_start>: + 3000004: 4fc0006f j 3000500 + +03000008 : + 3000008: 4680006f j 3000470 + 300000c: 4640006f j 3000470 + 3000010: 4600006f j 3000470 + 3000014: 45c0006f j 3000470 + 3000018: 4580006f j 3000470 + 300001c: 4540006f j 3000470 + 3000020: 4500006f j 3000470 + 3000024: 44c0006f j 3000470 + 3000028: 4480006f j 3000470 + 300002c: 4440006f j 3000470 + 3000030: 4400006f j 3000470 + 3000034: 43c0006f j 3000470 + 3000038: 4380006f j 3000470 + 300003c: 4340006f j 3000470 + 3000040: 4300006f j 3000470 + 3000044: 42c0006f j 3000470 + 3000048: 4280006f j 3000470 + 300004c: 4240006f j 3000470 + 3000050: 4200006f j 3000470 + 3000054: 41c0006f j 3000470 + 3000058: 4180006f j 3000470 + 300005c: 4140006f j 3000470 + 3000060: 4100006f j 3000470 + 3000064: 40c0006f j 3000470 + 3000068: 4080006f j 3000470 + 300006c: 4040006f j 3000470 + 3000070: 2640006f j 30002d4 + 3000074: 2600006f j 30002d4 + 3000078: 25c0006f j 30002d4 + 300007c: 2580006f j 30002d4 + 3000080: 2540006f j 30002d4 + 3000084: 2500006f j 30002d4 + 3000088: 24c0006f j 30002d4 + 300008c: 2480006f j 30002d4 + 3000090: 2440006f j 30002d4 + 3000094: 2400006f j 30002d4 + 3000098: 23c0006f j 30002d4 + 300009c: 2380006f j 30002d4 + 30000a0: 2340006f j 30002d4 + 30000a4: 2300006f j 30002d4 + 30000a8: 22c0006f j 30002d4 + 30000ac: 2280006f j 30002d4 + 30000b0: 2240006f j 30002d4 + 30000b4: 2200006f j 30002d4 + 30000b8: 21c0006f j 30002d4 + 30000bc: 2180006f j 30002d4 + 30000c0: 2140006f j 30002d4 + 30000c4: 2100006f j 30002d4 + 30000c8: 20c0006f j 30002d4 + 30000cc: 2080006f j 30002d4 + 30000d0: 2040006f j 30002d4 + 30000d4: 2000006f j 30002d4 + 30000d8: 1fc0006f j 30002d4 + 30000dc: 1f80006f j 30002d4 + 30000e0: 1f40006f j 30002d4 + 30000e4: 1f00006f j 30002d4 + 30000e8: 1ec0006f j 30002d4 + 30000ec: 1e80006f j 30002d4 + 30000f0: 1e40006f j 30002d4 + 30000f4: 1e00006f j 30002d4 + 30000f8: 1dc0006f j 30002d4 + 30000fc: 1d80006f j 30002d4 + 3000100: 1d40006f j 30002d4 + 3000104: 1d00006f j 30002d4 + 3000108: 1cc0006f j 30002d4 + 300010c: 1c80006f j 30002d4 + 3000110: 1c40006f j 30002d4 + 3000114: 1c00006f j 30002d4 + 3000118: 1bc0006f j 30002d4 + 300011c: 1b80006f j 30002d4 + 3000120: 1b40006f j 30002d4 + 3000124: 1b00006f j 30002d4 + 3000128: 1ac0006f j 30002d4 + 300012c: 1a80006f j 30002d4 + 3000130: 1a40006f j 30002d4 + 3000134: 1a00006f j 30002d4 + 3000138: 19c0006f j 30002d4 + 300013c: 1980006f j 30002d4 + 3000140: 1940006f j 30002d4 + 3000144: 1900006f j 30002d4 + 3000148: 18c0006f j 30002d4 + 300014c: 1880006f j 30002d4 + 3000150: 1840006f j 30002d4 + 3000154: 1800006f j 30002d4 + 3000158: 17c0006f j 30002d4 + 300015c: 1780006f j 30002d4 + 3000160: 1740006f j 30002d4 + 3000164: 1700006f j 30002d4 + 3000168: 16c0006f j 30002d4 + 300016c: 1680006f j 30002d4 + 3000170: 1640006f j 30002d4 + 3000174: 1600006f j 30002d4 + 3000178: 15c0006f j 30002d4 + 300017c: 1580006f j 30002d4 + 3000180: 1540006f j 30002d4 + 3000184: 1500006f j 30002d4 + 3000188: 14c0006f j 30002d4 + 300018c: 1480006f j 30002d4 + 3000190: 1440006f j 30002d4 + 3000194: 1400006f j 30002d4 + 3000198: 13c0006f j 30002d4 + 300019c: 1380006f j 30002d4 + 30001a0: 1340006f j 30002d4 + 30001a4: 1300006f j 30002d4 + 30001a8: 12c0006f j 30002d4 + 30001ac: 1280006f j 30002d4 + 30001b0: 1240006f j 30002d4 + 30001b4: 1200006f j 30002d4 + 30001b8: 11c0006f j 30002d4 + 30001bc: 1180006f j 30002d4 + 30001c0: 1140006f j 30002d4 + 30001c4: 1100006f j 30002d4 + 30001c8: 10c0006f j 30002d4 + 30001cc: 1080006f j 30002d4 + 30001d0: 1040006f j 30002d4 + 30001d4: 1000006f j 30002d4 + 30001d8: 0fc0006f j 30002d4 + 30001dc: 0f80006f j 30002d4 + 30001e0: 0f40006f j 30002d4 + 30001e4: 0f00006f j 30002d4 + 30001e8: 0ec0006f j 30002d4 + 30001ec: 0e80006f j 30002d4 + +030001f0 : + 30001f0: f9010113 addi sp,sp,-112 + 30001f4: 04812023 sw s0,64(sp) + 30001f8: 04912223 sw s1,68(sp) + 30001fc: 05212423 sw s2,72(sp) + 3000200: 05312623 sw s3,76(sp) + 3000204: 05412823 sw s4,80(sp) + 3000208: 05512a23 sw s5,84(sp) + 300020c: 05612c23 sw s6,88(sp) + 3000210: 05712e23 sw s7,92(sp) + 3000214: 07812023 sw s8,96(sp) + 3000218: 07912223 sw s9,100(sp) + 300021c: 07a12423 sw s10,104(sp) + 3000220: 07b12623 sw s11,108(sp) + 3000224: 11010593 addi a1,sp,272 + 3000228: 06b12823 sw a1,112(sp) + 300022c: 06312a23 sw gp,116(sp) + 3000230: 06412c23 sw tp,120(sp) + 3000234: 34102573 csrr a0,mepc + 3000238: 300025f3 csrr a1,mstatus + 300023c: 34302673 csrr a2,mtval + 3000240: 342026f3 csrr a3,mcause + 3000244: 06a12e23 sw a0,124(sp) + 3000248: 08b12023 sw a1,128(sp) + 300024c: 08c12223 sw a2,132(sp) + 3000250: 08d12423 sw a3,136(sp) + 3000254: 00010513 mv a0,sp + 3000258: 04c020ef jal ra,30022a4 + +0300025c : + 300025c: a001 j 300025c + 300025e: 00000013 nop + +03000262 : + 3000262: f9010113 addi sp,sp,-112 + 3000266: 04812023 sw s0,64(sp) + 300026a: 04912223 sw s1,68(sp) + 300026e: 05212423 sw s2,72(sp) + 3000272: 05312623 sw s3,76(sp) + 3000276: 05412823 sw s4,80(sp) + 300027a: 05512a23 sw s5,84(sp) + 300027e: 05612c23 sw s6,88(sp) + 3000282: 05712e23 sw s7,92(sp) + 3000286: 07812023 sw s8,96(sp) + 300028a: 07912223 sw s9,100(sp) + 300028e: 07a12423 sw s10,104(sp) + 3000292: 07b12623 sw s11,108(sp) + 3000296: 11010593 addi a1,sp,272 + 300029a: 06b12823 sw a1,112(sp) + 300029e: 06312a23 sw gp,116(sp) + 30002a2: 06412c23 sw tp,120(sp) + 30002a6: 34102573 csrr a0,mepc + 30002aa: 300025f3 csrr a1,mstatus + 30002ae: 34302673 csrr a2,mtval + 30002b2: 342026f3 csrr a3,mcause + 30002b6: 06a12e23 sw a0,124(sp) + 30002ba: 08b12023 sw a1,128(sp) + 30002be: 08c12223 sw a2,132(sp) + 30002c2: 08d12423 sw a3,136(sp) + 30002c6: 00010513 mv a0,sp + 30002ca: 30047073 csrci mstatus,8 + 30002ce: 7b9010ef jal ra,3002286 + +030002d2 : + 30002d2: a001 j 30002d2 + +030002d4 : + 30002d4: f6010113 addi sp,sp,-160 + 30002d8: 00a12623 sw a0,12(sp) + 30002dc: 00b12823 sw a1,16(sp) + 30002e0: 7ed02573 csrr a0,0x7ed + 30002e4: bfe025f3 csrr a1,0xbfe + 30002e8: bfe51073 csrw 0xbfe,a0 + 30002ec: 00b12c23 sw a1,24(sp) + 30002f0: 300025f3 csrr a1,mstatus + 30002f4: 00b12e23 sw a1,28(sp) + 30002f8: 341025f3 csrr a1,mepc + 30002fc: 02b12023 sw a1,32(sp) + 3000300: 34202573 csrr a0,mcause + 3000304: 000025b7 lui a1,0x2 + 3000308: 80058593 addi a1,a1,-2048 # 1800 + 300030c: 3005a073 csrs mstatus,a1 + 3000310: 00000597 auipc a1,0x0 + 3000314: 01058593 addi a1,a1,16 # 3000320 + 3000318: 34159073 csrw mepc,a1 + 300031c: 30200073 mret + +03000320 : + 3000320: 00512023 sw t0,0(sp) + 3000324: 00612223 sw t1,4(sp) + 3000328: 00712423 sw t2,8(sp) + 300032c: 00c12a23 sw a2,20(sp) + 3000330: 02112223 sw ra,36(sp) + 3000334: 02d12423 sw a3,40(sp) + 3000338: 02e12623 sw a4,44(sp) + 300033c: 02f12823 sw a5,48(sp) + 3000340: 03012a23 sw a6,52(sp) + 3000344: 03112c23 sw a7,56(sp) + 3000348: 03c12e23 sw t3,60(sp) + 300034c: 05d12023 sw t4,64(sp) + 3000350: 05e12223 sw t5,68(sp) + 3000354: 05f12423 sw t6,72(sp) + 3000358: 04012627 fsw ft0,76(sp) + 300035c: 04112827 fsw ft1,80(sp) + 3000360: 04212a27 fsw ft2,84(sp) + 3000364: 04312c27 fsw ft3,88(sp) + 3000368: 04412e27 fsw ft4,92(sp) + 300036c: 06512027 fsw ft5,96(sp) + 3000370: 06612227 fsw ft6,100(sp) + 3000374: 06712427 fsw ft7,104(sp) + 3000378: 06a12627 fsw fa0,108(sp) + 300037c: 06b12827 fsw fa1,112(sp) + 3000380: 06c12a27 fsw fa2,116(sp) + 3000384: 06d12c27 fsw fa3,120(sp) + 3000388: 06e12e27 fsw fa4,124(sp) + 300038c: 08f12027 fsw fa5,128(sp) + 3000390: 09012227 fsw fa6,132(sp) + 3000394: 09112427 fsw fa7,136(sp) + 3000398: 09c12627 fsw ft8,140(sp) + 300039c: 09d12827 fsw ft9,144(sp) + 30003a0: 09e12a27 fsw ft10,148(sp) + 30003a4: 09f12c27 fsw ft11,152(sp) + 30003a8: 0ff57513 andi a0,a0,255 + 30003ac: 46b010ef jal ra,3002016 + 30003b0: 00412303 lw t1,4(sp) + 30003b4: 00812383 lw t2,8(sp) + 30003b8: 01412603 lw a2,20(sp) + 30003bc: 02412083 lw ra,36(sp) + 30003c0: 02812683 lw a3,40(sp) + 30003c4: 02c12703 lw a4,44(sp) + 30003c8: 03012783 lw a5,48(sp) + 30003cc: 03412803 lw a6,52(sp) + 30003d0: 03812883 lw a7,56(sp) + 30003d4: 03c12e03 lw t3,60(sp) + 30003d8: 04012e83 lw t4,64(sp) + 30003dc: 04412f03 lw t5,68(sp) + 30003e0: 04812f83 lw t6,72(sp) + 30003e4: 04c12007 flw ft0,76(sp) + 30003e8: 05012087 flw ft1,80(sp) + 30003ec: 05412107 flw ft2,84(sp) + 30003f0: 05812187 flw ft3,88(sp) + 30003f4: 05c12207 flw ft4,92(sp) + 30003f8: 06012287 flw ft5,96(sp) + 30003fc: 06412307 flw ft6,100(sp) + 3000400: 06812387 flw ft7,104(sp) + 3000404: 06c12507 flw fa0,108(sp) + 3000408: 07012587 flw fa1,112(sp) + 300040c: 07412607 flw fa2,116(sp) + 3000410: 07812687 flw fa3,120(sp) + 3000414: 07c12707 flw fa4,124(sp) + 3000418: 08012787 flw fa5,128(sp) + 300041c: 08412807 flw fa6,132(sp) + 3000420: 08812887 flw fa7,136(sp) + 3000424: 08c12e07 flw ft8,140(sp) + 3000428: 09012e87 flw ft9,144(sp) + 300042c: 09412f07 flw ft10,148(sp) + 3000430: 09812f87 flw ft11,152(sp) + +03000434 : + 3000434: 01c12503 lw a0,28(sp) + 3000438: 300022f3 csrr t0,mstatus + 300043c: 02012583 lw a1,32(sp) + 3000440: 0082f293 andi t0,t0,8 + 3000444: 0002923b bnei t0,0,300044c + 3000448: f7757513 andi a0,a0,-137 + +0300044c : + 300044c: 30051073 csrw mstatus,a0 + 3000450: 00012283 lw t0,0(sp) + 3000454: 34159073 csrw mepc,a1 + 3000458: 01812503 lw a0,24(sp) + 300045c: bfe51073 csrw 0xbfe,a0 + 3000460: 01012583 lw a1,16(sp) + 3000464: 00c12503 lw a0,12(sp) + 3000468: 0a010113 addi sp,sp,160 + 300046c: 30200073 mret + +03000470 : + 3000470: f6010113 addi sp,sp,-160 + 3000474: fff11f8b stmia {ra,t0-t6,a0-a7},(sp) + 3000478: f6010113 addi sp,sp,-160 + 300047c: 34202573 csrr a0,mcause + 3000480: 00b00313 li t1,11 + 3000484: 02650c63 beq a0,t1,30004bc + 3000488: 00800313 li t1,8 + 300048c: 02650863 beq a0,t1,30004bc + 3000490: 800005b7 lui a1,0x80000 + 3000494: 0ff00613 li a2,255 + 3000498: 00b575b3 and a1,a0,a1 + 300049c: 00c57533 and a0,a0,a2 + 30004a0: 00c00613 li a2,12 + 30004a4: d4c506e3 beq a0,a2,30001f0 + 30004a8: da058de3 beqz a1,3000262 + 30004ac: 0a010113 addi sp,sp,160 + 30004b0: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004b4: 0a010113 addi sp,sp,160 + 30004b8: 30200073 mret + +030004bc : + 30004bc: 000023b7 lui t2,0x2 + 30004c0: 80038393 addi t2,t2,-2048 # 1800 + 30004c4: 3003a073 csrs mstatus,t2 + 30004c8: 341022f3 csrr t0,mepc + 30004cc: 00428293 addi t0,t0,4 + 30004d0: 34129073 csrw mepc,t0 + 30004d4: 0a010113 addi sp,sp,160 + 30004d8: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004dc: 0a010113 addi sp,sp,160 + 30004e0: 30200073 mret + +030004e4 : + 30004e4: 0072dc63 bge t0,t2,30004fc + 30004e8: 00032e03 lw t3,0(t1) + 30004ec: 01c2a023 sw t3,0(t0) + 30004f0: 00428293 addi t0,t0,4 + 30004f4: 00430313 addi t1,t1,4 + 30004f8: fedff06f j 30004e4 + +030004fc : + 30004fc: 00008067 ret + +03000500 : + 3000500: 30005073 csrwi mstatus,0 + 3000504: 30405073 csrwi mie,0 + 3000508: 30047073 csrci mstatus,8 + 300050c: 00000297 auipc t0,0x0 + 3000510: afc28293 addi t0,t0,-1284 # 3000008 + 3000514: 00128293 addi t0,t0,1 + 3000518: 30529073 csrw mtvec,t0 + 300051c: 7ef0d073 csrwi 0x7ef,1 + +03000520 : + 3000520: 147102b7 lui t0,0x14710 + 3000524: 1202a303 lw t1,288(t0) # 14710120 + 3000528: 00136313 ori t1,t1,1 + 300052c: 1262a023 sw t1,288(t0) + 3000530: 1242a303 lw t1,292(t0) + 3000534: 00136313 ori t1,t1,1 + 3000538: 1262a223 sw t1,292(t0) + 300053c: fedcc2b7 lui t0,0xfedcc + 3000540: a9828293 addi t0,t0,-1384 # fedcba98 + 3000544: 14710337 lui t1,0x14710 + 3000548: 20030313 addi t1,t1,512 # 14710200 + 300054c: 00532023 sw t0,0(t1) + 3000550: 01001197 auipc gp,0x1001 + 3000554: bc418193 addi gp,gp,-1084 # 4001114 <__global_pointer$> + 3000558: 01007117 auipc sp,0x1007 + 300055c: 6a810113 addi sp,sp,1704 # 4007c00 <__INTERRUPT_STACK_BEGIN__> + 3000560: 143002b7 lui t0,0x14300 + 3000564: 00828293 addi t0,t0,8 # 14300008 + 3000568: 0002a303 lw t1,0(t0) + 300056c: 02037313 andi t1,t1,32 + 3000570: 0062a023 sw t1,0(t0) + 3000574: 140002b7 lui t0,0x14000 + 3000578: 00000313 li t1,0 + 300057c: 0262a223 sw t1,36(t0) # 14000024 + 3000580: 0262a423 sw t1,40(t0) + 3000584: 0262a623 sw t1,44(t0) + 3000588: 0262a823 sw t1,48(t0) + 300058c: 0462a423 sw t1,72(t0) + +03000590 : + 3000590: 101082b7 lui t0,0x10108 + 3000594: 30028293 addi t0,t0,768 # 10108300 + 3000598: 0002a303 lw t1,0(t0) + 300059c: 00136313 ori t1,t1,1 + 30005a0: 0062a023 sw t1,0(t0) + 30005a4: 01000297 auipc t0,0x1000 + 30005a8: a5c28293 addi t0,t0,-1444 # 4000000 + 30005ac: 01008317 auipc t1,0x1008 + 30005b0: a5430313 addi t1,t1,-1452 # 4008000 + 30005b4: 00000393 li t2,0 + +030005b8 : + 30005b8: 0072a023 sw t2,0(t0) + 30005bc: 00428293 addi t0,t0,4 + 30005c0: fe62cce3 blt t0,t1,30005b8 + +030005c4 : + 30005c4: ff000297 auipc t0,0xff000 + 30005c8: a3c28293 addi t0,t0,-1476 # 2000000 + 30005cc: 00000317 auipc t1,0x0 + 30005d0: 13830313 addi t1,t1,312 # 3000704 + 30005d4: ff000397 auipc t2,0xff000 + 30005d8: a2c38393 addi t2,t2,-1492 # 2000000 + 30005dc: f09ff0ef jal ra,30004e4 + +030005e0 : + 30005e0: 01000297 auipc t0,0x1000 + 30005e4: a2028293 addi t0,t0,-1504 # 4000000 + 30005e8: 00000317 auipc t1,0x0 + 30005ec: 11c30313 addi t1,t1,284 # 3000704 + 30005f0: 01000397 auipc t2,0x1000 + 30005f4: a1038393 addi t2,t2,-1520 # 4000000 + 30005f8: eedff0ef jal ra,30004e4 + +030005fc : + 30005fc: 01000297 auipc t0,0x1000 + 3000600: a2428293 addi t0,t0,-1500 # 4000020 + 3000604: 00006317 auipc t1,0x6 + 3000608: 1a030313 addi t1,t1,416 # 30067a4 <__data_load> + 300060c: 01000397 auipc t2,0x1000 + 3000610: af038393 addi t2,t2,-1296 # 40000fc + 3000614: ed1ff0ef jal ra,30004e4 + +03000618 : + 3000618: 000012b7 lui t0,0x1 + 300061c: b0028293 addi t0,t0,-1280 # b00 + 3000620: 3b029073 csrw pmpaddr0,t0 + 3000624: 004002b7 lui t0,0x400 + 3000628: 40028293 addi t0,t0,1024 # 400400 + 300062c: 3b129073 csrw pmpaddr1,t0 + 3000630: 008002b7 lui t0,0x800 + 3000634: 3b229073 csrw pmpaddr2,t0 + 3000638: 008022b7 lui t0,0x802 + 300063c: 3b329073 csrw pmpaddr3,t0 + 3000640: 00c002b7 lui t0,0xc00 + 3000644: 3b429073 csrw pmpaddr4,t0 + 3000648: 010002b7 lui t0,0x1000 + 300064c: 3b529073 csrw pmpaddr5,t0 + 3000650: 010022b7 lui t0,0x1002 + 3000654: 3b629073 csrw pmpaddr6,t0 + 3000658: 070002b7 lui t0,0x7000 + 300065c: 40028293 addi t0,t0,1024 # 7000400 + 3000660: 3b729073 csrw pmpaddr7,t0 + 3000664: f33332b7 lui t0,0xf3333 + 3000668: 33328293 addi t0,t0,819 # f3333333 + 300066c: 7d829073 csrw 0x7d8,t0 + 3000670: 8d8892b7 lui t0,0x8d889 + 3000674: d8b28293 addi t0,t0,-629 # 8d888d8b + 3000678: 3a029073 csrw pmpcfg0,t0 + 300067c: 8b8b92b7 lui t0,0x8b8b9 + 3000680: d8828293 addi t0,t0,-632 # 8b8b8d88 + 3000684: 3a129073 csrw pmpcfg1,t0 + 3000688: 7c005073 csrwi 0x7c0,0 + 300068c: 0ff0000f fence + 3000690: 7c105073 csrwi 0x7c1,0 + 3000694: 0ff0000f fence + 3000698: 000022b7 lui t0,0x2 + 300069c: 00828293 addi t0,t0,8 # 2008 + 30006a0: 3002a073 csrs mstatus,t0 + 30006a4: 02000293 li t0,32 + 30006a8: 3012a073 csrs misa,t0 + 30006ac: 111112b7 lui t0,0x11111 + 30006b0: 11128293 addi t0,t0,273 # 11111111 + 30006b4: bc029073 csrw 0xbc0,t0 + 30006b8: bc129073 csrw 0xbc1,t0 + 30006bc: bc229073 csrw 0xbc2,t0 + 30006c0: bc329073 csrw 0xbc3,t0 + 30006c4: bc429073 csrw 0xbc4,t0 + 30006c8: bc529073 csrw 0xbc5,t0 + 30006cc: bc629073 csrw 0xbc6,t0 + 30006d0: bc729073 csrw 0xbc7,t0 + 30006d4: bc829073 csrw 0xbc8,t0 + 30006d8: bc929073 csrw 0xbc9,t0 + 30006dc: bca29073 csrw 0xbca,t0 + 30006e0: bcb29073 csrw 0xbcb,t0 + 30006e4: bcc29073 csrw 0xbcc,t0 + 30006e8: bcd29073 csrw 0xbcd,t0 + 30006ec: bce29073 csrw 0xbce,t0 + 30006f0: bcf29073 csrw 0xbcf,t0 + 30006f4: 00000073 ecall + 30006f8: 014000ef jal ra,300070c + 30006fc: 2ee050ef jal ra,30059ea
+ +03000700 : + 3000700: 0000006f j 3000700 + +Disassembly of section .text: + +03000704 : + 3000704: 1141 addi sp,sp,-16 + 3000706: c622 sw s0,12(sp) + 3000708: 0800 addi s0,sp,16 + 300070a: a001 j 300070a + +0300070c : + 300070c: 1101 addi sp,sp,-32 + 300070e: ce06 sw ra,28(sp) + 3000710: cc22 sw s0,24(sp) + 3000712: 1000 addi s0,sp,32 + 3000714: fec40793 addi a5,s0,-20 + 3000718: 853e mv a0,a5 + 300071a: 2dc050ef jal ra,30059f6 + 300071e: 87aa mv a5,a0 + 3000720: c391 beqz a5,3000724 + 3000722: 37cd jal ra,3000704 + 3000724: fec42783 lw a5,-20(s0) + 3000728: 853e mv a0,a5 + 300072a: 796000ef jal ra,3000ec0 + 300072e: 057000ef jal ra,3000f84 + 3000732: fec42783 lw a5,-20(s0) + 3000736: 853e mv a0,a5 + 3000738: 25b1 jal ra,3000d84 + 300073a: 121010ef jal ra,300205a + 300073e: 23e5 jal ra,3000d26 + 3000740: 2b51 jal ra,3000cd4 + 3000742: 0001 nop + 3000744: 40f2 lw ra,28(sp) + 3000746: 4462 lw s0,24(sp) + 3000748: 6105 addi sp,sp,32 + 300074a: 8082 ret + +0300074c : + 300074c: 1101 addi sp,sp,-32 + 300074e: ce22 sw s0,28(sp) + 3000750: 1000 addi s0,sp,32 + 3000752: fea42623 sw a0,-20(s0) + 3000756: fec42783 lw a5,-20(s0) + 300075a: d017f753 fcvt.s.wu fa4,a5 + 300075e: 030067b7 lui a5,0x3006 + 3000762: 1fc7a787 flw fa5,508(a5) # 30061fc <__rodata_start> + 3000766: 18f777d3 fdiv.s fa5,fa4,fa5 + 300076a: 040007b7 lui a5,0x4000 + 300076e: 02f7a027 fsw fa5,32(a5) # 4000020 + 3000772: 0001 nop + 3000774: 4472 lw s0,28(sp) + 3000776: 6105 addi sp,sp,32 + 3000778: 8082 ret + +0300077a : + 300077a: 7179 addi sp,sp,-48 + 300077c: d606 sw ra,44(sp) + 300077e: d422 sw s0,40(sp) + 3000780: 1800 addi s0,sp,48 + 3000782: fe040793 addi a5,s0,-32 + 3000786: 863e mv a2,a5 + 3000788: 4591 li a1,4 + 300078a: 4501 li a0,0 + 300078c: 2391 jal ra,3000cd0 + 300078e: fd040793 addi a5,s0,-48 + 3000792: 863e mv a2,a5 + 3000794: 4589 li a1,2 + 3000796: 4501 li a0,0 + 3000798: 2b25 jal ra,3000cd0 + 300079a: fe042703 lw a4,-32(s0) + 300079e: 5aa597b7 lui a5,0x5aa59 + 30007a2: 66978793 addi a5,a5,1641 # 5aa59669 + 30007a6: 00f71763 bne a4,a5,30007b4 + 30007aa: fd042703 lw a4,-48(s0) + 30007ae: 57fd li a5,-1 + 30007b0: 00f71463 bne a4,a5,30007b8 + 30007b4: 4781 li a5,0 + 30007b6: a011 j 30007ba + 30007b8: 4785 li a5,1 + 30007ba: 853e mv a0,a5 + 30007bc: 50b2 lw ra,44(sp) + 30007be: 5422 lw s0,40(sp) + 30007c0: 6145 addi sp,sp,48 + 30007c2: 8082 ret + +030007c4 : + 30007c4: 711d addi sp,sp,-96 + 30007c6: ce86 sw ra,92(sp) + 30007c8: cca2 sw s0,88(sp) + 30007ca: 1080 addi s0,sp,96 + 30007cc: fdc40793 addi a5,s0,-36 + 30007d0: 863e mv a2,a5 + 30007d2: 45d1 li a1,20 + 30007d4: 4501 li a0,0 + 30007d6: 29ed jal ra,3000cd0 + 30007d8: 18100737 lui a4,0x18100 + 30007dc: fdc42783 lw a5,-36(s0) + 30007e0: 83c1 srli a5,a5,0x10 + 30007e2: 9bfd andi a5,a5,-1 + 30007e4: 0ff7f693 andi a3,a5,255 + 30007e8: 433c lw a5,64(a4) + 30007ea: 0ff6f693 andi a3,a3,255 + 30007ee: f007f793 andi a5,a5,-256 + 30007f2: 8fd5 or a5,a5,a3 + 30007f4: c33c sw a5,64(a4) + 30007f6: 18100737 lui a4,0x18100 + 30007fa: fdc42783 lw a5,-36(s0) + 30007fe: 83a1 srli a5,a5,0x8 + 3000800: 9bfd andi a5,a5,-1 + 3000802: 0ff7f693 andi a3,a5,255 + 3000806: 433c lw a5,64(a4) + 3000808: 0ff6f693 andi a3,a3,255 + 300080c: 06a2 slli a3,a3,0x8 + 300080e: 7641 lui a2,0xffff0 + 3000810: 0ff60613 addi a2,a2,255 # ffff00ff + 3000814: 8ff1 and a5,a5,a2 + 3000816: 8fd5 or a5,a5,a3 + 3000818: c33c sw a5,64(a4) + 300081a: 18100737 lui a4,0x18100 + 300081e: fdc42783 lw a5,-36(s0) + 3000822: 0ff7f693 andi a3,a5,255 + 3000826: 433c lw a5,64(a4) + 3000828: 0ff6f693 andi a3,a3,255 + 300082c: 06c2 slli a3,a3,0x10 + 300082e: ff010637 lui a2,0xff010 + 3000832: 167d addi a2,a2,-1 # ff00ffff + 3000834: 8ff1 and a5,a5,a2 + 3000836: 8fd5 or a5,a5,a3 + 3000838: c33c sw a5,64(a4) + 300083a: fe042783 lw a5,-32(s0) + 300083e: 83c1 srli a5,a5,0x10 + 3000840: 9bfd andi a5,a5,-1 + 3000842: 9f81 uxtb a5 + 3000844: fef42623 sw a5,-20(s0) + 3000848: fe042783 lw a5,-32(s0) + 300084c: 83a1 srli a5,a5,0x8 + 300084e: 9bfd andi a5,a5,-1 + 3000850: 9f81 uxtb a5 + 3000852: 07a2 slli a5,a5,0x8 + 3000854: 873e mv a4,a5 + 3000856: fec42783 lw a5,-20(s0) + 300085a: 8fd9 or a5,a5,a4 + 300085c: fef42623 sw a5,-20(s0) + 3000860: fe042783 lw a5,-32(s0) + 3000864: 9f81 uxtb a5 + 3000866: 07c2 slli a5,a5,0x10 + 3000868: 873e mv a4,a5 + 300086a: fec42783 lw a5,-20(s0) + 300086e: 8fd9 or a5,a5,a4 + 3000870: fef42623 sw a5,-20(s0) + 3000874: fdc42783 lw a5,-36(s0) + 3000878: 83e1 srli a5,a5,0x18 + 300087a: 9f81 uxtb a5 + 300087c: 07e2 slli a5,a5,0x18 + 300087e: 873e mv a4,a5 + 3000880: fec42783 lw a5,-20(s0) + 3000884: 8fd9 or a5,a5,a4 + 3000886: fef42623 sw a5,-20(s0) + 300088a: 181007b7 lui a5,0x18100 + 300088e: fec42703 lw a4,-20(s0) + 3000892: c3f8 sw a4,68(a5) + 3000894: fcc40793 addi a5,s0,-52 + 3000898: 863e mv a2,a5 + 300089a: 45d5 li a1,21 + 300089c: 4501 li a0,0 + 300089e: 290d jal ra,3000cd0 + 30008a0: 18000737 lui a4,0x18000 + 30008a4: fd042783 lw a5,-48(s0) + 30008a8: 86be mv a3,a5 + 30008aa: 6789 lui a5,0x2 + 30008ac: 17fd addi a5,a5,-1 # 1fff + 30008ae: 8ff5 and a5,a5,a3 + 30008b0: 01079613 slli a2,a5,0x10 + 30008b4: 8241 srli a2,a2,0x10 + 30008b6: 6785 lui a5,0x1 + 30008b8: 973e add a4,a4,a5 + 30008ba: 80872783 lw a5,-2040(a4) # 17fff808 + 30008be: 6689 lui a3,0x2 + 30008c0: 16fd addi a3,a3,-1 # 1fff + 30008c2: 8ef1 and a3,a3,a2 + 30008c4: 06c2 slli a3,a3,0x10 + 30008c6: e0010637 lui a2,0xe0010 + 30008ca: 167d addi a2,a2,-1 # e000ffff + 30008cc: 8ff1 and a5,a5,a2 + 30008ce: 8fd5 or a5,a5,a3 + 30008d0: 80f72423 sw a5,-2040(a4) + 30008d4: 18000737 lui a4,0x18000 + 30008d8: fd042783 lw a5,-48(s0) + 30008dc: 83c1 srli a5,a5,0x10 + 30008de: 86be mv a3,a5 + 30008e0: 6785 lui a5,0x1 + 30008e2: 17fd addi a5,a5,-1 # fff + 30008e4: 8ff5 and a5,a5,a3 + 30008e6: 01079613 slli a2,a5,0x10 + 30008ea: 8241 srli a2,a2,0x10 + 30008ec: 6785 lui a5,0x1 + 30008ee: 973e add a4,a4,a5 + 30008f0: 80872783 lw a5,-2040(a4) # 17fff808 + 30008f4: 6685 lui a3,0x1 + 30008f6: 16fd addi a3,a3,-1 # fff + 30008f8: 8ef1 and a3,a3,a2 + 30008fa: 767d lui a2,0xfffff + 30008fc: 8ff1 and a5,a5,a2 + 30008fe: 8fd5 or a5,a5,a3 + 3000900: 80f72423 sw a5,-2040(a4) + 3000904: fe042783 lw a5,-32(s0) + 3000908: 83e1 srli a5,a5,0x18 + 300090a: 0ff7f713 andi a4,a5,255 + 300090e: 185007b7 lui a5,0x18500 + 3000912: cb98 sw a4,16(a5) + 3000914: 18000737 lui a4,0x18000 + 3000918: fd442783 lw a5,-44(s0) + 300091c: 86be mv a3,a5 + 300091e: 6785 lui a5,0x1 + 3000920: 17fd addi a5,a5,-1 # fff + 3000922: 8ff5 and a5,a5,a3 + 3000924: 01079613 slli a2,a5,0x10 + 3000928: 8241 srli a2,a2,0x10 + 300092a: 6785 lui a5,0x1 + 300092c: 973e add a4,a4,a5 + 300092e: 80472783 lw a5,-2044(a4) # 17fff804 + 3000932: 6685 lui a3,0x1 + 3000934: 16fd addi a3,a3,-1 # fff + 3000936: 8ef1 and a3,a3,a2 + 3000938: 767d lui a2,0xfffff + 300093a: 8ff1 and a5,a5,a2 + 300093c: 8fd5 or a5,a5,a3 + 300093e: 80f72223 sw a5,-2044(a4) + 3000942: fd842783 lw a5,-40(s0) + 3000946: 83a5 srli a5,a5,0x9 + 3000948: 853e mv a0,a5 + 300094a: 3509 jal ra,300074c + 300094c: 18200737 lui a4,0x18200 + 3000950: fcc42783 lw a5,-52(s0) + 3000954: 1ff7f793 andi a5,a5,511 + 3000958: 01079693 slli a3,a5,0x10 + 300095c: 82c1 srli a3,a3,0x10 + 300095e: 531c lw a5,32(a4) + 3000960: 1ff6f693 andi a3,a3,511 + 3000964: e007f793 andi a5,a5,-512 + 3000968: 8fd5 or a5,a5,a3 + 300096a: d31c sw a5,32(a4) + 300096c: 18201737 lui a4,0x18201 + 3000970: fcc42783 lw a5,-52(s0) + 3000974: 83c1 srli a5,a5,0x10 + 3000976: 1ff7f793 andi a5,a5,511 + 300097a: 01079693 slli a3,a5,0x10 + 300097e: 82c1 srli a3,a3,0x10 + 3000980: 531c lw a5,32(a4) + 3000982: 1ff6f693 andi a3,a3,511 + 3000986: e007f793 andi a5,a5,-512 + 300098a: 8fd5 or a5,a5,a3 + 300098c: d31c sw a5,32(a4) + 300098e: fbc40793 addi a5,s0,-68 + 3000992: 863e mv a2,a5 + 3000994: 45d9 li a1,22 + 3000996: 4501 li a0,0 + 3000998: 257d jal ra,3001046 + 300099a: 18000737 lui a4,0x18000 + 300099e: fbc42783 lw a5,-68(s0) + 30009a2: 86be mv a3,a5 + 30009a4: 6789 lui a5,0x2 + 30009a6: 17fd addi a5,a5,-1 # 1fff + 30009a8: 8ff5 and a5,a5,a3 + 30009aa: 01079613 slli a2,a5,0x10 + 30009ae: 8241 srli a2,a2,0x10 + 30009b0: 6785 lui a5,0x1 + 30009b2: 973e add a4,a4,a5 + 30009b4: 81472783 lw a5,-2028(a4) # 17fff814 + 30009b8: 6689 lui a3,0x2 + 30009ba: 16fd addi a3,a3,-1 # 1fff + 30009bc: 8ef1 and a3,a3,a2 + 30009be: 06c2 slli a3,a3,0x10 + 30009c0: e0010637 lui a2,0xe0010 + 30009c4: 167d addi a2,a2,-1 # e000ffff + 30009c6: 8ff1 and a5,a5,a2 + 30009c8: 8fd5 or a5,a5,a3 + 30009ca: 80f72a23 sw a5,-2028(a4) + 30009ce: 18000737 lui a4,0x18000 + 30009d2: fbc42783 lw a5,-68(s0) + 30009d6: 83c1 srli a5,a5,0x10 + 30009d8: 86be mv a3,a5 + 30009da: 6785 lui a5,0x1 + 30009dc: 17fd addi a5,a5,-1 # fff + 30009de: 8ff5 and a5,a5,a3 + 30009e0: 01079613 slli a2,a5,0x10 + 30009e4: 8241 srli a2,a2,0x10 + 30009e6: 6785 lui a5,0x1 + 30009e8: 973e add a4,a4,a5 + 30009ea: 81472783 lw a5,-2028(a4) # 17fff814 + 30009ee: 6685 lui a3,0x1 + 30009f0: 16fd addi a3,a3,-1 # fff + 30009f2: 8ef1 and a3,a3,a2 + 30009f4: 767d lui a2,0xfffff + 30009f6: 8ff1 and a5,a5,a2 + 30009f8: 8fd5 or a5,a5,a3 + 30009fa: 80f72a23 sw a5,-2028(a4) + 30009fe: 18000737 lui a4,0x18000 + 3000a02: fc042783 lw a5,-64(s0) + 3000a06: 86be mv a3,a5 + 3000a08: 6789 lui a5,0x2 + 3000a0a: 17fd addi a5,a5,-1 # 1fff + 3000a0c: 8ff5 and a5,a5,a3 + 3000a0e: 01079613 slli a2,a5,0x10 + 3000a12: 8241 srli a2,a2,0x10 + 3000a14: 6785 lui a5,0x1 + 3000a16: 973e add a4,a4,a5 + 3000a18: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a1c: 6689 lui a3,0x2 + 3000a1e: 16fd addi a3,a3,-1 # 1fff + 3000a20: 8ef1 and a3,a3,a2 + 3000a22: 06c2 slli a3,a3,0x10 + 3000a24: e0010637 lui a2,0xe0010 + 3000a28: 167d addi a2,a2,-1 # e000ffff + 3000a2a: 8ff1 and a5,a5,a2 + 3000a2c: 8fd5 or a5,a5,a3 + 3000a2e: 80f72c23 sw a5,-2024(a4) + 3000a32: 18000737 lui a4,0x18000 + 3000a36: fc042783 lw a5,-64(s0) + 3000a3a: 83c1 srli a5,a5,0x10 + 3000a3c: 86be mv a3,a5 + 3000a3e: 6785 lui a5,0x1 + 3000a40: 17fd addi a5,a5,-1 # fff + 3000a42: 8ff5 and a5,a5,a3 + 3000a44: 01079613 slli a2,a5,0x10 + 3000a48: 8241 srli a2,a2,0x10 + 3000a4a: 6785 lui a5,0x1 + 3000a4c: 973e add a4,a4,a5 + 3000a4e: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a52: 6685 lui a3,0x1 + 3000a54: 16fd addi a3,a3,-1 # fff + 3000a56: 8ef1 and a3,a3,a2 + 3000a58: 767d lui a2,0xfffff + 3000a5a: 8ff1 and a5,a5,a2 + 3000a5c: 8fd5 or a5,a5,a3 + 3000a5e: 80f72c23 sw a5,-2024(a4) + 3000a62: 18000737 lui a4,0x18000 + 3000a66: fc442783 lw a5,-60(s0) + 3000a6a: 86be mv a3,a5 + 3000a6c: 6789 lui a5,0x2 + 3000a6e: 17fd addi a5,a5,-1 # 1fff + 3000a70: 8ff5 and a5,a5,a3 + 3000a72: 01079613 slli a2,a5,0x10 + 3000a76: 8241 srli a2,a2,0x10 + 3000a78: 6785 lui a5,0x1 + 3000a7a: 973e add a4,a4,a5 + 3000a7c: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000a80: 6689 lui a3,0x2 + 3000a82: 16fd addi a3,a3,-1 # 1fff + 3000a84: 8ef1 and a3,a3,a2 + 3000a86: 06c2 slli a3,a3,0x10 + 3000a88: e0010637 lui a2,0xe0010 + 3000a8c: 167d addi a2,a2,-1 # e000ffff + 3000a8e: 8ff1 and a5,a5,a2 + 3000a90: 8fd5 or a5,a5,a3 + 3000a92: 80f72e23 sw a5,-2020(a4) + 3000a96: 18000737 lui a4,0x18000 + 3000a9a: fc442783 lw a5,-60(s0) + 3000a9e: 83c1 srli a5,a5,0x10 + 3000aa0: 86be mv a3,a5 + 3000aa2: 6785 lui a5,0x1 + 3000aa4: 17fd addi a5,a5,-1 # fff + 3000aa6: 8ff5 and a5,a5,a3 + 3000aa8: 01079613 slli a2,a5,0x10 + 3000aac: 8241 srli a2,a2,0x10 + 3000aae: 6785 lui a5,0x1 + 3000ab0: 973e add a4,a4,a5 + 3000ab2: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000ab6: 6685 lui a3,0x1 + 3000ab8: 16fd addi a3,a3,-1 # fff + 3000aba: 8ef1 and a3,a3,a2 + 3000abc: 767d lui a2,0xfffff + 3000abe: 8ff1 and a5,a5,a2 + 3000ac0: 8fd5 or a5,a5,a3 + 3000ac2: 80f72e23 sw a5,-2020(a4) + 3000ac6: 18000737 lui a4,0x18000 + 3000aca: fc842783 lw a5,-56(s0) + 3000ace: 86be mv a3,a5 + 3000ad0: 6789 lui a5,0x2 + 3000ad2: 17fd addi a5,a5,-1 # 1fff + 3000ad4: 8ff5 and a5,a5,a3 + 3000ad6: 01079613 slli a2,a5,0x10 + 3000ada: 8241 srli a2,a2,0x10 + 3000adc: 6785 lui a5,0x1 + 3000ade: 973e add a4,a4,a5 + 3000ae0: 82072783 lw a5,-2016(a4) # 17fff820 + 3000ae4: 6689 lui a3,0x2 + 3000ae6: 16fd addi a3,a3,-1 # 1fff + 3000ae8: 8ef1 and a3,a3,a2 + 3000aea: 06c2 slli a3,a3,0x10 + 3000aec: e0010637 lui a2,0xe0010 + 3000af0: 167d addi a2,a2,-1 # e000ffff + 3000af2: 8ff1 and a5,a5,a2 + 3000af4: 8fd5 or a5,a5,a3 + 3000af6: 82f72023 sw a5,-2016(a4) + 3000afa: 18000737 lui a4,0x18000 + 3000afe: fc842783 lw a5,-56(s0) + 3000b02: 83c1 srli a5,a5,0x10 + 3000b04: 86be mv a3,a5 + 3000b06: 6785 lui a5,0x1 + 3000b08: 17fd addi a5,a5,-1 # fff + 3000b0a: 8ff5 and a5,a5,a3 + 3000b0c: 01079613 slli a2,a5,0x10 + 3000b10: 8241 srli a2,a2,0x10 + 3000b12: 6785 lui a5,0x1 + 3000b14: 973e add a4,a4,a5 + 3000b16: 82072783 lw a5,-2016(a4) # 17fff820 + 3000b1a: 6685 lui a3,0x1 + 3000b1c: 16fd addi a3,a3,-1 # fff + 3000b1e: 8ef1 and a3,a3,a2 + 3000b20: 767d lui a2,0xfffff + 3000b22: 8ff1 and a5,a5,a2 + 3000b24: 8fd5 or a5,a5,a3 + 3000b26: 82f72023 sw a5,-2016(a4) + 3000b2a: fac40793 addi a5,s0,-84 + 3000b2e: 863e mv a2,a5 + 3000b30: 45dd li a1,23 + 3000b32: 4501 li a0,0 + 3000b34: 2b09 jal ra,3001046 + 3000b36: 18000737 lui a4,0x18000 + 3000b3a: fac42783 lw a5,-84(s0) + 3000b3e: 86be mv a3,a5 + 3000b40: 6789 lui a5,0x2 + 3000b42: 17fd addi a5,a5,-1 # 1fff + 3000b44: 8ff5 and a5,a5,a3 + 3000b46: 01079613 slli a2,a5,0x10 + 3000b4a: 8241 srli a2,a2,0x10 + 3000b4c: 6785 lui a5,0x1 + 3000b4e: 973e add a4,a4,a5 + 3000b50: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b54: 6689 lui a3,0x2 + 3000b56: 16fd addi a3,a3,-1 # 1fff + 3000b58: 8ef1 and a3,a3,a2 + 3000b5a: 06c2 slli a3,a3,0x10 + 3000b5c: e0010637 lui a2,0xe0010 + 3000b60: 167d addi a2,a2,-1 # e000ffff + 3000b62: 8ff1 and a5,a5,a2 + 3000b64: 8fd5 or a5,a5,a3 + 3000b66: 82f72223 sw a5,-2012(a4) + 3000b6a: 18000737 lui a4,0x18000 + 3000b6e: fac42783 lw a5,-84(s0) + 3000b72: 83c1 srli a5,a5,0x10 + 3000b74: 86be mv a3,a5 + 3000b76: 6785 lui a5,0x1 + 3000b78: 17fd addi a5,a5,-1 # fff + 3000b7a: 8ff5 and a5,a5,a3 + 3000b7c: 01079613 slli a2,a5,0x10 + 3000b80: 8241 srli a2,a2,0x10 + 3000b82: 6785 lui a5,0x1 + 3000b84: 973e add a4,a4,a5 + 3000b86: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b8a: 6685 lui a3,0x1 + 3000b8c: 16fd addi a3,a3,-1 # fff + 3000b8e: 8ef1 and a3,a3,a2 + 3000b90: 767d lui a2,0xfffff + 3000b92: 8ff1 and a5,a5,a2 + 3000b94: 8fd5 or a5,a5,a3 + 3000b96: 82f72223 sw a5,-2012(a4) + 3000b9a: 18000737 lui a4,0x18000 + 3000b9e: fb042783 lw a5,-80(s0) + 3000ba2: 86be mv a3,a5 + 3000ba4: 6789 lui a5,0x2 + 3000ba6: 17fd addi a5,a5,-1 # 1fff + 3000ba8: 8ff5 and a5,a5,a3 + 3000baa: 01079613 slli a2,a5,0x10 + 3000bae: 8241 srli a2,a2,0x10 + 3000bb0: 6785 lui a5,0x1 + 3000bb2: 973e add a4,a4,a5 + 3000bb4: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bb8: 6689 lui a3,0x2 + 3000bba: 16fd addi a3,a3,-1 # 1fff + 3000bbc: 8ef1 and a3,a3,a2 + 3000bbe: 06c2 slli a3,a3,0x10 + 3000bc0: e0010637 lui a2,0xe0010 + 3000bc4: 167d addi a2,a2,-1 # e000ffff + 3000bc6: 8ff1 and a5,a5,a2 + 3000bc8: 8fd5 or a5,a5,a3 + 3000bca: 82f72423 sw a5,-2008(a4) + 3000bce: 18000737 lui a4,0x18000 + 3000bd2: fb042783 lw a5,-80(s0) + 3000bd6: 83c1 srli a5,a5,0x10 + 3000bd8: 86be mv a3,a5 + 3000bda: 6785 lui a5,0x1 + 3000bdc: 17fd addi a5,a5,-1 # fff + 3000bde: 8ff5 and a5,a5,a3 + 3000be0: 01079613 slli a2,a5,0x10 + 3000be4: 8241 srli a2,a2,0x10 + 3000be6: 6785 lui a5,0x1 + 3000be8: 973e add a4,a4,a5 + 3000bea: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bee: 6685 lui a3,0x1 + 3000bf0: 16fd addi a3,a3,-1 # fff + 3000bf2: 8ef1 and a3,a3,a2 + 3000bf4: 767d lui a2,0xfffff + 3000bf6: 8ff1 and a5,a5,a2 + 3000bf8: 8fd5 or a5,a5,a3 + 3000bfa: 82f72423 sw a5,-2008(a4) + 3000bfe: 18000737 lui a4,0x18000 + 3000c02: fb442783 lw a5,-76(s0) + 3000c06: 86be mv a3,a5 + 3000c08: 6789 lui a5,0x2 + 3000c0a: 17fd addi a5,a5,-1 # 1fff + 3000c0c: 8ff5 and a5,a5,a3 + 3000c0e: 01079613 slli a2,a5,0x10 + 3000c12: 8241 srli a2,a2,0x10 + 3000c14: 6785 lui a5,0x1 + 3000c16: 973e add a4,a4,a5 + 3000c18: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c1c: 6689 lui a3,0x2 + 3000c1e: 16fd addi a3,a3,-1 # 1fff + 3000c20: 8ef1 and a3,a3,a2 + 3000c22: 06c2 slli a3,a3,0x10 + 3000c24: e0010637 lui a2,0xe0010 + 3000c28: 167d addi a2,a2,-1 # e000ffff + 3000c2a: 8ff1 and a5,a5,a2 + 3000c2c: 8fd5 or a5,a5,a3 + 3000c2e: 82f72623 sw a5,-2004(a4) + 3000c32: 18000737 lui a4,0x18000 + 3000c36: fb442783 lw a5,-76(s0) + 3000c3a: 83c1 srli a5,a5,0x10 + 3000c3c: 86be mv a3,a5 + 3000c3e: 6785 lui a5,0x1 + 3000c40: 17fd addi a5,a5,-1 # fff + 3000c42: 8ff5 and a5,a5,a3 + 3000c44: 01079613 slli a2,a5,0x10 + 3000c48: 8241 srli a2,a2,0x10 + 3000c4a: 6785 lui a5,0x1 + 3000c4c: 973e add a4,a4,a5 + 3000c4e: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c52: 6685 lui a3,0x1 + 3000c54: 16fd addi a3,a3,-1 # fff + 3000c56: 8ef1 and a3,a3,a2 + 3000c58: 767d lui a2,0xfffff + 3000c5a: 8ff1 and a5,a5,a2 + 3000c5c: 8fd5 or a5,a5,a3 + 3000c5e: 82f72623 sw a5,-2004(a4) + 3000c62: 18000737 lui a4,0x18000 + 3000c66: fb842783 lw a5,-72(s0) + 3000c6a: 86be mv a3,a5 + 3000c6c: 6789 lui a5,0x2 + 3000c6e: 17fd addi a5,a5,-1 # 1fff + 3000c70: 8ff5 and a5,a5,a3 + 3000c72: 01079613 slli a2,a5,0x10 + 3000c76: 8241 srli a2,a2,0x10 + 3000c78: 6785 lui a5,0x1 + 3000c7a: 973e add a4,a4,a5 + 3000c7c: 83072783 lw a5,-2000(a4) # 17fff830 + 3000c80: 6689 lui a3,0x2 + 3000c82: 16fd addi a3,a3,-1 # 1fff + 3000c84: 8ef1 and a3,a3,a2 + 3000c86: 06c2 slli a3,a3,0x10 + 3000c88: e0010637 lui a2,0xe0010 + 3000c8c: 167d addi a2,a2,-1 # e000ffff + 3000c8e: 8ff1 and a5,a5,a2 + 3000c90: 8fd5 or a5,a5,a3 + 3000c92: 82f72823 sw a5,-2000(a4) + 3000c96: 18000737 lui a4,0x18000 + 3000c9a: fb842783 lw a5,-72(s0) + 3000c9e: 83c1 srli a5,a5,0x10 + 3000ca0: 86be mv a3,a5 + 3000ca2: 6785 lui a5,0x1 + 3000ca4: 17fd addi a5,a5,-1 # fff + 3000ca6: 8ff5 and a5,a5,a3 + 3000ca8: 01079613 slli a2,a5,0x10 + 3000cac: 8241 srli a2,a2,0x10 + 3000cae: 6785 lui a5,0x1 + 3000cb0: 973e add a4,a4,a5 + 3000cb2: 83072783 lw a5,-2000(a4) # 17fff830 + 3000cb6: 6685 lui a3,0x1 + 3000cb8: 16fd addi a3,a3,-1 # fff + 3000cba: 8ef1 and a3,a3,a2 + 3000cbc: 767d lui a2,0xfffff + 3000cbe: 8ff1 and a5,a5,a2 + 3000cc0: 8fd5 or a5,a5,a3 + 3000cc2: 82f72823 sw a5,-2000(a4) + 3000cc6: 0001 nop + 3000cc8: 40f6 lw ra,92(sp) + 3000cca: 4466 lw s0,88(sp) + 3000ccc: 6125 addi sp,sp,96 + 3000cce: 8082 ret + +03000cd0 : + 3000cd0: 3760006f j 3001046 + +03000cd4 : + 3000cd4: 1141 addi sp,sp,-16 + 3000cd6: c606 sw ra,12(sp) + 3000cd8: c422 sw s0,8(sp) + 3000cda: 0800 addi s0,sp,16 + 3000cdc: 3c79 jal ra,300077a + 3000cde: 87aa mv a5,a0 + 3000ce0: 0017c793 xori a5,a5,1 + 3000ce4: 9f81 uxtb a5 + 3000ce6: eb9d bnez a5,3000d1c + 3000ce8: 4585 li a1,1 + 3000cea: 18000537 lui a0,0x18000 + 3000cee: 2849 jal ra,3000d80 + 3000cf0: 4585 li a1,1 + 3000cf2: 18200537 lui a0,0x18200 + 3000cf6: 2069 jal ra,3000d80 + 3000cf8: 4585 li a1,1 + 3000cfa: 18201537 lui a0,0x18201 + 3000cfe: 2049 jal ra,3000d80 + 3000d00: 34d1 jal ra,30007c4 + 3000d02: 4581 li a1,0 + 3000d04: 18000537 lui a0,0x18000 + 3000d08: 28a5 jal ra,3000d80 + 3000d0a: 4581 li a1,0 + 3000d0c: 18200537 lui a0,0x18200 + 3000d10: 2885 jal ra,3000d80 + 3000d12: 4581 li a1,0 + 3000d14: 18201537 lui a0,0x18201 + 3000d18: 20a5 jal ra,3000d80 + 3000d1a: a011 j 3000d1e + 3000d1c: 0001 nop + 3000d1e: 40b2 lw ra,12(sp) + 3000d20: 4422 lw s0,8(sp) + 3000d22: 0141 addi sp,sp,16 + 3000d24: 8082 ret + +03000d26 : + 3000d26: 1141 addi sp,sp,-16 + 3000d28: c606 sw ra,12(sp) + 3000d2a: c422 sw s0,8(sp) + 3000d2c: 0800 addi s0,sp,16 + 3000d2e: 4585 li a1,1 + 3000d30: 18100537 lui a0,0x18100 + 3000d34: 20b1 jal ra,3000d80 + 3000d36: 18100737 lui a4,0x18100 + 3000d3a: 531c lw a5,32(a4) + 3000d3c: 66c1 lui a3,0x10 + 3000d3e: 8fd5 or a5,a5,a3 + 3000d40: d31c sw a5,32(a4) + 3000d42: 18100737 lui a4,0x18100 + 3000d46: 431c lw a5,0(a4) + 3000d48: 0017e793 ori a5,a5,1 + 3000d4c: c31c sw a5,0(a4) + 3000d4e: 000f47b7 lui a5,0xf4 + 3000d52: 24078593 addi a1,a5,576 # f4240 + 3000d56: 0c800513 li a0,200 + 3000d5a: 20b5 jal ra,3000dc6 + 3000d5c: 18100737 lui a4,0x18100 + 3000d60: 531c lw a5,32(a4) + 3000d62: 0017e793 ori a5,a5,1 + 3000d66: d31c sw a5,32(a4) + 3000d68: 000f47b7 lui a5,0xf4 + 3000d6c: 24078593 addi a1,a5,576 # f4240 + 3000d70: 02800513 li a0,40 + 3000d74: 2889 jal ra,3000dc6 + 3000d76: 0001 nop + 3000d78: 40b2 lw ra,12(sp) + 3000d7a: 4422 lw s0,8(sp) + 3000d7c: 0141 addi sp,sp,16 + 3000d7e: 8082 ret + +03000d80 : + 3000d80: 57a0206f j 30032fa + +03000d84 : + 3000d84: 715d addi sp,sp,-80 + 3000d86: c686 sw ra,76(sp) + 3000d88: c4a2 sw s0,72(sp) + 3000d8a: 0880 addi s0,sp,80 + 3000d8c: faa42e23 sw a0,-68(s0) + 3000d90: 100007b7 lui a5,0x10000 + 3000d94: fcf42423 sw a5,-56(s0) + 3000d98: fbc42783 lw a5,-68(s0) + 3000d9c: fef42023 sw a5,-32(s0) + 3000da0: fe042703 lw a4,-32(s0) + 3000da4: 4785 li a5,1 + 3000da6: 00f71663 bne a4,a5,3000db2 + 3000daa: 3e800593 li a1,1000 + 3000dae: 4529 li a0,10 + 3000db0: 2819 jal ra,3000dc6 + 3000db2: fc840793 addi a5,s0,-56 + 3000db6: 853e mv a0,a5 + 3000db8: 23a020ef jal ra,3002ff2 + 3000dbc: 0001 nop + 3000dbe: 40b6 lw ra,76(sp) + 3000dc0: 4426 lw s0,72(sp) + 3000dc2: 6161 addi sp,sp,80 + 3000dc4: 8082 ret + +03000dc6 : + 3000dc6: 1de0106f j 3001fa4 + +03000dca : + 3000dca: 7179 addi sp,sp,-48 + 3000dcc: d622 sw s0,44(sp) + 3000dce: 1800 addi s0,sp,48 + 3000dd0: fca42e23 sw a0,-36(s0) + 3000dd4: fcb42c23 sw a1,-40(s0) + 3000dd8: fdc42783 lw a5,-36(s0) + 3000ddc: fef42423 sw a5,-24(s0) + 3000de0: fe842703 lw a4,-24(s0) + 3000de4: 023c37b7 lui a5,0x23c3 + 3000de8: 45f78793 addi a5,a5,1119 # 23c345f + 3000dec: 00e7e863 bltu a5,a4,3000dfc + 3000df0: 023c37b7 lui a5,0x23c3 + 3000df4: 46078793 addi a5,a5,1120 # 23c3460 + 3000df8: fef42423 sw a5,-24(s0) + 3000dfc: fe842703 lw a4,-24(s0) + 3000e00: 023c37b7 lui a5,0x23c3 + 3000e04: 46078793 addi a5,a5,1120 # 23c3460 + 3000e08: 02f777b3 remu a5,a4,a5 + 3000e0c: ef81 bnez a5,3000e24 + 3000e0e: fe842703 lw a4,-24(s0) + 3000e12: 023c37b7 lui a5,0x23c3 + 3000e16: 46078793 addi a5,a5,1120 # 23c3460 + 3000e1a: 02f757b3 divu a5,a4,a5 + 3000e1e: fef42623 sw a5,-20(s0) + 3000e22: a821 j 3000e3a + 3000e24: fe842703 lw a4,-24(s0) + 3000e28: 023c37b7 lui a5,0x23c3 + 3000e2c: 46078793 addi a5,a5,1120 # 23c3460 + 3000e30: 02f757b3 divu a5,a4,a5 + 3000e34: 0785 addi a5,a5,1 + 3000e36: fef42623 sw a5,-20(s0) + 3000e3a: fec42703 lw a4,-20(s0) + 3000e3e: 4791 li a5,4 + 3000e40: 00e7f563 bgeu a5,a4,3000e4a + 3000e44: 4791 li a5,4 + 3000e46: fef42623 sw a5,-20(s0) + 3000e4a: fd842783 lw a5,-40(s0) + 3000e4e: fec42703 lw a4,-20(s0) + 3000e52: c398 sw a4,0(a5) + 3000e54: 0001 nop + 3000e56: 5432 lw s0,44(sp) + 3000e58: 6145 addi sp,sp,48 + 3000e5a: 8082 ret + +03000e5c : + 3000e5c: 7179 addi sp,sp,-48 + 3000e5e: d606 sw ra,44(sp) + 3000e60: d422 sw s0,40(sp) + 3000e62: 1800 addi s0,sp,48 + 3000e64: fca42e23 sw a0,-36(s0) + 3000e68: fdc42783 lw a5,-36(s0) + 3000e6c: 4705 li a4,1 + 3000e6e: 02e78063 beq a5,a4,3000e8e + 3000e72: 4705 li a4,1 + 3000e74: 00e7e663 bltu a5,a4,3000e80 + 3000e78: 4709 li a4,2 + 3000e7a: 02e78163 beq a5,a4,3000e9c + 3000e7e: a025 j 3000ea6 + 3000e80: 017d87b7 lui a5,0x17d8 + 3000e84: 84078793 addi a5,a5,-1984 # 17d7840 + 3000e88: fef42623 sw a5,-20(s0) + 3000e8c: a01d j 3000eb2 + 3000e8e: 01c9c7b7 lui a5,0x1c9c + 3000e92: 38078793 addi a5,a5,896 # 1c9c380 + 3000e96: fef42623 sw a5,-20(s0) + 3000e9a: a821 j 3000eb2 + 3000e9c: 278020ef jal ra,3003114 + 3000ea0: fea42623 sw a0,-20(s0) + 3000ea4: a039 j 3000eb2 + 3000ea6: 67a1 lui a5,0x8 + 3000ea8: d0078793 addi a5,a5,-768 # 7d00 + 3000eac: fef42623 sw a5,-20(s0) + 3000eb0: 0001 nop + 3000eb2: fec42783 lw a5,-20(s0) + 3000eb6: 853e mv a0,a5 + 3000eb8: 50b2 lw ra,44(sp) + 3000eba: 5422 lw s0,40(sp) + 3000ebc: 6145 addi sp,sp,48 + 3000ebe: 8082 ret + +03000ec0 : + 3000ec0: 7179 addi sp,sp,-48 + 3000ec2: d606 sw ra,44(sp) + 3000ec4: d422 sw s0,40(sp) + 3000ec6: 1800 addi s0,sp,48 + 3000ec8: fca42e23 sw a0,-36(s0) + 3000ecc: 147107b7 lui a5,0x14710 + 3000ed0: fef42623 sw a5,-20(s0) + 3000ed4: fdc42503 lw a0,-36(s0) + 3000ed8: 3751 jal ra,3000e5c + 3000eda: fea42423 sw a0,-24(s0) + 3000ede: fec42703 lw a4,-20(s0) + 3000ee2: 6785 lui a5,0x1 + 3000ee4: 97ba add a5,a5,a4 + 3000ee6: 9407a783 lw a5,-1728(a5) # 940 + 3000eea: fef42223 sw a5,-28(s0) + 3000eee: fe040793 addi a5,s0,-32 + 3000ef2: 85be mv a1,a5 + 3000ef4: fe842503 lw a0,-24(s0) + 3000ef8: 3dc9 jal ra,3000dca + 3000efa: fe042783 lw a5,-32(s0) + 3000efe: 8bbd andi a5,a5,15 + 3000f00: 0ff7f713 andi a4,a5,255 + 3000f04: fe442783 lw a5,-28(s0) + 3000f08: 8b3d andi a4,a4,15 + 3000f0a: 0712 slli a4,a4,0x4 + 3000f0c: f0f7f793 andi a5,a5,-241 + 3000f10: 8fd9 or a5,a5,a4 + 3000f12: fef42223 sw a5,-28(s0) + 3000f16: fe442783 lw a5,-28(s0) + 3000f1a: 00100737 lui a4,0x100 + 3000f1e: 8fd9 or a5,a5,a4 + 3000f20: fef42223 sw a5,-28(s0) + 3000f24: fe442783 lw a5,-28(s0) + 3000f28: 00400737 lui a4,0x400 + 3000f2c: 8fd9 or a5,a5,a4 + 3000f2e: fef42223 sw a5,-28(s0) + 3000f32: fe442783 lw a5,-28(s0) + 3000f36: 00400737 lui a4,0x400 + 3000f3a: 8fd9 or a5,a5,a4 + 3000f3c: fef42223 sw a5,-28(s0) + 3000f40: fe442783 lw a5,-28(s0) + 3000f44: 00100737 lui a4,0x100 + 3000f48: 8fd9 or a5,a5,a4 + 3000f4a: fef42223 sw a5,-28(s0) + 3000f4e: fe442703 lw a4,-28(s0) + 3000f52: fec42683 lw a3,-20(s0) + 3000f56: 6785 lui a5,0x1 + 3000f58: 97b6 add a5,a5,a3 + 3000f5a: 94e7a023 sw a4,-1728(a5) # 940 + 3000f5e: 0001 nop + 3000f60: fec42703 lw a4,-20(s0) + 3000f64: 6785 lui a5,0x1 + 3000f66: 97ba add a5,a5,a4 + 3000f68: 9407a783 lw a5,-1728(a5) # 940 + 3000f6c: 83d1 srli a5,a5,0x14 + 3000f6e: 8b85 andi a5,a5,1 + 3000f70: 0ff7f713 andi a4,a5,255 + 3000f74: 4785 li a5,1 + 3000f76: fef705e3 beq a4,a5,3000f60 + 3000f7a: 0001 nop + 3000f7c: 50b2 lw ra,44(sp) + 3000f7e: 5422 lw s0,40(sp) + 3000f80: 6145 addi sp,sp,48 + 3000f82: 8082 ret + +03000f84 : + 3000f84: 1141 addi sp,sp,-16 + 3000f86: c622 sw s0,12(sp) + 3000f88: 0800 addi s0,sp,16 + 3000f8a: 143807b7 lui a5,0x14380 + 3000f8e: 0007a023 sw zero,0(a5) # 14380000 + 3000f92: 14380737 lui a4,0x14380 + 3000f96: 431c lw a5,0(a4) + 3000f98: 0017e793 ori a5,a5,1 + 3000f9c: c31c sw a5,0(a4) + 3000f9e: 0001 nop + 3000fa0: 4432 lw s0,12(sp) + 3000fa2: 0141 addi sp,sp,16 + 3000fa4: 8082 ret + +03000fa6 : + 3000fa6: 1141 addi sp,sp,-16 + 3000fa8: c606 sw ra,12(sp) + 3000faa: c422 sw s0,8(sp) + 3000fac: 0800 addi s0,sp,16 + 3000fae: 14380537 lui a0,0x14380 + 3000fb2: 264020ef jal ra,3003216 + 3000fb6: 87aa mv a5,a0 + 3000fb8: 853e mv a0,a5 + 3000fba: 40b2 lw ra,12(sp) + 3000fbc: 4422 lw s0,8(sp) + 3000fbe: 0141 addi sp,sp,16 + 3000fc0: 8082 ret + +03000fc2 : + 3000fc2: 1101 addi sp,sp,-32 + 3000fc4: ce22 sw s0,28(sp) + 3000fc6: 1000 addi s0,sp,32 + 3000fc8: fea42623 sw a0,-20(s0) + 3000fcc: fec42783 lw a5,-20(s0) + 3000fd0: 1007a783 lw a5,256(a5) + 3000fd4: 83c1 srli a5,a5,0x10 + 3000fd6: 8b85 andi a5,a5,1 + 3000fd8: 9f81 uxtb a5 + 3000fda: e38d bnez a5,3000ffc + 3000fdc: fec42783 lw a5,-20(s0) + 3000fe0: 1007a783 lw a5,256(a5) + 3000fe4: 83cd srli a5,a5,0x13 + 3000fe6: 8b85 andi a5,a5,1 + 3000fe8: 9f81 uxtb a5 + 3000fea: eb89 bnez a5,3000ffc + 3000fec: fec42783 lw a5,-20(s0) + 3000ff0: 1007a783 lw a5,256(a5) + 3000ff4: 83d1 srli a5,a5,0x14 + 3000ff6: 8b85 andi a5,a5,1 + 3000ff8: 9f81 uxtb a5 + 3000ffa: c3a9 beqz a5,300103c + 3000ffc: fec42703 lw a4,-20(s0) + 3001000: 10c72783 lw a5,268(a4) # 1438010c + 3001004: 000806b7 lui a3,0x80 + 3001008: 8fd5 or a5,a5,a3 + 300100a: 10f72623 sw a5,268(a4) + 300100e: fec42703 lw a4,-20(s0) + 3001012: 10c72783 lw a5,268(a4) + 3001016: 66c1 lui a3,0x10 + 3001018: 8fd5 or a5,a5,a3 + 300101a: 10f72623 sw a5,268(a4) + 300101e: fec42703 lw a4,-20(s0) + 3001022: 10c72783 lw a5,268(a4) + 3001026: 001006b7 lui a3,0x100 + 300102a: 8fd5 or a5,a5,a3 + 300102c: 10f72623 sw a5,268(a4) + 3001030: fec42783 lw a5,-20(s0) + 3001034: 2007a023 sw zero,512(a5) + 3001038: 4785 li a5,1 + 300103a: a011 j 300103e + 300103c: 4781 li a5,0 + 300103e: 853e mv a0,a5 + 3001040: 4472 lw s0,28(sp) + 3001042: 6105 addi sp,sp,32 + 3001044: 8082 ret + +03001046 : + 3001046: 7179 addi sp,sp,-48 + 3001048: d606 sw ra,44(sp) + 300104a: d422 sw s0,40(sp) + 300104c: 1800 addi s0,sp,48 + 300104e: fca42e23 sw a0,-36(s0) + 3001052: fcb42c23 sw a1,-40(s0) + 3001056: fcc42a23 sw a2,-44(s0) + 300105a: 147107b7 lui a5,0x14710 + 300105e: fef42423 sw a5,-24(s0) + 3001062: fd442783 lw a5,-44(s0) + 3001066: e399 bnez a5,300106c + 3001068: 4785 li a5,1 + 300106a: aa15 j 300119e + 300106c: fdc42703 lw a4,-36(s0) + 3001070: 4785 li a5,1 + 3001072: 00e7e763 bltu a5,a4,3001080 + 3001076: fd842703 lw a4,-40(s0) + 300107a: 47e5 li a5,25 + 300107c: 00e7f463 bgeu a5,a4,3001084 + 3001080: 4785 li a5,1 + 3001082: aa31 j 300119e + 3001084: fe842783 lw a5,-24(s0) + 3001088: 439c lw a5,0(a5) + 300108a: 8b85 andi a5,a5,1 + 300108c: 9f81 uxtb a5 + 300108e: c399 beqz a5,3001094 + 3001090: 4785 li a5,1 + 3001092: a231 j 300119e + 3001094: fe842783 lw a5,-24(s0) + 3001098: fedcc737 lui a4,0xfedcc + 300109c: a9870713 addi a4,a4,-1384 # fedcba98 + 30010a0: 20e7a023 sw a4,512(a5) # 14710200 + 30010a4: fdc42783 lw a5,-36(s0) + 30010a8: e781 bnez a5,30010b0 + 30010aa: 008007b7 lui a5,0x800 + 30010ae: a019 j 30010b4 + 30010b0: 008017b7 lui a5,0x801 + 30010b4: fef42223 sw a5,-28(s0) + 30010b8: fd842783 lw a5,-40(s0) + 30010bc: 0792 slli a5,a5,0x4 + 30010be: fe442703 lw a4,-28(s0) + 30010c2: 97ba add a5,a5,a4 + 30010c4: fef42223 sw a5,-28(s0) + 30010c8: fe442783 lw a5,-28(s0) + 30010cc: 0027d713 srli a4,a5,0x2 + 30010d0: 004007b7 lui a5,0x400 + 30010d4: 17fd addi a5,a5,-1 # 3fffff + 30010d6: 00f77633 and a2,a4,a5 + 30010da: fe842703 lw a4,-24(s0) + 30010de: 435c lw a5,4(a4) + 30010e0: 004006b7 lui a3,0x400 + 30010e4: 16fd addi a3,a3,-1 # 3fffff + 30010e6: 8ef1 and a3,a3,a2 + 30010e8: 068a slli a3,a3,0x2 + 30010ea: ff000637 lui a2,0xff000 + 30010ee: 060d addi a2,a2,3 # ff000003 + 30010f0: 8ff1 and a5,a5,a2 + 30010f2: 8fd5 or a5,a5,a3 + 30010f4: c35c sw a5,4(a4) + 30010f6: fe842703 lw a4,-24(s0) + 30010fa: 431c lw a5,0(a4) + 30010fc: 8ff7f793 andi a5,a5,-1793 + 3001100: 1007e793 ori a5,a5,256 + 3001104: c31c sw a5,0(a4) + 3001106: fe842703 lw a4,-24(s0) + 300110a: 431c lw a5,0(a4) + 300110c: d00006b7 lui a3,0xd0000 + 3001110: 16fd addi a3,a3,-1 # cfffffff + 3001112: 8efd and a3,a3,a5 + 3001114: 100007b7 lui a5,0x10000 + 3001118: 8fd5 or a5,a5,a3 + 300111a: c31c sw a5,0(a4) + 300111c: fe842703 lw a4,-24(s0) + 3001120: 431c lw a5,0(a4) + 3001122: 0017e793 ori a5,a5,1 + 3001126: c31c sw a5,0(a4) + 3001128: 0001 nop + 300112a: fe842783 lw a5,-24(s0) + 300112e: 439c lw a5,0(a5) + 3001130: 8b85 andi a5,a5,1 + 3001132: 9f81 uxtb a5 + 3001134: fbfd bnez a5,300112a + 3001136: 0001 nop + 3001138: fe842783 lw a5,-24(s0) + 300113c: 439c lw a5,0(a5) + 300113e: 8399 srli a5,a5,0x6 + 3001140: 8b8d andi a5,a5,3 + 3001142: 9f81 uxtb a5 + 3001144: fbf5 bnez a5,3001138 + 3001146: fe842503 lw a0,-24(s0) + 300114a: 3da5 jal ra,3000fc2 + 300114c: 87aa mv a5,a0 + 300114e: c399 beqz a5,3001154 + 3001150: 4785 li a5,1 + 3001152: a0b1 j 300119e + 3001154: fe042623 sw zero,-20(s0) + 3001158: a00d j 300117a + 300115a: fe842783 lw a5,-24(s0) + 300115e: 6007a703 lw a4,1536(a5) # 10000600 + 3001162: fd442683 lw a3,-44(s0) + 3001166: fec42783 lw a5,-20(s0) + 300116a: 078a slli a5,a5,0x2 + 300116c: 97b6 add a5,a5,a3 + 300116e: c398 sw a4,0(a5) + 3001170: fec42783 lw a5,-20(s0) + 3001174: 0785 addi a5,a5,1 + 3001176: fef42623 sw a5,-20(s0) + 300117a: fec42703 lw a4,-20(s0) + 300117e: 478d li a5,3 + 3001180: fce7fde3 bgeu a5,a4,300115a + 3001184: fe842703 lw a4,-24(s0) + 3001188: 10c72783 lw a5,268(a4) + 300118c: 0107e793 ori a5,a5,16 + 3001190: 10f72623 sw a5,268(a4) + 3001194: fe842783 lw a5,-24(s0) + 3001198: 2007a023 sw zero,512(a5) + 300119c: 4781 li a5,0 + 300119e: 853e mv a0,a5 + 30011a0: 50b2 lw ra,44(sp) + 30011a2: 5422 lw s0,40(sp) + 30011a4: 6145 addi sp,sp,48 + 30011a6: 8082 ret + +030011a8 : + 30011a8: 7179 addi sp,sp,-48 + 30011aa: d622 sw s0,44(sp) + 30011ac: 1800 addi s0,sp,48 + 30011ae: fca42e23 sw a0,-36(s0) + 30011b2: fe042623 sw zero,-20(s0) + 30011b6: a081 j 30011f6 + 30011b8: 030067b7 lui a5,0x3006 + 30011bc: 20078713 addi a4,a5,512 # 3006200 + 30011c0: fec42683 lw a3,-20(s0) + 30011c4: 47b1 li a5,12 + 30011c6: 02f687b3 mul a5,a3,a5 + 30011ca: 97ba add a5,a5,a4 + 30011cc: 439c lw a5,0(a5) + 30011ce: fdc42703 lw a4,-36(s0) + 30011d2: 00f71d63 bne a4,a5,30011ec + 30011d6: fec42703 lw a4,-20(s0) + 30011da: 47b1 li a5,12 + 30011dc: 02f70733 mul a4,a4,a5 + 30011e0: 030067b7 lui a5,0x3006 + 30011e4: 20078793 addi a5,a5,512 # 3006200 + 30011e8: 97ba add a5,a5,a4 + 30011ea: a829 j 3001204 + 30011ec: fec42783 lw a5,-20(s0) + 30011f0: 0785 addi a5,a5,1 + 30011f2: fef42623 sw a5,-20(s0) + 30011f6: fec42703 lw a4,-20(s0) + 30011fa: 02d00793 li a5,45 + 30011fe: fae7fde3 bgeu a5,a4,30011b8 + 3001202: 4781 li a5,0 + 3001204: 853e mv a0,a5 + 3001206: 5432 lw s0,44(sp) + 3001208: 6145 addi sp,sp,48 + 300120a: 8082 ret + +0300120c : + 300120c: 1101 addi sp,sp,-32 + 300120e: ce22 sw s0,28(sp) + 3001210: 1000 addi s0,sp,32 + 3001212: fea42623 sw a0,-20(s0) + 3001216: fec42783 lw a5,-20(s0) + 300121a: 0147b793 sltiu a5,a5,20 + 300121e: 9f81 uxtb a5 + 3001220: 853e mv a0,a5 + 3001222: 4472 lw s0,28(sp) + 3001224: 6105 addi sp,sp,32 + 3001226: 8082 ret + +03001228 : + 3001228: 1101 addi sp,sp,-32 + 300122a: ce22 sw s0,28(sp) + 300122c: 1000 addi s0,sp,32 + 300122e: fea42623 sw a0,-20(s0) + 3001232: fec42783 lw a5,-20(s0) + 3001236: 0107b793 sltiu a5,a5,16 + 300123a: 9f81 uxtb a5 + 300123c: 853e mv a0,a5 + 300123e: 4472 lw s0,28(sp) + 3001240: 6105 addi sp,sp,32 + 3001242: 8082 ret + +03001244 : + 3001244: 1101 addi sp,sp,-32 + 3001246: ce22 sw s0,28(sp) + 3001248: 1000 addi s0,sp,32 + 300124a: fea42623 sw a0,-20(s0) + 300124e: fec42783 lw a5,-20(s0) + 3001252: 0047b793 sltiu a5,a5,4 + 3001256: 9f81 uxtb a5 + 3001258: 853e mv a0,a5 + 300125a: 4472 lw s0,28(sp) + 300125c: 6105 addi sp,sp,32 + 300125e: 8082 ret + +03001260 : + 3001260: 1101 addi sp,sp,-32 + 3001262: ce22 sw s0,28(sp) + 3001264: 1000 addi s0,sp,32 + 3001266: fea42623 sw a0,-20(s0) + 300126a: fec42783 lw a5,-20(s0) + 300126e: 0157b793 sltiu a5,a5,21 + 3001272: 9f81 uxtb a5 + 3001274: 853e mv a0,a5 + 3001276: 4472 lw s0,28(sp) + 3001278: 6105 addi sp,sp,32 + 300127a: 8082 ret + +0300127c : + 300127c: 1101 addi sp,sp,-32 + 300127e: ce22 sw s0,28(sp) + 3001280: 1000 addi s0,sp,32 + 3001282: fea42623 sw a0,-20(s0) + 3001286: fec42783 lw a5,-20(s0) + 300128a: cb81 beqz a5,300129a + 300128c: fec42703 lw a4,-20(s0) + 3001290: 4799 li a5,6 + 3001292: 00e7e463 bltu a5,a4,300129a + 3001296: 4785 li a5,1 + 3001298: a011 j 300129c + 300129a: 4781 li a5,0 + 300129c: 8b85 andi a5,a5,1 + 300129e: 9f81 uxtb a5 + 30012a0: 853e mv a0,a5 + 30012a2: 4472 lw s0,28(sp) + 30012a4: 6105 addi sp,sp,32 + 30012a6: 8082 ret + +030012a8 : + 30012a8: 1101 addi sp,sp,-32 + 30012aa: ce22 sw s0,28(sp) + 30012ac: 1000 addi s0,sp,32 + 30012ae: fea42623 sw a0,-20(s0) + 30012b2: fec42703 lw a4,-20(s0) + 30012b6: 67c1 lui a5,0x10 + 30012b8: 00f737b3 sltu a5,a4,a5 + 30012bc: 9f81 uxtb a5 + 30012be: 853e mv a0,a5 + 30012c0: 4472 lw s0,28(sp) + 30012c2: 6105 addi sp,sp,32 + 30012c4: 8082 ret + +030012c6 : + 30012c6: 1101 addi sp,sp,-32 + 30012c8: ce22 sw s0,28(sp) + 30012ca: 1000 addi s0,sp,32 + 30012cc: fea42623 sw a0,-20(s0) + 30012d0: fec42783 lw a5,-20(s0) + 30012d4: 0107b793 sltiu a5,a5,16 + 30012d8: 9f81 uxtb a5 + 30012da: 853e mv a0,a5 + 30012dc: 4472 lw s0,28(sp) + 30012de: 6105 addi sp,sp,32 + 30012e0: 8082 ret + +030012e2 : + 30012e2: 1101 addi sp,sp,-32 + 30012e4: ce06 sw ra,28(sp) + 30012e6: cc22 sw s0,24(sp) + 30012e8: 1000 addi s0,sp,32 + 30012ea: fea42623 sw a0,-20(s0) + 30012ee: fec42703 lw a4,-20(s0) + 30012f2: 180007b7 lui a5,0x18000 + 30012f6: 00f70b63 beq a4,a5,300130c + 30012fa: 6785 lui a5,0x1 + 30012fc: 86278593 addi a1,a5,-1950 # 862 + 3001300: 030067b7 lui a5,0x3006 + 3001304: 42878513 addi a0,a5,1064 # 3006428 + 3001308: 2b0d jal ra,300183a + 300130a: a001 j 300130a + 300130c: fec42703 lw a4,-20(s0) + 3001310: 65872783 lw a5,1624(a4) + 3001314: 0017e793 ori a5,a5,1 + 3001318: 64f72c23 sw a5,1624(a4) + 300131c: 0001 nop + 300131e: 40f2 lw ra,28(sp) + 3001320: 4462 lw s0,24(sp) + 3001322: 6105 addi sp,sp,32 + 3001324: 8082 ret + +03001326 : + 3001326: 7179 addi sp,sp,-48 + 3001328: d606 sw ra,44(sp) + 300132a: d422 sw s0,40(sp) + 300132c: 1800 addi s0,sp,48 + 300132e: fca42e23 sw a0,-36(s0) + 3001332: fcb42c23 sw a1,-40(s0) + 3001336: fdc42703 lw a4,-36(s0) + 300133a: 180007b7 lui a5,0x18000 + 300133e: 00f70b63 beq a4,a5,3001354 + 3001342: 6785 lui a5,0x1 + 3001344: 87978593 addi a1,a5,-1927 # 879 + 3001348: 030067b7 lui a5,0x3006 + 300134c: 42878513 addi a0,a5,1064 # 3006428 + 3001350: 21ed jal ra,300183a + 3001352: a001 j 3001352 + 3001354: fd842503 lw a0,-40(s0) + 3001358: 3dc1 jal ra,3001228 + 300135a: 87aa mv a5,a0 + 300135c: 0017c793 xori a5,a5,1 + 3001360: 9f81 uxtb a5 + 3001362: cb91 beqz a5,3001376 + 3001364: 6785 lui a5,0x1 + 3001366: 87a78593 addi a1,a5,-1926 # 87a + 300136a: 030067b7 lui a5,0x3006 + 300136e: 42878513 addi a0,a5,1064 # 3006428 + 3001372: 21e1 jal ra,300183a + 3001374: a01d j 300139a + 3001376: fd842783 lw a5,-40(s0) + 300137a: fef42623 sw a5,-20(s0) + 300137e: fdc42783 lw a5,-36(s0) + 3001382: 2b07a703 lw a4,688(a5) + 3001386: 4685 li a3,1 + 3001388: fec42783 lw a5,-20(s0) + 300138c: 00f697b3 sll a5,a3,a5 + 3001390: 8f5d or a4,a4,a5 + 3001392: fdc42783 lw a5,-36(s0) + 3001396: 2ae7a823 sw a4,688(a5) + 300139a: 50b2 lw ra,44(sp) + 300139c: 5422 lw s0,40(sp) + 300139e: 6145 addi sp,sp,48 + 30013a0: 8082 ret + +030013a2 : + 30013a2: 7179 addi sp,sp,-48 + 30013a4: d606 sw ra,44(sp) + 30013a6: d422 sw s0,40(sp) + 30013a8: 1800 addi s0,sp,48 + 30013aa: fca42e23 sw a0,-36(s0) + 30013ae: fcb42c23 sw a1,-40(s0) + 30013b2: fdc42703 lw a4,-36(s0) + 30013b6: 180007b7 lui a5,0x18000 + 30013ba: 00f70b63 beq a4,a5,30013d0 + 30013be: 6785 lui a5,0x1 + 30013c0: 89478593 addi a1,a5,-1900 # 894 + 30013c4: 030067b7 lui a5,0x3006 + 30013c8: 42878513 addi a0,a5,1064 # 3006428 + 30013cc: 21bd jal ra,300183a + 30013ce: a001 j 30013ce + 30013d0: fd842503 lw a0,-40(s0) + 30013d4: 3d91 jal ra,3001228 + 30013d6: 87aa mv a5,a0 + 30013d8: 0017c793 xori a5,a5,1 + 30013dc: 9f81 uxtb a5 + 30013de: cb91 beqz a5,30013f2 + 30013e0: 6785 lui a5,0x1 + 30013e2: 89578593 addi a1,a5,-1899 # 895 + 30013e6: 030067b7 lui a5,0x3006 + 30013ea: 42878513 addi a0,a5,1064 # 3006428 + 30013ee: 21b1 jal ra,300183a + 30013f0: a025 j 3001418 + 30013f2: fd842783 lw a5,-40(s0) + 30013f6: 07c1 addi a5,a5,16 + 30013f8: fef42623 sw a5,-20(s0) + 30013fc: fdc42783 lw a5,-36(s0) + 3001400: 2b07a703 lw a4,688(a5) + 3001404: 4685 li a3,1 + 3001406: fec42783 lw a5,-20(s0) + 300140a: 00f697b3 sll a5,a3,a5 + 300140e: 8f5d or a4,a4,a5 + 3001410: fdc42783 lw a5,-36(s0) + 3001414: 2ae7a823 sw a4,688(a5) + 3001418: 50b2 lw ra,44(sp) + 300141a: 5422 lw s0,40(sp) + 300141c: 6145 addi sp,sp,48 + 300141e: 8082 ret + +03001420 : + 3001420: 7179 addi sp,sp,-48 + 3001422: d606 sw ra,44(sp) + 3001424: d422 sw s0,40(sp) + 3001426: 1800 addi s0,sp,48 + 3001428: fca42e23 sw a0,-36(s0) + 300142c: fcb42c23 sw a1,-40(s0) + 3001430: fdc42703 lw a4,-36(s0) + 3001434: 180007b7 lui a5,0x18000 + 3001438: 00f70b63 beq a4,a5,300144e + 300143c: 6785 lui a5,0x1 + 300143e: 8af78593 addi a1,a5,-1873 # 8af + 3001442: 030067b7 lui a5,0x3006 + 3001446: 42878513 addi a0,a5,1064 # 3006428 + 300144a: 2ec5 jal ra,300183a + 300144c: a001 j 300144c + 300144e: fd842503 lw a0,-40(s0) + 3001452: 3bd9 jal ra,3001228 + 3001454: 87aa mv a5,a0 + 3001456: 0017c793 xori a5,a5,1 + 300145a: 9f81 uxtb a5 + 300145c: cb91 beqz a5,3001470 + 300145e: 6785 lui a5,0x1 + 3001460: 8b078593 addi a1,a5,-1872 # 8b0 + 3001464: 030067b7 lui a5,0x3006 + 3001468: 42878513 addi a0,a5,1064 # 3006428 + 300146c: 26f9 jal ra,300183a + 300146e: a01d j 3001494 + 3001470: fd842783 lw a5,-40(s0) + 3001474: fef42623 sw a5,-20(s0) + 3001478: fdc42783 lw a5,-36(s0) + 300147c: 2b47a703 lw a4,692(a5) + 3001480: 4685 li a3,1 + 3001482: fec42783 lw a5,-20(s0) + 3001486: 00f697b3 sll a5,a3,a5 + 300148a: 8f5d or a4,a4,a5 + 300148c: fdc42783 lw a5,-36(s0) + 3001490: 2ae7aa23 sw a4,692(a5) + 3001494: 50b2 lw ra,44(sp) + 3001496: 5422 lw s0,40(sp) + 3001498: 6145 addi sp,sp,48 + 300149a: 8082 ret + +0300149c : + 300149c: 7179 addi sp,sp,-48 + 300149e: d606 sw ra,44(sp) + 30014a0: d422 sw s0,40(sp) + 30014a2: 1800 addi s0,sp,48 + 30014a4: fca42e23 sw a0,-36(s0) + 30014a8: fcb42c23 sw a1,-40(s0) + 30014ac: fdc42703 lw a4,-36(s0) + 30014b0: 180007b7 lui a5,0x18000 + 30014b4: 00f70b63 beq a4,a5,30014ca + 30014b8: 6785 lui a5,0x1 + 30014ba: 8ca78593 addi a1,a5,-1846 # 8ca + 30014be: 030067b7 lui a5,0x3006 + 30014c2: 42878513 addi a0,a5,1064 # 3006428 + 30014c6: 2e95 jal ra,300183a + 30014c8: a001 j 30014c8 + 30014ca: fd842503 lw a0,-40(s0) + 30014ce: 3ba9 jal ra,3001228 + 30014d0: 87aa mv a5,a0 + 30014d2: 0017c793 xori a5,a5,1 + 30014d6: 9f81 uxtb a5 + 30014d8: cb91 beqz a5,30014ec + 30014da: 6785 lui a5,0x1 + 30014dc: 8cb78593 addi a1,a5,-1845 # 8cb + 30014e0: 030067b7 lui a5,0x3006 + 30014e4: 42878513 addi a0,a5,1064 # 3006428 + 30014e8: 2e89 jal ra,300183a + 30014ea: a025 j 3001512 + 30014ec: fd842783 lw a5,-40(s0) + 30014f0: 07c1 addi a5,a5,16 + 30014f2: fef42623 sw a5,-20(s0) + 30014f6: fdc42783 lw a5,-36(s0) + 30014fa: 2b47a703 lw a4,692(a5) + 30014fe: 4685 li a3,1 + 3001500: fec42783 lw a5,-20(s0) + 3001504: 00f697b3 sll a5,a3,a5 + 3001508: 8f5d or a4,a4,a5 + 300150a: fdc42783 lw a5,-36(s0) + 300150e: 2ae7aa23 sw a4,692(a5) + 3001512: 50b2 lw ra,44(sp) + 3001514: 5422 lw s0,40(sp) + 3001516: 6145 addi sp,sp,48 + 3001518: 8082 ret + +0300151a : + 300151a: 1101 addi sp,sp,-32 + 300151c: ce06 sw ra,28(sp) + 300151e: cc22 sw s0,24(sp) + 3001520: 1000 addi s0,sp,32 + 3001522: fea42623 sw a0,-20(s0) + 3001526: feb42423 sw a1,-24(s0) + 300152a: fec42703 lw a4,-20(s0) + 300152e: 180007b7 lui a5,0x18000 + 3001532: 00f70b63 beq a4,a5,3001548 + 3001536: 6785 lui a5,0x1 + 3001538: 8e578593 addi a1,a5,-1819 # 8e5 + 300153c: 030067b7 lui a5,0x3006 + 3001540: 42878513 addi a0,a5,1064 # 3006428 + 3001544: 2cdd jal ra,300183a + 3001546: a001 j 3001546 + 3001548: fe842503 lw a0,-24(s0) + 300154c: 39e5 jal ra,3001244 + 300154e: 87aa mv a5,a0 + 3001550: 0017c793 xori a5,a5,1 + 3001554: 9f81 uxtb a5 + 3001556: cb91 beqz a5,300156a + 3001558: 6785 lui a5,0x1 + 300155a: 8e678593 addi a1,a5,-1818 # 8e6 + 300155e: 030067b7 lui a5,0x3006 + 3001562: 42878513 addi a0,a5,1064 # 3006428 + 3001566: 2cd1 jal ra,300183a + 3001568: a839 j 3001586 + 300156a: fec42783 lw a5,-20(s0) + 300156e: 2c07a703 lw a4,704(a5) + 3001572: 4685 li a3,1 + 3001574: fe842783 lw a5,-24(s0) + 3001578: 00f697b3 sll a5,a3,a5 + 300157c: 8f5d or a4,a4,a5 + 300157e: fec42783 lw a5,-20(s0) + 3001582: 2ce7a023 sw a4,704(a5) + 3001586: 40f2 lw ra,28(sp) + 3001588: 4462 lw s0,24(sp) + 300158a: 6105 addi sp,sp,32 + 300158c: 8082 ret + +0300158e : + 300158e: 7179 addi sp,sp,-48 + 3001590: d622 sw s0,44(sp) + 3001592: 1800 addi s0,sp,48 + 3001594: fca42e23 sw a0,-36(s0) + 3001598: fcb42c23 sw a1,-40(s0) + 300159c: fdc42783 lw a5,-36(s0) + 30015a0: 10078793 addi a5,a5,256 + 30015a4: fef42623 sw a5,-20(s0) + 30015a8: fd842783 lw a5,-40(s0) + 30015ac: 078a slli a5,a5,0x2 + 30015ae: fec42703 lw a4,-20(s0) + 30015b2: 97ba add a5,a5,a4 + 30015b4: fef42623 sw a5,-20(s0) + 30015b8: fec42783 lw a5,-20(s0) + 30015bc: 853e mv a0,a5 + 30015be: 5432 lw s0,44(sp) + 30015c0: 6145 addi sp,sp,48 + 30015c2: 8082 ret + +030015c4 : + 30015c4: 7179 addi sp,sp,-48 + 30015c6: d606 sw ra,44(sp) + 30015c8: d422 sw s0,40(sp) + 30015ca: 1800 addi s0,sp,48 + 30015cc: fca42e23 sw a0,-36(s0) + 30015d0: fcb42c23 sw a1,-40(s0) + 30015d4: fcc42a23 sw a2,-44(s0) + 30015d8: fdc42703 lw a4,-36(s0) + 30015dc: 180007b7 lui a5,0x18000 + 30015e0: 00f70b63 beq a4,a5,30015f6 + 30015e4: 6785 lui a5,0x1 + 30015e6: 91c78593 addi a1,a5,-1764 # 91c + 30015ea: 030067b7 lui a5,0x3006 + 30015ee: 42878513 addi a0,a5,1064 # 3006428 + 30015f2: 24a1 jal ra,300183a + 30015f4: a001 j 30015f4 + 30015f6: fd842503 lw a0,-40(s0) + 30015fa: 313d jal ra,3001228 + 30015fc: 87aa mv a5,a0 + 30015fe: 0017c793 xori a5,a5,1 + 3001602: 9f81 uxtb a5 + 3001604: eb89 bnez a5,3001616 + 3001606: fd442503 lw a0,-44(s0) + 300160a: 3109 jal ra,300120c + 300160c: 87aa mv a5,a0 + 300160e: 0017c793 xori a5,a5,1 + 3001612: 9f81 uxtb a5 + 3001614: cb91 beqz a5,3001628 + 3001616: 6785 lui a5,0x1 + 3001618: 91d78593 addi a1,a5,-1763 # 91d + 300161c: 030067b7 lui a5,0x3006 + 3001620: 42878513 addi a0,a5,1064 # 3006428 + 3001624: 2c19 jal ra,300183a + 3001626: a091 j 300166a + 3001628: fe042623 sw zero,-20(s0) + 300162c: fd842583 lw a1,-40(s0) + 3001630: fdc42503 lw a0,-36(s0) + 3001634: 3fa9 jal ra,300158e + 3001636: fea42423 sw a0,-24(s0) + 300163a: fe842783 lw a5,-24(s0) + 300163e: fef42623 sw a5,-20(s0) + 3001642: fd442783 lw a5,-44(s0) + 3001646: 8bfd andi a5,a5,31 + 3001648: 0ff7f693 andi a3,a5,255 + 300164c: fec42703 lw a4,-20(s0) + 3001650: 431c lw a5,0(a4) + 3001652: 8afd andi a3,a3,31 + 3001654: 9b81 andi a5,a5,-32 + 3001656: 8fd5 or a5,a5,a3 + 3001658: c31c sw a5,0(a4) + 300165a: fd442703 lw a4,-44(s0) + 300165e: 47c9 li a5,18 + 3001660: 00f71563 bne a4,a5,300166a + 3001664: fdc42503 lw a0,-36(s0) + 3001668: 39ad jal ra,30012e2 + 300166a: 50b2 lw ra,44(sp) + 300166c: 5422 lw s0,40(sp) + 300166e: 6145 addi sp,sp,48 + 3001670: 8082 ret + +03001672 : + 3001672: 7179 addi sp,sp,-48 + 3001674: d606 sw ra,44(sp) + 3001676: d422 sw s0,40(sp) + 3001678: 1800 addi s0,sp,48 + 300167a: fca42e23 sw a0,-36(s0) + 300167e: fcb42c23 sw a1,-40(s0) + 3001682: fcc42a23 sw a2,-44(s0) + 3001686: fdc42703 lw a4,-36(s0) + 300168a: 180007b7 lui a5,0x18000 + 300168e: 00f70b63 beq a4,a5,30016a4 + 3001692: 6785 lui a5,0x1 + 3001694: 93078593 addi a1,a5,-1744 # 930 + 3001698: 030067b7 lui a5,0x3006 + 300169c: 42878513 addi a0,a5,1064 # 3006428 + 30016a0: 2a69 jal ra,300183a + 30016a2: a001 j 30016a2 + 30016a4: fd842503 lw a0,-40(s0) + 30016a8: 3641 jal ra,3001228 + 30016aa: 87aa mv a5,a0 + 30016ac: 0017c793 xori a5,a5,1 + 30016b0: 9f81 uxtb a5 + 30016b2: eb89 bnez a5,30016c4 + 30016b4: fd442503 lw a0,-44(s0) + 30016b8: 3665 jal ra,3001260 + 30016ba: 87aa mv a5,a0 + 30016bc: 0017c793 xori a5,a5,1 + 30016c0: 9f81 uxtb a5 + 30016c2: cb91 beqz a5,30016d6 + 30016c4: 6785 lui a5,0x1 + 30016c6: 93178593 addi a1,a5,-1743 # 931 + 30016ca: 030067b7 lui a5,0x3006 + 30016ce: 42878513 addi a0,a5,1064 # 3006428 + 30016d2: 22a5 jal ra,300183a + 30016d4: a835 j 3001710 + 30016d6: fd842583 lw a1,-40(s0) + 30016da: fdc42503 lw a0,-36(s0) + 30016de: 3d45 jal ra,300158e + 30016e0: fea42623 sw a0,-20(s0) + 30016e4: fe042423 sw zero,-24(s0) + 30016e8: fec42783 lw a5,-20(s0) + 30016ec: fef42423 sw a5,-24(s0) + 30016f0: fd442783 lw a5,-44(s0) + 30016f4: 8bfd andi a5,a5,31 + 30016f6: 0ff7f693 andi a3,a5,255 + 30016fa: fe842703 lw a4,-24(s0) + 30016fe: 431c lw a5,0(a4) + 3001700: 8afd andi a3,a3,31 + 3001702: 06a6 slli a3,a3,0x9 + 3001704: 7671 lui a2,0xffffc + 3001706: 1ff60613 addi a2,a2,511 # ffffc1ff + 300170a: 8ff1 and a5,a5,a2 + 300170c: 8fd5 or a5,a5,a3 + 300170e: c31c sw a5,0(a4) + 3001710: 50b2 lw ra,44(sp) + 3001712: 5422 lw s0,40(sp) + 3001714: 6145 addi sp,sp,48 + 3001716: 8082 ret + +03001718 : + 3001718: 7179 addi sp,sp,-48 + 300171a: d606 sw ra,44(sp) + 300171c: d422 sw s0,40(sp) + 300171e: 1800 addi s0,sp,48 + 3001720: fca42e23 sw a0,-36(s0) + 3001724: fcb42c23 sw a1,-40(s0) + 3001728: fcc42a23 sw a2,-44(s0) + 300172c: fdc42703 lw a4,-36(s0) + 3001730: 180007b7 lui a5,0x18000 + 3001734: 00f70b63 beq a4,a5,300174a + 3001738: 6785 lui a5,0x1 + 300173a: 94178593 addi a1,a5,-1727 # 941 + 300173e: 030067b7 lui a5,0x3006 + 3001742: 42878513 addi a0,a5,1064 # 3006428 + 3001746: 28d5 jal ra,300183a + 3001748: a001 j 3001748 + 300174a: fd842503 lw a0,-40(s0) + 300174e: 3ce9 jal ra,3001228 + 3001750: 87aa mv a5,a0 + 3001752: 0017c793 xori a5,a5,1 + 3001756: 9f81 uxtb a5 + 3001758: cb91 beqz a5,300176c + 300175a: 6785 lui a5,0x1 + 300175c: 94278593 addi a1,a5,-1726 # 942 + 3001760: 030067b7 lui a5,0x3006 + 3001764: 42878513 addi a0,a5,1064 # 3006428 + 3001768: 28c9 jal ra,300183a + 300176a: a891 j 30017be + 300176c: fd442703 lw a4,-44(s0) + 3001770: 47bd li a5,15 + 3001772: 00e7fb63 bgeu a5,a4,3001788 + 3001776: 6785 lui a5,0x1 + 3001778: 94378593 addi a1,a5,-1725 # 943 + 300177c: 030067b7 lui a5,0x3006 + 3001780: 42878513 addi a0,a5,1064 # 3006428 + 3001784: 285d jal ra,300183a + 3001786: a825 j 30017be + 3001788: fd842583 lw a1,-40(s0) + 300178c: fdc42503 lw a0,-36(s0) + 3001790: 3bfd jal ra,300158e + 3001792: fea42623 sw a0,-20(s0) + 3001796: fe042423 sw zero,-24(s0) + 300179a: fec42783 lw a5,-20(s0) + 300179e: fef42423 sw a5,-24(s0) + 30017a2: fd442783 lw a5,-44(s0) + 30017a6: 8bbd andi a5,a5,15 + 30017a8: 0ff7f693 andi a3,a5,255 + 30017ac: fe842703 lw a4,-24(s0) + 30017b0: 431c lw a5,0(a4) + 30017b2: 8abd andi a3,a3,15 + 30017b4: 0696 slli a3,a3,0x5 + 30017b6: e1f7f793 andi a5,a5,-481 + 30017ba: 8fd5 or a5,a5,a3 + 30017bc: c31c sw a5,0(a4) + 30017be: 50b2 lw ra,44(sp) + 30017c0: 5422 lw s0,40(sp) + 30017c2: 6145 addi sp,sp,48 + 30017c4: 8082 ret + +030017c6 : + 30017c6: 1101 addi sp,sp,-32 + 30017c8: ce06 sw ra,28(sp) + 30017ca: cc22 sw s0,24(sp) + 30017cc: 1000 addi s0,sp,32 + 30017ce: fea42623 sw a0,-20(s0) + 30017d2: feb42423 sw a1,-24(s0) + 30017d6: fec42703 lw a4,-20(s0) + 30017da: 180007b7 lui a5,0x18000 + 30017de: 00f70b63 beq a4,a5,30017f4 + 30017e2: 6785 lui a5,0x1 + 30017e4: 95278593 addi a1,a5,-1710 # 952 + 30017e8: 030067b7 lui a5,0x3006 + 30017ec: 42878513 addi a0,a5,1064 # 3006428 + 30017f0: 20a9 jal ra,300183a + 30017f2: a001 j 30017f2 + 30017f4: fe842503 lw a0,-24(s0) + 30017f8: 3c05 jal ra,3001228 + 30017fa: 87aa mv a5,a0 + 30017fc: 0017c793 xori a5,a5,1 + 3001800: 9f81 uxtb a5 + 3001802: cb91 beqz a5,3001816 + 3001804: 6785 lui a5,0x1 + 3001806: 95378593 addi a1,a5,-1709 # 953 + 300180a: 030067b7 lui a5,0x3006 + 300180e: 42878513 addi a0,a5,1064 # 3006428 + 3001812: 2d71 jal ra,3001eae + 3001814: a839 j 3001832 + 3001816: fec42783 lw a5,-20(s0) + 300181a: 1607a703 lw a4,352(a5) + 300181e: 4685 li a3,1 + 3001820: fe842783 lw a5,-24(s0) + 3001824: 00f697b3 sll a5,a3,a5 + 3001828: 8f5d or a4,a4,a5 + 300182a: fec42783 lw a5,-20(s0) + 300182e: 16e7a023 sw a4,352(a5) + 3001832: 40f2 lw ra,28(sp) + 3001834: 4462 lw s0,24(sp) + 3001836: 6105 addi sp,sp,32 + 3001838: 8082 ret + +0300183a : + 300183a: 6740006f j 3001eae + +0300183e : + 300183e: 1101 addi sp,sp,-32 + 3001840: ce06 sw ra,28(sp) + 3001842: cc22 sw s0,24(sp) + 3001844: 1000 addi s0,sp,32 + 3001846: fea42623 sw a0,-20(s0) + 300184a: feb42423 sw a1,-24(s0) + 300184e: fec42703 lw a4,-20(s0) + 3001852: 180007b7 lui a5,0x18000 + 3001856: 00f70b63 beq a4,a5,300186c + 300185a: 6785 lui a5,0x1 + 300185c: 96c78593 addi a1,a5,-1684 # 96c + 3001860: 030067b7 lui a5,0x3006 + 3001864: 42878513 addi a0,a5,1064 # 3006428 + 3001868: 2599 jal ra,3001eae + 300186a: a001 j 300186a + 300186c: fe842503 lw a0,-24(s0) + 3001870: 3c25 jal ra,30012a8 + 3001872: 87aa mv a5,a0 + 3001874: 0017c793 xori a5,a5,1 + 3001878: 9f81 uxtb a5 + 300187a: cb91 beqz a5,300188e + 300187c: 6785 lui a5,0x1 + 300187e: 96d78593 addi a1,a5,-1683 # 96d + 3001882: 030067b7 lui a5,0x3006 + 3001886: 42878513 addi a0,a5,1064 # 3006428 + 300188a: 2515 jal ra,3001eae + 300188c: a039 j 300189a + 300188e: fec42783 lw a5,-20(s0) + 3001892: fe842703 lw a4,-24(s0) + 3001896: 20e7a023 sw a4,512(a5) + 300189a: 40f2 lw ra,28(sp) + 300189c: 4462 lw s0,24(sp) + 300189e: 6105 addi sp,sp,32 + 30018a0: 8082 ret + +030018a2 : + 30018a2: 7179 addi sp,sp,-48 + 30018a4: d606 sw ra,44(sp) + 30018a6: d422 sw s0,40(sp) + 30018a8: 1800 addi s0,sp,48 + 30018aa: fca42e23 sw a0,-36(s0) + 30018ae: fcb42c23 sw a1,-40(s0) + 30018b2: fdc42703 lw a4,-36(s0) + 30018b6: 180007b7 lui a5,0x18000 + 30018ba: 00f70b63 beq a4,a5,30018d0 + 30018be: 6785 lui a5,0x1 + 30018c0: a8778593 addi a1,a5,-1401 # a87 + 30018c4: 030067b7 lui a5,0x3006 + 30018c8: 42878513 addi a0,a5,1064 # 3006428 + 30018cc: 23cd jal ra,3001eae + 30018ce: a001 j 30018ce + 30018d0: fd842503 lw a0,-40(s0) + 30018d4: 3a91 jal ra,3001228 + 30018d6: 87aa mv a5,a0 + 30018d8: 0017c793 xori a5,a5,1 + 30018dc: 9f81 uxtb a5 + 30018de: cb91 beqz a5,30018f2 + 30018e0: 6785 lui a5,0x1 + 30018e2: a8878593 addi a1,a5,-1400 # a88 + 30018e6: 030067b7 lui a5,0x3006 + 30018ea: 42878513 addi a0,a5,1064 # 3006428 + 30018ee: 23c1 jal ra,3001eae + 30018f0: a001 j 30018f0 + 30018f2: fdc42783 lw a5,-36(s0) + 30018f6: fef42623 sw a5,-20(s0) + 30018fa: fd842783 lw a5,-40(s0) + 30018fe: 00279713 slli a4,a5,0x2 + 3001902: fec42783 lw a5,-20(s0) + 3001906: 97ba add a5,a5,a4 + 3001908: fef42423 sw a5,-24(s0) + 300190c: fe842783 lw a5,-24(s0) + 3001910: 439c lw a5,0(a5) + 3001912: 853e mv a0,a5 + 3001914: 50b2 lw ra,44(sp) + 3001916: 5422 lw s0,40(sp) + 3001918: 6145 addi sp,sp,48 + 300191a: 8082 ret + +0300191c : + 300191c: 7179 addi sp,sp,-48 + 300191e: d606 sw ra,44(sp) + 3001920: d422 sw s0,40(sp) + 3001922: 1800 addi s0,sp,48 + 3001924: fca42e23 sw a0,-36(s0) + 3001928: fcb42c23 sw a1,-40(s0) + 300192c: fdc42703 lw a4,-36(s0) + 3001930: 180007b7 lui a5,0x18000 + 3001934: 00f70b63 beq a4,a5,300194a + 3001938: 6785 lui a5,0x1 + 300193a: b4678593 addi a1,a5,-1210 # b46 + 300193e: 030067b7 lui a5,0x3006 + 3001942: 42878513 addi a0,a5,1064 # 3006428 + 3001946: 23a5 jal ra,3001eae + 3001948: a001 j 3001948 + 300194a: fd842503 lw a0,-40(s0) + 300194e: 38e9 jal ra,3001228 + 3001950: 87aa mv a5,a0 + 3001952: 0017c793 xori a5,a5,1 + 3001956: 9f81 uxtb a5 + 3001958: cb91 beqz a5,300196c + 300195a: 6785 lui a5,0x1 + 300195c: b4778593 addi a1,a5,-1209 # b47 + 3001960: 030067b7 lui a5,0x3006 + 3001964: 42878513 addi a0,a5,1064 # 3006428 + 3001968: 2399 jal ra,3001eae + 300196a: a025 j 3001992 + 300196c: fd842583 lw a1,-40(s0) + 3001970: fdc42503 lw a0,-36(s0) + 3001974: 3929 jal ra,300158e + 3001976: fea42623 sw a0,-20(s0) + 300197a: fe042423 sw zero,-24(s0) + 300197e: fec42783 lw a5,-20(s0) + 3001982: fef42423 sw a5,-24(s0) + 3001986: fe842703 lw a4,-24(s0) + 300198a: 431c lw a5,0(a4) + 300198c: 6691 lui a3,0x4 + 300198e: 8fd5 or a5,a5,a3 + 3001990: c31c sw a5,0(a4) + 3001992: 50b2 lw ra,44(sp) + 3001994: 5422 lw s0,40(sp) + 3001996: 6145 addi sp,sp,48 + 3001998: 8082 ret + +0300199a : + 300199a: 7179 addi sp,sp,-48 + 300199c: d606 sw ra,44(sp) + 300199e: d422 sw s0,40(sp) + 30019a0: 1800 addi s0,sp,48 + 30019a2: fca42e23 sw a0,-36(s0) + 30019a6: fcb42c23 sw a1,-40(s0) + 30019aa: fdc42703 lw a4,-36(s0) + 30019ae: 180007b7 lui a5,0x18000 + 30019b2: 00f70b63 beq a4,a5,30019c8 + 30019b6: 6785 lui a5,0x1 + 30019b8: b5678593 addi a1,a5,-1194 # b56 + 30019bc: 030067b7 lui a5,0x3006 + 30019c0: 42878513 addi a0,a5,1064 # 3006428 + 30019c4: 21ed jal ra,3001eae + 30019c6: a001 j 30019c6 + 30019c8: fd842503 lw a0,-40(s0) + 30019cc: 38b1 jal ra,3001228 + 30019ce: 87aa mv a5,a0 + 30019d0: 0017c793 xori a5,a5,1 + 30019d4: 9f81 uxtb a5 + 30019d6: cb91 beqz a5,30019ea + 30019d8: 6785 lui a5,0x1 + 30019da: b5778593 addi a1,a5,-1193 # b57 + 30019de: 030067b7 lui a5,0x3006 + 30019e2: 42878513 addi a0,a5,1064 # 3006428 + 30019e6: 21e1 jal ra,3001eae + 30019e8: a02d j 3001a12 + 30019ea: fd842583 lw a1,-40(s0) + 30019ee: fdc42503 lw a0,-36(s0) + 30019f2: 3e71 jal ra,300158e + 30019f4: fea42623 sw a0,-20(s0) + 30019f8: fe042423 sw zero,-24(s0) + 30019fc: fec42783 lw a5,-20(s0) + 3001a00: fef42423 sw a5,-24(s0) + 3001a04: fe842703 lw a4,-24(s0) + 3001a08: 431c lw a5,0(a4) + 3001a0a: 76f1 lui a3,0xffffc + 3001a0c: 16fd addi a3,a3,-1 # ffffbfff + 3001a0e: 8ff5 and a5,a5,a3 + 3001a10: c31c sw a5,0(a4) + 3001a12: 50b2 lw ra,44(sp) + 3001a14: 5422 lw s0,40(sp) + 3001a16: 6145 addi sp,sp,48 + 3001a18: 8082 ret + +03001a1a : + 3001a1a: 1101 addi sp,sp,-32 + 3001a1c: ce06 sw ra,28(sp) + 3001a1e: cc22 sw s0,24(sp) + 3001a20: 1000 addi s0,sp,32 + 3001a22: fea42623 sw a0,-20(s0) + 3001a26: fec42783 lw a5,-20(s0) + 3001a2a: eb89 bnez a5,3001a3c + 3001a2c: 02c00593 li a1,44 + 3001a30: 030067b7 lui a5,0x3006 + 3001a34: 44478513 addi a0,a5,1092 # 3006444 + 3001a38: 299d jal ra,3001eae + 3001a3a: a001 j 3001a3a + 3001a3c: fec42783 lw a5,-20(s0) + 3001a40: 4398 lw a4,0(a5) + 3001a42: 180007b7 lui a5,0x18000 + 3001a46: 00f70a63 beq a4,a5,3001a5a + 3001a4a: 02d00593 li a1,45 + 3001a4e: 030067b7 lui a5,0x3006 + 3001a52: 44478513 addi a0,a5,1092 # 3006444 + 3001a56: 29a1 jal ra,3001eae + 3001a58: a001 j 3001a58 + 3001a5a: fec42783 lw a5,-20(s0) + 3001a5e: 43dc lw a5,4(a5) + 3001a60: 853e mv a0,a5 + 3001a62: 3099 jal ra,30012a8 + 3001a64: 87aa mv a5,a0 + 3001a66: 0017c793 xori a5,a5,1 + 3001a6a: 9f81 uxtb a5 + 3001a6c: cb91 beqz a5,3001a80 + 3001a6e: 02e00593 li a1,46 + 3001a72: 030067b7 lui a5,0x3006 + 3001a76: 44478513 addi a0,a5,1092 # 3006444 + 3001a7a: 2915 jal ra,3001eae + 3001a7c: 4785 li a5,1 + 3001a7e: a091 j 3001ac2 + 3001a80: fec42783 lw a5,-20(s0) + 3001a84: 4398 lw a4,0(a5) + 3001a86: fec42783 lw a5,-20(s0) + 3001a8a: 43dc lw a5,4(a5) + 3001a8c: 85be mv a1,a5 + 3001a8e: 853a mv a0,a4 + 3001a90: 337d jal ra,300183e + 3001a92: fec42783 lw a5,-20(s0) + 3001a96: 4398 lw a4,0(a5) + 3001a98: 65472783 lw a5,1620(a4) + 3001a9c: 100006b7 lui a3,0x10000 + 3001aa0: 16fd addi a3,a3,-1 # fffffff + 3001aa2: 8efd and a3,a3,a5 + 3001aa4: 400007b7 lui a5,0x40000 + 3001aa8: 8fd5 or a5,a5,a3 + 3001aaa: 64f72a23 sw a5,1620(a4) + 3001aae: fec42783 lw a5,-20(s0) + 3001ab2: 439c lw a5,0(a5) + 3001ab4: 4705 li a4,1 + 3001ab6: 30e7a023 sw a4,768(a5) # 40000300 + 3001aba: 06400513 li a0,100 + 3001abe: 2929 jal ra,3001ed8 + 3001ac0: 4781 li a5,0 + 3001ac2: 853e mv a0,a5 + 3001ac4: 40f2 lw ra,28(sp) + 3001ac6: 4462 lw s0,24(sp) + 3001ac8: 6105 addi sp,sp,32 + 3001aca: 8082 ret + +03001acc : + 3001acc: 1101 addi sp,sp,-32 + 3001ace: ce06 sw ra,28(sp) + 3001ad0: cc22 sw s0,24(sp) + 3001ad2: 1000 addi s0,sp,32 + 3001ad4: fea42623 sw a0,-20(s0) + 3001ad8: feb42423 sw a1,-24(s0) + 3001adc: fec42223 sw a2,-28(s0) + 3001ae0: fec42783 lw a5,-20(s0) + 3001ae4: eb89 bnez a5,3001af6 + 3001ae6: 04c00593 li a1,76 + 3001aea: 030067b7 lui a5,0x3006 + 3001aee: 44478513 addi a0,a5,1092 # 3006444 + 3001af2: 2e75 jal ra,3001eae + 3001af4: a001 j 3001af4 + 3001af6: fec42783 lw a5,-20(s0) + 3001afa: 4398 lw a4,0(a5) + 3001afc: 180007b7 lui a5,0x18000 + 3001b00: 00f70a63 beq a4,a5,3001b14 + 3001b04: 04d00593 li a1,77 + 3001b08: 030067b7 lui a5,0x3006 + 3001b0c: 44478513 addi a0,a5,1092 # 3006444 + 3001b10: 2e79 jal ra,3001eae + 3001b12: a001 j 3001b12 + 3001b14: fe842503 lw a0,-24(s0) + 3001b18: f10ff0ef jal ra,3001228 + 3001b1c: 87aa mv a5,a0 + 3001b1e: 0017c793 xori a5,a5,1 + 3001b22: 9f81 uxtb a5 + 3001b24: cb91 beqz a5,3001b38 + 3001b26: 04e00593 li a1,78 + 3001b2a: 030067b7 lui a5,0x3006 + 3001b2e: 44478513 addi a0,a5,1092 # 3006444 + 3001b32: 2eb5 jal ra,3001eae + 3001b34: 4785 li a5,1 + 3001b36: aa3d j 3001c74 + 3001b38: fe442783 lw a5,-28(s0) + 3001b3c: eb89 bnez a5,3001b4e + 3001b3e: 04f00593 li a1,79 + 3001b42: 030067b7 lui a5,0x3006 + 3001b46: 44478513 addi a0,a5,1092 # 3006444 + 3001b4a: 2695 jal ra,3001eae + 3001b4c: a001 j 3001b4c + 3001b4e: fe442783 lw a5,-28(s0) + 3001b52: 439c lw a5,0(a5) + 3001b54: 853e mv a0,a5 + 3001b56: eb6ff0ef jal ra,300120c + 3001b5a: 87aa mv a5,a0 + 3001b5c: 0017c793 xori a5,a5,1 + 3001b60: 9f81 uxtb a5 + 3001b62: cb91 beqz a5,3001b76 + 3001b64: 05000593 li a1,80 + 3001b68: 030067b7 lui a5,0x3006 + 3001b6c: 44478513 addi a0,a5,1092 # 3006444 + 3001b70: 2e3d jal ra,3001eae + 3001b72: 4785 li a5,1 + 3001b74: a201 j 3001c74 + 3001b76: fe442783 lw a5,-28(s0) + 3001b7a: 43dc lw a5,4(a5) + 3001b7c: 853e mv a0,a5 + 3001b7e: f48ff0ef jal ra,30012c6 + 3001b82: 87aa mv a5,a0 + 3001b84: 0017c793 xori a5,a5,1 + 3001b88: 9f81 uxtb a5 + 3001b8a: cb91 beqz a5,3001b9e + 3001b8c: 05100593 li a1,81 + 3001b90: 030067b7 lui a5,0x3006 + 3001b94: 44478513 addi a0,a5,1092 # 3006444 + 3001b98: 2e19 jal ra,3001eae + 3001b9a: 4785 li a5,1 + 3001b9c: a8e1 j 3001c74 + 3001b9e: fe442783 lw a5,-28(s0) + 3001ba2: 479c lw a5,8(a5) + 3001ba4: 853e mv a0,a5 + 3001ba6: ebaff0ef jal ra,3001260 + 3001baa: 87aa mv a5,a0 + 3001bac: 0017c793 xori a5,a5,1 + 3001bb0: 9f81 uxtb a5 + 3001bb2: cb91 beqz a5,3001bc6 + 3001bb4: 05200593 li a1,82 + 3001bb8: 030067b7 lui a5,0x3006 + 3001bbc: 44478513 addi a0,a5,1092 # 3006444 + 3001bc0: 24fd jal ra,3001eae + 3001bc2: 4785 li a5,1 + 3001bc4: a845 j 3001c74 + 3001bc6: fe442783 lw a5,-28(s0) + 3001bca: 4b9c lw a5,16(a5) + 3001bcc: 853e mv a0,a5 + 3001bce: eaeff0ef jal ra,300127c + 3001bd2: 87aa mv a5,a0 + 3001bd4: 0017c793 xori a5,a5,1 + 3001bd8: 9f81 uxtb a5 + 3001bda: cb91 beqz a5,3001bee + 3001bdc: 05300593 li a1,83 + 3001be0: 030067b7 lui a5,0x3006 + 3001be4: 44478513 addi a0,a5,1092 # 3006444 + 3001be8: 24d9 jal ra,3001eae + 3001bea: 4785 li a5,1 + 3001bec: a061 j 3001c74 + 3001bee: fec42783 lw a5,-20(s0) + 3001bf2: 4398 lw a4,0(a5) + 3001bf4: fe442783 lw a5,-28(s0) + 3001bf8: 439c lw a5,0(a5) + 3001bfa: 863e mv a2,a5 + 3001bfc: fe842583 lw a1,-24(s0) + 3001c00: 853a mv a0,a4 + 3001c02: 32c9 jal ra,30015c4 + 3001c04: fec42783 lw a5,-20(s0) + 3001c08: 4398 lw a4,0(a5) + 3001c0a: fe442783 lw a5,-28(s0) + 3001c0e: 43dc lw a5,4(a5) + 3001c10: 863e mv a2,a5 + 3001c12: fe842583 lw a1,-24(s0) + 3001c16: 853a mv a0,a4 + 3001c18: 3601 jal ra,3001718 + 3001c1a: fec42783 lw a5,-20(s0) + 3001c1e: 4398 lw a4,0(a5) + 3001c20: fe442783 lw a5,-28(s0) + 3001c24: 479c lw a5,8(a5) + 3001c26: 863e mv a2,a5 + 3001c28: fe842583 lw a1,-24(s0) + 3001c2c: 853a mv a0,a4 + 3001c2e: 3491 jal ra,3001672 + 3001c30: fe442783 lw a5,-28(s0) + 3001c34: 27dc lbu a5,12(a5) + 3001c36: cb89 beqz a5,3001c48 + 3001c38: fec42783 lw a5,-20(s0) + 3001c3c: 439c lw a5,0(a5) + 3001c3e: fe842583 lw a1,-24(s0) + 3001c42: 853e mv a0,a5 + 3001c44: 39e1 jal ra,300191c + 3001c46: a801 j 3001c56 + 3001c48: fec42783 lw a5,-20(s0) + 3001c4c: 439c lw a5,0(a5) + 3001c4e: fe842583 lw a1,-24(s0) + 3001c52: 853e mv a0,a5 + 3001c54: 3399 jal ra,300199a + 3001c56: fe442783 lw a5,-28(s0) + 3001c5a: 4b9c lw a5,16(a5) + 3001c5c: 01079713 slli a4,a5,0x10 + 3001c60: 8341 srli a4,a4,0x10 + 3001c62: fec42683 lw a3,-20(s0) + 3001c66: fe842783 lw a5,-24(s0) + 3001c6a: 07a1 addi a5,a5,8 + 3001c6c: 0786 slli a5,a5,0x1 + 3001c6e: 97b6 add a5,a5,a3 + 3001c70: a3da sh a4,4(a5) + 3001c72: 4781 li a5,0 + 3001c74: 853e mv a0,a5 + 3001c76: 40f2 lw ra,28(sp) + 3001c78: 4462 lw s0,24(sp) + 3001c7a: 6105 addi sp,sp,32 + 3001c7c: 8082 ret + +03001c7e : + 3001c7e: 7179 addi sp,sp,-48 + 3001c80: d606 sw ra,44(sp) + 3001c82: d422 sw s0,40(sp) + 3001c84: 1800 addi s0,sp,48 + 3001c86: fca42e23 sw a0,-36(s0) + 3001c8a: fdc42783 lw a5,-36(s0) + 3001c8e: eb89 bnez a5,3001ca0 + 3001c90: 0af00593 li a1,175 + 3001c94: 030067b7 lui a5,0x3006 + 3001c98: 44478513 addi a0,a5,1092 # 3006444 + 3001c9c: 2c09 jal ra,3001eae + 3001c9e: a001 j 3001c9e + 3001ca0: fdc42783 lw a5,-36(s0) + 3001ca4: 4398 lw a4,0(a5) + 3001ca6: 180007b7 lui a5,0x18000 + 3001caa: 00f70a63 beq a4,a5,3001cbe + 3001cae: 0b000593 li a1,176 + 3001cb2: 030067b7 lui a5,0x3006 + 3001cb6: 44478513 addi a0,a5,1092 # 3006444 + 3001cba: 2ad5 jal ra,3001eae + 3001cbc: a001 j 3001cbc + 3001cbe: fe042423 sw zero,-24(s0) + 3001cc2: fe042623 sw zero,-20(s0) + 3001cc6: a859 j 3001d5c + 3001cc8: fdc42703 lw a4,-36(s0) + 3001ccc: fec42783 lw a5,-20(s0) + 3001cd0: 07a1 addi a5,a5,8 + 3001cd2: 0786 slli a5,a5,0x1 + 3001cd4: 97ba add a5,a5,a4 + 3001cd6: 23de lhu a5,4(a5) + 3001cd8: fef42423 sw a5,-24(s0) + 3001cdc: fe842783 lw a5,-24(s0) + 3001ce0: 4711 li a4,4 + 3001ce2: 02e78a63 beq a5,a4,3001d16 + 3001ce6: 4711 li a4,4 + 3001ce8: 00f76663 bltu a4,a5,3001cf4 + 3001cec: 470d li a4,3 + 3001cee: 00e78a63 beq a5,a4,3001d02 + 3001cf2: a085 j 3001d52 + 3001cf4: 4715 li a4,5 + 3001cf6: 02e78a63 beq a5,a4,3001d2a + 3001cfa: 4719 li a4,6 + 3001cfc: 04e78163 beq a5,a4,3001d3e + 3001d00: a889 j 3001d52 + 3001d02: fdc42783 lw a5,-36(s0) + 3001d06: 439c lw a5,0(a5) + 3001d08: fec42703 lw a4,-20(s0) + 3001d0c: 85ba mv a1,a4 + 3001d0e: 853e mv a0,a5 + 3001d10: e16ff0ef jal ra,3001326 + 3001d14: a83d j 3001d52 + 3001d16: fdc42783 lw a5,-36(s0) + 3001d1a: 439c lw a5,0(a5) + 3001d1c: fec42703 lw a4,-20(s0) + 3001d20: 85ba mv a1,a4 + 3001d22: 853e mv a0,a5 + 3001d24: e7eff0ef jal ra,30013a2 + 3001d28: a02d j 3001d52 + 3001d2a: fdc42783 lw a5,-36(s0) + 3001d2e: 439c lw a5,0(a5) + 3001d30: fec42703 lw a4,-20(s0) + 3001d34: 85ba mv a1,a4 + 3001d36: 853e mv a0,a5 + 3001d38: ee8ff0ef jal ra,3001420 + 3001d3c: a819 j 3001d52 + 3001d3e: fdc42783 lw a5,-36(s0) + 3001d42: 439c lw a5,0(a5) + 3001d44: fec42703 lw a4,-20(s0) + 3001d48: 85ba mv a1,a4 + 3001d4a: 853e mv a0,a5 + 3001d4c: f50ff0ef jal ra,300149c + 3001d50: 0001 nop + 3001d52: fec42783 lw a5,-20(s0) + 3001d56: 0785 addi a5,a5,1 + 3001d58: fef42623 sw a5,-20(s0) + 3001d5c: fec42703 lw a4,-20(s0) + 3001d60: 47bd li a5,15 + 3001d62: f6e7d3e3 bge a5,a4,3001cc8 + 3001d66: fdc42783 lw a5,-36(s0) + 3001d6a: 439c lw a5,0(a5) + 3001d6c: 4581 li a1,0 + 3001d6e: 853e mv a0,a5 + 3001d70: faaff0ef jal ra,300151a + 3001d74: fdc42783 lw a5,-36(s0) + 3001d78: 439c lw a5,0(a5) + 3001d7a: 4585 li a1,1 + 3001d7c: 853e mv a0,a5 + 3001d7e: f9cff0ef jal ra,300151a + 3001d82: fdc42783 lw a5,-36(s0) + 3001d86: 439c lw a5,0(a5) + 3001d88: 4589 li a1,2 + 3001d8a: 853e mv a0,a5 + 3001d8c: f8eff0ef jal ra,300151a + 3001d90: fdc42783 lw a5,-36(s0) + 3001d94: 439c lw a5,0(a5) + 3001d96: 458d li a1,3 + 3001d98: 853e mv a0,a5 + 3001d9a: f80ff0ef jal ra,300151a + 3001d9e: 4781 li a5,0 + 3001da0: 853e mv a0,a5 + 3001da2: 50b2 lw ra,44(sp) + 3001da4: 5422 lw s0,40(sp) + 3001da6: 6145 addi sp,sp,48 + 3001da8: 8082 ret + +03001daa : + 3001daa: 1101 addi sp,sp,-32 + 3001dac: ce06 sw ra,28(sp) + 3001dae: cc22 sw s0,24(sp) + 3001db0: 1000 addi s0,sp,32 + 3001db2: fea42623 sw a0,-20(s0) + 3001db6: feb42423 sw a1,-24(s0) + 3001dba: fec42783 lw a5,-20(s0) + 3001dbe: eb89 bnez a5,3001dd0 + 3001dc0: 0e500593 li a1,229 + 3001dc4: 030067b7 lui a5,0x3006 + 3001dc8: 44478513 addi a0,a5,1092 # 3006444 + 3001dcc: 20cd jal ra,3001eae + 3001dce: a001 j 3001dce + 3001dd0: fec42783 lw a5,-20(s0) + 3001dd4: 4398 lw a4,0(a5) + 3001dd6: 180007b7 lui a5,0x18000 + 3001dda: 00f70a63 beq a4,a5,3001dee + 3001dde: 0e600593 li a1,230 + 3001de2: 030067b7 lui a5,0x3006 + 3001de6: 44478513 addi a0,a5,1092 # 3006444 + 3001dea: 20d1 jal ra,3001eae + 3001dec: a001 j 3001dec + 3001dee: fe842503 lw a0,-24(s0) + 3001df2: c36ff0ef jal ra,3001228 + 3001df6: 87aa mv a5,a0 + 3001df8: 0017c793 xori a5,a5,1 + 3001dfc: 9f81 uxtb a5 + 3001dfe: cb91 beqz a5,3001e12 + 3001e00: 0e700593 li a1,231 + 3001e04: 030067b7 lui a5,0x3006 + 3001e08: 44478513 addi a0,a5,1092 # 3006444 + 3001e0c: 204d jal ra,3001eae + 3001e0e: 4785 li a5,1 + 3001e10: a809 j 3001e22 + 3001e12: fec42783 lw a5,-20(s0) + 3001e16: 439c lw a5,0(a5) + 3001e18: fe842583 lw a1,-24(s0) + 3001e1c: 853e mv a0,a5 + 3001e1e: 3265 jal ra,30017c6 + 3001e20: 4781 li a5,0 + 3001e22: 853e mv a0,a5 + 3001e24: 40f2 lw ra,28(sp) + 3001e26: 4462 lw s0,24(sp) + 3001e28: 6105 addi sp,sp,32 + 3001e2a: 8082 ret + +03001e2c : + 3001e2c: 1101 addi sp,sp,-32 + 3001e2e: ce06 sw ra,28(sp) + 3001e30: cc22 sw s0,24(sp) + 3001e32: 1000 addi s0,sp,32 + 3001e34: fea42623 sw a0,-20(s0) + 3001e38: feb42423 sw a1,-24(s0) + 3001e3c: fec42783 lw a5,-20(s0) + 3001e40: eb89 bnez a5,3001e52 + 3001e42: 0f400593 li a1,244 + 3001e46: 030067b7 lui a5,0x3006 + 3001e4a: 44478513 addi a0,a5,1092 # 3006444 + 3001e4e: 2085 jal ra,3001eae + 3001e50: a001 j 3001e50 + 3001e52: fec42783 lw a5,-20(s0) + 3001e56: 4398 lw a4,0(a5) + 3001e58: 180007b7 lui a5,0x18000 + 3001e5c: 00f70a63 beq a4,a5,3001e70 + 3001e60: 0f500593 li a1,245 + 3001e64: 030067b7 lui a5,0x3006 + 3001e68: 44478513 addi a0,a5,1092 # 3006444 + 3001e6c: 2089 jal ra,3001eae + 3001e6e: a001 j 3001e6e + 3001e70: fe842503 lw a0,-24(s0) + 3001e74: bb4ff0ef jal ra,3001228 + 3001e78: 87aa mv a5,a0 + 3001e7a: 0017c793 xori a5,a5,1 + 3001e7e: 9f81 uxtb a5 + 3001e80: cb91 beqz a5,3001e94 + 3001e82: 0f600593 li a1,246 + 3001e86: 030067b7 lui a5,0x3006 + 3001e8a: 44478513 addi a0,a5,1092 # 3006444 + 3001e8e: 2005 jal ra,3001eae + 3001e90: 4785 li a5,1 + 3001e92: a809 j 3001ea4 + 3001e94: fec42783 lw a5,-20(s0) + 3001e98: 439c lw a5,0(a5) + 3001e9a: fe842583 lw a1,-24(s0) + 3001e9e: 853e mv a0,a5 + 3001ea0: 3409 jal ra,30018a2 + 3001ea2: 87aa mv a5,a0 + 3001ea4: 853e mv a0,a5 + 3001ea6: 40f2 lw ra,28(sp) + 3001ea8: 4462 lw s0,24(sp) + 3001eaa: 6105 addi sp,sp,32 + 3001eac: 8082 ret + +03001eae : + 3001eae: 1101 addi sp,sp,-32 + 3001eb0: ce22 sw s0,28(sp) + 3001eb2: 1000 addi s0,sp,32 + 3001eb4: fea42623 sw a0,-20(s0) + 3001eb8: feb42423 sw a1,-24(s0) + 3001ebc: 0001 nop + 3001ebe: 4472 lw s0,28(sp) + 3001ec0: 6105 addi sp,sp,32 + 3001ec2: 8082 ret + +03001ec4 : + 3001ec4: 1141 addi sp,sp,-16 + 3001ec6: c622 sw s0,12(sp) + 3001ec8: 0800 addi s0,sp,16 + 3001eca: 143807b7 lui a5,0x14380 + 3001ece: 479c lw a5,8(a5) + 3001ed0: 853e mv a0,a5 + 3001ed2: 4432 lw s0,12(sp) + 3001ed4: 0141 addi sp,sp,16 + 3001ed6: 8082 ret + +03001ed8 : + 3001ed8: 7179 addi sp,sp,-48 + 3001eda: d606 sw ra,44(sp) + 3001edc: d422 sw s0,40(sp) + 3001ede: 1800 addi s0,sp,48 + 3001ee0: fca42e23 sw a0,-36(s0) + 3001ee4: 37c5 jal ra,3001ec4 + 3001ee6: fea42623 sw a0,-20(s0) + 3001eea: 8bcff0ef jal ra,3000fa6 + 3001eee: 872a mv a4,a0 + 3001ef0: 000f47b7 lui a5,0xf4 + 3001ef4: 24078793 addi a5,a5,576 # f4240 + 3001ef8: 02f757b3 divu a5,a4,a5 + 3001efc: fdc42703 lw a4,-36(s0) + 3001f00: 02f707b3 mul a5,a4,a5 + 3001f04: fef42423 sw a5,-24(s0) + 3001f08: 3f75 jal ra,3001ec4 + 3001f0a: fea42223 sw a0,-28(s0) + 3001f0e: fe442703 lw a4,-28(s0) + 3001f12: fec42783 lw a5,-20(s0) + 3001f16: 40f707b3 sub a5,a4,a5 + 3001f1a: fef42023 sw a5,-32(s0) + 3001f1e: fe042703 lw a4,-32(s0) + 3001f22: fe842783 lw a5,-24(s0) + 3001f26: fef761e3 bltu a4,a5,3001f08 + 3001f2a: 0001 nop + 3001f2c: 50b2 lw ra,44(sp) + 3001f2e: 5422 lw s0,40(sp) + 3001f30: 6145 addi sp,sp,48 + 3001f32: 8082 ret + +03001f34 : + 3001f34: 7179 addi sp,sp,-48 + 3001f36: d606 sw ra,44(sp) + 3001f38: d422 sw s0,40(sp) + 3001f3a: 1800 addi s0,sp,48 + 3001f3c: fca42e23 sw a0,-36(s0) + 3001f40: fe042623 sw zero,-20(s0) + 3001f44: a809 j 3001f56 + 3001f46: 3e800513 li a0,1000 + 3001f4a: 3779 jal ra,3001ed8 + 3001f4c: fec42783 lw a5,-20(s0) + 3001f50: 0785 addi a5,a5,1 + 3001f52: fef42623 sw a5,-20(s0) + 3001f56: fec42703 lw a4,-20(s0) + 3001f5a: fdc42783 lw a5,-36(s0) + 3001f5e: fef764e3 bltu a4,a5,3001f46 + 3001f62: 0001 nop + 3001f64: 50b2 lw ra,44(sp) + 3001f66: 5422 lw s0,40(sp) + 3001f68: 6145 addi sp,sp,48 + 3001f6a: 8082 ret + +03001f6c : + 3001f6c: 7179 addi sp,sp,-48 + 3001f6e: d606 sw ra,44(sp) + 3001f70: d422 sw s0,40(sp) + 3001f72: 1800 addi s0,sp,48 + 3001f74: fca42e23 sw a0,-36(s0) + 3001f78: fe042623 sw zero,-20(s0) + 3001f7c: a809 j 3001f8e + 3001f7e: 3e800513 li a0,1000 + 3001f82: 3f4d jal ra,3001f34 + 3001f84: fec42783 lw a5,-20(s0) + 3001f88: 0785 addi a5,a5,1 + 3001f8a: fef42623 sw a5,-20(s0) + 3001f8e: fec42703 lw a4,-20(s0) + 3001f92: fdc42783 lw a5,-36(s0) + 3001f96: fef764e3 bltu a4,a5,3001f7e + 3001f9a: 0001 nop + 3001f9c: 50b2 lw ra,44(sp) + 3001f9e: 5422 lw s0,40(sp) + 3001fa0: 6145 addi sp,sp,48 + 3001fa2: 8082 ret + +03001fa4 : + 3001fa4: 1101 addi sp,sp,-32 + 3001fa6: ce06 sw ra,28(sp) + 3001fa8: cc22 sw s0,24(sp) + 3001faa: 1000 addi s0,sp,32 + 3001fac: fea42623 sw a0,-20(s0) + 3001fb0: feb42423 sw a1,-24(s0) + 3001fb4: fe842783 lw a5,-24(s0) + 3001fb8: 3e800713 li a4,1000 + 3001fbc: 02e78063 beq a5,a4,3001fdc + 3001fc0: 000f4737 lui a4,0xf4 + 3001fc4: 24070713 addi a4,a4,576 # f4240 + 3001fc8: 00e78e63 beq a5,a4,3001fe4 + 3001fcc: 4705 li a4,1 + 3001fce: 00e78363 beq a5,a4,3001fd4 + 3001fd2: a829 j 3001fec + 3001fd4: fec42503 lw a0,-20(s0) + 3001fd8: 3f51 jal ra,3001f6c + 3001fda: a809 j 3001fec + 3001fdc: fec42503 lw a0,-20(s0) + 3001fe0: 3f91 jal ra,3001f34 + 3001fe2: a029 j 3001fec + 3001fe4: fec42503 lw a0,-20(s0) + 3001fe8: 3dc5 jal ra,3001ed8 + 3001fea: 0001 nop + 3001fec: 0001 nop + 3001fee: 40f2 lw ra,28(sp) + 3001ff0: 4462 lw s0,24(sp) + 3001ff2: 6105 addi sp,sp,32 + 3001ff4: 8082 ret + +03001ff6 : + 3001ff6: 1101 addi sp,sp,-32 + 3001ff8: ce22 sw s0,28(sp) + 3001ffa: 1000 addi s0,sp,32 + 3001ffc: fea42623 sw a0,-20(s0) + 3002000: 0ff0000f fence + 3002004: fec42783 lw a5,-20(s0) + 3002008: 82be mv t0,a5 + 300200a: bf029073 csrw 0xbf0,t0 + 300200e: 0001 nop + 3002010: 4472 lw s0,28(sp) + 3002012: 6105 addi sp,sp,32 + 3002014: 8082 ret + +03002016 : + 3002016: 1101 addi sp,sp,-32 + 3002018: ce06 sw ra,28(sp) + 300201a: cc22 sw s0,24(sp) + 300201c: 1000 addi s0,sp,32 + 300201e: fea42623 sw a0,-20(s0) + 3002022: 040007b7 lui a5,0x4000 + 3002026: 0fc78713 addi a4,a5,252 # 40000fc + 300202a: fec42783 lw a5,-20(s0) + 300202e: 078e slli a5,a5,0x3 + 3002030: 97ba add a5,a5,a4 + 3002032: 4394 lw a3,0(a5) + 3002034: 040007b7 lui a5,0x4000 + 3002038: 0fc78713 addi a4,a5,252 # 40000fc + 300203c: fec42783 lw a5,-20(s0) + 3002040: 078e slli a5,a5,0x3 + 3002042: 97ba add a5,a5,a4 + 3002044: 43dc lw a5,4(a5) + 3002046: 853e mv a0,a5 + 3002048: 9682 jalr a3 + 300204a: fec42503 lw a0,-20(s0) + 300204e: 3765 jal ra,3001ff6 + 3002050: 0001 nop + 3002052: 40f2 lw ra,28(sp) + 3002054: 4462 lw s0,24(sp) + 3002056: 6105 addi sp,sp,32 + 3002058: 8082 ret + +0300205a : + 300205a: 1101 addi sp,sp,-32 + 300205c: ce22 sw s0,28(sp) + 300205e: 1000 addi s0,sp,32 + 3002060: fe042623 sw zero,-20(s0) + 3002064: a82d j 300209e + 3002066: 040007b7 lui a5,0x4000 + 300206a: 0fc78713 addi a4,a5,252 # 40000fc + 300206e: fec42783 lw a5,-20(s0) + 3002072: 078e slli a5,a5,0x3 + 3002074: 97ba add a5,a5,a4 + 3002076: 03003737 lui a4,0x3003 + 300207a: 8fa70713 addi a4,a4,-1798 # 30028fa + 300207e: c398 sw a4,0(a5) + 3002080: 040007b7 lui a5,0x4000 + 3002084: 0fc78713 addi a4,a5,252 # 40000fc + 3002088: fec42783 lw a5,-20(s0) + 300208c: 078e slli a5,a5,0x3 + 300208e: 97ba add a5,a5,a4 + 3002090: 0007a223 sw zero,4(a5) + 3002094: fec42783 lw a5,-20(s0) + 3002098: 0785 addi a5,a5,1 + 300209a: fef42623 sw a5,-20(s0) + 300209e: fec42703 lw a4,-20(s0) + 30020a2: 07200793 li a5,114 + 30020a6: fce7f0e3 bgeu a5,a4,3002066 + 30020aa: 0001 nop + 30020ac: 4472 lw s0,28(sp) + 30020ae: 6105 addi sp,sp,32 + 30020b0: 8082 ret + +030020b2 : + 30020b2: 1101 addi sp,sp,-32 + 30020b4: ce06 sw ra,28(sp) + 30020b6: cc22 sw s0,24(sp) + 30020b8: 1000 addi s0,sp,32 + 30020ba: fea42623 sw a0,-20(s0) + 30020be: feb42423 sw a1,-24(s0) + 30020c2: fec42223 sw a2,-28(s0) + 30020c6: fe842783 lw a5,-24(s0) + 30020ca: eb89 bnez a5,30020dc + 30020cc: 06300593 li a1,99 + 30020d0: 030067b7 lui a5,0x3006 + 30020d4: 47878513 addi a0,a5,1144 # 3006478 + 30020d8: 3bd9 jal ra,3001eae + 30020da: a001 j 30020da + 30020dc: fec42703 lw a4,-20(s0) + 30020e0: 07200793 li a5,114 + 30020e4: 00e7fb63 bgeu a5,a4,30020fa + 30020e8: 06400593 li a1,100 + 30020ec: 030067b7 lui a5,0x3006 + 30020f0: 47878513 addi a0,a5,1144 # 3006478 + 30020f4: 3b6d jal ra,3001eae + 30020f6: 4789 li a5,2 + 30020f8: a81d j 300212e + 30020fa: 040007b7 lui a5,0x4000 + 30020fe: 0fc78713 addi a4,a5,252 # 40000fc + 3002102: fec42783 lw a5,-20(s0) + 3002106: 078e slli a5,a5,0x3 + 3002108: 97ba add a5,a5,a4 + 300210a: 4398 lw a4,0(a5) + 300210c: 030037b7 lui a5,0x3003 + 3002110: 8fa78793 addi a5,a5,-1798 # 30028fa + 3002114: 00f70463 beq a4,a5,300211c + 3002118: 478d li a5,3 + 300211a: a811 j 300212e + 300211c: fe442603 lw a2,-28(s0) + 3002120: fe842583 lw a1,-24(s0) + 3002124: fec42503 lw a0,-20(s0) + 3002128: 7e4000ef jal ra,300290c + 300212c: 4781 li a5,0 + 300212e: 853e mv a0,a5 + 3002130: 40f2 lw ra,28(sp) + 3002132: 4462 lw s0,24(sp) + 3002134: 6105 addi sp,sp,32 + 3002136: 8082 ret + +03002138 : + 3002138: 7139 addi sp,sp,-64 + 300213a: de06 sw ra,60(sp) + 300213c: dc22 sw s0,56(sp) + 300213e: 0080 addi s0,sp,64 + 3002140: fca42623 sw a0,-52(s0) + 3002144: fcc42703 lw a4,-52(s0) + 3002148: 47e5 li a5,25 + 300214a: 00e7f863 bgeu a5,a4,300215a + 300214e: fcc42703 lw a4,-52(s0) + 3002152: 07200793 li a5,114 + 3002156: 00e7fb63 bgeu a5,a4,300216c + 300215a: 0c300593 li a1,195 + 300215e: 030067b7 lui a5,0x3006 + 3002162: 47878513 addi a0,a5,1144 # 3006478 + 3002166: 33a1 jal ra,3001eae + 3002168: 4789 li a5,2 + 300216a: a8cd j 300225c + 300216c: fcc42703 lw a4,-52(s0) + 3002170: 47fd li a5,31 + 3002172: 02e7e063 bltu a5,a4,3002192 + 3002176: 4705 li a4,1 + 3002178: fcc42783 lw a5,-52(s0) + 300217c: 00f717b3 sll a5,a4,a5 + 3002180: fef42623 sw a5,-20(s0) + 3002184: fec42783 lw a5,-20(s0) + 3002188: 3047a7f3 csrrs a5,mie,a5 + 300218c: fcf42c23 sw a5,-40(s0) + 3002190: a0e9 j 300225a + 3002192: fcc42703 lw a4,-52(s0) + 3002196: 03f00793 li a5,63 + 300219a: 02e7ef63 bltu a5,a4,30021d8 + 300219e: fcc42783 lw a5,-52(s0) + 30021a2: 1781 addi a5,a5,-32 + 30021a4: fef42623 sw a5,-20(s0) + 30021a8: be0027f3 csrr a5,0xbe0 + 30021ac: fcf42e23 sw a5,-36(s0) + 30021b0: fdc42783 lw a5,-36(s0) + 30021b4: fef42223 sw a5,-28(s0) + 30021b8: 4705 li a4,1 + 30021ba: fec42783 lw a5,-20(s0) + 30021be: 00f717b3 sll a5,a4,a5 + 30021c2: fe442703 lw a4,-28(s0) + 30021c6: 8fd9 or a5,a5,a4 + 30021c8: fef42223 sw a5,-28(s0) + 30021cc: fe442783 lw a5,-28(s0) + 30021d0: 82be mv t0,a5 + 30021d2: be029073 csrw 0xbe0,t0 + 30021d6: a051 j 300225a + 30021d8: fcc42703 lw a4,-52(s0) + 30021dc: 05f00793 li a5,95 + 30021e0: 04e7e063 bltu a5,a4,3002220 + 30021e4: fcc42783 lw a5,-52(s0) + 30021e8: fc078793 addi a5,a5,-64 + 30021ec: fef42623 sw a5,-20(s0) + 30021f0: be1027f3 csrr a5,0xbe1 + 30021f4: fef42023 sw a5,-32(s0) + 30021f8: fe042783 lw a5,-32(s0) + 30021fc: fef42223 sw a5,-28(s0) + 3002200: 4705 li a4,1 + 3002202: fec42783 lw a5,-20(s0) + 3002206: 00f717b3 sll a5,a4,a5 + 300220a: fe442703 lw a4,-28(s0) + 300220e: 8fd9 or a5,a5,a4 + 3002210: fef42223 sw a5,-28(s0) + 3002214: fe442783 lw a5,-28(s0) + 3002218: 82be mv t0,a5 + 300221a: be129073 csrw 0xbe1,t0 + 300221e: a835 j 300225a + 3002220: fcc42783 lw a5,-52(s0) + 3002224: fa078793 addi a5,a5,-96 + 3002228: fef42623 sw a5,-20(s0) + 300222c: be2027f3 csrr a5,0xbe2 + 3002230: fef42423 sw a5,-24(s0) + 3002234: fe842783 lw a5,-24(s0) + 3002238: fef42223 sw a5,-28(s0) + 300223c: 4705 li a4,1 + 300223e: fec42783 lw a5,-20(s0) + 3002242: 00f717b3 sll a5,a4,a5 + 3002246: fe442703 lw a4,-28(s0) + 300224a: 8fd9 or a5,a5,a4 + 300224c: fef42223 sw a5,-28(s0) + 3002250: fe442783 lw a5,-28(s0) + 3002254: 82be mv t0,a5 + 3002256: be229073 csrw 0xbe2,t0 + 300225a: 4781 li a5,0 + 300225c: 853e mv a0,a5 + 300225e: 50f2 lw ra,60(sp) + 3002260: 5462 lw s0,56(sp) + 3002262: 6121 addi sp,sp,64 + 3002264: 8082 ret + +03002266 : + 3002266: 1101 addi sp,sp,-32 + 3002268: ce22 sw s0,28(sp) + 300226a: 1000 addi s0,sp,32 + 300226c: fea42623 sw a0,-20(s0) + 3002270: 0001 nop + 3002272: 4472 lw s0,28(sp) + 3002274: 6105 addi sp,sp,32 + 3002276: 8082 ret + +03002278 : + 3002278: 1141 addi sp,sp,-16 + 300227a: c622 sw s0,12(sp) + 300227c: 0800 addi s0,sp,16 + 300227e: 0001 nop + 3002280: 4432 lw s0,12(sp) + 3002282: 0141 addi sp,sp,16 + 3002284: 8082 ret + +03002286 : + 3002286: 1101 addi sp,sp,-32 + 3002288: ce06 sw ra,28(sp) + 300228a: cc22 sw s0,24(sp) + 300228c: 1000 addi s0,sp,32 + 300228e: fea42623 sw a0,-20(s0) + 3002292: fec42503 lw a0,-20(s0) + 3002296: 3fc1 jal ra,3002266 + 3002298: 37c5 jal ra,3002278 + 300229a: 0001 nop + 300229c: 40f2 lw ra,28(sp) + 300229e: 4462 lw s0,24(sp) + 30022a0: 6105 addi sp,sp,32 + 30022a2: 8082 ret + +030022a4 : + 30022a4: 1101 addi sp,sp,-32 + 30022a6: ce06 sw ra,28(sp) + 30022a8: cc22 sw s0,24(sp) + 30022aa: 1000 addi s0,sp,32 + 30022ac: fea42623 sw a0,-20(s0) + 30022b0: fec42783 lw a5,-20(s0) + 30022b4: eb89 bnez a5,30022c6 + 30022b6: 12d00593 li a1,301 + 30022ba: 030067b7 lui a5,0x3006 + 30022be: 47878513 addi a0,a5,1144 # 3006478 + 30022c2: 36f5 jal ra,3001eae + 30022c4: a001 j 30022c4 + 30022c6: fec42503 lw a0,-20(s0) + 30022ca: 3f71 jal ra,3002266 + 30022cc: 3775 jal ra,3002278 + 30022ce: 0001 nop + 30022d0: 40f2 lw ra,28(sp) + 30022d2: 4462 lw s0,24(sp) + 30022d4: 6105 addi sp,sp,32 + 30022d6: 8082 ret + +030022d8 : + 30022d8: 711d addi sp,sp,-96 + 30022da: cea2 sw s0,92(sp) + 30022dc: 1080 addi s0,sp,96 + 30022de: faa42623 sw a0,-84(s0) + 30022e2: fab42423 sw a1,-88(s0) + 30022e6: fac42223 sw a2,-92(s0) + 30022ea: fac42783 lw a5,-84(s0) + 30022ee: 17e1 addi a5,a5,-8 + 30022f0: 471d li a4,7 + 30022f2: 2af76363 bltu a4,a5,3002598 + 30022f6: 00279713 slli a4,a5,0x2 + 30022fa: 030067b7 lui a5,0x3006 + 30022fe: 49878793 addi a5,a5,1176 # 3006498 + 3002302: 97ba add a5,a5,a4 + 3002304: 439c lw a5,0(a5) + 3002306: 8782 jr a5 + 3002308: bc8027f3 csrr a5,0xbc8 + 300230c: faf42a23 sw a5,-76(s0) + 3002310: fb442783 lw a5,-76(s0) + 3002314: faf42823 sw a5,-80(s0) + 3002318: fa842783 lw a5,-88(s0) + 300231c: 078a slli a5,a5,0x2 + 300231e: 8bf1 andi a5,a5,28 + 3002320: 473d li a4,15 + 3002322: 00f717b3 sll a5,a4,a5 + 3002326: fff7c793 not a5,a5 + 300232a: fb042703 lw a4,-80(s0) + 300232e: 8ff9 and a5,a5,a4 + 3002330: faf42823 sw a5,-80(s0) + 3002334: fa842783 lw a5,-88(s0) + 3002338: 078a slli a5,a5,0x2 + 300233a: 8bf1 andi a5,a5,28 + 300233c: fa442703 lw a4,-92(s0) + 3002340: 00f717b3 sll a5,a4,a5 + 3002344: fb042703 lw a4,-80(s0) + 3002348: 8fd9 or a5,a5,a4 + 300234a: faf42823 sw a5,-80(s0) + 300234e: fb042783 lw a5,-80(s0) + 3002352: 82be mv t0,a5 + 3002354: bc829073 csrw 0xbc8,t0 + 3002358: a489 j 300259a + 300235a: bc9027f3 csrr a5,0xbc9 + 300235e: faf42e23 sw a5,-68(s0) + 3002362: fbc42783 lw a5,-68(s0) + 3002366: faf42c23 sw a5,-72(s0) + 300236a: fa842783 lw a5,-88(s0) + 300236e: 078a slli a5,a5,0x2 + 3002370: 8bf1 andi a5,a5,28 + 3002372: 473d li a4,15 + 3002374: 00f717b3 sll a5,a4,a5 + 3002378: fff7c793 not a5,a5 + 300237c: fb842703 lw a4,-72(s0) + 3002380: 8ff9 and a5,a5,a4 + 3002382: faf42c23 sw a5,-72(s0) + 3002386: fa842783 lw a5,-88(s0) + 300238a: 078a slli a5,a5,0x2 + 300238c: 8bf1 andi a5,a5,28 + 300238e: fa442703 lw a4,-92(s0) + 3002392: 00f717b3 sll a5,a4,a5 + 3002396: fb842703 lw a4,-72(s0) + 300239a: 8fd9 or a5,a5,a4 + 300239c: faf42c23 sw a5,-72(s0) + 30023a0: fb842783 lw a5,-72(s0) + 30023a4: 82be mv t0,a5 + 30023a6: bc929073 csrw 0xbc9,t0 + 30023aa: aac5 j 300259a + 30023ac: bca027f3 csrr a5,0xbca + 30023b0: fcf42223 sw a5,-60(s0) + 30023b4: fc442783 lw a5,-60(s0) + 30023b8: fcf42023 sw a5,-64(s0) + 30023bc: fa842783 lw a5,-88(s0) + 30023c0: 078a slli a5,a5,0x2 + 30023c2: 8bf1 andi a5,a5,28 + 30023c4: 473d li a4,15 + 30023c6: 00f717b3 sll a5,a4,a5 + 30023ca: fff7c793 not a5,a5 + 30023ce: fc042703 lw a4,-64(s0) + 30023d2: 8ff9 and a5,a5,a4 + 30023d4: fcf42023 sw a5,-64(s0) + 30023d8: fa842783 lw a5,-88(s0) + 30023dc: 078a slli a5,a5,0x2 + 30023de: 8bf1 andi a5,a5,28 + 30023e0: fa442703 lw a4,-92(s0) + 30023e4: 00f717b3 sll a5,a4,a5 + 30023e8: fc042703 lw a4,-64(s0) + 30023ec: 8fd9 or a5,a5,a4 + 30023ee: fcf42023 sw a5,-64(s0) + 30023f2: fc042783 lw a5,-64(s0) + 30023f6: 82be mv t0,a5 + 30023f8: bca29073 csrw 0xbca,t0 + 30023fc: aa79 j 300259a + 30023fe: bcb027f3 csrr a5,0xbcb + 3002402: fcf42623 sw a5,-52(s0) + 3002406: fcc42783 lw a5,-52(s0) + 300240a: fcf42423 sw a5,-56(s0) + 300240e: fa842783 lw a5,-88(s0) + 3002412: 078a slli a5,a5,0x2 + 3002414: 8bf1 andi a5,a5,28 + 3002416: 473d li a4,15 + 3002418: 00f717b3 sll a5,a4,a5 + 300241c: fff7c793 not a5,a5 + 3002420: fc842703 lw a4,-56(s0) + 3002424: 8ff9 and a5,a5,a4 + 3002426: fcf42423 sw a5,-56(s0) + 300242a: fa842783 lw a5,-88(s0) + 300242e: 078a slli a5,a5,0x2 + 3002430: 8bf1 andi a5,a5,28 + 3002432: fa442703 lw a4,-92(s0) + 3002436: 00f717b3 sll a5,a4,a5 + 300243a: fc842703 lw a4,-56(s0) + 300243e: 8fd9 or a5,a5,a4 + 3002440: fcf42423 sw a5,-56(s0) + 3002444: fc842783 lw a5,-56(s0) + 3002448: 82be mv t0,a5 + 300244a: bcb29073 csrw 0xbcb,t0 + 300244e: a2b1 j 300259a + 3002450: bcc027f3 csrr a5,0xbcc + 3002454: fcf42a23 sw a5,-44(s0) + 3002458: fd442783 lw a5,-44(s0) + 300245c: fcf42823 sw a5,-48(s0) + 3002460: fa842783 lw a5,-88(s0) + 3002464: 078a slli a5,a5,0x2 + 3002466: 8bf1 andi a5,a5,28 + 3002468: 473d li a4,15 + 300246a: 00f717b3 sll a5,a4,a5 + 300246e: fff7c793 not a5,a5 + 3002472: fd042703 lw a4,-48(s0) + 3002476: 8ff9 and a5,a5,a4 + 3002478: fcf42823 sw a5,-48(s0) + 300247c: fa842783 lw a5,-88(s0) + 3002480: 078a slli a5,a5,0x2 + 3002482: 8bf1 andi a5,a5,28 + 3002484: fa442703 lw a4,-92(s0) + 3002488: 00f717b3 sll a5,a4,a5 + 300248c: fd042703 lw a4,-48(s0) + 3002490: 8fd9 or a5,a5,a4 + 3002492: fcf42823 sw a5,-48(s0) + 3002496: fd042783 lw a5,-48(s0) + 300249a: 82be mv t0,a5 + 300249c: bcc29073 csrw 0xbcc,t0 + 30024a0: a8ed j 300259a + 30024a2: bcd027f3 csrr a5,0xbcd + 30024a6: fcf42e23 sw a5,-36(s0) + 30024aa: fdc42783 lw a5,-36(s0) + 30024ae: fcf42c23 sw a5,-40(s0) + 30024b2: fa842783 lw a5,-88(s0) + 30024b6: 078a slli a5,a5,0x2 + 30024b8: 8bf1 andi a5,a5,28 + 30024ba: 473d li a4,15 + 30024bc: 00f717b3 sll a5,a4,a5 + 30024c0: fff7c793 not a5,a5 + 30024c4: fd842703 lw a4,-40(s0) + 30024c8: 8ff9 and a5,a5,a4 + 30024ca: fcf42c23 sw a5,-40(s0) + 30024ce: fa842783 lw a5,-88(s0) + 30024d2: 078a slli a5,a5,0x2 + 30024d4: 8bf1 andi a5,a5,28 + 30024d6: fa442703 lw a4,-92(s0) + 30024da: 00f717b3 sll a5,a4,a5 + 30024de: fd842703 lw a4,-40(s0) + 30024e2: 8fd9 or a5,a5,a4 + 30024e4: fcf42c23 sw a5,-40(s0) + 30024e8: fd842783 lw a5,-40(s0) + 30024ec: 82be mv t0,a5 + 30024ee: bcd29073 csrw 0xbcd,t0 + 30024f2: a065 j 300259a + 30024f4: bce027f3 csrr a5,0xbce + 30024f8: fef42223 sw a5,-28(s0) + 30024fc: fe442783 lw a5,-28(s0) + 3002500: fef42023 sw a5,-32(s0) + 3002504: fa842783 lw a5,-88(s0) + 3002508: 078a slli a5,a5,0x2 + 300250a: 8bf1 andi a5,a5,28 + 300250c: 473d li a4,15 + 300250e: 00f717b3 sll a5,a4,a5 + 3002512: fff7c793 not a5,a5 + 3002516: fe042703 lw a4,-32(s0) + 300251a: 8ff9 and a5,a5,a4 + 300251c: fef42023 sw a5,-32(s0) + 3002520: fa842783 lw a5,-88(s0) + 3002524: 078a slli a5,a5,0x2 + 3002526: 8bf1 andi a5,a5,28 + 3002528: fa442703 lw a4,-92(s0) + 300252c: 00f717b3 sll a5,a4,a5 + 3002530: fe042703 lw a4,-32(s0) + 3002534: 8fd9 or a5,a5,a4 + 3002536: fef42023 sw a5,-32(s0) + 300253a: fe042783 lw a5,-32(s0) + 300253e: 82be mv t0,a5 + 3002540: bce29073 csrw 0xbce,t0 + 3002544: a899 j 300259a + 3002546: bcf027f3 csrr a5,0xbcf + 300254a: fef42623 sw a5,-20(s0) + 300254e: fec42783 lw a5,-20(s0) + 3002552: fef42423 sw a5,-24(s0) + 3002556: fa842783 lw a5,-88(s0) + 300255a: 078a slli a5,a5,0x2 + 300255c: 8bf1 andi a5,a5,28 + 300255e: 473d li a4,15 + 3002560: 00f717b3 sll a5,a4,a5 + 3002564: fff7c793 not a5,a5 + 3002568: fe842703 lw a4,-24(s0) + 300256c: 8ff9 and a5,a5,a4 + 300256e: fef42423 sw a5,-24(s0) + 3002572: fa842783 lw a5,-88(s0) + 3002576: 078a slli a5,a5,0x2 + 3002578: 8bf1 andi a5,a5,28 + 300257a: fa442703 lw a4,-92(s0) + 300257e: 00f717b3 sll a5,a4,a5 + 3002582: fe842703 lw a4,-24(s0) + 3002586: 8fd9 or a5,a5,a4 + 3002588: fef42423 sw a5,-24(s0) + 300258c: fe842783 lw a5,-24(s0) + 3002590: 82be mv t0,a5 + 3002592: bcf29073 csrw 0xbcf,t0 + 3002596: a011 j 300259a + 3002598: 0001 nop + 300259a: 0001 nop + 300259c: 4476 lw s0,92(sp) + 300259e: 6125 addi sp,sp,96 + 30025a0: 8082 ret + +030025a2 : + 30025a2: 7159 addi sp,sp,-112 + 30025a4: d686 sw ra,108(sp) + 30025a6: d4a2 sw s0,104(sp) + 30025a8: 1880 addi s0,sp,112 + 30025aa: f8a42e23 sw a0,-100(s0) + 30025ae: f8b42c23 sw a1,-104(s0) + 30025b2: f9c42783 lw a5,-100(s0) + 30025b6: 838d srli a5,a5,0x3 + 30025b8: fef42623 sw a5,-20(s0) + 30025bc: fec42703 lw a4,-20(s0) + 30025c0: 479d li a5,7 + 30025c2: 2ae7e563 bltu a5,a4,300286c + 30025c6: fec42783 lw a5,-20(s0) + 30025ca: 00279713 slli a4,a5,0x2 + 30025ce: 030067b7 lui a5,0x3006 + 30025d2: 4b878793 addi a5,a5,1208 # 30064b8 + 30025d6: 97ba add a5,a5,a4 + 30025d8: 439c lw a5,0(a5) + 30025da: 8782 jr a5 + 30025dc: bc0027f3 csrr a5,0xbc0 + 30025e0: faf42823 sw a5,-80(s0) + 30025e4: fb042783 lw a5,-80(s0) + 30025e8: faf42623 sw a5,-84(s0) + 30025ec: f9c42783 lw a5,-100(s0) + 30025f0: 078a slli a5,a5,0x2 + 30025f2: 8bf1 andi a5,a5,28 + 30025f4: 473d li a4,15 + 30025f6: 00f717b3 sll a5,a4,a5 + 30025fa: fff7c793 not a5,a5 + 30025fe: fac42703 lw a4,-84(s0) + 3002602: 8ff9 and a5,a5,a4 + 3002604: faf42623 sw a5,-84(s0) + 3002608: f9c42783 lw a5,-100(s0) + 300260c: 078a slli a5,a5,0x2 + 300260e: 8bf1 andi a5,a5,28 + 3002610: f9842703 lw a4,-104(s0) + 3002614: 00f717b3 sll a5,a4,a5 + 3002618: fac42703 lw a4,-84(s0) + 300261c: 8fd9 or a5,a5,a4 + 300261e: faf42623 sw a5,-84(s0) + 3002622: fac42783 lw a5,-84(s0) + 3002626: 82be mv t0,a5 + 3002628: bc029073 csrw 0xbc0,t0 + 300262c: ac81 j 300287c + 300262e: bc1027f3 csrr a5,0xbc1 + 3002632: faf42c23 sw a5,-72(s0) + 3002636: fb842783 lw a5,-72(s0) + 300263a: faf42a23 sw a5,-76(s0) + 300263e: f9c42783 lw a5,-100(s0) + 3002642: 078a slli a5,a5,0x2 + 3002644: 8bf1 andi a5,a5,28 + 3002646: 473d li a4,15 + 3002648: 00f717b3 sll a5,a4,a5 + 300264c: fff7c793 not a5,a5 + 3002650: fb442703 lw a4,-76(s0) + 3002654: 8ff9 and a5,a5,a4 + 3002656: faf42a23 sw a5,-76(s0) + 300265a: f9c42783 lw a5,-100(s0) + 300265e: 078a slli a5,a5,0x2 + 3002660: 8bf1 andi a5,a5,28 + 3002662: f9842703 lw a4,-104(s0) + 3002666: 00f717b3 sll a5,a4,a5 + 300266a: fb442703 lw a4,-76(s0) + 300266e: 8fd9 or a5,a5,a4 + 3002670: faf42a23 sw a5,-76(s0) + 3002674: fb442783 lw a5,-76(s0) + 3002678: 82be mv t0,a5 + 300267a: bc129073 csrw 0xbc1,t0 + 300267e: aafd j 300287c + 3002680: bc2027f3 csrr a5,0xbc2 + 3002684: fcf42023 sw a5,-64(s0) + 3002688: fc042783 lw a5,-64(s0) + 300268c: faf42e23 sw a5,-68(s0) + 3002690: f9c42783 lw a5,-100(s0) + 3002694: 078a slli a5,a5,0x2 + 3002696: 8bf1 andi a5,a5,28 + 3002698: 473d li a4,15 + 300269a: 00f717b3 sll a5,a4,a5 + 300269e: fff7c793 not a5,a5 + 30026a2: fbc42703 lw a4,-68(s0) + 30026a6: 8ff9 and a5,a5,a4 + 30026a8: faf42e23 sw a5,-68(s0) + 30026ac: f9c42783 lw a5,-100(s0) + 30026b0: 078a slli a5,a5,0x2 + 30026b2: 8bf1 andi a5,a5,28 + 30026b4: f9842703 lw a4,-104(s0) + 30026b8: 00f717b3 sll a5,a4,a5 + 30026bc: fbc42703 lw a4,-68(s0) + 30026c0: 8fd9 or a5,a5,a4 + 30026c2: faf42e23 sw a5,-68(s0) + 30026c6: fbc42783 lw a5,-68(s0) + 30026ca: 82be mv t0,a5 + 30026cc: bc229073 csrw 0xbc2,t0 + 30026d0: a275 j 300287c + 30026d2: bc3027f3 csrr a5,0xbc3 + 30026d6: fcf42423 sw a5,-56(s0) + 30026da: fc842783 lw a5,-56(s0) + 30026de: fcf42223 sw a5,-60(s0) + 30026e2: f9c42783 lw a5,-100(s0) + 30026e6: 078a slli a5,a5,0x2 + 30026e8: 8bf1 andi a5,a5,28 + 30026ea: 473d li a4,15 + 30026ec: 00f717b3 sll a5,a4,a5 + 30026f0: fff7c793 not a5,a5 + 30026f4: fc442703 lw a4,-60(s0) + 30026f8: 8ff9 and a5,a5,a4 + 30026fa: fcf42223 sw a5,-60(s0) + 30026fe: f9c42783 lw a5,-100(s0) + 3002702: 078a slli a5,a5,0x2 + 3002704: 8bf1 andi a5,a5,28 + 3002706: f9842703 lw a4,-104(s0) + 300270a: 00f717b3 sll a5,a4,a5 + 300270e: fc442703 lw a4,-60(s0) + 3002712: 8fd9 or a5,a5,a4 + 3002714: fcf42223 sw a5,-60(s0) + 3002718: fc442783 lw a5,-60(s0) + 300271c: 82be mv t0,a5 + 300271e: bc329073 csrw 0xbc3,t0 + 3002722: aaa9 j 300287c + 3002724: bc4027f3 csrr a5,0xbc4 + 3002728: fcf42823 sw a5,-48(s0) + 300272c: fd042783 lw a5,-48(s0) + 3002730: fcf42623 sw a5,-52(s0) + 3002734: f9c42783 lw a5,-100(s0) + 3002738: 078a slli a5,a5,0x2 + 300273a: 8bf1 andi a5,a5,28 + 300273c: 473d li a4,15 + 300273e: 00f717b3 sll a5,a4,a5 + 3002742: fff7c793 not a5,a5 + 3002746: fcc42703 lw a4,-52(s0) + 300274a: 8ff9 and a5,a5,a4 + 300274c: fcf42623 sw a5,-52(s0) + 3002750: f9c42783 lw a5,-100(s0) + 3002754: 078a slli a5,a5,0x2 + 3002756: 8bf1 andi a5,a5,28 + 3002758: f9842703 lw a4,-104(s0) + 300275c: 00f717b3 sll a5,a4,a5 + 3002760: fcc42703 lw a4,-52(s0) + 3002764: 8fd9 or a5,a5,a4 + 3002766: fcf42623 sw a5,-52(s0) + 300276a: fcc42783 lw a5,-52(s0) + 300276e: 82be mv t0,a5 + 3002770: bc429073 csrw 0xbc4,t0 + 3002774: a221 j 300287c + 3002776: bc5027f3 csrr a5,0xbc5 + 300277a: fcf42c23 sw a5,-40(s0) + 300277e: fd842783 lw a5,-40(s0) + 3002782: fcf42a23 sw a5,-44(s0) + 3002786: f9c42783 lw a5,-100(s0) + 300278a: 078a slli a5,a5,0x2 + 300278c: 8bf1 andi a5,a5,28 + 300278e: 473d li a4,15 + 3002790: 00f717b3 sll a5,a4,a5 + 3002794: fff7c793 not a5,a5 + 3002798: fd442703 lw a4,-44(s0) + 300279c: 8ff9 and a5,a5,a4 + 300279e: fcf42a23 sw a5,-44(s0) + 30027a2: f9c42783 lw a5,-100(s0) + 30027a6: 078a slli a5,a5,0x2 + 30027a8: 8bf1 andi a5,a5,28 + 30027aa: f9842703 lw a4,-104(s0) + 30027ae: 00f717b3 sll a5,a4,a5 + 30027b2: fd442703 lw a4,-44(s0) + 30027b6: 8fd9 or a5,a5,a4 + 30027b8: fcf42a23 sw a5,-44(s0) + 30027bc: fd442783 lw a5,-44(s0) + 30027c0: 82be mv t0,a5 + 30027c2: bc529073 csrw 0xbc5,t0 + 30027c6: a85d j 300287c + 30027c8: bc6027f3 csrr a5,0xbc6 + 30027cc: fef42023 sw a5,-32(s0) + 30027d0: fe042783 lw a5,-32(s0) + 30027d4: fcf42e23 sw a5,-36(s0) + 30027d8: f9c42783 lw a5,-100(s0) + 30027dc: 078a slli a5,a5,0x2 + 30027de: 8bf1 andi a5,a5,28 + 30027e0: 473d li a4,15 + 30027e2: 00f717b3 sll a5,a4,a5 + 30027e6: fff7c793 not a5,a5 + 30027ea: fdc42703 lw a4,-36(s0) + 30027ee: 8ff9 and a5,a5,a4 + 30027f0: fcf42e23 sw a5,-36(s0) + 30027f4: f9c42783 lw a5,-100(s0) + 30027f8: 078a slli a5,a5,0x2 + 30027fa: 8bf1 andi a5,a5,28 + 30027fc: f9842703 lw a4,-104(s0) + 3002800: 00f717b3 sll a5,a4,a5 + 3002804: fdc42703 lw a4,-36(s0) + 3002808: 8fd9 or a5,a5,a4 + 300280a: fcf42e23 sw a5,-36(s0) + 300280e: fdc42783 lw a5,-36(s0) + 3002812: 82be mv t0,a5 + 3002814: bc629073 csrw 0xbc6,t0 + 3002818: a095 j 300287c + 300281a: bc7027f3 csrr a5,0xbc7 + 300281e: fef42423 sw a5,-24(s0) + 3002822: fe842783 lw a5,-24(s0) + 3002826: fef42223 sw a5,-28(s0) + 300282a: f9c42783 lw a5,-100(s0) + 300282e: 078a slli a5,a5,0x2 + 3002830: 8bf1 andi a5,a5,28 + 3002832: 473d li a4,15 + 3002834: 00f717b3 sll a5,a4,a5 + 3002838: fff7c793 not a5,a5 + 300283c: fe442703 lw a4,-28(s0) + 3002840: 8ff9 and a5,a5,a4 + 3002842: fef42223 sw a5,-28(s0) + 3002846: f9c42783 lw a5,-100(s0) + 300284a: 078a slli a5,a5,0x2 + 300284c: 8bf1 andi a5,a5,28 + 300284e: f9842703 lw a4,-104(s0) + 3002852: 00f717b3 sll a5,a4,a5 + 3002856: fe442703 lw a4,-28(s0) + 300285a: 8fd9 or a5,a5,a4 + 300285c: fef42223 sw a5,-28(s0) + 3002860: fe442783 lw a5,-28(s0) + 3002864: 82be mv t0,a5 + 3002866: bc729073 csrw 0xbc7,t0 + 300286a: a809 j 300287c + 300286c: f9842603 lw a2,-104(s0) + 3002870: f9c42583 lw a1,-100(s0) + 3002874: fec42503 lw a0,-20(s0) + 3002878: 3485 jal ra,30022d8 + 300287a: 0001 nop + 300287c: 0001 nop + 300287e: 50b6 lw ra,108(sp) + 3002880: 5426 lw s0,104(sp) + 3002882: 6165 addi sp,sp,112 + 3002884: 8082 ret + +03002886 : + 3002886: 1101 addi sp,sp,-32 + 3002888: ce06 sw ra,28(sp) + 300288a: cc22 sw s0,24(sp) + 300288c: 1000 addi s0,sp,32 + 300288e: fea42623 sw a0,-20(s0) + 3002892: feb42423 sw a1,-24(s0) + 3002896: fec42703 lw a4,-20(s0) + 300289a: 47e5 li a5,25 + 300289c: 00e7f863 bgeu a5,a4,30028ac + 30028a0: fec42703 lw a4,-20(s0) + 30028a4: 07200793 li a5,114 + 30028a8: 00e7fb63 bgeu a5,a4,30028be + 30028ac: 18c00593 li a1,396 + 30028b0: 030067b7 lui a5,0x3006 + 30028b4: 47878513 addi a0,a5,1144 # 3006478 + 30028b8: 21bd jal ra,3002d26 + 30028ba: 4789 li a5,2 + 30028bc: a815 j 30028f0 + 30028be: fe842783 lw a5,-24(s0) + 30028c2: c791 beqz a5,30028ce + 30028c4: fe842703 lw a4,-24(s0) + 30028c8: 47bd li a5,15 + 30028ca: 00e7fb63 bgeu a5,a4,30028e0 + 30028ce: 18d00593 li a1,397 + 30028d2: 030067b7 lui a5,0x3006 + 30028d6: 47878513 addi a0,a5,1144 # 3006478 + 30028da: 21b1 jal ra,3002d26 + 30028dc: 4795 li a5,5 + 30028de: a809 j 30028f0 + 30028e0: fec42783 lw a5,-20(s0) + 30028e4: 1799 addi a5,a5,-26 + 30028e6: fe842583 lw a1,-24(s0) + 30028ea: 853e mv a0,a5 + 30028ec: 395d jal ra,30025a2 + 30028ee: 4781 li a5,0 + 30028f0: 853e mv a0,a5 + 30028f2: 40f2 lw ra,28(sp) + 30028f4: 4462 lw s0,24(sp) + 30028f6: 6105 addi sp,sp,32 + 30028f8: 8082 ret + +030028fa : + 30028fa: 1101 addi sp,sp,-32 + 30028fc: ce22 sw s0,28(sp) + 30028fe: 1000 addi s0,sp,32 + 3002900: fea42623 sw a0,-20(s0) + 3002904: 0001 nop + 3002906: 4472 lw s0,28(sp) + 3002908: 6105 addi sp,sp,32 + 300290a: 8082 ret + +0300290c : + 300290c: 1101 addi sp,sp,-32 + 300290e: ce22 sw s0,28(sp) + 3002910: 1000 addi s0,sp,32 + 3002912: fea42623 sw a0,-20(s0) + 3002916: feb42423 sw a1,-24(s0) + 300291a: fec42223 sw a2,-28(s0) + 300291e: 040007b7 lui a5,0x4000 + 3002922: 0fc78713 addi a4,a5,252 # 40000fc + 3002926: fec42783 lw a5,-20(s0) + 300292a: 078e slli a5,a5,0x3 + 300292c: 97ba add a5,a5,a4 + 300292e: fe442703 lw a4,-28(s0) + 3002932: c3d8 sw a4,4(a5) + 3002934: 040007b7 lui a5,0x4000 + 3002938: 0fc78713 addi a4,a5,252 # 40000fc + 300293c: fec42783 lw a5,-20(s0) + 3002940: 078e slli a5,a5,0x3 + 3002942: 97ba add a5,a5,a4 + 3002944: fe842703 lw a4,-24(s0) + 3002948: c398 sw a4,0(a5) + 300294a: 0001 nop + 300294c: 4472 lw s0,28(sp) + 300294e: 6105 addi sp,sp,32 + 3002950: 8082 ret + +03002952 : + 3002952: 1141 addi sp,sp,-16 + 3002954: c622 sw s0,12(sp) + 3002956: 0800 addi s0,sp,16 + 3002958: 101007b7 lui a5,0x10100 + 300295c: 43f8 lw a4,68(a5) + 300295e: 67c1 lui a5,0x10 + 3002960: 17f9 addi a5,a5,-2 # fffe + 3002962: 00f776b3 and a3,a4,a5 + 3002966: 101007b7 lui a5,0x10100 + 300296a: ea510737 lui a4,0xea510 + 300296e: 9736 add a4,a4,a3 + 3002970: c3f8 sw a4,68(a5) + 3002972: 0001 nop + 3002974: 4432 lw s0,12(sp) + 3002976: 0141 addi sp,sp,16 + 3002978: 8082 ret + +0300297a : + 300297a: 1141 addi sp,sp,-16 + 300297c: c622 sw s0,12(sp) + 300297e: 0800 addi s0,sp,16 + 3002980: 101007b7 lui a5,0x10100 + 3002984: 43f8 lw a4,68(a5) + 3002986: 67c1 lui a5,0x10 + 3002988: 17fd addi a5,a5,-1 # ffff + 300298a: 8ff9 and a5,a5,a4 + 300298c: 0017e693 ori a3,a5,1 + 3002990: 101007b7 lui a5,0x10100 + 3002994: ea510737 lui a4,0xea510 + 3002998: 9736 add a4,a4,a3 + 300299a: c3f8 sw a4,68(a5) + 300299c: 0001 nop + 300299e: 4432 lw s0,12(sp) + 30029a0: 0141 addi sp,sp,16 + 30029a2: 8082 ret + +030029a4 : + 30029a4: 1101 addi sp,sp,-32 + 30029a6: ce22 sw s0,28(sp) + 30029a8: 1000 addi s0,sp,32 + 30029aa: fea42623 sw a0,-20(s0) + 30029ae: fec42783 lw a5,-20(s0) + 30029b2: c791 beqz a5,30029be + 30029b4: fec42703 lw a4,-20(s0) + 30029b8: 4785 li a5,1 + 30029ba: 00f71463 bne a4,a5,30029c2 + 30029be: 4785 li a5,1 + 30029c0: a011 j 30029c4 + 30029c2: 4781 li a5,0 + 30029c4: 8b85 andi a5,a5,1 + 30029c6: 9f81 uxtb a5 + 30029c8: 853e mv a0,a5 + 30029ca: 4472 lw s0,28(sp) + 30029cc: 6105 addi sp,sp,32 + 30029ce: 8082 ret + +030029d0 : + 30029d0: 1101 addi sp,sp,-32 + 30029d2: ce22 sw s0,28(sp) + 30029d4: 1000 addi s0,sp,32 + 30029d6: fea42623 sw a0,-20(s0) + 30029da: fec42783 lw a5,-20(s0) + 30029de: 0087b793 sltiu a5,a5,8 + 30029e2: 9f81 uxtb a5 + 30029e4: 853e mv a0,a5 + 30029e6: 4472 lw s0,28(sp) + 30029e8: 6105 addi sp,sp,32 + 30029ea: 8082 ret + +030029ec : + 30029ec: 1101 addi sp,sp,-32 + 30029ee: ce22 sw s0,28(sp) + 30029f0: 1000 addi s0,sp,32 + 30029f2: fea42623 sw a0,-20(s0) + 30029f6: fec42783 lw a5,-20(s0) + 30029fa: 0087b793 sltiu a5,a5,8 + 30029fe: 9f81 uxtb a5 + 3002a00: 853e mv a0,a5 + 3002a02: 4472 lw s0,28(sp) + 3002a04: 6105 addi sp,sp,32 + 3002a06: 8082 ret + +03002a08 : + 3002a08: 1101 addi sp,sp,-32 + 3002a0a: ce22 sw s0,28(sp) + 3002a0c: 1000 addi s0,sp,32 + 3002a0e: fea42623 sw a0,-20(s0) + 3002a12: fec42783 lw a5,-20(s0) + 3002a16: 0087b793 sltiu a5,a5,8 + 3002a1a: 9f81 uxtb a5 + 3002a1c: 853e mv a0,a5 + 3002a1e: 4472 lw s0,28(sp) + 3002a20: 6105 addi sp,sp,32 + 3002a22: 8082 ret + +03002a24 : + 3002a24: 1101 addi sp,sp,-32 + 3002a26: ce22 sw s0,28(sp) + 3002a28: 1000 addi s0,sp,32 + 3002a2a: fea42623 sw a0,-20(s0) + 3002a2e: fec42783 lw a5,-20(s0) + 3002a32: 0807b793 sltiu a5,a5,128 + 3002a36: 9f81 uxtb a5 + 3002a38: 853e mv a0,a5 + 3002a3a: 4472 lw s0,28(sp) + 3002a3c: 6105 addi sp,sp,32 + 3002a3e: 8082 ret + +03002a40 : + 3002a40: 1101 addi sp,sp,-32 + 3002a42: ce22 sw s0,28(sp) + 3002a44: 1000 addi s0,sp,32 + 3002a46: fea42623 sw a0,-20(s0) + 3002a4a: fec42783 lw a5,-20(s0) + 3002a4e: cb99 beqz a5,3002a64 + 3002a50: fec42703 lw a4,-20(s0) + 3002a54: 4785 li a5,1 + 3002a56: 00f70763 beq a4,a5,3002a64 + 3002a5a: fec42703 lw a4,-20(s0) + 3002a5e: 4789 li a5,2 + 3002a60: 00f71463 bne a4,a5,3002a68 + 3002a64: 4785 li a5,1 + 3002a66: a011 j 3002a6a + 3002a68: 4781 li a5,0 + 3002a6a: 8b85 andi a5,a5,1 + 3002a6c: 9f81 uxtb a5 + 3002a6e: 853e mv a0,a5 + 3002a70: 4472 lw s0,28(sp) + 3002a72: 6105 addi sp,sp,32 + 3002a74: 8082 ret + +03002a76 : + 3002a76: 1101 addi sp,sp,-32 + 3002a78: ce22 sw s0,28(sp) + 3002a7a: 1000 addi s0,sp,32 + 3002a7c: fea42623 sw a0,-20(s0) + 3002a80: fec42783 lw a5,-20(s0) + 3002a84: c791 beqz a5,3002a90 + 3002a86: fec42703 lw a4,-20(s0) + 3002a8a: 4785 li a5,1 + 3002a8c: 00f71463 bne a4,a5,3002a94 + 3002a90: 4785 li a5,1 + 3002a92: a011 j 3002a96 + 3002a94: 4781 li a5,0 + 3002a96: 8b85 andi a5,a5,1 + 3002a98: 9f81 uxtb a5 + 3002a9a: 853e mv a0,a5 + 3002a9c: 4472 lw s0,28(sp) + 3002a9e: 6105 addi sp,sp,32 + 3002aa0: 8082 ret + +03002aa2 : + 3002aa2: 1101 addi sp,sp,-32 + 3002aa4: ce22 sw s0,28(sp) + 3002aa6: 1000 addi s0,sp,32 + 3002aa8: fea42623 sw a0,-20(s0) + 3002aac: fec42783 lw a5,-20(s0) + 3002ab0: 0407b793 sltiu a5,a5,64 + 3002ab4: 9f81 uxtb a5 + 3002ab6: 853e mv a0,a5 + 3002ab8: 4472 lw s0,28(sp) + 3002aba: 6105 addi sp,sp,32 + 3002abc: 8082 ret + +03002abe : + 3002abe: 7179 addi sp,sp,-48 + 3002ac0: d622 sw s0,44(sp) + 3002ac2: 1800 addi s0,sp,48 + 3002ac4: fca42e23 sw a0,-36(s0) + 3002ac8: fcb42c23 sw a1,-40(s0) + 3002acc: fdc42783 lw a5,-36(s0) + 3002ad0: fef42623 sw a5,-20(s0) + 3002ad4: fd842783 lw a5,-40(s0) + 3002ad8: cb89 beqz a5,3002aea + 3002ada: fec42703 lw a4,-20(s0) + 3002ade: fd842783 lw a5,-40(s0) + 3002ae2: 02f757b3 divu a5,a4,a5 + 3002ae6: fef42623 sw a5,-20(s0) + 3002aea: fec42703 lw a4,-20(s0) + 3002aee: 003d17b7 lui a5,0x3d1 + 3002af2: 8ff78793 addi a5,a5,-1793 # 3d08ff + 3002af6: 00e7fc63 bgeu a5,a4,3002b0e + 3002afa: fec42703 lw a4,-20(s0) + 3002afe: 007277b7 lui a5,0x727 + 3002b02: 0e078793 addi a5,a5,224 # 7270e0 + 3002b06: 00e7e463 bltu a5,a4,3002b0e + 3002b0a: 4785 li a5,1 + 3002b0c: a011 j 3002b10 + 3002b0e: 4781 li a5,0 + 3002b10: 8b85 andi a5,a5,1 + 3002b12: 9f81 uxtb a5 + 3002b14: 853e mv a0,a5 + 3002b16: 5432 lw s0,44(sp) + 3002b18: 6145 addi sp,sp,48 + 3002b1a: 8082 ret + +03002b1c : + 3002b1c: 7179 addi sp,sp,-48 + 3002b1e: d622 sw s0,44(sp) + 3002b20: 1800 addi s0,sp,48 + 3002b22: fca42e23 sw a0,-36(s0) + 3002b26: fcb42c23 sw a1,-40(s0) + 3002b2a: fdc42703 lw a4,-36(s0) + 3002b2e: 01c9c7b7 lui a5,0x1c9c + 3002b32: 38078793 addi a5,a5,896 # 1c9c380 + 3002b36: 00e7f463 bgeu a5,a4,3002b3e + 3002b3a: 4781 li a5,0 + 3002b3c: a08d j 3002b9e + 3002b3e: fd842703 lw a4,-40(s0) + 3002b42: 07f00793 li a5,127 + 3002b46: 00e7f463 bgeu a5,a4,3002b4e + 3002b4a: 4781 li a5,0 + 3002b4c: a889 j 3002b9e + 3002b4e: fd842703 lw a4,-40(s0) + 3002b52: 4799 li a5,6 + 3002b54: 00e7f963 bgeu a5,a4,3002b66 + 3002b58: fdc42703 lw a4,-36(s0) + 3002b5c: fd842783 lw a5,-40(s0) + 3002b60: 02f707b3 mul a5,a4,a5 + 3002b64: a031 j 3002b70 + 3002b66: fdc42703 lw a4,-36(s0) + 3002b6a: 4799 li a5,6 + 3002b6c: 02f707b3 mul a5,a4,a5 + 3002b70: fef42623 sw a5,-20(s0) + 3002b74: fec42703 lw a4,-20(s0) + 3002b78: 05f5e7b7 lui a5,0x5f5e + 3002b7c: 0ff78793 addi a5,a5,255 # 5f5e0ff + 3002b80: 00e7fc63 bgeu a5,a4,3002b98 + 3002b84: fec42703 lw a4,-20(s0) + 3002b88: 11e1a7b7 lui a5,0x11e1a + 3002b8c: 30078793 addi a5,a5,768 # 11e1a300 + 3002b90: 00e7e463 bltu a5,a4,3002b98 + 3002b94: 4785 li a5,1 + 3002b96: a011 j 3002b9a + 3002b98: 4781 li a5,0 + 3002b9a: 8b85 andi a5,a5,1 + 3002b9c: 9f81 uxtb a5 + 3002b9e: 853e mv a0,a5 + 3002ba0: 5432 lw s0,44(sp) + 3002ba2: 6145 addi sp,sp,48 + 3002ba4: 8082 ret + +03002ba6 : + 3002ba6: 7179 addi sp,sp,-48 + 3002ba8: d622 sw s0,44(sp) + 3002baa: 1800 addi s0,sp,48 + 3002bac: fca42e23 sw a0,-36(s0) + 3002bb0: fcb42c23 sw a1,-40(s0) + 3002bb4: fdc42783 lw a5,-36(s0) + 3002bb8: fef42623 sw a5,-20(s0) + 3002bbc: fd842783 lw a5,-40(s0) + 3002bc0: cb91 beqz a5,3002bd4 + 3002bc2: fd842783 lw a5,-40(s0) + 3002bc6: 0785 addi a5,a5,1 + 3002bc8: fec42703 lw a4,-20(s0) + 3002bcc: 02f757b3 divu a5,a4,a5 + 3002bd0: fef42623 sw a5,-20(s0) + 3002bd4: fec42703 lw a4,-20(s0) + 3002bd8: 08f0d7b7 lui a5,0x8f0d + 3002bdc: 18178793 addi a5,a5,385 # 8f0d181 + 3002be0: 00f737b3 sltu a5,a4,a5 + 3002be4: 9f81 uxtb a5 + 3002be6: 853e mv a0,a5 + 3002be8: 5432 lw s0,44(sp) + 3002bea: 6145 addi sp,sp,48 + 3002bec: 8082 ret + +03002bee : + 3002bee: 7179 addi sp,sp,-48 + 3002bf0: d622 sw s0,44(sp) + 3002bf2: 1800 addi s0,sp,48 + 3002bf4: fca42e23 sw a0,-36(s0) + 3002bf8: fcb42c23 sw a1,-40(s0) + 3002bfc: fdc42783 lw a5,-36(s0) + 3002c00: fef42623 sw a5,-20(s0) + 3002c04: fd842783 lw a5,-40(s0) + 3002c08: cb91 beqz a5,3002c1c + 3002c0a: fd842783 lw a5,-40(s0) + 3002c0e: 0785 addi a5,a5,1 + 3002c10: fec42703 lw a4,-20(s0) + 3002c14: 02f757b3 divu a5,a4,a5 + 3002c18: fef42623 sw a5,-20(s0) + 3002c1c: fec42703 lw a4,-20(s0) + 3002c20: 05f5e7b7 lui a5,0x5f5e + 3002c24: 10178793 addi a5,a5,257 # 5f5e101 + 3002c28: 00f737b3 sltu a5,a4,a5 + 3002c2c: 9f81 uxtb a5 + 3002c2e: 853e mv a0,a5 + 3002c30: 5432 lw s0,44(sp) + 3002c32: 6145 addi sp,sp,48 + 3002c34: 8082 ret + +03002c36 : + 3002c36: 1101 addi sp,sp,-32 + 3002c38: ce22 sw s0,28(sp) + 3002c3a: 1000 addi s0,sp,32 + 3002c3c: fea42623 sw a0,-20(s0) + 3002c40: fec42783 lw a5,-20(s0) + 3002c44: c385 beqz a5,3002c64 + 3002c46: fec42703 lw a4,-20(s0) + 3002c4a: 4785 li a5,1 + 3002c4c: 00f70c63 beq a4,a5,3002c64 + 3002c50: fec42703 lw a4,-20(s0) + 3002c54: 4789 li a5,2 + 3002c56: 00f70763 beq a4,a5,3002c64 + 3002c5a: fec42703 lw a4,-20(s0) + 3002c5e: 478d li a5,3 + 3002c60: 00f71463 bne a4,a5,3002c68 + 3002c64: 4785 li a5,1 + 3002c66: a011 j 3002c6a + 3002c68: 4781 li a5,0 + 3002c6a: 8b85 andi a5,a5,1 + 3002c6c: 9f81 uxtb a5 + 3002c6e: 853e mv a0,a5 + 3002c70: 4472 lw s0,28(sp) + 3002c72: 6105 addi sp,sp,32 + 3002c74: 8082 ret + +03002c76 : + 3002c76: 1101 addi sp,sp,-32 + 3002c78: ce22 sw s0,28(sp) + 3002c7a: 1000 addi s0,sp,32 + 3002c7c: fea42623 sw a0,-20(s0) + 3002c80: fec42783 lw a5,-20(s0) + 3002c84: c385 beqz a5,3002ca4 + 3002c86: fec42703 lw a4,-20(s0) + 3002c8a: 4785 li a5,1 + 3002c8c: 00f70c63 beq a4,a5,3002ca4 + 3002c90: fec42703 lw a4,-20(s0) + 3002c94: 4789 li a5,2 + 3002c96: 00f70763 beq a4,a5,3002ca4 + 3002c9a: fec42703 lw a4,-20(s0) + 3002c9e: 478d li a5,3 + 3002ca0: 00f71463 bne a4,a5,3002ca8 + 3002ca4: 4785 li a5,1 + 3002ca6: a011 j 3002caa + 3002ca8: 4781 li a5,0 + 3002caa: 8b85 andi a5,a5,1 + 3002cac: 9f81 uxtb a5 + 3002cae: 853e mv a0,a5 + 3002cb0: 4472 lw s0,28(sp) + 3002cb2: 6105 addi sp,sp,32 + 3002cb4: 8082 ret + +03002cb6 : + 3002cb6: 1101 addi sp,sp,-32 + 3002cb8: ce06 sw ra,28(sp) + 3002cba: cc22 sw s0,24(sp) + 3002cbc: 1000 addi s0,sp,32 + 3002cbe: fea42623 sw a0,-20(s0) + 3002cc2: feb42423 sw a1,-24(s0) + 3002cc6: fec42703 lw a4,-20(s0) + 3002cca: 100007b7 lui a5,0x10000 + 3002cce: 00f70a63 beq a4,a5,3002ce2 + 3002cd2: 64b00593 li a1,1611 + 3002cd6: 030067b7 lui a5,0x3006 + 3002cda: 4d878513 addi a0,a5,1240 # 30064d8 + 3002cde: 20a1 jal ra,3002d26 + 3002ce0: a001 j 3002ce0 + 3002ce2: fe842503 lw a0,-24(s0) + 3002ce6: 3ba9 jal ra,3002a40 + 3002ce8: 87aa mv a5,a0 + 3002cea: 0017c793 xori a5,a5,1 + 3002cee: 9f81 uxtb a5 + 3002cf0: cb89 beqz a5,3002d02 + 3002cf2: 64c00593 li a1,1612 + 3002cf6: 030067b7 lui a5,0x3006 + 3002cfa: 4d878513 addi a0,a5,1240 # 30064d8 + 3002cfe: 2025 jal ra,3002d26 + 3002d00: a839 j 3002d1e + 3002d02: fe842783 lw a5,-24(s0) + 3002d06: 8b8d andi a5,a5,3 + 3002d08: 0ff7f693 andi a3,a5,255 + 3002d0c: fec42703 lw a4,-20(s0) + 3002d10: 10072783 lw a5,256(a4) # ea510100 + 3002d14: 8a8d andi a3,a3,3 + 3002d16: 9bf1 andi a5,a5,-4 + 3002d18: 8fd5 or a5,a5,a3 + 3002d1a: 10f72023 sw a5,256(a4) + 3002d1e: 40f2 lw ra,28(sp) + 3002d20: 4462 lw s0,24(sp) + 3002d22: 6105 addi sp,sp,32 + 3002d24: 8082 ret + +03002d26 : + 3002d26: 988ff06f j 3001eae + +03002d2a : + 3002d2a: 7179 addi sp,sp,-48 + 3002d2c: d606 sw ra,44(sp) + 3002d2e: d422 sw s0,40(sp) + 3002d30: 1800 addi s0,sp,48 + 3002d32: fca42e23 sw a0,-36(s0) + 3002d36: fdc42783 lw a5,-36(s0) + 3002d3a: eb89 bnez a5,3002d4c + 3002d3c: 07100593 li a1,113 + 3002d40: 030067b7 lui a5,0x3006 + 3002d44: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d48: 3ff9 jal ra,3002d26 + 3002d4a: a001 j 3002d4a + 3002d4c: fdc42783 lw a5,-36(s0) + 3002d50: 4398 lw a4,0(a5) + 3002d52: 100007b7 lui a5,0x10000 + 3002d56: 00f70a63 beq a4,a5,3002d6a + 3002d5a: 07200593 li a1,114 + 3002d5e: 030067b7 lui a5,0x3006 + 3002d62: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d66: 37c1 jal ra,3002d26 + 3002d68: a001 j 3002d68 + 3002d6a: fdc42783 lw a5,-36(s0) + 3002d6e: 43dc lw a5,4(a5) + 3002d70: 853e mv a0,a5 + 3002d72: 390d jal ra,30029a4 + 3002d74: 87aa mv a5,a0 + 3002d76: 0017c793 xori a5,a5,1 + 3002d7a: 9f81 uxtb a5 + 3002d7c: cb91 beqz a5,3002d90 + 3002d7e: 07400593 li a1,116 + 3002d82: 030067b7 lui a5,0x3006 + 3002d86: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d8a: 3f71 jal ra,3002d26 + 3002d8c: 4785 li a5,1 + 3002d8e: aca9 j 3002fe8 + 3002d90: fdc42783 lw a5,-36(s0) + 3002d94: 479c lw a5,8(a5) + 3002d96: 853e mv a0,a5 + 3002d98: 3925 jal ra,30029d0 + 3002d9a: 87aa mv a5,a0 + 3002d9c: 0017c793 xori a5,a5,1 + 3002da0: 9f81 uxtb a5 + 3002da2: cb91 beqz a5,3002db6 + 3002da4: 07500593 li a1,117 + 3002da8: 030067b7 lui a5,0x3006 + 3002dac: 4f478513 addi a0,a5,1268 # 30064f4 + 3002db0: 3f9d jal ra,3002d26 + 3002db2: 4785 li a5,1 + 3002db4: ac15 j 3002fe8 + 3002db6: fdc42783 lw a5,-36(s0) + 3002dba: 47dc lw a5,12(a5) + 3002dbc: 853e mv a0,a5 + 3002dbe: 319d jal ra,3002a24 + 3002dc0: 87aa mv a5,a0 + 3002dc2: 0017c793 xori a5,a5,1 + 3002dc6: 9f81 uxtb a5 + 3002dc8: cb91 beqz a5,3002ddc + 3002dca: 07600593 li a1,118 + 3002dce: 030067b7 lui a5,0x3006 + 3002dd2: 4f478513 addi a0,a5,1268 # 30064f4 + 3002dd6: 3f81 jal ra,3002d26 + 3002dd8: 4785 li a5,1 + 3002dda: a439 j 3002fe8 + 3002ddc: fdc42783 lw a5,-36(s0) + 3002de0: 4b9c lw a5,16(a5) + 3002de2: 853e mv a0,a5 + 3002de4: 3121 jal ra,30029ec + 3002de6: 87aa mv a5,a0 + 3002de8: 0017c793 xori a5,a5,1 + 3002dec: 9f81 uxtb a5 + 3002dee: cb91 beqz a5,3002e02 + 3002df0: 07700593 li a1,119 + 3002df4: 030067b7 lui a5,0x3006 + 3002df8: 4f478513 addi a0,a5,1268 # 30064f4 + 3002dfc: 372d jal ra,3002d26 + 3002dfe: 4785 li a5,1 + 3002e00: a2e5 j 3002fe8 + 3002e02: fdc42783 lw a5,-36(s0) + 3002e06: 4fdc lw a5,28(a5) + 3002e08: 853e mv a0,a5 + 3002e0a: 3efd jal ra,3002a08 + 3002e0c: 87aa mv a5,a0 + 3002e0e: 0017c793 xori a5,a5,1 + 3002e12: 9f81 uxtb a5 + 3002e14: cb91 beqz a5,3002e28 + 3002e16: 07800593 li a1,120 + 3002e1a: 030067b7 lui a5,0x3006 + 3002e1e: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e22: 3711 jal ra,3002d26 + 3002e24: 4785 li a5,1 + 3002e26: a2c9 j 3002fe8 + 3002e28: fdc42783 lw a5,-36(s0) + 3002e2c: 539c lw a5,32(a5) + 3002e2e: 853e mv a0,a5 + 3002e30: 3199 jal ra,3002a76 + 3002e32: 87aa mv a5,a0 + 3002e34: 0017c793 xori a5,a5,1 + 3002e38: 9f81 uxtb a5 + 3002e3a: cb91 beqz a5,3002e4e + 3002e3c: 07a00593 li a1,122 + 3002e40: 030067b7 lui a5,0x3006 + 3002e44: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e48: 3df9 jal ra,3002d26 + 3002e4a: 4785 li a5,1 + 3002e4c: aa71 j 3002fe8 + 3002e4e: fdc42783 lw a5,-36(s0) + 3002e52: 53dc lw a5,36(a5) + 3002e54: 853e mv a0,a5 + 3002e56: 31b1 jal ra,3002aa2 + 3002e58: 87aa mv a5,a0 + 3002e5a: 0017c793 xori a5,a5,1 + 3002e5e: 9f81 uxtb a5 + 3002e60: cb91 beqz a5,3002e74 + 3002e62: 07b00593 li a1,123 + 3002e66: 030067b7 lui a5,0x3006 + 3002e6a: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e6e: 3d65 jal ra,3002d26 + 3002e70: 4785 li a5,1 + 3002e72: aa9d j 3002fe8 + 3002e74: fdc42783 lw a5,-36(s0) + 3002e78: 4f9c lw a5,24(a5) + 3002e7a: 853e mv a0,a5 + 3002e7c: 36d1 jal ra,3002a40 + 3002e7e: 87aa mv a5,a0 + 3002e80: 0017c793 xori a5,a5,1 + 3002e84: 9f81 uxtb a5 + 3002e86: cb91 beqz a5,3002e9a + 3002e88: 07c00593 li a1,124 + 3002e8c: 030067b7 lui a5,0x3006 + 3002e90: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e94: 3d49 jal ra,3002d26 + 3002e96: 4785 li a5,1 + 3002e98: aa81 j 3002fe8 + 3002e9a: 100017b7 lui a5,0x10001 + 3002e9e: f0478793 addi a5,a5,-252 # 10000f04 + 3002ea2: 670d lui a4,0x3 + 3002ea4: 06e70713 addi a4,a4,110 # 306e + 3002ea8: c398 sw a4,0(a5) + 3002eaa: fdc42783 lw a5,-36(s0) + 3002eae: 439c lw a5,0(a5) + 3002eb0: fef42623 sw a5,-20(s0) + 3002eb4: 040007b7 lui a5,0x4000 + 3002eb8: fec42703 lw a4,-20(s0) + 3002ebc: 48e7aa23 sw a4,1172(a5) # 4000494 + 3002ec0: fdc42503 lw a0,-36(s0) + 3002ec4: 7a4000ef jal ra,3003668 + 3002ec8: 87aa mv a5,a0 + 3002eca: c399 beqz a5,3002ed0 + 3002ecc: 4785 li a5,1 + 3002ece: aa29 j 3002fe8 + 3002ed0: 3449 jal ra,3002952 + 3002ed2: fdc42783 lw a5,-36(s0) + 3002ed6: 43dc lw a5,4(a5) + 3002ed8: 8b85 andi a5,a5,1 + 3002eda: 0ff7f693 andi a3,a5,255 + 3002ede: fec42703 lw a4,-20(s0) + 3002ee2: 431c lw a5,0(a4) + 3002ee4: 8a85 andi a3,a3,1 + 3002ee6: 9bf9 andi a5,a5,-2 + 3002ee8: 8fd5 or a5,a5,a3 + 3002eea: c31c sw a5,0(a4) + 3002eec: fdc42783 lw a5,-36(s0) + 3002ef0: 479c lw a5,8(a5) + 3002ef2: 8bbd andi a5,a5,15 + 3002ef4: 0ff7f693 andi a3,a5,255 + 3002ef8: fec42703 lw a4,-20(s0) + 3002efc: 435c lw a5,4(a4) + 3002efe: 8abd andi a3,a3,15 + 3002f00: 9bc1 andi a5,a5,-16 + 3002f02: 8fd5 or a5,a5,a3 + 3002f04: c35c sw a5,4(a4) + 3002f06: fdc42783 lw a5,-36(s0) + 3002f0a: 47dc lw a5,12(a5) + 3002f0c: 0ff7f693 andi a3,a5,255 + 3002f10: fec42703 lw a4,-20(s0) + 3002f14: 471c lw a5,8(a4) + 3002f16: 0ff6f693 andi a3,a3,255 + 3002f1a: f007f793 andi a5,a5,-256 + 3002f1e: 8fd5 or a5,a5,a3 + 3002f20: c71c sw a5,8(a4) + 3002f22: fdc42783 lw a5,-36(s0) + 3002f26: 4b9c lw a5,16(a5) + 3002f28: 8bbd andi a5,a5,15 + 3002f2a: 0ff7f693 andi a3,a5,255 + 3002f2e: fec42703 lw a4,-20(s0) + 3002f32: 475c lw a5,12(a4) + 3002f34: 8abd andi a3,a3,15 + 3002f36: 9bc1 andi a5,a5,-16 + 3002f38: 8fd5 or a5,a5,a3 + 3002f3a: c75c sw a5,12(a4) + 3002f3c: fdc42783 lw a5,-36(s0) + 3002f40: 4fdc lw a5,28(a5) + 3002f42: 8bbd andi a5,a5,15 + 3002f44: 0ff7f693 andi a3,a5,255 + 3002f48: fec42703 lw a4,-20(s0) + 3002f4c: 475c lw a5,12(a4) + 3002f4e: 8abd andi a3,a3,15 + 3002f50: 0692 slli a3,a3,0x4 + 3002f52: f0f7f793 andi a5,a5,-241 + 3002f56: 8fd5 or a5,a5,a3 + 3002f58: c75c sw a5,12(a4) + 3002f5a: fec42703 lw a4,-20(s0) + 3002f5e: 4b1c lw a5,16(a4) + 3002f60: 9bf9 andi a5,a5,-2 + 3002f62: cb1c sw a5,16(a4) + 3002f64: 0001 nop + 3002f66: fec42783 lw a5,-20(s0) + 3002f6a: 4fdc lw a5,28(a5) + 3002f6c: 8b85 andi a5,a5,1 + 3002f6e: 0ff7f713 andi a4,a5,255 + 3002f72: 4785 li a5,1 + 3002f74: fef719e3 bne a4,a5,3002f66 + 3002f78: 3409 jal ra,300297a + 3002f7a: fdc42503 lw a0,-36(s0) + 3002f7e: 7ac000ef jal ra,300372a + 3002f82: 87aa mv a5,a0 + 3002f84: c399 beqz a5,3002f8a + 3002f86: 4785 li a5,1 + 3002f88: a085 j 3002fe8 + 3002f8a: 0001 nop + 3002f8c: fec42703 lw a4,-20(s0) + 3002f90: 6785 lui a5,0x1 + 3002f92: 97ba add a5,a5,a4 + 3002f94: f107a783 lw a5,-240(a5) # f10 + 3002f98: 8b85 andi a5,a5,1 + 3002f9a: 0ff7f713 andi a4,a5,255 + 3002f9e: 4785 li a5,1 + 3002fa0: fef716e3 bne a4,a5,3002f8c + 3002fa4: fdc42783 lw a5,-36(s0) + 3002fa8: 53dc lw a5,36(a5) + 3002faa: 03f7f793 andi a5,a5,63 + 3002fae: 0ff7f693 andi a3,a5,255 + 3002fb2: fec42703 lw a4,-20(s0) + 3002fb6: 10c72783 lw a5,268(a4) + 3002fba: 03f6f693 andi a3,a3,63 + 3002fbe: fc07f793 andi a5,a5,-64 + 3002fc2: 8fd5 or a5,a5,a3 + 3002fc4: 10f72623 sw a5,268(a4) + 3002fc8: fdc42783 lw a5,-36(s0) + 3002fcc: 539c lw a5,32(a5) + 3002fce: 8b85 andi a5,a5,1 + 3002fd0: 0ff7f693 andi a3,a5,255 + 3002fd4: fec42703 lw a4,-20(s0) + 3002fd8: 10872783 lw a5,264(a4) + 3002fdc: 8a85 andi a3,a3,1 + 3002fde: 9bf9 andi a5,a5,-2 + 3002fe0: 8fd5 or a5,a5,a3 + 3002fe2: 10f72423 sw a5,264(a4) + 3002fe6: 4781 li a5,0 + 3002fe8: 853e mv a0,a5 + 3002fea: 50b2 lw ra,44(sp) + 3002fec: 5422 lw s0,40(sp) + 3002fee: 6145 addi sp,sp,48 + 3002ff0: 8082 ret + +03002ff2 : + 3002ff2: 7179 addi sp,sp,-48 + 3002ff4: d606 sw ra,44(sp) + 3002ff6: d422 sw s0,40(sp) + 3002ff8: 1800 addi s0,sp,48 + 3002ffa: fca42e23 sw a0,-36(s0) + 3002ffe: fdc42783 lw a5,-36(s0) + 3003002: eb89 bnez a5,3003014 + 3003004: 10a00593 li a1,266 + 3003008: 030067b7 lui a5,0x3006 + 300300c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003010: 3b19 jal ra,3002d26 + 3003012: a001 j 3003012 + 3003014: fdc42783 lw a5,-36(s0) + 3003018: 4398 lw a4,0(a5) + 300301a: 100007b7 lui a5,0x10000 + 300301e: 00f70a63 beq a4,a5,3003032 + 3003022: 10b00593 li a1,267 + 3003026: 030067b7 lui a5,0x3006 + 300302a: 4f478513 addi a0,a5,1268 # 30064f4 + 300302e: 39e5 jal ra,3002d26 + 3003030: a001 j 3003030 + 3003032: fdc42783 lw a5,-36(s0) + 3003036: 4f9c lw a5,24(a5) + 3003038: 853e mv a0,a5 + 300303a: 3419 jal ra,3002a40 + 300303c: 87aa mv a5,a0 + 300303e: 0017c793 xori a5,a5,1 + 3003042: 9f81 uxtb a5 + 3003044: cb91 beqz a5,3003058 + 3003046: 10c00593 li a1,268 + 300304a: 030067b7 lui a5,0x3006 + 300304e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003052: 39d1 jal ra,3002d26 + 3003054: 4785 li a5,1 + 3003056: a005 j 3003076 + 3003058: fdc42783 lw a5,-36(s0) + 300305c: 439c lw a5,0(a5) + 300305e: fef42623 sw a5,-20(s0) + 3003062: 38c5 jal ra,3002952 + 3003064: fdc42783 lw a5,-36(s0) + 3003068: 4f9c lw a5,24(a5) + 300306a: 85be mv a1,a5 + 300306c: fec42503 lw a0,-20(s0) + 3003070: 3199 jal ra,3002cb6 + 3003072: 3221 jal ra,300297a + 3003074: 4781 li a5,0 + 3003076: 853e mv a0,a5 + 3003078: 50b2 lw ra,44(sp) + 300307a: 5422 lw s0,40(sp) + 300307c: 6145 addi sp,sp,48 + 300307e: 8082 ret + +03003080 : + 3003080: 1101 addi sp,sp,-32 + 3003082: ce06 sw ra,28(sp) + 3003084: cc22 sw s0,24(sp) + 3003086: 1000 addi s0,sp,32 + 3003088: 040007b7 lui a5,0x4000 + 300308c: 4947a783 lw a5,1172(a5) # 4000494 + 3003090: fef42623 sw a5,-20(s0) + 3003094: fec42703 lw a4,-20(s0) + 3003098: 100007b7 lui a5,0x10000 + 300309c: 00f70a63 beq a4,a5,30030b0 + 30030a0: 12200593 li a1,290 + 30030a4: 030067b7 lui a5,0x3006 + 30030a8: 4f478513 addi a0,a5,1268 # 30064f4 + 30030ac: 39ad jal ra,3002d26 + 30030ae: a001 j 30030ae + 30030b0: fec42783 lw a5,-20(s0) + 30030b4: 439c lw a5,0(a5) + 30030b6: 8b85 andi a5,a5,1 + 30030b8: 9f81 uxtb a5 + 30030ba: 853e mv a0,a5 + 30030bc: 25c1 jal ra,300377c + 30030be: fea42423 sw a0,-24(s0) + 30030c2: fec42783 lw a5,-20(s0) + 30030c6: 43dc lw a5,4(a5) + 30030c8: 8bbd andi a5,a5,15 + 30030ca: 9f81 uxtb a5 + 30030cc: 853e mv a0,a5 + 30030ce: 2de1 jal ra,30037a6 + 30030d0: 872a mv a4,a0 + 30030d2: fe842783 lw a5,-24(s0) + 30030d6: 02e7d7b3 divu a5,a5,a4 + 30030da: fef42423 sw a5,-24(s0) + 30030de: fec42783 lw a5,-20(s0) + 30030e2: 479c lw a5,8(a5) + 30030e4: 9f81 uxtb a5 + 30030e6: 853e mv a0,a5 + 30030e8: 25f5 jal ra,30037d4 + 30030ea: fea42223 sw a0,-28(s0) + 30030ee: fe442783 lw a5,-28(s0) + 30030f2: 4719 li a4,6 + 30030f4: 00e7f363 bgeu a5,a4,30030fa + 30030f8: 4799 li a5,6 + 30030fa: fe842703 lw a4,-24(s0) + 30030fe: 02f707b3 mul a5,a4,a5 + 3003102: fef42423 sw a5,-24(s0) + 3003106: fe842783 lw a5,-24(s0) + 300310a: 853e mv a0,a5 + 300310c: 40f2 lw ra,28(sp) + 300310e: 4462 lw s0,24(sp) + 3003110: 6105 addi sp,sp,32 + 3003112: 8082 ret + +03003114 : + 3003114: 1101 addi sp,sp,-32 + 3003116: ce06 sw ra,28(sp) + 3003118: cc22 sw s0,24(sp) + 300311a: 1000 addi s0,sp,32 + 300311c: 040007b7 lui a5,0x4000 + 3003120: 4947a783 lw a5,1172(a5) # 4000494 + 3003124: fef42423 sw a5,-24(s0) + 3003128: fe842703 lw a4,-24(s0) + 300312c: 100007b7 lui a5,0x10000 + 3003130: 00f70a63 beq a4,a5,3003144 + 3003134: 13700593 li a1,311 + 3003138: 030067b7 lui a5,0x3006 + 300313c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003140: 36dd jal ra,3002d26 + 3003142: a001 j 3003142 + 3003144: 3f35 jal ra,3003080 + 3003146: fea42623 sw a0,-20(s0) + 300314a: fe842783 lw a5,-24(s0) + 300314e: 47dc lw a5,12(a5) + 3003150: 8bbd andi a5,a5,15 + 3003152: 9f81 uxtb a5 + 3003154: 853e mv a0,a5 + 3003156: 25c1 jal ra,3003816 + 3003158: fea42223 sw a0,-28(s0) + 300315c: fe442783 lw a5,-28(s0) + 3003160: cb89 beqz a5,3003172 + 3003162: fec42703 lw a4,-20(s0) + 3003166: fe442783 lw a5,-28(s0) + 300316a: 02f757b3 divu a5,a4,a5 + 300316e: fef42623 sw a5,-20(s0) + 3003172: fec42783 lw a5,-20(s0) + 3003176: 853e mv a0,a5 + 3003178: 40f2 lw ra,28(sp) + 300317a: 4462 lw s0,24(sp) + 300317c: 6105 addi sp,sp,32 + 300317e: 8082 ret + +03003180 : + 3003180: 1101 addi sp,sp,-32 + 3003182: ce06 sw ra,28(sp) + 3003184: cc22 sw s0,24(sp) + 3003186: 1000 addi s0,sp,32 + 3003188: 040007b7 lui a5,0x4000 + 300318c: 4947a783 lw a5,1172(a5) # 4000494 + 3003190: fef42423 sw a5,-24(s0) + 3003194: fe842703 lw a4,-24(s0) + 3003198: 100007b7 lui a5,0x10000 + 300319c: 00f70a63 beq a4,a5,30031b0 + 30031a0: 14c00593 li a1,332 + 30031a4: 030067b7 lui a5,0x3006 + 30031a8: 4f478513 addi a0,a5,1268 # 30064f4 + 30031ac: 3ead jal ra,3002d26 + 30031ae: a001 j 30031ae + 30031b0: fe842783 lw a5,-24(s0) + 30031b4: 1007a783 lw a5,256(a5) + 30031b8: 8b8d andi a5,a5,3 + 30031ba: 9f81 uxtb a5 + 30031bc: fef42223 sw a5,-28(s0) + 30031c0: fe442783 lw a5,-28(s0) + 30031c4: 4705 li a4,1 + 30031c6: 02e78063 beq a5,a4,30031e6 + 30031ca: 4705 li a4,1 + 30031cc: 00e7e663 bltu a5,a4,30031d8 + 30031d0: 4709 li a4,2 + 30031d2: 02e78163 beq a5,a4,30031f4 + 30031d6: a01d j 30031fc + 30031d8: 017d87b7 lui a5,0x17d8 + 30031dc: 84078793 addi a5,a5,-1984 # 17d7840 + 30031e0: fef42623 sw a5,-20(s0) + 30031e4: a015 j 3003208 + 30031e6: 01c9c7b7 lui a5,0x1c9c + 30031ea: 38078793 addi a5,a5,896 # 1c9c380 + 30031ee: fef42623 sw a5,-20(s0) + 30031f2: a819 j 3003208 + 30031f4: 3705 jal ra,3003114 + 30031f6: fea42623 sw a0,-20(s0) + 30031fa: a039 j 3003208 + 30031fc: 67a1 lui a5,0x8 + 30031fe: d0078793 addi a5,a5,-768 # 7d00 + 3003202: fef42623 sw a5,-20(s0) + 3003206: 0001 nop + 3003208: fec42783 lw a5,-20(s0) + 300320c: 853e mv a0,a5 + 300320e: 40f2 lw ra,28(sp) + 3003210: 4462 lw s0,24(sp) + 3003212: 6105 addi sp,sp,32 + 3003214: 8082 ret + +03003216 : + 3003216: 7179 addi sp,sp,-48 + 3003218: d606 sw ra,44(sp) + 300321a: d422 sw s0,40(sp) + 300321c: 1800 addi s0,sp,48 + 300321e: fca42e23 sw a0,-36(s0) + 3003222: fdc42783 lw a5,-36(s0) + 3003226: eb89 bnez a5,3003238 + 3003228: 16900593 li a1,361 + 300322c: 030067b7 lui a5,0x3006 + 3003230: 4f478513 addi a0,a5,1268 # 30064f4 + 3003234: 3ccd jal ra,3002d26 + 3003236: a001 j 3003236 + 3003238: 040007b7 lui a5,0x4000 + 300323c: 4947a703 lw a4,1172(a5) # 4000494 + 3003240: 100007b7 lui a5,0x10000 + 3003244: 00f70a63 beq a4,a5,3003258 + 3003248: 16a00593 li a1,362 + 300324c: 030067b7 lui a5,0x3006 + 3003250: 4f478513 addi a0,a5,1268 # 30064f4 + 3003254: 3cc9 jal ra,3002d26 + 3003256: a001 j 3003256 + 3003258: 3725 jal ra,3003180 + 300325a: fea42423 sw a0,-24(s0) + 300325e: 67a1 lui a5,0x8 + 3003260: d0078793 addi a5,a5,-768 # 7d00 + 3003264: fef42623 sw a5,-20(s0) + 3003268: fdc42503 lw a0,-36(s0) + 300326c: 2cc9 jal ra,300353e + 300326e: fea42223 sw a0,-28(s0) + 3003272: fe442783 lw a5,-28(s0) + 3003276: e781 bnez a5,300327e + 3003278: fec42783 lw a5,-20(s0) + 300327c: a895 j 30032f0 + 300327e: fe442783 lw a5,-28(s0) + 3003282: 43dc lw a5,4(a5) + 3003284: 4715 li a4,5 + 3003286: 04f76a63 bltu a4,a5,30032da + 300328a: 00279713 slli a4,a5,0x2 + 300328e: 030067b7 lui a5,0x3006 + 3003292: 53078793 addi a5,a5,1328 # 3006530 + 3003296: 97ba add a5,a5,a4 + 3003298: 439c lw a5,0(a5) + 300329a: 8782 jr a5 + 300329c: fe842783 lw a5,-24(s0) + 30032a0: fef42623 sw a5,-20(s0) + 30032a4: a825 j 30032dc + 30032a6: 040007b7 lui a5,0x4000 + 30032aa: 4947a783 lw a5,1172(a5) # 4000494 + 30032ae: 439c lw a5,0(a5) + 30032b0: 8b85 andi a5,a5,1 + 30032b2: 9f81 uxtb a5 + 30032b4: 853e mv a0,a5 + 30032b6: 21d9 jal ra,300377c + 30032b8: fea42623 sw a0,-20(s0) + 30032bc: a005 j 30032dc + 30032be: 35c9 jal ra,3003180 + 30032c0: fea42023 sw a0,-32(s0) + 30032c4: 3b75 jal ra,3003080 + 30032c6: 87aa mv a5,a0 + 30032c8: fe042603 lw a2,-32(s0) + 30032cc: 85be mv a1,a5 + 30032ce: fe442503 lw a0,-28(s0) + 30032d2: 2c85 jal ra,3003542 + 30032d4: fea42623 sw a0,-20(s0) + 30032d8: a011 j 30032dc + 30032da: 0001 nop + 30032dc: fec42783 lw a5,-20(s0) + 30032e0: e791 bnez a5,30032ec + 30032e2: 67a1 lui a5,0x8 + 30032e4: d0078793 addi a5,a5,-768 # 7d00 + 30032e8: fef42623 sw a5,-20(s0) + 30032ec: fec42783 lw a5,-20(s0) + 30032f0: 853e mv a0,a5 + 30032f2: 50b2 lw ra,44(sp) + 30032f4: 5422 lw s0,40(sp) + 30032f6: 6145 addi sp,sp,48 + 30032f8: 8082 ret + +030032fa : + 30032fa: 7179 addi sp,sp,-48 + 30032fc: d606 sw ra,44(sp) + 30032fe: d422 sw s0,40(sp) + 3003300: 1800 addi s0,sp,48 + 3003302: fca42e23 sw a0,-36(s0) + 3003306: fcb42c23 sw a1,-40(s0) + 300330a: fdc42783 lw a5,-36(s0) + 300330e: eb89 bnez a5,3003320 + 3003310: 19c00593 li a1,412 + 3003314: 030067b7 lui a5,0x3006 + 3003318: 4f478513 addi a0,a5,1268 # 30064f4 + 300331c: 3429 jal ra,3002d26 + 300331e: a001 j 300331e + 3003320: 040007b7 lui a5,0x4000 + 3003324: 4947a703 lw a4,1172(a5) # 4000494 + 3003328: 100007b7 lui a5,0x10000 + 300332c: 00f70a63 beq a4,a5,3003340 + 3003330: 19d00593 li a1,413 + 3003334: 030067b7 lui a5,0x3006 + 3003338: 4f478513 addi a0,a5,1268 # 30064f4 + 300333c: 32ed jal ra,3002d26 + 300333e: a001 j 300333e + 3003340: fd842703 lw a4,-40(s0) + 3003344: 4785 li a5,1 + 3003346: 00f70e63 beq a4,a5,3003362 + 300334a: fd842783 lw a5,-40(s0) + 300334e: cb91 beqz a5,3003362 + 3003350: 19f00593 li a1,415 + 3003354: 030067b7 lui a5,0x3006 + 3003358: 4f478513 addi a0,a5,1268 # 30064f4 + 300335c: 32e9 jal ra,3002d26 + 300335e: 4785 li a5,1 + 3003360: a0a5 j 30033c8 + 3003362: fdc42503 lw a0,-36(s0) + 3003366: 2ae1 jal ra,300353e + 3003368: fea42623 sw a0,-20(s0) + 300336c: fec42783 lw a5,-20(s0) + 3003370: c799 beqz a5,300337e + 3003372: fec42783 lw a5,-20(s0) + 3003376: 43d8 lw a4,4(a5) + 3003378: 4795 li a5,5 + 300337a: 00e7f463 bgeu a5,a4,3003382 + 300337e: 4785 li a5,1 + 3003380: a0a1 j 30033c8 + 3003382: fec42783 lw a5,-20(s0) + 3003386: 43d4 lw a3,4(a5) + 3003388: 040007b7 lui a5,0x4000 + 300338c: 02478713 addi a4,a5,36 # 4000024 + 3003390: 02400793 li a5,36 + 3003394: 02f687b3 mul a5,a3,a5 + 3003398: 97ba add a5,a5,a4 + 300339a: 479c lw a5,8(a5) + 300339c: e399 bnez a5,30033a2 + 300339e: 4785 li a5,1 + 30033a0: a025 j 30033c8 + 30033a2: fec42783 lw a5,-20(s0) + 30033a6: 43d4 lw a3,4(a5) + 30033a8: 040007b7 lui a5,0x4000 + 30033ac: 02478713 addi a4,a5,36 # 4000024 + 30033b0: 02400793 li a5,36 + 30033b4: 02f687b3 mul a5,a3,a5 + 30033b8: 97ba add a5,a5,a4 + 30033ba: 479c lw a5,8(a5) + 30033bc: fd842583 lw a1,-40(s0) + 30033c0: fec42503 lw a0,-20(s0) + 30033c4: 9782 jalr a5 + 30033c6: 4781 li a5,0 + 30033c8: 853e mv a0,a5 + 30033ca: 50b2 lw ra,44(sp) + 30033cc: 5422 lw s0,40(sp) + 30033ce: 6145 addi sp,sp,48 + 30033d0: 8082 ret + +030033d2 : + 30033d2: 7179 addi sp,sp,-48 + 30033d4: d606 sw ra,44(sp) + 30033d6: d422 sw s0,40(sp) + 30033d8: 1800 addi s0,sp,48 + 30033da: fca42e23 sw a0,-36(s0) + 30033de: fcb42c23 sw a1,-40(s0) + 30033e2: fdc42783 lw a5,-36(s0) + 30033e6: eb89 bnez a5,30033f8 + 30033e8: 1cd00593 li a1,461 + 30033ec: 030067b7 lui a5,0x3006 + 30033f0: 4f478513 addi a0,a5,1268 # 30064f4 + 30033f4: 2d8d jal ra,3003a66 + 30033f6: a001 j 30033f6 + 30033f8: 040007b7 lui a5,0x4000 + 30033fc: 4947a703 lw a4,1172(a5) # 4000494 + 3003400: 100007b7 lui a5,0x10000 + 3003404: 00f70a63 beq a4,a5,3003418 + 3003408: 1ce00593 li a1,462 + 300340c: 030067b7 lui a5,0x3006 + 3003410: 4f478513 addi a0,a5,1268 # 30064f4 + 3003414: 2d89 jal ra,3003a66 + 3003416: a001 j 3003416 + 3003418: fdc42503 lw a0,-36(s0) + 300341c: 220d jal ra,300353e + 300341e: fea42623 sw a0,-20(s0) + 3003422: fec42783 lw a5,-20(s0) + 3003426: c799 beqz a5,3003434 + 3003428: fec42783 lw a5,-20(s0) + 300342c: 43d8 lw a4,4(a5) + 300342e: 4795 li a5,5 + 3003430: 00e7f463 bgeu a5,a4,3003438 + 3003434: 4785 li a5,1 + 3003436: a0a1 j 300347e + 3003438: fec42783 lw a5,-20(s0) + 300343c: 43d4 lw a3,4(a5) + 300343e: 040007b7 lui a5,0x4000 + 3003442: 02478713 addi a4,a5,36 # 4000024 + 3003446: 02400793 li a5,36 + 300344a: 02f687b3 mul a5,a3,a5 + 300344e: 97ba add a5,a5,a4 + 3003450: 47dc lw a5,12(a5) + 3003452: e399 bnez a5,3003458 + 3003454: 4785 li a5,1 + 3003456: a025 j 300347e + 3003458: fec42783 lw a5,-20(s0) + 300345c: 43d4 lw a3,4(a5) + 300345e: 040007b7 lui a5,0x4000 + 3003462: 02478713 addi a4,a5,36 # 4000024 + 3003466: 02400793 li a5,36 + 300346a: 02f687b3 mul a5,a3,a5 + 300346e: 97ba add a5,a5,a4 + 3003470: 47dc lw a5,12(a5) + 3003472: fd842583 lw a1,-40(s0) + 3003476: fec42503 lw a0,-20(s0) + 300347a: 9782 jalr a5 + 300347c: 4781 li a5,0 + 300347e: 853e mv a0,a5 + 3003480: 50b2 lw ra,44(sp) + 3003482: 5422 lw s0,40(sp) + 3003484: 6145 addi sp,sp,48 + 3003486: 8082 ret + +03003488 : + 3003488: 7179 addi sp,sp,-48 + 300348a: d606 sw ra,44(sp) + 300348c: d422 sw s0,40(sp) + 300348e: 1800 addi s0,sp,48 + 3003490: fca42e23 sw a0,-36(s0) + 3003494: fcb42c23 sw a1,-40(s0) + 3003498: fdc42783 lw a5,-36(s0) + 300349c: eb89 bnez a5,30034ae + 300349e: 22c00593 li a1,556 + 30034a2: 030067b7 lui a5,0x3006 + 30034a6: 4f478513 addi a0,a5,1268 # 30064f4 + 30034aa: 2b75 jal ra,3003a66 + 30034ac: a001 j 30034ac + 30034ae: 040007b7 lui a5,0x4000 + 30034b2: 4947a703 lw a4,1172(a5) # 4000494 + 30034b6: 100007b7 lui a5,0x10000 + 30034ba: 00f70a63 beq a4,a5,30034ce + 30034be: 22d00593 li a1,557 + 30034c2: 030067b7 lui a5,0x3006 + 30034c6: 4f478513 addi a0,a5,1268 # 30064f4 + 30034ca: 2b71 jal ra,3003a66 + 30034cc: a001 j 30034cc + 30034ce: fdc42503 lw a0,-36(s0) + 30034d2: 20b5 jal ra,300353e + 30034d4: fea42623 sw a0,-20(s0) + 30034d8: fec42783 lw a5,-20(s0) + 30034dc: c799 beqz a5,30034ea + 30034de: fec42783 lw a5,-20(s0) + 30034e2: 43d8 lw a4,4(a5) + 30034e4: 4795 li a5,5 + 30034e6: 00e7f463 bgeu a5,a4,30034ee + 30034ea: 4785 li a5,1 + 30034ec: a0a1 j 3003534 + 30034ee: fec42783 lw a5,-20(s0) + 30034f2: 43d4 lw a3,4(a5) + 30034f4: 040007b7 lui a5,0x4000 + 30034f8: 02478713 addi a4,a5,36 # 4000024 + 30034fc: 02400793 li a5,36 + 3003500: 02f687b3 mul a5,a3,a5 + 3003504: 97ba add a5,a5,a4 + 3003506: 4b9c lw a5,16(a5) + 3003508: e399 bnez a5,300350e + 300350a: 4785 li a5,1 + 300350c: a025 j 3003534 + 300350e: fec42783 lw a5,-20(s0) + 3003512: 43d4 lw a3,4(a5) + 3003514: 040007b7 lui a5,0x4000 + 3003518: 02478713 addi a4,a5,36 # 4000024 + 300351c: 02400793 li a5,36 + 3003520: 02f687b3 mul a5,a3,a5 + 3003524: 97ba add a5,a5,a4 + 3003526: 4b9c lw a5,16(a5) + 3003528: fd842583 lw a1,-40(s0) + 300352c: fec42503 lw a0,-20(s0) + 3003530: 9782 jalr a5 + 3003532: 4781 li a5,0 + 3003534: 853e mv a0,a5 + 3003536: 50b2 lw ra,44(sp) + 3003538: 5422 lw s0,40(sp) + 300353a: 6145 addi sp,sp,48 + 300353c: 8082 ret + +0300353e : + 300353e: c6bfd06f j 30011a8 + +03003542 : + 3003542: 7139 addi sp,sp,-64 + 3003544: de06 sw ra,60(sp) + 3003546: dc22 sw s0,56(sp) + 3003548: 0080 addi s0,sp,64 + 300354a: fca42623 sw a0,-52(s0) + 300354e: fcb42423 sw a1,-56(s0) + 3003552: fcc42223 sw a2,-60(s0) + 3003556: fcc42783 lw a5,-52(s0) + 300355a: eb89 bnez a5,300356c + 300355c: 2af00593 li a1,687 + 3003560: 030067b7 lui a5,0x3006 + 3003564: 4f478513 addi a0,a5,1268 # 30064f4 + 3003568: 29fd jal ra,3003a66 + 300356a: a001 j 300356a + 300356c: 040007b7 lui a5,0x4000 + 3003570: 4947a783 lw a5,1172(a5) # 4000494 + 3003574: eb89 bnez a5,3003586 + 3003576: 2b000593 li a1,688 + 300357a: 030067b7 lui a5,0x3006 + 300357e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003582: 21d5 jal ra,3003a66 + 3003584: a001 j 3003584 + 3003586: fe042623 sw zero,-20(s0) + 300358a: fcc42783 lw a5,-52(s0) + 300358e: 43d8 lw a4,4(a5) + 3003590: 02400793 li a5,36 + 3003594: 02f70733 mul a4,a4,a5 + 3003598: 040007b7 lui a5,0x4000 + 300359c: 02478793 addi a5,a5,36 # 4000024 + 30035a0: 97ba add a5,a5,a4 + 30035a2: fef42423 sw a5,-24(s0) + 30035a6: fe842783 lw a5,-24(s0) + 30035aa: 4fdc lw a5,28(a5) + 30035ac: e399 bnez a5,30035b2 + 30035ae: 4781 li a5,0 + 30035b0: a07d j 300365e + 30035b2: fe842783 lw a5,-24(s0) + 30035b6: 4fdc lw a5,28(a5) + 30035b8: fcc42503 lw a0,-52(s0) + 30035bc: 9782 jalr a5 + 30035be: fea42223 sw a0,-28(s0) + 30035c2: fe442703 lw a4,-28(s0) + 30035c6: 478d li a5,3 + 30035c8: 00f71763 bne a4,a5,30035d6 + 30035cc: fc442783 lw a5,-60(s0) + 30035d0: fef42623 sw a5,-20(s0) + 30035d4: a085 j 3003634 + 30035d6: fe442783 lw a5,-28(s0) + 30035da: eb81 bnez a5,30035ea + 30035dc: 017d87b7 lui a5,0x17d8 + 30035e0: 84078793 addi a5,a5,-1984 # 17d7840 + 30035e4: fef42623 sw a5,-20(s0) + 30035e8: a0b1 j 3003634 + 30035ea: fe442703 lw a4,-28(s0) + 30035ee: 4785 li a5,1 + 30035f0: 00f71963 bne a4,a5,3003602 + 30035f4: 01c9c7b7 lui a5,0x1c9c + 30035f8: 38078793 addi a5,a5,896 # 1c9c380 + 30035fc: fef42623 sw a5,-20(s0) + 3003600: a815 j 3003634 + 3003602: fe442703 lw a4,-28(s0) + 3003606: 4789 li a5,2 + 3003608: 02f71663 bne a4,a5,3003634 + 300360c: 040007b7 lui a5,0x4000 + 3003610: 4947a783 lw a5,1172(a5) # 4000494 + 3003614: 47dc lw a5,12(a5) + 3003616: 8391 srli a5,a5,0x4 + 3003618: 8bbd andi a5,a5,15 + 300361a: 9f81 uxtb a5 + 300361c: 853e mv a0,a5 + 300361e: 2ae5 jal ra,3003816 + 3003620: fea42023 sw a0,-32(s0) + 3003624: fc842703 lw a4,-56(s0) + 3003628: fe042783 lw a5,-32(s0) + 300362c: 02f757b3 divu a5,a4,a5 + 3003630: fef42623 sw a5,-20(s0) + 3003634: fe842783 lw a5,-24(s0) + 3003638: 539c lw a5,32(a5) + 300363a: e399 bnez a5,3003640 + 300363c: 4781 li a5,0 + 300363e: a005 j 300365e + 3003640: fe842783 lw a5,-24(s0) + 3003644: 539c lw a5,32(a5) + 3003646: fcc42503 lw a0,-52(s0) + 300364a: 9782 jalr a5 + 300364c: fca42e23 sw a0,-36(s0) + 3003650: fdc42783 lw a5,-36(s0) + 3003654: 0785 addi a5,a5,1 + 3003656: fec42703 lw a4,-20(s0) + 300365a: 02f757b3 divu a5,a4,a5 + 300365e: 853e mv a0,a5 + 3003660: 50f2 lw ra,60(sp) + 3003662: 5462 lw s0,56(sp) + 3003664: 6121 addi sp,sp,64 + 3003666: 8082 ret + +03003668 : + 3003668: 7179 addi sp,sp,-48 + 300366a: d606 sw ra,44(sp) + 300366c: d422 sw s0,40(sp) + 300366e: 1800 addi s0,sp,48 + 3003670: fca42e23 sw a0,-36(s0) + 3003674: fdc42783 lw a5,-36(s0) + 3003678: 43dc lw a5,4(a5) + 300367a: 853e mv a0,a5 + 300367c: 2201 jal ra,300377c + 300367e: fea42623 sw a0,-20(s0) + 3003682: fdc42783 lw a5,-36(s0) + 3003686: 479c lw a5,8(a5) + 3003688: 853e mv a0,a5 + 300368a: 2a31 jal ra,30037a6 + 300368c: fea42423 sw a0,-24(s0) + 3003690: fe842583 lw a1,-24(s0) + 3003694: fec42503 lw a0,-20(s0) + 3003698: c26ff0ef jal ra,3002abe + 300369c: 87aa mv a5,a0 + 300369e: 0017c793 xori a5,a5,1 + 30036a2: 9f81 uxtb a5 + 30036a4: c399 beqz a5,30036aa + 30036a6: 4785 li a5,1 + 30036a8: a8a5 j 3003720 + 30036aa: fec42703 lw a4,-20(s0) + 30036ae: fe842783 lw a5,-24(s0) + 30036b2: 02f757b3 divu a5,a4,a5 + 30036b6: fef42623 sw a5,-20(s0) + 30036ba: fdc42783 lw a5,-36(s0) + 30036be: 47dc lw a5,12(a5) + 30036c0: 85be mv a1,a5 + 30036c2: fec42503 lw a0,-20(s0) + 30036c6: c56ff0ef jal ra,3002b1c + 30036ca: 87aa mv a5,a0 + 30036cc: 0017c793 xori a5,a5,1 + 30036d0: 9f81 uxtb a5 + 30036d2: c399 beqz a5,30036d8 + 30036d4: 4785 li a5,1 + 30036d6: a0a9 j 3003720 + 30036d8: fdc42783 lw a5,-36(s0) + 30036dc: 47dc lw a5,12(a5) + 30036de: 4719 li a4,6 + 30036e0: 00e7f363 bgeu a5,a4,30036e6 + 30036e4: 4799 li a5,6 + 30036e6: fec42703 lw a4,-20(s0) + 30036ea: 02f707b3 mul a5,a4,a5 + 30036ee: fef42623 sw a5,-20(s0) + 30036f2: fdc42783 lw a5,-36(s0) + 30036f6: 4b9c lw a5,16(a5) + 30036f8: 85be mv a1,a5 + 30036fa: fec42503 lw a0,-20(s0) + 30036fe: ca8ff0ef jal ra,3002ba6 + 3003702: 87aa mv a5,a0 + 3003704: cf89 beqz a5,300371e + 3003706: fdc42783 lw a5,-36(s0) + 300370a: 4fdc lw a5,28(a5) + 300370c: 85be mv a1,a5 + 300370e: fec42503 lw a0,-20(s0) + 3003712: cdcff0ef jal ra,3002bee + 3003716: 87aa mv a5,a0 + 3003718: c399 beqz a5,300371e + 300371a: 4781 li a5,0 + 300371c: a011 j 3003720 + 300371e: 4785 li a5,1 + 3003720: 853e mv a0,a5 + 3003722: 50b2 lw ra,44(sp) + 3003724: 5422 lw s0,40(sp) + 3003726: 6145 addi sp,sp,48 + 3003728: 8082 ret + +0300372a : + 300372a: 7179 addi sp,sp,-48 + 300372c: d622 sw s0,44(sp) + 300372e: 1800 addi s0,sp,48 + 3003730: fca42e23 sw a0,-36(s0) + 3003734: fdc42783 lw a5,-36(s0) + 3003738: 539c lw a5,32(a5) + 300373a: e791 bnez a5,3003746 + 300373c: 017d87b7 lui a5,0x17d8 + 3003740: 84078793 addi a5,a5,-1984 # 17d7840 + 3003744: a029 j 300374e + 3003746: 01c9c7b7 lui a5,0x1c9c + 300374a: 38078793 addi a5,a5,896 # 1c9c380 + 300374e: fef42623 sw a5,-20(s0) + 3003752: fdc42783 lw a5,-36(s0) + 3003756: 53dc lw a5,36(a5) + 3003758: 0785 addi a5,a5,1 + 300375a: fec42703 lw a4,-20(s0) + 300375e: 02f75733 divu a4,a4,a5 + 3003762: 000f47b7 lui a5,0xf4 + 3003766: 24078793 addi a5,a5,576 # f4240 + 300376a: 00f71463 bne a4,a5,3003772 + 300376e: 4781 li a5,0 + 3003770: a011 j 3003774 + 3003772: 4785 li a5,1 + 3003774: 853e mv a0,a5 + 3003776: 5432 lw s0,44(sp) + 3003778: 6145 addi sp,sp,48 + 300377a: 8082 ret + +0300377c : + 300377c: 1101 addi sp,sp,-32 + 300377e: ce22 sw s0,28(sp) + 3003780: 1000 addi s0,sp,32 + 3003782: fea42623 sw a0,-20(s0) + 3003786: fec42783 lw a5,-20(s0) + 300378a: e791 bnez a5,3003796 + 300378c: 017d87b7 lui a5,0x17d8 + 3003790: 84078793 addi a5,a5,-1984 # 17d7840 + 3003794: a029 j 300379e + 3003796: 01c9c7b7 lui a5,0x1c9c + 300379a: 38078793 addi a5,a5,896 # 1c9c380 + 300379e: 853e mv a0,a5 + 30037a0: 4472 lw s0,28(sp) + 30037a2: 6105 addi sp,sp,32 + 30037a4: 8082 ret + +030037a6 : + 30037a6: 7179 addi sp,sp,-48 + 30037a8: d622 sw s0,44(sp) + 30037aa: 1800 addi s0,sp,48 + 30037ac: fca42e23 sw a0,-36(s0) + 30037b0: fdc42783 lw a5,-36(s0) + 30037b4: e789 bnez a5,30037be + 30037b6: 4785 li a5,1 + 30037b8: fef42623 sw a5,-20(s0) + 30037bc: a031 j 30037c8 + 30037be: fdc42783 lw a5,-36(s0) + 30037c2: 0785 addi a5,a5,1 + 30037c4: fef42623 sw a5,-20(s0) + 30037c8: fec42783 lw a5,-20(s0) + 30037cc: 853e mv a0,a5 + 30037ce: 5432 lw s0,44(sp) + 30037d0: 6145 addi sp,sp,48 + 30037d2: 8082 ret + +030037d4 : + 30037d4: 7179 addi sp,sp,-48 + 30037d6: d622 sw s0,44(sp) + 30037d8: 1800 addi s0,sp,48 + 30037da: fca42e23 sw a0,-36(s0) + 30037de: fdc42783 lw a5,-36(s0) + 30037e2: fef42623 sw a5,-20(s0) + 30037e6: fec42703 lw a4,-20(s0) + 30037ea: 4795 li a5,5 + 30037ec: 00e7e563 bltu a5,a4,30037f6 + 30037f0: 4799 li a5,6 + 30037f2: fef42623 sw a5,-20(s0) + 30037f6: fec42703 lw a4,-20(s0) + 30037fa: 07f00793 li a5,127 + 30037fe: 00e7f663 bgeu a5,a4,300380a + 3003802: 07f00793 li a5,127 + 3003806: fef42623 sw a5,-20(s0) + 300380a: fec42783 lw a5,-20(s0) + 300380e: 853e mv a0,a5 + 3003810: 5432 lw s0,44(sp) + 3003812: 6145 addi sp,sp,48 + 3003814: 8082 ret + +03003816 : + 3003816: 7179 addi sp,sp,-48 + 3003818: d622 sw s0,44(sp) + 300381a: 1800 addi s0,sp,48 + 300381c: fca42e23 sw a0,-36(s0) + 3003820: fdc42783 lw a5,-36(s0) + 3003824: fef42623 sw a5,-20(s0) + 3003828: fec42703 lw a4,-20(s0) + 300382c: 479d li a5,7 + 300382e: 00e7f663 bgeu a5,a4,300383a + 3003832: 47a1 li a5,8 + 3003834: fef42623 sw a5,-20(s0) + 3003838: a031 j 3003844 + 300383a: fec42783 lw a5,-20(s0) + 300383e: 0785 addi a5,a5,1 + 3003840: fef42623 sw a5,-20(s0) + 3003844: fec42783 lw a5,-20(s0) + 3003848: 853e mv a0,a5 + 300384a: 5432 lw s0,44(sp) + 300384c: 6145 addi sp,sp,48 + 300384e: 8082 ret + +03003850 : + 3003850: 7179 addi sp,sp,-48 + 3003852: d606 sw ra,44(sp) + 3003854: d422 sw s0,40(sp) + 3003856: 1800 addi s0,sp,48 + 3003858: fca42e23 sw a0,-36(s0) + 300385c: fcb42c23 sw a1,-40(s0) + 3003860: fdc42783 lw a5,-36(s0) + 3003864: eb89 bnez a5,3003876 + 3003866: 34d00593 li a1,845 + 300386a: 030067b7 lui a5,0x3006 + 300386e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003872: 2ad5 jal ra,3003a66 + 3003874: a001 j 3003874 + 3003876: 040007b7 lui a5,0x4000 + 300387a: 4947a783 lw a5,1172(a5) # 4000494 + 300387e: eb89 bnez a5,3003890 + 3003880: 34e00593 li a1,846 + 3003884: 030067b7 lui a5,0x3006 + 3003888: 4f478513 addi a0,a5,1268 # 30064f4 + 300388c: 2ae9 jal ra,3003a66 + 300388e: a001 j 300388e + 3003890: 040007b7 lui a5,0x4000 + 3003894: 4947a783 lw a5,1172(a5) # 4000494 + 3003898: fef42623 sw a5,-20(s0) + 300389c: fdc42783 lw a5,-36(s0) + 30038a0: 279e lhu a5,8(a5) + 30038a2: 873e mv a4,a5 + 30038a4: fec42783 lw a5,-20(s0) + 30038a8: 97ba add a5,a5,a4 + 30038aa: fef42423 sw a5,-24(s0) + 30038ae: fe842783 lw a5,-24(s0) + 30038b2: 439c lw a5,0(a5) + 30038b4: fef42223 sw a5,-28(s0) + 30038b8: fd842783 lw a5,-40(s0) + 30038bc: 8b85 andi a5,a5,1 + 30038be: c7c1 beqz a5,3003946 + 30038c0: fe442783 lw a5,-28(s0) + 30038c4: 9fa1 uxth a5 + 30038c6: 01079713 slli a4,a5,0x10 + 30038ca: 8741 srai a4,a4,0x10 + 30038cc: fdc42783 lw a5,-36(s0) + 30038d0: 27bc lbu a5,10(a5) + 30038d2: 86be mv a3,a5 + 30038d4: 4785 li a5,1 + 30038d6: 00d797b3 sll a5,a5,a3 + 30038da: 07c2 slli a5,a5,0x10 + 30038dc: 87c1 srai a5,a5,0x10 + 30038de: 8fd9 or a5,a5,a4 + 30038e0: 07c2 slli a5,a5,0x10 + 30038e2: 87c1 srai a5,a5,0x10 + 30038e4: 01079693 slli a3,a5,0x10 + 30038e8: 82c1 srli a3,a3,0x10 + 30038ea: fe442783 lw a5,-28(s0) + 30038ee: 6741 lui a4,0x10 + 30038f0: 177d addi a4,a4,-1 # ffff + 30038f2: 8f75 and a4,a4,a3 + 30038f4: 76c1 lui a3,0xffff0 + 30038f6: 8ff5 and a5,a5,a3 + 30038f8: 8fd9 or a5,a5,a4 + 30038fa: fef42223 sw a5,-28(s0) + 30038fe: fe442783 lw a5,-28(s0) + 3003902: 83c1 srli a5,a5,0x10 + 3003904: 9fa1 uxth a5 + 3003906: 01079713 slli a4,a5,0x10 + 300390a: 8741 srai a4,a4,0x10 + 300390c: fdc42783 lw a5,-36(s0) + 3003910: 27bc lbu a5,10(a5) + 3003912: 86be mv a3,a5 + 3003914: 4785 li a5,1 + 3003916: 00d797b3 sll a5,a5,a3 + 300391a: 07c2 slli a5,a5,0x10 + 300391c: 87c1 srai a5,a5,0x10 + 300391e: fff7c793 not a5,a5 + 3003922: 07c2 slli a5,a5,0x10 + 3003924: 87c1 srai a5,a5,0x10 + 3003926: 8ff9 and a5,a5,a4 + 3003928: 07c2 slli a5,a5,0x10 + 300392a: 87c1 srai a5,a5,0x10 + 300392c: 01079713 slli a4,a5,0x10 + 3003930: 8341 srli a4,a4,0x10 + 3003932: fe442783 lw a5,-28(s0) + 3003936: 0742 slli a4,a4,0x10 + 3003938: 66c1 lui a3,0x10 + 300393a: 16fd addi a3,a3,-1 # ffff + 300393c: 8ff5 and a5,a5,a3 + 300393e: 8fd9 or a5,a5,a4 + 3003940: fef42223 sw a5,-28(s0) + 3003944: a059 j 30039ca + 3003946: fe442783 lw a5,-28(s0) + 300394a: 9fa1 uxth a5 + 300394c: 01079713 slli a4,a5,0x10 + 3003950: 8741 srai a4,a4,0x10 + 3003952: fdc42783 lw a5,-36(s0) + 3003956: 27bc lbu a5,10(a5) + 3003958: 86be mv a3,a5 + 300395a: 4785 li a5,1 + 300395c: 00d797b3 sll a5,a5,a3 + 3003960: 07c2 slli a5,a5,0x10 + 3003962: 87c1 srai a5,a5,0x10 + 3003964: fff7c793 not a5,a5 + 3003968: 07c2 slli a5,a5,0x10 + 300396a: 87c1 srai a5,a5,0x10 + 300396c: 8ff9 and a5,a5,a4 + 300396e: 07c2 slli a5,a5,0x10 + 3003970: 87c1 srai a5,a5,0x10 + 3003972: 01079693 slli a3,a5,0x10 + 3003976: 82c1 srli a3,a3,0x10 + 3003978: fe442783 lw a5,-28(s0) + 300397c: 6741 lui a4,0x10 + 300397e: 177d addi a4,a4,-1 # ffff + 3003980: 8f75 and a4,a4,a3 + 3003982: 76c1 lui a3,0xffff0 + 3003984: 8ff5 and a5,a5,a3 + 3003986: 8fd9 or a5,a5,a4 + 3003988: fef42223 sw a5,-28(s0) + 300398c: fe442783 lw a5,-28(s0) + 3003990: 83c1 srli a5,a5,0x10 + 3003992: 9fa1 uxth a5 + 3003994: 01079713 slli a4,a5,0x10 + 3003998: 8741 srai a4,a4,0x10 + 300399a: fdc42783 lw a5,-36(s0) + 300399e: 27bc lbu a5,10(a5) + 30039a0: 86be mv a3,a5 + 30039a2: 4785 li a5,1 + 30039a4: 00d797b3 sll a5,a5,a3 + 30039a8: 07c2 slli a5,a5,0x10 + 30039aa: 87c1 srai a5,a5,0x10 + 30039ac: 8fd9 or a5,a5,a4 + 30039ae: 07c2 slli a5,a5,0x10 + 30039b0: 87c1 srai a5,a5,0x10 + 30039b2: 01079713 slli a4,a5,0x10 + 30039b6: 8341 srli a4,a4,0x10 + 30039b8: fe442783 lw a5,-28(s0) + 30039bc: 0742 slli a4,a4,0x10 + 30039be: 66c1 lui a3,0x10 + 30039c0: 16fd addi a3,a3,-1 # ffff + 30039c2: 8ff5 and a5,a5,a3 + 30039c4: 8fd9 or a5,a5,a4 + 30039c6: fef42223 sw a5,-28(s0) + 30039ca: fe442703 lw a4,-28(s0) + 30039ce: fe842783 lw a5,-24(s0) + 30039d2: c398 sw a4,0(a5) + 30039d4: 0001 nop + 30039d6: 50b2 lw ra,44(sp) + 30039d8: 5422 lw s0,40(sp) + 30039da: 6145 addi sp,sp,48 + 30039dc: 8082 ret + +030039de : + 30039de: 7179 addi sp,sp,-48 + 30039e0: d606 sw ra,44(sp) + 30039e2: d422 sw s0,40(sp) + 30039e4: 1800 addi s0,sp,48 + 30039e6: fca42e23 sw a0,-36(s0) + 30039ea: fdc42783 lw a5,-36(s0) + 30039ee: eb89 bnez a5,3003a00 + 30039f0: 36500593 li a1,869 + 30039f4: 030067b7 lui a5,0x3006 + 30039f8: 4f478513 addi a0,a5,1268 # 30064f4 + 30039fc: 20ad jal ra,3003a66 + 30039fe: a001 j 30039fe + 3003a00: 040007b7 lui a5,0x4000 + 3003a04: 4947a783 lw a5,1172(a5) # 4000494 + 3003a08: eb89 bnez a5,3003a1a + 3003a0a: 36600593 li a1,870 + 3003a0e: 030067b7 lui a5,0x3006 + 3003a12: 4f478513 addi a0,a5,1268 # 30064f4 + 3003a16: 2881 jal ra,3003a66 + 3003a18: a001 j 3003a18 + 3003a1a: 040007b7 lui a5,0x4000 + 3003a1e: 4947a783 lw a5,1172(a5) # 4000494 + 3003a22: fef42623 sw a5,-20(s0) + 3003a26: fdc42783 lw a5,-36(s0) + 3003a2a: 279e lhu a5,8(a5) + 3003a2c: 873e mv a4,a5 + 3003a2e: fec42783 lw a5,-20(s0) + 3003a32: 97ba add a5,a5,a4 + 3003a34: fef42423 sw a5,-24(s0) + 3003a38: fe842783 lw a5,-24(s0) + 3003a3c: 439c lw a5,0(a5) + 3003a3e: fef42223 sw a5,-28(s0) + 3003a42: fe442783 lw a5,-28(s0) + 3003a46: 9fa1 uxth a5 + 3003a48: 873e mv a4,a5 + 3003a4a: fdc42783 lw a5,-36(s0) + 3003a4e: 27bc lbu a5,10(a5) + 3003a50: 40f757b3 sra a5,a4,a5 + 3003a54: 8b85 andi a5,a5,1 + 3003a56: 00f037b3 snez a5,a5 + 3003a5a: 9f81 uxtb a5 + 3003a5c: 853e mv a0,a5 + 3003a5e: 50b2 lw ra,44(sp) + 3003a60: 5422 lw s0,40(sp) + 3003a62: 6145 addi sp,sp,48 + 3003a64: 8082 ret + +03003a66 : + 3003a66: c48fe06f j 3001eae + +03003a6a : + 3003a6a: 7179 addi sp,sp,-48 + 3003a6c: d606 sw ra,44(sp) + 3003a6e: d422 sw s0,40(sp) + 3003a70: 1800 addi s0,sp,48 + 3003a72: fca42e23 sw a0,-36(s0) + 3003a76: fcb42c23 sw a1,-40(s0) + 3003a7a: fdc42783 lw a5,-36(s0) + 3003a7e: eb89 bnez a5,3003a90 + 3003a80: 37900593 li a1,889 + 3003a84: 030067b7 lui a5,0x3006 + 3003a88: 4f478513 addi a0,a5,1268 # 30064f4 + 3003a8c: 3fe9 jal ra,3003a66 + 3003a8e: a001 j 3003a8e + 3003a90: 040007b7 lui a5,0x4000 + 3003a94: 4947a783 lw a5,1172(a5) # 4000494 + 3003a98: eb89 bnez a5,3003aaa + 3003a9a: 37a00593 li a1,890 + 3003a9e: 030067b7 lui a5,0x3006 + 3003aa2: 4f478513 addi a0,a5,1268 # 30064f4 + 3003aa6: 37c1 jal ra,3003a66 + 3003aa8: a001 j 3003aa8 + 3003aaa: 040007b7 lui a5,0x4000 + 3003aae: 4947a783 lw a5,1172(a5) # 4000494 + 3003ab2: fef42623 sw a5,-20(s0) + 3003ab6: fdc42783 lw a5,-36(s0) + 3003aba: 279e lhu a5,8(a5) + 3003abc: 873e mv a4,a5 + 3003abe: fec42783 lw a5,-20(s0) + 3003ac2: 97ba add a5,a5,a4 + 3003ac4: fef42423 sw a5,-24(s0) + 3003ac8: fe842783 lw a5,-24(s0) + 3003acc: 439c lw a5,0(a5) + 3003ace: fef42223 sw a5,-28(s0) + 3003ad2: fd842783 lw a5,-40(s0) + 3003ad6: 8b85 andi a5,a5,1 + 3003ad8: c3a9 beqz a5,3003b1a + 3003ada: fe442783 lw a5,-28(s0) + 3003ade: 83c1 srli a5,a5,0x10 + 3003ae0: 9fa1 uxth a5 + 3003ae2: 01079713 slli a4,a5,0x10 + 3003ae6: 8741 srai a4,a4,0x10 + 3003ae8: fdc42783 lw a5,-36(s0) + 3003aec: 27bc lbu a5,10(a5) + 3003aee: 86be mv a3,a5 + 3003af0: 4785 li a5,1 + 3003af2: 00d797b3 sll a5,a5,a3 + 3003af6: 07c2 slli a5,a5,0x10 + 3003af8: 87c1 srai a5,a5,0x10 + 3003afa: 8fd9 or a5,a5,a4 + 3003afc: 07c2 slli a5,a5,0x10 + 3003afe: 87c1 srai a5,a5,0x10 + 3003b00: 01079713 slli a4,a5,0x10 + 3003b04: 8341 srli a4,a4,0x10 + 3003b06: fe442783 lw a5,-28(s0) + 3003b0a: 0742 slli a4,a4,0x10 + 3003b0c: 66c1 lui a3,0x10 + 3003b0e: 16fd addi a3,a3,-1 # ffff + 3003b10: 8ff5 and a5,a5,a3 + 3003b12: 8fd9 or a5,a5,a4 + 3003b14: fef42223 sw a5,-28(s0) + 3003b18: a0a1 j 3003b60 + 3003b1a: fe442783 lw a5,-28(s0) + 3003b1e: 83c1 srli a5,a5,0x10 + 3003b20: 9fa1 uxth a5 + 3003b22: 01079713 slli a4,a5,0x10 + 3003b26: 8741 srai a4,a4,0x10 + 3003b28: fdc42783 lw a5,-36(s0) + 3003b2c: 27bc lbu a5,10(a5) + 3003b2e: 86be mv a3,a5 + 3003b30: 4785 li a5,1 + 3003b32: 00d797b3 sll a5,a5,a3 + 3003b36: 07c2 slli a5,a5,0x10 + 3003b38: 87c1 srai a5,a5,0x10 + 3003b3a: fff7c793 not a5,a5 + 3003b3e: 07c2 slli a5,a5,0x10 + 3003b40: 87c1 srai a5,a5,0x10 + 3003b42: 8ff9 and a5,a5,a4 + 3003b44: 07c2 slli a5,a5,0x10 + 3003b46: 87c1 srai a5,a5,0x10 + 3003b48: 01079713 slli a4,a5,0x10 + 3003b4c: 8341 srli a4,a4,0x10 + 3003b4e: fe442783 lw a5,-28(s0) + 3003b52: 0742 slli a4,a4,0x10 + 3003b54: 66c1 lui a3,0x10 + 3003b56: 16fd addi a3,a3,-1 # ffff + 3003b58: 8ff5 and a5,a5,a3 + 3003b5a: 8fd9 or a5,a5,a4 + 3003b5c: fef42223 sw a5,-28(s0) + 3003b60: fe442703 lw a4,-28(s0) + 3003b64: fe842783 lw a5,-24(s0) + 3003b68: c398 sw a4,0(a5) + 3003b6a: 0001 nop + 3003b6c: 50b2 lw ra,44(sp) + 3003b6e: 5422 lw s0,40(sp) + 3003b70: 6145 addi sp,sp,48 + 3003b72: 8082 ret + +03003b74 : + 3003b74: 7179 addi sp,sp,-48 + 3003b76: d606 sw ra,44(sp) + 3003b78: d422 sw s0,40(sp) + 3003b7a: 1800 addi s0,sp,48 + 3003b7c: fca42e23 sw a0,-36(s0) + 3003b80: fdc42783 lw a5,-36(s0) + 3003b84: eb89 bnez a5,3003b96 + 3003b86: 38f00593 li a1,911 + 3003b8a: 030067b7 lui a5,0x3006 + 3003b8e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003b92: 3dd1 jal ra,3003a66 + 3003b94: a001 j 3003b94 + 3003b96: 040007b7 lui a5,0x4000 + 3003b9a: 4947a783 lw a5,1172(a5) # 4000494 + 3003b9e: eb89 bnez a5,3003bb0 + 3003ba0: 39000593 li a1,912 + 3003ba4: 030067b7 lui a5,0x3006 + 3003ba8: 4f478513 addi a0,a5,1268 # 30064f4 + 3003bac: 3d6d jal ra,3003a66 + 3003bae: a001 j 3003bae + 3003bb0: 040007b7 lui a5,0x4000 + 3003bb4: 4947a783 lw a5,1172(a5) # 4000494 + 3003bb8: fef42623 sw a5,-20(s0) + 3003bbc: fdc42783 lw a5,-36(s0) + 3003bc0: 279e lhu a5,8(a5) + 3003bc2: 873e mv a4,a5 + 3003bc4: fec42783 lw a5,-20(s0) + 3003bc8: 97ba add a5,a5,a4 + 3003bca: fef42423 sw a5,-24(s0) + 3003bce: fe842783 lw a5,-24(s0) + 3003bd2: 439c lw a5,0(a5) + 3003bd4: fef42223 sw a5,-28(s0) + 3003bd8: fe442783 lw a5,-28(s0) + 3003bdc: 83c1 srli a5,a5,0x10 + 3003bde: 9fa1 uxth a5 + 3003be0: 873e mv a4,a5 + 3003be2: fdc42783 lw a5,-36(s0) + 3003be6: 27bc lbu a5,10(a5) + 3003be8: 40f757b3 sra a5,a4,a5 + 3003bec: 8b85 andi a5,a5,1 + 3003bee: 00f037b3 snez a5,a5 + 3003bf2: 9f81 uxtb a5 + 3003bf4: 853e mv a0,a5 + 3003bf6: 50b2 lw ra,44(sp) + 3003bf8: 5422 lw s0,40(sp) + 3003bfa: 6145 addi sp,sp,48 + 3003bfc: 8082 ret + +03003bfe : + 3003bfe: 7179 addi sp,sp,-48 + 3003c00: d606 sw ra,44(sp) + 3003c02: d422 sw s0,40(sp) + 3003c04: 1800 addi s0,sp,48 + 3003c06: fca42e23 sw a0,-36(s0) + 3003c0a: fcb42c23 sw a1,-40(s0) + 3003c0e: fdc42783 lw a5,-36(s0) + 3003c12: eb89 bnez a5,3003c24 + 3003c14: 3a200593 li a1,930 + 3003c18: 030067b7 lui a5,0x3006 + 3003c1c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003c20: 3599 jal ra,3003a66 + 3003c22: a001 j 3003c22 + 3003c24: 040007b7 lui a5,0x4000 + 3003c28: 4947a783 lw a5,1172(a5) # 4000494 + 3003c2c: eb89 bnez a5,3003c3e + 3003c2e: 3a300593 li a1,931 + 3003c32: 030067b7 lui a5,0x3006 + 3003c36: 4f478513 addi a0,a5,1268 # 30064f4 + 3003c3a: 3535 jal ra,3003a66 + 3003c3c: a001 j 3003c3c + 3003c3e: 040007b7 lui a5,0x4000 + 3003c42: 4947a783 lw a5,1172(a5) # 4000494 + 3003c46: fef42623 sw a5,-20(s0) + 3003c4a: fdc42783 lw a5,-36(s0) + 3003c4e: 279e lhu a5,8(a5) + 3003c50: 873e mv a4,a5 + 3003c52: fec42783 lw a5,-20(s0) + 3003c56: 97ba add a5,a5,a4 + 3003c58: fef42423 sw a5,-24(s0) + 3003c5c: fe842783 lw a5,-24(s0) + 3003c60: 43dc lw a5,4(a5) + 3003c62: fef42223 sw a5,-28(s0) + 3003c66: fd842783 lw a5,-40(s0) + 3003c6a: cf99 beqz a5,3003c88 + 3003c6c: fe442783 lw a5,-28(s0) + 3003c70: 0017e793 ori a5,a5,1 + 3003c74: fef42223 sw a5,-28(s0) + 3003c78: fe442783 lw a5,-28(s0) + 3003c7c: 7741 lui a4,0xffff0 + 3003c7e: 177d addi a4,a4,-1 # fffeffff + 3003c80: 8ff9 and a5,a5,a4 + 3003c82: fef42223 sw a5,-28(s0) + 3003c86: a829 j 3003ca0 + 3003c88: fe442783 lw a5,-28(s0) + 3003c8c: 9bf9 andi a5,a5,-2 + 3003c8e: fef42223 sw a5,-28(s0) + 3003c92: fe442783 lw a5,-28(s0) + 3003c96: 7741 lui a4,0xffff0 + 3003c98: 177d addi a4,a4,-1 # fffeffff + 3003c9a: 8ff9 and a5,a5,a4 + 3003c9c: fef42223 sw a5,-28(s0) + 3003ca0: fe442703 lw a4,-28(s0) + 3003ca4: fe842783 lw a5,-24(s0) + 3003ca8: c3d8 sw a4,4(a5) + 3003caa: 0001 nop + 3003cac: 50b2 lw ra,44(sp) + 3003cae: 5422 lw s0,40(sp) + 3003cb0: 6145 addi sp,sp,48 + 3003cb2: 8082 ret + +03003cb4 : + 3003cb4: 7179 addi sp,sp,-48 + 3003cb6: d606 sw ra,44(sp) + 3003cb8: d422 sw s0,40(sp) + 3003cba: 1800 addi s0,sp,48 + 3003cbc: fca42e23 sw a0,-36(s0) + 3003cc0: fdc42783 lw a5,-36(s0) + 3003cc4: eb89 bnez a5,3003cd6 + 3003cc6: 3ba00593 li a1,954 + 3003cca: 030067b7 lui a5,0x3006 + 3003cce: 4f478513 addi a0,a5,1268 # 30064f4 + 3003cd2: 3b51 jal ra,3003a66 + 3003cd4: a001 j 3003cd4 + 3003cd6: 040007b7 lui a5,0x4000 + 3003cda: 4947a783 lw a5,1172(a5) # 4000494 + 3003cde: eb89 bnez a5,3003cf0 + 3003ce0: 3bb00593 li a1,955 + 3003ce4: 030067b7 lui a5,0x3006 + 3003ce8: 4f478513 addi a0,a5,1268 # 30064f4 + 3003cec: 3bad jal ra,3003a66 + 3003cee: a001 j 3003cee + 3003cf0: 040007b7 lui a5,0x4000 + 3003cf4: 4947a783 lw a5,1172(a5) # 4000494 + 3003cf8: fef42623 sw a5,-20(s0) + 3003cfc: fdc42783 lw a5,-36(s0) + 3003d00: 279e lhu a5,8(a5) + 3003d02: 873e mv a4,a5 + 3003d04: fec42783 lw a5,-20(s0) + 3003d08: 97ba add a5,a5,a4 + 3003d0a: fef42423 sw a5,-24(s0) + 3003d0e: fe842783 lw a5,-24(s0) + 3003d12: 43dc lw a5,4(a5) + 3003d14: 8b85 andi a5,a5,1 + 3003d16: 9f81 uxtb a5 + 3003d18: c399 beqz a5,3003d1e + 3003d1a: 4785 li a5,1 + 3003d1c: a011 j 3003d20 + 3003d1e: 4781 li a5,0 + 3003d20: fef42223 sw a5,-28(s0) + 3003d24: fe442783 lw a5,-28(s0) + 3003d28: 853e mv a0,a5 + 3003d2a: 50b2 lw ra,44(sp) + 3003d2c: 5422 lw s0,40(sp) + 3003d2e: 6145 addi sp,sp,48 + 3003d30: 8082 ret + +03003d32 : + 3003d32: 7179 addi sp,sp,-48 + 3003d34: d606 sw ra,44(sp) + 3003d36: d422 sw s0,40(sp) + 3003d38: 1800 addi s0,sp,48 + 3003d3a: fca42e23 sw a0,-36(s0) + 3003d3e: fcb42c23 sw a1,-40(s0) + 3003d42: fdc42783 lw a5,-36(s0) + 3003d46: eb89 bnez a5,3003d58 + 3003d48: 3cc00593 li a1,972 + 3003d4c: 030067b7 lui a5,0x3006 + 3003d50: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d54: 3b09 jal ra,3003a66 + 3003d56: a001 j 3003d56 + 3003d58: 040007b7 lui a5,0x4000 + 3003d5c: 4947a783 lw a5,1172(a5) # 4000494 + 3003d60: eb89 bnez a5,3003d72 + 3003d62: 3cd00593 li a1,973 + 3003d66: 030067b7 lui a5,0x3006 + 3003d6a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d6e: 39e5 jal ra,3003a66 + 3003d70: a001 j 3003d70 + 3003d72: 040007b7 lui a5,0x4000 + 3003d76: 4947a703 lw a4,1172(a5) # 4000494 + 3003d7a: 100007b7 lui a5,0x10000 + 3003d7e: 00f70a63 beq a4,a5,3003d92 + 3003d82: 3ce00593 li a1,974 + 3003d86: 030067b7 lui a5,0x3006 + 3003d8a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d8e: 39e1 jal ra,3003a66 + 3003d90: a001 j 3003d90 + 3003d92: fd842503 lw a0,-40(s0) + 3003d96: ea1fe0ef jal ra,3002c36 + 3003d9a: 87aa mv a5,a0 + 3003d9c: 0017c793 xori a5,a5,1 + 3003da0: 9f81 uxtb a5 + 3003da2: cb89 beqz a5,3003db4 + 3003da4: 3cf00593 li a1,975 + 3003da8: 030067b7 lui a5,0x3006 + 3003dac: 4f478513 addi a0,a5,1268 # 30064f4 + 3003db0: 395d jal ra,3003a66 + 3003db2: a89d j 3003e28 + 3003db4: 040007b7 lui a5,0x4000 + 3003db8: 4947a783 lw a5,1172(a5) # 4000494 + 3003dbc: fef42623 sw a5,-20(s0) + 3003dc0: fdc42783 lw a5,-36(s0) + 3003dc4: 279e lhu a5,8(a5) + 3003dc6: 873e mv a4,a5 + 3003dc8: fec42783 lw a5,-20(s0) + 3003dcc: 97ba add a5,a5,a4 + 3003dce: fef42423 sw a5,-24(s0) + 3003dd2: fd842703 lw a4,-40(s0) + 3003dd6: 478d li a5,3 + 3003dd8: 00f71a63 bne a4,a5,3003dec + 3003ddc: fe842703 lw a4,-24(s0) + 3003de0: 435c lw a5,4(a4) + 3003de2: 010006b7 lui a3,0x1000 + 3003de6: 8fd5 or a5,a5,a3 + 3003de8: c35c sw a5,4(a4) + 3003dea: a83d j 3003e28 + 3003dec: b67fe0ef jal ra,3002952 + 3003df0: 040007b7 lui a5,0x4000 + 3003df4: 4947a703 lw a4,1172(a5) # 4000494 + 3003df8: fd842783 lw a5,-40(s0) + 3003dfc: 8b8d andi a5,a5,3 + 3003dfe: 0ff7f693 andi a3,a5,255 + 3003e02: 10072783 lw a5,256(a4) + 3003e06: 8a8d andi a3,a3,3 + 3003e08: 0692 slli a3,a3,0x4 + 3003e0a: fcf7f793 andi a5,a5,-49 + 3003e0e: 8fd5 or a5,a5,a3 + 3003e10: 10f72023 sw a5,256(a4) + 3003e14: b67fe0ef jal ra,300297a + 3003e18: fe842703 lw a4,-24(s0) + 3003e1c: 435c lw a5,4(a4) + 3003e1e: ff0006b7 lui a3,0xff000 + 3003e22: 16fd addi a3,a3,-1 # feffffff + 3003e24: 8ff5 and a5,a5,a3 + 3003e26: c35c sw a5,4(a4) + 3003e28: 50b2 lw ra,44(sp) + 3003e2a: 5422 lw s0,40(sp) + 3003e2c: 6145 addi sp,sp,48 + 3003e2e: 8082 ret + +03003e30 : + 3003e30: 7179 addi sp,sp,-48 + 3003e32: d606 sw ra,44(sp) + 3003e34: d422 sw s0,40(sp) + 3003e36: 1800 addi s0,sp,48 + 3003e38: fca42e23 sw a0,-36(s0) + 3003e3c: fdc42783 lw a5,-36(s0) + 3003e40: eb89 bnez a5,3003e52 + 3003e42: 3e400593 li a1,996 + 3003e46: 030067b7 lui a5,0x3006 + 3003e4a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003e4e: 3921 jal ra,3003a66 + 3003e50: a001 j 3003e50 + 3003e52: 040007b7 lui a5,0x4000 + 3003e56: 4947a783 lw a5,1172(a5) # 4000494 + 3003e5a: eb89 bnez a5,3003e6c + 3003e5c: 3e500593 li a1,997 + 3003e60: 030067b7 lui a5,0x3006 + 3003e64: 4f478513 addi a0,a5,1268 # 30064f4 + 3003e68: 3efd jal ra,3003a66 + 3003e6a: a001 j 3003e6a + 3003e6c: 040007b7 lui a5,0x4000 + 3003e70: 4947a783 lw a5,1172(a5) # 4000494 + 3003e74: fef42623 sw a5,-20(s0) + 3003e78: fdc42783 lw a5,-36(s0) + 3003e7c: 279e lhu a5,8(a5) + 3003e7e: 873e mv a4,a5 + 3003e80: fec42783 lw a5,-20(s0) + 3003e84: 97ba add a5,a5,a4 + 3003e86: fef42423 sw a5,-24(s0) + 3003e8a: fe842783 lw a5,-24(s0) + 3003e8e: 43dc lw a5,4(a5) + 3003e90: 83e1 srli a5,a5,0x18 + 3003e92: 8b85 andi a5,a5,1 + 3003e94: 0ff7f713 andi a4,a5,255 + 3003e98: 4785 li a5,1 + 3003e9a: 00f71463 bne a4,a5,3003ea2 + 3003e9e: 478d li a5,3 + 3003ea0: a811 j 3003eb4 + 3003ea2: 040007b7 lui a5,0x4000 + 3003ea6: 4947a783 lw a5,1172(a5) # 4000494 + 3003eaa: 1007a783 lw a5,256(a5) + 3003eae: 8391 srli a5,a5,0x4 + 3003eb0: 8b8d andi a5,a5,3 + 3003eb2: 9f81 uxtb a5 + 3003eb4: 853e mv a0,a5 + 3003eb6: 50b2 lw ra,44(sp) + 3003eb8: 5422 lw s0,40(sp) + 3003eba: 6145 addi sp,sp,48 + 3003ebc: 8082 ret + +03003ebe : + 3003ebe: 7179 addi sp,sp,-48 + 3003ec0: d606 sw ra,44(sp) + 3003ec2: d422 sw s0,40(sp) + 3003ec4: 1800 addi s0,sp,48 + 3003ec6: fca42e23 sw a0,-36(s0) + 3003eca: fcb42c23 sw a1,-40(s0) + 3003ece: fdc42783 lw a5,-36(s0) + 3003ed2: eb89 bnez a5,3003ee4 + 3003ed4: 3f700593 li a1,1015 + 3003ed8: 030067b7 lui a5,0x3006 + 3003edc: 4f478513 addi a0,a5,1268 # 30064f4 + 3003ee0: 3659 jal ra,3003a66 + 3003ee2: a001 j 3003ee2 + 3003ee4: 040007b7 lui a5,0x4000 + 3003ee8: 4947a783 lw a5,1172(a5) # 4000494 + 3003eec: eb89 bnez a5,3003efe + 3003eee: 3f800593 li a1,1016 + 3003ef2: 030067b7 lui a5,0x3006 + 3003ef6: 4f478513 addi a0,a5,1268 # 30064f4 + 3003efa: 36b5 jal ra,3003a66 + 3003efc: a001 j 3003efc + 3003efe: fd842503 lw a0,-40(s0) + 3003f02: d75fe0ef jal ra,3002c76 + 3003f06: 87aa mv a5,a0 + 3003f08: 0017c793 xori a5,a5,1 + 3003f0c: 9f81 uxtb a5 + 3003f0e: cb89 beqz a5,3003f20 + 3003f10: 3f900593 li a1,1017 + 3003f14: 030067b7 lui a5,0x3006 + 3003f18: 4f478513 addi a0,a5,1268 # 30064f4 + 3003f1c: 36a9 jal ra,3003a66 + 3003f1e: a885 j 3003f8e + 3003f20: 040007b7 lui a5,0x4000 + 3003f24: 4947a783 lw a5,1172(a5) # 4000494 + 3003f28: fef42623 sw a5,-20(s0) + 3003f2c: fdc42783 lw a5,-36(s0) + 3003f30: 279e lhu a5,8(a5) + 3003f32: 873e mv a4,a5 + 3003f34: fec42783 lw a5,-20(s0) + 3003f38: 97ba add a5,a5,a4 + 3003f3a: fef42423 sw a5,-24(s0) + 3003f3e: fe842783 lw a5,-24(s0) + 3003f42: 43dc lw a5,4(a5) + 3003f44: 83e1 srli a5,a5,0x18 + 3003f46: 8b85 andi a5,a5,1 + 3003f48: 9f81 uxtb a5 + 3003f4a: fef42223 sw a5,-28(s0) + 3003f4e: fe442703 lw a4,-28(s0) + 3003f52: 4785 li a5,1 + 3003f54: 02f71163 bne a4,a5,3003f76 + 3003f58: fd842783 lw a5,-40(s0) + 3003f5c: 8b8d andi a5,a5,3 + 3003f5e: 0ff7f693 andi a3,a5,255 + 3003f62: fe842703 lw a4,-24(s0) + 3003f66: 431c lw a5,0(a4) + 3003f68: 8a8d andi a3,a3,3 + 3003f6a: 06a2 slli a3,a3,0x8 + 3003f6c: cff7f793 andi a5,a5,-769 + 3003f70: 8fd5 or a5,a5,a3 + 3003f72: c31c sw a5,0(a4) + 3003f74: a829 j 3003f8e + 3003f76: fd842783 lw a5,-40(s0) + 3003f7a: 8b8d andi a5,a5,3 + 3003f7c: 0ff7f693 andi a3,a5,255 + 3003f80: fe842703 lw a4,-24(s0) + 3003f84: 431c lw a5,0(a4) + 3003f86: 8a8d andi a3,a3,3 + 3003f88: 9bf1 andi a5,a5,-4 + 3003f8a: 8fd5 or a5,a5,a3 + 3003f8c: c31c sw a5,0(a4) + 3003f8e: 50b2 lw ra,44(sp) + 3003f90: 5422 lw s0,40(sp) + 3003f92: 6145 addi sp,sp,48 + 3003f94: 8082 ret + +03003f96 : + 3003f96: 7179 addi sp,sp,-48 + 3003f98: d606 sw ra,44(sp) + 3003f9a: d422 sw s0,40(sp) + 3003f9c: 1800 addi s0,sp,48 + 3003f9e: fca42e23 sw a0,-36(s0) + 3003fa2: fdc42783 lw a5,-36(s0) + 3003fa6: eb89 bnez a5,3003fb8 + 3003fa8: 40c00593 li a1,1036 + 3003fac: 030067b7 lui a5,0x3006 + 3003fb0: 4f478513 addi a0,a5,1268 # 30064f4 + 3003fb4: 3c4d jal ra,3003a66 + 3003fb6: a001 j 3003fb6 + 3003fb8: 040007b7 lui a5,0x4000 + 3003fbc: 4947a783 lw a5,1172(a5) # 4000494 + 3003fc0: eb89 bnez a5,3003fd2 + 3003fc2: 40d00593 li a1,1037 + 3003fc6: 030067b7 lui a5,0x3006 + 3003fca: 4f478513 addi a0,a5,1268 # 30064f4 + 3003fce: 3c61 jal ra,3003a66 + 3003fd0: a001 j 3003fd0 + 3003fd2: 040007b7 lui a5,0x4000 + 3003fd6: 4947a783 lw a5,1172(a5) # 4000494 + 3003fda: fef42623 sw a5,-20(s0) + 3003fde: fdc42783 lw a5,-36(s0) + 3003fe2: 279e lhu a5,8(a5) + 3003fe4: 873e mv a4,a5 + 3003fe6: fec42783 lw a5,-20(s0) + 3003fea: 97ba add a5,a5,a4 + 3003fec: fef42423 sw a5,-24(s0) + 3003ff0: fe842783 lw a5,-24(s0) + 3003ff4: 43dc lw a5,4(a5) + 3003ff6: 83e1 srli a5,a5,0x18 + 3003ff8: 8b85 andi a5,a5,1 + 3003ffa: 9f81 uxtb a5 + 3003ffc: fef42223 sw a5,-28(s0) + 3004000: fe442703 lw a4,-28(s0) + 3004004: 4785 li a5,1 + 3004006: 00f71963 bne a4,a5,3004018 + 300400a: fe842783 lw a5,-24(s0) + 300400e: 439c lw a5,0(a5) + 3004010: 83a1 srli a5,a5,0x8 + 3004012: 8b8d andi a5,a5,3 + 3004014: 9f81 uxtb a5 + 3004016: a031 j 3004022 + 3004018: fe842783 lw a5,-24(s0) + 300401c: 439c lw a5,0(a5) + 300401e: 8b8d andi a5,a5,3 + 3004020: 9f81 uxtb a5 + 3004022: 853e mv a0,a5 + 3004024: 50b2 lw ra,44(sp) + 3004026: 5422 lw s0,40(sp) + 3004028: 6145 addi sp,sp,48 + 300402a: 8082 ret + +0300402c : + 300402c: 7179 addi sp,sp,-48 + 300402e: d606 sw ra,44(sp) + 3004030: d422 sw s0,40(sp) + 3004032: 1800 addi s0,sp,48 + 3004034: fca42e23 sw a0,-36(s0) + 3004038: fcb42c23 sw a1,-40(s0) + 300403c: fdc42783 lw a5,-36(s0) + 3004040: eb89 bnez a5,3004052 + 3004042: 42100593 li a1,1057 + 3004046: 030067b7 lui a5,0x3006 + 300404a: 4f478513 addi a0,a5,1268 # 30064f4 + 300404e: 3c21 jal ra,3003a66 + 3004050: a001 j 3004050 + 3004052: 040007b7 lui a5,0x4000 + 3004056: 4947a783 lw a5,1172(a5) # 4000494 + 300405a: eb89 bnez a5,300406c + 300405c: 42200593 li a1,1058 + 3004060: 030067b7 lui a5,0x3006 + 3004064: 4f478513 addi a0,a5,1268 # 30064f4 + 3004068: 3afd jal ra,3003a66 + 300406a: a001 j 300406a + 300406c: 040007b7 lui a5,0x4000 + 3004070: 4947a783 lw a5,1172(a5) # 4000494 + 3004074: fef42623 sw a5,-20(s0) + 3004078: fdc42783 lw a5,-36(s0) + 300407c: 279e lhu a5,8(a5) + 300407e: 873e mv a4,a5 + 3004080: fec42783 lw a5,-20(s0) + 3004084: 97ba add a5,a5,a4 + 3004086: fef42423 sw a5,-24(s0) + 300408a: fd842783 lw a5,-40(s0) + 300408e: 8b85 andi a5,a5,1 + 3004090: 0ff7f693 andi a3,a5,255 + 3004094: fe842703 lw a4,-24(s0) + 3004098: 431c lw a5,0(a4) + 300409a: 8a85 andi a3,a3,1 + 300409c: 9bf9 andi a5,a5,-2 + 300409e: 8fd5 or a5,a5,a3 + 30040a0: c31c sw a5,0(a4) + 30040a2: 0001 nop + 30040a4: 50b2 lw ra,44(sp) + 30040a6: 5422 lw s0,40(sp) + 30040a8: 6145 addi sp,sp,48 + 30040aa: 8082 ret + +030040ac : + 30040ac: 7179 addi sp,sp,-48 + 30040ae: d606 sw ra,44(sp) + 30040b0: d422 sw s0,40(sp) + 30040b2: 1800 addi s0,sp,48 + 30040b4: fca42e23 sw a0,-36(s0) + 30040b8: fdc42783 lw a5,-36(s0) + 30040bc: eb89 bnez a5,30040ce + 30040be: 43000593 li a1,1072 + 30040c2: 030067b7 lui a5,0x3006 + 30040c6: 4f478513 addi a0,a5,1268 # 30064f4 + 30040ca: 3a71 jal ra,3003a66 + 30040cc: a001 j 30040cc + 30040ce: 040007b7 lui a5,0x4000 + 30040d2: 4947a783 lw a5,1172(a5) # 4000494 + 30040d6: eb89 bnez a5,30040e8 + 30040d8: 43100593 li a1,1073 + 30040dc: 030067b7 lui a5,0x3006 + 30040e0: 4f478513 addi a0,a5,1268 # 30064f4 + 30040e4: 3249 jal ra,3003a66 + 30040e6: a001 j 30040e6 + 30040e8: 040007b7 lui a5,0x4000 + 30040ec: 4947a783 lw a5,1172(a5) # 4000494 + 30040f0: fef42623 sw a5,-20(s0) + 30040f4: fdc42783 lw a5,-36(s0) + 30040f8: 279e lhu a5,8(a5) + 30040fa: 873e mv a4,a5 + 30040fc: fec42783 lw a5,-20(s0) + 3004100: 97ba add a5,a5,a4 + 3004102: fef42423 sw a5,-24(s0) + 3004106: fe842783 lw a5,-24(s0) + 300410a: 439c lw a5,0(a5) + 300410c: 8b85 andi a5,a5,1 + 300410e: 9f81 uxtb a5 + 3004110: 853e mv a0,a5 + 3004112: 50b2 lw ra,44(sp) + 3004114: 5422 lw s0,40(sp) + 3004116: 6145 addi sp,sp,48 + 3004118: 8082 ret + +0300411a : + 300411a: 7179 addi sp,sp,-48 + 300411c: d606 sw ra,44(sp) + 300411e: d422 sw s0,40(sp) + 3004120: 1800 addi s0,sp,48 + 3004122: fca42e23 sw a0,-36(s0) + 3004126: fcb42c23 sw a1,-40(s0) + 300412a: fdc42783 lw a5,-36(s0) + 300412e: eb89 bnez a5,3004140 + 3004130: 44000593 li a1,1088 + 3004134: 030067b7 lui a5,0x3006 + 3004138: 4f478513 addi a0,a5,1268 # 30064f4 + 300413c: 322d jal ra,3003a66 + 300413e: a001 j 300413e + 3004140: 040007b7 lui a5,0x4000 + 3004144: 4947a783 lw a5,1172(a5) # 4000494 + 3004148: eb89 bnez a5,300415a + 300414a: 44100593 li a1,1089 + 300414e: 030067b7 lui a5,0x3006 + 3004152: 4f478513 addi a0,a5,1268 # 30064f4 + 3004156: 3a01 jal ra,3003a66 + 3004158: a001 j 3004158 + 300415a: fd842703 lw a4,-40(s0) + 300415e: 4785 li a5,1 + 3004160: 00f70d63 beq a4,a5,300417a + 3004164: fd842783 lw a5,-40(s0) + 3004168: cb89 beqz a5,300417a + 300416a: 44200593 li a1,1090 + 300416e: 030067b7 lui a5,0x3006 + 3004172: 4f478513 addi a0,a5,1268 # 30064f4 + 3004176: 38c5 jal ra,3003a66 + 3004178: a20d j 300429a + 300417a: 040007b7 lui a5,0x4000 + 300417e: 4947a783 lw a5,1172(a5) # 4000494 + 3004182: fef42623 sw a5,-20(s0) + 3004186: fdc42783 lw a5,-36(s0) + 300418a: 279e lhu a5,8(a5) + 300418c: 873e mv a4,a5 + 300418e: fec42783 lw a5,-20(s0) + 3004192: 97ba add a5,a5,a4 + 3004194: fdc42703 lw a4,-36(s0) + 3004198: 2738 lbu a4,10(a4) + 300419a: 97ba add a5,a5,a4 + 300419c: fef42423 sw a5,-24(s0) + 30041a0: fd842703 lw a4,-40(s0) + 30041a4: 4785 li a5,1 + 30041a6: 02f71f63 bne a4,a5,30041e4 + 30041aa: fe842783 lw a5,-24(s0) + 30041ae: 439c lw a5,0(a5) + 30041b0: 83c1 srli a5,a5,0x10 + 30041b2: 8b85 andi a5,a5,1 + 30041b4: 0ff7f713 andi a4,a5,255 + 30041b8: 4785 li a5,1 + 30041ba: 02f71563 bne a4,a5,30041e4 + 30041be: fe842703 lw a4,-24(s0) + 30041c2: 431c lw a5,0(a4) + 30041c4: 76c1 lui a3,0xffff0 + 30041c6: 16fd addi a3,a3,-1 # fffeffff + 30041c8: 8ff5 and a5,a5,a3 + 30041ca: c31c sw a5,0(a4) + 30041cc: 040007b7 lui a5,0x4000 + 30041d0: 4987c783 lbu a5,1176(a5) # 4000498 + 30041d4: 0785 addi a5,a5,1 + 30041d6: 0ff7f713 andi a4,a5,255 + 30041da: 040007b7 lui a5,0x4000 + 30041de: 48e78c23 sb a4,1176(a5) # 4000498 + 30041e2: a089 j 3004224 + 30041e4: fd842783 lw a5,-40(s0) + 30041e8: ef95 bnez a5,3004224 + 30041ea: fe842783 lw a5,-24(s0) + 30041ee: 439c lw a5,0(a5) + 30041f0: 83c1 srli a5,a5,0x10 + 30041f2: 8b85 andi a5,a5,1 + 30041f4: 9f81 uxtb a5 + 30041f6: e79d bnez a5,3004224 + 30041f8: fe842703 lw a4,-24(s0) + 30041fc: 431c lw a5,0(a4) + 30041fe: 66c1 lui a3,0x10 + 3004200: 8fd5 or a5,a5,a3 + 3004202: c31c sw a5,0(a4) + 3004204: 040007b7 lui a5,0x4000 + 3004208: 4987c783 lbu a5,1176(a5) # 4000498 + 300420c: cf81 beqz a5,3004224 + 300420e: 040007b7 lui a5,0x4000 + 3004212: 4987c783 lbu a5,1176(a5) # 4000498 + 3004216: 17fd addi a5,a5,-1 + 3004218: 0ff7f713 andi a4,a5,255 + 300421c: 040007b7 lui a5,0x4000 + 3004220: 48e78c23 sb a4,1176(a5) # 4000498 + 3004224: 040007b7 lui a5,0x4000 + 3004228: 4987c783 lbu a5,1176(a5) # 4000498 + 300422c: eb85 bnez a5,300425c + 300422e: fd842783 lw a5,-40(s0) + 3004232: e78d bnez a5,300425c + 3004234: 10000737 lui a4,0x10000 + 3004238: 6785 lui a5,0x1 + 300423a: 973e add a4,a4,a5 + 300423c: a5072783 lw a5,-1456(a4) # ffffa50 + 3004240: 9bf9 andi a5,a5,-2 + 3004242: a4f72823 sw a5,-1456(a4) + 3004246: 10000737 lui a4,0x10000 + 300424a: 6785 lui a5,0x1 + 300424c: 973e add a4,a4,a5 + 300424e: a5072783 lw a5,-1456(a4) # ffffa50 + 3004252: 66c1 lui a3,0x10 + 3004254: 8fd5 or a5,a5,a3 + 3004256: a4f72823 sw a5,-1456(a4) + 300425a: a081 j 300429a + 300425c: 040007b7 lui a5,0x4000 + 3004260: 4987c783 lbu a5,1176(a5) # 4000498 + 3004264: cb9d beqz a5,300429a + 3004266: fd842703 lw a4,-40(s0) + 300426a: 4785 li a5,1 + 300426c: 02f71763 bne a4,a5,300429a + 3004270: 10000737 lui a4,0x10000 + 3004274: 6785 lui a5,0x1 + 3004276: 973e add a4,a4,a5 + 3004278: a5072783 lw a5,-1456(a4) # ffffa50 + 300427c: 76c1 lui a3,0xffff0 + 300427e: 16fd addi a3,a3,-1 # fffeffff + 3004280: 8ff5 and a5,a5,a3 + 3004282: a4f72823 sw a5,-1456(a4) + 3004286: 10000737 lui a4,0x10000 + 300428a: 6785 lui a5,0x1 + 300428c: 973e add a4,a4,a5 + 300428e: a5072783 lw a5,-1456(a4) # ffffa50 + 3004292: 0017e793 ori a5,a5,1 + 3004296: a4f72823 sw a5,-1456(a4) + 300429a: 50b2 lw ra,44(sp) + 300429c: 5422 lw s0,40(sp) + 300429e: 6145 addi sp,sp,48 + 30042a0: 8082 ret + +030042a2 : + 30042a2: 7179 addi sp,sp,-48 + 30042a4: d606 sw ra,44(sp) + 30042a6: d422 sw s0,40(sp) + 30042a8: 1800 addi s0,sp,48 + 30042aa: fca42e23 sw a0,-36(s0) + 30042ae: fdc42783 lw a5,-36(s0) + 30042b2: eb91 bnez a5,30042c6 + 30042b4: 46200593 li a1,1122 + 30042b8: 030067b7 lui a5,0x3006 + 30042bc: 4f478513 addi a0,a5,1268 # 30064f4 + 30042c0: beffd0ef jal ra,3001eae + 30042c4: a001 j 30042c4 + 30042c6: 040007b7 lui a5,0x4000 + 30042ca: 4947a783 lw a5,1172(a5) # 4000494 + 30042ce: eb91 bnez a5,30042e2 + 30042d0: 46300593 li a1,1123 + 30042d4: 030067b7 lui a5,0x3006 + 30042d8: 4f478513 addi a0,a5,1268 # 30064f4 + 30042dc: bd3fd0ef jal ra,3001eae + 30042e0: a001 j 30042e0 + 30042e2: 040007b7 lui a5,0x4000 + 30042e6: 4947a783 lw a5,1172(a5) # 4000494 + 30042ea: fef42623 sw a5,-20(s0) + 30042ee: fdc42783 lw a5,-36(s0) + 30042f2: 279e lhu a5,8(a5) + 30042f4: 873e mv a4,a5 + 30042f6: fec42783 lw a5,-20(s0) + 30042fa: 97ba add a5,a5,a4 + 30042fc: fdc42703 lw a4,-36(s0) + 3004300: 2738 lbu a4,10(a4) + 3004302: 97ba add a5,a5,a4 + 3004304: fef42423 sw a5,-24(s0) + 3004308: fe842783 lw a5,-24(s0) + 300430c: 439c lw a5,0(a5) + 300430e: 83c1 srli a5,a5,0x10 + 3004310: 8b85 andi a5,a5,1 + 3004312: 9f81 uxtb a5 + 3004314: 0017c793 xori a5,a5,1 + 3004318: 9f81 uxtb a5 + 300431a: 853e mv a0,a5 + 300431c: 50b2 lw ra,44(sp) + 300431e: 5422 lw s0,40(sp) + 3004320: 6145 addi sp,sp,48 + 3004322: 8082 ret + +03004324 : + 3004324: 1101 addi sp,sp,-32 + 3004326: ce22 sw s0,28(sp) + 3004328: 1000 addi s0,sp,32 + 300432a: fea42623 sw a0,-20(s0) + 300432e: 0001 nop + 3004330: 140007b7 lui a5,0x14000 + 3004334: 4f9c lw a5,24(a5) + 3004336: 8395 srli a5,a5,0x5 + 3004338: 8b85 andi a5,a5,1 + 300433a: 0ff7f713 andi a4,a5,255 + 300433e: 4785 li a5,1 + 3004340: fef708e3 beq a4,a5,3004330 + 3004344: 14000737 lui a4,0x14000 + 3004348: fec42783 lw a5,-20(s0) + 300434c: 0ff7f693 andi a3,a5,255 + 3004350: 431c lw a5,0(a4) + 3004352: 0ff6f693 andi a3,a3,255 + 3004356: f007f793 andi a5,a5,-256 + 300435a: 8fd5 or a5,a5,a3 + 300435c: c31c sw a5,0(a4) + 300435e: 0001 nop + 3004360: 4472 lw s0,28(sp) + 3004362: 6105 addi sp,sp,32 + 3004364: 8082 ret + +03004366 : + 3004366: 7179 addi sp,sp,-48 + 3004368: d606 sw ra,44(sp) + 300436a: d422 sw s0,40(sp) + 300436c: 1800 addi s0,sp,48 + 300436e: fca42e23 sw a0,-36(s0) + 3004372: fe042623 sw zero,-20(s0) + 3004376: a00d j 3004398 + 3004378: fdc42783 lw a5,-36(s0) + 300437c: 00078783 lb a5,0(a5) # 14000000 + 3004380: 853e mv a0,a5 + 3004382: 374d jal ra,3004324 + 3004384: fdc42783 lw a5,-36(s0) + 3004388: 0785 addi a5,a5,1 + 300438a: fcf42e23 sw a5,-36(s0) + 300438e: fec42783 lw a5,-20(s0) + 3004392: 0785 addi a5,a5,1 + 3004394: fef42623 sw a5,-20(s0) + 3004398: fdc42783 lw a5,-36(s0) + 300439c: 00078783 lb a5,0(a5) + 30043a0: ffe1 bnez a5,3004378 + 30043a2: fec42783 lw a5,-20(s0) + 30043a6: 853e mv a0,a5 + 30043a8: 50b2 lw ra,44(sp) + 30043aa: 5422 lw s0,40(sp) + 30043ac: 6145 addi sp,sp,48 + 30043ae: 8082 ret + +030043b0 : + 30043b0: 7179 addi sp,sp,-48 + 30043b2: d622 sw s0,44(sp) + 30043b4: 1800 addi s0,sp,48 + 30043b6: fca42e23 sw a0,-36(s0) + 30043ba: fcb42c23 sw a1,-40(s0) + 30043be: 4785 li a5,1 + 30043c0: fef42623 sw a5,-20(s0) + 30043c4: a809 j 30043d6 + 30043c6: fec42703 lw a4,-20(s0) + 30043ca: fdc42783 lw a5,-36(s0) + 30043ce: 02f707b3 mul a5,a4,a5 + 30043d2: fef42623 sw a5,-20(s0) + 30043d6: fd842783 lw a5,-40(s0) + 30043da: fff78713 addi a4,a5,-1 + 30043de: fce42c23 sw a4,-40(s0) + 30043e2: f3f5 bnez a5,30043c6 + 30043e4: fec42783 lw a5,-20(s0) + 30043e8: 853e mv a0,a5 + 30043ea: 5432 lw s0,44(sp) + 30043ec: 6145 addi sp,sp,48 + 30043ee: 8082 ret + +030043f0 : + 30043f0: 7179 addi sp,sp,-48 + 30043f2: d622 sw s0,44(sp) + 30043f4: 1800 addi s0,sp,48 + 30043f6: fca42e23 sw a0,-36(s0) + 30043fa: fcb42c23 sw a1,-40(s0) + 30043fe: fe042623 sw zero,-20(s0) + 3004402: fd842783 lw a5,-40(s0) + 3004406: e78d bnez a5,3004430 + 3004408: 4781 li a5,0 + 300440a: a099 j 3004450 + 300440c: fec42783 lw a5,-20(s0) + 3004410: 0785 addi a5,a5,1 + 3004412: fef42623 sw a5,-20(s0) + 3004416: fec42703 lw a4,-20(s0) + 300441a: 47fd li a5,31 + 300441c: 00e7ee63 bltu a5,a4,3004438 + 3004420: fdc42703 lw a4,-36(s0) + 3004424: fd842783 lw a5,-40(s0) + 3004428: 02f757b3 divu a5,a4,a5 + 300442c: fcf42e23 sw a5,-36(s0) + 3004430: fdc42783 lw a5,-36(s0) + 3004434: ffe1 bnez a5,300440c + 3004436: a011 j 300443a + 3004438: 0001 nop + 300443a: fec42783 lw a5,-20(s0) + 300443e: c781 beqz a5,3004446 + 3004440: fec42783 lw a5,-20(s0) + 3004444: a011 j 3004448 + 3004446: 4785 li a5,1 + 3004448: fef42623 sw a5,-20(s0) + 300444c: fec42783 lw a5,-20(s0) + 3004450: 853e mv a0,a5 + 3004452: 5432 lw s0,44(sp) + 3004454: 6145 addi sp,sp,48 + 3004456: 8082 ret + +03004458 : + 3004458: 7179 addi sp,sp,-48 + 300445a: d606 sw ra,44(sp) + 300445c: d422 sw s0,40(sp) + 300445e: 1800 addi s0,sp,48 + 3004460: fca42e23 sw a0,-36(s0) + 3004464: fcb42c23 sw a1,-40(s0) + 3004468: fcc42a23 sw a2,-44(s0) + 300446c: a069 j 30044f6 + 300446e: fd442783 lw a5,-44(s0) + 3004472: 17fd addi a5,a5,-1 + 3004474: 85be mv a1,a5 + 3004476: fd842503 lw a0,-40(s0) + 300447a: 3f1d jal ra,30043b0 + 300447c: 872a mv a4,a0 + 300447e: fdc42783 lw a5,-36(s0) + 3004482: 02e7d7b3 divu a5,a5,a4 + 3004486: fef407a3 sb a5,-17(s0) + 300448a: fd442783 lw a5,-44(s0) + 300448e: 17fd addi a5,a5,-1 + 3004490: 85be mv a1,a5 + 3004492: fd842503 lw a0,-40(s0) + 3004496: 3f29 jal ra,30043b0 + 3004498: 872a mv a4,a0 + 300449a: fdc42783 lw a5,-36(s0) + 300449e: 02e7f7b3 remu a5,a5,a4 + 30044a2: fcf42e23 sw a5,-36(s0) + 30044a6: fd842703 lw a4,-40(s0) + 30044aa: 47a9 li a5,10 + 30044ac: 00f71963 bne a4,a5,30044be + 30044b0: fef44783 lbu a5,-17(s0) + 30044b4: 03078793 addi a5,a5,48 + 30044b8: 853e mv a0,a5 + 30044ba: 35ad jal ra,3004324 + 30044bc: a805 j 30044ec + 30044be: fd842703 lw a4,-40(s0) + 30044c2: 47c1 li a5,16 + 30044c4: 02f71d63 bne a4,a5,30044fe + 30044c8: fef44703 lbu a4,-17(s0) + 30044cc: 47a5 li a5,9 + 30044ce: 00e7e963 bltu a5,a4,30044e0 + 30044d2: fef44783 lbu a5,-17(s0) + 30044d6: 03078793 addi a5,a5,48 + 30044da: 853e mv a0,a5 + 30044dc: 35a1 jal ra,3004324 + 30044de: a039 j 30044ec + 30044e0: fef44783 lbu a5,-17(s0) + 30044e4: 03778793 addi a5,a5,55 + 30044e8: 853e mv a0,a5 + 30044ea: 3d2d jal ra,3004324 + 30044ec: fd442783 lw a5,-44(s0) + 30044f0: 17fd addi a5,a5,-1 + 30044f2: fcf42a23 sw a5,-44(s0) + 30044f6: fd442783 lw a5,-44(s0) + 30044fa: fbb5 bnez a5,300446e + 30044fc: a011 j 3004500 + 30044fe: 0001 nop + 3004500: 0001 nop + 3004502: 50b2 lw ra,44(sp) + 3004504: 5422 lw s0,40(sp) + 3004506: 6145 addi sp,sp,48 + 3004508: 8082 ret + +0300450a : + 300450a: 7179 addi sp,sp,-48 + 300450c: d606 sw ra,44(sp) + 300450e: d422 sw s0,40(sp) + 3004510: 1800 addi s0,sp,48 + 3004512: fca42e23 sw a0,-36(s0) + 3004516: fdc42783 lw a5,-36(s0) + 300451a: e791 bnez a5,3004526 + 300451c: 03000513 li a0,48 + 3004520: 3511 jal ra,3004324 + 3004522: 4785 li a5,1 + 3004524: a82d j 300455e + 3004526: fdc42783 lw a5,-36(s0) + 300452a: 0007db63 bgez a5,3004540 + 300452e: 02d00513 li a0,45 + 3004532: 3bcd jal ra,3004324 + 3004534: fdc42783 lw a5,-36(s0) + 3004538: 40f007b3 neg a5,a5 + 300453c: fcf42e23 sw a5,-36(s0) + 3004540: 45a9 li a1,10 + 3004542: fdc42503 lw a0,-36(s0) + 3004546: 356d jal ra,30043f0 + 3004548: fea42623 sw a0,-20(s0) + 300454c: fdc42783 lw a5,-36(s0) + 3004550: fec42603 lw a2,-20(s0) + 3004554: 45a9 li a1,10 + 3004556: 853e mv a0,a5 + 3004558: 3701 jal ra,3004458 + 300455a: fec42783 lw a5,-20(s0) + 300455e: 853e mv a0,a5 + 3004560: 50b2 lw ra,44(sp) + 3004562: 5422 lw s0,40(sp) + 3004564: 6145 addi sp,sp,48 + 3004566: 8082 ret + +03004568 : + 3004568: 7179 addi sp,sp,-48 + 300456a: d606 sw ra,44(sp) + 300456c: d422 sw s0,40(sp) + 300456e: 1800 addi s0,sp,48 + 3004570: fca42e23 sw a0,-36(s0) + 3004574: fdc42783 lw a5,-36(s0) + 3004578: e791 bnez a5,3004584 + 300457a: 03000513 li a0,48 + 300457e: 335d jal ra,3004324 + 3004580: 4785 li a5,1 + 3004582: a005 j 30045a2 + 3004584: fdc42783 lw a5,-36(s0) + 3004588: 45c1 li a1,16 + 300458a: 853e mv a0,a5 + 300458c: 3595 jal ra,30043f0 + 300458e: fea42623 sw a0,-20(s0) + 3004592: fec42603 lw a2,-20(s0) + 3004596: 45c1 li a1,16 + 3004598: fdc42503 lw a0,-36(s0) + 300459c: 3d75 jal ra,3004458 + 300459e: fec42783 lw a5,-20(s0) + 30045a2: 853e mv a0,a5 + 30045a4: 50b2 lw ra,44(sp) + 30045a6: 5422 lw s0,40(sp) + 30045a8: 6145 addi sp,sp,48 + 30045aa: 8082 ret + +030045ac : + 30045ac: 7139 addi sp,sp,-64 + 30045ae: de06 sw ra,60(sp) + 30045b0: dc22 sw s0,56(sp) + 30045b2: 0080 addi s0,sp,64 + 30045b4: fca42627 fsw fa0,-52(s0) + 30045b8: fca42423 sw a0,-56(s0) + 30045bc: fe042623 sw zero,-20(s0) + 30045c0: fcc42787 flw fa5,-52(s0) + 30045c4: f0000753 fmv.w.x fa4,zero + 30045c8: a0e797d3 flt.s a5,fa5,fa4 + 30045cc: cf99 beqz a5,30045ea + 30045ce: 02d00513 li a0,45 + 30045d2: 3b89 jal ra,3004324 + 30045d4: fec42783 lw a5,-20(s0) + 30045d8: 0785 addi a5,a5,1 + 30045da: fef42623 sw a5,-20(s0) + 30045de: fcc42787 flw fa5,-52(s0) + 30045e2: 20f797d3 fneg.s fa5,fa5 + 30045e6: fcf42627 fsw fa5,-52(s0) + 30045ea: fcc42787 flw fa5,-52(s0) + 30045ee: c00797d3 fcvt.w.s a5,fa5,rtz + 30045f2: fef42023 sw a5,-32(s0) + 30045f6: fc842783 lw a5,-56(s0) + 30045fa: 0785 addi a5,a5,1 + 30045fc: 85be mv a1,a5 + 30045fe: 4529 li a0,10 + 3004600: 3b45 jal ra,30043b0 + 3004602: fca42e23 sw a0,-36(s0) + 3004606: fdc42783 lw a5,-36(s0) + 300460a: d017f753 fcvt.s.wu fa4,a5 + 300460e: fe042783 lw a5,-32(s0) + 3004612: d007f7d3 fcvt.s.w fa5,a5 + 3004616: fcc42687 flw fa3,-52(s0) + 300461a: 08f6f7d3 fsub.s fa5,fa3,fa5 + 300461e: 10f777d3 fmul.s fa5,fa4,fa5 + 3004622: c00797d3 fcvt.w.s a5,fa5,rtz + 3004626: fef42423 sw a5,-24(s0) + 300462a: fe842703 lw a4,-24(s0) + 300462e: 47a9 li a5,10 + 3004630: 02f77733 remu a4,a4,a5 + 3004634: 4791 li a5,4 + 3004636: 00e7fb63 bgeu a5,a4,300464c + 300463a: fe842703 lw a4,-24(s0) + 300463e: 47a9 li a5,10 + 3004640: 02f757b3 divu a5,a4,a5 + 3004644: 0785 addi a5,a5,1 + 3004646: fef42423 sw a5,-24(s0) + 300464a: a801 j 300465a + 300464c: fe842703 lw a4,-24(s0) + 3004650: 47a9 li a5,10 + 3004652: 02f757b3 divu a5,a4,a5 + 3004656: fef42423 sw a5,-24(s0) + 300465a: fe042503 lw a0,-32(s0) + 300465e: 3575 jal ra,300450a + 3004660: 872a mv a4,a0 + 3004662: fec42783 lw a5,-20(s0) + 3004666: 97ba add a5,a5,a4 + 3004668: fef42623 sw a5,-20(s0) + 300466c: 02e00513 li a0,46 + 3004670: 3955 jal ra,3004324 + 3004672: fec42783 lw a5,-20(s0) + 3004676: 0785 addi a5,a5,1 + 3004678: fef42623 sw a5,-20(s0) + 300467c: 45a9 li a1,10 + 300467e: fe842503 lw a0,-24(s0) + 3004682: 33bd jal ra,30043f0 + 3004684: fca42c23 sw a0,-40(s0) + 3004688: fc842703 lw a4,-56(s0) + 300468c: fd842783 lw a5,-40(s0) + 3004690: 02e7f763 bgeu a5,a4,30046be + 3004694: fe042223 sw zero,-28(s0) + 3004698: a809 j 30046aa + 300469a: 03000513 li a0,48 + 300469e: 3159 jal ra,3004324 + 30046a0: fe442783 lw a5,-28(s0) + 30046a4: 0785 addi a5,a5,1 + 30046a6: fef42223 sw a5,-28(s0) + 30046aa: fc842703 lw a4,-56(s0) + 30046ae: fd842783 lw a5,-40(s0) + 30046b2: 40f707b3 sub a5,a4,a5 + 30046b6: fe442703 lw a4,-28(s0) + 30046ba: fef760e3 bltu a4,a5,300469a + 30046be: fe842783 lw a5,-24(s0) + 30046c2: fd842603 lw a2,-40(s0) + 30046c6: 45a9 li a1,10 + 30046c8: 853e mv a0,a5 + 30046ca: 3379 jal ra,3004458 + 30046cc: fec42703 lw a4,-20(s0) + 30046d0: fc842783 lw a5,-56(s0) + 30046d4: 97ba add a5,a5,a4 + 30046d6: fef42623 sw a5,-20(s0) + 30046da: fec42783 lw a5,-20(s0) + 30046de: 853e mv a0,a5 + 30046e0: 50f2 lw ra,60(sp) + 30046e2: 5462 lw s0,56(sp) + 30046e4: 6121 addi sp,sp,64 + 30046e6: 8082 ret + +030046e8 : + 30046e8: 7139 addi sp,sp,-64 + 30046ea: de06 sw ra,60(sp) + 30046ec: dc22 sw s0,56(sp) + 30046ee: 0080 addi s0,sp,64 + 30046f0: 87aa mv a5,a0 + 30046f2: fcb42423 sw a1,-56(s0) + 30046f6: fcf407a3 sb a5,-49(s0) + 30046fa: fe042623 sw zero,-20(s0) + 30046fe: fe0405a3 sb zero,-21(s0) + 3004702: fe042223 sw zero,-28(s0) + 3004706: fe042023 sw zero,-32(s0) + 300470a: fc042e23 sw zero,-36(s0) + 300470e: fc042c23 sw zero,-40(s0) + 3004712: fc042a23 sw zero,-44(s0) + 3004716: fcf40783 lb a5,-49(s0) + 300471a: fa878793 addi a5,a5,-88 + 300471e: 02000713 li a4,32 + 3004722: 14f76063 bltu a4,a5,3004862 + 3004726: 00279713 slli a4,a5,0x2 + 300472a: 030067b7 lui a5,0x3006 + 300472e: 54878793 addi a5,a5,1352 # 3006548 + 3004732: 97ba add a5,a5,a4 + 3004734: 439c lw a5,0(a5) + 3004736: 8782 jr a5 + 3004738: fc842783 lw a5,-56(s0) + 300473c: 439c lw a5,0(a5) + 300473e: 00478693 addi a3,a5,4 + 3004742: fc842703 lw a4,-56(s0) + 3004746: c314 sw a3,0(a4) + 3004748: 439c lw a5,0(a5) + 300474a: fef405a3 sb a5,-21(s0) + 300474e: feb40783 lb a5,-21(s0) + 3004752: 853e mv a0,a5 + 3004754: 3ec1 jal ra,3004324 + 3004756: fec42783 lw a5,-20(s0) + 300475a: 0785 addi a5,a5,1 + 300475c: fef42623 sw a5,-20(s0) + 3004760: aa19 j 3004876 + 3004762: fc842783 lw a5,-56(s0) + 3004766: 439c lw a5,0(a5) + 3004768: 00478693 addi a3,a5,4 + 300476c: fc842703 lw a4,-56(s0) + 3004770: c314 sw a3,0(a4) + 3004772: 439c lw a5,0(a5) + 3004774: fef42223 sw a5,-28(s0) + 3004778: fe442503 lw a0,-28(s0) + 300477c: 36ed jal ra,3004366 + 300477e: 87aa mv a5,a0 + 3004780: 873e mv a4,a5 + 3004782: fec42783 lw a5,-20(s0) + 3004786: 97ba add a5,a5,a4 + 3004788: fef42623 sw a5,-20(s0) + 300478c: a0ed j 3004876 + 300478e: fc842783 lw a5,-56(s0) + 3004792: 439c lw a5,0(a5) + 3004794: 00478693 addi a3,a5,4 + 3004798: fc842703 lw a4,-56(s0) + 300479c: c314 sw a3,0(a4) + 300479e: 439c lw a5,0(a5) + 30047a0: fef42023 sw a5,-32(s0) + 30047a4: fe042503 lw a0,-32(s0) + 30047a8: 338d jal ra,300450a + 30047aa: 872a mv a4,a0 + 30047ac: fec42783 lw a5,-20(s0) + 30047b0: 97ba add a5,a5,a4 + 30047b2: fef42623 sw a5,-20(s0) + 30047b6: a0c1 j 3004876 + 30047b8: fc842783 lw a5,-56(s0) + 30047bc: 439c lw a5,0(a5) + 30047be: 00478693 addi a3,a5,4 + 30047c2: fc842703 lw a4,-56(s0) + 30047c6: c314 sw a3,0(a4) + 30047c8: 439c lw a5,0(a5) + 30047ca: fcf42e23 sw a5,-36(s0) + 30047ce: fdc42783 lw a5,-36(s0) + 30047d2: 45a9 li a1,10 + 30047d4: 853e mv a0,a5 + 30047d6: 3929 jal ra,30043f0 + 30047d8: fca42823 sw a0,-48(s0) + 30047dc: fd042603 lw a2,-48(s0) + 30047e0: 45a9 li a1,10 + 30047e2: fdc42503 lw a0,-36(s0) + 30047e6: 398d jal ra,3004458 + 30047e8: fec42703 lw a4,-20(s0) + 30047ec: fd042783 lw a5,-48(s0) + 30047f0: 97ba add a5,a5,a4 + 30047f2: fef42623 sw a5,-20(s0) + 30047f6: a041 j 3004876 + 30047f8: fc842783 lw a5,-56(s0) + 30047fc: 439c lw a5,0(a5) + 30047fe: 00478693 addi a3,a5,4 + 3004802: fc842703 lw a4,-56(s0) + 3004806: c314 sw a3,0(a4) + 3004808: 439c lw a5,0(a5) + 300480a: fcf42c23 sw a5,-40(s0) + 300480e: fd842503 lw a0,-40(s0) + 3004812: 3b99 jal ra,3004568 + 3004814: 872a mv a4,a0 + 3004816: fec42783 lw a5,-20(s0) + 300481a: 97ba add a5,a5,a4 + 300481c: fef42623 sw a5,-20(s0) + 3004820: a899 j 3004876 + 3004822: fc842783 lw a5,-56(s0) + 3004826: 439c lw a5,0(a5) + 3004828: 079d addi a5,a5,7 + 300482a: 9be1 andi a5,a5,-8 + 300482c: 00878693 addi a3,a5,8 + 3004830: fc842703 lw a4,-56(s0) + 3004834: c314 sw a3,0(a4) + 3004836: 0047a803 lw a6,4(a5) + 300483a: 439c lw a5,0(a5) + 300483c: 853e mv a0,a5 + 300483e: 85c2 mv a1,a6 + 3004840: 75c010ef jal ra,3005f9c <__truncdfsf2> + 3004844: 20a507d3 fmv.s fa5,fa0 + 3004848: fcf42a27 fsw fa5,-44(s0) + 300484c: 4515 li a0,5 + 300484e: fd442507 flw fa0,-44(s0) + 3004852: 3ba9 jal ra,30045ac + 3004854: 872a mv a4,a0 + 3004856: fec42783 lw a5,-20(s0) + 300485a: 97ba add a5,a5,a4 + 300485c: fef42623 sw a5,-20(s0) + 3004860: a819 j 3004876 + 3004862: fcf40783 lb a5,-49(s0) + 3004866: 853e mv a0,a5 + 3004868: 3c75 jal ra,3004324 + 300486a: fec42783 lw a5,-20(s0) + 300486e: 0785 addi a5,a5,1 + 3004870: fef42623 sw a5,-20(s0) + 3004874: 0001 nop + 3004876: fec42783 lw a5,-20(s0) + 300487a: 853e mv a0,a5 + 300487c: 50f2 lw ra,60(sp) + 300487e: 5462 lw s0,56(sp) + 3004880: 6121 addi sp,sp,64 + 3004882: 8082 ret + +03004884 : + 3004884: 7139 addi sp,sp,-64 + 3004886: de06 sw ra,60(sp) + 3004888: dc22 sw s0,56(sp) + 300488a: 0080 addi s0,sp,64 + 300488c: fca42623 sw a0,-52(s0) + 3004890: fcb42423 sw a1,-56(s0) + 3004894: fc042e23 sw zero,-36(s0) + 3004898: fe042623 sw zero,-20(s0) + 300489c: fe042423 sw zero,-24(s0) + 30048a0: fcc42783 lw a5,-52(s0) + 30048a4: e791 bnez a5,30048b0 + 30048a6: 03000513 li a0,48 + 30048aa: 3cad jal ra,3004324 + 30048ac: 4785 li a5,1 + 30048ae: a0dd j 3004994 + 30048b0: fcc42783 lw a5,-52(s0) + 30048b4: 0607dd63 bgez a5,300492e + 30048b8: 02d00513 li a0,45 + 30048bc: 34a5 jal ra,3004324 + 30048be: fe842783 lw a5,-24(s0) + 30048c2: 0785 addi a5,a5,1 + 30048c4: fef42423 sw a5,-24(s0) + 30048c8: fcc42783 lw a5,-52(s0) + 30048cc: 40f007b3 neg a5,a5 + 30048d0: fcf42623 sw a5,-52(s0) + 30048d4: 45a9 li a1,10 + 30048d6: fcc42503 lw a0,-52(s0) + 30048da: 3e19 jal ra,30043f0 + 30048dc: 87aa mv a5,a0 + 30048de: fef42623 sw a5,-20(s0) + 30048e2: fc842703 lw a4,-56(s0) + 30048e6: fec42783 lw a5,-20(s0) + 30048ea: 40f707b3 sub a5,a4,a5 + 30048ee: fcf42e23 sw a5,-36(s0) + 30048f2: fe042223 sw zero,-28(s0) + 30048f6: a831 j 3004912 + 30048f8: 03000513 li a0,48 + 30048fc: 3425 jal ra,3004324 + 30048fe: fe842783 lw a5,-24(s0) + 3004902: 0785 addi a5,a5,1 + 3004904: fef42423 sw a5,-24(s0) + 3004908: fe442783 lw a5,-28(s0) + 300490c: 0785 addi a5,a5,1 + 300490e: fef42223 sw a5,-28(s0) + 3004912: fe442703 lw a4,-28(s0) + 3004916: fdc42783 lw a5,-36(s0) + 300491a: fcf74fe3 blt a4,a5,30048f8 + 300491e: fec42783 lw a5,-20(s0) + 3004922: fe842703 lw a4,-24(s0) + 3004926: 97ba add a5,a5,a4 + 3004928: fef42423 sw a5,-24(s0) + 300492c: a891 j 3004980 + 300492e: 45a9 li a1,10 + 3004930: fcc42503 lw a0,-52(s0) + 3004934: 3c75 jal ra,30043f0 + 3004936: 87aa mv a5,a0 + 3004938: fef42623 sw a5,-20(s0) + 300493c: fec42783 lw a5,-20(s0) + 3004940: fef42423 sw a5,-24(s0) + 3004944: fc842703 lw a4,-56(s0) + 3004948: fec42783 lw a5,-20(s0) + 300494c: 40f707b3 sub a5,a4,a5 + 3004950: fcf42e23 sw a5,-36(s0) + 3004954: fe042023 sw zero,-32(s0) + 3004958: a831 j 3004974 + 300495a: 03000513 li a0,48 + 300495e: 32d9 jal ra,3004324 + 3004960: fe842783 lw a5,-24(s0) + 3004964: 0785 addi a5,a5,1 + 3004966: fef42423 sw a5,-24(s0) + 300496a: fe042783 lw a5,-32(s0) + 300496e: 0785 addi a5,a5,1 + 3004970: fef42023 sw a5,-32(s0) + 3004974: fe042703 lw a4,-32(s0) + 3004978: fdc42783 lw a5,-36(s0) + 300497c: fcf74fe3 blt a4,a5,300495a + 3004980: fcc42783 lw a5,-52(s0) + 3004984: fec42703 lw a4,-20(s0) + 3004988: 863a mv a2,a4 + 300498a: 45a9 li a1,10 + 300498c: 853e mv a0,a5 + 300498e: 34e9 jal ra,3004458 + 3004990: fe842783 lw a5,-24(s0) + 3004994: 853e mv a0,a5 + 3004996: 50f2 lw ra,60(sp) + 3004998: 5462 lw s0,56(sp) + 300499a: 6121 addi sp,sp,64 + 300499c: 8082 ret + +0300499e : + 300499e: 7179 addi sp,sp,-48 + 30049a0: d622 sw s0,44(sp) + 30049a2: 1800 addi s0,sp,48 + 30049a4: fca42e23 sw a0,-36(s0) + 30049a8: fe042623 sw zero,-20(s0) + 30049ac: a02d j 30049d6 + 30049ae: fec42703 lw a4,-20(s0) + 30049b2: 47a9 li a5,10 + 30049b4: 02f70733 mul a4,a4,a5 + 30049b8: fe842783 lw a5,-24(s0) + 30049bc: 97ba add a5,a5,a4 + 30049be: fd078793 addi a5,a5,-48 + 30049c2: fef42623 sw a5,-20(s0) + 30049c6: fdc42783 lw a5,-36(s0) + 30049ca: 439c lw a5,0(a5) + 30049cc: 00178713 addi a4,a5,1 + 30049d0: fdc42783 lw a5,-36(s0) + 30049d4: c398 sw a4,0(a5) + 30049d6: fdc42783 lw a5,-36(s0) + 30049da: 439c lw a5,0(a5) + 30049dc: 00078783 lb a5,0(a5) + 30049e0: fef42423 sw a5,-24(s0) + 30049e4: fe842703 lw a4,-24(s0) + 30049e8: 02f00793 li a5,47 + 30049ec: 00e7d863 bge a5,a4,30049fc + 30049f0: fe842703 lw a4,-24(s0) + 30049f4: 03900793 li a5,57 + 30049f8: fae7dbe3 bge a5,a4,30049ae + 30049fc: fec42783 lw a5,-20(s0) + 3004a00: 853e mv a0,a5 + 3004a02: 5432 lw s0,44(sp) + 3004a04: 6145 addi sp,sp,48 + 3004a06: 8082 ret + +03004a08 : + 3004a08: 711d addi sp,sp,-96 + 3004a0a: de06 sw ra,60(sp) + 3004a0c: dc22 sw s0,56(sp) + 3004a0e: 0080 addi s0,sp,64 + 3004a10: fca42623 sw a0,-52(s0) + 3004a14: c04c sw a1,4(s0) + 3004a16: c410 sw a2,8(s0) + 3004a18: c454 sw a3,12(s0) + 3004a1a: c818 sw a4,16(s0) + 3004a1c: c85c sw a5,20(s0) + 3004a1e: 01042c23 sw a6,24(s0) + 3004a22: 01142e23 sw a7,28(s0) + 3004a26: fe042623 sw zero,-20(s0) + 3004a2a: fe042423 sw zero,-24(s0) + 3004a2e: fe042223 sw zero,-28(s0) + 3004a32: fe042023 sw zero,-32(s0) + 3004a36: fc042e23 sw zero,-36(s0) + 3004a3a: 02040793 addi a5,s0,32 + 3004a3e: 1791 addi a5,a5,-28 + 3004a40: fcf42c23 sw a5,-40(s0) + 3004a44: aa09 j 3004b56 + 3004a46: fcc42783 lw a5,-52(s0) + 3004a4a: 00078703 lb a4,0(a5) + 3004a4e: 02500793 li a5,37 + 3004a52: 00f70e63 beq a4,a5,3004a6e + 3004a56: fcc42783 lw a5,-52(s0) + 3004a5a: 00078783 lb a5,0(a5) + 3004a5e: 853e mv a0,a5 + 3004a60: 30d1 jal ra,3004324 + 3004a62: fec42783 lw a5,-20(s0) + 3004a66: 0785 addi a5,a5,1 + 3004a68: fef42623 sw a5,-20(s0) + 3004a6c: a0c5 j 3004b4c + 3004a6e: fcc42783 lw a5,-52(s0) + 3004a72: 0785 addi a5,a5,1 + 3004a74: fcf42623 sw a5,-52(s0) + 3004a78: fcc42783 lw a5,-52(s0) + 3004a7c: 00078703 lb a4,0(a5) + 3004a80: 03000793 li a5,48 + 3004a84: 04f71263 bne a4,a5,3004ac8 + 3004a88: fcc42783 lw a5,-52(s0) + 3004a8c: 0785 addi a5,a5,1 + 3004a8e: fcf42623 sw a5,-52(s0) + 3004a92: fcc40793 addi a5,s0,-52 + 3004a96: 853e mv a0,a5 + 3004a98: 3719 jal ra,300499e + 3004a9a: fea42423 sw a0,-24(s0) + 3004a9e: fd842783 lw a5,-40(s0) + 3004aa2: 00478713 addi a4,a5,4 + 3004aa6: fce42c23 sw a4,-40(s0) + 3004aaa: 439c lw a5,0(a5) + 3004aac: fcf42e23 sw a5,-36(s0) + 3004ab0: fe842583 lw a1,-24(s0) + 3004ab4: fdc42503 lw a0,-36(s0) + 3004ab8: 33f1 jal ra,3004884 + 3004aba: 872a mv a4,a0 + 3004abc: fec42783 lw a5,-20(s0) + 3004ac0: 97ba add a5,a5,a4 + 3004ac2: fef42623 sw a5,-20(s0) + 3004ac6: a059 j 3004b4c + 3004ac8: fcc42783 lw a5,-52(s0) + 3004acc: 00078703 lb a4,0(a5) + 3004ad0: 02e00793 li a5,46 + 3004ad4: 04f71d63 bne a4,a5,3004b2e + 3004ad8: fcc42783 lw a5,-52(s0) + 3004adc: 0785 addi a5,a5,1 + 3004ade: fcf42623 sw a5,-52(s0) + 3004ae2: fcc40793 addi a5,s0,-52 + 3004ae6: 853e mv a0,a5 + 3004ae8: 3d5d jal ra,300499e + 3004aea: fea42223 sw a0,-28(s0) + 3004aee: fd842783 lw a5,-40(s0) + 3004af2: 079d addi a5,a5,7 + 3004af4: 9be1 andi a5,a5,-8 + 3004af6: 00878713 addi a4,a5,8 + 3004afa: fce42c23 sw a4,-40(s0) + 3004afe: 0047a803 lw a6,4(a5) + 3004b02: 439c lw a5,0(a5) + 3004b04: 853e mv a0,a5 + 3004b06: 85c2 mv a1,a6 + 3004b08: 494010ef jal ra,3005f9c <__truncdfsf2> + 3004b0c: 20a507d3 fmv.s fa5,fa0 + 3004b10: fef42027 fsw fa5,-32(s0) + 3004b14: fe442783 lw a5,-28(s0) + 3004b18: 853e mv a0,a5 + 3004b1a: fe042507 flw fa0,-32(s0) + 3004b1e: 3479 jal ra,30045ac + 3004b20: 872a mv a4,a0 + 3004b22: fec42783 lw a5,-20(s0) + 3004b26: 97ba add a5,a5,a4 + 3004b28: fef42623 sw a5,-20(s0) + 3004b2c: a005 j 3004b4c + 3004b2e: fcc42783 lw a5,-52(s0) + 3004b32: 00078783 lb a5,0(a5) + 3004b36: fd840713 addi a4,s0,-40 + 3004b3a: 85ba mv a1,a4 + 3004b3c: 853e mv a0,a5 + 3004b3e: 366d jal ra,30046e8 + 3004b40: 872a mv a4,a0 + 3004b42: fec42783 lw a5,-20(s0) + 3004b46: 97ba add a5,a5,a4 + 3004b48: fef42623 sw a5,-20(s0) + 3004b4c: fcc42783 lw a5,-52(s0) + 3004b50: 0785 addi a5,a5,1 + 3004b52: fcf42623 sw a5,-52(s0) + 3004b56: fcc42783 lw a5,-52(s0) + 3004b5a: 00078783 lb a5,0(a5) + 3004b5e: ee0794e3 bnez a5,3004a46 + 3004b62: fec42783 lw a5,-20(s0) + 3004b66: 853e mv a0,a5 + 3004b68: 50f2 lw ra,60(sp) + 3004b6a: 5462 lw s0,56(sp) + 3004b6c: 6125 addi sp,sp,96 + 3004b6e: 8082 ret + +03004b70 : + 3004b70: 1101 addi sp,sp,-32 + 3004b72: ce06 sw ra,28(sp) + 3004b74: cc22 sw s0,24(sp) + 3004b76: 1000 addi s0,sp,32 + 3004b78: fea42623 sw a0,-20(s0) + 3004b7c: feb42423 sw a1,-24(s0) + 3004b80: fec42703 lw a4,-20(s0) + 3004b84: 77c1 lui a5,0xffff0 + 3004b86: 8f7d and a4,a4,a5 + 3004b88: 147f07b7 lui a5,0x147f0 + 3004b8c: 00f70a63 beq a4,a5,3004ba0 + 3004b90: 08b00593 li a1,139 + 3004b94: 030067b7 lui a5,0x3006 + 3004b98: 5cc78513 addi a0,a5,1484 # 30065cc + 3004b9c: 2df1 jal ra,3005278 + 3004b9e: a001 j 3004b9e + 3004ba0: fec42783 lw a5,-20(s0) + 3004ba4: fe842703 lw a4,-24(s0) + 3004ba8: c398 sw a4,0(a5) + 3004baa: 0001 nop + 3004bac: 40f2 lw ra,28(sp) + 3004bae: 4462 lw s0,24(sp) + 3004bb0: 6105 addi sp,sp,32 + 3004bb2: 8082 ret + +03004bb4 : + 3004bb4: 1101 addi sp,sp,-32 + 3004bb6: ce06 sw ra,28(sp) + 3004bb8: cc22 sw s0,24(sp) + 3004bba: 1000 addi s0,sp,32 + 3004bbc: fea42623 sw a0,-20(s0) + 3004bc0: feb42423 sw a1,-24(s0) + 3004bc4: fec42703 lw a4,-20(s0) + 3004bc8: 77c1 lui a5,0xffff0 + 3004bca: 8f7d and a4,a4,a5 + 3004bcc: 147f07b7 lui a5,0x147f0 + 3004bd0: 00f70a63 beq a4,a5,3004be4 + 3004bd4: 0ba00593 li a1,186 + 3004bd8: 030067b7 lui a5,0x3006 + 3004bdc: 5cc78513 addi a0,a5,1484 # 30065cc + 3004be0: 2d61 jal ra,3005278 + 3004be2: a001 j 3004be2 + 3004be4: fe842703 lw a4,-24(s0) + 3004be8: 478d li a5,3 + 3004bea: 00e7fa63 bgeu a5,a4,3004bfe + 3004bee: 0bb00593 li a1,187 + 3004bf2: 030067b7 lui a5,0x3006 + 3004bf6: 5cc78513 addi a0,a5,1484 # 30065cc + 3004bfa: 2dbd jal ra,3005278 + 3004bfc: a839 j 3004c1a + 3004bfe: fe842783 lw a5,-24(s0) + 3004c02: 8b8d andi a5,a5,3 + 3004c04: 0ff7f693 andi a3,a5,255 + 3004c08: fec42703 lw a4,-20(s0) + 3004c0c: 431c lw a5,0(a4) + 3004c0e: 8a8d andi a3,a3,3 + 3004c10: 0692 slli a3,a3,0x4 + 3004c12: fcf7f793 andi a5,a5,-49 + 3004c16: 8fd5 or a5,a5,a3 + 3004c18: c31c sw a5,0(a4) + 3004c1a: 40f2 lw ra,28(sp) + 3004c1c: 4462 lw s0,24(sp) + 3004c1e: 6105 addi sp,sp,32 + 3004c20: 8082 ret + +03004c22 : + 3004c22: 1101 addi sp,sp,-32 + 3004c24: ce06 sw ra,28(sp) + 3004c26: cc22 sw s0,24(sp) + 3004c28: 1000 addi s0,sp,32 + 3004c2a: fea42623 sw a0,-20(s0) + 3004c2e: feb42423 sw a1,-24(s0) + 3004c32: fec42703 lw a4,-20(s0) + 3004c36: 77c1 lui a5,0xffff0 + 3004c38: 8f7d and a4,a4,a5 + 3004c3a: 147f07b7 lui a5,0x147f0 + 3004c3e: 00f70a63 beq a4,a5,3004c52 + 3004c42: 0d200593 li a1,210 + 3004c46: 030067b7 lui a5,0x3006 + 3004c4a: 5cc78513 addi a0,a5,1484 # 30065cc + 3004c4e: 252d jal ra,3005278 + 3004c50: a001 j 3004c50 + 3004c52: fe842703 lw a4,-24(s0) + 3004c56: 478d li a5,3 + 3004c58: 00e7fa63 bgeu a5,a4,3004c6c + 3004c5c: 0d300593 li a1,211 + 3004c60: 030067b7 lui a5,0x3006 + 3004c64: 5cc78513 addi a0,a5,1484 # 30065cc + 3004c68: 2d01 jal ra,3005278 + 3004c6a: a835 j 3004ca6 + 3004c6c: fe842783 lw a5,-24(s0) + 3004c70: 8385 srli a5,a5,0x1 + 3004c72: 8b85 andi a5,a5,1 + 3004c74: 0ff7f693 andi a3,a5,255 + 3004c78: fec42703 lw a4,-20(s0) + 3004c7c: 431c lw a5,0(a4) + 3004c7e: 8a85 andi a3,a3,1 + 3004c80: 06a2 slli a3,a3,0x8 + 3004c82: eff7f793 andi a5,a5,-257 + 3004c86: 8fd5 or a5,a5,a3 + 3004c88: c31c sw a5,0(a4) + 3004c8a: fe842783 lw a5,-24(s0) + 3004c8e: 8b85 andi a5,a5,1 + 3004c90: 0ff7f693 andi a3,a5,255 + 3004c94: fec42703 lw a4,-20(s0) + 3004c98: 431c lw a5,0(a4) + 3004c9a: 8a85 andi a3,a3,1 + 3004c9c: 069e slli a3,a3,0x7 + 3004c9e: f7f7f793 andi a5,a5,-129 + 3004ca2: 8fd5 or a5,a5,a3 + 3004ca4: c31c sw a5,0(a4) + 3004ca6: 40f2 lw ra,28(sp) + 3004ca8: 4462 lw s0,24(sp) + 3004caa: 6105 addi sp,sp,32 + 3004cac: 8082 ret + +03004cae : + 3004cae: 1101 addi sp,sp,-32 + 3004cb0: ce06 sw ra,28(sp) + 3004cb2: cc22 sw s0,24(sp) + 3004cb4: 1000 addi s0,sp,32 + 3004cb6: fea42623 sw a0,-20(s0) + 3004cba: feb42423 sw a1,-24(s0) + 3004cbe: fec42703 lw a4,-20(s0) + 3004cc2: 77c1 lui a5,0xffff0 + 3004cc4: 8f7d and a4,a4,a5 + 3004cc6: 147f07b7 lui a5,0x147f0 + 3004cca: 00f70a63 beq a4,a5,3004cde + 3004cce: 0ed00593 li a1,237 + 3004cd2: 030067b7 lui a5,0x3006 + 3004cd6: 5cc78513 addi a0,a5,1484 # 30065cc + 3004cda: 2b79 jal ra,3005278 + 3004cdc: a001 j 3004cdc + 3004cde: fe842703 lw a4,-24(s0) + 3004ce2: 4785 li a5,1 + 3004ce4: 00e7fa63 bgeu a5,a4,3004cf8 + 3004ce8: 0ee00593 li a1,238 + 3004cec: 030067b7 lui a5,0x3006 + 3004cf0: 5cc78513 addi a0,a5,1484 # 30065cc + 3004cf4: 2351 jal ra,3005278 + 3004cf6: a839 j 3004d14 + 3004cf8: fe842783 lw a5,-24(s0) + 3004cfc: 8b85 andi a5,a5,1 + 3004cfe: 0ff7f693 andi a3,a5,255 + 3004d02: fec42703 lw a4,-20(s0) + 3004d06: 431c lw a5,0(a4) + 3004d08: 8a85 andi a3,a3,1 + 3004d0a: 06a6 slli a3,a3,0x9 + 3004d0c: dff7f793 andi a5,a5,-513 + 3004d10: 8fd5 or a5,a5,a3 + 3004d12: c31c sw a5,0(a4) + 3004d14: 40f2 lw ra,28(sp) + 3004d16: 4462 lw s0,24(sp) + 3004d18: 6105 addi sp,sp,32 + 3004d1a: 8082 ret + +03004d1c : + 3004d1c: 1101 addi sp,sp,-32 + 3004d1e: ce06 sw ra,28(sp) + 3004d20: cc22 sw s0,24(sp) + 3004d22: 1000 addi s0,sp,32 + 3004d24: fea42623 sw a0,-20(s0) + 3004d28: feb42423 sw a1,-24(s0) + 3004d2c: fec42703 lw a4,-20(s0) + 3004d30: 77c1 lui a5,0xffff0 + 3004d32: 8f7d and a4,a4,a5 + 3004d34: 147f07b7 lui a5,0x147f0 + 3004d38: 00f70a63 beq a4,a5,3004d4c + 3004d3c: 10500593 li a1,261 + 3004d40: 030067b7 lui a5,0x3006 + 3004d44: 5cc78513 addi a0,a5,1484 # 30065cc + 3004d48: 2b05 jal ra,3005278 + 3004d4a: a001 j 3004d4a + 3004d4c: fe842703 lw a4,-24(s0) + 3004d50: 4785 li a5,1 + 3004d52: 00e7fa63 bgeu a5,a4,3004d66 + 3004d56: 10600593 li a1,262 + 3004d5a: 030067b7 lui a5,0x3006 + 3004d5e: 5cc78513 addi a0,a5,1484 # 30065cc + 3004d62: 2b19 jal ra,3005278 + 3004d64: a839 j 3004d82 + 3004d66: fe842783 lw a5,-24(s0) + 3004d6a: 8b85 andi a5,a5,1 + 3004d6c: 0ff7f693 andi a3,a5,255 + 3004d70: fec42703 lw a4,-20(s0) + 3004d74: 431c lw a5,0(a4) + 3004d76: 8a85 andi a3,a3,1 + 3004d78: 06aa slli a3,a3,0xa + 3004d7a: bff7f793 andi a5,a5,-1025 + 3004d7e: 8fd5 or a5,a5,a3 + 3004d80: c31c sw a5,0(a4) + 3004d82: 40f2 lw ra,28(sp) + 3004d84: 4462 lw s0,24(sp) + 3004d86: 6105 addi sp,sp,32 + 3004d88: 8082 ret + +03004d8a : + 3004d8a: 7179 addi sp,sp,-48 + 3004d8c: d622 sw s0,44(sp) + 3004d8e: 1800 addi s0,sp,48 + 3004d90: fca42e23 sw a0,-36(s0) + 3004d94: 147f07b7 lui a5,0x147f0 + 3004d98: fef42623 sw a5,-20(s0) + 3004d9c: fdc42783 lw a5,-36(s0) + 3004da0: 0107d713 srli a4,a5,0x10 + 3004da4: 6785 lui a5,0x1 + 3004da6: 17fd addi a5,a5,-1 # fff + 3004da8: 8ff9 and a5,a5,a4 + 3004daa: fef42423 sw a5,-24(s0) + 3004dae: fec42703 lw a4,-20(s0) + 3004db2: fe842783 lw a5,-24(s0) + 3004db6: 97ba add a5,a5,a4 + 3004db8: fef42223 sw a5,-28(s0) + 3004dbc: fe442703 lw a4,-28(s0) + 3004dc0: 77c1 lui a5,0xffff0 + 3004dc2: 8f7d and a4,a4,a5 + 3004dc4: 147f07b7 lui a5,0x147f0 + 3004dc8: 00f70463 beq a4,a5,3004dd0 + 3004dcc: 4781 li a5,0 + 3004dce: a019 j 3004dd4 + 3004dd0: fe442783 lw a5,-28(s0) + 3004dd4: 853e mv a0,a5 + 3004dd6: 5432 lw s0,44(sp) + 3004dd8: 6145 addi sp,sp,48 + 3004dda: 8082 ret + +03004ddc : + 3004ddc: 7179 addi sp,sp,-48 + 3004dde: d606 sw ra,44(sp) + 3004de0: d422 sw s0,40(sp) + 3004de2: 1800 addi s0,sp,48 + 3004de4: fca42e23 sw a0,-36(s0) + 3004de8: fdc42503 lw a0,-36(s0) + 3004dec: 3f79 jal ra,3004d8a + 3004dee: fea42623 sw a0,-20(s0) + 3004df2: fdc42703 lw a4,-36(s0) + 3004df6: 67c1 lui a5,0x10 + 3004df8: 17fd addi a5,a5,-1 # ffff + 3004dfa: 8ff9 and a5,a5,a4 + 3004dfc: fef42423 sw a5,-24(s0) + 3004e00: fe842583 lw a1,-24(s0) + 3004e04: fec42503 lw a0,-20(s0) + 3004e08: 33a5 jal ra,3004b70 + 3004e0a: 4781 li a5,0 + 3004e0c: 853e mv a0,a5 + 3004e0e: 50b2 lw ra,44(sp) + 3004e10: 5422 lw s0,40(sp) + 3004e12: 6145 addi sp,sp,48 + 3004e14: 8082 ret + +03004e16 : + 3004e16: 7179 addi sp,sp,-48 + 3004e18: d606 sw ra,44(sp) + 3004e1a: d422 sw s0,40(sp) + 3004e1c: 1800 addi s0,sp,48 + 3004e1e: fca42e23 sw a0,-36(s0) + 3004e22: fcb42c23 sw a1,-40(s0) + 3004e26: fd842703 lw a4,-40(s0) + 3004e2a: 478d li a5,3 + 3004e2c: 00e7fb63 bgeu a5,a4,3004e42 + 3004e30: 07800593 li a1,120 + 3004e34: 030067b7 lui a5,0x3006 + 3004e38: 5ec78513 addi a0,a5,1516 # 30065ec + 3004e3c: 2935 jal ra,3005278 + 3004e3e: 4791 li a5,4 + 3004e40: a821 j 3004e58 + 3004e42: fdc42503 lw a0,-36(s0) + 3004e46: 3791 jal ra,3004d8a + 3004e48: fea42623 sw a0,-20(s0) + 3004e4c: fd842583 lw a1,-40(s0) + 3004e50: fec42503 lw a0,-20(s0) + 3004e54: 33f9 jal ra,3004c22 + 3004e56: 4781 li a5,0 + 3004e58: 853e mv a0,a5 + 3004e5a: 50b2 lw ra,44(sp) + 3004e5c: 5422 lw s0,40(sp) + 3004e5e: 6145 addi sp,sp,48 + 3004e60: 8082 ret + +03004e62 : + 3004e62: 7179 addi sp,sp,-48 + 3004e64: d606 sw ra,44(sp) + 3004e66: d422 sw s0,40(sp) + 3004e68: 1800 addi s0,sp,48 + 3004e6a: fca42e23 sw a0,-36(s0) + 3004e6e: fcb42c23 sw a1,-40(s0) + 3004e72: fd842703 lw a4,-40(s0) + 3004e76: 4785 li a5,1 + 3004e78: 00e7fb63 bgeu a5,a4,3004e8e + 3004e7c: 09300593 li a1,147 + 3004e80: 030067b7 lui a5,0x3006 + 3004e84: 5ec78513 addi a0,a5,1516 # 30065ec + 3004e88: 2ec5 jal ra,3005278 + 3004e8a: 4791 li a5,4 + 3004e8c: a821 j 3004ea4 + 3004e8e: fdc42503 lw a0,-36(s0) + 3004e92: 3de5 jal ra,3004d8a + 3004e94: fea42623 sw a0,-20(s0) + 3004e98: fd842583 lw a1,-40(s0) + 3004e9c: fec42503 lw a0,-20(s0) + 3004ea0: 3db5 jal ra,3004d1c + 3004ea2: 4781 li a5,0 + 3004ea4: 853e mv a0,a5 + 3004ea6: 50b2 lw ra,44(sp) + 3004ea8: 5422 lw s0,40(sp) + 3004eaa: 6145 addi sp,sp,48 + 3004eac: 8082 ret + +03004eae : + 3004eae: 7179 addi sp,sp,-48 + 3004eb0: d606 sw ra,44(sp) + 3004eb2: d422 sw s0,40(sp) + 3004eb4: 1800 addi s0,sp,48 + 3004eb6: fca42e23 sw a0,-36(s0) + 3004eba: fcb42c23 sw a1,-40(s0) + 3004ebe: fd842703 lw a4,-40(s0) + 3004ec2: 4785 li a5,1 + 3004ec4: 00e7fb63 bgeu a5,a4,3004eda + 3004ec8: 0ae00593 li a1,174 + 3004ecc: 030067b7 lui a5,0x3006 + 3004ed0: 5ec78513 addi a0,a5,1516 # 30065ec + 3004ed4: 2655 jal ra,3005278 + 3004ed6: 4791 li a5,4 + 3004ed8: a821 j 3004ef0 + 3004eda: fdc42503 lw a0,-36(s0) + 3004ede: 3575 jal ra,3004d8a + 3004ee0: fea42623 sw a0,-20(s0) + 3004ee4: fd842583 lw a1,-40(s0) + 3004ee8: fec42503 lw a0,-20(s0) + 3004eec: 33c9 jal ra,3004cae + 3004eee: 4781 li a5,0 + 3004ef0: 853e mv a0,a5 + 3004ef2: 50b2 lw ra,44(sp) + 3004ef4: 5422 lw s0,40(sp) + 3004ef6: 6145 addi sp,sp,48 + 3004ef8: 8082 ret + +03004efa : + 3004efa: 7179 addi sp,sp,-48 + 3004efc: d606 sw ra,44(sp) + 3004efe: d422 sw s0,40(sp) + 3004f00: 1800 addi s0,sp,48 + 3004f02: fca42e23 sw a0,-36(s0) + 3004f06: fcb42c23 sw a1,-40(s0) + 3004f0a: fd842703 lw a4,-40(s0) + 3004f0e: 478d li a5,3 + 3004f10: 00e7fb63 bgeu a5,a4,3004f26 + 3004f14: 0cb00593 li a1,203 + 3004f18: 030067b7 lui a5,0x3006 + 3004f1c: 5ec78513 addi a0,a5,1516 # 30065ec + 3004f20: 2ea1 jal ra,3005278 + 3004f22: 4791 li a5,4 + 3004f24: a821 j 3004f3c + 3004f26: fdc42503 lw a0,-36(s0) + 3004f2a: 3585 jal ra,3004d8a + 3004f2c: fea42623 sw a0,-20(s0) + 3004f30: fd842583 lw a1,-40(s0) + 3004f34: fec42503 lw a0,-20(s0) + 3004f38: 39b5 jal ra,3004bb4 + 3004f3a: 4781 li a5,0 + 3004f3c: 853e mv a0,a5 + 3004f3e: 50b2 lw ra,44(sp) + 3004f40: 5422 lw s0,40(sp) + 3004f42: 6145 addi sp,sp,48 + 3004f44: 8082 ret + +03004f46 : + 3004f46: 1101 addi sp,sp,-32 + 3004f48: ce22 sw s0,28(sp) + 3004f4a: 1000 addi s0,sp,32 + 3004f4c: fea42623 sw a0,-20(s0) + 3004f50: fec42783 lw a5,-20(s0) + 3004f54: cb99 beqz a5,3004f6a + 3004f56: fec42703 lw a4,-20(s0) + 3004f5a: 4785 li a5,1 + 3004f5c: 00f70763 beq a4,a5,3004f6a + 3004f60: fec42703 lw a4,-20(s0) + 3004f64: 4789 li a5,2 + 3004f66: 00f71463 bne a4,a5,3004f6e + 3004f6a: 4785 li a5,1 + 3004f6c: a011 j 3004f70 + 3004f6e: 4781 li a5,0 + 3004f70: 8b85 andi a5,a5,1 + 3004f72: 9f81 uxtb a5 + 3004f74: 853e mv a0,a5 + 3004f76: 4472 lw s0,28(sp) + 3004f78: 6105 addi sp,sp,32 + 3004f7a: 8082 ret + +03004f7c : + 3004f7c: 1101 addi sp,sp,-32 + 3004f7e: ce22 sw s0,28(sp) + 3004f80: 1000 addi s0,sp,32 + 3004f82: fea42623 sw a0,-20(s0) + 3004f86: fec42783 lw a5,-20(s0) + 3004f8a: c791 beqz a5,3004f96 + 3004f8c: fec42703 lw a4,-20(s0) + 3004f90: 4785 li a5,1 + 3004f92: 00f71463 bne a4,a5,3004f9a + 3004f96: 4785 li a5,1 + 3004f98: a011 j 3004f9c + 3004f9a: 4781 li a5,0 + 3004f9c: 8b85 andi a5,a5,1 + 3004f9e: 9f81 uxtb a5 + 3004fa0: 853e mv a0,a5 + 3004fa2: 4472 lw s0,28(sp) + 3004fa4: 6105 addi sp,sp,32 + 3004fa6: 8082 ret + +03004fa8 : + 3004fa8: 1101 addi sp,sp,-32 + 3004faa: ce22 sw s0,28(sp) + 3004fac: 1000 addi s0,sp,32 + 3004fae: fea42623 sw a0,-20(s0) + 3004fb2: fec42783 lw a5,-20(s0) + 3004fb6: c791 beqz a5,3004fc2 + 3004fb8: fec42703 lw a4,-20(s0) + 3004fbc: 4785 li a5,1 + 3004fbe: 00f71463 bne a4,a5,3004fc6 + 3004fc2: 4785 li a5,1 + 3004fc4: a011 j 3004fc8 + 3004fc6: 4781 li a5,0 + 3004fc8: 8b85 andi a5,a5,1 + 3004fca: 9f81 uxtb a5 + 3004fcc: 853e mv a0,a5 + 3004fce: 4472 lw s0,28(sp) + 3004fd0: 6105 addi sp,sp,32 + 3004fd2: 8082 ret + +03004fd4 : + 3004fd4: 1101 addi sp,sp,-32 + 3004fd6: ce22 sw s0,28(sp) + 3004fd8: 1000 addi s0,sp,32 + 3004fda: fea42623 sw a0,-20(s0) + 3004fde: fec42783 lw a5,-20(s0) + 3004fe2: 00f037b3 snez a5,a5 + 3004fe6: 9f81 uxtb a5 + 3004fe8: 853e mv a0,a5 + 3004fea: 4472 lw s0,28(sp) + 3004fec: 6105 addi sp,sp,32 + 3004fee: 8082 ret + +03004ff0 : + 3004ff0: 1101 addi sp,sp,-32 + 3004ff2: ce22 sw s0,28(sp) + 3004ff4: 1000 addi s0,sp,32 + 3004ff6: fea42623 sw a0,-20(s0) + 3004ffa: fec42783 lw a5,-20(s0) + 3004ffe: cb99 beqz a5,3005014 + 3005000: fec42703 lw a4,-20(s0) + 3005004: 4785 li a5,1 + 3005006: 00f70763 beq a4,a5,3005014 + 300500a: fec42703 lw a4,-20(s0) + 300500e: 4789 li a5,2 + 3005010: 00f71463 bne a4,a5,3005018 + 3005014: 4785 li a5,1 + 3005016: a011 j 300501a + 3005018: 4781 li a5,0 + 300501a: 8b85 andi a5,a5,1 + 300501c: 9f81 uxtb a5 + 300501e: 853e mv a0,a5 + 3005020: 4472 lw s0,28(sp) + 3005022: 6105 addi sp,sp,32 + 3005024: 8082 ret + +03005026 : + 3005026: 1101 addi sp,sp,-32 + 3005028: ce06 sw ra,28(sp) + 300502a: cc22 sw s0,24(sp) + 300502c: 1000 addi s0,sp,32 + 300502e: fea42623 sw a0,-20(s0) + 3005032: fec42783 lw a5,-20(s0) + 3005036: eb89 bnez a5,3005048 + 3005038: 02800593 li a1,40 + 300503c: 030067b7 lui a5,0x3006 + 3005040: 62c78513 addi a0,a5,1580 # 300662c + 3005044: 2c15 jal ra,3005278 + 3005046: a001 j 3005046 + 3005048: fec42783 lw a5,-20(s0) + 300504c: 4398 lw a4,0(a5) + 300504e: 143007b7 lui a5,0x14300 + 3005052: 02f70f63 beq a4,a5,3005090 + 3005056: fec42783 lw a5,-20(s0) + 300505a: 4398 lw a4,0(a5) + 300505c: 143017b7 lui a5,0x14301 + 3005060: 02f70863 beq a4,a5,3005090 + 3005064: fec42783 lw a5,-20(s0) + 3005068: 4398 lw a4,0(a5) + 300506a: 143027b7 lui a5,0x14302 + 300506e: 02f70163 beq a4,a5,3005090 + 3005072: fec42783 lw a5,-20(s0) + 3005076: 4398 lw a4,0(a5) + 3005078: 143037b7 lui a5,0x14303 + 300507c: 00f70a63 beq a4,a5,3005090 + 3005080: 02900593 li a1,41 + 3005084: 030067b7 lui a5,0x3006 + 3005088: 62c78513 addi a0,a5,1580 # 300662c + 300508c: 22f5 jal ra,3005278 + 300508e: a001 j 300508e + 3005090: fec42783 lw a5,-20(s0) + 3005094: 4bdc lw a5,20(a5) + 3005096: 853e mv a0,a5 + 3005098: 3f35 jal ra,3004fd4 + 300509a: 87aa mv a5,a0 + 300509c: 0017c793 xori a5,a5,1 + 30050a0: 9f81 uxtb a5 + 30050a2: cb91 beqz a5,30050b6 + 30050a4: 02b00593 li a1,43 + 30050a8: 030067b7 lui a5,0x3006 + 30050ac: 62c78513 addi a0,a5,1580 # 300662c + 30050b0: 22e1 jal ra,3005278 + 30050b2: 4785 li a5,1 + 30050b4: aa6d j 300526e + 30050b6: fec42783 lw a5,-20(s0) + 30050ba: 4f9c lw a5,24(a5) + 30050bc: 853e mv a0,a5 + 30050be: 3f19 jal ra,3004fd4 + 30050c0: 87aa mv a5,a0 + 30050c2: 0017c793 xori a5,a5,1 + 30050c6: 9f81 uxtb a5 + 30050c8: cb91 beqz a5,30050dc + 30050ca: 02c00593 li a1,44 + 30050ce: 030067b7 lui a5,0x3006 + 30050d2: 62c78513 addi a0,a5,1580 # 300662c + 30050d6: 224d jal ra,3005278 + 30050d8: 4785 li a5,1 + 30050da: aa51 j 300526e + 30050dc: fec42783 lw a5,-20(s0) + 30050e0: 479c lw a5,8(a5) + 30050e2: 853e mv a0,a5 + 30050e4: 358d jal ra,3004f46 + 30050e6: 87aa mv a5,a0 + 30050e8: 0017c793 xori a5,a5,1 + 30050ec: 9f81 uxtb a5 + 30050ee: cb91 beqz a5,3005102 + 30050f0: 02d00593 li a1,45 + 30050f4: 030067b7 lui a5,0x3006 + 30050f8: 62c78513 addi a0,a5,1580 # 300662c + 30050fc: 2ab5 jal ra,3005278 + 30050fe: 4785 li a5,1 + 3005100: a2bd j 300526e + 3005102: fec42783 lw a5,-20(s0) + 3005106: 4b9c lw a5,16(a5) + 3005108: 853e mv a0,a5 + 300510a: 3d79 jal ra,3004fa8 + 300510c: 87aa mv a5,a0 + 300510e: 0017c793 xori a5,a5,1 + 3005112: 9f81 uxtb a5 + 3005114: cb91 beqz a5,3005128 + 3005116: 02e00593 li a1,46 + 300511a: 030067b7 lui a5,0x3006 + 300511e: 62c78513 addi a0,a5,1580 # 300662c + 3005122: 2a99 jal ra,3005278 + 3005124: 4785 li a5,1 + 3005126: a2a1 j 300526e + 3005128: fec42783 lw a5,-20(s0) + 300512c: 47dc lw a5,12(a5) + 300512e: 853e mv a0,a5 + 3005130: 35c1 jal ra,3004ff0 + 3005132: 87aa mv a5,a0 + 3005134: 0017c793 xori a5,a5,1 + 3005138: 9f81 uxtb a5 + 300513a: cb91 beqz a5,300514e + 300513c: 02f00593 li a1,47 + 3005140: 030067b7 lui a5,0x3006 + 3005144: 62c78513 addi a0,a5,1580 # 300662c + 3005148: 2a05 jal ra,3005278 + 300514a: 4785 li a5,1 + 300514c: a20d j 300526e + 300514e: fec42783 lw a5,-20(s0) + 3005152: 439c lw a5,0(a5) + 3005154: 4705 li a4,1 + 3005156: c7d8 sw a4,12(a5) + 3005158: fec42783 lw a5,-20(s0) + 300515c: 439c lw a5,0(a5) + 300515e: fec42703 lw a4,-20(s0) + 3005162: 4b58 lw a4,20(a4) + 3005164: c398 sw a4,0(a5) + 3005166: fec42783 lw a5,-20(s0) + 300516a: 439c lw a5,0(a5) + 300516c: fec42703 lw a4,-20(s0) + 3005170: 4f18 lw a4,24(a4) + 3005172: cf98 sw a4,24(a5) + 3005174: fec42783 lw a5,-20(s0) + 3005178: 4398 lw a4,0(a5) + 300517a: 471c lw a5,8(a4) + 300517c: f7f7f793 andi a5,a5,-129 + 3005180: c71c sw a5,8(a4) + 3005182: fec42783 lw a5,-20(s0) + 3005186: 4398 lw a4,0(a5) + 3005188: fec42783 lw a5,-20(s0) + 300518c: 2fd4 lbu a3,28(a5) + 300518e: 471c lw a5,8(a4) + 3005190: 8a85 andi a3,a3,1 + 3005192: 0696 slli a3,a3,0x5 + 3005194: fdf7f793 andi a5,a5,-33 + 3005198: 8fd5 or a5,a5,a3 + 300519a: c71c sw a5,8(a4) + 300519c: fec42783 lw a5,-20(s0) + 30051a0: 47d4 lw a3,12(a5) + 30051a2: fec42783 lw a5,-20(s0) + 30051a6: 4398 lw a4,0(a5) + 30051a8: 87b6 mv a5,a3 + 30051aa: 8b8d andi a5,a5,3 + 30051ac: 0ff7f693 andi a3,a5,255 + 30051b0: 471c lw a5,8(a4) + 30051b2: 8a8d andi a3,a3,3 + 30051b4: 068a slli a3,a3,0x2 + 30051b6: 9bcd andi a5,a5,-13 + 30051b8: 8fd5 or a5,a5,a3 + 30051ba: c71c sw a5,8(a4) + 30051bc: fec42783 lw a5,-20(s0) + 30051c0: 4b94 lw a3,16(a5) + 30051c2: fec42783 lw a5,-20(s0) + 30051c6: 4398 lw a4,0(a5) + 30051c8: 87b6 mv a5,a3 + 30051ca: 8b85 andi a5,a5,1 + 30051cc: 0ff7f693 andi a3,a5,255 + 30051d0: 471c lw a5,8(a4) + 30051d2: 8a85 andi a3,a3,1 + 30051d4: 0686 slli a3,a3,0x1 + 30051d6: 9bf5 andi a5,a5,-3 + 30051d8: 8fd5 or a5,a5,a3 + 30051da: c71c sw a5,8(a4) + 30051dc: fec42783 lw a5,-20(s0) + 30051e0: 4798 lw a4,8(a5) + 30051e2: 4789 li a5,2 + 30051e4: 00f71a63 bne a4,a5,30051f8 + 30051e8: fec42783 lw a5,-20(s0) + 30051ec: 4398 lw a4,0(a5) + 30051ee: 471c lw a5,8(a4) + 30051f0: 0017e793 ori a5,a5,1 + 30051f4: c71c sw a5,8(a4) + 30051f6: a805 j 3005226 + 30051f8: fec42783 lw a5,-20(s0) + 30051fc: 4398 lw a4,0(a5) + 30051fe: 471c lw a5,8(a4) + 3005200: 9bf9 andi a5,a5,-2 + 3005202: c71c sw a5,8(a4) + 3005204: fec42783 lw a5,-20(s0) + 3005208: 479c lw a5,8(a5) + 300520a: fec42703 lw a4,-20(s0) + 300520e: 4318 lw a4,0(a4) + 3005210: 00f037b3 snez a5,a5 + 3005214: 0ff7f693 andi a3,a5,255 + 3005218: 471c lw a5,8(a4) + 300521a: 8a85 andi a3,a3,1 + 300521c: 069a slli a3,a3,0x6 + 300521e: fbf7f793 andi a5,a5,-65 + 3005222: 8fd5 or a5,a5,a3 + 3005224: c71c sw a5,8(a4) + 3005226: fec42783 lw a5,-20(s0) + 300522a: 4398 lw a4,0(a5) + 300522c: fec42783 lw a5,-20(s0) + 3005230: 2ff4 lbu a3,30(a5) + 3005232: 4f5c lw a5,28(a4) + 3005234: 8a85 andi a3,a3,1 + 3005236: 0686 slli a3,a3,0x1 + 3005238: 9bf5 andi a5,a5,-3 + 300523a: 8fd5 or a5,a5,a3 + 300523c: cf5c sw a5,28(a4) + 300523e: fec42783 lw a5,-20(s0) + 3005242: 4398 lw a4,0(a5) + 3005244: fec42783 lw a5,-20(s0) + 3005248: 2ff4 lbu a3,30(a5) + 300524a: 4f5c lw a5,28(a4) + 300524c: 8a85 andi a3,a3,1 + 300524e: 9bf9 andi a5,a5,-2 + 3005250: 8fd5 or a5,a5,a3 + 3005252: cf5c sw a5,28(a4) + 3005254: fec42783 lw a5,-20(s0) + 3005258: 4398 lw a4,0(a5) + 300525a: fec42783 lw a5,-20(s0) + 300525e: 3fd4 lbu a3,29(a5) + 3005260: 4f5c lw a5,28(a4) + 3005262: 8a85 andi a3,a3,1 + 3005264: 068a slli a3,a3,0x2 + 3005266: 9bed andi a5,a5,-5 + 3005268: 8fd5 or a5,a5,a3 + 300526a: cf5c sw a5,28(a4) + 300526c: 4781 li a5,0 + 300526e: 853e mv a0,a5 + 3005270: 40f2 lw ra,28(sp) + 3005272: 4462 lw s0,24(sp) + 3005274: 6105 addi sp,sp,32 + 3005276: 8082 ret + +03005278 : + 3005278: c37fc06f j 3001eae + +0300527c : + 300527c: 1101 addi sp,sp,-32 + 300527e: ce06 sw ra,28(sp) + 3005280: cc22 sw s0,24(sp) + 3005282: 1000 addi s0,sp,32 + 3005284: fea42623 sw a0,-20(s0) + 3005288: fec42783 lw a5,-20(s0) + 300528c: eb89 bnez a5,300529e + 300528e: 0bc00593 li a1,188 + 3005292: 030067b7 lui a5,0x3006 + 3005296: 62c78513 addi a0,a5,1580 # 300662c + 300529a: 3ff9 jal ra,3005278 + 300529c: a001 j 300529c + 300529e: fec42783 lw a5,-20(s0) + 30052a2: 4398 lw a4,0(a5) + 30052a4: 143007b7 lui a5,0x14300 + 30052a8: 02f70f63 beq a4,a5,30052e6 + 30052ac: fec42783 lw a5,-20(s0) + 30052b0: 4398 lw a4,0(a5) + 30052b2: 143017b7 lui a5,0x14301 + 30052b6: 02f70863 beq a4,a5,30052e6 + 30052ba: fec42783 lw a5,-20(s0) + 30052be: 4398 lw a4,0(a5) + 30052c0: 143027b7 lui a5,0x14302 + 30052c4: 02f70163 beq a4,a5,30052e6 + 30052c8: fec42783 lw a5,-20(s0) + 30052cc: 4398 lw a4,0(a5) + 30052ce: 143037b7 lui a5,0x14303 + 30052d2: 00f70a63 beq a4,a5,30052e6 + 30052d6: 0bd00593 li a1,189 + 30052da: 030067b7 lui a5,0x3006 + 30052de: 62c78513 addi a0,a5,1580 # 300662c + 30052e2: 3f59 jal ra,3005278 + 30052e4: a001 j 30052e4 + 30052e6: fec42783 lw a5,-20(s0) + 30052ea: 4398 lw a4,0(a5) + 30052ec: 471c lw a5,8(a4) + 30052ee: 0807e793 ori a5,a5,128 + 30052f2: c71c sw a5,8(a4) + 30052f4: 0001 nop + 30052f6: 40f2 lw ra,28(sp) + 30052f8: 4462 lw s0,24(sp) + 30052fa: 6105 addi sp,sp,32 + 30052fc: 8082 ret + +030052fe : + 30052fe: 7179 addi sp,sp,-48 + 3005300: d606 sw ra,44(sp) + 3005302: d422 sw s0,40(sp) + 3005304: 1800 addi s0,sp,48 + 3005306: fca42e23 sw a0,-36(s0) + 300530a: fdc42783 lw a5,-36(s0) + 300530e: eb89 bnez a5,3005320 + 3005310: 0d800593 li a1,216 + 3005314: 030067b7 lui a5,0x3006 + 3005318: 62c78513 addi a0,a5,1580 # 300662c + 300531c: 3fb1 jal ra,3005278 + 300531e: a001 j 300531e + 3005320: fdc42783 lw a5,-36(s0) + 3005324: fef42623 sw a5,-20(s0) + 3005328: fec42783 lw a5,-20(s0) + 300532c: 4398 lw a4,0(a5) + 300532e: 143007b7 lui a5,0x14300 + 3005332: 02f70f63 beq a4,a5,3005370 + 3005336: fec42783 lw a5,-20(s0) + 300533a: 4398 lw a4,0(a5) + 300533c: 143017b7 lui a5,0x14301 + 3005340: 02f70863 beq a4,a5,3005370 + 3005344: fec42783 lw a5,-20(s0) + 3005348: 4398 lw a4,0(a5) + 300534a: 143027b7 lui a5,0x14302 + 300534e: 02f70163 beq a4,a5,3005370 + 3005352: fec42783 lw a5,-20(s0) + 3005356: 4398 lw a4,0(a5) + 3005358: 143037b7 lui a5,0x14303 + 300535c: 00f70a63 beq a4,a5,3005370 + 3005360: 0da00593 li a1,218 + 3005364: 030067b7 lui a5,0x3006 + 3005368: 62c78513 addi a0,a5,1580 # 300662c + 300536c: 3731 jal ra,3005278 + 300536e: a001 j 300536e + 3005370: fec42783 lw a5,-20(s0) + 3005374: 439c lw a5,0(a5) + 3005376: 4bdc lw a5,20(a5) + 3005378: 8385 srli a5,a5,0x1 + 300537a: 8b85 andi a5,a5,1 + 300537c: 0ff7f713 andi a4,a5,255 + 3005380: 4785 li a5,1 + 3005382: 02f71363 bne a4,a5,30053a8 + 3005386: fec42783 lw a5,-20(s0) + 300538a: 4398 lw a4,0(a5) + 300538c: 531c lw a5,32(a4) + 300538e: 0017e793 ori a5,a5,1 + 3005392: d31c sw a5,32(a4) + 3005394: fec42783 lw a5,-20(s0) + 3005398: 53dc lw a5,36(a5) + 300539a: c799 beqz a5,30053a8 + 300539c: fec42783 lw a5,-20(s0) + 30053a0: 53dc lw a5,36(a5) + 30053a2: fec42503 lw a0,-20(s0) + 30053a6: 9782 jalr a5 + 30053a8: fec42783 lw a5,-20(s0) + 30053ac: 439c lw a5,0(a5) + 30053ae: 4bdc lw a5,20(a5) + 30053b0: 8b85 andi a5,a5,1 + 30053b2: 0ff7f713 andi a4,a5,255 + 30053b6: 4785 li a5,1 + 30053b8: 02f71263 bne a4,a5,30053dc + 30053bc: fec42783 lw a5,-20(s0) + 30053c0: 439c lw a5,0(a5) + 30053c2: 4705 li a4,1 + 30053c4: c7d8 sw a4,12(a5) + 30053c6: fec42783 lw a5,-20(s0) + 30053ca: 539c lw a5,32(a5) + 30053cc: cb81 beqz a5,30053dc + 30053ce: fec42783 lw a5,-20(s0) + 30053d2: 539c lw a5,32(a5) + 30053d4: fec42503 lw a0,-20(s0) + 30053d8: 9782 jalr a5 + 30053da: 0001 nop + 30053dc: 0001 nop + 30053de: 50b2 lw ra,44(sp) + 30053e0: 5422 lw s0,40(sp) + 30053e2: 6145 addi sp,sp,48 + 30053e4: 8082 ret + +030053e6 : + 30053e6: 1101 addi sp,sp,-32 + 30053e8: ce06 sw ra,28(sp) + 30053ea: cc22 sw s0,24(sp) + 30053ec: 1000 addi s0,sp,32 + 30053ee: fea42623 sw a0,-20(s0) + 30053f2: feb42423 sw a1,-24(s0) + 30053f6: fec42223 sw a2,-28(s0) + 30053fa: fec42783 lw a5,-20(s0) + 30053fe: eb89 bnez a5,3005410 + 3005400: 0fa00593 li a1,250 + 3005404: 030067b7 lui a5,0x3006 + 3005408: 62c78513 addi a0,a5,1580 # 300662c + 300540c: 35b5 jal ra,3005278 + 300540e: a001 j 300540e + 3005410: fe442783 lw a5,-28(s0) + 3005414: eb89 bnez a5,3005426 + 3005416: 0fb00593 li a1,251 + 300541a: 030067b7 lui a5,0x3006 + 300541e: 62c78513 addi a0,a5,1580 # 300662c + 3005422: 3d99 jal ra,3005278 + 3005424: a001 j 3005424 + 3005426: fe842503 lw a0,-24(s0) + 300542a: 3e89 jal ra,3004f7c + 300542c: 87aa mv a5,a0 + 300542e: 0017c793 xori a5,a5,1 + 3005432: 9f81 uxtb a5 + 3005434: cb89 beqz a5,3005446 + 3005436: 0fc00593 li a1,252 + 300543a: 030067b7 lui a5,0x3006 + 300543e: 62c78513 addi a0,a5,1580 # 300662c + 3005442: 3d1d jal ra,3005278 + 3005444: a001 j 3005444 + 3005446: fe842783 lw a5,-24(s0) + 300544a: cb91 beqz a5,300545e + 300544c: 4705 li a4,1 + 300544e: 00e79e63 bne a5,a4,300546a + 3005452: fec42783 lw a5,-20(s0) + 3005456: fe442703 lw a4,-28(s0) + 300545a: d3d8 sw a4,36(a5) + 300545c: a809 j 300546e + 300545e: fec42783 lw a5,-20(s0) + 3005462: fe442703 lw a4,-28(s0) + 3005466: d398 sw a4,32(a5) + 3005468: a019 j 300546e + 300546a: 4785 li a5,1 + 300546c: a011 j 3005470 + 300546e: 4781 li a5,0 + 3005470: 853e mv a0,a5 + 3005472: 40f2 lw ra,28(sp) + 3005474: 4462 lw s0,24(sp) + 3005476: 6105 addi sp,sp,32 + 3005478: 8082 ret + +0300547a : + 300547a: 1101 addi sp,sp,-32 + 300547c: ce22 sw s0,28(sp) + 300547e: 1000 addi s0,sp,32 + 3005480: fea42623 sw a0,-20(s0) + 3005484: fec42783 lw a5,-20(s0) + 3005488: 0047b793 sltiu a5,a5,4 + 300548c: 9f81 uxtb a5 + 300548e: 853e mv a0,a5 + 3005490: 4472 lw s0,28(sp) + 3005492: 6105 addi sp,sp,32 + 3005494: 8082 ret + +03005496 : + 3005496: 1101 addi sp,sp,-32 + 3005498: ce22 sw s0,28(sp) + 300549a: 1000 addi s0,sp,32 + 300549c: fea42623 sw a0,-20(s0) + 30054a0: fec42783 lw a5,-20(s0) + 30054a4: c791 beqz a5,30054b0 + 30054a6: fec42703 lw a4,-20(s0) + 30054aa: 4785 li a5,1 + 30054ac: 00f71463 bne a4,a5,30054b4 + 30054b0: 4785 li a5,1 + 30054b2: a011 j 30054b6 + 30054b4: 4781 li a5,0 + 30054b6: 8b85 andi a5,a5,1 + 30054b8: 9f81 uxtb a5 + 30054ba: 853e mv a0,a5 + 30054bc: 4472 lw s0,28(sp) + 30054be: 6105 addi sp,sp,32 + 30054c0: 8082 ret + +030054c2 : + 30054c2: 1101 addi sp,sp,-32 + 30054c4: ce22 sw s0,28(sp) + 30054c6: 1000 addi s0,sp,32 + 30054c8: fea42623 sw a0,-20(s0) + 30054cc: fec42703 lw a4,-20(s0) + 30054d0: 4791 li a5,4 + 30054d2: 00e7e463 bltu a5,a4,30054da + 30054d6: 4785 li a5,1 + 30054d8: a011 j 30054dc + 30054da: 4781 li a5,0 + 30054dc: 853e mv a0,a5 + 30054de: 4472 lw s0,28(sp) + 30054e0: 6105 addi sp,sp,32 + 30054e2: 8082 ret + +030054e4 : + 30054e4: 1101 addi sp,sp,-32 + 30054e6: ce22 sw s0,28(sp) + 30054e8: 1000 addi s0,sp,32 + 30054ea: fea42623 sw a0,-20(s0) + 30054ee: fec42783 lw a5,-20(s0) + 30054f2: c385 beqz a5,3005512 + 30054f4: fec42703 lw a4,-20(s0) + 30054f8: 4785 li a5,1 + 30054fa: 00f70c63 beq a4,a5,3005512 + 30054fe: fec42703 lw a4,-20(s0) + 3005502: 4789 li a5,2 + 3005504: 00f70763 beq a4,a5,3005512 + 3005508: fec42703 lw a4,-20(s0) + 300550c: 478d li a5,3 + 300550e: 00f71463 bne a4,a5,3005516 + 3005512: 4785 li a5,1 + 3005514: a011 j 3005518 + 3005516: 4781 li a5,0 + 3005518: 853e mv a0,a5 + 300551a: 4472 lw s0,28(sp) + 300551c: 6105 addi sp,sp,32 + 300551e: 8082 ret + +03005520 : + 3005520: 1101 addi sp,sp,-32 + 3005522: ce22 sw s0,28(sp) + 3005524: 1000 addi s0,sp,32 + 3005526: fea42623 sw a0,-20(s0) + 300552a: fec42783 lw a5,-20(s0) + 300552e: 0107b793 sltiu a5,a5,16 + 3005532: 9f81 uxtb a5 + 3005534: 853e mv a0,a5 + 3005536: 4472 lw s0,28(sp) + 3005538: 6105 addi sp,sp,32 + 300553a: 8082 ret + +0300553c : + 300553c: 1101 addi sp,sp,-32 + 300553e: ce22 sw s0,28(sp) + 3005540: 1000 addi s0,sp,32 + 3005542: fea42623 sw a0,-20(s0) + 3005546: fec42783 lw a5,-20(s0) + 300554a: 0057b793 sltiu a5,a5,5 + 300554e: 9f81 uxtb a5 + 3005550: 853e mv a0,a5 + 3005552: 4472 lw s0,28(sp) + 3005554: 6105 addi sp,sp,32 + 3005556: 8082 ret + +03005558 : + 3005558: 7179 addi sp,sp,-48 + 300555a: d622 sw s0,44(sp) + 300555c: 1800 addi s0,sp,48 + 300555e: fca42e23 sw a0,-36(s0) + 3005562: fcb42c23 sw a1,-40(s0) + 3005566: fd842783 lw a5,-40(s0) + 300556a: e399 bnez a5,3005570 + 300556c: 4781 li a5,0 + 300556e: a005 j 300558e + 3005570: fd842783 lw a5,-40(s0) + 3005574: 0017d713 srli a4,a5,0x1 + 3005578: fdc42783 lw a5,-36(s0) + 300557c: 973e add a4,a4,a5 + 300557e: fd842783 lw a5,-40(s0) + 3005582: 02f757b3 divu a5,a4,a5 + 3005586: fef42623 sw a5,-20(s0) + 300558a: fec42783 lw a5,-20(s0) + 300558e: 853e mv a0,a5 + 3005590: 5432 lw s0,44(sp) + 3005592: 6145 addi sp,sp,48 + 3005594: 8082 ret + +03005596 : + 3005596: 1101 addi sp,sp,-32 + 3005598: ce22 sw s0,28(sp) + 300559a: 1000 addi s0,sp,32 + 300559c: fea42623 sw a0,-20(s0) + 30055a0: fec42783 lw a5,-20(s0) + 30055a4: 4b9c lw a5,16(a5) + 30055a6: 4711 li a4,4 + 30055a8: 06f76e63 bltu a4,a5,3005624 + 30055ac: 00279713 slli a4,a5,0x2 + 30055b0: 030067b7 lui a5,0x3006 + 30055b4: 64c78793 addi a5,a5,1612 # 300664c + 30055b8: 97ba add a5,a5,a4 + 30055ba: 439c lw a5,0(a5) + 30055bc: 8782 jr a5 + 30055be: fec42783 lw a5,-20(s0) + 30055c2: 439c lw a5,0(a5) + 30055c4: 57d8 lw a4,44(a5) + 30055c6: fec42783 lw a5,-20(s0) + 30055ca: 439c lw a5,0(a5) + 30055cc: 00276713 ori a4,a4,2 + 30055d0: d7d8 sw a4,44(a5) + 30055d2: a891 j 3005626 + 30055d4: fec42783 lw a5,-20(s0) + 30055d8: 439c lw a5,0(a5) + 30055da: 57d8 lw a4,44(a5) + 30055dc: fec42783 lw a5,-20(s0) + 30055e0: 439c lw a5,0(a5) + 30055e2: 00676713 ori a4,a4,6 + 30055e6: d7d8 sw a4,44(a5) + 30055e8: a83d j 3005626 + 30055ea: fec42783 lw a5,-20(s0) + 30055ee: 439c lw a5,0(a5) + 30055f0: 57d8 lw a4,44(a5) + 30055f2: fec42783 lw a5,-20(s0) + 30055f6: 439c lw a5,0(a5) + 30055f8: 08276713 ori a4,a4,130 + 30055fc: d7d8 sw a4,44(a5) + 30055fe: a025 j 3005626 + 3005600: fec42783 lw a5,-20(s0) + 3005604: 439c lw a5,0(a5) + 3005606: 57d8 lw a4,44(a5) + 3005608: fec42783 lw a5,-20(s0) + 300560c: 439c lw a5,0(a5) + 300560e: 08676713 ori a4,a4,134 + 3005612: d7d8 sw a4,44(a5) + 3005614: a809 j 3005626 + 3005616: fec42783 lw a5,-20(s0) + 300561a: 4398 lw a4,0(a5) + 300561c: 575c lw a5,44(a4) + 300561e: 9bf5 andi a5,a5,-3 + 3005620: d75c sw a5,44(a4) + 3005622: a011 j 3005626 + 3005624: 0001 nop + 3005626: 4472 lw s0,28(sp) + 3005628: 6105 addi sp,sp,32 + 300562a: 8082 ret + +0300562c : + 300562c: 7179 addi sp,sp,-48 + 300562e: d606 sw ra,44(sp) + 3005630: d422 sw s0,40(sp) + 3005632: 1800 addi s0,sp,48 + 3005634: fca42e23 sw a0,-36(s0) + 3005638: fdc42783 lw a5,-36(s0) + 300563c: eb89 bnez a5,300564e + 300563e: 09700593 li a1,151 + 3005642: 030067b7 lui a5,0x3006 + 3005646: 66078513 addi a0,a5,1632 # 3006660 + 300564a: 313d jal ra,3005278 + 300564c: a001 j 300564c + 300564e: fdc42783 lw a5,-36(s0) + 3005652: 4398 lw a4,0(a5) + 3005654: 140007b7 lui a5,0x14000 + 3005658: 02f70f63 beq a4,a5,3005696 + 300565c: fdc42783 lw a5,-36(s0) + 3005660: 4398 lw a4,0(a5) + 3005662: 140017b7 lui a5,0x14001 + 3005666: 02f70863 beq a4,a5,3005696 + 300566a: fdc42783 lw a5,-36(s0) + 300566e: 4398 lw a4,0(a5) + 3005670: 140027b7 lui a5,0x14002 + 3005674: 02f70163 beq a4,a5,3005696 + 3005678: fdc42783 lw a5,-36(s0) + 300567c: 4398 lw a4,0(a5) + 300567e: 140037b7 lui a5,0x14003 + 3005682: 00f70a63 beq a4,a5,3005696 + 3005686: 09800593 li a1,152 + 300568a: 030067b7 lui a5,0x3006 + 300568e: 66078513 addi a0,a5,1632 # 3006660 + 3005692: 36dd jal ra,3005278 + 3005694: a001 j 3005694 + 3005696: fdc42783 lw a5,-36(s0) + 300569a: 47bc lw a5,72(a5) + 300569c: cb91 beqz a5,30056b0 + 300569e: 09900593 li a1,153 + 30056a2: 030067b7 lui a5,0x3006 + 30056a6: 66078513 addi a0,a5,1632 # 3006660 + 30056aa: 36f9 jal ra,3005278 + 30056ac: 4785 li a5,1 + 30056ae: ae0d j 30059e0 + 30056b0: fdc42783 lw a5,-36(s0) + 30056b4: 47fc lw a5,76(a5) + 30056b6: cb91 beqz a5,30056ca + 30056b8: 09a00593 li a1,154 + 30056bc: 030067b7 lui a5,0x3006 + 30056c0: 66078513 addi a0,a5,1632 # 3006660 + 30056c4: 3e55 jal ra,3005278 + 30056c6: 4785 li a5,1 + 30056c8: ae21 j 30059e0 + 30056ca: fdc42783 lw a5,-36(s0) + 30056ce: 479c lw a5,8(a5) + 30056d0: 853e mv a0,a5 + 30056d2: 3365 jal ra,300547a + 30056d4: 87aa mv a5,a0 + 30056d6: 0017c793 xori a5,a5,1 + 30056da: 9f81 uxtb a5 + 30056dc: cb91 beqz a5,30056f0 + 30056de: 09c00593 li a1,156 + 30056e2: 030067b7 lui a5,0x3006 + 30056e6: 66078513 addi a0,a5,1632 # 3006660 + 30056ea: 3679 jal ra,3005278 + 30056ec: 4785 li a5,1 + 30056ee: accd j 30059e0 + 30056f0: fdc42783 lw a5,-36(s0) + 30056f4: 47dc lw a5,12(a5) + 30056f6: 853e mv a0,a5 + 30056f8: 3b79 jal ra,3005496 + 30056fa: 87aa mv a5,a0 + 30056fc: 0017c793 xori a5,a5,1 + 3005700: 9f81 uxtb a5 + 3005702: cb91 beqz a5,3005716 + 3005704: 09d00593 li a1,157 + 3005708: 030067b7 lui a5,0x3006 + 300570c: 66078513 addi a0,a5,1632 # 3006660 + 3005710: 36a5 jal ra,3005278 + 3005712: 4785 li a5,1 + 3005714: a4f1 j 30059e0 + 3005716: fdc42783 lw a5,-36(s0) + 300571a: 4b9c lw a5,16(a5) + 300571c: 853e mv a0,a5 + 300571e: 3355 jal ra,30054c2 + 3005720: 87aa mv a5,a0 + 3005722: 0017c793 xori a5,a5,1 + 3005726: 9f81 uxtb a5 + 3005728: cb91 beqz a5,300573c + 300572a: 09e00593 li a1,158 + 300572e: 030067b7 lui a5,0x3006 + 3005732: 66078513 addi a0,a5,1632 # 3006660 + 3005736: 3689 jal ra,3005278 + 3005738: 4785 li a5,1 + 300573a: a45d j 30059e0 + 300573c: fdc42783 lw a5,-36(s0) + 3005740: 4bdc lw a5,20(a5) + 3005742: 853e mv a0,a5 + 3005744: 3345 jal ra,30054e4 + 3005746: 87aa mv a5,a0 + 3005748: 0017c793 xori a5,a5,1 + 300574c: 9f81 uxtb a5 + 300574e: cb91 beqz a5,3005762 + 3005750: 09f00593 li a1,159 + 3005754: 030067b7 lui a5,0x3006 + 3005758: 66078513 addi a0,a5,1632 # 3006660 + 300575c: 3e31 jal ra,3005278 + 300575e: 4785 li a5,1 + 3005760: a441 j 30059e0 + 3005762: fdc42783 lw a5,-36(s0) + 3005766: 4f9c lw a5,24(a5) + 3005768: 853e mv a0,a5 + 300576a: 3bad jal ra,30054e4 + 300576c: 87aa mv a5,a0 + 300576e: 0017c793 xori a5,a5,1 + 3005772: 9f81 uxtb a5 + 3005774: cb91 beqz a5,3005788 + 3005776: 0a000593 li a1,160 + 300577a: 030067b7 lui a5,0x3006 + 300577e: 66078513 addi a0,a5,1632 # 3006660 + 3005782: 3cdd jal ra,3005278 + 3005784: 4785 li a5,1 + 3005786: aca9 j 30059e0 + 3005788: fdc42783 lw a5,-36(s0) + 300578c: 5b9c lw a5,48(a5) + 300578e: 853e mv a0,a5 + 3005790: 3b41 jal ra,3005520 + 3005792: 87aa mv a5,a0 + 3005794: 0017c793 xori a5,a5,1 + 3005798: 9f81 uxtb a5 + 300579a: cb91 beqz a5,30057ae + 300579c: 0a100593 li a1,161 + 30057a0: 030067b7 lui a5,0x3006 + 30057a4: 66078513 addi a0,a5,1632 # 3006660 + 30057a8: 3cc1 jal ra,3005278 + 30057aa: 4785 li a5,1 + 30057ac: ac15 j 30059e0 + 30057ae: fdc42783 lw a5,-36(s0) + 30057b2: 5bdc lw a5,52(a5) + 30057b4: 853e mv a0,a5 + 30057b6: 33ad jal ra,3005520 + 30057b8: 87aa mv a5,a0 + 30057ba: 0017c793 xori a5,a5,1 + 30057be: 9f81 uxtb a5 + 30057c0: cb91 beqz a5,30057d4 + 30057c2: 0a200593 li a1,162 + 30057c6: 030067b7 lui a5,0x3006 + 30057ca: 66078513 addi a0,a5,1632 # 3006660 + 30057ce: 346d jal ra,3005278 + 30057d0: 4785 li a5,1 + 30057d2: a439 j 30059e0 + 30057d4: fdc42783 lw a5,-36(s0) + 30057d8: 5fbc lw a5,120(a5) + 30057da: 853e mv a0,a5 + 30057dc: 3385 jal ra,300553c + 30057de: 87aa mv a5,a0 + 30057e0: 0017c793 xori a5,a5,1 + 30057e4: 9f81 uxtb a5 + 30057e6: cb91 beqz a5,30057fa + 30057e8: 0a300593 li a1,163 + 30057ec: 030067b7 lui a5,0x3006 + 30057f0: 66078513 addi a0,a5,1632 # 3006660 + 30057f4: 3451 jal ra,3005278 + 30057f6: 4785 li a5,1 + 30057f8: a2e5 j 30059e0 + 30057fa: fdc42783 lw a5,-36(s0) + 30057fe: 4398 lw a4,0(a5) + 3005800: 5b1c lw a5,48(a4) + 3005802: 9bf9 andi a5,a5,-2 + 3005804: db1c sw a5,48(a4) + 3005806: 0001 nop + 3005808: fdc42783 lw a5,-36(s0) + 300580c: 439c lw a5,0(a5) + 300580e: 4f9c lw a5,24(a5) + 3005810: 838d srli a5,a5,0x3 + 3005812: 8b85 andi a5,a5,1 + 3005814: 0ff7f713 andi a4,a5,255 + 3005818: 4785 li a5,1 + 300581a: fef707e3 beq a4,a5,3005808 + 300581e: fdc42783 lw a5,-36(s0) + 3005822: 439c lw a5,0(a5) + 3005824: 853e mv a0,a5 + 3005826: 9f1fd0ef jal ra,3003216 + 300582a: fea42623 sw a0,-20(s0) + 300582e: fdc42783 lw a5,-36(s0) + 3005832: 5fb4 lw a3,120(a5) + 3005834: fdc42783 lw a5,-36(s0) + 3005838: 4398 lw a4,0(a5) + 300583a: 87b6 mv a5,a3 + 300583c: 8bbd andi a5,a5,15 + 300583e: 0ff7f693 andi a3,a5,255 + 3005842: 4f3c lw a5,88(a4) + 3005844: 8abd andi a3,a3,15 + 3005846: 9bc1 andi a5,a5,-16 + 3005848: 8fd5 or a5,a5,a3 + 300584a: cf3c sw a5,88(a4) + 300584c: fdc42783 lw a5,-36(s0) + 3005850: 4398 lw a4,0(a5) + 3005852: fdc42783 lw a5,-36(s0) + 3005856: 07c7c683 lbu a3,124(a5) + 300585a: 4b3c lw a5,80(a4) + 300585c: 8a85 andi a3,a3,1 + 300585e: 9bf9 andi a5,a5,-2 + 3005860: 8fd5 or a5,a5,a3 + 3005862: cb3c sw a5,80(a4) + 3005864: fdc42783 lw a5,-36(s0) + 3005868: 439c lw a5,0(a5) + 300586a: 4fbc lw a5,88(a5) + 300586c: fef42423 sw a5,-24(s0) + 3005870: fdc42783 lw a5,-36(s0) + 3005874: 43d8 lw a4,4(a5) + 3005876: 46c1 li a3,16 + 3005878: fe842783 lw a5,-24(s0) + 300587c: 40f687b3 sub a5,a3,a5 + 3005880: fec42683 lw a3,-20(s0) + 3005884: 02f6d7b3 divu a5,a3,a5 + 3005888: 00e7f463 bgeu a5,a4,3005890 + 300588c: 4785 li a5,1 + 300588e: aa89 j 30059e0 + 3005890: 4741 li a4,16 + 3005892: fe842783 lw a5,-24(s0) + 3005896: 40f707b3 sub a5,a4,a5 + 300589a: fec42703 lw a4,-20(s0) + 300589e: 02f757b3 divu a5,a4,a5 + 30058a2: 079a slli a5,a5,0x6 + 30058a4: fef42223 sw a5,-28(s0) + 30058a8: fdc42783 lw a5,-36(s0) + 30058ac: 43dc lw a5,4(a5) + 30058ae: 85be mv a1,a5 + 30058b0: fe442503 lw a0,-28(s0) + 30058b4: 3155 jal ra,3005558 + 30058b6: fea42023 sw a0,-32(s0) + 30058ba: fdc42783 lw a5,-36(s0) + 30058be: 439c lw a5,0(a5) + 30058c0: 0207a423 sw zero,40(a5) + 30058c4: fdc42783 lw a5,-36(s0) + 30058c8: 439c lw a5,0(a5) + 30058ca: 0207a223 sw zero,36(a5) + 30058ce: fdc42783 lw a5,-36(s0) + 30058d2: 439c lw a5,0(a5) + 30058d4: fe042703 lw a4,-32(s0) + 30058d8: 03f77713 andi a4,a4,63 + 30058dc: d798 sw a4,40(a5) + 30058de: fdc42783 lw a5,-36(s0) + 30058e2: 439c lw a5,0(a5) + 30058e4: fe042703 lw a4,-32(s0) + 30058e8: 8319 srli a4,a4,0x6 + 30058ea: d3d8 sw a4,36(a5) + 30058ec: fdc42783 lw a5,-36(s0) + 30058f0: 439c lw a5,0(a5) + 30058f2: 0207a623 sw zero,44(a5) + 30058f6: fdc42783 lw a5,-36(s0) + 30058fa: 4794 lw a3,8(a5) + 30058fc: fdc42783 lw a5,-36(s0) + 3005900: 4398 lw a4,0(a5) + 3005902: 87b6 mv a5,a3 + 3005904: 8b8d andi a5,a5,3 + 3005906: 0ff7f693 andi a3,a5,255 + 300590a: 575c lw a5,44(a4) + 300590c: 8a8d andi a3,a3,3 + 300590e: 0696 slli a3,a3,0x5 + 3005910: f9f7f793 andi a5,a5,-97 + 3005914: 8fd5 or a5,a5,a3 + 3005916: d75c sw a5,44(a4) + 3005918: fdc42783 lw a5,-36(s0) + 300591c: 47d4 lw a3,12(a5) + 300591e: fdc42783 lw a5,-36(s0) + 3005922: 4398 lw a4,0(a5) + 3005924: 87b6 mv a5,a3 + 3005926: 8b85 andi a5,a5,1 + 3005928: 0ff7f693 andi a3,a5,255 + 300592c: 575c lw a5,44(a4) + 300592e: 8a85 andi a3,a3,1 + 3005930: 068e slli a3,a3,0x3 + 3005932: 9bdd andi a5,a5,-9 + 3005934: 8fd5 or a5,a5,a3 + 3005936: d75c sw a5,44(a4) + 3005938: fdc42503 lw a0,-36(s0) + 300593c: 39a9 jal ra,3005596 + 300593e: fdc42783 lw a5,-36(s0) + 3005942: 02c7c783 lbu a5,44(a5) + 3005946: cbb1 beqz a5,300599a + 3005948: fdc42783 lw a5,-36(s0) + 300594c: 4398 lw a4,0(a5) + 300594e: 575c lw a5,44(a4) + 3005950: 0107e793 ori a5,a5,16 + 3005954: d75c sw a5,44(a4) + 3005956: fdc42783 lw a5,-36(s0) + 300595a: 5bd4 lw a3,52(a5) + 300595c: fdc42783 lw a5,-36(s0) + 3005960: 4398 lw a4,0(a5) + 3005962: 87b6 mv a5,a3 + 3005964: 8bbd andi a5,a5,15 + 3005966: 0ff7f693 andi a3,a5,255 + 300596a: 5b5c lw a5,52(a4) + 300596c: 8abd andi a3,a3,15 + 300596e: 06a2 slli a3,a3,0x8 + 3005970: 767d lui a2,0xfffff + 3005972: 0ff60613 addi a2,a2,255 # fffff0ff + 3005976: 8ff1 and a5,a5,a2 + 3005978: 8fd5 or a5,a5,a3 + 300597a: db5c sw a5,52(a4) + 300597c: fdc42783 lw a5,-36(s0) + 3005980: 5b94 lw a3,48(a5) + 3005982: fdc42783 lw a5,-36(s0) + 3005986: 4398 lw a4,0(a5) + 3005988: 87b6 mv a5,a3 + 300598a: 8bbd andi a5,a5,15 + 300598c: 0ff7f693 andi a3,a5,255 + 3005990: 5b5c lw a5,52(a4) + 3005992: 8abd andi a3,a3,15 + 3005994: 9bc1 andi a5,a5,-16 + 3005996: 8fd5 or a5,a5,a3 + 3005998: db5c sw a5,52(a4) + 300599a: fdc42783 lw a5,-36(s0) + 300599e: 5f98 lw a4,56(a5) + 30059a0: 4785 li a5,1 + 30059a2: 00f71c63 bne a4,a5,30059ba + 30059a6: fdc42783 lw a5,-36(s0) + 30059aa: 439c lw a5,0(a5) + 30059ac: 5b94 lw a3,48(a5) + 30059ae: fdc42783 lw a5,-36(s0) + 30059b2: 439c lw a5,0(a5) + 30059b4: 6731 lui a4,0xc + 30059b6: 8f55 or a4,a4,a3 + 30059b8: db98 sw a4,48(a5) + 30059ba: fdc42783 lw a5,-36(s0) + 30059be: 439c lw a5,0(a5) + 30059c0: 5b98 lw a4,48(a5) + 30059c2: fdc42783 lw a5,-36(s0) + 30059c6: 439c lw a5,0(a5) + 30059c8: 30176713 ori a4,a4,769 + 30059cc: db98 sw a4,48(a5) + 30059ce: fdc42783 lw a5,-36(s0) + 30059d2: 4705 li a4,1 + 30059d4: c7b8 sw a4,72(a5) + 30059d6: fdc42783 lw a5,-36(s0) + 30059da: 4705 li a4,1 + 30059dc: c7f8 sw a4,76(a5) + 30059de: 4781 li a5,0 + 30059e0: 853e mv a0,a5 + 30059e2: 50b2 lw ra,44(sp) + 30059e4: 5422 lw s0,40(sp) + 30059e6: 6145 addi sp,sp,48 + 30059e8: 8082 ret + +030059ea
: + 30059ea: 1141 addi sp,sp,-16 + 30059ec: c606 sw ra,12(sp) + 30059ee: c422 sw s0,8(sp) + 30059f0: 0800 addi s0,sp,16 + 30059f2: 2655 jal ra,3005d96 + 30059f4: a001 j 30059f4 + +030059f6 : + 30059f6: 715d addi sp,sp,-80 + 30059f8: c686 sw ra,76(sp) + 30059fa: c4a2 sw s0,72(sp) + 30059fc: 0880 addi s0,sp,80 + 30059fe: faa42e23 sw a0,-68(s0) + 3005a02: 100007b7 lui a5,0x10000 + 3005a06: fcf42423 sw a5,-56(s0) + 3005a0a: fc042623 sw zero,-52(s0) + 3005a0e: 478d li a5,3 + 3005a10: fcf42823 sw a5,-48(s0) + 3005a14: 03000793 li a5,48 + 3005a18: fcf42a23 sw a5,-44(s0) + 3005a1c: 4785 li a5,1 + 3005a1e: fcf42c23 sw a5,-40(s0) + 3005a22: 4789 li a5,2 + 3005a24: fef42023 sw a5,-32(s0) + 3005a28: 4789 li a5,2 + 3005a2a: fef42223 sw a5,-28(s0) + 3005a2e: fe042423 sw zero,-24(s0) + 3005a32: 47e1 li a5,24 + 3005a34: fef42623 sw a5,-20(s0) + 3005a38: fc840793 addi a5,s0,-56 + 3005a3c: 853e mv a0,a5 + 3005a3e: aecfd0ef jal ra,3002d2a + 3005a42: 87aa mv a5,a0 + 3005a44: c399 beqz a5,3005a4a + 3005a46: 4785 li a5,1 + 3005a48: a039 j 3005a56 + 3005a4a: fe042703 lw a4,-32(s0) + 3005a4e: fbc42783 lw a5,-68(s0) + 3005a52: c398 sw a4,0(a5) + 3005a54: 4781 li a5,0 + 3005a56: 853e mv a0,a5 + 3005a58: 40b6 lw ra,76(sp) + 3005a5a: 4426 lw s0,72(sp) + 3005a5c: 6161 addi sp,sp,80 + 3005a5e: 8082 ret + +03005a60 : + 3005a60: 7179 addi sp,sp,-48 + 3005a62: d606 sw ra,44(sp) + 3005a64: d422 sw s0,40(sp) + 3005a66: 1800 addi s0,sp,48 + 3005a68: 4585 li a1,1 + 3005a6a: 18000537 lui a0,0x18000 + 3005a6e: 2c81 jal ra,3005cbe + 3005a70: 4589 li a1,2 + 3005a72: 18000537 lui a0,0x18000 + 3005a76: 95dfd0ef jal ra,30033d2 + 3005a7a: 4581 li a1,0 + 3005a7c: 18000537 lui a0,0x18000 + 3005a80: a09fd0ef jal ra,3003488 + 3005a84: 040007b7 lui a5,0x4000 + 3005a88: 54478793 addi a5,a5,1348 # 4000544 + 3005a8c: 18000737 lui a4,0x18000 + 3005a90: c398 sw a4,0(a5) + 3005a92: 040007b7 lui a5,0x4000 + 3005a96: 54478793 addi a5,a5,1348 # 4000544 + 3005a9a: 0007a223 sw zero,4(a5) + 3005a9e: 040007b7 lui a5,0x4000 + 3005aa2: 54478513 addi a0,a5,1348 # 4000544 + 3005aa6: f75fb0ef jal ra,3001a1a + 3005aaa: fc042e23 sw zero,-36(s0) + 3005aae: fe042023 sw zero,-32(s0) + 3005ab2: fe042223 sw zero,-28(s0) + 3005ab6: fe042423 sw zero,-24(s0) + 3005aba: fe042623 sw zero,-20(s0) + 3005abe: 4799 li a5,6 + 3005ac0: fcf42e23 sw a5,-36(s0) + 3005ac4: 4789 li a5,2 + 3005ac6: fef42023 sw a5,-32(s0) + 3005aca: fe042223 sw zero,-28(s0) + 3005ace: 4785 li a5,1 + 3005ad0: fef40423 sb a5,-24(s0) + 3005ad4: 4785 li a5,1 + 3005ad6: fef42623 sw a5,-20(s0) + 3005ada: fdc40793 addi a5,s0,-36 + 3005ade: 863e mv a2,a5 + 3005ae0: 4585 li a1,1 + 3005ae2: 040007b7 lui a5,0x4000 + 3005ae6: 54478513 addi a0,a5,1348 # 4000544 + 3005aea: fe3fb0ef jal ra,3001acc + 3005aee: 0001 nop + 3005af0: 50b2 lw ra,44(sp) + 3005af2: 5422 lw s0,40(sp) + 3005af4: 6145 addi sp,sp,48 + 3005af6: 8082 ret + +03005af8 : + 3005af8: 1101 addi sp,sp,-32 + 3005afa: ce06 sw ra,28(sp) + 3005afc: cc22 sw s0,24(sp) + 3005afe: 1000 addi s0,sp,32 + 3005b00: 4585 li a1,1 + 3005b02: 14303537 lui a0,0x14303 + 3005b06: 2a65 jal ra,3005cbe + 3005b08: 14303537 lui a0,0x14303 + 3005b0c: f0afd0ef jal ra,3003216 + 3005b10: 872a mv a4,a0 + 3005b12: 000f47b7 lui a5,0xf4 + 3005b16: 24078793 addi a5,a5,576 # f4240 + 3005b1a: 02f75733 divu a4,a4,a5 + 3005b1e: 47a9 li a5,10 + 3005b20: 02f707b3 mul a5,a4,a5 + 3005b24: fef42623 sw a5,-20(s0) + 3005b28: 040007b7 lui a5,0x4000 + 3005b2c: 49c78793 addi a5,a5,1180 # 400049c + 3005b30: 14303737 lui a4,0x14303 + 3005b34: c398 sw a4,0(a5) + 3005b36: fec42783 lw a5,-20(s0) + 3005b3a: fff78713 addi a4,a5,-1 + 3005b3e: 040007b7 lui a5,0x4000 + 3005b42: 49c78793 addi a5,a5,1180 # 400049c + 3005b46: cbd8 sw a4,20(a5) + 3005b48: fec42783 lw a5,-20(s0) + 3005b4c: fff78713 addi a4,a5,-1 + 3005b50: 040007b7 lui a5,0x4000 + 3005b54: 49c78793 addi a5,a5,1180 # 400049c + 3005b58: cf98 sw a4,24(a5) + 3005b5a: 040007b7 lui a5,0x4000 + 3005b5e: 49c78793 addi a5,a5,1180 # 400049c + 3005b62: 4705 li a4,1 + 3005b64: c798 sw a4,8(a5) + 3005b66: 040007b7 lui a5,0x4000 + 3005b6a: 49c78793 addi a5,a5,1180 # 400049c + 3005b6e: 0007a623 sw zero,12(a5) + 3005b72: 040007b7 lui a5,0x4000 + 3005b76: 49c78793 addi a5,a5,1180 # 400049c + 3005b7a: 4705 li a4,1 + 3005b7c: cb98 sw a4,16(a5) + 3005b7e: 040007b7 lui a5,0x4000 + 3005b82: 49c78793 addi a5,a5,1180 # 400049c + 3005b86: 4705 li a4,1 + 3005b88: afd8 sb a4,28(a5) + 3005b8a: 040007b7 lui a5,0x4000 + 3005b8e: 49c78793 addi a5,a5,1180 # 400049c + 3005b92: 00078ea3 sb zero,29(a5) + 3005b96: 040007b7 lui a5,0x4000 + 3005b9a: 49c78793 addi a5,a5,1180 # 400049c + 3005b9e: 00078f23 sb zero,30(a5) + 3005ba2: 040007b7 lui a5,0x4000 + 3005ba6: 49c78513 addi a0,a5,1180 # 400049c + 3005baa: c7cff0ef jal ra,3005026 + 3005bae: 040007b7 lui a5,0x4000 + 3005bb2: 49c78613 addi a2,a5,1180 # 400049c + 3005bb6: 030057b7 lui a5,0x3005 + 3005bba: 2fe78593 addi a1,a5,766 # 30052fe + 3005bbe: 02300513 li a0,35 + 3005bc2: cf0fc0ef jal ra,30020b2 + 3005bc6: 030067b7 lui a5,0x3006 + 3005bca: dd678613 addi a2,a5,-554 # 3005dd6 + 3005bce: 4581 li a1,0 + 3005bd0: 040007b7 lui a5,0x4000 + 3005bd4: 49c78513 addi a0,a5,1180 # 400049c + 3005bd8: 3039 jal ra,30053e6 + 3005bda: 4585 li a1,1 + 3005bdc: 02300513 li a0,35 + 3005be0: ca7fc0ef jal ra,3002886 + 3005be4: 02300513 li a0,35 + 3005be8: d50fc0ef jal ra,3002138 + 3005bec: 0001 nop + 3005bee: 40f2 lw ra,28(sp) + 3005bf0: 4462 lw s0,24(sp) + 3005bf2: 6105 addi sp,sp,32 + 3005bf4: 8082 ret + +03005bf6 : + 3005bf6: 1141 addi sp,sp,-16 + 3005bf8: c606 sw ra,12(sp) + 3005bfa: c422 sw s0,8(sp) + 3005bfc: 0800 addi s0,sp,16 + 3005bfe: 4585 li a1,1 + 3005c00: 14000537 lui a0,0x14000 + 3005c04: 286d jal ra,3005cbe + 3005c06: 040007b7 lui a5,0x4000 + 3005c0a: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c0e: 14000737 lui a4,0x14000 + 3005c12: c398 sw a4,0(a5) + 3005c14: 040007b7 lui a5,0x4000 + 3005c18: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c1c: 6771 lui a4,0x1c + 3005c1e: 20070713 addi a4,a4,512 # 1c200 + 3005c22: c3d8 sw a4,4(a5) + 3005c24: 040007b7 lui a5,0x4000 + 3005c28: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c2c: 470d li a4,3 + 3005c2e: c798 sw a4,8(a5) + 3005c30: 040007b7 lui a5,0x4000 + 3005c34: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c38: 0007a623 sw zero,12(a5) + 3005c3c: 040007b7 lui a5,0x4000 + 3005c40: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c44: 4711 li a4,4 + 3005c46: cb98 sw a4,16(a5) + 3005c48: 040007b7 lui a5,0x4000 + 3005c4c: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c50: 0007aa23 sw zero,20(a5) + 3005c54: 040007b7 lui a5,0x4000 + 3005c58: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c5c: 0007ac23 sw zero,24(a5) + 3005c60: 040007b7 lui a5,0x4000 + 3005c64: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c68: 4705 li a4,1 + 3005c6a: 02e78623 sb a4,44(a5) + 3005c6e: 040007b7 lui a5,0x4000 + 3005c72: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c76: 4721 li a4,8 + 3005c78: db98 sw a4,48(a5) + 3005c7a: 040007b7 lui a5,0x4000 + 3005c7e: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c82: 4721 li a4,8 + 3005c84: dbd8 sw a4,52(a5) + 3005c86: 040007b7 lui a5,0x4000 + 3005c8a: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c8e: 0207ac23 sw zero,56(a5) + 3005c92: 040007b7 lui a5,0x4000 + 3005c96: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c9a: 0607ac23 sw zero,120(a5) + 3005c9e: 040007b7 lui a5,0x4000 + 3005ca2: 4c478793 addi a5,a5,1220 # 40004c4 + 3005ca6: 06078e23 sb zero,124(a5) + 3005caa: 040007b7 lui a5,0x4000 + 3005cae: 4c478513 addi a0,a5,1220 # 40004c4 + 3005cb2: 3aad jal ra,300562c + 3005cb4: 0001 nop + 3005cb6: 40b2 lw ra,12(sp) + 3005cb8: 4422 lw s0,8(sp) + 3005cba: 0141 addi sp,sp,16 + 3005cbc: 8082 ret + +03005cbe : + 3005cbe: e3cfd06f j 30032fa + +03005cc2 : + 3005cc2: 1141 addi sp,sp,-16 + 3005cc4: c606 sw ra,12(sp) + 3005cc6: c422 sw s0,8(sp) + 3005cc8: 0800 addi s0,sp,16 + 3005cca: 010c07b7 lui a5,0x10c0 + 3005cce: 23c78513 addi a0,a5,572 # 10c023c + 3005cd2: 20c1 jal ra,3005d92 + 3005cd4: 4581 li a1,0 + 3005cd6: 010c07b7 lui a5,0x10c0 + 3005cda: 23c78513 addi a0,a5,572 # 10c023c + 3005cde: 2845 jal ra,3005d8e + 3005ce0: 4581 li a1,0 + 3005ce2: 010c07b7 lui a5,0x10c0 + 3005ce6: 23c78513 addi a0,a5,572 # 10c023c + 3005cea: 2045 jal ra,3005d8a + 3005cec: 4585 li a1,1 + 3005cee: 010c07b7 lui a5,0x10c0 + 3005cf2: 23c78513 addi a0,a5,572 # 10c023c + 3005cf6: 2841 jal ra,3005d86 + 3005cf8: 4589 li a1,2 + 3005cfa: 010c07b7 lui a5,0x10c0 + 3005cfe: 23c78513 addi a0,a5,572 # 10c023c + 3005d02: 2041 jal ra,3005d82 + 3005d04: 019007b7 lui a5,0x1900 + 3005d08: 23378513 addi a0,a5,563 # 1900233 + 3005d0c: 2059 jal ra,3005d92 + 3005d0e: 4581 li a1,0 + 3005d10: 019007b7 lui a5,0x1900 + 3005d14: 23378513 addi a0,a5,563 # 1900233 + 3005d18: 289d jal ra,3005d8e + 3005d1a: 4581 li a1,0 + 3005d1c: 019007b7 lui a5,0x1900 + 3005d20: 23378513 addi a0,a5,563 # 1900233 + 3005d24: 209d jal ra,3005d8a + 3005d26: 4585 li a1,1 + 3005d28: 019007b7 lui a5,0x1900 + 3005d2c: 23378513 addi a0,a5,563 # 1900233 + 3005d30: 2899 jal ra,3005d86 + 3005d32: 4589 li a1,2 + 3005d34: 019007b7 lui a5,0x1900 + 3005d38: 23378513 addi a0,a5,563 # 1900233 + 3005d3c: 2099 jal ra,3005d82 + 3005d3e: 019407b7 lui a5,0x1940 + 3005d42: 23378513 addi a0,a5,563 # 1940233 + 3005d46: 20b1 jal ra,3005d92 + 3005d48: 4589 li a1,2 + 3005d4a: 019407b7 lui a5,0x1940 + 3005d4e: 23378513 addi a0,a5,563 # 1940233 + 3005d52: 2835 jal ra,3005d8e + 3005d54: 4581 li a1,0 + 3005d56: 019407b7 lui a5,0x1940 + 3005d5a: 23378513 addi a0,a5,563 # 1940233 + 3005d5e: 2035 jal ra,3005d8a + 3005d60: 4585 li a1,1 + 3005d62: 019407b7 lui a5,0x1940 + 3005d66: 23378513 addi a0,a5,563 # 1940233 + 3005d6a: 2831 jal ra,3005d86 + 3005d6c: 4589 li a1,2 + 3005d6e: 019407b7 lui a5,0x1940 + 3005d72: 23378513 addi a0,a5,563 # 1940233 + 3005d76: 2031 jal ra,3005d82 + 3005d78: 0001 nop + 3005d7a: 40b2 lw ra,12(sp) + 3005d7c: 4422 lw s0,8(sp) + 3005d7e: 0141 addi sp,sp,16 + 3005d80: 8082 ret + +03005d82 : + 3005d82: 978ff06f j 3004efa + +03005d86 : + 3005d86: 928ff06f j 3004eae + +03005d8a : + 3005d8a: 8d8ff06f j 3004e62 + +03005d8e : + 3005d8e: 888ff06f j 3004e16 + +03005d92 : + 3005d92: 84aff06f j 3004ddc + +03005d96 : + 3005d96: 1141 addi sp,sp,-16 + 3005d98: c606 sw ra,12(sp) + 3005d9a: c422 sw s0,8(sp) + 3005d9c: 0800 addi s0,sp,16 + 3005d9e: 3715 jal ra,3005cc2 + 3005da0: 3d99 jal ra,3005bf6 + 3005da2: 397d jal ra,3005a60 + 3005da4: 3b91 jal ra,3005af8 + 3005da6: 040007b7 lui a5,0x4000 + 3005daa: 49c78513 addi a0,a5,1180 # 400049c + 3005dae: cceff0ef jal ra,300527c + 3005db2: 040007b7 lui a5,0x4000 + 3005db6: 54478513 addi a0,a5,1348 # 4000544 + 3005dba: ec5fb0ef jal ra,3001c7e + 3005dbe: 4585 li a1,1 + 3005dc0: 040007b7 lui a5,0x4000 + 3005dc4: 54478513 addi a0,a5,1348 # 4000544 + 3005dc8: fe3fb0ef jal ra,3001daa + 3005dcc: 0001 nop + 3005dce: 40b2 lw ra,12(sp) + 3005dd0: 4422 lw s0,8(sp) + 3005dd2: 0141 addi sp,sp,16 + 3005dd4: 8082 ret + +03005dd6 : + 3005dd6: 7179 addi sp,sp,-48 + 3005dd8: d606 sw ra,44(sp) + 3005dda: d422 sw s0,40(sp) + 3005ddc: 1800 addi s0,sp,48 + 3005dde: fca42e23 sw a0,-36(s0) + 3005de2: 4585 li a1,1 + 3005de4: 040007b7 lui a5,0x4000 + 3005de8: 54478513 addi a0,a5,1348 # 4000544 + 3005dec: 840fc0ef jal ra,3001e2c + 3005df0: fea42623 sw a0,-20(s0) + 3005df4: fec42783 lw a5,-20(s0) + 3005df8: d017f753 fcvt.s.wu fa4,a5 + 3005dfc: 030067b7 lui a5,0x3006 + 3005e00: 68c7a787 flw fa5,1676(a5) # 300668c + 3005e04: 18f77753 fdiv.s fa4,fa4,fa5 + 3005e08: 040027b7 lui a5,0x4002 + 3005e0c: 2047a783 lw a5,516(a5) # 4002204 + 3005e10: 03006737 lui a4,0x3006 + 3005e14: 69072787 flw fa5,1680(a4) # 3006690 + 3005e18: 10f777d3 fmul.s fa5,fa4,fa5 + 3005e1c: 04000737 lui a4,0x4000 + 3005e20: 5e470713 addi a4,a4,1508 # 40005e4 + 3005e24: 078a slli a5,a5,0x2 + 3005e26: 97ba add a5,a5,a4 + 3005e28: e39c fsw fa5,0(a5) + 3005e2a: 040027b7 lui a5,0x4002 + 3005e2e: 2047a783 lw a5,516(a5) # 4002204 + 3005e32: 00178713 addi a4,a5,1 + 3005e36: 040027b7 lui a5,0x4002 + 3005e3a: 20e7a223 sw a4,516(a5) # 4002204 + 3005e3e: 040027b7 lui a5,0x4002 + 3005e42: 2047a703 lw a4,516(a5) # 4002204 + 3005e46: 70800793 li a5,1800 + 3005e4a: 06e7f563 bgeu a5,a4,3005eb4 + 3005e4e: 040027b7 lui a5,0x4002 + 3005e52: 2007a223 sw zero,516(a5) # 4002204 + 3005e56: a099 j 3005e9c + 3005e58: 040027b7 lui a5,0x4002 + 3005e5c: 2047a783 lw a5,516(a5) # 4002204 + 3005e60: 04000737 lui a4,0x4000 + 3005e64: 5e470713 addi a4,a4,1508 # 40005e4 + 3005e68: 078a slli a5,a5,0x2 + 3005e6a: 97ba add a5,a5,a4 + 3005e6c: 639c flw fa5,0(a5) + 3005e6e: 20f78553 fmv.s fa0,fa5 + 3005e72: 20b1 jal ra,3005ebe <__extendsfdf2> + 3005e74: 87aa mv a5,a0 + 3005e76: 882e mv a6,a1 + 3005e78: 863e mv a2,a5 + 3005e7a: 86c2 mv a3,a6 + 3005e7c: 030067b7 lui a5,0x3006 + 3005e80: 67c78513 addi a0,a5,1660 # 300667c + 3005e84: b85fe0ef jal ra,3004a08 + 3005e88: 040027b7 lui a5,0x4002 + 3005e8c: 2047a783 lw a5,516(a5) # 4002204 + 3005e90: 00178713 addi a4,a5,1 + 3005e94: 040027b7 lui a5,0x4002 + 3005e98: 20e7a223 sw a4,516(a5) # 4002204 + 3005e9c: 040027b7 lui a5,0x4002 + 3005ea0: 2047a703 lw a4,516(a5) # 4002204 + 3005ea4: 70700793 li a5,1799 + 3005ea8: fae7f8e3 bgeu a5,a4,3005e58 + 3005eac: 040027b7 lui a5,0x4002 + 3005eb0: 2007a223 sw zero,516(a5) # 4002204 + 3005eb4: 0001 nop + 3005eb6: 50b2 lw ra,44(sp) + 3005eb8: 5422 lw s0,40(sp) + 3005eba: 6145 addi sp,sp,48 + 3005ebc: 8082 ret + +03005ebe <__extendsfdf2>: + 3005ebe: 1141 addi sp,sp,-16 + 3005ec0: c606 sw ra,12(sp) + 3005ec2: c422 sw s0,8(sp) + 3005ec4: c226 sw s1,4(sp) + 3005ec6: e00506d3 fmv.x.w a3,fa0 + 3005eca: 002027f3 frrm a5 + 3005ece: 0176d513 srli a0,a3,0x17 + 3005ed2: 0ff57513 andi a0,a0,255 + 3005ed6: 00800437 lui s0,0x800 + 3005eda: 00150793 addi a5,a0,1 # 14000001 + 3005ede: 147d addi s0,s0,-1 # 7fffff + 3005ee0: 0ff7f793 andi a5,a5,255 + 3005ee4: 4705 li a4,1 + 3005ee6: 8c75 and s0,s0,a3 + 3005ee8: 01f6d493 srli s1,a3,0x1f + 3005eec: 00f75963 bge a4,a5,3005efe <__extendsfdf2+0x40> + 3005ef0: 00345793 srli a5,s0,0x3 + 3005ef4: 38050513 addi a0,a0,896 + 3005ef8: 0476 slli s0,s0,0x1d + 3005efa: 4701 li a4,0 + 3005efc: a891 j 3005f50 <__extendsfdf2+0x92> + 3005efe: e915 bnez a0,3005f32 <__extendsfdf2+0x74> + 3005f00: c459 beqz s0,3005f8e <__extendsfdf2+0xd0> + 3005f02: 8522 mv a0,s0 + 3005f04: 2c6d jal ra,30061be <__clzsi2> + 3005f06: 47a9 li a5,10 + 3005f08: 00a7cf63 blt a5,a0,3005f26 <__extendsfdf2+0x68> + 3005f0c: 47ad li a5,11 + 3005f0e: 8f89 sub a5,a5,a0 + 3005f10: 01550713 addi a4,a0,21 + 3005f14: 00f457b3 srl a5,s0,a5 + 3005f18: 00e41433 sll s0,s0,a4 + 3005f1c: 38900713 li a4,905 + 3005f20: 40a70533 sub a0,a4,a0 + 3005f24: bfd9 j 3005efa <__extendsfdf2+0x3c> + 3005f26: ff550793 addi a5,a0,-11 + 3005f2a: 00f417b3 sll a5,s0,a5 + 3005f2e: 4401 li s0,0 + 3005f30: b7f5 j 3005f1c <__extendsfdf2+0x5e> + 3005f32: c02d beqz s0,3005f94 <__extendsfdf2+0xd6> + 3005f34: 00400737 lui a4,0x400 + 3005f38: 8f61 and a4,a4,s0 + 3005f3a: 00345793 srli a5,s0,0x3 + 3005f3e: 00173713 seqz a4,a4 + 3005f42: 000806b7 lui a3,0x80 + 3005f46: 0712 slli a4,a4,0x4 + 3005f48: 0476 slli s0,s0,0x1d + 3005f4a: 8fd5 or a5,a5,a3 + 3005f4c: 7ff00513 li a0,2047 + 3005f50: 00100637 lui a2,0x100 + 3005f54: 167d addi a2,a2,-1 # fffff + 3005f56: 8ff1 and a5,a5,a2 + 3005f58: 80100637 lui a2,0x80100 + 3005f5c: 167d addi a2,a2,-1 # 800fffff + 3005f5e: 7ff57513 andi a0,a0,2047 + 3005f62: 0552 slli a0,a0,0x14 + 3005f64: 8ff1 and a5,a5,a2 + 3005f66: 80000637 lui a2,0x80000 + 3005f6a: 8fc9 or a5,a5,a0 + 3005f6c: fff64613 not a2,a2 + 3005f70: 01f49693 slli a3,s1,0x1f + 3005f74: 8ff1 and a5,a5,a2 + 3005f76: 00d7e633 or a2,a5,a3 + 3005f7a: 8522 mv a0,s0 + 3005f7c: 85b2 mv a1,a2 + 3005f7e: c319 beqz a4,3005f84 <__extendsfdf2+0xc6> + 3005f80: 00172073 csrs fflags,a4 + 3005f84: 40b2 lw ra,12(sp) + 3005f86: 4422 lw s0,8(sp) + 3005f88: 4492 lw s1,4(sp) + 3005f8a: 0141 addi sp,sp,16 + 3005f8c: 8082 ret + 3005f8e: 4781 li a5,0 + 3005f90: 4501 li a0,0 + 3005f92: b7a5 j 3005efa <__extendsfdf2+0x3c> + 3005f94: 4781 li a5,0 + 3005f96: 7ff00513 li a0,2047 + 3005f9a: b785 j 3005efa <__extendsfdf2+0x3c> + +03005f9c <__truncdfsf2>: + 3005f9c: 00202873 frrm a6 + 3005fa0: 001006b7 lui a3,0x100 + 3005fa4: 16fd addi a3,a3,-1 # fffff + 3005fa6: 8eed and a3,a3,a1 + 3005fa8: 0145d893 srli a7,a1,0x14 + 3005fac: 00369793 slli a5,a3,0x3 + 3005fb0: 7ff8f893 andi a7,a7,2047 + 3005fb4: 01d55693 srli a3,a0,0x1d + 3005fb8: 8edd or a3,a3,a5 + 3005fba: 00188793 addi a5,a7,1 + 3005fbe: 7ff7f793 andi a5,a5,2047 + 3005fc2: 4705 li a4,1 + 3005fc4: 81fd srli a1,a1,0x1f + 3005fc6: 00351613 slli a2,a0,0x3 + 3005fca: 16f75b63 bge a4,a5,3006140 <__truncdfsf2+0x1a4> + 3005fce: c8088713 addi a4,a7,-896 + 3005fd2: 0fe00793 li a5,254 + 3005fd6: 0ae7d063 bge a5,a4,3006076 <__truncdfsf2+0xda> + 3005fda: 04080063 beqz a6,300601a <__truncdfsf2+0x7e> + 3005fde: 478d li a5,3 + 3005fe0: 02f81963 bne a6,a5,3006012 <__truncdfsf2+0x76> + 3005fe4: c99d beqz a1,300601a <__truncdfsf2+0x7e> + 3005fe6: 57fd li a5,-1 + 3005fe8: 0fe00713 li a4,254 + 3005fec: 4681 li a3,0 + 3005fee: 4615 li a2,5 + 3005ff0: 4509 li a0,2 + 3005ff2: 00166613 ori a2,a2,1 + 3005ff6: 1aa80063 beq a6,a0,3006196 <__truncdfsf2+0x1fa> + 3005ffa: 450d li a0,3 + 3005ffc: 18a80a63 beq a6,a0,3006190 <__truncdfsf2+0x1f4> + 3006000: 12081763 bnez a6,300612e <__truncdfsf2+0x192> + 3006004: 00f7f513 andi a0,a5,15 + 3006008: 4891 li a7,4 + 300600a: 13150263 beq a0,a7,300612e <__truncdfsf2+0x192> + 300600e: 0791 addi a5,a5,4 + 3006010: aa39 j 300612e <__truncdfsf2+0x192> + 3006012: 4789 li a5,2 + 3006014: fcf819e3 bne a6,a5,3005fe6 <__truncdfsf2+0x4a> + 3006018: d5f9 beqz a1,3005fe6 <__truncdfsf2+0x4a> + 300601a: 4781 li a5,0 + 300601c: 0ff00713 li a4,255 + 3006020: 4615 li a2,5 + 3006022: 00579693 slli a3,a5,0x5 + 3006026: 0006db63 bgez a3,300603c <__truncdfsf2+0xa0> + 300602a: 0705 addi a4,a4,1 # 400001 + 300602c: 0ff00693 li a3,255 + 3006030: 16d70563 beq a4,a3,300619a <__truncdfsf2+0x1fe> + 3006034: fc0006b7 lui a3,0xfc000 + 3006038: 16fd addi a3,a3,-1 # fbffffff + 300603a: 8ff5 and a5,a5,a3 + 300603c: 0ff00693 li a3,255 + 3006040: 838d srli a5,a5,0x3 + 3006042: 00d71663 bne a4,a3,300604e <__truncdfsf2+0xb2> + 3006046: c781 beqz a5,300604e <__truncdfsf2+0xb2> + 3006048: 004007b7 lui a5,0x400 + 300604c: 4581 li a1,0 + 300604e: 008006b7 lui a3,0x800 + 3006052: 16fd addi a3,a3,-1 # 7fffff + 3006054: 8ff5 and a5,a5,a3 + 3006056: 808006b7 lui a3,0x80800 + 300605a: 0ff77713 andi a4,a4,255 + 300605e: 16fd addi a3,a3,-1 # 807fffff + 3006060: 075e slli a4,a4,0x17 + 3006062: 8ff5 and a5,a5,a3 + 3006064: 05fe slli a1,a1,0x1f + 3006066: 8fd9 or a5,a5,a4 + 3006068: 8fcd or a5,a5,a1 + 300606a: c219 beqz a2,3006070 <__truncdfsf2+0xd4> + 300606c: 00162073 csrs fflags,a2 + 3006070: f0078553 fmv.w.x fa0,a5 + 3006074: 8082 ret + 3006076: 08e04e63 bgtz a4,3006112 <__truncdfsf2+0x176> + 300607a: 57a5 li a5,-23 + 300607c: 0ef74d63 blt a4,a5,3006176 <__truncdfsf2+0x1da> + 3006080: 008007b7 lui a5,0x800 + 3006084: 4379 li t1,30 + 3006086: 8edd or a3,a3,a5 + 3006088: 40e30333 sub t1,t1,a4 + 300608c: 47fd li a5,31 + 300608e: 0467ce63 blt a5,t1,30060ea <__truncdfsf2+0x14e> + 3006092: c8288893 addi a7,a7,-894 + 3006096: 011617b3 sll a5,a2,a7 + 300609a: 00f037b3 snez a5,a5 + 300609e: 011696b3 sll a3,a3,a7 + 30060a2: 00665333 srl t1,a2,t1 + 30060a6: 8edd or a3,a3,a5 + 30060a8: 00d367b3 or a5,t1,a3 + 30060ac: 4701 li a4,0 + 30060ae: cff9 beqz a5,300618c <__truncdfsf2+0x1f0> + 30060b0: 00179713 slli a4,a5,0x1 + 30060b4: 00777693 andi a3,a4,7 + 30060b8: 4601 li a2,0 + 30060ba: c28d beqz a3,30060dc <__truncdfsf2+0x140> + 30060bc: 4689 li a3,2 + 30060be: 0cd80263 beq a6,a3,3006182 <__truncdfsf2+0x1e6> + 30060c2: 468d li a3,3 + 30060c4: 0ad80b63 beq a6,a3,300617a <__truncdfsf2+0x1de> + 30060c8: 4605 li a2,1 + 30060ca: 00081963 bnez a6,30060dc <__truncdfsf2+0x140> + 30060ce: 00f77693 andi a3,a4,15 + 30060d2: 4511 li a0,4 + 30060d4: 4605 li a2,1 + 30060d6: 00a68363 beq a3,a0,30060dc <__truncdfsf2+0x140> + 30060da: 0711 addi a4,a4,4 + 30060dc: 01b75693 srli a3,a4,0x1b + 30060e0: 0016c693 xori a3,a3,1 + 30060e4: 8a85 andi a3,a3,1 + 30060e6: 4701 li a4,0 + 30060e8: a83d j 3006126 <__truncdfsf2+0x18a> + 30060ea: 57f9 li a5,-2 + 30060ec: 40e78733 sub a4,a5,a4 + 30060f0: 02000793 li a5,32 + 30060f4: 00e6d733 srl a4,a3,a4 + 30060f8: 4501 li a0,0 + 30060fa: 00f30663 beq t1,a5,3006106 <__truncdfsf2+0x16a> + 30060fe: ca288893 addi a7,a7,-862 + 3006102: 01169533 sll a0,a3,a7 + 3006106: 00c567b3 or a5,a0,a2 + 300610a: 00f037b3 snez a5,a5 + 300610e: 8fd9 or a5,a5,a4 + 3006110: bf71 j 30060ac <__truncdfsf2+0x110> + 3006112: 051a slli a0,a0,0x6 + 3006114: 00a037b3 snez a5,a0 + 3006118: 068e slli a3,a3,0x3 + 300611a: 8275 srli a2,a2,0x1d + 300611c: 8edd or a3,a3,a5 + 300611e: 00c6e7b3 or a5,a3,a2 + 3006122: 4681 li a3,0 + 3006124: 4601 li a2,0 + 3006126: 0077f513 andi a0,a5,7 + 300612a: ec0513e3 bnez a0,3005ff0 <__truncdfsf2+0x54> + 300612e: ee068ae3 beqz a3,3006022 <__truncdfsf2+0x86> + 3006132: 00167693 andi a3,a2,1 + 3006136: ee0686e3 beqz a3,3006022 <__truncdfsf2+0x86> + 300613a: 00266613 ori a2,a2,2 + 300613e: b5d5 j 3006022 <__truncdfsf2+0x86> + 3006140: 00c6e7b3 or a5,a3,a2 + 3006144: 00089563 bnez a7,300614e <__truncdfsf2+0x1b2> + 3006148: 00f037b3 snez a5,a5 + 300614c: b785 j 30060ac <__truncdfsf2+0x110> + 300614e: cf8d beqz a5,3006188 <__truncdfsf2+0x1ec> + 3006150: 7ff00793 li a5,2047 + 3006154: 4601 li a2,0 + 3006156: 00f89863 bne a7,a5,3006166 <__truncdfsf2+0x1ca> + 300615a: 00400637 lui a2,0x400 + 300615e: 8e75 and a2,a2,a3 + 3006160: 00163613 seqz a2,a2 + 3006164: 0612 slli a2,a2,0x4 + 3006166: 068e slli a3,a3,0x3 + 3006168: 020007b7 lui a5,0x2000 + 300616c: 8fd5 or a5,a5,a3 + 300616e: 0ff00713 li a4,255 + 3006172: 4681 li a3,0 + 3006174: bf4d j 3006126 <__truncdfsf2+0x18a> + 3006176: 4785 li a5,1 + 3006178: bf25 j 30060b0 <__truncdfsf2+0x114> + 300617a: 4605 li a2,1 + 300617c: f1a5 bnez a1,30060dc <__truncdfsf2+0x140> + 300617e: 0721 addi a4,a4,8 + 3006180: bfb1 j 30060dc <__truncdfsf2+0x140> + 3006182: 4605 li a2,1 + 3006184: dda1 beqz a1,30060dc <__truncdfsf2+0x140> + 3006186: bfe5 j 300617e <__truncdfsf2+0x1e2> + 3006188: 0ff00713 li a4,255 + 300618c: 4601 li a2,0 + 300618e: bd51 j 3006022 <__truncdfsf2+0x86> + 3006190: fdd9 bnez a1,300612e <__truncdfsf2+0x192> + 3006192: 07a1 addi a5,a5,8 # 2000008 + 3006194: bf69 j 300612e <__truncdfsf2+0x192> + 3006196: ddc1 beqz a1,300612e <__truncdfsf2+0x192> + 3006198: bfed j 3006192 <__truncdfsf2+0x1f6> + 300619a: 4781 li a5,0 + 300619c: 00080e63 beqz a6,30061b8 <__truncdfsf2+0x21c> + 30061a0: 468d li a3,3 + 30061a2: 00d81763 bne a6,a3,30061b0 <__truncdfsf2+0x214> + 30061a6: c989 beqz a1,30061b8 <__truncdfsf2+0x21c> + 30061a8: 57fd li a5,-1 + 30061aa: 0fe00713 li a4,254 + 30061ae: a029 j 30061b8 <__truncdfsf2+0x21c> + 30061b0: 4689 li a3,2 + 30061b2: fed81be3 bne a6,a3,30061a8 <__truncdfsf2+0x20c> + 30061b6: d9ed beqz a1,30061a8 <__truncdfsf2+0x20c> + 30061b8: 00566613 ori a2,a2,5 + 30061bc: b541 j 300603c <__truncdfsf2+0xa0> + +030061be <__clzsi2>: + 30061be: 67c1 lui a5,0x10 + 30061c0: 02f57663 bgeu a0,a5,30061ec <__clzsi2+0x2e> + 30061c4: 0ff00793 li a5,255 + 30061c8: 00a7b7b3 sltu a5,a5,a0 + 30061cc: 078e slli a5,a5,0x3 + 30061ce: 02000713 li a4,32 + 30061d2: 8f1d sub a4,a4,a5 + 30061d4: 00f557b3 srl a5,a0,a5 + 30061d8: 00000517 auipc a0,0x0 + 30061dc: 5c052503 lw a0,1472(a0) # 3006798 <_GLOBAL_OFFSET_TABLE_+0x4> + 30061e0: 97aa add a5,a5,a0 + 30061e2: 0007c503 lbu a0,0(a5) # 10000 + 30061e6: 40a70533 sub a0,a4,a0 + 30061ea: 8082 ret + 30061ec: 01000737 lui a4,0x1000 + 30061f0: 47c1 li a5,16 + 30061f2: fce56ee3 bltu a0,a4,30061ce <__clzsi2+0x10> + 30061f6: 47e1 li a5,24 + 30061f8: bfd9 j 30061ce <__clzsi2+0x10> + ... + +030061fc <__rodata_start>: + 30061fc: 9680 pop {ra,s0-s6},384 + 30061fe: 4b18 lw a4,16(a4) + +03006200 : + 3006200: 0000 1400 0000 0000 0140 0000 1000 1400 ........@....... + 3006210: 0000 0000 0144 0000 2000 1400 0000 0000 ....D.... ...... + 3006220: 0148 0000 3000 1400 0000 0000 014c 0000 H....0......L... + 3006230: 0000 1430 0000 0000 0240 0000 1000 1430 ..0.....@.....0. + 3006240: 0000 0000 0244 0000 2000 1430 0000 0000 ....D.... 0..... + 3006250: 0248 0000 3000 1430 0000 0000 024c 0000 H....00.....L... + 3006260: 0000 1438 0000 0000 0040 0000 0000 1420 ..8.....@..... . + 3006270: 0000 0000 0180 0000 1000 1420 0000 0000 .......... ..... + 3006280: 0184 0000 0000 1410 0000 0000 01c0 0000 ................ + 3006290: 1000 1410 0000 0000 01c4 0000 0000 1460 ..............`. + 30062a0: 0001 0000 02c0 0000 0000 1470 0000 0000 ..........p..... + 30062b0: 0440 0000 1000 1470 0000 0000 0444 0000 @.....p.....D... + 30062c0: 2000 1470 0000 0000 0448 0000 3000 1470 . p.....H....0p. + 30062d0: 0000 0000 044c 0000 0000 1440 0000 0000 ....L.....@..... + 30062e0: 0200 0000 0000 14b0 0000 0000 0280 0000 ................ + 30062f0: 1000 14b0 0000 0000 0284 0000 2000 14b0 ............. .. + 3006300: 0000 0000 0288 0000 0000 1c00 0000 0000 ................ + 3006310: 0300 0000 0000 1450 0000 0000 0480 0000 ......P......... + 3006320: 1000 1450 0000 0000 0484 0000 2000 1450 ..P.......... P. + 3006330: 0000 0000 0488 0000 3000 1450 0000 0000 .........0P..... + 3006340: 048c 0000 4000 1450 0000 0000 0490 0000 .....@P......... + 3006350: 5000 1450 0000 0000 0494 0000 1000 1440 .PP...........@. + 3006360: 0004 0000 03c0 0000 0000 14c0 0000 0000 ................ + 3006370: 04c0 0000 1000 14c0 0000 0000 04c4 0000 ................ + 3006380: 0000 147d 0000 0000 0b00 0000 0000 1480 ..}............. + 3006390: 0000 0000 0380 0000 0000 14a0 0000 0000 ................ + 30063a0: 0400 0000 1000 14a0 0000 0000 0404 0000 ................ + 30063b0: 2000 14a0 0000 0000 0408 0000 3000 14a0 . ...........0.. + 30063c0: 0000 0000 040c 0000 0000 1001 0000 0000 ................ + 30063d0: 0340 0000 0000 1810 0005 0000 0a60 0000 @...........`... + 30063e0: 0000 1830 0005 0000 0a70 0000 0000 1840 ..0.....p.....@. + 30063f0: 0005 0000 0a80 0000 0000 1820 0005 0000 .......... ..... + 3006400: 0a90 0000 1000 1820 0005 0000 0a90 0004 ...... ......... + 3006410: 0000 1800 0002 0000 0a00 0000 0000 1471 ..............q. + 3006420: 0003 0000 0500 0000 2e2e 642f 6972 6576 ........../drive + 3006430: 7372 612f 6364 692f 636e 612f 6364 695f rs/adc/inc/adc_i + 3006440: 2e70 0068 2e2e 642f 6972 6576 7372 612f p.h.../drivers/a + 3006450: 6364 732f 6372 612f 6364 632e 0000 0000 dc/src/adc.c.... + 3006460: 0000 3f80 0000 4480 5547 4055 0000 4580 ...?...DGUU@...E + 3006470: 6666 4026 51ec 4068 2e2e 642f 6972 6576 ff&@.Qh@../drive + 3006480: 7372 622f 7361 2f65 7273 2f63 6e69 6574 rs/base/src/inte + 3006490: 7272 7075 2e74 0063 2308 0300 235a 0300 rrupt.c..#..Z#.. + 30064a0: 23ac 0300 23fe 0300 2450 0300 24a2 0300 .#...#..P$...$.. + 30064b0: 24f4 0300 2546 0300 25dc 0300 262e 0300 .$..F%...%...&.. + 30064c0: 2680 0300 26d2 0300 2724 0300 2776 0300 .&...&..$'..v'.. + 30064d0: 27c8 0300 281a 0300 2e2e 642f 6972 6576 .'...(..../drive + 30064e0: 7372 632f 6772 692f 636e 632f 6772 695f rs/crg/inc/crg_i + 30064f0: 2e70 0068 2e2e 642f 6972 6576 7372 632f p.h.../drivers/c + 3006500: 6772 732f 6372 632f 6772 632e 0000 0000 rg/src/crg.c.... + 3006510: 0000 0000 0001 0000 0002 0000 0003 0000 ................ + 3006520: 0004 0000 0005 0000 0006 0000 0007 0000 ................ + 3006530: 329c 0300 32a6 0300 32be 0300 329c 0300 .2...2...2...2.. + 3006540: 32da 0300 329c 0300 47f8 0300 4862 0300 .2...2...G..bH.. + 3006550: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 3006560: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 3006570: 4862 0300 4738 0300 478e 0300 4862 0300 bH..8G...G..bH.. + 3006580: 4822 0300 4862 0300 4862 0300 4862 0300 "H..bH..bH..bH.. + 3006590: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 30065a0: 4862 0300 4862 0300 47f8 0300 4862 0300 bH..bH...G..bH.. + 30065b0: 4862 0300 4762 0300 4862 0300 47b8 0300 bH..bG..bH...G.. + 30065c0: 4862 0300 4862 0300 47f8 0300 2e2e 642f bH..bH...G..../d + 30065d0: 6972 6576 7372 692f 636f 676d 692f 636e rivers/iocmg/inc + 30065e0: 692f 636f 676d 695f 2e70 0068 2e2e 642f /iocmg_ip.h.../d + 30065f0: 6972 6576 7372 692f 636f 676d 732f 6372 rivers/iocmg/src + 3006600: 692f 636f 676d 632e 0000 0000 2e2e 642f /iocmg.c....../d + 3006610: 6972 6576 7372 742f 6d69 7265 692f 636e rivers/timer/inc + 3006620: 742f 6d69 7265 695f 2e70 0068 2e2e 642f /timer_ip.h.../d + 3006630: 6972 6576 7372 742f 6d69 7265 732f 6372 rivers/timer/src + 3006640: 742f 6d69 7265 632e 0000 0000 55be 0300 /timer.c.....U.. + 3006650: 55d4 0300 55ea 0300 5600 0300 5616 0300 .U...U...V...V.. + 3006660: 2e2e 642f 6972 6576 7372 752f 7261 2f74 ../drivers/uart/ + 3006670: 7273 2f63 6175 7472 632e 0000 6f56 746c src/uart.c..Volt + 3006680: 6761 3a65 6625 0a0d 0000 0000 0000 4580 age:%f.........E + 3006690: 3333 4053 33S@ + +03006694 <__clz_tab>: + 3006694: 0100 0202 0303 0303 0404 0404 0404 0404 ................ + 30066a4: 0505 0505 0505 0505 0505 0505 0505 0505 ................ + 30066b4: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 30066c4: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 30066d4: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 30066e4: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 30066f4: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006704: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006714: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006724: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006734: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006744: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006754: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006764: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006774: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006784: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + +03006794 <_GLOBAL_OFFSET_TABLE_>: + 3006794: 0000 0000 6694 0300 ffff ffff 0000 0000 .....f.......... diff --git a/vendor/others/demo/5-tim_adc/demo/analyzerJson/cfg/funcptr.txt b/vendor/others/demo/5-tim_adc/demo/analyzerJson/cfg/funcptr.txt new file mode 100644 index 000000000..f4bde0916 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/analyzerJson/cfg/funcptr.txt @@ -0,0 +1,39 @@ + +Miss_funcptr: InterruptEntry ... +Remarks_here: 0x3002016 InterruptEntry + +Miss_funcptr: HAL_CRG_GetIpFreq ... +Remarks_here: 0x3003216 HAL_CRG_GetIpFreq + +Miss_funcptr: CRG_GetAdcIpFreq ... +Remarks_here: 0x3003542 CRG_GetAdcIpFreq + +Miss_funcptr: CRG_GetAdcIpFreq ... +Remarks_here: 0x3003542 CRG_GetAdcIpFreq + +Miss_funcptr: HAL_CRG_IpEnableSet ... +Remarks_here: 0x30032fa HAL_CRG_IpEnableSet + +Miss_funcptr: UART_SetParityBit ... +Remarks_here: 0x3005596 UART_SetParityBit + +Miss_funcptr: HAL_CRG_IpClkSelectSet ... +Remarks_here: 0x30033d2 HAL_CRG_IpClkSelectSet + +Miss_funcptr: HAL_CRG_IpClkDivSet ... +Remarks_here: 0x3003488 HAL_CRG_IpClkDivSet + +Miss_funcptr: IRQ_SetLocalPriority ... +Remarks_here: 0x30025a2 IRQ_SetLocalPriority + +Miss_funcptr: SetLocalIntNumPri ... +Remarks_here: 0x30022d8 SetLocalIntNumPri + +Miss_funcptr: HAL_TIMER_IrqHandler ... +Remarks_here: 0x30052fe HAL_TIMER_IrqHandler + +Miss_funcptr: HAL_TIMER_IrqHandler ... +Remarks_here: 0x30052fe HAL_TIMER_IrqHandler + +Miss_funcptr: ParseSpecifier ... +Remarks_here: 0x30046e8 ParseSpecifier diff --git a/vendor/others/demo/5-tim_adc/demo/analyzerJson/funcstack.json b/vendor/others/demo/5-tim_adc/demo/analyzerJson/funcstack.json new file mode 100644 index 000000000..5c9cd1c0e --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/analyzerJson/funcstack.json @@ -0,0 +1,3755 @@ +{ + "stackData": { + "0x3000004": { + "funcname": "_start", + "funcaddr": "0x3000004", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "0x3000500" + ], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3000008": { + "funcname": "TrapHandler", + "funcaddr": "0x3000008", + "LocalCost": 0, + "MaxCost": 640, + "called": [ + "0x3000470", + "0x30002d4" + ], + "Location": "startup.S:203", + "IsCalled": 0, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30001f0": { + "funcname": "NmiEntry", + "funcaddr": "0x30001f0", + "LocalCost": 112, + "MaxCost": 352, + "called": [ + "0x30022a4" + ], + "Location": "startup.S:329", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300025c": { + "funcname": "deadLoop1", + "funcaddr": "0x300025c", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "0x300025c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 1, + "depth": 0, + "ptrVarName": [] + }, + "0x3000262": { + "funcname": "TrapEntry", + "funcaddr": "0x3000262", + "LocalCost": 112, + "MaxCost": 352, + "called": [ + "0x3002286" + ], + "Location": "startup.S:337", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30002d2": { + "funcname": "deadLoop2", + "funcaddr": "0x30002d2", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "0x30002d2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 1, + "depth": 0, + "ptrVarName": [] + }, + "0x30002d4": { + "funcname": "IntHandler", + "funcaddr": "0x30002d4", + "LocalCost": 160, + "MaxCost": 320, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3000320": { + "funcname": "custom_nested_irq_main_handler_entry", + "funcaddr": "0x3000320", + "LocalCost": 0, + "MaxCost": 128, + "called": [ + "0x3002016" + ], + "Location": "startup.S:381", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3000434": { + "funcname": "quit_int", + "funcaddr": "0x3000434", + "LocalCost": 0, + "MaxCost": 0, + "called": [], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300044c": { + "funcname": "restore_mstatus", + "funcaddr": "0x300044c", + "LocalCost": 0, + "MaxCost": 0, + "called": [], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3000470": { + "funcname": "TrapVector", + "funcaddr": "0x3000470", + "LocalCost": 320, + "MaxCost": 640, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30004bc": { + "funcname": "switch_to_mmode", + "funcaddr": "0x30004bc", + "LocalCost": 0, + "MaxCost": 0, + "called": [], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30004e4": { + "funcname": "mem_cpy", + "funcaddr": "0x30004e4", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "0x30004e4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 1, + "depth": 3, + "ptrVarName": [] + }, + "0x30004fc": { + "funcname": "cpy_done", + "funcaddr": "0x30004fc", + "LocalCost": 0, + "MaxCost": 0, + "called": [], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3000500": { + "funcname": "handle_reset", + "funcaddr": "0x3000500", + "LocalCost": 0, + "MaxCost": 0, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3000520": { + "funcname": "flash_init", + "funcaddr": "0x3000520", + "LocalCost": 0, + "MaxCost": 0, + "called": [], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3000590": { + "funcname": "clear_sram", + "funcaddr": "0x3000590", + "LocalCost": 0, + "MaxCost": 0, + "called": [], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30005b8": { + "funcname": "clear_sram_loop", + "funcaddr": "0x30005b8", + "LocalCost": 0, + "MaxCost": 0, + "called": [], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30005c4": { + "funcname": "start_coderom_code_copy", + "funcaddr": "0x30005c4", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "0x30004e4" + ], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x30005e0": { + "funcname": "start_reserved_data_copy", + "funcaddr": "0x30005e0", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "0x30004e4" + ], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x30005fc": { + "funcname": "start_coderom_data_copy", + "funcaddr": "0x30005fc", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "0x30004e4" + ], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3000618": { + "funcname": "pmp_init", + "funcaddr": "0x3000618", + "LocalCost": 0, + "MaxCost": 992, + "called": [ + "0x300070c", + "0x30059ea" + ], + "Location": "startup.S:647", + "IsCalled": 0, + "IsRec": 0, + "depth": 14, + "ptrVarName": [] + }, + "0x3000700": { + "funcname": "dead_loop", + "funcaddr": "0x3000700", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "0x3000700" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 1, + "depth": 0, + "ptrVarName": [] + }, + "0x3000704": { + "funcname": "Chip_InitFail", + "funcaddr": "0x3000704", + "LocalCost": 16, + "MaxCost": 32, + "called": [ + "300070a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300070c": { + "funcname": "Chip_Init", + "funcaddr": "0x300070c", + "LocalCost": 32, + "MaxCost": 992, + "called": [ + "0x30059f6", + "0x3000704", + "0x3000ec0", + "0x3000f84", + "0x3000d84", + "0x300205a", + "0x3000d26", + "0x3000cd4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 13, + "ptrVarName": [] + }, + "0x300074c": { + "funcname": "CalculateGain", + "funcaddr": "0x300074c", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300077a": { + "funcname": "CHIP_GetInfo", + "funcaddr": "0x300077a", + "LocalCost": 48, + "MaxCost": 256, + "called": [ + "0x3000cd0", + "30007ba" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x30007c4": { + "funcname": "CHIP_AnalogTrim", + "funcaddr": "0x30007c4", + "LocalCost": 96, + "MaxCost": 352, + "called": [ + "0x3000cd0", + "0x300074c", + "0x3001046" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3000cd0": { + "funcname": "FOTP_InfoGet.trans.6", + "funcaddr": "0x3000cd0", + "LocalCost": 0, + "MaxCost": 160, + "called": [ + "0x3001046" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3000cd4": { + "funcname": "ANATRIM_Entry", + "funcaddr": "0x3000cd4", + "LocalCost": 16, + "MaxCost": 384, + "called": [ + "0x300077a", + "0x3000d80", + "0x30007c4", + "3000d1e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 5, + "ptrVarName": [] + }, + "0x3000d26": { + "funcname": "ANAVREF_Init", + "funcaddr": "0x3000d26", + "LocalCost": 16, + "MaxCost": 800, + "called": [ + "0x3000d80", + "0x3000dc6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 12, + "ptrVarName": [] + }, + "0x3000d80": { + "funcname": "HAL_CRG_IpEnableSet.trans.4", + "funcaddr": "0x3000d80", + "LocalCost": 0, + "MaxCost": 192, + "called": [ + "0x30032fa" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3000d84": { + "funcname": "CRG_SetCoreClockSelect", + "funcaddr": "0x3000d84", + "LocalCost": 80, + "MaxCost": 928, + "called": [ + "0x3000dc6", + "0x3002ff2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 12, + "ptrVarName": [] + }, + "0x3000dc6": { + "funcname": "BASE_FUNC_Delay.trans.8", + "funcaddr": "0x3000dc6", + "LocalCost": 0, + "MaxCost": 768, + "called": [ + "0x3001fa4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 11, + "ptrVarName": [] + }, + "0x3000dca": { + "funcname": "SetFlashDiv", + "funcaddr": "0x3000dca", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "3000e3a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3000e5c": { + "funcname": "GetFlashFreq", + "funcaddr": "0x3000e5c", + "LocalCost": 48, + "MaxCost": 320, + "called": [ + "3000ea6", + "3000eb2", + "0x3003114" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3000ec0": { + "funcname": "FLASH_ClockConfig", + "funcaddr": "0x3000ec0", + "LocalCost": 48, + "MaxCost": 416, + "called": [ + "0x3000e5c", + "0x3000dca" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 5, + "ptrVarName": [] + }, + "0x3000f84": { + "funcname": "SYSTICK_Init", + "funcaddr": "0x3000f84", + "LocalCost": 16, + "MaxCost": 32, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3000fa6": { + "funcname": "SYSTICK_GetCRGHZ", + "funcaddr": "0x3000fa6", + "LocalCost": 16, + "MaxCost": 416, + "called": [ + "0x3003216" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 6, + "ptrVarName": [] + }, + "0x3000fc2": { + "funcname": "FOTP_CheckReadStatus", + "funcaddr": "0x3000fc2", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "300103e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3001046": { + "funcname": "FOTP_InfoGet", + "funcaddr": "0x3001046", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "300119e", + "30010b4", + "0x3000fc2", + "300117a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30011a8": { + "funcname": "GetCrgIpMatchInfo", + "funcaddr": "0x30011a8", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "30011f6", + "3001204" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300120c": { + "funcname": "IsADCSampleChannel", + "funcaddr": "0x300120c", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001228": { + "funcname": "IsADCSOCx", + "funcaddr": "0x3001228", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001244": { + "funcname": "IsADCIntx", + "funcaddr": "0x3001244", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001260": { + "funcname": "IsADCTrigSource", + "funcaddr": "0x3001260", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300127c": { + "funcname": "IsADCFinishMode", + "funcaddr": "0x300127c", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "300129c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30012a8": { + "funcname": "IsADCPriorityMode", + "funcaddr": "0x30012a8", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30012c6": { + "funcname": "IsADCTotalTime", + "funcaddr": "0x30012c6", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30012e2": { + "funcname": "DCL_ADC_EnableAvddChannel", + "funcaddr": "0x30012e2", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x300183a", + "300130a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3001326": { + "funcname": "DCL_ADC_SetSOCxBlindInt0", + "funcaddr": "0x3001326", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x300183a", + "3001352", + "0x3001228", + "300139a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30013a2": { + "funcname": "DCL_ADC_SetSOCxBlindInt1", + "funcaddr": "0x30013a2", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x300183a", + "30013ce", + "0x3001228", + "3001418" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3001420": { + "funcname": "DCL_ADC_SetSOCxBlindInt2", + "funcaddr": "0x3001420", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x300183a", + "300144c", + "0x3001228", + "3001494" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300149c": { + "funcname": "DCL_ADC_SetSOCxBlindInt3", + "funcaddr": "0x300149c", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x300183a", + "30014c8", + "0x3001228", + "3001512" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300151a": { + "funcname": "DCL_ADC_EnableIntx", + "funcaddr": "0x300151a", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x300183a", + "3001546", + "0x3001244", + "3001586" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300158e": { + "funcname": "ADC_GetCTRLAddr", + "funcaddr": "0x300158e", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30015c4": { + "funcname": "DCL_ADC_SOCxSelectChannel", + "funcaddr": "0x30015c4", + "LocalCost": 48, + "MaxCost": 224, + "called": [ + "0x300183a", + "30015f4", + "0x3001228", + "0x300120c", + "300166a", + "0x300158e", + "0x30012e2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3001672": { + "funcname": "DCL_ADC_SOCxSelcetTrigSource", + "funcaddr": "0x3001672", + "LocalCost": 48, + "MaxCost": 192, + "called": [ + "0x300183a", + "30016a2", + "0x3001228", + "0x3001260", + "3001710", + "0x300158e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3001718": { + "funcname": "DCL_ADC_SOCxSetAcqps", + "funcaddr": "0x3001718", + "LocalCost": 48, + "MaxCost": 192, + "called": [ + "0x300183a", + "3001748", + "0x3001228", + "30017be", + "0x300158e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30017c6": { + "funcname": "DCL_ADC_SOCxSoftTrigger", + "funcaddr": "0x30017c6", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x300183a", + "30017f2", + "0x3001228", + "0x3001eae", + "3001832" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300183a": { + "funcname": "AssertErrorLog.trans.0", + "funcaddr": "0x300183a", + "LocalCost": 0, + "MaxCost": 64, + "called": [ + "0x3001eae" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300183e": { + "funcname": "DCL_ADC_SOCxSetPriority", + "funcaddr": "0x300183e", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3001eae", + "300186a", + "0x30012a8", + "300189a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30018a2": { + "funcname": "DCL_ADC_ReadSOCxResult", + "funcaddr": "0x30018a2", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3001eae", + "30018ce", + "0x3001228", + "30018f0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300191c": { + "funcname": "DCL_ADC_EnableSOCxContinue", + "funcaddr": "0x300191c", + "LocalCost": 48, + "MaxCost": 192, + "called": [ + "0x3001eae", + "3001948", + "0x3001228", + "3001992", + "0x300158e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300199a": { + "funcname": "DCL_ADC_DisableSOCxContinue", + "funcaddr": "0x300199a", + "LocalCost": 48, + "MaxCost": 192, + "called": [ + "0x3001eae", + "30019c6", + "0x3001228", + "3001a12", + "0x300158e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3001a1a": { + "funcname": "HAL_ADC_Init", + "funcaddr": "0x3001a1a", + "LocalCost": 32, + "MaxCost": 576, + "called": [ + "0x3001eae", + "3001a3a", + "3001a58", + "0x30012a8", + "3001ac2", + "0x300183e", + "0x3001ed8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 8, + "ptrVarName": [] + }, + "0x3001acc": { + "funcname": "HAL_ADC_ConfigureSoc", + "funcaddr": "0x3001acc", + "LocalCost": 32, + "MaxCost": 288, + "called": [ + "0x3001eae", + "3001af4", + "3001b12", + "0x3001228", + "3001c74", + "3001b4c", + "0x300120c", + "0x30012c6", + "0x3001260", + "0x300127c", + "0x30015c4", + "0x3001718", + "0x3001672", + "0x300191c", + "3001c56", + "0x300199a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3001c7e": { + "funcname": "HAL_ADC_StartIt", + "funcaddr": "0x3001c7e", + "LocalCost": 48, + "MaxCost": 256, + "called": [ + "0x3001eae", + "3001c9e", + "3001cbc", + "3001d5c", + "3001d52", + "0x3001326", + "0x30013a2", + "0x3001420", + "0x300149c", + "0x300151a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3001daa": { + "funcname": "HAL_ADC_SoftTrigSample", + "funcaddr": "0x3001daa", + "LocalCost": 32, + "MaxCost": 192, + "called": [ + "0x3001eae", + "3001dce", + "3001dec", + "0x3001228", + "3001e22", + "0x30017c6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3001e2c": { + "funcname": "HAL_ADC_GetConvResult", + "funcaddr": "0x3001e2c", + "LocalCost": 32, + "MaxCost": 224, + "called": [ + "0x3001eae", + "3001e50", + "3001e6e", + "0x3001228", + "3001ea4", + "0x30018a2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3001eae": { + "funcname": "AssertErrorLog", + "funcaddr": "0x3001eae", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001ec4": { + "funcname": "DCL_SYSTICK_GetTick", + "funcaddr": "0x3001ec4", + "LocalCost": 16, + "MaxCost": 32, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001ed8": { + "funcname": "BASE_FUNC_DelayUs", + "funcaddr": "0x3001ed8", + "LocalCost": 48, + "MaxCost": 512, + "called": [ + "0x3001ec4", + "0x3000fa6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 7, + "ptrVarName": [] + }, + "0x3001f34": { + "funcname": "BASE_FUNC_DelayMs", + "funcaddr": "0x3001f34", + "LocalCost": 48, + "MaxCost": 608, + "called": [ + "3001f56", + "0x3001ed8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 8, + "ptrVarName": [] + }, + "0x3001f6c": { + "funcname": "BASE_FUNC_DelaySeconds", + "funcaddr": "0x3001f6c", + "LocalCost": 48, + "MaxCost": 704, + "called": [ + "3001f8e", + "0x3001f34" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 9, + "ptrVarName": [] + }, + "0x3001fa4": { + "funcname": "BASE_FUNC_Delay", + "funcaddr": "0x3001fa4", + "LocalCost": 32, + "MaxCost": 768, + "called": [ + "3001fec", + "0x3001f6c", + "0x3001f34", + "0x3001ed8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 10, + "ptrVarName": [] + }, + "0x3001ff6": { + "funcname": "IRQ_ClearN", + "funcaddr": "0x3001ff6", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3002016": { + "funcname": "InterruptEntry", + "funcaddr": "0x3002016", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3001ff6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300205a": { + "funcname": "IRQ_Init", + "funcaddr": "0x300205a", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "300209e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30020b2": { + "funcname": "IRQ_Register", + "funcaddr": "0x30020b2", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3001eae", + "30020da", + "300212e", + "0x300290c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3002138": { + "funcname": "IRQ_EnableN", + "funcaddr": "0x3002138", + "LocalCost": 64, + "MaxCost": 192, + "called": [ + "0x3001eae", + "300225c", + "300225a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3002266": { + "funcname": "SysErrPrint", + "funcaddr": "0x3002266", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3002278": { + "funcname": "SysErrFinish", + "funcaddr": "0x3002278", + "LocalCost": 16, + "MaxCost": 32, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3002286": { + "funcname": "SysErrExcEntry", + "funcaddr": "0x3002286", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3002266", + "0x3002278" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30022a4": { + "funcname": "SysErrNmiEntry", + "funcaddr": "0x30022a4", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3001eae", + "30022c4", + "0x3002266", + "0x3002278" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30022d8": { + "funcname": "SetLocalIntNumPri", + "funcaddr": "0x30022d8", + "LocalCost": 96, + "MaxCost": 192, + "called": [ + "300259a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30025a2": { + "funcname": "IRQ_SetLocalPriority", + "funcaddr": "0x30025a2", + "LocalCost": 112, + "MaxCost": 416, + "called": [ + "300287c", + "0x30022d8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3002886": { + "funcname": "IRQ_SetPriority", + "funcaddr": "0x3002886", + "LocalCost": 32, + "MaxCost": 480, + "called": [ + "0x3002d26", + "30028f0", + "0x30025a2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x30028fa": { + "funcname": "IRQ_DummyHandler", + "funcaddr": "0x30028fa", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "interrupt.c:528", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300290c": { + "funcname": "IRQ_SetCallBack", + "funcaddr": "0x300290c", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3002952": { + "funcname": "DCL_SYSCTRL_CrgWriteProtectionDisable", + "funcaddr": "0x3002952", + "LocalCost": 16, + "MaxCost": 32, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300297a": { + "funcname": "DCL_SYSCTRL_CrgWriteProtectionEnable", + "funcaddr": "0x300297a", + "LocalCost": 16, + "MaxCost": 32, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30029a4": { + "funcname": "IsCrgPllRefClkSelect", + "funcaddr": "0x30029a4", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "30029c4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30029d0": { + "funcname": "IsCrgPllPreDiv", + "funcaddr": "0x30029d0", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30029ec": { + "funcname": "IsCrgPllPostDiv", + "funcaddr": "0x30029ec", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3002a08": { + "funcname": "IsCrgPllPostDiv2", + "funcaddr": "0x3002a08", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3002a24": { + "funcname": "IsCrgPllFbDiv", + "funcaddr": "0x3002a24", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3002a40": { + "funcname": "IsCrgCoreCkSel", + "funcaddr": "0x3002a40", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3002a6a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3002a76": { + "funcname": "IsCrg1MCkSel", + "funcaddr": "0x3002a76", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3002a96" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3002aa2": { + "funcname": "IsCrg1MCkDiv", + "funcaddr": "0x3002aa2", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3002abe": { + "funcname": "IsCrgValidPreDiv", + "funcaddr": "0x3002abe", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "3002b10" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3002b1c": { + "funcname": "IsCrgValidFdDiv", + "funcaddr": "0x3002b1c", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "3002b9e", + "3002b70", + "3002b9a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3002ba6": { + "funcname": "IsCrgValidPostDiv", + "funcaddr": "0x3002ba6", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3002bee": { + "funcname": "IsCrgValidPostDiv2", + "funcaddr": "0x3002bee", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3002c36": { + "funcname": "IsCrgAdcClkModeSelect", + "funcaddr": "0x3002c36", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3002c6a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3002c76": { + "funcname": "IsCrgAdcClkDiv", + "funcaddr": "0x3002c76", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3002caa" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3002cb6": { + "funcname": "DCL_CRG_SetCoreClkSel", + "funcaddr": "0x3002cb6", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3002d26", + "3002ce0", + "0x3002a40", + "3002d1e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3002d26": { + "funcname": "AssertErrorLog.trans.1", + "funcaddr": "0x3002d26", + "LocalCost": 0, + "MaxCost": 64, + "called": [ + "0x3001eae" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3002d2a": { + "funcname": "HAL_CRG_Init", + "funcaddr": "0x3002d2a", + "LocalCost": 48, + "MaxCost": 288, + "called": [ + "0x3002d26", + "3002d4a", + "3002d68", + "0x30029a4", + "3002fe8", + "0x30029d0", + "0x3002a24", + "0x30029ec", + "0x3002a08", + "0x3002a76", + "0x3002aa2", + "0x3002a40", + "0x3003668", + "0x3002952", + "0x300297a", + "0x300372a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3002ff2": { + "funcname": "HAL_CRG_SetCoreClockSelect", + "funcaddr": "0x3002ff2", + "LocalCost": 48, + "MaxCost": 224, + "called": [ + "0x3002d26", + "3003012", + "3003030", + "0x3002a40", + "3003076", + "0x3002952", + "0x3002cb6", + "0x300297a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3003080": { + "funcname": "CRG_GetVcoFreq", + "funcaddr": "0x3003080", + "LocalCost": 32, + "MaxCost": 160, + "called": [ + "0x3002d26", + "30030ae", + "0x300377c", + "0x30037a6", + "0x30037d4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3003114": { + "funcname": "HAL_CRG_GetPllFreq", + "funcaddr": "0x3003114", + "LocalCost": 32, + "MaxCost": 224, + "called": [ + "0x3002d26", + "3003142", + "0x3003080", + "0x3003816" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3003180": { + "funcname": "HAL_CRG_GetCoreClkFreq", + "funcaddr": "0x3003180", + "LocalCost": 32, + "MaxCost": 288, + "called": [ + "0x3002d26", + "30031ae", + "30031fc", + "3003208", + "0x3003114" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3003216": { + "funcname": "HAL_CRG_GetIpFreq", + "funcaddr": "0x3003216", + "LocalCost": 48, + "MaxCost": 384, + "called": [ + "0x3002d26", + "3003236", + "3003256", + "0x3003180", + "0x300353e", + "30032f0", + "30032dc", + "0x300377c", + "0x3003080", + "0x3003542" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 5, + "ptrVarName": [] + }, + "0x30032fa": { + "funcname": "HAL_CRG_IpEnableSet", + "funcaddr": "0x30032fa", + "LocalCost": 48, + "MaxCost": 192, + "called": [ + "0x3002d26", + "300331e", + "300333e", + "30033c8", + "0x300353e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x30033d2": { + "funcname": "HAL_CRG_IpClkSelectSet", + "funcaddr": "0x30033d2", + "LocalCost": 48, + "MaxCost": 192, + "called": [ + "0x3003a66", + "30033f6", + "3003416", + "0x300353e", + "300347e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3003488": { + "funcname": "HAL_CRG_IpClkDivSet", + "funcaddr": "0x3003488", + "LocalCost": 48, + "MaxCost": 192, + "called": [ + "0x3003a66", + "30034ac", + "30034cc", + "0x300353e", + "3003534" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x300353e": { + "funcname": "GetCrgIpMatchInfo.trans.7", + "funcaddr": "0x300353e", + "LocalCost": 0, + "MaxCost": 96, + "called": [ + "0x30011a8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3003542": { + "funcname": "CRG_GetAdcIpFreq", + "funcaddr": "0x3003542", + "LocalCost": 64, + "MaxCost": 224, + "called": [ + "0x3003a66", + "300356a", + "3003584", + "300365e", + "3003634", + "0x3003816" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3003668": { + "funcname": "CRG_IsValidPllConfig", + "funcaddr": "0x3003668", + "LocalCost": 48, + "MaxCost": 192, + "called": [ + "0x300377c", + "0x30037a6", + "0x3002abe", + "3003720", + "0x3002b1c", + "0x3002ba6", + "0x3002bee" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300372a": { + "funcname": "CRG_IsValid1MHzConfig", + "funcaddr": "0x300372a", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "300374e", + "3003774" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300377c": { + "funcname": "CRG_GetPllRefIni", + "funcaddr": "0x300377c", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "300379e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30037a6": { + "funcname": "CRG_GetPreDivValue", + "funcaddr": "0x30037a6", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "30037c8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30037d4": { + "funcname": "CRG_GetPllFbDivValue", + "funcaddr": "0x30037d4", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3003816": { + "funcname": "CRG_GetPllPostDivValue", + "funcaddr": "0x3003816", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "3003844" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3003850": { + "funcname": "CRG_IpWoClkSelEnableSet", + "funcaddr": "0x3003850", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003874", + "300388e", + "30039ca" + ], + "Location": "crg.c:844", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30039de": { + "funcname": "CRG_IpWoClkSelEnableGet", + "funcaddr": "0x30039de", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "30039fe", + "3003a18" + ], + "Location": "crg.c:868", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3003a66": { + "funcname": "AssertErrorLog.trans.2", + "funcaddr": "0x3003a66", + "LocalCost": 0, + "MaxCost": 64, + "called": [ + "0x3001eae" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3003a6a": { + "funcname": "CRG_IpWoClkSelResetSet", + "funcaddr": "0x3003a6a", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003a8e", + "3003aa8", + "3003b60" + ], + "Location": "crg.c:888", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3003b74": { + "funcname": "CRG_IpWoClkSelResetGet", + "funcaddr": "0x3003b74", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003b94", + "3003bae" + ], + "Location": "crg.c:910", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3003bfe": { + "funcname": "CRG_AdcEnableSet", + "funcaddr": "0x3003bfe", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003c22", + "3003c3c", + "3003ca0" + ], + "Location": "crg.c:929", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3003cb4": { + "funcname": "CRG_AdcEnableGet", + "funcaddr": "0x3003cb4", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003cd4", + "3003cee", + "3003d20" + ], + "Location": "crg.c:953", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3003d32": { + "funcname": "CRG_AdcClkSelectSet", + "funcaddr": "0x3003d32", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003d56", + "3003d70", + "3003d90", + "0x3002c36", + "3003e28", + "0x3002952", + "0x300297a" + ], + "Location": "crg.c:971", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3003e30": { + "funcname": "CRG_AdcClkSelectGet", + "funcaddr": "0x3003e30", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003e50", + "3003e6a", + "3003eb4" + ], + "Location": "crg.c:995", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3003ebe": { + "funcname": "CRG_AdcDivSet", + "funcaddr": "0x3003ebe", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003ee2", + "3003efc", + "0x3002c76", + "3003f8e" + ], + "Location": "crg.c:1014", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3003f96": { + "funcname": "CRG_AdcDivGet", + "funcaddr": "0x3003f96", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003fb6", + "3003fd0", + "3004022" + ], + "Location": "crg.c:1035", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300402c": { + "funcname": "CRG_EfcEnableSet", + "funcaddr": "0x300402c", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3004050", + "300406a" + ], + "Location": "crg.c:1056", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30040ac": { + "funcname": "CRG_EfcEnableGet", + "funcaddr": "0x30040ac", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "30040cc", + "30040e6" + ], + "Location": "crg.c:1071", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300411a": { + "funcname": "CRG_AnaEnableSet", + "funcaddr": "0x300411a", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "300413e", + "3004158", + "300429a", + "3004224" + ], + "Location": "crg.c:1087", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30042a2": { + "funcname": "CRG_AnaEnableGet", + "funcaddr": "0x30042a2", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3001eae", + "30042c4", + "30042e0" + ], + "Location": "crg.c:1121", + "IsCalled": 0, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3004324": { + "funcname": "DBG_PrintCh", + "funcaddr": "0x3004324", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3004366": { + "funcname": "DBG_PrintStr", + "funcaddr": "0x3004366", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "3004398", + "0x3004324" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30043b0": { + "funcname": "DBG_Pow", + "funcaddr": "0x30043b0", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "30043d6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30043f0": { + "funcname": "DBG_CountDigits", + "funcaddr": "0x30043f0", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "3004450", + "300443a", + "3004448" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3004458": { + "funcname": "DBG_PutUnsignedNum", + "funcaddr": "0x3004458", + "LocalCost": 48, + "MaxCost": 192, + "called": [ + "30044f6", + "0x30043b0", + "0x3004324", + "30044ec", + "3004500" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300450a": { + "funcname": "DBG_PrintInt", + "funcaddr": "0x300450a", + "LocalCost": 48, + "MaxCost": 288, + "called": [ + "0x3004324", + "300455e", + "0x30043f0", + "0x3004458" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3004568": { + "funcname": "DBG_PrintHex", + "funcaddr": "0x3004568", + "LocalCost": 48, + "MaxCost": 288, + "called": [ + "0x3004324", + "30045a2", + "0x30043f0", + "0x3004458" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x30045ac": { + "funcname": "DBG_PrintFlt", + "funcaddr": "0x30045ac", + "LocalCost": 64, + "MaxCost": 416, + "called": [ + "0x3004324", + "0x30043b0", + "300465a", + "0x300450a", + "0x30043f0", + "30046aa", + "0x3004458" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x30046e8": { + "funcname": "ParseSpecifier", + "funcaddr": "0x30046e8", + "LocalCost": 64, + "MaxCost": 544, + "called": [ + "0x3004324", + "3004876", + "0x3004366", + "0x300450a", + "0x30043f0", + "0x3004458", + "0x3004568", + "0x3005f9c", + "0x30045ac" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 5, + "ptrVarName": [] + }, + "0x3004884": { + "funcname": "DBG_PrintIntWithField", + "funcaddr": "0x3004884", + "LocalCost": 64, + "MaxCost": 320, + "called": [ + "0x3004324", + "3004994", + "0x30043f0", + "3004912", + "3004980", + "3004974", + "0x3004458" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x300499e": { + "funcname": "DBG_Atoi", + "funcaddr": "0x300499e", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "30049d6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3004a08": { + "funcname": "DBG_UartPrintf", + "funcaddr": "0x3004a08", + "LocalCost": 96, + "MaxCost": 736, + "called": [ + "3004b56", + "0x3004324", + "3004b4c", + "0x300499e", + "0x3004884", + "0x3005f9c", + "0x30045ac", + "0x30046e8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 6, + "ptrVarName": [] + }, + "0x3004b70": { + "funcname": "DCL_IOCMG_SetRegValue", + "funcaddr": "0x3004b70", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3005278", + "3004b9e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3004bb4": { + "funcname": "DCL_IOCMG_SetDriveRate", + "funcaddr": "0x3004bb4", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3005278", + "3004be2", + "3004c1a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3004c22": { + "funcname": "DCL_IOCMG_SetPullMode", + "funcaddr": "0x3004c22", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3005278", + "3004c50", + "3004ca6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3004cae": { + "funcname": "DCL_IOCMG_SetLevelShiftRate", + "funcaddr": "0x3004cae", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3005278", + "3004cdc", + "3004d14" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3004d1c": { + "funcname": "DCL_IOCMG_SetSchmidtMode", + "funcaddr": "0x3004d1c", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3005278", + "3004d4a", + "3004d82" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3004d8a": { + "funcname": "IOCMG_GetRegAddr", + "funcaddr": "0x3004d8a", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "3004dd4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3004ddc": { + "funcname": "HAL_IOCMG_SetPinAltFuncMode", + "funcaddr": "0x3004ddc", + "LocalCost": 48, + "MaxCost": 224, + "called": [ + "0x3004d8a", + "0x3004b70" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3004e16": { + "funcname": "HAL_IOCMG_SetPinPullMode", + "funcaddr": "0x3004e16", + "LocalCost": 48, + "MaxCost": 224, + "called": [ + "0x3005278", + "3004e58", + "0x3004d8a", + "0x3004c22" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3004e62": { + "funcname": "HAL_IOCMG_SetPinSchmidtMode", + "funcaddr": "0x3004e62", + "LocalCost": 48, + "MaxCost": 224, + "called": [ + "0x3005278", + "3004ea4", + "0x3004d8a", + "0x3004d1c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3004eae": { + "funcname": "HAL_IOCMG_SetPinLevelShiftRate", + "funcaddr": "0x3004eae", + "LocalCost": 48, + "MaxCost": 224, + "called": [ + "0x3005278", + "3004ef0", + "0x3004d8a", + "0x3004cae" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3004efa": { + "funcname": "HAL_IOCMG_SetPinDriveRate", + "funcaddr": "0x3004efa", + "LocalCost": 48, + "MaxCost": 224, + "called": [ + "0x3005278", + "3004f3c", + "0x3004d8a", + "0x3004bb4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3004f46": { + "funcname": "IsTimerMode", + "funcaddr": "0x3004f46", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3004f70" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3004f7c": { + "funcname": "IsTimerInterruptType", + "funcaddr": "0x3004f7c", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3004f9c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3004fa8": { + "funcname": "IsTimerSize", + "funcaddr": "0x3004fa8", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3004fc8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3004fd4": { + "funcname": "IsTimerPeriod", + "funcaddr": "0x3004fd4", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3004ff0": { + "funcname": "IsTimerDiv", + "funcaddr": "0x3004ff0", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "300501a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3005026": { + "funcname": "HAL_TIMER_Init", + "funcaddr": "0x3005026", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3005278", + "3005046", + "300508e", + "0x3004fd4", + "300526e", + "0x3004f46", + "0x3004fa8", + "0x3004ff0", + "3005226" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3005278": { + "funcname": "AssertErrorLog.trans.3", + "funcaddr": "0x3005278", + "LocalCost": 0, + "MaxCost": 64, + "called": [ + "0x3001eae" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300527c": { + "funcname": "HAL_TIMER_Start", + "funcaddr": "0x300527c", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3005278", + "300529c", + "30052e4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30052fe": { + "funcname": "HAL_TIMER_IrqHandler", + "funcaddr": "0x30052fe", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3005278", + "300531e", + "300536e" + ], + "Location": "timer.c:215", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30053e6": { + "funcname": "HAL_TIMER_RegisterCallback", + "funcaddr": "0x30053e6", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3005278", + "300540e", + "3005424", + "0x3004f7c", + "3005444", + "300546e", + "3005470" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300547a": { + "funcname": "IsUartDatalength", + "funcaddr": "0x300547a", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3005496": { + "funcname": "IsUartStopbits", + "funcaddr": "0x3005496", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "30054b6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30054c2": { + "funcname": "IsUartParitymode", + "funcaddr": "0x30054c2", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "30054dc" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30054e4": { + "funcname": "IsUartTransmode", + "funcaddr": "0x30054e4", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3005518" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3005520": { + "funcname": "IsUartFIFOThreshold", + "funcaddr": "0x3005520", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300553c": { + "funcname": "IsUartOversampleMultiple", + "funcaddr": "0x300553c", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3005558": { + "funcname": "DivClosest", + "funcaddr": "0x3005558", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "300558e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3005596": { + "funcname": "UART_SetParityBit", + "funcaddr": "0x3005596", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3005626" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300562c": { + "funcname": "HAL_UART_Init", + "funcaddr": "0x300562c", + "LocalCost": 48, + "MaxCost": 480, + "called": [ + "0x3005278", + "300564c", + "3005694", + "30059e0", + "0x300547a", + "0x3005496", + "0x30054c2", + "0x30054e4", + "0x3005520", + "0x300553c", + "0x3003216", + "0x3005558", + "0x3005596" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 6, + "ptrVarName": [] + }, + "0x30059ea": { + "funcname": "main", + "funcaddr": "0x30059ea", + "LocalCost": 16, + "MaxCost": 736, + "called": [ + "0x3005d96", + "30059f4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 11, + "ptrVarName": [] + }, + "0x30059f6": { + "funcname": "CRG_Config", + "funcaddr": "0x30059f6", + "LocalCost": 80, + "MaxCost": 448, + "called": [ + "0x3002d2a", + "3005a56" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3005a60": { + "funcname": "ADC0_Init", + "funcaddr": "0x3005a60", + "LocalCost": 48, + "MaxCost": 672, + "called": [ + "0x3005cbe", + "0x30033d2", + "0x3003488", + "0x3001a1a", + "0x3001acc" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 9, + "ptrVarName": [] + }, + "0x3005af8": { + "funcname": "TIMER3_Init", + "funcaddr": "0x3005af8", + "LocalCost": 32, + "MaxCost": 544, + "called": [ + "0x3005cbe", + "0x3003216", + "0x3005026", + "0x30020b2", + "0x30053e6", + "0x3002886", + "0x3002138" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 6, + "ptrVarName": [] + }, + "0x3005bf6": { + "funcname": "UART0_Init", + "funcaddr": "0x3005bf6", + "LocalCost": 16, + "MaxCost": 512, + "called": [ + "0x3005cbe", + "0x300562c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 7, + "ptrVarName": [] + }, + "0x3005cbe": { + "funcname": "HAL_CRG_IpEnableSet.trans.5", + "funcaddr": "0x3005cbe", + "LocalCost": 0, + "MaxCost": 192, + "called": [ + "0x30032fa" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3005cc2": { + "funcname": "IOConfig", + "funcaddr": "0x3005cc2", + "LocalCost": 16, + "MaxCost": 256, + "called": [ + "0x3005d92", + "0x3005d8e", + "0x3005d8a", + "0x3005d86", + "0x3005d82" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 5, + "ptrVarName": [] + }, + "0x3005d82": { + "funcname": "HAL_IOCMG_SetPinDriveRate.trans.13", + "funcaddr": "0x3005d82", + "LocalCost": 0, + "MaxCost": 224, + "called": [ + "0x3004efa" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3005d86": { + "funcname": "HAL_IOCMG_SetPinLevelShiftRate.trans.12", + "funcaddr": "0x3005d86", + "LocalCost": 0, + "MaxCost": 224, + "called": [ + "0x3004eae" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3005d8a": { + "funcname": "HAL_IOCMG_SetPinSchmidtMode.trans.11", + "funcaddr": "0x3005d8a", + "LocalCost": 0, + "MaxCost": 224, + "called": [ + "0x3004e62" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3005d8e": { + "funcname": "HAL_IOCMG_SetPinPullMode.trans.10", + "funcaddr": "0x3005d8e", + "LocalCost": 0, + "MaxCost": 224, + "called": [ + "0x3004e16" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3005d92": { + "funcname": "HAL_IOCMG_SetPinAltFuncMode.trans.9", + "funcaddr": "0x3005d92", + "LocalCost": 0, + "MaxCost": 224, + "called": [ + "0x3004ddc" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3005d96": { + "funcname": "SystemInit", + "funcaddr": "0x3005d96", + "LocalCost": 16, + "MaxCost": 704, + "called": [ + "0x3005cc2", + "0x3005bf6", + "0x3005a60", + "0x3005af8", + "0x300527c", + "0x3001c7e", + "0x3001daa" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 10, + "ptrVarName": [] + }, + "0x3005dd6": { + "funcname": "TIMER3_InterruptProcess", + "funcaddr": "0x3005dd6", + "LocalCost": 48, + "MaxCost": 832, + "called": [ + "0x3001e2c", + "3005e9c", + "0x3005ebe", + "0x3004a08" + ], + "Location": "tim_adc.c:10", + "IsCalled": 0, + "IsRec": 0, + "depth": 7, + "ptrVarName": [] + }, + "0x3005ebe": { + "funcname": "__extendsfdf2", + "funcaddr": "0x3005ebe", + "LocalCost": 16, + "MaxCost": 32, + "called": [ + "3005f50", + "0x30061be", + "3005efa", + "3005f1c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3005f9c": { + "funcname": "__truncdfsf2", + "funcaddr": "0x3005f9c", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "300612e", + "3006126", + "30060ac", + "3006022", + "30060b0", + "30060dc", + "300617e", + "3006192", + "30061b8", + "300603c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30061be": { + "funcname": "__clzsi2", + "funcaddr": "0x30061be", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "30061ce" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30061fc": { + "funcname": "__rodata_start", + "funcaddr": "0x30061fc", + "LocalCost": 0, + "MaxCost": 0, + "called": [], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3006200": { + "funcname": "g_crgIpMatch", + "funcaddr": "0x3006200", + "LocalCost": 0, + "MaxCost": 0, + "called": [], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3006694": { + "funcname": "__clz_tab", + "funcaddr": "0x3006694", + "LocalCost": 0, + "MaxCost": 0, + "called": [], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3006794": { + "funcname": "_GLOBAL_OFFSET_TABLE_", + "funcaddr": "0x3006794", + "LocalCost": 0, + "MaxCost": 0, + "called": [], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + } + }, + "treeTablezNodes": [ + { + "id": "0x3000008", + "pId": "", + "name": "TrapHandler", + "Depth": 1, + "MaxCost": 640, + "LocalCost": 0, + "Location": "", + "Loaction": "startup.S:203", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../chip/3061m/startup.S:203", + "IsRec": 0 + }, + { + "id": "0x30001f0", + "pId": "", + "name": "NmiEntry", + "Depth": 2, + "MaxCost": 352, + "LocalCost": 112, + "Location": "", + "Loaction": "startup.S:329", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../chip/3061m/startup.S:329", + "IsRec": 0 + }, + { + "id": "0x3000262", + "pId": "", + "name": "TrapEntry", + "Depth": 2, + "MaxCost": 352, + "LocalCost": 112, + "Location": "", + "Loaction": "startup.S:337", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../chip/3061m/startup.S:337", + "IsRec": 0 + }, + { + "id": "0x3000320", + "pId": "", + "name": "custom_nested_irq_main_handler_entry", + "Depth": 2, + "MaxCost": 128, + "LocalCost": 0, + "Location": "", + "Loaction": "startup.S:381", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../chip/3061m/startup.S:381", + "IsRec": 0 + }, + { + "id": "0x3000618", + "pId": "", + "name": "pmp_init", + "Depth": 14, + "MaxCost": 992, + "LocalCost": 0, + "Location": "", + "Loaction": "startup.S:647", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../chip/3061m/startup.S:647", + "IsRec": 0 + }, + { + "id": "0x30028fa", + "pId": "", + "name": "IRQ_DummyHandler", + "Depth": 0, + "MaxCost": 64, + "LocalCost": 32, + "Location": "", + "Loaction": "interrupt.c:528", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../drivers/base/src/interrupt.c:528", + "IsRec": 0 + }, + { + "id": "0x3003850", + "pId": "", + "name": "CRG_IpWoClkSelEnableSet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:844", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../drivers/crg/src/crg.c:844", + "IsRec": 0 + }, + { + "id": "0x30039de", + "pId": "", + "name": "CRG_IpWoClkSelEnableGet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:868", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../drivers/crg/src/crg.c:868", + "IsRec": 0 + }, + { + "id": "0x3003a6a", + "pId": "", + "name": "CRG_IpWoClkSelResetSet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:888", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../drivers/crg/src/crg.c:888", + "IsRec": 0 + }, + { + "id": "0x3003b74", + "pId": "", + "name": "CRG_IpWoClkSelResetGet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:910", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../drivers/crg/src/crg.c:910", + "IsRec": 0 + }, + { + "id": "0x3003bfe", + "pId": "", + "name": "CRG_AdcEnableSet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:929", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../drivers/crg/src/crg.c:929", + "IsRec": 0 + }, + { + "id": "0x3003cb4", + "pId": "", + "name": "CRG_AdcEnableGet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:953", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../drivers/crg/src/crg.c:953", + "IsRec": 0 + }, + { + "id": "0x3003d32", + "pId": "", + "name": "CRG_AdcClkSelectSet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:971", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../drivers/crg/src/crg.c:971", + "IsRec": 0 + }, + { + "id": "0x3003e30", + "pId": "", + "name": "CRG_AdcClkSelectGet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:995", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../drivers/crg/src/crg.c:995", + "IsRec": 0 + }, + { + "id": "0x3003ebe", + "pId": "", + "name": "CRG_AdcDivSet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:1014", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../drivers/crg/src/crg.c:1014", + "IsRec": 0 + }, + { + "id": "0x3003f96", + "pId": "", + "name": "CRG_AdcDivGet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:1035", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../drivers/crg/src/crg.c:1035", + "IsRec": 0 + }, + { + "id": "0x300402c", + "pId": "", + "name": "CRG_EfcEnableSet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:1056", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../drivers/crg/src/crg.c:1056", + "IsRec": 0 + }, + { + "id": "0x30040ac", + "pId": "", + "name": "CRG_EfcEnableGet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:1071", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../drivers/crg/src/crg.c:1071", + "IsRec": 0 + }, + { + "id": "0x300411a", + "pId": "", + "name": "CRG_AnaEnableSet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:1087", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../drivers/crg/src/crg.c:1087", + "IsRec": 0 + }, + { + "id": "0x30042a2", + "pId": "", + "name": "CRG_AnaEnableGet", + "Depth": 1, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:1121", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../drivers/crg/src/crg.c:1121", + "IsRec": 0 + }, + { + "id": "0x30052fe", + "pId": "", + "name": "HAL_TIMER_IrqHandler", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "timer.c:215", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../drivers/timer/src/timer.c:215", + "IsRec": 0 + }, + { + "id": "0x3005dd6", + "pId": "", + "name": "TIMER3_InterruptProcess", + "Depth": 7, + "MaxCost": 832, + "LocalCost": 48, + "Location": "", + "Loaction": "tim_adc.c:10", + "FilePath": "d:\\HaiSi\\Projects\\1-Demo\\5-tim_adc\\demo\\out/../user/generatecode/tim_adc.c:10", + "IsRec": 0 + } + ], + "listData": [ + { + "funcname": "TrapHandler", + "funcaddr": "0x3000008", + "LocalCost": 0, + "MaxCost": 640, + "called": [ + "0x3000470", + "0x30002d4" + ], + "Location": "startup.S:203", + "IsCalled": 0, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + { + "funcname": "NmiEntry", + "funcaddr": "0x30001f0", + "LocalCost": 112, + "MaxCost": 352, + "called": [ + "0x30022a4" + ], + "Location": "startup.S:329", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "TrapEntry", + "funcaddr": "0x3000262", + "LocalCost": 112, + "MaxCost": 352, + "called": [ + "0x3002286" + ], + "Location": "startup.S:337", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "custom_nested_irq_main_handler_entry", + "funcaddr": "0x3000320", + "LocalCost": 0, + "MaxCost": 128, + "called": [ + "0x3002016" + ], + "Location": "startup.S:381", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "pmp_init", + "funcaddr": "0x3000618", + "LocalCost": 0, + "MaxCost": 992, + "called": [ + "0x300070c", + "0x30059ea" + ], + "Location": "startup.S:647", + "IsCalled": 0, + "IsRec": 0, + "depth": 14, + "ptrVarName": [] + }, + { + "funcname": "IRQ_DummyHandler", + "funcaddr": "0x30028fa", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "interrupt.c:528", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + { + "funcname": "CRG_IpWoClkSelEnableSet", + "funcaddr": "0x3003850", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003874", + "300388e", + "30039ca" + ], + "Location": "crg.c:844", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_IpWoClkSelEnableGet", + "funcaddr": "0x30039de", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "30039fe", + "3003a18" + ], + "Location": "crg.c:868", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_IpWoClkSelResetSet", + "funcaddr": "0x3003a6a", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003a8e", + "3003aa8", + "3003b60" + ], + "Location": "crg.c:888", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_IpWoClkSelResetGet", + "funcaddr": "0x3003b74", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003b94", + "3003bae" + ], + "Location": "crg.c:910", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_AdcEnableSet", + "funcaddr": "0x3003bfe", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003c22", + "3003c3c", + "3003ca0" + ], + "Location": "crg.c:929", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_AdcEnableGet", + "funcaddr": "0x3003cb4", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003cd4", + "3003cee", + "3003d20" + ], + "Location": "crg.c:953", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_AdcClkSelectSet", + "funcaddr": "0x3003d32", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003d56", + "3003d70", + "3003d90", + "0x3002c36", + "3003e28", + "0x3002952", + "0x300297a" + ], + "Location": "crg.c:971", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_AdcClkSelectGet", + "funcaddr": "0x3003e30", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003e50", + "3003e6a", + "3003eb4" + ], + "Location": "crg.c:995", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_AdcDivSet", + "funcaddr": "0x3003ebe", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003ee2", + "3003efc", + "0x3002c76", + "3003f8e" + ], + "Location": "crg.c:1014", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_AdcDivGet", + "funcaddr": "0x3003f96", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3003fb6", + "3003fd0", + "3004022" + ], + "Location": "crg.c:1035", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_EfcEnableSet", + "funcaddr": "0x300402c", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "3004050", + "300406a" + ], + "Location": "crg.c:1056", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_EfcEnableGet", + "funcaddr": "0x30040ac", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "30040cc", + "30040e6" + ], + "Location": "crg.c:1071", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_AnaEnableSet", + "funcaddr": "0x300411a", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3003a66", + "300413e", + "3004158", + "300429a", + "3004224" + ], + "Location": "crg.c:1087", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_AnaEnableGet", + "funcaddr": "0x30042a2", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3001eae", + "30042c4", + "30042e0" + ], + "Location": "crg.c:1121", + "IsCalled": 0, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + { + "funcname": "HAL_TIMER_IrqHandler", + "funcaddr": "0x30052fe", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3005278", + "300531e", + "300536e" + ], + "Location": "timer.c:215", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "TIMER3_InterruptProcess", + "funcaddr": "0x3005dd6", + "LocalCost": 48, + "MaxCost": 832, + "called": [ + "0x3001e2c", + "3005e9c", + "0x3005ebe", + "0x3004a08" + ], + "Location": "tim_adc.c:10", + "IsCalled": 0, + "IsRec": 0, + "depth": 7, + "ptrVarName": [] + } + ] +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/analyzerJson/memoryDetails.json b/vendor/others/demo/5-tim_adc/demo/analyzerJson/memoryDetails.json new file mode 100644 index 000000000..777e71b70 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/analyzerJson/memoryDetails.json @@ -0,0 +1,26732 @@ +{ + "listData": [ + { + "name": "RAM_CODE", + "startAddr": "0x0000000002000000", + "endAddr": "0x0000000002000000", + "size": "0 B", + "sizeOri": "0x0000000000000000", + "used": "0 B", + "usage": "0.00%", + "free": "0 B" + }, + { + "name": "RAM_RESERVE_DATA", + "startAddr": "0x0000000004000000", + "endAddr": "0x0000000004000000", + "size": "0 B", + "sizeOri": "0x0000000000000000", + "used": "0 B", + "usage": "0.00%", + "free": "0 B" + }, + { + "name": "RAM_DIAGNOSE_BUF", + "startAddr": "0x0000000004000000", + "endAddr": "0x0000000004000020", + "size": "32 B", + "sizeOri": "0x0000000000000020", + "used": "0 B", + "usage": "0.00%", + "free": "32 B" + }, + { + "name": "RAM_DATA", + "startAddr": "0x0000000004000020", + "endAddr": "0x0000000004004ff0", + "size": "20432 B", + "sizeOri": "0x0000000000004fd0", + "used": "8680 B", + "usage": "42.48%", + "free": "11752 B" + }, + { + "name": "STACK_SRAM_BOUND", + "startAddr": "0x0000000004004ff0", + "endAddr": "0x0000000004005000", + "size": "16 B", + "sizeOri": "0x0000000000000010", + "used": "0 B", + "usage": "0.00%", + "free": "16 B" + }, + { + "name": "RAM_STACK", + "startAddr": "0x0000000004005000", + "endAddr": "0x0000000004008000", + "size": "12288 B", + "sizeOri": "0x0000000000003000", + "used": "1024 B", + "usage": "8.33%", + "free": "11264 B" + }, + { + "name": "FLASH_MAGIC", + "startAddr": "0x0000000003000000", + "endAddr": "0x0000000003000004", + "size": "4 B", + "sizeOri": "0x0000000000000004", + "used": "4 B", + "usage": "100.00%", + "free": "0 B" + }, + { + "name": "FLASH_CODE", + "startAddr": "0x0000000003000004", + "endAddr": "0x0000000003020000", + "size": "131068 B", + "sizeOri": "0x000000000001fffc", + "used": "26748 B", + "usage": "20.41%", + "free": "104320 B" + } + ], + "tableTree": [ + { + "name": "FLASH_MAGIC", + "startAddr": "0x0000000003000000", + "endAddr": "0x0000000003000004", + "size": "4 B", + "sizeOri": "0x0000000000000004", + "used": "4 B", + "usage": "100.00%", + "free": "0 B", + "level": 0, + "open": true, + "id": "FLASH_MAGIC", + "sort": 0, + "children": [ + { + "name": ".data.magic", + "id": ".data.magic", + "level": 1, + "IPARENTID": "FLASH_MAGIC", + "open": false, + "sort": 0, + "children": [], + "regionName": [ + "FLASH_MAGIC" + ], + "runAddr": "0x03000000", + "loadAddr": "0x03000000", + "size": "4 B", + "sizeOri": "0x00000004" + } + ] + }, + { + "name": "FLASH_CODE", + "startAddr": "0x0000000003000004", + "endAddr": "0x0000000003020000", + "size": "131068 B", + "sizeOri": "0x000000000001fffc", + "used": "26748 B", + "usage": "20.41%", + "free": "104320 B", + "level": 0, + "open": true, + "id": "FLASH_CODE", + "sort": 0, + "children": [ + { + "name": ".text.entry", + "id": ".text.entry", + "level": 1, + "IPARENTID": "FLASH_CODE", + "open": false, + "sort": 0, + "children": [], + "regionName": [ + "FLASH_CODE" + ], + "runAddr": "0x03000004", + "loadAddr": "0x03000004", + "size": "1792 B", + "sizeOri": "0x00000700" + }, + { + "name": ".text", + "id": ".text", + "level": 1, + "IPARENTID": null, + "open": false, + "sort": 0, + "children": [ + { + "name": "Chip_InitFail", + "runAddr": "0x03000704", + "loadAddr": "0x3000704", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "Chip_InitFail", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CalculateGain", + "runAddr": "0x0300074c", + "loadAddr": "0x300074c", + "size": "46 B", + "sizeOri": "0x0000002e", + "location": "", + "type": "F", + "level": 2, + "id": "CalculateGain", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CHIP_GetInfo", + "runAddr": "0x0300077a", + "loadAddr": "0x300077a", + "size": "74 B", + "sizeOri": "0x0000004a", + "location": "", + "type": "F", + "level": 2, + "id": "CHIP_GetInfo", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CHIP_AnalogTrim", + "runAddr": "0x030007c4", + "loadAddr": "0x30007c4", + "size": "1292 B", + "sizeOri": "0x0000050c", + "location": "", + "type": "F", + "level": 2, + "id": "CHIP_AnalogTrim", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SetFlashDiv", + "runAddr": "0x03000dca", + "loadAddr": "0x3000dca", + "size": "146 B", + "sizeOri": "0x00000092", + "location": "", + "type": "F", + "level": 2, + "id": "SetFlashDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "GetFlashFreq", + "runAddr": "0x03000e5c", + "loadAddr": "0x3000e5c", + "size": "100 B", + "sizeOri": "0x00000064", + "location": "", + "type": "F", + "level": 2, + "id": "GetFlashFreq", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "FOTP_CheckReadStatus", + "runAddr": "0x03000fc2", + "loadAddr": "0x3000fc2", + "size": "132 B", + "sizeOri": "0x00000084", + "location": "", + "type": "F", + "level": 2, + "id": "FOTP_CheckReadStatus", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "g_crgIpMatch", + "runAddr": "0x03006200", + "loadAddr": "0x3006200", + "size": "552 B", + "sizeOri": "0x00000228", + "location": "", + "type": "O", + "level": 2, + "id": "g_crgIpMatch", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsADCSampleChannel", + "runAddr": "0x0300120c", + "loadAddr": "0x300120c", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsADCSampleChannel", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsADCSOCx", + "runAddr": "0x03001228", + "loadAddr": "0x3001228", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsADCSOCx", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsADCIntx", + "runAddr": "0x03001244", + "loadAddr": "0x3001244", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsADCIntx", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsADCTrigSource", + "runAddr": "0x03001260", + "loadAddr": "0x3001260", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsADCTrigSource", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsADCFinishMode", + "runAddr": "0x0300127c", + "loadAddr": "0x300127c", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsADCFinishMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsADCPriorityMode", + "runAddr": "0x030012a8", + "loadAddr": "0x30012a8", + "size": "30 B", + "sizeOri": "0x0000001e", + "location": "", + "type": "F", + "level": 2, + "id": "IsADCPriorityMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsADCTotalTime", + "runAddr": "0x030012c6", + "loadAddr": "0x30012c6", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsADCTotalTime", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_ADC_EnableAvddChannel", + "runAddr": "0x030012e2", + "loadAddr": "0x30012e2", + "size": "68 B", + "sizeOri": "0x00000044", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_ADC_EnableAvddChannel", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_ADC_SetSOCxBlindInt0", + "runAddr": "0x03001326", + "loadAddr": "0x3001326", + "size": "124 B", + "sizeOri": "0x0000007c", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_ADC_SetSOCxBlindInt0", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_ADC_SetSOCxBlindInt1", + "runAddr": "0x030013a2", + "loadAddr": "0x30013a2", + "size": "126 B", + "sizeOri": "0x0000007e", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_ADC_SetSOCxBlindInt1", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_ADC_SetSOCxBlindInt2", + "runAddr": "0x03001420", + "loadAddr": "0x3001420", + "size": "124 B", + "sizeOri": "0x0000007c", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_ADC_SetSOCxBlindInt2", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_ADC_SetSOCxBlindInt3", + "runAddr": "0x0300149c", + "loadAddr": "0x300149c", + "size": "126 B", + "sizeOri": "0x0000007e", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_ADC_SetSOCxBlindInt3", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_ADC_EnableIntx", + "runAddr": "0x0300151a", + "loadAddr": "0x300151a", + "size": "116 B", + "sizeOri": "0x00000074", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_ADC_EnableIntx", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "ADC_GetCTRLAddr", + "runAddr": "0x0300158e", + "loadAddr": "0x300158e", + "size": "54 B", + "sizeOri": "0x00000036", + "location": "", + "type": "F", + "level": 2, + "id": "ADC_GetCTRLAddr", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_ADC_SOCxSelectChannel", + "runAddr": "0x030015c4", + "loadAddr": "0x30015c4", + "size": "174 B", + "sizeOri": "0x000000ae", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_ADC_SOCxSelectChannel", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_ADC_SOCxSelcetTrigSource", + "runAddr": "0x03001672", + "loadAddr": "0x3001672", + "size": "166 B", + "sizeOri": "0x000000a6", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_ADC_SOCxSelcetTrigSource", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_ADC_SOCxSetAcqps", + "runAddr": "0x03001718", + "loadAddr": "0x3001718", + "size": "174 B", + "sizeOri": "0x000000ae", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_ADC_SOCxSetAcqps", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_ADC_SOCxSoftTrigger", + "runAddr": "0x030017c6", + "loadAddr": "0x30017c6", + "size": "116 B", + "sizeOri": "0x00000074", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_ADC_SOCxSoftTrigger", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_ADC_SOCxSetPriority", + "runAddr": "0x0300183e", + "loadAddr": "0x300183e", + "size": "100 B", + "sizeOri": "0x00000064", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_ADC_SOCxSetPriority", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_ADC_ReadSOCxResult", + "runAddr": "0x030018a2", + "loadAddr": "0x30018a2", + "size": "122 B", + "sizeOri": "0x0000007a", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_ADC_ReadSOCxResult", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_ADC_EnableSOCxContinue", + "runAddr": "0x0300191c", + "loadAddr": "0x300191c", + "size": "126 B", + "sizeOri": "0x0000007e", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_ADC_EnableSOCxContinue", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_ADC_DisableSOCxContinue", + "runAddr": "0x0300199a", + "loadAddr": "0x300199a", + "size": "128 B", + "sizeOri": "0x00000080", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_ADC_DisableSOCxContinue", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_SYSTICK_GetTick", + "runAddr": "0x03001ec4", + "loadAddr": "0x3001ec4", + "size": "20 B", + "sizeOri": "0x00000014", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_SYSTICK_GetTick", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_ClearN", + "runAddr": "0x03001ff6", + "loadAddr": "0x3001ff6", + "size": "32 B", + "sizeOri": "0x00000020", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_ClearN", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_DummyHandler", + "runAddr": "0x030028fa", + "loadAddr": "0x30028fa", + "size": "18 B", + "sizeOri": "0x00000012", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_DummyHandler", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_SetCallBack", + "runAddr": "0x0300290c", + "loadAddr": "0x300290c", + "size": "70 B", + "sizeOri": "0x00000046", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_SetCallBack", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SysErrFinish", + "runAddr": "0x03002278", + "loadAddr": "0x3002278", + "size": "14 B", + "sizeOri": "0x0000000e", + "location": "", + "type": "F", + "level": 2, + "id": "SysErrFinish", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SetLocalIntNumPri", + "runAddr": "0x030022d8", + "loadAddr": "0x30022d8", + "size": "714 B", + "sizeOri": "0x000002ca", + "location": "", + "type": "F", + "level": 2, + "id": "SetLocalIntNumPri", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_SetLocalPriority", + "runAddr": "0x030025a2", + "loadAddr": "0x30025a2", + "size": "740 B", + "sizeOri": "0x000002e4", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_SetLocalPriority", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_SYSCTRL_CrgWriteProtectionDisable", + "runAddr": "0x03002952", + "loadAddr": "0x3002952", + "size": "40 B", + "sizeOri": "0x00000028", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_SYSCTRL_CrgWriteProtectionDisable", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_SYSCTRL_CrgWriteProtectionEnable", + "runAddr": "0x0300297a", + "loadAddr": "0x300297a", + "size": "42 B", + "sizeOri": "0x0000002a", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_SYSCTRL_CrgWriteProtectionEnable", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgPllRefClkSelect", + "runAddr": "0x030029a4", + "loadAddr": "0x30029a4", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgPllRefClkSelect", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgPllPreDiv", + "runAddr": "0x030029d0", + "loadAddr": "0x30029d0", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgPllPreDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgPllPostDiv", + "runAddr": "0x030029ec", + "loadAddr": "0x30029ec", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgPllPostDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgPllPostDiv2", + "runAddr": "0x03002a08", + "loadAddr": "0x3002a08", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgPllPostDiv2", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgPllFbDiv", + "runAddr": "0x03002a24", + "loadAddr": "0x3002a24", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgPllFbDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgCoreCkSel", + "runAddr": "0x03002a40", + "loadAddr": "0x3002a40", + "size": "54 B", + "sizeOri": "0x00000036", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgCoreCkSel", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrg1MCkSel", + "runAddr": "0x03002a76", + "loadAddr": "0x3002a76", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrg1MCkSel", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrg1MCkDiv", + "runAddr": "0x03002aa2", + "loadAddr": "0x3002aa2", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrg1MCkDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgValidPreDiv", + "runAddr": "0x03002abe", + "loadAddr": "0x3002abe", + "size": "94 B", + "sizeOri": "0x0000005e", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgValidPreDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgValidFdDiv", + "runAddr": "0x03002b1c", + "loadAddr": "0x3002b1c", + "size": "138 B", + "sizeOri": "0x0000008a", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgValidFdDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgValidPostDiv", + "runAddr": "0x03002ba6", + "loadAddr": "0x3002ba6", + "size": "72 B", + "sizeOri": "0x00000048", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgValidPostDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgValidPostDiv2", + "runAddr": "0x03002bee", + "loadAddr": "0x3002bee", + "size": "72 B", + "sizeOri": "0x00000048", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgValidPostDiv2", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgAdcClkModeSelect", + "runAddr": "0x03002c36", + "loadAddr": "0x3002c36", + "size": "64 B", + "sizeOri": "0x00000040", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgAdcClkModeSelect", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgAdcClkDiv", + "runAddr": "0x03002c76", + "loadAddr": "0x3002c76", + "size": "64 B", + "sizeOri": "0x00000040", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgAdcClkDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_CRG_SetCoreClkSel", + "runAddr": "0x03002cb6", + "loadAddr": "0x3002cb6", + "size": "112 B", + "sizeOri": "0x00000070", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_CRG_SetCoreClkSel", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_IpWoClkSelResetSet", + "runAddr": "0x03003a6a", + "loadAddr": "0x3003a6a", + "size": "266 B", + "sizeOri": "0x0000010a", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_IpWoClkSelResetSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_IpWoClkSelEnableSet", + "runAddr": "0x03003850", + "loadAddr": "0x3003850", + "size": "398 B", + "sizeOri": "0x0000018e", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_IpWoClkSelEnableSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_IpWoClkSelResetGet", + "runAddr": "0x03003b74", + "loadAddr": "0x3003b74", + "size": "138 B", + "sizeOri": "0x0000008a", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_IpWoClkSelResetGet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_IpWoClkSelEnableGet", + "runAddr": "0x030039de", + "loadAddr": "0x30039de", + "size": "136 B", + "sizeOri": "0x00000088", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_IpWoClkSelEnableGet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_AdcEnableSet", + "runAddr": "0x03003bfe", + "loadAddr": "0x3003bfe", + "size": "182 B", + "sizeOri": "0x000000b6", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_AdcEnableSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_AdcClkSelectSet", + "runAddr": "0x03003d32", + "loadAddr": "0x3003d32", + "size": "254 B", + "sizeOri": "0x000000fe", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_AdcClkSelectSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_AdcDivSet", + "runAddr": "0x03003ebe", + "loadAddr": "0x3003ebe", + "size": "216 B", + "sizeOri": "0x000000d8", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_AdcDivSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_AdcEnableGet", + "runAddr": "0x03003cb4", + "loadAddr": "0x3003cb4", + "size": "126 B", + "sizeOri": "0x0000007e", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_AdcEnableGet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_AdcClkSelectGet", + "runAddr": "0x03003e30", + "loadAddr": "0x3003e30", + "size": "142 B", + "sizeOri": "0x0000008e", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_AdcClkSelectGet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_AdcDivGet", + "runAddr": "0x03003f96", + "loadAddr": "0x3003f96", + "size": "150 B", + "sizeOri": "0x00000096", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_AdcDivGet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_EfcEnableSet", + "runAddr": "0x0300402c", + "loadAddr": "0x300402c", + "size": "128 B", + "sizeOri": "0x00000080", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_EfcEnableSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_EfcEnableGet", + "runAddr": "0x030040ac", + "loadAddr": "0x30040ac", + "size": "110 B", + "sizeOri": "0x0000006e", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_EfcEnableGet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_AnaEnableSet", + "runAddr": "0x0300411a", + "loadAddr": "0x300411a", + "size": "392 B", + "sizeOri": "0x00000188", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_AnaEnableSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_AnaEnableGet", + "runAddr": "0x030042a2", + "loadAddr": "0x30042a2", + "size": "130 B", + "sizeOri": "0x00000082", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_AnaEnableGet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_IsValidPllConfig", + "runAddr": "0x03003668", + "loadAddr": "0x3003668", + "size": "194 B", + "sizeOri": "0x000000c2", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_IsValidPllConfig", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_IsValid1MHzConfig", + "runAddr": "0x0300372a", + "loadAddr": "0x300372a", + "size": "82 B", + "sizeOri": "0x00000052", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_IsValid1MHzConfig", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_GetVcoFreq", + "runAddr": "0x03003080", + "loadAddr": "0x3003080", + "size": "148 B", + "sizeOri": "0x00000094", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_GetVcoFreq", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_GetPllRefIni", + "runAddr": "0x0300377c", + "loadAddr": "0x300377c", + "size": "42 B", + "sizeOri": "0x0000002a", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_GetPllRefIni", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_GetPreDivValue", + "runAddr": "0x030037a6", + "loadAddr": "0x30037a6", + "size": "46 B", + "sizeOri": "0x0000002e", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_GetPreDivValue", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_GetPllFbDivValue", + "runAddr": "0x030037d4", + "loadAddr": "0x30037d4", + "size": "66 B", + "sizeOri": "0x00000042", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_GetPllFbDivValue", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_GetPllPostDivValue", + "runAddr": "0x03003816", + "loadAddr": "0x3003816", + "size": "58 B", + "sizeOri": "0x0000003a", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_GetPllPostDivValue", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_GetAdcIpFreq", + "runAddr": "0x03003542", + "loadAddr": "0x3003542", + "size": "294 B", + "sizeOri": "0x00000126", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_GetAdcIpFreq", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_PrintCh", + "runAddr": "0x03004324", + "loadAddr": "0x3004324", + "size": "66 B", + "sizeOri": "0x00000042", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_PrintCh", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_PrintStr", + "runAddr": "0x03004366", + "loadAddr": "0x3004366", + "size": "74 B", + "sizeOri": "0x0000004a", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_PrintStr", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_Pow", + "runAddr": "0x030043b0", + "loadAddr": "0x30043b0", + "size": "64 B", + "sizeOri": "0x00000040", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_Pow", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_CountDigits", + "runAddr": "0x030043f0", + "loadAddr": "0x30043f0", + "size": "104 B", + "sizeOri": "0x00000068", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_CountDigits", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_PutUnsignedNum", + "runAddr": "0x03004458", + "loadAddr": "0x3004458", + "size": "178 B", + "sizeOri": "0x000000b2", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_PutUnsignedNum", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_PrintInt", + "runAddr": "0x0300450a", + "loadAddr": "0x300450a", + "size": "94 B", + "sizeOri": "0x0000005e", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_PrintInt", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_PrintHex", + "runAddr": "0x03004568", + "loadAddr": "0x3004568", + "size": "68 B", + "sizeOri": "0x00000044", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_PrintHex", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_PrintFlt", + "runAddr": "0x030045ac", + "loadAddr": "0x30045ac", + "size": "316 B", + "sizeOri": "0x0000013c", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_PrintFlt", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "ParseSpecifier", + "runAddr": "0x030046e8", + "loadAddr": "0x30046e8", + "size": "412 B", + "sizeOri": "0x0000019c", + "location": "", + "type": "F", + "level": 2, + "id": "ParseSpecifier", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_PrintIntWithField", + "runAddr": "0x03004884", + "loadAddr": "0x3004884", + "size": "282 B", + "sizeOri": "0x0000011a", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_PrintIntWithField", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_Atoi", + "runAddr": "0x0300499e", + "loadAddr": "0x300499e", + "size": "106 B", + "sizeOri": "0x0000006a", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_Atoi", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_IOCMG_SetRegValue", + "runAddr": "0x03004b70", + "loadAddr": "0x3004b70", + "size": "68 B", + "sizeOri": "0x00000044", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_IOCMG_SetRegValue", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_IOCMG_SetDriveRate", + "runAddr": "0x03004bb4", + "loadAddr": "0x3004bb4", + "size": "110 B", + "sizeOri": "0x0000006e", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_IOCMG_SetDriveRate", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_IOCMG_SetPullMode", + "runAddr": "0x03004c22", + "loadAddr": "0x3004c22", + "size": "140 B", + "sizeOri": "0x0000008c", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_IOCMG_SetPullMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_IOCMG_SetLevelShiftRate", + "runAddr": "0x03004cae", + "loadAddr": "0x3004cae", + "size": "110 B", + "sizeOri": "0x0000006e", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_IOCMG_SetLevelShiftRate", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_IOCMG_SetSchmidtMode", + "runAddr": "0x03004d1c", + "loadAddr": "0x3004d1c", + "size": "110 B", + "sizeOri": "0x0000006e", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_IOCMG_SetSchmidtMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IOCMG_GetRegAddr", + "runAddr": "0x03004d8a", + "loadAddr": "0x3004d8a", + "size": "82 B", + "sizeOri": "0x00000052", + "location": "", + "type": "F", + "level": 2, + "id": "IOCMG_GetRegAddr", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsTimerMode", + "runAddr": "0x03004f46", + "loadAddr": "0x3004f46", + "size": "54 B", + "sizeOri": "0x00000036", + "location": "", + "type": "F", + "level": 2, + "id": "IsTimerMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsTimerInterruptType", + "runAddr": "0x03004f7c", + "loadAddr": "0x3004f7c", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsTimerInterruptType", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsTimerSize", + "runAddr": "0x03004fa8", + "loadAddr": "0x3004fa8", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsTimerSize", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsTimerPeriod", + "runAddr": "0x03004fd4", + "loadAddr": "0x3004fd4", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsTimerPeriod", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsTimerDiv", + "runAddr": "0x03004ff0", + "loadAddr": "0x3004ff0", + "size": "54 B", + "sizeOri": "0x00000036", + "location": "", + "type": "F", + "level": 2, + "id": "IsTimerDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsUartDatalength", + "runAddr": "0x0300547a", + "loadAddr": "0x300547a", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsUartDatalength", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsUartStopbits", + "runAddr": "0x03005496", + "loadAddr": "0x3005496", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsUartStopbits", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsUartParitymode", + "runAddr": "0x030054c2", + "loadAddr": "0x30054c2", + "size": "34 B", + "sizeOri": "0x00000022", + "location": "", + "type": "F", + "level": 2, + "id": "IsUartParitymode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsUartTransmode", + "runAddr": "0x030054e4", + "loadAddr": "0x30054e4", + "size": "60 B", + "sizeOri": "0x0000003c", + "location": "", + "type": "F", + "level": 2, + "id": "IsUartTransmode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsUartFIFOThreshold", + "runAddr": "0x03005520", + "loadAddr": "0x3005520", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsUartFIFOThreshold", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsUartOversampleMultiple", + "runAddr": "0x0300553c", + "loadAddr": "0x300553c", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsUartOversampleMultiple", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DivClosest", + "runAddr": "0x03005558", + "loadAddr": "0x3005558", + "size": "62 B", + "sizeOri": "0x0000003e", + "location": "", + "type": "F", + "level": 2, + "id": "DivClosest", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "UART_SetParityBit", + "runAddr": "0x03005596", + "loadAddr": "0x3005596", + "size": "150 B", + "sizeOri": "0x00000096", + "location": "", + "type": "F", + "level": 2, + "id": "UART_SetParityBit", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "ADC0_Init", + "runAddr": "0x03005a60", + "loadAddr": "0x3005a60", + "size": "152 B", + "sizeOri": "0x00000098", + "location": "", + "type": "F", + "level": 2, + "id": "ADC0_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "TIMER3_Init", + "runAddr": "0x03005af8", + "loadAddr": "0x3005af8", + "size": "254 B", + "sizeOri": "0x000000fe", + "location": "", + "type": "F", + "level": 2, + "id": "TIMER3_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "UART0_Init", + "runAddr": "0x03005bf6", + "loadAddr": "0x3005bf6", + "size": "200 B", + "sizeOri": "0x000000c8", + "location": "", + "type": "F", + "level": 2, + "id": "UART0_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IOConfig", + "runAddr": "0x03005cc2", + "loadAddr": "0x3005cc2", + "size": "192 B", + "sizeOri": "0x000000c0", + "location": "", + "type": "F", + "level": 2, + "id": "IOConfig", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "__clz_tab", + "runAddr": "0x03006694", + "loadAddr": "0x3006694", + "size": "256 B", + "sizeOri": "0x00000100", + "location": "", + "type": "O", + "level": 2, + "id": "__clz_tab", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "_GLOBAL_OFFSET_TABLE_", + "runAddr": "0x03006794", + "loadAddr": "0x3006794", + "size": "0 B", + "sizeOri": "0x00000000", + "location": "", + "type": "O", + "level": 2, + "id": "_GLOBAL_OFFSET_TABLE_", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinAltFuncMode", + "runAddr": "0x03004ddc", + "loadAddr": "0x3004ddc", + "size": "58 B", + "sizeOri": "0x0000003a", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinAltFuncMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "FLASH_ClockConfig", + "runAddr": "0x03000ec0", + "loadAddr": "0x3000ec0", + "size": "196 B", + "sizeOri": "0x000000c4", + "location": "", + "type": "F", + "level": 2, + "id": "FLASH_ClockConfig", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_TIMER_Start", + "runAddr": "0x0300527c", + "loadAddr": "0x300527c", + "size": "130 B", + "sizeOri": "0x00000082", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_TIMER_Start", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_IpClkSelectSet", + "runAddr": "0x030033d2", + "loadAddr": "0x30033d2", + "size": "182 B", + "sizeOri": "0x000000b6", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_IpClkSelectSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_Init", + "runAddr": "0x0300205a", + "loadAddr": "0x300205a", + "size": "88 B", + "sizeOri": "0x00000058", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_SetCoreClockSelect", + "runAddr": "0x03002ff2", + "loadAddr": "0x3002ff2", + "size": "142 B", + "sizeOri": "0x0000008e", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_SetCoreClockSelect", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_GetPllFreq", + "runAddr": "0x03003114", + "loadAddr": "0x3003114", + "size": "108 B", + "sizeOri": "0x0000006c", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_GetPllFreq", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "FOTP_InfoGet.trans.6", + "runAddr": "0x03000cd0", + "loadAddr": "0x3000cd0", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "FOTP_InfoGet.trans.6", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_Init", + "runAddr": "0x03002d2a", + "loadAddr": "0x3002d2a", + "size": "712 B", + "sizeOri": "0x000002c8", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinLevelShiftRate", + "runAddr": "0x03004eae", + "loadAddr": "0x3004eae", + "size": "76 B", + "sizeOri": "0x0000004c", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinLevelShiftRate", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "AssertErrorLog", + "runAddr": "0x03001eae", + "loadAddr": "0x3001eae", + "size": "22 B", + "sizeOri": "0x00000016", + "location": "", + "type": "F", + "level": 2, + "id": "AssertErrorLog", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_EnableN", + "runAddr": "0x03002138", + "loadAddr": "0x3002138", + "size": "302 B", + "sizeOri": "0x0000012e", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_EnableN", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinSchmidtMode.trans.11", + "runAddr": "0x03005d8a", + "loadAddr": "0x3005d8a", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinSchmidtMode.trans.11", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "GetCrgIpMatchInfo.trans.7", + "runAddr": "0x0300353e", + "loadAddr": "0x300353e", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "GetCrgIpMatchInfo.trans.7", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_IpEnableSet", + "runAddr": "0x030032fa", + "loadAddr": "0x30032fa", + "size": "216 B", + "sizeOri": "0x000000d8", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_IpEnableSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_Register", + "runAddr": "0x030020b2", + "loadAddr": "0x30020b2", + "size": "134 B", + "sizeOri": "0x00000086", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_Register", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_SetCoreClockSelect", + "runAddr": "0x03000d84", + "loadAddr": "0x3000d84", + "size": "66 B", + "sizeOri": "0x00000042", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_SetCoreClockSelect", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_SetPriority", + "runAddr": "0x03002886", + "loadAddr": "0x3002886", + "size": "116 B", + "sizeOri": "0x00000074", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_SetPriority", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_ADC_SoftTrigSample", + "runAddr": "0x03001daa", + "loadAddr": "0x3001daa", + "size": "130 B", + "sizeOri": "0x00000082", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_ADC_SoftTrigSample", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "__extendsfdf2", + "runAddr": "0x03005ebe", + "loadAddr": "0x3005ebe", + "size": "222 B", + "sizeOri": "0x000000de", + "location": "", + "type": "F", + "level": 2, + "id": "__extendsfdf2", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_ADC_Init", + "runAddr": "0x03001a1a", + "loadAddr": "0x3001a1a", + "size": "178 B", + "sizeOri": "0x000000b2", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_ADC_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "FOTP_InfoGet", + "runAddr": "0x03001046", + "loadAddr": "0x3001046", + "size": "354 B", + "sizeOri": "0x00000162", + "location": "", + "type": "F", + "level": 2, + "id": "FOTP_InfoGet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_IpEnableSet.trans.4", + "runAddr": "0x03000d80", + "loadAddr": "0x3000d80", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_IpEnableSet.trans.4", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_ADC_StartIt", + "runAddr": "0x03001c7e", + "loadAddr": "0x3001c7e", + "size": "300 B", + "sizeOri": "0x0000012c", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_ADC_StartIt", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "TIMER3_InterruptProcess", + "runAddr": "0x03005dd6", + "loadAddr": "0x3005dd6", + "size": "232 B", + "sizeOri": "0x000000e8", + "location": "", + "type": "F", + "level": 2, + "id": "TIMER3_InterruptProcess", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SysErrNmiEntry", + "runAddr": "0x030022a4", + "loadAddr": "0x30022a4", + "size": "52 B", + "sizeOri": "0x00000034", + "location": "", + "type": "F", + "level": 2, + "id": "SysErrNmiEntry", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "ANATRIM_Entry", + "runAddr": "0x03000cd4", + "loadAddr": "0x3000cd4", + "size": "82 B", + "sizeOri": "0x00000052", + "location": "", + "type": "F", + "level": 2, + "id": "ANATRIM_Entry", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_ADC_GetConvResult", + "runAddr": "0x03001e2c", + "loadAddr": "0x3001e2c", + "size": "130 B", + "sizeOri": "0x00000082", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_ADC_GetConvResult", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "ANAVREF_Init", + "runAddr": "0x03000d26", + "loadAddr": "0x3000d26", + "size": "90 B", + "sizeOri": "0x0000005a", + "location": "", + "type": "F", + "level": 2, + "id": "ANAVREF_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinSchmidtMode", + "runAddr": "0x03004e62", + "loadAddr": "0x3004e62", + "size": "76 B", + "sizeOri": "0x0000004c", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinSchmidtMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_Config", + "runAddr": "0x030059f6", + "loadAddr": "0x30059f6", + "size": "106 B", + "sizeOri": "0x0000006a", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_Config", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "Chip_Init", + "runAddr": "0x0300070c", + "loadAddr": "0x300070c", + "size": "64 B", + "sizeOri": "0x00000040", + "location": "", + "type": "F", + "level": 2, + "id": "Chip_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinAltFuncMode.trans.9", + "runAddr": "0x03005d92", + "loadAddr": "0x3005d92", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinAltFuncMode.trans.9", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "__clzsi2", + "runAddr": "0x030061be", + "loadAddr": "0x30061be", + "size": "60 B", + "sizeOri": "0x0000003c", + "location": "", + "type": "F", + "level": 2, + "id": "__clzsi2", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "AssertErrorLog.trans.1", + "runAddr": "0x03002d26", + "loadAddr": "0x3002d26", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "AssertErrorLog.trans.1", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinLevelShiftRate.trans.12", + "runAddr": "0x03005d86", + "loadAddr": "0x3005d86", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinLevelShiftRate.trans.12", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "AssertErrorLog.trans.3", + "runAddr": "0x03005278", + "loadAddr": "0x3005278", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "AssertErrorLog.trans.3", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_GetCoreClkFreq", + "runAddr": "0x03003180", + "loadAddr": "0x3003180", + "size": "150 B", + "sizeOri": "0x00000096", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_GetCoreClkFreq", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_GetIpFreq", + "runAddr": "0x03003216", + "loadAddr": "0x3003216", + "size": "228 B", + "sizeOri": "0x000000e4", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_GetIpFreq", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SYSTICK_GetCRGHZ", + "runAddr": "0x03000fa6", + "loadAddr": "0x3000fa6", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "SYSTICK_GetCRGHZ", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_TIMER_RegisterCallback", + "runAddr": "0x030053e6", + "loadAddr": "0x30053e6", + "size": "148 B", + "sizeOri": "0x00000094", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_TIMER_RegisterCallback", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "BASE_FUNC_Delay.trans.8", + "runAddr": "0x03000dc6", + "loadAddr": "0x3000dc6", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "BASE_FUNC_Delay.trans.8", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinPullMode", + "runAddr": "0x03004e16", + "loadAddr": "0x3004e16", + "size": "76 B", + "sizeOri": "0x0000004c", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinPullMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "GetCrgIpMatchInfo", + "runAddr": "0x030011a8", + "loadAddr": "0x30011a8", + "size": "100 B", + "sizeOri": "0x00000064", + "location": "", + "type": "F", + "level": 2, + "id": "GetCrgIpMatchInfo", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SysErrExcEntry", + "runAddr": "0x03002286", + "loadAddr": "0x3002286", + "size": "30 B", + "sizeOri": "0x0000001e", + "location": "", + "type": "F", + "level": 2, + "id": "SysErrExcEntry", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "main", + "runAddr": "0x030059ea", + "loadAddr": "0x30059ea", + "size": "12 B", + "sizeOri": "0x0000000c", + "location": "", + "type": "F", + "level": 2, + "id": "main", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_ADC_ConfigureSoc", + "runAddr": "0x03001acc", + "loadAddr": "0x3001acc", + "size": "434 B", + "sizeOri": "0x000001b2", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_ADC_ConfigureSoc", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "__truncdfsf2", + "runAddr": "0x03005f9c", + "loadAddr": "0x3005f9c", + "size": "546 B", + "sizeOri": "0x00000222", + "location": "", + "type": "F", + "level": 2, + "id": "__truncdfsf2", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_IpClkDivSet", + "runAddr": "0x03003488", + "loadAddr": "0x3003488", + "size": "182 B", + "sizeOri": "0x000000b6", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_IpClkDivSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SystemInit", + "runAddr": "0x03005d96", + "loadAddr": "0x3005d96", + "size": "64 B", + "sizeOri": "0x00000040", + "location": "", + "type": "F", + "level": 2, + "id": "SystemInit", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "BASE_FUNC_DelaySeconds", + "runAddr": "0x03001f6c", + "loadAddr": "0x3001f6c", + "size": "56 B", + "sizeOri": "0x00000038", + "location": "", + "type": "F", + "level": 2, + "id": "BASE_FUNC_DelaySeconds", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "AssertErrorLog.trans.0", + "runAddr": "0x0300183a", + "loadAddr": "0x300183a", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "AssertErrorLog.trans.0", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_TIMER_Init", + "runAddr": "0x03005026", + "loadAddr": "0x3005026", + "size": "594 B", + "sizeOri": "0x00000252", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_TIMER_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "BASE_FUNC_Delay", + "runAddr": "0x03001fa4", + "loadAddr": "0x3001fa4", + "size": "82 B", + "sizeOri": "0x00000052", + "location": "", + "type": "F", + "level": 2, + "id": "BASE_FUNC_Delay", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "BASE_FUNC_DelayMs", + "runAddr": "0x03001f34", + "loadAddr": "0x3001f34", + "size": "56 B", + "sizeOri": "0x00000038", + "location": "", + "type": "F", + "level": 2, + "id": "BASE_FUNC_DelayMs", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinPullMode.trans.10", + "runAddr": "0x03005d8e", + "loadAddr": "0x3005d8e", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinPullMode.trans.10", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "InterruptEntry", + "runAddr": "0x03002016", + "loadAddr": "0x3002016", + "size": "68 B", + "sizeOri": "0x00000044", + "location": "", + "type": "F", + "level": 2, + "id": "InterruptEntry", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinDriveRate.trans.13", + "runAddr": "0x03005d82", + "loadAddr": "0x3005d82", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinDriveRate.trans.13", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_UartPrintf", + "runAddr": "0x03004a08", + "loadAddr": "0x3004a08", + "size": "360 B", + "sizeOri": "0x00000168", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_UartPrintf", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_IpEnableSet.trans.5", + "runAddr": "0x03005cbe", + "loadAddr": "0x3005cbe", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_IpEnableSet.trans.5", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "AssertErrorLog.trans.2", + "runAddr": "0x03003a66", + "loadAddr": "0x3003a66", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "AssertErrorLog.trans.2", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "BASE_FUNC_DelayUs", + "runAddr": "0x03001ed8", + "loadAddr": "0x3001ed8", + "size": "92 B", + "sizeOri": "0x0000005c", + "location": "", + "type": "F", + "level": 2, + "id": "BASE_FUNC_DelayUs", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_UART_Init", + "runAddr": "0x0300562c", + "loadAddr": "0x300562c", + "size": "958 B", + "sizeOri": "0x000003be", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_UART_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SYSTICK_Init", + "runAddr": "0x03000f84", + "loadAddr": "0x3000f84", + "size": "34 B", + "sizeOri": "0x00000022", + "location": "", + "type": "F", + "level": 2, + "id": "SYSTICK_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_TIMER_IrqHandler", + "runAddr": "0x030052fe", + "loadAddr": "0x30052fe", + "size": "232 B", + "sizeOri": "0x000000e8", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_TIMER_IrqHandler", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SysErrPrint", + "runAddr": "0x03002266", + "loadAddr": "0x3002266", + "size": "18 B", + "sizeOri": "0x00000012", + "location": "", + "type": "F", + "level": 2, + "id": "SysErrPrint", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinDriveRate", + "runAddr": "0x03004efa", + "loadAddr": "0x3004efa", + "size": "76 B", + "sizeOri": "0x0000004c", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinDriveRate", + "IPARENTID": ".text", + "sort": 0 + } + ], + "regionName": [ + "FLASH_CODE" + ], + "runAddr": "0x03000704", + "loadAddr": "0x03000704", + "size": "24736 B", + "sizeOri": "0x000060a0" + }, + { + "name": ".data", + "id": ".data", + "level": 1, + "IPARENTID": null, + "open": false, + "sort": 0, + "children": [ + { + "name": "g_ipClkProc", + "runAddr": "0x04000024", + "loadAddr": "0x30067a8", + "size": "216 B", + "sizeOri": "0x000000d8", + "location": "", + "type": "O", + "level": 2, + "id": "g_ipClkProc", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "g_tsensorGain", + "runAddr": "0x04000020", + "loadAddr": "0x30067a4", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "g_tsensorGain", + "IPARENTID": ".data", + "sort": 0 + } + ], + "regionName": [ + "RAM_DATA", + "FLASH_CODE" + ], + "runAddr": "0x04000020", + "loadAddr": "0x030067a4", + "size": "220 B", + "sizeOri": "0x000000dc" + } + ] + }, + { + "name": "RAM_STACK", + "startAddr": "0x0000000004005000", + "endAddr": "0x0000000004008000", + "size": "12288 B", + "sizeOri": "0x0000000000003000", + "used": "1024 B", + "usage": "8.33%", + "free": "11264 B", + "level": 0, + "open": true, + "id": "RAM_STACK", + "sort": 0, + "children": [ + { + "name": ".stacks", + "id": ".stacks", + "level": 1, + "IPARENTID": "RAM_STACK", + "open": false, + "sort": 0, + "children": [], + "regionName": [ + "RAM_STACK" + ], + "runAddr": "0x04005000", + "loadAddr": "", + "size": "1024 B", + "sizeOri": "0x00000400" + } + ] + }, + { + "name": "RAM_DIAGNOSE_BUF", + "startAddr": "0x0000000004000000", + "endAddr": "0x0000000004000020", + "size": "32 B", + "sizeOri": "0x0000000000000020", + "used": "0 B", + "usage": "0.00%", + "free": "32 B", + "level": 0, + "open": true, + "id": "RAM_DIAGNOSE_BUF", + "sort": 0, + "children": [ + { + "name": ".reserved.data", + "id": ".reserved.data", + "level": 1, + "IPARENTID": "RAM_DIAGNOSE_BUF", + "open": false, + "sort": 0, + "children": [], + "regionName": [ + "RAM_DIAGNOSE_BUF" + ], + "runAddr": "0x04000000", + "loadAddr": "", + "size": "0 B", + "sizeOri": "0x00000000" + } + ] + }, + { + "name": "RAM_DATA", + "startAddr": "0x0000000004000020", + "endAddr": "0x0000000004004ff0", + "size": "20432 B", + "sizeOri": "0x0000000000004fd0", + "used": "8680 B", + "usage": "42.48%", + "free": "11752 B", + "level": 0, + "open": true, + "id": "RAM_DATA", + "sort": 0, + "children": [ + { + "name": ".data", + "id": ".data", + "level": 1, + "IPARENTID": "RAM_DATA", + "open": false, + "sort": 0, + "children": [ + { + "name": "g_ipClkProc", + "runAddr": "0x04000024", + "loadAddr": "0x30067a8", + "size": "216 B", + "sizeOri": "0x000000d8", + "location": "", + "type": "O", + "level": 2, + "id": "g_ipClkProc", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "g_tsensorGain", + "runAddr": "0x04000020", + "loadAddr": "0x30067a4", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "g_tsensorGain", + "IPARENTID": ".data", + "sort": 0 + } + ], + "regionName": [ + "RAM_DATA", + "FLASH_CODE" + ], + "runAddr": "0x04000020", + "loadAddr": "0x030067a4", + "size": "220 B", + "sizeOri": "0x000000dc" + }, + { + "name": ".bss", + "id": ".bss", + "level": 1, + "IPARENTID": null, + "open": false, + "sort": 0, + "children": [ + { + "name": "g_crgBaseAddr", + "runAddr": "0x04000494", + "loadAddr": "", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "g_crgBaseAddr", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_anaEnableFlag", + "runAddr": "0x04000498", + "loadAddr": "", + "size": "1 B", + "sizeOri": "0x00000001", + "location": "", + "type": "O", + "level": 2, + "id": "g_anaEnableFlag", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_uart0", + "runAddr": "0x040004c4", + "loadAddr": "", + "size": "128 B", + "sizeOri": "0x00000080", + "location": "", + "type": "O", + "level": 2, + "id": "g_uart0", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "adc_num", + "runAddr": "0x040005e4", + "loadAddr": "", + "size": "7200 B", + "sizeOri": "0x00001c20", + "location": "", + "type": "O", + "level": 2, + "id": "adc_num", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "i", + "runAddr": "0x04002204", + "loadAddr": "", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "i", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_irqCallbackFunc", + "runAddr": "0x040000fc", + "loadAddr": "", + "size": "920 B", + "sizeOri": "0x00000398", + "location": "", + "type": "O", + "level": 2, + "id": "g_irqCallbackFunc", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_adc0", + "runAddr": "0x04000544", + "loadAddr": "", + "size": "160 B", + "sizeOri": "0x000000a0", + "location": "", + "type": "O", + "level": 2, + "id": "g_adc0", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_timer3", + "runAddr": "0x0400049c", + "loadAddr": "", + "size": "40 B", + "sizeOri": "0x00000028", + "location": "", + "type": "O", + "level": 2, + "id": "g_timer3", + "IPARENTID": ".bss", + "sort": 0 + } + ], + "regionName": [ + "RAM_DATA" + ], + "runAddr": "0x040000fc", + "loadAddr": "", + "size": "8460 B", + "sizeOri": "0x0000210c" + } + ] + }, + { + "name": "STACK_SRAM_BOUND", + "startAddr": "0x0000000004004ff0", + "endAddr": "0x0000000004005000", + "size": "16 B", + "sizeOri": "0x0000000000000010", + "used": "0 B", + "usage": "0.00%", + "free": "16 B", + "level": 0, + "open": true, + "id": "STACK_SRAM_BOUND", + "sort": 0, + "children": [ + { + "name": ".stackBound", + "id": ".stackBound", + "level": 1, + "IPARENTID": "STACK_SRAM_BOUND", + "open": false, + "sort": 0, + "children": [], + "regionName": [ + "STACK_SRAM_BOUND" + ], + "runAddr": "0x04004ff0", + "loadAddr": "", + "size": "0 B", + "sizeOri": "0x00000000" + } + ] + } + ], + "fileSizeTree": { + "startup.o": { + "objName": "startup.o", + "parent": "", + "path": "obj\\chip\\3061m", + "romSize": 1812, + "moduleName": "startup.o", + "componentName": "", + ".text": 16, + ".data": 0, + ".bss": 0, + ".data.magic": 4, + ".text.entry": 1792, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "startup.o", + "id": "startup.o", + "dec": 0, + "sumSize": 1812 + }, + "0x0000000003000000": { + "objName": "0x0000000003000000", + "parent": "startup.o", + "path": "", + "romSize": 4, + "moduleName": "startup.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 4, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003000000", + "id": "0x0000000003000000", + "dec": 0, + "sumSize": 4 + }, + "0x0000000003000004": { + "objName": "_start", + "parent": "startup.o", + "isSymbol": true, + "lib": "", + "moduleName": "startup.o", + "componentName": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 1792, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003000004", + "id": "_start", + "dec": 0, + "romSize": 0, + "sumSize": 1792 + }, + "0x0000000003000704": { + "objName": "Chip_InitFail", + "parent": "chipinit.o", + "path": "", + "romSize": 8, + "moduleName": "chipinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 8, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003000704", + "id": "Chip_InitFail", + "dec": 0, + "sumSize": 8 + }, + "chipinit.o": { + "objName": "chipinit.o", + "parent": "", + "path": "obj\\chip\\3061m\\chipinit", + "romSize": 72, + "moduleName": "chipinit.o", + "componentName": "", + ".text": 72, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 16833, + ".comment": 0, + ".debug_line": 347, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "chipinit.o", + "id": "chipinit.o", + "dec": 0, + "sumSize": 72 + }, + "0x000000000300070c": { + "objName": "Chip_Init", + "parent": "chipinit.o", + "path": "", + "romSize": 64, + "moduleName": "chipinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 64, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300070c", + "id": "Chip_Init", + "dec": 0, + "sumSize": 64 + }, + "anatrim.o": { + "objName": "anatrim.o", + "parent": "", + "path": "obj\\chip\\3061m\\chipinit\\anatrim", + "romSize": 1498, + "moduleName": "anatrim.o", + "componentName": "", + ".text": 1498, + ".data": 4, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 48, + ".comment": 0, + ".debug_line": 23014, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "anatrim.o", + "id": "anatrim.o", + "dec": 0, + "sumSize": 1502 + }, + "0x000000000300074c": { + "objName": "CalculateGain", + "parent": "anatrim.o", + "path": "", + "romSize": 46, + "moduleName": "anatrim.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 46, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300074c", + "id": "CalculateGain", + "dec": 0, + "sumSize": 46 + }, + "0x000000000300077a": { + "objName": "CHIP_GetInfo", + "parent": "anatrim.o", + "path": "", + "romSize": 74, + "moduleName": "anatrim.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 74, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300077a", + "id": "CHIP_GetInfo", + "dec": 0, + "sumSize": 74 + }, + "0x00000000030007c4": { + "objName": "CHIP_AnalogTrim", + "parent": "anatrim.o", + "path": "", + "romSize": 1292, + "moduleName": "anatrim.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 1292, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030007c4", + "id": "CHIP_AnalogTrim", + "dec": 0, + "sumSize": 1292 + }, + "0x0000000003000cd4": { + "objName": "ANATRIM_Entry", + "parent": "anatrim.o", + "path": "", + "romSize": 82, + "moduleName": "anatrim.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 82, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003000cd4", + "id": "ANATRIM_Entry", + "dec": 0, + "sumSize": 82 + }, + "anavrefinit.o": { + "objName": "anavrefinit.o", + "parent": "", + "path": "obj\\chip\\3061m\\chipinit\\anavrefinit", + "romSize": 90, + "moduleName": "anavrefinit.o", + "componentName": "", + ".text": 90, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1398, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "anavrefinit.o", + "id": "anavrefinit.o", + "dec": 0, + "sumSize": 90 + }, + "0x0000000003000d26": { + "objName": "ANAVREF_Init", + "parent": "anavrefinit.o", + "path": "", + "romSize": 90, + "moduleName": "anavrefinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 90, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003000d26", + "id": "ANAVREF_Init", + "dec": 0, + "sumSize": 90 + }, + "crginit.o": { + "objName": "crginit.o", + "parent": "", + "path": "obj\\chip\\3061m\\chipinit\\crginit", + "romSize": 66, + "moduleName": "crginit.o", + "componentName": "", + ".text": 66, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 14899, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "crginit.o", + "id": "crginit.o", + "dec": 0, + "sumSize": 66 + }, + "0x0000000003000d84": { + "objName": "CRG_SetCoreClockSelect", + "parent": "crginit.o", + "path": "", + "romSize": 66, + "moduleName": "crginit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 66, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003000d84", + "id": "CRG_SetCoreClockSelect", + "dec": 0, + "sumSize": 66 + }, + "flashinit.o": { + "objName": "flashinit.o", + "parent": "", + "path": "obj\\chip\\3061m\\chipinit\\flashinit", + "romSize": 442, + "moduleName": "flashinit.o", + "componentName": "", + ".text": 442, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3279, + ".debug_info": 4382, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "flashinit.o", + "id": "flashinit.o", + "dec": 0, + "sumSize": 442 + }, + "0x0000000003000dca": { + "objName": "SetFlashDiv", + "parent": "flashinit.o", + "path": "", + "romSize": 146, + "moduleName": "flashinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 146, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003000dca", + "id": "SetFlashDiv", + "dec": 0, + "sumSize": 146 + }, + "0x0000000003000e5c": { + "objName": "GetFlashFreq", + "parent": "flashinit.o", + "path": "", + "romSize": 100, + "moduleName": "flashinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 100, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003000e5c", + "id": "GetFlashFreq", + "dec": 0, + "sumSize": 100 + }, + "0x0000000003000ec0": { + "objName": "FLASH_ClockConfig", + "parent": "flashinit.o", + "path": "", + "romSize": 196, + "moduleName": "flashinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 196, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003000ec0", + "id": "FLASH_ClockConfig", + "dec": 0, + "sumSize": 196 + }, + "systickinit.o": { + "objName": "systickinit.o", + "parent": "", + "path": "obj\\chip\\3061m\\chipinit\\systickinit", + "romSize": 62, + "moduleName": "systickinit.o", + "componentName": "", + ".text": 62, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 776, + ".debug_info": 414, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "systickinit.o", + "id": "systickinit.o", + "dec": 0, + "sumSize": 62 + }, + "0x0000000003000f84": { + "objName": "SYSTICK_Init", + "parent": "systickinit.o", + "path": "", + "romSize": 34, + "moduleName": "systickinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 34, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003000f84", + "id": "SYSTICK_Init", + "dec": 0, + "sumSize": 34 + }, + "0x0000000003000fa6": { + "objName": "SYSTICK_GetCRGHZ", + "parent": "systickinit.o", + "path": "", + "romSize": 28, + "moduleName": "systickinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003000fa6", + "id": "SYSTICK_GetCRGHZ", + "dec": 0, + "sumSize": 28 + }, + "fotp_info_read.o": { + "objName": "fotp_info_read.o", + "parent": "", + "path": "obj\\chip\\3061m\\fotp", + "romSize": 486, + "moduleName": "fotp_info_read.o", + "componentName": "", + ".text": 486, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1270, + ".debug_info": 4434, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "fotp_info_read.o", + "id": "fotp_info_read.o", + "dec": 0, + "sumSize": 486 + }, + "0x0000000003000fc2": { + "objName": "FOTP_CheckReadStatus", + "parent": "fotp_info_read.o", + "path": "", + "romSize": 132, + "moduleName": "fotp_info_read.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 132, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003000fc2", + "id": "FOTP_CheckReadStatus", + "dec": 0, + "sumSize": 132 + }, + "0x0000000003001046": { + "objName": "FOTP_InfoGet", + "parent": "fotp_info_read.o", + "path": "", + "romSize": 354, + "moduleName": "fotp_info_read.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 354, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001046", + "id": "FOTP_InfoGet", + "dec": 0, + "sumSize": 354 + }, + "ip_crg_common.o": { + "objName": "ip_crg_common.o", + "parent": "", + "path": "obj\\chip\\3061m\\ip_crg", + "romSize": 652, + "moduleName": "ip_crg_common.o", + "componentName": "", + ".text": 652, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 538, + ".debug_info": 304, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "ip_crg_common.o", + "id": "ip_crg_common.o", + "dec": 0, + "sumSize": 652 + }, + "0x00000000030011a8": { + "objName": "GetCrgIpMatchInfo", + "parent": "ip_crg_common.o", + "path": "", + "romSize": 100, + "moduleName": "ip_crg_common.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 100, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030011a8", + "id": "GetCrgIpMatchInfo", + "dec": 0, + "sumSize": 100 + }, + "adc.o": { + "objName": "adc.o", + "parent": "", + "path": "obj\\drivers\\adc\\src", + "romSize": 3310, + "moduleName": "adc.o", + "componentName": "", + ".text": 3310, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 17270, + ".debug_info": 26163, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "adc.o", + "id": "adc.o", + "dec": 0, + "sumSize": 3310 + }, + "0x000000000300120c": { + "objName": "IsADCSampleChannel", + "parent": "adc.o", + "path": "", + "romSize": 28, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300120c", + "id": "IsADCSampleChannel", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003001228": { + "objName": "IsADCSOCx", + "parent": "adc.o", + "path": "", + "romSize": 28, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001228", + "id": "IsADCSOCx", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003001244": { + "objName": "IsADCIntx", + "parent": "adc.o", + "path": "", + "romSize": 28, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001244", + "id": "IsADCIntx", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003001260": { + "objName": "IsADCTrigSource", + "parent": "adc.o", + "path": "", + "romSize": 28, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001260", + "id": "IsADCTrigSource", + "dec": 0, + "sumSize": 28 + }, + "0x000000000300127c": { + "objName": "IsADCFinishMode", + "parent": "adc.o", + "path": "", + "romSize": 44, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 44, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300127c", + "id": "IsADCFinishMode", + "dec": 0, + "sumSize": 44 + }, + "0x00000000030012a8": { + "objName": "IsADCPriorityMode", + "parent": "adc.o", + "path": "", + "romSize": 30, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 30, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030012a8", + "id": "IsADCPriorityMode", + "dec": 0, + "sumSize": 30 + }, + "0x00000000030012c6": { + "objName": "IsADCTotalTime", + "parent": "adc.o", + "path": "", + "romSize": 28, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030012c6", + "id": "IsADCTotalTime", + "dec": 0, + "sumSize": 28 + }, + "0x00000000030012e2": { + "objName": "DCL_ADC_EnableAvddChannel", + "parent": "adc.o", + "path": "", + "romSize": 68, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 68, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030012e2", + "id": "DCL_ADC_EnableAvddChannel", + "dec": 0, + "sumSize": 68 + }, + "0x0000000003001326": { + "objName": "DCL_ADC_SetSOCxBlindInt0", + "parent": "adc.o", + "path": "", + "romSize": 124, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 124, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001326", + "id": "DCL_ADC_SetSOCxBlindInt0", + "dec": 0, + "sumSize": 124 + }, + "0x00000000030013a2": { + "objName": "DCL_ADC_SetSOCxBlindInt1", + "parent": "adc.o", + "path": "", + "romSize": 126, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 126, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030013a2", + "id": "DCL_ADC_SetSOCxBlindInt1", + "dec": 0, + "sumSize": 126 + }, + "0x0000000003001420": { + "objName": "DCL_ADC_SetSOCxBlindInt2", + "parent": "adc.o", + "path": "", + "romSize": 124, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 124, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001420", + "id": "DCL_ADC_SetSOCxBlindInt2", + "dec": 0, + "sumSize": 124 + }, + "0x000000000300149c": { + "objName": "DCL_ADC_SetSOCxBlindInt3", + "parent": "adc.o", + "path": "", + "romSize": 126, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 126, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300149c", + "id": "DCL_ADC_SetSOCxBlindInt3", + "dec": 0, + "sumSize": 126 + }, + "0x000000000300151a": { + "objName": "DCL_ADC_EnableIntx", + "parent": "adc.o", + "path": "", + "romSize": 116, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 116, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300151a", + "id": "DCL_ADC_EnableIntx", + "dec": 0, + "sumSize": 116 + }, + "0x000000000300158e": { + "objName": "ADC_GetCTRLAddr", + "parent": "adc.o", + "path": "", + "romSize": 54, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 54, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300158e", + "id": "ADC_GetCTRLAddr", + "dec": 0, + "sumSize": 54 + }, + "0x00000000030015c4": { + "objName": "DCL_ADC_SOCxSelectChannel", + "parent": "adc.o", + "path": "", + "romSize": 174, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 174, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030015c4", + "id": "DCL_ADC_SOCxSelectChannel", + "dec": 0, + "sumSize": 174 + }, + "0x0000000003001672": { + "objName": "DCL_ADC_SOCxSelcetTrigSource", + "parent": "adc.o", + "path": "", + "romSize": 166, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 166, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001672", + "id": "DCL_ADC_SOCxSelcetTrigSource", + "dec": 0, + "sumSize": 166 + }, + "0x0000000003001718": { + "objName": "DCL_ADC_SOCxSetAcqps", + "parent": "adc.o", + "path": "", + "romSize": 174, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 174, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001718", + "id": "DCL_ADC_SOCxSetAcqps", + "dec": 0, + "sumSize": 174 + }, + "0x00000000030017c6": { + "objName": "DCL_ADC_SOCxSoftTrigger", + "parent": "adc.o", + "path": "", + "romSize": 116, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 116, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030017c6", + "id": "DCL_ADC_SOCxSoftTrigger", + "dec": 0, + "sumSize": 116 + }, + "0x000000000300183e": { + "objName": "DCL_ADC_SOCxSetPriority", + "parent": "adc.o", + "path": "", + "romSize": 100, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 100, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300183e", + "id": "DCL_ADC_SOCxSetPriority", + "dec": 0, + "sumSize": 100 + }, + "0x00000000030018a2": { + "objName": "DCL_ADC_ReadSOCxResult", + "parent": "adc.o", + "path": "", + "romSize": 122, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 122, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030018a2", + "id": "DCL_ADC_ReadSOCxResult", + "dec": 0, + "sumSize": 122 + }, + "0x000000000300191c": { + "objName": "DCL_ADC_EnableSOCxContinue", + "parent": "adc.o", + "path": "", + "romSize": 126, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 126, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300191c", + "id": "DCL_ADC_EnableSOCxContinue", + "dec": 0, + "sumSize": 126 + }, + "0x000000000300199a": { + "objName": "DCL_ADC_DisableSOCxContinue", + "parent": "adc.o", + "path": "", + "romSize": 128, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 128, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300199a", + "id": "DCL_ADC_DisableSOCxContinue", + "dec": 0, + "sumSize": 128 + }, + "0x0000000003001a1a": { + "objName": "HAL_ADC_Init", + "parent": "adc.o", + "path": "", + "romSize": 178, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 178, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001a1a", + "id": "HAL_ADC_Init", + "dec": 0, + "sumSize": 178 + }, + "0x0000000003001acc": { + "objName": "HAL_ADC_ConfigureSoc", + "parent": "adc.o", + "path": "", + "romSize": 434, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 434, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001acc", + "id": "HAL_ADC_ConfigureSoc", + "dec": 0, + "sumSize": 434 + }, + "0x0000000003001c7e": { + "objName": "HAL_ADC_StartIt", + "parent": "adc.o", + "path": "", + "romSize": 300, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 300, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001c7e", + "id": "HAL_ADC_StartIt", + "dec": 0, + "sumSize": 300 + }, + "0x0000000003001daa": { + "objName": "HAL_ADC_SoftTrigSample", + "parent": "adc.o", + "path": "", + "romSize": 130, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 130, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001daa", + "id": "HAL_ADC_SoftTrigSample", + "dec": 0, + "sumSize": 130 + }, + "0x0000000003001e2c": { + "objName": "HAL_ADC_GetConvResult", + "parent": "adc.o", + "path": "", + "romSize": 130, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 130, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001e2c", + "id": "HAL_ADC_GetConvResult", + "dec": 0, + "sumSize": 130 + }, + "assert.o": { + "objName": "assert.o", + "parent": "", + "path": "obj\\drivers\\base\\src", + "romSize": 22, + "moduleName": "assert.o", + "componentName": "", + ".text": 22, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 375, + ".debug_info": 129, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "assert.o", + "id": "assert.o", + "dec": 0, + "sumSize": 22 + }, + "0x0000000003001eae": { + "objName": "AssertErrorLog", + "parent": "assert.o", + "path": "", + "romSize": 22, + "moduleName": "assert.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 22, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001eae", + "id": "AssertErrorLog", + "dec": 0, + "sumSize": 22 + }, + "clock.o": { + "objName": "clock.o", + "parent": "", + "path": "obj\\drivers\\base\\src", + "romSize": 306, + "moduleName": "clock.o", + "componentName": "", + ".text": 306, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1412, + ".debug_info": 721, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "clock.o", + "id": "clock.o", + "dec": 0, + "sumSize": 306 + }, + "0x0000000003001ec4": { + "objName": "DCL_SYSTICK_GetTick", + "parent": "clock.o", + "path": "", + "romSize": 20, + "moduleName": "clock.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 20, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001ec4", + "id": "DCL_SYSTICK_GetTick", + "dec": 0, + "sumSize": 20 + }, + "0x0000000003001ed8": { + "objName": "BASE_FUNC_DelayUs", + "parent": "clock.o", + "path": "", + "romSize": 92, + "moduleName": "clock.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 92, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001ed8", + "id": "BASE_FUNC_DelayUs", + "dec": 0, + "sumSize": 92 + }, + "0x0000000003001f34": { + "objName": "BASE_FUNC_DelayMs", + "parent": "clock.o", + "path": "", + "romSize": 56, + "moduleName": "clock.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 56, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001f34", + "id": "BASE_FUNC_DelayMs", + "dec": 0, + "sumSize": 56 + }, + "0x0000000003001f6c": { + "objName": "BASE_FUNC_DelaySeconds", + "parent": "clock.o", + "path": "", + "romSize": 56, + "moduleName": "clock.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 56, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001f6c", + "id": "BASE_FUNC_DelaySeconds", + "dec": 0, + "sumSize": 56 + }, + "0x0000000003001fa4": { + "objName": "BASE_FUNC_Delay", + "parent": "clock.o", + "path": "", + "romSize": 82, + "moduleName": "clock.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 82, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001fa4", + "id": "BASE_FUNC_Delay", + "dec": 0, + "sumSize": 82 + }, + "interrupt.o": { + "objName": "interrupt.o", + "parent": "", + "path": "obj\\drivers\\base\\src", + "romSize": 2492, + "moduleName": "interrupt.o", + "componentName": "", + ".text": 2492, + ".data": 0, + ".bss": 920, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 4880, + ".debug_info": 3648, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "interrupt.o", + "id": "interrupt.o", + "dec": 0, + "sumSize": 2492 + }, + "0x0000000003001ff6": { + "objName": "IRQ_ClearN", + "parent": "interrupt.o", + "path": "", + "romSize": 32, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 32, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003001ff6", + "id": "IRQ_ClearN", + "dec": 0, + "sumSize": 32 + }, + "0x0000000003002016": { + "objName": "InterruptEntry", + "parent": "interrupt.o", + "path": "", + "romSize": 68, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 68, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002016", + "id": "InterruptEntry", + "dec": 0, + "sumSize": 68 + }, + "0x000000000300205a": { + "objName": "IRQ_Init", + "parent": "interrupt.o", + "path": "", + "romSize": 88, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 88, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300205a", + "id": "IRQ_Init", + "dec": 0, + "sumSize": 88 + }, + "0x00000000030020b2": { + "objName": "IRQ_Register", + "parent": "interrupt.o", + "path": "", + "romSize": 134, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 134, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030020b2", + "id": "IRQ_Register", + "dec": 0, + "sumSize": 134 + }, + "0x0000000003002138": { + "objName": "IRQ_EnableN", + "parent": "interrupt.o", + "path": "", + "romSize": 302, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 302, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002138", + "id": "IRQ_EnableN", + "dec": 0, + "sumSize": 302 + }, + "0x0000000003002266": { + "objName": "SysErrPrint", + "parent": "interrupt.o", + "path": "", + "romSize": 18, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 18, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002266", + "id": "SysErrPrint", + "dec": 0, + "sumSize": 18 + }, + "0x0000000003002278": { + "objName": "SysErrFinish", + "parent": "interrupt.o", + "path": "", + "romSize": 14, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 14, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002278", + "id": "SysErrFinish", + "dec": 0, + "sumSize": 14 + }, + "0x0000000003002286": { + "objName": "SysErrExcEntry", + "parent": "interrupt.o", + "path": "", + "romSize": 30, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 30, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002286", + "id": "SysErrExcEntry", + "dec": 0, + "sumSize": 30 + }, + "0x00000000030022a4": { + "objName": "SysErrNmiEntry", + "parent": "interrupt.o", + "path": "", + "romSize": 52, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 52, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030022a4", + "id": "SysErrNmiEntry", + "dec": 0, + "sumSize": 52 + }, + "0x00000000030022d8": { + "objName": "SetLocalIntNumPri", + "parent": "interrupt.o", + "path": "", + "romSize": 714, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 714, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030022d8", + "id": "SetLocalIntNumPri", + "dec": 0, + "sumSize": 714 + }, + "0x00000000030025a2": { + "objName": "IRQ_SetLocalPriority", + "parent": "interrupt.o", + "path": "", + "romSize": 740, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 740, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030025a2", + "id": "IRQ_SetLocalPriority", + "dec": 0, + "sumSize": 740 + }, + "0x0000000003002886": { + "objName": "IRQ_SetPriority", + "parent": "interrupt.o", + "path": "", + "romSize": 116, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 116, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002886", + "id": "IRQ_SetPriority", + "dec": 0, + "sumSize": 116 + }, + "0x00000000030028fa": { + "objName": "IRQ_DummyHandler", + "parent": "interrupt.o", + "path": "", + "romSize": 18, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 18, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030028fa", + "id": "IRQ_DummyHandler", + "dec": 0, + "sumSize": 18 + }, + "0x000000000300290c": { + "objName": "IRQ_SetCallBack", + "parent": "interrupt.o", + "path": "", + "romSize": 70, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 70, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300290c", + "id": "IRQ_SetCallBack", + "dec": 0, + "sumSize": 70 + }, + "crg.o": { + "objName": "crg.o", + "parent": "", + "path": "obj\\drivers\\crg\\src", + "romSize": 6710, + "moduleName": "crg.o", + "componentName": "", + ".text": 6710, + ".data": 216, + ".bss": 5, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 13117, + ".debug_info": 16804, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "crg.o", + "id": "crg.o", + "dec": 0, + "sumSize": 6926 + }, + "0x0000000003002952": { + "objName": "DCL_SYSCTRL_CrgWriteProtectionDisable", + "parent": "crg.o", + "path": "", + "romSize": 40, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 40, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002952", + "id": "DCL_SYSCTRL_CrgWriteProtectionDisable", + "dec": 0, + "sumSize": 40 + }, + "0x000000000300297a": { + "objName": "DCL_SYSCTRL_CrgWriteProtectionEnable", + "parent": "crg.o", + "path": "", + "romSize": 42, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 42, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300297a", + "id": "DCL_SYSCTRL_CrgWriteProtectionEnable", + "dec": 0, + "sumSize": 42 + }, + "0x00000000030029a4": { + "objName": "IsCrgPllRefClkSelect", + "parent": "crg.o", + "path": "", + "romSize": 44, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 44, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030029a4", + "id": "IsCrgPllRefClkSelect", + "dec": 0, + "sumSize": 44 + }, + "0x00000000030029d0": { + "objName": "IsCrgPllPreDiv", + "parent": "crg.o", + "path": "", + "romSize": 28, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030029d0", + "id": "IsCrgPllPreDiv", + "dec": 0, + "sumSize": 28 + }, + "0x00000000030029ec": { + "objName": "IsCrgPllPostDiv", + "parent": "crg.o", + "path": "", + "romSize": 28, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030029ec", + "id": "IsCrgPllPostDiv", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003002a08": { + "objName": "IsCrgPllPostDiv2", + "parent": "crg.o", + "path": "", + "romSize": 28, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002a08", + "id": "IsCrgPllPostDiv2", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003002a24": { + "objName": "IsCrgPllFbDiv", + "parent": "crg.o", + "path": "", + "romSize": 28, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002a24", + "id": "IsCrgPllFbDiv", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003002a40": { + "objName": "IsCrgCoreCkSel", + "parent": "crg.o", + "path": "", + "romSize": 54, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 54, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002a40", + "id": "IsCrgCoreCkSel", + "dec": 0, + "sumSize": 54 + }, + "0x0000000003002a76": { + "objName": "IsCrg1MCkSel", + "parent": "crg.o", + "path": "", + "romSize": 44, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 44, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002a76", + "id": "IsCrg1MCkSel", + "dec": 0, + "sumSize": 44 + }, + "0x0000000003002aa2": { + "objName": "IsCrg1MCkDiv", + "parent": "crg.o", + "path": "", + "romSize": 28, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002aa2", + "id": "IsCrg1MCkDiv", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003002abe": { + "objName": "IsCrgValidPreDiv", + "parent": "crg.o", + "path": "", + "romSize": 94, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 94, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002abe", + "id": "IsCrgValidPreDiv", + "dec": 0, + "sumSize": 94 + }, + "0x0000000003002b1c": { + "objName": "IsCrgValidFdDiv", + "parent": "crg.o", + "path": "", + "romSize": 138, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 138, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002b1c", + "id": "IsCrgValidFdDiv", + "dec": 0, + "sumSize": 138 + }, + "0x0000000003002ba6": { + "objName": "IsCrgValidPostDiv", + "parent": "crg.o", + "path": "", + "romSize": 72, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 72, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002ba6", + "id": "IsCrgValidPostDiv", + "dec": 0, + "sumSize": 72 + }, + "0x0000000003002bee": { + "objName": "IsCrgValidPostDiv2", + "parent": "crg.o", + "path": "", + "romSize": 72, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 72, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002bee", + "id": "IsCrgValidPostDiv2", + "dec": 0, + "sumSize": 72 + }, + "0x0000000003002c36": { + "objName": "IsCrgAdcClkModeSelect", + "parent": "crg.o", + "path": "", + "romSize": 64, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 64, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002c36", + "id": "IsCrgAdcClkModeSelect", + "dec": 0, + "sumSize": 64 + }, + "0x0000000003002c76": { + "objName": "IsCrgAdcClkDiv", + "parent": "crg.o", + "path": "", + "romSize": 64, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 64, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002c76", + "id": "IsCrgAdcClkDiv", + "dec": 0, + "sumSize": 64 + }, + "0x0000000003002cb6": { + "objName": "DCL_CRG_SetCoreClkSel", + "parent": "crg.o", + "path": "", + "romSize": 112, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 112, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002cb6", + "id": "DCL_CRG_SetCoreClkSel", + "dec": 0, + "sumSize": 112 + }, + "0x0000000003002d2a": { + "objName": "HAL_CRG_Init", + "parent": "crg.o", + "path": "", + "romSize": 712, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 712, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002d2a", + "id": "HAL_CRG_Init", + "dec": 0, + "sumSize": 712 + }, + "0x0000000003002ff2": { + "objName": "HAL_CRG_SetCoreClockSelect", + "parent": "crg.o", + "path": "", + "romSize": 142, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 142, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003002ff2", + "id": "HAL_CRG_SetCoreClockSelect", + "dec": 0, + "sumSize": 142 + }, + "0x0000000003003080": { + "objName": "CRG_GetVcoFreq", + "parent": "crg.o", + "path": "", + "romSize": 148, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 148, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003080", + "id": "CRG_GetVcoFreq", + "dec": 0, + "sumSize": 148 + }, + "0x0000000003003114": { + "objName": "HAL_CRG_GetPllFreq", + "parent": "crg.o", + "path": "", + "romSize": 108, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 108, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003114", + "id": "HAL_CRG_GetPllFreq", + "dec": 0, + "sumSize": 108 + }, + "0x0000000003003180": { + "objName": "HAL_CRG_GetCoreClkFreq", + "parent": "crg.o", + "path": "", + "romSize": 150, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 150, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003180", + "id": "HAL_CRG_GetCoreClkFreq", + "dec": 0, + "sumSize": 150 + }, + "0x0000000003003216": { + "objName": "HAL_CRG_GetIpFreq", + "parent": "crg.o", + "path": "", + "romSize": 228, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 228, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003216", + "id": "HAL_CRG_GetIpFreq", + "dec": 0, + "sumSize": 228 + }, + "0x00000000030032fa": { + "objName": "HAL_CRG_IpEnableSet", + "parent": "crg.o", + "path": "", + "romSize": 216, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 216, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030032fa", + "id": "HAL_CRG_IpEnableSet", + "dec": 0, + "sumSize": 216 + }, + "0x00000000030033d2": { + "objName": "HAL_CRG_IpClkSelectSet", + "parent": "crg.o", + "path": "", + "romSize": 182, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 182, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030033d2", + "id": "HAL_CRG_IpClkSelectSet", + "dec": 0, + "sumSize": 182 + }, + "0x0000000003003488": { + "objName": "HAL_CRG_IpClkDivSet", + "parent": "crg.o", + "path": "", + "romSize": 182, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 182, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003488", + "id": "HAL_CRG_IpClkDivSet", + "dec": 0, + "sumSize": 182 + }, + "0x0000000003003542": { + "objName": "CRG_GetAdcIpFreq", + "parent": "crg.o", + "path": "", + "romSize": 294, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 294, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003542", + "id": "CRG_GetAdcIpFreq", + "dec": 0, + "sumSize": 294 + }, + "0x0000000003003668": { + "objName": "CRG_IsValidPllConfig", + "parent": "crg.o", + "path": "", + "romSize": 194, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 194, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003668", + "id": "CRG_IsValidPllConfig", + "dec": 0, + "sumSize": 194 + }, + "0x000000000300372a": { + "objName": "CRG_IsValid1MHzConfig", + "parent": "crg.o", + "path": "", + "romSize": 82, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 82, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300372a", + "id": "CRG_IsValid1MHzConfig", + "dec": 0, + "sumSize": 82 + }, + "0x000000000300377c": { + "objName": "CRG_GetPllRefIni", + "parent": "crg.o", + "path": "", + "romSize": 42, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 42, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300377c", + "id": "CRG_GetPllRefIni", + "dec": 0, + "sumSize": 42 + }, + "0x00000000030037a6": { + "objName": "CRG_GetPreDivValue", + "parent": "crg.o", + "path": "", + "romSize": 46, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 46, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030037a6", + "id": "CRG_GetPreDivValue", + "dec": 0, + "sumSize": 46 + }, + "0x00000000030037d4": { + "objName": "CRG_GetPllFbDivValue", + "parent": "crg.o", + "path": "", + "romSize": 66, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 66, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030037d4", + "id": "CRG_GetPllFbDivValue", + "dec": 0, + "sumSize": 66 + }, + "0x0000000003003816": { + "objName": "CRG_GetPllPostDivValue", + "parent": "crg.o", + "path": "", + "romSize": 58, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 58, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003816", + "id": "CRG_GetPllPostDivValue", + "dec": 0, + "sumSize": 58 + }, + "0x0000000003003850": { + "objName": "CRG_IpWoClkSelEnableSet", + "parent": "crg.o", + "path": "", + "romSize": 398, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 398, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003850", + "id": "CRG_IpWoClkSelEnableSet", + "dec": 0, + "sumSize": 398 + }, + "0x00000000030039de": { + "objName": "CRG_IpWoClkSelEnableGet", + "parent": "crg.o", + "path": "", + "romSize": 136, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 136, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030039de", + "id": "CRG_IpWoClkSelEnableGet", + "dec": 0, + "sumSize": 136 + }, + "0x0000000003003a6a": { + "objName": "CRG_IpWoClkSelResetSet", + "parent": "crg.o", + "path": "", + "romSize": 266, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 266, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003a6a", + "id": "CRG_IpWoClkSelResetSet", + "dec": 0, + "sumSize": 266 + }, + "0x0000000003003b74": { + "objName": "CRG_IpWoClkSelResetGet", + "parent": "crg.o", + "path": "", + "romSize": 138, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 138, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003b74", + "id": "CRG_IpWoClkSelResetGet", + "dec": 0, + "sumSize": 138 + }, + "0x0000000003003bfe": { + "objName": "CRG_AdcEnableSet", + "parent": "crg.o", + "path": "", + "romSize": 182, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 182, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003bfe", + "id": "CRG_AdcEnableSet", + "dec": 0, + "sumSize": 182 + }, + "0x0000000003003cb4": { + "objName": "CRG_AdcEnableGet", + "parent": "crg.o", + "path": "", + "romSize": 126, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 126, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003cb4", + "id": "CRG_AdcEnableGet", + "dec": 0, + "sumSize": 126 + }, + "0x0000000003003d32": { + "objName": "CRG_AdcClkSelectSet", + "parent": "crg.o", + "path": "", + "romSize": 254, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 254, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003d32", + "id": "CRG_AdcClkSelectSet", + "dec": 0, + "sumSize": 254 + }, + "0x0000000003003e30": { + "objName": "CRG_AdcClkSelectGet", + "parent": "crg.o", + "path": "", + "romSize": 142, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 142, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003e30", + "id": "CRG_AdcClkSelectGet", + "dec": 0, + "sumSize": 142 + }, + "0x0000000003003ebe": { + "objName": "CRG_AdcDivSet", + "parent": "crg.o", + "path": "", + "romSize": 216, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 216, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003ebe", + "id": "CRG_AdcDivSet", + "dec": 0, + "sumSize": 216 + }, + "0x0000000003003f96": { + "objName": "CRG_AdcDivGet", + "parent": "crg.o", + "path": "", + "romSize": 150, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 150, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003003f96", + "id": "CRG_AdcDivGet", + "dec": 0, + "sumSize": 150 + }, + "0x000000000300402c": { + "objName": "CRG_EfcEnableSet", + "parent": "crg.o", + "path": "", + "romSize": 128, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 128, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300402c", + "id": "CRG_EfcEnableSet", + "dec": 0, + "sumSize": 128 + }, + "0x00000000030040ac": { + "objName": "CRG_EfcEnableGet", + "parent": "crg.o", + "path": "", + "romSize": 110, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 110, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030040ac", + "id": "CRG_EfcEnableGet", + "dec": 0, + "sumSize": 110 + }, + "0x000000000300411a": { + "objName": "CRG_AnaEnableSet", + "parent": "crg.o", + "path": "", + "romSize": 392, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 392, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300411a", + "id": "CRG_AnaEnableSet", + "dec": 0, + "sumSize": 392 + }, + "0x00000000030042a2": { + "objName": "CRG_AnaEnableGet", + "parent": "crg.o", + "path": "", + "romSize": 130, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 130, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030042a2", + "id": "CRG_AnaEnableGet", + "dec": 0, + "sumSize": 130 + }, + "debug.o": { + "objName": "debug.o", + "parent": "", + "path": "obj\\drivers\\debug\\src", + "romSize": 2256, + "moduleName": "debug.o", + "componentName": "", + ".text": 2256, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 6456, + ".debug_info": 10268, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "debug.o", + "id": "debug.o", + "dec": 0, + "sumSize": 2256 + }, + "0x0000000003004324": { + "objName": "DBG_PrintCh", + "parent": "debug.o", + "path": "", + "romSize": 66, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 66, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004324", + "id": "DBG_PrintCh", + "dec": 0, + "sumSize": 66 + }, + "0x0000000003004366": { + "objName": "DBG_PrintStr", + "parent": "debug.o", + "path": "", + "romSize": 74, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 74, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004366", + "id": "DBG_PrintStr", + "dec": 0, + "sumSize": 74 + }, + "0x00000000030043b0": { + "objName": "DBG_Pow", + "parent": "debug.o", + "path": "", + "romSize": 64, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 64, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030043b0", + "id": "DBG_Pow", + "dec": 0, + "sumSize": 64 + }, + "0x00000000030043f0": { + "objName": "DBG_CountDigits", + "parent": "debug.o", + "path": "", + "romSize": 104, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 104, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030043f0", + "id": "DBG_CountDigits", + "dec": 0, + "sumSize": 104 + }, + "0x0000000003004458": { + "objName": "DBG_PutUnsignedNum", + "parent": "debug.o", + "path": "", + "romSize": 178, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 178, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004458", + "id": "DBG_PutUnsignedNum", + "dec": 0, + "sumSize": 178 + }, + "0x000000000300450a": { + "objName": "DBG_PrintInt", + "parent": "debug.o", + "path": "", + "romSize": 94, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 94, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300450a", + "id": "DBG_PrintInt", + "dec": 0, + "sumSize": 94 + }, + "0x0000000003004568": { + "objName": "DBG_PrintHex", + "parent": "debug.o", + "path": "", + "romSize": 68, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 68, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004568", + "id": "DBG_PrintHex", + "dec": 0, + "sumSize": 68 + }, + "0x00000000030045ac": { + "objName": "DBG_PrintFlt", + "parent": "debug.o", + "path": "", + "romSize": 316, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 316, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030045ac", + "id": "DBG_PrintFlt", + "dec": 0, + "sumSize": 316 + }, + "0x00000000030046e8": { + "objName": "ParseSpecifier", + "parent": "debug.o", + "path": "", + "romSize": 412, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 412, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030046e8", + "id": "ParseSpecifier", + "dec": 0, + "sumSize": 412 + }, + "0x0000000003004884": { + "objName": "DBG_PrintIntWithField", + "parent": "debug.o", + "path": "", + "romSize": 282, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 282, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004884", + "id": "DBG_PrintIntWithField", + "dec": 0, + "sumSize": 282 + }, + "0x000000000300499e": { + "objName": "DBG_Atoi", + "parent": "debug.o", + "path": "", + "romSize": 106, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 106, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300499e", + "id": "DBG_Atoi", + "dec": 0, + "sumSize": 106 + }, + "0x0000000003004a08": { + "objName": "DBG_UartPrintf", + "parent": "debug.o", + "path": "", + "romSize": 360, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 360, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004a08", + "id": "DBG_UartPrintf", + "dec": 0, + "sumSize": 360 + }, + "iocmg.o": { + "objName": "iocmg.o", + "parent": "", + "path": "obj\\drivers\\iocmg\\src", + "romSize": 1043, + "moduleName": "iocmg.o", + "componentName": "", + ".text": 1043, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 7911, + ".debug_info": 4863, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "iocmg.o", + "id": "iocmg.o", + "dec": 0, + "sumSize": 1043 + }, + "0x0000000003004b70": { + "objName": "DCL_IOCMG_SetRegValue", + "parent": "iocmg.o", + "path": "", + "romSize": 68, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 68, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004b70", + "id": "DCL_IOCMG_SetRegValue", + "dec": 0, + "sumSize": 68 + }, + "0x0000000003004bb4": { + "objName": "DCL_IOCMG_SetDriveRate", + "parent": "iocmg.o", + "path": "", + "romSize": 110, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 110, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004bb4", + "id": "DCL_IOCMG_SetDriveRate", + "dec": 0, + "sumSize": 110 + }, + "0x0000000003004c22": { + "objName": "DCL_IOCMG_SetPullMode", + "parent": "iocmg.o", + "path": "", + "romSize": 140, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 140, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004c22", + "id": "DCL_IOCMG_SetPullMode", + "dec": 0, + "sumSize": 140 + }, + "0x0000000003004cae": { + "objName": "DCL_IOCMG_SetLevelShiftRate", + "parent": "iocmg.o", + "path": "", + "romSize": 110, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 110, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004cae", + "id": "DCL_IOCMG_SetLevelShiftRate", + "dec": 0, + "sumSize": 110 + }, + "0x0000000003004d1c": { + "objName": "DCL_IOCMG_SetSchmidtMode", + "parent": "iocmg.o", + "path": "", + "romSize": 110, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 110, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004d1c", + "id": "DCL_IOCMG_SetSchmidtMode", + "dec": 0, + "sumSize": 110 + }, + "0x0000000003004d8a": { + "objName": "IOCMG_GetRegAddr", + "parent": "iocmg.o", + "path": "", + "romSize": 82, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 82, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004d8a", + "id": "IOCMG_GetRegAddr", + "dec": 0, + "sumSize": 82 + }, + "0x0000000003004ddc": { + "objName": "HAL_IOCMG_SetPinAltFuncMode", + "parent": "iocmg.o", + "path": "", + "romSize": 58, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 58, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004ddc", + "id": "HAL_IOCMG_SetPinAltFuncMode", + "dec": 0, + "sumSize": 58 + }, + "0x0000000003004e16": { + "objName": "HAL_IOCMG_SetPinPullMode", + "parent": "iocmg.o", + "path": "", + "romSize": 76, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 76, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004e16", + "id": "HAL_IOCMG_SetPinPullMode", + "dec": 0, + "sumSize": 76 + }, + "0x0000000003004e62": { + "objName": "HAL_IOCMG_SetPinSchmidtMode", + "parent": "iocmg.o", + "path": "", + "romSize": 76, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 76, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004e62", + "id": "HAL_IOCMG_SetPinSchmidtMode", + "dec": 0, + "sumSize": 76 + }, + "0x0000000003004eae": { + "objName": "HAL_IOCMG_SetPinLevelShiftRate", + "parent": "iocmg.o", + "path": "", + "romSize": 76, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 76, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004eae", + "id": "HAL_IOCMG_SetPinLevelShiftRate", + "dec": 0, + "sumSize": 76 + }, + "0x0000000003004efa": { + "objName": "HAL_IOCMG_SetPinDriveRate", + "parent": "iocmg.o", + "path": "", + "romSize": 76, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 76, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004efa", + "id": "HAL_IOCMG_SetPinDriveRate", + "dec": 0, + "sumSize": 76 + }, + "timer.o": { + "objName": "timer.o", + "parent": "", + "path": "obj\\drivers\\timer\\src", + "romSize": 1389, + "moduleName": "timer.o", + "componentName": "", + ".text": 1389, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3726, + ".debug_info": 3453, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "timer.o", + "id": "timer.o", + "dec": 0, + "sumSize": 1389 + }, + "0x0000000003004f46": { + "objName": "IsTimerMode", + "parent": "timer.o", + "path": "", + "romSize": 54, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 54, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004f46", + "id": "IsTimerMode", + "dec": 0, + "sumSize": 54 + }, + "0x0000000003004f7c": { + "objName": "IsTimerInterruptType", + "parent": "timer.o", + "path": "", + "romSize": 44, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 44, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004f7c", + "id": "IsTimerInterruptType", + "dec": 0, + "sumSize": 44 + }, + "0x0000000003004fa8": { + "objName": "IsTimerSize", + "parent": "timer.o", + "path": "", + "romSize": 44, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 44, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004fa8", + "id": "IsTimerSize", + "dec": 0, + "sumSize": 44 + }, + "0x0000000003004fd4": { + "objName": "IsTimerPeriod", + "parent": "timer.o", + "path": "", + "romSize": 28, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004fd4", + "id": "IsTimerPeriod", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003004ff0": { + "objName": "IsTimerDiv", + "parent": "timer.o", + "path": "", + "romSize": 54, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 54, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003004ff0", + "id": "IsTimerDiv", + "dec": 0, + "sumSize": 54 + }, + "0x0000000003005026": { + "objName": "HAL_TIMER_Init", + "parent": "timer.o", + "path": "", + "romSize": 594, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 594, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003005026", + "id": "HAL_TIMER_Init", + "dec": 0, + "sumSize": 594 + }, + "0x000000000300527c": { + "objName": "HAL_TIMER_Start", + "parent": "timer.o", + "path": "", + "romSize": 130, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 130, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300527c", + "id": "HAL_TIMER_Start", + "dec": 0, + "sumSize": 130 + }, + "0x00000000030052fe": { + "objName": "HAL_TIMER_IrqHandler", + "parent": "timer.o", + "path": "", + "romSize": 232, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 232, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030052fe", + "id": "HAL_TIMER_IrqHandler", + "dec": 0, + "sumSize": 232 + }, + "0x00000000030053e6": { + "objName": "HAL_TIMER_RegisterCallback", + "parent": "timer.o", + "path": "", + "romSize": 148, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 148, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030053e6", + "id": "HAL_TIMER_RegisterCallback", + "dec": 0, + "sumSize": 148 + }, + "uart.o": { + "objName": "uart.o", + "parent": "", + "path": "obj\\drivers\\uart\\src", + "romSize": 1439, + "moduleName": "uart.o", + "componentName": "", + ".text": 1439, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 8760, + ".debug_info": 12953, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "uart.o", + "id": "uart.o", + "dec": 0, + "sumSize": 1439 + }, + "0x000000000300547a": { + "objName": "IsUartDatalength", + "parent": "uart.o", + "path": "", + "romSize": 28, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300547a", + "id": "IsUartDatalength", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003005496": { + "objName": "IsUartStopbits", + "parent": "uart.o", + "path": "", + "romSize": 44, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 44, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003005496", + "id": "IsUartStopbits", + "dec": 0, + "sumSize": 44 + }, + "0x00000000030054c2": { + "objName": "IsUartParitymode", + "parent": "uart.o", + "path": "", + "romSize": 34, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 34, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030054c2", + "id": "IsUartParitymode", + "dec": 0, + "sumSize": 34 + }, + "0x00000000030054e4": { + "objName": "IsUartTransmode", + "parent": "uart.o", + "path": "", + "romSize": 60, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 60, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030054e4", + "id": "IsUartTransmode", + "dec": 0, + "sumSize": 60 + }, + "0x0000000003005520": { + "objName": "IsUartFIFOThreshold", + "parent": "uart.o", + "path": "", + "romSize": 28, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003005520", + "id": "IsUartFIFOThreshold", + "dec": 0, + "sumSize": 28 + }, + "0x000000000300553c": { + "objName": "IsUartOversampleMultiple", + "parent": "uart.o", + "path": "", + "romSize": 28, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300553c", + "id": "IsUartOversampleMultiple", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003005558": { + "objName": "DivClosest", + "parent": "uart.o", + "path": "", + "romSize": 62, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 62, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003005558", + "id": "DivClosest", + "dec": 0, + "sumSize": 62 + }, + "0x0000000003005596": { + "objName": "UART_SetParityBit", + "parent": "uart.o", + "path": "", + "romSize": 150, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 150, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003005596", + "id": "UART_SetParityBit", + "dec": 0, + "sumSize": 150 + }, + "0x000000000300562c": { + "objName": "HAL_UART_Init", + "parent": "uart.o", + "path": "", + "romSize": 958, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 958, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300562c", + "id": "HAL_UART_Init", + "dec": 0, + "sumSize": 958 + }, + "main.o": { + "objName": "main.o", + "parent": "", + "path": "obj\\user", + "romSize": 12, + "moduleName": "main.o", + "componentName": "", + ".text": 12, + ".data": 0, + ".bss": 328, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1228, + ".debug_info": 26845, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "main.o", + "id": "main.o", + "dec": 0, + "sumSize": 12 + }, + "0x00000000030059ea": { + "objName": "main", + "parent": "main.o", + "path": "", + "romSize": 12, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 12, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030059ea", + "id": "main", + "dec": 0, + "sumSize": 12 + }, + "system_init.o": { + "objName": "system_init.o", + "parent": "", + "path": "obj\\user\\generatecode", + "romSize": 968, + "moduleName": "system_init.o", + "componentName": "", + ".text": 968, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2488, + ".debug_info": 38830, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "system_init.o", + "id": "system_init.o", + "dec": 0, + "sumSize": 968 + }, + "0x00000000030059f6": { + "objName": "CRG_Config", + "parent": "system_init.o", + "path": "", + "romSize": 106, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 106, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030059f6", + "id": "CRG_Config", + "dec": 0, + "sumSize": 106 + }, + "0x0000000003005a60": { + "objName": "ADC0_Init", + "parent": "system_init.o", + "path": "", + "romSize": 152, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 152, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003005a60", + "id": "ADC0_Init", + "dec": 0, + "sumSize": 152 + }, + "0x0000000003005af8": { + "objName": "TIMER3_Init", + "parent": "system_init.o", + "path": "", + "romSize": 254, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 254, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003005af8", + "id": "TIMER3_Init", + "dec": 0, + "sumSize": 254 + }, + "0x0000000003005bf6": { + "objName": "UART0_Init", + "parent": "system_init.o", + "path": "", + "romSize": 200, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 200, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003005bf6", + "id": "UART0_Init", + "dec": 0, + "sumSize": 200 + }, + "0x0000000003005cc2": { + "objName": "IOConfig", + "parent": "system_init.o", + "path": "", + "romSize": 192, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 192, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003005cc2", + "id": "IOConfig", + "dec": 0, + "sumSize": 192 + }, + "0x0000000003005d96": { + "objName": "SystemInit", + "parent": "system_init.o", + "path": "", + "romSize": 64, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 64, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003005d96", + "id": "SystemInit", + "dec": 0, + "sumSize": 64 + }, + "tim_adc.o": { + "objName": "tim_adc.o", + "parent": "", + "path": "obj\\user\\generatecode", + "romSize": 256, + "moduleName": "tim_adc.o", + "componentName": "", + ".text": 256, + ".data": 0, + ".bss": 7204, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1349, + ".debug_info": 26840, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "tim_adc.o", + "id": "tim_adc.o", + "dec": 0, + "sumSize": 256 + }, + "0x0000000003005dd6": { + "objName": "TIMER3_InterruptProcess", + "parent": "tim_adc.o", + "path": "", + "romSize": 232, + "moduleName": "tim_adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 232, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003005dd6", + "id": "TIMER3_InterruptProcess", + "dec": 0, + "sumSize": 232 + }, + "extendsfdf2.o": { + "objName": "extendsfdf2.o", + "parent": "libgcc.a", + "path": "", + "romSize": 222, + "moduleName": "extendsfdf2.o", + "componentName": "lib-gcc", + ".text": 222, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 665, + ".comment": 0, + ".debug_line": 1066, + ".debug_info": 1342, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "extendsfdf2.o", + "id": "extendsfdf2.o", + "dec": 0, + "sumSize": 222 + }, + "libgcc.a": { + "objName": "libgcc.a", + "parent": "", + "path": "", + "romSize": 1084, + "moduleName": "extendsfdf2.o", + "componentName": "lib-gcc", + ".text": 768, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 707, + ".comment": 0, + ".debug_line": 6724, + ".debug_info": 4542, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "libgcc.a", + "id": "libgcc.a", + "dec": 0, + "sumSize": 768 + }, + "0x0000000003005ebe": { + "objName": "__extendsfdf2", + "parent": "extendsfdf2.o", + "isSymbol": true, + "lib": "libgcc.a", + "moduleName": "extendsfdf2.o", + "componentName": "lib-gcc", + ".text": 222, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003005ebe", + "id": "__extendsfdf2", + "dec": 0, + "romSize": 0, + "sumSize": 222 + }, + "truncdfsf2.o": { + "objName": "truncdfsf2.o", + "parent": "libgcc.a", + "path": "", + "romSize": 546, + "moduleName": "truncdfsf2.o", + "componentName": "lib-gcc", + ".text": 546, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3091, + ".debug_info": 1029, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "truncdfsf2.o", + "id": "truncdfsf2.o", + "dec": 0, + "sumSize": 546 + }, + "0x0000000003005f9c": { + "objName": "__truncdfsf2", + "parent": "truncdfsf2.o", + "isSymbol": true, + "lib": "libgcc.a", + "moduleName": "truncdfsf2.o", + "componentName": "lib-gcc", + ".text": 546, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003005f9c", + "id": "__truncdfsf2", + "dec": 0, + "romSize": 0, + "sumSize": 546 + }, + "_clzsi2.o": { + "objName": "_clzsi2.o", + "parent": "libgcc.a", + "path": "", + "romSize": 60, + "moduleName": "_clzsi2.o", + "componentName": "lib-gcc", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 42, + ".comment": 0, + ".debug_line": 1446, + ".debug_info": 845, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "_clzsi2.o", + "id": "_clzsi2.o", + "dec": 0, + "sumSize": 0 + }, + "0x00000000030061be": { + "objName": "__clzsi2", + "parent": "_clzsi2.o", + "isSymbol": true, + "lib": "libgcc.a", + "moduleName": "_clzsi2.o", + "componentName": "lib-gcc", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030061be", + "id": "__clzsi2", + "dec": 0, + "romSize": 0, + "sumSize": 0 + }, + "0x00000000030061fc": { + "objName": "0x00000000030061fc", + "parent": "anatrim.o", + "path": "", + "romSize": 4, + "moduleName": "anatrim.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 4, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030061fc", + "id": "0x00000000030061fc", + "dec": 0, + "sumSize": 4 + }, + "0x0000000003006200": { + "objName": "0x0000000003006200", + "parent": "ip_crg_common.o", + "path": "", + "romSize": 552, + "moduleName": "ip_crg_common.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 552, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003006200", + "id": "0x0000000003006200", + "dec": 0, + "sumSize": 552 + }, + "0x0000000003006428": { + "objName": "0x0000000003006428", + "parent": "adc.o", + "path": "", + "romSize": 80, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 80, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003006428", + "id": "0x0000000003006428", + "dec": 0, + "sumSize": 80 + }, + "0x0000000003006478": { + "objName": "0x0000000003006478", + "parent": "interrupt.o", + "path": "", + "romSize": 32, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 32, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003006478", + "id": "0x0000000003006478", + "dec": 0, + "sumSize": 32 + }, + "0x0000000003006498": { + "objName": "0x0000000003006498", + "parent": "interrupt.o", + "path": "", + "romSize": 32, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 32, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003006498", + "id": "0x0000000003006498", + "dec": 0, + "sumSize": 32 + }, + "0x00000000030064b8": { + "objName": "0x00000000030064b8", + "parent": "interrupt.o", + "path": "", + "romSize": 32, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 32, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030064b8", + "id": "0x00000000030064b8", + "dec": 0, + "sumSize": 32 + }, + "0x00000000030064d8": { + "objName": "0x00000000030064d8", + "parent": "crg.o", + "path": "", + "romSize": 88, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 88, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030064d8", + "id": "0x00000000030064d8", + "dec": 0, + "sumSize": 88 + }, + "0x0000000003006530": { + "objName": "0x0000000003006530", + "parent": "crg.o", + "path": "", + "romSize": 24, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 24, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003006530", + "id": "0x0000000003006530", + "dec": 0, + "sumSize": 24 + }, + "0x0000000003006548": { + "objName": "0x0000000003006548", + "parent": "debug.o", + "path": "", + "romSize": 132, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 132, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003006548", + "id": "0x0000000003006548", + "dec": 0, + "sumSize": 132 + }, + "0x00000000030065cc": { + "objName": "0x00000000030065cc", + "parent": "iocmg.o", + "path": "", + "romSize": 61, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 61, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000030065cc", + "id": "0x00000000030065cc", + "dec": 0, + "sumSize": 61 + }, + "0x000000000300660c": { + "objName": "0x000000000300660c", + "parent": "timer.o", + "path": "", + "romSize": 61, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 61, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300660c", + "id": "0x000000000300660c", + "dec": 0, + "sumSize": 61 + }, + "0x000000000300664c": { + "objName": "0x000000000300664c", + "parent": "uart.o", + "path": "", + "romSize": 20, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 20, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300664c", + "id": "0x000000000300664c", + "dec": 0, + "sumSize": 20 + }, + "0x0000000003006660": { + "objName": "0x0000000003006660", + "parent": "uart.o", + "path": "", + "romSize": 27, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 27, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003006660", + "id": "0x0000000003006660", + "dec": 0, + "sumSize": 27 + }, + "0x000000000300667c": { + "objName": "0x000000000300667c", + "parent": "tim_adc.o", + "path": "", + "romSize": 24, + "moduleName": "tim_adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 24, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300667c", + "id": "0x000000000300667c", + "dec": 0, + "sumSize": 24 + }, + "_clz.o": { + "objName": "_clz.o", + "parent": "libgcc.a", + "path": "", + "romSize": 256, + "moduleName": "_clz.o", + "componentName": "lib-gcc", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1121, + ".debug_info": 1326, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "_clz.o", + "id": "_clz.o", + "dec": 0, + "sumSize": 0 + }, + "0x0000000003006694": { + "objName": "__clz_tab", + "parent": "_clz.o", + "isSymbol": true, + "lib": "libgcc.a", + "moduleName": "_clz.o", + "componentName": "lib-gcc", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003006694", + "id": "__clz_tab", + "dec": 0, + "romSize": 0, + "sumSize": 0 + }, + "0x0000000003006794": { + "objName": "_GLOBAL_OFFSET_TABLE_", + "parent": "startup.o", + "isSymbol": true, + "lib": "", + "moduleName": "startup.o", + "componentName": "", + ".text": 8, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000003006794", + "id": "_GLOBAL_OFFSET_TABLE_", + "dec": 0, + "romSize": 0, + "sumSize": 8 + }, + "0x000000000300679c": { + "objName": "0x000000000300679c", + "parent": "startup.o", + "path": "", + "romSize": 8, + "moduleName": "startup.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 8, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000300679c", + "id": "0x000000000300679c", + "dec": 0, + "sumSize": 8 + }, + "load address 0x00000000030067a4": { + "objName": "load address 0x00000000030067a4", + "parent": "", + "path": "", + "romSize": 0, + "moduleName": "load address 0x00000000030067a4", + "componentName": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "load address 0x00000000030067a4", + "id": "load address 0x00000000030067a4", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000020": { + "objName": "g_tsensorGain", + "parent": "anatrim.o", + "path": "", + "romSize": 0, + "moduleName": "anatrim.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 4, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000004000020", + "id": "g_tsensorGain", + "dec": 0, + "sumSize": 4 + }, + "0x0000000004000024": { + "objName": "g_ipClkProc", + "parent": "crg.o", + "path": "", + "romSize": 0, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 216, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000004000024", + "id": "g_ipClkProc", + "dec": 0, + "sumSize": 216 + }, + "0x00000000040000fc": { + "objName": "g_irqCallbackFunc", + "parent": "interrupt.o", + "path": "", + "romSize": 0, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 920, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000040000fc", + "id": "g_irqCallbackFunc", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000494": { + "objName": "g_crgBaseAddr", + "parent": "crg.o", + "path": "", + "romSize": 0, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 4, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000004000494", + "id": "g_crgBaseAddr", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000498": { + "objName": "g_anaEnableFlag", + "parent": "crg.o", + "path": "", + "romSize": 0, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 1, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000004000498", + "id": "g_anaEnableFlag", + "dec": 0, + "sumSize": 0 + }, + "0x000000000400049c": { + "objName": "g_timer3", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 40, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000400049c", + "id": "g_timer3", + "dec": 0, + "sumSize": 0 + }, + "0x00000000040004c4": { + "objName": "g_uart0", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 128, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000040004c4", + "id": "g_uart0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000544": { + "objName": "g_adc0", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 160, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000004000544", + "id": "g_adc0", + "dec": 0, + "sumSize": 0 + }, + "0x00000000040005e4": { + "objName": "adc_num", + "parent": "tim_adc.o", + "path": "", + "romSize": 0, + "moduleName": "tim_adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 7200, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000040005e4", + "id": "adc_num", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004002204": { + "objName": "i", + "parent": "tim_adc.o", + "path": "", + "romSize": 0, + "moduleName": "tim_adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 4, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000004002204", + "id": "i", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000000": { + "objName": "0x0000000000000000", + "parent": "extendsfdf2.o", + "path": "", + "romSize": 0, + "moduleName": "extendsfdf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 665, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000000", + "id": "0x0000000000000000", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000031": { + "objName": "0x0000000000000031", + "parent": "chipinit.o", + "path": "", + "romSize": 0, + "moduleName": "chipinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 50, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000031", + "id": "0x0000000000000031", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000063": { + "objName": "0x0000000000000063", + "parent": "anatrim.o", + "path": "", + "romSize": 0, + "moduleName": "anatrim.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000063", + "id": "0x0000000000000063", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000095": { + "objName": "0x0000000000000095", + "parent": "anavrefinit.o", + "path": "", + "romSize": 0, + "moduleName": "anavrefinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000095", + "id": "0x0000000000000095", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000000c7": { + "objName": "0x00000000000000c7", + "parent": "crginit.o", + "path": "", + "romSize": 0, + "moduleName": "crginit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000000c7", + "id": "0x00000000000000c7", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000000f9": { + "objName": "0x00000000000000f9", + "parent": "flashinit.o", + "path": "", + "romSize": 0, + "moduleName": "flashinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000000f9", + "id": "0x00000000000000f9", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000012b": { + "objName": "0x000000000000012b", + "parent": "systickinit.o", + "path": "", + "romSize": 0, + "moduleName": "systickinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000012b", + "id": "0x000000000000012b", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000015d": { + "objName": "0x000000000000015d", + "parent": "fotp_info_read.o", + "path": "", + "romSize": 0, + "moduleName": "fotp_info_read.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000015d", + "id": "0x000000000000015d", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000018f": { + "objName": "0x000000000000018f", + "parent": "ip_crg_common.o", + "path": "", + "romSize": 0, + "moduleName": "ip_crg_common.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000018f", + "id": "0x000000000000018f", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000001c1": { + "objName": "0x00000000000001c1", + "parent": "adc.o", + "path": "", + "romSize": 0, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000001c1", + "id": "0x00000000000001c1", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000001f3": { + "objName": "0x00000000000001f3", + "parent": "assert.o", + "path": "", + "romSize": 0, + "moduleName": "assert.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000001f3", + "id": "0x00000000000001f3", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000225": { + "objName": "0x0000000000000225", + "parent": "clock.o", + "path": "", + "romSize": 0, + "moduleName": "clock.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000225", + "id": "0x0000000000000225", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000257": { + "objName": "0x0000000000000257", + "parent": "interrupt.o", + "path": "", + "romSize": 0, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 54, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000257", + "id": "0x0000000000000257", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000028d": { + "objName": "0x000000000000028d", + "parent": "crg.o", + "path": "", + "romSize": 0, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000028d", + "id": "0x000000000000028d", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000002bf": { + "objName": "0x00000000000002bf", + "parent": "debug.o", + "path": "", + "romSize": 0, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000002bf", + "id": "0x00000000000002bf", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000002f1": { + "objName": "0x00000000000002f1", + "parent": "iocmg.o", + "path": "", + "romSize": 0, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000002f1", + "id": "0x00000000000002f1", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000323": { + "objName": "0x0000000000000323", + "parent": "timer.o", + "path": "", + "romSize": 0, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000323", + "id": "0x0000000000000323", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000355": { + "objName": "0x0000000000000355", + "parent": "uart.o", + "path": "", + "romSize": 0, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000355", + "id": "0x0000000000000355", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000387": { + "objName": "0x0000000000000387", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000387", + "id": "0x0000000000000387", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000003b9": { + "objName": "0x00000000000003b9", + "parent": "system_init.o", + "path": "", + "romSize": 0, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000003b9", + "id": "0x00000000000003b9", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000003eb": { + "objName": "0x00000000000003eb", + "parent": "tim_adc.o", + "path": "", + "romSize": 0, + "moduleName": "tim_adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000003eb", + "id": "0x00000000000003eb", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000041d": { + "objName": "0x000000000000041d", + "parent": "extendsfdf2.o", + "path": "", + "romSize": 0, + "moduleName": "extendsfdf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 54, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000041d", + "id": "0x000000000000041d", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000453": { + "objName": "0x0000000000000453", + "parent": "truncdfsf2.o", + "path": "", + "romSize": 0, + "moduleName": "truncdfsf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 54, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000453", + "id": "0x0000000000000453", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000489": { + "objName": "0x0000000000000489", + "parent": "_clz.o", + "path": "", + "romSize": 0, + "moduleName": "_clz.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000489", + "id": "0x0000000000000489", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000004bb": { + "objName": "0x00000000000004bb", + "parent": "_clzsi2.o", + "path": "", + "romSize": 0, + "moduleName": "_clzsi2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000004bb", + "id": "0x00000000000004bb", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000029": { + "objName": "0x0000000000000029", + "parent": "_clzsi2.o", + "path": "", + "romSize": 0, + "moduleName": "_clzsi2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 42, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000029", + "id": "0x0000000000000029", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000008cc": { + "objName": "0x00000000000008cc", + "parent": "chipinit.o", + "path": "", + "romSize": 0, + "moduleName": "chipinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 347, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000008cc", + "id": "0x00000000000008cc", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000a27": { + "objName": "0x0000000000000a27", + "parent": "anatrim.o", + "path": "", + "romSize": 0, + "moduleName": "anatrim.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 727, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000a27", + "id": "0x0000000000000a27", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000cfe": { + "objName": "0x0000000000000cfe", + "parent": "anavrefinit.o", + "path": "", + "romSize": 0, + "moduleName": "anavrefinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 197, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000cfe", + "id": "0x0000000000000cfe", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000dc3": { + "objName": "0x0000000000000dc3", + "parent": "crginit.o", + "path": "", + "romSize": 0, + "moduleName": "crginit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 358, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000dc3", + "id": "0x0000000000000dc3", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000f29": { + "objName": "0x0000000000000f29", + "parent": "flashinit.o", + "path": "", + "romSize": 0, + "moduleName": "flashinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 402, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000f29", + "id": "0x0000000000000f29", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000010bb": { + "objName": "0x00000000000010bb", + "parent": "systickinit.o", + "path": "", + "romSize": 0, + "moduleName": "systickinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 170, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000010bb", + "id": "0x00000000000010bb", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001165": { + "objName": "0x0000000000001165", + "parent": "fotp_info_read.o", + "path": "", + "romSize": 0, + "moduleName": "fotp_info_read.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 521, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000001165", + "id": "0x0000000000001165", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000136e": { + "objName": "0x000000000000136e", + "parent": "ip_crg_common.o", + "path": "", + "romSize": 0, + "moduleName": "ip_crg_common.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 157, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000136e", + "id": "0x000000000000136e", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000140b": { + "objName": "0x000000000000140b", + "parent": "adc.o", + "path": "", + "romSize": 0, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 5550, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000140b", + "id": "0x000000000000140b", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000029b9": { + "objName": "0x00000000000029b9", + "parent": "assert.o", + "path": "", + "romSize": 0, + "moduleName": "assert.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 83, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000029b9", + "id": "0x00000000000029b9", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002a0c": { + "objName": "0x0000000000002a0c", + "parent": "clock.o", + "path": "", + "romSize": 0, + "moduleName": "clock.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 447, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000002a0c", + "id": "0x0000000000002a0c", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002bcb": { + "objName": "0x0000000000002bcb", + "parent": "interrupt.o", + "path": "", + "romSize": 0, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1791, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000002bcb", + "id": "0x0000000000002bcb", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000032ca": { + "objName": "0x00000000000032ca", + "parent": "crg.o", + "path": "", + "romSize": 0, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 6532, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000032ca", + "id": "0x00000000000032ca", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000004c4e": { + "objName": "0x0000000000004c4e", + "parent": "debug.o", + "path": "", + "romSize": 0, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1748, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000004c4e", + "id": "0x0000000000004c4e", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000005322": { + "objName": "0x0000000000005322", + "parent": "iocmg.o", + "path": "", + "romSize": 0, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1973, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000005322", + "id": "0x0000000000005322", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000005ad7": { + "objName": "0x0000000000005ad7", + "parent": "timer.o", + "path": "", + "romSize": 0, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2308, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000005ad7", + "id": "0x0000000000005ad7", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000063db": { + "objName": "0x00000000000063db", + "parent": "uart.o", + "path": "", + "romSize": 0, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 6128, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000063db", + "id": "0x00000000000063db", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000007bcb": { + "objName": "0x0000000000007bcb", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 463, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000007bcb", + "id": "0x0000000000007bcb", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000007d9a": { + "objName": "0x0000000000007d9a", + "parent": "system_init.o", + "path": "", + "romSize": 0, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1226, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000007d9a", + "id": "0x0000000000007d9a", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000008264": { + "objName": "0x0000000000008264", + "parent": "tim_adc.o", + "path": "", + "romSize": 0, + "moduleName": "tim_adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 516, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000008264", + "id": "0x0000000000008264", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000008468": { + "objName": "0x0000000000008468", + "parent": "extendsfdf2.o", + "path": "", + "romSize": 0, + "moduleName": "extendsfdf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 558, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000008468", + "id": "0x0000000000008468", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000008696": { + "objName": "0x0000000000008696", + "parent": "truncdfsf2.o", + "path": "", + "romSize": 0, + "moduleName": "truncdfsf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1034, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000008696", + "id": "0x0000000000008696", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000008aa0": { + "objName": "0x0000000000008aa0", + "parent": "_clz.o", + "path": "", + "romSize": 0, + "moduleName": "_clz.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 837, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000008aa0", + "id": "0x0000000000008aa0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000008de5": { + "objName": "0x0000000000008de5", + "parent": "_clzsi2.o", + "path": "", + "romSize": 0, + "moduleName": "_clzsi2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 909, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000008de5", + "id": "0x0000000000008de5", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000026": { + "objName": "0x0000000000000026", + "parent": "chipinit.o", + "path": "", + "romSize": 0, + "moduleName": "chipinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 16332, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000026", + "id": "0x0000000000000026", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000003ff2": { + "objName": "0x0000000000003ff2", + "parent": "anatrim.o", + "path": "", + "romSize": 0, + "moduleName": "anatrim.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 19863, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000003ff2", + "id": "0x0000000000003ff2", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000008d89": { + "objName": "0x0000000000008d89", + "parent": "anavrefinit.o", + "path": "", + "romSize": 0, + "moduleName": "anavrefinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 687, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000008d89", + "id": "0x0000000000008d89", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000009038": { + "objName": "0x0000000000009038", + "parent": "crginit.o", + "path": "", + "romSize": 0, + "moduleName": "crginit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 9941, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000009038", + "id": "0x0000000000009038", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000b70d": { + "objName": "0x000000000000b70d", + "parent": "flashinit.o", + "path": "", + "romSize": 0, + "moduleName": "flashinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 4382, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000b70d", + "id": "0x000000000000b70d", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000c82b": { + "objName": "0x000000000000c82b", + "parent": "systickinit.o", + "path": "", + "romSize": 0, + "moduleName": "systickinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 414, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000c82b", + "id": "0x000000000000c82b", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000c9c9": { + "objName": "0x000000000000c9c9", + "parent": "fotp_info_read.o", + "path": "", + "romSize": 0, + "moduleName": "fotp_info_read.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 4434, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000c9c9", + "id": "0x000000000000c9c9", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000db1b": { + "objName": "0x000000000000db1b", + "parent": "ip_crg_common.o", + "path": "", + "romSize": 0, + "moduleName": "ip_crg_common.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 304, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000db1b", + "id": "0x000000000000db1b", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000dc4b": { + "objName": "0x000000000000dc4b", + "parent": "adc.o", + "path": "", + "romSize": 0, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 26163, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000dc4b", + "id": "0x000000000000dc4b", + "dec": 0, + "sumSize": 0 + }, + "0x000000000001427e": { + "objName": "0x000000000001427e", + "parent": "assert.o", + "path": "", + "romSize": 0, + "moduleName": "assert.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 129, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000001427e", + "id": "0x000000000001427e", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000142ff": { + "objName": "0x00000000000142ff", + "parent": "clock.o", + "path": "", + "romSize": 0, + "moduleName": "clock.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 721, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000142ff", + "id": "0x00000000000142ff", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000145d0": { + "objName": "0x00000000000145d0", + "parent": "interrupt.o", + "path": "", + "romSize": 0, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 3648, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000145d0", + "id": "0x00000000000145d0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000015410": { + "objName": "0x0000000000015410", + "parent": "crg.o", + "path": "", + "romSize": 0, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 16804, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000015410", + "id": "0x0000000000015410", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000195b4": { + "objName": "0x00000000000195b4", + "parent": "debug.o", + "path": "", + "romSize": 0, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 10268, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000195b4", + "id": "0x00000000000195b4", + "dec": 0, + "sumSize": 0 + }, + "0x000000000001bdd0": { + "objName": "0x000000000001bdd0", + "parent": "iocmg.o", + "path": "", + "romSize": 0, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 4863, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000001bdd0", + "id": "0x000000000001bdd0", + "dec": 0, + "sumSize": 0 + }, + "0x000000000001d0cf": { + "objName": "0x000000000001d0cf", + "parent": "timer.o", + "path": "", + "romSize": 0, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 2060, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000001d0cf", + "id": "0x000000000001d0cf", + "dec": 0, + "sumSize": 0 + }, + "0x000000000001d8db": { + "objName": "0x000000000001d8db", + "parent": "uart.o", + "path": "", + "romSize": 0, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 11812, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000001d8db", + "id": "0x000000000001d8db", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000206ff": { + "objName": "0x00000000000206ff", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 26806, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000206ff", + "id": "0x00000000000206ff", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000026fb5": { + "objName": "0x0000000000026fb5", + "parent": "system_init.o", + "path": "", + "romSize": 0, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 38718, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000026fb5", + "id": "0x0000000000026fb5", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000306f3": { + "objName": "0x00000000000306f3", + "parent": "tim_adc.o", + "path": "", + "romSize": 0, + "moduleName": "tim_adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 26801, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000306f3", + "id": "0x00000000000306f3", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000036fa4": { + "objName": "0x0000000000036fa4", + "parent": "extendsfdf2.o", + "path": "", + "romSize": 0, + "moduleName": "extendsfdf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 651, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000036fa4", + "id": "0x0000000000036fa4", + "dec": 0, + "sumSize": 0 + }, + "0x000000000003722f": { + "objName": "0x000000000003722f", + "parent": "truncdfsf2.o", + "path": "", + "romSize": 0, + "moduleName": "truncdfsf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 715, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000003722f", + "id": "0x000000000003722f", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000374fa": { + "objName": "0x00000000000374fa", + "parent": "_clz.o", + "path": "", + "romSize": 0, + "moduleName": "_clz.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 720, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000374fa", + "id": "0x00000000000374fa", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000377ca": { + "objName": "0x00000000000377ca", + "parent": "_clzsi2.o", + "path": "", + "romSize": 0, + "moduleName": "_clzsi2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 823, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000377ca", + "id": "0x00000000000377ca", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000014": { + "objName": "0x0000000000000014", + "parent": "chipinit.o", + "path": "", + "romSize": 0, + "moduleName": "chipinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 451, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000014", + "id": "0x0000000000000014", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000001d7": { + "objName": "0x00000000000001d7", + "parent": "anatrim.o", + "path": "", + "romSize": 0, + "moduleName": "anatrim.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 585, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000001d7", + "id": "0x00000000000001d7", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000420": { + "objName": "0x0000000000000420", + "parent": "anavrefinit.o", + "path": "", + "romSize": 0, + "moduleName": "anavrefinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 223, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000420", + "id": "0x0000000000000420", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000004ff": { + "objName": "0x00000000000004ff", + "parent": "crginit.o", + "path": "", + "romSize": 0, + "moduleName": "crginit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 370, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000004ff", + "id": "0x00000000000004ff", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000671": { + "objName": "0x0000000000000671", + "parent": "flashinit.o", + "path": "", + "romSize": 0, + "moduleName": "flashinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 361, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000671", + "id": "0x0000000000000671", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000007da": { + "objName": "0x00000000000007da", + "parent": "systickinit.o", + "path": "", + "romSize": 0, + "moduleName": "systickinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 208, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000007da", + "id": "0x00000000000007da", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000008aa": { + "objName": "0x00000000000008aa", + "parent": "fotp_info_read.o", + "path": "", + "romSize": 0, + "moduleName": "fotp_info_read.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 406, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000008aa", + "id": "0x00000000000008aa", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000a40": { + "objName": "0x0000000000000a40", + "parent": "tim_adc.o", + "path": "", + "romSize": 0, + "moduleName": "tim_adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 40, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000a40", + "id": "0x0000000000000a40", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000b19": { + "objName": "0x0000000000000b19", + "parent": "adc.o", + "path": "", + "romSize": 0, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 812, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000b19", + "id": "0x0000000000000b19", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000e45": { + "objName": "0x0000000000000e45", + "parent": "assert.o", + "path": "", + "romSize": 0, + "moduleName": "assert.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 92, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000e45", + "id": "0x0000000000000e45", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000ea1": { + "objName": "0x0000000000000ea1", + "parent": "clock.o", + "path": "", + "romSize": 0, + "moduleName": "clock.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 347, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000ea1", + "id": "0x0000000000000ea1", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000ffc": { + "objName": "0x0000000000000ffc", + "parent": "interrupt.o", + "path": "", + "romSize": 0, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 629, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000ffc", + "id": "0x0000000000000ffc", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001271": { + "objName": "0x0000000000001271", + "parent": "crg.o", + "path": "", + "romSize": 0, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 698, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000001271", + "id": "0x0000000000001271", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000152b": { + "objName": "0x000000000000152b", + "parent": "debug.o", + "path": "", + "romSize": 0, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 797, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000152b", + "id": "0x000000000000152b", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001848": { + "objName": "0x0000000000001848", + "parent": "iocmg.o", + "path": "", + "romSize": 0, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 702, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000001848", + "id": "0x0000000000001848", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001b06": { + "objName": "0x0000000000001b06", + "parent": "timer.o", + "path": "", + "romSize": 0, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 496, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000001b06", + "id": "0x0000000000001b06", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001cf6": { + "objName": "0x0000000000001cf6", + "parent": "uart.o", + "path": "", + "romSize": 0, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 814, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000001cf6", + "id": "0x0000000000001cf6", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002024": { + "objName": "0x0000000000002024", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 575, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000002024", + "id": "0x0000000000002024", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002263": { + "objName": "0x0000000000002263", + "parent": "system_init.o", + "path": "", + "romSize": 0, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 748, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000002263", + "id": "0x0000000000002263", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000254f": { + "objName": "0x000000000000254f", + "parent": "tim_adc.o", + "path": "", + "romSize": 0, + "moduleName": "tim_adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 635, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000254f", + "id": "0x000000000000254f", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000027ca": { + "objName": "0x00000000000027ca", + "parent": "extendsfdf2.o", + "path": "", + "romSize": 0, + "moduleName": "extendsfdf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 334, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000027ca", + "id": "0x00000000000027ca", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002918": { + "objName": "0x0000000000002918", + "parent": "truncdfsf2.o", + "path": "", + "romSize": 0, + "moduleName": "truncdfsf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 345, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000002918", + "id": "0x0000000000002918", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002a71": { + "objName": "0x0000000000002a71", + "parent": "_clz.o", + "path": "", + "romSize": 0, + "moduleName": "_clz.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 210, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000002a71", + "id": "0x0000000000002a71", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002b43": { + "objName": "0x0000000000002b43", + "parent": "_clzsi2.o", + "path": "", + "romSize": 0, + "moduleName": "_clzsi2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 292, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000002b43", + "id": "0x0000000000002b43", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000020": { + "objName": "0x0000000000000020", + "parent": "anatrim.o", + "path": "", + "romSize": 0, + "moduleName": "anatrim.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 48, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000020", + "id": "0x0000000000000020", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000050": { + "objName": "0x0000000000000050", + "parent": "anavrefinit.o", + "path": "", + "romSize": 0, + "moduleName": "anavrefinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 16, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000050", + "id": "0x0000000000000050", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000090": { + "objName": "0x0000000000000090", + "parent": "anavrefinit.o", + "path": "", + "romSize": 0, + "moduleName": "anavrefinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 32, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000090", + "id": "0x0000000000000090", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000000b0": { + "objName": "0x00000000000000b0", + "parent": "fotp_info_read.o", + "path": "", + "romSize": 0, + "moduleName": "fotp_info_read.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 24, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000000b0", + "id": "0x00000000000000b0", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000000d8": { + "objName": "0x00000000000000d8", + "parent": "adc.o", + "path": "", + "romSize": 0, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 440, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000000d8", + "id": "0x00000000000000d8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000108": { + "objName": "0x0000000000000108", + "parent": "systickinit.o", + "path": "", + "romSize": 0, + "moduleName": "systickinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 40, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000108", + "id": "0x0000000000000108", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000130": { + "objName": "0x0000000000000130", + "parent": "anavrefinit.o", + "path": "", + "romSize": 0, + "moduleName": "anavrefinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 52, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000130", + "id": "0x0000000000000130", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000158": { + "objName": "0x0000000000000158", + "parent": "ip_crg_common.o", + "path": "", + "romSize": 0, + "moduleName": "ip_crg_common.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 32, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000158", + "id": "0x0000000000000158", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000178": { + "objName": "0x0000000000000178", + "parent": "adc.o", + "path": "", + "romSize": 0, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 456, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000178", + "id": "0x0000000000000178", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000340": { + "objName": "0x0000000000000340", + "parent": "assert.o", + "path": "", + "romSize": 0, + "moduleName": "assert.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 32, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000340", + "id": "0x0000000000000340", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000360": { + "objName": "0x0000000000000360", + "parent": "clock.o", + "path": "", + "romSize": 0, + "moduleName": "clock.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 72, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000360", + "id": "0x0000000000000360", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000003a8": { + "objName": "0x00000000000003a8", + "parent": "interrupt.o", + "path": "", + "romSize": 0, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 200, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000003a8", + "id": "0x00000000000003a8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000470": { + "objName": "0x0000000000000470", + "parent": "crg.o", + "path": "", + "romSize": 0, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 488, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000470", + "id": "0x0000000000000470", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000658": { + "objName": "0x0000000000000658", + "parent": "debug.o", + "path": "", + "romSize": 0, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 136, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000658", + "id": "0x0000000000000658", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000006e0": { + "objName": "0x00000000000006e0", + "parent": "iocmg.o", + "path": "", + "romSize": 0, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 296, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000006e0", + "id": "0x00000000000006e0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000808": { + "objName": "0x0000000000000808", + "parent": "timer.o", + "path": "", + "romSize": 0, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 152, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000808", + "id": "0x0000000000000808", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000008a0": { + "objName": "0x00000000000008a0", + "parent": "uart.o", + "path": "", + "romSize": 0, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 288, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000008a0", + "id": "0x00000000000008a0", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000009c0": { + "objName": "0x00000000000009c0", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 40, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000009c0", + "id": "0x00000000000009c0", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000009e8": { + "objName": "0x00000000000009e8", + "parent": "system_init.o", + "path": "", + "romSize": 0, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 88, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000009e8", + "id": "0x00000000000009e8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000a68": { + "objName": "0x0000000000000a68", + "parent": "extendsfdf2.o", + "path": "", + "romSize": 0, + "moduleName": "extendsfdf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 32, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000a68", + "id": "0x0000000000000a68", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000a88": { + "objName": "0x0000000000000a88", + "parent": "truncdfsf2.o", + "path": "", + "romSize": 0, + "moduleName": "truncdfsf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 32, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000a88", + "id": "0x0000000000000a88", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000aa8": { + "objName": "0x0000000000000aa8", + "parent": "_clz.o", + "path": "", + "romSize": 0, + "moduleName": "_clz.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 24, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000aa8", + "id": "0x0000000000000aa8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000ac0": { + "objName": "0x0000000000000ac0", + "parent": "_clzsi2.o", + "path": "", + "romSize": 0, + "moduleName": "_clzsi2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 32, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000ac0", + "id": "0x0000000000000ac0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002f8d": { + "objName": "0x0000000000002f8d", + "parent": "anatrim.o", + "path": "", + "romSize": 0, + "moduleName": "anatrim.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1597, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000002f8d", + "id": "0x0000000000002f8d", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000035ca": { + "objName": "0x00000000000035ca", + "parent": "anavrefinit.o", + "path": "", + "romSize": 0, + "moduleName": "anavrefinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 141, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000035ca", + "id": "0x00000000000035ca", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000003657": { + "objName": "0x0000000000003657", + "parent": "crginit.o", + "path": "", + "romSize": 0, + "moduleName": "crginit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 4068, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000003657", + "id": "0x0000000000003657", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000463b": { + "objName": "0x000000000000463b", + "parent": "flashinit.o", + "path": "", + "romSize": 0, + "moduleName": "flashinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2314, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000463b", + "id": "0x000000000000463b", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000004f45": { + "objName": "0x0000000000004f45", + "parent": "systickinit.o", + "path": "", + "romSize": 0, + "moduleName": "systickinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 200, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000004f45", + "id": "0x0000000000004f45", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000500d": { + "objName": "0x000000000000500d", + "parent": "fotp_info_read.o", + "path": "", + "romSize": 0, + "moduleName": "fotp_info_read.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 181, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000500d", + "id": "0x000000000000500d", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000050c2": { + "objName": "0x00000000000050c2", + "parent": "ip_crg_common.o", + "path": "", + "romSize": 0, + "moduleName": "ip_crg_common.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 235, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000050c2", + "id": "0x00000000000050c2", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000051ad": { + "objName": "0x00000000000051ad", + "parent": "adc.o", + "path": "", + "romSize": 0, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 8022, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000051ad", + "id": "0x00000000000051ad", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000007103": { + "objName": "0x0000000000007103", + "parent": "assert.o", + "path": "", + "romSize": 0, + "moduleName": "assert.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 54, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000007103", + "id": "0x0000000000007103", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000007139": { + "objName": "0x0000000000007139", + "parent": "clock.o", + "path": "", + "romSize": 0, + "moduleName": "clock.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 212, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000007139", + "id": "0x0000000000007139", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000720d": { + "objName": "0x000000000000720d", + "parent": "interrupt.o", + "path": "", + "romSize": 0, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1230, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000720d", + "id": "0x000000000000720d", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000076db": { + "objName": "0x00000000000076db", + "parent": "crg.o", + "path": "", + "romSize": 0, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2817, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000076db", + "id": "0x00000000000076db", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000081dc": { + "objName": "0x00000000000081dc", + "parent": "debug.o", + "path": "", + "romSize": 0, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3085, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000081dc", + "id": "0x00000000000081dc", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000008de9": { + "objName": "0x0000000000008de9", + "parent": "iocmg.o", + "path": "", + "romSize": 0, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3382, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000008de9", + "id": "0x0000000000008de9", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000009b1f": { + "objName": "0x0000000000009b1f", + "parent": "timer.o", + "path": "", + "romSize": 0, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 1393, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000009b1f", + "id": "0x0000000000009b1f", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000a090": { + "objName": "0x000000000000a090", + "parent": "uart.o", + "path": "", + "romSize": 0, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 1141, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000a090", + "id": "0x000000000000a090", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000a505": { + "objName": "0x000000000000a505", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 39, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000a505", + "id": "0x000000000000a505", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000a52c": { + "objName": "0x000000000000a52c", + "parent": "system_init.o", + "path": "", + "romSize": 0, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 112, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000a52c", + "id": "0x000000000000a52c", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000a59c": { + "objName": "0x000000000000a59c", + "parent": "tim_adc.o", + "path": "", + "romSize": 0, + "moduleName": "tim_adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 39, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000a59c", + "id": "0x000000000000a59c", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000a5c3": { + "objName": "0x000000000000a5c3", + "parent": "extendsfdf2.o", + "path": "", + "romSize": 0, + "moduleName": "extendsfdf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 691, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000a5c3", + "id": "0x000000000000a5c3", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000a876": { + "objName": "0x000000000000a876", + "parent": "truncdfsf2.o", + "path": "", + "romSize": 0, + "moduleName": "truncdfsf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 314, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000a876", + "id": "0x000000000000a876", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000a9b0": { + "objName": "0x000000000000a9b0", + "parent": "_clz.o", + "path": "", + "romSize": 0, + "moduleName": "_clz.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 606, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000a9b0", + "id": "0x000000000000a9b0", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000ac0e": { + "objName": "0x000000000000ac0e", + "parent": "_clzsi2.o", + "path": "", + "romSize": 0, + "moduleName": "_clzsi2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 22, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000ac0e", + "id": "0x000000000000ac0e", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000060": { + "objName": "0x0000000000000060", + "parent": "crginit.o", + "path": "", + "romSize": 0, + "moduleName": "crginit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 24, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000060", + "id": "0x0000000000000060", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000078": { + "objName": "0x0000000000000078", + "parent": "flashinit.o", + "path": "", + "romSize": 0, + "moduleName": "flashinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 32, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000078", + "id": "0x0000000000000078", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000098": { + "objName": "0x0000000000000098", + "parent": "systickinit.o", + "path": "", + "romSize": 0, + "moduleName": "systickinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 24, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000098", + "id": "0x0000000000000098", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000000c8": { + "objName": "0x00000000000000c8", + "parent": "ip_crg_common.o", + "path": "", + "romSize": 0, + "moduleName": "ip_crg_common.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 16, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000000c8", + "id": "0x00000000000000c8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000290": { + "objName": "0x0000000000000290", + "parent": "assert.o", + "path": "", + "romSize": 0, + "moduleName": "assert.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 16, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000290", + "id": "0x0000000000000290", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000002a0": { + "objName": "0x00000000000002a0", + "parent": "clock.o", + "path": "", + "romSize": 0, + "moduleName": "clock.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 56, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000002a0", + "id": "0x00000000000002a0", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000002d8": { + "objName": "0x00000000000002d8", + "parent": "interrupt.o", + "path": "", + "romSize": 0, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 184, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000002d8", + "id": "0x00000000000002d8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000390": { + "objName": "0x0000000000000390", + "parent": "crg.o", + "path": "", + "romSize": 0, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 472, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000390", + "id": "0x0000000000000390", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000568": { + "objName": "0x0000000000000568", + "parent": "debug.o", + "path": "", + "romSize": 0, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 120, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000568", + "id": "0x0000000000000568", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000005e0": { + "objName": "0x00000000000005e0", + "parent": "iocmg.o", + "path": "", + "romSize": 0, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 280, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000005e0", + "id": "0x00000000000005e0", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000006f8": { + "objName": "0x00000000000006f8", + "parent": "timer.o", + "path": "", + "romSize": 0, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 136, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000006f8", + "id": "0x00000000000006f8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000780": { + "objName": "0x0000000000000780", + "parent": "uart.o", + "path": "", + "romSize": 0, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 272, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000780", + "id": "0x0000000000000780", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000890": { + "objName": "0x0000000000000890", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 24, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000890", + "id": "0x0000000000000890", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000008a8": { + "objName": "0x00000000000008a8", + "parent": "system_init.o", + "path": "", + "romSize": 0, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 72, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000008a8", + "id": "0x00000000000008a8", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000008f0": { + "objName": "0x00000000000008f0", + "parent": "tim_adc.o", + "path": "", + "romSize": 0, + "moduleName": "tim_adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 24, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000008f0", + "id": "0x00000000000008f0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000908": { + "objName": "0x0000000000000908", + "parent": "extendsfdf2.o", + "path": "", + "romSize": 0, + "moduleName": "extendsfdf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 32, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000908", + "id": "0x0000000000000908", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000928": { + "objName": "0x0000000000000928", + "parent": "truncdfsf2.o", + "path": "", + "romSize": 0, + "moduleName": "truncdfsf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 120, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000928", + "id": "0x0000000000000928", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000009a0": { + "objName": "0x00000000000009a0", + "parent": "_clzsi2.o", + "path": "", + "romSize": 0, + "moduleName": "_clzsi2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 24, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000009a0", + "id": "0x00000000000009a0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000070": { + "objName": "0x0000000000000070", + "parent": "anatrim.o", + "path": "", + "romSize": 0, + "moduleName": "anatrim.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 192, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000070", + "id": "0x0000000000000070", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000164": { + "objName": "0x0000000000000164", + "parent": "crginit.o", + "path": "", + "romSize": 0, + "moduleName": "crginit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 88, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000164", + "id": "0x0000000000000164", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000001bc": { + "objName": "0x00000000000001bc", + "parent": "flashinit.o", + "path": "", + "romSize": 0, + "moduleName": "flashinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 120, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000001bc", + "id": "0x00000000000001bc", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000234": { + "objName": "0x0000000000000234", + "parent": "systickinit.o", + "path": "", + "romSize": 0, + "moduleName": "systickinit.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 84, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000234", + "id": "0x0000000000000234", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000288": { + "objName": "0x0000000000000288", + "parent": "fotp_info_read.o", + "path": "", + "romSize": 0, + "moduleName": "fotp_info_read.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 88, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000288", + "id": "0x0000000000000288", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000002e0": { + "objName": "0x00000000000002e0", + "parent": "ip_crg_common.o", + "path": "", + "romSize": 0, + "moduleName": "ip_crg_common.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 48, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000002e0", + "id": "0x00000000000002e0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000310": { + "objName": "0x0000000000000310", + "parent": "adc.o", + "path": "", + "romSize": 0, + "moduleName": "adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1940, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000310", + "id": "0x0000000000000310", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000aa4": { + "objName": "0x0000000000000aa4", + "parent": "assert.o", + "path": "", + "romSize": 0, + "moduleName": "assert.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 48, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000aa4", + "id": "0x0000000000000aa4", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000ad4": { + "objName": "0x0000000000000ad4", + "parent": "clock.o", + "path": "", + "romSize": 0, + "moduleName": "clock.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 228, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000ad4", + "id": "0x0000000000000ad4", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000bb8": { + "objName": "0x0000000000000bb8", + "parent": "interrupt.o", + "path": "", + "romSize": 0, + "moduleName": "interrupt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 792, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000bb8", + "id": "0x0000000000000bb8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000ed0": { + "objName": "0x0000000000000ed0", + "parent": "crg.o", + "path": "", + "romSize": 0, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2060, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000ed0", + "id": "0x0000000000000ed0", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000016dc": { + "objName": "0x00000000000016dc", + "parent": "debug.o", + "path": "", + "romSize": 0, + "moduleName": "debug.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 520, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000016dc", + "id": "0x00000000000016dc", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000018e4": { + "objName": "0x00000000000018e4", + "parent": "iocmg.o", + "path": "", + "romSize": 0, + "moduleName": "iocmg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1228, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000018e4", + "id": "0x00000000000018e4", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001db0": { + "objName": "0x0000000000001db0", + "parent": "timer.o", + "path": "", + "romSize": 0, + "moduleName": "timer.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 584, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000001db0", + "id": "0x0000000000001db0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001ff8": { + "objName": "0x0000000000001ff8", + "parent": "uart.o", + "path": "", + "romSize": 0, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1208, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000001ff8", + "id": "0x0000000000001ff8", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000024b0": { + "objName": "0x00000000000024b0", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 76, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000024b0", + "id": "0x00000000000024b0", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000024fc": { + "objName": "0x00000000000024fc", + "parent": "system_init.o", + "path": "", + "romSize": 0, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 304, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000024fc", + "id": "0x00000000000024fc", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000262c": { + "objName": "0x000000000000262c", + "parent": "tim_adc.o", + "path": "", + "romSize": 0, + "moduleName": "tim_adc.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 84, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000262c", + "id": "0x000000000000262c", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002680": { + "objName": "0x0000000000002680", + "parent": "extendsfdf2.o", + "path": "", + "romSize": 0, + "moduleName": "extendsfdf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 56, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000002680", + "id": "0x0000000000002680", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000026b8": { + "objName": "0x00000000000026b8", + "parent": "truncdfsf2.o", + "path": "", + "romSize": 0, + "moduleName": "truncdfsf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 32, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000026b8", + "id": "0x00000000000026b8", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000026d8": { + "objName": "0x00000000000026d8", + "parent": "_clzsi2.o", + "path": "", + "romSize": 0, + "moduleName": "_clzsi2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 32, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000026d8", + "id": "0x00000000000026d8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000299": { + "objName": "0x0000000000000299", + "parent": "truncdfsf2.o", + "path": "", + "romSize": 0, + "moduleName": "truncdfsf2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1474, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000299", + "id": "0x0000000000000299", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000085b": { + "objName": "0x000000000000085b", + "parent": "_clzsi2.o", + "path": "", + "romSize": 0, + "moduleName": "_clzsi2.o", + "componentName": "lib-gcc", + "isSymbol": true, + "lib": "libgcc.a", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 107, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000085b", + "id": "0x000000000000085b", + "dec": 0, + "sumSize": 0 + } + }, + "moduleSizeTree": { + "startup.o": { + "objName": "startup.o", + "parent": "", + "romSize": 1812, + ".text": 16, + ".data": 0, + ".bss": 0, + ".data.magic": 4, + ".text.entry": 1792, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "startup.o", + "sumSize": 1812 + }, + "chipinit.o": { + "objName": "chipinit.o", + "parent": "", + "romSize": 72, + ".text": 72, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 16833, + ".comment": 0, + ".debug_line": 347, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "chipinit.o", + "sumSize": 72 + }, + "anatrim.o": { + "objName": "anatrim.o", + "parent": "", + "romSize": 1498, + ".text": 1498, + ".data": 4, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 48, + ".comment": 0, + ".debug_line": 23014, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "anatrim.o", + "sumSize": 1502 + }, + "anavrefinit.o": { + "objName": "anavrefinit.o", + "parent": "", + "romSize": 90, + ".text": 90, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1398, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "anavrefinit.o", + "sumSize": 90 + }, + "crginit.o": { + "objName": "crginit.o", + "parent": "", + "romSize": 66, + ".text": 66, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 14899, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "crginit.o", + "sumSize": 66 + }, + "flashinit.o": { + "objName": "flashinit.o", + "parent": "", + "romSize": 442, + ".text": 442, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3279, + ".debug_info": 4382, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "flashinit.o", + "sumSize": 442 + }, + "systickinit.o": { + "objName": "systickinit.o", + "parent": "", + "romSize": 62, + ".text": 62, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 776, + ".debug_info": 414, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "systickinit.o", + "sumSize": 62 + }, + "fotp_info_read.o": { + "objName": "fotp_info_read.o", + "parent": "", + "romSize": 486, + ".text": 486, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1270, + ".debug_info": 4434, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "fotp_info_read.o", + "sumSize": 486 + }, + "ip_crg_common.o": { + "objName": "ip_crg_common.o", + "parent": "", + "romSize": 652, + ".text": 652, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 538, + ".debug_info": 304, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "ip_crg_common.o", + "sumSize": 652 + }, + "adc.o": { + "objName": "adc.o", + "parent": "", + "romSize": 3310, + ".text": 3310, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 17270, + ".debug_info": 26163, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "adc.o", + "sumSize": 3310 + }, + "assert.o": { + "objName": "assert.o", + "parent": "", + "romSize": 22, + ".text": 22, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 375, + ".debug_info": 129, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "assert.o", + "sumSize": 22 + }, + "clock.o": { + "objName": "clock.o", + "parent": "", + "romSize": 306, + ".text": 306, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1412, + ".debug_info": 721, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "clock.o", + "sumSize": 306 + }, + "interrupt.o": { + "objName": "interrupt.o", + "parent": "", + "romSize": 2492, + ".text": 2492, + ".data": 0, + ".bss": 920, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 4880, + ".debug_info": 3648, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "interrupt.o", + "sumSize": 2492 + }, + "crg.o": { + "objName": "crg.o", + "parent": "", + "romSize": 6710, + ".text": 6710, + ".data": 216, + ".bss": 5, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 13117, + ".debug_info": 16804, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "crg.o", + "sumSize": 6926 + }, + "debug.o": { + "objName": "debug.o", + "parent": "", + "romSize": 2256, + ".text": 2256, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 6456, + ".debug_info": 10268, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "debug.o", + "sumSize": 2256 + }, + "iocmg.o": { + "objName": "iocmg.o", + "parent": "", + "romSize": 1043, + ".text": 1043, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 7911, + ".debug_info": 4863, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "iocmg.o", + "sumSize": 1043 + }, + "timer.o": { + "objName": "timer.o", + "parent": "", + "romSize": 1389, + ".text": 1389, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3726, + ".debug_info": 3453, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "timer.o", + "sumSize": 1389 + }, + "uart.o": { + "objName": "uart.o", + "parent": "", + "romSize": 1439, + ".text": 1439, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 8760, + ".debug_info": 12953, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "uart.o", + "sumSize": 1439 + }, + "main.o": { + "objName": "main.o", + "parent": "", + "romSize": 12, + ".text": 12, + ".data": 0, + ".bss": 328, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1228, + ".debug_info": 26845, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "main.o", + "sumSize": 12 + }, + "system_init.o": { + "objName": "system_init.o", + "parent": "", + "romSize": 968, + ".text": 968, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2488, + ".debug_info": 38830, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "system_init.o", + "sumSize": 968 + }, + "tim_adc.o": { + "objName": "tim_adc.o", + "parent": "", + "romSize": 256, + ".text": 256, + ".data": 0, + ".bss": 7204, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1349, + ".debug_info": 26840, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "tim_adc.o", + "sumSize": 256 + }, + "extendsfdf2.o": { + "objName": "extendsfdf2.o", + "parent": "lib-gcc", + "romSize": 222, + ".text": 222, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 665, + ".comment": 0, + ".debug_line": 1066, + ".debug_info": 1342, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "extendsfdf2.o", + "sumSize": 222 + }, + "lib-gcc": { + "objName": "lib-gcc", + "parent": "", + "romSize": 1084, + ".text": 768, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 707, + ".comment": 0, + ".debug_line": 6724, + ".debug_info": 4542, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "lib-gcc", + "sumSize": 768 + }, + "truncdfsf2.o": { + "objName": "truncdfsf2.o", + "parent": "lib-gcc", + "romSize": 546, + ".text": 546, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3091, + ".debug_info": 1029, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "truncdfsf2.o", + "sumSize": 546 + }, + "_clzsi2.o": { + "objName": "_clzsi2.o", + "parent": "lib-gcc", + "romSize": 60, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 42, + ".comment": 0, + ".debug_line": 1446, + ".debug_info": 845, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "_clzsi2.o", + "sumSize": 0 + }, + "_clz.o": { + "objName": "_clz.o", + "parent": "lib-gcc", + "romSize": 256, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1121, + ".debug_info": 1326, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "_clz.o", + "sumSize": 0 + }, + "load address 0x00000000030067a4": { + "objName": "load address 0x00000000030067a4", + "parent": "", + "romSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "load address 0x00000000030067a4", + "sumSize": 0 + } + }, + "sumSectionNames": [ + ".text", + ".data", + ".data.magic", + ".text.entry", + ".text.sram", + ".reserved.data" + ], + "sectionKeys": [ + ".text", + ".data", + ".bss", + ".data.magic", + ".text.entry", + ".stacks", + ".text.sram", + ".reserved.data", + ".stackBound", + ".riscv.attributes", + ".comment", + ".debug_line", + ".debug_info", + ".debug_abbrev", + ".debug_aranges", + ".debug_str", + ".debug_ranges", + ".debug_frame", + ".debug_loc" + ], + "folderTree": [ + { + "key": "\\obj", + "treeName": "-obj", + "objName": "obj", + "sumSize": 25603, + ".text": 23587, + ".data": 220, + ".bss": 8457, + ".data.magic": 4, + ".text.entry": 1792, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 16881, + ".comment": 0, + ".debug_line": 114493, + ".debug_info": 181051, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "children": [ + { + "key": "\\obj\\chip\\3061m", + "treeName": "-obj-chip\\3061m", + "objName": "chip\\3061m", + "sumSize": 5184, + "children": [ + { + "key": "\\obj\\chip\\3061m\\startup.o", + "treeName": "-obj-chip\\3061m-startup.o", + "objName": "startup.o", + "sumSize": 1812, + "children": [ + { + "key": "\\obj\\chip\\3061m\\startup.o\\0x0000000003000000", + "treeName": "-obj-chip\\3061m-startup.o-0x0000000003000000", + "objName": "0x0000000003000000", + "sumSize": 4, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 4, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\startup.o\\0x0000000003000004", + "treeName": "-obj-chip\\3061m-startup.o-0x0000000003000004", + "objName": "_start", + "sumSize": 1792, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 1792, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\startup.o\\0x0000000003006794", + "treeName": "-obj-chip\\3061m-startup.o-0x0000000003006794", + "objName": "_GLOBAL_OFFSET_TABLE_", + "sumSize": 8, + ".text": 8, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\startup.o\\0x000000000300679c", + "treeName": "-obj-chip\\3061m-startup.o-0x000000000300679c", + "objName": "0x000000000300679c", + "sumSize": 8, + ".text": 8, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 16, + ".data": 0, + ".bss": 0, + ".data.magic": 4, + ".text.entry": 1792, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit", + "treeName": "-obj-chip\\3061m-chipinit", + "objName": "chipinit", + "sumSize": 2234, + "children": [ + { + "key": "\\obj\\chip\\3061m\\chipinit\\chipinit.o", + "treeName": "-obj-chip\\3061m-chipinit-chipinit.o", + "objName": "chipinit.o", + "sumSize": 72, + "children": [ + { + "key": "\\obj\\chip\\3061m\\chipinit\\chipinit.o\\0x0000000003000704", + "treeName": "-obj-chip\\3061m-chipinit-chipinit.o-0x0000000003000704", + "objName": "Chip_InitFail", + "sumSize": 8, + ".text": 8, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\chipinit.o\\0x000000000300070c", + "treeName": "-obj-chip\\3061m-chipinit-chipinit.o-0x000000000300070c", + "objName": "Chip_Init", + "sumSize": 64, + ".text": 64, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\chipinit.o\\0x0000000000000031", + "treeName": "-obj-chip\\3061m-chipinit-chipinit.o-0x0000000000000031", + "objName": "0x0000000000000031", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 50, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\chipinit.o\\0x00000000000008cc", + "treeName": "-obj-chip\\3061m-chipinit-chipinit.o-0x00000000000008cc", + "objName": "0x00000000000008cc", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 347, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\chipinit.o\\0x0000000000000026", + "treeName": "-obj-chip\\3061m-chipinit-chipinit.o-0x0000000000000026", + "objName": "0x0000000000000026", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 16332, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\chipinit.o\\0x0000000000000014", + "treeName": "-obj-chip\\3061m-chipinit-chipinit.o-0x0000000000000014", + "objName": "0x0000000000000014", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 451, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 72, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 16833, + ".comment": 0, + ".debug_line": 347, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim", + "treeName": "-obj-chip\\3061m-chipinit-anatrim", + "objName": "anatrim", + "sumSize": 1502, + "children": [ + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim\\anatrim.o", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o", + "objName": "anatrim.o", + "sumSize": 1502, + "children": [ + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim\\anatrim.o\\0x000000000300074c", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x000000000300074c", + "objName": "CalculateGain", + "sumSize": 46, + ".text": 46, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim\\anatrim.o\\0x000000000300077a", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x000000000300077a", + "objName": "CHIP_GetInfo", + "sumSize": 74, + ".text": 74, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim\\anatrim.o\\0x00000000030007c4", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x00000000030007c4", + "objName": "CHIP_AnalogTrim", + "sumSize": 1292, + ".text": 1292, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim\\anatrim.o\\0x0000000003000cd4", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000003000cd4", + "objName": "ANATRIM_Entry", + "sumSize": 82, + ".text": 82, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim\\anatrim.o\\0x00000000030061fc", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x00000000030061fc", + "objName": "0x00000000030061fc", + "sumSize": 4, + ".text": 4, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim\\anatrim.o\\0x0000000004000020", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000004000020", + "objName": "g_tsensorGain", + "sumSize": 4, + ".text": 0, + ".data": 4, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim\\anatrim.o\\0x0000000000000063", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000000000063", + "objName": "0x0000000000000063", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim\\anatrim.o\\0x0000000000000a27", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000000000a27", + "objName": "0x0000000000000a27", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 727, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim\\anatrim.o\\0x0000000000003ff2", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000000003ff2", + "objName": "0x0000000000003ff2", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 19863, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim\\anatrim.o\\0x00000000000001d7", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x00000000000001d7", + "objName": "0x00000000000001d7", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 585, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim\\anatrim.o\\0x0000000000000020", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000000000020", + "objName": "0x0000000000000020", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 48, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim\\anatrim.o\\0x0000000000002f8d", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000000002f8d", + "objName": "0x0000000000002f8d", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1597, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim\\anatrim.o\\0x0000000000000070", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000000000070", + "objName": "0x0000000000000070", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 192, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1498, + ".data": 4, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 48, + ".comment": 0, + ".debug_line": 23014, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1498, + ".data": 4, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 48, + ".comment": 0, + ".debug_line": 23014, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anavrefinit", + "treeName": "-obj-chip\\3061m-chipinit-anavrefinit", + "objName": "anavrefinit", + "sumSize": 90, + "children": [ + { + "key": "\\obj\\chip\\3061m\\chipinit\\anavrefinit\\anavrefinit.o", + "treeName": "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o", + "objName": "anavrefinit.o", + "sumSize": 90, + "children": [ + { + "key": "\\obj\\chip\\3061m\\chipinit\\anavrefinit\\anavrefinit.o\\0x0000000003000d26", + "treeName": "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000003000d26", + "objName": "ANAVREF_Init", + "sumSize": 90, + ".text": 90, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anavrefinit\\anavrefinit.o\\0x0000000000000095", + "treeName": "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000000000095", + "objName": "0x0000000000000095", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anavrefinit\\anavrefinit.o\\0x0000000000000cfe", + "treeName": "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000000000cfe", + "objName": "0x0000000000000cfe", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 197, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anavrefinit\\anavrefinit.o\\0x0000000000008d89", + "treeName": "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000000008d89", + "objName": "0x0000000000008d89", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 687, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anavrefinit\\anavrefinit.o\\0x0000000000000420", + "treeName": "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000000000420", + "objName": "0x0000000000000420", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 223, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anavrefinit\\anavrefinit.o\\0x0000000000000050", + "treeName": "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000000000050", + "objName": "0x0000000000000050", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 16, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anavrefinit\\anavrefinit.o\\0x0000000000000090", + "treeName": "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000000000090", + "objName": "0x0000000000000090", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 32, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anavrefinit\\anavrefinit.o\\0x0000000000000130", + "treeName": "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000000000130", + "objName": "0x0000000000000130", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 52, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\anavrefinit\\anavrefinit.o\\0x00000000000035ca", + "treeName": "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x00000000000035ca", + "objName": "0x00000000000035ca", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 141, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 90, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1398, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 90, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1398, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\crginit", + "treeName": "-obj-chip\\3061m-chipinit-crginit", + "objName": "crginit", + "sumSize": 66, + "children": [ + { + "key": "\\obj\\chip\\3061m\\chipinit\\crginit\\crginit.o", + "treeName": "-obj-chip\\3061m-chipinit-crginit-crginit.o", + "objName": "crginit.o", + "sumSize": 66, + "children": [ + { + "key": "\\obj\\chip\\3061m\\chipinit\\crginit\\crginit.o\\0x0000000003000d84", + "treeName": "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x0000000003000d84", + "objName": "CRG_SetCoreClockSelect", + "sumSize": 66, + ".text": 66, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\crginit\\crginit.o\\0x00000000000000c7", + "treeName": "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x00000000000000c7", + "objName": "0x00000000000000c7", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\crginit\\crginit.o\\0x0000000000000dc3", + "treeName": "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x0000000000000dc3", + "objName": "0x0000000000000dc3", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 358, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\crginit\\crginit.o\\0x0000000000009038", + "treeName": "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x0000000000009038", + "objName": "0x0000000000009038", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 9941, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\crginit\\crginit.o\\0x00000000000004ff", + "treeName": "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x00000000000004ff", + "objName": "0x00000000000004ff", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 370, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\crginit\\crginit.o\\0x0000000000003657", + "treeName": "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x0000000000003657", + "objName": "0x0000000000003657", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 4068, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\crginit\\crginit.o\\0x0000000000000060", + "treeName": "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x0000000000000060", + "objName": "0x0000000000000060", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 24, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\crginit\\crginit.o\\0x0000000000000164", + "treeName": "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x0000000000000164", + "objName": "0x0000000000000164", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 88, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 66, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 14899, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 66, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 14899, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\flashinit", + "treeName": "-obj-chip\\3061m-chipinit-flashinit", + "objName": "flashinit", + "sumSize": 442, + "children": [ + { + "key": "\\obj\\chip\\3061m\\chipinit\\flashinit\\flashinit.o", + "treeName": "-obj-chip\\3061m-chipinit-flashinit-flashinit.o", + "objName": "flashinit.o", + "sumSize": 442, + "children": [ + { + "key": "\\obj\\chip\\3061m\\chipinit\\flashinit\\flashinit.o\\0x0000000003000dca", + "treeName": "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000003000dca", + "objName": "SetFlashDiv", + "sumSize": 146, + ".text": 146, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\flashinit\\flashinit.o\\0x0000000003000e5c", + "treeName": "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000003000e5c", + "objName": "GetFlashFreq", + "sumSize": 100, + ".text": 100, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\flashinit\\flashinit.o\\0x0000000003000ec0", + "treeName": "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000003000ec0", + "objName": "FLASH_ClockConfig", + "sumSize": 196, + ".text": 196, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\flashinit\\flashinit.o\\0x00000000000000f9", + "treeName": "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x00000000000000f9", + "objName": "0x00000000000000f9", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\flashinit\\flashinit.o\\0x0000000000000f29", + "treeName": "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000000000f29", + "objName": "0x0000000000000f29", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 402, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\flashinit\\flashinit.o\\0x000000000000b70d", + "treeName": "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x000000000000b70d", + "objName": "0x000000000000b70d", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 4382, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\flashinit\\flashinit.o\\0x0000000000000671", + "treeName": "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000000000671", + "objName": "0x0000000000000671", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 361, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\flashinit\\flashinit.o\\0x000000000000463b", + "treeName": "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x000000000000463b", + "objName": "0x000000000000463b", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2314, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\flashinit\\flashinit.o\\0x0000000000000078", + "treeName": "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000000000078", + "objName": "0x0000000000000078", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 32, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\flashinit\\flashinit.o\\0x00000000000001bc", + "treeName": "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x00000000000001bc", + "objName": "0x00000000000001bc", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 120, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 442, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3279, + ".debug_info": 4382, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 442, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3279, + ".debug_info": 4382, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\systickinit", + "treeName": "-obj-chip\\3061m-chipinit-systickinit", + "objName": "systickinit", + "sumSize": 62, + "children": [ + { + "key": "\\obj\\chip\\3061m\\chipinit\\systickinit\\systickinit.o", + "treeName": "-obj-chip\\3061m-chipinit-systickinit-systickinit.o", + "objName": "systickinit.o", + "sumSize": 62, + "children": [ + { + "key": "\\obj\\chip\\3061m\\chipinit\\systickinit\\systickinit.o\\0x0000000003000f84", + "treeName": "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x0000000003000f84", + "objName": "SYSTICK_Init", + "sumSize": 34, + ".text": 34, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\systickinit\\systickinit.o\\0x0000000003000fa6", + "treeName": "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x0000000003000fa6", + "objName": "SYSTICK_GetCRGHZ", + "sumSize": 28, + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\systickinit\\systickinit.o\\0x000000000000012b", + "treeName": "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x000000000000012b", + "objName": "0x000000000000012b", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\systickinit\\systickinit.o\\0x00000000000010bb", + "treeName": "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x00000000000010bb", + "objName": "0x00000000000010bb", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 170, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\systickinit\\systickinit.o\\0x000000000000c82b", + "treeName": "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x000000000000c82b", + "objName": "0x000000000000c82b", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 414, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\systickinit\\systickinit.o\\0x00000000000007da", + "treeName": "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x00000000000007da", + "objName": "0x00000000000007da", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 208, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\systickinit\\systickinit.o\\0x0000000000000108", + "treeName": "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x0000000000000108", + "objName": "0x0000000000000108", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 40, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\systickinit\\systickinit.o\\0x0000000000004f45", + "treeName": "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x0000000000004f45", + "objName": "0x0000000000004f45", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 200, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\systickinit\\systickinit.o\\0x0000000000000098", + "treeName": "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x0000000000000098", + "objName": "0x0000000000000098", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 24, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\systickinit\\systickinit.o\\0x0000000000000234", + "treeName": "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x0000000000000234", + "objName": "0x0000000000000234", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 84, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 62, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 776, + ".debug_info": 414, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 62, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 776, + ".debug_info": 414, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 2230, + ".data": 4, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 16881, + ".comment": 0, + ".debug_line": 43713, + ".debug_info": 4796, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\fotp", + "treeName": "-obj-chip\\3061m-fotp", + "objName": "fotp", + "sumSize": 486, + "children": [ + { + "key": "\\obj\\chip\\3061m\\fotp\\fotp_info_read.o", + "treeName": "-obj-chip\\3061m-fotp-fotp_info_read.o", + "objName": "fotp_info_read.o", + "sumSize": 486, + "children": [ + { + "key": "\\obj\\chip\\3061m\\fotp\\fotp_info_read.o\\0x0000000003000fc2", + "treeName": "-obj-chip\\3061m-fotp-fotp_info_read.o-0x0000000003000fc2", + "objName": "FOTP_CheckReadStatus", + "sumSize": 132, + ".text": 132, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\fotp\\fotp_info_read.o\\0x0000000003001046", + "treeName": "-obj-chip\\3061m-fotp-fotp_info_read.o-0x0000000003001046", + "objName": "FOTP_InfoGet", + "sumSize": 354, + ".text": 354, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\fotp\\fotp_info_read.o\\0x000000000000015d", + "treeName": "-obj-chip\\3061m-fotp-fotp_info_read.o-0x000000000000015d", + "objName": "0x000000000000015d", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\fotp\\fotp_info_read.o\\0x0000000000001165", + "treeName": "-obj-chip\\3061m-fotp-fotp_info_read.o-0x0000000000001165", + "objName": "0x0000000000001165", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 521, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\fotp\\fotp_info_read.o\\0x000000000000c9c9", + "treeName": "-obj-chip\\3061m-fotp-fotp_info_read.o-0x000000000000c9c9", + "objName": "0x000000000000c9c9", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 4434, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\fotp\\fotp_info_read.o\\0x00000000000008aa", + "treeName": "-obj-chip\\3061m-fotp-fotp_info_read.o-0x00000000000008aa", + "objName": "0x00000000000008aa", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 406, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\fotp\\fotp_info_read.o\\0x00000000000000b0", + "treeName": "-obj-chip\\3061m-fotp-fotp_info_read.o-0x00000000000000b0", + "objName": "0x00000000000000b0", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 24, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\fotp\\fotp_info_read.o\\0x000000000000500d", + "treeName": "-obj-chip\\3061m-fotp-fotp_info_read.o-0x000000000000500d", + "objName": "0x000000000000500d", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 181, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\fotp\\fotp_info_read.o\\0x0000000000000288", + "treeName": "-obj-chip\\3061m-fotp-fotp_info_read.o-0x0000000000000288", + "objName": "0x0000000000000288", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 88, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 486, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1270, + ".debug_info": 4434, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 486, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1270, + ".debug_info": 4434, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\ip_crg", + "treeName": "-obj-chip\\3061m-ip_crg", + "objName": "ip_crg", + "sumSize": 652, + "children": [ + { + "key": "\\obj\\chip\\3061m\\ip_crg\\ip_crg_common.o", + "treeName": "-obj-chip\\3061m-ip_crg-ip_crg_common.o", + "objName": "ip_crg_common.o", + "sumSize": 652, + "children": [ + { + "key": "\\obj\\chip\\3061m\\ip_crg\\ip_crg_common.o\\0x00000000030011a8", + "treeName": "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x00000000030011a8", + "objName": "GetCrgIpMatchInfo", + "sumSize": 100, + ".text": 100, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\ip_crg\\ip_crg_common.o\\0x0000000003006200", + "treeName": "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x0000000003006200", + "objName": "0x0000000003006200", + "sumSize": 552, + ".text": 552, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\ip_crg\\ip_crg_common.o\\0x000000000000018f", + "treeName": "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x000000000000018f", + "objName": "0x000000000000018f", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\ip_crg\\ip_crg_common.o\\0x000000000000136e", + "treeName": "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x000000000000136e", + "objName": "0x000000000000136e", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 157, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\ip_crg\\ip_crg_common.o\\0x000000000000db1b", + "treeName": "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x000000000000db1b", + "objName": "0x000000000000db1b", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 304, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\ip_crg\\ip_crg_common.o\\0x0000000000000158", + "treeName": "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x0000000000000158", + "objName": "0x0000000000000158", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 32, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\ip_crg\\ip_crg_common.o\\0x00000000000050c2", + "treeName": "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x00000000000050c2", + "objName": "0x00000000000050c2", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 235, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\ip_crg\\ip_crg_common.o\\0x00000000000000c8", + "treeName": "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x00000000000000c8", + "objName": "0x00000000000000c8", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 16, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\chip\\3061m\\ip_crg\\ip_crg_common.o\\0x00000000000002e0", + "treeName": "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x00000000000002e0", + "objName": "0x00000000000002e0", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 48, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 652, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 538, + ".debug_info": 304, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 652, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 538, + ".debug_info": 304, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 3384, + ".data": 4, + ".bss": 0, + ".data.magic": 4, + ".text.entry": 1792, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 16881, + ".comment": 0, + ".debug_line": 45521, + ".debug_info": 9534, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers", + "treeName": "-obj-drivers", + "objName": "drivers", + "sumSize": 19183, + ".text": 18967, + ".data": 216, + ".bss": 925, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 63907, + ".debug_info": 79002, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "children": [ + { + "key": "\\obj\\drivers\\adc\\src", + "treeName": "-obj-drivers-adc\\src", + "objName": "adc\\src", + "sumSize": 3310, + "children": [ + { + "key": "\\obj\\drivers\\adc\\src\\adc.o", + "treeName": "-obj-drivers-adc\\src-adc.o", + "objName": "adc.o", + "sumSize": 3310, + "children": [ + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x000000000300120c", + "treeName": "-obj-drivers-adc\\src-adc.o-0x000000000300120c", + "objName": "IsADCSampleChannel", + "sumSize": 28, + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x0000000003001228", + "treeName": "-obj-drivers-adc\\src-adc.o-0x0000000003001228", + "objName": "IsADCSOCx", + "sumSize": 28, + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x0000000003001244", + "treeName": "-obj-drivers-adc\\src-adc.o-0x0000000003001244", + "objName": "IsADCIntx", + "sumSize": 28, + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x0000000003001260", + "treeName": "-obj-drivers-adc\\src-adc.o-0x0000000003001260", + "objName": "IsADCTrigSource", + "sumSize": 28, + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x000000000300127c", + "treeName": "-obj-drivers-adc\\src-adc.o-0x000000000300127c", + "objName": "IsADCFinishMode", + "sumSize": 44, + ".text": 44, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x00000000030012a8", + "treeName": "-obj-drivers-adc\\src-adc.o-0x00000000030012a8", + "objName": "IsADCPriorityMode", + "sumSize": 30, + ".text": 30, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x00000000030012c6", + "treeName": "-obj-drivers-adc\\src-adc.o-0x00000000030012c6", + "objName": "IsADCTotalTime", + "sumSize": 28, + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x00000000030012e2", + "treeName": "-obj-drivers-adc\\src-adc.o-0x00000000030012e2", + "objName": "DCL_ADC_EnableAvddChannel", + "sumSize": 68, + ".text": 68, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x0000000003001326", + "treeName": "-obj-drivers-adc\\src-adc.o-0x0000000003001326", + "objName": "DCL_ADC_SetSOCxBlindInt0", + "sumSize": 124, + ".text": 124, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x00000000030013a2", + "treeName": "-obj-drivers-adc\\src-adc.o-0x00000000030013a2", + "objName": "DCL_ADC_SetSOCxBlindInt1", + "sumSize": 126, + ".text": 126, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x0000000003001420", + "treeName": "-obj-drivers-adc\\src-adc.o-0x0000000003001420", + "objName": "DCL_ADC_SetSOCxBlindInt2", + "sumSize": 124, + ".text": 124, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x000000000300149c", + "treeName": "-obj-drivers-adc\\src-adc.o-0x000000000300149c", + "objName": "DCL_ADC_SetSOCxBlindInt3", + "sumSize": 126, + ".text": 126, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x000000000300151a", + "treeName": "-obj-drivers-adc\\src-adc.o-0x000000000300151a", + "objName": "DCL_ADC_EnableIntx", + "sumSize": 116, + ".text": 116, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x000000000300158e", + "treeName": "-obj-drivers-adc\\src-adc.o-0x000000000300158e", + "objName": "ADC_GetCTRLAddr", + "sumSize": 54, + ".text": 54, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x00000000030015c4", + "treeName": "-obj-drivers-adc\\src-adc.o-0x00000000030015c4", + "objName": "DCL_ADC_SOCxSelectChannel", + "sumSize": 174, + ".text": 174, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x0000000003001672", + "treeName": "-obj-drivers-adc\\src-adc.o-0x0000000003001672", + "objName": "DCL_ADC_SOCxSelcetTrigSource", + "sumSize": 166, + ".text": 166, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x0000000003001718", + "treeName": "-obj-drivers-adc\\src-adc.o-0x0000000003001718", + "objName": "DCL_ADC_SOCxSetAcqps", + "sumSize": 174, + ".text": 174, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x00000000030017c6", + "treeName": "-obj-drivers-adc\\src-adc.o-0x00000000030017c6", + "objName": "DCL_ADC_SOCxSoftTrigger", + "sumSize": 116, + ".text": 116, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x000000000300183e", + "treeName": "-obj-drivers-adc\\src-adc.o-0x000000000300183e", + "objName": "DCL_ADC_SOCxSetPriority", + "sumSize": 100, + ".text": 100, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x00000000030018a2", + "treeName": "-obj-drivers-adc\\src-adc.o-0x00000000030018a2", + "objName": "DCL_ADC_ReadSOCxResult", + "sumSize": 122, + ".text": 122, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x000000000300191c", + "treeName": "-obj-drivers-adc\\src-adc.o-0x000000000300191c", + "objName": "DCL_ADC_EnableSOCxContinue", + "sumSize": 126, + ".text": 126, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x000000000300199a", + "treeName": "-obj-drivers-adc\\src-adc.o-0x000000000300199a", + "objName": "DCL_ADC_DisableSOCxContinue", + "sumSize": 128, + ".text": 128, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x0000000003001a1a", + "treeName": "-obj-drivers-adc\\src-adc.o-0x0000000003001a1a", + "objName": "HAL_ADC_Init", + "sumSize": 178, + ".text": 178, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x0000000003001acc", + "treeName": "-obj-drivers-adc\\src-adc.o-0x0000000003001acc", + "objName": "HAL_ADC_ConfigureSoc", + "sumSize": 434, + ".text": 434, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x0000000003001c7e", + "treeName": "-obj-drivers-adc\\src-adc.o-0x0000000003001c7e", + "objName": "HAL_ADC_StartIt", + "sumSize": 300, + ".text": 300, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x0000000003001daa", + "treeName": "-obj-drivers-adc\\src-adc.o-0x0000000003001daa", + "objName": "HAL_ADC_SoftTrigSample", + "sumSize": 130, + ".text": 130, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x0000000003001e2c", + "treeName": "-obj-drivers-adc\\src-adc.o-0x0000000003001e2c", + "objName": "HAL_ADC_GetConvResult", + "sumSize": 130, + ".text": 130, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x0000000003006428", + "treeName": "-obj-drivers-adc\\src-adc.o-0x0000000003006428", + "objName": "0x0000000003006428", + "sumSize": 80, + ".text": 80, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x00000000000001c1", + "treeName": "-obj-drivers-adc\\src-adc.o-0x00000000000001c1", + "objName": "0x00000000000001c1", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x000000000000140b", + "treeName": "-obj-drivers-adc\\src-adc.o-0x000000000000140b", + "objName": "0x000000000000140b", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 5550, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x000000000000dc4b", + "treeName": "-obj-drivers-adc\\src-adc.o-0x000000000000dc4b", + "objName": "0x000000000000dc4b", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 26163, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x0000000000000b19", + "treeName": "-obj-drivers-adc\\src-adc.o-0x0000000000000b19", + "objName": "0x0000000000000b19", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 812, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x00000000000000d8", + "treeName": "-obj-drivers-adc\\src-adc.o-0x00000000000000d8", + "objName": "0x00000000000000d8", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 440, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x0000000000000178", + "treeName": "-obj-drivers-adc\\src-adc.o-0x0000000000000178", + "objName": "0x0000000000000178", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 456, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x00000000000051ad", + "treeName": "-obj-drivers-adc\\src-adc.o-0x00000000000051ad", + "objName": "0x00000000000051ad", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 8022, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\adc\\src\\adc.o\\0x0000000000000310", + "treeName": "-obj-drivers-adc\\src-adc.o-0x0000000000000310", + "objName": "0x0000000000000310", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1940, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 3310, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 17270, + ".debug_info": 26163, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 3310, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 17270, + ".debug_info": 26163, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src", + "treeName": "-obj-drivers-base\\src", + "objName": "base\\src", + "sumSize": 2820, + "children": [ + { + "key": "\\obj\\drivers\\base\\src\\assert.o", + "treeName": "-obj-drivers-base\\src-assert.o", + "objName": "assert.o", + "sumSize": 22, + "children": [ + { + "key": "\\obj\\drivers\\base\\src\\assert.o\\0x0000000003001eae", + "treeName": "-obj-drivers-base\\src-assert.o-0x0000000003001eae", + "objName": "AssertErrorLog", + "sumSize": 22, + ".text": 22, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\assert.o\\0x00000000000001f3", + "treeName": "-obj-drivers-base\\src-assert.o-0x00000000000001f3", + "objName": "0x00000000000001f3", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\assert.o\\0x00000000000029b9", + "treeName": "-obj-drivers-base\\src-assert.o-0x00000000000029b9", + "objName": "0x00000000000029b9", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 83, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\assert.o\\0x000000000001427e", + "treeName": "-obj-drivers-base\\src-assert.o-0x000000000001427e", + "objName": "0x000000000001427e", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 129, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\assert.o\\0x0000000000000e45", + "treeName": "-obj-drivers-base\\src-assert.o-0x0000000000000e45", + "objName": "0x0000000000000e45", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 92, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\assert.o\\0x0000000000000340", + "treeName": "-obj-drivers-base\\src-assert.o-0x0000000000000340", + "objName": "0x0000000000000340", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 32, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\assert.o\\0x0000000000007103", + "treeName": "-obj-drivers-base\\src-assert.o-0x0000000000007103", + "objName": "0x0000000000007103", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 54, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\assert.o\\0x0000000000000290", + "treeName": "-obj-drivers-base\\src-assert.o-0x0000000000000290", + "objName": "0x0000000000000290", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 16, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\assert.o\\0x0000000000000aa4", + "treeName": "-obj-drivers-base\\src-assert.o-0x0000000000000aa4", + "objName": "0x0000000000000aa4", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 48, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 22, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 375, + ".debug_info": 129, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\clock.o", + "treeName": "-obj-drivers-base\\src-clock.o", + "objName": "clock.o", + "sumSize": 306, + "children": [ + { + "key": "\\obj\\drivers\\base\\src\\clock.o\\0x0000000003001ec4", + "treeName": "-obj-drivers-base\\src-clock.o-0x0000000003001ec4", + "objName": "DCL_SYSTICK_GetTick", + "sumSize": 20, + ".text": 20, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\clock.o\\0x0000000003001ed8", + "treeName": "-obj-drivers-base\\src-clock.o-0x0000000003001ed8", + "objName": "BASE_FUNC_DelayUs", + "sumSize": 92, + ".text": 92, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\clock.o\\0x0000000003001f34", + "treeName": "-obj-drivers-base\\src-clock.o-0x0000000003001f34", + "objName": "BASE_FUNC_DelayMs", + "sumSize": 56, + ".text": 56, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\clock.o\\0x0000000003001f6c", + "treeName": "-obj-drivers-base\\src-clock.o-0x0000000003001f6c", + "objName": "BASE_FUNC_DelaySeconds", + "sumSize": 56, + ".text": 56, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\clock.o\\0x0000000003001fa4", + "treeName": "-obj-drivers-base\\src-clock.o-0x0000000003001fa4", + "objName": "BASE_FUNC_Delay", + "sumSize": 82, + ".text": 82, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\clock.o\\0x0000000000000225", + "treeName": "-obj-drivers-base\\src-clock.o-0x0000000000000225", + "objName": "0x0000000000000225", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\clock.o\\0x0000000000002a0c", + "treeName": "-obj-drivers-base\\src-clock.o-0x0000000000002a0c", + "objName": "0x0000000000002a0c", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 447, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\clock.o\\0x00000000000142ff", + "treeName": "-obj-drivers-base\\src-clock.o-0x00000000000142ff", + "objName": "0x00000000000142ff", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 721, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\clock.o\\0x0000000000000ea1", + "treeName": "-obj-drivers-base\\src-clock.o-0x0000000000000ea1", + "objName": "0x0000000000000ea1", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 347, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\clock.o\\0x0000000000000360", + "treeName": "-obj-drivers-base\\src-clock.o-0x0000000000000360", + "objName": "0x0000000000000360", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 72, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\clock.o\\0x0000000000007139", + "treeName": "-obj-drivers-base\\src-clock.o-0x0000000000007139", + "objName": "0x0000000000007139", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 212, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\clock.o\\0x00000000000002a0", + "treeName": "-obj-drivers-base\\src-clock.o-0x00000000000002a0", + "objName": "0x00000000000002a0", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 56, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\clock.o\\0x0000000000000ad4", + "treeName": "-obj-drivers-base\\src-clock.o-0x0000000000000ad4", + "objName": "0x0000000000000ad4", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 228, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 306, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1412, + ".debug_info": 721, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o", + "treeName": "-obj-drivers-base\\src-interrupt.o", + "objName": "interrupt.o", + "sumSize": 2492, + "children": [ + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x0000000003001ff6", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003001ff6", + "objName": "IRQ_ClearN", + "sumSize": 32, + ".text": 32, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x0000000003002016", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003002016", + "objName": "InterruptEntry", + "sumSize": 68, + ".text": 68, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x000000000300205a", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x000000000300205a", + "objName": "IRQ_Init", + "sumSize": 88, + ".text": 88, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x00000000030020b2", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000030020b2", + "objName": "IRQ_Register", + "sumSize": 134, + ".text": 134, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x0000000003002138", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003002138", + "objName": "IRQ_EnableN", + "sumSize": 302, + ".text": 302, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x0000000003002266", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003002266", + "objName": "SysErrPrint", + "sumSize": 18, + ".text": 18, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x0000000003002278", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003002278", + "objName": "SysErrFinish", + "sumSize": 14, + ".text": 14, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x0000000003002286", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003002286", + "objName": "SysErrExcEntry", + "sumSize": 30, + ".text": 30, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x00000000030022a4", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000030022a4", + "objName": "SysErrNmiEntry", + "sumSize": 52, + ".text": 52, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x00000000030022d8", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000030022d8", + "objName": "SetLocalIntNumPri", + "sumSize": 714, + ".text": 714, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x00000000030025a2", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000030025a2", + "objName": "IRQ_SetLocalPriority", + "sumSize": 740, + ".text": 740, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x0000000003002886", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003002886", + "objName": "IRQ_SetPriority", + "sumSize": 116, + ".text": 116, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x00000000030028fa", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000030028fa", + "objName": "IRQ_DummyHandler", + "sumSize": 18, + ".text": 18, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x000000000300290c", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x000000000300290c", + "objName": "IRQ_SetCallBack", + "sumSize": 70, + ".text": 70, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x0000000003006478", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003006478", + "objName": "0x0000000003006478", + "sumSize": 32, + ".text": 32, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x0000000003006498", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003006498", + "objName": "0x0000000003006498", + "sumSize": 32, + ".text": 32, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x00000000030064b8", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000030064b8", + "objName": "0x00000000030064b8", + "sumSize": 32, + ".text": 32, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x00000000040000fc", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000040000fc", + "objName": "g_irqCallbackFunc", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 920, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x0000000000000257", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000000000257", + "objName": "0x0000000000000257", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 54, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x0000000000002bcb", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000000002bcb", + "objName": "0x0000000000002bcb", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1791, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x00000000000145d0", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000000145d0", + "objName": "0x00000000000145d0", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 3648, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x0000000000000ffc", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000000000ffc", + "objName": "0x0000000000000ffc", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 629, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x00000000000003a8", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000000003a8", + "objName": "0x00000000000003a8", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 200, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x000000000000720d", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x000000000000720d", + "objName": "0x000000000000720d", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1230, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x00000000000002d8", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000000002d8", + "objName": "0x00000000000002d8", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 184, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x0000000000000bb8", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000000000bb8", + "objName": "0x0000000000000bb8", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 792, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 2492, + ".data": 0, + ".bss": 920, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 4880, + ".debug_info": 3648, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 2820, + ".data": 0, + ".bss": 920, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 6667, + ".debug_info": 4498, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src", + "treeName": "-obj-drivers-crg\\src", + "objName": "crg\\src", + "sumSize": 6926, + "children": [ + { + "key": "\\obj\\drivers\\crg\\src\\crg.o", + "treeName": "-obj-drivers-crg\\src-crg.o", + "objName": "crg.o", + "sumSize": 6926, + "children": [ + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003002952", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002952", + "objName": "DCL_SYSCTRL_CrgWriteProtectionDisable", + "sumSize": 40, + ".text": 40, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x000000000300297a", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000300297a", + "objName": "DCL_SYSCTRL_CrgWriteProtectionEnable", + "sumSize": 42, + ".text": 42, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x00000000030029a4", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030029a4", + "objName": "IsCrgPllRefClkSelect", + "sumSize": 44, + ".text": 44, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x00000000030029d0", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030029d0", + "objName": "IsCrgPllPreDiv", + "sumSize": 28, + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x00000000030029ec", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030029ec", + "objName": "IsCrgPllPostDiv", + "sumSize": 28, + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003002a08", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002a08", + "objName": "IsCrgPllPostDiv2", + "sumSize": 28, + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003002a24", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002a24", + "objName": "IsCrgPllFbDiv", + "sumSize": 28, + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003002a40", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002a40", + "objName": "IsCrgCoreCkSel", + "sumSize": 54, + ".text": 54, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003002a76", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002a76", + "objName": "IsCrg1MCkSel", + "sumSize": 44, + ".text": 44, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003002aa2", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002aa2", + "objName": "IsCrg1MCkDiv", + "sumSize": 28, + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003002abe", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002abe", + "objName": "IsCrgValidPreDiv", + "sumSize": 94, + ".text": 94, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003002b1c", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002b1c", + "objName": "IsCrgValidFdDiv", + "sumSize": 138, + ".text": 138, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003002ba6", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002ba6", + "objName": "IsCrgValidPostDiv", + "sumSize": 72, + ".text": 72, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003002bee", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002bee", + "objName": "IsCrgValidPostDiv2", + "sumSize": 72, + ".text": 72, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003002c36", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002c36", + "objName": "IsCrgAdcClkModeSelect", + "sumSize": 64, + ".text": 64, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003002c76", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002c76", + "objName": "IsCrgAdcClkDiv", + "sumSize": 64, + ".text": 64, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003002cb6", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002cb6", + "objName": "DCL_CRG_SetCoreClkSel", + "sumSize": 112, + ".text": 112, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003002d2a", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002d2a", + "objName": "HAL_CRG_Init", + "sumSize": 712, + ".text": 712, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003002ff2", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002ff2", + "objName": "HAL_CRG_SetCoreClockSelect", + "sumSize": 142, + ".text": 142, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003080", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003080", + "objName": "CRG_GetVcoFreq", + "sumSize": 148, + ".text": 148, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003114", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003114", + "objName": "HAL_CRG_GetPllFreq", + "sumSize": 108, + ".text": 108, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003180", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003180", + "objName": "HAL_CRG_GetCoreClkFreq", + "sumSize": 150, + ".text": 150, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003216", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003216", + "objName": "HAL_CRG_GetIpFreq", + "sumSize": 228, + ".text": 228, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x00000000030032fa", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030032fa", + "objName": "HAL_CRG_IpEnableSet", + "sumSize": 216, + ".text": 216, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x00000000030033d2", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030033d2", + "objName": "HAL_CRG_IpClkSelectSet", + "sumSize": 182, + ".text": 182, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003488", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003488", + "objName": "HAL_CRG_IpClkDivSet", + "sumSize": 182, + ".text": 182, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003542", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003542", + "objName": "CRG_GetAdcIpFreq", + "sumSize": 294, + ".text": 294, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003668", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003668", + "objName": "CRG_IsValidPllConfig", + "sumSize": 194, + ".text": 194, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x000000000300372a", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000300372a", + "objName": "CRG_IsValid1MHzConfig", + "sumSize": 82, + ".text": 82, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x000000000300377c", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000300377c", + "objName": "CRG_GetPllRefIni", + "sumSize": 42, + ".text": 42, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x00000000030037a6", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030037a6", + "objName": "CRG_GetPreDivValue", + "sumSize": 46, + ".text": 46, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x00000000030037d4", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030037d4", + "objName": "CRG_GetPllFbDivValue", + "sumSize": 66, + ".text": 66, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003816", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003816", + "objName": "CRG_GetPllPostDivValue", + "sumSize": 58, + ".text": 58, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003850", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003850", + "objName": "CRG_IpWoClkSelEnableSet", + "sumSize": 398, + ".text": 398, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x00000000030039de", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030039de", + "objName": "CRG_IpWoClkSelEnableGet", + "sumSize": 136, + ".text": 136, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003a6a", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003a6a", + "objName": "CRG_IpWoClkSelResetSet", + "sumSize": 266, + ".text": 266, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003b74", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003b74", + "objName": "CRG_IpWoClkSelResetGet", + "sumSize": 138, + ".text": 138, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003bfe", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003bfe", + "objName": "CRG_AdcEnableSet", + "sumSize": 182, + ".text": 182, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003cb4", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003cb4", + "objName": "CRG_AdcEnableGet", + "sumSize": 126, + ".text": 126, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003d32", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003d32", + "objName": "CRG_AdcClkSelectSet", + "sumSize": 254, + ".text": 254, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003e30", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003e30", + "objName": "CRG_AdcClkSelectGet", + "sumSize": 142, + ".text": 142, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003ebe", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003ebe", + "objName": "CRG_AdcDivSet", + "sumSize": 216, + ".text": 216, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003003f96", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003f96", + "objName": "CRG_AdcDivGet", + "sumSize": 150, + ".text": 150, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x000000000300402c", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000300402c", + "objName": "CRG_EfcEnableSet", + "sumSize": 128, + ".text": 128, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x00000000030040ac", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030040ac", + "objName": "CRG_EfcEnableGet", + "sumSize": 110, + ".text": 110, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x000000000300411a", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000300411a", + "objName": "CRG_AnaEnableSet", + "sumSize": 392, + ".text": 392, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x00000000030042a2", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030042a2", + "objName": "CRG_AnaEnableGet", + "sumSize": 130, + ".text": 130, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x00000000030064d8", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030064d8", + "objName": "0x00000000030064d8", + "sumSize": 88, + ".text": 88, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003006530", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003006530", + "objName": "0x0000000003006530", + "sumSize": 24, + ".text": 24, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000004000024", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000004000024", + "objName": "g_ipClkProc", + "sumSize": 216, + ".text": 0, + ".data": 216, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000004000494", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000004000494", + "objName": "g_crgBaseAddr", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 4, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000004000498", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000004000498", + "objName": "g_anaEnableFlag", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 1, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x000000000000028d", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000000028d", + "objName": "0x000000000000028d", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x00000000000032ca", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000000032ca", + "objName": "0x00000000000032ca", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 6532, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000000015410", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000000015410", + "objName": "0x0000000000015410", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 16804, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000000001271", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000000001271", + "objName": "0x0000000000001271", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 698, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000000000470", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000000000470", + "objName": "0x0000000000000470", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 488, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x00000000000076db", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000000076db", + "objName": "0x00000000000076db", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2817, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000000000390", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000000000390", + "objName": "0x0000000000000390", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 472, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000000000ed0", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000000000ed0", + "objName": "0x0000000000000ed0", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2060, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 6710, + ".data": 216, + ".bss": 5, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 13117, + ".debug_info": 16804, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 6710, + ".data": 216, + ".bss": 5, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 13117, + ".debug_info": 16804, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src", + "treeName": "-obj-drivers-debug\\src", + "objName": "debug\\src", + "sumSize": 2256, + "children": [ + { + "key": "\\obj\\drivers\\debug\\src\\debug.o", + "treeName": "-obj-drivers-debug\\src-debug.o", + "objName": "debug.o", + "sumSize": 2256, + "children": [ + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x0000000003004324", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000003004324", + "objName": "DBG_PrintCh", + "sumSize": 66, + ".text": 66, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x0000000003004366", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000003004366", + "objName": "DBG_PrintStr", + "sumSize": 74, + ".text": 74, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x00000000030043b0", + "treeName": "-obj-drivers-debug\\src-debug.o-0x00000000030043b0", + "objName": "DBG_Pow", + "sumSize": 64, + ".text": 64, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x00000000030043f0", + "treeName": "-obj-drivers-debug\\src-debug.o-0x00000000030043f0", + "objName": "DBG_CountDigits", + "sumSize": 104, + ".text": 104, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x0000000003004458", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000003004458", + "objName": "DBG_PutUnsignedNum", + "sumSize": 178, + ".text": 178, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x000000000300450a", + "treeName": "-obj-drivers-debug\\src-debug.o-0x000000000300450a", + "objName": "DBG_PrintInt", + "sumSize": 94, + ".text": 94, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x0000000003004568", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000003004568", + "objName": "DBG_PrintHex", + "sumSize": 68, + ".text": 68, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x00000000030045ac", + "treeName": "-obj-drivers-debug\\src-debug.o-0x00000000030045ac", + "objName": "DBG_PrintFlt", + "sumSize": 316, + ".text": 316, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x00000000030046e8", + "treeName": "-obj-drivers-debug\\src-debug.o-0x00000000030046e8", + "objName": "ParseSpecifier", + "sumSize": 412, + ".text": 412, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x0000000003004884", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000003004884", + "objName": "DBG_PrintIntWithField", + "sumSize": 282, + ".text": 282, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x000000000300499e", + "treeName": "-obj-drivers-debug\\src-debug.o-0x000000000300499e", + "objName": "DBG_Atoi", + "sumSize": 106, + ".text": 106, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x0000000003004a08", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000003004a08", + "objName": "DBG_UartPrintf", + "sumSize": 360, + ".text": 360, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x0000000003006548", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000003006548", + "objName": "0x0000000003006548", + "sumSize": 132, + ".text": 132, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x00000000000002bf", + "treeName": "-obj-drivers-debug\\src-debug.o-0x00000000000002bf", + "objName": "0x00000000000002bf", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x0000000000004c4e", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000000004c4e", + "objName": "0x0000000000004c4e", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1748, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x00000000000195b4", + "treeName": "-obj-drivers-debug\\src-debug.o-0x00000000000195b4", + "objName": "0x00000000000195b4", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 10268, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x000000000000152b", + "treeName": "-obj-drivers-debug\\src-debug.o-0x000000000000152b", + "objName": "0x000000000000152b", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 797, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x0000000000000658", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000000000658", + "objName": "0x0000000000000658", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 136, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x00000000000081dc", + "treeName": "-obj-drivers-debug\\src-debug.o-0x00000000000081dc", + "objName": "0x00000000000081dc", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3085, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x0000000000000568", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000000000568", + "objName": "0x0000000000000568", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 120, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\debug\\src\\debug.o\\0x00000000000016dc", + "treeName": "-obj-drivers-debug\\src-debug.o-0x00000000000016dc", + "objName": "0x00000000000016dc", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 520, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 2256, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 6456, + ".debug_info": 10268, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 2256, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 6456, + ".debug_info": 10268, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src", + "treeName": "-obj-drivers-iocmg\\src", + "objName": "iocmg\\src", + "sumSize": 1043, + "children": [ + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o", + "objName": "iocmg.o", + "sumSize": 1043, + "children": [ + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x0000000003004b70", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004b70", + "objName": "DCL_IOCMG_SetRegValue", + "sumSize": 68, + ".text": 68, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x0000000003004bb4", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004bb4", + "objName": "DCL_IOCMG_SetDriveRate", + "sumSize": 110, + ".text": 110, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x0000000003004c22", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004c22", + "objName": "DCL_IOCMG_SetPullMode", + "sumSize": 140, + ".text": 140, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x0000000003004cae", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004cae", + "objName": "DCL_IOCMG_SetLevelShiftRate", + "sumSize": 110, + ".text": 110, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x0000000003004d1c", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004d1c", + "objName": "DCL_IOCMG_SetSchmidtMode", + "sumSize": 110, + ".text": 110, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x0000000003004d8a", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004d8a", + "objName": "IOCMG_GetRegAddr", + "sumSize": 82, + ".text": 82, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x0000000003004ddc", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004ddc", + "objName": "HAL_IOCMG_SetPinAltFuncMode", + "sumSize": 58, + ".text": 58, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x0000000003004e16", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004e16", + "objName": "HAL_IOCMG_SetPinPullMode", + "sumSize": 76, + ".text": 76, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x0000000003004e62", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004e62", + "objName": "HAL_IOCMG_SetPinSchmidtMode", + "sumSize": 76, + ".text": 76, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x0000000003004eae", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004eae", + "objName": "HAL_IOCMG_SetPinLevelShiftRate", + "sumSize": 76, + ".text": 76, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x0000000003004efa", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004efa", + "objName": "HAL_IOCMG_SetPinDriveRate", + "sumSize": 76, + ".text": 76, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x00000000030065cc", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x00000000030065cc", + "objName": "0x00000000030065cc", + "sumSize": 61, + ".text": 61, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x00000000000002f1", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x00000000000002f1", + "objName": "0x00000000000002f1", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x0000000000005322", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000000005322", + "objName": "0x0000000000005322", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1973, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x000000000001bdd0", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x000000000001bdd0", + "objName": "0x000000000001bdd0", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 4863, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x0000000000001848", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000000001848", + "objName": "0x0000000000001848", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 702, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x00000000000006e0", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x00000000000006e0", + "objName": "0x00000000000006e0", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 296, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x0000000000008de9", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000000008de9", + "objName": "0x0000000000008de9", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3382, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x00000000000005e0", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x00000000000005e0", + "objName": "0x00000000000005e0", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 280, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\iocmg\\src\\iocmg.o\\0x00000000000018e4", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x00000000000018e4", + "objName": "0x00000000000018e4", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1228, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1043, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 7911, + ".debug_info": 4863, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1043, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 7911, + ".debug_info": 4863, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src", + "treeName": "-obj-drivers-timer\\src", + "objName": "timer\\src", + "sumSize": 1389, + "children": [ + { + "key": "\\obj\\drivers\\timer\\src\\timer.o", + "treeName": "-obj-drivers-timer\\src-timer.o", + "objName": "timer.o", + "sumSize": 1389, + "children": [ + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x0000000003004f46", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000003004f46", + "objName": "IsTimerMode", + "sumSize": 54, + ".text": 54, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x0000000003004f7c", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000003004f7c", + "objName": "IsTimerInterruptType", + "sumSize": 44, + ".text": 44, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x0000000003004fa8", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000003004fa8", + "objName": "IsTimerSize", + "sumSize": 44, + ".text": 44, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x0000000003004fd4", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000003004fd4", + "objName": "IsTimerPeriod", + "sumSize": 28, + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x0000000003004ff0", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000003004ff0", + "objName": "IsTimerDiv", + "sumSize": 54, + ".text": 54, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x0000000003005026", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000003005026", + "objName": "HAL_TIMER_Init", + "sumSize": 594, + ".text": 594, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x000000000300527c", + "treeName": "-obj-drivers-timer\\src-timer.o-0x000000000300527c", + "objName": "HAL_TIMER_Start", + "sumSize": 130, + ".text": 130, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x00000000030052fe", + "treeName": "-obj-drivers-timer\\src-timer.o-0x00000000030052fe", + "objName": "HAL_TIMER_IrqHandler", + "sumSize": 232, + ".text": 232, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x00000000030053e6", + "treeName": "-obj-drivers-timer\\src-timer.o-0x00000000030053e6", + "objName": "HAL_TIMER_RegisterCallback", + "sumSize": 148, + ".text": 148, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x000000000300660c", + "treeName": "-obj-drivers-timer\\src-timer.o-0x000000000300660c", + "objName": "0x000000000300660c", + "sumSize": 61, + ".text": 61, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x0000000000000323", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000000000323", + "objName": "0x0000000000000323", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x0000000000005ad7", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000000005ad7", + "objName": "0x0000000000005ad7", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2308, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x000000000001d0cf", + "treeName": "-obj-drivers-timer\\src-timer.o-0x000000000001d0cf", + "objName": "0x000000000001d0cf", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 2060, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x0000000000001b06", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000000001b06", + "objName": "0x0000000000001b06", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 496, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x0000000000000808", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000000000808", + "objName": "0x0000000000000808", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 152, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x0000000000009b1f", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000000009b1f", + "objName": "0x0000000000009b1f", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 1393, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x00000000000006f8", + "treeName": "-obj-drivers-timer\\src-timer.o-0x00000000000006f8", + "objName": "0x00000000000006f8", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 136, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\timer\\src\\timer.o\\0x0000000000001db0", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000000001db0", + "objName": "0x0000000000001db0", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 584, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1389, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3726, + ".debug_info": 3453, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1389, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3726, + ".debug_info": 3453, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src", + "treeName": "-obj-drivers-uart\\src", + "objName": "uart\\src", + "sumSize": 1439, + "children": [ + { + "key": "\\obj\\drivers\\uart\\src\\uart.o", + "treeName": "-obj-drivers-uart\\src-uart.o", + "objName": "uart.o", + "sumSize": 1439, + "children": [ + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x000000000300547a", + "treeName": "-obj-drivers-uart\\src-uart.o-0x000000000300547a", + "objName": "IsUartDatalength", + "sumSize": 28, + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x0000000003005496", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000003005496", + "objName": "IsUartStopbits", + "sumSize": 44, + ".text": 44, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x00000000030054c2", + "treeName": "-obj-drivers-uart\\src-uart.o-0x00000000030054c2", + "objName": "IsUartParitymode", + "sumSize": 34, + ".text": 34, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x00000000030054e4", + "treeName": "-obj-drivers-uart\\src-uart.o-0x00000000030054e4", + "objName": "IsUartTransmode", + "sumSize": 60, + ".text": 60, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x0000000003005520", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000003005520", + "objName": "IsUartFIFOThreshold", + "sumSize": 28, + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x000000000300553c", + "treeName": "-obj-drivers-uart\\src-uart.o-0x000000000300553c", + "objName": "IsUartOversampleMultiple", + "sumSize": 28, + ".text": 28, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x0000000003005558", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000003005558", + "objName": "DivClosest", + "sumSize": 62, + ".text": 62, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x0000000003005596", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000003005596", + "objName": "UART_SetParityBit", + "sumSize": 150, + ".text": 150, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x000000000300562c", + "treeName": "-obj-drivers-uart\\src-uart.o-0x000000000300562c", + "objName": "HAL_UART_Init", + "sumSize": 958, + ".text": 958, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x000000000300664c", + "treeName": "-obj-drivers-uart\\src-uart.o-0x000000000300664c", + "objName": "0x000000000300664c", + "sumSize": 20, + ".text": 20, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x0000000003006660", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000003006660", + "objName": "0x0000000003006660", + "sumSize": 27, + ".text": 27, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x0000000000000355", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000000000355", + "objName": "0x0000000000000355", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x00000000000063db", + "treeName": "-obj-drivers-uart\\src-uart.o-0x00000000000063db", + "objName": "0x00000000000063db", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 6128, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x000000000001d8db", + "treeName": "-obj-drivers-uart\\src-uart.o-0x000000000001d8db", + "objName": "0x000000000001d8db", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 11812, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x0000000000001cf6", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000000001cf6", + "objName": "0x0000000000001cf6", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 814, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x00000000000008a0", + "treeName": "-obj-drivers-uart\\src-uart.o-0x00000000000008a0", + "objName": "0x00000000000008a0", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 288, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x000000000000a090", + "treeName": "-obj-drivers-uart\\src-uart.o-0x000000000000a090", + "objName": "0x000000000000a090", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 1141, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x0000000000000780", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000000000780", + "objName": "0x0000000000000780", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 272, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x0000000000001ff8", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000000001ff8", + "objName": "0x0000000000001ff8", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1208, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1439, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 8760, + ".debug_info": 12953, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1439, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 8760, + ".debug_info": 12953, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ] + }, + { + "key": "\\obj\\user", + "treeName": "-obj-user", + "objName": "user", + "sumSize": 1236, + "children": [ + { + "key": "\\obj\\user\\main.o", + "treeName": "-obj-user-main.o", + "objName": "main.o", + "sumSize": 12, + "children": [ + { + "key": "\\obj\\user\\main.o\\0x00000000030059ea", + "treeName": "-obj-user-main.o-0x00000000030059ea", + "objName": "main", + "sumSize": 12, + ".text": 12, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\main.o\\0x000000000400049c", + "treeName": "-obj-user-main.o-0x000000000400049c", + "objName": "g_timer3", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 40, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\main.o\\0x00000000040004c4", + "treeName": "-obj-user-main.o-0x00000000040004c4", + "objName": "g_uart0", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 128, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\main.o\\0x0000000004000544", + "treeName": "-obj-user-main.o-0x0000000004000544", + "objName": "g_adc0", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 160, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\main.o\\0x0000000000000387", + "treeName": "-obj-user-main.o-0x0000000000000387", + "objName": "0x0000000000000387", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\main.o\\0x0000000000007bcb", + "treeName": "-obj-user-main.o-0x0000000000007bcb", + "objName": "0x0000000000007bcb", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 463, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\main.o\\0x00000000000206ff", + "treeName": "-obj-user-main.o-0x00000000000206ff", + "objName": "0x00000000000206ff", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 26806, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\main.o\\0x0000000000002024", + "treeName": "-obj-user-main.o-0x0000000000002024", + "objName": "0x0000000000002024", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 575, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\main.o\\0x00000000000009c0", + "treeName": "-obj-user-main.o-0x00000000000009c0", + "objName": "0x00000000000009c0", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 40, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\main.o\\0x000000000000a505", + "treeName": "-obj-user-main.o-0x000000000000a505", + "objName": "0x000000000000a505", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 39, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\main.o\\0x0000000000000890", + "treeName": "-obj-user-main.o-0x0000000000000890", + "objName": "0x0000000000000890", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 24, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\main.o\\0x00000000000024b0", + "treeName": "-obj-user-main.o-0x00000000000024b0", + "objName": "0x00000000000024b0", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 76, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 12, + ".data": 0, + ".bss": 328, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1228, + ".debug_info": 26845, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode", + "treeName": "-obj-user-generatecode", + "objName": "generatecode", + "sumSize": 1224, + "children": [ + { + "key": "\\obj\\user\\generatecode\\system_init.o", + "treeName": "-obj-user-generatecode-system_init.o", + "objName": "system_init.o", + "sumSize": 968, + "children": [ + { + "key": "\\obj\\user\\generatecode\\system_init.o\\0x00000000030059f6", + "treeName": "-obj-user-generatecode-system_init.o-0x00000000030059f6", + "objName": "CRG_Config", + "sumSize": 106, + ".text": 106, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\system_init.o\\0x0000000003005a60", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000003005a60", + "objName": "ADC0_Init", + "sumSize": 152, + ".text": 152, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\system_init.o\\0x0000000003005af8", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000003005af8", + "objName": "TIMER3_Init", + "sumSize": 254, + ".text": 254, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\system_init.o\\0x0000000003005bf6", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000003005bf6", + "objName": "UART0_Init", + "sumSize": 200, + ".text": 200, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\system_init.o\\0x0000000003005cc2", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000003005cc2", + "objName": "IOConfig", + "sumSize": 192, + ".text": 192, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\system_init.o\\0x0000000003005d96", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000003005d96", + "objName": "SystemInit", + "sumSize": 64, + ".text": 64, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\system_init.o\\0x00000000000003b9", + "treeName": "-obj-user-generatecode-system_init.o-0x00000000000003b9", + "objName": "0x00000000000003b9", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\system_init.o\\0x0000000000007d9a", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000000007d9a", + "objName": "0x0000000000007d9a", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1226, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\system_init.o\\0x0000000000026fb5", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000000026fb5", + "objName": "0x0000000000026fb5", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 38718, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\system_init.o\\0x0000000000002263", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000000002263", + "objName": "0x0000000000002263", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 748, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\system_init.o\\0x00000000000009e8", + "treeName": "-obj-user-generatecode-system_init.o-0x00000000000009e8", + "objName": "0x00000000000009e8", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 88, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\system_init.o\\0x000000000000a52c", + "treeName": "-obj-user-generatecode-system_init.o-0x000000000000a52c", + "objName": "0x000000000000a52c", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 112, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\system_init.o\\0x00000000000008a8", + "treeName": "-obj-user-generatecode-system_init.o-0x00000000000008a8", + "objName": "0x00000000000008a8", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 72, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\system_init.o\\0x00000000000024fc", + "treeName": "-obj-user-generatecode-system_init.o-0x00000000000024fc", + "objName": "0x00000000000024fc", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 304, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 968, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2488, + ".debug_info": 38830, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\tim_adc.o", + "treeName": "-obj-user-generatecode-tim_adc.o", + "objName": "tim_adc.o", + "sumSize": 256, + "children": [ + { + "key": "\\obj\\user\\generatecode\\tim_adc.o\\0x0000000003005dd6", + "treeName": "-obj-user-generatecode-tim_adc.o-0x0000000003005dd6", + "objName": "TIMER3_InterruptProcess", + "sumSize": 232, + ".text": 232, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\tim_adc.o\\0x000000000300667c", + "treeName": "-obj-user-generatecode-tim_adc.o-0x000000000300667c", + "objName": "0x000000000300667c", + "sumSize": 24, + ".text": 24, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\tim_adc.o\\0x00000000040005e4", + "treeName": "-obj-user-generatecode-tim_adc.o-0x00000000040005e4", + "objName": "adc_num", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 7200, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\tim_adc.o\\0x0000000004002204", + "treeName": "-obj-user-generatecode-tim_adc.o-0x0000000004002204", + "objName": "i", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 4, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\tim_adc.o\\0x00000000000003eb", + "treeName": "-obj-user-generatecode-tim_adc.o-0x00000000000003eb", + "objName": "0x00000000000003eb", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\tim_adc.o\\0x0000000000008264", + "treeName": "-obj-user-generatecode-tim_adc.o-0x0000000000008264", + "objName": "0x0000000000008264", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 516, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\tim_adc.o\\0x00000000000306f3", + "treeName": "-obj-user-generatecode-tim_adc.o-0x00000000000306f3", + "objName": "0x00000000000306f3", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 26801, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\tim_adc.o\\0x0000000000000a40", + "treeName": "-obj-user-generatecode-tim_adc.o-0x0000000000000a40", + "objName": "0x0000000000000a40", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 40, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\tim_adc.o\\0x000000000000254f", + "treeName": "-obj-user-generatecode-tim_adc.o-0x000000000000254f", + "objName": "0x000000000000254f", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 635, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\tim_adc.o\\0x000000000000a59c", + "treeName": "-obj-user-generatecode-tim_adc.o-0x000000000000a59c", + "objName": "0x000000000000a59c", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 0, + ".debug_info": 39, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\tim_adc.o\\0x00000000000008f0", + "treeName": "-obj-user-generatecode-tim_adc.o-0x00000000000008f0", + "objName": "0x00000000000008f0", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 24, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\generatecode\\tim_adc.o\\0x000000000000262c", + "treeName": "-obj-user-generatecode-tim_adc.o-0x000000000000262c", + "objName": "0x000000000000262c", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 84, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 256, + ".data": 0, + ".bss": 7204, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 1349, + ".debug_info": 26840, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1224, + ".data": 0, + ".bss": 7204, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3837, + ".debug_info": 65670, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1236, + ".data": 0, + ".bss": 7532, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 5065, + ".debug_info": 92515, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ] + } + ], + "folderTreeNames": [ + "-obj", + "-obj-chip\\3061m", + "-obj-chip\\3061m-startup.o", + "-obj-chip\\3061m-startup.o-0x0000000003000000", + "-obj-chip\\3061m-startup.o-0x0000000003000004", + "-obj-chip\\3061m-startup.o-0x0000000003006794", + "-obj-chip\\3061m-startup.o-0x000000000300679c", + "-obj-chip\\3061m-chipinit", + "-obj-chip\\3061m-chipinit-chipinit.o", + "-obj-chip\\3061m-chipinit-chipinit.o-0x0000000003000704", + "-obj-chip\\3061m-chipinit-chipinit.o-0x000000000300070c", + "-obj-chip\\3061m-chipinit-chipinit.o-0x0000000000000031", + "-obj-chip\\3061m-chipinit-chipinit.o-0x00000000000008cc", + "-obj-chip\\3061m-chipinit-chipinit.o-0x0000000000000026", + "-obj-chip\\3061m-chipinit-chipinit.o-0x0000000000000014", + "-obj-chip\\3061m-chipinit-anatrim", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x000000000300074c", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x000000000300077a", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x00000000030007c4", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000003000cd4", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x00000000030061fc", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000004000020", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000000000063", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000000000a27", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000000003ff2", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x00000000000001d7", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000000000020", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000000002f8d", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000000000070", + "-obj-chip\\3061m-chipinit-anavrefinit", + "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o", + "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000003000d26", + "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000000000095", + "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000000000cfe", + "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000000008d89", + "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000000000420", + "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000000000050", + "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000000000090", + "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000000000130", + "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x00000000000035ca", + "-obj-chip\\3061m-chipinit-crginit", + "-obj-chip\\3061m-chipinit-crginit-crginit.o", + "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x0000000003000d84", + "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x00000000000000c7", + "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x0000000000000dc3", + "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x0000000000009038", + "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x00000000000004ff", + "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x0000000000003657", + "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x0000000000000060", + "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x0000000000000164", + "-obj-chip\\3061m-chipinit-flashinit", + "-obj-chip\\3061m-chipinit-flashinit-flashinit.o", + "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000003000dca", + "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000003000e5c", + "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000003000ec0", + "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x00000000000000f9", + "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000000000f29", + "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x000000000000b70d", + "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000000000671", + "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x000000000000463b", + "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000000000078", + "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x00000000000001bc", + "-obj-chip\\3061m-chipinit-systickinit", + "-obj-chip\\3061m-chipinit-systickinit-systickinit.o", + "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x0000000003000f84", + "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x0000000003000fa6", + "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x000000000000012b", + "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x00000000000010bb", + "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x000000000000c82b", + "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x00000000000007da", + "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x0000000000000108", + "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x0000000000004f45", + "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x0000000000000098", + "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x0000000000000234", + "-obj-chip\\3061m-fotp", + "-obj-chip\\3061m-fotp-fotp_info_read.o", + "-obj-chip\\3061m-fotp-fotp_info_read.o-0x0000000003000fc2", + "-obj-chip\\3061m-fotp-fotp_info_read.o-0x0000000003001046", + "-obj-chip\\3061m-fotp-fotp_info_read.o-0x000000000000015d", + "-obj-chip\\3061m-fotp-fotp_info_read.o-0x0000000000001165", + "-obj-chip\\3061m-fotp-fotp_info_read.o-0x000000000000c9c9", + "-obj-chip\\3061m-fotp-fotp_info_read.o-0x00000000000008aa", + "-obj-chip\\3061m-fotp-fotp_info_read.o-0x00000000000000b0", + "-obj-chip\\3061m-fotp-fotp_info_read.o-0x000000000000500d", + "-obj-chip\\3061m-fotp-fotp_info_read.o-0x0000000000000288", + "-obj-chip\\3061m-ip_crg", + "-obj-chip\\3061m-ip_crg-ip_crg_common.o", + "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x00000000030011a8", + "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x0000000003006200", + "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x000000000000018f", + "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x000000000000136e", + "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x000000000000db1b", + "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x0000000000000158", + "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x00000000000050c2", + "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x00000000000000c8", + "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x00000000000002e0", + "-obj-drivers", + "-obj-drivers-adc\\src", + "-obj-drivers-adc\\src-adc.o", + "-obj-drivers-adc\\src-adc.o-0x000000000300120c", + "-obj-drivers-adc\\src-adc.o-0x0000000003001228", + "-obj-drivers-adc\\src-adc.o-0x0000000003001244", + "-obj-drivers-adc\\src-adc.o-0x0000000003001260", + "-obj-drivers-adc\\src-adc.o-0x000000000300127c", + "-obj-drivers-adc\\src-adc.o-0x00000000030012a8", + "-obj-drivers-adc\\src-adc.o-0x00000000030012c6", + "-obj-drivers-adc\\src-adc.o-0x00000000030012e2", + "-obj-drivers-adc\\src-adc.o-0x0000000003001326", + "-obj-drivers-adc\\src-adc.o-0x00000000030013a2", + "-obj-drivers-adc\\src-adc.o-0x0000000003001420", + "-obj-drivers-adc\\src-adc.o-0x000000000300149c", + "-obj-drivers-adc\\src-adc.o-0x000000000300151a", + "-obj-drivers-adc\\src-adc.o-0x000000000300158e", + "-obj-drivers-adc\\src-adc.o-0x00000000030015c4", + "-obj-drivers-adc\\src-adc.o-0x0000000003001672", + "-obj-drivers-adc\\src-adc.o-0x0000000003001718", + "-obj-drivers-adc\\src-adc.o-0x00000000030017c6", + "-obj-drivers-adc\\src-adc.o-0x000000000300183e", + "-obj-drivers-adc\\src-adc.o-0x00000000030018a2", + "-obj-drivers-adc\\src-adc.o-0x000000000300191c", + "-obj-drivers-adc\\src-adc.o-0x000000000300199a", + "-obj-drivers-adc\\src-adc.o-0x0000000003001a1a", + "-obj-drivers-adc\\src-adc.o-0x0000000003001acc", + "-obj-drivers-adc\\src-adc.o-0x0000000003001c7e", + "-obj-drivers-adc\\src-adc.o-0x0000000003001daa", + "-obj-drivers-adc\\src-adc.o-0x0000000003001e2c", + "-obj-drivers-adc\\src-adc.o-0x0000000003006428", + "-obj-drivers-adc\\src-adc.o-0x00000000000001c1", + "-obj-drivers-adc\\src-adc.o-0x000000000000140b", + "-obj-drivers-adc\\src-adc.o-0x000000000000dc4b", + "-obj-drivers-adc\\src-adc.o-0x0000000000000b19", + "-obj-drivers-adc\\src-adc.o-0x00000000000000d8", + "-obj-drivers-adc\\src-adc.o-0x0000000000000178", + "-obj-drivers-adc\\src-adc.o-0x00000000000051ad", + "-obj-drivers-adc\\src-adc.o-0x0000000000000310", + "-obj-drivers-base\\src", + "-obj-drivers-base\\src-assert.o", + "-obj-drivers-base\\src-assert.o-0x0000000003001eae", + "-obj-drivers-base\\src-assert.o-0x00000000000001f3", + "-obj-drivers-base\\src-assert.o-0x00000000000029b9", + "-obj-drivers-base\\src-assert.o-0x000000000001427e", + "-obj-drivers-base\\src-assert.o-0x0000000000000e45", + "-obj-drivers-base\\src-assert.o-0x0000000000000340", + "-obj-drivers-base\\src-assert.o-0x0000000000007103", + "-obj-drivers-base\\src-assert.o-0x0000000000000290", + "-obj-drivers-base\\src-assert.o-0x0000000000000aa4", + "-obj-drivers-base\\src-clock.o", + "-obj-drivers-base\\src-clock.o-0x0000000003001ec4", + "-obj-drivers-base\\src-clock.o-0x0000000003001ed8", + "-obj-drivers-base\\src-clock.o-0x0000000003001f34", + "-obj-drivers-base\\src-clock.o-0x0000000003001f6c", + "-obj-drivers-base\\src-clock.o-0x0000000003001fa4", + "-obj-drivers-base\\src-clock.o-0x0000000000000225", + "-obj-drivers-base\\src-clock.o-0x0000000000002a0c", + "-obj-drivers-base\\src-clock.o-0x00000000000142ff", + "-obj-drivers-base\\src-clock.o-0x0000000000000ea1", + "-obj-drivers-base\\src-clock.o-0x0000000000000360", + "-obj-drivers-base\\src-clock.o-0x0000000000007139", + "-obj-drivers-base\\src-clock.o-0x00000000000002a0", + "-obj-drivers-base\\src-clock.o-0x0000000000000ad4", + "-obj-drivers-base\\src-interrupt.o", + "-obj-drivers-base\\src-interrupt.o-0x0000000003001ff6", + "-obj-drivers-base\\src-interrupt.o-0x0000000003002016", + "-obj-drivers-base\\src-interrupt.o-0x000000000300205a", + "-obj-drivers-base\\src-interrupt.o-0x00000000030020b2", + "-obj-drivers-base\\src-interrupt.o-0x0000000003002138", + "-obj-drivers-base\\src-interrupt.o-0x0000000003002266", + "-obj-drivers-base\\src-interrupt.o-0x0000000003002278", + "-obj-drivers-base\\src-interrupt.o-0x0000000003002286", + "-obj-drivers-base\\src-interrupt.o-0x00000000030022a4", + "-obj-drivers-base\\src-interrupt.o-0x00000000030022d8", + "-obj-drivers-base\\src-interrupt.o-0x00000000030025a2", + "-obj-drivers-base\\src-interrupt.o-0x0000000003002886", + "-obj-drivers-base\\src-interrupt.o-0x00000000030028fa", + "-obj-drivers-base\\src-interrupt.o-0x000000000300290c", + "-obj-drivers-base\\src-interrupt.o-0x0000000003006478", + "-obj-drivers-base\\src-interrupt.o-0x0000000003006498", + "-obj-drivers-base\\src-interrupt.o-0x00000000030064b8", + "-obj-drivers-base\\src-interrupt.o-0x00000000040000fc", + "-obj-drivers-base\\src-interrupt.o-0x0000000000000257", + "-obj-drivers-base\\src-interrupt.o-0x0000000000002bcb", + "-obj-drivers-base\\src-interrupt.o-0x00000000000145d0", + "-obj-drivers-base\\src-interrupt.o-0x0000000000000ffc", + "-obj-drivers-base\\src-interrupt.o-0x00000000000003a8", + "-obj-drivers-base\\src-interrupt.o-0x000000000000720d", + "-obj-drivers-base\\src-interrupt.o-0x00000000000002d8", + "-obj-drivers-base\\src-interrupt.o-0x0000000000000bb8", + "-obj-drivers-crg\\src", + "-obj-drivers-crg\\src-crg.o", + "-obj-drivers-crg\\src-crg.o-0x0000000003002952", + "-obj-drivers-crg\\src-crg.o-0x000000000300297a", + "-obj-drivers-crg\\src-crg.o-0x00000000030029a4", + "-obj-drivers-crg\\src-crg.o-0x00000000030029d0", + "-obj-drivers-crg\\src-crg.o-0x00000000030029ec", + "-obj-drivers-crg\\src-crg.o-0x0000000003002a08", + "-obj-drivers-crg\\src-crg.o-0x0000000003002a24", + "-obj-drivers-crg\\src-crg.o-0x0000000003002a40", + "-obj-drivers-crg\\src-crg.o-0x0000000003002a76", + "-obj-drivers-crg\\src-crg.o-0x0000000003002aa2", + "-obj-drivers-crg\\src-crg.o-0x0000000003002abe", + "-obj-drivers-crg\\src-crg.o-0x0000000003002b1c", + "-obj-drivers-crg\\src-crg.o-0x0000000003002ba6", + "-obj-drivers-crg\\src-crg.o-0x0000000003002bee", + "-obj-drivers-crg\\src-crg.o-0x0000000003002c36", + "-obj-drivers-crg\\src-crg.o-0x0000000003002c76", + "-obj-drivers-crg\\src-crg.o-0x0000000003002cb6", + "-obj-drivers-crg\\src-crg.o-0x0000000003002d2a", + "-obj-drivers-crg\\src-crg.o-0x0000000003002ff2", + "-obj-drivers-crg\\src-crg.o-0x0000000003003080", + "-obj-drivers-crg\\src-crg.o-0x0000000003003114", + "-obj-drivers-crg\\src-crg.o-0x0000000003003180", + "-obj-drivers-crg\\src-crg.o-0x0000000003003216", + "-obj-drivers-crg\\src-crg.o-0x00000000030032fa", + "-obj-drivers-crg\\src-crg.o-0x00000000030033d2", + "-obj-drivers-crg\\src-crg.o-0x0000000003003488", + "-obj-drivers-crg\\src-crg.o-0x0000000003003542", + "-obj-drivers-crg\\src-crg.o-0x0000000003003668", + "-obj-drivers-crg\\src-crg.o-0x000000000300372a", + "-obj-drivers-crg\\src-crg.o-0x000000000300377c", + "-obj-drivers-crg\\src-crg.o-0x00000000030037a6", + "-obj-drivers-crg\\src-crg.o-0x00000000030037d4", + "-obj-drivers-crg\\src-crg.o-0x0000000003003816", + "-obj-drivers-crg\\src-crg.o-0x0000000003003850", + "-obj-drivers-crg\\src-crg.o-0x00000000030039de", + "-obj-drivers-crg\\src-crg.o-0x0000000003003a6a", + "-obj-drivers-crg\\src-crg.o-0x0000000003003b74", + "-obj-drivers-crg\\src-crg.o-0x0000000003003bfe", + "-obj-drivers-crg\\src-crg.o-0x0000000003003cb4", + "-obj-drivers-crg\\src-crg.o-0x0000000003003d32", + "-obj-drivers-crg\\src-crg.o-0x0000000003003e30", + "-obj-drivers-crg\\src-crg.o-0x0000000003003ebe", + "-obj-drivers-crg\\src-crg.o-0x0000000003003f96", + "-obj-drivers-crg\\src-crg.o-0x000000000300402c", + "-obj-drivers-crg\\src-crg.o-0x00000000030040ac", + "-obj-drivers-crg\\src-crg.o-0x000000000300411a", + "-obj-drivers-crg\\src-crg.o-0x00000000030042a2", + "-obj-drivers-crg\\src-crg.o-0x00000000030064d8", + "-obj-drivers-crg\\src-crg.o-0x0000000003006530", + "-obj-drivers-crg\\src-crg.o-0x0000000004000024", + "-obj-drivers-crg\\src-crg.o-0x0000000004000494", + "-obj-drivers-crg\\src-crg.o-0x0000000004000498", + "-obj-drivers-crg\\src-crg.o-0x000000000000028d", + "-obj-drivers-crg\\src-crg.o-0x00000000000032ca", + "-obj-drivers-crg\\src-crg.o-0x0000000000015410", + "-obj-drivers-crg\\src-crg.o-0x0000000000001271", + "-obj-drivers-crg\\src-crg.o-0x0000000000000470", + "-obj-drivers-crg\\src-crg.o-0x00000000000076db", + "-obj-drivers-crg\\src-crg.o-0x0000000000000390", + "-obj-drivers-crg\\src-crg.o-0x0000000000000ed0", + "-obj-drivers-debug\\src", + "-obj-drivers-debug\\src-debug.o", + "-obj-drivers-debug\\src-debug.o-0x0000000003004324", + "-obj-drivers-debug\\src-debug.o-0x0000000003004366", + "-obj-drivers-debug\\src-debug.o-0x00000000030043b0", + "-obj-drivers-debug\\src-debug.o-0x00000000030043f0", + "-obj-drivers-debug\\src-debug.o-0x0000000003004458", + "-obj-drivers-debug\\src-debug.o-0x000000000300450a", + "-obj-drivers-debug\\src-debug.o-0x0000000003004568", + "-obj-drivers-debug\\src-debug.o-0x00000000030045ac", + "-obj-drivers-debug\\src-debug.o-0x00000000030046e8", + "-obj-drivers-debug\\src-debug.o-0x0000000003004884", + "-obj-drivers-debug\\src-debug.o-0x000000000300499e", + "-obj-drivers-debug\\src-debug.o-0x0000000003004a08", + "-obj-drivers-debug\\src-debug.o-0x0000000003006548", + "-obj-drivers-debug\\src-debug.o-0x00000000000002bf", + "-obj-drivers-debug\\src-debug.o-0x0000000000004c4e", + "-obj-drivers-debug\\src-debug.o-0x00000000000195b4", + "-obj-drivers-debug\\src-debug.o-0x000000000000152b", + "-obj-drivers-debug\\src-debug.o-0x0000000000000658", + "-obj-drivers-debug\\src-debug.o-0x00000000000081dc", + "-obj-drivers-debug\\src-debug.o-0x0000000000000568", + "-obj-drivers-debug\\src-debug.o-0x00000000000016dc", + "-obj-drivers-iocmg\\src", + "-obj-drivers-iocmg\\src-iocmg.o", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004b70", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004bb4", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004c22", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004cae", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004d1c", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004d8a", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004ddc", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004e16", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004e62", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004eae", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003004efa", + "-obj-drivers-iocmg\\src-iocmg.o-0x00000000030065cc", + "-obj-drivers-iocmg\\src-iocmg.o-0x00000000000002f1", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000000005322", + "-obj-drivers-iocmg\\src-iocmg.o-0x000000000001bdd0", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000000001848", + "-obj-drivers-iocmg\\src-iocmg.o-0x00000000000006e0", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000000008de9", + "-obj-drivers-iocmg\\src-iocmg.o-0x00000000000005e0", + "-obj-drivers-iocmg\\src-iocmg.o-0x00000000000018e4", + "-obj-drivers-timer\\src", + "-obj-drivers-timer\\src-timer.o", + "-obj-drivers-timer\\src-timer.o-0x0000000003004f46", + "-obj-drivers-timer\\src-timer.o-0x0000000003004f7c", + "-obj-drivers-timer\\src-timer.o-0x0000000003004fa8", + "-obj-drivers-timer\\src-timer.o-0x0000000003004fd4", + "-obj-drivers-timer\\src-timer.o-0x0000000003004ff0", + "-obj-drivers-timer\\src-timer.o-0x0000000003005026", + "-obj-drivers-timer\\src-timer.o-0x000000000300527c", + "-obj-drivers-timer\\src-timer.o-0x00000000030052fe", + "-obj-drivers-timer\\src-timer.o-0x00000000030053e6", + "-obj-drivers-timer\\src-timer.o-0x000000000300660c", + "-obj-drivers-timer\\src-timer.o-0x0000000000000323", + "-obj-drivers-timer\\src-timer.o-0x0000000000005ad7", + "-obj-drivers-timer\\src-timer.o-0x000000000001d0cf", + "-obj-drivers-timer\\src-timer.o-0x0000000000001b06", + "-obj-drivers-timer\\src-timer.o-0x0000000000000808", + "-obj-drivers-timer\\src-timer.o-0x0000000000009b1f", + "-obj-drivers-timer\\src-timer.o-0x00000000000006f8", + "-obj-drivers-timer\\src-timer.o-0x0000000000001db0", + "-obj-drivers-uart\\src", + "-obj-drivers-uart\\src-uart.o", + "-obj-drivers-uart\\src-uart.o-0x000000000300547a", + "-obj-drivers-uart\\src-uart.o-0x0000000003005496", + "-obj-drivers-uart\\src-uart.o-0x00000000030054c2", + "-obj-drivers-uart\\src-uart.o-0x00000000030054e4", + "-obj-drivers-uart\\src-uart.o-0x0000000003005520", + "-obj-drivers-uart\\src-uart.o-0x000000000300553c", + "-obj-drivers-uart\\src-uart.o-0x0000000003005558", + "-obj-drivers-uart\\src-uart.o-0x0000000003005596", + "-obj-drivers-uart\\src-uart.o-0x000000000300562c", + "-obj-drivers-uart\\src-uart.o-0x000000000300664c", + "-obj-drivers-uart\\src-uart.o-0x0000000003006660", + "-obj-drivers-uart\\src-uart.o-0x0000000000000355", + "-obj-drivers-uart\\src-uart.o-0x00000000000063db", + "-obj-drivers-uart\\src-uart.o-0x000000000001d8db", + "-obj-drivers-uart\\src-uart.o-0x0000000000001cf6", + "-obj-drivers-uart\\src-uart.o-0x00000000000008a0", + "-obj-drivers-uart\\src-uart.o-0x000000000000a090", + "-obj-drivers-uart\\src-uart.o-0x0000000000000780", + "-obj-drivers-uart\\src-uart.o-0x0000000000001ff8", + "-obj-user", + "-obj-user-main.o", + "-obj-user-main.o-0x00000000030059ea", + "-obj-user-main.o-0x000000000400049c", + "-obj-user-main.o-0x00000000040004c4", + "-obj-user-main.o-0x0000000004000544", + "-obj-user-main.o-0x0000000000000387", + "-obj-user-main.o-0x0000000000007bcb", + "-obj-user-main.o-0x00000000000206ff", + "-obj-user-main.o-0x0000000000002024", + "-obj-user-main.o-0x00000000000009c0", + "-obj-user-main.o-0x000000000000a505", + "-obj-user-main.o-0x0000000000000890", + "-obj-user-main.o-0x00000000000024b0", + "-obj-user-generatecode", + "-obj-user-generatecode-system_init.o", + "-obj-user-generatecode-system_init.o-0x00000000030059f6", + "-obj-user-generatecode-system_init.o-0x0000000003005a60", + "-obj-user-generatecode-system_init.o-0x0000000003005af8", + "-obj-user-generatecode-system_init.o-0x0000000003005bf6", + "-obj-user-generatecode-system_init.o-0x0000000003005cc2", + "-obj-user-generatecode-system_init.o-0x0000000003005d96", + "-obj-user-generatecode-system_init.o-0x00000000000003b9", + "-obj-user-generatecode-system_init.o-0x0000000000007d9a", + "-obj-user-generatecode-system_init.o-0x0000000000026fb5", + "-obj-user-generatecode-system_init.o-0x0000000000002263", + "-obj-user-generatecode-system_init.o-0x00000000000009e8", + "-obj-user-generatecode-system_init.o-0x000000000000a52c", + "-obj-user-generatecode-system_init.o-0x00000000000008a8", + "-obj-user-generatecode-system_init.o-0x00000000000024fc", + "-obj-user-generatecode-tim_adc.o", + "-obj-user-generatecode-tim_adc.o-0x0000000003005dd6", + "-obj-user-generatecode-tim_adc.o-0x000000000300667c", + "-obj-user-generatecode-tim_adc.o-0x00000000040005e4", + "-obj-user-generatecode-tim_adc.o-0x0000000004002204", + "-obj-user-generatecode-tim_adc.o-0x00000000000003eb", + "-obj-user-generatecode-tim_adc.o-0x0000000000008264", + "-obj-user-generatecode-tim_adc.o-0x00000000000306f3", + "-obj-user-generatecode-tim_adc.o-0x0000000000000a40", + "-obj-user-generatecode-tim_adc.o-0x000000000000254f", + "-obj-user-generatecode-tim_adc.o-0x000000000000a59c", + "-obj-user-generatecode-tim_adc.o-0x00000000000008f0", + "-obj-user-generatecode-tim_adc.o-0x000000000000262c" + ], + "textSize": 0, + "dataSize": 0, + "rodotatSize": 0 +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/board.bak b/vendor/others/demo/5-tim_adc/demo/board.bak new file mode 100644 index 000000000..a51c221cd --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/board.bak @@ -0,0 +1 @@ +{"all":{"CLOCKSettings":{"HOSC":"25","LOSC":"32","adc_clk_mode":"clk_adc_div0","clk_1m_ini_clksel":"clk_hosc","clk_1m":"1","clk_cs":"/25","clk_gpt0":"150","clk_gpt1":"150","clk_gpt2":"150","clk_adc":"100","clk_adc_div0":"100","clk_adc_div1":"150","clk_tcxo":"30","clk_hosc":"25","clk_pst1_sw_sel":"clk_pst1","clk_pst2_sw_sel":"clk_pst2","clk_spi0":"150","clk_spi1":"150","clk_timer0":"150","clk_timer1":"150","clk_timer2":"150","clk_timer3":"150","clk_uart0":"150","clk_uart1":"150","clk_uart2":"150","clk_uart3":"150","clk_iwdg":"32","clk_wwdg":"150","clk_can":"25","pll_div":"X48","pll_postdiv1":"/2","pll_postdiv2":"/3","pll_prediv":"/4","pll_ref_cksel":"HOSC","clk_cmm":"150","clk_dma":"150","clk_qdm1":"150","clk_qdm0":"150","clk_crc":"150","clk_capm2":"150","clk_capm1":"150","clk_capm0":"150","clk_apt3":"150","clk_apt2":"150","clk_apt1":"150","clk_apt0":"150","clk_gpt3":"150","clk_gpio3":"150","clk_gpio2":"150","clk_gpio1":"150","clk_gpio0":"150","clk_eflash":"150","clk_gpio5":"150","clk_gpio4":"150","clk_i2c0":"150","clk_i2c1":"150","clk_pst1":"150","clk_pst2":"100","clk_adc_cksel0":"/1","clk_adc_cksel1":"/1"},"SAMPLE Settings":{"Gpio Key":{"Name":"Gpio Key","Type":"Driver","SampleDir":"application/drivers_sample/gpio/sample_gpio_key","SampleDirName":"sample_gpio_key","SampleFunction":"GPIO_KeySample()","SampleHead":"#include \"gpio_key_sample.h\"","Enable":"disable","key":26},"Blank Main":{"Name":"Blank Main","Type":"Default","Extend Board":"Default","Extend Module":"Default","SampleDir":"","SampleDirName":"blank_main","SampleFunction":"SystemInit()","Enable":"enable","key":0},"Pmsm Sensorless 2shunt Foc":{"Name":"Pmsm Sensorless 2shunt Foc","Type":"Motor","SampleDir":"application/middleware_sample/pmsm_sensorless_2shunt_foc","SampleDirName":"pmsm_sensorless_2shunt_foc","SampleFunction":"MotorMainProcess()","SampleHead":"#include \"mcs_motor_process.h\"","Enable":"disable","key":1},"Pmsm Sensorless Foc 2shunt HV":{"Name":"Pmsm Sensorless Foc 2shunt HV","Type":"Motor","SampleDir":"application/middleware_sample/pmsm_sensorless_foc_2shunt_hv","SampleDirName":"pmsm_sensorless_foc_2shunt_hv","SampleFunction":"MotorMainProcess()","SampleHead":"#include \"mcs_motor_process.h\"","Enable":"disable","key":2},"Pmsm Encode Qdm 2shunt Foc":{"Name":"Pmsm Encode Qdm 2shunt Foc","Type":"Motor","Extend Board":"ECBMOTORA","Extend Module":"Motor : JMK-42JSF630AS-1000","SampleDir":"application/middleware_sample/pmsm_encode_qdm_2shunt_foc","SampleDirName":"pmsm_encode_qdm_2shunt_foc","SampleFunction":"MotorMainProcess()","SampleHead":"#include \"mcs_motor_process.h\"","Enable":"disable","key":3},"Acmp Interrupt":{"Name":"Acmp Interrupt","Type":"Driver","SampleDir":"application/drivers_sample/acmp/sample_acmp_interrupt","SampleDirName":"sample_acmp_interrupt","SampleFunction":"ACMP_CompareInt()","SampleHead":"#include \"sample_acmp_interrupt.h\"","Enable":"disable","key":4},"Acmp Out Result":{"Name":"Acmp Out Result","Type":"Driver","SampleDir":"application/drivers_sample/acmp/sample_acmp_out_result","SampleDirName":"sample_acmp_out_result","SampleFunction":"ACMP_CompareResultOutput()","SampleHead":"#include \"sample_acmp_out_result.h\"","Enable":"disable","key":5},"Adc single with ppb":{"Name":"Adc single with ppb","Type":"Driver","SampleDir":"application/drivers_sample/adc/sample_adc_single_with_ppb","SampleDirName":"sample_adc_single_with_ppb","SampleFunction":"ADC_SingleTriggerItWithPPB()","SampleHead":"#include \"sample_adc_single_with_ppb.h\"","Enable":"disable","key":6},"Adc Associativetrigger Of Apt":{"Name":"Adc Associativetrigger Of Apt","Type":"Driver","SampleDir":"application/drivers_sample/adc/sample_adc_associative_trigger_of_apt","SampleDirName":"sample_adc_associative_trigger_of_apt","SampleFunction":"ADC_AptTrigger()","SampleHead":"#include \"sample_adc_associative_trigger_apt.h\"","Enable":"disable","key":7},"Adc Continuetrigger":{"Name":"Adc Continuetrigger","Type":"Driver","SampleDir":"application/drivers_sample/adc/sample_adc_continue_trigger","SampleDirName":"sample_adc_continue_trigger","SampleFunction":"ADC_ContinueSample()","SampleHead":"#include \"sample_adc_continue_trigger.h\"","Enable":"disable","key":8},"Adc oversampling It":{"Name":"Adc oversampling It","Type":"Driver","SampleDir":"application/drivers_sample/adc/sample_adc_oversampling_it","SampleDirName":"sample_adc_oversampling_it","SampleFunction":"ADC_OverSamplingIt()","SampleHead":"#include \"sample_adc_oversampling_it.h\"","Enable":"disable","key":9},"Adc Singletrigger":{"Name":"Adc Singletrigger","Type":"Driver","SampleDir":"application/drivers_sample/adc/sample_adc_single_trigger","SampleDirName":"sample_adc_single_trigger","SampleFunction":"ADC_SingleTrigger()","SampleHead":"#include \"sample_adc_single_trigger.h\"","Enable":"disable","key":10},"Adc Singletrigger Dma":{"Name":"Adc Singletrigger Dma","Type":"Driver","SampleDir":"application/drivers_sample/adc/sample_adc_single_trigger_dma","SampleDirName":"sample_adc_single_trigger_dma","SampleFunction":"ADC_SingleTriggerDma()","SampleHead":"#include \"sample_adc_single_trigger_dma.h\"","Enable":"disable","key":11},"Adc Singletrigger It":{"Name":"Adc Singletrigger It","Type":"Driver","SampleDir":"application/drivers_sample/adc/sample_adc_single_trigger_it","SampleDirName":"sample_adc_single_trigger_it","SampleFunction":"ADC_SingleTriggerIT()","SampleHead":"#include \"sample_adc_single_trigger_it.h\"","Enable":"disable","key":12},"Apt Single Resistor Sampling":{"Name":"Apt Single Resistor Sampling","Type":"Driver","SampleDir":"application/drivers_sample/apt/sample_apt_single_resistor","SampleDirName":"sample_apt_single_resistor","SampleFunction":"APT_PWMInitHALSample()","SampleHead":"#include \"sample_apt_single_resistor.h\"","Enable":"disable","key":13},"CAN Sample":{"Name":"CAN Sample","Type":"Driver","SampleDir":"application/drivers_sample/can/sample_can_send_receive","SampleDirName":"sample_can_send_receive","SampleFunction":"CAN_ReceiveFilter()","SampleHead":"#include \"sample_can_send_receive.h\"","Enable":"disable","key":14},"Capm Sample":{"Name":"Capm Sample","Type":"Driver","SampleDir":"application/drivers_sample/capm/capm_hall_sample","SampleDirName":"sample_capm","SampleFunction":"CAPM_HallSample()","SampleHead":"#include \"capm_hall_sample.h\"","Enable":"disable","key":15},"Cfd Check Error":{"Name":"Cfd Check Error","Type":"Driver","SampleDir":"application/drivers_sample/cfd/sample_cfd_check_error","SampleDirName":"sample_cfd_check_error","SampleFunction":"CFD_SampleMain()","SampleHead":"#include \"cfd_check_error_sample.h\"","Enable":"disable","key":16},"Cmm Check Error":{"Name":"Cmm Check Error","Type":"Driver","SampleDir":"application/drivers_sample/cmm/sample_cmm_check_error","SampleDirName":"sample_cmm_check_error","SampleFunction":"CMM_SampleMain()","SampleHead":"#include \"cmm_check_error_sample.h\"","Enable":"disable","key":17},"Crc Gen Algo":{"Name":"Crc Gen Algo","Type":"Driver","SampleDir":"application/drivers_sample/crc/sample_crc_gen_algo","SampleDirName":"sample_crc_gen_algo","SampleFunction":"CRC_GenerateSample()","SampleHead":"#include \"sample_crc_gen_algo.h\"","Enable":"disable","key":18},"Crc Load Algo":{"Name":"Crc Load Algo","Type":"Driver","SampleDir":"application/drivers_sample/crc/sample_crc_load_algo","SampleDirName":"sample_crc_load_algo","SampleFunction":"CRC_LoadSample()","SampleHead":"#include \"sample_crc_load_algo.h\"","Enable":"disable","key":19},"Crc Check Algo":{"Name":"Crc Check Algo","Type":"Driver","SampleDir":"application/drivers_sample/crc/sample_crc_check_algo","SampleDirName":"sample_crc_check_algo","SampleFunction":"CRC_CheckAlgoSample()","SampleHead":"#include \"sample_crc_check_algo.h\"","Enable":"disable","key":20},"Dma Memtomem":{"Name":"Dma Memtomem","Type":"Driver","SampleDir":"application/drivers_sample/dma/sample_dma_mem_to_mem","SampleDirName":"sample_dma_mem_to_mem","SampleFunction":"DMA_MemoryToMemory()","SampleHead":"#include \"sample_dma_mem_to_mem.h\"","Enable":"disable","key":21},"Flash Blocking Mode":{"Name":"Flash Blocking Mode","Type":"Driver","SampleDir":"application/drivers_sample/flash/sample_flash_blocking_mode","SampleDirName":"sample_flash_blocking_mode","SampleFunction":"FlashBlockingProcessing()","SampleHead":"#include \"sample_flash_blocking_mode.h\"","Enable":"disable","key":22},"Flash Interrupt Mode":{"Name":"Flash Interrupt Mode","Type":"Driver","SampleDir":"application/drivers_sample/flash/sample_flash_interrupt_mode","SampleDirName":"sample_flash_interrupt_mode","SampleFunction":"FlashInterruptProcessing()","SampleHead":"#include \"sample_flash_interrupt_mode.h\"","Enable":"disable","key":23},"Gpio Circle":{"Name":"Gpio Circle","Type":"Driver","SampleDir":"application/drivers_sample/gpio/sample_gpio_circle","SampleDirName":"sample_gpio_circle","SampleFunction":"GPIO_CircleSample()","SampleHead":"#include \"gpio_circle_sample.h\"","Enable":"disable","key":24},"Gpio Interrupt":{"Name":"Gpio Interrupt","Type":"Driver","SampleDir":"application/drivers_sample/gpio/sample_gpio_interrupt","SampleDirName":"sample_gpio_interrupt","SampleFunction":"GPIO_InterruptSample()","SampleHead":"#include \"gpio_interrupt_sample.h\"","Enable":"disable","key":25},"Gpio Led":{"Name":"Gpio Led","Type":"Driver","SampleDir":"application/drivers_sample/gpio/sample_gpio_led","SampleDirName":"sample_gpio_led","SampleFunction":"GPIO_LedSample()","SampleHead":"#include \"gpio_led_sample.h\"","Enable":"disable","key":27},"Gpt PWM Output":{"Name":"Gpt PWM Output","Type":"Driver","SampleDir":"application/drivers_sample/gpt/sample_gpt_pwm_output","SampleDirName":"sample_gpt_pwm_output","SampleFunction":"GPT_SampleMain()","SampleHead":"#include \"sample_gpt_pwm_output.h\"","Enable":"disable","key":28},"Gpt Period Interrupt":{"Name":"Gpt Period Interrupt","Type":"Driver","SampleDir":"application/drivers_sample/gpt/sample_gpt_period_interrupt","SampleDirName":"sample_gpt_period_interrupt","SampleFunction":"GPT_PeriodInterrupt()","SampleHead":"#include \"sample_gpt_period_interrupt.h\"","Enable":"disable","key":29},"I2C Master Blocking AT24C64":{"Name":"I2C Master Blocking AT24C64","Type":"Driver","SampleDir":"application/drivers_sample/i2c/sample_i2c_master_blocking_at24c64","SampleDirName":"sample_i2c_master_blocking_at24c64","SampleFunction":"I2cBlocking24c64Processing()","SampleHead":"#include \"sample_i2c_master_blocking_at24c64.h\"","Enable":"disable","key":30},"I2C Master Interrupt AT24C64":{"Name":"I2C Master Interrupt AT24C64","Type":"Driver","SampleDir":"application/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64","SampleDirName":"sample_i2c_master_interrupt_at24c64","SampleFunction":"I2cInterrupt24c64Processing()","SampleHead":"#include \"sample_i2c_master_interrupt_at24c64.h\"","Enable":"disable","key":31},"I2C Master DMA AT24C64":{"Name":"I2C Master DMA AT24C64","Type":"Driver","SampleDir":"application/drivers_sample/i2c/sample_i2c_master_dma_at24c64","SampleDirName":"sample_i2c_master_dma_at24c64","SampleFunction":"I2cDma24c64Processing()","SampleHead":"#include \"sample_i2c_master_dma_at24c64.h\"","Enable":"disable","key":32},"I2C Slave Blocking":{"Name":"I2C Slave Blocking","Type":"Driver","SampleDir":"application/drivers_sample/i2c/sample_i2c_slave_blocking","SampleDirName":"sample_i2c_slave_blocking","SampleFunction":"I2cSlaveBlockingProcessing()","SampleHead":"#include \"sample_i2c_slave_blocking.h\"","Enable":"disable","key":33},"I2C Slave Interrupt":{"Name":"I2C Slave Interrupt","Type":"Driver","SampleDir":"application/drivers_sample/i2c/sample_i2c_slave_interrupt","SampleDirName":"sample_i2c_slave_interrupt","SampleFunction":"I2cSlaveInterruptProcessing()","SampleHead":"#include \"sample_i2c_slave_interrupt.h\"","Enable":"disable","key":34},"I2C Slave DMA":{"Name":"I2C Slave DMA","Type":"Driver","SampleDir":"application/drivers_sample/i2c/sample_i2c_slave_dma","SampleDirName":"sample_i2c_slave_dma","SampleFunction":"I2cSlaveDmaProcessing()","SampleHead":"#include \"sample_i2c_slave_dma.h\"","Enable":"disable","key":35},"IOCMG Iocfg list":{"Name":"IOCMG Iocfg list","Type":"Driver","SampleDir":"application/drivers_sample/iocmg/sample_iocfg_list","SampleDirName":"sample_iocfg_list","SampleFunction":"IOCMG_IOListInitSample()","SampleHead":"#include \"sample_iocfg_list.h\"","Enable":"disable","key":36},"IWdg Refresh":{"Name":"IWdg Refresh","Type":"Driver","SampleDir":"application/drivers_sample/wdg/sample_iwdg_refresh","SampleDirName":"sample_iwdg_refresh","SampleFunction":"IWDG_RefreshSample()","SampleHead":"#include \"sample_iwdg_refresh.h\"","Enable":"disable","key":37},"Pga Result Sampling":{"Name":"Pga Result Sampling","Type":"Driver","SampleDir":"application/drivers_sample/pga/sample_pga_result_sampling","SampleDirName":"sample_pga_result_sampling","SampleFunction":"PGA_ReultSampling()","SampleHead":"#include \"sample_pga_result_sampling.h\"","Enable":"disable","key":38},"Pmc pvd sample":{"Name":"Pmc pvd sample","Type":"Driver","SampleDir":"application/drivers_sample/pmc/sample_pmc_pvd","SampleDirName":"sample_pmc_pvd","SampleFunction":"PmcPvdSample()","SampleHead":"#include \"sample_pmc_pvd.h\"","Enable":"disable","key":39},"Pmc wakeup sample":{"Name":"Pmc wakeup sample","Type":"Driver","SampleDir":"application/drivers_sample/pmc/sample_pmc_wakeup","SampleDirName":"sample_pmc_wakeup","SampleFunction":"PmcWakeupSample()","SampleHead":"#include \"sample_pmc_wakeup.h\"","Enable":"disable","key":40},"Qdm M method":{"Name":"Qdm M method","Type":"Driver","SampleDir":"application/drivers_sample/qdm/sample_qdm_m","SampleDirName":"sample_qdm_m","SampleFunction":"QDM_SampleM()","SampleHead":"#include \"sample_qdm_m.h\"","Enable":"disable","key":41},"Qdm MT method":{"Name":"Qdm MT method","Type":"Driver","SampleDir":"application/drivers_sample/qdm/sample_qdm_mt","SampleDirName":"sample_qdm_mt","SampleFunction":"QDM_SampleMT()","SampleHead":"#include \"sample_qdm_mt.h\"","Enable":"disable","key":42},"Spi Microwire Master":{"Name":"Spi Microwire Master","Type":"Driver","SampleDir":"application/drivers_sample/spi/sample_spi_microwire_master","SampleDirName":"sample_spi_microwire_master","SampleFunction":"MicroWireMasterTestSampleProcessing()","SampleHead":"#include \"sample_spi_microwire_master.h\"","Enable":"disable","key":43},"Spi Microwire Slave":{"Name":"Spi Microwire Slave","Type":"Driver","SampleDir":"application/drivers_sample/spi/sample_spi_microwire_slave","SampleDirName":"sample_spi_microwire_slave","SampleFunction":"MicroWireSlaveTestSampleProcessing()","SampleHead":"#include \"sample_spi_microwire_slave.h\"","Enable":"disable","key":44},"Spi Slave":{"Name":"Spi Slave","Type":"Driver","SampleDir":"application/drivers_sample/spi/sample_spi_slave","SampleDirName":"sample_spi_slave","SampleFunction":"SlaveTestSampleProcessing()","SampleHead":"#include \"sample_spi_slave.h\"","Enable":"disable","key":45},"Spi Blocking W25Q32":{"Name":"Spi Blocking W25Q32","Type":"Driver","SampleDir":"application/drivers_sample/spi/sample_spi_blocking_w25q32","SampleDirName":"sample_spi_blocking_w25q32","SampleFunction":"W25Q32BlockingSampleProcessing()","SampleHead":"#include \"sample_spi_blocking_w25q32.h\"","Enable":"disable","key":46},"Spi Dma W25Q32":{"Name":"Spi Dma W25Q32","Type":"Driver","SampleDir":"application/drivers_sample/spi/sample_spi_dma_w25q32","SampleDirName":"sample_spi_dma_w25q32","SampleFunction":"W25Q32DmaSampleProcessing()","SampleHead":"#include \"sample_spi_dma_w25q32.h\"","Enable":"disable","key":47},"Spi Interrupt W25Q32":{"Name":"Spi Interrupt W25Q32","Type":"Driver","SampleDir":"application/drivers_sample/spi/sample_spi_interrupt_w25q32","SampleDirName":"sample_spi_interrupt_w25q32","SampleFunction":"W25Q32InterruptSampleProcessing()","SampleHead":"#include \"sample_spi_interrupt_w25q32.h\"","Enable":"disable","key":48},"Spi Master":{"Name":"Spi Master","Type":"Driver","SampleDir":"application/drivers_sample/spi/sample_spi_master","SampleDirName":"sample_spi_master","SampleFunction":"MasterTestSampleProcessing()","SampleHead":"#include \"sample_spi_master.h\"","Enable":"disable","key":49},"Timer Interrupt":{"Name":"Timer Interrupt","Type":"Driver","SampleDir":"application/drivers_sample/timer/sample_timer_interrupt","SampleDirName":"sample_timer_interrupt","SampleFunction":"TIMER_SampleMain()","SampleHead":"#include \"sample_timer_interrupt.h\"","Enable":"disable","key":50},"Uart Blocking Rx":{"Name":"Uart Blocking Rx","Type":"Driver","SampleDir":"application/drivers_sample/uart/sample_uart_blocking_rx","SampleDirName":"sample_uart_blocking_rx","SampleFunction":"UART_BlcokingRX()","SampleHead":"#include \"sample_uart_blocking_rx.h\"","Enable":"disable","key":51},"Uart Blocking Tx":{"Name":"Uart Blocking Tx","Type":"Driver","SampleDir":"application/drivers_sample/uart/sample_uart_blocking_tx","SampleDirName":"sample_uart_blocking_tx","SampleFunction":"UART_BlcokingTX()","SampleHead":"#include \"sample_uart_blocking_tx.h\"","Enable":"disable","key":52},"Uart Dma Rx":{"Name":"Uart Dma Rx","Type":"Driver","SampleDir":"application/drivers_sample/uart/sample_uart_dma_rx","SampleDirName":"sample_uart_dma_rx","SampleFunction":"UART_DMA_RX()","SampleHead":"#include \"sample_uart_dma_rx.h\"","Enable":"disable","key":53},"Uart Dma Tx":{"Name":"Uart Dma Tx","Type":"Driver","SampleDir":"application/drivers_sample/uart/sample_uart_dma_tx","SampleDirName":"sample_uart_dma_tx","SampleFunction":"UART_DMA_TX()","SampleHead":"#include \"sample_uart_dma_tx.h\"","Enable":"disable","key":54},"Uart Interrupt Tx after Rx":{"Name":"Uart Interrupt Tx after Rx","Type":"Driver","SampleDir":"application/drivers_sample/uart/sample_uart_interrupt_tx_after_rx","SampleDirName":"sample_uart_interrupt_tx_after_rx","SampleFunction":"UART_InterruptTxAfterRx()","SampleHead":"#include \"sample_uart_interrupt_tx_after_rx.h\"","Enable":"disable","key":55},"Uart Interrupt Rx":{"Name":"Uart Interrupt Rx","Type":"Driver","SampleDir":"application/drivers_sample/uart/sample_uart_interrupt_rx","SampleDirName":"sample_uart_interrupt_rx","SampleFunction":"UART_InterruptRX()","SampleHead":"#include \"sample_uart_interrupt_rx.h\"","Enable":"disable","key":56},"Uart Interrupt Tx":{"Name":"Uart Interrupt Tx","Type":"Driver","SampleDir":"application/drivers_sample/uart/sample_uart_interrupt_tx","SampleDirName":"sample_uart_interrupt_tx","SampleFunction":"UART_InterruptTX()","SampleHead":"#include \"sample_uart_interrupt_tx.h\"","Enable":"disable","key":57},"Uart DMA_Tx&DMA_Rx Simultaneously":{"Name":"Uart DMA_Tx&DMA_Rx Simultaneously","Type":"Driver","SampleDir":"application/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously","SampleDirName":"sample_uart_dma_tx_dma_rx_simultaneously","SampleFunction":"UART_DMATxAndRxSimultaneously()","SampleHead":"#include \"sample_uart_dma_tx_dma_rx_simultaneously.h\"","Enable":"disable","key":58},"Uart DMA_Tx&Int_Rx Simultaneously":{"Name":"Uart DMA_Tx&Int_Rx Simultaneously","Type":"Driver","SampleDir":"application/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously","SampleDirName":"sample_uart_dma_tx_int_rx_simultaneously","SampleFunction":"UART_DMATxAndINTRxSimultaneously()","SampleHead":"#include \"sample_uart_dma_tx_int_rx_simultaneously.h\"","Enable":"disable","key":59},"Uart Int_Tx&DMA_Rx Simultaneously":{"Name":"Uart Int_Tx&DMA_Rx Simultaneously","Type":"Driver","SampleDir":"application/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously","SampleDirName":"sample_uart_int_tx_dma_rx_simultaneously","SampleFunction":"UART_INTTxAndDMARxSimultaneously()","SampleHead":"#include \"sample_uart_int_tx_dma_rx_simultaneously.h\"","Enable":"disable","key":60},"Uart Int_Tx&Int_Rx Simultaneously":{"Name":"Uart Int_Tx&Int_Rx Simultaneously","Type":"Driver","SampleDir":"application/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously","SampleDirName":"sample_uart_int_tx_int_rx_simultaneously","SampleFunction":"UART_INTTxAndINTRxSimultaneously()","SampleHead":"#include \"sample_uart_int_tx_int_rx_simultaneously.h\"","Enable":"disable","key":61},"Uart DMA Rx and Cyclically Stored":{"Name":"Uart DMA Rx and Cyclically Stored","Type":"Driver","SampleDir":"application/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored","SampleDirName":"sample_uart_dma_rx_cyclically_stored","SampleFunction":"UART_DMA_RxCyclicallyStored()","SampleHead":"#include \"sample_uart_dma_rx_cyclically_stored.h\"","Enable":"disable","key":62},"Uart_AutoBaud_Detection":{"Name":"Uart_AutoBaud_Detection","Type":"Driver","SampleDir":"application/drivers_sample/uart/sample_uart_baud_detect","SampleDirName":"sample_uart_baud_detect","SampleFunction":"UART_BaudDetection()","SampleHead":"#include \"sample_uart_baud_detect.h\"","Enable":"disable","key":63},"Uart Character Match":{"Name":"Uart Character Match","Type":"Driver","SampleDir":"application/drivers_sample/uart/sample_uart_character_match","SampleDirName":"sample_uart_character_match","SampleFunction":"UART_CharacterMatch()","SampleHead":"#include \"sample_uart_character_match.h\"","Enable":"disable","key":64},"WWdg Refresh":{"Name":"WWdg Refresh","Type":"Driver","SampleDir":"application/drivers_sample/wdg/sample_wwdg_refresh","SampleDirName":"sample_wwdg_refresh","SampleFunction":"WWDG_RefreshSample()","SampleHead":"#include \"sample_wwdg_refresh.h\"","Enable":"disable","key":65},"Bldc Hall Six Step Wave":{"Name":"Bldc Hall Six Step Wave","Type":"Motor","SampleDir":"application/middleware_sample/mcs_hall_bldc_1shunt","SampleDirName":"mcs_hall_bldc_1shunt","SampleFunction":"MotorMain()","SampleHead":"#include \"mcs_motor_process.h\"","Enable":"disable","key":66},"Bldc Sensorless Six Step Wave":{"Name":"Bldc Sensorless Six Step Wave","Type":"Motor","SampleDir":"application/middleware_sample/mcs_sensorless_bldc_six_step_wave","SampleDirName":"mcs_sensorless_bldc_six_step_wave","SampleFunction":"MotorMainProcess()","SampleHead":"#include \"mcs_motor_process.h\"","Enable":"disable","key":67},"Pmsm Hall 2shunt Foc":{"Name":"Pmsm Hall 2shunt Foc","Type":"Motor","SampleDir":"application/middleware_sample/pmsm_hall_2shunt_foc","SampleDirName":"pmsm_hall_2shunt_foc","SampleFunction":"MotorMainProcess()","SampleHead":"#include \"mcs_motor_process.h\"","Enable":"disable","key":68},"Pmsm Sensorless 1shunt Foc":{"Name":"Pmsm Sensorless 1shunt Foc","Type":"Motor","SampleDir":"application/middleware_sample/pmsm_sensorless_1shunt_foc","SampleDirName":"pmsm_sensorless_1shunt_foc","SampleFunction":"MotorMainProcess()","SampleHead":"#include \"mcs_motor_process.h\"","Enable":"disable","key":69}},"GPIO Settings":{"GPIO3_2":{"Name":"GPIO3_2","PinName":"PIN21","GpioName":"GPIO_PIN_2","register":"GPIO3","Level":"low","Direction":"input","InterruptMode":"rise_edge","InterruptCallback":"GPIO_CallBackFunc","CustomPinName":"","Enable":"enable","key":26}},"gpio":{"GPIO":{"GPIO3_2":{"Pin Name":"PIN21"}},"UART0":{"UART0_TXD":{"Pin Name":"PIN39"},"UART0_RXD":{"Pin Name":"PIN40"}}},"pinName":["PIN21","PIN39","PIN40"],"PLIC Settings":{"IRQ_GPIO3":{"Name":"IRQ_GPIO3","Module":"GPIO","Priority":"1","Enable":"enable","key":47,"IsDisplay":{"path":"all,GPIO Settings","value":"GPIO3_0","type":"inObj"}}}},"enabled":["SYSTEM","GPIO","UART0"],"info":{"board":"","chipName":"3061MNPICA","clockName":"clock3061mrpicb","seriesName":"3061m","package":"LQFP48","package path":"d:\\HaiSi\\Docs\\open_mcu-master\\open_mcu-master\\src","package version":"SolarA2_1.0.1.2","part":"","needSDK":true},"part":{"UART0":{"UART0 Configuration":{"Send Mode":"BLOCKING","Receive Mode":"BLOCKING","Enable Interrupt":"Disable","AS DEBUG UART":true,"UART0_TXD":"PIN39","UART0_RXD":"PIN40","UART0_CTSN":"Disable","UART0_RTSN":"Disable","Word Length":"8Bits","Parity":"None","Stop Bits":"1Bit","Baud Rate":115200,"Hardware Flow Control":"Disable","FIFO Mode":"Enable","Send FIFO Threshold":"1/2Full","Receive FIFO Threshold":"1/2Full","OverSampling":"16X","Auto Baudrate":"Disable","MSB First":"Disable","Character Detection":"Disable","Character":"A","Handle Name":"g_uart0","Write Interrupt Callback":"UART0WriteInterruptCallback","Read Interrupt Callback":"UART0ReadInterruptCallback","Interrupt Error Callback":"UART0InterruptErrorCallback","Write DMA Callback":"UART0_TXDMACallback","Read DMA Callback":"UART0_RXDMACallback","Successful Baud Detection CallBack":"UART0_BaudDetectCallBack_Ok","Failed Baud Detection CallBack":"UART0_BaudDetectCallBack_Error","Character Match CallBack":"UART0_CharacterMatchCallBack"},"advancedSetting":{"PLIC Settings":{"IRQ_UART0":{"Name":"IRQ_UART0","dependence":"","Module":"UART0","Priority":"1","Enable":"disable","key":"0"}},"DMA Settings":{"UART0_RX":{"SrcPeriph":"UART0_RX","dependence":"","DestPeriph":"None","Direction":"None","key":"0","Channel":"None","Priority":"None","SrcAddrInc":"UNALTERED","DestAddrInc":"UNALTERED","SrcBurst":"1","DestBurst":"1","SrcWidth":"BYTE","DestWidth":"BYTE","Enable":"disable","Module":"UART0"},"UART0_TX":{"SrcPeriph":"UART0_TX","dependence":"","DestPeriph":"None","Direction":"None","key":"0","Channel":"None","Priority":"None","SrcAddrInc":"UNALTERED","DestAddrInc":"UNALTERED","SrcBurst":"1","DestBurst":"1","SrcWidth":"BYTE","DestWidth":"BYTE","Enable":"disable","Module":"UART0"}}},"pins":{"UART0_TXD":{"Pin Name":"PIN39","dependence":true},"UART0_RXD":{"Pin Name":"PIN40","dependence":true},"UART0_CTSN":{},"UART0_RTSN":{}}}},"globalCheckResult":{"UART0":{"status":"STATUS_OK","tips":""}},"globalCheckItem":{"UART0":[{"check":"all:gpio:UART0:UART0_TXD","tips":[]},{"check":"all:gpio:UART0:UART0_RXD","tips":[]}]},"selectPinName":{},"configType":"menu"} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/board.json b/vendor/others/demo/5-tim_adc/demo/board.json new file mode 100644 index 000000000..dc5196015 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/board.json @@ -0,0 +1 @@ +{"all":{"CLOCKSettings":{"HOSC":"25","LOSC":"32","adc_clk_mode":"clk_adc_div0","clk_1m_ini_clksel":"clk_hosc","clk_1m":"1","clk_cs":"/25","clk_gpt0":"150","clk_gpt1":"150","clk_gpt2":"150","clk_adc":"100","clk_adc_div0":"100","clk_adc_div1":"150","clk_tcxo":"30","clk_hosc":"25","clk_pst1_sw_sel":"clk_pst1","clk_pst2_sw_sel":"clk_pst2","clk_spi0":"150","clk_spi1":"150","clk_timer0":"150","clk_timer1":"150","clk_timer2":"150","clk_timer3":"150","clk_uart0":"150","clk_uart1":"150","clk_uart2":"150","clk_uart3":"150","clk_iwdg":"32","clk_wwdg":"150","clk_can":"25","pll_div":"X48","pll_postdiv1":"/2","pll_postdiv2":"/3","pll_prediv":"/4","pll_ref_cksel":"HOSC","clk_cmm":"150","clk_dma":"150","clk_qdm1":"150","clk_qdm0":"150","clk_crc":"150","clk_capm2":"150","clk_capm1":"150","clk_capm0":"150","clk_apt3":"150","clk_apt2":"150","clk_apt1":"150","clk_apt0":"150","clk_gpt3":"150","clk_gpio3":"150","clk_gpio2":"150","clk_gpio1":"150","clk_gpio0":"150","clk_eflash":"150","clk_gpio5":"150","clk_gpio4":"150","clk_i2c0":"150","clk_i2c1":"150","clk_pst1":"150","clk_pst2":"100","clk_adc_cksel0":"/1","clk_adc_cksel1":"/1"},"SAMPLE Settings":{"Blank Main":{"Name":"Blank Main","Type":"Default","Extend Board":"Default","Extend Module":"Default","SampleDir":"","SampleDirName":"blank_main","SampleFunction":"SystemInit()","Enable":"enable","key":0}},"MACRO Settings":{"DBG_ENABLE":{"Enable":"disable"},"MCS_PARAM_CHECK":{"Enable":"enable"},"APT_PARAM_CHECK":{"Enable":"enable"},"ADC_PARAM_CHECK":{"Enable":"enable"},"CAPM_PARAM_CHECK":{"Enable":"enable"},"CRG_PARAM_CHECK":{"Enable":"enable"},"I2C_PARAM_CHECK":{"Enable":"enable"},"UART_PARAM_CHECK":{"Enable":"enable"},"SPI_PARAM_CHECK":{"Enable":"enable"},"TIMER_PARAM_CHECK":{"Enable":"enable"},"IWDG_PARAM_CHECK":{"Enable":"enable"},"WWDG_PARAM_CHECK":{"Enable":"enable"},"GPIO_PARAM_CHECK":{"Enable":"enable"},"GPT_PARAM_CHECK":{"Enable":"enable"},"DMA_PARAM_CHECK":{"Enable":"enable"},"CRC_PARAM_CHECK":{"Enable":"enable"},"CFD_PARAM_CHECK":{"Enable":"enable"},"CMM_PARAM_CHECK":{"Enable":"enable"},"CAN_PARAM_CHECK":{"Enable":"enable"},"FLASH_PARAM_CHECK":{"Enable":"enable"},"PMC_PARAM_CHECK":{"Enable":"enable"},"ACMP_PARAM_CHECK":{"Enable":"enable"},"DAC_PARAM_CHECK":{"Enable":"enable"},"PGA_PARAM_CHECK":{"Enable":"enable"},"USER_MODE_ENABLE":{"Enable":"disable"},"IOCMG_PARAM_CHECK":{"Enable":"enable"},"QDM_PARAM_CHECK":{"Enable":"enable"},"NOS_TASK_SUPPORT":{"Enable":"disable"}},"gpio":{"ADC0":{"ADC_AIN6":{"Pin Name":"PIN4"}},"UART0":{"UART0_TXD":{"Pin Name":"PIN39"},"UART0_RXD":{"Pin Name":"PIN40"}}},"pinName":["PIN4","PIN39","PIN40"],"PLIC Settings":{"IRQ_TIMER3":{"Name":"IRQ_TIMER3","dependence":"","Module":"TIMER3","Priority":"1","Enable":"enable","key":19,"IsDisplay":{"path":"enabled","value":"TIMER3","type":"include"},"dataListDependence":{"IRQ_TIMER3":{"checkItem":[{"check":"part:TIMER3:TIMER3 Configuration:Timer Interrupt:Enable","tips":["INTERRUPT:IRQ_TIMER3:Enable","TIMER3:Timer Interrupt"]}]}}}},"DMA Settings":{}},"enabled":["SYSTEM","ADC0","UART0","TIMER3"],"info":{"board":"","chipName":"3061MNPICA","clockName":"clock3061mrpicb","seriesName":"3061m","package":"LQFP48","package path":"d:\\HaiSi\\Docs\\open_mcu-master\\open_mcu-master\\src","package version":"SolarA2_1.0.1.2","part":"","needSDK":true},"part":{"ADC0":{"ADC0 Configuration0":{"Sampling Source":"ADC INA6","Sampling Result Register":"SOC1","Custom Name":"","Custom Handle":"","Custom SOC":"","Custom Channel":"","Sampling Trigger Mode":"Software","Sampling Continue Mode":"enable","The module is disabled: ":"","Pins conflict,can configure it in: ":"Pin View","Sampling Result Output Mode":"Sampling Result Register","conflict,can configure it in: ":"IRQ_ADC0_INT2","Sample Clock":10,"Working Clock":"clk_adc ( 100 MHz )","Total Sampling Conversion Time":"380 ns"},"Priority Of Soc":"SOC0-SOC15 in round","Handle Name":"g_adc0","Interrupt0 Callback":"ADC0Interrupt0Callback","Interrupt1 Callback":"ADC0Interrupt1Callback","Interrupt2 Callback":"ADC0Interrupt2Callback","Interrupt3 Callback":"ADC0Interrupt3Callback","DMA Finish Callback":"ADCDmaFinishCallback","Oversampling Callback":"ADCOversampingCallback","OverError Callback":"ADCOverErrorCallback","Oversampling Enable":false,"Select Soc":"SOC0","Oversampling Multiple":"8X","Result Right Shift":"0 bit","Actual Oversampling Accuracy":"15 bit","Generate Event Interrupt":"disable","advancedSetting":{"PLIC Settings":{"IRQ_ADC0_OVINT":{"Name":"IRQ_ADC0_OVINT","dependence":"","Module":"ADC0","Priority":"1","Enable":"disable","key":"0"},"IRQ_ADC0_INT0":{"Name":"IRQ_ADC0_INT0","dependence":"","Module":"ADC0","Priority":"1","Enable":"disable","key":"5"},"IRQ_ADC0_INT1":{"Name":"IRQ_ADC0_INT1","dependence":"","Module":"ADC0","Priority":"1","Enable":"disable","key":"1"},"IRQ_ADC0_INT2":{"Name":"IRQ_ADC0_INT2","dependence":"","Module":"ADC0","Priority":"1","Enable":"disable","key":41,"IsDisplay":{"path":"enabled","value":"ADC0","type":"include"},"dataListDependence":{"IRQ_ADC0_INT2":{"checkItem":[{"check":"part:ADC0:ADC0 Configuration:Sampling Result Output Mode:Interrupt2","tips":["INTERRUPT:IRQ_ADC0_INT2:Enable","ADC0:Sampling Result Output Mode"]}]}}},"IRQ_ADC0_INT3":{"Name":"IRQ_ADC0_INT3","dependence":"","Module":"ADC0","Priority":"1","Enable":"disable","key":"3"},"IRQ_ADC0_INT4":{"Name":"IRQ_ADC0_INT4","dependence":"","Module":"ADC0","Priority":"1","Enable":"disable","key":"4"},"IRQ_ADC0_EVENT":{"Name":"IRQ_ADC0_EVENT","dependence":"","Module":"ADC0","Priority":"1","Enable":"disable","key":"5"}},"DMA Settings":{"ADC0":{"SrcPeriph":"ADC0","dependence":"","DestPeriph":"None","Direction":"None","key":"0","Channel":"None","Priority":"None","SrcAddrInc":"UNALTERED","DestAddrInc":"UNALTERED","SrcBurst":"1","DestBurst":"1","SrcWidth":"WORD","DestWidth":"WORD","Enable":"disable","Module":"ADC0"}}},"pins":{"ADC_AIN6":{"Pin Name":"PIN4","dependence":true}}},"TIMER3":{"TIMER3 Configuration":{"Running Mode":"periodic mode","Period(us)":10,"Real Time Value":"28633115.30","Working clock":"clk_timer0 ( 150 MHz )","Prescaler":"without prescaler","Timer Size":"32bit","Timer Interrupt":"Enable","DMA Request Overflow Interrupt":"Disable","ADC Request":"Disable","DMA Request(single and burst)":"Disable","Handle Name":"g_timer3","TIMER interrupt CallBack":"TIMER3_InterruptProcess","Timer DMA OverFlow Callback":"TIMER3_DMAOverFlow_InterruptProcess"},"advancedSetting":{"PLIC Settings":{"IRQ_TIMER3":{"Name":"IRQ_TIMER3","dependence":"","Module":"TIMER3","Priority":"1","Enable":"enable","key":19,"IsDisplay":{"path":"enabled","value":"TIMER3","type":"include"},"dataListDependence":{"IRQ_TIMER3":{"checkItem":[{"check":"part:TIMER3:TIMER3 Configuration:Timer Interrupt:Enable","tips":["INTERRUPT:IRQ_TIMER3:Enable","TIMER3:Timer Interrupt"]}]}}}},"DMA Settings":{"TIMER3":{"SrcPeriph":"TIMER3","dependence":"","DestPeriph":"None","Direction":"None","key":"0","Channel":"None","Priority":"None","SrcAddrInc":"UNALTERED","DestAddrInc":"UNALTERED","SrcBurst":"1","DestBurst":"1","SrcWidth":"BYTE","DestWidth":"BYTE","Enable":"disable","Module":"TIMER3"}}}},"UART0":{"UART0 Configuration":{"Send Mode":"BLOCKING","Receive Mode":"BLOCKING","Enable Interrupt":"Disable","AS DEBUG UART":true,"UART0_TXD":"PIN39","UART0_RXD":"PIN40","UART0_CTSN":"Disable","UART0_RTSN":"Disable","Word Length":"8Bits","Parity":"None","Stop Bits":"1Bit","Baud Rate":115200,"Hardware Flow Control":"Disable","FIFO Mode":"Enable","Send FIFO Threshold":"1/2Full","Receive FIFO Threshold":"1/2Full","OverSampling":"16X","Auto Baudrate":"Disable","MSB First":"Disable","Character Detection":"Disable","Character":"A","Handle Name":"g_uart0","Write Interrupt Callback":"UART0WriteInterruptCallback","Read Interrupt Callback":"UART0ReadInterruptCallback","Interrupt Error Callback":"UART0InterruptErrorCallback","Write DMA Callback":"UART0_TXDMACallback","Read DMA Callback":"UART0_RXDMACallback","Successful Baud Detection CallBack":"UART0_BaudDetectCallBack_Ok","Failed Baud Detection CallBack":"UART0_BaudDetectCallBack_Error","Character Match CallBack":"UART0_CharacterMatchCallBack"},"advancedSetting":{"PLIC Settings":{"IRQ_UART0":{"Name":"IRQ_UART0","dependence":"","Module":"UART0","Priority":"1","Enable":"disable","key":"0"}},"DMA Settings":{"UART0_RX":{"SrcPeriph":"UART0_RX","dependence":"","DestPeriph":"None","Direction":"None","key":"0","Channel":"None","Priority":"None","SrcAddrInc":"UNALTERED","DestAddrInc":"UNALTERED","SrcBurst":"1","DestBurst":"1","SrcWidth":"BYTE","DestWidth":"BYTE","Enable":"disable","Module":"UART0"},"UART0_TX":{"SrcPeriph":"UART0_TX","dependence":"","DestPeriph":"None","Direction":"None","key":"0","Channel":"None","Priority":"None","SrcAddrInc":"UNALTERED","DestAddrInc":"UNALTERED","SrcBurst":"1","DestBurst":"1","SrcWidth":"BYTE","DestWidth":"BYTE","Enable":"disable","Module":"UART0"}}},"pins":{"UART0_TXD":{"Pin Name":"PIN39","dependence":true},"UART0_RXD":{"Pin Name":"PIN40","dependence":true},"UART0_CTSN":{},"UART0_RTSN":{}}}},"globalCheckResult":{"ADC0":{"status":"STATUS_OK","tips":""},"PLIC":{"status":"STATUS_OK","tips":""},"UART0":{"status":"STATUS_OK","tips":""},"TIMER3":{"status":"STATUS_OK","tips":""}},"globalCheckItem":{"ADC0":[{"check":"all:gpio:ADC0:ADC_AIN6","tips":[]}],"PLIC":[{"check":"part:TIMER3:TIMER3 Configuration:Timer Interrupt:Enable","tips":["INTERRUPT:IRQ_TIMER3:Enable","TIMER3:Timer Interrupt"]}],"UART0":[{"check":"all:gpio:UART0:UART0_TXD","tips":[]},{"check":"all:gpio:UART0:UART0_RXD","tips":[]}],"TIMER3":[{"check":"all:PLIC Settings:IRQ_TIMER3:Enable:enable","tips":["TIMER3:Timer Interrupt","INTERRUPT:IRQ_TIMER3:Enable"]}]},"selectPinName":{},"configType":"menu","uniqueKey":{"ADC0":{"Sampling Result Register":["SOC1"]}},"quantity":{"ADC0":1},"deleteType":"moduleDelete"} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/build/.gn b/vendor/others/demo/5-tim_adc/demo/build/.gn new file mode 100644 index 000000000..823030a86 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/build/.gn @@ -0,0 +1,21 @@ +# @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +# following disclaimer in the documentation and/or other materials provided with the distribution. +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# The location of the build configuration file. + +buildconfig = "//build/config/BUILDCONFIG.gn" + +root = "//build" diff --git a/vendor/others/demo/5-tim_adc/demo/build/BUILD.gn b/vendor/others/demo/5-tim_adc/demo/build/BUILD.gn new file mode 100644 index 000000000..88a2f81a8 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/build/BUILD.gn @@ -0,0 +1,339 @@ +import("//build/toolchain/config.gni") +set_defaults("executable") { + cflags = [ + "-O0", + "-pipe", + "-Wall", + "-Wextra", + "-Winit-self", + "-Wmissing-include-dirs", + "-Wtrampolines", + "-Werror=undef", + "-Wpointer-arith", + "-Wlogical-op", + "-Wstrict-prototypes", + "-Wmissing-prototypes", + "-Wjump-misses-init", + "-Wformat=2", + "-Wfloat-equal", + "-Wdate-time", + "-Wswitch-default", + "-Wimplicit-fallthrough=2", + "-Wno-missing-declarations", + "-std=gnu11", + "-fsigned-char", + "-fno-builtin", + "-ffreestanding", + "-nostdlib", + "-fno-exceptions", + "-fno-unwind-tables", + "-fno-short-enums", + "-fno-common", + "-freg-struct-return", + "-mabi=ilp32f", + "-march=rv32imfc", + "-fno-strict-aliasing", + "-fdata-sections", + "-ffunction-sections", + "-falign-functions=2", + "-fno-schedule-insns", + "-fno-optimize-strlen", + "-fno-aggressive-loop-optimizations", + "-Wa,-enable-c-lbu-sb", + "-Wa,-enable-c-lhu-sh", + "-msmall-data-limit=0", + "-fimm-compare", + "-femit-muliadd", + "-fmerge-immshf", + "-femit-uxtb-uxth", + "-femit-lli", + "-fldm-stm-optimize", + "-fno-inline-small-functions", + "-mtune=size", + "-mpush-pop", + "-femit-clz", + "-madjust-regorder", + "-madjust-const-cost", + "-freorder-commu-args", + "-fimm-compare-expand", + "-frmv-str-zero", + "-mfp-const-opt", + "-mswitch-jump-table", + "-frtl-sequence-abstract", + "-frtl-hoist-sink", + "-fsafe-alias-multipointer", + "-finline-optimize-size", + "-fmuliadd-expand", + "-mlli-expand", + "-Wa,-mcjal-expand", + "-foptimize-reg-alloc", + "-fsplit-multi-zero-assignments", + "-floop-optimize-size", + "-mpattern-abstract", + "-foptimize-pro-and-epilogue", + "-fstrict-volatile-bitfields", + "-Wcast-align", + "-fstrong-eval-order", + "-Wunused", + "-Wvla", + "-Wshadow", + "-fvisibility=hidden", + "-fsingle-precision-constant", + ] + ldflags = [ + "-Wl,-Map,bin/target.map", + "-Wl,--enjal16", + "-Wl,--gc-section", + "-Wl,--cjal-relax", + "-Wl,--dslf", + "-Wl,--jal-transfer", + "-nostdlib", + "-static", + "-lgcc", + "-lc", + "-Wl,-Bsymbolic", + "-rdynamic", + "-Wl,--no-undefined", + "-T..\chip\3061m\flash.lds", + "-Wl,--whole-archive", + "-L..\middleware\thirdparty\sysroot\lib", + "-lmcs_smo_4th", + "-lnostask", + "-Wl,--no-whole-archive", + ] + defines = [ + "FLOAT_SUPPORT", + ] + if(build_type == "debug") { + cflags += [ + "-g" + ] + }else if(build_type == "release") { + cflags += [ + "-fomit-frame-pointer" + ] + defines += [ + "NDEBUG" + ] + } +} +executable("target.elf") { + sources = [ + "//chip\3061m\startup.S", + "//chip\3061m\chipinit\chipinit.c", + "//chip\3061m\chipinit\anatrim\anatrim.c", + "//chip\3061m\chipinit\anavrefinit\anavrefinit.c", + "//chip\3061m\chipinit\crginit\crginit.c", + "//chip\3061m\chipinit\flashinit\flashinit.c", + "//chip\3061m\chipinit\systickinit\systickinit.c", + "//chip\3061m\fotp\fotp_info_read.c", + "//chip\3061m\ip_crg\ip_crg_common.c", + "//drivers\acmp\src\acmp.c", + "//drivers\acmp\src\acmp_ex.c", + "//drivers\adc\src\adc.c", + "//drivers\adc\src\adc_ex.c", + "//drivers\apt\src\apt.c", + "//drivers\base\src\assert.c", + "//drivers\base\src\base_math.c", + "//drivers\base\src\clock.c", + "//drivers\base\src\generalfunc.c", + "//drivers\base\src\interrupt.c", + "//drivers\base\src\lock.c", + "//drivers\base\src\reset.c", + "//drivers\can\src\can.c", + "//drivers\capm\src\capm.c", + "//drivers\cfd\src\cfd.c", + "//drivers\cmm\src\cmm.c", + "//drivers\crc\src\crc.c", + "//drivers\crg\src\crg.c", + "//drivers\dac\src\dac.c", + "//drivers\debug\log\src\app_command.c", + "//drivers\debug\log\src\cmd.c", + "//drivers\debug\log\src\cmd_common.c", + "//drivers\debug\log\src\config.c", + "//drivers\debug\log\src\console.c", + "//drivers\debug\log\src\dfx_debug.c", + "//drivers\debug\log\src\dfx_log.c", + "//drivers\debug\log\src\dfx_log_proc.c", + "//drivers\debug\log\src\event.c", + "//drivers\debug\log\src\ext_command.c", + "//drivers\debug\src\debug.c", + "//drivers\dma\src\dma.c", + "//drivers\dma\src\dma_ex.c", + "//drivers\flash\src\flash.c", + "//drivers\gpio\src\gpio.c", + "//drivers\gpt\src\gpt.c", + "//drivers\gpt\src\gpt_ex.c", + "//drivers\i2c\src\i2c.c", + "//drivers\i2c\src\i2c_ex.c", + "//drivers\iocmg\src\iocmg.c", + "//drivers\iwdg\src\iwdg.c", + "//drivers\iwdg\src\iwdg_ex.c", + "//drivers\pga\src\pga.c", + "//drivers\pmc\src\pmc.c", + "//drivers\qdm\src\qdm.c", + "//drivers\spi\src\spi.c", + "//drivers\spi\src\spi_ex.c", + "//drivers\timer\src\timer.c", + "//drivers\timer\src\timer_ex.c", + "//drivers\tsensor\src\tsensor.c", + "//drivers\uart\src\uart.c", + "//drivers\uart\src\uart_ex.c", + "//drivers\wwdg\src\wwdg.c", + "//drivers\wwdg\src\wwdg_ex.c", + "//middleware\control_library\adc_calibra\mcs_adcCalibr.c", + "//middleware\control_library\brake\mcs_brake.c", + "//middleware\control_library\filter\mcs_filter.c", + "//middleware\control_library\filter\mcs_lpfRk4.c", + "//middleware\control_library\filter\mcs_pll.c", + "//middleware\control_library\foc_loop_ctrl\mcs_curr_ctrl.c", + "//middleware\control_library\foc_loop_ctrl\mcs_curr_ff.c", + "//middleware\control_library\foc_loop_ctrl\mcs_fw_ctrl.c", + "//middleware\control_library\foc_loop_ctrl\mcs_if_ctrl.c", + "//middleware\control_library\foc_loop_ctrl\mcs_pos_ctrl.c", + "//middleware\control_library\foc_loop_ctrl\mcs_spd_ctrl.c", + "//middleware\control_library\foc_loop_ctrl\mcs_startup.c", + "//middleware\control_library\math\mcs_math.c", + "//middleware\control_library\modulation\mcs_r1_svpwm.c", + "//middleware\control_library\modulation\mcs_svpwm.c", + "//middleware\control_library\observer\mcs_fosmo.c", + "//middleware\control_library\pfc\pfc_curr_ctrl.c", + "//middleware\control_library\pfc\pfc_volt_ctrl.c", + "//middleware\control_library\pid_controller\mcs_pid_ctrl.c", + "//middleware\control_library\power\mcs_power_mgmt.c", + "//middleware\control_library\protection\mcs_openphs_det.c", + "//middleware\control_library\protection\mcs_stall_det.c", + "//middleware\control_library\protection\mcs_unbalance_det.c", + "//middleware\control_library\ramp\mcs_ramp_mgmt.c", + "//middleware\control_library\utilities\mcs_mtr_param.c", + "//middleware\control_library\vf\mcs_vf_ctrl.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\fscanf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\fwscanf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\gets_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\memcpy_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\memmove_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\memset_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\scanf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\securecutil.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\secureinput_a.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\secureinput_w.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\secureprintoutput_a.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\secureprintoutput_w.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\snprintf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\sprintf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\sscanf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\strcat_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\strcpy_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\strncat_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\strncpy_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\strtok_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\swprintf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\swscanf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\vfscanf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\vfwscanf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\vscanf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\vsnprintf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\vsprintf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\vsscanf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\vswprintf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\vswscanf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\vwscanf_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\wcscat_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\wcscpy_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\wcsncat_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\wcsncpy_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\wcstok_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\wmemcpy_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\wmemmove_s.c", + "//middleware\hisilicon\libboundscheck_v1.1.16\src\wscanf_s.c", + "//user\main.c", + "//user\generatecode\system_init.c", + "//user\generatecode\tim_adc.c", + ] + include_dirs = [ + "//chip\3061m", + "//chip\3061m\chipinit", + "//chip\3061m\chipinit\anatrim", + "//chip\3061m\chipinit\anavrefinit", + "//chip\3061m\chipinit\crginit", + "//chip\3061m\chipinit\flashinit", + "//chip\3061m\chipinit\systickinit", + "//chip\3061m\fotp", + "//chip\3061m\iomap", + "//chip\3061m\ip_crg", + "//drivers\acmp\common\inc", + "//drivers\acmp\inc", + "//drivers\adc\common\inc", + "//drivers\adc\inc", + "//drivers\apt\common\inc", + "//drivers\apt\inc", + "//drivers\base\common\inc", + "//drivers\base\inc", + "//drivers\can\common\inc", + "//drivers\can\inc", + "//drivers\capm\common\inc", + "//drivers\capm\inc", + "//drivers\cfd\common\inc", + "//drivers\cfd\inc", + "//drivers\cmm\common\inc", + "//drivers\cmm\inc", + "//drivers\crc\common\inc", + "//drivers\crc\inc", + "//drivers\crg\common\inc", + "//drivers\crg\inc", + "//drivers\dac\common\inc", + "//drivers\dac\inc", + "//drivers\debug\inc", + "//drivers\debug\log\inc", + "//drivers\dma\common\inc", + "//drivers\dma\inc", + "//drivers\flash\common\inc", + "//drivers\flash\inc", + "//drivers\gpio\common\inc", + "//drivers\gpio\inc", + "//drivers\gpt\common\inc", + "//drivers\gpt\inc", + "//drivers\i2c\common\inc", + "//drivers\i2c\inc", + "//drivers\iocmg\common", + "//drivers\iocmg\inc", + "//drivers\iwdg\common\inc", + "//drivers\iwdg\inc", + "//drivers\pga\common\inc", + "//drivers\pga\inc", + "//drivers\pmc\common\inc", + "//drivers\pmc\inc", + "//drivers\qdm\common\inc", + "//drivers\qdm\inc", + "//drivers\spi\common\inc", + "//drivers\spi\inc", + "//drivers\timer\common\inc", + "//drivers\timer\inc", + "//drivers\tsensor\common\inc", + "//drivers\tsensor\inc", + "//drivers\uart\common\inc", + "//drivers\uart\inc", + "//drivers\wwdg\common\inc", + "//drivers\wwdg\inc", + "//middleware\control_library\adc_calibra", + "//middleware\control_library\brake", + "//middleware\control_library\filter", + "//middleware\control_library\foc_loop_ctrl", + "//middleware\control_library\math", + "//middleware\control_library\modulation", + "//middleware\control_library\observer", + "//middleware\control_library\pfc", + "//middleware\control_library\pid_controller", + "//middleware\control_library\power", + "//middleware\control_library\protection", + "//middleware\control_library\ramp", + "//middleware\control_library\utilities", + "//middleware\control_library\vf", + "//middleware\hisilicon\libboundscheck_v1.1.16\include", + "//middleware\hisilicon\libboundscheck_v1.1.16\src", + "//middleware\thirdparty\sysroot\include", + "//user\generatecode", + ] + deps = [ + ] +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/build/build.py b/vendor/others/demo/5-tim_adc/demo/build/build.py new file mode 100644 index 000000000..2bb80f167 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/build/build.py @@ -0,0 +1,586 @@ +# !/usr/bin/env python +# -*- coding: utf-8 -*- + +# @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +# following disclaimer in the documentation and/or other materials provided with the distribution. +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# build.py Function implementation: Build the compilation framework and +# compile the project. + +import sys +import os +import pathlib +import argparse +import collections +import shutil +import subprocess +import distutils.spawn +from configparser import ConfigParser +import platform +import logging +import stat +import shlex + +from build_gn import read_json_file, del_allgn, AutoCreate + + +def usage(): + ''' + Function description: Compiling Commands lists. + ''' + + msg = "\n python build/build.py\n"\ + " python build/build.py build\n"\ + " python build/build.py checkbuild\n"\ + " python build/build.py -t hcc_fpu\n"\ + " python build/build.py -b debug\n" + return msg + + +def copy_xml(): + ''' + Function description: Copy xml file to out. + ''' + build_tmp_path = pathlib.Path.cwd().joinpath('build', 'createxml', + 'mss_prim_db') + xml_path = build_tmp_path.joinpath('dfx_db', 'log.xml') + target_path = pathlib.Path.cwd().joinpath('out') + shutil.copy(xml_path, target_path) + if os.path.isdir(build_tmp_path): + shutil.rmtree(build_tmp_path) + + +def generatefile(file_path, config): + ''' + Function description: Signing Executable Files. + ''' + # Instantiation parameter check. + if not isinstance(file_path, str): + raise TypeError("file_path in para type error {}".format( + type(file_path))) + + file_abspath = pathlib.Path(file_path).resolve() + # Generate the bin file. + bin_abspath = file_abspath.parent.joinpath('{}.bin' + .format(file_abspath.stem)) + cmd = ['riscv32-linux-musl-objcopy', '-Obinary', str(file_abspath), str(bin_abspath)] + process = subprocess.Popen(cmd, shell=False) + process.wait() + ret_code = process.returncode + if ret_code != 0: + raise Exception("bin_file failed, return code is " + ret_code) + + # Generate the hex file. + hex_abspath = file_abspath.parent.joinpath('{}.hex' + .format(file_abspath.stem)) + cmd = ['riscv32-linux-musl-objcopy', '-Oihex', str(file_abspath), str(hex_abspath)] + process = subprocess.Popen(cmd, shell=False) + process.wait() + ret_code = process.returncode + if ret_code != 0: + raise Exception("hex_file failed, return code is " + ret_code) + + # Generate the list file. + if config.build_type == 'debug': + list_path = file_abspath.parent.joinpath('{}.list' + .format(file_abspath.stem)) + if list_path.exists(): + os.remove(list_path) + flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL + modes = stat.S_IWUSR | stat.S_IRUSR + with os.fdopen(os.open(list_path, flags, modes), 'w+') as list_file: + cmd = ['riscv32-linux-musl-objdump', '-S', str(file_abspath)] + process = subprocess.Popen(cmd, stdout=list_file, shell=False) + process.wait() + ret_code = process.returncode + if ret_code != 0: + raise Exception("list_file failed, return code is " + ret_code) + else: + cmd = ['riscv32-linux-musl-strip', str(file_abspath)] + process = subprocess.Popen(cmd, shell=False) + process.wait() + ret_code = process.returncode + if ret_code != 0: + raise Exception("strip failed, return code is " + ret_code) + + +def run_build(**kwargs): + ''' + Function description: Start building. + ''' + + config = kwargs.get('config') + compile_var = Compile() + compile_var.compile(config) + file_path = str(pathlib.Path().joinpath('out', + 'bin', 'target.elf')) + generatefile(file_path, config) + + +def exec_command(cmd, log_path, **kwargs): + ''' + Function description: Run the build command. + ''' + flags = os.O_WRONLY | os.O_CREAT + modes = stat.S_IWUSR | stat.S_IRUSR + with os.fdopen(os.open(log_path, flags, modes), 'w') as log_file: + process = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True, + errors='ignore', + **kwargs) + # Write the build process to the build.log. + for line in iter(process.stdout.readline, ''): + log_file.write(line) + + process.wait() + ret_code = process.returncode + + # An error code is returned when the command is executed. + if ret_code != 0: + with os.fdopen(os.open(log_path, flags, modes), 'at') as log_file: + for line in iter(process.stderr.readline, ''): + log_file.write(line) + raise Exception("{} failed, return code is {}".format(cmd, ret_code)) + + +def parsejson_startautocreat(config): + ''' + Function description: Parsing Chip Template Files. + ''' + + # Obtaining the gn and ninja Paths. + Compile.get_tool_path() + # Read the content of the compilation configuration file. + product_json = pathlib.Path.cwd().joinpath('chip', 'target', + 'userconfig.json') + json_content = read_json_file(product_json) + + if config.action == 'checkbuild': + del_output(config) + check_output(config) + check_extcomponent() + del_allgn() + AutoCreate(json_content) + return True + + +def makedirs(path, exist_ok=True): + ''' + Function description: Creating a directory. + ''' + + try: + os.makedirs(path) + except OSError: + if not pathlib.Path(path).is_dir(): + raise Exception("{} makedirs failed".format(path)) + if not exist_ok: + raise Exception("{} exists, makedirs failed".format(path)) + finally: + pass + + +def remove_readonly(func, path, _): + ''' + Function description: Change the read-only permission to write. + ''' + + os.chmod(path, stat.S_IWRITE) + func(path) + + +def del_output(config): + ''' + Function description: Delete output path. + ''' + + out_path = config.get_out_path() + bin_path = pathlib.Path(out_path).joinpath('bin') + libs_path = pathlib.Path(out_path).joinpath('libs') + obj_path = pathlib.Path(out_path).joinpath('obj') + product_json = pathlib.Path.cwd().joinpath('chip', 'target', + 'userconfig.json') + lib_name = "" + + json_content = read_json_file(product_json) + if json_content['system'][0]['subsystem'][0]['component'][0].get('name'): + lib_name = json_content['system'][0]['subsystem'][0]['component'][0]\ + .get('name') + lib_name = "lib{}.a".format(lib_name) + + for (dirpath, _, filenames) in os.walk(bin_path): + for file in filenames: + if "target" in file or "allinone" in file: + os.remove(pathlib.Path(dirpath).joinpath(file)) + + for (dirpath, _, filenames) in os.walk(libs_path): + for file in filenames: + if file == lib_name: + os.remove(pathlib.Path(dirpath).joinpath(file)) + + for (dirpath, _, filenames) in os.walk(obj_path): + for file in filenames: + if pathlib.Path(file).suffix == '.o': + os.remove(pathlib.Path(dirpath).joinpath(file)) + + +def check_output(config): + ''' + Function description: Recreate output path. + ''' + out_path = config.get_out_path() + if not pathlib.Path(out_path).exists(): + makedirs(out_path) + + +def check_extcomponent(): + ''' + Function description: Deletes output files generated by + external components. + ''' + + ext_inc_path = pathlib.Path('middleware').joinpath( + 'thirdparty', 'sysroot', 'include') + ext_lib_path = pathlib.Path('middleware').joinpath( + 'thirdparty', 'sysroot', 'lib') + if not ext_inc_path.exists(): + makedirs(ext_inc_path) + if not ext_lib_path.exists(): + makedirs(ext_lib_path) + + +def config_create(**kwargs): + ''' + Function description: Start to create configuration. + ''' + + config = kwargs.get('config') + parsejson_startautocreat(config) + return True + + +def exec_create(args): + ''' + Function description: Start creating the compilation process. + ''' + + callback_dict = CallbackDict() + + # parse action + if args.action[0] == 'build' or\ + args.action[0] == 'checkbuild': + config = Config(args) + callback_dict.register(config.action, config_create) + callback_dict.register(config.action, run_build) + callback_dict.execute(config.action, + config=config, + args=args) + elif args.action[0] == 'clean': + config = Config(args) + del_output(config) + del_allgn() + else: + raise Exception("Error: action not found.") + + +class Config(): + ''' + Function description: config config.ini. + ''' + + def __init__(self, args): + self.action = args.action[0] + self.build_type = args.build_type[0] + self.tool_chain = args.tool_chain[0] + self.__set_path() + self.config = pathlib.Path(self.get_build_path())\ + .joinpath('config.ini') + self.log_path = pathlib.Path(self.get_out_path()).joinpath('build.log') + self.cfg = ConfigParser() + self.cfg.read(self.config) + self.toolenv_check() + self.set_default_cmd() + self.set_env_path() + self.args_list = [] + + def get_root_path(self): + if self.__root_path is None: + raise Exception('Error: set root_path first.') + + return self.__root_path + + def get_build_path(self): + if self.__build_path is None: + raise Exception('Error: set build_path first.') + + return self.__build_path + + def get_out_path(self): + if self.__out_path is None: + raise Exception('Error: set out_path first.') + + return self.__out_path + + def toolenv_check(self): + ''' + Function description: Check whether the tool chain path is set. + ''' + + toolspath = self.cfg.get('gn_args', 'tools_path') + user_tool_path = os.path.join(os.path.expanduser("~"), + ".deveco-device-tool/compiler_tool_chain") + if not os.path.exists(user_tool_path): + # use default tool chain path + return + + if toolspath != user_tool_path: + self.cfg.set('gn_args', 'tools_path', user_tool_path) + flags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC + modes = stat.S_IWUSR | stat.S_IRUSR + with os.fdopen(os.open(self.config, flags, modes), + 'w') as configini: + self.cfg.write(configini) + elif not toolspath: + raise Exception("Error: please set config.ini tools_path.") + + def set_default_cmd(self): + ''' + Function description: Write the toolchain and version information to + the config.ini file. + ''' + + section = 'gn_args' + userconfig_file_name = 'userconfig.json' + default_build_type = self.cfg.get(section, 'build_type') + default_tool_chain = self.cfg.get(section, 'toolchain_select') + target_path = pathlib.Path(self.get_root_path()).joinpath('chip', + 'target') + compileopt_path = pathlib.Path(self.get_build_path())\ + .joinpath('config') + + if self.build_type != default_build_type: + if self.build_type != 'debug' and\ + self.build_type != 'release': + raise Exception('Error: {} is not build_type, please check.'\ + .format(self.build_type)) + self.cfg.set(section, 'build_type', self.build_type) + if self.tool_chain != default_tool_chain: + if self.tool_chain != 'hcc' and\ + self.tool_chain != 'hcc_fpu': + raise Exception('Error: {} is not tool_chain, please check.'\ + .format(self.tool_chain)) + # Updating the userconfig.json File. + shutil.copy(pathlib.Path(compileopt_path)\ + .joinpath(self.tool_chain, userconfig_file_name), + target_path) + self.cfg.set(section, 'toolchain_select', self.tool_chain) + if not pathlib.Path(target_path).joinpath(userconfig_file_name).exists(): + # userconfig.json file corresponding to different tool chains. + shutil.copy(pathlib.Path(compileopt_path)\ + .joinpath(self.tool_chain, userconfig_file_name), + target_path) + if self.build_type != default_build_type or\ + self.tool_chain != default_tool_chain: + flags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC + modes = stat.S_IWUSR | stat.S_IRUSR + with os.fdopen(os.open(self.config, flags, modes), + 'w') as configini: + self.cfg.write(configini) + + def set_env_path(self): + ''' + Function description: Write the toolchain and version information to + the config.ini file. + ''' + + compiler_path = None + tools_path = self.cfg.get('gn_args', 'tools_path') + + cur_sys = platform.system() + if cur_sys == "Linux": + gn_name = 'gn-linux' + ninja_name = 'ninja-linux' + hcc_name = 'cc_riscv32_musl' + hccfpu_name = 'cc_riscv32_musl_fp' + elif cur_sys == "Windows": + gn_name = 'gn-win' + ninja_name = 'ninja-win' + hcc_name = 'cc_riscv32_musl_win' + hccfpu_name = 'cc_riscv32_musl_fp_win' + # Setting GN and NINJA env. + gn_path = pathlib.Path(tools_path).joinpath(cur_sys, gn_name) + ninja_path = pathlib.Path(tools_path).joinpath(cur_sys, ninja_name) + # Setting Toolchain env. + if self.tool_chain == 'hcc': + # Check whether the env contains hcc. + compiler_path = distutils.spawn\ + .find_executable("riscv32-linux-musl-gcc") + if compiler_path is None: + # If no, set the hcc path to the env. + compiler_path = pathlib.Path(tools_path)\ + .joinpath(cur_sys, hcc_name, 'bin') + elif self.tool_chain == 'hcc_fpu': + # Check whether the env contains hcc_fpu. + compiler_path = distutils.spawn\ + .find_executable("riscv32-linux-musl-gcc") + if compiler_path is None: + # If no, set the hcc_fpu path to the env. + compiler_path = pathlib.Path(tools_path)\ + .joinpath(cur_sys, hccfpu_name, 'bin') + else: + raise Exception('Error: Unsupported compiler {}.'\ + .format(self.tool_chain)) + + str_path = 'PATH' + if cur_sys == "Linux": + # Setting Temporary Environment Variables + os.environ[str_path] = "{}:{}:{}:{}".format(os.environ[str_path], + gn_path, ninja_path, compiler_path) + elif cur_sys == "Windows": + # Setting Temporary Environment Variables + os.environ[str_path] = "{};{};{};{}".format(os.environ[str_path], + gn_path, ninja_path, compiler_path) + + # get compile cmd + def get_cmd(self, gn_path, ninja_path): + if not pathlib.Path(self.config).exists(): + raise Exception('Error: {} not exist, please check.'.format( + self.config)) + return self.__parse_compile_config(gn_path, ninja_path) + + def get_gn_args(self): + self.args_list.append(self.cfg.get('gn_args', 'build_type_args')) + self.args_list.append(self.cfg.get('gn_args', 'toolchain_args')) + return "".join(self.args_list).replace('\"', '\\"') + + def __set_path(self): + self.__root_path = pathlib.Path.cwd() + self.__build_path = pathlib.Path(self.__root_path).joinpath('build') + if not pathlib.Path(self.__build_path).exists(): + raise Exception('Error: {} not exist, please check.'.format( + self.__build_path)) + self.__out_path = pathlib.Path(self.__root_path)\ + .joinpath('out') + + def __parse_compile_config(self, gn_path, ninja_path): + section = 'env' + self.cfg.set(section, 'build_path', str(self.get_build_path())) + out_relpath = os.path.relpath(self.get_out_path()) + self.cfg.set(section, 'out_path', str(out_relpath)) + self.cfg.set(section, 'gn_path', gn_path) + self.cfg.set(section, 'ninja_path', ninja_path) + self.cfg.set(section, 'gn_args', self.get_gn_args()) + return [self.cfg.get(section, 'gn_cmd'), + self.cfg.get(section, 'ninja_cmd')] + + +class Compile(): + ''' + Function description: Obtain the path of the compilation tool and + start compilation. + ''' + + gn_path = None + ninja_path = None + + @classmethod + def get_tool_path(cls): + # Check whether the GN file exists. + cls.gn_path = distutils.spawn.find_executable('gn') + if cls.gn_path is None: + raise Exception('Error: Can\'t find gn, install it please.') + + # Check whether the NINJA file exists. + cls.ninja_path = distutils.spawn.find_executable('ninja') + if cls.ninja_path is None: + raise Exception('Error: Can\'t find ninja, install it please.') + + def compile(self, config): + cmd_list = config.get_cmd(self.gn_path, self.ninja_path) + for cmd in cmd_list: + # Strings can be directly used in the Windows environment. + if sys.platform == 'linux': + cmd = shlex.split(cmd) + # If shell is True, cmd is a string; if not, a sequence. + exec_command(cmd, log_path=config.log_path, shell=False) + + +class CallbackDict(object): + ''' + Function description: ??? + ''' + + handlers = None + + # write the default value. + def __init__(self): + self.handlers = collections.defaultdict(list) + + def register(self, event, callback): + self.handlers[event].append(callback) + + # ??? + def execute(self, event, **kwargs): + if event not in self.handlers: + raise Exception('{} not found in callback dict'.format(event)) + for handler in self.handlers.get(event, []): + handler(**kwargs) + + +def main(argv): + ''' + Function description: build and compile entry function. + ''' + + # Read the default command value + configini_path = pathlib.Path.cwd().joinpath('build', 'config.ini') + configini = ConfigParser() + configini.read(configini_path) + buildtype_default = configini.get('gn_args', 'build_type') + toolchain_default = configini.get('gn_args', 'toolchain_select') + + # Command parser. + parser = argparse.ArgumentParser(usage=usage(), + description='auto build system') + parser.add_argument('action', help='build or checkbuild or clean or info', + nargs='*', default=['info']) + parser.add_argument('-b', '--build_type', help='release or debug version.', + nargs=1, default=['{}'.format(buildtype_default)]) + parser.add_argument('-t', '--tool_chain', help='hcc or hcc_fpu.', + nargs=1, default=['{}'.format(toolchain_default)]) + parser.set_defaults(command=exec_create) + args = parser.parse_args() + + try: + status = args.command(args) + # Generally, press Ctrl+C to raise exception. + except KeyboardInterrupt: + logging.warning('interrupted') + status = -1 + # Catch Other Exceptions + except Exception as exce: + parser.print_help() + status = -1 + finally: + pass + + return status + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/vendor/others/demo/5-tim_adc/demo/build/build_gn.py b/vendor/others/demo/5-tim_adc/demo/build/build_gn.py new file mode 100644 index 000000000..b3ac601d8 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/build/build_gn.py @@ -0,0 +1,819 @@ +# !/usr/bin/env python +# -*- coding: utf-8 -*- + +# @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +# following disclaimer in the documentation and/or other materials provided with the distribution. +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# build_gn.py Function implementation: Automatically builds the compilation +# framework. + +import sys +import os +import stat +import subprocess +import pathlib +import json +import shlex +import shutil + +from createxml.mk_prim_xml_step1 import CreateCfg +from createxml.mk_prim_xml_step2 import CreateXml + + +def read_json_file(input_file): + ''' + Function description: Read the json file. + ''' + + if not pathlib.Path(input_file).exists(): + raise Exception('file [{}] no exist.'.format(input_file)) + data = None + with open(input_file, 'rb') as input_f: + data = json.load(input_f) + return data + + +def del_allgn(): + ''' + Function description: Delete all GN build scripts. + ''' + + for (dirpath, _, filenames) in os.walk(pathlib.Path()): + if "build" in dirpath or\ + ("middleware" in dirpath and "hisilicon" in dirpath): + continue + for file in filenames: + if str(pathlib.Path(file)) != 'BUILD.gn': + continue + os.remove(pathlib.Path(dirpath).joinpath(file)) + global_buildfile = pathlib.Path().joinpath('build', 'BUILD.gn') + if global_buildfile.exists(): + os.remove(global_buildfile) + + +class AutoCreate(): + ''' + Function description: Automatically builds the compilation framework. + ''' + + def __init__(self, json_content): + ''' + Function description: Initialization is invoked by default. + ''' + + if 'system' not in json_content: + raise Exception('Error: system not exist,please check.') + + # Stores information about the compile subsystem. + compile_dict = dict() + # Stores information about the transplant subsystem. + transplant_dict = dict() + # Save the path of third-party components so that + # they are not scanned during automatic construction. + self.ext_component_path = [] + + for subsystem in json_content['system']: + if subsystem['name'] == 'compile': + compile_dict = subsystem + elif subsystem['name'] == 'transplant': + transplant_dict = subsystem + + if transplant_dict: + self.subsystem_transplant(transplant_dict) + if compile_dict: + self.subsystem_compile(compile_dict) + else: + raise Exception('Error: compile subsystem not exist,please check.') + + @staticmethod + def check_extcomponentkeys_isexists(ext_component): + # Instantiation parameter check. + str_name = 'name' + str_ext_component = 'ext_component' + str_exec_path = 'exec_path' + if not isinstance(ext_component, dict): + raise TypeError("ext_component in para type error {}".format( + type(ext_component))) + is_exception = str_name not in ext_component or\ + str_ext_component not in ext_component or\ + not ext_component.get(str_name) or\ + not ext_component.get(str_ext_component) + if is_exception: + raise Exception('Error: ext_components are incomplete,' + 'Identification failed.') + + # Check whether the key exists. + if str_exec_path not in ext_component[str_ext_component]: + raise Exception('Error: {} key exec_path not exist, please' + 'check.'.format(ext_component.get(str_name))) + elif 'exec_cmd' not in ext_component[str_ext_component]: + raise Exception('Error: {} key exec_cmd not exist, please' + 'check.'.format(ext_component.get(str_name))) + elif 'includes' not in ext_component[str_ext_component]: + raise Exception('Error: {} key includes not exist, please' + 'check.'.format(ext_component.get(str_name))) + + # If the value is empty, an exception is thrown. + if not ext_component[str_ext_component][str_exec_path]: + raise Exception('Error: {} value exec_path not exist, please' + 'check.'.format(ext_component.get(str_name))) + if not ext_component[str_ext_component]['exec_cmd']: + raise Exception('Error: {} value exec_cmd not exist, please' + 'check.'.format(ext_component.get(str_name))) + # An exception is thrown when the sources fails to be searched. + if not pathlib.Path(ext_component[str_ext_component] + [str_exec_path]).is_dir(): + raise Exception('Error: {} dir not exist, please ' + 'check.'.format(ext_component.get(str_name))) + + @staticmethod + def copy_ext_component_includes(includes_list): + # Instantiation parameter check. + if not isinstance(includes_list, list): + raise TypeError("includes_list in para type error {}".format( + type(includes_list))) + + for include in includes_list: + if not pathlib.Path(include).is_dir(): + raise Exception('Error: {} is not a dir, please ' + 'check.'.format(include)) + for (dirpath, _, filenames) in os.walk(pathlib.Path( + include)): + for file in filenames: + if pathlib.Path(file).suffix != '.h': + continue + include_file = pathlib.Path(dirpath).joinpath(file) + copy_path = pathlib.Path('middleware').joinpath( + 'thirdparty', 'sysroot', 'include') + shutil.copy(include_file, copy_path) + + @staticmethod + def cmd_exec(command): + ''' + Function description: Run the compilation command. + ''' + + # Instantiation parameter check. + if not isinstance(command, str): + raise TypeError("command in para type error {}".format( + type(command))) + + cmd = shlex.split(command) + proc = subprocess.Popen(cmd, shell=False) + proc.wait() + ret_code = proc.returncode + if ret_code != 0: + raise Exception("{} failed, return code is {}".format(cmd, + ret_code)) + + @staticmethod + def check_modulekeys_isexists(module_content): + # Check whether the key exists. + str_sources = 'sources' + if 'name' not in module_content: + raise Exception('Error: {} key name not exist, please check.' + .format(module_content.get(str_sources))) + elif 'target_type' not in module_content: + raise Exception('Error: {} key target_type not exist, please' + 'check.'.format(module_content.get(str_sources))) + elif 'includes' not in module_content: + raise Exception('Error: {} key includes not exist, please check.' + .format(module_content.get(str_sources))) + elif 'define' not in module_content: + raise Exception('Error: {} key define not exist, please check.' + .format(module_content.get(str_sources))) + elif 'libs' not in module_content: + raise Exception('Error: {} key libs not exist, please check.' + .format(module_content.get(str_sources))) + elif 'lds_scripts' not in module_content: + raise Exception('Error: {} key lds_scripts not exist, please' + 'check.'.format(module_content.get(str_sources))) + elif 'cflags' not in module_content: + raise Exception('Error: {} key cflags not exist, please check.' + .format(module_content.get(str_sources))) + elif 'asmflags' not in module_content: + raise Exception('Error: {} key asmflags not exist, please check.' + .format(module_content.get(str_sources))) + elif 'ldflags' not in module_content: + raise Exception('Error: {} key ldflags not exist, please check.' + .format(module_content.get(str_sources))) + + @staticmethod + def nochecklist(path, nocheck_list): + ''' + Function description: If the path exists in the nocheck_list, + a false is returned,Otherwise, a true is returned. + ''' + + # Instantiation parameter check. + if not isinstance(path, str): + raise TypeError("path in para type error {}".format( + type(path))) + if not isinstance(nocheck_list, list): + raise TypeError("nocheck_list in para type error {}".format( + type(nocheck_list))) + + for nocheck in nocheck_list: + if nocheck in path: + return False + + return True + + def subsystem_transplant(self, subsystem): + ''' + Function description: transplant Subsystem + ''' + + # Instantiation parameter check. + if not isinstance(subsystem, dict): + raise TypeError("subsystem in para type error {}".format( + type(subsystem))) + + ext_component_key = 'ext_component' + for ext_component in subsystem['subsystem']: + if not ext_component: + continue + self.check_extcomponentkeys_isexists(ext_component) + + path = str(pathlib.Path( + ext_component[ext_component_key]['exec_path'])) + self.ext_component_path.append(path) + command = ext_component[ext_component_key]['exec_cmd'] + if ext_component[ext_component_key]['includes']: + self.copy_ext_component_includes(ext_component[ext_component_key] + ['includes']) + + curr_dir = os.getcwd() + os.chdir(path) + if '&&' in command: + command_list = command.split('&&') + for cmd in command_list: + self.cmd_exec(cmd) + else: + self.cmd_exec(command) + os.chdir(os.path.realpath(curr_dir)) + + def subsystem_compile(self, subsystem): + ''' + Function description: Compiling Subsystem + ''' + + # Instantiation parameter check. + if not isinstance(subsystem, dict): + raise TypeError("subsystem in para type error {}".format( + type(subsystem))) + + # Records the list of modules to be built in the JSON file. + self.json_module_name = [] + self.json_module_path = [] + # List of paths that are not checked. + self.nocheck = [] + # Save global build parameters in a dictionary. + globalbuild_dict = dict() + + # Read the JSON file to build the module compilation script. + for component in subsystem['subsystem']: + # Perform global build after module build is complete. + if component['name'] == 'compile_frame': + globalbuild_dict = component + continue + for module in component['component']: + # If the key exists and the key value also exists + if 'sources' in module and\ + module.get('sources'): + self.localgn_create(module) + + if not globalbuild_dict: + raise Exception('Error: Global Build Parameters not exist,' + 'please check.') + # Global compilation script building + self.globalgn_create(globalbuild_dict) + + def localgn_create(self, module_content): + ''' + Function description: Module partial construction. + notes: + (1)Create the Build.gn file in the first path of sources. + ''' + + # Instantiation parameter check. + if not isinstance(module_content, dict): + raise TypeError("module_content in para type error {}".format( + type(module_content))) + + self.check_modulekeys_isexists(module_content) + + # Reads the content of the JSON file. + # If the name value is empty, an exception is thrown. + if module_content.get('name'): + self.name = module_content['name'] + else: + raise Exception('Error: module name is None, please check.') + self.json_module_name.append(self.name) + + # If the target_type value is empty, an warning is thrown. + if module_content.get('target_type'): + self.target_type = module_content['target_type'] + else: + self.target_type = "obj" + + # Converting a Relative Path to an Absolute Path. + self.sources = [] + for source_path in module_content['sources']: + self.sources.append("{}".format( + os.path.relpath(pathlib.Path(source_path)))) + self.json_module_path.append(self.sources) + self.includes = [] + for include_path in module_content['includes']: + self.includes.append("{}".format( + os.path.relpath(pathlib.Path(include_path)))) + + self.define = module_content['define'] + self.libs = module_content['libs'] + self.lds_scripts = module_content['lds_scripts'] + self.cflags = module_content['cflags'] + self.asmflags = module_content['asmflags'] + self.ldflags = module_content['ldflags'] + + # Create the Build.gn file in the first path of sources. + self.gn_create(self.sources[0]) + + def globalgn_create(self, globalbuild_dict): + ''' + Function description: Global Build Generates Executable Files. + notes: + (1)Create the Build.gn file in the build directory. + (2)Executable file name:target. + ''' + + str_cflags = 'cflags' + str_ldflags = 'ldflags' + # Instantiation parameter check. + if not isinstance(globalbuild_dict, dict): + raise TypeError("globalbuild_dict in para type error {}".format( + type(globalbuild_dict))) + + # Check whether the key exists. + if 'define' not in globalbuild_dict: + raise Exception('Error: compile_frame key define not exist, please check.') + elif str_cflags not in globalbuild_dict: + raise Exception('Error: compile_frame key cflags not exist, please check.') + elif 'asmflags' not in globalbuild_dict: + raise Exception('Error: compile_frame key asmflags not exist, please check.') + elif str_ldflags not in globalbuild_dict: + raise Exception('Error: compile_frame key ldflags not exist, please check.') + elif 'nocheck' not in globalbuild_dict: + raise Exception('Error: compile_frame key nocheck not exist, please check.') + + # Check whether the value exists. + if not globalbuild_dict.get(str_cflags): + raise Exception('Error: global cflags is None, please check.') + elif not globalbuild_dict.get(str_ldflags): + raise Exception('Error: global ldflags is None, please check.') + + self.name = 'target.elf' + self.target_type = 'executable' + self.sources = [] + self.includes = [] + self.libs = [] + self.extlibspath = [] + self.extlibsname = [] + self.extlibsinclude = [] + for name, path in zip(self.json_module_name, self.json_module_path): + if pathlib.Path(path[0]).is_file(): + self.libs.append("{0}:{1}".format(pathlib.Path(path[0]).parent, name)) + else: + self.libs.append("{0}:{1}".format(path[0], name)) + self.define = globalbuild_dict['define'] + self.cflags = globalbuild_dict[str_cflags] + self.asmflags = globalbuild_dict['asmflags'] + self.ldflags = globalbuild_dict[str_ldflags] + for nocheck_path in globalbuild_dict['nocheck']: + self.nocheck.append("{}".format(pathlib.Path(nocheck_path))) + if 'extlibspath' in globalbuild_dict: + self.extlibspath = globalbuild_dict['extlibspath'] + if 'extlibsname' in globalbuild_dict: + self.extlibsname = globalbuild_dict['extlibsname'] + if 'extlibsinclude' in globalbuild_dict: + self.extlibsinclude = globalbuild_dict['extlibsinclude'] + + self._build_path = pathlib.Path.cwd().joinpath('build') + self.gn_create(self._build_path) + + def gn_create(self, path): + ''' + Function description: Creating a BUILD.gn File. + ''' + + # Module Building Content List + self.build_content = [] + if pathlib.Path(path).is_file(): + path = pathlib.Path(path).parent + buildgn_path = pathlib.Path(path).joinpath('BUILD.gn') + + flags = os.O_WRONLY | os.O_CREAT + modes = stat.S_IWUSR | stat.S_IRUSR + with os.fdopen(os.open(buildgn_path, flags, modes), + 'w') as build_file: + self.build_content.append("import(\"//build/toolchain/config.gni\"" + ")\n") + self.defaults_config() + self.target_config() + build_file.writelines(self.build_content) + + def defaults_config(self): + ''' + Function description: default configuration of the target_type. + ''' + + if self.target_type == "obj": + self.build_content.append("set_defaults(\"source_set\") {\n") + elif self.target_type == "static": + self.build_content.append("set_defaults(\"static_library\") {\n") + elif self.target_type == "share": + self.build_content.append("set_defaults(\"shared_library\") {\n") + elif self.target_type == "executable": + self.build_content.append("set_defaults(\"executable\") {\n") + else: + raise Exception('Error: {} is incorrect, please check.'.format( + self.target_type)) + + self.compileflag_config() + self.define_config() + + self.build_content.append(''' if(build_type == "debug") { + cflags += [ + "-g" + ] + }else if(build_type == "release") { + cflags += [ + "-fomit-frame-pointer" + ] + defines += [ + "NDEBUG" + ] + } +}''') + + def compileflag_config(self): + ''' + Function description: Setting Compilation Parameters. + ''' + + close_bracket = " ]\n" + prefix = " \"" + suffix = "\",\n" + # set cflags + if self.cflags: + self.build_content.append(" cflags = [\n") + for cflags in self.cflags: + self.build_content.append(prefix + cflags + suffix) + self.build_content.append(close_bracket) + + # set asmflags + if self.asmflags: + self.build_content.append(" asmflags = [\n") + for asmflags in self.asmflags: + self.build_content.append(prefix + asmflags + suffix) + self.build_content.append(close_bracket) + + # set ldflags + if self.ldflags: + self.build_content.append(" ldflags = [\n") + for ldflags in self.ldflags: + self.build_content.append(prefix + ldflags + suffix) + + self.lds_scripts_config() + self.library_link_config() + + self.build_content.append(close_bracket) + + def define_config(self): + ''' + Function description: Setting Precompiled Macros. + ''' + + # set define + self.build_content.append(" defines = [\n") + for define in self.define: + self.build_content.append(" \"{}\",\n".format(define)) + self.build_content.append(" ]\n") + + def target_config(self): + ''' + Function description: Required File Configuration for Target. + ''' + + if self.target_type == "obj": + self.build_content.append("source_set(\"%s\") {\n" + % (self.name)) + elif self.target_type == "static": + self.build_content.append("static_library(\"%s\") {\n" + % (self.name)) + elif self.target_type == "share": + self.build_content.append("shared_library(\"%s\") {\n" + % (self.name)) + elif self.target_type == "executable": + self.build_content.append("executable(\"%s\") {\n" + % (self.name)) + else: + raise Exception('Error: {} is incorrect, please check.'.format( + self.target_type)) + + self.sources_config() + self.include_dirs_config() + self.deps_config() + + self.build_content.append("}\n") + + def xml_create(self): + build_xml_para = {} + c_file = self.xmlfiles + module_name = "mcu_xml" + str_dfx_db = 'dfx_db' + build_tmp_path = pathlib.Path.cwd().joinpath('build', 'createxml', + 'mss_prim_db') + if not build_tmp_path: + os.makedirs(build_tmp_path) + prim_xml_cfg_dir = build_tmp_path.joinpath(str_dfx_db, 'xml_cfg') + prim_xml_cfg_file = build_tmp_path.joinpath(str_dfx_db, 'xml_cfg', + module_name + '.cfg') + in_path = pathlib.Path.cwd().joinpath('build', 'createxml', + 'mk_dfx_xml.json') + hdb_xml_temp_root_dir = build_tmp_path.joinpath('modules') + hdb_xml_file_id = pathlib.Path.cwd().joinpath('drivers', + 'debug', 'log', 'inc', 'file_id_defs.h') + prim_xml_key_word = module_name + i_file_dir = build_tmp_path.joinpath('modules', module_name) + prim_xml_dst_full_path = build_tmp_path.joinpath(str_dfx_db, 'log.xml') + sources = c_file + build_xml_para.update({"cflags": self.cflags}) + build_xml_para.update({"c_file": c_file}) + build_xml_para.update({"build_tmp_path": build_tmp_path}) + build_xml_para.update({"prim_xml_cfg_dir": prim_xml_cfg_dir}) + build_xml_para.update({"prim_xml_cfg_file": prim_xml_cfg_file}) + build_xml_para.update({"module_name": module_name}) + build_xml_para.update({"in_path": in_path}) + build_xml_para.update({"hdb_xml_temp_root_dir": hdb_xml_temp_root_dir}) + build_xml_para.update({"hdb_xml_file_id": hdb_xml_file_id}) + build_xml_para.update({"prim_xml_key_word": prim_xml_key_word}) + build_xml_para.update({"i_file_dir": i_file_dir}) + build_xml_para.update({"sources": sources}) + build_xml_para.update({"cc": "riscv32-linux-musl-gcc"}) + build_xml_para.update({"include": self.includes_path}) + build_xml_para.update({"prim_xml_dst_full_path": + prim_xml_dst_full_path}) + createcfg = CreateCfg() + createcfg.generate_params_dic(build_xml_para) + createcfg.get_necessary_information() + createxml = CreateXml() + createxml.get_cfg_files(build_xml_para) + createxml.init_tree() + createxml.parse_cfg_file() + createxml.tree_to_xml() + + def sources_config(self): + ''' + Function description: Source File Configuration. + ''' + + if self.target_type != "executable": + self.local_sources_scan() + return True + + self.global_sources_scan() + return True + + def global_sources_scan(self): + ''' + Function description: Global Source File Search. + ''' + + self.nocheck_lists = [] + self.nocheck_lists_file = [] + + self.build_content.append(" sources = [\n") + self.xmlfiles = [] + for module_list in self.json_module_path: + for sources_list in module_list: + if pathlib.Path(sources_list).is_file(): + self.nocheck_lists_file.append(sources_list) + else: + self.nocheck_lists.append(sources_list) + for nocheck_list in self.nocheck: + self.nocheck_lists.append(nocheck_list) + self.nocheck_lists.extend(self.ext_component_path) + + self._root_path = pathlib.Path() + for (dirpath, dirnames, filenames) in os.walk(self._root_path): + dirnames.sort() + filenames.sort() + # Find all module code except in the JSON file + if not self.nochecklist(dirpath, self.nocheck_lists): + continue + + for file_global in filenames: + if pathlib.Path(file_global).suffix != '.c' and\ + pathlib.Path(file_global).suffix != '.S': + continue + if not self.nochecklist(str(pathlib.Path(dirpath). + joinpath(file_global)), + self.nocheck_lists_file): + continue + if pathlib.Path(file_global).suffix == '.c': + self.xmlfiles.append("{}".format( + pathlib.Path(dirpath) + .joinpath(file_global))) + self.build_content.append(" \"//{}\",\n".format( + pathlib.Path(dirpath) + .joinpath(file_global))) + + self.build_content.append(" ]\n") + + def local_subdirectory_sources_scan(self, sources, cfile_list): + ''' + Function description: Search for source files in the subdirectory. + ''' + + for (dirpath, dirnames, filenames) in os.walk(sources): + dirnames.sort() + filenames.sort() + for file_local in filenames: + if (pathlib.Path(file_local).suffix != '.c' and\ + pathlib.Path(file_local).suffix != '.S') or\ + file_local in cfile_list: + continue + cfile_list.append(file_local) + self.build_content.append(" \"//{}\",\n" + .format(pathlib.Path(dirpath) + .joinpath(file_local))) + + def local_sources_scan(self): + ''' + Function description: module Source File Search. + ''' + + cfile_list = [] + + self.build_content.append(" sources = [\n") + for sources in self.sources: + # An exception is thrown when the sources fails to be searched. + if pathlib.Path(sources).is_file(): + if pathlib.Path(sources).suffix == '.c' or\ + pathlib.Path(sources).suffix == '.S': + self.build_content.append(" \"//{}\",\n" + .format(sources)) + else: + self.local_subdirectory_sources_scan(sources, cfile_list) + + self.build_content.append(" ]\n") + + def include_dirs_config(self): + ''' + Function description: Include Dirs Configuration. + ''' + + # set includes + if self.target_type != "executable": + if self.includes: + self.build_content.append(" include_dirs = [\n") + for include in self.includes: + self.includes_scan(include) + self.build_content.append(" ]\n") + return True + + self.build_content.append(" include_dirs = [\n") + self.includes_scan(pathlib.Path()) + for extlibsinclude in self.extlibsinclude: + self.build_content.append(" \"//{}\",\n" + .format(os.path.relpath(extlibsinclude))) + self.build_content.append(" ]\n") + return True + + def includes_scan(self, path): + self.includes_path = [] + for (dirpath, dirnames, filenames) in os.walk(path): + dirnames.sort() + filenames.sort() + if not self.nochecklist(dirpath, self.ext_component_path): + continue + if not self.nochecklist(dirpath, self.nocheck): + continue + for file in filenames: + if pathlib.Path(file).suffix != '.h': + continue + self.build_content.append(" \"//{}\",\n" + .format(pathlib.Path(dirpath))) + self.includes_path.append("-I" + str(pathlib.Path.cwd() + .joinpath(dirpath))) + break + + def deps_config(self): + ''' + Function description: Dependency Library File Configuration. + ''' + + if self.target_type == "executable": + if self.libs: + self.build_content.append(" deps = [\n") + + for libs in self.libs: + self.build_content.append(" \"//{}\",\n" + .format(libs)) + + self.build_content.append(" ]\n") + + def lds_scripts_config(self): + ''' + Function description: Lds File Configuration. + ''' + + if self.target_type == "executable": + for filename in os.listdir(pathlib.Path("chip")): + if filename == "target": + continue + break + self._lds_scripts_path = pathlib.Path("..").joinpath('chip', + filename, 'flash.lds') + self.build_content.append(" \"-T{}\",\n" + .format(self._lds_scripts_path)) + + def library_link_config(self): + ''' + Function description: Static Library Link Configuration. + ''' + + if self.target_type != "executable": + return + + libs_list = [] + out_path_name = 'out' + libs_path_name = 'libs' + spliter = '.' + libs_path = ["../{}".format(pathlib.Path(out_path_name).joinpath(libs_path_name))] + if pathlib.Path(out_path_name).joinpath(libs_path_name).exists(): + for libname in os.listdir(pathlib.Path(out_path_name).joinpath(libs_path_name)): + if libname.split(spliter)[-1] != 'a': + continue + libname = libname[3:-2] + if libname not in self.json_module_name: + libs_list.append(libname) + if not libs_list: + libs_path = [] + + for (dirpath, _, filenames) in os.walk(pathlib.Path(spliter)): + if out_path_name in dirpath and libs_path_name in dirpath: + continue + for file in filenames: + if file.split(spliter)[-1] == 'a': + libs_path.append(".{}".format(dirpath)) + libs_list.append(file[3:-2]) + + if libs_list or self.extlibsname: + self.build_content.append(" \"-Wl,--whole-archive\",\n") + # Deduplicate paths. + libs_path = list(set(libs_path)) + for libpath in libs_path: + self.build_content.append(" \"-L{}\",\n" + .format(libpath)) + for extlibspath in self.extlibspath: + self.build_content.append(" \"-L{}\",\n" + .format(extlibspath)) + for liblist in libs_list: + self.build_content.append(" \"-l{}\",\n" + .format(liblist)) + for extlibsname in self.extlibsname: + self.build_content.append(" \"-l{}\",\n" + .format(extlibsname[3:-2])) + self.build_content.append(" \"-Wl,--no-whole-archive\",\n") + + +def main(argv): + ''' + Function description: buildgn entry function. + ''' + + #clear gn + del_allgn() + #auto build + product_json = pathlib.Path.cwd().joinpath('chip', 'target', + 'userconfig.json') + json_content = read_json_file(product_json) + AutoCreate(json_content) + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/build/config.ini b/vendor/others/demo/5-tim_adc/demo/build/config.ini new file mode 100644 index 000000000..01f981905 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/build/config.ini @@ -0,0 +1,16 @@ +[env] +build_path = +gn_path = +out_path = +gn_args = +gn_cmd = %(gn_path)s gen %(out_path)s --root=. --dotfile=build/.gn --args="%(gn_args)s" +ninja_path = +ninja_cmd = %(ninja_path)s -w dupbuild=warn -C %(out_path)s + +[gn_args] +tools_path = +build_type = release +build_type_args = build_type="%(build_type)s" +toolchain_select = hcc_fpu +toolchain_args = build_compiler_specified="%(toolchain_select)s" +gen_crc = yes diff --git a/vendor/others/demo/5-tim_adc/demo/build/config/BUILDCONFIG.gn b/vendor/others/demo/5-tim_adc/demo/build/config/BUILDCONFIG.gn new file mode 100644 index 000000000..db7374fee --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/build/config/BUILDCONFIG.gn @@ -0,0 +1,25 @@ +# @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +# following disclaimer in the documentation and/or other materials provided with the distribution. +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# BUILD.gn Function implementation: Selecting the default compilation toolchain + +import("//build/toolchain/config.gni") + +if (build_compiler_specified == "hcc") { + set_default_toolchain("//build/toolchain:riscv32_hcc") +}else if (build_compiler_specified == "hcc_fpu") { + set_default_toolchain("//build/toolchain:riscv32_hcc") +} diff --git a/vendor/others/demo/5-tim_adc/demo/build/config/hcc/userconfig.json b/vendor/others/demo/5-tim_adc/demo/build/config/hcc/userconfig.json new file mode 100644 index 000000000..ec926c9b7 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/build/config/hcc/userconfig.json @@ -0,0 +1,127 @@ +{ + "system": [ + { + "name": "compile", + "subsystem": [ + { + "name": "static_lib", + "component": [ + { + "name": "", + "target_type": "static", + "sources": [], + "includes": [], + "define": [], + "libs": [], + "lds_scripts": [], + "cflags": [], + "asmflags": [], + "ldflags": [] + } + ] + }, + { + "name": "compile_frame", + "cflags": [ + "-Os", + "-pipe", + "-Wall", + "-Wextra", + "-Winit-self", + "-Wmissing-include-dirs", + "-Wtrampolines", + "-Werror=undef", + "-Wpointer-arith", + "-Wlogical-op", + "-Wstrict-prototypes", + "-Wmissing-prototypes", + "-Wjump-misses-init", + "-Wformat=2", + "-Wfloat-equal", + "-Wdate-time", + "-Wswitch-default", + "-Wimplicit-fallthrough=2", + "-Wno-missing-declarations", + "-std=gnu11", + "-fsigned-char", + "-fno-builtin", + "-ffreestanding", + "-nostdlib", + "-fno-exceptions", + "-fno-unwind-tables", + "-fno-short-enums", + "-fno-common", + "-freg-struct-return", + "-mabi=ilp32", + "-march=rv32imc", + "-fno-strict-aliasing", + "-fdata-sections", + "-ffunction-sections", + "-falign-functions=2", + "-fno-schedule-insns", + "-fno-optimize-strlen", + "-fno-aggressive-loop-optimizations", + "-Wa,-enable-c-lbu-sb", + "-Wa,-enable-c-lhu-sh", + "-msmall-data-limit=0", + "-fimm-compare", + "-femit-muliadd", + "-fmerge-immshf", + "-femit-uxtb-uxth", + "-femit-lli", + "-fldm-stm-optimize", + "-fno-inline-small-functions", + "-mtune=size", + "-mpush-pop", + "-femit-clz", + "-madjust-regorder", + "-madjust-const-cost", + "-freorder-commu-args", + "-fimm-compare-expand", + "-frmv-str-zero", + "-mfp-const-opt", + "-mswitch-jump-table", + "-frtl-sequence-abstract", + "-frtl-hoist-sink", + "-fsafe-alias-multipointer", + "-finline-optimize-size", + "-fmuliadd-expand", + "-mlli-expand", + "-Wa,-mcjal-expand", + "-foptimize-reg-alloc", + "-fsplit-multi-zero-assignments", + "-floop-optimize-size", + "-mpattern-abstract", + "-foptimize-pro-and-epilogue", + "-fstrict-volatile-bitfields", + "-Wcast-align", + "-fstrong-eval-order", + "-Wunused", + "-Wvla", + "-Wshadow", + "-fvisibility=hidden", + "-Werror" + ], + "asmflags": [], + "ldflags": [ + "-Wl,-Map,bin/target.map", + "-Wl,--enjal16", + "-Wl,--gc-section", + "-Wl,--cjal-relax", + "-Wl,--dslf", + "-Wl,--jal-transfer", + "-nostdlib", + "-static", + "-lgcc-nano", + "-lc", + "-Wl,-Bsymbolic", + "-rdynamic", + "-Wl,--no-undefined" + ], + "define": [], + "nocheck": [] + } + ] + } + ] +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/build/config/hcc_fpu/userconfig.json b/vendor/others/demo/5-tim_adc/demo/build/config/hcc_fpu/userconfig.json new file mode 100644 index 000000000..c7feccf33 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/build/config/hcc_fpu/userconfig.json @@ -0,0 +1,129 @@ +{ + "system": [ + { + "name": "compile", + "subsystem": [ + { + "name": "static_lib", + "component": [ + { + "name": "", + "target_type": "static", + "sources": [], + "includes": [], + "define": [], + "libs": [], + "lds_scripts": [], + "cflags": [], + "asmflags": [], + "ldflags": [] + } + ] + }, + { + "name": "compile_frame", + "cflags": [ + "-Os", + "-pipe", + "-Wall", + "-Wextra", + "-Winit-self", + "-Wmissing-include-dirs", + "-Wtrampolines", + "-Werror=undef", + "-Wpointer-arith", + "-Wlogical-op", + "-Wstrict-prototypes", + "-Wmissing-prototypes", + "-Wjump-misses-init", + "-Wformat=2", + "-Wfloat-equal", + "-Wdate-time", + "-Wswitch-default", + "-Wimplicit-fallthrough=2", + "-Wno-missing-declarations", + "-std=gnu11", + "-fsigned-char", + "-fno-builtin", + "-ffreestanding", + "-nostdlib", + "-fno-exceptions", + "-fno-unwind-tables", + "-fno-short-enums", + "-fno-common", + "-freg-struct-return", + "-mabi=ilp32f", + "-march=rv32imfc", + "-fno-strict-aliasing", + "-fdata-sections", + "-ffunction-sections", + "-falign-functions=2", + "-fno-schedule-insns", + "-fno-optimize-strlen", + "-fno-aggressive-loop-optimizations", + "-Wa,-enable-c-lbu-sb", + "-Wa,-enable-c-lhu-sh", + "-msmall-data-limit=0", + "-fimm-compare", + "-femit-muliadd", + "-fmerge-immshf", + "-femit-uxtb-uxth", + "-femit-lli", + "-fldm-stm-optimize", + "-fno-inline-small-functions", + "-mtune=size", + "-mpush-pop", + "-femit-clz", + "-madjust-regorder", + "-madjust-const-cost", + "-freorder-commu-args", + "-fimm-compare-expand", + "-frmv-str-zero", + "-mfp-const-opt", + "-mswitch-jump-table", + "-frtl-sequence-abstract", + "-frtl-hoist-sink", + "-fsafe-alias-multipointer", + "-finline-optimize-size", + "-fmuliadd-expand", + "-mlli-expand", + "-Wa,-mcjal-expand", + "-foptimize-reg-alloc", + "-fsplit-multi-zero-assignments", + "-floop-optimize-size", + "-mpattern-abstract", + "-foptimize-pro-and-epilogue", + "-fstrict-volatile-bitfields", + "-Wcast-align", + "-fstrong-eval-order", + "-Wunused", + "-Wvla", + "-Wshadow", + "-fvisibility=hidden", + "-Werror" + ], + "asmflags": [], + "ldflags": [ + "-Wl,-Map,bin/target.map", + "-Wl,--enjal16", + "-Wl,--gc-section", + "-Wl,--cjal-relax", + "-Wl,--dslf", + "-Wl,--jal-transfer", + "-nostdlib", + "-static", + "-lgcc", + "-lc", + "-Wl,-Bsymbolic", + "-rdynamic", + "-Wl,--no-undefined" + ], + "define": [ + "FLOAT_SUPPORT" + ], + "nocheck": [] + } + ] + } + ] +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/build/createxml/mk_dfx_xml.json b/vendor/others/demo/5-tim_adc/demo/build/createxml/mk_dfx_xml.json new file mode 100644 index 000000000..c1f941be2 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/build/createxml/mk_dfx_xml.json @@ -0,0 +1,10 @@ +{ + "HDB_XML_TEMP_ROOT_DIR":"build/createxml/build_tmp/modules/", + "HDB_XML_FILE_ID":"drivers/log/inc/file_id_defs.h", + + "HDB_PRIM_XML_SRC_FILE" : "build/createxml/mss_prim_db.xml", + + "HDB_PRIM_XML_FILE_ID_BIT" : "14", + "HDB_PRIM_XML_LINE_ID_BIT" : "14", + "HDB_PRIM_XML_PRINT_LEVEL_BIT" : "4" +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/build/createxml/mk_prim_xml_step1.py b/vendor/others/demo/5-tim_adc/demo/build/createxml/mk_prim_xml_step1.py new file mode 100644 index 000000000..1e44025b2 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/build/createxml/mk_prim_xml_step1.py @@ -0,0 +1,171 @@ +#!/usr/bin/env python +# coding=utf-8 +# Purpose: +# Copyright Huawei Technologies Co.,Ltd. 2022-2022. All rights reserved +# Author: + +import json +import os +import re +import shutil +import sys +import subprocess +import time +import stat + + +class CreateCfg(): + ''' + Function description: create config file. + ''' + + def __init__(self): + self.params = {} + self.file_id_dic = {} + self.dst_full_file_name_list = [] + self.last_file_id_num = 0 + + + @staticmethod + def get_file_id_str(src_file_name): + if not os.path.isfile(src_file_name): + return -1 + with open(src_file_name, 'r', encoding='utf-8', + errors='replace') as file: + for line in file: + mod = re.search(\ + "^#define[\s]+THIS_FILE_ID[\s]+(FILE_ID_[\w]*)",\ + line.strip()) + if mod is None: + continue + return mod.groups()[0] + + + @staticmethod + def get_necessary_information_singleton(fp, file_name): + ''' + Function description: get necessary information for prim xml + ''' + flags = os.O_RDWR | os.O_CREAT + modes = stat.S_IWUSR | stat.S_IRUSR + with os.fdopen(os.open(file_name, flags, modes), 'r+') as src_fp: + line = src_fp.readline() + while line: + match = re.search('_PRIM_ST', line) + if match: + fp.write(line) + line = src_fp.readline() + + + def save_file_id_dict(self, line): + file_id_str = '' + file_id_num = 0 + + mod_1 = re.search("^(FILE_ID_[\w]*).+=\s+(\d*)", line.strip()) + mod_2 = re.search("^(FILE_ID_[\w]*)", line.strip()) + if mod_1 is not None: + file_id_str = mod_1.groups()[0] + file_id_num = mod_1.groups()[1] + self.file_id_dic[file_id_str] = int(file_id_num) + self.last_file_id_num = int(file_id_num) + elif mod_2 is not None: + file_id_str = mod_2.group() + self.last_file_id_num += 1 + self.file_id_dic[file_id_str] = self.last_file_id_num + else: + return -1 + return 0 + + + def create_file_id_dic(self): + file_name = self.params.get('hdb_xml_file_id', 'Not exist') + if not os.path.exists(file_name): + return + + file_d = open(file_name, 'r') + lines = file_d.readlines() + file_d.close() + fsm_status = 0 + for line in lines: + if 0 == fsm_status: + mod = re.search("^typedef enum {", line.strip()) + if mod is not None: + fsm_status = 1 + elif 1 == fsm_status: + mod_1 = re.search("^FILE_ID_[\w]*", line.strip()) + mod_2 = re.search("^}", line.strip()) + if mod_1 is not None: + CreateCfg.save_file_id_dict(self, line.strip()) + elif mod_2 is not None: + fsm_status = 2 + elif 2 == fsm_status: + break + + + def conver_c_2_i(self, full_file_name_list): + not_exist = 'Not exist' + temp_dir = self.params.get('i_file_dir', not_exist) + if os.path.isdir(temp_dir): + shutil.rmtree(temp_dir) + os.makedirs(temp_dir) + cflag = self.params.get('cflags', not_exist) + include = self.params.get('include', not_exist) + for src_full_file_name in full_file_name_list: + file_id_str = CreateCfg.get_file_id_str(src_full_file_name) + if file_id_str is None: + continue + src_file_name = src_full_file_name.rsplit(os.path.sep, 1)[-1] + dst_file_name = src_file_name + dst_file_name = dst_file_name.replace('.c', '.i') + dst_full_file_name = os.path.join(temp_dir, dst_file_name) + file_id_str = self.file_id_dic.get(file_id_str) + if file_id_str is None: + raise Exception(self.file_id_dic) + cmd_line = ['riscv32-linux-musl-gcc', '-E', src_full_file_name] + \ + cflag + include + ["-DMAKE_PRIM_XML_PROCESS_IN", + '-D__FILE_NAME__ = %s' % src_file_name, + '-D__FILE_IDX__ = %s' % file_id_str, + '-P', '-o', dst_full_file_name] + subprocess.run(cmd_line, check=True) + self.dst_full_file_name_list.append(dst_full_file_name) + return self.dst_full_file_name_list + + + def generate_params_dic(self, build_xml_para): + ''' + Function description: convert input to dictionary + ''' + self.params = build_xml_para + CreateCfg.create_file_id_dic(self) + full_file_name_list = self.params.get('sources') + self.dst_full_file_name_list = CreateCfg.conver_c_2_i(self, + full_file_name_list) + if self.dst_full_file_name_list is None: + return -1 + + + def get_necessary_information(self): + ''' + Function description: store necessary information to .cfg + ''' + + cfg_file = self.params.get('prim_xml_cfg_file') + flags = os.O_RDWR | os.O_CREAT + modes = stat.S_IWUSR | stat.S_IRUSR + if os.path.isfile(cfg_file): + os.remove(cfg_file) + if os.path.exists(os.path.dirname(cfg_file)) is False: + os.makedirs(os.path.dirname(cfg_file)) + with os.fdopen(os.open(cfg_file, flags, modes), 'w+') as cfg_fp: + for src_file in self.dst_full_file_name_list: + CreateCfg.get_necessary_information_singleton( + cfg_fp, src_file) + + +def main(): + createcfg = CreateCfg() + createcfg.generate_params_dic() + createcfg.get_necessary_information() + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/build/createxml/mk_prim_xml_step2.py b/vendor/others/demo/5-tim_adc/demo/build/createxml/mk_prim_xml_step2.py new file mode 100644 index 000000000..210435676 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/build/createxml/mk_prim_xml_step2.py @@ -0,0 +1,184 @@ +#!/usr/bin/env python +# coding=utf-8 +# Purpose: +# Copyright Huawei Technologies Co.,Ltd. 2022-2022. All rights reserved +# Author: + +import os +import time +import string +import re +import shutil +import time +import hashlib +import binascii +import sys +import xml.etree.ElementTree as ET +import xml.dom.minidom as XDM + + +class CreateXml(): + ''' + Function description: create xml file + ''' + + def __init__(self): + self.params = {} + + + @staticmethod + def get_loglevel(prim_pri): + prim_loglevel = 'UNKNOWN' + if int(prim_pri) == 0: + real_pri = int(prim_pri) + prim_loglevel = 'FATAL' + elif int(prim_pri) == 1: + real_pri = int(prim_pri) + prim_loglevel = 'ERROR' + elif int(prim_pri) == 2: + real_pri = int(prim_pri) + prim_loglevel = 'WARNING' + elif int(prim_pri) == 3: + real_pri = int(0) + prim_loglevel = 'INFO' + elif int(prim_pri) == 4: + real_pri = int(0) + prim_loglevel = 'DEBUG' + return prim_loglevel + + + @staticmethod + def add_msg_to_xml(file_hdlr, contents): + msg_hdlr = ET.Element('Msg') + attributes = {} + attributes['id'] = str(contents['prim_id']) + attributes['loglevel'] = contents['prim_loglevel'] + attributes['description'] = contents['prim_msg'] + msg_hdlr.attrib = attributes + file_hdlr.append(msg_hdlr) + + + def get_cfg_files(self, build_xml_para): + self.params = build_xml_para + cfg_dir = self.params.get('prim_xml_cfg_dir') + files = os.listdir(cfg_dir) + cfg_files = [] + for file_name in files: + if file_name[-4:] == '.cfg': + cfg_files.append(os.path.join(cfg_dir, file_name)) + self.params['CFG_FILES'] = cfg_files + + + def init_tree(self): + xml_string = '' + root = ET.fromstring(xml_string) + tree = ET.ElementTree(root) + self.params['XML_ROOT'] = root + + + def add_module_to_xml(self, root_hdlr, contents): + prim_mod_id = contents['prim_mod_id'] + + module_hdlr = ET.Element('Module') + attributes = {} + attributes['name'] = prim_mod_id + module_hdlr.attrib = attributes + root_hdlr.append(module_hdlr) + + self.params[prim_mod_id] = {} + self.params.get(prim_mod_id)['handler'] = module_hdlr + return module_hdlr + + + def add_file_to_xml(self, module_hdlr, contents): + prim_mod_id = contents['prim_mod_id'] + prim_file_id = contents['prim_file_id'] + + file_hdlr = ET.Element('File') + attributes = {} + attributes['id'] = str(prim_file_id) + file_hdlr.attrib = attributes + module_hdlr.append(file_hdlr) + + self.params.get(prim_mod_id)[prim_file_id] = {} + self.params.get(prim_mod_id).get(prim_file_id)['handler'] = file_hdlr + return file_hdlr + + + def add_contents_to_xml(self, contents): + prim_file_id = contents['prim_file_id'] + prim_mod_id = contents['prim_mod_id'] + if prim_mod_id not in self.params.keys(): + root_hdlr = self.params.get('XML_ROOT') + module_hdlr = CreateXml.add_module_to_xml(self, root_hdlr, contents) + file_hdlr = CreateXml.add_file_to_xml(self, module_hdlr, contents) + CreateXml.add_msg_to_xml(file_hdlr, contents) + elif prim_file_id not in self.params.get(prim_mod_id): + module_hdlr = self.params.get(prim_mod_id).get('handler') + file_hdlr = CreateXml.add_file_to_xml(self, module_hdlr, contents) + CreateXml.add_msg_to_xml(file_hdlr, contents) + else: + file_hdlr = self.params.get(prim_mod_id).get(prim_file_id).get( + 'handler') + CreateXml.add_msg_to_xml(file_hdlr, contents) + + + def parse_cfg_file_singleton(self, cfg_file): + with open(cfg_file, encoding='utf-8') as fp: + for line in fp: + contents = {} + match_pri = re.search('_PRIM_PRI_ = ', line) + match_msg = re.search(', _PRIM_MSG_ = ', line) + match_line = re.search(', _PRIM_LINE_ = ', line) + match_file_id = re.search(', _PRIM_FILE_ID_ = ', line) + match_mod_id = re.search(', _PRIM_MOD_ID_ = ', line) + match_end = re.search(', _PRIM_END_', line) + + prim_pri = line[match_pri.end():match_msg.start()] + prim_msg = line[match_msg.end():match_line.start()].strip(r'"') + prim_line = line[match_line.end():match_file_id.start()] + prim_file_id = line[match_file_id.end():match_mod_id.start()] + prim_mod_id = line[match_mod_id.end():match_end.start()] + contents['prim_id'] = (int(prim_line)) | (int(prim_file_id) << + 16) + contents['prim_loglevel'] = CreateXml.get_loglevel(prim_pri) + contents['prim_msg'] = prim_msg + contents['prim_file_id'] = prim_file_id + contents['prim_mod_id'] = prim_mod_id + + CreateXml.add_contents_to_xml(self, contents) + + + def parse_cfg_file(self): + for cfg_file in self.params.get('CFG_FILES'): + CreateXml.parse_cfg_file_singleton(self, cfg_file) + + + def tree_to_xml(self): + root = self.params.get('XML_ROOT') + xml_string = ET.tostring(root, encoding='utf-8') + flags = os.O_RDWR | os.O_CREAT + xdm = XDM.parseString(xml_string) + xml_path = self.params.get('prim_xml_dst_full_path') + with os.fdopen(os.open(xml_path, flags, 0o755), 'wb') as f: + f.write(xdm.toprettyxml(indent=' ', encoding='utf-8')) + + +def copy_dir(): + root_path = os.getcwd() + splicing_path = "drivers/debug/log/inc/ext_file_id_defs.h" + src_path = os.path.join(root_path, splicing_path) + target_path = os.path.dirname(self.params.get('PRIM_XML_DST_FULL_PATH')) + shutil.copy(src_path, target_path) + + +def main(): + createxml = CreateXml() + createxml.get_cfg_files() + createxml.init_tree() + createxml.parse_cfg_file() + createxml.tree_to_xml() + copy_dir() + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/build/createxml/mss_prim_db.xml b/vendor/others/demo/5-tim_adc/demo/build/createxml/mss_prim_db.xml new file mode 100644 index 000000000..8bb3efcf3 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/build/createxml/mss_prim_db.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/vendor/others/demo/5-tim_adc/demo/build/ide_entry.py b/vendor/others/demo/5-tim_adc/demo/build/ide_entry.py new file mode 100644 index 000000000..163938d98 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/build/ide_entry.py @@ -0,0 +1,204 @@ +# !/usr/bin/env python +# -*- coding: utf-8 -*- + +# @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +# following disclaimer in the documentation and/or other materials provided with the distribution. +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# ide_entry.py Function implementation: ide build entry file, which is used to +# copy code and invoke build compilation scripts. + +import os +import sys +import stat +import pathlib +import glob +import tarfile +import zipfile +import platform +import shutil +from configparser import ConfigParser +import shlex +import subprocess +from build import remove_readonly + +from build_gn import read_json_file + + +def copy_code(product, copy_path): + ''' + Function description: Code copy phase for CI build work. + ''' + + # Instantiation parameter check. + if not isinstance(copy_path, str): + raise TypeError("copy_path in para type error {}".format( + type(copy_path))) + if not isinstance(product, str): + raise TypeError("product in para type error {}".format( + type(product))) + + if pathlib.Path(copy_path).exists(): + shutil.rmtree(os.path.realpath(copy_path), onerror=remove_readonly) + + copy_abspath = pathlib.Path(copy_path).resolve() + copyjson_path = pathlib.Path.cwd()\ + .joinpath('chip', "{}".format(product), 'codecopy.json') + copyjson_content = read_json_file(copyjson_path) + for module_path in copyjson_content['modules']: + if pathlib.Path(module_path).is_dir(): + traversal_path(copy_abspath, module_path) + elif pathlib.Path(module_path).is_file(): + parent_path = pathlib.Path(module_path).parent + copy_parent_path = pathlib.Path(copy_abspath).joinpath(parent_path) + if not copy_parent_path.exists(): + os.makedirs(copy_parent_path) + shutil.copy(module_path, copy_parent_path) + + +def traversal_path(copy_path, module_path): + ''' + Function description: Traverse the path and then perform the create + and copy work. + ''' + + ipbefore_list = [] + ipafter_list = [] + cur_sys = platform.system() + + for (dirpath, _, filenames) in os.walk(module_path): + if cur_sys == 'Windows': + ipbefore_list = dirpath.split('\\') + elif cur_sys == 'Linux': + ipbefore_list = dirpath.split('/') + ipafter_list = [] + for ipdir in ipbefore_list: + if ipdir.startswith('v') and '.' in ipdir: + continue + ipafter_list.append(ipdir) + dirprocesspath = '/'.join(ipafter_list) + dest_path = pathlib.Path(copy_path).joinpath(dirprocesspath) + if not dest_path.exists(): + os.makedirs(dest_path) + for file in filenames: + if 'entry.py' in file or 'trustlist.json' in file: + continue + source_file = pathlib.Path(dirpath).joinpath(file) + shutil.copy(source_file, dest_path) + + +def untar(filename): + ''' + Function description: Decompress the tar or tar.gz file. + ''' + + tar = tarfile.open(filename) + tar.extractall(pathlib.Path()) + tar.close() + + +def unzip(filename): + ''' + Function description: Decompress the zip file. + ''' + + max_size = 1 * 1024 * 1024 * 500 + cur_size = 0 + + zip_file = zipfile.ZipFile(filename) + filename = filename.split('.')[0] + if not os.path.isdir(filename): + os.mkdir(filename) + for names in zip_file.infolist(): + cur_size += names.file_size + if cur_size > max_size: + break + zip_file.extract(names.filename, filename) + zip_file.close() + + +def del_decfile(tools_path): + ''' + Function description: Delete the decompressed files. + ''' + + file_lst = glob.glob(tools_path + '/*') + filename_lst = [os.path.basename(i) for i in file_lst if '.' not in os.path.basename(i)] + for filename in filename_lst: + shutil.rmtree(filename, onerror=remove_readonly) + + +def un_alltools(tools_path): + ''' + Function description: Decompress all compilation tools. + ''' + + # Judgment system. + cur_sys = platform.system() + path = str(pathlib.Path(tools_path).joinpath(cur_sys)) + cur_path = os.getcwd() + + os.chdir(path) + del_decfile(path) + + # Decompress all compressed files. + file_lst = glob.glob(path + '/*') + filename_lst = [os.path.basename(i) for i in file_lst] + for filename in filename_lst: + if '.' in filename: + suffix = filename.split('.')[-1] + if suffix == 'gz' or suffix == 'tar': + untar(filename) + if suffix == 'zip': + unzip(filename) + os.chdir(os.path.realpath(cur_path)) + + +def ide_entry(argv): + ''' + Function description: ci entry function. + ''' + + # Save the path of the full package tool. + tools_path = str(pathlib.Path().cwd().joinpath('tools', 'toolchain')) + if len(argv) == 3: + copy_chip = argv[1] + copy_path = argv[2] + else: + copy_chip = '3065h' + copy_path = '../mcu_pro' + + # Decompress all compilation tools. + un_alltools(tools_path) + + # Detach the chip package. + copy_code(copy_chip, copy_path) + + os.chdir(pathlib.Path(copy_path).resolve()) + # Write the path of the full package tool to the config.ini file. + config_path = pathlib.Path().cwd().joinpath('build', 'config.ini') + config = ConfigParser() + config.read(config_path) + config.set('gn_args', 'tools_path', tools_path) + flags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC + modes = stat.S_IWUSR | stat.S_IRUSR + with os.fdopen(os.open(config_path, flags, modes), 'w+') as configini: + config.write(configini) + + os.makedirs("ohos_bundles") + + +if __name__ == "__main__": + sys.exit(ide_entry(sys.argv)) diff --git a/vendor/others/demo/5-tim_adc/demo/build/packet_create.py b/vendor/others/demo/5-tim_adc/demo/build/packet_create.py new file mode 100644 index 000000000..73add2987 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/build/packet_create.py @@ -0,0 +1,460 @@ +#!/usr/bin/env python3 +# coding=utf-8 + +''' +# @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +# following disclaimer in the documentation and/or other materials provided with the distribution. +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# ide_entry.py Function implementation: ide build entry file, which is used to +# copy code and invoke build compilation scripts. +''' +import struct +import sys +import os +import stat +import pathlib +import zlib +import copy +import socket +import collections +from configparser import ConfigParser + + +class Crc16: + POLYNOMIAL = 0x1021 + PRESET = 0x0000 + _tab = [] + + def __init__(self): + self._tab = [self._initial(i) for i in range(256)] + + def crc(self, string): + crc = self.PRESET + for c in string: + crc = self._update_crc(crc, ord(c)) + return crc + + def crcb(self, i): + crc = self.PRESET + for c in i: + crc = self._update_crc(crc, c) + return crc + + def _initial(self, c): + crc = 0 + c = c << 8 + for _i in range(8): + if (crc ^ c) & 0x8000: + crc = (crc << 1) ^ self.POLYNOMIAL + else: + crc = crc << 1 + c = c << 1 + return crc + + def _update_crc(self, crc, c): + cc = 0xff & int(c) + + tmp = (crc >> 8) ^ cc + crc = (crc << 8) ^ self._tab[tmp & 0xff] + crc = crc & 0xffff + return crc + + +def get_config(name): + deveco_path = './.deveco/deveco.ini' + env = "env:" + name + config = ConfigParser() + config.read(deveco_path) + init_value = 'no' + config_dict = dict(generate_crc=init_value, generate_checksum=init_value, padding=init_value) + if name == init_value: + return config_dict + key = 'generate_crc' + if key in config[env]: + config_dict[key] = config[env].get(key) + key = 'generate_checksum' + if key in config[env]: + config_dict[key] = config[env].get(key) + key = 'padding' + if key in config[env]: + config_dict[key] = config[env].get(key) + return config_dict + + +def packet_bin(output_path, input_list): + t = Crc16() + path_list = [] + burn_addr_list = [] + burn_size_list = [] + image_size_list = [] + type_list = [] + for item in input_list: + path, burn_addr, burn_size, burn_type = item.split("|") + image_size = os.path.getsize(path) + path_list.append(path) + burn_addr_list.append(int(burn_addr)) + burn_size_list.append(int(burn_size)) + image_size_list.append(image_size) + type_list.append(int(burn_type)) + + flag = 0xefbeaddf + crc = 0 + image_num = len(path_list) + head_len = image_num * 52 + 12 + total_file_size = sum(image_size_list) + head_len + + flags = os.O_RDWR | os.O_CREAT + modes = stat.S_IWUSR | stat.S_IRUSR + with os.fdopen(os.open(output_path, flags, modes), 'wb+') as file: + file.write(struct.pack('IHHI', flag, crc, image_num, total_file_size)) + start_index = head_len + times = 0 + for path in path_list: + path_name = os.path.basename(path) + file.write( + struct.pack('32sIIIII', bytes(path_name, 'ascii'), start_index, + image_size_list[times], burn_addr_list[times], + burn_size_list[times], type_list[times])) + start_index = start_index + image_size_list[times] + 16 + times += 1 + + for path in path_list: + with os.fdopen(os.open(path, flags, modes), 'rb+') as subfile: + data = subfile.read() + file.write(data) + file.write(struct.pack('IIII', 0, 0, 0, 0)) + + file.flush() + file.seek(6) + newdata = file.read(head_len - 6) + crc16 = t.crcb(newdata) + file.seek(4) + file.write(struct.pack('H', crc16)) + + +def get_len_addr_type(line): + data = int(line[1:9], 16) + length = data >> 24 + addr = (data >> 8) & 0xffff + data_type = data & 0xff + ext_data = int(line[10:13], 16) + Information = collections.namedtuple('Information', ['length', 'addr', 'data_type', 'ext_data']) + return Information(length, addr, data_type, ext_data) + + +def is_start_linear_addr_rec_line(data_type): + return True if data_type == 5 else False + + +def is_ext_linear_addr_rec_line(data_type): + return True if data_type == 4 else False + + +def add_ext_linear_addr_record(fp, addr): + checksum = 0 + data = [] + data.append(':02000004') + checksum += 6 + checksum += (addr & 0xff) + checksum += ((addr >> 8) & 0xff) + data.append("%04x".upper() % (addr)) + checksum = (0x100 - checksum % 0x100) & 0xFF + data.append("%02x".upper() % (checksum)) + data.append('\n') + fp.writelines(data) + + +def add_data_of_crc(fp, addr, crc_val): + checksum = 0 + data = [] + data.append(':04') + checksum += 4 + data.append("%04x".upper() % (addr)) + checksum += (addr & 0xff) + checksum += ((addr >> 8) & 0xff) + data.append('00') + data.append("%08x".upper() % (socket.htonl(crc_val))) + checksum += (crc_val & 0xff) + checksum += ((crc_val >> 8) & 0xff) + checksum += ((crc_val >> 16) & 0xff) + checksum += ((crc_val >> 24) & 0xff) + checksum = (0x100 - checksum % 0x100) & 0xFF + data.append("%02x".upper() % (checksum)) + data.append('\n') + fp.writelines(data) + + +def add_crc(fp, ext_addr, address, crc_val): + addr = address + if addr > 0xFFFF: + add_ext_linear_addr_record(fp, ext_addr + 1) + addr = 0 + add_data_of_crc(fp, addr, crc_val) + + +def gen_crc_padding(fp, lines, crc_val): + is_start_linear_addr_rec = False + ext_linear_addr = 0 + next_addr = 0 + + for line in lines: + length, addr, data_type, ext_data = get_len_addr_type(line) + if is_ext_linear_addr_rec_line(data_type): + ext_linear_addr = ext_data + if not is_start_linear_addr_rec_line(data_type): + next_addr = addr + length + else: + if not is_start_linear_addr_rec: + is_start_linear_addr_rec = True + add_crc(fp, ext_linear_addr, next_addr, crc_val) + fp.writelines(line) + + +def gen_crc_for_hex(filename, crc_val): + flags = os.O_RDWR + modes = stat.S_IWUSR | stat.S_IRUSR + + lines = [] + with os.fdopen(os.open(filename, flags, modes), 'r') as file: + lines = file.readlines() + + flag = os.O_RDWR | os.O_CREAT + with os.fdopen(os.open(filename, flag, modes), 'w+') as file: + gen_crc_padding(file, lines, crc_val) + + +def gen_crc(filename, filename_hex): + flags = os.O_RDWR + modes = stat.S_IWUSR | stat.S_IRUSR + with os.fdopen(os.open(filename, flags, modes), 'rb') as f: + data = f.read() + crc_val = zlib.crc32(data) & 0xFFFFFFFF + with os.fdopen(os.open(filename, flags, modes), 'rb+') as file: + file.seek(0, 2) + crc_val = socket.htonl(crc_val) + file.write(struct.pack('I', crc_val)) + gen_crc_for_hex(filename_hex, crc_val) + + +def findfiles(path, types): + file_list = [] + files = os.listdir(path) + for f in files: + npath = "{}/{}".format(path, f) + if os.path.isfile(npath): + if os.path.splitext(npath)[-1] in types: + file_list.append(npath) + return file_list + + +def packet_bin_with_padding(file, length, val): + while length >= 32: + file.write(struct.pack('IIIIIIII', + val, val, val, val, val, val, val, val)) + length = length - 32 + while length >= 4: + file.write(struct.pack('I', val)) + length = length - 4 + while length > 0: + file.write(struct.pack('B', val & 0xFF)) + length = length - 1 + + +def gen_padding_for_bin(filename, max_len, pad_bit): + flags = os.O_RDWR | os.O_CREAT + modes = stat.S_IWUSR | stat.S_IRUSR + with os.fdopen(os.open(filename, flags, modes), 'ab+') as file: + pad_val = 0xFFFFFFFF + if pad_bit == '0': + pad_val = 0 + image_size = os.path.getsize(filename) + pad_len = max_len - image_size + packet_bin_with_padding(file, pad_len, pad_val) + return pad_len + + +def get_hex_addr(lines): + ext_addr = 0 + next_addr = 0 + for line in lines: + length, addr, data_type, ext_data = get_len_addr_type(line) + if data_type == 4: + ext_addr = ext_data + if data_type == 0: + next_addr = addr + length + return ext_addr, next_addr + + +def get_line_pad_len(addr, max_pad_len): + line_space_size = 0xFFFF - addr + 1 + pad_len = 16 if max_pad_len >= 16 else max_pad_len + if pad_len > line_space_size: + pad_len = line_space_size + return pad_len + + +def gen_ext_addr_rec(ext_addr): + checksum = 0 + data = '' + data += ':02000004' + checksum += 6 + checksum += (ext_addr & 0xff) + checksum += ((ext_addr >> 8) & 0xff) + data += "%04x".upper() % ext_addr + checksum = (0x100 - (checksum & 0xFF)) & 0xFF + data += "%02x\n".upper() % (checksum) + return data + + +def gen_padding_line_rec(addr, length, pad_bit): + checksum = 0 + data = '' + data += ":%02x".upper() % length + checksum += length & 0xff + checksum += (addr & 0xff) + checksum += ((addr >> 8) & 0xff) + data += "%04x00".upper() % addr + pad_val = 0xFF if pad_bit == '1' else 0 + for _i in range(length): + data += "%02x".upper() % pad_val + checksum += pad_val + checksum = (0x100 - (checksum & 0xFF)) & 0xFF + data += "%02x\n".upper() % (checksum) + return data + + +def gen_padding_lines_for_hex(ext_addr, addr, length, pad_bit): + lines = [] + + while length > 0: + pad_len = get_line_pad_len(addr, length) + lines.append(gen_padding_line_rec(addr, pad_len, pad_bit)) + length -= pad_len + addr += pad_len + if addr == 0x10000 and length > 0: + ext_addr += 1 + lines.append(gen_ext_addr_rec(ext_addr)) + addr = 0 + return lines + + +def gen_padding_for_hex(filename, pad_len, pad_bit): + ''' + Generate padding for target.hex + ''' + flags = os.O_RDWR + modes = stat.S_IWUSR | stat.S_IRUSR + lines = [] + ext_addr = int(0) + next_addr = int(0) + with os.fdopen(os.open(filename, flags, modes), 'r') as file: + lines = file.readlines() + ext_addr, next_addr = get_hex_addr(lines) + + start_linear_addr_rec = lines[-2] + end_of_file_rec = lines[-1] + lines.pop() + lines.pop() + + lines += gen_padding_lines_for_hex(ext_addr, next_addr, pad_len, pad_bit) + lines += start_linear_addr_rec + lines += end_of_file_rec + + flag = os.O_RDWR | os.O_CREAT + with os.fdopen(os.open(filename, flag, modes), 'w+') as file: + file.writelines(lines) + + +def gen_checksum_list(filename): + ''' + Generate Checksum list + ''' + path = "./out/bin" + type_list = ['.bin', '.hex'] + file_list = findfiles(path, type_list) + checksum_list = [] + + flags = os.O_RDWR | os.O_CREAT + modes = stat.S_IWUSR | stat.S_IRUSR + for item in file_list: + with os.fdopen(os.open(item, flags, modes), 'rb') as f: + data = f.read() + crc_val = zlib.crc32(data) & 0xFFFFFFFF + file_crc_dict = {} + file_crc_dict['file'] = os.path.split(item)[1] + file_crc_dict['crc'] = hex(crc_val) + checksum_list.append(file_crc_dict) + + with os.fdopen(os.open(filename, flags, modes), 'w') as f: + for info in checksum_list: + file_name = "{}\n".format(info['file']) + f.write(file_name) + crc_str = "CRC:{}\n\n".format(info['crc']) + f.write(crc_str) + + +def main(argv): + ''' + Function description: + 1. add crc for target.bin and hex.bin if generate_crc = yes + 2. add padding for target.bin if padding enable + 3. generate checksum_list.txt and print in IDE TERMINAL windows + 4. Combine loader.bin with image.bin into allinone.bin. + ''' + chipname = 'no' + flashsize = 0 + if len(argv) == 3: + chipname = argv[1] + flashsize = argv[2] + cfg_dict = get_config(chipname) + cfg_dict['max_len'] = flashsize + + loaderbin_path = "./middleware/hisilicon/loaderboot/loader.bin" + targetbin_path = "./out/bin/target.bin" + targethex_path = "./out/bin/target.hex" + allinonebin_path = "./out/bin/allinone.bin" + chksumlisttxt_path = "./out/bin/checksum_list.txt" + str_padding = "padding" + + curpath = pathlib.Path().cwd() + bootloaderpath = curpath.joinpath(loaderbin_path) + eflashpath = curpath.joinpath(targetbin_path) + output_path = curpath.joinpath(allinonebin_path) + + if cfg_dict.get('generate_crc') == 'yes': + gen_crc(targetbin_path, targethex_path) + + if cfg_dict.get(str_padding) != 'no': + pad_len = gen_padding_for_bin(targetbin_path, + int(cfg_dict.get('max_len')), + cfg_dict.get(str_padding)) + gen_padding_for_hex(targethex_path, pad_len, cfg_dict.get(str_padding)) + + input_list = [ + "{}|{}|{}|0".format( + bootloaderpath, 0x2000000, 0x2000000 + 0x3FFF), + "{}|{}|{}|1".format( + eflashpath, 0x3000000, 0x3000000 + 0x27FFF) + ] + + packet_bin(output_path, input_list) + + if cfg_dict.get('generate_checksum') == 'yes': + gen_checksum_list(chksumlisttxt_path) + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/vendor/others/demo/5-tim_adc/demo/build/toolchain/BUILD.gn b/vendor/others/demo/5-tim_adc/demo/build/toolchain/BUILD.gn new file mode 100644 index 000000000..282da139f --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/build/toolchain/BUILD.gn @@ -0,0 +1,28 @@ +# @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +# following disclaimer in the documentation and/or other materials provided with the distribution. +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# BUILD.gn Function implementation: Pre-configuration of the Compilation Toolchain + +import("//build/toolchain/config.gni") + +hcc_toolchain("riscv32_hcc") { + build_compiler_prefix = "riscv32-linux-musl" + cc = "${build_compiler_prefix}-gcc" + cxx = "${build_compiler_prefix}-g++" + ar = "${build_compiler_prefix}-ar" + ld = cc +} + diff --git a/vendor/others/demo/5-tim_adc/demo/build/toolchain/config.gni b/vendor/others/demo/5-tim_adc/demo/build/toolchain/config.gni new file mode 100644 index 000000000..2fb29c758 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/build/toolchain/config.gni @@ -0,0 +1,131 @@ +# @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +# following conditions are met: +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +# disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +# following disclaimer in the documentation and/or other materials provided with the distribution. +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# config.gni Function implementation: Global parameter definition and template configuration + +declare_args() { + build_type = "" + build_compiler_specified = "" +} + +template("hcc_toolchain") { + toolchain(target_name) { + assert(defined(invoker.ar), "gcc toolchain must specify a \"ar\" value") + assert(defined(invoker.cc), "gcc toolchain must specify a \"cc\" value") + assert(defined(invoker.cxx), "gcc toolchain must specify a \"cxx\" value") + assert(defined(invoker.ld), "gcc toolchain must specify a \"ld\" value") + + cc = invoker.cc + cxx = invoker.cxx + ar = invoker.ar + ld = invoker.ld + + need_strip = false + if(defined(invoker.strip)) { + strip = invoker.strip + need_strip = true + } + + tool("cc") { + depfile = "{{output}}.d" + command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} -c {{source}} -o {{output}}" + depsformat = "gcc" + description = "cross compiler {{output}}" + outputs = [ + "{{source_out_dir}}/{{source_name_part}}.o", + ] + } + tool("cxx") { + depfile = "{{output}}.d" + command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} -c {{source}} -o {{output}}" + depsformat = "gcc" + description = "CXX {{output}}" + outputs = [ + "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o", + ] + } + tool("asm") { + depfile = "{{output}}.d" + command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{asmflags}} -c {{source}} -o {{output}}" + depsformat = "gcc" + description = "cross compiler {{output}}" + outputs = [ + "{{source_out_dir}}/{{source_name_part}}.o" + ] + } + tool("alink") { + outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}" + rspfile = "{{output}}.rsp" + rspfile_content = "{{inputs}}" + command = "$ar cr {{output}} @\"$rspfile\"" + + description = "AR {{output}}" + outputs = [ + outfile + ] + + default_output_dir = "{{root_out_dir}}/libs" + default_output_extension = ".a" + output_prefix = "lib" + } + tool("solink") { + outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}" + rspfile = "{{output}}.rsp" + rspfile_content = "{{inputs}}" + command = "$ld -shared -Wl,--start-group {{ldflags}} " + + "{{inputs}} {{libs}} -Wl,--end-group -o $outfile" + if(need_strip) { + command += "&& $strip $outfile" + } + description = "SOLINK $outfile" + outputs = [ + outfile + ] + + default_output_dir = "{{root_out_dir}}" + default_output_extension = ".so" + output_prefix = "lib" + } + tool("link") { + outfile = "{{output_dir}}/bin/{{target_output_name}}{{output_extension}}" + rspfile = "$outfile.rsp" + command = "$ld -Wl,--start-group {{ldflags}} " + + "-Wl,--whole-archive @$rspfile -Wl,--no-whole-archive {{libs}} -Wl,--end-group -o $outfile" + if(need_strip) { + command += "&& $strip $outfile" + } + + description = "LINK $outfile" + default_output_dir = "{{root_out_dir}}" + rspfile_content = "{{inputs}}" + outputs = [ + outfile + ] + } + tool("stamp") { + if (host_os == "win") { + command = "cmd /c type nul > \"{{output}}\"" + } else { + command = "/usr/bin/touch {{output}}" + } + description = "STAMP {{output}}" + } + tool("copy") { + command = "cp -afd {{source}} {{output}}" + description = "COPY {{source}} {{output}}" + } + } +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/anavref.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/anavref.h new file mode 100644 index 000000000..47f74aa42 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/anavref.h @@ -0,0 +1,92 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file anavref.h + * @author MCU Driver Team + * @brief anavref register mapping structure + */ + +/* Macro definitions */ +#ifndef McuMagicTag_ANAVREF_IP_H +#define McuMagicTag_ANAVREF_IP_H + +#include "baseinc.h" + +/** + * @brief Define the union VREF_CTRL_REG0 + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_ref_enh : 1; /**< vref enable */ + unsigned int reserved0 : 31; + } BIT; +} volatile VREF_CTRL_REG0; + +/** + * @brief Define the union VREF_CTRL_REG1 + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_ref_chop_enh : 1; /**< vref chopping enable */ + unsigned int reserved0 : 15; + unsigned int da_ref_temp_trim_enh : 1; /**< vref High-precision mode enable */ + unsigned int reserved1 : 15; + } BIT; +} volatile VREF_CTRL_REG1; + + +/** + * @brief Define the union VREF_TRIM_REG0 + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_iref_trim : 8; /**< iref trim */ + unsigned int da_ref_vref_trim : 8; /**< IBIAS voltage trim */ + unsigned int da_ref_vbg_trim : 8; /**< vref voltage trim */ + unsigned int da_ref_buf_trim : 8; /**< vref buffer trim */ + } BIT; +} volatile VREF_TRIM_REG0; + +/** + * @brief Define the union VREF_TRIM_REG1 + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_ref_temp_trim3 : 8; /**< Benchmark temperature drift trim information */ + unsigned int da_ref_temp_trim2 : 8; /**< Benchmark temperature drift trim information */ + unsigned int da_ref_temp_trim1 : 8; /**< Benchmark temperature drift trim information */ + unsigned int da_ref_temp_trim0 : 8; /**< Benchmark temperature drift trim information */ + } BIT; +} volatile VREF_TRIM_REG1; + +/** + * @brief Define the VREF_RegStruct + */ +typedef struct { + VREF_CTRL_REG0 VREF_CTRL0; /**< Offset address: 0x0000000U*/ + unsigned int space0[7]; + VREF_CTRL_REG1 VREF_CTRL1; /**< Offset address: 0x0000020U*/ + unsigned int space1[7]; + VREF_TRIM_REG0 VREF_TRIM0; /**< Offset address: 0x0000040U*/ + VREF_TRIM_REG1 VREF_TRIM1; /**< Offset address: 0x0000044U*/ +} volatile VREF_RegStruct; + +#endif /* McuMagicTag_ANAVREF_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/baseaddr.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/baseaddr.h new file mode 100644 index 000000000..961f0725b --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/baseaddr.h @@ -0,0 +1,202 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file baseaddr.h + * @author MCU Driver Team + * @brief Definition of MCU register baseaddress + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_BASEADDR_H +#define McuMagicTag_BASEADDR_H + +#define CRG_BASE (void *)0x10000000 +#define CMM_BASE (void *)0x10010000 +#define CFD_BASE (void *)0x10010000 +#define SYSCTRL0_BASE (void *)0x10100000 +#define SYSCTRL1_BASE (void *)0x10100000 +#define UART0_BASE (void *)0x14000000 +#define UART1_BASE (void *)0x14001000 +#define UART2_BASE (void *)0x14002000 +#define UART3_BASE (void *)0x14003000 + +#define I2C0_BASE (void *)0x14100000 +#define I2C1_BASE (void *)0x14101000 +#define SPI0_BASE (void *)0x14200000 +#define SPI1_BASE (void *)0x14201000 +#define TIMER0_BASE (void *)0x14300000 +#define TIMER1_BASE (void *)0x14301000 +#define TIMER2_BASE (void *)0x14302000 +#define TIMER3_BASE (void *)0x14303000 + +#define SYSTICK_BASE (void *)0x14380000 +#define WWDG_BASE (void *)0x14400000 +#define IWDG_BASE (void *)0x14401000 +#define GPIO0_BASE (void *)0x14500000 +#define GPIO1_BASE (void *)0x14501000 +#define GPIO2_BASE (void *)0x14502000 +#define GPIO3_BASE (void *)0x14503000 +#define GPIO4_BASE (void *)0x14504000 +#define GPIO5_BASE (void *)0x14505000 +#define CAN_BASE (void *)0x14600000 +#define GPT0_BASE (void *)0x14700000 +#define GPT1_BASE (void *)0x14701000 +#define GPT2_BASE (void *)0x14702000 +#define GPT3_BASE (void *)0x14703000 + +#define EFC_BASE (void *)0x14710000 +#define FOTP_BASE (void *)0x14720000 +#define HPM_BASE (void *)0x147D0000 +#define PMC_BASE (void *)0x147E0000 +#define IOCMG_BASE (void *)0x147F0000 +#define CRC_BASE (void *)0x14800000 +#define APT0_BASE (void *)0x14A00000 +#define APT1_BASE (void *)0x14A01000 +#define APT2_BASE (void *)0x14A02000 +#define APT3_BASE (void *)0x14A03000 + +#define CAPM0_BASE (void *)0x14B00000 +#define CAPM1_BASE (void *)0x14B01000 +#define CAPM2_BASE (void *)0x14B02000 +#define CAPM_COMM_BASE (void *)0x14B03000 + +#define QDM0_BASE (void *)0x14C00000 +#define QDM1_BASE (void *)0x14C01000 +#define ADC0_BASE (void *)0x18000000 +#define VREF_BASE (void *)0x18100000 +#define PGA0_BASE (void *)0x18200000 +#define PGA1_BASE (void *)0x18201000 +#define ACMP0_BASE (void *)0x18300000 +#define DAC0_BASE (void *)0x18400000 + +#define TSENSOR_BASE (void *)0x18500000 +#define ANA_CTRL_TOP_BASE (void *)0x18600000 + +#define DMA_BASE (void *)0x1C000000 +#define DMA_CHANNEL0_BASE (void *)0x1C000100 +#define DMA_CHANNEL1_BASE (void *)0x1C000120 +#define DMA_CHANNEL2_BASE (void *)0x1C000140 +#define DMA_CHANNEL3_BASE (void *)0x1C000160 +#define DMA_CHANNEL4_BASE (void *)0x1C000180 +#define DMA_CHANNEL5_BASE (void *)0x1C0001A0 + +#define CRG ((CRG_RegStruct *)CRG_BASE) +#define CMM ((CMM_RegStruct *)CMM_BASE) +#define CFD ((CFD_RegStruct *)CFD_BASE) +#define SYSCTRL0 ((SYSCTRL0_RegStruct *)SYSCTRL0_BASE) +#define SYSCTRL1 ((SYSCTRL1_RegStruct *)SYSCTRL1_BASE) +#define UART0 ((UART_RegStruct *)UART0_BASE) +#define UART1 ((UART_RegStruct *)UART1_BASE) +#define UART2 ((UART_RegStruct *)UART2_BASE) +#define UART3 ((UART_RegStruct *)UART3_BASE) +#define I2C0 ((I2C_RegStruct *)I2C0_BASE) +#define I2C1 ((I2C_RegStruct *)I2C1_BASE) +#define SPI0 ((SPI_RegStruct *)SPI0_BASE) +#define SPI1 ((SPI_RegStruct *)SPI1_BASE) +#define TIMER0 ((TIMER_RegStruct *)TIMER0_BASE) +#define TIMER1 ((TIMER_RegStruct *)TIMER1_BASE) +#define TIMER2 ((TIMER_RegStruct *)TIMER2_BASE) +#define TIMER3 ((TIMER_RegStruct *)TIMER3_BASE) +#define SYSTICK ((SYSTICK_RegStruct *)SYSTICK_BASE) +#define WWDG ((WWDG_RegStruct *)WWDG_BASE) +#define IWDG ((IWDG_RegStruct *)IWDG_BASE) +#define GPIO0 ((GPIO_RegStruct *)GPIO0_BASE) +#define GPIO1 ((GPIO_RegStruct *)GPIO1_BASE) +#define GPIO2 ((GPIO_RegStruct *)GPIO2_BASE) +#define GPIO3 ((GPIO_RegStruct *)GPIO3_BASE) +#define GPIO4 ((GPIO_RegStruct *)GPIO4_BASE) +#define GPIO5 ((GPIO_RegStruct *)GPIO5_BASE) + +#define CAN ((CAN_RegStruct *)CAN_BASE) +#define GPT0 ((GPT_RegStruct *)GPT0_BASE) +#define GPT1 ((GPT_RegStruct *)GPT1_BASE) +#define GPT2 ((GPT_RegStruct *)GPT2_BASE) +#define GPT3 ((GPT_RegStruct *)GPT3_BASE) +#define EFC ((EFC_RegStruct *)EFC_BASE) +#define FOTP ((FOTP_RegStruct *)FOTP_BASE) +#define HPM ((HPM_RegStruct *)HPM_BASE) +#define PMC ((PMC_RegStruct *)PMC_BASE) +#define CRC ((CRC_RegStruct *)CRC_BASE) +#define APT0 ((APT_RegStruct *)APT0_BASE) +#define APT1 ((APT_RegStruct *)APT1_BASE) +#define APT2 ((APT_RegStruct *)APT2_BASE) +#define APT3 ((APT_RegStruct *)APT3_BASE) +#define CAPM0 ((CAPM_RegStruct *)CAPM0_BASE) +#define CAPM1 ((CAPM_RegStruct *)CAPM1_BASE) +#define CAPM2 ((CAPM_RegStruct *)CAPM2_BASE) +#define CAPM_COMM ((CAPM_COMM_RegStruct *)CAPM_COMM_BASE) +#define QDM0 ((QDM_RegStruct *)QDM0_BASE) +#define QDM1 ((QDM_RegStruct *)QDM1_BASE) +#define ADC0 ((ADC_RegStruct *)ADC0_BASE) +#define PGA0 ((PGA_RegStruct *)PGA0_BASE) +#define PGA1 ((PGA_RegStruct *)PGA1_BASE) +#define DAC0 ((DAC_RegStruct *)DAC0_BASE) +#define TSENSOR ((TSENSOR_RegStruct *)TSENSOR_BASE) +#define ACMP0 ((ACMP_RegStruct *)ACMP0_BASE) +#define DMA ((DMA_RegStruct *)DMA_BASE) +#define DMA_CHANNEL0 ((DMA_ChannelRegStruct *)DMA_CHANNEL0_BASE) +#define DMA_CHANNEL1 ((DMA_ChannelRegStruct *)DMA_CHANNEL1_BASE) +#define DMA_CHANNEL2 ((DMA_ChannelRegStruct *)DMA_CHANNEL2_BASE) +#define DMA_CHANNEL3 ((DMA_ChannelRegStruct *)DMA_CHANNEL3_BASE) +#define DMA_CHANNEL4 ((DMA_ChannelRegStruct *)DMA_CHANNEL4_BASE) +#define DMA_CHANNEL5 ((DMA_ChannelRegStruct *)DMA_CHANNEL5_BASE) +#define IOCMG ((IOConfig_RegStruct*)IOCMG_BASE) +#define VREF ((VREF_RegStruct *)VREF_BASE) + +#define IsCRGInstance(instance) ((instance) == CRG) +#define IsCMMInstance(instance) ((instance) == CMM) +#define IsCFDInstance(instance) ((instance) == CFD) +#define IsSYSCTRLInstance(instance) (((instance) == SYSCTRL0) || ((instance) == SYSCTRL1)) +#define IsUARTInstance(instance) (((instance) == UART0) || ((instance) == UART1) || \ + ((instance) == UART2) || ((instance) == UART3)) +#define IsI2CInstance(instance) (((instance) == I2C0) || ((instance) == I2C1)) +#define IsSPIInstance(instance) (((instance) == SPI0) || ((instance) == SPI1)) +#define IsTIMERInstance(instance) (((instance) == TIMER0) || ((instance) == TIMER1) || \ + ((instance) == TIMER2) || ((instance) == TIMER3)) +#define IsSYSTICKInstance(instance) ((instance) == SYSTICK) +#define IsWWDGInstance(instance) ((instance) == WWDG) +#define IsIWDGInstance(instance) ((instance) == IWDG) +#define IsGPIOInstance(instance) (((instance) == GPIO0) || ((instance) == GPIO1) || \ + ((instance) == GPIO2) || ((instance) == GPIO3) || \ + ((instance) == GPIO4) || ((instance) == GPIO5)) +#define IsCANInstance(instance) ((instance) == CAN) +#define IsGPTInstance(instance) (((instance) == GPT0) || ((instance) == GPT1) || \ + ((instance) == GPT2) || ((instance) == GPT3)) +#define IsEFCInstance(instance) ((instance) == EFC) +#define IsFOTPInstance(instance) ((instance) == FOTP) +#define IsHPMInstance(instance) ((instance) == HPM) +#define IsPMCInstance(instance) ((instance) == PMC) +#define IsIOCMGInstance(instance) ((instance) == IOCMG) +#define IsCRCInstance(instance) ((instance) == CRC) +#define IsAPTInstance(instance) (((instance) == APT0) || ((instance) == APT1) || \ + ((instance) == APT2) || ((instance) == APT3)) +#define IsCAPMInstance(instance) (((instance) == CAPM0) || ((instance) == CAPM1) || ((instance) == CAPM2)) +#define IsCAPMCOMMInstance(instance) ((instance) == CAPM_COMM) +#define IsQDMInstance(instance) (((instance) == QDM0) || ((instance) == QDM1)) +#define IsADCInstance(instance) ((instance) == ADC0) +#define IsPGAInstance(instance) (((instance) == PGA0) || ((instance) == PGA1)) +#define IsDACInstance(instance) ((instance) == DAC0) +#define IsACMPInstance(instance) ((instance) == ACMP0) +#define IsDMAInstance(instance) ((instance) == DMA) +#define IsDMACHXInstance(instance) (((instance) == DMA_CHANNEL0) || ((instance) == DMA_CHANNEL1) || \ + ((instance) == DMA_CHANNEL2) || ((instance) == DMA_CHANNEL3) || \ + ((instance) == DMA_CHANNEL4) || ((instance) == DMA_CHANNEL5)) +#define SRAM_START 0x4000000 +#define SRAM_END 0x4007FFF +#define REGISTER_START 0x10000000 +#define REGISTER_END 0x1C000FFF +#endif /* McuMagicTag_BASEADDR_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinc.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinc.h new file mode 100644 index 000000000..3994c6617 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinc.h @@ -0,0 +1,37 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file chipinc.h + * @author MCU Driver Team + * @brief Contains chip-related header files. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_CHIPINC_H +#define McuMagicTag_CHIPINC_H + +/* Includes ------------------------------------------------------------------ */ +#include "feature.h" +#include "info.h" +#include "baseaddr.h" +#include "locktype.h" +#include "interrupt_ip.h" +#include "sysctrl.h" +#include "systick.h" +#include "ip_crg_common.h" + +#endif /* McuMagicTag_CHIPINC_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/anatrim/anatrim.c b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/anatrim/anatrim.c new file mode 100644 index 000000000..00b3ca0bc --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/anatrim/anatrim.c @@ -0,0 +1,128 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file anatrim.c + * @author MCU Driver Team + * @brief Chip Init modlue. + * @details Calibration of analog module parameters. + */ +#include "anatrim.h" + +float g_tsensorGain = 0.00041f; + +/** + * @brief Calculate the conversion gain of the tsensor. + * @param data, original data. + * @retval None + */ +static void CalculateGain(unsigned int data) +{ + g_tsensorGain = ((float)(data) / 10000000.0f); +} + +/** + * @brief Obtains the chip ID. + * @param None + * @retval None + */ +static bool CHIP_GetInfo(void) +{ + FOTP_INFO_RGN0_NUMBER_4 emptyData; + FOTP_INFO_RGN0_NUMBER_2 idData; + FOTP_InfoGet(FOTP_INFO_RNG0, 4U, (void *)&emptyData.comData); /* 4 is the number of fotp_empty_flag in otp */ + FOTP_InfoGet(FOTP_INFO_RNG0, 2U, (void *)&idData.comData); /* 2 is the number of idData in otp */ + if (emptyData.REG.fotp_empty_flag != 0x5AA59669 || idData.REG.chip_id == 0xFFFFFFFF) { + return false; + } + return true; +} + +/** + * @brief Analog module trim. + * @param None + * @retval None + */ +static void CHIP_AnalogTrim(void) +{ + FOTP_INFO_RGN0_NUMBER_20 trimData20; + FOTP_InfoGet(FOTP_INFO_RNG0, 20U, (void *)&trimData20.comData); /* 20 is the number of trim data in otp */ + /* VREF */ + VREF->VREF_TRIM0.BIT.da_iref_trim = trimData20.REG.data0.da_iref_trim; + VREF->VREF_TRIM0.BIT.da_ref_vref_trim = trimData20.REG.data0.da_ref_vref_trim; + VREF->VREF_TRIM0.BIT.da_ref_vbg_trim = trimData20.REG.data0.da_ref_vbg_trim; + unsigned int value = trimData20.REG.data1.da_ref_temp_trim3; + value |= (trimData20.REG.data1.da_ref_temp_trim2 << 8U); /* Shift left by 8 bits */ + value |= (trimData20.REG.data1.da_ref_temp_trim1 << 16U); /* Shift left by 16 bits */ + value |= (trimData20.REG.data0.da_ref_temp_trim0 << 24U); /* Shift left by 24 bits */ + VREF->VREF_TRIM1.reg = value; + + FOTP_INFO_RGN0_NUMBER_21 trimData21; + FOTP_InfoGet(FOTP_INFO_RNG0, 21U, (void *)&trimData21.comData); /* 21 is the number of trim data in otp */ + /* ADC */ + ADC0->ADC_OEGE_TRIM.BIT.cfg_gain_cali_trim = trimData21.REG.data1.saradc_gain; + ADC0->ADC_OEGE_TRIM.BIT.cfg_ofst_cali_trim = trimData21.REG.data1.saradc_offset; + + /* TSENSOR */ + TSENSOR->TSENSOR_TRIM.reg = trimData20.REG.data1.da_ref_vptat_trim; + ADC0->ADC_TSENSOR_TRIM.BIT.cfg_tsensor_ofst_trim = trimData21.REG.data2.ts_offset; + CalculateGain(trimData21.REG.data3.ts_gain); + + /* PGA */ + PGA0->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga0_vos_trim; + PGA1->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga1_vos_trim; + + FOTP_INFO_RGN0_NUMBER_22 trimData22; + FOTP_InfoGet(FOTP_INFO_RNG0, 22U, (void *)&trimData22.comData); /* 22 is the number of trim data in otp */ + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_gain_trim2 = trimData22.REG.data0.pga0_gain2; + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_ofst_trim2 = trimData22.REG.data0.pga0_offset2; + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_gain_trim4 = trimData22.REG.data1.pga0_gain4; + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_ofst_trim4 = trimData22.REG.data1.pga0_offset4; + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_gain_trim8 = trimData22.REG.data2.pga0_gain8; + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_ofst_trim8 = trimData22.REG.data2.pga0_offset8; + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_gain_trim16 = trimData22.REG.data3.pga0_gain16; + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_ofst_trim16 = trimData22.REG.data3.pga0_offset16; + + FOTP_INFO_RGN0_NUMBER_23 trimData23; + FOTP_InfoGet(FOTP_INFO_RNG0, 23U, (void *)&trimData23.comData); /* 23 is the number of trim data in otp */ + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_gain_trim2 = trimData23.REG.data0.pga1_gain2; + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_ofst_trim2 = trimData23.REG.data0.pga1_offset2; + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_gain_trim4 = trimData23.REG.data1.pga1_gain4; + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_ofst_trim4 = trimData23.REG.data1.pga1_offset4; + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_gain_trim8 = trimData23.REG.data2.pga1_gain8; + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_ofst_trim8 = trimData23.REG.data2.pga1_offset8; + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_gain_trim16 = trimData23.REG.data3.pga1_gain16; + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_ofst_trim16 = trimData23.REG.data3.pga1_offset16; +} + +/** + * @brief Parameter calibration entry of the analog module. + * @param None + * @retval None + */ +void ANATRIM_Entry(void) +{ + if (CHIP_GetInfo() == false) { /* If the chip information is incorrect, calibration is not performed */ + return; + } + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_ENABLE); /* Enable the clock for calibration */ + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_ENABLE); + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_ENABLE); + CHIP_AnalogTrim(); + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_DISABLE); /* The clock is disabled after calibration */ + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_DISABLE); + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_DISABLE); +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/anatrim/anatrim.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/anatrim/anatrim.h new file mode 100644 index 000000000..b5eef3e82 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/anatrim/anatrim.h @@ -0,0 +1,36 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file anatrim.h + * @author MCU Driver Team + * @brief Chip Init modlue. + * @details Calibration of analog module parameters. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_ANATRIM_H +#define McuMagicTag_ANATRIM_H +#include "baseinc.h" +#include "fotp_info_read.h" +#include "anavref.h" +#include "tsensor_ip.h" +#include "adc_ip.h" +#include "pga_ip.h" +#include "crg.h" +void ANATRIM_Entry(void); +extern float g_tsensorGain; +#endif /* McuMagicTag_ANATRIM_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/anavrefinit/anavrefinit.c b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/anavrefinit/anavrefinit.c new file mode 100644 index 000000000..ee6a5ab86 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/anavrefinit/anavrefinit.c @@ -0,0 +1,39 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file anavrefinit.c + * @author MCU Driver Team + * @brief anavref init modlue. + * @details anavref initialization function during startup + */ + +#include "anavrefinit.h" + +/** + * @brief Set Crg Core clock select + * @param None + * @retval None + */ +void ANAVREF_Init(void) +{ + HAL_CRG_IpEnableSet(VREF_BASE, IP_CLK_ENABLE); + VREF->VREF_CTRL1.BIT.da_ref_temp_trim_enh = 0x1; + VREF->VREF_CTRL0.BIT.da_ref_enh = BASE_CFG_ENABLE; + BASE_FUNC_DELAY_US(200); /* delay 200us */ + VREF->VREF_CTRL1.BIT.da_ref_chop_enh = BASE_CFG_ENABLE; + BASE_FUNC_DELAY_US(40); /* delay 40us */ +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/anavrefinit/anavrefinit.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/anavrefinit/anavrefinit.h new file mode 100644 index 000000000..56396fe15 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/anavrefinit/anavrefinit.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file anavrefint.h + * @author MCU Driver Team + * @brief anavref init modlue. + * @details anavref initialization function during startup + */ + +#ifndef McuMagicTag_ANAVREF_H +#define McuMagicTag_ANAVREF_H + +#include "baseinc.h" +#include "crg.h" +#include "anavref.h" + +void ANAVREF_Init(void); +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/chipinit.c b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/chipinit.c new file mode 100644 index 000000000..3cea5d59b --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/chipinit.c @@ -0,0 +1,69 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file chipint.c + * @author MCU Driver Team + * @brief Chip Init modlue. + * @details Declare a function that needs to be executed as soon as the C + * runtime environment is ready + */ +#include "chipinc.h" +#include "crginit.h" +#include "systickinit.h" +#include "flashinit.h" +#include "anavrefinit.h" +#include "anatrim.h" +#include "crg.h" +#include "interrupt.h" +#include "chipinit.h" + +/** + * @brief Chip Init Fail Process, deadloop if Chip Init fail + * @param None + * @retval None + */ +static inline void Chip_InitFail(void) +{ + while (1) { + ; + } +} + +/** + * @brief Chip Init + * @param None + * @retval None + */ +void Chip_Init(void) +{ + CRG_CoreClkSelect coreClkSelect; + /* Config CRG */ + if (CRG_Config(&coreClkSelect) != BASE_STATUS_OK) { + Chip_InitFail(); + } + + /* Config FLASH Clock */ + FLASH_ClockConfig(coreClkSelect); + SYSTICK_Init(); + /* Set CoreClock Select after FLASH Config Done */ + CRG_SetCoreClockSelect(coreClkSelect); + + IRQ_Init(); + ANAVREF_Init(); + ANATRIM_Entry(); + /* User Add Code Here */ +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/chipinit.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/chipinit.h new file mode 100644 index 000000000..07a7fd202 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/chipinit.h @@ -0,0 +1,31 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file chipinit.h + * @author MCU Driver Team + * @brief Chip Init modlue. + * @details Declare a function that needs to be executed as soon as the C + * runtime environment is ready + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_CHIPINIT_H +#define McuMagicTag_CHIPINIT_H + +void Chip_Init(void); + +#endif /* McuMagicTag_CHIPINIT_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/crginit/crginit.c b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/crginit/crginit.c new file mode 100644 index 000000000..ab884e9ab --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/crginit/crginit.c @@ -0,0 +1,65 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file crginit.c + * @author MCU Driver Team + * @brief crg init modlue. + * @details crg initialization function during startup + */ +#include "crginit.h" + +/** + * @brief CRG Config + * @param coreClkSelect OutPut core clock select value + * @retval None + */ +__weak BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + BASE_FUNC_ASSERT_PARAM(coreClkSelect != NULL); + + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllFbDiv = 0x30; /* PLL loop divider ratio = 0x30 */ + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; /* Set the 1MHz clock select. */ + crg.handleEx.clk1MDiv = 0x18; /* 0x18 : ensure that the 1MHz clock frequency is 1 MHz. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +/** + * @brief Set Crg Core clock select + * @param coreClkSelect Input core clock select value + * @retval None + */ +void CRG_SetCoreClockSelect(CRG_CoreClkSelect coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.coreClkSelect = coreClkSelect; + if (crg.coreClkSelect == CRG_CORE_CLK_SELECT_TCXO) { /* If an external crystal oscillator is selected. */ + BASE_FUNC_DELAY_MS(10); /* 10: delay 10ms, wait clokc stable. */ + } + HAL_CRG_SetCoreClockSelect(&crg); +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/crginit/crginit.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/crginit/crginit.h new file mode 100644 index 000000000..82ea33c91 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/crginit/crginit.h @@ -0,0 +1,33 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file crginit.h + * @author MCU Driver Team + * @brief crg init modlue. + * @details crg initialization function during startup + */ + +#ifndef McuMagicTag_CRGINIT_H +#define McuMagicTag_CRGINIT_H + +#include "baseinc.h" +#include "crg.h" + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void CRG_SetCoreClockSelect(CRG_CoreClkSelect coreClkSelect); + +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/flashinit/flashinit.c b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/flashinit/flashinit.c new file mode 100644 index 000000000..38a9be2df --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/flashinit/flashinit.c @@ -0,0 +1,111 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file flashinit.c + * @author MCU Driver Team + * @brief flash init modlue. + * @details flash initialization function during startup + */ +#include "chipinit.h" +#include "crg.h" +#include "flash_ip.h" +#include "flashinit.h" + +#define FLASH_BASE_FREQ (375 * 100 * 1000) /* 37.5MHz. */ +#define FLASH_MAX_DIV 4 + +/** + * @brief Get the Rounding up value + * @param frequence frequnce + * @param div Output Divison + * @retval None + */ +static void SetFlashDiv(unsigned int frequency, unsigned int *nreadDiv) +{ + unsigned int div; + unsigned int freq = frequency; + /* Get frequency divider of flash. */ + if (freq < FLASH_BASE_FREQ) { + freq = FLASH_BASE_FREQ; + } + /* Get the flash frequency division based on the frequency. */ + if ((freq % FLASH_BASE_FREQ) == 0) { + div = freq / FLASH_BASE_FREQ; + } else { + div = (freq / FLASH_BASE_FREQ) + 1; + } + /* Ensure the flash frequency division is valid. */ + if (div > FLASH_MAX_DIV) { + div = FLASH_MAX_DIV; + } + *nreadDiv = div; +} + +/** + * @brief Get the Rounding up value + * @param coreClkSelect Core Clock select + * @retval Frequency of Flash + */ +static unsigned int GetFlashFreq(CRG_CoreClkSelect coreClkSelect) +{ + unsigned int hclk; + /* Get frequency of flash. */ + switch (coreClkSelect) { + case CRG_CORE_CLK_SELECT_HOSC: + hclk = HOSC_FREQ; + break; + case CRG_CORE_CLK_SELECT_TCXO: + hclk = XTRAIL_FREQ; + break; + case CRG_CORE_CLK_SELECT_PLL: + hclk = HAL_CRG_GetPllFreq(); + break; + default: + hclk = LOSC_FREQ; + break; + } + return hclk; +} + +/** + * @brief Set flash clock frequence base on hclk + * @param coreClkSelect core clock select + * @retval None + */ +void FLASH_ClockConfig(CRG_CoreClkSelect coreClkSelect) +{ + EFC_RegStruct *efc = EFC; + EFLASH_CLK_CFG_REG cfg; + unsigned int hclk; + unsigned int nreadDiv; + + /* Step 1: Set nread_div */ + hclk = GetFlashFreq(coreClkSelect); + cfg.reg = efc->EFLASH_CLK_CFG.reg; + SetFlashDiv(hclk, &nreadDiv); + cfg.BIT.nread_div = nreadDiv; + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + + /* Step 2: Wait Busclk_sw_req */ + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + efc->EFLASH_CLK_CFG.reg = cfg.reg; + while (efc->EFLASH_CLK_CFG.BIT.busclk_sw_req == BASE_CFG_SET) { + ; + } +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/flashinit/flashinit.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/flashinit/flashinit.h new file mode 100644 index 000000000..a5bd95087 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/flashinit/flashinit.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file flashinit.h + * @author MCU Driver Team + * @brief flash init modlue. + * @details flash initialization function during startup + */ + +#ifndef McuMagicTag_FLASHINIT_H +#define McuMagicTag_FLASHINIT_H + +#include "baseinc.h" +#include "crg.h" + +void FLASH_ClockConfig(CRG_CoreClkSelect coreClkSelect); + +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/systickinit/systickinit.c b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/systickinit/systickinit.c new file mode 100644 index 000000000..2d787dc26 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/systickinit/systickinit.c @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file systickinit.c + * @author MCU Driver Team + * @brief systick init modlue. + * @details systick initialization function during startup + */ +#include "baseaddr.h" +#include "crg.h" +#include "systick.h" +#include "systickinit.h" + +/** + * @brief Init the systick + * @param None + * @retval None + */ +void SYSTICK_Init(void) +{ + SYSTICK->TIMER_CTRL.reg = 0; + SYSTICK->TIMER_CTRL.BIT.enable = 1; +} + +/** + * @brief Get the Systick frep(Hz) + * @param None + * @retval Clock frep of systick(Hz) + */ +unsigned int SYSTICK_GetCRGHZ(void) +{ + /* Get the Systick IP */ + return HAL_CRG_GetIpFreq(SYSTICK_BASE); +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/systickinit/systickinit.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/systickinit/systickinit.h new file mode 100644 index 000000000..7a8710ad3 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/chipinit/systickinit/systickinit.h @@ -0,0 +1,29 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file systickinit.h + * @author MCU Driver Team + * @brief systick init modlue. + * @details systick initialization function during startup + */ + +#ifndef McuMagicTag_SYSTICKINIT_H +#define McuMagicTag_SYSTICKINIT_H + +void SYSTICK_Init(void); +unsigned int SYSTICK_GetCRGHZ(void); +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/codecopy.json b/vendor/others/demo/5-tim_adc/demo/chip/3061m/codecopy.json new file mode 100644 index 000000000..e482c9018 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/codecopy.json @@ -0,0 +1,50 @@ +{ + "modules": [ + "application/user", + "build", + "chip/3061m", + "chip/target", + "drivers/debug", + "generatecode", + "middleware/control_library", + "middleware/hisilicon/loaderboot", + "middleware/hisilicon/nostask/arch", + "middleware/hisilicon/nostask/config", + "middleware/hisilicon/nostask/include", + "middleware/hisilicon/libboundscheck_v1.1.16", + "middleware/hisilicon/nostask/kernel", + "middleware/hisilicon/nostask/nos_api", + "middleware/thirdparty/sysroot", + "tools/uttest", + "bundle.json" + ], + + "ip_drive_file": ["acmp", "adc", "apt", "base", "can", "capm", "cmm", "crc", "crg", + "dac", "dma", "flash", "gpio", "gpt", "i2c", "pga", "pmc", "qdm", "spi", + "timer", "tsensor", "uart", "iwdg", "iocmg", "wwdg"], + "acmp" : ["common", "acmp_v1", "testcase_v1"], + "adc" : ["common", "adc_v1", "testcase_v1"], + "apt" : ["common", "apt_v1", "testcase_v1"], + "base" : ["common", "base_v0"], + "can" : ["common", "can_v0", "testcase_v0"], + "capm" : ["common", "capm_v1", "testcase_v1"], + "cmm" : ["common", "cmm_v1", "testcase_v1"], + "crc" : ["common", "crc_v1", "testcase_v1"], + "crg" : ["common", "crg_v1", "testcase_v1"], + "dac" : ["common", "dac_v1", "testcase_v1"], + "dma" : ["common", "dma_v1", "testcase_v1"], + "flash" : ["common", "flash_v1", "testcase_v1"], + "gpio" : ["common", "gpio_v0", "testcase_v0"], + "gpt" : ["common_v1", "gpt_v1", "testcase_v1"], + "i2c" : ["common", "i2c_v1", "testcase_v1"], + "pga" : ["common", "pga_v1", "testcase_v1"], + "pmc" : ["common", "pmc_v1", "testcase_v1"], + "qdm" : ["common", "qdm_v0", "testcase_v0"], + "spi" : ["common", "spi_v1", "testcase_v1"], + "timer" : ["common", "timer_v1", "testcase_v1"], + "tsensor" : ["common", "tsensor_v1", "testcase_v1"], + "uart" : ["common", "uart_v1", "testcase_v1"], + "iwdg" : ["common", "iwdg_v1", "testcase_v1"], + "iocmg" : ["common", "iocmg_v1", "testcase_v1"], + "wwdg" : ["common", "wwdg_v1", "testcase_v1"] +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/flash.lds b/vendor/others/demo/5-tim_adc/demo/chip/3061m/flash.lds new file mode 100644 index 000000000..655283e94 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/flash.lds @@ -0,0 +1,202 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file flash.lds + * @author MCU Application Driver Team + * @brief RISCV flash link script + */ + +OUTPUT_ARCH( "riscv" ) +ENTRY(_start) + +/* USER CODE BEGIN 0 */ +/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */ +/* USER CODE END 0 */ + +SRAM_START = 0x4000000; +SRAM_END = 0x4000000 + 32K; + +RAM_CODE_START = 0x2000000; +RAM_CODE_SIZE = 0; + +RAM_RESERVE_DATA_START = SRAM_START + RAM_CODE_SIZE; +RAM_RESERVE_DATA_SIZE = 0; + +RAM_DIAGNOSE_BUF_START = RAM_RESERVE_DATA_START + RAM_RESERVE_DATA_SIZE; +RAM_DIAGNOSE_BUF_SIZE = 0x20; + +STACK_SRAM_BOUND_SIZE = 0x10; + +RAM_START = RAM_RESERVE_DATA_START + RAM_RESERVE_DATA_SIZE + RAM_DIAGNOSE_BUF_SIZE; +RAM_SIZE = 0x5000 - RAM_CODE_SIZE - RAM_RESERVE_DATA_SIZE - RAM_DIAGNOSE_BUF_SIZE - STACK_SRAM_BOUND_SIZE; +RAM_END = SRAM_END; + +STACK_SRAM_BOUND_START = RAM_START + RAM_SIZE; + +STACK_START = STACK_SRAM_BOUND_START + STACK_SRAM_BOUND_SIZE; + +NMI_STACK_SIZE = 1024; +STACK_SIZE = 0x3000 - NMI_STACK_SIZE; +INIT_STACK_SIZE = 1024; + +FLASH_START = 0x3000000; +FLASH_SIZE = 0x1fffc; + +MEMORY +{ + /* ram for code */ + RAM_CODE(xr) : ORIGIN = RAM_CODE_START, LENGTH = RAM_CODE_SIZE + + /* ram for reserved data */ + RAM_RESERVE_DATA(rw) : ORIGIN = RAM_RESERVE_DATA_START, LENGTH = RAM_RESERVE_DATA_SIZE + + /* ram for diagnose buf */ + RAM_DIAGNOSE_BUF(rw) : ORIGIN = RAM_DIAGNOSE_BUF_START, LENGTH = RAM_DIAGNOSE_BUF_SIZE + + /* ram for common bss and data */ + RAM_DATA(xrw) : ORIGIN = RAM_START, LENGTH = RAM_SIZE + + /* ram for common bss and data */ + STACK_SRAM_BOUND(xrw) : ORIGIN = STACK_SRAM_BOUND_START, LENGTH = STACK_SRAM_BOUND_SIZE + + /* ram for stack */ + RAM_STACK(xrw) : ORIGIN = STACK_START, LENGTH = STACK_SIZE + NMI_STACK_SIZE + + /*magic number */ + FLASH_MAGIC(rw) : ORIGIN = FLASH_START, LENGTH = 4 + + /* ram for target */ + FLASH_CODE(rx) : ORIGIN = FLASH_START + 4, LENGTH = FLASH_SIZE + +/* USER CODE BEGIN 1 */ +/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */ +/* USER CODE END 1 */ +} + +SECTIONS +{ + /* The startup code goes first into FLASH */ + .data.magic : ALIGN(4) + { + KEEP(*(.data.magic)) + } > FLASH_MAGIC + + /* The startup code goes first into FLASH_CODE */ + .text.entry : ALIGN(4) + { + KEEP(*(.text.entry)) + } > FLASH_CODE + + /* Stack in SRAM at Highest addresses */ + .stacks (NOLOAD) : + { + . = ALIGN(4); + __SYSTEM_STACK_BEGIN__ = ORIGIN(RAM_STACK); + KEEP(*(.stacks)) + __SYSTEM_STACK_END__ = ORIGIN(RAM_STACK) + STACK_SIZE; + . = ALIGN(0x20); + __INTERRUPT_STACK_BEGIN__ = __SYSTEM_STACK_END__; + . = ALIGN(0x20); + __NMI_STACK_BEGIN__ = __SYSTEM_STACK_END__; + __nmi_stack_bottom = .; + . += NMI_STACK_SIZE; + __nmi_stack_top = .; + } > RAM_STACK + __stack_top = __SYSTEM_STACK_END__; + __init_stack_top = __SYSTEM_STACK_BEGIN__ + INIT_STACK_SIZE; + __irq_stack_top = __SYSTEM_STACK_END__; + + .text.sram : ALIGN(4) + { + __sram_code_load_addr = LOADADDR(.text.sram); + __sram_code_start_addr = .; + *(.text.sram) + . = ALIGN(4); + __sram_code_end_addr = .; + } > RAM_CODE AT > FLASH_CODE + + .reserved.data : ALIGN(4) + { + __reserved_code_load_addr = LOADADDR(.reserved.data); + __reserved_code_start_addr = .; + *(.reserved.data*) + . = ALIGN(4); + __reserved_code_end_addr = .; + } > RAM_RESERVE_DATA AT > FLASH_CODE + + .text : ALIGN(4) + { + __start_addr = .; + *(.text*) + *(.ram.text*) + . = ALIGN(4); + __rodata_start = .; + *(.rodata*) + . = ALIGN(4); + __rodata_end = .; + *(.got*) + __text_end = .; + } > FLASH_CODE + + /* data section */ + .data : ALIGN(4) + { + __data_load = LOADADDR(.data); + __data_start = .; + *(.data*) + . = ALIGN(4); + __data_end = .; + } > RAM_DATA AT> FLASH_CODE + __data_size = __data_end - __data_start; + + .stackBound : ALIGN(4) + { + __stack_sram_bound_data_load = LOADADDR(.stackBound); + __stack_sram_bound_data_start = .; + *(STACK_SRAM_BOUND) + . = ALIGN(4); + __stack_sram_bound_data_end = .; + } > STACK_SRAM_BOUND AT> FLASH_CODE + + .checkSum (NOLOAD) : ALIGN(4) + { + __checksum_addr = .; + *(CHECKSUM) + __checksum_end = .; + } > FLASH_CODE + + /* bss section */ + .bss (NOLOAD) : ALIGN(4) + { + __bss_begin__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM_DATA + __bss_size__ = __bss_end__ - __bss_begin__; + __global_pointer$ = __data_start + ((__data_size + __bss_size__) / 2); + + .ramBuf (NOLOAD) : ALIGN(4) + { + *(RAM_DIAGNOSE_BUF) + } > RAM_DIAGNOSE_BUF + +/* USER CODE BEGIN 2 */ +/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */ +/* USER CODE END 2 */ +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/fotp/fotp.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/fotp/fotp.h new file mode 100644 index 000000000..10f4979fe --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/fotp/fotp.h @@ -0,0 +1,499 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file fotp.h + * @author MCU Driver Team + * @brief This file provides firmware functions to manage the following + * functionalities of the system control register. + * + Register Struct of FOTP RNG0 and FOTP RNG1 + */ +#ifndef McuMagicTag_FOTP_H +#define McuMagicTag_FOTP_H + +#define FOTP_INFO_REG_MAX_ID 25 /* Max index of fotp info rng 0 and rng 1 */ + +typedef enum { + FOTP_INFO_RNG0, + FOTP_INFO_RNG1, + FOTP_INFO_MAXTYPE, +} FOTP_InfoRngType; + +typedef struct { + unsigned int data[4]; +} FOTP_CommonData; + +/* + * FOTP INFO RNG0 + */ +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int DIEID_STD_VER : 3; + unsigned int MR_FLAG : 1; + unsigned int LOTID0 : 6; + unsigned int LOTID1 : 6; + unsigned int LOTID2 : 6; + unsigned int LOTID3 : 6; + unsigned int LOTID4 : 4; + } data0; + struct { + unsigned int LOTID4 : 2; + unsigned int LOTID5 : 6; + unsigned int WAFERID : 5; + unsigned int DIEX : 8; + unsigned int DIEY : 8; + unsigned int PASSFLAG_RT_CP : 1; + unsigned int reserved : 2; + } data1; + unsigned int reserved[2]; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_0; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int YEAR : 6; + unsigned int MON : 4; + unsigned int DAY : 5; + unsigned int HOUR : 5; + unsigned int MIN : 6; + unsigned int SEC : 6; + } data0; + struct { + unsigned int LOSC_CTRIM : 8; + unsigned int HOSC_CTRM : 9; + unsigned int PMU_BG_TRIM : 5; + unsigned int PMU_CLDO_TRIM : 5; + unsigned int reserved : 5; + } data1; + unsigned int reserved[2]; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_1; + +typedef union { + FOTP_CommonData comData; + struct { + unsigned int chip_id; + unsigned int reserved; + struct { + unsigned int version_id : 8; + unsigned int reserved : 24; + } data2; + unsigned int customer_id; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_2; + +typedef union { + FOTP_CommonData comData; + struct { + unsigned int fotp_empty_flag; + unsigned int reserved[3]; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_4; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int info_rgn0_unlock : 8; + unsigned int reserved : 24; + } data0; + unsigned int reserved0; + struct { + unsigned int info_rgn2_unlock : 8; + unsigned int reserved : 24; + } data2; + unsigned int reserved1; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_5; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int bootrom_debug_enable : 8; + unsigned int reserved : 24; + } data0; + struct { + unsigned int bootrom_hide_disable : 1; + unsigned int reserved : 31; + } data1; + struct { + unsigned int ef_bist_intf_enable : 1; + unsigned int reserved : 31; + } data2; + struct { + unsigned int dft_jtag_enable : 1; + unsigned int reserved : 31; + } data3; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_6; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int cpu_fpu_enable : 1; + unsigned int reserved0 : 7; + unsigned int sysram_size_cfg : 3; + unsigned int reserved1 : 5; + unsigned int eflash_size_cfg : 10; + unsigned int reserved2 : 5; + unsigned int cpu_maxfreq_cfg : 1; + } data0; + unsigned int reserved[3]; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_7; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int adc0_enable : 1; + unsigned int dac0_enable : 1; + unsigned int pga0_enable : 1; + unsigned int pga1_enable : 1; + unsigned int acmp0_enable : 1; + unsigned int reserved : 27; + } data0; + unsigned int reserved[3]; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_8; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int apt0_enable : 1; + unsigned int apt1_enable : 1; + unsigned int apt2_enable : 1; + unsigned int apt3_enable : 1; + unsigned int reserved0 : 12; + unsigned int can_enable : 1; + unsigned int reserved1 : 15; + } data0; + unsigned int reserved[3]; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_9; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int IDDQ_DVDD : 8; + unsigned int IDDQ_AVDD : 8; + unsigned int reserved : 16; + } data0; + unsigned int reserved[3]; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_10; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int hpm_core : 16; + unsigned int reserved : 16; + } data0; + unsigned int reserved[3]; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_11; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int PASSFLAG_CP_RT : 1; + unsigned int reserved : 31; + } data0; + unsigned int reserved[3]; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_13; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int PASSFLAG_FT_HT : 1; + unsigned int reserved : 31; + } data0; + unsigned int reserved[3]; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_16; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int DVS_FLOW_FLAG : 1; + unsigned int DVS_PASS_FLAG : 1; + unsigned int reserved : 30; + } data0; + unsigned int reserved[3]; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_17; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int FAILFLAG_ALL : 2; + unsigned int reserved : 30; + } data0; + unsigned int reserved[3]; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_18; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int PASSFLAG_FT_RT : 1; + unsigned int reserved : 31; + } data0; + unsigned int reserved[3]; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_19; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int da_ref_vbg_trim : 8; + unsigned int da_ref_vref_trim : 8; + unsigned int da_iref_trim : 8; + unsigned int da_ref_temp_trim0 : 8; + } data0; + struct { + unsigned int da_ref_temp_trim1 : 8; + unsigned int da_ref_temp_trim2 : 8; + unsigned int da_ref_temp_trim3 : 8; + unsigned int da_ref_vptat_trim : 8; + } data1; + struct { + unsigned int da_ref_buf_trim : 8; + unsigned int da_dac_trim : 8; + unsigned int da_acmp_trim : 8; + unsigned int da_sar_trim0 : 8; + } data2; + struct { + unsigned int da_sar_trim1 : 8; + unsigned int da_ana_top_trim0 : 8; + unsigned int da_ana_top_trim1 : 8; + unsigned int reserved : 8; + } data3; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_20; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int da_pga0_vos_trim : 9; + unsigned int reserved : 7; + unsigned int da_pga1_vos_trim : 9; + unsigned int reserved1 : 7; + } data0; + struct { + unsigned int saradc_gain : 13; + unsigned int reserved : 3; + unsigned int saradc_offset : 12; + unsigned int reserved1 : 4; + } data1; + struct { + unsigned int ts_offset : 12; + unsigned int reserved : 4; + unsigned int dac_gain : 11; + unsigned int reserved1 : 5; + } data2; + struct { + unsigned int dac_offset : 9; + unsigned int ts_gain : 23; + } data3; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_21; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int pga0_gain2 : 13; + unsigned int reserved : 3; + unsigned int pga0_offset2 : 12; + unsigned int reserved1 : 4; + } data0; + struct { + unsigned int pga0_gain4 : 13; + unsigned int reserved : 3; + unsigned int pga0_offset4 : 12; + unsigned int reserved1 : 4; + } data1; + struct { + unsigned int pga0_gain8 : 13; + unsigned int reserved : 3; + unsigned int pga0_offset8 : 12; + unsigned int reserved1 : 4; + } data2; + struct { + unsigned int pga0_gain16 : 13; + unsigned int reserved : 3; + unsigned int pga0_offset16 : 12; + unsigned int reserved1 : 4; + } data3; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_22; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int pga1_gain2 : 13; + unsigned int reserved : 3; + unsigned int pga1_offset2 : 12; + unsigned int reserved1 : 4; + } data0; + struct { + unsigned int pga1_gain4 : 13; + unsigned int reserved : 3; + unsigned int pga1_offset4 : 12; + unsigned int reserved1 : 4; + } data1; + struct { + unsigned int pga1_gain8 : 13; + unsigned int reserved : 3; + unsigned int pga1_offset8 : 12; + unsigned int reserved1 : 4; + } data2; + struct { + unsigned int pga1_gain16 : 13; + unsigned int reserved : 3; + unsigned int pga1_offset16 : 12; + unsigned int reserved1 : 4; + } data3; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_23; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int adc_weight3_trim : 9; + unsigned int reserved : 7; + unsigned int adc_weight4_trim : 10; + unsigned int reserved1 : 6; + } data0; + struct { + unsigned int adc_weight5_trim : 11; + unsigned int reserved : 5; + unsigned int adc_weight6_trim : 12; + unsigned int reserved1 : 4; + } data1; + struct { + unsigned int adc_weight7_trim : 12; + unsigned int reserved : 4; + unsigned int adc_weight8_trim : 13; + unsigned int reserved1 : 3; + } data2; + struct { + unsigned int adc_weight9_trim : 14; + unsigned int reserved : 2; + unsigned int adc_weight10_trim : 15; + unsigned int reserved1 : 1; + } data3; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_24; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int adc_weight11_trim : 15; + unsigned int reserved : 1; + unsigned int adc_weight12_trim : 16; + } data0; + struct { + unsigned int adc_weight13_trim : 17; + unsigned int reserved : 15; + } data1; + struct { + unsigned int adc_weight14_trim : 18; + unsigned int reserved : 14; + } data2; + struct { + unsigned int adc_weight15_trim : 19; + unsigned int reserved : 13; + } data3; + } REG; +} volatile FOTP_INFO_RGN0_NUMBER_25; + +/* + * FOTP INFO RNG1 + */ +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int protection_level : 8; + unsigned int reserved : 24; + } data0; + unsigned int reserved[3]; + } REG; +} volatile FOTP_INFO_RGN1_NUMBER_0; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int uart0_enable : 1; + unsigned int uart1_enable : 1; + unsigned int uart2_enable : 1; + unsigned int uart3_enable : 1; + unsigned int reserved : 28; + } data0; + struct { + unsigned int func_jtag_enable : 8; + unsigned int sysram_parity_disable : 1; + unsigned int reserved : 23; + } data1; + struct { + unsigned int uart_boot_enable : 1; + unsigned int spi_boot_enable : 1; + unsigned int i2c_boot_enable : 1; + unsigned int can_boot_enable : 1; + unsigned int reserved : 28; + } data2; + struct { + unsigned int main_rgn0_size : 10; + unsigned int reserved : 22; + } data3; + } REG; +} volatile FOTP_INFO_RGN1_NUMBER_1; + +typedef union { + FOTP_CommonData comData; + struct { + struct { + unsigned int info_rgn1_unlock : 8; + unsigned int reserved : 24; + } data0; + unsigned int reserved[3]; + } REG; +} volatile FOTP_INFO_RGN1_NUMBER_2; + +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/fotp/fotp_info_read.c b/vendor/others/demo/5-tim_adc/demo/chip/3061m/fotp/fotp_info_read.c new file mode 100644 index 000000000..0f46d5dd1 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/fotp/fotp_info_read.c @@ -0,0 +1,106 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file fotp_info_read.c + * @author MCU Driver Team + * @brief This file provides firmware functions to manage the following + * functionalities of the fotp control register. + * + FOTP INFO Read API + */ +#include "chipinc.h" +#include "flash.h" +#include "fotp_info_read.h" +#define FOTP_INFO_RNG0_BASEADDR 0x800000 +#define FOTP_INFO_RNG1_BASEADDR 0x801000 +#define REG_WORDS_NUM 16 +#define FLASH_READ_128BIT 1 + +/** + * @brief Read Four words of FOTP. + * @param efc Flash control register base address + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +static unsigned int FOTP_CheckReadStatus(EFC_RegStruct *efc) +{ + /* Check for errors in the flash reading process. */ + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_chk) { + efc->INT_CLEAR.BIT.int_clr_err_ecc_corr = BASE_CFG_SET; + efc->INT_CLEAR.BIT.int_clr_err_illegal = BASE_CFG_SET; + efc->INT_CLEAR.BIT.int_clr_err_ecc_chk = BASE_CFG_SET; + efc->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief Read Four words of FOTP. + * @param type FOTP Range Type + * @param index FOTP register index + * @param buf Buffer of read data + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +unsigned int FOTP_InfoGet(FOTP_InfoRngType type, unsigned int index, FOTP_CommonData *buf) +{ + EFC_RegStruct *p = EFC; + unsigned int addr; + + if (buf == NULL) { + return BASE_STATUS_ERROR; + } + + if ((type >= FOTP_INFO_MAXTYPE) || (index > FOTP_INFO_REG_MAX_ID)) { + return BASE_STATUS_ERROR; + } + + /* If there is a read command, return */ + if (p->EFLASH_CMD.BIT.cmd_start) { + return BASE_STATUS_ERROR; + } + + p->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; + + /* Configure the read command parameters and start the read command */ + addr = (type == FOTP_INFO_RNG0) ? FOTP_INFO_RNG0_BASEADDR : FOTP_INFO_RNG1_BASEADDR; + addr += index * REG_WORDS_NUM; + p->EFLASH_ADDR.BIT.cmd_addr = addr >> 2; /* Right shift 2 bit change to word */ + p->EFLASH_CMD.BIT.cmd_code = FLASH_OPERATION_READ; + p->EFLASH_CMD.BIT.cmd_read_size = FLASH_READ_128BIT; + p->EFLASH_CMD.BIT.cmd_start = BASE_CFG_SET; + + while (p->EFLASH_CMD.BIT.cmd_start) { + ; + } + while (p->EFLASH_CMD.BIT.exec_state) { + ; + } + /* read error, clear interrupt and return */ + if (FOTP_CheckReadStatus(p) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + /* Read data from FIFO to buffer */ + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + buf->data[i] = p->FLASH_RDATA; + } + p->INT_CLEAR.BIT.int_clr_finish = BASE_CFG_SET; + p->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/fotp/fotp_info_read.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/fotp/fotp_info_read.h new file mode 100644 index 000000000..2a78077f1 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/fotp/fotp_info_read.h @@ -0,0 +1,31 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file fotp_info_read.h + * @author MCU Driver Team + * @brief This file provides firmware functions to manage the following + * functionalities of the system control register. + * + FOTP Register Read API + */ +#ifndef McuMagicTag_FOTP_INFO_READ_H +#define McuMagicTag_FOTP_INFO_READ_H + +#include "fotp.h" + +unsigned int FOTP_InfoGet(FOTP_InfoRngType type, unsigned int index, FOTP_CommonData *buf); + +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/info.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/info.h new file mode 100644 index 000000000..fde26d300 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/info.h @@ -0,0 +1,30 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file info.h + * @author MCU Driver Team + * @brief Defines chip attributes. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_INFO_H +#define McuMagicTag_INFO_H + +#define CHIP_DELAY_CYCLES_PER_LOOP (4) /**< CPU cycles. Known number of this CPU cycles required to execute the \ + BASE_FUNC_delay() loop. */ + +#endif /* McuMagicTag_INFO_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/interrupt_ip.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/interrupt_ip.h new file mode 100644 index 000000000..07bdf6b06 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/interrupt_ip.h @@ -0,0 +1,183 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file interrupt_ip.h + * @author MCU Driver Team + * @brief interrupt module driver. + * This file define the interrupt number + */ + +#ifndef MCUMagicTag_INTERRUPT_IP_H +#define MCUMagicTag_INTERRUPT_IP_H + +/* Typedef definitions -------------------------------------------------------*/ +#define MSTATUS_MIE 0x00000008U /**< mie in mstatus */ +#define MSTATUS_MPIE 0x00000080U /**< mpie in mstatus */ +#define UINT32_CUT_MASK 0xFFFFFFFFU + +#define IRQ_PRIO_HIGHEST 15 /**< Highest priority of a hardware interrupt. */ +#define IRQ_PRIO_LOWEST 1 /**< Lowest priority of a hardware interrupt. */ + +/** + * @brief Count of system interrupt vector. + * The number of standard interrupts inside the CPU. The interrupt number + * is 0~25. The software interrupt nesting scheme cannot use standard + * interrupts, which means that external system integration will ensure + * that no standard interrupts will be triggered. + */ +#define IRQ_VECTOR_CNT 26 + +/** + * @brief Count of local interrupt vector 0 - 5, enabled by CSR mie 26 -31 bit. + */ +#define IRQ_MIE_VECTOR_CNT 6 + +/** + * @brief Count of IRQ controlled by CSR mie + */ +#define IRQ_MIE_TOTAL_CNT (IRQ_VECTOR_CNT + IRQ_MIE_VECTOR_CNT) +#define IRQ_LOCIEN1_OFFSET 64 +#define IRQ_LOCIEN2_OFFSET 96 +#define IRQ_LOCIEN3_OFFSET 128 + +/** + * @brief rv_custom_csr + * locipri0~15 are registers that control the priority of interrupts, + * and every 4 bits control the priority of an interrupt + */ +#define LOCIPRI0 0xBC0 +#define LOCIPRI1 0xBC1 +#define LOCIPRI2 0xBC2 +#define LOCIPRI3 0xBC3 +#define LOCIPRI4 0xBC4 +#define LOCIPRI5 0xBC5 +#define LOCIPRI6 0xBC6 +#define LOCIPRI7 0xBC7 +#define LOCIPRI8 0xBC8 +#define LOCIPRI9 0xBC9 +#define LOCIPRI10 0xBCA +#define LOCIPRI11 0xBCB +#define LOCIPRI12 0xBCC +#define LOCIPRI13 0xBCD +#define LOCIPRI14 0xBCE +#define LOCIPRI15 0xBCF + +#define LOCIPRI(x) LOCIPRI##x + +/** + * @brief locien0~3 are registers that control interrupt enable + */ +#define LOCIEN0 0xBE0 +#define LOCIEN1 0xBE1 +#define LOCIEN2 0xBE2 +#define LOCIEN3 0xBE3 + +/** + * @brief locipd0~3 are registers that control the interrupt flag bit. Each bit + * controls an interrupt. If the corresponding bit bit is 1, it means the + * corresponding interrupt is triggered. + */ +#define LOCIPD0 0xBE8 +#define LOCIPD1 0xBE9 +#define LOCIPD2 0xBEA +#define LOCIPD3 0xBEB + +/** + * @brief Locipclr is the register that clears the interrupt flag bit, and the + * corresponding interrupt number is assigned to the locipclr register, + * and the hardware will clear the corresponding interrupt flag bit, that + * is, the corresponding locipd bit is set + */ +#define LOCIPCLR 0xBF0 + +/** + * @brief The maximum number of interrupts supported, excluding 26 internal standard + * interrupts, up to 230 external non-standard interrupts can be supported + */ +#define IRQ_NUM 256 + +/* ---------- Interrupt Number Definition ----------------------------------- */ +typedef enum { + IRQ_SOFTWARE = 26, /* The first 0~25 interrupts are the internal standard interrupts of the CPU, + and the customizable external non-standard interrupts start from 26 */ + IRQ_UART3 = 27, + + IRQ_UART0 = 28, + IRQ_UART1 = 29, + IRQ_UART2 = 30, + IRQ_MTIMER = 31, + IRQ_TIMER0 = 32, + IRQ_TIMER1 = 33, + IRQ_TIMER2 = 34, + IRQ_TIMER3 = 35, + IRQ_GPT0_INT = 36, + IRQ_GPT0_PRD_INT = 37, + IRQ_GPT1_INT = 38, + IRQ_GPT1_PRD_INT = 39, + IRQ_WWDG = 40, + + IRQ_I2C0 = 42, + IRQ_I2C1 = 43, + IRQ_SPI0 = 44, + IRQ_SPI1 = 45, + IRQ_CAN = 46, + + IRQ_APT0_EVT = 48, + IRQ_APT0_TMR = 49, + IRQ_APT1_EVT = 50, + IRQ_APT1_TMR = 51, + IRQ_APT2_EVT = 52, + IRQ_APT2_TMR = 53, + IRQ_APT3_EVT = 54, + IRQ_APT3_TMR = 55, + + IRQ_CMM = 68, + IRQ_CFD = 68, + IRQ_CAPM0 = 70, + IRQ_CAPM1 = 71, + IRQ_CAPM2 = 72, + IRQ_QDM0 = 73, + IRQ_QDM1 = 74, + IRQ_DMA_TC = 77, + IRQ_DMA_ERR = 78, + IRQ_SYSRAM_PARITY_ERR = 79, + IRQ_EFC = 81, + IRQ_EFC_ERR = 82, + IRQ_ACMP_INT = 84, + IRQ_PVD = 85, + IRQ_GPT2_INT = 86, + IRQ_GPT2_PRD_INT = 87, + IRQ_GPT3_INT = 88, + IRQ_GPT3_PRD_INT = 89, + IRQ_ADC0_EVENT = 91, + IRQ_ADC0_ERR = 92, + IRQ_ADC0_INT0 = 93, + IRQ_ADC0_INT1 = 94, + IRQ_ADC0_INT2 = 95, + IRQ_ADC0_INT3 = 96, + + IRQ_GPIO0 = 109, + IRQ_GPIO1 = 110, + IRQ_GPIO2 = 111, + IRQ_GPIO3 = 112, + IRQ_GPIO4 = 113, + IRQ_GPIO5 = 114, + + IRQ_MAX, /**< The maximum number of interrupts currently supported */ +} IRQ_ID; + +#endif /* MCUMagicTag_INTERRUPT_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/ioconfig.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/ioconfig.h new file mode 100644 index 000000000..7e5a9eaf0 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/ioconfig.h @@ -0,0 +1,126 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file ioconfig.h + * @author MCU Driver Team + * @brief ioconfig module driver + * @details This file provides IOConfig register mapping structure. + */ + +/* Macro definitions */ +#ifndef McuMagicTag_IOCONFIG_H +#define McuMagicTag_IOCONFIG_H + +typedef union { + unsigned int reg; + struct { + unsigned int func : 4; /**< IO function selection. */ + unsigned int ds : 2; /**< Pin drive capability selection. */ + unsigned int reserved0 : 1; + unsigned int pd : 1; /**< Pin pull down control. */ + unsigned int pu : 1; /**< Pin pull up control. */ + unsigned int sr : 1; /**< Electrical level shift speed control. */ + unsigned int se : 1; /**< Schmidt input control. */ + unsigned int reserved1 : 21; + } BIT; +} volatile IOCMG_REG; + +typedef struct { + IOCMG_REG IOCFG_GPIO0_2; /**< Pin GPIO0_2 IO Config Register, offset address:0x000000U */ + unsigned char space0[12]; + IOCMG_REG IOCFG_GPIO5_0; /**< Pin GPIO5_0 IO Config Register, offset address:0x000010U */ + unsigned char space1[4]; +#ifdef CHIP_3061MNPICA /* Only CHIP_3061MNPICA is supported. */ + IOCMG_REG IOCFG_GPIO3_3; /**< Pin GPIO3_3 IO Config Register, offset address:0x000018U */ +#else + unsigned char space2[4]; +#endif +#ifdef CHIP_3061MNPICA /* Only CHIP_3061MNPICA is supported. */ + IOCMG_REG IOCFG_GPIO2_4; /**< Pin GPIO2_4 IO Config Register, offset address:0x00001CU */ +#else + unsigned char space3[4]; +#endif + unsigned char space4[224]; + IOCMG_REG IOCFG_GPIO0_7; /**< Pin GPIO0_7 IO Config Register, offset address:0x000100U */ +#ifdef CHIP_3061MNPICA /* Only CHIP_3061MNPICA is supported. */ + IOCMG_REG IOCFG_GPIO5_1; /**< Pin GPIO5_1 IO Config Register, offset address:0x000104U */ +#else + unsigned char space5[4]; +#endif + IOCMG_REG IOCFG_GPIO2_7; /**< Pin GPIO2_7 IO Config Register, offset address:0x000108U */ + IOCMG_REG IOCFG_GPIO2_6; /**< Pin GPIO2_6 IO Config Register, offset address:0x00010CU */ + IOCMG_REG IOCFG_GPIO2_5; /**< Pin GPIO2_5 IO Config Register, offset address:0x000110U */ +#ifdef CHIP_3061MNPICA /* Only CHIP_3061MNPICA is supported. */ + IOCMG_REG IOCFG_GPIO5_2; /**< Pin GPIO5_2 IO Config Register, offset address:0x000114U */ +#else + unsigned char space6[4]; +#endif + IOCMG_REG IOCFG_GPIO3_7; /**< Pin GPIO3_7 IO Config Register, offset address:0x000118U */ + IOCMG_REG IOCFG_GPIO3_6; /**< Pin GPIO3_6 IO Config Register, offset address:0x00011CU */ + IOCMG_REG IOCFG_GPIO3_5; /**< Pin GPIO3_5 IO Config Register, offset address:0x000120U */ +#ifdef CHIP_3061MNPICA /* Only CHIP_3061MNPICA is supported. */ + IOCMG_REG IOCFG_GPIO5_3; /**< Pin GPIO5_3 IO Config Register, offset address:0x000124U */ +#else + unsigned char space7[4]; +#endif + IOCMG_REG IOCFG_GPIO1_5; /**< Pin GPIO1_5 IO Config Register, offset address:0x000128U */ + IOCMG_REG IOCFG_GPIO1_6; /**< Pin GPIO1_6 IO Config Register, offset address:0x00012CU */ + IOCMG_REG IOCFG_GPIO1_7; /**< Pin GPIO1_7 IO Config Register, offset address:0x000130U */ + IOCMG_REG IOCFG_GPIO4_7; /**< Pin GPIO4_7 IO Config Register, offset address:0x000134U */ +#ifdef CHIP_3061MNPICA /* Only CHIP_3061MNPICA is supported. */ + IOCMG_REG IOCFG_GPIO4_5; /**< Pin GPIO4_5 IO Config Register, offset address:0x000138U */ + IOCMG_REG IOCFG_GPIO4_6; /**< Pin GPIO4_6 IO Config Register, offset address:0x00013CU */ + IOCMG_REG IOCFG_GPIO1_3; /**< Pin GPIO1_3 IO Config Register, offset address:0x000140U */ + IOCMG_REG IOCFG_GPIO1_4; /**< Pin GPIO1_4 IO Config Register, offset address:0x000144U */ +#else + unsigned char space8[16]; +#endif + IOCMG_REG IOCFG_GPIO3_0; /**< Pin GPIO3_0 IO Config Register, offset address:0x000148U */ + IOCMG_REG IOCFG_GPIO3_1; /**< Pin GPIO3_1 IO Config Register, offset address:0x00014CU */ + IOCMG_REG IOCFG_GPIO3_2; /**< Pin GPIO3_2 IO Config Register, offset address:0x000150U */ + IOCMG_REG IOCFG_GPIO4_0; /**< Pin GPIO4_0 IO Config Register, offset address:0x000154U */ + IOCMG_REG IOCFG_EF_BIST_INTF; /**< Pin EF_BIST_INTF IO Config Register, offset address:0x000158U */ + IOCMG_REG IOCFG_GPIO4_1; /**< Pin GPIO4_1 IO Config Register, offset address:0x00015CU */ + IOCMG_REG IOCFG_GPIO4_2; /**< Pin GPIO4_2 IO Config Register, offset address:0x000160U */ +#ifdef CHIP_3061MNPICA /* Only CHIP_3061MNPICA is supported. */ + IOCMG_REG IOCFG_GPIO4_3; /**< Pin GPIO4_3 IO Config Register, offset address:0x000164U */ + IOCMG_REG IOCFG_GPIO1_0; /**< Pin GPIO1_0 IO Config Register, offset address:0x000168U */ + IOCMG_REG IOCFG_GPIO1_1; /**< Pin GPIO1_1 IO Config Register, offset address:0x00016CU */ + IOCMG_REG IOCFG_GPIO3_4; /**< Pin GPIO3_4 IO Config Register, offset address:0x000170U */ + IOCMG_REG IOCFG_GPIO4_4; /**< Pin GPIO4_4 IO Config Register, offset address:0x000174U */ +#else + unsigned char space9[20]; +#endif + IOCMG_REG IOCFG_GPIO2_0; /**< Pin GPIO2_0 IO Config Register, offset address:0x000178U */ + IOCMG_REG IOCFG_GPIO2_1; /**< Pin GPIO2_1 IO Config Register, offset address:0x00017CU */ +#ifdef CHIP_3061MNPICA /* Only CHIP_3061MNPICA is supported. */ + IOCMG_REG IOCFG_GPIO2_2; /**< Pin GPIO2_2 IO Config Register, offset address:0x000180U */ + IOCMG_REG IOCFG_GPIO2_3; /**< Pin GPIO2_3 IO Config Register, offset address:0x000184U */ +#else + unsigned char space10[8]; +#endif + IOCMG_REG IOCFG_GPIO0_0; /**< Pin GPIO0_0 IO Config Register, offset address:0x000188U */ + IOCMG_REG IOCFG_GPIO0_1; /**< Pin GPIO0_1 IO Config Register, offset address:0x00018CU */ + IOCMG_REG IOCFG_GPIO0_3; /**< Pin GPIO0_3 IO Config Register, offset address:0x000190U */ + IOCMG_REG IOCFG_GPIO0_4; /**< Pin GPIO0_4 IO Config Register, offset address:0x000194U */ + IOCMG_REG IOCFG_GPIO1_2; /**< Pin GPIO1_2 IO Config Register, offset address:0x000198U */ + unsigned char space11[4]; + IOCMG_REG IOCFG_GPIO0_5; /**< Pin GPIO0_5 IO Config Register, offset address:0x0001A0U */ + IOCMG_REG IOCFG_GPIO0_6; /**< Pin GPIO0_6 IO Config Register, offset address:0x0001A4U */ +} volatile IOConfig_RegStruct; + +#endif /* McuMagicTag_IOCONFIG_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/iomap/iomap.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/iomap/iomap.h new file mode 100644 index 000000000..e9c6f92d9 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/iomap/iomap.h @@ -0,0 +1,320 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file iomap.h + * @author MCU Driver Team + * @brief Defines chip pin map and function mode. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_IOMAP_H +#define McuMagicTag_IOMAP_H + +/* get offset value of member in type struct */ +#define OFFSET_OF(type, member) (unsigned int)(&(((type *)0)->member)) + +#define IOCMG_PIN_MUX(regx, funcNum, regValueDefault) \ + (unsigned int)(((OFFSET_OF(IOConfig_RegStruct, regx) & 0x00000FFF) << 16) | \ + (((regValueDefault) & 0xFFFFFFF0) | (funcNum))) +/* pin function mode info ---------------------------------------------------- */ +#define GPIO0_7_AS_GPIO0_7 IOCMG_PIN_MUX(IOCFG_GPIO0_7, FUNC_MODE_0, 0x02b1) +#define GPIO0_7_AS_JTAG_TRSTN IOCMG_PIN_MUX(IOCFG_GPIO0_7, FUNC_MODE_1, 0x02b1) +#define GPIO0_7_AS_SPI0_CSN0 IOCMG_PIN_MUX(IOCFG_GPIO0_7, FUNC_MODE_2, 0x02b1) +#define GPIO0_7_AS_UART1_CTSN IOCMG_PIN_MUX(IOCFG_GPIO0_7, FUNC_MODE_3, 0x02b1) +#define GPIO0_7_AS_CAPM1_IN IOCMG_PIN_MUX(IOCFG_GPIO0_7, FUNC_MODE_4, 0x02b1) +#define GPIO0_7_AS_POE0 IOCMG_PIN_MUX(IOCFG_GPIO0_7, FUNC_MODE_5, 0x02b1) +#define GPIO0_7_AS_ACMP0_OUT IOCMG_PIN_MUX(IOCFG_GPIO0_7, FUNC_MODE_6, 0x02b1) +#define GPIO0_7_AS_ADC_AIN4 IOCMG_PIN_MUX(IOCFG_GPIO0_7, FUNC_MODE_12, 0x02b1) + +/* Only CHIP_3061MNPICA and CHIP_3061MNPIC8 is supported. */ +#if defined (CHIP_3061MNPICA) || defined (CHIP_3061MNPIC8) +#define GPIO5_1_AS_GPIO5_1 IOCMG_PIN_MUX(IOCFG_GPIO5_1, FUNC_MODE_0, 0x0230) +#define GPIO5_1_AS_ADC0_STATUS IOCMG_PIN_MUX(IOCFG_GPIO5_1, FUNC_MODE_5, 0x0230) +#define GPIO5_1_AS_ADC_EXT_TRIG3 IOCMG_PIN_MUX(IOCFG_GPIO5_1, FUNC_MODE_6, 0x0230) +#define GPIO5_1_AS_ADC_AIN5 IOCMG_PIN_MUX(IOCFG_GPIO5_1, FUNC_MODE_12, 0x0230) +#endif + +#define GPIO2_7_AS_GPIO2_7 IOCMG_PIN_MUX(IOCFG_GPIO2_7, FUNC_MODE_0, 0x0230) +#define GPIO2_7_AS_SPI0_CLK IOCMG_PIN_MUX(IOCFG_GPIO2_7, FUNC_MODE_2, 0x0230) +#define GPIO2_7_AS_UART1_RTSN IOCMG_PIN_MUX(IOCFG_GPIO2_7, FUNC_MODE_3, 0x0230) +#define GPIO2_7_AS_PGA0_OUT IOCMG_PIN_MUX(IOCFG_GPIO2_7, FUNC_MODE_13, 0x0230) + +#define GPIO2_6_AS_GPIO2_6 IOCMG_PIN_MUX(IOCFG_GPIO2_6, FUNC_MODE_0, 0x0230) +#define GPIO2_6_AS_SPI0_RXD IOCMG_PIN_MUX(IOCFG_GPIO2_6, FUNC_MODE_2, 0x0230) +#define GPIO2_6_AS_APT_EVTMP5 IOCMG_PIN_MUX(IOCFG_GPIO2_6, FUNC_MODE_6, 0x0230) +#define GPIO2_6_AS_ADC_AIN6 IOCMG_PIN_MUX(IOCFG_GPIO2_6, FUNC_MODE_12, 0x0230) +#define GPIO2_6_AS_PGA0_N0 IOCMG_PIN_MUX(IOCFG_GPIO2_6, FUNC_MODE_13, 0x0230) +#define GPIO2_6_AS_ACMP_N3 IOCMG_PIN_MUX(IOCFG_GPIO2_6, FUNC_MODE_14, 0x0230) + +#define GPIO2_5_AS_GPIO2_5 IOCMG_PIN_MUX(IOCFG_GPIO2_5, FUNC_MODE_0, 0x0230) +#define GPIO2_5_AS_SPI0_TXD IOCMG_PIN_MUX(IOCFG_GPIO2_5, FUNC_MODE_2, 0x0230) +#define GPIO2_5_AS_APT_EVTIO5 IOCMG_PIN_MUX(IOCFG_GPIO2_5, FUNC_MODE_6, 0x0230) +#define GPIO2_5_AS_ADC_AIN7 IOCMG_PIN_MUX(IOCFG_GPIO2_5, FUNC_MODE_12, 0x0230) +#define GPIO2_5_AS_PGA0_P0 IOCMG_PIN_MUX(IOCFG_GPIO2_5, FUNC_MODE_13, 0x0230) +#define GPIO2_5_AS_ACMP_P3 IOCMG_PIN_MUX(IOCFG_GPIO2_5, FUNC_MODE_14, 0x0230) + +/* Only CHIP_3061MNPICA and CHIP_3061MNPIC8 is supported. */ +#if defined (CHIP_3061MNPICA) || defined (CHIP_3061MNPIC8) +#define GPIO5_2_AS_GPIO5_2 IOCMG_PIN_MUX(IOCFG_GPIO5_2, FUNC_MODE_0, 0x0230) +#define GPIO5_2_AS_GPT2_PWM IOCMG_PIN_MUX(IOCFG_GPIO5_2, FUNC_MODE_1, 0x0230) +#define GPIO5_2_AS_ADC0_STATUS IOCMG_PIN_MUX(IOCFG_GPIO5_2, FUNC_MODE_5, 0x0230) +#define GPIO5_2_AS_ADC_EXT_TRIG2 IOCMG_PIN_MUX(IOCFG_GPIO5_2, FUNC_MODE_6, 0x0230) +#define GPIO5_2_AS_ADC_AIN8 IOCMG_PIN_MUX(IOCFG_GPIO5_2, FUNC_MODE_12, 0x0230) +#endif + +#define GPIO3_7_AS_GPIO3_7 IOCMG_PIN_MUX(IOCFG_GPIO3_7, FUNC_MODE_0, 0x0230) +#define GPIO3_7_AS_GPT3_PWM IOCMG_PIN_MUX(IOCFG_GPIO3_7, FUNC_MODE_1, 0x0230) +#define GPIO3_7_AS_SPI0_CSN1 IOCMG_PIN_MUX(IOCFG_GPIO3_7, FUNC_MODE_2, 0x0230) +#define GPIO3_7_AS_ACMP0_OUT IOCMG_PIN_MUX(IOCFG_GPIO3_7, FUNC_MODE_6, 0x0230) +#define GPIO3_7_AS_ADC_AIN9 IOCMG_PIN_MUX(IOCFG_GPIO3_7, FUNC_MODE_12, 0x0230) + +#define GPIO3_6_AS_GPIO3_6 IOCMG_PIN_MUX(IOCFG_GPIO3_6, FUNC_MODE_0, 0x0230) +#define GPIO3_6_AS_CAN_RX IOCMG_PIN_MUX(IOCFG_GPIO3_6, FUNC_MODE_1, 0x0230) +#define GPIO3_6_AS_ADC_AIN10 IOCMG_PIN_MUX(IOCFG_GPIO3_6, FUNC_MODE_12, 0x0230) +#define GPIO3_6_AS_ACMP_N4 IOCMG_PIN_MUX(IOCFG_GPIO3_6, FUNC_MODE_13, 0x0230) + +#define GPIO3_5_AS_GPIO3_5 IOCMG_PIN_MUX(IOCFG_GPIO3_5, FUNC_MODE_0, 0x0230) +#define GPIO3_5_AS_CAN_TX IOCMG_PIN_MUX(IOCFG_GPIO3_5, FUNC_MODE_1, 0x0230) +#define GPIO3_5_AS_ADC_EXT_TRIG0 IOCMG_PIN_MUX(IOCFG_GPIO3_5, FUNC_MODE_4, 0x0230) +#define GPIO3_5_AS_ADC_AIN11 IOCMG_PIN_MUX(IOCFG_GPIO3_5, FUNC_MODE_12, 0x0230) +#define GPIO3_5_AS_ACMP_P4 IOCMG_PIN_MUX(IOCFG_GPIO3_5, FUNC_MODE_13, 0x0230) + +/* Only CHIP_3061MNPICA and CHIP_3061MNPIC8 is supported. */ +#if defined (CHIP_3061MNPICA) || defined (CHIP_3061MNPIC8) +#define GPIO5_3_AS_GPIO5_3 IOCMG_PIN_MUX(IOCFG_GPIO5_3, FUNC_MODE_0, 0x0230) +#define GPIO5_3_AS_ADC0_STATUS IOCMG_PIN_MUX(IOCFG_GPIO5_3, FUNC_MODE_5, 0x0230) +#define GPIO5_3_AS_ADC_EXT_TRIG1 IOCMG_PIN_MUX(IOCFG_GPIO5_3, FUNC_MODE_6, 0x0230) +#define GPIO5_3_AS_ADC_AIN12 IOCMG_PIN_MUX(IOCFG_GPIO5_3, FUNC_MODE_12, 0x0230) +#endif + +#define GPIO1_5_AS_GPIO1_5 IOCMG_PIN_MUX(IOCFG_GPIO1_5, FUNC_MODE_0, 0x0230) +#define GPIO1_5_AS_SMB1_ALERTN IOCMG_PIN_MUX(IOCFG_GPIO1_5, FUNC_MODE_2, 0x0230) +#define GPIO1_5_AS_UART2_TXD IOCMG_PIN_MUX(IOCFG_GPIO1_5, FUNC_MODE_3, 0x0230) +#define GPIO1_5_AS_CAPM1_IN IOCMG_PIN_MUX(IOCFG_GPIO1_5, FUNC_MODE_4, 0x0230) +#define GPIO1_5_AS_ADC_AIN13 IOCMG_PIN_MUX(IOCFG_GPIO1_5, FUNC_MODE_12, 0x0230) +#define GPIO1_5_AS_PGA1_P0 IOCMG_PIN_MUX(IOCFG_GPIO1_5, FUNC_MODE_13, 0x0230) + +#define GPIO1_6_AS_GPIO1_6 IOCMG_PIN_MUX(IOCFG_GPIO1_6, FUNC_MODE_0, 0x0230) +#define GPIO1_6_AS_SMB1_SUSN IOCMG_PIN_MUX(IOCFG_GPIO1_6, FUNC_MODE_2, 0x0230) +#define GPIO1_6_AS_UART2_RXD IOCMG_PIN_MUX(IOCFG_GPIO1_6, FUNC_MODE_3, 0x0230) +#define GPIO1_6_AS_CAPM2_IN IOCMG_PIN_MUX(IOCFG_GPIO1_6, FUNC_MODE_4, 0x0230) +#define GPIO1_6_AS_ADC_AIN14 IOCMG_PIN_MUX(IOCFG_GPIO1_6, FUNC_MODE_12, 0x0230) +#define GPIO1_6_AS_PGA1_N0 IOCMG_PIN_MUX(IOCFG_GPIO1_6, FUNC_MODE_13, 0x0230) + +#define GPIO1_7_AS_GPIO1_7 IOCMG_PIN_MUX(IOCFG_GPIO1_7, FUNC_MODE_0, 0x0230) +#define GPIO1_7_AS_I2C1_SCL IOCMG_PIN_MUX(IOCFG_GPIO1_7, FUNC_MODE_2, 0x0230) +#define GPIO1_7_AS_UART2_CTSN IOCMG_PIN_MUX(IOCFG_GPIO1_7, FUNC_MODE_3, 0x0230) +#define GPIO1_7_AS_CAPM0_IN IOCMG_PIN_MUX(IOCFG_GPIO1_7, FUNC_MODE_4, 0x0230) +#define GPIO1_7_AS_APT_EVTMP6 IOCMG_PIN_MUX(IOCFG_GPIO1_7, FUNC_MODE_6, 0x0230) +#define GPIO1_7_AS_PGA1_OUT IOCMG_PIN_MUX(IOCFG_GPIO1_7, FUNC_MODE_13, 0x0230) + +#define GPIO4_7_AS_GPIO4_7 IOCMG_PIN_MUX(IOCFG_GPIO4_7, FUNC_MODE_0, 0x0230) +#define GPIO4_7_AS_POE1 IOCMG_PIN_MUX(IOCFG_GPIO4_7, FUNC_MODE_1, 0x0230) +#define GPIO4_7_AS_I2C1_SDA IOCMG_PIN_MUX(IOCFG_GPIO4_7, FUNC_MODE_2, 0x0230) +#define GPIO4_7_AS_UART2_RTSN IOCMG_PIN_MUX(IOCFG_GPIO4_7, FUNC_MODE_3, 0x0230) +#define GPIO4_7_AS_ADC0_STATUS IOCMG_PIN_MUX(IOCFG_GPIO4_7, FUNC_MODE_4, 0x0230) +#define GPIO4_7_AS_ADC_AIN15 IOCMG_PIN_MUX(IOCFG_GPIO4_7, FUNC_MODE_12, 0x0230) +#define GPIO4_7_AS_DAC_OUT IOCMG_PIN_MUX(IOCFG_GPIO4_7, FUNC_MODE_13, 0x0230) + +/* Only CHIP_3061MNPICA and CHIP_3061MNPIC8 is supported. */ +#if defined (CHIP_3061MNPICA) || defined (CHIP_3061MNPIC8) +#define GPIO4_5_AS_GPIO4_5 IOCMG_PIN_MUX(IOCFG_GPIO4_5, FUNC_MODE_0, 0x0230) +#define GPIO4_5_AS_I2C0_SCL IOCMG_PIN_MUX(IOCFG_GPIO4_5, FUNC_MODE_2, 0x0230) +#define GPIO4_5_AS_UART3_CTSN IOCMG_PIN_MUX(IOCFG_GPIO4_5, FUNC_MODE_3, 0x0230) +#define GPIO4_5_AS_SPI1_CSN0 IOCMG_PIN_MUX(IOCFG_GPIO4_5, FUNC_MODE_4, 0x0230) +#define GPIO4_5_AS_QDM0_A IOCMG_PIN_MUX(IOCFG_GPIO4_5, FUNC_MODE_5, 0x0230) + +#define GPIO4_6_AS_GPIO4_6 IOCMG_PIN_MUX(IOCFG_GPIO4_6, FUNC_MODE_0, 0x0220) +#define GPIO4_6_AS_I2C0_SDA IOCMG_PIN_MUX(IOCFG_GPIO4_6, FUNC_MODE_2, 0x0220) +#define GPIO4_6_AS_UART3_RTSN IOCMG_PIN_MUX(IOCFG_GPIO4_6, FUNC_MODE_3, 0x0220) +#define GPIO4_6_AS_SPI1_CLK IOCMG_PIN_MUX(IOCFG_GPIO4_6, FUNC_MODE_4, 0x0220) +#define GPIO4_6_AS_QDM0_B IOCMG_PIN_MUX(IOCFG_GPIO4_6, FUNC_MODE_5, 0x0220) + +#define GPIO1_3_AS_GPIO1_3 IOCMG_PIN_MUX(IOCFG_GPIO1_3, FUNC_MODE_0, 0x0230) +#define GPIO1_3_AS_CAN_RX IOCMG_PIN_MUX(IOCFG_GPIO1_3, FUNC_MODE_1, 0x0230) +#define GPIO1_3_AS_SMB0_ALERTN IOCMG_PIN_MUX(IOCFG_GPIO1_3, FUNC_MODE_2, 0x0230) +#define GPIO1_3_AS_UART3_TXD IOCMG_PIN_MUX(IOCFG_GPIO1_3, FUNC_MODE_3, 0x0230) +#define GPIO1_3_AS_SPI1_TXD IOCMG_PIN_MUX(IOCFG_GPIO1_3, FUNC_MODE_4, 0x0230) +#define GPIO1_3_AS_QDM0_INDEX IOCMG_PIN_MUX(IOCFG_GPIO1_3, FUNC_MODE_5, 0x0230) +#define GPIO1_3_AS_QDM0_SYNC IOCMG_PIN_MUX(IOCFG_GPIO1_3, FUNC_MODE_6, 0x0230) + +#define GPIO1_4_AS_GPIO1_4 IOCMG_PIN_MUX(IOCFG_GPIO1_4, FUNC_MODE_0, 0x0230) +#define GPIO1_4_AS_CAN_TX IOCMG_PIN_MUX(IOCFG_GPIO1_4, FUNC_MODE_1, 0x0230) +#define GPIO1_4_AS_SMB0_SUSN IOCMG_PIN_MUX(IOCFG_GPIO1_4, FUNC_MODE_2, 0x0230) +#define GPIO1_4_AS_UART3_RXD IOCMG_PIN_MUX(IOCFG_GPIO1_4, FUNC_MODE_3, 0x0230) +#define GPIO1_4_AS_SPI1_RXD IOCMG_PIN_MUX(IOCFG_GPIO1_4, FUNC_MODE_4, 0x0230) +#endif + +#define GPIO3_0_AS_GPIO3_0 IOCMG_PIN_MUX(IOCFG_GPIO3_0, FUNC_MODE_0, 0x0230) +#define GPIO3_0_AS_APT0_PWMA IOCMG_PIN_MUX(IOCFG_GPIO3_0, FUNC_MODE_1, 0x0230) +#define GPIO3_0_AS_SPI1_CSN1 IOCMG_PIN_MUX(IOCFG_GPIO3_0, FUNC_MODE_4, 0x0230) + +#define GPIO3_1_AS_GPIO3_1 IOCMG_PIN_MUX(IOCFG_GPIO3_1, FUNC_MODE_0, 0x0230) +#define GPIO3_1_AS_APT1_PWMA IOCMG_PIN_MUX(IOCFG_GPIO3_1, FUNC_MODE_1, 0x0230) +#define GPIO3_1_AS_I2C1_SCL IOCMG_PIN_MUX(IOCFG_GPIO3_1, FUNC_MODE_2, 0x0230) + +#define GPIO3_2_AS_GPIO3_2 IOCMG_PIN_MUX(IOCFG_GPIO3_2, FUNC_MODE_0, 0x0230) +#define GPIO3_2_AS_APT2_PWMA IOCMG_PIN_MUX(IOCFG_GPIO3_2, FUNC_MODE_1, 0x0230) +#define GPIO3_2_AS_I2C1_SDA IOCMG_PIN_MUX(IOCFG_GPIO3_2, FUNC_MODE_2, 0x0230) +#define GPIO3_2_AS_SPI1_CSN0 IOCMG_PIN_MUX(IOCFG_GPIO3_2, FUNC_MODE_4, 0x0230) + +/* Only CHIP_3061MNPICA and CHIP_3061MNPIC8 is supported. */ +#if defined (CHIP_3061MNPICA) || defined (CHIP_3061MNPIC8) +#define GPIO3_3_AS_GPIO3_3 IOCMG_PIN_MUX(IOCFG_GPIO3_3, FUNC_MODE_0, 0x0230) +#define GPIO3_3_AS_APT3_PWMA IOCMG_PIN_MUX(IOCFG_GPIO3_3, FUNC_MODE_1, 0x0230) +#define GPIO3_3_AS_POE2 IOCMG_PIN_MUX(IOCFG_GPIO3_3, FUNC_MODE_2, 0x0230) +#define GPIO3_3_AS_WAKEUP2 IOCMG_PIN_MUX(IOCFG_GPIO3_3, FUNC_MODE_6, 0x0230) +#endif + +#define GPIO4_0_AS_GPIO4_0 IOCMG_PIN_MUX(IOCFG_GPIO4_0, FUNC_MODE_0, 0x0230) +#define GPIO4_0_AS_APT0_PWMB IOCMG_PIN_MUX(IOCFG_GPIO4_0, FUNC_MODE_1, 0x0230) +#define GPIO4_0_AS_UART3_TXD IOCMG_PIN_MUX(IOCFG_GPIO4_0, FUNC_MODE_3, 0x0230) +#define GPIO4_0_AS_SPI1_CLK IOCMG_PIN_MUX(IOCFG_GPIO4_0, FUNC_MODE_4, 0x0230) + +#define GPIO4_1_AS_GPIO4_1 IOCMG_PIN_MUX(IOCFG_GPIO4_1, FUNC_MODE_0, 0x0230) +#define GPIO4_1_AS_APT1_PWMB IOCMG_PIN_MUX(IOCFG_GPIO4_1, FUNC_MODE_1, 0x0230) +#define GPIO4_1_AS_UART3_RXD IOCMG_PIN_MUX(IOCFG_GPIO4_1, FUNC_MODE_3, 0x0230) +#define GPIO4_1_AS_SPI1_RXD IOCMG_PIN_MUX(IOCFG_GPIO4_1, FUNC_MODE_4, 0x0230) + +#define GPIO4_2_AS_GPIO4_2 IOCMG_PIN_MUX(IOCFG_GPIO4_2, FUNC_MODE_0, 0x0230) +#define GPIO4_2_AS_APT2_PWMB IOCMG_PIN_MUX(IOCFG_GPIO4_2, FUNC_MODE_1, 0x0230) +#define GPIO4_2_AS_I2C0_SCL IOCMG_PIN_MUX(IOCFG_GPIO4_2, FUNC_MODE_2, 0x0230) +#define GPIO4_2_AS_SPI1_TXD IOCMG_PIN_MUX(IOCFG_GPIO4_2, FUNC_MODE_4, 0x0230) + +/* Only CHIP_3061MNPICA and CHIP_3061MNPIC8 is supported. */ +#if defined (CHIP_3061MNPICA) || defined (CHIP_3061MNPIC8) +#define GPIO4_3_AS_GPIO4_3 IOCMG_PIN_MUX(IOCFG_GPIO4_3, FUNC_MODE_0, 0x0230) +#define GPIO4_3_AS_APT3_PWMB IOCMG_PIN_MUX(IOCFG_GPIO4_3, FUNC_MODE_1, 0x0230) +#define GPIO4_3_AS_I2C0_SDA IOCMG_PIN_MUX(IOCFG_GPIO4_3, FUNC_MODE_2, 0x0230) +#define GPIO4_3_AS_SPI1_CSN1 IOCMG_PIN_MUX(IOCFG_GPIO4_3, FUNC_MODE_4, 0x0230) +#define GPIO4_3_AS_SPI0_CSN0 IOCMG_PIN_MUX(IOCFG_GPIO4_3, FUNC_MODE_5, 0x0230) + +#define GPIO1_0_AS_GPIO1_0 IOCMG_PIN_MUX(IOCFG_GPIO1_0, FUNC_MODE_0, 0x0230) +#define GPIO1_0_AS_APT0_PWMA IOCMG_PIN_MUX(IOCFG_GPIO1_0, FUNC_MODE_1, 0x0230) +#define GPIO1_0_AS_UART1_TXD IOCMG_PIN_MUX(IOCFG_GPIO1_0, FUNC_MODE_3, 0x0230) +#define GPIO1_0_AS_SPI0_CLK IOCMG_PIN_MUX(IOCFG_GPIO1_0, FUNC_MODE_5, 0x0230) + +#define GPIO1_1_AS_GPIO1_1 IOCMG_PIN_MUX(IOCFG_GPIO1_1, FUNC_MODE_0, 0x0230) +#define GPIO1_1_AS_APT1_PWMA IOCMG_PIN_MUX(IOCFG_GPIO1_1, FUNC_MODE_1, 0x0230) +#define GPIO1_1_AS_UART1_RXD IOCMG_PIN_MUX(IOCFG_GPIO1_1, FUNC_MODE_3, 0x0230) +#define GPIO1_1_AS_SPI0_RXD IOCMG_PIN_MUX(IOCFG_GPIO1_1, FUNC_MODE_5, 0x0230) + +#define GPIO3_4_AS_GPIO3_4 IOCMG_PIN_MUX(IOCFG_GPIO3_4, FUNC_MODE_0, 0x0230) +#define GPIO3_4_AS_APT2_PWMA IOCMG_PIN_MUX(IOCFG_GPIO3_4, FUNC_MODE_1, 0x0230) +#define GPIO3_4_AS_I2C1_SCL IOCMG_PIN_MUX(IOCFG_GPIO3_4, FUNC_MODE_2, 0x0230) +#define GPIO3_4_AS_UART1_CTSN IOCMG_PIN_MUX(IOCFG_GPIO3_4, FUNC_MODE_3, 0x0230) +#define GPIO3_4_AS_SPI0_TXD IOCMG_PIN_MUX(IOCFG_GPIO3_4, FUNC_MODE_5, 0x0230) + +#define GPIO4_4_AS_GPIO4_4 IOCMG_PIN_MUX(IOCFG_GPIO4_4, FUNC_MODE_0, 0x0230) +#define GPIO4_4_AS_APT3_PWMA IOCMG_PIN_MUX(IOCFG_GPIO4_4, FUNC_MODE_1, 0x0230) +#define GPIO4_4_AS_I2C1_SDA IOCMG_PIN_MUX(IOCFG_GPIO4_4, FUNC_MODE_2, 0x0230) +#define GPIO4_4_AS_UART1_RTSN IOCMG_PIN_MUX(IOCFG_GPIO4_4, FUNC_MODE_3, 0x0230) +#define GPIO4_4_AS_SPI0_CSN1 IOCMG_PIN_MUX(IOCFG_GPIO4_4, FUNC_MODE_5, 0x0230) +#endif + +#define GPIO2_0_AS_GPIO2_0 IOCMG_PIN_MUX(IOCFG_GPIO2_0, FUNC_MODE_0, 0x0230) +#define GPIO2_0_AS_I2C0_SCL IOCMG_PIN_MUX(IOCFG_GPIO2_0, FUNC_MODE_1, 0x0230) +#define GPIO2_0_AS_SMB1_ALERTN IOCMG_PIN_MUX(IOCFG_GPIO2_0, FUNC_MODE_2, 0x0230) +#define GPIO2_0_AS_UART3_TXD IOCMG_PIN_MUX(IOCFG_GPIO2_0, FUNC_MODE_3, 0x0230) +#define GPIO2_0_AS_CAPM2_IN IOCMG_PIN_MUX(IOCFG_GPIO2_0, FUNC_MODE_4, 0x0230) +#define GPIO2_0_AS_QDM1_A IOCMG_PIN_MUX(IOCFG_GPIO2_0, FUNC_MODE_5, 0x0230) +#define GPIO2_0_AS_APT_EVTMP4 IOCMG_PIN_MUX(IOCFG_GPIO2_0, FUNC_MODE_6, 0x0230) + +#define GPIO2_1_AS_GPIO2_1 IOCMG_PIN_MUX(IOCFG_GPIO2_1, FUNC_MODE_0, 0x0230) +#define GPIO2_1_AS_I2C0_SDA IOCMG_PIN_MUX(IOCFG_GPIO2_1, FUNC_MODE_1, 0x0230) +#define GPIO2_1_AS_SMB1_SUSN IOCMG_PIN_MUX(IOCFG_GPIO2_1, FUNC_MODE_2, 0x0230) +#define GPIO2_1_AS_UART3_RXD IOCMG_PIN_MUX(IOCFG_GPIO2_1, FUNC_MODE_3, 0x0230) +#define GPIO2_1_AS_CAPM1_IN IOCMG_PIN_MUX(IOCFG_GPIO2_1, FUNC_MODE_4, 0x0230) +#define GPIO2_1_AS_QDM1_B IOCMG_PIN_MUX(IOCFG_GPIO2_1, FUNC_MODE_5, 0x0230) +#define GPIO2_1_AS_APT_EVTIO4 IOCMG_PIN_MUX(IOCFG_GPIO2_1, FUNC_MODE_6, 0x0230) + +#define GPIO5_0_AS_GPIO5_0 IOCMG_PIN_MUX(IOCFG_GPIO5_0, FUNC_MODE_0, 0x0230) +#define GPIO5_0_AS_GPT2_PWM IOCMG_PIN_MUX(IOCFG_GPIO5_0, FUNC_MODE_1, 0x0230) +#define GPIO5_0_AS_QDM1_SYNC IOCMG_PIN_MUX(IOCFG_GPIO5_0, FUNC_MODE_3, 0x0230) +#define GPIO5_0_AS_CAPM0_IN IOCMG_PIN_MUX(IOCFG_GPIO5_0, FUNC_MODE_4, 0x0230) +#define GPIO5_0_AS_QDM1_INDEX IOCMG_PIN_MUX(IOCFG_GPIO5_0, FUNC_MODE_5, 0x0230) +#define GPIO5_0_AS_WAKEUP0 IOCMG_PIN_MUX(IOCFG_GPIO5_0, FUNC_MODE_6, 0x0230) + +/* Only CHIP_3061MNPICA and CHIP_3061MNPIC8 is supported. */ +#if defined (CHIP_3061MNPICA) || defined (CHIP_3061MNPIC8) +#define GPIO2_2_AS_GPIO2_2 IOCMG_PIN_MUX(IOCFG_GPIO2_2, FUNC_MODE_0, 0x0230) +#define GPIO2_2_AS_CAN_RX IOCMG_PIN_MUX(IOCFG_GPIO2_2, FUNC_MODE_1, 0x0230) +#define GPIO2_2_AS_UART0_TXD IOCMG_PIN_MUX(IOCFG_GPIO2_2, FUNC_MODE_2, 0x0230) +#define GPIO2_2_AS_UART2_TXD IOCMG_PIN_MUX(IOCFG_GPIO2_2, FUNC_MODE_3, 0x0230) +#define GPIO2_2_AS_CAPM2_IN IOCMG_PIN_MUX(IOCFG_GPIO2_2, FUNC_MODE_4, 0x0230) + +#define GPIO2_3_AS_GPIO2_3 IOCMG_PIN_MUX(IOCFG_GPIO2_3, FUNC_MODE_0, 0x0230) +#define GPIO2_3_AS_CAN_TX IOCMG_PIN_MUX(IOCFG_GPIO2_3, FUNC_MODE_1, 0x0230) +#define GPIO2_3_AS_UART0_RXD IOCMG_PIN_MUX(IOCFG_GPIO2_3, FUNC_MODE_2, 0x0230) +#define GPIO2_3_AS_UART2_RXD IOCMG_PIN_MUX(IOCFG_GPIO2_3, FUNC_MODE_3, 0x0230) +#define GPIO2_3_AS_CAPM1_IN IOCMG_PIN_MUX(IOCFG_GPIO2_3, FUNC_MODE_4, 0x0230) +#endif + +#define GPIO0_0_AS_GPIO0_0 IOCMG_PIN_MUX(IOCFG_GPIO0_0, FUNC_MODE_0, 0x02b1) +#define GPIO0_0_AS_JTAG_TCK IOCMG_PIN_MUX(IOCFG_GPIO0_0, FUNC_MODE_1, 0x02b1) +#define GPIO0_0_AS_UART0_CTSN IOCMG_PIN_MUX(IOCFG_GPIO0_0, FUNC_MODE_3, 0x02b1) +#define GPIO0_0_AS_UART2_CTSN IOCMG_PIN_MUX(IOCFG_GPIO0_0, FUNC_MODE_4, 0x02b1) + +#define GPIO0_1_AS_GPIO0_1 IOCMG_PIN_MUX(IOCFG_GPIO0_1, FUNC_MODE_0, 0x0311) +#define GPIO0_1_AS_JTAG_TMS IOCMG_PIN_MUX(IOCFG_GPIO0_1, FUNC_MODE_1, 0x0311) +#define GPIO0_1_AS_UART0_RTSN IOCMG_PIN_MUX(IOCFG_GPIO0_1, FUNC_MODE_3, 0x0311) +#define GPIO0_1_AS_UART2_RTSN IOCMG_PIN_MUX(IOCFG_GPIO0_1, FUNC_MODE_4, 0x0311) + +#define GPIO0_2_AS_GPIO0_2 IOCMG_PIN_MUX(IOCFG_GPIO0_2, FUNC_MODE_0, 0x0731) +#define GPIO0_2_AS_RESETN IOCMG_PIN_MUX(IOCFG_GPIO0_2, FUNC_MODE_1, 0x0731) +#define GPIO0_2_AS_SYS_RSTN_OUT IOCMG_PIN_MUX(IOCFG_GPIO0_2, FUNC_MODE_2, 0x0731) + +#define GPIO0_3_AS_GPIO0_3 IOCMG_PIN_MUX(IOCFG_GPIO0_3, FUNC_MODE_0, 0x0230) +#define GPIO0_3_AS_UART0_TXD IOCMG_PIN_MUX(IOCFG_GPIO0_3, FUNC_MODE_3, 0x0230) +#define GPIO0_3_AS_XTAL_OUT IOCMG_PIN_MUX(IOCFG_GPIO0_3, FUNC_MODE_12, 0x0230) + +#define GPIO0_4_AS_GPIO0_4 IOCMG_PIN_MUX(IOCFG_GPIO0_4, FUNC_MODE_0, 0x0230) +#define GPIO0_4_AS_GPT0_PWM IOCMG_PIN_MUX(IOCFG_GPIO0_4, FUNC_MODE_2, 0x0230) +#define GPIO0_4_AS_UART0_RXD IOCMG_PIN_MUX(IOCFG_GPIO0_4, FUNC_MODE_3, 0x0230) +#define GPIO0_4_AS_XTAL_IN IOCMG_PIN_MUX(IOCFG_GPIO0_4, FUNC_MODE_12, 0x0230) + +/* Only CHIP_3061MNPICA and CHIP_3061MNPIC8 is supported. */ +#if defined (CHIP_3061MNPICA) || defined (CHIP_3061MNPIC8) +#define GPIO2_4_AS_GPIO2_4 IOCMG_PIN_MUX(IOCFG_GPIO2_4, FUNC_MODE_0, 0x0230) +#define GPIO2_4_AS_GPT0_PWM IOCMG_PIN_MUX(IOCFG_GPIO2_4, FUNC_MODE_2, 0x0230) +#define GPIO2_4_AS_CAPM2_IN IOCMG_PIN_MUX(IOCFG_GPIO2_4, FUNC_MODE_4, 0x0230) +#define GPIO2_4_AS_WAKEUP3 IOCMG_PIN_MUX(IOCFG_GPIO2_4, FUNC_MODE_6, 0x0230) +#define GPIO2_4_AS_PMC2CORE_POR_N IOCMG_PIN_MUX(IOCFG_GPIO2_4, FUNC_MODE_11, 0x0230) +#endif + +#define GPIO1_2_AS_GPIO1_2 IOCMG_PIN_MUX(IOCFG_GPIO1_2, FUNC_MODE_0, 0x06b0) +#define GPIO1_2_AS_UPDATE_MODE IOCMG_PIN_MUX(IOCFG_GPIO1_2, FUNC_MODE_1, 0x06b0) +#define GPIO1_2_AS_UART2_TXD IOCMG_PIN_MUX(IOCFG_GPIO1_2, FUNC_MODE_3, 0x06b0) +#define GPIO1_2_AS_TEST_CLK IOCMG_PIN_MUX(IOCFG_GPIO1_2, FUNC_MODE_5, 0x06b0) + +#define GPIO0_5_AS_GPIO0_5 IOCMG_PIN_MUX(IOCFG_GPIO0_5, FUNC_MODE_0, 0x0221) +#define GPIO0_5_AS_JTAG_TDO IOCMG_PIN_MUX(IOCFG_GPIO0_5, FUNC_MODE_1, 0x0221) +#define GPIO0_5_AS_GPT1_PWM IOCMG_PIN_MUX(IOCFG_GPIO0_5, FUNC_MODE_2, 0x0221) +#define GPIO0_5_AS_UART1_RXD IOCMG_PIN_MUX(IOCFG_GPIO0_5, FUNC_MODE_3, 0x0221) +#define GPIO0_5_AS_CAPM2_IN IOCMG_PIN_MUX(IOCFG_GPIO0_5, FUNC_MODE_4, 0x0221) +#define GPIO0_5_AS_ADC_AIN2 IOCMG_PIN_MUX(IOCFG_GPIO0_5, FUNC_MODE_12, 0x0221) +#define GPIO0_5_AS_ACMP_P2 IOCMG_PIN_MUX(IOCFG_GPIO0_5, FUNC_MODE_13, 0x0221) + +#define GPIO0_6_AS_GPIO0_6 IOCMG_PIN_MUX(IOCFG_GPIO0_6, FUNC_MODE_0, 0x0331) +#define GPIO0_6_AS_JTAG_TDI IOCMG_PIN_MUX(IOCFG_GPIO0_6, FUNC_MODE_1, 0x0331) +#define GPIO0_6_AS_UART1_TXD IOCMG_PIN_MUX(IOCFG_GPIO0_6, FUNC_MODE_3, 0x0331) +#define GPIO0_6_AS_CAPM0_IN IOCMG_PIN_MUX(IOCFG_GPIO0_6, FUNC_MODE_4, 0x0331) +#define GPIO0_6_AS_ADC_AIN3 IOCMG_PIN_MUX(IOCFG_GPIO0_6, FUNC_MODE_12, 0x0331) +#define GPIO0_6_AS_ACMP_N2 IOCMG_PIN_MUX(IOCFG_GPIO0_6, FUNC_MODE_13, 0x0331) +#define GPIO0_6_AS_TSENSOR_OUT IOCMG_PIN_MUX(IOCFG_GPIO0_6, FUNC_MODE_14, 0x0331) + +#endif /* McuMagicTag_IOMAP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/ip_crg/ip_crg_common.c b/vendor/others/demo/5-tim_adc/demo/chip/3061m/ip_crg/ip_crg_common.c new file mode 100644 index 000000000..79bb68eab --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/ip_crg/ip_crg_common.c @@ -0,0 +1,127 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file ip_crg_common.c + * @author MCU Driver Team + * @brief Contains ip crg common header files. + */ + +/* Includes ----------------------------------------------------------------- */ +#include "baseaddr.h" +#include "ip_crg_common.h" + +/** + * @brief Get IP frequency by ip register base address + * @param ipBaseAddr The ip base address + * @retval The bus frequency where the IP is located + */ +#ifdef FPGA +unsigned int CHIP_GetIpFreqHz(const void *ipBaseAddr) +{ + void *highRateIp[] = { /* Defines the module base address for FPGA development. */ + SYSCTRL1_BASE, + CRC_BASE, + APT0_BASE, APT1_BASE, APT2_BASE, APT3_BASE, + CAPM0_BASE, CAPM1_BASE, CAPM2_BASE, CAPM_COMM_BASE, + QDM0_BASE, + ADC0_BASE, + PGA0_BASE, PGA1_BASE, + ACMP0_BASE, + }; + + if (ipBaseAddr == IWDG_BASE) { /* The IWDG working clock is LOSC clock. */ + return CHIP_IP_CLK_LOSC; + } else if (ipBaseAddr == CAN_BASE) { /* The CAN working clock is HOSC. */ + return CHIP_IP_CLK_CAN; + } else { + for (unsigned int i = 0; i < sizeof(highRateIp) / sizeof(highRateIp[0]); ++i) { + if (ipBaseAddr == highRateIp[i]) { + return CHIP_IP_CLK_HS; + } + } + return CHIP_IP_CLK_LS; /* The base address does not match, return LOSC freq. */ + } +} +#endif + +static const CHIP_CrgIpMatchInfo g_crgIpMatch[] = { + {UART0_BASE, CRG_IP_NONE_CLK_SEL, 0x140, 0}, + {UART1_BASE, CRG_IP_NONE_CLK_SEL, 0x144, 0}, + {UART2_BASE, CRG_IP_NONE_CLK_SEL, 0x148, 0}, + {UART3_BASE, CRG_IP_NONE_CLK_SEL, 0x14C, 0}, + {TIMER0_BASE, CRG_IP_NONE_CLK_SEL, 0x240, 0}, + {TIMER1_BASE, CRG_IP_NONE_CLK_SEL, 0x244, 0}, + {TIMER2_BASE, CRG_IP_NONE_CLK_SEL, 0x248, 0}, + {TIMER3_BASE, CRG_IP_NONE_CLK_SEL, 0x24C, 0}, + {SYSTICK_BASE, CRG_IP_NONE_CLK_SEL, 0x40, 0}, + {SPI0_BASE, CRG_IP_NONE_CLK_SEL, 0x180, 0}, + {SPI1_BASE, CRG_IP_NONE_CLK_SEL, 0x184, 0}, + {I2C0_BASE, CRG_IP_NONE_CLK_SEL, 0x1C0, 0}, + {I2C1_BASE, CRG_IP_NONE_CLK_SEL, 0x1C4, 0}, + {CAN_BASE, CRG_IP_CAN, 0x2C0, 0}, + {GPT0_BASE, CRG_IP_NONE_CLK_SEL, 0x440, 0}, + {GPT1_BASE, CRG_IP_NONE_CLK_SEL, 0x444, 0}, + {GPT2_BASE, CRG_IP_NONE_CLK_SEL, 0x448, 0}, + {GPT3_BASE, CRG_IP_NONE_CLK_SEL, 0x44C, 0}, + {WWDG_BASE, CRG_IP_NONE_CLK_SEL, 0x200, 0}, + {CAPM0_BASE, CRG_IP_NONE_CLK_SEL, 0x280, 0}, + {CAPM1_BASE, CRG_IP_NONE_CLK_SEL, 0x284, 0}, + {CAPM2_BASE, CRG_IP_NONE_CLK_SEL, 0x288, 0}, + {DMA_BASE, CRG_IP_NONE_CLK_SEL, 0x300, 0}, + {GPIO0_BASE, CRG_IP_NONE_CLK_SEL, 0x480, 0}, + {GPIO1_BASE, CRG_IP_NONE_CLK_SEL, 0x484, 0}, + {GPIO2_BASE, CRG_IP_NONE_CLK_SEL, 0x488, 0}, + {GPIO3_BASE, CRG_IP_NONE_CLK_SEL, 0x48C, 0}, + {GPIO4_BASE, CRG_IP_NONE_CLK_SEL, 0x490, 0}, + {GPIO5_BASE, CRG_IP_NONE_CLK_SEL, 0x494, 0}, + {IWDG_BASE, CRG_IP_IWDG, 0x3C0, 0}, + {QDM0_BASE, CRG_IP_NONE_CLK_SEL, 0x4C0, 0}, + {QDM1_BASE, CRG_IP_NONE_CLK_SEL, 0x4C4, 0}, + {HPM_BASE, CRG_IP_NONE_CLK_SEL, 0xB00, 0}, + {CRC_BASE, CRG_IP_NONE_CLK_SEL, 0x380, 0}, + {APT0_BASE, CRG_IP_NONE_CLK_SEL, 0x400, 0}, + {APT1_BASE, CRG_IP_NONE_CLK_SEL, 0x404, 0}, + {APT2_BASE, CRG_IP_NONE_CLK_SEL, 0x408, 0}, + {APT3_BASE, CRG_IP_NONE_CLK_SEL, 0x40C, 0}, + {CMM_BASE, CRG_IP_NONE_CLK_SEL, 0x0340, 0}, + {VREF_BASE, CRG_IP_ANA, 0xA60, 0}, + {ACMP0_BASE, CRG_IP_ANA, 0xA70, 0}, + {DAC0_BASE, CRG_IP_ANA, 0xA80, 0}, + {PGA0_BASE, CRG_IP_ANA, 0xA90, 0}, + {PGA1_BASE, CRG_IP_ANA, 0xA90, 4}, + + {ADC0_BASE, CRG_IP_ADC, 0xA00, 0}, + + {EFC_BASE, CRG_IP_EFC, 0x500, 0}, +}; + +/** + * @brief Get IP Match Info, @see g_crgIpMatch + * @param baseAddr The ip base address + * @retval The Address(offset) in g_crgIpMatch if match success + * @retval 0 if match fail + */ +CHIP_CrgIpMatchInfo *GetCrgIpMatchInfo(const void *baseAddr) +{ + unsigned int i; + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + if (baseAddr == g_crgIpMatch[i].ipBaseAddr) { + return (CHIP_CrgIpMatchInfo *)&g_crgIpMatch[i]; + } + } + return (CHIP_CrgIpMatchInfo *)0; /* The base address does not match, return 0. */ +} diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/ip_crg/ip_crg_common.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/ip_crg/ip_crg_common.h new file mode 100644 index 000000000..9ed469fa8 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/ip_crg/ip_crg_common.h @@ -0,0 +1,82 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file ip_crg_common.h + * @author MCU Driver Team + * @brief Contains crg ip common header files. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_IP_CRG_COMMON_H +#define McuMagicTag_IP_CRG_COMMON_H + +/** + * @brief define the frequence of hosc, losc and xtrail + */ +#define HOSC_FREQ 25000000U +#define LOSC_FREQ 32000U + +#ifdef FPGA +#define FLASH_SUPPORT +typedef enum { + CHIP_IP_CLK_LOSC = LOSC_FREQ, + CHIP_IP_CLK_CAN = HOSC_FREQ, +#ifdef FLASH_SUPPORT + CHIP_IP_CLK_LS = HOSC_FREQ, + CHIP_IP_CLK_HS = HOSC_FREQ, +#else + CHIP_IP_CLK_LS = HOSC_FREQ, + CHIP_IP_CLK_HS = HOSC_FREQ, +#endif +} CHIP_IpRate; +#else +typedef enum { + CHIP_IP_CLK_LOSC = 32000U, + CHIP_IP_CLK_CAN = 25000000U, + CHIP_IP_CLK_LS = 25000000U, + CHIP_IP_CLK_HS = 25000000U, +} CHIP_IpRate; +#endif + +/** + * @brief CRG Ip Type, Sorting based on operable registers + */ +typedef enum { + CRG_IP_NONE_CLK_SEL = 0x00, + CRG_IP_CAN = 0x01, + CRG_IP_ADC = 0x02, + CRG_IP_EFC = 0x03, + CRG_IP_IWDG = 0x04, + CRG_IP_ANA = 0x05, + CRG_IP_MAX_TYPE = 0x06, +} CHIP_CrgIpType; + +/** + * @brief CRG register and IP address matching relationship table + */ +typedef struct { + void *ipBaseAddr; /**< Ip base address */ + CHIP_CrgIpType type; /**< Ip type, @see CHIP_CrgIpType */ + unsigned short regOffset; /**< Offset in CRG registers */ + unsigned char bitOffset; /**< Bit Offset in CRG register */ +} CHIP_CrgIpMatchInfo; + +unsigned int CHIP_GetIpFreqHz(const void *ipBaseAddr); +CHIP_CrgIpMatchInfo *GetCrgIpMatchInfo(const void *baseAddr); +extern unsigned int HAL_CRG_GetIpFreq(const void *baseAddress); + +#endif /* McuMagicTag_IP_CRG_COMMON_H */ diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/locktype.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/locktype.h new file mode 100644 index 000000000..08b87ff32 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/locktype.h @@ -0,0 +1,43 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file locktype.h + * @author MCU Driver Team + * @brief This file lists all types that need to be locked on the chip. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_LOCKTYPE_H +#define McuMagicTag_LOCKTYPE_H + +/* Typedef definitions ------------------------------------------------------- */ +/** + * @brief This enum defines all hardware locks integrated by this MCU. + */ +typedef enum { + CHIP_LOCK_GPIO0 = 0, + CHIP_LOCK_GPIO1 = 1, + CHIP_LOCK_GPIO2 = 2, + CHIP_LOCK_GPIO3 = 3, + CHIP_LOCK_GPIO4 = 4, + CHIP_LOCK_GPIO5 = 5, + CHIP_LOCK_GPIO6 = 6, + CHIP_LOCK_GPIO7 = 7, + CHIP_LOCK_TOTAL +} CHIP_LockType; + +#endif /* McuMagicTag_LOCKTYPE_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/startup.S b/vendor/others/demo/5-tim_adc/demo/chip/3061m/startup.S new file mode 100644 index 000000000..8aedfa8f6 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/startup.S @@ -0,0 +1,720 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file startup.S + * @author MCU Application Driver Team + * @brief RISC-V trap handling and startup code + */ + +#ifndef ENTRY_S +#define ENTRY_S + +#include "feature.h" + +.extern __stack_top +.extern __irq_stack_top +.extern SysErrNmiEntry +.extern SysErrExcEntry +.extern trap_entry +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) +.extern g_RiscvPrivMode +#endif + +#ifdef __riscv64 +#define LREG ld +#define SREG sd +#define FLREG fld +#define FSREG fsd +#define REGBYTES 8 +#else +#define LREG lw +#define SREG sw +#define FLREG flw +#define FSREG fsw +#define REGBYTES 4 +#endif + +#define NESTED_IRQ_SUPPORT +#define COMPILE_LDM /**< Support stmia and ldmia instruction */ + +#ifdef FLOAT_SUPPORT +#define TOTAL_INT_SIZE_ON_STACK (40 * REGBYTES) +#else +#define TOTAL_INT_SIZE_ON_STACK (20 * REGBYTES) +#endif + +#define SYSERR_INT_SIZE_ON_STACK (28 * REGBYTES) + +#define MSTATUS_MPP_MACHINE 0x00001800 +#define MCAUSE_ECALL_FROM_MMODE 11 +#define MCAUSE_ECALL_FROM_UMODE 8 +#define EXC_SIZE_ON_STACK (160) + +#define MSTATUS_MIE 0x00000008 +#define MSTATUS_MPIE 0x00000080 +#define MCAUSE_MASK_INT_BIT 0x80000000 +#define MCAUSE_MASK_INT_NUM 0x000000FF + +#define locipri0 0xBC0 +#define locipri1 0xBC1 +#define locipri2 0xBC2 +#define locipri3 0xBC3 +#define locipri4 0xBC4 +#define locipri5 0xBC5 +#define locipri6 0xBC6 +#define locipri7 0xBC7 +#define locipri8 0xBC8 +#define locipri9 0xBC9 +#define locipri10 0xBCA +#define locipri11 0xBCB +#define locipri12 0xBCC +#define locipri13 0xBCD +#define locipri14 0xBCE +#define locipri15 0xBCF + +#define EFC_BASE_ADDR 0x14710000 /* efc base address */ +#define EFC_MAGIC_LOCK_RW 0x14710200 /* cmd operation magic word protection register */ +#define EFC_MAGIC_NUMBER 0xFEDCBA98 /* magic number */ +#define SYSRAM_ERROR 0x10108300 +#define SC_SYS_STAT_ADDR 0x10100018 /**< System state register address */ +#define TIMER0_CONTROL 0x14300008 +#define TIMER0_INTENABLE (1 << 5) +#define UART0_BASE_ADDR 0x14000000 +#define IBRD_OFFSET 0x24 +#define FBRD_OFFSET 0x28 +#define LCR_H_OFFSET 0x2C +#define CR_OFFSET 0x30 +#define DMACR_OFFSET 0x48 + +.equ cipri, 0x7ED +.equ prithd, 0xBFE + + .section .data.magic + .word 0xA37E95BD /* eflash magic number, bootrom will check it */ + + .section .text.entry + .global _start + .option norvc +_start: + j handle_reset + +.macro push_reg + addi sp, sp, -(TOTAL_INT_SIZE_ON_STACK) +#ifdef COMPILE_LDM + stmia {ra, t0-t2, a0-a7, t3-t6}, (sp) +#else + SREG ra, 0 * REGBYTES(sp) + SREG t0, 1 * REGBYTES(sp) + SREG t1, 2 * REGBYTES(sp) + SREG t2, 3 * REGBYTES(sp) + SREG a0, 4 * REGBYTES(sp) + SREG a1, 5 * REGBYTES(sp) + SREG a2, 6 * REGBYTES(sp) + SREG a3, 7 * REGBYTES(sp) + SREG a4, 8 * REGBYTES(sp) + SREG a5, 9 * REGBYTES(sp) + SREG a6, 10 * REGBYTES(sp) + SREG a7, 11 * REGBYTES(sp) + SREG t3, 12 * REGBYTES(sp) + SREG t4, 13 * REGBYTES(sp) + SREG t5, 14 * REGBYTES(sp) + SREG t6, 15 * REGBYTES(sp) +#endif + addi sp, sp, -(TOTAL_INT_SIZE_ON_STACK) +.endm + +.macro pop_reg + addi sp, sp, TOTAL_INT_SIZE_ON_STACK +#ifdef COMPILE_LDM + ldmia {ra, t0-t2, a0-a7, t3-t6},(sp) +#else + LREG ra, 0 * REGBYTES(sp) + LREG t0, 1 * REGBYTES(sp) + LREG t1, 2 * REGBYTES(sp) + LREG t2, 3 * REGBYTES(sp) + LREG a0, 4 * REGBYTES(sp) + LREG a1, 5 * REGBYTES(sp) + LREG a2, 6 * REGBYTES(sp) + LREG a3, 7 * REGBYTES(sp) + LREG a4, 8 * REGBYTES(sp) + LREG a5, 9 * REGBYTES(sp) + LREG a6, 10 * REGBYTES(sp) + LREG a7, 11 * REGBYTES(sp) + LREG t3, 12 * REGBYTES(sp) + LREG t4, 13 * REGBYTES(sp) + LREG t5, 14 * REGBYTES(sp) + LREG t6, 15 * REGBYTES(sp) +#endif + addi sp, sp, TOTAL_INT_SIZE_ON_STACK +.endm + +.macro SAVE_SYSERR_REGS + addi sp,sp,-(SYSERR_INT_SIZE_ON_STACK) + SREG s0, 16 * REGBYTES(sp) + SREG s1, 17 * REGBYTES(sp) + SREG s2, 18 * REGBYTES(sp) + SREG s3, 19 * REGBYTES(sp) + SREG s4, 20 * REGBYTES(sp) + SREG s5, 21 * REGBYTES(sp) + SREG s6, 22 * REGBYTES(sp) + SREG s7, 23 * REGBYTES(sp) + SREG s8, 24 * REGBYTES(sp) + SREG s9, 25 * REGBYTES(sp) + SREG s10, 26 * REGBYTES(sp) + SREG s11, 27 * REGBYTES(sp) + + addi a1, sp, (TOTAL_INT_SIZE_ON_STACK + SYSERR_INT_SIZE_ON_STACK) + SREG a1, 28 * REGBYTES(sp) /* save original sp */ + + SREG gp, 29 * REGBYTES(sp) + SREG tp, 30 * REGBYTES(sp) + + csrr a0, mepc + csrr a1, mstatus + csrr a2, mtval + csrr a3, mcause + # csrr a4, ccause + + SREG a0, 31 * REGBYTES(sp) /* mepc */ + SREG a1, 32 * REGBYTES(sp) /* mstatus */ + SREG a2, 33 * REGBYTES(sp) /* mtval */ + SREG a3, 34 * REGBYTES(sp) /* mcause */ + # SREG a4, 35 * REGBYTES(sp) /* ccause */ + mv a0,sp +.endm + +/* The interrupt vector table must be aligned with 4 bytes */ +.align 2 +TrapHandler: + j TrapVector /* trap and INT 0 */ + j TrapVector /* INT 1 */ + j TrapVector /* INT 2 */ + j TrapVector /* INT 3 */ + j TrapVector /* INT 4 */ + j TrapVector /* INT 5 */ + j TrapVector /* INT 6 */ + j TrapVector /* INT 7 */ + j TrapVector /* INT 8 */ + j TrapVector /* INT 9 */ + j TrapVector /* INT 10 */ + j TrapVector /* INT 11 */ + j TrapVector /* INT 12 */ + j TrapVector /* INT 13 */ + j TrapVector /* INT 14 */ + j TrapVector /* INT 15 */ + j TrapVector /* INT 16 */ + j TrapVector /* INT 17 */ + j TrapVector /* INT 18 */ + j TrapVector /* INT 19 */ + j TrapVector /* INT 20 */ + j TrapVector /* INT 21 */ + j TrapVector /* INT 22 */ + j TrapVector /* INT 23 */ + j TrapVector /* INT 24 */ + j TrapVector /* INT 25 */ + + j IntHandler /* INT 26 */ + j IntHandler /* INT 27 */ + j IntHandler /* INT 28 */ + j IntHandler /* INT 29 */ + j IntHandler /* INT 30 */ + j IntHandler /* INT 31 */ + j IntHandler /* INT 32 */ + j IntHandler /* INT 33 */ + j IntHandler /* INT 34 */ + j IntHandler /* INT 35 */ + j IntHandler /* INT 36 */ + j IntHandler /* INT 37 */ + j IntHandler /* INT 38 */ + j IntHandler /* INT 39 */ + j IntHandler /* INT 40 */ + j IntHandler /* INT 41 */ + j IntHandler /* INT 42 */ + j IntHandler /* INT 43 */ + j IntHandler /* INT 44 */ + j IntHandler /* INT 45 */ + j IntHandler /* INT 46 */ + j IntHandler /* INT 47 */ + j IntHandler /* INT 48 */ + j IntHandler /* INT 49 */ + j IntHandler /* INT 50 */ + j IntHandler /* INT 51 */ + j IntHandler /* INT 52 */ + j IntHandler /* INT 53 */ + j IntHandler /* INT 54 */ + j IntHandler /* INT 55 */ + j IntHandler /* INT 56 */ + j IntHandler /* INT 57 */ + j IntHandler /* INT 58 */ + j IntHandler /* INT 59 */ + j IntHandler /* INT 60 */ + j IntHandler /* INT 61 */ + j IntHandler /* INT 62 */ + j IntHandler /* INT 63 */ + j IntHandler /* INT 64 */ + j IntHandler /* INT 65 */ + j IntHandler /* INT 66 */ + j IntHandler /* INT 67 */ + j IntHandler /* INT 68 */ + j IntHandler /* INT 69 */ + j IntHandler /* INT 70 */ + j IntHandler /* INT 71 */ + j IntHandler /* INT 72 */ + j IntHandler /* INT 73 */ + j IntHandler /* INT 74 */ + j IntHandler /* INT 75 */ + j IntHandler /* INT 76 */ + j IntHandler /* INT 77 */ + j IntHandler /* INT 78 */ + j IntHandler /* INT 79 */ + j IntHandler /* INT 80 */ + j IntHandler /* INT 81 */ + j IntHandler /* INT 82 */ + j IntHandler /* INT 83 */ + j IntHandler /* INT 84 */ + j IntHandler /* INT 85 */ + j IntHandler /* INT 86 */ + j IntHandler /* INT 87 */ + j IntHandler /* INT 88 */ + j IntHandler /* INT 89 */ + j IntHandler /* INT 90 */ + j IntHandler /* INT 91 */ + j IntHandler /* INT 92 */ + j IntHandler /* INT 93 */ + j IntHandler /* INT 94 */ + j IntHandler /* INT 95 */ + j IntHandler /* INT 96 */ + j IntHandler /* INT 97 */ + j IntHandler /* INT 98 */ + j IntHandler /* INT 99 */ + j IntHandler /* INT 100 */ + j IntHandler /* INT 101 */ + j IntHandler /* INT 102 */ + j IntHandler /* INT 103 */ + j IntHandler /* INT 104 */ + j IntHandler /* INT 105 */ + j IntHandler /* INT 106 */ + j IntHandler /* INT 107 */ + j IntHandler /* INT 108 */ + j IntHandler /* INT 109 */ + j IntHandler /* INT 110 */ + j IntHandler /* INT 111 */ + j IntHandler /* INT 112 */ + j IntHandler /* INT 113 */ + j IntHandler /* INT 114 */ + j IntHandler /* INT 115 */ + j IntHandler /* INT 116 */ + j IntHandler /* INT 117 */ + j IntHandler /* INT 118 */ + j IntHandler /* INT 119 */ + j IntHandler /* INT 120 */ + j IntHandler /* INT 121 */ + +.align 2 +NmiEntry: + SAVE_SYSERR_REGS + call SysErrNmiEntry +deadLoop1: + tail deadLoop1 + nop + +.align 2 +TrapEntry: + SAVE_SYSERR_REGS + /* Exception run with interrupts masked */ + csrc mstatus, MSTATUS_MIE + call SysErrExcEntry +deadLoop2: + tail deadLoop2 + +.align 2 +IntHandler: + addi sp, sp, -(TOTAL_INT_SIZE_ON_STACK) + + SREG a0, 3 * REGBYTES(sp) + SREG a1, 4 * REGBYTES(sp) + +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + la a0, g_RiscvPrivMode + lw a1, (a0) + addi a1, a1, 1 + sw a1, (a0) +#endif + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + csrr a0, mcause +#else + csrr a0, cipri + csrr a1, prithd + csrw prithd, a0 /* read prithd */ + SREG a1, 6 * REGBYTES(sp) /* save prithd */ + csrr a1, mstatus /* read mstatus */ + SREG a1, 7 * REGBYTES(sp) /* save mstatus */ + csrr a1, mepc /* read mepc */ + SREG a1, 8 * REGBYTES(sp) /* save mepc */ + + csrr a0, mcause + + li a1, (3<<11) + csrs mstatus, a1 + la a1, custom_nested_irq_main_handler_entry + csrw mepc, a1 + mret +#endif + +.align 2 +custom_nested_irq_main_handler_entry: + SREG t0, 0 * REGBYTES(sp) + SREG t1, 1 * REGBYTES(sp) + SREG t2, 2 * REGBYTES(sp) + SREG a2, 5 * REGBYTES(sp) + SREG ra, 9 * REGBYTES(sp) + SREG a3, 10 * REGBYTES(sp) + SREG a4, 11 * REGBYTES(sp) + SREG a5, 12 * REGBYTES(sp) + SREG a6, 13 * REGBYTES(sp) + SREG a7, 14 * REGBYTES(sp) + SREG t3, 15 * REGBYTES(sp) + SREG t4, 16 * REGBYTES(sp) + SREG t5, 17 * REGBYTES(sp) + SREG t6, 18 * REGBYTES(sp) + +#ifdef FLOAT_SUPPORT + FSREG f0, 19 * REGBYTES(sp) + FSREG f1, 20 * REGBYTES(sp) + FSREG f2, 21 * REGBYTES(sp) + FSREG f3, 22 * REGBYTES(sp) + FSREG f4, 23 * REGBYTES(sp) + FSREG f5, 24 * REGBYTES(sp) + FSREG f6, 25 * REGBYTES(sp) + FSREG f7, 26 * REGBYTES(sp) + FSREG f10, 27 * REGBYTES(sp) + FSREG f11, 28 * REGBYTES(sp) + FSREG f12, 29 * REGBYTES(sp) + FSREG f13, 30 * REGBYTES(sp) + FSREG f14, 31 * REGBYTES(sp) + FSREG f15, 32 * REGBYTES(sp) + FSREG f16, 33 * REGBYTES(sp) + FSREG f17, 34 * REGBYTES(sp) + FSREG f28, 35 * REGBYTES(sp) + FSREG f29, 36 * REGBYTES(sp) + FSREG f30, 37 * REGBYTES(sp) + FSREG f31, 38 * REGBYTES(sp) +#endif + + andi a0, a0, MCAUSE_MASK_INT_NUM + call InterruptEntry + + LREG t1, 1 * REGBYTES(sp) + LREG t2, 2 * REGBYTES(sp) + LREG a2, 5 * REGBYTES(sp) + LREG ra, 9 * REGBYTES(sp) + LREG a3, 10 * REGBYTES(sp) + LREG a4, 11 * REGBYTES(sp) + LREG a5, 12 * REGBYTES(sp) + LREG a6, 13 * REGBYTES(sp) + LREG a7, 14 * REGBYTES(sp) + LREG t3, 15 * REGBYTES(sp) + LREG t4, 16 * REGBYTES(sp) + LREG t5, 17 * REGBYTES(sp) + LREG t6, 18 * REGBYTES(sp) + +#ifdef FLOAT_SUPPORT + FLREG f0, 19 * REGBYTES(sp) + FLREG f1, 20 * REGBYTES(sp) + FLREG f2, 21 * REGBYTES(sp) + FLREG f3, 22 * REGBYTES(sp) + FLREG f4, 23 * REGBYTES(sp) + FLREG f5, 24 * REGBYTES(sp) + FLREG f6, 25 * REGBYTES(sp) + FLREG f7, 26 * REGBYTES(sp) + FLREG f10, 27 * REGBYTES(sp) + FLREG f11, 28 * REGBYTES(sp) + FLREG f12, 29 * REGBYTES(sp) + FLREG f13, 30 * REGBYTES(sp) + FLREG f14, 31 * REGBYTES(sp) + FLREG f15, 32 * REGBYTES(sp) + FLREG f16, 33 * REGBYTES(sp) + FLREG f17, 34 * REGBYTES(sp) + FLREG f28, 35 * REGBYTES(sp) + FLREG f29, 36 * REGBYTES(sp) + FLREG f30, 37 * REGBYTES(sp) + FLREG f31, 38 * REGBYTES(sp) +#endif + +quit_int: + /* + * Since the interrupt is already turned off when loading mstatus (after entering the interrupt, + * the hardware will turn off the interrupt, so when saving mstatus, the interrupt is already turned off), + * so there is no need to turn off the interrupt separately. + */ + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + LREG t0, 0 * REGBYTES(sp) +#else + LREG a0, 7 * REGBYTES(sp) /* load mstatus */ + csrr t0, mstatus + LREG a1, 8 * REGBYTES(sp) /* load mepc */ + andi t0, t0, MSTATUS_MIE + bnei t0, 0, restore_mstatus + andi a0, a0, ~(MSTATUS_MIE | MSTATUS_MPIE) +restore_mstatus: + csrw mstatus, a0 + + LREG t0, 0 * REGBYTES(sp) + csrw mepc, a1 + LREG a0, 6 * REGBYTES(sp) /* load prithd */ + csrw prithd, a0 +#endif + +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + la a0, g_RiscvPrivMode + lw a1, (a0) + addi a1, a1, -1 + sw a1, (a0) +#endif + + LREG a1, 4 * REGBYTES(sp) /* 2 consecutive csrw instructions will have a bubble */ + + LREG a0, 3 * REGBYTES(sp) + + addi sp, sp, TOTAL_INT_SIZE_ON_STACK + + mret + +.align 2 +TrapVector: + push_reg + csrr a0, mcause + li t1, MCAUSE_ECALL_FROM_MMODE +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + beq a0, t1, switch_to_umode +#else + beq a0, t1, switch_to_mmode +#endif + li t1, MCAUSE_ECALL_FROM_UMODE + beq a0, t1, switch_to_mmode + + li a1, MCAUSE_MASK_INT_BIT + li a2, MCAUSE_MASK_INT_NUM + and a1, a0, a1 + and a0, a0, a2 + + li a2, 0xc + beq a0, a2, NmiEntry + beqz a1, TrapEntry + pop_reg + mret + +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) +.align 2 +switch_to_umode: + li t2, MSTATUS_MPP_MACHINE + csrc mstatus, t2 + csrr t0, mepc + addi t0, t0, 4 + csrw mepc, t0 + pop_reg + mret +#endif + +.align 2 +switch_to_mmode: + li t2, MSTATUS_MPP_MACHINE + csrs mstatus, t2 + csrr t0, mepc + addi t0, t0, 4 + csrw mepc, t0 + pop_reg + mret + +.align 2 +mem_cpy: + bge t0, t2, cpy_done + lw t3, (t1) + sw t3, (t0) + addi t0, t0, 4 + addi t1, t1, 4 + j mem_cpy +cpy_done: + ret + +.align 2 +handle_reset: + csrwi mstatus, 0 + csrwi mie, 0 + csrci mstatus, 0x08 + la t0, TrapHandler + addi t0, t0, 1 + csrw mtvec, t0 + csrwi 0x7EF, 0x1 /* lock mtvec */ + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + csrwi 0x7C8, 0x1 /* enable hardware nest interrupt support */ +#endif + +flash_init: +/* eflash prefetch enable */ + li t0, EFC_BASE_ADDR + lw t1, 0x120(t0) + ori t1, t1, 1 + sw t1, 0x120(t0) + +/* eflash cache enable */ + lw t1, 0x124(t0) + ori t1, t1, 1 + sw t1, 0x124(t0) + +/* enable flash cmd */ + li t0, EFC_MAGIC_NUMBER + li t1, EFC_MAGIC_LOCK_RW + sw t0, (t1) + +/* initialize global pointer */ + .option push + .option norelax + la gp, __global_pointer$ + .option pop + +/* initialize stack pointer */ + la sp, __stack_top + +/* timer0 interrupt enable */ + li t0, TIMER0_CONTROL + lw t1, (t0) + andi t1, t1, TIMER0_INTENABLE + sw t1, (t0) + +/* uart0 deinit */ + li t0, 0x14000000 + li t1, 0 + sw t1, IBRD_OFFSET(t0) + sw t1, FBRD_OFFSET(t0) + sw t1, LCR_H_OFFSET(t0) + sw t1, CR_OFFSET(t0) + sw t1, DMACR_OFFSET(t0) + +/* perform the rest of initialization in C */ +clear_sram: + /* clear sysram parity error */ + li t0, SYSRAM_ERROR + lw t1, (t0) + ori t1, t1, 1 + sw t1, (t0) + + la t0, SRAM_START + la t1, SRAM_END + li t2, 0 + +clear_sram_loop: + sw t2, (t0) /* clear all sram */ + addi t0, t0, 4 /* increment clear index pointer */ + blt t0, t1, clear_sram_loop /* are we at the end yet, if not , contiue till the end */ + +start_coderom_code_copy: + la t0, __sram_code_start_addr /* SRAM addr */ + la t1, __sram_code_load_addr /* ROM addr */ + la t2, __sram_code_end_addr + jal mem_cpy + +start_reserved_data_copy: + la t0, __reserved_code_start_addr /* SRAM addr */ + la t1, __reserved_code_load_addr /* ROM addr */ + la t2, __reserved_code_end_addr + jal mem_cpy + +start_coderom_data_copy: + la t0, __data_start /* SRAM addr */ + la t1, __data_load /* ROM addr */ + la t2, __data_end + jal mem_cpy + +pmp_init: + li t0, 0xB00 + csrw pmpaddr0, t0 + li t0, 0x400400 /* 0x2C00~0x1000FFF, BOOTROM, enable R+X */ + csrw pmpaddr1, t0 + li t0, 0x800000 /* 0x1001000~0x1FFFFFF, Reserved: diable R+X+W */ + csrw pmpaddr2, t0 + li t0, 0x802000 /* 0x2000000~0x2007FFF, SYSRAM_ITCM */ + csrw pmpaddr3, t0 + li t0, 0xC00000 /* 0x2008000 ~ 0x2FFFFFF, Reserved: disable R+X+W */ + csrw pmpaddr4, t0 + li t0, 0x1000000 /* 0x3000000 ~ 0x03FFFFFF: EFLASH: enable R+X */ + csrw pmpaddr5, t0 + li t0, 0x1002000 /* 0x4000000 ~ 0x04007FFF: SYSTEM_DTCM enable R+W */ + csrw pmpaddr6, t0 + li t0,0x7000400 /* 0x4008000 ~ 0x01C000FFF: REGISTER R+W */ + csrw pmpaddr7, t0 + + li t0,0xf3333333 /* register TOR-R-W */ + csrw 0x7d8,t0 +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + li t0,0x0d080d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + csrw pmpcfg0,t0 + li t0,0x0b0b0d08 + csrw pmpcfg1,t0 +#else + li t0,0x8d888d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + csrw pmpcfg0,t0 + li t0,0x8b8b8d88 + csrw pmpcfg1,t0 +#endif + +/* disable Icache */ + csrwi 0x7C0, 0x0 /* disable ICACHE */ + fence + +/* disable Dcache */ + csrwi 0x7C1, 0x0 /* disable DCACHE */ + fence + +/* support float and mie */ + li t0,0x2008 + csrs mstatus,t0 + li t0,0x20 + csrs misa,t0 + +/* Interrupt set default priority = 1*/ + li t0, 0x11111111 + csrw locipri0, t0 + csrw locipri1, t0 + csrw locipri2, t0 + csrw locipri3, t0 + csrw locipri4, t0 + csrw locipri5, t0 + csrw locipri6, t0 + csrw locipri7, t0 + csrw locipri8, t0 + csrw locipri9, t0 + csrw locipri10, t0 + csrw locipri11, t0 + csrw locipri12, t0 + csrw locipri13, t0 + csrw locipri14, t0 + csrw locipri15, t0 + + ecall + jal Chip_Init + +/* jump to C func. */ + jal main + +dead_loop: + j dead_loop + +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/sysctrl.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/sysctrl.h new file mode 100644 index 000000000..b23f23aa6 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/sysctrl.h @@ -0,0 +1,563 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file sysctrl.h + * @author MCU Driver Team + * @brief This file provides firmware functions to manage the following + * functionalities of the system control register. + * + Register Struct of SYSCTRL + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSCTRL_H +#define McuMagicTag_SYSCTRL_H + +/* Includes ------------------------------------------------------------------ */ +#include "baseaddr.h" +#include "typedefs.h" + +/* Macro definitions ---------------------------------------------------------*/ +#define SC_LOCKEN_VALID_HIGH_BIT 0xEA510000U /**< Upper 16 active bits of the SC_LOCKEN register */ +#define SC_LOW_BIT_MASK 0x0000FFFFU /**< Obtains the mask of the lower 16 bits. */ +#define SC_LOCKEN_CRG_DISABLE_MASK 0x0000FFFEU /**< CRG write protection disable mask in SC_LOCKEN */ +#define SC_LOCKEN_CRG_ENABLE_MASK 0x00000001U /**< CRG write protection enable mask in SC_LOCKEN */ +#define SC_LOCKEN_SC_DISABLE_MASK 0x0000FFFDU /**< SC write protection disable mask in SC_LOCKEN */ +#define SC_LOCKEN_SC_ENABLE_MASK 0x00000002U /**< SC write protection enbale mask in SC_LOCKEN */ + + +/** + * @brief Records the offsets of various states in the CPU status register. + */ +typedef enum { + SYSCTRL_NMI_BIT = 0x00000000U, + SYSCTRL_LOCKUP_BIT = 0x00000002U, + SYSCTRL_HARD_FAULT_BIT = 0x00000003U, + SYSCTRL_DEBUG_BIT = 0x00000004U, + SYSCTRL_SLEEP_BIT = 0x00000005U, + SYSCTRL_PC_VALID_BIT = 0x0000001FU +} SYSCTRL_CPU_Status; + +/** + * @brief FUNC_JTAG_SEL_REG register function item. + */ +typedef enum { + SYSCTRL_FUNC_JTAG_CORESIGHT = 0x00000000U, + SYSCTRL_FUNC_JYAG_EFLASH = 0x00000001U +} SYSCTRL_FUNC_JTAG_Status; + +/** + * @brief System soft reset register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int softresreq : 1; /**< Set any value to make system soft reset. */ + unsigned int reserved : 31; + } BIT; +} volatile SC_SYS_RES_REG; + +/** + * @brief Record the number of resets(soft reset, pin reset). + */ +typedef union { + unsigned int reg; + struct { + unsigned int soft_rst_cnt : 16; /**< Number of soft resets. */ + unsigned int ext_rst_cnt : 16; /**< Number of reset times of the RESETN pin. */ + } BIT; +} volatile SC_RST_CNT0_REG; + +/** + * @brief Record the number of resets(wdg reset, iwdg reset). + */ +typedef union { + unsigned int reg; + struct { + unsigned int wdg_rst_cnt : 16; /**< Number of WDG resets. */ + unsigned int iwdg_rst_cnt : 16; /**< Number of IWDG resets. */ + } BIT; +} volatile SC_RST_CNT1_REG; + +/** + * @brief System status register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int update_mode_clear : 1; /**< System upgrade flag clear register, 0:not clear, 1:clear. */ + unsigned int reserved0 : 3; + unsigned int update_mode : 1; /**< System upgrade flag, 0:not upgrade, 1:upgrade. */ + unsigned int reserved1 : 27; + } BIT; +} volatile SC_SYS_STAT_REG; + +/** + * @brief Software interrupt register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int software_int : 1; /**< Software interrupt register, writing 1 generates a software interrupt. */ + unsigned int reserved : 31; + } BIT; +} volatile SC_SOFT_INT_REG; + +/** + * @brief Software interrupt event ID register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int swint_evt_id : 32; /**< Software interrupt event ID. */ + } BIT; +} volatile SC_SOFT_EVT_ID_REG; + +/** + * @brief Lock register of key registers. + */ +typedef union { + unsigned int reg; + struct { + unsigned int crg_cfg_lock : 1; /**< Write protection for CRG, 0: write enabled, 1: write disabled. */ + unsigned int sc_cfg_lock : 1; /**< Write protection for SYSCTRL, 0: write enabled, 1: write disabled. */ + unsigned int reserved : 30; + } BIT; +} volatile SC_LOCKEN_REG; + +/** + * @brief SC dedicated hard reset register 0. (CH) This register is not reset by a system soft reset. + */ +typedef union { + unsigned int reg; + struct { + unsigned int sc_hrst_reg0 : 32; /**< If the value is 0xA5A5A5, the CPU stops starting the system. */ + } BIT; +} volatile SC_HRST_REG0_REG; + +/** + * @brief User dedicated hard reset register 0. (CH) This register is not reset by a system soft reset. + */ +typedef union { + unsigned int reg; + struct { + unsigned int user_hrst_reg0 : 32; /**< User-dedicated hard reset register 0. */ + } BIT; +} volatile USER_HRST_REG0_REG; + +/** + * @brief User dedicated hard reset register 1. (CH) This register is not reset by a system soft reset. + */ +typedef union { + unsigned int reg; + struct { + unsigned int user_hrst_reg1 : 32; /**< User-dedicated hard reset register 1. */ + } BIT; +} volatile USER_HRST_REG1_REG; + +/** + * @brief User dedicated POR reset register 0. (CH) This register is reset only by a POR reset. + */ +typedef union { + unsigned int reg; + struct { + unsigned int user_por_reg0 : 32; /**< User dedicated POR reset register 0. */ + } BIT; +} volatile USER_POR_REG0_REG; + +/** + * @brief User dedicated POR reset register 1. (CH) This register is reset only by a POR reset. + */ +typedef union { + unsigned int reg; + struct { + unsigned int user_por_reg1 : 32; /**< User dedicated POR reset register 1. */ + } BIT; +} volatile USER_POR_REG1_REG; + +/** + * @brief User dedicated register 0. + */ +typedef union { + unsigned int reg; + struct { + unsigned int user_reg0 : 32; /**< User dedicated register 0. */ + } BIT; +} volatile USER_REG0_REG; + +/** + * @brief User dedicated register 1. + */ +typedef union { + unsigned int reg; + struct { + unsigned int user_reg1 : 32; /**< User dedicated register 1. */ + } BIT; +} volatile USER_REG1_REG; + +/** + * @brief SYSCTRL0 register. + */ +typedef struct _SYSCTRL0_Regstruct { + char space0[4]; + SC_SYS_RES_REG SC_SYS_RES; /**< System soft reset register, offset address: 0x0004. */ + SC_RST_CNT0_REG SC_RST_CNT0; /**< Reset count register 0, offset address: 0x0008. */ + SC_RST_CNT1_REG SC_RST_CNT1; /**< Reset count register 1, offset address: 0x000C. */ + char space1[8]; + SC_SYS_STAT_REG SC_SYS_STAT; /**< System boot mode register, offset address: 0x0018. */ + char space2[4]; + SC_SOFT_INT_REG SC_SOFT_INT; /**< Software interrupt register, offset address: 0x0020. */ + SC_SOFT_EVT_ID_REG SC_SOFT_EVT_ID; /**< Software interrupt event ID register, offset address: 0x0024. */ + char space3[28]; + SC_LOCKEN_REG SC_LOCKEN; /**< Lock register of key registers, offset address: 0x0044. */ + char space4[440]; + SC_HRST_REG0_REG SC_HRST_REG0; /**< SC dedicated hard reset register 0, offset address: 0x0200. */ + char space5[3068]; + USER_POR_REG0_REG USER_POR_REG0; /**< User dedicated POR reset register 0, offset address: 0x0E00. */ + USER_POR_REG1_REG USER_POR_REG1; /**< User dedicated POR reset register 1, offset address: 0x0E04. */ + char space6[56]; + USER_HRST_REG0_REG USER_HRST_REG0; /**< User dedicated hard reset register 0, offset address: 0x0E40. */ + USER_HRST_REG1_REG USER_HRST_REG1; /**< User dedicated hard reset register 1, offset address: 0x0E44. */ + char space7[56]; + USER_REG0_REG USER_REG0; /**< User dedicated register 0, offset address: 0x0E80. */ + USER_REG1_REG USER_REG1; /**< User dedicated register 1, offset address: 0x0E84. */ +} volatile SYSCTRL0_RegStruct; + +/** + * @brief APT enable register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int apt0_run : 1; /**< APT0 enable control, 0:enable, 1:enable. */ + unsigned int apt1_run : 1; /**< APT1 enable control, 0:enable, 1:enable. */ + unsigned int apt2_run : 1; /**< APT2 enable control, 0:enable, 1:enable. */ + unsigned int apt3_run : 1; /**< APT3 enable control, 0:enable, 1:enable. */ + unsigned int reserved : 28; + } BIT; +} volatile APT_RUN_REG; + +/** + * @brief Poe filter register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int poe0_filter_level : 8; /**< Number of POE0 Filter Cycles. */ + unsigned int poe1_filter_level : 8; /**< Number of POE1 Filter Cycles. */ + unsigned int poe2_filter_level : 8; /**< Number of POE2 Filter Cycles. */ + unsigned int poe0_filter_en : 1; /**< POE0 filter enable, 0:enable, 1:enable. */ + unsigned int poe1_filter_en : 1; /**< POE1 filter enable, 0:enable, 1:enable. */ + unsigned int poe2_filter_en : 1; /**< POE2 filter enable, 0:enable, 1:enable. */ + unsigned int reserved : 5; + } BIT; +} volatile APT_POE_FILTER_REG; + +/** + * @brief APT_EVTIO_FILTER register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int apt_evtio4_filter_level : 8; /**< Number of APT EVTIO4 Filter Cycles. */ + unsigned int apt_evtio5_filter_level : 8; /**< Number of APT EVTIO5 Filter Cycles. */ + unsigned int reserved0 : 8; + unsigned int apt_evtio4_filter_en : 1; /**< APT EVTIO4 FILTER enable, 0:enable, 1:enable. */ + unsigned int apt_evtio5_filter_en : 1; /**< APT EVTIO5 FILTER enable, 0:enable, 1:enable. */ + unsigned int reserved1 : 6; + } BIT; +} volatile APT_EVTIO_FILTER_REG; + +/** + * @brief APT_EVTMP_FILTER register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int apt_evtmp4_filter_level : 8; /**< Number of APT EVTMP4 Filter Periods. */ + unsigned int apt_evtmp5_filter_level : 8; /**< Number of APT EVTMP5 Filter Periods. */ + unsigned int apt_evtmp6_filter_level : 8; /**< Number of APT EVTMP6 Filter Periods. */ + unsigned int apt_evtmp4_filter_en : 1; /**< APT EVTMP4 FILTER enable, 0:enable, 1:enable. */ + unsigned int apt_evtmp5_filter_en : 1; /**< APT EVTMP5 FILTER enable, 0:enable, 1:enable. */ + unsigned int apt_evtmp6_filter_en : 1; /**< APT EVTMP6 FILTER enable, 0:enable, 1:enable. */ + unsigned int reserved : 5; + } BIT; +} volatile APT_EVTMP_FILTER_REG; + +/** + * @brief XTAL_CFG register. + * + */ +typedef union { + unsigned int reg; + struct { + unsigned int osc_ds : 4; /**< Crystal I/O Drive Capability Configuration. */ + unsigned int ose_e : 1; /**< Crystal I/O resonance buffer enable, 0:disable, 1:enable. */ + unsigned int osc_ie : 1; /**< Crystal I/O clock input enable, 0:disable, 1:enable. */ + unsigned int reserved : 26; + } BIT; +} volatile XTAL_CFG_REG; + +/** + * @brief Sysram parity check register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int sysram_parity_err_clr : 1; /**< SYSRAM parity error status clear, write any value to clear. */ + unsigned int sysram0_parity_err : 1; /**< SYSRAM Parity Error Status, 0:no error, 1:error. */ + unsigned int sysram1_parity_err : 1; /**< SYSRAM Parity Error Status, 0:no error, 1:error. */ + unsigned int reserved : 29; + } BIT; +} volatile SYSRAM_ERR_REG; + +/** + * @brief SYSRAM_MAP register. + * + */ +typedef union { + unsigned int reg; + struct { + unsigned int sysram_split : 3; /**< SYSRAM space allocation. */ + unsigned int reserved : 29; + } BIT; +} volatile SYSRAM_MAP_REG; + +/** + * @brief PVD_CFG register. + * + */ +typedef union { + unsigned int reg; + struct { + unsigned int pvd_en : 1; /**< PVD enable flag, 0:disable, 1:enable. */ + unsigned int pvd_rise_thd : 3; /**< PVD rising edge threshold. */ + unsigned int pvd_fall_thd : 3; /**< PVD falling edge threshold. */ + unsigned int reserved : 25; + } BIT; +} volatile PVD_CFG_REG; + +/** + * @brief PVD_STATUS register. + * + */ +typedef union { + unsigned int reg; + struct { + unsigned int pvd_toggle : 1; /**< PVD triggering flag. */ + unsigned int reserved : 31; + } BIT; +} volatile PVD_STATUS_REG; + +/** + * @brief CPU status register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cpu_in_nmi_hdlr : 1; /**< CPU NMI processing status. 0: non-NMI processing state, + 1: NMI processing status. */ + unsigned int cpu_ra_wr_en : 1; /**< cpu_ra_wr enable. */ + unsigned int cpu_lockup_mode : 1; /**< CPU LOCKUP status. 0: non-lockup state, 1: lockup state. */ + unsigned int cpu_hard_fault_mode : 1; /**< Indicates the hard fault status of the CPU. 0: non-hard_fault state, + 1: hard_fault. */ + unsigned int cpu_debug_mode : 1; /**< Indicates the CPU debug status. 0: non-debug state, + 1: debug state. */ + unsigned int cpu_sleep_mode : 1; /**< CPU sleep status. 0: non-sleep state, 1: sleep state. */ + unsigned int reserved : 25; + unsigned int cpu_pc_valid : 1; /**< Valid status of the CPU PC value. 0: The PC value is invalid, + 1: The PC value is valid. */ + } BIT; +} volatile CPU_STATUS_REG; + +/** + * @brief SYSCTRL1 register. + */ +typedef struct _SYSCTRL1_RegStruct { + char space0[0x8000]; + APT_RUN_REG APT_RUN; /**< APT enable control register, offset address: 0x8000. */ + char space1[12]; + APT_POE_FILTER_REG APT_POE_FILTER; /**< APT PoE filtering control register, offset address: 0x8010. */ + APT_EVTIO_FILTER_REG APT_EVTIO_FILTER; /**< APT EVTIO filtering control register, offset address: 0x8014. */ + APT_EVTMP_FILTER_REG APT_EVTMP_FILTER; /**< APT EVTMP filtering control register, offset address: 0x8018. */ + char space2[228]; + XTAL_CFG_REG XTAL_CFG; /**< Crystal I/O control register, offset address: 0x8100. */ + char space3[508]; + SYSRAM_ERR_REG SYSRAM_ERR; /**< SYSRAM parity check status register, offset address: 0x8300. */ + SYSRAM_MAP_REG SYS_MAP; /**< SYSRAM space allocation register, offset address: 0x8304. */ + char space4[248]; + PVD_CFG_REG PVD_CFG; /**< PVD configuration register, offset address: 0x8400. */ + PVD_STATUS_REG PVD_STATUS; /**< PVD status register, offset address: 0x8404. */ + char space5[3064]; + CPU_STATUS_REG CPU_STATUS; /**< CPU status register, offset address: 0x9000. */ +} volatile SYSCTRL1_RegStruct; + +/** + * @brief Make system soft reset. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_SoftReset(void) +{ + SYSCTRL0->SC_SYS_RES.BIT.softresreq = 1; +} + +/** + * @brief Get number of soft resets. + * @param None + * @retval Number of soft resets. + */ +static inline unsigned short DCL_SYSCTRL_GetSoftResetConut(void) +{ + return SYSCTRL0->SC_RST_CNT0.BIT.soft_rst_cnt; +} + +/** + * @brief Get number of reset times of the RESETN pin. + * @param None + * @retval Number of reset times of the RESETN pin. + */ +static inline unsigned short DCL_SYSCTRL_GetPinResetConut(void) +{ + return SYSCTRL0->SC_RST_CNT0.BIT.ext_rst_cnt; +} + +/** + * @brief Get number of WDG resets. + * @param None + * @retval Number of WDG resets. + */ +static inline unsigned short DCL_SYSCTRL_GetWdgResetConut(void) +{ + return SYSCTRL0->SC_RST_CNT1.BIT.wdg_rst_cnt; +} + +/** + * @brief Get number of IWDG resets. + * @param None + * @retval Number of IWDG resets. + */ +static inline unsigned short DCL_SYSCTRL_GetIWdgResetConut(void) +{ + return SYSCTRL0->SC_RST_CNT1.BIT.iwdg_rst_cnt; +} + +/** + * @brief Set the write protection for SYSCTRL registers disable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_ScWriteProtectionDisable(void) +{ + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = (SYSCTRL0->SC_LOCKEN.reg & SC_LOCKEN_SC_DISABLE_MASK) + SC_LOCKEN_VALID_HIGH_BIT; +} + +/** + * @brief Set the write protection for SYSCTRL registers enable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_ScWriteProtectionEnable(void) +{ + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = ((SYSCTRL0->SC_LOCKEN.reg & SC_LOW_BIT_MASK) | SC_LOCKEN_SC_ENABLE_MASK) + + SC_LOCKEN_VALID_HIGH_BIT; +} + +/** + * @brief Set the write protection for CRG-related registers disable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionDisable(void) +{ + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = (SYSCTRL0->SC_LOCKEN.reg & SC_LOCKEN_CRG_DISABLE_MASK) + SC_LOCKEN_VALID_HIGH_BIT; +} + +/** + * @brief Set the Set the write protection for CRG-related registers enable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionEnable(void) +{ + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = ((SYSCTRL0->SC_LOCKEN.reg & SC_LOW_BIT_MASK) | SC_LOCKEN_CRG_ENABLE_MASK) + + SC_LOCKEN_VALID_HIGH_BIT; +} + +/** + * @brief Set software interrupt register, writing 1 generates a software interrupt. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_GenerateSoftInterrupt(void) +{ + SYSCTRL0->SC_SOFT_INT.BIT.software_int = 1; +} + +/** + * @brief Set Software interrupt event ID. + * @param id the software interrupt event ID. + * @retval None. + */ +static inline void DCL_SYSCTRL_SetSoftInterruptEventId(unsigned int id) +{ + SYSCTRL0->SC_SOFT_EVT_ID.BIT.swint_evt_id = id; +} + +/** + * @brief Get Software interrupt event ID. + * @param None + * @retval The value of software interrupt event ID. + */ +static inline unsigned int DCL_SYSCTRL_GetSoftInterruptEventId(void) +{ + return SYSCTRL0->SC_SOFT_EVT_ID.BIT.swint_evt_id; +} + +/** + * @brief Get SYSRAM Parity Error Status. + * @param None. + * @retval 0:no error, 1:error. + */ +static inline unsigned int DCL_SYSCTRL_GetSysramParityErrorStatus(void) +{ + return SYSCTRL1->SYSRAM_ERR.BIT.sysram0_parity_err; +} + +/** + * @brief Set SYSRAM parity error status clear. + * @param None. + * @retval None. + */ +static inline void DCL_SYSCTRL_ClearSysramParityError(void) +{ + SYSCTRL1->SYSRAM_ERR.BIT.sysram_parity_err_clr = 1; /* Write any value to clear. */ +} + +/** + * @brief Get CPU status. + * @param offset Bit offset of CPU status. + * @retval true or false + */ +static inline bool DCL_SYSCTRL_CheckCpuStatus(SYSCTRL_CPU_Status offset) +{ + return ((SYSCTRL1->CPU_STATUS.reg) & (1 << offset)) == 0 ? false : true; +} +#endif /* McuMagicTag_SYSCTRL_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/3061m/systick.h b/vendor/others/demo/5-tim_adc/demo/chip/3061m/systick.h new file mode 100644 index 000000000..8e4f42eb3 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/3061m/systick.h @@ -0,0 +1,110 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file systick.h + * @author MCU Driver Team + * @brief SYSTICK module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the SYSTICK. + * + SYSTICK register mapping structure + * + Get SysTick counter + */ + + +#ifndef McuMagicTag_SYSTICK_H +#define McuMagicTag_SYSTICK_H + +/* Includes ------------------------------------------------------------------*/ +#include "baseaddr.h" +#include "systickinit.h" +/** + * @addtogroup SYSTICK + * @{ + */ + +/** + * @defgroup SYSTICK_IP SYSTICK_IP + * @brief SYSTICK_IP: systick + * @{ + */ + +/** + * @defgroup SYSTICK_Param_Def SYSTICK Parameters Definition + * @brief Definition of SYSTICK configuration parameters. + * @{ + */ + +#define SYSTICK_MAX_VALUE 0xFFFFFFFFUL + +/** + * @} + */ + +/** + * @brief SYSTICK control register structure. + */ +typedef union { + unsigned int reg; + struct { + unsigned int enable : 1; /**< Mtimer enable. */ + unsigned int clksrc : 1; /**< Mtimer clock source select. */ + unsigned int stop_tmr_en : 2; /**< Parameter change test. */ + unsigned int reserved : 28; + } BIT; +} TIMER_CTRL_REG; + +/** + * @brief SYSTICK DIV control register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int div : 10; /**< Timer frequency division control. */ + unsigned int reserved : 22; + } BIT; +} TIMER_DIV_REG; + +/** + * @brief SYSTICK register structure + */ +typedef struct { + TIMER_CTRL_REG TIMER_CTRL; /**< Mtimer control register. Offset address: 0x00000000U. */ + TIMER_DIV_REG TIMER_DIV; /**< Mtimer frequency divider register. Offset address: 0x00000004U. */ + unsigned int MTIME; /**< Mtimer count value lower 32-bit register. Offset address: 0x00000008U. */ + unsigned int MTIME_H; /**< Upper 32-bit register for Mtimer count value. Offset address: 0x0000000CU. */ + unsigned int MTIMECMP; /**< Mtimer comparison value lower 32-bit register. Offset address: 0x00000010U. */ + unsigned int MTIMECMP_H; /**< Upper 32-bit Mtimer comparison value register. Offset address: 0x00000014U. */ +} volatile SYSTICK_RegStruct; + +/** + * @} + */ + +/** + * @brief Get the systick + * @param None + * @retval The SysTick Value + */ +static inline unsigned int DCL_SYSTICK_GetTick(void) +{ + return SYSTICK->MTIME; /* Systick value(Lower 32bit register) */ +} + +/** + * @} + */ +#endif /* McuMagicTag_SYSTICK_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/chip/target/userconfig.json b/vendor/others/demo/5-tim_adc/demo/chip/target/userconfig.json new file mode 100644 index 000000000..855b1d10e --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/chip/target/userconfig.json @@ -0,0 +1,132 @@ +{ + "system": [ + { + "name": "compile", + "subsystem": [ + { + "name": "static_lib", + "component": [ + { + "name": "", + "target_type": "static", + "sources": [], + "includes": [], + "define": [], + "libs": [], + "lds_scripts": [], + "cflags": [], + "asmflags": [], + "ldflags": [] + } + ] + }, + { + "name": "compile_frame", + "cflags": [ + "-O0", + "-pipe", + "-Wall", + "-Wextra", + "-Winit-self", + "-Wmissing-include-dirs", + "-Wtrampolines", + "-Werror=undef", + "-Wpointer-arith", + "-Wlogical-op", + "-Wstrict-prototypes", + "-Wmissing-prototypes", + "-Wjump-misses-init", + "-Wformat=2", + "-Wfloat-equal", + "-Wdate-time", + "-Wswitch-default", + "-Wimplicit-fallthrough=2", + "-Wno-missing-declarations", + "-std=gnu11", + "-fsigned-char", + "-fno-builtin", + "-ffreestanding", + "-nostdlib", + "-fno-exceptions", + "-fno-unwind-tables", + "-fno-short-enums", + "-fno-common", + "-freg-struct-return", + "-mabi=ilp32f", + "-march=rv32imfc", + "-fno-strict-aliasing", + "-fdata-sections", + "-ffunction-sections", + "-falign-functions=2", + "-fno-schedule-insns", + "-fno-optimize-strlen", + "-fno-aggressive-loop-optimizations", + "-Wa,-enable-c-lbu-sb", + "-Wa,-enable-c-lhu-sh", + "-msmall-data-limit=0", + "-fimm-compare", + "-femit-muliadd", + "-fmerge-immshf", + "-femit-uxtb-uxth", + "-femit-lli", + "-fldm-stm-optimize", + "-fno-inline-small-functions", + "-mtune=size", + "-mpush-pop", + "-femit-clz", + "-madjust-regorder", + "-madjust-const-cost", + "-freorder-commu-args", + "-fimm-compare-expand", + "-frmv-str-zero", + "-mfp-const-opt", + "-mswitch-jump-table", + "-frtl-sequence-abstract", + "-frtl-hoist-sink", + "-fsafe-alias-multipointer", + "-finline-optimize-size", + "-fmuliadd-expand", + "-mlli-expand", + "-Wa,-mcjal-expand", + "-foptimize-reg-alloc", + "-fsplit-multi-zero-assignments", + "-floop-optimize-size", + "-mpattern-abstract", + "-foptimize-pro-and-epilogue", + "-fstrict-volatile-bitfields", + "-Wcast-align", + "-fstrong-eval-order", + "-Wunused", + "-Wvla", + "-Wshadow", + "-fvisibility=hidden", + "-fsingle-precision-constant" + ], + "asmflags": [], + "ldflags": [ + "-Wl,-Map,bin/target.map", + "-Wl,--enjal16", + "-Wl,--gc-section", + "-Wl,--cjal-relax", + "-Wl,--dslf", + "-Wl,--jal-transfer", + "-nostdlib", + "-static", + "-lgcc", + "-lc", + "-Wl,-Bsymbolic", + "-rdynamic", + "-Wl,--no-undefined" + ], + "define": [ + "FLOAT_SUPPORT" + ], + "nocheck": [], + "extlibspath": [], + "extlibsname": [], + "extlibsinclude": [] + } + ] + } + ] +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/demo.hiproj b/vendor/others/demo/5-tim_adc/demo/demo.hiproj new file mode 100644 index 000000000..b15b47b90 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/demo.hiproj @@ -0,0 +1,75 @@ +[information] +series_name=3061m +board=3061MNPICA +sdk_path=d:\HaiSi\Docs\open_mcu-master\open_mcu-master\src +flash=131072 +board_build.mcu=3061MNPICA +platform=vendorhm +json_path=3061MNPICA.json +project_type=MCU + +[chipconfig] +chipconfig=true + +[variabletrace] +variabletrace=true + +[compile] +tool_chain=cc_riscv32_musl_fp_win +link_c_library_in_toolchain=yes +link_c_library_in_compilationchain=yes +custom_build_command=undefined -d FLOAT_SUPPORT +custom_clean_command=undefined +map_path=./out/bin/target.map +compile_type=debug +constant_type=float +optimization=O0 +warning=yes +werror=no +wno_unused_function=no +wno_unused_label=no +wno_unused_parameter=no +wno_unused_variable=no +wno_missing_prototypes=no +static_library_enable=no +static_library_name= +static_library_dependency_header_file= +static_library_source_file= +fstack_protector_strong=no +extern_staticlib_path= +extern_staticlib_include= +global_macro_definition={"FLOAT_SUPPORT":""} +generate_crc=no +generate_checksum=no +generate_target_hex=yes +parse_elf_for_livewatch=no +parse_analysis_json=yes +padding=no + +[debug] +elf_path=./out/bin/target.elf +breakpoints_limitation=3 +client=gdb +tool=HiSpark-Trace +interface=swd +speed=5000 +openocd_interface_file= +openocd_target_file= +timeout=60000 +port=3333 + +[upload] +bin_path=./out/bin/target.bin +protocol=swd +reset=1 +burn_verification=0 +debug_board=HiSpark-Link +frequency=5000 +address=0x3000000 +partition_length=0x20000 + +[console] +port=COM5 +baud=115200 +stop_bit=0 +parity=N diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/acmp/common/inc/acmp.h b/vendor/others/demo/5-tim_adc/demo/drivers/acmp/common/inc/acmp.h new file mode 100644 index 000000000..6f894dcf7 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/acmp/common/inc/acmp.h @@ -0,0 +1,101 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file acmp.h + * @author MCU Driver Team. + * @brief ACMP module driver. + * This file provides functions declaration of the Comparator. + * + Comparator's Initialization and de-initialization functions + * + Set Comparator's hysteresis voltage function + * + Set blocking function. + * + Interrupt handling and register. + */ +#ifndef McuMagicTag_ACMP_H +#define McuMagicTag_ACMP_H +#include "acmp_ip.h" + +#ifdef ACMP_PARAM_CHECK +#define ACMP_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#else +#define ACMP_ASSERT_PARAM(para) ((void)0U) +#endif + +/** + * @defgroup ACMP ACMP + * @brief ACMP module. + * @{ + */ + +/** + * @defgroup ACMP_Common ACMP Common + * @brief ACMP common external module. + * @{ + */ + + +/** + * @defgroup ACMP_Handle_Definition ACMP Handle Definition + * @{ + */ + +/** + * @brief ACMP Handle + */ +typedef struct _ACMP_Handle { + ACMP_RegStruct *baseAddress; /**< ACMP registers base address. */ + ACMP_InOutConfig inOutConfig; /**< ACMP input and output setting. */ + ACMP_FilterCtrl filterCtrl; /**< ACMP filter setting. */ + unsigned short hysteresisVol; /**< ACMP hysteresis voltage setting. */ + ACMP_UserCallBack userCallBack; /**< ACMP user callback function. */ + volatile bool interruptEn; /**< ACMP interrupt enable. */ + ACMP_ExtendHandle handleEx; /**< ACMP extended parameter. */ +} ACMP_Handle; + +typedef void (* ACMP_CallBackType)(void *handle); +/** + * @} + */ + +/** + * @defgroup ACMP_API_Declaration ACMP HAL API + * @{ + */ +BASE_StatusType HAL_ACMP_Init(ACMP_Handle *acmpHandle); +BASE_StatusType HAL_ACMP_DeInit(ACMP_Handle *acmpHandle); +void HAL_ACMP_SetHystVol(ACMP_Handle *acmpHandle, ACMP_HystVol voltage); +void HAL_ACMP_BlkingValid(ACMP_Handle *acmpHandle); +void HAL_ACMP_BlkingInvalid(ACMP_Handle *acmpHandle); + +/* ACMP output result selection. */ +BASE_StatusType HAL_ACMP_ResultSelect(ACMP_Handle *acmpHandle, ACMP_ResultSelect resultSelect); + +/* ACMP interrupt service function and user callback registration function. */ +void HAL_ACMP_IrqHandler(void *handle); +BASE_StatusType HAL_ACMP_RegisterCallBack(ACMP_Handle *uartHandle, ACMP_CallBackFun_Type typeID, + ACMP_CallBackType pCallback); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/acmp/inc/acmp_ex.h b/vendor/others/demo/5-tim_adc/demo/drivers/acmp/inc/acmp_ex.h new file mode 100644 index 000000000..8291c1897 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/acmp/inc/acmp_ex.h @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file acmp_ex.h + * @author MCU Driver Team + * @brief ACMP module driver. + * @details This file provides extend functions declaration of the acmp, + * + Set trim value. + */ + +/* Includes ------------------------------------------------------------------*/ +#ifndef McuMagicTag_ACMP_EX_H +#define McuMagicTag_ACMP_EX_H + +#include "acmp.h" + +/** + * @addtogroup ACMP_IP + * @{ + */ + +/** + * @defgroup ACMP_EX_API_Declaration ACMP HAL API EX + * @{ + */ + +/* ACMP trim value setting. */ +BASE_StatusType HAL_ACMP_SetTrimValueEx(ACMP_Handle *acmpHandle, unsigned char trimValue); + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_ACMP_EX_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/acmp/inc/acmp_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/acmp/inc/acmp_ip.h new file mode 100644 index 000000000..16c8de940 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/acmp/inc/acmp_ip.h @@ -0,0 +1,673 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file acmp_ip.h + * @author MCU Driver Team + * @brief ACMP module driver. + * This file provides DCL functions to manage ACMP and Definitions of specific parameters. + * + Definition of ACMP configuration parameters. + * + ACMP register mapping structure. + * + Parameters check functions. + * + Direct configuration layer interface. + */ + +#ifndef McuMagicTag_ACMP_IP_H +#define McuMagicTag_ACMP_IP_H + +#include "baseinc.h" + +#ifdef ACMP_PARAM_CHECK +#define ACMP_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define ACMP_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define ACMP_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define ACMP_ASSERT_PARAM(para) ((void)0U) +#define ACMP_PARAM_CHECK_NO_RET(para) ((void)0U) +#define ACMP_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +#define ACMP_FILTER_STEP_MAX_VALUE 0x00000FFFEU + +/** + * @addtogroup ACMP + * @{ + */ + +/** + * @defgroup ACMP_IP ACMP_IP + * @brief ACMP_IP: acmp_v1. + * @{ + */ + +/** + * @defgroup ACMP_Param_Def ACMP Parameters Definition + * @brief Definition of ACMP configuration parameters + * @{ + */ + +/** + * @brief Comparator blking source type + * @details Description: + * + ACMP_BLKING_SRC_SOFT ---- The software configuration masks the window. + * + ACMP_BLKING_SRC_APT0 ---- APT0 output mask window. + * + ACMP_BLKING_SRC_APT1 ---- APT1 output mask window. + * + ACMP_BLKING_SRC_APT2 ---- APT2 output mask window. + * + ACMP_BLKING_SRC_APT3 ---- APT3 output mask window. + */ +typedef enum { + ACMP_BLKING_SRC_SOFT = 0x00000000U, + ACMP_BLKING_SRC_APT0 = 0x00000001U, + ACMP_BLKING_SRC_APT1 = 0x00000002U, + ACMP_BLKING_SRC_APT2 = 0x00000003U, + ACMP_BLKING_SRC_APT3 = 0x00000004U, +} ACMP_BlkingSrcType; + +/** + * @brief Comparator hysteresis voltage + * @details Description: + * + ACMP_HYS_VOL_ZERO ---- Hysteresis voltage 0 mv. + * + ACMP_HYS_VOL_10MV ---- Hysteresis voltage 10 mv. + * + ACMP_HYS_VOL_20MV ---- Hysteresis voltage 20 mv. + * + ACMP_HYS_VOL_30MV ---- Hysteresis voltage 30 mv. + */ +typedef enum { + ACMP_HYS_VOL_ZERO = 0x00000000U, + ACMP_HYS_VOL_10MV = 0x00000001U, + ACMP_HYS_VOL_20MV = 0x00000002U, + ACMP_HYS_VOL_30MV = 0x00000003U, +} ACMP_HystVol; + +/** + * @brief ACMP P port input select. + * @details Description: + * + ACMP_INPUT_P_SELECT0 ---- Signal source PGA0_OUT. + * + ACMP_INPUT_P_SELECT1 ---- Signal source PGA1_OUT. + * + ACMP_INPUT_P_SELECT2 ---- From pin (GPIO0_5). + * + ACMP_INPUT_P_SELECT3 ---- From pin (GPIO2_5). + * + ACMP_INPUT_P_SELECT4 ---- From pin (GPIO3_5). + * + ACMP_INPUT_P_SELECT5 ---- Signal source DAC_OUT. + */ +typedef enum { + ACMP_INPUT_P_SELECT0 = 0x00000000U, + ACMP_INPUT_P_SELECT1 = 0x00000001U, + ACMP_INPUT_P_SELECT2 = 0x00000002U, + ACMP_INPUT_P_SELECT3 = 0x00000003U, + ACMP_INPUT_P_SELECT4 = 0x00000004U, + ACMP_INPUT_P_SELECT5 = 0x00000005U, +} ACMP_InputPSel; + +/** + * @brief ACMP N port input select. + * @details Description: + * + ACMP_INPUT_N_SELECT0 ---- Signal source DAC_OUT. + * + ACMP_INPUT_N_SELECT1 ---- None. + * + ACMP_INPUT_N_SELECT2 ---- From pin (GPIO0_6). + * + ACMP_INPUT_N_SELECT3 ---- From pin (GPIO2_6). + * + ACMP_INPUT_N_SELECT4 ---- From pin (GPIO3_6). + * + ACMP_INPUT_N_SELECT5 ---- Signal source DAC_OUT. + */ +typedef enum { + ACMP_INPUT_N_SELECT0 = 0x00000000U, + ACMP_INPUT_N_SELECT1 = 0x00000001U, + ACMP_INPUT_N_SELECT2 = 0x00000002U, + ACMP_INPUT_N_SELECT3 = 0x00000003U, + ACMP_INPUT_N_SELECT4 = 0x00000004U, + ACMP_INPUT_N_SELECT5 = 0x00000005U, +} ACMP_InputNSel; + +/** + * @brief Comparator output polarity + */ +typedef enum { + ACMP_OUT_NOT_INVERT = 0x00000000U, + ACMP_OUT_INVERT = 0x00000001U, +} ACMP_OutputPolarity; + +/** + * @brief ACMP output selection + * @details Description: + * + ACMP_RESULT_SIMULATION ---- Simulate the original comparison result. + * + ACMP_RESULT_FILTER ---- Digital Filtering Comparison Results. + * + ACMP_RESULT_FILTER_BLOCK ---- Digital Filtering and Blocking Comparison Results. + */ +typedef enum { + ACMP_RESULT_SIMULATION = 0x00000000U, + ACMP_RESULT_FILTER = 0x00000001U, + ACMP_RESULT_FILTER_BLOCK = 0x00000002U, +} ACMP_ResultSelect; + +/** + * @brief Comparator filter mode + * @details Description: + * + ACMP_FILTER_NONE ---- Raw analog comparison. + * + ACMP_FILTER_BLOCK ---- Blocking function. + * + ACMP_FILTER_FILTER ---- Filtering funciton. + * + ACMP_FILTER_BOTH ---- Filtering and Blocking function. + */ +typedef enum { + ACMP_FILTER_NONE = 0x00000000U, + ACMP_FILTER_BLOCK = 0x00000001U, + ACMP_FILTER_FILTER = 0x00000002U, + ACMP_FILTER_BOTH = 0x00000003U, +} ACMP_FilterMode; + +/** + * @brief Comparator filter control structure + */ +typedef struct { + ACMP_FilterMode filterMode; /**< ACMP filter mode. */ + ACMP_BlkingSrcType blkingSrcSelect; /**< Blocking source select.*/ + unsigned short filterStep; /**< Filter Step. */ + bool blkingPorty; /**< Polarity select of the mask window. */ +} ACMP_FilterCtrl; + +/** + * @brief Comparator input and output configuration structure + */ +typedef struct { + ACMP_OutputPolarity polarity; /**< output polarity settings */ + ACMP_InputPSel inputPNum; /**< ACMP input positive number */ + ACMP_InputNSel inputNNum; /**< ACMP input negative number */ +} ACMP_InOutConfig; + +/** + * @brief ACMP user callback function type. + */ +typedef enum { + ACMP_POS_INT = 0x00000000U, + ACMP_NEG_INT = 0x00000001U, + ACMP_EDGE_INT = 0x00000002U, +} ACMP_CallBackFun_Type; + +/** + * @brief ACMP user interrupt callback function. + */ +typedef struct { + void (* AcmpPositiveCallBack)(void *handle); /**< Rising edge interrupt callback function. */ + void (* AcmpNegativeCallBack)(void *handle); /**< Falling edge interrupt callback function. */ + void (* AcmpEdgedCallBack)(void *handle); /**< Flip edge interrupt callback function. */ +} ACMP_UserCallBack; + +/** + * @brief ACMP extend configure. + */ +typedef struct { +} ACMP_ExtendHandle; + +/** + * @} + */ + +/** + * @defgroup ACMP_REG_Definition ACMP Register Structure. + * @brief ACMP Register Structure Definition. + * @{ + */ + +/** + * @brief ACMP control reg 0. + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_acmp_enh : 1; /**< Comparator enable signal. */ + unsigned int reserved_0 : 31; + } BIT; +} volatile ACMP_CTRL_REG0; + +/** + * @brief ACMP control reg 1. + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_acmp_input_psel : 3; /**< Input P vin selection */ + unsigned int da_acmp_input_nsel : 3; /**< Input N vin selection */ + unsigned int reserved_0 : 26; + } BIT; +} volatile ACMP_CTRL_REG1; + +/** + * @brief ACMP control reg 2. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_acmp_out_sel : 2; /**< Comparator output result selection: + 0: original comparison result; + 1: result after filtering; + 2: masked result; + 3: 0. */ + unsigned int cfg_acmp_out_inv : 1; /**< Comparator result polarity selection: + 0: The result is not reversed. + 1: The result is reversed. */ + unsigned int reserved_0 : 29; + } BIT; +} volatile ACMP_CTRL_REG2; + +/** + * @brief ACMP filtering control register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_acmp_filter_en : 1; /**< Comparator filtering enable: + 0: disabled; + 1: enabled. */ + unsigned int cfg_acmp_filter_step : 16; /**< Filter step size of the comparator. */ + unsigned int reserved_0 : 15; + } BIT; +} volatile ACMP_CTRL_REG3; + +/** + * @brief ACMP mask control register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_acmp_blk_en : 1; /**< Comparator mask enable: + 0: disabled; + 1: enabled. */ + unsigned int reserved_0 : 7; + unsigned int cfg_acmp_blk_sel : 3; /**< Comparator Mask Window Selection: + 0: The window is masked by software. + 1: APT0 output mask window; + 2: APT1 output mask window; + 3: APT2 output mask window; + 4: APT3 output mask window; + else: 0. */ + unsigned int reserved_1 : 5; + unsigned int cfg_acmp_blk_win : 1; /**< The software configuration mask window is displayed. */ + unsigned int reserved_2 : 7; + unsigned int cfg_acmp_blk_pol_sel : 1; /**< Select the polarity of the mask window. + 0: The high-level mask window is valid. + 1: The low-level shielding window is valid. */ + unsigned int cfg_acmp_blk_rslt_pol : 1; /**< Polarity selection of the masking result: + 0: The masking result is low level. + 1: The masking result is high level. */ + unsigned int reserved_3 : 6; + } BIT; +} volatile ACMP_CTRL_REG4; + + +/** + * @brief ACMP interrupt raw status register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int intr_acmp_edge : 1; /**< Comparison result reversal edge interrupt status. */ + unsigned int intr_acmp_neg : 1; /**< Comparison result falling edge interrupt status. */ + unsigned int intr_acmp_pos : 1; /**< Interrupt status on the rising edge of comparison result. */ + unsigned int reserved : 29; + } BIT; +} volatile ACMP_INTR_REG; + + +/** + * @brief Masked ACMP interrupt status register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int intr_acmp_edge_msk : 1; /**< Status of comparison result reversal edge masked interrupt. */ + unsigned int intr_acmp_neg_msk : 1; /**< Int status after falling edge of comparison result is masked. */ + unsigned int intr_acmp_pos_msk : 1; /**< Int status after rising edge of comparison result is masked. */ + unsigned int reserved : 29; + } BIT; +} volatile ACMP_INTR_MSK_REG; + + +/** + * @brief ACMP interrupt mask. + */ +typedef union { + unsigned int reg; + struct { + unsigned int intr_acmp_edge_mask : 1; /**< Comparison result reversal edge interrupt mask register: + 0: mask interrupts. + 1: not masked. */ + unsigned int intr_acmp_neg_mask : 1; /**< Comparison result falling edge interrupt mask register: + 0: mask interrupts. + 1: not masked. */ + unsigned int intr_acmp_pos_mask : 1; /**< Comparison result rising edge interrupt mask register: + 0: mask interrupts. + 1: not masked. */ + unsigned int reserved : 29; + } BIT; +} volatile ACMP_INTR_MASK_REG; + + +/** + * @brief ACMP result register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cmp_ana_rslt : 1; /**< Original comparison result. */ + unsigned int cmp_filter_rslt : 1; /**< Filtered result of the comparator. */ + unsigned int cmp_blk_rslt : 1; /**< Result after the comparator is masked. */ + unsigned int reserved : 29; + } BIT; +} volatile ACMP_RSLT_REG; + +/** + * @brief ACMP enable delay register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_acmp_en_dly : 8; /**< Indicates the delay for enabling ACMP (us). */ + unsigned int reserved : 24; + } BIT; +} volatile ACMP_EN_DLY_REG; + +/** + * @brief ACMP test register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_acmp_test_enh : 1; /**< Test enable signal: + 0: disabled; + 1: enabled. */ + unsigned int da_acmp_test_sel : 8; /**< Test signal strobe. */ + unsigned int reserved : 23; + } BIT; +} volatile ACMP_TEST_REG; + + +/** + * @brief ACMP TRIM register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_acmp_trim : 8; /**< ACMP TIRM register. */ + unsigned int reserved : 24; + } BIT; +} volatile ACMP_TRIM_REG; + + +/** + * @brief ACMP reserved register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_acmp_rsv : 2; /**< Reserved comparator register: + <1: 0>: The hysteresis voltage is selected. */ + unsigned int reserved : 30; + } BIT; +} volatile ACMP_RSV_REG; + +/** + * @brief ACMP registers definition structure. + */ +typedef struct _ACMP_RegStruct { + ACMP_CTRL_REG0 ACMP_CTRL0; /**< ACMP control register 0. Offset address: 0x00000000U. */ + ACMP_CTRL_REG1 ACMP_CTRL1; /**< ACMP control register 1. Offset address: 0x00000004U. */ + ACMP_CTRL_REG2 ACMP_CTRL2; /**< ACMP control register 2. Offset address: 0x00000008U. */ + char space0[52]; + ACMP_CTRL_REG3 ACMP_CTRL3; /**< ACMP filtering control register. Offset address: 0x00000040U. */ + ACMP_CTRL_REG4 ACMP_CTRL4; /**< ACMP mask control register. Offset address: 0x00000044U. */ + char space1[8]; + ACMP_INTR_REG ACMP_INTR; /**< ACMP interrupt raw status register. Offset address: 0x00000050U. */ + ACMP_INTR_MSK_REG ACMP_INTR_MSK; /**< Masked ACMP interrupt status register. Offset address: 0x00000054U. */ + ACMP_INTR_MASK_REG ACMP_INTR_MASK; /**< ACMP interrupt mask register. Offset address: 0x00000058U. */ + char space2[20]; + ACMP_RSLT_REG ACMP_RSLT; /**< ACMP result register. Offset address: 0x00000070U. */ + char space3[12]; + ACMP_EN_DLY_REG ACMP_EN_DLY; /**< ACMP enable delay register. Offset address: 0x00000080U. */ + char space4[4]; + ACMP_TRIM_REG ACMP_TRIM; /**< ACMP TRIM register. Offset address: 0x00000088U. */ + ACMP_RSV_REG ACMP_RSV; /**< ACMP reserved register. Offset address: 0x0000008CU. */ +} volatile ACMP_RegStruct; + +/* Parameter Check------------------------------------------------------------------ */ +/** + * @brief Verify ACMP output polarity configuration. + * @param polarity: ACMP output polarity + * @retval true + * @retval false + */ +static inline bool IsACMPOutputPolarity(ACMP_OutputPolarity polarity) +{ + return ((polarity == ACMP_OUT_NOT_INVERT) || (polarity == ACMP_OUT_INVERT)); +} + +/** + * @brief Verify ACMP input P number. + * @param pNumber: ACMP output source select + * @retval true + * @retval false + */ +static inline bool IsACMPInputPNumber(ACMP_InputPSel pNumber) +{ + return (pNumber <= ACMP_INPUT_P_SELECT5); +} + +/** + * @brief Verify ACMP input N number. + * @param NNumber: ACMP output source select + * @retval true + * @retval false + */ +static inline bool IsACMPInputNNumber(ACMP_InputNSel NNumber) +{ + return (NNumber <= ACMP_INPUT_N_SELECT5); +} + +/** + * @brief Verify ACMP blocking source type. + * @param BlkingSrcType: ACMP output source select + * @retval true + * @retval false + */ +static inline bool IsACMPBlkingSrcType(ACMP_BlkingSrcType BlkingSrcType) +{ + return (BlkingSrcType <= ACMP_BLKING_SRC_APT3); +} + +/** + * @brief Verify ACMP output result selection + * @param resultSelection: ACMP output source selection. + * @retval true + * @retval false + */ +static inline bool IsACMPResultSeletion(ACMP_ResultSelect resultSelection) +{ + return (resultSelection <= ACMP_RESULT_FILTER_BLOCK); +} + +/* Direct configuration layer ------------------------------------------------*/ +/** + * @brief Set input switch + * @param acmpx: ACMP register base address. + * @param inputP: ACMP inputP selection. @ref ACMP_VinSel + * @param inputN: ACMP inputN selection. @ref ACMP_VinSel + * @retval None. + */ +static inline void DCL_ACMP_SetInputSwith(ACMP_RegStruct *acmpx, ACMP_InputPSel inputP, ACMP_InputNSel inputN) +{ + ACMP_ASSERT_PARAM(IsACMPInstance(acmpx)); + ACMP_PARAM_CHECK_NO_RET(inputP >= ACMP_INPUT_P_SELECT0); + ACMP_PARAM_CHECK_NO_RET(inputP <= ACMP_INPUT_P_SELECT5); + ACMP_PARAM_CHECK_NO_RET(inputN >= ACMP_INPUT_N_SELECT0); + ACMP_PARAM_CHECK_NO_RET(inputN <= ACMP_INPUT_N_SELECT5); + acmpx->ACMP_CTRL1.BIT.da_acmp_input_nsel = inputN; /* Input port on the P side. */ + acmpx->ACMP_CTRL1.BIT.da_acmp_input_psel = inputP; /* Input port on the N side. */ +} + +/** + * @brief ACMP output(deshark and synchronize) source. + * @param acmp: ACMP register base address. + * @param resultSelection: config value. @ref ACMP_ResultSelect + * @retval None. + */ +static inline void DCL_ACMP_SetCmpOutputSrc(ACMP_RegStruct *acmpx, ACMP_ResultSelect resultSelection) +{ + ACMP_ASSERT_PARAM(IsACMPInstance(acmpx)); + ACMP_PARAM_CHECK_NO_RET(resultSelection >= ACMP_RESULT_SIMULATION); + ACMP_PARAM_CHECK_NO_RET(resultSelection <= ACMP_RESULT_FILTER_BLOCK); + acmpx->ACMP_CTRL2.BIT.cfg_acmp_out_sel = resultSelection; /* ACMP output result select. */ +} + +/** + * @brief Comparator enable blking function + * @param acmpx: ACMP register base address. + * @retval None. + */ +static inline void DCL_ACMP_EnableCmpBlking(ACMP_RegStruct *acmpx) +{ + ACMP_ASSERT_PARAM(IsACMPInstance(acmpx)); + acmpx->ACMP_CTRL4.BIT.cfg_acmp_blk_en = BASE_CFG_ENABLE; +} + +/** + * @brief Comparator disable blking function + * @param acmpx: ACMP register base address. + * @retval None. + */ +static inline void DCL_ACMP_DisableCmpBlking(ACMP_RegStruct *acmpx) +{ + ACMP_ASSERT_PARAM(IsACMPInstance(acmpx)); + acmpx->ACMP_CTRL4.BIT.cfg_acmp_blk_en = BASE_CFG_DISABLE; +} + +/** + * @brief Enable the software masking window. + * @param acmpx: ACMP register base address. + * @retval None. + */ +static inline void DCL_ACMP_EnableSoftBlking(ACMP_RegStruct *acmpx) +{ + ACMP_ASSERT_PARAM(IsACMPInstance(acmpx)); + acmpx->ACMP_CTRL4.BIT.cfg_acmp_blk_win = BASE_CFG_ENABLE; +} + +/** + * @brief Disable the software masking window. + * @param acmpx: ACMP register base address. + * @retval None. + */ +static inline void DCL_ACMP_DisableSoftBlking(ACMP_RegStruct *acmpx) +{ + ACMP_ASSERT_PARAM(IsACMPInstance(acmpx)); + acmpx->ACMP_CTRL4.BIT.cfg_acmp_blk_win = BASE_CFG_DISABLE; +} + +/** + * @brief Set blking source. + * @param acmpx: ACMP register base address. + * @param source: Source of blking. @ref ACMP_BlkingSrcType + * @retval None. + */ +static inline void DCL_ACMP_SetCmpBlkingSource(ACMP_RegStruct *acmpx, ACMP_BlkingSrcType source) +{ + ACMP_ASSERT_PARAM(IsACMPInstance(acmpx)); + ACMP_PARAM_CHECK_NO_RET(source >= ACMP_BLKING_SRC_SOFT); + ACMP_PARAM_CHECK_NO_RET(source <= ACMP_BLKING_SRC_APT3); + acmpx->ACMP_CTRL4.BIT.cfg_acmp_blk_sel = source; +} + +/** + * @brief Set comparator hysteresis voltage. + * @param acmpx: ACMP register base address. + * @param volSelect: Hysteresis voltage selection. @ref ACMP_HystVol + * @retval None. + */ +static inline void DCL_ACMP_SetCmpHysteresisVoltage(ACMP_RegStruct *acmpx, ACMP_HystVol volSelect) +{ + ACMP_ASSERT_PARAM(IsACMPInstance(acmpx)); + ACMP_PARAM_CHECK_NO_RET(volSelect >= ACMP_HYS_VOL_ZERO); + ACMP_PARAM_CHECK_NO_RET(volSelect <= ACMP_HYS_VOL_30MV); + acmpx->ACMP_RSV.BIT.da_acmp_rsv = volSelect; +} + +/** + * @brief Set comparator's output polarity + * @param acmp: ACMP register base address. + * @param polarity: output polarity. @ref ACMP_OutputPolarity + * @retval None. + */ +static inline void DCL_ACMP_SetCmpOutputPolarity(ACMP_RegStruct *acmpx, ACMP_OutputPolarity polarity) +{ + ACMP_ASSERT_PARAM(IsACMPInstance(acmpx)); + ACMP_PARAM_CHECK_NO_RET(polarity >= ACMP_OUT_NOT_INVERT); + ACMP_PARAM_CHECK_NO_RET(polarity <= ACMP_OUT_INVERT); + acmpx->ACMP_CTRL2.BIT.cfg_acmp_out_inv = polarity; +} + +/** + * @brief Reading compare result after blocking. + * @param acmp: ACMP register base address. + * @retval Blocked result. + */ +static inline unsigned int DCL_ACMP_GetCmpOutValueAfterBlking(ACMP_RegStruct *acmpx) +{ + ACMP_ASSERT_PARAM(IsACMPInstance(acmpx)); + return acmpx->ACMP_RSLT.BIT.cmp_blk_rslt; +} + +/** + * @brief Reading compare result after filtering. + * @param acmp: ACMP register base address. + * @retval filtered result. + */ +static inline unsigned int DCL_ACMP_GetCmpOutValueAfterFilter(ACMP_RegStruct *acmpx) +{ + ACMP_ASSERT_PARAM(IsACMPInstance(acmpx)); + return acmpx->ACMP_RSLT.BIT.cmp_filter_rslt; +} + +/** + * @brief Reading original compare result + * @param acmp: ACMP register base address. + * @retval original result. + */ +static inline unsigned int DCL_ACMP_GetCmpOutValueOriginal(ACMP_RegStruct *acmpx) +{ + ACMP_ASSERT_PARAM(IsACMPInstance(acmpx)); + return acmpx->ACMP_RSLT.BIT.cmp_ana_rslt; +} + +/** + * @brief Set deshark step by clock. + * @param acmp: ACMP register base address. + * @param step: ACMP filter step. + * @retval None. + */ +static inline void DCL_ACMP_SetFilterStep(ACMP_RegStruct *acmpx, unsigned short step) +{ + ACMP_ASSERT_PARAM(IsACMPInstance(acmpx)); + ACMP_PARAM_CHECK_NO_RET(step <= ACMP_FILTER_STEP_MAX_VALUE); + acmpx->ACMP_CTRL3.BIT.cfg_acmp_filter_step = step; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/acmp/src/acmp.c b/vendor/others/demo/5-tim_adc/demo/drivers/acmp/src/acmp.c new file mode 100644 index 000000000..4112f18c8 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/acmp/src/acmp.c @@ -0,0 +1,313 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file acmp.c + * @author MCU Driver Team. + * @brief ACMP HAL level module driver. + * This file provides firmware functions to manage the following + * functionalities of ACMP. + * + Comparator's Initialization and de-initialization functions + * + Set Comparator's hysteresis voltage function + * + Set software blking valid function + * + Set software blking invalid function + */ +#include "acmp.h" +#include "assert.h" + + +/* Define -------------- */ +#define ACMP_INTERRUPT_ENABLE 0b111 +#define ACMP_POS_INTERUPT 0b100 +#define ACMP_NEG_INTERUPT 0b010 +#define ACMP_EDGE_INTERRUPT 0b001 + + +/** + * @brief Input and output initialization of comparator + * @param acmpHandle: ACMP handle. + * @retval None. + */ +static void ACMP_InputOutputInit(ACMP_Handle *acmpHandle) +{ + ACMP_ASSERT_PARAM(acmpHandle != NULL); + ACMP_ASSERT_PARAM(IsACMPInstance(acmpHandle->baseAddress)); + ACMP_PARAM_CHECK_NO_RET(IsACMPOutputPolarity(acmpHandle->inOutConfig.polarity)); + /* Check input multiplexing selection and input switch selection */ + ACMP_PARAM_CHECK_NO_RET(IsACMPInputPNumber(acmpHandle->inOutConfig.inputPNum)); + ACMP_PARAM_CHECK_NO_RET(IsACMPInputNNumber(acmpHandle->inOutConfig.inputNNum)); + /* input positive selection */ + acmpHandle->baseAddress->ACMP_CTRL1.BIT.da_acmp_input_psel = acmpHandle->inOutConfig.inputPNum; + /* input negative selection */ + acmpHandle->baseAddress->ACMP_CTRL1.BIT.da_acmp_input_nsel = acmpHandle->inOutConfig.inputNNum; + /* output polarity selection */ + acmpHandle->baseAddress->ACMP_CTRL2.BIT.cfg_acmp_out_inv = acmpHandle->inOutConfig.polarity; +} + +/** + * @brief Filter initialization of comparator + * @param acmpHandle: ACMP handle. + * @retval None. + */ +static void ACMP_FilterInit(ACMP_Handle *acmpHandle) +{ + ACMP_ASSERT_PARAM(acmpHandle != NULL); + ACMP_ASSERT_PARAM(IsACMPInstance(acmpHandle->baseAddress)); + unsigned short blkingSrc; + switch (acmpHandle->filterCtrl.filterMode) { + case ACMP_FILTER_NONE: /* The filtering function is not applicable. */ + acmpHandle->baseAddress->ACMP_CTRL3.BIT.cfg_acmp_filter_en = BASE_CFG_DISABLE; /* Disable filtering */ + acmpHandle->baseAddress->ACMP_CTRL4.BIT.cfg_acmp_blk_en = BASE_CFG_DISABLE; /* Disable blocking */ + + acmpHandle->baseAddress->ACMP_CTRL2.BIT.cfg_acmp_out_sel = 0x0; /* 0x0: Output raw comparison result. */ + break; + case ACMP_FILTER_BLOCK: /* Use the blockinng function. */ + acmpHandle->baseAddress->ACMP_CTRL4.BIT.cfg_acmp_blk_en = BASE_CFG_ENABLE; /* Enable blocking. */ + blkingSrc = acmpHandle->filterCtrl.blkingSrcSelect; + acmpHandle->baseAddress->ACMP_CTRL4.BIT.cfg_acmp_blk_sel = blkingSrc; /* Setting Blking source */ + if (blkingSrc == ACMP_BLKING_SRC_SOFT) { + /* Sets the polarity of the window.. */ + acmpHandle->baseAddress->ACMP_CTRL4.BIT.cfg_acmp_blk_pol_sel = acmpHandle->filterCtrl.blkingPorty; + } else { + /* Blocking source from apt window. */ + acmpHandle->baseAddress->ACMP_CTRL4.BIT.cfg_acmp_blk_pol_sel = BASE_CFG_ENABLE; + acmpHandle->baseAddress->ACMP_CTRL4.BIT.cfg_acmp_blk_rslt_pol = BASE_CFG_DISABLE; + } + acmpHandle->baseAddress->ACMP_CTRL2.BIT.cfg_acmp_out_sel = 0x2; /* 0x2: Outputs digital filtered and + masked comparison results */ + break; + case ACMP_FILTER_FILTER: /* Set the filtering function. */ + acmpHandle->baseAddress->ACMP_CTRL3.BIT.cfg_acmp_filter_en = BASE_CFG_ENABLE; /* Enable filtering. */ + /* Filter length setting. */ + acmpHandle->baseAddress->ACMP_CTRL3.BIT.cfg_acmp_filter_step = acmpHandle->filterCtrl.filterStep; + + acmpHandle->baseAddress->ACMP_CTRL2.BIT.cfg_acmp_out_sel = 0x1; /* 0x1: Outputs filtering result. */ + break; + case ACMP_FILTER_BOTH: /* Use filtering and shielding functions. */ + acmpHandle->baseAddress->ACMP_CTRL3.BIT.cfg_acmp_filter_en = BASE_CFG_ENABLE; /* Enable filtering. */ + acmpHandle->baseAddress->ACMP_CTRL3.BIT.cfg_acmp_filter_step = acmpHandle->filterCtrl.filterStep; + + acmpHandle->baseAddress->ACMP_CTRL4.BIT.cfg_acmp_blk_en = BASE_CFG_ENABLE; /* Enable blocking. */ + blkingSrc = acmpHandle->filterCtrl.blkingSrcSelect; + acmpHandle->baseAddress->ACMP_CTRL4.BIT.cfg_acmp_blk_sel = blkingSrc; /* Setting blocking source. */ + if (blkingSrc == ACMP_BLKING_SRC_SOFT) { + /* Setting Blking source from software. */ + acmpHandle->baseAddress->ACMP_CTRL4.BIT.cfg_acmp_blk_pol_sel = acmpHandle->filterCtrl.blkingPorty; + } else { + /* Blocking source from apt window. */ + acmpHandle->baseAddress->ACMP_CTRL4.BIT.cfg_acmp_blk_pol_sel = BASE_CFG_ENABLE; + acmpHandle->baseAddress->ACMP_CTRL4.BIT.cfg_acmp_blk_rslt_pol = BASE_CFG_DISABLE; + } + acmpHandle->baseAddress->ACMP_CTRL2.BIT.cfg_acmp_out_sel = 0x2; /* 0x2: Outputs digital filtered and + masked comparison results */ + break; + default: + acmpHandle->baseAddress->ACMP_CTRL3.BIT.cfg_acmp_filter_en = BASE_CFG_DISABLE; /* Disable filtering. */ + acmpHandle->baseAddress->ACMP_CTRL4.BIT.cfg_acmp_blk_en = BASE_CFG_DISABLE; /* Disable blocking. */ + break; + } +} + +/** + * @brief Comparator HAL Init + * @param acmpHandle: ACMP handle. + * @retval BASE_StatusType: OK, ERROR + */ +BASE_StatusType HAL_ACMP_Init(ACMP_Handle *acmpHandle) +{ + ACMP_ASSERT_PARAM(acmpHandle != NULL); + ACMP_ASSERT_PARAM(IsACMPInstance(acmpHandle->baseAddress)); + /* Parameter macro check. */ + ACMP_PARAM_CHECK_WITH_RET(acmpHandle->hysteresisVol >= ACMP_HYS_VOL_ZERO, BASE_STATUS_ERROR); + ACMP_PARAM_CHECK_WITH_RET(acmpHandle->hysteresisVol <= ACMP_HYS_VOL_30MV, BASE_STATUS_ERROR); + ACMP_PARAM_CHECK_WITH_RET(acmpHandle->filterCtrl.filterStep >= 0, BASE_STATUS_ERROR); + ACMP_PARAM_CHECK_WITH_RET(acmpHandle->filterCtrl.filterStep <= ACMP_FILTER_STEP_MAX_VALUE, BASE_STATUS_ERROR); + ACMP_PARAM_CHECK_WITH_RET(IsACMPBlkingSrcType(acmpHandle->filterCtrl.blkingSrcSelect), BASE_STATUS_ERROR); + /* Enable ACMP. */ + acmpHandle->baseAddress->ACMP_CTRL0.BIT.da_acmp_enh = BASE_CFG_ENABLE; + /* Enable ACMP interrupt. */ + if (acmpHandle->interruptEn == BASE_CFG_SET) { + acmpHandle->baseAddress->ACMP_INTR_MASK.reg = ACMP_INTERRUPT_ENABLE; /* Configure acmp interrupt. */ + } else { + acmpHandle->baseAddress->ACMP_INTR_MASK.reg = BASE_CFG_UNSET; /* Disable acmp interrupt. */ + } + /* ACMP input and output settings. */ + ACMP_InputOutputInit(acmpHandle); + /* ACMP comparison filtering function. */ + ACMP_FilterInit(acmpHandle); + /* Set hysteresis voltage */ + HAL_ACMP_SetHystVol(acmpHandle, acmpHandle->hysteresisVol); + + BASE_FUNC_DELAY_US(150); /* After the configuration is complete, a delay of 150 us is required. */ + return BASE_STATUS_OK; +} + +/** + * @brief Comparator HAL DeInit + * @param acmpHandle: ACMP handle. + * @retval BASE_StatusType: OK, ERROR + */ +BASE_StatusType HAL_ACMP_DeInit(ACMP_Handle *acmpHandle) +{ + ACMP_ASSERT_PARAM(acmpHandle != NULL); + ACMP_ASSERT_PARAM(IsACMPInstance(acmpHandle->baseAddress)); + acmpHandle->baseAddress->ACMP_CTRL0.reg = BASE_CFG_DISABLE; /* Disable ACMP. */ + acmpHandle->baseAddress->ACMP_CTRL1.reg = BASE_CFG_DISABLE; /* Clears the input and output status. */ + acmpHandle->baseAddress->ACMP_CTRL2.reg = BASE_CFG_DISABLE; /* Clears the comparison result selection. */ + acmpHandle->baseAddress->ACMP_INTR.reg = BASE_CFG_DISABLE; /* Clear all interrrupt. */ + acmpHandle->userCallBack.AcmpEdgedCallBack = NULL; /* Clears all user callback functions. */ + acmpHandle->userCallBack.AcmpNegativeCallBack = NULL; + acmpHandle->userCallBack.AcmpPositiveCallBack = NULL; + return BASE_STATUS_OK; +} + +/** + * @brief Set hysteresis Voltage + * @param acmpHandle: ACMP handle. + * @param voltage: hysteresis voltage to be set. @ref ACMP_HystVol + * @retval None. + */ +void HAL_ACMP_SetHystVol(ACMP_Handle *acmpHandle, ACMP_HystVol voltage) +{ + ACMP_ASSERT_PARAM(acmpHandle != NULL); + ACMP_ASSERT_PARAM(IsACMPInstance(acmpHandle->baseAddress)); + ACMP_PARAM_CHECK_NO_RET(voltage >= ACMP_HYS_VOL_ZERO); + ACMP_PARAM_CHECK_NO_RET(voltage <= ACMP_HYS_VOL_30MV); + acmpHandle->baseAddress->ACMP_RSV.BIT.da_acmp_rsv = voltage; /* Hysteresis voltage setting. */ +} + +/** + * @brief Set blocking valid + * @param acmpHandle: ACMP handle. + * @retval None. + */ +void HAL_ACMP_BlkingValid(ACMP_Handle *acmpHandle) +{ + ACMP_ASSERT_PARAM(acmpHandle != NULL); + ACMP_ASSERT_PARAM(IsACMPInstance(acmpHandle->baseAddress)); + /* Enable Blocking function. */ + acmpHandle->baseAddress->ACMP_CTRL4.BIT.cfg_acmp_blk_en = BASE_CFG_ENABLE; +} + +/** + * @brief Set blocking invalid + * @param acmpHandle: ACMP handle. + * @retval None. + */ +void HAL_ACMP_BlkingInvalid(ACMP_Handle *acmpHandle) +{ + ACMP_ASSERT_PARAM(acmpHandle != NULL); + ACMP_ASSERT_PARAM(IsACMPInstance(acmpHandle->baseAddress)); + acmpHandle->baseAddress->ACMP_CTRL4.BIT.cfg_acmp_blk_en = BASE_CFG_DISABLE; /* Disable blocking function. */ +} + +/** + * @brief Sets the output result of ACMP. + * @param acmpHandle: ACMP handle. + * @param resultSelect: ACMP result output options. + * @retval BASE_StatusType: OK, ERROR. + */ +BASE_StatusType HAL_ACMP_ResultSelect(ACMP_Handle *acmpHandle, ACMP_ResultSelect resultSelect) +{ + ACMP_ASSERT_PARAM(acmpHandle != NULL); + ACMP_ASSERT_PARAM(IsACMPInstance(acmpHandle->baseAddress)); + ACMP_PARAM_CHECK_WITH_RET(IsACMPResultSeletion(resultSelect), BASE_STATUS_ERROR); + /* Output result selection of the comparator. */ + switch (resultSelect) { + case ACMP_RESULT_SIMULATION: + acmpHandle->baseAddress->ACMP_CTRL2.BIT.cfg_acmp_out_sel = 0x0; /* 0x0: Original comparison results. */ + break; + case ACMP_RESULT_FILTER: + acmpHandle->baseAddress->ACMP_CTRL2.BIT.cfg_acmp_out_sel = 0x1; /* 0x1: Resulter after filtering. */ + break; + case ACMP_RESULT_FILTER_BLOCK: + acmpHandle->baseAddress->ACMP_CTRL2.BIT.cfg_acmp_out_sel = 0x2; /* 0x2: Resulter after filtering + and blocking. */ + break; + default: + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief ACMP Interrupt service processing function. + * @param handle ACMP handle. + * @retval None. + */ +void HAL_ACMP_IrqHandler(void *handle) +{ + ACMP_ASSERT_PARAM(handle != NULL); + ACMP_Handle *acmpHandle = (ACMP_Handle *)handle; + ACMP_ASSERT_PARAM(IsACMPInstance(acmpHandle->baseAddress)); + /* Check interrupt type */ + if (acmpHandle->baseAddress->ACMP_INTR_MSK.BIT.intr_acmp_pos_msk == BASE_CFG_ENABLE) { + /* Rising Edge Interrupt. */ + acmpHandle->baseAddress->ACMP_INTR.reg = ACMP_POS_INTERUPT; /* Clears the rising edge interrupt. */ + /* Call the rising edge user interrupt function. */ + if (acmpHandle->userCallBack.AcmpPositiveCallBack != NULL) { + acmpHandle->userCallBack.AcmpPositiveCallBack(acmpHandle); + } + } + if (acmpHandle->baseAddress->ACMP_INTR_MSK.BIT.intr_acmp_neg_msk == BASE_CFG_ENABLE) { + /* Falling Edge Interrupt. */ + acmpHandle->baseAddress->ACMP_INTR.reg = ACMP_NEG_INTERUPT; /* Clears falling Edge Interrupt. */ + /* Call the falling edge user interrupt function. */ + if (acmpHandle->userCallBack.AcmpNegativeCallBack != NULL) { + acmpHandle->userCallBack.AcmpNegativeCallBack(acmpHandle); + } + } + if (acmpHandle->baseAddress->ACMP_INTR_MSK.BIT.intr_acmp_edge_msk == BASE_CFG_ENABLE) { + /* Flip edge interrupt. */ + acmpHandle->baseAddress->ACMP_INTR.reg = ACMP_EDGE_INTERRUPT; /* Clears Flip edge interrupt. */ + /* Call flip edge user interrupt function. */ + if (acmpHandle->userCallBack.AcmpEdgedCallBack != NULL) { + acmpHandle->userCallBack.AcmpEdgedCallBack(acmpHandle); + } + } + return; +} + +/** + * @brief Register the callback function of ACMP handle. + * @param acmpHandle Acmp Handle + * @param typeID CallBack function type of user, @ref ACMP_CallBackFun_Type + * @param callBackFunc CallBack function of user, @ref ACMM_CallBackType + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_ACMP_RegisterCallBack(ACMP_Handle *acmpHandle, ACMP_CallBackFun_Type typeID, + ACMP_CallBackType callBackFunc) +{ + ACMP_ASSERT_PARAM(acmpHandle != NULL); + ACMP_ASSERT_PARAM(callBackFunc != NULL); + ACMP_ASSERT_PARAM(IsACMPInstance(acmpHandle->baseAddress)); + /* Registers user callback function. */ + switch (typeID) { + case ACMP_POS_INT: /* Register rising edge user callback function */ + acmpHandle->userCallBack.AcmpPositiveCallBack = callBackFunc; + break; + case ACMP_NEG_INT: /* Register failing edge user callback function */ + acmpHandle->userCallBack.AcmpNegativeCallBack = callBackFunc; + break; + case ACMP_EDGE_INT: /* Register fliping edge user callback function */ + acmpHandle->userCallBack.AcmpEdgedCallBack = callBackFunc; + break; + default: + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/acmp/src/acmp_ex.c b/vendor/others/demo/5-tim_adc/demo/drivers/acmp/src/acmp_ex.c new file mode 100644 index 000000000..3ccc008a8 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/acmp/src/acmp_ex.c @@ -0,0 +1,45 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file acmp_ex.c + * @author MCU Driver Team + * @brief ACMP module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the acmp. + * + Set ACMP trim value functions. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "acmp_ex.h" + +/* Macro definitions ---------------------------------------------------------*/ +#define TRIM_MAX_VALUE 255 + +/** + * @brief Trim value setting + * @param acmpHandle acmp handle. + * @param trimValue trim value. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ACMP_SetTrimValueEx(ACMP_Handle *acmpHandle, unsigned char trimValue) +{ + ACMP_ASSERT_PARAM(acmpHandle != NULL); + ACMP_ASSERT_PARAM(IsACMPInstance(acmpHandle->baseAddress)); + ACMP_PARAM_CHECK_WITH_RET((trimValue < TRIM_MAX_VALUE), BASE_STATUS_ERROR); + acmpHandle->baseAddress->ACMP_TRIM.BIT.da_acmp_trim = trimValue; /* Trim value setting. */ + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/adc/common/inc/adc.h b/vendor/others/demo/5-tim_adc/demo/drivers/adc/common/inc/adc.h new file mode 100644 index 000000000..c32b8cae5 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/adc/common/inc/adc.h @@ -0,0 +1,128 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file adc.h + * @author MCU Driver Team + * @brief ADC module driver + * @details This file provides functions declaration of the ADC, + * + ADC initialization function. + * + Start ADC sample and conversion. + * + Start ADC sample and conversion with interrupt. + * + Start ADC sample and conversion with DMA. + * + Start ADC sample and conversion synchronously. + * + Query the ADC conversion result. + * + Single channel and multichannel software trigger functions. + * + Interrupt callback function and user registration function. + * This file also provides the definition of the ADC handle structure. + */ + +/* Macro definitions */ +#ifndef McuMagicTag_ADC_H +#define McuMagicTag_ADC_H + +#include "adc_ip.h" +#include "dma.h" +#include "dac.h" +#include "interrupt.h" + +/** + * @defgroup ADC ADC + * @brief ADC module. + * @{ + */ + +/** + * @defgroup ADC_Common ADC Common + * @brief ADC common external module. + * @{ + */ + +/** + * @defgroup ADC_Handle_Definition ADC Handle Definition + * @{ + */ + +/** + * @brief The definition of the ADC handle structure. + */ +typedef struct _ADC_Handle { + ADC_RegStruct *baseAddress; /**< ADC registers base address */ + ADC_PriorityMode socPriority; /**< ADC clock divider */ + DMA_Handle *dmaHandle; /**< ADC_DMA control */ + unsigned int adcDmaChn; /**< ADC_DMA channel */ + ADC_OverState overState; /**< ADC overflow state */ + struct { + unsigned short finishMode; /**< sample finish mode, defined in ADC_SOCFinishMode */ + } ADC_SOCxParam[SOC_MAX_NUM]; + struct { + unsigned short socxFinish; /**< After each SOC is completed, the corresponding bit is set as 1 */ + } ADC_IntxParam[INT_MAX_NUM]; + ADC_UserCallBack userCallBack; /**< ADC User Callback Function */ + ADC_ExtendHandle handleEx; /**< ADC extend handle */ +} ADC_Handle; + +/** + * @brief The definition of the ADC callback function. + */ +typedef void (* ADC_CallbackType)(void *handle); + +/** + * @} + */ + +/** + * @defgroup ADC_API_Declaration ADC HAL API + * @{ + */ +BASE_StatusType HAL_ADC_Init(ADC_Handle *adcHandle); +BASE_StatusType HAL_ADC_Deinit(ADC_Handle *adcHandle); +BASE_StatusType HAL_ADC_ConfigureSoc(ADC_Handle *adcHandle, ADC_SOCNumber soc, SOC_Param *socParam); +BASE_StatusType HAL_ADC_StartDma(ADC_Handle *adcHandle, unsigned int startSoc, + unsigned int endSoc, unsigned int *saveData); +BASE_StatusType HAL_ADC_StartIt(ADC_Handle *adcHandle); +BASE_StatusType HAL_ADC_SoftTrigMultiSample(ADC_Handle *adcHandle, ADC_SoftMultiTrig syncTrig); +BASE_StatusType HAL_ADC_SoftTrigSample(ADC_Handle *adcHandle, unsigned int soc); +unsigned int HAL_ADC_GetConvResult(ADC_Handle *adcHandle, unsigned int soc); +BASE_StatusType HAL_ADC_CheckSocFinish(ADC_Handle *adcHandle, unsigned int soc); +void HAL_ADC_RegisterCallBack(ADC_Handle *adcHandle, ADC_CallbackFunType typeID, ADC_CallbackType pCallback); +BASE_StatusType HAL_ADC_InitForVdda(ADC_RegStruct *adcx, ADC_SOCNumber soc, DAC_RegStruct *dacx, bool useDac); +float HAL_ADC_GetVddaByDac(ADC_RegStruct *adcx, ADC_SOCNumber soc, DAC_RegStruct *dacx, bool useDac); +unsigned int HAL_ADC_GetTransResultByVdda(ADC_RegStruct *adcx, ADC_SOCNumber soc, float vdda); +#if defined (CHIP_3061MNPICA) || defined (CHIP_3061MNPIKA) || defined (CHIP_3061MNPIC8) || defined (CHIP_3061MNPIK8) +void HAL_ADC_IrqHandlerInt0(void *handle); +#endif +void HAL_ADC_IrqHandlerInt1(void *handle); +void HAL_ADC_IrqHandlerInt2(void *handle); +void HAL_ADC_IrqHandlerInt3(void *handle); +#if defined (CHIP_3065HRPIRZ) || defined (CHIP_3065HRPICZ) || defined (CHIP_3061HRPIKZ) || \ + defined (AU302PDF51) || defined (AU302NDF51) || defined (AU301LDF51) || defined (CHIP_3065ARPIRZ) +void HAL_ADC_IrqHandlerInt4(void *handle); +#endif +void HAL_ADC_IrqHandlerOver(void *handle); +void HAL_ADC_IrqHandlerAllEvent(void *handle); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/adc/inc/adc_ex.h b/vendor/others/demo/5-tim_adc/demo/drivers/adc/inc/adc_ex.h new file mode 100644 index 000000000..afe259321 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/adc/inc/adc_ex.h @@ -0,0 +1,65 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file adc_ex.h + * @author MCU Driver Team + * @brief ADC module driver + * @details This file provides functions declaration of the ADC extend function. + */ + +/* Macro definitions */ +#ifndef McuMagicTag_ADC_EX_H +#define McuMagicTag_ADC_EX_H + +#include "adc.h" +#define ADC_ANA_MUX ((ADC_ANA_MUX_APB_RegStruct *)0x18003000) + +/** + * @addtogroup ADC_IP + * @{ + */ + +/** + * @defgroup ADC_EX_API_Declaration ADC HAL API EX + * @{ + */ +BASE_StatusType HAL_ADC_EnableSocCotinueModeEx(ADC_Handle *adcHandle, ADC_SOCNumber soc); +BASE_StatusType HAL_ADC_DisableSocCotinueModeEx(ADC_Handle *adcHandle, ADC_SOCNumber soc); +BASE_StatusType HAL_ADC_GetControllerStatusEx(ADC_Handle *adcHandle); +BASE_StatusType HAL_ADC_CheckOversamplingFinishEx(ADC_Handle *adcHandle); +unsigned int HAL_ADC_GetOversamplingResultEx(ADC_Handle *adcHandle); +BASE_StatusType HAL_ADC_ConfigureOversamplingEx(ADC_Handle *adcHandle, ADC_SOCNumber soc, ADC_OversamplingParam *param); +BASE_StatusType HAL_ADC_ConfigureWorkModeEx(ADC_Handle *adcHandle, ADC_WorkMode mode); +BASE_StatusType HAL_ADC_EnablePPBxEventIntEx(ADC_Handle *adcHandle); +BASE_StatusType HAL_ADC_DisablePPBxEventIntEx(ADC_Handle *adcHandle); +BASE_StatusType HAL_ADC_ConfigurePPBxEx(ADC_Handle *adcHandle, ADC_SOCNumber soc, ADC_PPBNumber ppb, + PPB_Function *fun); +BASE_StatusType HAL_ADC_SetPPBxOffsetEx(ADC_Handle *adcHandle, ADC_PPBNumber ppb, int offset); +BASE_StatusType HAL_ADC_SetPPBxThresholdEx(ADC_Handle *adcHandle, ADC_PPBNumber ppb, int up, int dn); +BASE_StatusType HAL_ADC_SetPPBxErrorRefEx(ADC_Handle *adcHandle, ADC_PPBNumber ppb, unsigned int ref); +int HAL_ADC_GetPPBxErrorResultEx(ADC_Handle *adcHandle, ADC_PPBNumber ppb); +unsigned int HAL_ADC_GetPPBxDelayCntEx(ADC_Handle *adcHandle, ADC_PPBNumber ppb); +BASE_StatusType HAL_ADC_InitForVddaEx(ADC_RegStruct *adcx, ADC_SOCNumber soc); +float HAL_ADC_GetVddaEx(ADC_RegStruct *adcx, ADC_SOCNumber soc); +/** + * @} + */ + +/** + * @} + */ +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/adc/inc/adc_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/adc/inc/adc_ip.h new file mode 100644 index 000000000..80882def2 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/adc/inc/adc_ip.h @@ -0,0 +1,3052 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file adc_ip.h + * @author MCU Driver Team + * @brief ADC module driver + * @details This file provides DCL functions to manage ADC and Definition of specific parameters. + * + Definition of ADC configuration parameters. + * + ADC register mapping structure. + * + Parameters check functions. + * + Direct configuration layer interface. + */ + +/* Macro definitions */ +#ifndef McuMagicTag_ADC_IP_H +#define McuMagicTag_ADC_IP_H + +#include "baseinc.h" + +#define SOC_MAX_NUM 16 +#define INT_MAX_NUM 4 +#define DMA_OVER_MASK 0x00010000 +#define INT_OVER_MASK 0x0000FFFF +#define EVENT_TYPE 16 + +#ifdef ADC_PARAM_CHECK +#define ADC_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define ADC_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define ADC_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define ADC_ASSERT_PARAM(para) ((void)0U) +#define ADC_PARAM_CHECK_NO_RET(para) ((void)0U) +#define ADC_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +/** + * @addtogroup ADC + * @{ + */ + +/** + * @defgroup ADC_IP ADC_IP + * @brief ADC_IP: adc_v1. + * @{ + */ + +/** + * @defgroup ADC_REG_Definition ADC Register Structure. + * @brief ADC Register Structure Definition. + * @{ + */ +/** + * @brief Define the union ADC_RESULT0_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_result0 : 12; /**< SOC0 Results */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_RESULT0_REG; + +/** + * @brief Define the union ADC_RESULT1_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_result1 : 12; /**< SOC1 Results */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_RESULT1_REG; + +/** + * @brief Define the union ADC_RESULT2_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_result2 : 12; /**< SOC2 Results */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_RESULT2_REG; + +/** + * @brief Define the union ADC_RESULT3_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_result3 : 12; /**< SOC3 Results */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_RESULT3_REG; + +/** + * @brief Define the union ADC_RESULT4_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_result4 : 12; /**< SOC4 Results */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_RESULT4_REG; + +/** + * @brief Define the union ADC_RESULT5_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_result5 : 12; /**< SOC5 Results */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_RESULT5_REG; + +/** + * @brief Define the union ADC_RESULT6_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_result6 : 12; /**< SOC6 Results */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_RESULT6_REG; + +/** + * @brief Define the union ADC_RESULT7_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_result7 : 12; /**< SOC7 Results */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_RESULT7_REG; + +/** + * @brief Define the union ADC_RESULT8_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_result8 : 12; /**< SOC8 Results */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_RESULT8_REG; + +/** + * @brief Define the union ADC_RESULT9_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_result9 : 12; /**< SOC9 Results */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_RESULT9_REG; + +/** + * @brief Define the union ADC_RESULT10_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_result10 : 12; /**< SOC10 Results */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_RESULT10_REG; + +/** + * @brief Define the union ADC_RESULT11_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_result11 : 12; /**< SOC11 Results */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_RESULT11_REG; + +/** + * @brief Define the union ADC_RESULT12_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_result12 : 12; /**< SOC12 Results */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_RESULT12_REG; + +/** + * @brief Define the union ADC_RESULT13_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_result13 : 12; /**< SOC13 Results */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_RESULT13_REG; + +/** + * @brief Define the union ADC_RESULT14_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_result14 : 12; /**< SOC14 Results */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_RESULT14_REG; + +/** + * @brief Define the union ADC_RESULT15_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_result15 : 12; /**< SOC15 Results */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_RESULT15_REG; + +/** + * @brief Define the union ADC_EOC_FLAG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int eoc0_flag : 1; /**< Status of eoc0. 0: conversion is not complete. 1: conversion is complete */ + unsigned int eoc1_flag : 1; /**< Status of eoc1. 0: conversion is not complete. 1: conversion is complete */ + unsigned int eoc2_flag : 1; /**< Status of eoc2. 0: conversion is not complete. 1: conversion is complete */ + unsigned int eoc3_flag : 1; /**< Status of eoc3. 0: conversion is not complete. 1: conversion is complete */ + unsigned int eoc4_flag : 1; /**< Status of eoc4. 0: conversion is not complete. 1: conversion is complete */ + unsigned int eoc5_flag : 1; /**< Status of eoc5. 0: conversion is not complete. 1: conversion is complete */ + unsigned int eoc6_flag : 1; /**< Status of eoc6. 0: conversion is not complete. 1: conversion is complete */ + unsigned int eoc7_flag : 1; /**< Status of eoc7. 0: conversion is not complete. 1: conversion is complete */ + unsigned int eoc8_flag : 1; /**< Status of eoc8. 0: conversion is not complete. 1: conversion is complete */ + unsigned int eoc9_flag : 1; /**< Status of eoc9. 0: conversion is not complete. 1: conversion is complete */ + unsigned int eoc10_flag : 1; /**< Status of eoc10. 0: conversion is not complete. 1: conversion is complete */ + unsigned int eoc11_flag : 1; /**< Status of eoc11. 0: conversion is not complete. 1: conversion is complete */ + unsigned int eoc12_flag : 1; /**< Status of eoc12. 0: conversion is not complete. 1: conversion is complete */ + unsigned int eoc13_flag : 1; /**< Status of eoc13. 0: conversion is not complete. 1: conversion is complete */ + unsigned int eoc14_flag : 1; /**< Status of eoc14. 0: conversion is not complete. 1: conversion is complete */ + unsigned int eoc15_flag : 1; /**< Status of eoc15. 0: conversion is not complete. 1: conversion is complete */ + unsigned int reserved0 : 16; + } BIT; +} volatile ADC_EOC_FLAG_REG; + +/** + * @brief Define the union ADC_SOC0_CFG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc0_ch_sel : 5; /**< Channel selection */ + unsigned int cfg_soc0_samptime_sel : 4; /**< Sampling Period Selection */ + unsigned int cfg_soc0_trig_sel : 5; /**< Trigger source selection */ + unsigned int cfg_soc0_cont_en : 1; /**< Continuous conversion mode enable bit */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_SOC0_CFG_REG; + +/** + * @brief Define the union ADC_SOC1_CFG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc1_ch_sel : 5; /**< Channel selection */ + unsigned int cfg_soc1_samptime_sel : 4; /**< Sampling Period Selection */ + unsigned int cfg_soc1_trig_sel : 5; /**< Trigger source selection */ + unsigned int cfg_soc1_cont_en : 1; /**< Continuous conversion mode enable bit */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_SOC1_CFG_REG; + +/** + * @brief Define the union ADC_SOC2_CFG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc2_ch_sel : 5; /**< Channel selection */ + unsigned int cfg_soc2_samptime_sel : 4; /**< Sampling Period Selection */ + unsigned int cfg_soc2_trig_sel : 5; /**< Trigger source selection */ + unsigned int cfg_soc2_cont_en : 1; /**< Continuous conversion mode enable bit */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_SOC2_CFG_REG; + +/** + * @brief Define the union ADC_SOC3_CFG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc3_ch_sel : 5; /**< Channel selection */ + unsigned int cfg_soc3_samptime_sel : 4; /**< Sampling Period Selection */ + unsigned int cfg_soc3_trig_sel : 5; /**< Trigger source selection */ + unsigned int cfg_soc3_cont_en : 1; /**< Continuous conversion mode enable bit */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_SOC3_CFG_REG; + +/** + * @brief Define the union ADC_SOC4_CFG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc4_ch_sel : 5; /**< Channel selection */ + unsigned int cfg_soc4_samptime_sel : 4; /**< Sampling Period Selection */ + unsigned int cfg_soc4_trig_sel : 5; /**< Trigger source selection */ + unsigned int cfg_soc4_cont_en : 1; /**< Continuous conversion mode enable bit */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_SOC4_CFG_REG; + +/** + * @brief Define the union ADC_SOC5_CFG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc5_ch_sel : 5; /**< Channel selection */ + unsigned int cfg_soc5_samptime_sel : 4; /**< Sampling Period Selection */ + unsigned int cfg_soc5_trig_sel : 5; /**< Trigger source selection */ + unsigned int cfg_soc5_cont_en : 1; /**< Continuous conversion mode enable bit */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_SOC5_CFG_REG; + +/** + * @brief Define the union ADC_SOC6_CFG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc6_ch_sel : 5; /**< Channel selection */ + unsigned int cfg_soc6_samptime_sel : 4; /**< Sampling Period Selection */ + unsigned int cfg_soc6_trig_sel : 5; /**< Trigger source selection */ + unsigned int cfg_soc6_cont_en : 1; /**< Continuous conversion mode enable bit */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_SOC6_CFG_REG; + +/** + * @brief Define the union ADC_SOC7_CFG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc7_ch_sel : 5; /**< Channel selection */ + unsigned int cfg_soc7_samptime_sel : 4; /**< Sampling Period Selection */ + unsigned int cfg_soc7_trig_sel : 5; /**< Trigger source selection */ + unsigned int cfg_soc7_cont_en : 1; /**< Continuous conversion mode enable bit */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_SOC7_CFG_REG; + +/** + * @brief Define the union ADC_SOC8_CFG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc8_ch_sel : 5; /**< Channel selection */ + unsigned int cfg_soc8_samptime_sel : 4; /**< Sampling Period Selection */ + unsigned int cfg_soc8_trig_sel : 5; /**< Trigger source selection */ + unsigned int cfg_soc8_cont_en : 1; /**< Continuous conversion mode enable bit */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_SOC8_CFG_REG; + +/** + * @brief Define the union ADC_SOC9_CFG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc9_ch_sel : 5; /**< Channel selection */ + unsigned int cfg_soc9_samptime_sel : 4; /**< Sampling Period Selection */ + unsigned int cfg_soc9_trig_sel : 5; /**< Trigger source selection */ + unsigned int cfg_soc9_cont_en : 1; /**< Continuous conversion mode enable bit */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_SOC9_CFG_REG; + +/** + * @brief Define the union ADC_SOC10_CFG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc10_ch_sel : 5; /**< Channel selection */ + unsigned int cfg_soc10_samptime_sel : 4; /**< Sampling Period Selection */ + unsigned int cfg_soc10_trig_sel : 5; /**< Trigger source selection */ + unsigned int cfg_soc10_cont_en : 1; /**< Continuous conversion mode enable bit */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_SOC10_CFG_REG; + +/** + * @brief Define the union ADC_SOC11_CFG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc11_ch_sel : 5; /**< Channel selection */ + unsigned int cfg_soc11_samptime_sel : 4; /**< Sampling Period Selection */ + unsigned int cfg_soc11_trig_sel : 5; /**< Trigger source selection */ + unsigned int cfg_soc11_cont_en : 1; /**< Continuous conversion mode enable bit */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_SOC11_CFG_REG; + +/** + * @brief Define the union ADC_SOC12_CFG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc12_ch_sel : 5; /**< Channel selection */ + unsigned int cfg_soc12_samptime_sel : 4; /**< Sampling Period Selection */ + unsigned int cfg_soc12_trig_sel : 5; /**< Trigger source selection */ + unsigned int cfg_soc12_cont_en : 1; /**< Continuous conversion mode enable bit */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_SOC12_CFG_REG; + +/** + * @brief Define the union ADC_SOC13_CFG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc13_ch_sel : 5; /**< Channel selection */ + unsigned int cfg_soc13_samptime_sel : 4; /**< Sampling Period Selection */ + unsigned int cfg_soc13_trig_sel : 5; /**< Trigger source selection */ + unsigned int cfg_soc13_cont_en : 1; /**< Continuous conversion mode enable bit */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_SOC13_CFG_REG; + +/** + * @brief Define the union ADC_SOC14_CFG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc14_ch_sel : 5; /**< Channel selection */ + unsigned int cfg_soc14_samptime_sel : 4; /**< Sampling Period Selection */ + unsigned int cfg_soc14_trig_sel : 5; /**< Trigger source selection */ + unsigned int cfg_soc14_cont_en : 1; /**< Continuous conversion mode enable bit */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_SOC14_CFG_REG; + +/** + * @brief Define the union ADC_SOC15_CFG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc15_ch_sel : 5; /**< Channel selection */ + unsigned int cfg_soc15_samptime_sel : 4; /**< Sampling Period Selection */ + unsigned int cfg_soc15_trig_sel : 5; /**< Trigger source selection */ + unsigned int cfg_soc15_cont_en : 1; /**< Continuous conversion mode enable bit */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_SOC15_CFG_REG; + +/** + * @brief Define the union ADC_SOFT_TRIG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc0_soft_trig : 1; /**< SOC0 triggered by software */ + unsigned int cfg_soc1_soft_trig : 1; /**< SOC1 triggered by software */ + unsigned int cfg_soc2_soft_trig : 1; /**< SOC2 triggered by software */ + unsigned int cfg_soc3_soft_trig : 1; /**< SOC3 triggered by software */ + unsigned int cfg_soc4_soft_trig : 1; /**< SOC4 triggered by software */ + unsigned int cfg_soc5_soft_trig : 1; /**< SOC5 triggered by software */ + unsigned int cfg_soc6_soft_trig : 1; /**< SOC6 triggered by software */ + unsigned int cfg_soc7_soft_trig : 1; /**< SOC7 triggered by software */ + unsigned int cfg_soc8_soft_trig : 1; /**< SOC8 triggered by software */ + unsigned int cfg_soc9_soft_trig : 1; /**< SOC9 triggered by software */ + unsigned int cfg_soc10_soft_trig : 1; /**< SOC10 triggered by software */ + unsigned int cfg_soc11_soft_trig : 1; /**< SOC11 triggered by software */ + unsigned int cfg_soc12_soft_trig : 1; /**< SOC12 triggered by software */ + unsigned int cfg_soc13_soft_trig : 1; /**< SOC13 triggered by software */ + unsigned int cfg_soc14_soft_trig : 1; /**< SOC14 triggered by software */ + unsigned int cfg_soc15_soft_trig : 1; /**< SOC15 triggered by software */ + unsigned int reserved0 : 16; + } BIT; +} volatile ADC_SOFT_TRIG_REG; + +/** + * @brief Define the union ADC_ARBT0_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_soc_priority : 16; /**< Priority configuration */ + unsigned int reserved0 : 16; + } BIT; +} volatile ADC_ARBT0_REG; + +/** + * @brief Define the union ADC_ARBT1_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_rr_pointer_reset : 1; /**< Reset Poll Pointer */ + unsigned int reserved0 : 31; + } BIT; +} volatile ADC_ARBT1_REG; + +/** + * @brief Define the union ADC_ARBT2_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int rr_pointer : 4; /**< Priority polling pointer */ + unsigned int reserved0 : 28; + } BIT; +} volatile ADC_ARBT2_REG; + +/** + * @brief Define the union ADC_OVERSAMP_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_oversamp_en : 1; /**< Oversampling enable bit */ + unsigned int reserved0 : 3; + unsigned int cfg_oversamp_soc_sel : 4; /**< Selecting a specified SoC for oversampling */ + unsigned int cfg_oversamp_n : 4; /**< Configuring the Oversampling Multiple */ + unsigned int cfg_oversamp_m : 4; /**< Oversampling precision truncation */ + unsigned int reserved1 : 16; + } BIT; +} volatile ADC_OVERSAMP_REG; + +/** + * @brief Define the union ADC_OVERSAMP_RESULT_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int oversamp_data : 16; /**< Oversampling result. The lower bits (12 to 16 bits) are valid */ + unsigned int reserved0 : 16; + } BIT; +} volatile ADC_OVERSAMP_RESULT_REG; + +/** + * @brief Define the union ADC_PPB0_CTRL0_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 1; + unsigned int cfg_ppb0_dly_en : 1; /**< Sampling delay count enable bit */ + unsigned int cfg_ppb0_offset_en : 1; /**< Offset result count enable */ + unsigned int cfg_ppb0_detect_en : 1; /**< Threshold detection enable */ + unsigned int cfg_ppb0_soc_sel : 4; /**< Select soc */ + unsigned int reserved1 : 12; + unsigned int cfg_ppb0_offset : 12; /**< set offset value. 1-bit sign bit, 11-bit integer bit */ + } BIT; +} volatile ADC_PPB0_CTRL0_REG; + +/** + * @brief Define the union ADC_PPB0_CTRL1_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_ppb0_dnlimit : 13; /**< Lower threshold of error detection */ + unsigned int cfg_ppb0_uplimit : 13; /**< Upper threshold of error detection */ + unsigned int reserved0 : 6; + } BIT; +} volatile ADC_PPB0_CTRL1_REG; + +/** + * @brief Define the union ADC_PPB0_CTRL2_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_ppb0_ref : 12; /**< Error reference value (unsigned number, 12-bit integer) */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_PPB0_CTRL2_REG; + +/** + * @brief Define the union ADC_PPB0_RESULT_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int ppb0_error_data : 13; /**< Error calculation result */ + unsigned int reserved0 : 3; + unsigned int ppb0_dly_stamp : 16; /**< Sample delay count value */ + } BIT; +} volatile ADC_PPB0_RESULT_REG; + +/** + * @brief Define the union ADC_PPB1_CTRL0_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 1; + unsigned int cfg_ppb1_dly_en : 1; /**< Sampling delay count enable bit */ + unsigned int cfg_ppb1_offset_en : 1; /**< Offset result count enable */ + unsigned int cfg_ppb1_detect_en : 1; /**< Threshold detection enable */ + unsigned int cfg_ppb1_soc_sel : 4; /**< Select soc */ + unsigned int reserved1 : 12; + unsigned int cfg_ppb1_offset : 12; /**< set offset value. 1-bit sign bit, 11-bit integer bit */ + } BIT; +} volatile ADC_PPB1_CTRL0_REG; + +/** + * @brief Define the union ADC_PPB1_CTRL1_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_ppb1_dnlimit : 13; /**< Lower threshold of error detection */ + unsigned int cfg_ppb1_uplimit : 13; /**< Upper threshold of error detection */ + unsigned int reserved0 : 6; + } BIT; +} volatile ADC_PPB1_CTRL1_REG; + +/** + * @brief Define the union ADC_PPB1_CTRL2_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_ppb1_ref : 12; /**< Error reference value (unsigned number, 12-bit integer) */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_PPB1_CTRL2_REG; + +/** + * @brief Define the union ADC_PPB1_RESULT_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int ppb1_error_data : 13; /**< Error calculation result */ + unsigned int reserved0 : 3; + unsigned int ppb1_dly_stamp : 16; /**< Sample delay count value */ + } BIT; +} volatile ADC_PPB1_RESULT_REG; + +/** + * @brief Define the union ADC_PPB2_CTRL0_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 1; + unsigned int cfg_ppb2_dly_en : 1; /**< Sampling delay count enable bit */ + unsigned int cfg_ppb2_offset_en : 1; /**< Offset result count enable */ + unsigned int cfg_ppb2_detect_en : 1; /**< Threshold detection enable */ + unsigned int cfg_ppb2_soc_sel : 4; /**< Select soc */ + unsigned int reserved1 : 12; + unsigned int cfg_ppb2_offset : 12; /**< set offset value. 1-bit sign bit, 11-bit integer bit */ + } BIT; +} volatile ADC_PPB2_CTRL0_REG; + +/** + * @brief Define the union ADC_PPB2_CTRL1_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_ppb2_dnlimit : 13; /**< Lower threshold of error detection */ + unsigned int cfg_ppb2_uplimit : 13; /**< Upper threshold of error detection */ + unsigned int reserved0 : 6; + } BIT; +} volatile ADC_PPB2_CTRL1_REG; + +/** + * @brief Define the union ADC_PPB2_CTRL2_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_ppb2_ref : 12; /**< Error reference value (unsigned number, 12-bit integer) */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_PPB2_CTRL2_REG; + +/** + * @brief Define the union ADC_PPB2_RESULT_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int ppb2_error_data : 13; /**< Error calculation result */ + unsigned int reserved0 : 3; + unsigned int ppb2_dly_stamp : 16; /**< Sample delay count value */ + } BIT; +} volatile ADC_PPB2_RESULT_REG; + +/** + * @brief Define the union ADC_PPB3_CTRL0_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 1; + unsigned int cfg_ppb3_dly_en : 1; /**< Sampling delay count enable bit */ + unsigned int cfg_ppb3_offset_en : 1; /**< Offset result count enable */ + unsigned int cfg_ppb3_detect_en : 1; /**< Threshold detection enable */ + unsigned int cfg_ppb3_soc_sel : 4; /**< Select soc */ + unsigned int reserved1 : 12; + unsigned int cfg_ppb3_offset : 12; /**< set offset value. 1-bit sign bit, 11-bit integer bit */ + } BIT; +} volatile ADC_PPB3_CTRL0_REG; + +/** + * @brief Define the union ADC_PPB3_CTRL1_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_ppb3_dnlimit : 13; /**< Lower threshold of error detection */ + unsigned int cfg_ppb3_uplimit : 13; /**< Upper threshold of error detection */ + unsigned int reserved0 : 6; + } BIT; +} volatile ADC_PPB3_CTRL1_REG; + +/** + * @brief Define the union ADC_PPB3_CTRL2_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_ppb3_ref : 12; /**< Error reference value (unsigned number, 12-bit integer) */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_PPB3_CTRL2_REG; + +/** + * @brief Define the union ADC_PPB3_RESULT_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int ppb3_error_data : 13; /**< Error calculation result */ + unsigned int reserved0 : 3; + unsigned int ppb3_dly_stamp : 16; /**< Sample delay count value */ + } BIT; +} volatile ADC_PPB3_RESULT_REG; + +/** + * @brief Define the union ADC_INT_DATA_0_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_intr_data_sel0 : 16; /**< Configuration SoC selection data completion interrupt 0 */ + unsigned int cfg_intr_data_sel1 : 16; /**< Configuration SoC selection data completion interrupt 1 */ + } BIT; +} volatile ADC_INT_DATA_0_REG; + +/** + * @brief Define the union ADC_INT_DATA_1_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_intr_data_sel2 : 16; /**< Configuration SoC selection data completion interrupt 2 */ + unsigned int cfg_intr_data_sel3 : 16; /**< Configuration SoC selection data completion interrupt 3 */ + } BIT; +} volatile ADC_INT_DATA_1_REG; + +/** + * @brief Define the union ADC_INT_DATA_FLAG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int intr_data_flag0 : 1; /**< Raw status of data completion interrupt 0 */ + unsigned int intr_data_flag1 : 1; /**< Raw status of data completion interrupt 1 */ + unsigned int intr_data_flag2 : 1; /**< Raw status of data completion interrupt 2 */ + unsigned int intr_data_flag3 : 1; /**< Raw status of data completion interrupt 3 */ + unsigned int reserved0 : 28; + } BIT; +} volatile ADC_INT_DATA_FLAG_REG; + +/** + * @brief Define the union ADC_INT_DATA_MSK_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int intr_data_flag0_msk : 1; /**< Masked interrupt status of data completion interrupt 0 */ + unsigned int intr_data_flag1_msk : 1; /**< Masked interrupt status of data completion interrupt 1 */ + unsigned int intr_data_flag2_msk : 1; /**< Masked interrupt status of data completion interrupt 2 */ + unsigned int intr_data_flag3_msk : 1; /**< Masked interrupt status of data completion interrupt 3 */ + unsigned int reserved0 : 28; + } BIT; +} volatile ADC_INT_DATA_MSK_REG; + +/* Define the union ADC_DATA_FLAG_MASK_REG */ +/** + * @brief Define the union ADC_INT_DATA_FLAG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int intr_data_flag0_mask : 1; /**< Interrupt mask flag of data completion interrupt 0 */ + unsigned int intr_data_flag1_mask : 1; /**< Interrupt mask flag of data completion interrupt 1 */ + unsigned int intr_data_flag2_mask : 1; /**< Interrupt mask flag of data completion interrupt 2 */ + unsigned int intr_data_flag3_mask : 1; /**< Interrupt mask flag of data completion interrupt 3 */ + unsigned int reserved0 : 28; + } BIT; +} volatile ADC_DATA_FLAG_MASK_REG; + +/** + * @brief Define the union ADC_EVENT_INT_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int intr_ppb0_zero_det : 1; /**< Raw status of PPB0 zero-crossing interrupt */ + unsigned int intr_ppb0_uplimit_det : 1; /**< Raw status of PPB0 up threshold interrupt */ + unsigned int intr_ppb0_dnlimit_det : 1; /**< Raw status of PPB0 down threshold interrupt */ + unsigned int intr_ppb0_error_data_vld : 1; /**< Raw status of PPB0 error calculation interrupt */ + unsigned int intr_ppb1_zero_det : 1; /**< Raw status of PPB1 zero-crossing interrupt */ + unsigned int intr_ppb1_uplimit_det : 1; /**< Raw status of PPB1 up threshold interrupt */ + unsigned int intr_ppb1_dnlimit_det : 1; /**< Raw status of PPB1 down threshold interrupt */ + unsigned int intr_ppb1_error_data_vld : 1; /**< Raw status of PPB1 error calculation interrupt */ + unsigned int intr_ppb2_zero_det : 1; /**< Raw status of PPB2 zero-crossing interrupt */ + unsigned int intr_ppb2_uplimit_det : 1; /**< Raw status of PPB2 up threshold interrupt */ + unsigned int intr_ppb2_dnlimit_det : 1; /**< Raw status of PPB2 down threshold interrupt */ + unsigned int intr_ppb2_error_data_vld : 1; /**< Raw status of PPB2 error calculation interrupt */ + unsigned int intr_ppb3_zero_det : 1; /**< Raw status of PPB3 zero-crossing interrupt */ + unsigned int intr_ppb3_uplimit_det : 1; /**< Raw status of PPB3 up threshold interrupt */ + unsigned int intr_ppb3_dnlimit_det : 1; /**< Raw status of PPB3 down threshold interrupt */ + unsigned int intr_ppb3_error_data_vld : 1; /**< Raw status of PPB3 error calculation interrupt */ + unsigned int intr_oversamp_data_vld : 1; /**< Raw status of oversampling completion interrupt */ + unsigned int intr_cali_done : 1; /**< Raw status of calibration completed interrupt */ + unsigned int reserved0 : 14; + } BIT; +} volatile ADC_EVENT_INT_REG; + +/** + * @brief Define the union ADC_EVENT_INT_MSK_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int intr_ppb0_zero_det_msk : 1; /**< Masked status of PPB0 zero-crossing interrupt */ + unsigned int intr_ppb0_uplimit_det_msk : 1; /**< Masked status of PPB0 up threshold interrupt */ + unsigned int intr_ppb0_dnlimit_det_msk : 1; /**< Masked status of PPB0 down threshold interrupt */ + unsigned int intr_ppb0_error_data_vld_msk : 1; /**< Masked status of PPB0 error calculation interrupt */ + unsigned int intr_ppb1_zero_det_msk : 1; /**< Masked status of PPB1 zero-crossing interrupt */ + unsigned int intr_ppb1_uplimit_det_msk : 1; /**< Masked status of PPB1 up threshold interrupt */ + unsigned int intr_ppb1_dnlimit_det_msk : 1; /**< Masked status of PPB1 down threshold interrupt */ + unsigned int intr_ppb1_error_data_vld_msk : 1; /**< Masked status of PPB1 error calculation interrupt */ + unsigned int intr_ppb2_zero_det_msk : 1; /**< Masked status of PPB2 zero-crossing interrupt */ + unsigned int intr_ppb2_uplimit_det_msk : 1; /**< Masked status of PPB2 up threshold interrupt */ + unsigned int intr_ppb2_dnlimit_det_msk : 1; /**< Masked status of PPB2 down threshold interrupt */ + unsigned int intr_ppb2_error_data_vld_msk : 1; /**< Masked status of PPB2 error calculation interrupt */ + unsigned int intr_ppb3_zero_det_msk : 1; /**< Masked status of PPB3 zero-crossing interrupt */ + unsigned int intr_ppb3_uplimit_det_msk : 1; /**< Masked status of PPB3 up threshold interrupt */ + unsigned int intr_ppb3_dnlimit_det_msk : 1; /**< Masked status of PPB3 down threshold interrupt */ + unsigned int intr_ppb3_error_data_vld_msk : 1; /**< Masked status of PPB3 error calculation interrupt */ + unsigned int intr_oversamp_data_vld_msk : 1; /**< Masked status of oversampling completion interrupt */ + unsigned int intr_cali_done_msk : 1; /**< Masked status of calibration completed interrupt */ + unsigned int reserved0 : 14; + } BIT; +} volatile ADC_EVENT_INT_MSK_REG; + +/** + * @brief Define the union ADC_EVENT_INT_MASK_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int intr_ppb0_zero_det_mask : 1; /**< Mask flag of PPB0 zero-crossing interrupt */ + unsigned int intr_ppb0_uplimit_det_mask : 1; /**< Mask flag of PPB0 up threshold interrupt */ + unsigned int intr_ppb0_dnlimit_det_mask : 1; /**< Mask flag of PPB0 down threshold interrupt */ + unsigned int intr_ppb0_error_data_vld_mask : 1; /**< Mask flag of PPB0 error calculation interrupt */ + unsigned int intr_ppb1_zero_det_mask : 1; /**< Mask flag of PPB1 zero-crossing interrupt */ + unsigned int intr_ppb1_uplimit_det_mask : 1; /**< Mask flag of PPB1 up threshold interrupt */ + unsigned int intr_ppb1_dnlimit_det_mask : 1; /**< Mask flag of PPB1 down threshold interrupt */ + unsigned int intr_ppb1_error_data_vld_mask : 1; /**< Mask flag of PPB1 error calculation interrupt */ + unsigned int intr_ppb2_zero_det_mask : 1; /**< Mask flag of PPB2 zero-crossing interrupt */ + unsigned int intr_ppb2_uplimit_det_mask : 1; /**< Mask flag of PPB2 up threshold interrupt */ + unsigned int intr_ppb2_dnlimit_det_mask : 1; /**< Mask flag of PPB2 down threshold interrupt */ + unsigned int intr_ppb2_error_data_vld_mask : 1; /**< Mask flag of PPB2 error calculation interrupt */ + unsigned int intr_ppb3_zero_det_mask : 1; /**< Mask flag of PPB3 zero-crossing interrupt */ + unsigned int intr_ppb3_uplimit_det_mask : 1; /**< Mask flag of PPB3 up threshold interrupt */ + unsigned int intr_ppb3_dnlimit_det_mask : 1; /**< Mask flag of PPB3 down threshold interrupt */ + unsigned int intr_ppb3_error_data_vld_mask : 1; /**< Mask flag of PPB3 error calculation interrupt */ + unsigned int intr_oversamp_data_vld_mask : 1; /**< Mask flag of oversampling completion interrupt */ + unsigned int intr_cali_done_mask : 1; /**< Mask flag of calibration completed interrupt */ + unsigned int reserved0 : 14; + } BIT; +} volatile ADC_EVENT_INT_MASK_REG; + +/** + * @brief Define the union ADC_ERR_INT_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int intr_soc0_trig_over_flag : 1; /**< Raw status of soc0 trigger overflow */ + unsigned int intr_soc1_trig_over_flag : 1; /**< Raw status of soc1 trigger overflow */ + unsigned int intr_soc2_trig_over_flag : 1; /**< Raw status of soc2 trigger overflow */ + unsigned int intr_soc3_trig_over_flag : 1; /**< Raw status of soc3 trigger overflow */ + unsigned int intr_soc4_trig_over_flag : 1; /**< Raw status of soc4 trigger overflow */ + unsigned int intr_soc5_trig_over_flag : 1; /**< Raw status of soc5 trigger overflow */ + unsigned int intr_soc6_trig_over_flag : 1; /**< Raw status of soc6 trigger overflow */ + unsigned int intr_soc7_trig_over_flag : 1; /**< Raw status of soc7 trigger overflow */ + unsigned int intr_soc8_trig_over_flag : 1; /**< Raw status of soc8 trigger overflow */ + unsigned int intr_soc9_trig_over_flag : 1; /**< Raw status of soc9 trigger overflow */ + unsigned int intr_soc10_trig_over_flag : 1; /**< Raw status of soc10 trigger overflow */ + unsigned int intr_soc11_trig_over_flag : 1; /**< Raw status of soc11 trigger overflow */ + unsigned int intr_soc12_trig_over_flag : 1; /**< Raw status of soc12 trigger overflow */ + unsigned int intr_soc13_trig_over_flag : 1; /**< Raw status of soc13 trigger overflow */ + unsigned int intr_soc14_trig_over_flag : 1; /**< Raw status of soc14 trigger overflow */ + unsigned int intr_soc15_trig_over_flag : 1; /**< Raw status of soc15 trigger overflow */ + unsigned int intr_dma_req_over_flag : 1; /**< Raw status of dma request overflow */ + unsigned int reserved0 : 15; + } BIT; +} volatile ADC_ERR_INT_REG; + +/** + * @brief Define the union ADC_ERR_INT_MSK_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int intr_soc0_trig_over_flag_msk : 1; /**< Masked status of soc0 trigger overflow */ + unsigned int intr_soc1_trig_over_flag_msk : 1; /**< Masked status of soc1 trigger overflow */ + unsigned int intr_soc2_trig_over_flag_msk : 1; /**< Masked status of soc2 trigger overflow */ + unsigned int intr_soc3_trig_over_flag_msk : 1; /**< Masked status of soc3 trigger overflow */ + unsigned int intr_soc4_trig_over_flag_msk : 1; /**< Masked status of soc4 trigger overflow */ + unsigned int intr_soc5_trig_over_flag_msk : 1; /**< Masked status of soc5 trigger overflow */ + unsigned int intr_soc6_trig_over_flag_msk : 1; /**< Masked status of soc6 trigger overflow */ + unsigned int intr_soc7_trig_over_flag_msk : 1; /**< Masked status of soc7 trigger overflow */ + unsigned int intr_soc8_trig_over_flag_msk : 1; /**< Masked status of soc8 trigger overflow */ + unsigned int intr_soc9_trig_over_flag_msk : 1; /**< Masked status of soc9 trigger overflow */ + unsigned int intr_soc10_trig_over_flag_msk : 1; /**< Masked status of soc10 trigger overflow */ + unsigned int intr_soc11_trig_over_flag_msk : 1; /**< Masked status of soc11 trigger overflow */ + unsigned int intr_soc12_trig_over_flag_msk : 1; /**< Masked status of soc12 trigger overflow */ + unsigned int intr_soc13_trig_over_flag_msk : 1; /**< Masked status of soc13 trigger overflow */ + unsigned int intr_soc14_trig_over_flag_msk : 1; /**< Masked status of soc14 trigger overflow */ + unsigned int intr_soc15_trig_over_flag_msk : 1; /**< Masked status of soc15 trigger overflow */ + unsigned int intr_dma_req_over_flag_msk : 1; /**< Masked status of dma request overflow */ + unsigned int reserved0 : 15; + } BIT; +} volatile ADC_ERR_INT_MSK_REG; + +/** + * @brief Define the union ADC_ERR_INT_MASK_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int intr_soc0_trig_over_flag_mask : 1; /**< Mask flag of soc0 trigger overflow */ + unsigned int intr_soc1_trig_over_flag_mask : 1; /**< Mask flag of soc1 trigger overflow */ + unsigned int intr_soc2_trig_over_flag_mask : 1; /**< Mask flag of soc2 trigger overflow */ + unsigned int intr_soc3_trig_over_flag_mask : 1; /**< Mask flag of soc3 trigger overflow */ + unsigned int intr_soc4_trig_over_flag_mask : 1; /**< Mask flag of soc4 trigger overflow */ + unsigned int intr_soc5_trig_over_flag_mask : 1; /**< Mask flag of soc5 trigger overflow */ + unsigned int intr_soc6_trig_over_flag_mask : 1; /**< Mask flag of soc6 trigger overflow */ + unsigned int intr_soc7_trig_over_flag_mask : 1; /**< Mask flag of soc7 trigger overflow */ + unsigned int intr_soc8_trig_over_flag_mask : 1; /**< Mask flag of soc8 trigger overflow */ + unsigned int intr_soc9_trig_over_flag_mask : 1; /**< Mask flag of soc9 trigger overflow */ + unsigned int intr_soc10_trig_over_flag_mask : 1; /**< Mask flag of soc10 trigger overflow */ + unsigned int intr_soc11_trig_over_flag_mask : 1; /**< Mask flag of soc11 trigger overflow */ + unsigned int intr_soc12_trig_over_flag_mask : 1; /**< Mask flag of soc12 trigger overflow */ + unsigned int intr_soc13_trig_over_flag_mask : 1; /**< Mask flag of soc13 trigger overflow */ + unsigned int intr_soc14_trig_over_flag_mask : 1; /**< Mask flag of soc14 trigger overflow */ + unsigned int intr_soc15_trig_over_flag_mask : 1; /**< Mask flag of soc15 trigger overflow */ + unsigned int intr_dma_req_over_flag_mask : 1; /**< Mask flag of dma request overflow */ + unsigned int reserved0 : 15; + } BIT; +} volatile ADC_ERR_INT_MASK_REG; + +/** + * @brief Define the union ADC_DMA_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_dma_soc_sel : 4; /**< Configuring the DMA function for a specified soc */ + unsigned int cfg_dma_sing_req_sel : 1; /**< DMA single request signal enable */ + unsigned int cfg_dma_brst_req_sel : 1; /**< DMA burst request signal enable */ + unsigned int reserved0 : 26; + } BIT; +} volatile ADC_DMA_REG; + +/** + * @brief Define the union ADC_EN_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_adc_en : 1; /**< ADC Controller Enable */ + unsigned int reserved0 : 31; + } BIT; +} volatile ADC_EN_REG; + +/** + * @brief Define the union ADC_EN_DLY_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_en_dly : 8; /**< Delay time after ADC is enabled (us) */ + unsigned int reserved0 : 24; + } BIT; +} volatile ADC_EN_DLY_REG; + +/** + * @brief Define the union ADC_MODE_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_adc_mode : 2; /**< ADC Operating Mode */ + unsigned int reserved0 : 30; + } BIT; +} volatile ADC_MODE_REG; + +/** + * @brief Define the union ADC_OEGE_CH_SEL_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_oege_ch_sel0 : 5; /**< Connection channel select, compensated by cfg_gain0/cfg_ofst0 */ + unsigned int reserved0 : 3; + unsigned int cfg_oege_ch_sel1 : 5; /**< Connection channel select, compensated by cfg_gain1/cfg_ofst1 */ + unsigned int reserved1 : 3; + unsigned int cfg_oege_ch_sel2 : 5; /**< Connection channel select, compensated by cfg_gain2/cfg_ofst2 */ + unsigned int reserved2 : 11; + } BIT; +} volatile ADC_OEGE_CH_SEL_REG; + +/** + * @brief Define the union ADC_OEGE_CTRL0_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_ofst0 : 12; /**< Set OE value. 1-bit sign bit, 10-bit integer bit, 1-bit decimal bit */ + unsigned int reserved0 : 4; + unsigned int cfg_gain0 : 13; /**< Set GE value. Unsigned number, 1-bit integer, 12-bit decimal */ + unsigned int reserved1 : 3; + } BIT; +} volatile ADC_OEGE_CTRL0_REG; + +/** + * @brief Define the union ADC_OEGE_CTRL1_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_ofst1 : 12; /**< Set OE value. 1-bit sign bit, 10-bit integer bit, 1-bit decimal bit */ + unsigned int reserved0 : 4; + unsigned int cfg_gain1 : 13; /**< Set GE value. Unsigned number, 1-bit integer, 12-bit decimal */ + unsigned int reserved1 : 3; + } BIT; +} volatile ADC_OEGE_CTRL1_REG; + +/** + * @brief Define the union ADC_OEGE_CTRL2_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_ofst2 : 12; /**< Set OE value. 1-bit sign bit, 10-bit integer bit, 1-bit decimal bit */ + unsigned int reserved0 : 4; + unsigned int cfg_gain2 : 13; /**< Set GE value. Unsigned number, 1-bit integer, 12-bit decimal */ + unsigned int reserved1 : 3; + } BIT; +} volatile ADC_OEGE_CTRL2_REG; + +/** + * @brief Define the union ADC_PROCESS0_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_ofst_cali : 12; /**< Level-2 offset compensation, 1-bit sign, 10-bit integer, 1-bit decimal */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_PROCESS0_REG; + +/** + * @brief Define the union ADC_PROCESS1_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_noise_add_en : 1; /**< Digital noise addition enable */ + unsigned int cfg_w_norm_sel : 1; + unsigned int cfg_noise_add_bits : 3; /**< Digital noise size */ + unsigned int reserved0 : 27; + } BIT; +} volatile ADC_PROCESS1_REG; + +/** + * @brief Define the union ADC_STATUS_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_busy : 1; /**< ADC working status */ + unsigned int reserved0 : 31; + } BIT; +} volatile ADC_STATUS_REG; + +/** + * @brief Define the union ADC_WEIGHT_CFG15_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_weight15 : 19; /**< Weight configuration value of capacitor 15 */ + unsigned int reserved0 : 13; + } BIT; +} volatile ADC_WEIGHT_CFG15_REG; + +/** + * @brief Define the union ADC_WEIGHT_CFG14_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_weight14 : 18; /**< Weight configuration value of capacitor 14 */ + unsigned int reserved0 : 14; + } BIT; +} volatile ADC_WEIGHT_CFG14_REG; + +/** + * @brief Define the union ADC_WEIGHT_CFG13_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_weight13 : 17; /**< Weight configuration value of capacitor 13 */ + unsigned int reserved0 : 15; + } BIT; +} volatile ADC_WEIGHT_CFG13_REG; + +/** + * @brief Define the union ADC_WEIGHT_CFG12_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_weight12 : 16; /**< Weight configuration value of capacitor 12 */ + unsigned int reserved0 : 16; + } BIT; +} volatile ADC_WEIGHT_CFG12_REG; + +/** + * @brief Define the union ADC_WEIGHT_CFG11_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_weight11 : 15; /**< Weight configuration value of capacitor 11 */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_WEIGHT_CFG11_REG; + +/** + * @brief Define the union ADC_WEIGHT_CFG10_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_weight10 : 15; /**< Weight configuration value of capacitor 10 */ + unsigned int reserved0 : 17; + } BIT; +} volatile ADC_WEIGHT_CFG10_REG; + +/** + * @brief Define the union ADC_WEIGHT_CFG9_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_weight9 : 14; /**< Weight configuration value of capacitor 9 */ + unsigned int reserved0 : 18; + } BIT; +} volatile ADC_WEIGHT_CFG9_REG; + +/** + * @brief Define the union ADC_WEIGHT_CFG8_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_weight8 : 13; /**< Weight configuration value of capacitor 8 */ + unsigned int reserved0 : 19; + } BIT; +} volatile ADC_WEIGHT_CFG8_REG; + +/** + * @brief Define the union ADC_WEIGHT_CFG7_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_weight7 : 12; /**< Weight configuration value of capacitor 7 */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_WEIGHT_CFG7_REG; + +/** + * @brief Define the union ADC_WEIGHT_CFG6_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_weight6 : 12; /**< Weight configuration value of capacitor 6 */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_WEIGHT_CFG6_REG; + +/** + * @brief Define the union ADC_WEIGHT_CFG5_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_weight5 : 11; /**< Weight configuration value of capacitor 5 */ + unsigned int reserved0 : 21; + } BIT; +} volatile ADC_WEIGHT_CFG5_REG; + +/** + * @brief Define the union ADC_WEIGHT_CFG4_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_weight4 : 10; /**< Weight configuration value of capacitor 4 */ + unsigned int reserved0 : 22; + } BIT; +} volatile ADC_WEIGHT_CFG4_REG; + +/** + * @brief Define the union ADC_WEIGHT_CFG3_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_weight3 : 9; /**< Weight configuration value of capacitor 3 */ + unsigned int reserved0 : 23; + } BIT; +} volatile ADC_WEIGHT_CFG3_REG; + +/** + * @brief Define the union ADC_CAP_TRG_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_mode1_start : 1; /**< Trigger logic auto-calibration weight value */ + unsigned int cfg_weight_ini : 1; /**< Initialize the weight and load the weight value */ + unsigned int reserved0 : 30; + } BIT; +} volatile ADC_CAP_TRG_REG; + +/** + * @brief Define the union ADC_CAP_M1_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_mode1_acc_sel : 3; /**< Mode 1 Accumulated Times Selection */ + unsigned int cfg_cap_index : 4; /**< Mode 1 Start Capacitor Configuration */ + unsigned int cfg_weight_limit_sel : 3; /**< Weight upper and lower limit gear selection */ + unsigned int cfg_mode1_caplsb_sel : 1; /**< Mode 1 low-bit capacitor enable */ + unsigned int cfg_weight_limit_bypass : 1; /**< Weight upper and lower threshold bypass enable */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_CAP_M1_REG; + +/** + * @brief Define the union ADC_ANA_CTRL0_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_inmux_en : 1; /**< Channel selection control enable signal */ + unsigned int cfg_comp_chop_en : 1; /**< Chopper enable signal of the ADC comparator */ + unsigned int cfg_latch_dly_sel : 1; /**< Sets whether to delay one cycle. */ + unsigned int cfg_muxtime_sel : 2; /**< Channel early switch period selection */ + unsigned int reserved0 : 11; + unsigned int cfg_sar_comp : 4; /**< ADC COMP reserved register */ + unsigned int cfg_sar_vcm : 4; /**< ADC VCM reserved register */ + unsigned int cfg_sar_vref : 4; /**< ADC VREF reserved register */ + unsigned int cfg_sar_samp_cap_sel : 4; /**< Number of ADC sampling capacitors */ + } BIT; +} volatile ADC_ANA_CTRL0_REG; + +/** + * @brief Define the union ADC_AVDD_EN_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_avdd_en : 1; /**< ADC inner channel AVDD/3 control register */ + unsigned int reserved0 : 31; + } BIT; +} volatile ADC_AVDD_EN_REG; + +/** + * @brief Define the union ADC_TSENSOR_TRIM_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_tsensor_ofst_trim : 12; /**< Tsensor offset compensation trim value */ + unsigned int reserved0 : 20; + } BIT; +} volatile ADC_TSENSOR_TRIM_REG; + +/** + * @brief Define the union ADC_OEGE_TRIM_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_ofst_cali_trim : 12; /**< ADC General Gain Calibration Trim Value */ + unsigned int reserved0 : 4; + unsigned int cfg_gain_cali_trim : 13; /**< ADC general offset calibration trim value */ + unsigned int reserved1 : 3; + } BIT; +} volatile ADC_OEGE_TRIM_REG; + +/** + * @brief Define the union ADC_PGA0_OEGE_TRIM0_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_pga0_ofst_trim2 : 12; /**< Gain calibration trim value */ + unsigned int reserved0 : 4; + unsigned int cfg_pga0_gain_trim2 : 13; /**< Offset calibration trim value */ + unsigned int reserved1 : 3; + } BIT; +} volatile ADC_PGA0_OEGE_TRIM0_REG; + +/** + * @brief Define the union ADC_PGA0_OEGE_TRIM1_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_pga0_ofst_trim4 : 12; /**< Gain calibration trim value */ + unsigned int reserved0 : 4; + unsigned int cfg_pga0_gain_trim4 : 13; /**< Offset calibration trim value */ + unsigned int reserved1 : 3; + } BIT; +} volatile ADC_PGA0_OEGE_TRIM1_REG; + +/** + * @brief Define the union ADC_PGA0_OEGE_TRIM2_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_pga0_ofst_trim8 : 12; /**< Gain calibration trim value */ + unsigned int reserved0 : 4; + unsigned int cfg_pga0_gain_trim8 : 13; /**< Offset calibration trim value */ + unsigned int reserved1 : 3; + } BIT; +} volatile ADC_PGA0_OEGE_TRIM2_REG; + +/** + * @brief Define the union ADC_PGA0_OEGE_TRIM3_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_pga0_ofst_trim16 : 12; /**< Gain calibration trim value */ + unsigned int reserved0 : 4; + unsigned int cfg_pga0_gain_trim16 : 13; /**< Offset calibration trim value */ + unsigned int reserved1 : 3; + } BIT; +} volatile ADC_PGA0_OEGE_TRIM3_REG; + +/** + * @brief Define the union ADC_PGA1_OEGE_TRIM0_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_pga1_ofst_trim2 : 12; /**< Gain calibration trim value */ + unsigned int reserved0 : 4; + unsigned int cfg_pga1_gain_trim2 : 13; /**< Offset calibration trim value */ + unsigned int reserved1 : 3; + } BIT; +} volatile ADC_PGA1_OEGE_TRIM0_REG; + +/** + * @brief Define the union ADC_PGA1_OEGE_TRIM1_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_pga1_ofst_trim4 : 12; /**< Gain calibration trim value */ + unsigned int reserved0 : 4; + unsigned int cfg_pga1_gain_trim4 : 13; /**< Offset calibration trim value */ + unsigned int reserved1 : 3; + } BIT; +} volatile ADC_PGA1_OEGE_TRIM1_REG; + +/** + * @brief Define the union ADC_PGA1_OEGE_TRIM2_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_pga1_ofst_trim8 : 12; /**< Gain calibration trim value */ + unsigned int reserved0 : 4; + unsigned int cfg_pga1_gain_trim8 : 13; /**< Offset calibration trim value */ + unsigned int reserved1 : 3; + } BIT; +} volatile ADC_PGA1_OEGE_TRIM2_REG; + +/** + * @brief Define the union ADC_PGA1_OEGE_TRIM3_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_pga1_ofst_trim16 : 12; /**< Gain calibration trim value */ + unsigned int reserved0 : 4; + unsigned int cfg_pga1_gain_trim16 : 13; /**< Offset calibration trim value */ + unsigned int reserved1 : 3; + } BIT; +} volatile ADC_PGA1_OEGE_TRIM3_REG; + +/** + * @brief Define the union ADC_ANA_TRIM_REG + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_sar_trim0 : 8; /**< ADC analog trim register 0 */ + unsigned int cfg_sar_trim1 : 8; /**< ADC analog trim register 1 */ + unsigned int reserved0 : 16; + } BIT; +} volatile ADC_ANA_TRIM_REG; + +/** + * @brief Define the ADC_RegStruct + */ +typedef struct { + ADC_RESULT0_REG ADC_RESULT0; /**< Offset address: 0x00000000U, Result register0 */ + ADC_RESULT1_REG ADC_RESULT1; /**< Offset address: 0x00000004U, Result register1 */ + ADC_RESULT2_REG ADC_RESULT2; /**< Offset address: 0x00000008U, Result register2 */ + ADC_RESULT3_REG ADC_RESULT3; /**< Offset address: 0x0000000CU, Result register3 */ + ADC_RESULT4_REG ADC_RESULT4; /**< Offset address: 0x00000010U, Result register4 */ + ADC_RESULT5_REG ADC_RESULT5; /**< Offset address: 0x00000014U, Result register5 */ + ADC_RESULT6_REG ADC_RESULT6; /**< Offset address: 0x00000018U, Result register6 */ + ADC_RESULT7_REG ADC_RESULT7; /**< Offset address: 0x0000001CU, Result register7 */ + ADC_RESULT8_REG ADC_RESULT8; /**< Offset address: 0x00000020U, Result register8 */ + ADC_RESULT9_REG ADC_RESULT9; /**< Offset address: 0x00000024U, Result register9 */ + ADC_RESULT10_REG ADC_RESULT10; /**< Offset address: 0x00000028U, Result register10 */ + ADC_RESULT11_REG ADC_RESULT11; /**< Offset address: 0x0000002CU, Result register11 */ + ADC_RESULT12_REG ADC_RESULT12; /**< Offset address: 0x00000030U, Result register12 */ + ADC_RESULT13_REG ADC_RESULT13; /**< Offset address: 0x00000034U, Result register13 */ + ADC_RESULT14_REG ADC_RESULT14; /**< Offset address: 0x00000038U, Result register14 */ + ADC_RESULT15_REG ADC_RESULT15; /**< Offset address: 0x0000003CU, Result register15 */ + unsigned int space0[12]; + ADC_EOC_FLAG_REG ADC_EOC_FLAG; /**< Offset address: 0x00000070U, EOC status register */ + unsigned int space1[35]; + ADC_SOC0_CFG_REG ADC_SOC0_CFG; /**< Offset address: 0x00000100U, SOC0 configuration register */ + ADC_SOC1_CFG_REG ADC_SOC1_CFG; /**< Offset address: 0x00000104U, SOC1 configuration register */ + ADC_SOC2_CFG_REG ADC_SOC2_CFG; /**< Offset address: 0x00000108U, SOC2 configuration register */ + ADC_SOC3_CFG_REG ADC_SOC3_CFG; /**< Offset address: 0x0000010CU, SOC3 configuration register */ + ADC_SOC4_CFG_REG ADC_SOC4_CFG; /**< Offset address: 0x00000110U, SOC4 configuration register */ + ADC_SOC5_CFG_REG ADC_SOC5_CFG; /**< Offset address: 0x00000114U, SOC5 configuration register */ + ADC_SOC6_CFG_REG ADC_SOC6_CFG; /**< Offset address: 0x00000118U, SOC6 configuration register */ + ADC_SOC7_CFG_REG ADC_SOC7_CFG; /**< Offset address: 0x0000011CU, SOC7 configuration register */ + ADC_SOC8_CFG_REG ADC_SOC8_CFG; /**< Offset address: 0x00000120U, SOC8 configuration register */ + ADC_SOC9_CFG_REG ADC_SOC9_CFG; /**< Offset address: 0x00000124U, SOC9 configuration register */ + ADC_SOC10_CFG_REG ADC_SOC10_CFG; /**< Offset address: 0x00000128U, SOC10 configuration register */ + ADC_SOC11_CFG_REG ADC_SOC11_CFG; /**< Offset address: 0x0000012CU, SOC11 configuration register */ + ADC_SOC12_CFG_REG ADC_SOC12_CFG; /**< Offset address: 0x00000130U, SOC12 configuration register */ + ADC_SOC13_CFG_REG ADC_SOC13_CFG; /**< Offset address: 0x00000134U, SOC13 configuration register */ + ADC_SOC14_CFG_REG ADC_SOC14_CFG; /**< Offset address: 0x00000138U, SOC14 configuration register */ + ADC_SOC15_CFG_REG ADC_SOC15_CFG; /**< Offset address: 0x0000013CU, SOC15 configuration register */ + unsigned int space2[8]; + ADC_SOFT_TRIG_REG ADC_SOFT_TRIG; /**< Offset address: 0x00000160U, Software trigger register */ + unsigned int space3[39]; + ADC_ARBT0_REG ADC_ARBT0; /**< Offset address: 0x00000200U, Priority register0 */ + ADC_ARBT1_REG ADC_ARBT1; /**< Offset address: 0x00000204U, Priority register1 */ + ADC_ARBT2_REG ADC_ARBT2; /**< Offset address: 0x00000208U, Priority register2 */ + unsigned int space4[5]; + ADC_OVERSAMP_REG ADC_OVERSAMP; /**< Offset address: 0x00000220U, Oversampling setting register */ + ADC_OVERSAMP_RESULT_REG ADC_OVERSAMP_RESULT; /**< Offset address: 0x00000224U, Oversampling result register */ + unsigned int space5[10]; + ADC_PPB0_CTRL0_REG ADC_PPB0_CTRL0; /**< Offset address: 0x00000250U, PPB0 configuration register0 */ + ADC_PPB0_CTRL1_REG ADC_PPB0_CTRL1; /**< Offset address: 0x00000254U, PPB0 configuration register1 */ + ADC_PPB0_CTRL2_REG ADC_PPB0_CTRL2; /**< Offset address: 0x00000258U, PPB0 configuration register2 */ + ADC_PPB0_RESULT_REG ADC_PPB0_RESULT; /**< Offset address: 0x0000025CU, PPB0 result register */ + ADC_PPB1_CTRL0_REG ADC_PPB1_CTRL0; /**< Offset address: 0x00000260U, PPB1 configuration register0 */ + ADC_PPB1_CTRL1_REG ADC_PPB1_CTRL1; /**< Offset address: 0x00000264U, PPB1 configuration register1 */ + ADC_PPB1_CTRL2_REG ADC_PPB1_CTRL2; /**< Offset address: 0x00000268U, PPB1 configuration register2 */ + ADC_PPB1_RESULT_REG ADC_PPB1_RESULT; /**< Offset address: 0x0000026CU, PPB1 result register */ + ADC_PPB2_CTRL0_REG ADC_PPB2_CTRL0; /**< Offset address: 0x00000270U, PPB2 configuration register0 */ + ADC_PPB2_CTRL1_REG ADC_PPB2_CTRL1; /**< Offset address: 0x00000274U, PPB2 configuration register1 */ + ADC_PPB2_CTRL2_REG ADC_PPB2_CTRL2; /**< Offset address: 0x00000278U, PPB2 configuration register2 */ + ADC_PPB2_RESULT_REG ADC_PPB2_RESULT; /**< Offset address: 0x0000027CU, PPB2 result register */ + ADC_PPB3_CTRL0_REG ADC_PPB3_CTRL0; /**< Offset address: 0x00000280U, PPB3 configuration register0 */ + ADC_PPB3_CTRL1_REG ADC_PPB3_CTRL1; /**< Offset address: 0x00000284U, PPB3 configuration register1 */ + ADC_PPB3_CTRL2_REG ADC_PPB3_CTRL2; /**< Offset address: 0x00000288U, PPB3 configuration register2 */ + ADC_PPB3_RESULT_REG ADC_PPB3_RESULT; /**< Offset address: 0x0000028CU, PPB3 result register */ + unsigned int space6[8]; + ADC_INT_DATA_0_REG ADC_INT_DATA_0; /**< Offset address: 0x000002B0U, Data interrupt register0 */ + ADC_INT_DATA_1_REG ADC_INT_DATA_1; /**< Offset address: 0x000002B4U, Data interrupt register1 */ + ADC_INT_DATA_FLAG_REG ADC_INT_DATA_FLAG; /**< Offset address: 0x000002B8U, Raw data interrupt register */ + ADC_INT_DATA_MSK_REG ADC_INT_DATA_MSK; /**< Offset address: 0x000002BCU, Masked data interrupt register */ + ADC_DATA_FLAG_MASK_REG ADC_DATA_FLAG_MASK; /**< Offset address: 0x000002C0U, Data interrupt mask register */ + ADC_EVENT_INT_REG ADC_EVENT_INT; /**< Offset address: 0x000002C4U, Raw event interrupt register */ + ADC_EVENT_INT_MSK_REG ADC_EVENT_INT_MSK; /**< Offset address: 0x000002C8U, Masked event interrupt register */ + ADC_EVENT_INT_MASK_REG ADC_EVENT_INT_MASK; /**< Offset address: 0x000002CCU, Event interrupt mask register */ + ADC_ERR_INT_REG ADC_ERR_INT; /**< Offset address: 0x000002D0U, Raw error interrupt register */ + ADC_ERR_INT_MSK_REG ADC_ERR_INT_MSK; /**< Offset address: 0x000002D4U, Masked error interrupt register */ + ADC_ERR_INT_MASK_REG ADC_ERR_INT_MASK; /**< Offset address: 0x000002D8U, Error interrupt mask register */ + unsigned int space7[5]; + ADC_DMA_REG ADC_DMA; /**< Offset address: 0x000002F0U, DMA configuration register */ + unsigned int space8[3]; + ADC_EN_REG ADC_EN; /**< Offset address: 0x00000300U, Enable Register */ + unsigned int space9[3]; + ADC_EN_DLY_REG ADC_EN_DLY; /**< Offset address: 0x00000310U, Enable Delay Register */ + unsigned int space10[59]; + ADC_MODE_REG ADC_MODE; /**< Offset address: 0x00000400U, Mode configuration register */ + unsigned int space11[7]; + ADC_OEGE_CH_SEL_REG ADC_OEGE_CH_SEL; /**< Offset address: 0x00000420U, OE and GE channel register */ + unsigned int space12[7]; + ADC_OEGE_CTRL0_REG ADC_OEGE_CTRL0; /**< Offset address: 0x00000440U, OE and GE configuration register0 */ + ADC_OEGE_CTRL1_REG ADC_OEGE_CTRL1; /**< Offset address: 0x00000444U, OE and GE configuration register1 */ + ADC_OEGE_CTRL2_REG ADC_OEGE_CTRL2; /**< Offset address: 0x00000448U, OE and GE configuration register2 */ + unsigned int space13[5]; + ADC_PROCESS0_REG ADC_PROCESS0; /**< Offset address: 0x00000460U, Data processing register0 */ + ADC_PROCESS1_REG ADC_PROCESS1; /**< Offset address: 0x00000464U, Data processing register1 */ + unsigned int space14[6]; + ADC_STATUS_REG ADC_STATUS; /**< Offset address: 0x00000480U, ADC status register */ + unsigned int space15[31]; + ADC_WEIGHT_CFG15_REG ADC_WEIGHT_CFG15; /**< Offset address: 0x00000500U, Capacitor weight register */ + ADC_WEIGHT_CFG14_REG ADC_WEIGHT_CFG14; /**< Offset address: 0x00000504U, Capacitor weight register */ + ADC_WEIGHT_CFG13_REG ADC_WEIGHT_CFG13; /**< Offset address: 0x00000508U, Capacitor weight register */ + ADC_WEIGHT_CFG12_REG ADC_WEIGHT_CFG12; /**< Offset address: 0x0000050CU, Capacitor weight register */ + ADC_WEIGHT_CFG11_REG ADC_WEIGHT_CFG11; /**< Offset address: 0x00000510U, Capacitor weight register */ + ADC_WEIGHT_CFG10_REG ADC_WEIGHT_CFG10; /**< Offset address: 0x00000514U, Capacitor weight register */ + ADC_WEIGHT_CFG9_REG ADC_WEIGHT_CFG9; /**< Offset address: 0x00000518U, Capacitor weight register */ + ADC_WEIGHT_CFG8_REG ADC_WEIGHT_CFG8; /**< Offset address: 0x0000051CU, Capacitor weight register */ + ADC_WEIGHT_CFG7_REG ADC_WEIGHT_CFG7; /**< Offset address: 0x00000520U, Capacitor weight register */ + ADC_WEIGHT_CFG6_REG ADC_WEIGHT_CFG6; /**< Offset address: 0x00000524U, Capacitor weight register */ + ADC_WEIGHT_CFG5_REG ADC_WEIGHT_CFG5; /**< Offset address: 0x00000528U, Capacitor weight register */ + ADC_WEIGHT_CFG4_REG ADC_WEIGHT_CFG4; /**< Offset address: 0x0000052CU, Capacitor weight register */ + ADC_WEIGHT_CFG3_REG ADC_WEIGHT_CFG3; /**< Offset address: 0x00000530U, Capacitor weight register */ + unsigned int space16[3]; + ADC_CAP_TRG_REG ADC_CAP_TRG; /**< Offset address: 0x00000540U, Calibration enable register */ + unsigned int space17[3]; + ADC_CAP_M1_REG ADC_CAP_M1; /**< Offset address: 0x00000550U, Capacitor calibration register */ + unsigned int space18[64]; + ADC_ANA_CTRL0_REG ADC_ANA_CTRL0; /**< Offset address: 0x00000654U, Analog register0 */ + ADC_AVDD_EN_REG ADC_AVDD_EN; /**< Offset address: 0x00000658U, AVDD/3 enable register0 */ + unsigned int space19[106]; + ADC_TSENSOR_TRIM_REG ADC_TSENSOR_TRIM; /**< Offset address: 0x00000800U, Tsensor trim register */ + ADC_OEGE_TRIM_REG ADC_OEGE_TRIM; /**< Offset address: 0x00000804U, OE and GE common trim register */ + unsigned int space20[2]; + ADC_PGA0_OEGE_TRIM0_REG ADC_PGA0_OEGE_TRIM0; /**< Offset address: 0x00000810U, PGA0 OE and GE trim register0 */ + ADC_PGA0_OEGE_TRIM1_REG ADC_PGA0_OEGE_TRIM1; /**< Offset address: 0x00000814U, PGA0 OE and GE trim register1 */ + ADC_PGA0_OEGE_TRIM2_REG ADC_PGA0_OEGE_TRIM2; /**< Offset address: 0x00000818U, PGA0 OE and GE trim register2 */ + ADC_PGA0_OEGE_TRIM3_REG ADC_PGA0_OEGE_TRIM3; /**< Offset address: 0x0000081CU, PGA0 OE and GE trim register3 */ + ADC_PGA1_OEGE_TRIM0_REG ADC_PGA1_OEGE_TRIM0; /**< Offset address: 0x00000820U, PGA1 OE and GE trim register0 */ + ADC_PGA1_OEGE_TRIM1_REG ADC_PGA1_OEGE_TRIM1; /**< Offset address: 0x00000824U, PGA1 OE and GE trim register1 */ + ADC_PGA1_OEGE_TRIM2_REG ADC_PGA1_OEGE_TRIM2; /**< Offset address: 0x00000828U, PGA1 OE and GE trim register2 */ + ADC_PGA1_OEGE_TRIM3_REG ADC_PGA1_OEGE_TRIM3; /**< Offset address: 0x0000082CU, PGA1 OE and GE trim register3 */ + unsigned int space21[4]; + ADC_ANA_TRIM_REG ADC_ANA_TRIM; /**< Offset address: 0x00000840U, Analog trim register */ +} volatile ADC_RegStruct; +/** + * @} + */ + +/** + * @defgroup ADC_Param_Def ADC Parameters Definition + * @brief Description of ADC configuration parameters. + * @{ + */ + +/** + * @brief ADC sample input. + * @details Channel type: + * + ADC_CH_ADCINA0 -- ADCIN0 is converted, number 0 + * + ADC_CH_ADCINA1 -- ADCIN1 is converted, number 1 + * + ADC_CH_ADCINA2 -- ADCIN2 is converted, number 2 + * + ADC_CH_ADCINA3 -- ADCIN3 is converted, number 3 + * + ADC_CH_ADCINA4 -- ADCIN4 is converted, number 4 + * + ADC_CH_ADCINA5 -- ADCIN5 is converted, number 5 + * + ADC_CH_ADCINA6 -- ADCIN6 is converted, number 6 + * + ADC_CH_ADCINA7 -- ADCIN7 is converted, number 7 + * + ADC_CH_ADCINA8 -- ADCIN8 is converted, number 8 + * + ADC_CH_ADCINA9 -- ADCIN9 is converted, number 9 + * + ADC_CH_ADCINA10 -- ADCIN10 is converted, number 10 + * + ADC_CH_ADCINA11 -- ADCIN11 is converted, number 11 + * + ADC_CH_ADCINA12 -- ADCIN12 is converted, number 12 + * + ADC_CH_ADCINA13 -- ADCIN13 is converted, number 13 + * + ADC_CH_ADCINA14 -- ADCIN14 is converted, number 14 + * + ADC_CH_ADCINA15 -- ADCIN15 is converted, number 15 + * + ADC_CH_ADCINA16 -- ADCIN16 is converted, number 16 + * + ADC_CH_ADCINA17 -- ADCIN17 is converted, number 17 + * + ADC_CH_ADCINA18 -- ADCIN18 is converted, number 18 + * + ADC_CH_ADCINA19 -- ADCIN19 is converted, number 19 + */ +typedef enum { + ADC_CH_ADCINA0 = 0x00000000U, + ADC_CH_ADCINA1 = 0x00000001U, + ADC_CH_ADCINA2 = 0x00000002U, + ADC_CH_ADCINA3 = 0x00000003U, + ADC_CH_ADCINA4 = 0x00000004U, + ADC_CH_ADCINA5 = 0x00000005U, + ADC_CH_ADCINA6 = 0x00000006U, + ADC_CH_ADCINA7 = 0x00000007U, + ADC_CH_ADCINA8 = 0x00000008U, + ADC_CH_ADCINA9 = 0x00000009U, + ADC_CH_ADCINA10 = 0x0000000AU, + ADC_CH_ADCINA11 = 0x0000000BU, + ADC_CH_ADCINA12 = 0x0000000CU, + ADC_CH_ADCINA13 = 0x0000000DU, + ADC_CH_ADCINA14 = 0x0000000EU, + ADC_CH_ADCINA15 = 0x0000000FU, + ADC_CH_ADCINA16 = 0x00000010U, + ADC_CH_ADCINA17 = 0x00000011U, + ADC_CH_ADCINA18 = 0x00000012U, + ADC_CH_ADCINA19 = 0x00000013U, +} ADC_Input; + +/** + * @brief ADC SOC(start of conversion) classification. + */ +typedef enum { + ADC_SOC_NUM0 = 0x00000000U, + ADC_SOC_NUM1 = 0x00000001U, + ADC_SOC_NUM2 = 0x00000002U, + ADC_SOC_NUM3 = 0x00000003U, + ADC_SOC_NUM4 = 0x00000004U, + ADC_SOC_NUM5 = 0x00000005U, + ADC_SOC_NUM6 = 0x00000006U, + ADC_SOC_NUM7 = 0x00000007U, + ADC_SOC_NUM8 = 0x00000008U, + ADC_SOC_NUM9 = 0x00000009U, + ADC_SOC_NUM10 = 0x0000000AU, + ADC_SOC_NUM11 = 0x0000000BU, + ADC_SOC_NUM12 = 0x0000000CU, + ADC_SOC_NUM13 = 0x0000000DU, + ADC_SOC_NUM14 = 0x0000000EU, + ADC_SOC_NUM15 = 0x0000000FU +} ADC_SOCNumber; + +/** + * @brief ADC four interrupt classification. + * @details Interrupt type: + * + ADC_INT_NUMBER0 -- ADCINT0 interrupt + * + ADC_INT_NUMBER1 -- ADCINT1 interrupt + * + ADC_INT_NUMBER2 -- ADCINT2 interrupt + * + ADC_INT_NUMBER3 -- ADCINT3 interrupt + */ +typedef enum { + ADC_INT_NUMBER0 = 0x00000000U, + ADC_INT_NUMBER1 = 0x00000001U, + ADC_INT_NUMBER2 = 0x00000002U, + ADC_INT_NUMBER3 = 0x00000003U +} ADC_IntNumber; + +/** + * @brief ADC supports peripherals trigger source. + */ +typedef enum { + ADC_TRIGSOC_SOFT = 0x00000000U, + ADC_TRIGSOC_APT0_SOCA = 0x00000001U, + ADC_TRIGSOC_APT0_SOCB = 0x00000002U, + ADC_TRIGSOC_APT1_SOCA = 0x00000003U, + ADC_TRIGSOC_APT1_SOCB = 0x00000004U, + ADC_TRIGSOC_APT2_SOCA = 0x00000005U, + ADC_TRIGSOC_APT2_SOCB = 0x00000006U, + ADC_TRIGSOC_APT3_SOCA = 0x00000007U, + ADC_TRIGSOC_APT3_SOCB = 0x00000008U, + ADC_TRIGSOC_GPT0 = 0x00000009U, + ADC_TRIGSOC_GPT1 = 0x0000000AU, + ADC_TRIGSOC_GPT2 = 0x0000000BU, + ADC_TRIGSOC_GPT3 = 0x0000000CU, + ADC_TRIGSOC_TIMER0 = 0x000000DU, + ADC_TRIGSOC_TIMER1 = 0x000000EU, + ADC_TRIGSOC_TIMER2 = 0x000000FU, + ADC_TRIGSOC_TIMER3 = 0x00000010U, + ADC_TRIGSOC_GPIOPD5 = 0x00000011U, + ADC_TRIGSOC_GPIOPF3 = 0x00000012U, + ADC_TRIGSOC_GPIOPF2 = 0x00000013U, + ADC_TRIGSOC_GPIOPF1 = 0x00000014U, +} ADC_TrigSource; + +/** + * @brief The type of DMA request. + * @details DMA request type: + * + ADC_DMA_SINGLEREQ -- single request + * + ADC_DMA_BURSTREQ -- burst request + */ +typedef enum { + ADC_DMA_SINGLEREQ = 0x00000000U, + ADC_DMA_BURSTREQ = 0x00000001U +} ADC_DMARequestType; + +/** + * @brief The priority mode of SOCs sample simultaneously. + * @details Priority mode: + * + ADC_PRIMODE_ALL_ROUND -- Round robin mode is used for all + * + ADC_PRIMODE_SOC0 -- SOC0 higher priority, others in round + * + ADC_PRIMODE_TO_SOC1 -- SOC 0-1 higher priority, others in round + * + ADC_PRIMODE_TO_SOC2 -- SOC 0-2 higher priority, others in round + * + ADC_PRIMODE_TO_SOC3 -- SOC 0-3 higher priority, others in round + * + ADC_PRIMODE_TO_SOC4 -- SOC 0-4 higher priority, others in round + * + ADC_PRIMODE_TO_SOC5 -- SOC 0-5 higher priority, others in round + * + ADC_PRIMODE_TO_SOC6 -- SOC 0-6 higher priority, others in round + * + ADC_PRIMODE_TO_SOC7 -- SOC 0-7 higher priority, others in round + * + ADC_PRIMODE_TO_SOC8 -- SOC 0-8 higher priority, others in round + * + ADC_PRIMODE_TO_SOC9 -- SOC 0-9 higher priority, others in round + * + ADC_PRIMODE_TO_SOC10 -- SOC 0-10 higher priority, others in round + * + ADC_PRIMODE_TO_SOC11 -- SOC 0-11 higher priority, others in round + * + ADC_PRIMODE_TO_SOC12 -- SOC 0-12 higher priority, others in round + * + ADC_PRIMODE_TO_SOC13 -- SOC 0-13 higher priority, others in round + * + ADC_PRIMODE_TO_SOC14 -- SOC 0-14 higher priority, others in round + * + ADC_PRIMODE_ALL_PRIORITY -- SOC 0-15 higher priority, others in round + */ +typedef enum { + ADC_PRIMODE_ALL_ROUND = 0x00000000U, + ADC_PRIMODE_SOC0 = 0x00000001U, + ADC_PRIMODE_TO_SOC1 = 0x00000003U, + ADC_PRIMODE_TO_SOC2 = 0x00000007U, + ADC_PRIMODE_TO_SOC3 = 0x0000000FU, + ADC_PRIMODE_TO_SOC4 = 0x0000001FU, + ADC_PRIMODE_TO_SOC5 = 0x0000003FU, + ADC_PRIMODE_TO_SOC6 = 0x0000007FU, + ADC_PRIMODE_TO_SOC7 = 0x000000FFU, + ADC_PRIMODE_TO_SOC8 = 0x000001FFU, + ADC_PRIMODE_TO_SOC9 = 0x000003FFU, + ADC_PRIMODE_TO_SOC10 = 0x000007FFU, + ADC_PRIMODE_TO_SOC11 = 0x00000FFFU, + ADC_PRIMODE_TO_SOC12 = 0x00001FFFU, + ADC_PRIMODE_TO_SOC13 = 0x00003FFFU, + ADC_PRIMODE_TO_SOC14 = 0x00007FFFU, + ADC_PRIMODE_ALL_PRIORITY = 0x0000FFFFU +} ADC_PriorityMode; + +/** + * @brief The number of PPB(post processing block). + */ +typedef enum { + ADC_PPB_NUM0 = 0x00000000U, + ADC_PPB_NUM1 = 0x00000001U, + ADC_PPB_NUM2 = 0x00000002U, + ADC_PPB_NUM3 = 0x00000003U +} ADC_PPBNumber; + +/** + * @brief ADC Oversampling Right Shift Bits. + * @details: + * + ADC_RIGHTSHIFT_BIT0 -- Non-displacement + * + ADC_RIGHTSHIFT_BIT1 -- Shift 1 bit to the right + * + ADC_RIGHTSHIFT_BIT2 -- Shift 2 bit to the right + * + ADC_RIGHTSHIFT_BIT3 -- Shift 3 bit to the right + * + ADC_RIGHTSHIFT_BIT4 -- Shift 4 bit to the right + * + ADC_RIGHTSHIFT_BIT5 -- Shift 5 bit to the right + * + ADC_RIGHTSHIFT_BIT6 -- Shift 6 bit to the right + * + ADC_RIGHTSHIFT_BIT7 -- Shift 7 bit to the right + * + ADC_RIGHTSHIFT_BIT8 -- Shift 8 bit to the right + */ +typedef enum { + ADC_RIGHTSHIFT_BIT0 = 0x00000000U, + ADC_RIGHTSHIFT_BIT1 = 0x00000001U, + ADC_RIGHTSHIFT_BIT2 = 0x00000002U, + ADC_RIGHTSHIFT_BIT3 = 0x00000003U, + ADC_RIGHTSHIFT_BIT4 = 0x00000004U, + ADC_RIGHTSHIFT_BIT5 = 0x00000005U, + ADC_RIGHTSHIFT_BIT6 = 0x00000006U, + ADC_RIGHTSHIFT_BIT7 = 0x00000007U, + ADC_RIGHTSHIFT_BIT8 = 0x00000008U, +} ADC_OversamplingRightShift; + +/** + * @brief ADC Oversampling Multiple. + * @details: + * + ADC_OVERSAMPLING_8X -- The sampling result is 8 times + * + ADC_OVERSAMPLING_16X -- The sampling result is 16 times + * + ADC_OVERSAMPLING_32X -- The sampling result is 32 times + * + ADC_OVERSAMPLING_64X -- The sampling result is 64 times + * + ADC_OVERSAMPLING_128X -- The sampling result is 128 times + * + ADC_OVERSAMPLING_256X -- The sampling result is 256 times + */ +typedef enum { + ADC_OVERSAMPLING_8X = 0x00000003U, + ADC_OVERSAMPLING_16X = 0x00000004U, + ADC_OVERSAMPLING_32X = 0x00000005U, + ADC_OVERSAMPLING_64X = 0x00000006U, + ADC_OVERSAMPLING_128X = 0x00000007U, + ADC_OVERSAMPLING_256X = 0x00000008U, +} ADC_OversamplingMultiple; + +/** + * @brief ADC sampling time, unit: adc_clk. + */ +typedef enum { + ADC_SOCSAMPLE_5CLK = 0x00000000U, + ADC_SOCSAMPLE_7CLK = 0x00000001U, + ADC_SOCSAMPLE_10CLK = 0x00000002U, + ADC_SOCSAMPLE_12CLK = 0x00000003U, + ADC_SOCSAMPLE_15CLK = 0x00000004U, + ADC_SOCSAMPLE_22CLK = 0x00000005U, + ADC_SOCSAMPLE_30CLK = 0x00000006U, + ADC_SOCSAMPLE_50CLK = 0x00000007U, + ADC_SOCSAMPLE_75CLK = 0x00000008U, + ADC_SOCSAMPLE_100CLK = 0x00000009U, + ADC_SOCSAMPLE_125CLK = 0x0000000AU, + ADC_SOCSAMPLE_150CLK = 0x0000000BU, + ADC_SOCSAMPLE_200CLK = 0x0000000CU, + ADC_SOCSAMPLE_300CLK = 0x0000000DU, + ADC_SOCSAMPLE_400CLK = 0x0000000EU, + ADC_SOCSAMPLE_500CLK = 0x0000000FU +} ADC_SOCSampleCycle; + +/** + * @brief The mode of SOCs finish sample and conversion. + * @details Priority mode: + * + ADC_SOCFINISH_NONE -- Interruption and DMA are not reported when sampling is complete + * + ADC_SOCFINISH_DMA -- DMA is reported when sampling is complete + * + ADC_SOCFINISH_INT0 -- Interruption 0 is reported when sampling is complete + * + ADC_SOCFINISH_INT1 -- Interruption 1 is reported when sampling is complete + * + ADC_SOCFINISH_INT2 -- Interruption 2 is reported when sampling is complete + * + ADC_SOCFINISH_INT3 -- Interruption 3 is reported when sampling is complete + */ +typedef enum { + ADC_SOCFINISH_NONE = 0x00000001U, + ADC_SOCFINISH_DMA = 0x00000002U, + ADC_SOCFINISH_INT0 = 0x00000003U, + ADC_SOCFINISH_INT1 = 0x00000004U, + ADC_SOCFINISH_INT2 = 0x00000005U, + ADC_SOCFINISH_INT3 = 0x00000006U +} ADC_SOCFinishMode; + +/** + * @brief The mode of ADC work. + * @details Priority mode: + * + ADC_WORKMODE_NORMAL -- Normal Work + * + ADC_WORKMODE_CAPACITY1 -- Calibration Mode 1 + */ +typedef enum { + ADC_WORKMODE_NORMAL = 0x00000000U, + ADC_WORKMODE_CAPACITY1 = 0x00000001U, +} ADC_WorkMode; + +/** + * @brief The type of interrupt call back functions. + */ +typedef enum { + ADC_CALLBACK_INT0 = 0x00000000U, + ADC_CALLBACK_INT1 = 0x00000001U, + ADC_CALLBACK_INT2 = 0x00000002U, + ADC_CALLBACK_INT3 = 0x00000003U, + ADC_CALLBACK_DMA = 0x000000004U, + ADC_CALLBACK_DMAERROR = 0x000000005U, + ADC_CALLBACK_DMAOVER = 0x00000006U, + ADC_CALLBACK_TRIGOVER = 0x00000007U, + ADC_CALLBACK_EVENT_OVERSAMPLING = 0x000000008U, + ADC_CALLBACK_EVENT_PPB0_ZERO = 0x00000010U, + ADC_CALLBACK_EVENT_PPB0_UP = 0x00000011U, + ADC_CALLBACK_EVENT_PPB0_DOWN = 0x00000012U, + ADC_CALLBACK_EVENT_PPB0_ERROR = 0x00000013U, + ADC_CALLBACK_EVENT_PPB1_ZERO = 0x000000014U, + ADC_CALLBACK_EVENT_PPB1_UP = 0x00000015U, + ADC_CALLBACK_EVENT_PPB1_DOWN = 0x00000016U, + ADC_CALLBACK_EVENT_PPB1_ERROR = 0x00000017U, + ADC_CALLBACK_EVENT_PPB2_ZERO = 0x00000018U, + ADC_CALLBACK_EVENT_PPB2_UP = 0x00000019U, + ADC_CALLBACK_EVENT_PPB2_DOWN = 0x0000001AU, + ADC_CALLBACK_EVENT_PPB2_ERROR = 0x0000001BU, + ADC_CALLBACK_EVENT_PPB3_ZERO = 0x0000001CU, + ADC_CALLBACK_EVENT_PPB3_UP = 0x0000001DU, + ADC_CALLBACK_EVENT_PPB3_DOWN = 0x0000001EU, + ADC_CALLBACK_EVENT_PPB3_ERROR = 0x0000001FU, +} ADC_CallbackFunType; + +/** + * @brief PPB function enable bit. + */ +typedef struct { + bool detect; /**< Function: zero-crossing detection, upper threshold detection, and lower threshold detection */ + bool offset; /**< Result Data Offset */ + bool delay; /**< Recording the sampling delay */ +} PPB_Function; + +/* + * Each bit indicates the software triggering status of the SOC. The value 1 indicates enable + * and the value 0 indicates disable. + */ +typedef union { + unsigned int softTrigVal; + struct { + unsigned int trigSoc0 : 1; + unsigned int trigSoc1 : 1; + unsigned int trigSoc2 : 1; + unsigned int trigSoc3 : 1; + unsigned int trigSoc4 : 1; + unsigned int trigSoc5 : 1; + unsigned int trigSoc6 : 1; + unsigned int trigSoc7 : 1; + unsigned int trigSoc8 : 1; + unsigned int trigSoc9 : 1; + unsigned int trigSoc10 : 1; + unsigned int trigSoc11 : 1; + unsigned int trigSoc12 : 1; + unsigned int trigSoc13 : 1; + unsigned int trigSoc14 : 1; + unsigned int trigSoc15 : 1; + unsigned int reserved : 16; + } BIT; +} ADC_SoftMultiTrig; + + +/** + * @brief The definition of synchronous sampling parameter structure. + */ +typedef struct { + ADC_OversamplingMultiple multiple; /**< Multiplier of Oversampling Accumulation */ + ADC_OversamplingRightShift rightShift; /**< Select sampling accuracy by shifting right bits */ + bool oversamplingInt; /**< Select sampling accuracy by shifting right bits */ +} ADC_OversamplingParam; + +/** + * @brief The definition of SOC parameter structure. + */ +typedef struct { + ADC_Input adcInput; /**< SOC specified input */ + ADC_SOCSampleCycle sampleTotalTime; /**< SOC specified input sample total time */ + ADC_TrigSource trigSource; /**< SOC specified input periph trigger source */ + bool continueMode; /**< SOC specified input interrupt trigger source */ + ADC_SOCFinishMode finishMode; /**< SOC specified input mode of finishing sample and conversion */ +} SOC_Param; + +/** + * @brief The definition of ADC overflow status. + */ +typedef union { + unsigned int trigOver; + unsigned int dmaReqOver; +} ADC_OverState; + +/** + * @brief The definition of extend handle structure. + */ +typedef struct _ADC_ExtendHandle { +} ADC_ExtendHandle; + +/** + * @brief The definition of callback. + */ +typedef struct { + void (* Int0FinishCallBack)(void *handle); /**< ADC interrupt complete callback function for users */ + void (* Int1FinishCallBack)(void *handle); /**< ADC interrupt complete callback function for users */ + void (* Int2FinishCallBack)(void *handle); /**< ADC interrupt complete callback function for users */ + void (* Int3FinishCallBack)(void *handle); /**< ADC interrupt complete callback function for users */ + void (* DmaFinishCallBack)(void *handle); /**< ADC DMA finish callback function for users */ + void (* OverSamplingFinishCallBack)(void *handle); /**< ADC DMA finish callback function for users */ + void (* DmaErrorCallBack)(void *handle); /**< ADC DMA transmission error callback function for users */ + void (* DmaOverCallBack)(void *handle); /**< ADC DMA overflow callback function for users */ + void (* TrigOverCallBack)(void *handle); /**< ADC DMA overflow callback function for users */ + void (* PPBEventCallBack[EVENT_TYPE])(void *handle); /**< (PPB0~PPB3) PPBx_ZRRO, PPBx_UP,PPBx_DOWN, PPBx_ERROR */ +} ADC_UserCallBack; +/** + * @} + */ + +/* ADC DCL Functions */ +/** + * @brief Check ADC PPB. + * @param ppb PPB number of ADC. + * @retval bool + */ +static inline bool IsADCPostProcessingBlock(ADC_PPBNumber ppb) +{ + return (ppb >= ADC_PPB_NUM0) && (ppb <= ADC_PPB_NUM3); +} + +/** + * @brief Check ADC work mode. + * @param mode work mode of ADC. + * @retval bool + */ +static inline bool IsADCWorkMode(ADC_WorkMode mode) +{ + return (mode >= ADC_WORKMODE_NORMAL) && (mode <= ADC_WORKMODE_CAPACITY1); +} + +/** + * @brief Check ADC oversampling multiple parameter. + * @param multiple oversampling multiple of SOC. + * @retval bool + */ +static inline bool IsADCOversamplingMultiple(ADC_OversamplingMultiple multiple) +{ + return (multiple >= ADC_OVERSAMPLING_8X) && (multiple <= ADC_OVERSAMPLING_256X); +} + +/** + * @brief Check bit of right shift in oversampling. + * @param bit bit of right shift. + * @retval bool + */ +static inline bool IsADCOversamplingRightShift(ADC_OversamplingRightShift bit) +{ + return (bit >= ADC_RIGHTSHIFT_BIT0) && (bit <= ADC_RIGHTSHIFT_BIT8); +} + +/** + * @brief Check ADC sample input. + * @param input Number of input. + * @retval bool + */ +static inline bool IsADCSampleChannel(ADC_Input input) +{ + return (input >= ADC_CH_ADCINA0) && (input <= ADC_CH_ADCINA19); +} + +/** + * @brief Check ADC SOC(start of conversion). Each SOC selects a unique input for sampling. The sample parameters + * are configured through the SOC. + * @param soc Number of SOC. + * @retval bool + */ +static inline bool IsADCSOCx(ADC_SOCNumber soc) +{ + return (soc >= ADC_SOC_NUM0) && (soc <= ADC_SOC_NUM15); +} + +/** + * @brief Check ADC interrupt parameter. + * @param intx Number of interrupt. + * @retval bool + */ +static inline bool IsADCIntx(ADC_IntNumber intx) +{ + return (intx >= ADC_INT_NUMBER0) && (intx <= ADC_INT_NUMBER3); +} + +/** + * @brief Check SOC trigger source. + * @param trig Type of trigger source. + * @retval bool + */ +static inline bool IsADCTrigSource(ADC_TrigSource trig) +{ + return (trig >= ADC_TRIGSOC_SOFT) && (trig <= ADC_TRIGSOC_GPIOPF1); +} + +/** + * @brief Check SOC DMA Request Type. + * @param dmaType Type of DMA Request. + * @retval bool + */ +static inline bool IsADCReqDMAType(ADC_DMARequestType dmaType) +{ + return (dmaType == ADC_DMA_SINGLEREQ) || (dmaType == ADC_DMA_BURSTREQ); +} + +/** + * @brief Check mode of completion of SOC sample + * @param mode Type of completion. + * @retval bool + */ +static inline bool IsADCFinishMode(ADC_SOCFinishMode mode) +{ + return (mode >= ADC_SOCFINISH_NONE) && (mode <= ADC_SOCFINISH_INT3); +} + +/** + * @brief Check ADC sample priority parameter. + * @param mode Priority mode of SOC. + * @retval bool + */ +static inline bool IsADCPriorityMode(ADC_PriorityMode mode) +{ + return (mode >= ADC_PRIMODE_ALL_ROUND) && (mode <= ADC_PRIMODE_ALL_PRIORITY); +} + +/** + * @brief Check time of total ADC sampling time. + * @param acqps Time of total ADC sampling time. + * @retval bool + */ +static inline bool IsADCTotalTime(unsigned int acqps) +{ + return (acqps <= ADC_SOCSAMPLE_500CLK); +} + +/** + * @brief Enable AVDD/3 Channal. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_EnableAvddChannel(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_AVDD_EN.BIT.cfg_avdd_en = true; +} + +/** + * @brief Disable AVDD/3 Channal. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_DisableAvddChannel(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_AVDD_EN.BIT.cfg_avdd_en = false; +} + +/** + * @brief Configuring the interrupt source used by the SOC. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt0(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + unsigned int shiftBit = (unsigned int)socx; + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); +} + +/** + * @brief Obtains the SOC ID that use interrupt. + * @param adcx ADC register base address. + * @retval unsigned int, Obtains the SOC ID that uses this interrupt. + */ +static inline unsigned int DCL_ADC_GetSOCxBlindInt0(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_INT_DATA_0_REG value; + value.reg = adcx->ADC_INT_DATA_0.reg; + return value.BIT.cfg_intr_data_sel0; +} + +/** + * @brief Configuring the interrupt source used by the SOC. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt1(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); +} + +/** + * @brief Obtains the SOC ID that use interrupt. + * @param adcx ADC register base address. + * @retval unsigned int, Obtains the SOC ID that uses this interrupt. + */ +static inline unsigned int DCL_ADC_GetSOCxBlindInt1(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_INT_DATA_0_REG value; + value.reg = adcx->ADC_INT_DATA_0.reg; + return value.BIT.cfg_intr_data_sel1; +} + +/** + * @brief Configuring the interrupt source used by the SOC. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt2(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + unsigned int shiftBit = (unsigned int)socx; + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); +} + +/** + * @brief Obtains the SOC ID that use interrupt. + * @param adcx ADC register base address. + * @retval unsigned int, Obtains the SOC ID that uses this interrupt. + */ +static inline unsigned int DCL_ADC_GetSOCxBlindInt2(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_INT_DATA_1_REG value; + value.reg = adcx->ADC_INT_DATA_1.reg; + return value.BIT.cfg_intr_data_sel2; +} + +/** + * @brief Configuring the interrupt source used by the SOC. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt3(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); +} + +/** + * @brief Obtains the SOC ID that use interrupt. + * @param adcx ADC register base address. + * @retval unsigned int, Obtains the SOC ID that uses this interrupt. + */ +static inline unsigned int DCL_ADC_GetSOCxBlindInt3(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_INT_DATA_1_REG value; + value.reg = adcx->ADC_INT_DATA_1.reg; + return value.BIT.cfg_intr_data_sel3; +} + +/** + * @brief Enable ADC interrupt. + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + adcx->ADC_DATA_FLAG_MASK.reg |= (1U << (unsigned int)intx); +} + +/** + * @brief Disable ADC interrupt. + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_DisableIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + adcx->ADC_DATA_FLAG_MASK.reg &= ~(1U << (unsigned int)intx); +} + +/** + * @brief ADC clear interruption. + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_ClearIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + adcx->ADC_INT_DATA_FLAG.reg = (1U << (unsigned int)intx); +} + +/** + * @brief Calculate the base address of the SOC registers with different numbers.This interface is invoked by the DCL, + * and parameter verification has been completed at the DCL functions. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval addr, the base address of the SOC registers. + */ +static unsigned int ADC_GetCTRLAddr(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + unsigned int addr; + addr = (uintptr_t)(void *)&(adcx->ADC_SOC0_CFG); + addr += ((unsigned int)socx * 4); /* Register base address difference 4 */ + return addr; +} + +/** + * @brief Configure the corresponding input for the SOC. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param input ADC input, @ref ADC_Input. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelectChannel(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_Input input) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCSampleChannel(input)); + ADC_SOC0_CFG_REG *soc = NULL; + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Get the Address After Translation */ + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + soc->BIT.cfg_soc0_ch_sel = (unsigned int)input; + if (input == ADC_CH_ADCINA18) { + DCL_ADC_EnableAvddChannel(adcx); + } +} + +/** + * @brief Configure the trigger source for the SOC. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param trig Source of trigger, @ref ADC_TrigSource. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelcetTrigSource(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_TrigSource trig) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCTrigSource(trig)); + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtaining the Address for Configuring the SOC */ + ADC_SOC0_CFG_REG *soc = NULL; + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + soc->BIT.cfg_soc0_trig_sel = (unsigned int)trig; +} + +/** + * @brief Configure the capacitor charging time for the SOC. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param acqps Capacitor charging time. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetAcqps(ADC_RegStruct * const adcx, ADC_SOCNumber socx, unsigned int acqps) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + ADC_PARAM_CHECK_NO_RET(acqps <= 15); /* The value of acqps ranges from 0 to 15 */ + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); + ADC_SOC0_CFG_REG *soc = NULL; + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + soc->BIT.cfg_soc0_samptime_sel = acqps; +} + +/** + * @brief ADC uses software-triggered sampling. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SOCxSoftTrigger(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + adcx->ADC_SOFT_TRIG.reg |= (1U << (unsigned int)socx); +} + +/** + * @brief Multiple channels trigger software sampling. + * @param adcx ADC register base address. + * @param val The val bits range from 0 to 0xFFFF. Writing 1 indicates triggering. + * @retval None. + */ +static inline void DCL_ADC_SOCxMultiSoftTrigger(ADC_RegStruct * const adcx, unsigned int val) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(val <= 0xFFFF); /* The value of val ranges from 0 to 0xFFFF */ + adcx->ADC_SOFT_TRIG.reg = val; +} + +/** + * @brief Configuring the SOC Priority. + * @param adcx ADC register base address. + * @param priorityMode Mode of SOC priority, @ref ADC_PriorityMode. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetPriority(ADC_RegStruct * const adcx, ADC_PriorityMode priorityMode) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCPriorityMode(priorityMode)); + adcx->ADC_ARBT0.reg = priorityMode; +} + +/** + * @brief Get current poll pointer. This pointer holds the last converted poll SOC. + * @param adcx ADC register base address. + * @retval None. + */ +static inline unsigned int DCL_ADC_QueryPollPoint(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + return adcx->ADC_ARBT2.reg; +} + +/** + * @brief The poll pointer is reset by software. After the software is set to 1, the rr_pointer is set to 16. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_ResetPollPoint(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_ARBT1.BIT.cfg_rr_pointer_reset = BASE_CFG_SET; +} + +/** + * @brief Set the specified SOC as the DAM request trigger source. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_DMARequestSource(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + adcx->ADC_DMA.BIT.cfg_dma_soc_sel = socx; +} + +/** + * @brief ADC enable DMA burst request. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_EnableDMABurstReq(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_DMA.BIT.cfg_dma_brst_req_sel = BASE_CFG_ENABLE; +} + +/** + * @brief ADC disable DMA burst request. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_DisableDMABurstReq(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_DMA.BIT.cfg_dma_brst_req_sel = BASE_CFG_DISABLE; +} + +/** + * @brief ADC enable DMA single request. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_EnableDMASingleReq(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_DMA.BIT.cfg_dma_sing_req_sel = BASE_CFG_ENABLE; +} + +/** + * @brief ADC disable DMA single request. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_DisableDMASingleReq(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_DMA.BIT.cfg_dma_sing_req_sel = BASE_CFG_DISABLE; +} + +/** + * @brief Configure post processing module(PPB) for the SOC. + * @param adcx ADC register base address. + * @param num Number of PPB. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelectPPBx(ADC_RegStruct * const adcx, ADC_PPBNumber num, ADC_SOCNumber socx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCPostProcessingBlock(num)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + ADC_PPB0_CTRL0_REG *ppb; + uintptr_t addr = (uintptr_t)(void *)&(adcx->ADC_PPB0_CTRL0); + ppb = (ADC_PPB0_CTRL0_REG *)(void *)(addr + 0x10U * (unsigned int)num); /* Get PPB configuration base address */ + ppb->BIT.cfg_ppb0_soc_sel = (unsigned int)socx; +} + +/** + * @brief Set the compensation offset. + * @param adcx ADC register base address. + * @param num Number of PPB. + * @param offset Offset compensation value. + * @retval None. + */ +static inline void DCL_ADC_SetPPBxOffset(ADC_RegStruct * const adcx, ADC_PPBNumber num, unsigned int offset) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCPostProcessingBlock(num)); + ADC_PARAM_CHECK_NO_RET(offset <= 0xFFF); + ADC_PPB0_CTRL0_REG *ppb; + uintptr_t addr = (uintptr_t)(void *)&(adcx->ADC_PPB0_CTRL0); + ppb = (ADC_PPB0_CTRL0_REG *)(void *)(addr + 0x10U * (unsigned int)num); /* Get PPB configuration base address */ + ppb->BIT.cfg_ppb0_offset = offset; +} + +/** + * @brief Setting the PPB Function. + * @param adcx ADC register base address. + * @param num Number of PPB. + * @param fun PPB function configuration. + * @retval None. + */ +static inline void DCL_ADC_SetPPBxFunction(ADC_RegStruct * const adcx, ADC_PPBNumber num, PPB_Function *fun) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCPostProcessingBlock(num)); + ADC_ASSERT_PARAM(fun != NULL); + ADC_PPB0_CTRL0_REG *ppb; + uintptr_t addr = (uintptr_t)(void *)&(adcx->ADC_PPB0_CTRL0); + ppb = (ADC_PPB0_CTRL0_REG *)(void *)(addr + 0x10U * (unsigned int)num); /* Get PPB configuration base address */ + ppb->BIT.cfg_ppb0_detect_en = fun->detect; + ppb->BIT.cfg_ppb0_offset_en = fun->offset; + ppb->BIT.cfg_ppb0_dly_en = fun->delay; +} + +/** + * @brief Set the upper and down thresholds. + * @param adcx ADC register base address. + * @param num Number of PPB. + * @param up Upper threshold, the most significant bit is the sign bit. + * @param dn Down threshold, the most significant bit is the sign bit. + * @retval None. + */ +static inline void DCL_ADC_SetPPBxThreshold(ADC_RegStruct * const adcx, ADC_PPBNumber num, + unsigned int up, unsigned int dn) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCPostProcessingBlock(num)); + ADC_PARAM_CHECK_NO_RET(up <= 0x1FFF); + ADC_PARAM_CHECK_NO_RET(dn <= 0x1FFF); + ADC_PPB0_CTRL1_REG *ppb; + uintptr_t addr = (uintptr_t)(void *)&(adcx->ADC_PPB0_CTRL1); + ppb = (ADC_PPB0_CTRL1_REG *)(void *)(addr + 0x10U * (unsigned int)num); /* Get PPB configuration base address */ + ppb->BIT.cfg_ppb0_uplimit = up; + ppb->BIT.cfg_ppb0_dnlimit = dn; +} + +/** + * @brief Setting the Error reference value. + * @param adcx ADC register base address. + * @param num Number of PPB. + * @param ref Error reference value. + * @retval None. + */ +static inline void DCL_ADC_SetPPBxErrorRef(ADC_RegStruct * const adcx, ADC_PPBNumber num, unsigned int ref) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCPostProcessingBlock(num)); + ADC_PARAM_CHECK_NO_RET(ref <= 0xFFF); + ADC_PPB0_CTRL2_REG *ppb; + uintptr_t addr = (uintptr_t)(void *)&(adcx->ADC_PPB0_CTRL2); + ppb = (ADC_PPB0_CTRL2_REG *)(void *)(addr + 0x10U * (unsigned int)num); /* Get PPB configuration base address */ + ppb->BIT.cfg_ppb0_ref = ref; +} + +/** + * @brief Read sample delay count value. + * @param adcx ADC register base address. + * @param num Number of PPB. + * @retval unsigned int, delay count value. The unit is the system frequency period. + */ +static inline unsigned int DCL_ADC_GetPPBxDelayCnt(ADC_RegStruct * const adcx, ADC_PPBNumber num) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_ASSERT_PARAM(IsADCPostProcessingBlock(num)); + ADC_PPB0_RESULT_REG *ppb; + uintptr_t addr = (uintptr_t)(void *)&(adcx->ADC_PPB0_RESULT); + ppb = (ADC_PPB0_RESULT_REG *)(void *)(addr + 0x10U * (unsigned int)num); + unsigned int dly = ppb->reg; + return (dly >> 16U); /* dly_stamp is in the upper 16 bits */ +} + +/** + * @brief Obtain the error calculation result. + * @param adcx ADC register base address. + * @param num Number of PPB. + * @retval unsigned int, Error Result, the most significant bit is the sign bit. + */ +static inline unsigned int DCL_ADC_GetPPBxErrorResult(ADC_RegStruct * const adcx, ADC_PPBNumber num) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_ASSERT_PARAM(IsADCPostProcessingBlock(num)); + ADC_PPB0_RESULT_REG *ppb; + uintptr_t addr = (uintptr_t)(void *)&(adcx->ADC_PPB0_RESULT); + ppb = (ADC_PPB0_RESULT_REG *)(void *)(addr + 0x10U * (unsigned int)num); /* Get PPB configuration base address */ + return ppb->BIT.ppb0_error_data; +} + +/** + * @brief Check whether the error calculation result is complete. + * @param adcx ADC register base address. + * @param num Number of PPB. + * @retval unsigned int, Not 0: Finish, 0: Not finish. + */ +static inline unsigned int DCL_ADC_CheckPPBxErrorResultFinish(ADC_RegStruct * const adcx, ADC_PPBNumber num) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_ASSERT_PARAM(IsADCPostProcessingBlock(num)); + unsigned int value = adcx->ADC_EVENT_INT.reg; + unsigned int shfit = 3 + 4 * num; /* 3 and 4 are used to convert the error result status bits */ + value = (value & (1U << shfit)); + return value; +} + +/** + * @brief Enable PPB interrupts. + * @param adcx ADC register base address. + * @retval void. + */ +static inline void DCL_ADC_EnablePPBxEventInt(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_EVENT_INT_MASK.reg |= 0xFFFF; +} + +/** + * @brief Disable PPB interrupts. + * @param adcx ADC register base address. + * @retval void. + */ +static inline void DCL_ADC_DisablePPBxEventInt(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + unsigned int value = adcx->ADC_EVENT_INT_MASK.reg; + value = (value & 0xFFFF0000); + adcx->ADC_EVENT_INT_MASK.reg = value; +} + +/** + * @brief Clear PPB interrupt. + * @param adcx ADC register base address. + * @retval void. + */ +static inline void DCL_ADC_ClearPPBxEventInt(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_EVENT_INT.reg |= 0xFFFF; +} + +/** + * @brief Get the status of event interrupt. + * @param adcx ADC register base address. + * @retval unsigned int, status of event interrupt. + */ +static inline unsigned int DCL_ADC_GetEventIntStatus(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + return adcx->ADC_EVENT_INT_MSK.reg; +} + +/** + * @brief Read ADC conversion result. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval unsigned int, result. + */ +static inline unsigned int DCL_ADC_ReadSOCxResult(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_ASSERT_PARAM(IsADCSOCx(socx)); + ADC_RESULT0_REG *result; + uintptr_t addr = (uintptr_t)(void *)adcx; + /* The address interval of the result register is 4 */ + result = (ADC_RESULT0_REG *)(void *)(addr + 4 * (unsigned int)socx); + return result->reg; +} + +/** + * @brief Obtain the ADC oversampling status. + * @param adcx ADC register base address. + * @retval unsigned int, 1: Finish, 0: Not finish. + */ +static inline unsigned int DCL_ADC_GetOversamplingState(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + return adcx->ADC_EVENT_INT.BIT.intr_oversamp_data_vld; +} + +/** + * @brief Reset the ADC oversampling status, also clear oversampling interrupt. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_ResetOversamplingState(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_EVENT_INT.BIT.intr_oversamp_data_vld = BASE_CFG_SET; +} + +/** + * @brief Read ADC oversampling conversion result. + * @param adcx ADC register base address. + * @retval None. + */ +static inline unsigned int DCL_ADC_ReadOversamplingResult(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + return adcx->ADC_OVERSAMP_RESULT.reg; +} + +/** + * @brief Select SOC Progress Oversampling. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SoCSelectOversampling(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + adcx->ADC_OVERSAMP.BIT.cfg_oversamp_soc_sel = socx; +} + +/** + * @brief Setting Oversampling Parameters. + * @param adcx ADC register base address. + * @param multiple ADC oversampling Accumulation Multiple. + * @param rightShift Number of bits shifted right in the oversampling result, used for truncation precision. + * @retval None. + */ +static inline void DCL_ADC_SetOversamplingParam(ADC_RegStruct * const adcx, ADC_OversamplingMultiple multiple, + ADC_OversamplingRightShift rightShift) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCOversamplingMultiple(multiple)); + ADC_PARAM_CHECK_NO_RET(IsADCOversamplingMultiple(rightShift)); + adcx->ADC_OVERSAMP.BIT.cfg_oversamp_n = multiple; /* Configuring the Oversampling Multiple */ + adcx->ADC_OVERSAMP.BIT.cfg_oversamp_m = rightShift; /* Configuring the Bits Shifted Right in Oversampling */ +} + +/** + * @brief Enable oversampling function. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_EnableOversampling(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_OVERSAMP.BIT.cfg_oversamp_en = BASE_CFG_ENABLE; +} + +/** + * @brief Disbale oversampling function. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_DisableOversampling(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_OVERSAMP.BIT.cfg_oversamp_en = BASE_CFG_DISABLE; +} + +/** + * @brief Enable ADC oversampling interrupt. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_EnableOversamplingInt(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_EVENT_INT_MASK.BIT.intr_oversamp_data_vld_mask = BASE_CFG_ENABLE; +} + +/** + * @brief Disable ADC oversampling interrupt. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_DisableOversamplingInt(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_EVENT_INT_MASK.BIT.intr_oversamp_data_vld_mask = BASE_CFG_DISABLE; +} + +/** + * @brief Enable Analog Power. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_Enable(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_EN.BIT.cfg_adc_en = BASE_CFG_ENABLE; +} + +/** + * @brief Disable Analog Power. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_Disable(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_EN.BIT.cfg_adc_en = BASE_CFG_DISABLE; +} + +/** + * @brief Obtain the SOC conversion status. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval unsigned int, Not 0: Finish, 0: Not finish. + */ +static inline unsigned int DCL_ADC_GetConvState(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_ASSERT_PARAM(IsADCSOCx(socx)); + unsigned int ret = adcx->ADC_EOC_FLAG.reg; + return (ret & ((1U << (unsigned int)socx))); +} + +/** + * @brief Clears the SOC completion flag. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_ResetConvState(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + unsigned int ret = (1U << (unsigned int)socx); + adcx->ADC_EOC_FLAG.reg = ret; +} + +/** + * @brief Obtains the input ID currently configured for the SOC. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval unisgned int, input number of soc. + */ +static inline unsigned int DCL_ADC_GetSOCxInputChannel(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_ASSERT_PARAM(IsADCSOCx(socx)); + unsigned int address = (uintptr_t)(void *)&(adcx->ADC_SOC0_CFG); + address += ((unsigned int)socx * 4); /* Register base address difference 4 */ + ADC_SOC0_CFG_REG *soc = NULL; + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)address; + return soc->BIT.cfg_soc0_ch_sel; +} + +/** + * @brief Enable SOC for continuous conversion. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + ADC_SOC0_CFG_REG *soc = NULL; + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + soc->BIT.cfg_soc0_cont_en = BASE_CFG_ENABLE; +} + +/** + * @brief Disable SOC for continuous conversion. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_DisableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + ADC_SOC0_CFG_REG *soc = NULL; + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + soc->BIT.cfg_soc0_cont_en = BASE_CFG_DISABLE; +} + +/** + * @brief Set the working mode. + * @param adcx ADC register base address. + * @param mode Work mode of ADC. + * @retval None. + */ +static inline void DCL_ADC_SetWorkMode(ADC_RegStruct * const adcx, ADC_WorkMode mode) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCWorkMode(mode)); + adcx->ADC_MODE.reg = mode; +} + +/** + * @brief Enable error interrupt. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_EnableErrorInt(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_ERR_INT_MASK.reg = 0x1FFFF; +} + +/** + * @brief Disbale error interrupt. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_DisbaleErrorInt(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + adcx->ADC_ERR_INT_MASK.reg = BASE_CFG_DISABLE; +} + +/** + * @brief Clear error interrupt. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_ClearErrorInt(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + unsigned int overFlag = adcx->ADC_ERR_INT.reg; + adcx->ADC_ERR_INT.reg = overFlag; +} + +/** + * @brief Get status of error interrupt. + * @param adcx ADC register base address. + * @retval unsigned int, status of error interrupt. + */ +static inline unsigned int DCL_ADC_GetErrorIntStatus(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + return adcx->ADC_ERR_INT_MSK.reg; +} + +/** + * @brief Obtains the ADC controller status. + * @param adcx ADC register base address. + * @retval unsigned int, ADC controller status. + */ +static inline unsigned int DCL_ADC_GetControllerStatus(ADC_RegStruct * const adcx) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + return adcx->ADC_STATUS.reg; +} + +/** + * @brief Obtains the ADC controller status. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param offset Customized calibration offset parameter.12-bit signed decimal number. The most significant bit is the + * sign bit, and the least significant bit is the one-bit decimal place. The value is stored in twos complement format. + * @param gain Customized calibration gain parameter.13-bit unsigned decimal number. The most significant bit is an + * integer bit, and the other bits are 12-bit decimal places. + * @retval None. + */ +static inline void DCL_ADC_CalibrationGroup0(ADC_RegStruct * const adcx, ADC_SOCNumber socx, + unsigned int offset, unsigned int gain) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + ADC_PARAM_CHECK_NO_RET(offset <= 0xFFF); + ADC_PARAM_CHECK_NO_RET(gain <= 0x1FFF); + adcx->ADC_OEGE_CH_SEL.BIT.cfg_oege_ch_sel0 = socx; + adcx->ADC_OEGE_CTRL0.BIT.cfg_ofst0 = offset; /* Configure the offset */ + adcx->ADC_OEGE_CTRL0.BIT.cfg_gain0 = gain; /* Configure the gain */ +} + + +/** + * @brief Obtains the ADC controller status. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param offset Customized calibration offset parameter.12-bit signed decimal number. The most significant bit is the + * sign bit, and the least significant bit is the one-bit decimal place. The value is stored in twos complement format. + * @param gain Customized calibration gain parameter.13-bit unsigned decimal number. The most significant bit is an + * integer bit, and the other bits are 12-bit decimal places. + * @retval None. + */ +static inline void DCL_ADC_CalibrationGroup1(ADC_RegStruct * const adcx, ADC_SOCNumber socx, + unsigned int offset, unsigned int gain) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + ADC_PARAM_CHECK_NO_RET(offset <= 0xFFF); + ADC_PARAM_CHECK_NO_RET(gain <= 0x1FFF); + adcx->ADC_OEGE_CH_SEL.BIT.cfg_oege_ch_sel1 = socx; + adcx->ADC_OEGE_CTRL1.BIT.cfg_ofst1 = offset; /* Configure the offset */ + adcx->ADC_OEGE_CTRL1.BIT.cfg_gain1 = gain; /* Configure the gain */ +} + +/** + * @brief Obtains the ADC controller status. + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param offset Customized calibration offset parameter.12-bit signed decimal number. The most significant bit is the + * sign bit, and the least significant bit is the one-bit decimal place. The value is stored in twos complement format. + * @param gain Customized calibration gain parameter.13-bit unsigned decimal number. The most significant bit is an + * integer bit, and the other bits are 12-bit decimal places. + * @retval None. + */ +static inline void DCL_ADC_CalibrationGroup2(ADC_RegStruct * const adcx, ADC_SOCNumber socx, + unsigned int offset, unsigned int gain) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + ADC_PARAM_CHECK_NO_RET(offset <= 0xFFF); + ADC_PARAM_CHECK_NO_RET(gain <= 0x1FFF); + adcx->ADC_OEGE_CH_SEL.BIT.cfg_oege_ch_sel2 = socx; + adcx->ADC_OEGE_CTRL2.BIT.cfg_ofst2 = offset; /* Configure the offset */ + adcx->ADC_OEGE_CTRL2.BIT.cfg_gain2 = gain; /* Configure the gain */ +} +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_ADC_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/adc/src/adc.c b/vendor/others/demo/5-tim_adc/demo/drivers/adc/src/adc.c new file mode 100644 index 000000000..fd90dde46 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/adc/src/adc.c @@ -0,0 +1,620 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file adc.c + * @author MCU Driver Team + * @brief ADC module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the ADC. + * + ADC initialization function. + * + Start ADC sample and conversion. + * + Start ADC sample and conversion with interrupt. + * + Start ADC sample and conversion with DMA. + * + Query the ADC conversion result. + * + Single and multichannel software trigger functions. + * + Interrupt callback function and user registration function. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "adc.h" +#include "crg.h" + +/** + * @brief Initialize the ADC hardware controller.After the controller is initialized, the ADC sampling is + * triggered at least 100 us later. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_Init(ADC_Handle *adcHandle) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + ADC_PARAM_CHECK_WITH_RET(IsADCPriorityMode(adcHandle->socPriority) == true, BASE_STATUS_ERROR); + DCL_ADC_SOCxSetPriority(adcHandle->baseAddress, adcHandle->socPriority); + adcHandle->baseAddress->ADC_ANA_CTRL0.BIT.cfg_sar_samp_cap_sel = 0x4; /* Set the Number of Sampling Capacitors */ + adcHandle->baseAddress->ADC_EN.reg = BASE_CFG_ENABLE; /* Enable ADC Controller */ + BASE_FUNC_DelayUs(100); /* Wait for 100 us until the ADC controller is stable */ + return BASE_STATUS_OK; +} + +/** + * @brief DeInitialize the ADC hardware controller. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_Deinit(ADC_Handle *adcHandle) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + adcHandle->baseAddress->ADC_EN.reg = BASE_CFG_DISABLE; + return BASE_STATUS_OK; +} + +/** + * @brief configurating the specified SOC parameters. + * @param adcHandle ADC handle. + * @param soc ID of SOC(start of conversion), managing the specific sample inputs. + * @param socParam Param struct of SOC. This is related to the peripheral circuit design, @ref SOC_Param. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_ConfigureSoc(ADC_Handle *adcHandle, ADC_SOCNumber soc, SOC_Param *socParam) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + ADC_ASSERT_PARAM(socParam != NULL); + ADC_PARAM_CHECK_WITH_RET(IsADCSampleChannel(socParam->adcInput) == true, BASE_STATUS_ERROR); + ADC_PARAM_CHECK_WITH_RET(IsADCTotalTime(socParam->sampleTotalTime) == true, BASE_STATUS_ERROR); + ADC_PARAM_CHECK_WITH_RET(IsADCTrigSource(socParam->trigSource) == true, BASE_STATUS_ERROR); + ADC_PARAM_CHECK_WITH_RET(IsADCFinishMode(socParam->finishMode) == true, BASE_STATUS_ERROR); + DCL_ADC_SOCxSelectChannel(adcHandle->baseAddress, soc, socParam->adcInput); /* Set channel */ + DCL_ADC_SOCxSetAcqps(adcHandle->baseAddress, soc, socParam->sampleTotalTime); /* Set sampling time */ + DCL_ADC_SOCxSelcetTrigSource(adcHandle->baseAddress, soc, socParam->trigSource); /* Set trigger source */ + if (socParam->continueMode == true) { /* Continuous Mode Judgment */ + DCL_ADC_EnableSOCxContinue(adcHandle->baseAddress, soc); + } else { + DCL_ADC_DisableSOCxContinue(adcHandle->baseAddress, soc); + } + adcHandle->ADC_SOCxParam[soc].finishMode = socParam->finishMode; + return BASE_STATUS_OK; +} + +/** + * @brief Callback function that ADC completes the sample conversion and uses the DMA to complete the transmission. + * @param handle ADC handle. + * @retval None. + */ +static void ADC_DMATransFinish(void *handle) +{ + ADC_ASSERT_PARAM(handle != NULL); + ADC_Handle *adcHandle = (ADC_Handle *)(handle); + if (adcHandle->userCallBack.DmaFinishCallBack != NULL) { + adcHandle->userCallBack.DmaFinishCallBack(adcHandle); /* Callback User Registration Function */ + } + return; +} + +/** + * @brief Callback function that ADC falis to use DMA. + * @param handle ADC handle. + * @retval None. + */ +static void ADC_DMATransError(void *handle) +{ + ADC_ASSERT_PARAM(handle != NULL); + ADC_Handle *adcHandle = (ADC_Handle *)(handle); + if (adcHandle->userCallBack.DmaErrorCallBack != NULL) { + adcHandle->userCallBack.DmaErrorCallBack(adcHandle); /* Callback User Registration Function */ + } + return; +} + +/** + * @brief Start the ADC conversion and enable ADC DMA. After the SOC conversion using the DMA is complete, use the DMA + * to transfer data The DMA can transfer the sampling results of consecutive SOCs. The start and end of DMA transfer + * are determined by startSoc and endSoc. + * @param adcHandle ADC handle. + * @param startSoc First SOC result for DMA transfer. + * @param endSoc Last SOC result for DMA transfer. + * @param saveData Address where the converted result is saved. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_StartDma(ADC_Handle *adcHandle, unsigned int startSoc, + unsigned int endSoc, unsigned int *saveData) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(startSoc) == true, BASE_STATUS_ERROR); + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(endSoc) == true, BASE_STATUS_ERROR); + ADC_PARAM_CHECK_WITH_RET(startSoc <= endSoc, BASE_STATUS_ERROR); + ADC_ASSERT_PARAM(saveData != NULL); + ADC_ASSERT_PARAM(adcHandle->dmaHandle != NULL); + ADC_PARAM_CHECK_WITH_RET(IsDmaChannelNum(adcHandle->adcDmaChn) == true, BASE_STATUS_ERROR); + unsigned int dmaSOCx = 0; + unsigned int dataLength = endSoc - startSoc + 1; + for (int i = 0; i < SOC_MAX_NUM; i++) { /* The DMA request is generated by the last SOC */ + if (adcHandle->ADC_SOCxParam[i].finishMode == ADC_SOCFINISH_DMA) { + dmaSOCx = i; + } + } + DCL_ADC_DMARequestSource(adcHandle->baseAddress, dmaSOCx); /* Enable the DMA function of the ADC */ + DCL_ADC_EnableDMABurstReq(adcHandle->baseAddress); /* Enable the DMA burst request */ + DCL_ADC_EnableDMASingleReq(adcHandle->baseAddress); /* Enable the DMA single request */ + uintptr_t srcAddr = (uintptr_t)(void *)(adcHandle->baseAddress); + srcAddr = srcAddr + 4 * startSoc; /* The base address difference of adjacent SOC result registers is 4 */ + adcHandle->dmaHandle->userCallBack.DMA_CallbackFuns[adcHandle->adcDmaChn].ChannelFinishCallBack = + ADC_DMATransFinish; + adcHandle->dmaHandle->userCallBack.DMA_CallbackFuns[adcHandle->adcDmaChn].ChannelErrorCallBack = ADC_DMATransError; + BASE_StatusType ret = HAL_DMA_StartIT(adcHandle->dmaHandle, srcAddr, (uintptr_t)(void *)(saveData), + dataLength, adcHandle->adcDmaChn); + return ret; +} + +/** + * @brief Start the ADC conversion and enable ADC interrupt. After the SOC completes sample conversion, the ADC + * interrupt is reported. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_StartIt(ADC_Handle *adcHandle) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + unsigned int intVal = 0; + for (int i = 0; i < SOC_MAX_NUM; i++) { + intVal = adcHandle->ADC_SOCxParam[i].finishMode; + switch (intVal) { + case ADC_SOCFINISH_INT0: + DCL_ADC_SetSOCxBlindInt0(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 0 */ + break; + case ADC_SOCFINISH_INT1: + DCL_ADC_SetSOCxBlindInt1(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 1 */ + break; + case ADC_SOCFINISH_INT2: + DCL_ADC_SetSOCxBlindInt2(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 2 */ + break; + case ADC_SOCFINISH_INT3: + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + break; + default: + break; + } + } /* Enable ADC Interrupt */ + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER0); + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER1); + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER3); + return BASE_STATUS_OK; +} + +/** + * @brief The software triggers multiple SCOs for sampling at the same time. + * @param adcHandle ADC handle. + * @param syncTrig Triggering Parameters. The lower 16 bits correspond to one SOC. If this bit is set to 1, the + * software triggers the SOC. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_SoftTrigMultiSample(ADC_Handle *adcHandle, ADC_SoftMultiTrig syncTrig) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + unsigned int val = syncTrig.softTrigVal; + ADC_PARAM_CHECK_WITH_RET(val <= 0xFFFF, BASE_STATUS_ERROR); + DCL_ADC_SOCxMultiSoftTrigger(adcHandle->baseAddress, val); /* Software triggering for multiple SOC */ + return BASE_STATUS_OK; +} + +/** + * @brief The software triggers only one soc. + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_SoftTrigSample(ADC_Handle *adcHandle, unsigned int soc) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + DCL_ADC_SOCxSoftTrigger(adcHandle->baseAddress, soc); /* Software triggers a single SOC */ + return BASE_STATUS_OK; +} + +/** + * @brief Obtains the sample result after SOC conversion. + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval unsigned int value of ADC convert result. + */ +unsigned int HAL_ADC_GetConvResult(ADC_Handle *adcHandle, unsigned int soc) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + return DCL_ADC_ReadSOCxResult(adcHandle->baseAddress, soc); +} + + +/** + * @brief Check the SOC completion flag. + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval BASE_STATUS_ERROR: The SOC does not complete the data sampling conversion. + * @retval BASE_STATUS_OK: The SOC has completed data sampling conversion. + */ +BASE_StatusType HAL_ADC_CheckSocFinish(ADC_Handle *adcHandle, unsigned int soc) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + if (DCL_ADC_GetConvState(adcHandle->baseAddress, soc) == 0) { + return BASE_STATUS_ERROR; /* The SOC does not complete the conversion */ + } + DCL_ADC_ResetConvState(adcHandle->baseAddress, soc); /* Clear flag bit */ + return BASE_STATUS_OK; +} + +/** + * @brief The ADC completes the interrupt processing. + * @param adcHandle ADC handle. + * @param intx ADC interrupt type number @ref ADC_IntNumber. + * @retval None. + */ +static void ADC_IntxClearEoc(ADC_Handle *adcHandle, unsigned int intx) +{ + unsigned int eocFlag = adcHandle->baseAddress->ADC_EOC_FLAG.reg; + ADC_INT_DATA_0_REG intData0; + ADC_INT_DATA_1_REG intData1; + unsigned int eocMask = 0; + switch (intx) { + case ADC_INT_NUMBER0: /* Read Interrupt Configuration */ + intData0.reg = adcHandle->baseAddress->ADC_INT_DATA_0.reg; + eocMask = intData0.BIT.cfg_intr_data_sel0; + break; + case ADC_INT_NUMBER1: /* Read Interrupt Configuration */ + intData0.reg = adcHandle->baseAddress->ADC_INT_DATA_0.reg; + eocMask = intData0.BIT.cfg_intr_data_sel1; + break; + case ADC_INT_NUMBER2: /* Read Interrupt Configuration */ + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + eocMask = intData1.BIT.cfg_intr_data_sel2; + break; + case ADC_INT_NUMBER3: /* Read Interrupt Configuration */ + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + eocMask = intData1.BIT.cfg_intr_data_sel3; + break; + default: + break; + } + unsigned int eoc = eocFlag & eocMask; + adcHandle->ADC_IntxParam[intx].socxFinish = eoc; + for (int i = 0; i < SOC_MAX_NUM; i++) { + unsigned int val = (1 << i); + if (eoc & val) { + adcHandle->baseAddress->ADC_EOC_FLAG.reg = val; /* Clear the EOC flag */ + } + } +} + +/** + * @brief The ADC overflow interrupt processing + * @param adcHandle ADC handle. + * @retval None. + */ +void HAL_ADC_IrqHandlerOver(void *handle) +{ + ADC_ASSERT_PARAM(handle != NULL); + ADC_Handle *adcHandle = (ADC_Handle *)handle; + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + unsigned int overState = adcHandle->baseAddress->ADC_ERR_INT_MSK.reg; + unsigned int overFlag = adcHandle->baseAddress->ADC_ERR_INT.reg; + adcHandle->baseAddress->ADC_ERR_INT.reg = overFlag; + adcHandle->overState.trigOver = (overState & 0xFFFF); /* Save trigger overflow status */ + adcHandle->overState.dmaReqOver = (overState & 0x10000); /* Save dma request overflow status */ + if (adcHandle->userCallBack.TrigOverCallBack != NULL && adcHandle->overState.trigOver != 0) { + adcHandle->userCallBack.TrigOverCallBack(handle); /* Callback User Registration Function */ + } + if (adcHandle->userCallBack.DmaOverCallBack != NULL && adcHandle->overState.dmaReqOver != 0) { + adcHandle->userCallBack.DmaOverCallBack(handle); /* Callback User Registration Function */ + } +} + +#if defined (CHIP_3061MNPICA) || defined (CHIP_3061MNPIKA) || defined (CHIP_3061MNPIC8) || defined (CHIP_3061MNPIK8) +/** + * @brief ADC Interrupt0 service processing function. + * @param handle ADC handle. + * @retval None. + */ +void HAL_ADC_IrqHandlerInt0(void *handle) +{ + ADC_ASSERT_PARAM(handle != NULL); + ADC_Handle *adcHandle = (ADC_Handle *)handle; + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + ADC_IntxClearEoc(adcHandle, ADC_INT_NUMBER0); /* Clear conversion completion flag */ + DCL_ADC_ClearIntx(adcHandle->baseAddress, ADC_INT_NUMBER0); + if (adcHandle->userCallBack.Int0FinishCallBack != NULL) { + adcHandle->userCallBack.Int0FinishCallBack(handle); + } +} +#endif +/** + * @brief ADC Interrupt1 service processing function. + * @param handle ADC handle. + * @retval None. + */ +void HAL_ADC_IrqHandlerInt1(void *handle) +{ + ADC_ASSERT_PARAM(handle != NULL); + ADC_Handle *adcHandle = (ADC_Handle *)handle; + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + ADC_IntxClearEoc(adcHandle, ADC_INT_NUMBER1); /* Clear conversion completion flag */ + DCL_ADC_ClearIntx(adcHandle->baseAddress, ADC_INT_NUMBER1); + if (adcHandle->userCallBack.Int1FinishCallBack != NULL) { + adcHandle->userCallBack.Int1FinishCallBack(handle); + } +} + +/** + * @brief ADC Interrupt2 service processing function. + * @param handle ADC handle. + * @retval None. + */ +void HAL_ADC_IrqHandlerInt2(void *handle) +{ + ADC_ASSERT_PARAM(handle != NULL); + ADC_Handle *adcHandle = (ADC_Handle *)handle; + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + ADC_IntxClearEoc(adcHandle, ADC_INT_NUMBER2); /* Clear conversion completion flag */ + DCL_ADC_ClearIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + if (adcHandle->userCallBack.Int2FinishCallBack != NULL) { + adcHandle->userCallBack.Int2FinishCallBack(handle); + } +} + +/** + * @brief ADC Interrupt3 service processing function. + * @param handle ADC handle. + * @retval None. + */ +void HAL_ADC_IrqHandlerInt3(void *handle) +{ + ADC_ASSERT_PARAM(handle != NULL); + ADC_Handle *adcHandle = (ADC_Handle *)handle; + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + ADC_IntxClearEoc(adcHandle, ADC_INT_NUMBER3); /* Clear conversion completion flag */ + DCL_ADC_ClearIntx(adcHandle->baseAddress, ADC_INT_NUMBER3); + if (adcHandle->userCallBack.Int3FinishCallBack != NULL) { + adcHandle->userCallBack.Int3FinishCallBack(handle); + } +} +/** + * @brief Event interrupt callback processing. + * @param adcHandle ADC handle. + * @param ppb Work mode of ADC. + * @param eventStatus Status of the event interrupt. + * @retval None. + */ +static void ADC_EventCallBack(ADC_Handle *handle, unsigned int ppb, unsigned int eventStatus) +{ + for (unsigned int i = 0; i < 4; ++i) { /* Each PPB has 4 interrupt types */ + unsigned int index = 4 * ppb + i; /* Each PPB has 4 interrupt types */ + if (handle->userCallBack.PPBEventCallBack[index] != NULL && (eventStatus & (1U << index)) != 0) { + handle->userCallBack.PPBEventCallBack[index](handle); + } + } +} +/** + * @brief ADC extended interrupt service processing function. + * @param handle Event handle. + * @retval None. + */ +void HAL_ADC_IrqHandlerAllEvent(void *handle) +{ + ADC_ASSERT_PARAM(handle != NULL); + ADC_Handle *adcHandle = (ADC_Handle *)handle; + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + unsigned int eventStatus = adcHandle->baseAddress->ADC_EVENT_INT_MSK.reg; + if (adcHandle->baseAddress->ADC_EVENT_INT_MSK.BIT.intr_oversamp_data_vld_msk == BASE_CFG_ENABLE) { + adcHandle->baseAddress->ADC_EVENT_INT.BIT.intr_oversamp_data_vld = BASE_CFG_SET; + if (adcHandle->userCallBack.OverSamplingFinishCallBack != NULL) { + adcHandle->userCallBack.OverSamplingFinishCallBack(handle); /* Oversampling callback function */ + } + return; + } + for (unsigned int i = 0; i < 4; ++i) { /* Each ADC has 4 PPB */ + unsigned int tmp = 0xF << (4U * i); /* Each PPB has 4 interrupt types */ + if ((tmp & eventStatus) != 0) { + adcHandle->baseAddress->ADC_EVENT_INT.reg = tmp; + ADC_EventCallBack(handle, i, eventStatus); /* PPB event callback function */ + break; + } + } + return; +} + +/** + * @brief User callback function registration interface for event type. + * @param adcHandle ADC handle. + * @param typeID Id of callback function type. + * @param pCallback Pointer of the specified callbcak function. + * @retval None. + */ +static void ADC_RegieterEventCallBack(ADC_Handle *adcHandle, ADC_CallbackFunType typeID, ADC_CallbackType pCallback) +{ + if (typeID > ADC_CALLBACK_EVENT_PPB3_ERROR || typeID < ADC_CALLBACK_EVENT_PPB0_ZERO) { + return; + } + unsigned int index = ((unsigned int)typeID & 0xF); + adcHandle->userCallBack.PPBEventCallBack[index] = pCallback; +} + +/** + * @brief User callback function registration interface. + * @param adcHandle ADC handle. + * @param typeID Id of callback function type. + * @param pCallback Pointer of the specified callbcak function. + * @retval None. + */ +void HAL_ADC_RegisterCallBack(ADC_Handle *adcHandle, ADC_CallbackFunType typeID, ADC_CallbackType pCallback) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(pCallback != NULL); + switch (typeID) { /* Register the callback function based on the interrupt type */ + case ADC_CALLBACK_INT0: + adcHandle->userCallBack.Int0FinishCallBack = pCallback; /* Sampling finsish interrupt 0 callback function */ + break; + case ADC_CALLBACK_INT1: + adcHandle->userCallBack.Int1FinishCallBack = pCallback; /* Sampling finsish interrupt 1 callback function */ + break; + case ADC_CALLBACK_INT2: + adcHandle->userCallBack.Int2FinishCallBack = pCallback; /* Sampling finsish interrupt 2 callback function */ + break; + case ADC_CALLBACK_INT3: + adcHandle->userCallBack.Int3FinishCallBack = pCallback; /* Sampling finsish interrupt 3 callback function */ + break; + case ADC_CALLBACK_DMA: + adcHandle->userCallBack.DmaFinishCallBack = pCallback; /* Dma transfer finish callback function */ + break; + case ADC_CALLBACK_DMAERROR: + adcHandle->userCallBack.DmaErrorCallBack = pCallback; /* Dma transfer error callback function */ + break; + case ADC_CALLBACK_DMAOVER: + adcHandle->userCallBack.DmaOverCallBack = pCallback; /* Dma request over callback function */ + break; + case ADC_CALLBACK_TRIGOVER: + adcHandle->userCallBack.TrigOverCallBack = pCallback; /* trigger over callback function */ + break; + case ADC_CALLBACK_EVENT_OVERSAMPLING: /* Oversampling callback function */ + adcHandle->userCallBack.OverSamplingFinishCallBack = pCallback; + break; + default: + ADC_RegieterEventCallBack(adcHandle, typeID, pCallback); /* PPB Function Callback Function */ + break; + } +} + + +/** + * @brief Initialize the ADC and DAC for VDDA. + * Note: + * (1) Ensure that the ADC clock is turned on and the ADC has been initialized using before use. + * (2) The mapping between the ADC and DAC must be configured as follows: + * ADC0 -- DAC0 + * (3) The soc parameter must be set to an SOC that is not occupied in the ADC. + * (4) The user-configured DAC output value need >= 512. + * @param dacx DAC register base address. + * @param adcx ADC register base address. + * @param soc ID of SOC(start of conversion), managing the specific sample inputs. + * @param dacx DAC register base address. + * @param useDac ture: dacx has been used, false: dacx has not been used. + * @retval BASE_StatusType. + */ +BASE_StatusType HAL_ADC_InitForVdda(ADC_RegStruct *adcx, ADC_SOCNumber soc, DAC_RegStruct *dacx, bool useDac) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_ASSERT_PARAM(IsDACInstance(dacx)); + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + HAL_CRG_IpEnableSet(DAC0_BASE, IP_CLK_ENABLE); /* DAC0 clock enable. */ + HAL_CRG_IpClkSelectSet(DAC0_BASE, 0); + DAC_Handle dac = {0}; + dac.baseAddress = dacx; + /* DAC cannot be full scale, otherwise ADC will not sense the power supply fluctuation of AVDD */ + unsigned int valueOfDac = 892; /* 892 is the recommended value for the DAC */ + if (useDac == false) { /* Check whether the DAC is used */ + dac.dacValue = valueOfDac; + HAL_DAC_Init(&dac); + } else { + valueOfDac = dac.baseAddress->DAC_VALUE.reg; + } + if (valueOfDac < 512) { /* The user-configured DAC output value need >= 512 */ + return BASE_STATUS_ERROR; + } + ADC_Handle adc = {0}; + adc.baseAddress = adcx; + SOC_Param socParam = {0}; + socParam.adcInput = ADC_CH_ADCINA17; /* DAC input */ + socParam.sampleTotalTime = ADC_SOCSAMPLE_500CLK; /* adc sample total time set as 500 cycle */ + socParam.trigSource = ADC_TRIGSOC_SOFT; + socParam.continueMode = BASE_CFG_DISABLE; + socParam.finishMode = ADC_SOCFINISH_NONE; + HAL_ADC_ConfigureSoc(&adc, soc, &socParam); + return BASE_STATUS_OK; +} + +/** + * @brief The DAC is sampled by using the ADC and converted to the VDDA voltage of the DAC. + * @param adcx ADC register base address. + * @param soc ID of SOC(start of conversion), managing the specific sample inputs. + * @param dacx DAC register base address. + * @param useDac ture: dacx has been used, false: dacx has not been used. + * @retval float, The reference voltage. + */ +float HAL_ADC_GetVddaByDac(ADC_RegStruct *adcx, ADC_SOCNumber soc, DAC_RegStruct *dacx, bool useDac) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_ASSERT_PARAM(IsDACInstance(dacx)); + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + unsigned int valueOfDac = 892; /* 892 is the recommended value for the DAC */ + if (useDac == true) { /* Check whether the DAC is used */ + valueOfDac = dacx->DAC_VALUE.reg; + } + if (valueOfDac < 512) { /* The user-configured DAC output value need >= 512 */ + return 0.0f; + } + unsigned ret = 0; + unsigned int count = 0; + ADC_Handle adc = {0}; + adc.baseAddress = adcx; + float voltage = 0.0f; + for (unsigned int i = 0; i < 10; ++i) { /* Average of 10 times */ + HAL_ADC_SoftTrigSample(&adc, soc); + BASE_FUNC_DELAY_US(4); /* delay 4 us */ + if (HAL_ADC_CheckSocFinish(&adc, soc) == BASE_STATUS_ERROR) { + continue; + } + count++; + unsigned int tmp = HAL_ADC_GetConvResult(&adc, soc); + ret += tmp; + } + if (count == 0) { + return 0.0f; + } + float ori = (float)ret / (float)count; + /* 256.0, 3.33333 and 4096.0 are used to convert the voltage */ + voltage = 1024.0f / (float)valueOfDac * 3.33333f * ori / 4096.0f; + return voltage; +} + +/** + * @brief set an external reference source to convert the original sampling results of the ADC. + * @param adcx ADC register base address. + * @param soc ID of SOC(start of conversion), managing the specific sample inputs. + * @param vdda Voltage Drain Drain. + * @retval unsigned int, Sampled results after using the reference voltage. + */ +unsigned int HAL_ADC_GetTransResultByVdda(ADC_RegStruct *adcx, ADC_SOCNumber soc, float vdda) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + if (vdda < 2.6f || vdda > 3.63f) { /* 2.6v ~ 3.63v is reasonable value range of VDDA */ + return 0; + } + unsigned int oriAdcResult = DCL_ADC_ReadSOCxResult(adcx, soc); + float tmp = 3.33333f / vdda * (float)oriAdcResult; /* ADC full scale from 3.33333v to VDDA */ + /* If the actual VDDA value is greater than the standard voltage value, the actual result is greater than 0xFFF */ + unsigned int ret = (unsigned int)tmp; + return ret; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/adc/src/adc_ex.c b/vendor/others/demo/5-tim_adc/demo/drivers/adc/src/adc_ex.c new file mode 100644 index 000000000..adf8fd525 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/adc/src/adc_ex.c @@ -0,0 +1,338 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file adc_ex.c + * @author MCU Driver Team + * @brief ADC module driver. + * @details This file provides firmware functions to manage the following extend function. + * + ADC Oversampling Function Configuration and Usage Definition. + * + ADC PPB Function Configuration and Usage Definition. + */ + +/* Includes ------------------------------------------------------------------*/ + +#include "adc_ex.h" + +/** + * @brief Enable SOC for continuous conversion. + * @param adcHandle ADC handle. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_EnableSocCotinueModeEx(ADC_Handle *adcHandle, ADC_SOCNumber soc) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + DCL_ADC_EnableSOCxContinue(adcHandle->baseAddress, soc); /* Enable continuous conversion */ + return BASE_STATUS_OK; +} + +/** + * @brief Disable SOC for continuous conversion. + * @param adcHandle ADC handle. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_DisableSocCotinueModeEx(ADC_Handle *adcHandle, ADC_SOCNumber soc) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + DCL_ADC_DisableSOCxContinue(adcHandle->baseAddress, soc); /* Disbale continuous conversion */ + return BASE_STATUS_OK; +} + +/** + * @brief Obtaining ADC Controller Status. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_GetControllerStatusEx(ADC_Handle *adcHandle) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + unsigned int status = adcHandle->baseAddress->ADC_STATUS.reg; + return (status == 0 ? BASE_STATUS_OK : BASE_STATUS_BUSY); +} + +/** + * @brief Obtaining ADC Controller Status. + * @param adcHandle ADC handle. + * @retval BASE status type. OK, SOC has completed, ERROR, SOC does not complete. + */ +BASE_StatusType HAL_ADC_CheckOversamplingFinishEx(ADC_Handle *adcHandle) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + if (DCL_ADC_GetOversamplingState(adcHandle->baseAddress) == 0) { + return BASE_STATUS_ERROR; /* The SOC does not complete the conversion */ + } + DCL_ADC_ResetOversamplingState(adcHandle->baseAddress); /* Clear flag bit */ + return BASE_STATUS_OK; +} + +/** + * @brief Obtaining ADC Controller Status. + * @param adcHandle ADC handle. + * @retval unsigned int, result of ADC oversampling result. + */ +unsigned int HAL_ADC_GetOversamplingResultEx(ADC_Handle *adcHandle) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + return DCL_ADC_ReadOversamplingResult(adcHandle->baseAddress); +} + +/** + * @brief Configuring ADC Oversampling Parameters. + * @param adcHandle ADC handle. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param param Configure param of oversampling. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_ConfigureOversamplingEx(ADC_Handle *adcHandle, ADC_SOCNumber soc, ADC_OversamplingParam *param) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(param != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + ADC_PARAM_CHECK_WITH_RET(IsADCOversamplingMultiple(param->multiple), BASE_STATUS_ERROR); + ADC_PARAM_CHECK_WITH_RET(IsADCOversamplingRightShift(param->rightShift), BASE_STATUS_ERROR); + unsigned int accuracy = 12 + param->multiple - param->rightShift; /* ADC default sampling precision is 12 bits */ + if (accuracy < 12 || accuracy > 16) { /* oversampling effective accuracy: 12 ~ 16 bits */ + return BASE_STATUS_ERROR; + } + unsigned int value = 1; + value |= ((unsigned int)soc << 4U); /* Shift left 4 bits to configure the soc */ + value |= ((unsigned int)param->multiple << 8U); /* Shift left 8 bits to configure the multiple */ + value |= ((unsigned int)param->rightShift << 12U); /* Shift left 12 bits to configure the rightShift */ + adcHandle->baseAddress->ADC_OVERSAMP.reg = value; + if (param->oversamplingInt == true) { + DCL_ADC_EnableOversamplingInt(adcHandle->baseAddress); + } + return BASE_STATUS_OK; +} + +/** + * @brief Configuring the Working Mode of the ADC Controller. + * @param adcHandle ADC handle. + * @param mode Work mode of ADC. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_ConfigureWorkModeEx(ADC_Handle *adcHandle, ADC_WorkMode mode) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + ADC_PARAM_CHECK_WITH_RET(IsADCWorkMode(mode) == true, BASE_STATUS_ERROR); + adcHandle->baseAddress->ADC_MODE.reg = mode; /* Configuring the Working Mode */ + return BASE_STATUS_OK; +} + +/** + * @brief Enable PPB interrupt. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_EnablePPBxEventIntEx(ADC_Handle *adcHandle) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + adcHandle->baseAddress->ADC_EVENT_INT_MASK.reg |= 0xFFFF; + return BASE_STATUS_OK; +} + +/** + * @brief Disbale PPB interrupt. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_DisablePPBxEventIntEx(ADC_Handle *adcHandle) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + unsigned int value = adcHandle->baseAddress->ADC_EVENT_INT_MASK.reg; + value = (value & 0xFFFF0000); /* The lower 16 bits of the PPB event interrupt is disabled. */ + adcHandle->baseAddress->ADC_EVENT_INT_MASK.reg = value; + return BASE_STATUS_OK; +} + +/** + * @brief Event interrupt callback function registration interface. + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @param ppb Number of PPB. + * @param fun PPB function configuration. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_ConfigurePPBxEx(ADC_Handle *adcHandle, ADC_SOCNumber soc, ADC_PPBNumber ppb, PPB_Function *fun) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc), BASE_STATUS_ERROR); + ADC_PARAM_CHECK_WITH_RET(IsADCPostProcessingBlock(ppb), BASE_STATUS_ERROR); + ADC_ASSERT_PARAM(fun != NULL); + DCL_ADC_SOCxSelectPPBx(adcHandle->baseAddress, ppb, soc); /* Selecting SOC that needs to use the PPB function */ + DCL_ADC_SetPPBxFunction(adcHandle->baseAddress, ppb, fun); /* Configuring the PPB Function */ + return BASE_STATUS_OK; +} + +/** + * @brief Set the upper and down thresholds. + * @param adcHandle ADC handle. + * @param ppb Number of PPB. + * @param up Upper threshold. + * @param dn Down threshold. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_SetPPBxThresholdEx(ADC_Handle *adcHandle, ADC_PPBNumber ppb, int up, int dn) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_PARAM_CHECK_WITH_RET(IsADCPostProcessingBlock(ppb), BASE_STATUS_ERROR); + ADC_PARAM_CHECK_WITH_RET(-4096 <= up && up <= 4095, BASE_STATUS_ERROR); /* Threshold Range: -4096 ~ 4095 */ + ADC_PARAM_CHECK_WITH_RET(-4096 <= dn && dn <= 4095, BASE_STATUS_ERROR); /* Threshold Range: -4096 ~ 4095 */ + if (up < dn) { + return BASE_STATUS_ERROR; + } + unsigned int upTemp = (0x1FFF & (unsigned int)up); /* The lower 13 bits are valid */ + unsigned int dnTemp = (0x1FFF & (unsigned int)dn); /* The lower 13 bits are valid */ + DCL_ADC_SetPPBxThreshold(adcHandle->baseAddress, ppb, upTemp, dnTemp); + return BASE_STATUS_OK; +} + +/** + * @brief Set the compensation offset. + * @param adcHandle ADC handle. + * @param ppb Number of PPB. + * @param offset Offset compensation value. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_SetPPBxOffsetEx(ADC_Handle *adcHandle, ADC_PPBNumber ppb, int offset) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_PARAM_CHECK_WITH_RET(IsADCPostProcessingBlock(ppb), BASE_STATUS_ERROR); + ADC_PARAM_CHECK_WITH_RET(-2048 <= offset && offset <= 2047, BASE_STATUS_ERROR); /* Offset Range: -2048 ~ 2047 */ + unsigned int temp = (0xFFF & (unsigned int)offset); /* The lower 12 bits are valid */ + DCL_ADC_SetPPBxOffset(adcHandle->baseAddress, ppb, temp); + return BASE_STATUS_OK; +} + +/** + * @brief Setting the Error reference value. + * @param adcHandle ADC handle. + * @param ppb Number of PPB. + * @param ref Error reference value. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_SetPPBxErrorRefEx(ADC_Handle *adcHandle, ADC_PPBNumber ppb, unsigned int ref) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_PARAM_CHECK_WITH_RET(IsADCPostProcessingBlock(ppb), BASE_STATUS_ERROR); + ADC_PARAM_CHECK_WITH_RET(ref <= 0xFFF, BASE_STATUS_ERROR); + DCL_ADC_SetPPBxErrorRef(adcHandle->baseAddress, ppb, ref); /* Setting the Error reference value */ + return BASE_STATUS_OK; +} + +/** + * @brief Get the error calculation result. + * @param adcHandle ADC handle. + * @param ppb Number of PPB. + * @retval unsigned int, Error Result. + */ +int HAL_ADC_GetPPBxErrorResultEx(ADC_Handle *adcHandle, ADC_PPBNumber ppb) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_PARAM_CHECK_WITH_RET(IsADCPostProcessingBlock(ppb), BASE_STATUS_ERROR); + unsigned int ret = DCL_ADC_GetPPBxErrorResult(adcHandle->baseAddress, ppb); + if ((ret & 0x1000) == 0x1000) { /* Check whether the value is negative */ + ret |= 0xFFFFE000; + ret = ~(ret - 1); + return (0 - (int)ret); + } + return (int)ret; +} + +/** + * @brief Get the error calculation result. + * @param adcHandle ADC handle. + * @param ppb Number of PPB. + * @retval unsigned int, delay count value. The unit is the system frequency period. + */ +unsigned int HAL_ADC_GetPPBxDelayCntEx(ADC_Handle *adcHandle, ADC_PPBNumber ppb) +{ + ADC_ASSERT_PARAM(adcHandle != NULL); + ADC_PARAM_CHECK_WITH_RET(IsADCPostProcessingBlock(ppb), BASE_STATUS_ERROR); + return DCL_ADC_GetPPBxDelayCnt(adcHandle->baseAddress, ppb); +} + +/** + * @brief Initialize the ADC for VDDA/3. + * Note: + * (1) Ensure that the ADC clock is turned on and the ADC has been initialized using before use. + * (2) The soc parameter must be set to an SOC that is not occupied in the ADC. + * @param adcx ADC register base address. + * @param soc ID of SOC(start of conversion), managing the specific sample inputs. + * @retval BASE_StatusType. + */ +BASE_StatusType HAL_ADC_InitForVddaEx(ADC_RegStruct *adcx, ADC_SOCNumber soc) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + ADC_Handle adc = {0}; + adc.baseAddress = adcx; + SOC_Param socParam = {0}; + socParam.adcInput = ADC_CH_ADCINA18; /* VDD/3 input */ + socParam.sampleTotalTime = ADC_SOCSAMPLE_500CLK; /* adc sample total time set as 500 cycle */ + socParam.trigSource = ADC_TRIGSOC_SOFT; + socParam.continueMode = BASE_CFG_DISABLE; + socParam.finishMode = ADC_SOCFINISH_NONE; + HAL_ADC_ConfigureSoc(&adc, soc, &socParam); + return BASE_STATUS_OK; +} + +/** + * @brief The VDD/3 is sampled by using the ADC and converted to the VDDA voltage. + * @param adcx ADC register base address. + * @param soc ID of SOC(start of conversion), managing the specific sample inputs. + * @retval float, The reference voltage. + */ +float HAL_ADC_GetVddaEx(ADC_RegStruct *adcx, ADC_SOCNumber soc) +{ + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + unsigned ret = 0; + unsigned int count = 0; + ADC_Handle adc = {0}; + adc.baseAddress = adcx; + float voltage = 0.0f; + for (unsigned int i = 0; i < 10; ++i) { /* Average of 10 times */ + HAL_ADC_SoftTrigSample(&adc, soc); + BASE_FUNC_DELAY_US(4); /* 4: wait convert finish, 4us */ + if (HAL_ADC_CheckSocFinish(&adc, soc) == BASE_STATUS_ERROR) { + continue; + } + count++; + unsigned int tmp = HAL_ADC_GetConvResult(&adc, soc); + ret += tmp; + } + if (count == 0) { + return 0.0f; /* convert fail */ + } + float ori = (float)ret / (float)count; + /* 3.0, 3.33333 and 4096.0 are used to convert the voltage, VDD/3 */ + voltage = 3.0 *3.33333f * ori / 4096.0f; + return voltage; +} diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/apt/common/inc/apt.h b/vendor/others/demo/5-tim_adc/demo/drivers/apt/common/inc/apt.h new file mode 100644 index 000000000..331709f57 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/apt/common/inc/apt.h @@ -0,0 +1,357 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file apt.h + * @author MCU Driver Team + * @brief APT module driver. + * @details This file provides functions declaration of the APT module. + * + APT handle structure definition. + * + Initialization and de-initialization functions. + * + APT Service Functions. + */ + +#ifndef McuMagicTag_APT_H +#define McuMagicTag_APT_H + +#include "apt_ip.h" + +#define EM_OUT_EVT_FILTER_EN 0x0f +#define EM_CMB_MODE_OFFSET 16 +#define EM_CMB_MODE_INTERVAL 4 +#define EM_CMB_SRC_SEL_INTERVAL 4 +#define EM_OR_INTERVAL 16 +#define EM_CMB_EVT_NUM 4 +#define EM_COMBINE_A1_SRC_ENABLE_ALL 0xF +/** + * @defgroup APT APT + * @brief APT module. + * @{ + */ + + +/** + * @defgroup APT_Common APT Common + * @brief APT common external module. + * @{ + */ + +/** + * @defgroup APT_Handle_Definition APT Handle Definition + * @{ + */ + +/* + Basic type AHBL ALBH AHBH ALBL + ___ __ __ ___ __ __ + ChannelA __| |__ |___| __| |__ |___| + __ __ ___ ___ __ __ + ChannelB |___| __| |__ __| |__ |___| +*/ +/** + * @brief Basic PWM waveform type. + * @details waveform type: + * + APT_PWM_BASIC_A_HIGH_B_LOW -- Basic PWM waveform type 1. + * + APT_PWM_BASIC_A_LOW_B_HIGH -- Basic PWM waveform type 2. + * + APT_PWM_BASIC_A_HIGH_B_HIGH -- Basic PWM waveform type 3. + * + APT_PWM_BASIC_A_LOW_B_LOW -- Basic PWM waveform type 4. + */ +typedef enum { + APT_PWM_BASIC_A_HIGH_B_LOW = 0x00000000U, + APT_PWM_BASIC_A_LOW_B_HIGH = 0x00000001U, + APT_PWM_BASIC_A_HIGH_B_HIGH = 0x00000002U, + APT_PWM_BASIC_A_LOW_B_LOW = 0x00000003U, +} APT_PWMBasicType; + +/** + * @brief The actual outputs of PWM channelA and channelB. + * @details Output: + * + APT_PWM_OUT_BASIC_TYPE = 0x00000000U -- PWM channel output the waveform according to basic PWM type. + * + APT_PWM_OUT_ALWAYS_LOW = 0x00000001U -- PWM channel output low level. + * + APT_PWM_OUT_ALWAYS_HIGH = 0x00000002U -- PWM channel output high level. + */ +typedef enum { + APT_PWM_OUT_BASIC_TYPE = 0x00000000U, + APT_PWM_OUT_ALWAYS_LOW = 0x00000001U, + APT_PWM_OUT_ALWAYS_HIGH = 0x00000002U, +} APT_PWMChannelOutType; + +/** + * @brief PWM waveform configuration handle of APT module. + */ +typedef struct { + APT_PWMBasicType basicType; /**< Basic PWM waveform type. */ + APT_PWMChannelOutType chAOutType; /**< Actual output of PWM channelA. */ + APT_PWMChannelOutType chBOutType; /**< Actual output of PWM channelB. */ + APT_CountMode cntMode; /**< Count mode of APT time-base counter. */ + unsigned short dividerFactor; /**< Divider factor. The range is 0~4095. */ + unsigned short timerPeriod; /**< Count period of APT time-base timer. */ + unsigned short divInitVal; /**< Initial value of divider. */ + unsigned short cntInitVal; /**< Initial value of time-base counter */ + unsigned short cntCmpLeftEdge; /**< Count compare point of the left edge of PWM waveform. */ + unsigned short cntCmpRightEdge; /**< Count compare point of the right edge of PWM waveform. */ + APT_BufferLoadMode cntCmpLoadMode; /**< Buffer load mode of PWM waveform count compare value. */ + unsigned int cntCmpLoadEvt; /**< Buffer load event of PWM waveform count compare value. */ + unsigned short deadBandCnt; /**< Count value of dead-band counter. In units of APT clock. */ +} APT_PWMWaveForm; + +/** + * @brief ADC trigger configuration handle of APT module. + */ +typedef struct { + bool trgEnSOCA; /**< Enable of ADC trigger source SOCA. */ + APT_ADCTriggerSource trgSrcSOCA; /**< Source of ADC trigger source SOCA. */ + unsigned short trgScaleSOCA; /**< Scale of ADC trigger source SOCA. */ + unsigned short cntCmpSOCA; /**< Count compare point of ADC trigger source SOCA when using CMPA */ + bool trgEnSOCB; /**< Enable of ADC trigger source SOCB. */ + APT_ADCTriggerSource trgSrcSOCB; /**< Source of ADC trigger source SOCB. */ + unsigned short trgScaleSOCB; /**< Scale of ADC trigger source SOCB. */ + unsigned short cntCmpSOCB; /**< Count compare point of ADC trigger source SOCB when using CMPB */ + APT_BufferLoadMode cntCmpLoadMode; /**< Buffer load mode of ADC trigger count compare value. */ + unsigned int cntCmpLoadEvt; /**< Buffer load event of ADC trigger count compare value. */ +} APT_ADCTrigger; + +/** + * @brief Timer interrupt configuration handle of APT module. + */ +typedef struct { + bool tmrInterruptEn; /**< Enable of APT module timer interrupt. */ + APT_TimerInterruptSrc tmrInterruptSrc; /**< Source of APT module timer interrupt. */ + unsigned short tmrInterruptScale; /**< Scale of APT module timer interrupt. */ +} APT_TimerInterrupt; + +/** + * @brief Output control protection configuration handle of APT module. + */ +typedef struct { + bool ocEventEn; /**< Enable of output control event. */ + APT_OutCtrlEvent ocEvent; /**< Output control event. Limited to IO events or system events. */ + APT_OutCtrlMode ocEventMode; /**< Output control protection mode. */ + APT_CBCClearMode cbcClrMode; /**< Event clear mode when using cycle-by-cycle mode. */ + APT_EMEventPolarity evtPolarity; /**< Event effective polarity. */ + APT_OutCtrlAction ocAction; /**< Output control protection action. */ + APT_EmulationMode emMode; /**< emulation mode */ + bool ocEvtInterruptEn; /**< Enable of output control event interrupt. */ +} APT_OutCtrlProtect; + +/** + * @brief Source event of event magnagement. + */ +typedef enum { + APT_EM_ORIGINAL_SRC_POE0 = 0x00000001U, + APT_EM_ORIGINAL_SRC_POE1 = 0x00000002U, + APT_EM_ORIGINAL_SRC_POE2 = 0x00000004U, + APT_EM_ORIGINAL_SRC_ACMP0 = 0x00000008U, + APT_EM_ORIGINAL_SRC_ACMP1 = 0x00000010U, + APT_EM_ORIGINAL_SRC_ACMP2 = 0x00000020U, + APT_EM_ORIGINAL_SRC_EVTMP4 = 0x00000040U, + APT_EM_ORIGINAL_SRC_EVTMP5 = 0x00000080U, + APT_EM_ORIGINAL_SRC_EVTMP6 = 0x00000100U, +} APT_EMOriginalEvtSrc; + +/** + * @brief Filter mask bit. + */ +typedef enum { + APT_EM_POE0_INVERT_BIT = 0x00000001U, + APT_EM_POE1_INVERT_BIT = 0x00000002U, + APT_EM_POE2_INVERT_BIT = 0x00000004U, + APT_EM_ACMP0_INVERT_BIT = 0x00000008U, + APT_EM_ACMP1_INVERT_BIT = 0x00000010U, + APT_EM_ACMP2_INVERT_BIT = 0x00000020U, + APT_EM_EVTMP4_INVERT_BIT = 0x00000040U, + APT_EM_EVTMP5_INVERT_BIT = 0x00000080U, + APT_EM_EVTMP6_INVERT_BIT = 0x00000100U, +} APT_EMPolarityMskBit; + +/** + * @brief System protect event; + */ +typedef enum { + APT_SYS_EVT_DEBUG = 0x00000010U, + APT_SYS_EVT_CLK = 0x00000020U, + APT_SYS_EVT_MEM = 0x00000040U, +} APT_SysOcEvent; + +/** + * @brief Output control protection configuration handle of APT module. + */ +typedef struct { + bool ocEventEnEx; /**< oc event enable */ + APT_OutCtrlMode ocEventModeEx; /**< Output control protection mode. */ + APT_CBCClearMode cbcClrModeEx; /**< Event clear mode when using cycle-by-cycle mode. */ + APT_OutCtrlAction ocActionEx; /**< Output control protection channel A action. */ + APT_OutCtrlAction ocActionBEx; /**< Output control protection channel B action. */ + bool ocEvtInterruptEnEx; /**< Enable of output control event interrupt. */ + APT_SysOcEvent ocSysEvent; /**< System protect event */ + APT_EMOriginalEvtSrc originalEvtEx; /**< Event management's event source */ + APT_EMPolarityMskBit evtPolarityMaskEx; /**< Event effective polarity. */ + unsigned char filterCycleNumEx; /**< input source event filter */ +} APT_OutCtrlProtectEx; + +/** + * @brief struct of EM conbine event + */ +typedef struct { + APT_EMCombineEvtSrc emEvtSrc; /**< combine event selection */ + APT_EMCombineEvtMode emEvtCombineMode; /**< event combine mode */ + APT_EMEventPolarity emEvtPolar; /**< event source polarity */ + unsigned int emEvtOrEnBits; /**< event logic or enable bits */ +} APT_CombineEvt; + +/** + * @brief Shield window and capture configurations + */ +typedef struct { + bool wdEnable; /**< Shield windows enable bit */ + bool emCapEnable; /**< Enable EM captrue functions */ + APT_EMCombineEvent eventSel; /**< Window source event selection */ + APT_MaskWinResetMode wdStartAndCapClr; /**< Window's offset start count and EM capture clear condition */ + unsigned short wdOffset; /**< Window's offset value */ + unsigned short wdWidth; /**< Window's width value */ + APT_MaskWinPolarity wdPolar; /**< Window's polarity */ +} APT_WdAndCap; + + +/** + * @brief Valley switch configurations + */ +typedef struct { + bool vsEnable; /**< Valley switch enable */ + APT_EMEdgeFilterMode vsFilerEdgeSel; /**< Filter edge selection */ + unsigned char vsFilterCnt; /**< Filter edge count */ + APT_ValleyCapRstType vsClrType; /**< Clear type */ + APT_ValleyCountEdge vsCapEdgeSel; /**< Capture edge selection */ + unsigned char vsCapStartEdge; /**< Capture start edge */ + unsigned char vsCapEndEdge; /**< Capture end edge */ + APT_ValleyDelayMode vsCapDelayMode; /**< Capture delay mode */ + unsigned short vsCapSoftDelay; /**< Capture software calibrate value */ +} APT_ValleySw; + +/** + * @brief Event management handle of APT module + */ +typedef struct { + bool emEnable; /**< Enable bit of event management */ + APT_CombineEvt emEvt[EM_CMB_EVT_NUM]; /**< Combine events configuration */ + APT_WdAndCap emWdAndCap; /**< Shield windows and capture configuration */ + APT_ValleySw emValleySw; /**< Valley switch configuration */ +} APT_EventManage; + +/** + * @brief Synchronization handle of slave APT module. + */ +typedef struct { + unsigned short divPhase; /**< Divider phase when receiving APT synchronization pulse. */ + unsigned short cntPhase; /**< Counter phase when receiving APT synchronization pulse. */ + APT_SyncCountMode syncCntMode; /**< Count mode when receiving APT synchronization pulse. */ + APT_SyncInSrc syncInSrc; /**< Sync-in source of APT module */ + unsigned short cntrSyncSrc; + /**< Sync-in source of time-base counter synchronization + A logical OR of valid values can be passed as the cntrSyncSrc parameter. + Valid values for cntrSyncSrc are: + APT_CNTR_SYNC_SRC_COMBINE_EVENT_A1 - Enable combine event A1 as the counter synchronization source. + APT_CNTR_SYNC_SRC_COMBINE_EVENT_B1 - Enable combine event B1 as the counter synchronization source. + APT_CNTR_SYNC_SRC_SYNCIN - Enable Sync-In source as the counter synchronization source. */ +} APT_SlaveSyncIn; + +/** + * @brief Definition of callback function type. + */ +typedef void (* APT_CallbackType)(void *aptHandle); + +/** + * @brief Definition of callback function type. + */ +typedef struct { + void (* EvtInterruptCallBack)(void *handle); + void (* TmrInterruptCallBack)(void *handle); +} APT_UserCallBack; + +/** + * @brief The definition of the APT handle structure. + */ +typedef struct _APT_Handle { + APT_RegStruct *baseAddress; /**< Register base address. */ + APT_PWMWaveForm waveform; /**< PWM waveform configuration handle. */ + APT_ADCTrigger adcTrg; /**< ADC trigger configuration handle. */ + APT_TimerInterrupt tmrInterrupt; /**< Timer interrupt configuration handle. */ + APT_UserCallBack userCallBack; /**< Interrupt callback function when APT event happens. */ + APT_ExtendHandle handleEx; /**< extra handle */ +} APT_Handle; +/** + * @} + */ + +/** + * @defgroup APT_API_Declaration APT HAL API + * @{ + */ + +/** + * @brief Definition of callback function ID. + */ +typedef enum { + APT_TIMER_INTERRUPT = 0x00000000U, + APT_EVENT_INTERRUPT = 0x00000001U, +} APT_InterruputType; + +BASE_StatusType HAL_APT_PWMInit(APT_Handle *aptHandle); +BASE_StatusType HAL_APT_PWMDeInit(APT_Handle *aptHandle); +BASE_StatusType HAL_APT_ProtectInit(APT_Handle *aptHandle, APT_OutCtrlProtect *protect); +BASE_StatusType HAL_APT_ProtectDeInit(APT_Handle *aptHandle, APT_OutCtrlProtect *protect); +BASE_StatusType HAL_APT_ProtectInitEx(APT_Handle *aptHandle, APT_OutCtrlProtectEx *protect); +BASE_StatusType HAL_APT_ProtectDeInitEx(APT_Handle *aptHandle, APT_OutCtrlProtectEx *protect); +void HAL_APT_ForcePWMOutputLow(APT_Handle *aptHandle); +BASE_StatusType HAL_APT_MasterSyncInit(APT_Handle *aptHandle, unsigned short syncOutSrc); +BASE_StatusType HAL_APT_SlaveSyncInit(APT_Handle *aptHandle, APT_SlaveSyncIn *slaveSyncIn); +void HAL_APT_StartModule(unsigned int aptRunMask); +void HAL_APT_StopModule(unsigned int aptRunMask); +BASE_StatusType HAL_APT_SetPWMDuty(APT_Handle *aptHandle, unsigned short cntCmpLeftEdge, \ + unsigned short cntCmpRightEdge); +BASE_StatusType HAL_APT_SetPWMDutyByNumber(APT_Handle *aptHandle, unsigned int duty); +BASE_StatusType HAL_APT_SetADCTriggerTime(APT_Handle *aptHandle, unsigned short cntCmpSOCA, unsigned short cntCmpSOCB); +void HAL_APT_EventIrqHandler(void *handle); +void HAL_APT_TimerIrqHandler(void *handle); +void HAL_APT_RegisterCallBack(APT_Handle *aptHandle, APT_InterruputType typeID, APT_CallbackType pCallback); +BASE_StatusType HAL_APT_EMInit(APT_Handle *aptHandle, APT_EventManage *eventManage); +unsigned short HAL_APT_EMGetCapValue(APT_Handle *aptHandle); +void HAL_APT_EMSetWdOffsetAndWidth(APT_Handle *aptHandle, unsigned short offset, unsigned short width); +void HAL_APT_EMSetValleySwithSoftDelay(APT_Handle *aptHandle, unsigned short calibrate); +BASE_StatusType HAL_APT_ChangeOutputType(APT_Handle *aptHandle, + APT_PWMChannel channel, + APT_PWMChannelOutType aptAction); + +/* Attribute configuration of each reference point. */ +BASE_StatusType APT_ConfigRefA(APT_Handle *aptHandle, APT_RefDotParameters *refDotParameters); +BASE_StatusType APT_ConfigRefB(APT_Handle *aptHandle, APT_RefDotParameters *refDotParameters); +BASE_StatusType APT_ConfigRefC(APT_Handle *aptHandle, APT_RefDotParameters *refDotParameters); +BASE_StatusType APT_ConfigRefD(APT_Handle *aptHandle, APT_RefDotParameters *refDotParameters); +/* Combination configuration of reference point attributes. */ +BASE_StatusType HAL_APT_ConfigRefDot(APT_Handle *aptHandle, APT_RefDotSelect refDotSelect, + APT_RefDotParameters *refDotParameters); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_APT_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/apt/inc/apt_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/apt/inc/apt_ip.h new file mode 100644 index 000000000..dfba82711 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/apt/inc/apt_ip.h @@ -0,0 +1,3470 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file apt_ip.h + * @author MCU Driver Team + * @brief Header file containing APT module DCL driver functions. + * This file provides functions to manage the following functionalities of APT module. + * + Definition of APT configuration parameters. + * + APT registers mapping structure. + * + Direct Configuration Layer driver functions. + */ + +#ifndef McuMagicTag_APT_IP_H +#define McuMagicTag_APT_IP_H + +#include "baseinc.h" + +#ifdef APT_PARAM_CHECK + #define APT_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM + #define APT_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET + #define APT_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else + #define APT_ASSERT_PARAM(para) ((void)0U) + #define APT_PARAM_CHECK_NO_RET(para) ((void)0U) + #define APT_PARAM_CHECK_WITH_RET(param, ret) ((void)0U) +#endif + +/** + * @addtogroup APT + * @{ + */ + +/** + * @defgroup APT_IP APT_IP + * @brief APT_IP: apt_v1. + * @{ + */ + +/** + * @defgroup APT_Param_Def APT Parameters Definition + * @brief Definition of APT configuration parameters + * @{ + */ + +/* Bitmask of the aptx_run bits in SYSCTRL1 register. */ +#define RUN_APT0 0x00000001U +#define RUN_APT1 0x00000002U +#define RUN_APT2 0x00000004U +#define RUN_APT3 0x00000008U + +/* Limited values for some configuration items of APT module. */ +#define DIVIDER_FACTOR_MAX 0x00000FFFU +#define TIMEBASE_COUNTER_MAX 0x0000FFFFU +#define TIMER_INTERRUPT_CNT_MAX 0x0000000FU +#define ADC_CONVERSION_START_CNT_MAX 0x0000000FU +#define VCAP_STARY_STOP_EDGE_CNT_MAX 0x0000000FU +#define EDGE_FILTER_EDGE_CNT_MAX 0x0000000FU +#define CNTR_SYNC_SOURCE_MAX 0x00000007U +#define SYNC_OUT_SOURCE_MAX 0x000000FFU +#define GLOBAL_LOAD_CNT_MAX 0x0000000FU + +/* Values that can be passed to DCL_APT_SetPeriodLoadEvent() as the loadEvent parameter. */ +#define APT_PERIOD_LOAD_EVENT_ZERO 0x00000001U +#define APT_PERIOD_LOAD_EVENT_A1 0x00000004U +#define APT_PERIOD_LOAD_EVENT_B1 0x00000008U +#define APT_PERIOD_LOAD_EVENT_SYNC 0x00000010U + +/* Values that can be passed to DCL_APT_SetCompareLoadEvent() as the loadEvent parameter. */ +#define APT_COMPARE_LOAD_EVENT_ZERO 0x00000001U +#define APT_COMPARE_LOAD_EVENT_PERIOD 0x00000002U +#define APT_COMPARE_LOAD_EVENT_A1 0x00000004U +#define APT_COMPARE_LOAD_EVENT_B1 0x00000008U +#define APT_COMPARE_LOAD_EVENT_SYNC 0x00000010U + +/* Values that can be returned by DCL_APT_GetCounterDirection(). */ +#define APT_COUNTER_STATUS_COUNT_DOWN 0x00000000U +#define APT_COUNTER_STATUS_COUNT_UP 0x00000001U + +/* Values that can be passed to DCL_APT_SetPWMActionLoadEvent() and + * DCL_APT_SetSwContActionLoadEvent() as the loadEvent parameter. */ +#define APT_ACTION_LOAD_EVENT_ZERO 0x00000001U +#define APT_ACTION_LOAD_EVENT_PERIOD 0x00000002U +#define APT_ACTION_LOAD_EVENT_A1 0x00000004U +#define APT_ACTION_LOAD_EVENT_B1 0x00000008U +#define APT_ACTION_LOAD_EVENT_SYNC 0x00000010U + + +/* Values that can be passed to DCL_APT_SetDGConfigLoadEvent(), DCL_APT_SetREDCounterLoadEvent() and + * DCL_APT_SetFEDCounterLoadEvent() as the loadEvent parameter. */ + +#define APT_DEAD_BAND_LOAD_EVENT_ZERO 0x00000001U +#define APT_DEAD_BAND_LOAD_EVENT_PERIOD 0x00000002U + +/* Values that can be passed to DCL_APT_SetEMEventOR() as the event1OREn and event1OREn parameter. */ +#define APT_EM_OR_EN_GPIO_EVENT_1 0x00000001U +#define APT_EM_OR_EN_GPIO_EVENT_2 0x00000002U +#define APT_EM_OR_EN_GPIO_EVENT_3 0x00000004U +#define APT_EM_OR_EN_MXU_EVENT_1 0x00000008U +#define APT_EM_OR_EN_MXU_EVENT_2 0x00000010U +#define APT_EM_OR_EN_MXU_EVENT_3 0x00000020U +#define APT_EM_OR_EN_MXU_EVENT_4 0x00000040U +#define APT_EM_OR_EN_MXU_EVENT_5 0x00000080U +#define APT_EM_OR_EN_MXU_EVENT_6 0x00000100U +#define APT_EM_OR_EN_MXU_EVENT_7 0x00000200U +#define APT_EM_OR_EN_MXU_EVENT_8 0x00000400U +#define APT_EM_OR_EN_MXU_EVENT_9 0x00000800U +#define APT_EM_OR_EN_MXU_EVENT_10 0x00001000U +#define APT_EM_OR_EN_MXU_EVENT_11 0x00002000U +#define APT_EM_OR_EN_MXU_EVENT_12 0x00004000U + +/* Values that can be passed to DCL_APT_SetTimeBaseCounterSyncSrc() as the cntrSyncSrc parameter. */ +#define APT_CNTR_SYNC_SRC_COMBINE_EVENT_A1 0x00000001U +#define APT_CNTR_SYNC_SRC_COMBINE_EVENT_B1 0x00000002U +#define APT_CNTR_SYNC_SRC_SYNCIN 0x00000004U + +/* Values that can be passed to DCL_APT_SetSyncOutPulseSrc() as the syncOutSrc parameter. */ +#define APT_SYNC_OUT_ON_CNTR_ZERO 0x00000001U +#define APT_SYNC_OUT_ON_CNTR_PERIOD 0x00000002U +#define APT_SYNC_OUT_ON_COMBINE_EVENT_A1 0x00000004U +#define APT_SYNC_OUT_ON_COMBINE_EVENT_B1 0x00000008U +#define APT_SYNC_OUT_ON_CNTR_CMPB 0x00000020U +#define APT_SYNC_OUT_ON_CNTR_CMPC 0x00000040U +#define APT_SYNC_OUT_ON_CNTR_CMPD 0x00000080U + +/* Values that can be passed to DCL_APT_SetGlobalLoadPrescale() as the glbLoadEvt parameter. */ +#define APT_GLB_LOAD_ON_CNTR_ZERO 0x00000001U +#define APT_GLB_LOAD_ON_CNTR_PERIOD 0x00000002U +#define APT_GLB_LOAD_ON_CNTR_SYNC 0x00000004U + +/** + * @brief APT Extra Handle. + */ +typedef struct { + ; +} APT_ExtendHandle; + +/** + * @brief Emulation stop mode of APT module. + */ +typedef enum { + APT_EMULATION_NO_STOP = 0x00000001U, + APT_EMULATION_STOP_COUNTER = 0x00000002U, + APT_EMULATION_STOP_APT = 0x00000003U, +} APT_EmulationMode; + +/** + * @brief Count mode of time-base counter. + */ +typedef enum { + APT_COUNT_MODE_UP = 0x00000000U, + APT_COUNT_MODE_DOWN = 0x00000001U, + APT_COUNT_MODE_UP_DOWN = 0x00000002U, + APT_COUNT_MODE_FREEZE = 0x00000003U, +} APT_CountMode; + +/** + * @brief Count mode after synchronization for slave APT module. + */ +typedef enum { + APT_COUNT_MODE_AFTER_SYNC_DOWN = 0x00000000U, + APT_COUNT_MODE_AFTER_SYNC_UP = 0x00000001U, +} APT_SyncCountMode; + +/** + * @brief Count compare reference of time-base counter. + */ +typedef enum { + APT_COMPARE_REFERENCE_A = 0x00000000U, + APT_COMPARE_REFERENCE_B = 0x00000001U, + APT_COMPARE_REFERENCE_C = 0x00000002U, + APT_COMPARE_REFERENCE_D = 0x00000003U, +} APT_CompareRef; + +/** + * @brief Buffer load mode of the registers that support buffer register. + * @details Load mode: + * + APT_BUFFER_DISABLE -- Disable register buffer + * + APT_BUFFER_INDEPENDENT_LOAD -- Enable register buffer and load independently + * + APT_BUFFER_GLOBAL_LOAD -- enable register buffer and load globally + */ +typedef enum { + APT_BUFFER_DISABLE = 0x00000000U, + APT_BUFFER_INDEPENDENT_LOAD = 0x00000001U, + APT_BUFFER_GLOBAL_LOAD = 0x00000003U, +} APT_BufferLoadMode; + +/** + * @brief PWM waveform output channel. + */ +typedef enum { + APT_PWM_CHANNEL_A = 0x00000000U, + APT_PWM_CHANNEL_B = 0x00000001U, +} APT_PWMChannel; + +/** + * @brief PWM waveform action on PWM action events. + */ +typedef enum { + APT_PWM_ACTION_HOLD = 0x00000000U, + APT_PWM_ACTION_LOW = 0x00000001U, + APT_PWM_ACTION_HIGH = 0x00000002U, + APT_PWM_ACTION_TOGGLE = 0x00000003U, +} APT_PWMAction; + +/** + * @brief Count compare event for generating PWM waveform actions. + * The enumeration values are the register bit field offset of the corresponding action events. + */ +typedef enum { + APT_PWM_ACTION_ON_TIMEBASE_ZERO = 0U, + APT_PWM_ACTION_ON_TIMEBASE_PERIOD = 2U, + APT_PWM_ACTION_ON_CMPA_COUNT_UP = 4U, + APT_PWM_ACTION_ON_CMPA_COUNT_DOWN = 6U, + APT_PWM_ACTION_ON_CMPB_COUNT_UP = 8U, + APT_PWM_ACTION_ON_CMPB_COUNT_DOWN = 10U, + APT_PWM_ACTION_ON_CMPC_COUNT_UP = 12U, + APT_PWM_ACTION_ON_CMPC_COUNT_DOWN = 14U, + APT_PWM_ACTION_ON_CMPD_COUNT_UP = 16U, + APT_PWM_ACTION_ON_CMPD_COUNT_DOWN = 18U, + APT_PWM_ACTION_ON_C1_COUNT_UP = 20U, + APT_PWM_ACTION_ON_C1_COUNT_DOWN = 22U, + APT_PWM_ACTION_ON_C2_COUNT_UP = 24U, + APT_PWM_ACTION_ON_C2_COUNT_DOWN = 26U, +} APT_PWMActionEvent; + +/** + * @brief PWM action when using software continuous action. + */ +typedef enum { + APT_PWM_CONTINUOUS_ACTION_HOLD = 0x00000000U, + APT_PWM_CONTINUOUS_ACTION_LOW = 0x00000001U, + APT_PWM_CONTINUOUS_ACTION_HIGH = 0x00000002U, +} APT_PWMContAction; + +/** + * @brief PWM Generation event C1 and C2. + */ +typedef enum { + APT_PWM_GENERATION_EVENT_C1 = 0x00000000U, + APT_PWM_GENERATION_EVENT_C2 = 0x00000001U, +} APT_PGEventCx; + +/** + * @brief Source of PWM Generation event C1 and C2. + */ +typedef enum { + APT_PG_EVT_C_FORBIDDEN = 0x00000000U, + APT_PG_EVT_C_COMBINE_EVENT_A1 = 0x00000001U, + APT_PG_EVT_C_COMBINE_EVENT_A2 = 0x00000002U, + APT_PG_EVT_C_COMBINE_EVENT_B1 = 0x00000003U, + APT_PG_EVT_C_COMBINE_EVENT_B2 = 0x00000004U, + APT_PG_EVT_C_COMBINE_EVENT_FILT = 0x00000005U, + APT_PG_EVT_C_IO_EVENT1 = 0x00000006U, + APT_PG_EVT_C_IO_EVENT2 = 0x00000007U, + APT_PG_EVT_C_IO_EVENT3 = 0x00000008U, + APT_PG_EVT_C_SYNC_IN = 0x00000009U, +} APT_PGEventCxSrc; + +/** + * @brief Input source of Dead-Band rising edge delay counter. + * @details Input source: + * + APT_DB_RED_INPUT_PWM_A -- Dead-Band rising edge delay input is PWM channel A + * + APT_DB_RED_INPUT_PWM_B -- Dead-Band rising edge delay input is PWM channel B + */ +typedef enum { + APT_DB_RED_INPUT_PWM_A = 0x00000000U, + APT_DB_RED_INPUT_PWM_B = 0x00000001U, +} APT_REDInput; + +/** + * @brief Output mode of Dead-Band rising edge delay counter. + * @details Output mode: + * + APT_DB_RED_OUTPUT_NOT_INVERT -- Dead-Band rising edge delay output is not inverted + * + APT_DB_RED_OUTPUT_INVERT -- Dead-Band rising edge delay output is inverted + * + APT_DB_RED_OUTPUT_PWM_A -- Dead-Band rising edge delay is bypassed + */ +typedef enum { + APT_DB_RED_OUTPUT_NOT_INVERT = 0x00000000U, + APT_DB_RED_OUTPUT_INVERT = 0x00000002U, + APT_DB_RED_OUTPUT_PWM_A = 0x00000003U, +} APT_REDOutMode; + +/** + * @brief Input source of Dead-Band falling edge delay counter. + * @details Input source: + * + APT_DB_FED_INPUT_PWM_B -- Dead-Band falling edge delay input is PWM channel B + * + APT_DB_FED_INPUT_PWM_A -- Dead-Band falling edge delay input is PWM channel A + * + APT_DB_FED_INPUT_RED_OUT -- Falling edge delay input is rising edge delay output + * + APT_DB_FED_INPUT_ZERO -- Dead-Band falling edge delay input is 0 + */ +typedef enum { + APT_DB_FED_INPUT_PWM_B = 0x00000000U, + APT_DB_FED_INPUT_PWM_A = 0x00000001U, + APT_DB_FED_INPUT_RED_OUT = 0x00000002U, + APT_DB_FED_INPUT_ZERO = 0x00000003U, +} APT_FEDInput; + +/** + * @brief Output mode of Dead-Band falling edge delay counter. + * @details Output mode: + * + APT_DB_FED_OUTPUT_NOT_INVERT -- Dead-Band falling edge delay output is not inverted + * + APT_DB_FED_OUTPUT_INVERT -- Dead-Band falling edge delay output is inverted + * + APT_DB_FED_OUTPUT_PWM_B -- Dead-Band falling edge delay is bypassed + */ +typedef enum { + APT_DB_FED_OUTPUT_NOT_INVERT = 0x00000000U, /**< Dead-Band falling edge delay output is not inverted */ + APT_DB_FED_OUTPUT_INVERT = 0x00000002U, /**< Dead-Band falling edge delay output is inverted */ + APT_DB_FED_OUTPUT_PWM_B = 0x00000003U, /**< Dead-Band falling edge delay is bypassed */ +} APT_FEDOutMode; + +/** + * @brief Output control events. + */ +typedef enum { + APT_OC_NO_EVENT = 0x00000000U, + APT_OC_GPIO_EVENT_1 = 0x00000001U, + APT_OC_GPIO_EVENT_2 = 0x00000002U, + APT_OC_GPIO_EVENT_3 = 0x00000004U, + APT_OC_SYSTEM_EVENT_1 = 0x00000010U, + APT_OC_SYSTEM_EVENT_2 = 0x00000020U, + APT_OC_SYSTEM_EVENT_3 = 0x00000040U, + APT_OC_COMBINE_EVENT_A1 = 0x00000100U, + APT_OC_COMBINE_EVENT_A2 = 0x00000200U, + APT_OC_COMBINE_EVENT_B1 = 0x00000400U, + APT_OC_COMBINE_EVENT_B2 = 0x00000800U, +} APT_OutCtrlEvent; + +/** + * @brief Output control event mode. + */ +typedef enum { + APT_OUT_CTRL_ONE_SHOT = 0x00000000U, + APT_OUT_CTRL_CYCLE_BY_CYBLE = 0x00000001U, +} APT_OutCtrlMode; + +/** + * @brief Advanced output control events take into consideration of the direction of time-base counter. + * The enumeration values are the register bit field offset of the corresponding output control events. + */ +typedef enum { + APT_OC_EVT_GPIO_OR_SYSTEM_UP = 0U, + APT_OC_EVT_COMBINE_EVENT_A1_UP = 3U, + APT_OC_EVT_COMBINE_EVENT_A2_UP = 6U, + APT_OC_EVT_COMBINE_EVENT_B1_UP = 9U, + APT_OC_EVT_COMBINE_EVENT_B2_UP = 12U, + APT_OC_EVT_GPIO_OR_SYSTEM_DOWN = 16U, + APT_OC_EVT_COMBINE_EVENT_A1_DOWN = 19U, + APT_OC_EVT_COMBINE_EVENT_A2_DOWN = 22U, + APT_OC_EVT_COMBINE_EVENT_B1_DOWN = 25U, + APT_OC_EVT_COMBINE_EVENT_B2_DOWN = 28U, +} APT_OutCtrlEventDir; + +/** + * @brief Output control action. + * @details Control action: + * + APT_OUT_CTRL_ACTION_DISABLE -- Disable output protect control. Output PWM directly + * + APT_OUT_CTRL_ACTION_LOW -- Output low level + * + APT_OUT_CTRL_ACTION_HIGH -- Output high level + * + APT_OUT_CTRL_ACTION_HOLD -- Hold the current output state + * + APT_OUT_CTRL_ACTION_TOGGLE -- Toggle the current output state + * + APT_OUT_CTRL_ACTION_HIGH_Z -- High-impedance output + */ +typedef enum { + APT_OUT_CTRL_ACTION_DISABLE = 0x00000000U, + APT_OUT_CTRL_ACTION_LOW = 0x00000001U, + APT_OUT_CTRL_ACTION_HIGH = 0x00000002U, + APT_OUT_CTRL_ACTION_HOLD = 0x00000003U, + APT_OUT_CTRL_ACTION_TOGGLE = 0x00000004U, + APT_OUT_CTRL_ACTION_HIGH_Z = 0x00000005U, +} APT_OutCtrlAction; + +/** + * @brief Event latch clear mode of cycle-by-cycle output control mode. + */ +typedef enum { + APT_CLEAR_CBC_ON_CNTR_ZERO = 0x00000001U, + APT_CLEAR_CBC_ON_CNTR_PERIOD = 0x00000002U, + APT_CLEAR_CBC_ON_CNTR_ZERO_PERIOD = 0x00000003U, +} APT_CBCClearMode; + +/** + * @brief Source of timer interrupt. + */ +typedef enum { + APT_INT_SRC_CNTR_DISABLE = 0x00000000U, + APT_INT_SRC_CNTR_ZERO = 0x00000001U, + APT_INT_SRC_CNTR_PERIOD = 0x00000002U, + APT_INT_SRC_CNTR_ZERO_PERIOD = 0x00000003U, + APT_INT_SRC_CNTR_CMPA_UP = 0x00000004U, + APT_INT_SRC_CNTR_CMPA_DOWN = 0x00000005U, + APT_INT_SRC_CNTR_CMPB_UP = 0x00000006U, + APT_INT_SRC_CNTR_CMPB_DOWN = 0x00000007U, + APT_INT_SRC_CNTR_CMPC_UP = 0x00000008U, + APT_INT_SRC_CNTR_CMPC_DOWN = 0x00000009U, + APT_INT_SRC_CNTR_CMPD_UP = 0x0000000AU, + APT_INT_SRC_CNTR_CMPD_DOWN = 0x0000000BU, +} APT_TimerInterruptSrc; + +/** + * @brief ADC trigger channels. + */ +typedef enum { + APT_ADC_CONVERSION_START_A = 0x00000001U, + APT_ADC_CONVERSION_START_B = 0x00000002U, +} APT_ADCTriggerChannel; + +/** + * @brief Source of ADC trigger channels. + */ +typedef enum { + APT_CS_SRC_COMBINE_EVENT_A1 = 0x00000000U, + APT_CS_SRC_CNTR_ZERO = 0x00000001U, + APT_CS_SRC_CNTR_PERIOD = 0x00000002U, + APT_CS_SRC_CNTR_ZERO_PERIOD = 0x00000003U, + APT_CS_SRC_CNTR_CMPA_UP = 0x00000004U, + APT_CS_SRC_CNTR_CMPA_DOWN = 0x00000005U, + APT_CS_SRC_CNTR_CMPB_UP = 0x00000006U, + APT_CS_SRC_CNTR_CMPB_DOWN = 0x00000007U, + APT_CS_SRC_CNTR_CMPC_UP = 0x00000008U, + APT_CS_SRC_CNTR_CMPC_DOWN = 0x00000009U, + APT_CS_SRC_CNTR_CMPD_UP = 0x0000000AU, + APT_CS_SRC_CNTR_CMPD_DOWN = 0x0000000BU, +} APT_ADCTriggerSource; + +/** + * @brief DMA request source of ADC Converter Start submodule. + */ +typedef enum { + APT_CS_DMA_REQ_SRC_DISABLE = 0x00000000U, + APT_CS_DMA_REQ_SRC_CHANNEL_A = 0x00000001U, + APT_CS_DMA_REQ_SRC_CHANNEL_B = 0x00000002U, +} APT_ADCTrgDMAReqSrc; + +/** + * @brief DMA request type of ADC Converter Start submodule. + */ +typedef enum { + APT_CS_DMA_SINGLE_REQUEST = 0x00000000U, + APT_CS_DMA_BURST_REQUEST = 0x00000002U, +} APT_ADCTrgDMAReqType; + +/** + * @brief Polarity of the events of Event Management submodule. + * @details Polarity: + * + APT_EM_EVENT_POLARITY_NOT_INVERT -- High active. + * + APT_EM_EVENT_POLARITY_INVERT -- Low active. + * + APT_EM_EVENT_POLARITY_FORCE_LOW -- Force event to low level. + * + APT_EM_EVENT_POLARITY_FORCE_HIGH -- Force event to high level. + */ +typedef enum { + APT_EM_EVENT_POLARITY_NOT_INVERT = 0x00000000U, + APT_EM_EVENT_POLARITY_INVERT = 0x00000001U, + APT_EM_EVENT_POLARITY_FORCE_LOW = 0x00000002U, + APT_EM_EVENT_POLARITY_FORCE_HIGH = 0x00000003U, +} APT_EMEventPolarity; + +/** + * @brief GPIO events and system events of Event Management submodule. + * The enumeration values are the register bit field offset of the corresponding GPIO/system events. + */ +typedef enum { + APT_EM_GPIO_EVENT_1 = 0U, + APT_EM_GPIO_EVENT_2 = 2U, + APT_EM_GPIO_EVENT_3 = 4U, + APT_EM_GPIO_EVENT_4 = 6U, + APT_EM_GPIO_EVENT_5 = 8U, + APT_EM_SYSTEM_EVENT_1 = 16U, + APT_EM_SYSTEM_EVENT_2 = 18U, + APT_EM_SYSTEM_EVENT_3 = 20U, +} APT_EMIOSysEvent; + +/** + * @brief Multiplexing events of Event Management submodule. + * The enumeration values are the register bit field offset of the corresponding multiplexing events. + */ +typedef enum { + APT_EM_MP_EVENT_1 = 0U, + APT_EM_MP_EVENT_2 = 2U, + APT_EM_MP_EVENT_3 = 4U, + APT_EM_MP_EVENT_4 = 6U, + APT_EM_MP_EVENT_5 = 8U, + APT_EM_MP_EVENT_6 = 10U, +} APT_EMMuxEvent; + +/** + * @brief Event Module of Event Management submodule. + */ +typedef enum { + APT_EM_MODULE_A = 0x00000000U, + APT_EM_MODULE_B = 0x00000001U, +} APT_EMGroup; + +/** + * @brief Group of combine event source input. + */ +typedef enum { + APT_EM_COMBINE_SRC_GRP_A1 = 0x00000000U, + APT_EM_COMBINE_SRC_GRP_A2 = 0x00000001U, + APT_EM_COMBINE_SRC_GRP_B1 = 0x00000002U, + APT_EM_COMBINE_SRC_GRP_B2 = 0x00000003U, +} APT_EMCombineEvtSrcGrp; + +/** + * @brief Source of combine events A1, A2, B1, B2. + */ +typedef enum { + APT_EM_COMBINE_SRC_EVT_1 = 0x00000000U, + APT_EM_COMBINE_SRC_EVT_2 = 0x00000001U, + APT_EM_COMBINE_SRC_EVT_3 = 0x00000002U, + APT_EM_COMBINE_SRC_EVT_MP_1 = 0x00000003U, + APT_EM_COMBINE_SRC_EVT_MP_2 = 0x00000004U, + APT_EM_COMBINE_SRC_EVT_MP_3 = 0x00000005U, + APT_EM_COMBINE_SRC_EVT_MP_4 = 0x00000006U, + APT_EM_COMBINE_SRC_EVT_MP_5 = 0x00000007U, + APT_EM_COMBINE_SRC_EVT_MP_6 = 0x00000008U, + APT_EM_COMBINE_SRC_ALL_EVENT_OR = 0x0000000FU, /* based on EM_AOR_EN/EM_BOR_EN */ +} APT_EMCombineEvtSrc; + +/** + * @brief Combine events of Event Management submodule. + */ +typedef enum { + APT_EM_COMBINE_EVENT_A1 = 0x00000000U, + APT_EM_COMBINE_EVENT_A2 = 0x00000001U, + APT_EM_COMBINE_EVENT_B1 = 0x00000002U, + APT_EM_COMBINE_EVENT_B2 = 0x00000003U, +} APT_EMCombineEvent; + +/** + * @brief Combine Mode of combine events A1, A2, B1, B2. + * @details combine mode: + * + The combine result is set output to low level + * + The combine result is qual to event 1 + * + The combine result is the logical AND of group event 1 high level and group event 2 low level + * + The combine result is the logical AND of group event 1 high level and group event 2 low level + * + The combine result is the logical AND of group event 1 high level and group event 2 high level + * + The combine result is the logical AND of group event 1 low level and group event 2 low level + */ +typedef enum { + APT_EM_COMBINE_LOW_LEVEL = 0x00000000U, + APT_EM_COMBINE_EVT1 = 0x00000001U, + APT_EM_COMBINE_EVT1_H_AND_EVT2_L = 0x00000002U, + APT_EM_COMBINE_EVT1_H_AND_EVT2_H = 0x00000003U, + APT_EM_COMBINE_EVT1_L_AND_EVT2_H = 0x00000004U, + APT_EM_COMBINE_EVT2 = 0x00000005U, +} APT_EMCombineEvtMode; + +/** + * @brief Output type of combine events. + * @details Output type: + * +APT_EM_COMBINE_EVENT_OUT_ORIG_SIGNAL -- The source of combine event is unfiltered + * +APT_EM_COMBINE_EVENT_OUT_FILT_SIGNAL -- The source of combine event is filtered + */ +typedef enum { + APT_EM_COMBINE_EVENT_OUT_ORIG_SIGNAL = 0x00000000U, + APT_EM_COMBINE_EVENT_OUT_FILT_SIGNAL = 0x00000001U, +} APT_EMCombineEventOut; + +/** + * @brief Polarity of mask window. + */ +typedef enum { + APT_BLANK_EVENT_INSIDE_MASK_WIN = 0x00000000U, + APT_BLANK_EVENT_OUTSIDE_MASK_WIN = 0x00000001U, +} APT_MaskWinPolarity; + +/** + * @brief Reset mode of mask window and count capture. + */ +typedef enum { + APT_RESET_MASK_WIN_DISABLE = 0x00000000U, + APT_RESET_MASK_WIN_CNTR_ZERO = 0x00000001U, + APT_RESET_MASK_WIN_CNTR_PERIOD = 0x00000002U, + APT_RESET_MASK_WIN_CNTR_ZERO_PERIOD = 0x00000003U, +} APT_MaskWinResetMode; + +/** + * @brief Clock source of valley capture. + */ +typedef enum { + APT_VALLY_CAP_USE_MAIN_CLOCK = 0x00000000U, + APT_VALLEY_CAP_USE_DIVIDER_CLOCK = 0x00000001U, +} APT_ValleyCapClkMode; + +/** + * @brief Trigger source of valley capture. + */ +typedef enum { + APT_VALLEY_CAP_SRC_DISABLE = 0x00000000U, + APT_VALLEY_CAP_SRC_CNTR_ZERO = 0x00000001U, + APT_VALLEY_CAP_SRC_CNTR_PERIOD = 0x00000002U, + APT_VALLEY_CAP_SRC_CNTR_ZERO_PERIOD = 0x00000003U, + APT_VALLEY_CAP_SRC_COMBINE_EVENT_A1 = 0x00000004U, + APT_VALLEY_CAP_SRC_COMBINE_EVENT_A2 = 0x00000005U, + APT_VALLEY_CAP_SRC_COMBINE_EVENT_B1 = 0x00000006U, + APT_VALLEY_CAP_SRC_COMBINE_EVENT_B2 = 0x00000007U, +} APT_ValleyCapRstType; + +/** + * @brief Edge type of valley capture. + */ +typedef enum { + APT_VALLEY_CAP_RISING_EDGE = 0x00000000U, + APT_VALLEY_CAP_FALLING_EDGE = 0x00000001U, +} APT_ValleyCapEdgeType; + +/** + * @brief Delay calibration of valley capture. + * @details Delay calibration: + * + APT_VCAP_SW_DELAY -- Delay value = software delay value + * + APT_VCAP_VCNT_DELAY_DIVIDE_1_SW_DELAY -- Delay value = capture count value + software delay value + * + APT_VCAP_VCNT_DELAY_DIVIDE_2_SW_DELAY -- Delay value = capture count value / 2 + software delay value + * + APT_VCAP_VCNT_DELAY_DIVIDE_4_SW_DELAY -- Delay value = capture count value / 4 + software delay value + * + APT_VCAP_VCNT_DELAY_DIVIDE_8_SW_DELAY -- Delay value = capture count value / 8 + software delay value + * + APT_VCAP_VCNT_DELAY_DIVIDE_16_SW_DELAY -- Delay value = capture count value / 16 + software delay value + * + APT_VCAP_VCNT_DELAY_DIVIDE_32_SW_DELAY -- Delay value = capture count value / 32 + software delay value + */ +typedef enum { + APT_VCAP_SW_DELAY = 0x00000000U, + APT_VCAP_VCNT_DELAY_DIVIDE_1_SW_DELAY = 0x00000001U, + APT_VCAP_VCNT_DELAY_DIVIDE_2_SW_DELAY = 0x00000002U, + APT_VCAP_VCNT_DELAY_DIVIDE_4_SW_DELAY = 0x00000003U, + APT_VCAP_VCNT_DELAY_DIVIDE_8_SW_DELAY = 0x00000004U, + APT_VCAP_VCNT_DELAY_DIVIDE_16_SW_DELAY = 0x00000005U, + APT_VCAP_VCNT_DELAY_DIVIDE_32_SW_DELAY = 0x00000006U, +} APT_ValleyDelayMode; + +/** + * @brief Start and stop edge of valley capture. + */ +typedef enum { + APT_VALLEY_COUNT_START_EDGE = 0x00000000U, + APT_VALLEY_COUNT_STOP_EDGE = 0x00000001U, +} APT_ValleyCountEdge; + +/** + * @brief Edge filter mode of Event Management submodule. + */ +typedef enum { + APT_EM_EDGEFILTER_MODE_RISING = 0x00000000U, + APT_EM_EDGEFILTER_MODE_FALLING = 0x00000002U, + APT_EM_EDGEFILTER_MODE_BOTH = 0x00000003U, +} APT_EMEdgeFilterMode; + +/** + * @brief Sync-in source of slave APT module. + */ +typedef enum { + APT_SYNCIN_SRC_APT0_SYNCOUT = 0x00000000U, + APT_SYNCIN_SRC_APT1_SYNCOUT = 0x00000001U, + APT_SYNCIN_SRC_APT2_SYNCOUT = 0x00000002U, + APT_SYNCIN_SRC_APT3_SYNCOUT = 0x00000003U, + APT_SYNCIN_SRC_APT4_SYNCOUT = 0x00000004U, + APT_SYNCIN_SRC_APT5_SYNCOUT = 0x00000005U, + APT_SYNCIN_SRC_APT6_SYNCOUT = 0x00000006U, + APT_SYNCIN_SRC_APT7_SYNCOUT = 0x00000007U, + APT_SYNCIN_SRC_APT8_SYNCOUT = 0x00000008U, + APT_SYNCIN_SRC_CAPM0_SYNCOUT = 0x00000009U, + APT_SYNCIN_SRC_CAPM1_SYNCOUT = 0x0000000AU, + APT_SYNCIN_SRC_CAPM2_SYNCOUT = 0x0000000BU, + APT_SYNCIN_SRC_GPIO_EVENT_4 = 0x0000000CU, + APT_SYNCIN_SRC_GPIO_EVENT_5 = 0x0000000DU, + APT_SYNCIN_SRC_DISABLE = 0x0000000EU, +} APT_SyncInSrc; + +/** + * @brief Sync-out mode of master APT module. + * @details Sync-out mode: + * + APT_SYNCOUT_ONE_SHOT_MODE -- One-Shot synchronization mode + * + APT_SYNCOUT_MULTIPLE_MODE -- Multiple synchronization mode + */ +typedef enum { + APT_SYNCOUT_ONE_SHOT_MODE = 0x00000000U, + APT_SYNCOUT_MULTIPLE_MODE = 0x00000001U, +} APT_SyncOutMode; + +/** + * @brief Selection of sync-out latch when using one-shot sync-out mode. + * @details Sync-out latch: + * + APT_SYNCOUT_LATCH_SET_ON_SW_FORCE -- Select rg_latset_otsyn as the latch set condition + * + APT_SYNCOUT_LATCH_SET_ON_GLB_LOAD -- Select rg_latset_otgld as the latch set condition + */ +typedef enum { + APT_SYNCOUT_LATCH_SET_ON_SW_FORCE = 0x00000000U, + APT_SYNCOUT_LATCH_SET_ON_GLB_LOAD = 0x00000001U, +} APT_SyncOutLatSetSel; + +/** + * @brief Source of peripheral synchronization. + */ +typedef enum { + APT_PER_SYNCOUT_SRC_DISABLE = 0x00000000U, + APT_PER_SYNCOUT_SRC_CNTR_ZERO = 0x00000001U, + APT_PER_SYNCOUT_SRC_CNTR_PERIOD = 0x00000002U, + APT_PER_SYNCOUT_SRC_CNTR_ZERO_PERIOD = 0x00000003U, + APT_PER_SYNCOUT_SRC_CNTR_CMPC_UP = 0x00000004U, + APT_PER_SYNCOUT_SRC_CNTR_CMPC_DOWN = 0x00000005U, + APT_PER_SYNCOUT_SRC_CNTR_CMPD_UP = 0x00000006U, + APT_PER_SYNCOUT_SRC_CNTR_CMPD_DOWN = 0x00000007U, +} APT_PeriphSyncOutSrc; + +/** + * @brief Global buffer load mode. + */ +typedef enum { + APT_GLB_LOAD_ONE_SHOT_MODE = 0x00000000U, + APT_GLB_LOAD_MULTIPLE_MODE = 0x00000001U, +} APT_GlobalLoadMode; + +/** + * @brief The buffer of the registers that support buffer register. + */ +typedef enum { + APT_REG_BUFFER_TC_PRD = 0x00000001U, + APT_REG_BUFFER_TC_REFA = 0x00000002U, + APT_REG_BUFFER_TC_REFB = 0x00000004U, + APT_REG_BUFFER_TC_REFC = 0x00000008U, + APT_REG_BUFFER_TC_REFD = 0x00000010U, + APT_REG_BUFFER_PG_ACT_A = 0x00000040U, + APT_REG_BUFFER_PG_ACT_B = 0x00000080U, + APT_REG_BUFFER_PG_OUT_FRC = 0x00000100U, + APT_REG_BUFFER_DG_RED = 0x00000400U, + APT_REG_BUFFER_DG_FED = 0x00000800U, + APT_REG_BUFFER_DG_CFG = 0x00001000U, +} APT_RegBuffer; + +/** + * @brief Software force events. + */ +typedef enum { + APT_FORCE_EVENT_COUNTER_SYNC = 0x00000001U, + APT_FORCE_EVENT_SYNCOUT = 0x00000010U, + APT_FORCE_EVENT_SYNC_PERIPH = 0x00000100U, + APT_FORCE_EVENT_GLOBAL_LOAD = 0x00001000U, + APT_FORCE_EVENT_VALLEY_CAP_RST = 0x00010000U, + APT_FORCE_EVENT_ADC_START_A = 0x00100000U, + APT_FORCE_EVENT_ADC_START_B = 0x00200000U, + APT_FORCE_EVENT_TIMER_INTERRUPT = 0x01000000U, + APT_FORCE_EVENT_PWM_ACTION_BUF_LOAD = 0x10000000U, +} APT_ForceEvtType; + +/** + * @brief Software force events. + * @details Reference point selection. + * + APT_REFERENCE_DOTA -- Select referece dot A as action trigger point. + * + APT_REFERENCE_DOTB -- Select referece dot B as action trigger point. + * + APT_REFERENCE_DOTC -- Select referece dot C as action trigger point. + * + APT_REFERENCE_DOTD -- Select referece dot D as action trigger point. + */ +typedef enum { + APT_REFERENCE_DOTA = 0x00000000U, + APT_REFERENCE_DOTB = 0x00000001U, + APT_REFERENCE_DOTC = 0x00000002U, + APT_REFERENCE_DOTD = 0x00000003U, +} APT_RefDotSelect; + +/** + * @brief Configure action point parameters. + * @details Property of the action point. + * + refDotValue -- the action point value. + * + refDotDivValue -- frequency division value of the action point. + * + pwmChannel -- number of channels for which the action point needs to be changed. @ref APT_PWMChannel + * + actionEvent -- action event configure of reference point. @ref APT_PWMActionEvent + * + action -- triggle action of reference point. @ref APT_PWMAction + * @note: the value of Reference Point must be less than or equal to the value of period. + */ +typedef struct { + unsigned int refDotValue; + APT_PWMChannel pwmChannel; /* PWM channel selection. */ + APT_PWMActionEvent actionEvent; /* Point triggle action event. */ + APT_PWMAction action; /* Point action. */ +} APT_RefDotParameters; +/** + * @} + */ + +/** + * @defgroup APT_REG_Definition APT Register Structure. + * @brief APT Register Structure Definition. + * @{ + */ +typedef union { + unsigned int reg; + struct { + unsigned int sub_version : 4; /**< ip subversion */ + unsigned int main_version : 4; /**< ip main verison */ + unsigned int reserved0 : 24; + } BIT; +} volatile VER_INFO_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_cnt_mode : 2; /**< timer work mode */ + unsigned int reserved1 : 14; + unsigned int rg_div_fac : 12; /**< divider factor */ + unsigned int rg_emu_stop : 2; /**< emulation stop mode */ + unsigned int reserved2 : 2; + } BIT; +} volatile TC_MODE_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_cnt_phs : 16; /**< timer's phase */ + unsigned int reserved3 : 15; + unsigned int rg_cnt_dir : 1; /**< timer count direction */ + } BIT; +} volatile TC_PHS_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_cnt_ovrid : 16; /**< timer count init value */ + unsigned int reserved4 : 15; + unsigned int rg_cnt_ovrid_en : 1; /**< timer and divider init enable */ + } BIT; +} volatile TC_OVRID_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_cnt_prd : 16; /* count period */ + unsigned int reserved5 : 16; + } BIT; +} volatile TC_PRD_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_cnt_refa : 16; /* reference A counter value */ + unsigned int reserved6 : 16; + } BIT; +} volatile TC_REFA_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_cnt_refb : 16; /* reference B counter value */ + unsigned int reserved7 : 16; + } BIT; +} volatile TC_REFB_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_cnt_refc : 16; /* reference C counter value */ + unsigned int reserved8 : 16; + } BIT; +} volatile TC_REFC_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_cnt_refd : 16; /* reference D counter value */ + unsigned int reserved9 : 16; + } BIT; +} volatile TC_REFD_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_prd_buf_en : 1; /**< period buffer enable */ + unsigned int rg_prd_gld_en : 1; /**< period global buffer enable */ + unsigned int reserved10 : 2; + unsigned int rg_refa_buf_en : 1; /**< reference A buffer enable */ + unsigned int rg_refa_gld_en : 1; /**< reference A global buffer enable */ + unsigned int rg_refb_buf_en : 1; /**< reference B buffer enable */ + unsigned int rg_refb_gld_en : 1; /**< reference B global buffer enable */ + unsigned int rg_refc_buf_en : 1; /**< reference C buffer enable */ + unsigned int rg_refc_gld_en : 1; /**< reference C global buffer enable */ + unsigned int rg_refd_buf_en : 1; /**< reference D buffer enable */ + unsigned int rg_refd_gld_en : 1; /**< reference D global buffer enable */ + unsigned int reserved11 : 20; + } BIT; +} volatile TC_BUF_EN_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_prd_ld_zroen : 1; /**< period value register load at zero */ + unsigned int reserved12 : 1; + unsigned int rg_prd_ld_a1en : 1; /**< period value load at evt_a1 */ + unsigned int rg_prd_ld_b1en : 1; /**< period value load at evt_b1 */ + unsigned int rg_prd_ld_synen : 1; /**< period value load at sync signal input */ + unsigned int reserved13 : 27; + } BIT; +} volatile TC_PRD_LOAD_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_refa_ld_zroen : 1; /**< reference A value load at zero */ + unsigned int rg_refa_ld_prden : 1; /**< reference A value load at period */ + unsigned int rg_refa_ld_a1en : 1; /**< reference A value load at evt_a1 */ + unsigned int rg_refa_ld_b1en : 1; /**< reference A value load at evt_b1 */ + unsigned int rg_refa_ld_synen : 1; /**< reference A value load at sync signal input */ + unsigned int reserved14 : 3; + unsigned int rg_refb_ld_zroen : 1; /**< reference B value load at zero */ + unsigned int rg_refb_ld_prden : 1; /**< reference B value load at period */ + unsigned int rg_refb_ld_a1en : 1; /**< reference B value load at evt_a1 */ + unsigned int rg_refb_ld_b1en : 1; /**< reference B value load at evt_b1 */ + unsigned int rg_refb_ld_synen : 1; /**< reference B value load at sync signal input */ + unsigned int reserved15 : 3; + unsigned int rg_refc_ld_zroen : 1; /**< reference C value load at zero */ + unsigned int rg_refc_ld_prden : 1; /**< reference C value load at period */ + unsigned int rg_refc_ld_a1en : 1; /**< reference C value load at evt_a1 */ + unsigned int rg_refc_ld_b1en : 1; /**< reference C value load at evt_b1 */ + unsigned int rg_refc_ld_synen : 1; /**< reference C value load at sync signal input */ + unsigned int reserved16 : 3; + unsigned int rg_refd_ld_zroen : 1; /**< reference D value load at zero */ + unsigned int rg_refd_ld_prden : 1; /**< reference D value load at period */ + unsigned int rg_refd_ld_a1en : 1; /**< reference D value load at evt_a1 */ + unsigned int rg_refd_ld_b1en : 1; /**< reference D value load at evt_b1 */ + unsigned int rg_refd_ld_synen : 1; /**< reference D value load at sync signal input */ + unsigned int reserved17 : 3; + } BIT; +} volatile TC_REF_LOAD_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_mskwd_psel : 1; /**< mask window polarity */ + unsigned int reserved18 : 30; + unsigned int rg_mskwd_en : 1; /**< mask window enable */ + } BIT; +} volatile TC_MWD_EN_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_mwd_refa : 16; /**< mask window reference value A */ + unsigned int reserved19 : 16; + } BIT; +} volatile TC_MWDREFA_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_mwd_refb : 16; /**< mask window reference value B */ + unsigned int reserved20 : 16; + } BIT; +} volatile TC_MWDREFB_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_mwdrefa_act_inc : 2; /**< action at reference A increase */ + unsigned int rg_mwdrefa_act_dec : 2; /**< action at reference A decrease */ + unsigned int rg_mwdrefb_act_inc : 2; /**< action at reference B increase */ + unsigned int rg_mwdrefb_act_dec : 2; /**< action at reference B decrease */ + unsigned int reserved21 : 24; + } BIT; +} volatile TC_MWD_ACT_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_mwdrefa_buf_en : 1; /**< mask window reference A buffer enable */ + unsigned int rg_mwdrefa_gld_en : 1; /**< mask window reference A global buffer enable */ + unsigned int rg_mwdrefb_buf_en : 1; /**< mask window reference B buffer enable */ + unsigned int rg_mwdrefb_gld_en : 1; /**< mask window reference B global buffer enable */ + unsigned int rg_mwd_act_buf_en : 1; /**< mask window action buffer enable */ + unsigned int rg_mwd_act_gld_en : 1; /**< mask window action global buffer enable */ + unsigned int reserved22 : 26; + } BIT; +} volatile TC_MWD_BUF_EN_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_mwdrefa_ld_zroen : 1; /**< mask window refrence A load at zero enable */ + unsigned int rg_mwdrefa_ld_prden : 1; /**< mask window refrence A load at period enable */ + unsigned int reserved23 : 1; + unsigned int rg_mwdrefb_ld_zroen : 1; /**< mask window refrence B load at zero enable */ + unsigned int rg_mwdrefb_ld_prden : 1; /**< mask window refrence B load at period enable */ + unsigned int reserved24 : 1; + unsigned int rg_mwd_act_ld_zroen : 1; /**< mask window action register load at zero enable */ + unsigned int rg_mwd_act_ld_prden : 1; /**< mask window action register load at period enable */ + unsigned int reserved25 : 24; + } BIT; +} volatile TC_MWD_LOAD_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int ro_cnt_val : 16; /**< counter value */ + unsigned int ro_div_cnt : 12; /**< divider value */ + unsigned int reserved26 : 3; + unsigned int ro_cnt_dir : 1; /**< count direction */ + } BIT; +} volatile TC_STS_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_pga_act_zro : 2; /**< PG channel A action at zero */ + unsigned int rg_pga_act_prd : 2; /**< PG channel A action at period */ + unsigned int rg_pga_act_refa_inc : 2; /**< PG channel A action at reference A increase */ + unsigned int rg_pga_act_refa_dec : 2; /**< PG channel A action at reference A decrease */ + unsigned int rg_pga_act_refb_inc : 2; /**< PG channel A action at reference B increase */ + unsigned int rg_pga_act_refb_dec : 2; /**< PG channel A action at reference B decrease */ + unsigned int rg_pga_act_refc_inc : 2; /**< PG channel A action at reference C increase */ + unsigned int rg_pga_act_refc_dec : 2; /**< PG channel A action at reference C decrease */ + unsigned int rg_pga_act_refd_inc : 2; /**< PG channel A action at reference D increase */ + unsigned int rg_pga_act_refd_dec : 2; /**< PG channel A action at reference D decrease */ + unsigned int rg_pga_act_evtc1_inc : 2; /**< PG channel A action at evt_c1 increase */ + unsigned int rg_pga_act_evtc1_dec : 2; /**< PG channel A action at evt_c1 decrease */ + unsigned int rg_pga_act_evtc2_inc : 2; /**< PG channel A action at evt_c2 increase */ + unsigned int rg_pga_act_evtc2_dec : 2; /**< PG channel A action at evt_c2 decrease */ + unsigned int reserved27 : 4; + } BIT; +} volatile PG_ACT_A_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_pgb_act_zro : 2; /**< PG channel A action at zero */ + unsigned int rg_pgb_act_prd : 2; /**< PG channel A action at period */ + unsigned int rg_pgb_act_refa_inc : 2; /**< PG channel A action at reference A increase */ + unsigned int rg_pgb_act_refa_dec : 2; /**< PG channel A action at reference A decrease */ + unsigned int rg_pgb_act_refb_inc : 2; /**< PG channel A action at reference B increase */ + unsigned int rg_pgb_act_refb_dec : 2; /**< PG channel A action at reference B decrease */ + unsigned int rg_pgb_act_refc_inc : 2; /**< PG channel A action at reference C increase */ + unsigned int rg_pgb_act_refc_dec : 2; /**< PG channel A action at reference C decrease */ + unsigned int rg_pgb_act_refd_inc : 2; /**< PG channel A action at reference D increase */ + unsigned int rg_pgb_act_refd_dec : 2; /**< PG channel A action at reference D decrease */ + unsigned int rg_pgb_act_evtc1_inc : 2; /**< PG channel A action at evt_c1 increase */ + unsigned int rg_pgb_act_evtc1_dec : 2; /**< PG channel A action at evt_c1 decrease */ + unsigned int rg_pgb_act_evtc2_inc : 2; /**< PG channel A action at evt_c2 increase */ + unsigned int rg_pgb_act_evtc2_dec : 2; /**< PG channel A action at evt_c2 decrease */ + unsigned int reserved28 : 4; + } BIT; +} volatile PG_ACT_B_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_pga_act_evt_frc : 2; /**< channel A force action select */ + unsigned int rg_pga_evt_frc : 1; /**< enable a force action at channel A */ + unsigned int reserved29 : 1; + unsigned int rg_pgb_act_evt_frc : 2; /**< channel A force action select */ + unsigned int rg_pgb_evt_frc : 1; /**< enable a force action at channel A */ + unsigned int reserved30 : 25; + } BIT; +} volatile PG_ACT_FRC_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_pga_frc_act : 2; /**< channel A force output action select */ + unsigned int rg_pga_frc_en : 1; /**< channel A force output action enable */ + unsigned int reserved31 : 1; + unsigned int rg_pgb_frc_act : 2; /**< channel A force output action select */ + unsigned int rg_pgb_frc_en : 1; /**< channel A force output action enable */ + unsigned int reserved32 : 25; + } BIT; +} volatile PG_OUT_FRC_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_acta_buf_en : 1; /**< channel A action value buffer enable */ + unsigned int rg_acta_gld_en : 1; /**< channel A action value global buffer enable */ + unsigned int rg_actb_buf_en : 1; /**< channel B action value buffer enable */ + unsigned int rg_actb_gld_en : 1; /**< channel B action value global buffer enable */ + unsigned int rg_frc_buf_en : 1; /**< force output config buffer enable */ + unsigned int rg_frc_gld_en : 1; /**< force output config global buffer enable */ + unsigned int reserved33 : 26; + } BIT; +} volatile PG_BUF_EN_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_pga_actld_zroen : 1; /**< enable PG channel A action value independent load at zero */ + unsigned int rg_pga_actld_prden : 1; /**< enable PG channel A action value independent load at period */ + unsigned int rg_pga_actld_a1en : 1; /**< enable PG channel A action value independent load at evt_a1 */ + unsigned int rg_pga_actld_b1en : 1; /**< enable PG channel A action value independent load at evt_b1 */ + unsigned int rg_pga_actld_synen : 1; /**< enable PG channel A action value independent load at sync signal */ + unsigned int reserved34 : 3; + unsigned int rg_pgb_actld_zroen : 1; /**< enable PG channel B action value independent load at zero */ + unsigned int rg_pgb_actld_prden : 1; /**< enable PG channel B action value independent load at period */ + unsigned int rg_pgb_actld_a1en : 1; /**< enable PG channel B action value independent load at evt_a1 */ + unsigned int rg_pgb_actld_b1en : 1; /**< enable PG channel B action value independent load at evt_b1 */ + unsigned int rg_pgb_actld_synen : 1; /**< enable PG channel B action value independent load at sync signal */ + unsigned int reserved35 : 3; + unsigned int rg_pg_frcld_zroen : 1; /**< enable force action config value independent load at zero */ + unsigned int rg_pg_frcld_prden : 1; /**< enable force action config value independent load at period */ + unsigned int reserved36 : 2; + unsigned int rg_pg_frcld_synen : 1; /**< enable force action config value independent load at sync signal */ + unsigned int reserved37 : 3; + unsigned int reserved38 : 8; + } BIT; +} volatile PG_ACT_LD_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_pga_evtc1_sel : 4; /**< pga_evtc1 source select */ + unsigned int rg_pga_evtc2_sel : 4; /**< pga_evtc2 source select */ + unsigned int rg_pgb_evtc1_sel : 4; /**< pgb_evtc1 source select */ + unsigned int rg_pgb_evtc2_sel : 4; /**< pgb_evtc2 source select */ + unsigned int reserved39 : 16; + } BIT; +} volatile PG_EVTC_SEL_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_dg_red : 16; /**< deadband time at rising edge */ + unsigned int reserved0 : 16; + } BIT; +} volatile DG_RED_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_dg_fed : 16; /**< deadband timer at falling edge */ + unsigned int reserved0 : 16; + } BIT; +} volatile DG_FED_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_dg_red_isel : 2; /**< rising edge delay source input select */ + unsigned int rg_dg_fed_isel : 2; /**< falling edge delay source input select */ + unsigned int rg_dg_red_osel : 2; /**< rising edge delay polarity select */ + unsigned int rg_dg_fed_osel : 2; /**< falling edge delay polarity select */ + unsigned int rg_dga_osel : 1; /**< dga output waveform swap select */ + unsigned int rg_dgb_osel : 1; /**< dgb output waveform swap select */ + unsigned int reserved42 : 22; + } BIT; +} volatile DG_CFG_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_red_buf_en : 1; /**< rising edge delay value buffer enable */ + unsigned int rg_red_gld_en : 1; /**< rising edge delay value global buffer enable */ + unsigned int rg_fed_buf_en : 1; /**< falling edge delay value buffer enable */ + unsigned int rg_fed_gld_en : 1; /**< falling edge delay value global buffer enable */ + unsigned int rg_cfg_buf_en : 1; /**< deadband config buffer enable */ + unsigned int rg_cfg_gld_en : 1; /**< deadband config global enable */ + unsigned int reserved43 : 26; + } BIT; +} volatile DG_BUF_EN_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_red_ld_zroen : 1; /**< rising edge delay value load independent at zero */ + unsigned int rg_red_ld_prden : 1; /**< rising edge delay value load independent at period */ + unsigned int reserved44 : 6; + unsigned int rg_fed_ld_zroen : 1; /**< falling edge delay value load independent at zero */ + unsigned int rg_fed_ld_prden : 1; /**< falling edge delay value load independent at period */ + unsigned int reserved45 : 6; + unsigned int rg_cfg_ld_zroen : 1; /**< deadband config register value load independent at zero */ + unsigned int rg_cfg_ld_prden : 1; /**< deadband config register value load independent at period */ + unsigned int reserved46 : 14; + } BIT; +} volatile DG_BUF_LOAD_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_oc_en_evt1 : 1; /**< evtio1 output control enable */ + unsigned int rg_oc_en_evt2 : 1; /**< evtio2 output control enable */ + unsigned int rg_oc_en_evt3 : 1; /**< evtio3 output control enable */ + unsigned int reserved47 : 1; + unsigned int rg_oc_en_evts1 : 1; /**< evts1 output control enable */ + unsigned int rg_oc_en_evts2 : 1; /**< evts2 output control enable */ + unsigned int rg_oc_en_evts3 : 1; /**< evts3 output control enable */ + unsigned int reserved48 : 1; + unsigned int rg_oc_en_evta1 : 1; /**< evta1 output control enable */ + unsigned int rg_oc_en_evta2 : 1; /**< evta2 output control enable */ + unsigned int rg_oc_en_evtb1 : 1; /**< evtb1 output control enable */ + unsigned int rg_oc_en_evtb2 : 1; /**< evtb2 output control enable */ + unsigned int reserved49 : 4; + unsigned int rg_oc_mode_evt1 : 1; /**< evtio1 output mode select */ + unsigned int rg_oc_mode_evt2 : 1; /**< evtio2 output mode select */ + unsigned int rg_oc_mode_evt3 : 1; /**< evtio3 output mode select */ + unsigned int reserved50 : 1; + unsigned int rg_oc_mode_evts1 : 1; /**< evts1 output mode select */ + unsigned int rg_oc_mode_evts2 : 1; /**< evts2 output mode select */ + unsigned int rg_oc_mode_evts3 : 1; /**< evts3 output mode select */ + unsigned int reserved51 : 1; + unsigned int rg_oc_mode_evta1 : 1; /**< evta1 output mode select */ + unsigned int rg_oc_mode_evta2 : 1; /**< evta2 output mode select */ + unsigned int rg_oc_mode_evtb1 : 1; /**< evtb1 output mode select */ + unsigned int rg_oc_mode_evtb2 : 1; /**< evtb2 output mode select */ + unsigned int reserved52 : 4; + } BIT; +} volatile OC_MODE_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_oc_laten_evt1 : 1; /**< output control evtio1 latch event enable */ + unsigned int rg_oc_laten_evt2 : 1; /**< output control evtio2 latch event enable */ + unsigned int rg_oc_laten_evt3 : 1; /**< output control evtio3 latch event enable */ + unsigned int reserved53 : 1; + unsigned int rg_oc_laten_evts1 : 1; /**< output control evtis1 latch event enable */ + unsigned int rg_oc_laten_evts2 : 1; /**< output control evtis2 latch event enable */ + unsigned int rg_oc_laten_evts3 : 1; /**< output control evtis3 latch event enable */ + unsigned int reserved54 : 1; + unsigned int rg_oc_laten_evta1 : 1; /**< output control evtia1 latch event enable */ + unsigned int rg_oc_laten_evta2 : 1; /**< output control evtia2 latch event enable */ + unsigned int rg_oc_laten_evtb1 : 1; /**< output control evtib1 latch event enable */ + unsigned int rg_oc_laten_evtb2 : 1; /**< output control evtib2 latch event enable */ + unsigned int reserved55 : 20; + } BIT; +} volatile OC_LAT_EN_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_oca_evtio_inc : 3; /**< channel A output control action at evtio increase */ + unsigned int rg_oca_evta1_inc : 3; /**< channel A output control action at evta1 increase */ + unsigned int rg_oca_evta2_inc : 3; /**< channel A output control action at evta2 increase */ + unsigned int rg_oca_evtb1_inc : 3; /**< channel A output control action at evtb1 increase */ + unsigned int rg_oca_evtb2_inc : 3; /**< channel A output control action at evtb2 increase */ + unsigned int reserved56 : 1; + unsigned int rg_oca_evtio_dec : 3; /**< channel A output control action at evtio decrease */ + unsigned int rg_oca_evta1_dec : 3; /**< channel A output control action at evta1 decrease */ + unsigned int rg_oca_evta2_dec : 3; /**< channel A output control action at evta2 decrease */ + unsigned int rg_oca_evtb1_dec : 3; /**< channel A output control action at evtb1 decrease */ + unsigned int rg_oca_evtb2_dec : 3; /**< channel A output control action at evtb2 decrease */ + unsigned int reserved57 : 1; + } BIT; +} volatile OC_ACT_A_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_ocb_evtio_inc : 3; /**< channel B output control action at evtio increase */ + unsigned int rg_ocb_evta1_inc : 3; /**< channel B output control action at evta1 increase */ + unsigned int rg_ocb_evta2_inc : 3; /**< channel B output control action at evta2 increase */ + unsigned int rg_ocb_evtb1_inc : 3; /**< channel B output control action at evtb1 increase */ + unsigned int rg_ocb_evtb2_inc : 3; /**< channel B output control action at evtb2 increase */ + unsigned int reserved58 : 1; + unsigned int rg_ocb_evtio_dec : 3; /**< channel B output control action at evtio decrease */ + unsigned int rg_ocb_evta1_dec : 3; /**< channel B output control action at evta1 decrease */ + unsigned int rg_ocb_evta2_dec : 3; /**< channel B output control action at evta2 decrease */ + unsigned int rg_ocb_evtb1_dec : 3; /**< channel B output control action at evtb1 decrease */ + unsigned int rg_ocb_evtb2_dec : 3; /**< channel B output control action at evtb2 decrease */ + unsigned int reserved59 : 1; + } BIT; +} volatile OC_ACT_B_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int ro_oc_flag_evt1 : 1; /**< output control evtio1 flag */ + unsigned int ro_oc_flag_evt2 : 1; /**< output control evtio2 flag */ + unsigned int ro_oc_flag_evt3 : 1; /**< output control evtio3 flag */ + unsigned int reserved60 : 1; + unsigned int ro_oc_flag_evts1 : 1; /**< output control evts1 flag */ + unsigned int ro_oc_flag_evts2 : 1; /**< output control evts2 flag */ + unsigned int ro_oc_flag_evts3 : 1; /**< output control evts3 flag */ + unsigned int reserved61 : 1; + unsigned int ro_oc_flag_evta1 : 1; /**< output control evta1 flag */ + unsigned int ro_oc_flag_evta2 : 1; /**< output control evta2 flag */ + unsigned int ro_oc_flag_evtb1 : 1; /**< output control evtb1 flag */ + unsigned int ro_oc_flag_evtb2 : 1; /**< output control evtb2 flag */ + unsigned int reserved62 : 3; + unsigned int ro_int_flag_evt : 1; /**< output control event interrupt flag */ + unsigned int rg_oc_clr_evt1 : 1; /**< output control evtio1 clear bit */ + unsigned int rg_oc_clr_evt2 : 1; /**< output control evtio2 clear bit */ + unsigned int rg_oc_clr_evt3 : 1; /**< output control evtio3 clear bit */ + unsigned int reserved63 : 1; + unsigned int rg_oc_clr_evts1 : 1; /**< output control evts1 clear bit */ + unsigned int rg_oc_clr_evts2 : 1; /**< output control evts2 clear bit */ + unsigned int rg_oc_clr_evts3 : 1; /**< output control evts3 clear bit */ + unsigned int reserved64 : 1; + unsigned int rg_oc_clr_evta1 : 1; /**< output control evta1 clear bit */ + unsigned int rg_oc_clr_evta2 : 1; /**< output control evta2 clear bit */ + unsigned int rg_oc_clr_evtb1 : 1; /**< output control evtb1 clear bit */ + unsigned int rg_oc_clr_evtb2 : 1; /**< output control evtb2 clear bit */ + unsigned int reserved65 : 3; + unsigned int rg_int_clr_evt : 1; /**< output control event interrupt clear bit */ + } BIT; +} volatile OC_EVT_FLAG_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_oc_clr_zroen_evt1 : 1; /**< enable clear evtio1 at zero */ + unsigned int rg_oc_clr_zroen_evt2 : 1; /**< enable clear evtio2 at zero */ + unsigned int rg_oc_clr_zroen_evt3 : 1; /**< enable clear evtio3 at zero */ + unsigned int reserved66 : 1; + unsigned int rg_oc_clr_zroen_evts1 : 1; /**< enable clear evts1 at zero */ + unsigned int rg_oc_clr_zroen_evts2 : 1; /**< enable clear evts2 at zero */ + unsigned int rg_oc_clr_zroen_evts3 : 1; /**< enable clear evts3 at zero */ + unsigned int reserved67 : 1; + unsigned int rg_oc_clr_zroen_evta1 : 1; /**< enable clear evta1 at zero */ + unsigned int rg_oc_clr_zroen_evta2 : 1; /**< enable clear evta2 at zero */ + unsigned int rg_oc_clr_zroen_evtb1 : 1; /**< enable clear evtb1 at zero */ + unsigned int rg_oc_clr_zroen_evtb2 : 1; /**< enable clear evtb2 at zero */ + unsigned int reserved68 : 4; + unsigned int rg_oc_clr_prden_evt1 : 1; /**< enable clear evtio1 at period */ + unsigned int rg_oc_clr_prden_evt2 : 1; /**< enable clear evtio2 at period */ + unsigned int rg_oc_clr_prden_evt3 : 1; /**< enable clear evtio3 at period */ + unsigned int reserved69 : 1; + unsigned int rg_oc_clr_prden_evts1 : 1; /**< enable clear evts1 at period */ + unsigned int rg_oc_clr_prden_evts2 : 1; /**< enable clear evts2 at period */ + unsigned int rg_oc_clr_prden_evts3 : 1; /**< enable clear evts3 at period */ + unsigned int reserved70 : 1; + unsigned int rg_oc_clr_prden_evta1 : 1; /**< enable clear evta1 at period */ + unsigned int rg_oc_clr_prden_evta2 : 1; /**< enable clear evta2 at period */ + unsigned int rg_oc_clr_prden_evtb1 : 1; /**< enable clear evtb1 at period */ + unsigned int rg_oc_clr_prden_evtb2 : 1; /**< enable clear evtb2 at period */ + unsigned int reserved71 : 4; + } BIT; +} volatile OC_PRD_CLR_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_oc_frc_evt1 : 1; /**< force enable evtio1 event */ + unsigned int rg_oc_frc_evt2 : 1; /**< force enable evtio2 event */ + unsigned int rg_oc_frc_evt3 : 1; /**< force enable evtio3 event */ + unsigned int reserved72 : 1; + unsigned int rg_oc_frc_evts1 : 1; /**< force enable evts1 event */ + unsigned int rg_oc_frc_evts2 : 1; /**< force enable evts2 event */ + unsigned int rg_oc_frc_evts3 : 1; /**< force enable evts3 event */ + unsigned int reserved73 : 1; + unsigned int rg_oc_frc_evta1 : 1; /**< force enable evta1 event */ + unsigned int rg_oc_frc_evta2 : 1; /**< force enable evta2 event */ + unsigned int rg_oc_frc_evtb1 : 1; /**< force enable evtb1 event */ + unsigned int rg_oc_frc_evtb2 : 1; /**< force enable evtb2 event */ + unsigned int reserved74 : 20; + } BIT; +} volatile OC_FRC_EVT_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_int_en_evt1 : 1; /**< enable evtio1 intterrupt */ + unsigned int rg_int_en_evt2 : 1; /**< enable evtio2 intterrupt */ + unsigned int rg_int_en_evt3 : 1; /**< enable evtio3 intterrupt */ + unsigned int reserved75 : 1; + unsigned int rg_int_en_evts1 : 1; /**< enable evts1 intterrupt */ + unsigned int rg_int_en_evts2 : 1; /**< enable evts2 intterrupt */ + unsigned int rg_int_en_evts3 : 1; /**< enable evts3 intterrupt */ + unsigned int reserved76 : 1; + unsigned int rg_int_en_evta1 : 1; /**< enable evta1 intterrupt */ + unsigned int rg_int_en_evta2 : 1; /**< enable evta2 intterrupt */ + unsigned int rg_int_en_evtb1 : 1; /**< enable evtb1 intterrupt */ + unsigned int rg_int_en_evtb2 : 1; /**< enable evtb2 intterrupt */ + unsigned int reserved77 : 20; + } BIT; +} volatile INT_EVT_EN_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_int_en_tmr : 1; /**< enable timer interrupt */ + unsigned int reserved0 : 31; + } BIT; +} volatile INT_TMR_EN_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int ro_int_flag_tmr : 1; /**< timer interrupt clear bit */ + unsigned int reserved79 : 15; + unsigned int rg_int_clr_tmr : 1; /**< timer interrupt flag */ + unsigned int reserved80 : 15; + } BIT; +} volatile INT_TMR_FLAG_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_int_tmr_sel : 4; /**< timer interrupt source select */ + unsigned int reserved81 : 28; + } BIT; +} volatile INT_TMR_SEL_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_int_prsc_prd : 4; /**< timer interrupt scale ratio */ + unsigned int reserved82 : 4; + unsigned int ro_int_prsc_cnt : 4; /**< timer interrupt scale ratio value read register */ + unsigned int reserved83 : 4; + unsigned int rg_int_prsc_phs : 4; /**< timer interrupt scale ratio phase value */ + unsigned int reserved84 : 4; + unsigned int rg_int_prsc_synen : 1; /**< timer interrupt scale ratio phase value */ + unsigned int rg_int_prsc_frc : 1; + unsigned int reserved85 : 6; + } BIT; +} volatile INT_PRSC_CFG_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_csa_tmr_sel : 4; /**< timer condition to trigger adc sample through SOCA */ + unsigned int reserved86 : 12; + unsigned int rg_csa_en_cs : 1; /**< timer trigger adc sample through SOCA enable */ + unsigned int reserved87 : 15; + } BIT; +} volatile CS_TMR_SELA_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_csb_tmr_sel : 4; /**< timer condition to trigger adc sample through SOCB */ + unsigned int reserved88 : 12; + unsigned int rg_csb_en_cs : 1; /**< timer trigger adc sample through SOCB enable */ + unsigned int reserved89 : 15; + } BIT; +} volatile CS_TMR_SELB_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_csa_prsc_prd : 4; /**< trigger adc scale ratio through SOCB */ + unsigned int reserved90 : 12; + unsigned int rg_csa_prsc_phs : 4; /**< trigger adc scale ratio phase value through SOCB */ + unsigned int reserved91 : 4; + unsigned int rg_csa_prsc_synen : 1; /**< trigger adc scale ratio phase value sync enable through SOCB */ + unsigned int rg_csa_prsc_frc : 1; /**< trigger adc scale ratio phase value force enable through SOCB */ + unsigned int reserved92 : 6; + } BIT; +} volatile CS_PRSCA_CFG_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_csb_prsc_prd : 4; /**< trigger adc scale ratio through SOCB */ + unsigned int reserved93 : 12; + unsigned int rg_csb_prsc_phs : 4; /**< trigger adc scale ratio phase value through SOCB */ + unsigned int reserved94 : 4; + unsigned int rg_csb_prsc_synen : 1; /**< trigger adc scale ratio phase value sync enable through SOCB */ + unsigned int rg_csb_prsc_frc : 1; /**< trigger adc scale ratio phase value force enable through SOCB */ + unsigned int reserved95 : 6; + } BIT; +} volatile CS_PRSCB_CFG_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int ro_csa_flag : 1; /**< SOCA adc start sample flag */ + unsigned int ro_csb_flag : 1; /**< SOCB adc start sample flag */ + unsigned int reserved96 : 14; + unsigned int rg_csa_clr_flag : 1; /**< SOCA adc start sample flag clear bit */ + unsigned int rg_csb_clr_flag : 1; /**< SOCB adc start sample flag clear bit */ + unsigned int reserved97 : 14; + } BIT; +} volatile CS_FLAG_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_dma_breq_sel : 2; /**< DMA Burst request source select */ + unsigned int rg_dma_sreq_sel : 2; /**< DMA single request source select */ + unsigned int reserved98 : 28; + } BIT; +} volatile CS_DMA_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_evtio1_psel : 2; /**< evtio1's polarity */ + unsigned int rg_evtio2_psel : 2; /**< evtio2's polarity */ + unsigned int rg_evtio3_psel : 2; /**< evtio3's polarity */ + unsigned int rg_evtio4_psel : 2; /**< evtio4's polarity */ + unsigned int rg_evtio5_psel : 2; /**< evtio5's polarity */ + unsigned int reserved99 : 6; + unsigned int rg_evtsys1_psel : 2; /**< evts1's polarity */ + unsigned int rg_evtsys2_psel : 2; /**< evts2's polarity */ + unsigned int rg_evtsys3_psel : 2; /**< evts3's polarity */ + unsigned int reserved100 : 10; + } BIT; +} volatile EM_EVTIO_PSEL_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_evtmp1_psel : 2; /**< evtmp1's polarity */ + unsigned int rg_evtmp2_psel : 2; /**< evtmp2's polarity */ + unsigned int rg_evtmp3_psel : 2; /**< evtmp3's polarity */ + unsigned int rg_evtmp4_psel : 2; /**< evtmp4's polarity */ + unsigned int rg_evtmp5_psel : 2; /**< evtmp5's polarity */ + unsigned int rg_evtmp6_psel : 2; /**< evtmp6's polarity */ + unsigned int reserved101 : 20; + } BIT; +} volatile EM_EVTMP_PSEL_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_em_a1_oren : 9; /**< group A event 1 logic OR source enable */ + unsigned int reserved102 : 7; + unsigned int rg_em_a2_oren : 9; /**< group A event 2 logic OR source enable */ + unsigned int reserved103 : 7; + } BIT; +} volatile EM_AOR_EN_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_em_b1_oren : 9; /**< group B event 1 logic OR source enable */ + unsigned int reserved104 : 7; + unsigned int rg_em_b2_oren : 9; /**< group B event 2 logic OR source enable */ + unsigned int reserved105 : 7; + } BIT; +} volatile EM_BOR_EN_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_em_a1_sel : 4; /**< group A event 1 source select */ + unsigned int rg_em_a2_sel : 4; /**< group A event 2 source select */ + unsigned int rg_em_b1_sel : 4; /**< group B event 1 source select */ + unsigned int rg_em_b2_sel : 4; /**< group B event 2 source select */ + unsigned int rg_evta1t_sel : 3; /**< evta1t source select */ + unsigned int reserved106 : 1; + unsigned int rg_evta2t_sel : 3; /**< evta2t source select */ + unsigned int reserved107 : 1; + unsigned int rg_evtb1t_sel : 3; /**< evtb1t source select */ + unsigned int reserved108 : 1; + unsigned int rg_evtb2t_sel : 3; /**< evtb2t source select */ + unsigned int reserved109 : 1; + } BIT; +} volatile EM_MRG_SEL_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_evta1_sel : 1; /**< em_evta1 event source select */ + unsigned int rg_evta2_sel : 1; /**< em_evta2 event source select */ + unsigned int rg_evtb1_sel : 1; /**< em_evtb1 event source select */ + unsigned int rg_evtb2_sel : 1; /**< em_evtb2 event source select */ + unsigned int rg_evtfilt_sel : 2; /**< em_evfilt event source select */ + unsigned int reserved110 : 26; + } BIT; +} volatile EM_OUT_SEL_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_syni_sel : 4; /**< em_evt_syni source select */ + unsigned int reserved111 : 12; + unsigned int ro_syni_flag : 1; /**< em_evt_syni event active flag */ + unsigned int reserved112 : 3; + unsigned int rg_syni_clr : 1; /**< em_evt_syni event active flag clear bit */ + unsigned int reserved113 : 11; + } BIT; +} volatile SYNI_CFG_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_syncnt_a1en : 1; /**< TC value sync at em_evta1_pulse */ + unsigned int rg_syncnt_b1en : 1; /**< TC value sync at em_evtb1_pulse */ + unsigned int rg_syncnt_synien : 1; /**< TC value sync at em_synci_pulse */ + unsigned int reserved114 : 29; + } BIT; +} volatile SYNCNT_CFG_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_syno_zroen : 1; /**< sync out at zero enable */ + unsigned int rg_syno_prden : 1; /**< sync out at period enable */ + unsigned int rg_syno_a1en : 1; /**< sync out at a1 enable */ + unsigned int rg_syno_b1en : 1; /**< sync out at b1 enable */ + unsigned int reserved115 : 1; + unsigned int rg_syno_refben : 1; /**< sync out at reference B match enable */ + unsigned int rg_syno_refcen : 1; /**< sync out at reference C match enable */ + unsigned int rg_syno_refden : 1; /**< sync out at reference D match enable */ + unsigned int rg_mode_syno : 1; /**< sync out mode select */ + unsigned int rg_latset_sel : 1; /**< latch condition */ + unsigned int rg_latset_otsyn : 1; /**< control a sync out latch bit enable */ + unsigned int reserved116 : 21; + } BIT; +} volatile SYNO_CFG_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_gld_zroen : 1; /**< enable global load when count zero */ + unsigned int rg_gld_prden : 1; /**< enable global load when count period */ + unsigned int rg_gld_cntsynen : 1; /**< enable global load when em_cnt_syn enable */ + unsigned int reserved117 : 5; + unsigned int rg_gld_prsc_prd : 4; /**< global load scale ratio */ + unsigned int rg_mode_gld : 1; /**< buffer global load mode select */ + unsigned int reserved118 : 3; + unsigned int rg_latset_otgld : 1; /**< control a global latch bit enable */ + unsigned int reserved119 : 15; + } BIT; +} volatile GLB_LOAD_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int tc_prd_ld_sts : 1; /**< count period buffer status */ + unsigned int tc_refa_ld_sts : 1; /**< reference A buffer status */ + unsigned int tc_refb_ld_sts : 1; /**< reference B buffer status */ + unsigned int tc_refc_ld_sts : 1; /**< reference C buffer status */ + unsigned int tc_refd_ld_sts : 1; /**< reference D buffer status */ + unsigned int reserved120 : 3; + unsigned int pg_act_a_ld_sts : 1; /**< channel A action buffer status */ + unsigned int pg_act_b_ld_sts : 1; /**< channel B buffer status */ + unsigned int pg_out_frc_ld_sts : 1; /**< PG putput force buffer status */ + unsigned int reserved121 : 1; + unsigned int dg_red_ld_sts : 1; /**< DG rising edge buffer status */ + unsigned int dg_fed_ld_sts : 1; /**< DG falling edge buffer status */ + unsigned int dg_cfg_ld_sts : 1; /**< DG config buffer status */ + unsigned int reserved122 : 1; + unsigned int tc_mwdrefa_ld_sts : 1; + unsigned int tc_mwdrefb_ld_sts : 1; + unsigned int tc_mwd_act_ld_sts : 1; + unsigned int reserved123 : 13; + } BIT; +} volatile LOAD_STS_REG; + +typedef union { + unsigned int reg; + struct { + unsigned int rg_syncnt_frc : 1; /**< force an em_cnt_syn event */ + unsigned int reserved124 : 3; + unsigned int rg_syno_frc : 1; /**< force an apt_syno event */ + unsigned int reserved125 : 3; + unsigned int reserved126 : 4; + unsigned int rg_gld_frc : 1; /**< force an em_glb_ld event*/ + unsigned int reserved127 : 3; + unsigned int reserved128 : 4; + unsigned int rg_csa_syn_frc : 1; /**< force a SOCA trigger */ + unsigned int rg_csb_syn_frc : 1; /**< force a SOCB trigger */ + unsigned int reserved129 : 2; + unsigned int rg_int_syn_frc : 1; /**< force timer interrupt scale load sync init value */ + unsigned int reserved130 : 3; + unsigned int rg_synpg_frc : 1; /**< force create waveform buffer indepent load trigger event */ + unsigned int reserved131 : 3; + } BIT; +} volatile SYN_FRC_REG; + +/** + * @brief APT registers definition structure. + */ +typedef struct { + VER_INFO_REG VER_INFO; /**< VER_INFO_REG. Offset address 0x00000000U. */ + unsigned int reserved0[3]; + TC_MODE_REG TC_MODE; /**< TC_MODE_REG. Offset address 0x00000010U. */ + TC_PHS_REG TC_PHS; /**< TC_PHS_REG. Offset address 0x00000014U. */ + TC_OVRID_REG TC_OVRID; /**< TC_OVRID_REG. Offset address 0x00000018U. */ + unsigned int reserved1; + TC_PRD_REG TC_PRD; /**< TC_PRD_REG. Offset address 0x00000020U. */ + unsigned int reserved2[3]; + TC_REFA_REG TC_REFA; /**< TC_REFA_REG. Offset address 0x00000030U. */ + TC_REFB_REG TC_REFB; /**< TC_REFB_REG. Offset address 0x00000034U. */ + TC_REFC_REG TC_REFC; /**< TC_REFC_REG. Offset address 0x00000038U. */ + TC_REFD_REG TC_REFD; /**< TC_REFD_REG. Offset address 0x0000003CU. */ + unsigned int reserved3[4]; + TC_BUF_EN_REG TC_BUF_EN; /**< TC_BUF_EN_REG. Offset address 0x00000040U. */ + TC_PRD_LOAD_REG TC_PRD_LOAD; /**< TC_PRD_LOAD_REG. Offset address 0x00000050U. */ + TC_REF_LOAD_REG TC_REF_LOAD; /**< TC_REF_LOAD_REG. Offset address 0x00000054U. */ + TC_MWD_EN_REG TC_MWD_EN; /**< TC_MWD_EN_REG. Offset address 0x0000005CU. */ + TC_MWDREFA_REG TC_MWDREFA; /**< TC_MWDREFA_REG. Offset address 0x00000060U. */ + TC_MWDREFB_REG TC_MWDREFB; /**< TC_MWDREFB_REG. Offset address 0x00000064U. */ + TC_MWD_ACT_REG TC_MWD_ACT; /**< TC_MWD_ACT_REG. Offset address 0x00000068U. */ + TC_MWD_BUF_EN_REG TC_MWD_BUF_EN; /**< TC_MWD_BUF_EN_REG. Offset address 0x0000006cU. */ + TC_MWD_LOAD_REG TC_MWD_LOAD; /**< TC_MWD_LOAD_REG. Offset address 0x00000070U. */ + TC_STS_REG TC_STS; /**< TC_STS_REG. Offset address 0x00000060U. */ + unsigned int reserved4[34]; + PG_ACT_A_REG PG_ACT_A; /**< PG_ACT_A_REG. Offset address 0x00000100U. */ + PG_ACT_B_REG PG_ACT_B; /**< PG_ACT_B_REG. Offset address 0x00000104U. */ + unsigned int reserved5[2]; + PG_ACT_FRC_REG PG_ACT_FRC; /**< PG_ACT_FRC_REG. Offset address 0x00000110U. */ + PG_OUT_FRC_REG PG_OUT_FRC; /**< PG_OUT_FRC_REG. Offset address 0x00000114U. */ + unsigned int reserved6[2]; + PG_BUF_EN_REG PG_BUF_EN; /**< PG_BUF_EN_REG. Offset address 0x00000120U. */ + unsigned int reserved7[3]; + PG_ACT_LD_REG PG_ACT_LD; /**< PG_ACT_LD_REG. Offset address 0x00000130U. */ + unsigned int reserved8[3]; + PG_EVTC_SEL_REG PG_EVTC_SEL; /**< PG_EVTC_SEL_REG. Offset address 0x00000140U. */ + unsigned int reserved9[47]; + DG_RED_REG DG_RED; /**< DG_RED_REG. Offset address 0x00000200U. */ + DG_FED_REG DG_FED; /**< DG_FED_REG. Offset address 0x00000204U. */ + DG_CFG_REG DG_CFG; /**< DG_CFG_REG. Offset address 0x00000208U. */ + unsigned int reserved10; + DG_BUF_EN_REG DG_BUF_EN; /**< DG_BUF_EN_REG. Offset address 0x00000210U. */ + DG_BUF_LOAD_REG DG_BUF_LOAD; /**< DG_BUF_LOAD_REG. Offset address 0x00000214U. */ + unsigned int reserved11[58]; + OC_MODE_REG OC_MODE; /**< OC_MODE_REG. Offset address 0x00000300U. */ + OC_LAT_EN_REG OC_LAT_EN; /**< OC_LAT_EN_REG. Offset address 0x00000304U. */ + unsigned int reserved12[2]; + OC_ACT_A_REG OC_ACT_A; /**< OC_ACT_A_REG. Offset address 0x00000310U. */ + OC_ACT_B_REG OC_ACT_B; /**< OC_ACT_B_REG. Offset address 0x00000314U. */ + unsigned int reserved13[2]; + OC_EVT_FLAG_REG OC_EVT_FLAG; /**< OC_EVT_FLAG_REG. Offset address 0x00000320U. */ + OC_PRD_CLR_REG OC_PRD_CLR; /**< OC_PRD_CLR_REG. Offset address 0x00000324U. */ + unsigned int reserved14[2]; + OC_FRC_EVT_REG OC_FRC_EVT; /**< OC_FRC_EVT_REG. Offset address 0x00000330U. */ + unsigned int reserved15[55]; + INT_EVT_EN_REG INT_EVT_EN; /**< INT_EVT_EN_REG. Offset address 0x00000410U. */ + INT_TMR_EN_REG INT_TMR_EN; /**< INT_TMR_EN_REG. Offset address 0x00000414U. */ + unsigned int reserved16[2]; + INT_TMR_FLAG_REG INT_TMR_FLAG; /**< INT_TMR_FLAG_REG. Offset address 0x00000420U. */ + INT_TMR_SEL_REG INT_TMR_SEL; /**< INT_TMR_SEL_REG. Offset address 0x00000424U. */ + INT_PRSC_CFG_REG INT_PRSC_CFG; /**< INT_PRSC_CFG_REG. Offset address 0x00000428U. */ + unsigned int reserved17[53]; + CS_TMR_SELA_REG CS_TMR_SELA; /**< CS_TMR_SELA_REG. Offset address 0x00000500U. */ + CS_TMR_SELB_REG CS_TMR_SELB; /**< CS_TMR_SELB_REG. Offset address 0x00000504U. */ + CS_PRSCA_CFG_REG CS_PRSCA_CFG; /**< CS_PRSCA_CFG_REG. Offset address 0x00000508U. */ + CS_PRSCB_CFG_REG CS_PRSCB_CFG; /**< CS_PRSCB_CFG_REG. Offset address 0x0000050CU. */ + CS_FLAG_REG CS_FLAG; /**< CS_FLAG_REG. Offset address 0x00000510U. */ + unsigned int reserved18[3]; + CS_DMA_REG CS_DMA; /**< CS_DMA_REG. Offset address 0x00000520U. */ + unsigned int reserved19[55]; + EM_EVTIO_PSEL_REG EM_EVTIO_PSEL; /**< EM_EVTIO_PSEL_REG. Offset address 0x00000600U. */ + EM_EVTMP_PSEL_REG EM_EVTMP_PSEL; /**< EM_EVTMP_PSEL_REG. Offset address 0x00000604U. */ + EM_AOR_EN_REG EM_AOR_EN; /**< EM_AOR_EN_REG. Offset address 0x00000608U. */ + EM_BOR_EN_REG EM_BOR_EN; /**< EM_BOR_EN_REG. Offset address 0x0000060CU. */ + EM_MRG_SEL_REG EM_MRG_SEL; /**< EM_MRG_SEL_REG. Offset address 0x00000610U. */ + EM_OUT_SEL_REG EM_OUT_SEL; /**< EM_OUT_SEL_REG. Offset address 0x00000614U. */ + unsigned int reserved20[58]; + SYNI_CFG_REG SYNI_CFG; /**< SYNI_CFG_REG. Offset address 0x00000700U. */ + SYNCNT_CFG_REG SYNCNT_CFG; /**< SYNCNT_CFG_REG. Offset address 0x00000704U. */ + SYNO_CFG_REG SYNO_CFG; /**< SYNO_CFG_REG. Offset address 0x00000708U. */ + unsigned int reserved21; + GLB_LOAD_REG GLB_LOAD; /**< GLB_LOAD_REG. Offset address 0x000000710U. */ + unsigned int reserved22[3]; + LOAD_STS_REG LOAD_STS; /**< LOAD_STS_REG. Offset address 0x000000720U. */ + unsigned int reserved23[3]; + SYN_FRC_REG SYN_FRC; /**< SYN_FRC_REG. Offset address 0x00000730U. */ +} volatile APT_RegStruct; + +/** + * @brief Set the emulation stop mode of APT module. + * @param aptx APT register base address. + * @param emuMode Emulation stop mode. + * @retval None. + */ +static inline void DCL_APT_SetEmulationMode(APT_RegStruct *aptx, APT_EmulationMode emuMode) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(emuMode <= APT_EMULATION_STOP_APT); + aptx->TC_MODE.BIT.rg_emu_stop = emuMode; +} + +/** + * @brief Set the time-base divider factor. + * @param aptx APT register base address. + * @param divFactor Time-base divider factor. + * @retval None. + */ +static inline void DCL_APT_SetDividerFactor(APT_RegStruct *aptx, unsigned short divFactor) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(divFactor <= DIVIDER_FACTOR_MAX); + aptx->TC_MODE.BIT.rg_div_fac = divFactor; +} + +/** + * @brief Get the time-base divider factor. + * @param aptx APT register base address. + * @retval unsigned short: time-base divider factor. + */ +static inline unsigned short DCL_APT_GetDividerFactor(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + return (aptx->TC_MODE.BIT.rg_div_fac); +} + +/** + * @brief Set the count mode of time-base counter. + * @param aptx APT register base address. + * @param cntMode Count mode. + * @retval None. + */ +static inline void DCL_APT_SetTimeBaseCountMode(APT_RegStruct *aptx, APT_CountMode cntMode) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(cntMode <= APT_COUNT_MODE_FREEZE); + aptx->TC_MODE.BIT.rg_cnt_mode = cntMode; +} + +/** + * @brief Set the period of time-base counter. + * @param aptx APT register base address. + * @param periodCnt Time-base counter period. + * @retval None. + */ +static inline void DCL_APT_SetTimeBasePeriod(APT_RegStruct *aptx, unsigned short periodCnt) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + aptx->TC_PRD.BIT.rg_cnt_prd = periodCnt; +} + +/** + * @brief Get the period of time-base counter. + * @param aptx APT register base address. + * @retval unsigned short: time-base counter period + */ +static inline unsigned short DCL_APT_GetTimeBasePeriod(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + return (aptx->TC_PRD.BIT.rg_cnt_prd); +} + +/** + * @brief Set the count mode of slave APT module after synchronization. + * @param aptx APT register base address. + * @param syncCntMode Count mode after synchronization. + * @retval None. + */ +static inline void DCL_APT_SetCountModeAfterSync(APT_RegStruct *aptx, APT_SyncCountMode syncCntMode) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(syncCntMode >= APT_COUNT_MODE_AFTER_SYNC_DOWN); + APT_PARAM_CHECK_NO_RET(syncCntMode <= APT_COUNT_MODE_AFTER_SYNC_UP); + aptx->TC_PHS.BIT.rg_cnt_dir = syncCntMode; +} + +/** + * @brief Set the counter phase after synchronization. + * @param aptx APT register base address. + * @param cntPhase Counter phase after synchronization. + * @retval None. + */ +static inline void DCL_APT_SetCounterPhase(APT_RegStruct *aptx, unsigned short cntPhase) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + TC_PHS_REG tmp = aptx->TC_PHS; + tmp.BIT.rg_cnt_phs = cntPhase; + aptx->TC_PHS = tmp; +} + +/** + * @brief Set the software override value of time-base counter. + * @param aptx APT register base address. + * @param cntOvrid Software override value of time-base counter. + * @retval None. + */ +static inline void DCL_APT_SetCounterOverride(APT_RegStruct *aptx, unsigned short cntOvrid) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + TC_OVRID_REG tmp = aptx->TC_OVRID; + tmp.BIT.rg_cnt_ovrid = cntOvrid; + aptx->TC_OVRID = tmp; +} + +/** + * @brief Force software override on time-base divider and counter. + * @param aptx APT register base address. + * @retval None. + */ +static inline void DCL_APT_ForceOverride(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + aptx->TC_OVRID.BIT.rg_cnt_ovrid_en = BASE_CFG_SET; +} + +/** + * @brief Set the count compare reference value of time-base counter. + * @param aptx APT register base address. + * @param ref Count compare reference. + * @param cntCmp Count compare reference value of counter. + * @retval None. + */ +static inline void DCL_APT_SetCounterCompare(APT_RegStruct *aptx, APT_CompareRef ref, unsigned short cntCmp) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(ref >= APT_COMPARE_REFERENCE_A); + APT_PARAM_CHECK_NO_RET(ref <= APT_COMPARE_REFERENCE_D); + TC_REFA_REG tmpA; + TC_REFB_REG tmpB; + TC_REFC_REG tmpC; + TC_REFD_REG tmpD; + switch (ref) { + case APT_COMPARE_REFERENCE_A: + tmpA = aptx->TC_REFA; + tmpA.BIT.rg_cnt_refa = cntCmp; + aptx->TC_REFA = tmpA; + break; + case APT_COMPARE_REFERENCE_B: + tmpB = aptx->TC_REFB; + tmpB.BIT.rg_cnt_refb = cntCmp; + aptx->TC_REFB = tmpB; + break; + case APT_COMPARE_REFERENCE_C: + tmpC = aptx->TC_REFC; + tmpC.BIT.rg_cnt_refc = cntCmp; + aptx->TC_REFC = tmpC; + break; + case APT_COMPARE_REFERENCE_D: + tmpD = aptx->TC_REFD; + tmpD.BIT.rg_cnt_refd = cntCmp; + aptx->TC_REFD = tmpD; + break; + default: + break; + } +} + +/** + * @brief Get the count compare reference value of time-base counter. + * @param aptx APT register base address. + * @param ref Count compare reference. + * @retval unsigned short: Count compare reference value of counter. + */ +static inline unsigned short DCL_APT_GetCounterCompare(APT_RegStruct *aptx, APT_CompareRef ref) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_WITH_RET(ref >= APT_COMPARE_REFERENCE_A, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(ref <= APT_COMPARE_REFERENCE_D, BASE_STATUS_ERROR); + switch (ref) { + case APT_COMPARE_REFERENCE_A: + return (aptx->TC_REFA.BIT.rg_cnt_refa); + case APT_COMPARE_REFERENCE_B: + return (aptx->TC_REFB.BIT.rg_cnt_refb); + case APT_COMPARE_REFERENCE_C: + return (aptx->TC_REFC.BIT.rg_cnt_refc); + case APT_COMPARE_REFERENCE_D: + return (aptx->TC_REFD.BIT.rg_cnt_refd); + default: + return 0; + } +} + +/** + * @brief Set the buffer load mode of time-base period register. + * @param aptx APT register base address. + * @param prdLoadMode Buffer load mode of time-base period register. + * @retval None. + */ +static inline void DCL_APT_SetPeriodLoadMode(APT_RegStruct *aptx, APT_BufferLoadMode prdLoadMode) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(prdLoadMode >= APT_BUFFER_DISABLE); + APT_PARAM_CHECK_NO_RET(prdLoadMode <= APT_BUFFER_GLOBAL_LOAD); + aptx->TC_BUF_EN.reg &= (~0b11); /* Clear rg_prd_buf_en and rg_prd_gld_en */ + aptx->TC_BUF_EN.reg |= prdLoadMode; /* Write rg_prd_buf_en and rg_prd_gld_en */ +} + +/** + * @brief Enable the buffer load events of TC_PRD register + * @param aptx APT register base address. + * @param loadEvent The buffer load events of TC_PRD register + * A logical OR of valid values that can be passed as the loadEvent parameter + * Valid values for loadEvent are: + * APT_PERIOD_LOAD_EVENT_ZERO - When counter value equal to zeor + * APT_PERIOD_LOAD_EVENT_A1 - When combined event A1 is valid + * APT_PERIOD_LOAD_EVENT_B1 - When combined event B1 is valid + * APT_PERIOD_LOAD_EVENT_SYNC - When synchronization event is valid + * @retval None. + */ +static inline void DCL_APT_SetPeriodLoadEvent(APT_RegStruct *aptx, unsigned int prdLoadEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + aptx->TC_PRD_LOAD.reg = prdLoadEvent; +} + +/** + * @brief Set the buffer load mode of count compare reference register. + * @param aptx APT register base address. + * @param ref Count compare reference. + * @param cmpLoadMode Buffer load mode of count compare reference register. + * @retval None. + */ +static inline void DCL_APT_SetCompareLoadMode(APT_RegStruct *aptx, + APT_CompareRef ref, + APT_BufferLoadMode cmpLoadMode) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(ref >= APT_COMPARE_REFERENCE_A); + APT_PARAM_CHECK_NO_RET(ref <= APT_COMPARE_REFERENCE_D); + APT_PARAM_CHECK_NO_RET(cmpLoadMode >= APT_BUFFER_DISABLE); + APT_PARAM_CHECK_NO_RET(cmpLoadMode <= APT_BUFFER_GLOBAL_LOAD); + unsigned int offsetA = 4; /* Buffer mode control bits offset of reference A */ + unsigned int tcBufField = 2; /* Field width of buffer load mode setting */ + unsigned int offset = offsetA + ref * tcBufField; + aptx->TC_BUF_EN.reg &= (~(0b11 << offset)); /* Clear rg_refx_gld_en and rg_refx_buf_en */ + aptx->TC_BUF_EN.reg |= (cmpLoadMode << offset); /* Write rg_refx_gld_en and rg_refx_buf_en */ +} + +/** + * @brief Enable the buffer load events of TC_REFA, TC_REFB, TC_REFC, TC_REFD register + * @param aptx APT register base address. + * @param ref Count compare reference + * @param loadEvent The buffer load events of TC_REFA, TC_REFB, TC_REFC, TC_REFD register + * A logical OR of valid values can be passed as the loadEvent parameter + * Valid values for loadEvent are: + * APT_COMPARE_LOAD_EVENT_ZERO - When counter value equal to zero + * APT_COMPARE_LOAD_EVENT_PERIOD - When counter value equal to period + * APT_COMPARE_LOAD_EVENT_A1 - When combined event A1 is valid + * APT_COMPARE_LOAD_EVENT_B1 - When combined event B1 is valid + * APT_COMPARE_LOAD_EVENT_SYNC - When synchronization event is valid + * @retval None. + */ +static inline void DCL_APT_SetCompareLoadEvent(APT_RegStruct *aptx, APT_CompareRef ref, unsigned int cmpLoadEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(ref >= APT_COMPARE_REFERENCE_A); + APT_PARAM_CHECK_NO_RET(ref <= APT_COMPARE_REFERENCE_D); + unsigned int refBufField = 8; /* Field width of compare reference load event setting */ + aptx->TC_REF_LOAD.reg &= (~(0x1F << (ref * refBufField))); /* Clear bit field for load event selection */ + aptx->TC_REF_LOAD.reg |= (cmpLoadEvent << (ref * refBufField)); +} + +/** + * @brief Get the value of time-base divider. + * @param aptx APT register base address. + * @retval unsigned short: The value of time-base divider value. + */ +static inline unsigned short DCL_APT_GetDividerValue(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + return (aptx->TC_STS.BIT.ro_div_cnt); +} + +/** + * @brief Get the value of time-base counter. + * @param aptx APT register base address. + * @retval unsigned short: The value of time-base counter. + */ +static inline unsigned short DCL_APT_GetCounterValue(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + return (aptx->TC_STS.BIT.ro_cnt_val); +} + +/** + * @brief Return time base counter direction + * @param aptx APT register base address. + * @retval unsigned short: The direction of time base counter + * Valid return values are: + * APT_COUNTER_STATUS_COUNT_DOWN - The counter is counting down + * APT_COUNTER_STATUS_COUNT_UP - The counter is counting up + */ +static inline unsigned short DCL_APT_GetCounterDirection(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + return (aptx->TC_STS.BIT.ro_cnt_dir); +} + +/* --------------------------------------------------------------------------------------------- */ +/* PWM Generation (PG) submodule Direct Configuration Layer functions -------------------------- */ +/* --------------------------------------------------------------------------------------------- */ +/** + * @brief Set PWM waveform action on corresponding event. + * @param aptx APT register base address. + * @param channel PWM output channel. + * @param actEvent PWM waveform action event. + * @param action PWM waveform action. + * @retval None. + */ +static inline void DCL_APT_SetPWMAction(APT_RegStruct *aptx, + APT_PWMChannel channel, + APT_PWMActionEvent actEvent, + APT_PWMAction action) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(channel >= APT_PWM_CHANNEL_A); + APT_PARAM_CHECK_NO_RET(channel <= APT_PWM_CHANNEL_B); + APT_PARAM_CHECK_NO_RET(actEvent >= APT_PWM_ACTION_ON_TIMEBASE_ZERO); + APT_PARAM_CHECK_NO_RET(actEvent <= APT_PWM_ACTION_ON_C2_COUNT_DOWN); + APT_PARAM_CHECK_NO_RET(action <= APT_PWM_ACTION_TOGGLE); + if (channel == APT_PWM_CHANNEL_A) { + aptx->PG_ACT_A.reg &= (~(0b11 << actEvent)); + aptx->PG_ACT_A.reg |= (action << actEvent); + } else if (channel == APT_PWM_CHANNEL_B) { + aptx->PG_ACT_B.reg &= (~(0b11 << actEvent)); + aptx->PG_ACT_B.reg |= (action << actEvent); + } +} + +/** + * @brief Select the event source of PWM Generation event C1 or C2. + * This function is only used when C1 or C2 event is selected as PWM action event. + * @param aptx APT register base address. + * @param channel PWM output channel. + * @param eventCx The PWM Generation event, should be C1 or C2. + * @param eventCxSrc The trigger source of PWM Generation event C1 or C2. + * @retval None. + */ +static inline void DCL_APT_SelectCxEventSource(APT_RegStruct *aptx, + APT_PWMChannel channel, + APT_PGEventCx eventCx, + APT_PGEventCxSrc eventCxSrc) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET((channel >= APT_PWM_CHANNEL_A) && (channel <= APT_PWM_CHANNEL_B)); + APT_PARAM_CHECK_NO_RET(eventCx >= APT_PWM_GENERATION_EVENT_C1); + APT_PARAM_CHECK_NO_RET(eventCx <= APT_PWM_GENERATION_EVENT_C2); + APT_PARAM_CHECK_NO_RET(eventCxSrc >= APT_PG_EVT_C_FORBIDDEN); + APT_PARAM_CHECK_NO_RET(eventCxSrc <= APT_PG_EVT_C_SYNC_IN); + unsigned int chOffset = 8; /* Bit field offset of PWM output channel */ + unsigned int cxOffset = 4; /* Bit field offset of event Cx */ + aptx->PG_EVTC_SEL.reg &= (~(0b1111 << (channel * chOffset + eventCx * cxOffset))); + aptx->PG_EVTC_SEL.reg |= eventCxSrc << (channel * chOffset + eventCx * cxOffset); +} + +/** + * @brief Set the buffer load mode of PWM action register. + * @param aptx APT register base address. + * @param channel PWM output channel. + * @param loadMode Buffer load mode. + * @retval None. + */ +static inline void DCL_APT_SetPWMActionLoadMode(APT_RegStruct *aptx, + APT_PWMChannel channel, + APT_BufferLoadMode loadMode) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(channel >= APT_PWM_CHANNEL_A); + APT_PARAM_CHECK_NO_RET(channel <= APT_PWM_CHANNEL_B); + APT_PARAM_CHECK_NO_RET(loadMode >= APT_BUFFER_DISABLE); + APT_PARAM_CHECK_NO_RET(loadMode <= APT_BUFFER_GLOBAL_LOAD); + unsigned int bufFieldWidth = 2; /* Bit field width of buffer load mode setting */ + aptx->PG_BUF_EN.reg &= (~(0b11 << (channel * bufFieldWidth))); /* Clear rg_actx_gld_en and rg_actx_buf_en */ + aptx->PG_BUF_EN.reg |= (loadMode << (channel * bufFieldWidth)); /* Write rg_actx_gld_en and rg_actx_buf_en */ +} + +/** + * @brief Enable the buffer load events of PG_ACT_A or PG_ACT_B register + * @param aptx APT register base address. + * @param channel PWM output channel. + * @param loadEvent The buffer load events of PG_ACT_A or PG_ACT_B register + * A logical OR of valid values can be passed as the loadEvent parameter + * Valid values for loadEvent are: + * APT_ACTION_LOAD_EVENT_ZERO - When counter value equal to zero + * APT_ACTION_LOAD_EVENT_PERIOD - When counter value equal to period + * APT_ACTION_LOAD_EVENT_A1 - When combined event A1 is valid + * APT_ACTION_LOAD_EVENT_B1 - When combined event B1 is valid + * APT_ACTION_LOAD_EVENT_SYNC - When synchronization event is valid + * @retval None. + */ +static inline void DCL_APT_SetPWMActionLoadEvent(APT_RegStruct *aptx, + APT_PWMChannel channel, + unsigned int loadEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(channel >= APT_PWM_CHANNEL_A); + APT_PARAM_CHECK_NO_RET(channel <= APT_PWM_CHANNEL_B); + unsigned int actBufField = 8; /* Field width of PWM action load event setting */ + aptx->PG_ACT_LD.reg &= (~(0x1F << (channel * actBufField))); + aptx->PG_ACT_LD.reg |= (loadEvent << (channel * actBufField)); +} + +/** + * @brief Set the PWM waveform action on one-shot action software event. + * @param aptx APT register base address. + * @param channel PWM output channel. + * @param action PWM waveform action. + * @retval None. + */ +static inline void DCL_APT_SetSwOneShotPWMAction(APT_RegStruct *aptx, APT_PWMChannel channel, APT_PWMAction action) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(channel >= APT_PWM_CHANNEL_A); + APT_PARAM_CHECK_NO_RET(channel <= APT_PWM_CHANNEL_B); + APT_PARAM_CHECK_NO_RET(action >= APT_PWM_ACTION_HOLD); + APT_PARAM_CHECK_NO_RET(action <= APT_PWM_ACTION_TOGGLE); + if (channel == APT_PWM_CHANNEL_A) { + aptx->PG_ACT_FRC.BIT.rg_pga_act_evt_frc = action; + } else if (channel == APT_PWM_CHANNEL_B) { + aptx->PG_ACT_FRC.BIT.rg_pgb_act_evt_frc = action; + } +} + +/** + * @brief Force one-shot software event. + * @param aptx APT register base address. + * @param channel PWM output channel. + * @retval None. + */ +static inline void DCL_APT_ForceSwOneShotPWMAction(APT_RegStruct *aptx, APT_PWMChannel channel) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(channel >= APT_PWM_CHANNEL_A); + APT_PARAM_CHECK_NO_RET(channel <= APT_PWM_CHANNEL_B); + if (channel == APT_PWM_CHANNEL_A) { + aptx->PG_ACT_FRC.BIT.rg_pga_evt_frc = BASE_CFG_SET; + } else if (channel == APT_PWM_CHANNEL_B) { + aptx->PG_ACT_FRC.BIT.rg_pgb_evt_frc = BASE_CFG_SET; + } +} + +/** + * @brief Set the PWM waveform action on continuous action software event. + * @param aptx APT register base address. + * @param channel PWM output channel. + * @param action PWM waveform action + * @retval None. + */ +static inline void DCL_APT_SetSwContPWMAction(APT_RegStruct *aptx, APT_PWMChannel channel, APT_PWMContAction action) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(channel >= APT_PWM_CHANNEL_A); + APT_PARAM_CHECK_NO_RET(channel <= APT_PWM_CHANNEL_B); + APT_PARAM_CHECK_NO_RET(action >= APT_PWM_CONTINUOUS_ACTION_HOLD); + APT_PARAM_CHECK_NO_RET(action <= APT_PWM_CONTINUOUS_ACTION_HIGH); + if (channel == APT_PWM_CHANNEL_A) { + aptx->PG_OUT_FRC.BIT.rg_pga_frc_act = action; + } else if (channel == APT_PWM_CHANNEL_B) { + aptx->PG_OUT_FRC.BIT.rg_pgb_frc_act = action; + } +} + +static void APT_ForcePWMAOutputLow(APT_RegStruct *aptx) +{ + unsigned int risingOutSelect = aptx->DG_CFG.BIT.rg_dg_red_osel; + unsigned int fallingOutSelect = aptx->DG_CFG.BIT.rg_dg_fed_osel; + unsigned int risingInSelect = aptx->DG_CFG.BIT.rg_dg_red_isel; + unsigned int fallingInSelect = aptx->DG_CFG.BIT.rg_dg_fed_isel; + /* Enable force output. */ + aptx->PG_OUT_FRC.BIT.rg_pga_frc_en = BASE_CFG_ENABLE; + /* if PWMA invert */ + if (((risingOutSelect == APT_DB_RED_OUTPUT_INVERT) && (risingInSelect == APT_DB_RED_INPUT_PWM_A)) || \ + ((fallingOutSelect == APT_DB_FED_OUTPUT_INVERT) && (fallingInSelect == APT_DB_FED_INPUT_PWM_A))) { + aptx->PG_OUT_FRC.BIT.rg_pga_frc_act = APT_PWM_CONTINUOUS_ACTION_HIGH; /* if invert, set high */ + } else { /* if PWMA not invert */ + aptx->PG_OUT_FRC.BIT.rg_pga_frc_act = APT_PWM_CONTINUOUS_ACTION_LOW; /* if not invert, set low */ + } + return; +} + +static void APT_ForcePWMBOutputLow(APT_RegStruct *aptx) +{ + unsigned int risingOutSelect = aptx->DG_CFG.BIT.rg_dg_red_osel; + unsigned int fallingOutSelect = aptx->DG_CFG.BIT.rg_dg_fed_osel; + unsigned int risingInSelect = aptx->DG_CFG.BIT.rg_dg_red_isel; + unsigned int fallingInSelect = aptx->DG_CFG.BIT.rg_dg_fed_isel; + /* Enable force output */ + aptx->PG_OUT_FRC.BIT.rg_pgb_frc_en = BASE_CFG_ENABLE; + /* if PWMB invert */ + if (((risingOutSelect == APT_DB_RED_OUTPUT_INVERT) && (risingInSelect == APT_DB_RED_INPUT_PWM_B)) || \ + ((fallingOutSelect == APT_DB_FED_OUTPUT_INVERT) && (fallingInSelect == APT_DB_FED_INPUT_PWM_B))) { + aptx->PG_OUT_FRC.BIT.rg_pgb_frc_act = APT_PWM_CONTINUOUS_ACTION_HIGH; /* if invert, set high */ + } else { /* if PWMB not invert */ + aptx->PG_OUT_FRC.BIT.rg_pgb_frc_act = APT_PWM_CONTINUOUS_ACTION_LOW; /* if not invert, set low */ + } + return; +} + +/** + * @brief Both PWMA and PWMB output low level. + * @param aptx APT register base address. + * @retval None. + */ +static inline void DCL_APT_ForcePWMOutputLow(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + + APT_ForcePWMAOutputLow(aptx); + APT_ForcePWMBOutputLow(aptx); + + return; +} + +/** + * @brief Set the buffer load mode of continuous aciton software event register. + * @param aptx APT register base address. + * @param loadMode Buffer load mode. + * @retval None. + */ +static inline void DCL_APT_SetSwContActionLoadMode(APT_RegStruct *aptx, APT_BufferLoadMode loadMode) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(loadMode >= APT_BUFFER_DISABLE); + APT_PARAM_CHECK_NO_RET(loadMode <= APT_BUFFER_GLOBAL_LOAD); + unsigned int bufFieldWidth = 4; /* Bit field width of buffer load mode setting */ + aptx->PG_BUF_EN.reg &= (~(0b11 << bufFieldWidth)); /* Clear rg_frc_gld_en and rg_frc_buf_en */ + aptx->PG_BUF_EN.reg |= (loadMode << bufFieldWidth); /* Write rg_frc_gld_en and rg_frc_buf_en */ +} + +/** + * @brief Enable the buffer load events of PG_OUT_FRC register + * @param aptx APT register base address. + * @param channel PWM output channel + * @param loadEvent The buffer load events of PG_OUT_FRC register + * A logical OR of valid values can be passed as the loadEvent parameter + * Valid values for loadEvent are: + * APT_ACTION_LOAD_EVENT_ZERO - When counter value equal to zero + * APT_ACTION_LOAD_EVENT_PERIOD - When counter value equal to period + * APT_ACTION_LOAD_EVENT_SYNC - When synchronization event is valid + * @retval None. + */ +static inline void DCL_APT_SetSwContActionLoadEvent(APT_RegStruct *aptx, unsigned int loadEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + unsigned int actBufField = 16; /* Field width of continuous PWM action load event setting */ + aptx->PG_ACT_LD.reg &= (~(0x1F << actBufField)); + aptx->PG_ACT_LD.reg |= (loadEvent << actBufField); +} + +/** + * @brief Enable continuous action software event. + * @param aptx APT register base address. + * @param channel PWM output channel. + * @retval None. + */ +static inline void DCL_APT_EnableSwContPWMAction(APT_RegStruct *aptx, APT_PWMChannel channel) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(channel >= APT_PWM_CHANNEL_A); + APT_PARAM_CHECK_NO_RET(channel <= APT_PWM_CHANNEL_B); + if (channel == APT_PWM_CHANNEL_A) { + aptx->PG_OUT_FRC.BIT.rg_pga_frc_en = BASE_CFG_SET; + } else if (channel == APT_PWM_CHANNEL_B) { + aptx->PG_OUT_FRC.BIT.rg_pgb_frc_en = BASE_CFG_SET; + } +} + +/** + * @brief Disable continuous action software event. + * @param aptx APT register base address. + * @param channel PWM output channel. + * @retval None. + */ +static inline void DCL_APT_DisableSwContPWMAction(APT_RegStruct *aptx, APT_PWMChannel channel) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(channel >= APT_PWM_CHANNEL_A); + APT_PARAM_CHECK_NO_RET(channel <= APT_PWM_CHANNEL_B); + if (channel == APT_PWM_CHANNEL_A) { + aptx->PG_OUT_FRC.BIT.rg_pga_frc_en = BASE_CFG_UNSET; + } else if (channel == APT_PWM_CHANNEL_B) { + aptx->PG_OUT_FRC.BIT.rg_pgb_frc_en = BASE_CFG_UNSET; + } +} + +/* --------------------------------------------------------------------------------------------- */ +/* Dead-Band Generation (DG) submodule Direct Configuration Layer functions -------------------- */ +/* --------------------------------------------------------------------------------------------- */ +/** + * @brief Configure the rising edge delay (RED) of Dead-Band Generation. + * @param aptx APT register base address. + * @param redInput The input source of RED counter. + * @param redOutMode The output of RED counter. + * @param dgaOutSwap The swap mode of Dead-Band Generation output signal A. + * true - Select the output of FED counter. + * false - Select the output of RED counter. + * @param redCount The count value of RED counter, in units of APT clock. + * @retval None. + */ +static inline void DCL_APT_SetDeadBandRisingEdge(APT_RegStruct *aptx, + APT_REDInput redInput, + APT_REDOutMode redOutMode, + bool dgaOutSwap, + unsigned short redCount) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(redInput >= APT_DB_RED_INPUT_PWM_A); + APT_PARAM_CHECK_NO_RET(redInput <= APT_DB_RED_INPUT_PWM_B); + APT_PARAM_CHECK_NO_RET(redOutMode >= APT_DB_RED_OUTPUT_NOT_INVERT); + APT_PARAM_CHECK_NO_RET(redOutMode <= APT_DB_RED_OUTPUT_PWM_A); + aptx->DG_CFG.BIT.rg_dg_red_isel = redInput; + aptx->DG_CFG.BIT.rg_dg_red_osel = redOutMode; + aptx->DG_CFG.BIT.rg_dga_osel = dgaOutSwap; + aptx->DG_RED.BIT.rg_dg_red = redCount; +} + +/** + * @brief Configure the falling edge delay (FED) of Dead-Band Generation. + * @param aptx APT register base address. + * @param fedInput The input source of FED counter. + * @param fedOutMode The output of FED counter. + * @param dgbOutSwap The swap mode of Dead-Band Generation output signal B. + * true - Select the output of RED counter. + * false - Select the output of FED counter. + * @param fedCount The count value of FED counter, in units of APT clock. + * @retval None. + */ +static inline void DCL_APT_SetDeadBandFallingEdge(APT_RegStruct *aptx, + APT_FEDInput fedInput, + APT_FEDOutMode fedOutMode, + bool dgbOutSwap, + unsigned short fedCount) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(fedInput >= APT_DB_FED_INPUT_PWM_B); + APT_PARAM_CHECK_NO_RET(fedInput <= APT_DB_FED_INPUT_ZERO); + APT_PARAM_CHECK_NO_RET(fedOutMode >= APT_DB_FED_OUTPUT_NOT_INVERT); + APT_PARAM_CHECK_NO_RET(fedOutMode <= APT_DB_FED_OUTPUT_PWM_B); + aptx->DG_CFG.BIT.rg_dg_fed_isel = fedInput; + aptx->DG_CFG.BIT.rg_dg_fed_osel = fedOutMode; + aptx->DG_CFG.BIT.rg_dgb_osel = dgbOutSwap; + aptx->DG_FED.BIT.rg_dg_fed = fedCount; +} + +/** + * @brief Set buffer load mode of Dead-Band configuration register. + * @param aptx APT register base address. + * @param dgCfgLoadMode Buffer load mode. + * @retval None. + */ +static inline void DCL_APT_SetDGConfigLoadMode(APT_RegStruct *aptx, APT_BufferLoadMode dgCfgLoadMode) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(dgCfgLoadMode >= APT_BUFFER_DISABLE); + APT_PARAM_CHECK_NO_RET(dgCfgLoadMode <= APT_BUFFER_GLOBAL_LOAD); + unsigned int bufFieldWidth = 4; /* Bit field width of buffer load mode setting */ + aptx->DG_BUF_EN.reg &= (~(0b11 << bufFieldWidth)); /* Clear rg_cfg_gld_en and rg_cfg_buf_en */ + aptx->DG_BUF_EN.reg |= (dgCfgLoadMode << bufFieldWidth); /* Write rg_cfg_gld_en and rg_cfg_buf_en */ +} + +/** + * @brief Enable the buffer load events of DG_CFG register. + * @param aptx APT register base address. + * @param loadEvent The buffer load events of DG_CFG register. + * A logical OR of valid values can be passed as the loadEvent parameter. + * Valid values for loadEvent are: + * APT_DEAD_BAND_LOAD_EVENT_ZERO - When time base counter value equal to zero. + * APT_DEAD_BAND_LOAD_EVENT_PERIOD - When time base counter value equal to period. + * @retval None. + */ +static inline void DCL_APT_SetDGConfigLoadEvent(APT_RegStruct *aptx, unsigned int dgCfgLoadEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + unsigned int dgBufField = 16; /* Field width of continuous PWM action load event setting */ + aptx->DG_BUF_LOAD.reg &= (~(0b11 << dgBufField)); + aptx->DG_BUF_LOAD.reg |= (dgCfgLoadEvent << dgBufField); +} + +/** + * @brief Set buffer load mode of Dead-Band rising edge delay counter register. + * @param aptx APT register base address. + * @param redCntLoadMode Buffer load mode. + * @retval None. + */ +static inline void DCL_APT_SetREDCounterLoadMode(APT_RegStruct *aptx, APT_BufferLoadMode redCntLoadMode) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(redCntLoadMode >= APT_BUFFER_DISABLE); + APT_PARAM_CHECK_NO_RET(redCntLoadMode <= APT_BUFFER_GLOBAL_LOAD); + aptx->DG_BUF_EN.reg &= (~(0b11 << 0)); /* Clear rg_red_gld_en and rg_red_buf_en */ + aptx->DG_BUF_EN.reg |= (redCntLoadMode << 0); /* Write rg_red_gld_en and rg_red_buf_en */ +} + +/** + * @brief Enable the buffer load events of DG_RED register + * @param aptx APT register base address. + * @param loadEvent The buffer load events of DG_RED register. + * A logical OR of valid values can be passed as the loadEvent parameter. + * Valid values for loadEvent are: + * APT_DEAD_BAND_LOAD_EVENT_ZERO - When time base counter value equal to zero. + * APT_DEAD_BAND_LOAD_EVENT_PERIOD - When time base counter value equal to period. + * @retval None. + */ +static inline void DCL_APT_SetREDCounterLoadEvent(APT_RegStruct *aptx, unsigned int redCntLoadEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + aptx->DG_BUF_LOAD.reg &= (~(0b11 << 0)); + aptx->DG_BUF_LOAD.reg |= (redCntLoadEvent << 0); +} + +/** + * @brief Set buffer load mode of Dead-Band falling edge delay counter register. + * @param aptx APT register base address. + * @param fedCntLoadMode Buffer load mode. + * @retval None. + */ +static inline void DCL_APT_SetFEDCounterLoadMode(APT_RegStruct *aptx, APT_BufferLoadMode fedCntLoadMode) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(fedCntLoadMode >= APT_BUFFER_DISABLE); + APT_PARAM_CHECK_NO_RET(fedCntLoadMode <= APT_BUFFER_GLOBAL_LOAD); + unsigned int bufFieldWidth = 2; /* Bit field width of buffer load mode setting */ + aptx->DG_BUF_EN.reg &= (~(0b11 << bufFieldWidth)); /* Clear rg_fed_gld_en and rg_fed_buf_en */ + aptx->DG_BUF_EN.reg |= (fedCntLoadMode << bufFieldWidth); /* Write rg_fed_gld_en and rg_fed_buf_en */ +} + +/** + * @brief Enable the buffer load events of DG_FED register. + * @param aptx APT register base address. + * @param loadEvent The buffer load events of DG_FED register. + * A logical OR of valid values can be passed as the loadEvent parameter. + * Valid values for loadEvent are: + * APT_DEAD_BAND_LOAD_EVENT_ZERO - When time base counter value equal to zero. + * APT_DEAD_BAND_LOAD_EVENT_PERIOD - When time base counter value equal to period. + * @retval None. + */ +static inline void DCL_APT_SetFEDCounterLoadEvent(APT_RegStruct *aptx, unsigned int fedCntLoadEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + unsigned int dgBufField = 8; /* Field width of continuous PWM action load event setting */ + aptx->DG_BUF_LOAD.reg &= (~(0b11 << dgBufField)); + aptx->DG_BUF_LOAD.reg |= (fedCntLoadEvent << dgBufField); +} + +/* --------------------------------------------------------------------------------------------- */ +/* Output Control (OC) submodule Direct Configuration Layer functions -------------------------- */ +/* --------------------------------------------------------------------------------------------- */ +/** + * @brief Enable an output control event. + * @param aptx APT register base address. + * @param ocEvent Output control event. + * @retval None. + */ +static inline void DCL_APT_EnableOutCtrlEvent(APT_RegStruct *aptx, APT_OutCtrlEvent ocEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(ocEvent >= APT_OC_NO_EVENT); + APT_PARAM_CHECK_NO_RET(ocEvent <= APT_OC_COMBINE_EVENT_B2); + aptx->OC_MODE.reg |= ocEvent; +} + +/** + * @brief Disable an output control event. + * @param aptx APT register base address. + * @param ocEvent Output control event. + * @retval None. + */ +static inline void DCL_APT_DisableOutCtrlEvent(APT_RegStruct *aptx, APT_OutCtrlEvent ocEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(ocEvent >= APT_OC_NO_EVENT); + APT_PARAM_CHECK_NO_RET(ocEvent <= APT_OC_COMBINE_EVENT_B2); + aptx->OC_MODE.reg &= ~ocEvent; +} + +/** + * @brief Clear OC_MODE register. + * @param aptx APT register base address. + * @retval None. + */ +static inline void DCL_APT_ClearOCEventReg(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + aptx->OC_MODE.reg = 0; +} + +/** + * @brief Set output control mode of an output control event. + * @param aptx APT register base address. + * @param ocEvent Output control event. + * @param ocEventMode Output control mode. + * @retval None. + */ +static inline void DCL_APT_SetOutCtrlEventMode(APT_RegStruct *aptx, + APT_OutCtrlEvent ocEvent, + APT_OutCtrlMode ocEventMode) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET((ocEvent >= APT_OC_NO_EVENT) && (ocEvent <= APT_OC_COMBINE_EVENT_B2)); + APT_PARAM_CHECK_NO_RET(ocEventMode >= APT_OUT_CTRL_ONE_SHOT); + APT_PARAM_CHECK_NO_RET(ocEventMode <= APT_OUT_CTRL_CYCLE_BY_CYBLE); + unsigned ocModeOffset = 16; /* Offset of output control mode setting */ + if (ocEventMode == APT_OUT_CTRL_ONE_SHOT) { + aptx->OC_MODE.reg &= (~(ocEvent << ocModeOffset)); /* Set rg_oc_mode_evtx to 0 */ + } else if (ocEventMode == APT_OUT_CTRL_CYCLE_BY_CYBLE) { + aptx->OC_MODE.reg |= (ocEvent << ocModeOffset); /* Set rg_oc_mode_evtx to 1 */ + } +} + +/** + * @brief Set output control action of an output control event. + * @param aptx APT register base address. + * @param channel PWM output channel. + * @param ocEvtDir Output control event that takes into consideration of counter direction. + * @param ocAction Output control action. + * @retval None. + */ +static inline void DCL_APT_SetOutCtrlAction(APT_RegStruct *aptx, + APT_PWMChannel channel, + APT_OutCtrlEventDir ocEvtDir, + APT_OutCtrlAction ocAction) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(channel >= APT_PWM_CHANNEL_A); + APT_PARAM_CHECK_NO_RET(channel <= APT_PWM_CHANNEL_B); + APT_PARAM_CHECK_NO_RET(ocEvtDir >= APT_OC_EVT_GPIO_OR_SYSTEM_UP); + APT_PARAM_CHECK_NO_RET(ocEvtDir <= APT_OC_EVT_COMBINE_EVENT_B2_DOWN); + APT_PARAM_CHECK_NO_RET(ocAction >= APT_OUT_CTRL_ACTION_DISABLE); + APT_PARAM_CHECK_NO_RET(ocAction <= APT_OUT_CTRL_ACTION_HIGH_Z); + if (channel == APT_PWM_CHANNEL_A) { + aptx->OC_ACT_A.reg &= (~(0b111 << ocEvtDir)); + aptx->OC_ACT_A.reg |= (ocAction << ocEvtDir); + } else if (channel == APT_PWM_CHANNEL_B) { + aptx->OC_ACT_B.reg &= (~(0b111 << ocEvtDir)); + aptx->OC_ACT_B.reg |= (ocAction << ocEvtDir); + } +} + +/** + * @brief Get the flag of an output control event. + * @param aptx APT register base address. + * @param ocEvent Output control event. + * @retval bool: true, false. + */ +static inline bool DCL_APT_GetOutCtrlEventFlag(APT_RegStruct *aptx, APT_OutCtrlEvent ocEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_WITH_RET(ocEvent >= APT_OC_NO_EVENT, false); + APT_PARAM_CHECK_WITH_RET(ocEvent <= APT_OC_COMBINE_EVENT_B2, false); + return ((aptx->OC_EVT_FLAG.reg & ocEvent) == ocEvent); +} + +/** + * @brief Clear the flag of an output control event. + * @param aptx APT register base address. + * @param ocEvent Output control event. + * @retval None. + */ +static inline void DCL_APT_ClearOutCtrlEventFlag(APT_RegStruct *aptx, APT_OutCtrlEvent ocEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(ocEvent >= APT_OC_NO_EVENT); + APT_PARAM_CHECK_NO_RET(ocEvent <= APT_OC_COMBINE_EVENT_B2); + unsigned int ocFlgOffset = 16; /* Offset of output control flag clear */ + aptx->OC_EVT_FLAG.reg |= (ocEvent << ocFlgOffset); +} + +/** + * @brief Enable the event latch of an output control event. + * @param aptx APT register base address. + * @param ocEvent Output control event. + * @retval None. + */ +static inline void DCL_APT_EnableOutCtrlEventLatch(APT_RegStruct *aptx, APT_OutCtrlEvent ocEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(ocEvent >= APT_OC_NO_EVENT); + APT_PARAM_CHECK_NO_RET(ocEvent <= APT_OC_COMBINE_EVENT_B2); + aptx->OC_LAT_EN.reg |= ocEvent; +} + +/** + * @brief Disable the event latch of an output control event. + * @param aptx APT register base address. + * @param ocEvent Output control event. + * @retval None. + */ +static inline void DCL_APT_DisableOutCtrlEventLatch(APT_RegStruct *aptx, APT_OutCtrlEvent ocEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(ocEvent >= APT_OC_NO_EVENT); + APT_PARAM_CHECK_NO_RET(ocEvent <= APT_OC_COMBINE_EVENT_B2); + aptx->OC_LAT_EN.reg &= ~ocEvent; +} + +/** + * @brief Set cycle-by-cycle event latch clear event. + * @param aptx APT register base address. + * @param ocEvent Output control event. + * @param clrMode Latche clear event of cycle-by-cycle event. + * @retval None. + */ +static inline void DCL_APT_SetCBCLatchClearEvent(APT_RegStruct *aptx, + APT_OutCtrlEvent ocEvent, + APT_CBCClearMode clrMode) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(ocEvent >= APT_OC_NO_EVENT); + APT_PARAM_CHECK_NO_RET(ocEvent <= APT_OC_COMBINE_EVENT_B2); + APT_PARAM_CHECK_NO_RET(clrMode >= APT_CLEAR_CBC_ON_CNTR_ZERO); + APT_PARAM_CHECK_NO_RET(clrMode <= APT_CLEAR_CBC_ON_CNTR_ZERO_PERIOD); + unsigned int cbcClrOffsetZero = 0; /* Offset of CBC latch clear on counter equal to 0 */ + unsigned int cbcClrOffsetPrd = 16; /* Offset of CBC latch clear on counter euqal to period */ + unsigned int mask = (ocEvent << cbcClrOffsetPrd) | (ocEvent << cbcClrOffsetZero); + mask &= clrMode; + aptx->OC_PRD_CLR.reg |= mask; +} + +/** + * @brief Enable a software output control event. + * @param aptx APT register base address. + * @param ocEvent Output control event. + * @retval None. + */ +static inline void DCL_APT_EnableSwOutCtrlEvent(APT_RegStruct *aptx, APT_OutCtrlEvent ocEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(ocEvent >= APT_OC_NO_EVENT); + APT_PARAM_CHECK_NO_RET(ocEvent <= APT_OC_COMBINE_EVENT_B2); + aptx->OC_FRC_EVT.reg |= ocEvent; +} + +/** + * @brief Disable a software output control event. + * @param aptx APT register base address. + * @param ocEvent Output control event. + * @retval None. + */ +static inline void DCL_APT_DisableSwOutCtrlEvent(APT_RegStruct *aptx, APT_OutCtrlEvent ocEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(ocEvent >= APT_OC_NO_EVENT); + APT_PARAM_CHECK_NO_RET(ocEvent <= APT_OC_COMBINE_EVENT_B2); + aptx->OC_FRC_EVT.reg &= (~ocEvent); +} + +/* --------------------------------------------------------------------------------------------- */ +/* Interrupt Generation (IG) submodule Direct Configuration Layer functions -------------------- */ +/* --------------------------------------------------------------------------------------------- */ +/** + * @brief Enable the output control event to generate an event interrupt. + * @param aptx APT register base address. + * @param ocEvent Output control event. + * @retval None. + */ +static inline void DCL_APT_EnableEventInterrupt(APT_RegStruct *aptx, APT_OutCtrlEvent ocEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(ocEvent >= APT_OC_NO_EVENT); + APT_PARAM_CHECK_NO_RET(ocEvent <= APT_OC_COMBINE_EVENT_B2); + aptx->INT_EVT_EN.reg |= ocEvent; +} + +/** + * @brief Disable the output control event to generate an event interrupt.. + * @param aptx APT register base address. + * @param ocEvent Output control event. + * @retval None. + */ +static inline void DCL_APT_DisableEventInterrupt(APT_RegStruct *aptx, APT_OutCtrlEvent ocEvent) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(ocEvent >= APT_OC_NO_EVENT); + APT_PARAM_CHECK_NO_RET(ocEvent <= APT_OC_COMBINE_EVENT_B2); + aptx->INT_EVT_EN.reg &= (~ocEvent); +} + +/** + * @brief Enable timer interrupt of APT module. + * @param aptx APT register base address. + * @retval None. + */ +static inline void DCL_APT_EnableTimerInterrupt(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + aptx->INT_TMR_EN.BIT.rg_int_en_tmr = BASE_CFG_SET; +} + +/** + * @brief Disable timer interrupt of APT module. + * @param aptx APT register base address. + * @retval None. + */ +static inline void DCL_APT_DisableTimerInterrupt(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + aptx->INT_TMR_EN.BIT.rg_int_en_tmr = BASE_CFG_UNSET; +} + +/** + * @brief Get the event interrupt flag. + * @param aptx APT register base address. + * @retval bool: true, false. + */ +static inline bool DCL_APT_GetEventInterruptFlag(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + return (aptx->OC_EVT_FLAG.BIT.ro_int_flag_evt); +} + +/** + * @brief Clear the event interrupt flag. + * @param aptx APT register base address. + * @retval None. + */ +static inline void DCL_APT_ClearEventInterruptFlag(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + aptx->OC_EVT_FLAG.BIT.rg_int_clr_evt = BASE_CFG_SET; +} + +/** + * @brief Get the timer interrupt flag. + * @param aptx APT register base address. + * @retval bool: true, false. + */ +static inline bool DCL_APT_GetTimerInterruptFlag(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + return (aptx->INT_TMR_FLAG.BIT.ro_int_flag_tmr); +} + +/** + * @brief Clear the timer interrupt flag. + * @param aptx APT register base address. + * @retval None. + */ +static inline void DCL_APT_ClearTimerInterruptFlag(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + aptx->INT_TMR_FLAG.BIT.rg_int_clr_tmr = BASE_CFG_SET; +} + +/** + * @brief Select the source of timer interrupt. + * @param aptx APT register base address. + * @param tmrIntSrc Source of timer interrupt. + * @retval None. + */ +static inline void DCL_APT_SetTimerInterruptSrc(APT_RegStruct *aptx, APT_TimerInterruptSrc tmrIntSrc) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(tmrIntSrc >= APT_INT_SRC_CNTR_DISABLE); + APT_PARAM_CHECK_NO_RET(tmrIntSrc <= APT_INT_SRC_CNTR_CMPD_DOWN); + aptx->INT_TMR_SEL.BIT.rg_int_tmr_sel = tmrIntSrc; +} + +/** + * @brief Enable the synchronization of timer interrupt scale initial count value. + * @param aptx APT register base address. + * @retval None. + */ +static inline void DCL_APT_EnableTimerInterruptCountSyncInit(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + aptx->INT_PRSC_CFG.BIT.rg_int_prsc_synen = BASE_CFG_SET; +} + +/** + * @brief Disable the synchronization of timer interrupt scale initial count value. + * @param aptx APT register base address. + * @retval None. + */ +static inline void DCL_APT_DisableTimerInterruptCountSyncInit(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + aptx->INT_PRSC_CFG.BIT.rg_int_prsc_synen = BASE_CFG_UNSET; +} + +/** + * @brief Set the initial count value of timer interrupt scale. + * @param aptx APT register base address. + * @param intCntInitVal Initial count value of timer interrupt scale. + * @retval None. + */ +static inline void DCL_APT_SetTimerInterruptCountSyncInitVal(APT_RegStruct *aptx, unsigned short intCntInitVal) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(intCntInitVal <= TIMER_INTERRUPT_CNT_MAX); + aptx->INT_PRSC_CFG.BIT.rg_int_prsc_phs = intCntInitVal; +} + +/** + * @brief Set the count period of timer interrupt scale. + * @param aptx APT register base address. + * @param intCntPeriod Count period of timer interrupt scale. + * @retval None. + */ +static inline void DCL_APT_SetTimerInterruptCountPeriod(APT_RegStruct *aptx, unsigned short intCntPeriod) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(intCntPeriod <= TIMER_INTERRUPT_CNT_MAX); + aptx->INT_PRSC_CFG.BIT.rg_int_prsc_prd = intCntPeriod; +} + +/** + * @brief Get the count value of timer interrupt scale. + * @param aptx APT register base address. + * @retval unsigned short: Count value of timer interrupt scale. + */ +static inline unsigned short DCL_APT_GetTimerInterruptCount(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + return (aptx->INT_PRSC_CFG.BIT.ro_int_prsc_cnt); +} + +/** + * @brief Force the count value of timer interrupt scale to increase. + * @param aptx APT register base address. + * @retval None. + */ +static inline void DCL_APT_ForceTimerInterruptCountIncr(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + aptx->INT_PRSC_CFG.BIT.rg_int_prsc_frc = BASE_CFG_SET; +} + +/* --------------------------------------------------------------------------------------------- */ +/* ADC Converter Start (CS) submodule Direct Configuration Layer functions --------------------- */ +/* --------------------------------------------------------------------------------------------- */ +/** + * @brief Enable the ADC trigger channel. + * @param aptx APT register base address. + * @param csTrgCh ADC trigger channel. + * @retval None. + */ +static inline void DCL_APT_EnableADCTrigger(APT_RegStruct *aptx, APT_ADCTriggerChannel csTrgCh) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(csTrgCh >= APT_ADC_CONVERSION_START_A); + APT_PARAM_CHECK_NO_RET(csTrgCh <= APT_ADC_CONVERSION_START_B); + if (csTrgCh == APT_ADC_CONVERSION_START_A) { + aptx->CS_TMR_SELA.BIT.rg_csa_en_cs = BASE_CFG_SET; + } else if (csTrgCh == APT_ADC_CONVERSION_START_B) { + aptx->CS_TMR_SELB.BIT.rg_csb_en_cs = BASE_CFG_SET; + } +} + +/** + * @brief Disable the ADC trigger channel. + * @param aptx APT register base address. + * @param csTrgCh ADC trigger channel. + * @retval None. + */ +static inline void DCL_APT_DisableADCTrigger(APT_RegStruct *aptx, APT_ADCTriggerChannel csTrgCh) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(csTrgCh >= APT_ADC_CONVERSION_START_A); + APT_PARAM_CHECK_NO_RET(csTrgCh <= APT_ADC_CONVERSION_START_B); + if (csTrgCh == APT_ADC_CONVERSION_START_A) { + aptx->CS_TMR_SELA.BIT.rg_csa_en_cs = BASE_CFG_UNSET; + } else if (csTrgCh == APT_ADC_CONVERSION_START_B) { + aptx->CS_TMR_SELB.BIT.rg_csb_en_cs = BASE_CFG_UNSET; + } +} + +/** + * @brief Select the source of ADC trigger channel. + * @param aptx APT register base address. + * @param csTrgCh ADC trigger channel. + * @param csTrgSrc Source of ADC trigger. + * @retval None. + */ +static inline void DCL_APT_SetADCTriggerSrc(APT_RegStruct *aptx, + APT_ADCTriggerChannel csTrgCh, + APT_ADCTriggerSource csTrgSrc) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(csTrgCh >= APT_ADC_CONVERSION_START_A); + APT_PARAM_CHECK_NO_RET(csTrgCh <= APT_ADC_CONVERSION_START_B); + APT_PARAM_CHECK_NO_RET(csTrgSrc <= APT_CS_SRC_CNTR_CMPD_DOWN); + if (csTrgCh == APT_ADC_CONVERSION_START_A) { + aptx->CS_TMR_SELA.BIT.rg_csa_tmr_sel = csTrgSrc; + } else if (csTrgCh == APT_ADC_CONVERSION_START_B) { + aptx->CS_TMR_SELB.BIT.rg_csb_tmr_sel = csTrgSrc; + } +} + +/** + * @brief Enable synchronization of ADC trigger scale initial count value. + * @param aptx APT register base address. + * @param csTrgCh ADC trigger channel. + * @retval None. + */ +static inline void DCL_APT_EnableADCTriggerCountSyncInit(APT_RegStruct *aptx, APT_ADCTriggerChannel csTrgCh) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(csTrgCh >= APT_ADC_CONVERSION_START_A); + APT_PARAM_CHECK_NO_RET(csTrgCh <= APT_ADC_CONVERSION_START_B); + if (csTrgCh == APT_ADC_CONVERSION_START_A) { + aptx->CS_PRSCA_CFG.BIT.rg_csa_prsc_synen = BASE_CFG_SET; + } else if (csTrgCh == APT_ADC_CONVERSION_START_B) { + aptx->CS_PRSCB_CFG.BIT.rg_csb_prsc_synen = BASE_CFG_SET; + } +} + +/** + * @brief Disable synchronization of ADC trigger scale initial count value. + * @param aptx APT register base address. + * @param csTrgCh ADC trigger channel. + * @retval None. + */ +static inline void DCL_APT_DisableADCTriggerCountSyncInit(APT_RegStruct *aptx, APT_ADCTriggerChannel csTrgCh) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(csTrgCh >= APT_ADC_CONVERSION_START_A); + APT_PARAM_CHECK_NO_RET(csTrgCh <= APT_ADC_CONVERSION_START_B); + if (csTrgCh == APT_ADC_CONVERSION_START_A) { + aptx->CS_PRSCA_CFG.BIT.rg_csa_prsc_synen = BASE_CFG_UNSET; + } else if (csTrgCh == APT_ADC_CONVERSION_START_B) { + aptx->CS_PRSCB_CFG.BIT.rg_csb_prsc_synen = BASE_CFG_UNSET; + } +} + +/** + * @brief Set the initial count value of ADC trigger scale. + * @param aptx APT register base address. + * @param csTrgCh ADC trigger channel. + * @param csCntInitVal Initial count value of ADC trigger scale. + * @retval None. + */ +static inline void DCL_APT_SetADCTriggerCountSyncInitVal(APT_RegStruct *aptx, + APT_ADCTriggerChannel csTrgCh, + unsigned short csCntInitVal) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(csTrgCh >= APT_ADC_CONVERSION_START_A); + APT_PARAM_CHECK_NO_RET(csTrgCh <= APT_ADC_CONVERSION_START_B); + APT_PARAM_CHECK_NO_RET(csCntInitVal <= ADC_CONVERSION_START_CNT_MAX); + if (csTrgCh == APT_ADC_CONVERSION_START_A) { + aptx->CS_PRSCA_CFG.BIT.rg_csa_prsc_phs = csCntInitVal; + } else if (csTrgCh == APT_ADC_CONVERSION_START_B) { + aptx->CS_PRSCB_CFG.BIT.rg_csb_prsc_phs = csCntInitVal; + } +} + +/** + * @brief Set the count period of ADC trigger scale. + * @param aptx APT register base address. + * @param csTrgCh ADC trigger channel. + * @param csCntPeriod Count period of ADC trigger scale. + * @retval None. + */ +static inline void DCL_APT_SetADCTriggerCountPeriod(APT_RegStruct *aptx, + APT_ADCTriggerChannel csTrgCh, + unsigned short csCntPeriod) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(csTrgCh >= APT_ADC_CONVERSION_START_A); + APT_PARAM_CHECK_NO_RET(csTrgCh <= APT_ADC_CONVERSION_START_B); + APT_PARAM_CHECK_NO_RET(csCntPeriod <= ADC_CONVERSION_START_CNT_MAX); + if (csTrgCh == APT_ADC_CONVERSION_START_A) { + aptx->CS_PRSCA_CFG.BIT.rg_csa_prsc_prd = csCntPeriod; + } else if (csTrgCh == APT_ADC_CONVERSION_START_B) { + aptx->CS_PRSCB_CFG.BIT.rg_csb_prsc_prd = csCntPeriod; + } +} + +/** + * @brief Force the count value of ADC trigger scale to increase. + * @param aptx APT register base address. + * @param csTrgCh ADC trigger channel. + * @retval None. + */ +static inline void DCL_APT_ForceADCTriggerCountIncr(APT_RegStruct *aptx, APT_ADCTriggerChannel csTrgCh) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(csTrgCh >= APT_ADC_CONVERSION_START_A); + APT_PARAM_CHECK_NO_RET(csTrgCh <= APT_ADC_CONVERSION_START_B); + if (csTrgCh == APT_ADC_CONVERSION_START_A) { + aptx->CS_PRSCA_CFG.BIT.rg_csa_prsc_frc = BASE_CFG_SET; + } else if (csTrgCh == APT_ADC_CONVERSION_START_B) { + aptx->CS_PRSCB_CFG.BIT.rg_csb_prsc_frc = BASE_CFG_SET; + } +} + +/** + * @brief Get the flag of ADC trigger. + * @param aptx APT register base address. + * @param csTrgCh ADC trigger channel. + * @retval bool: true, false. + */ +static inline bool DCL_APT_GetADCTriggerFlag(APT_RegStruct *aptx, APT_ADCTriggerChannel csTrgCh) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_WITH_RET(csTrgCh >= APT_ADC_CONVERSION_START_A, false); + APT_PARAM_CHECK_WITH_RET(csTrgCh <= APT_ADC_CONVERSION_START_B, false); + return ((aptx->CS_FLAG.reg & csTrgCh) == csTrgCh); +} + +/** + * @brief Clear the flag of ADC trigger. + * @param aptx APT register base address. + * @param csTrgCh ADC trigger channel. + * @retval None. + */ +static inline void DCL_APT_ClearADCTriggerFlag(APT_RegStruct *aptx, APT_ADCTriggerChannel csTrgCh) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(csTrgCh >= APT_ADC_CONVERSION_START_A); + APT_PARAM_CHECK_NO_RET(csTrgCh <= APT_ADC_CONVERSION_START_B); + unsigned int trgFlgOffset = 16; /* Offset of ADC trigget flag clear */ + aptx->CS_FLAG.reg |= (csTrgCh << trgFlgOffset); +} + +/** + * @brief Configure the DMA request of ADC trigger. + * @param aptx APT register base address. + * @param csDMAReqSrc DMA request source of ADC Converter Start submodule. + * @param csDMAType DMA request type of ADC Converter Start submodule. + * @retval None. + */ +static inline void DCL_APT_SetADCTriggerDMAReq(APT_RegStruct *aptx, + APT_ADCTrgDMAReqSrc csDMAReqSrc, + APT_ADCTrgDMAReqType csDMAType) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(csDMAReqSrc >= APT_CS_DMA_REQ_SRC_DISABLE); + APT_PARAM_CHECK_NO_RET(csDMAReqSrc <= APT_CS_DMA_REQ_SRC_CHANNEL_B); + APT_PARAM_CHECK_NO_RET(csDMAType <= APT_CS_DMA_SINGLE_REQUEST); + APT_PARAM_CHECK_NO_RET(csDMAType <= APT_CS_DMA_BURST_REQUEST); + aptx->CS_DMA.reg &= (~(0b11 << csDMAType)); + aptx->CS_DMA.reg |= (csDMAReqSrc << csDMAType); +} + +/* --------------------------------------------------------------------------------------------- */ +/* Event Management (EM) submodule Direct Configuration Layer functions ------------------------ */ +/* --------------------------------------------------------------------------------------------- */ +/** + * @brief Set the polarity of GPIO/system event. + * @param aptx APT register base address. + * @param ioSysEvt GPIO or system event. + * @param ioSysEvtPolar Event polarity. + * @retval None. + */ +static inline void DCL_APT_SetIOSysEventPolarity(APT_RegStruct *aptx, + APT_EMIOSysEvent ioSysEvt, + APT_EMEventPolarity ioSysEvtPolar) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(ioSysEvt >= APT_EM_GPIO_EVENT_1); + APT_PARAM_CHECK_NO_RET(ioSysEvt <= APT_EM_SYSTEM_EVENT_3); + APT_PARAM_CHECK_NO_RET(ioSysEvtPolar >= APT_EM_EVENT_POLARITY_NOT_INVERT); + APT_PARAM_CHECK_NO_RET(ioSysEvtPolar <= APT_EM_EVENT_POLARITY_FORCE_HIGH); + aptx->EM_EVTIO_PSEL.reg &= (~(0b11 << ioSysEvt)); + aptx->EM_EVTIO_PSEL.reg |= (ioSysEvtPolar << ioSysEvt); +} + +/** + * @brief Set the polarity of multiplexing event. + * @param aptx APT register base address. + * @param mpEvt Multiplexing event. + * @param mpEvtPolar Event polarity. + * @retval None. + */ +static inline void DCL_APT_SetMpEventPolarity(APT_RegStruct *aptx, + APT_EMMuxEvent mpEvt, + APT_EMEventPolarity mpEvtPolar) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(mpEvt >= APT_EM_MP_EVENT_1); + APT_PARAM_CHECK_NO_RET(mpEvt <= APT_EM_MP_EVENT_6); + APT_PARAM_CHECK_NO_RET(mpEvtPolar >= APT_EM_EVENT_POLARITY_NOT_INVERT); + APT_PARAM_CHECK_NO_RET(mpEvtPolar <= APT_EM_EVENT_POLARITY_FORCE_HIGH); + aptx->EM_EVTMP_PSEL.reg &= (~(0b11 << mpEvt)); + aptx->EM_EVTMP_PSEL.reg |= (mpEvtPolar << mpEvt); +} + +/** + * @brief When the logicial OR result of GPIO events and MUX events is selected as the source of EM group event, + * this function is called to enable which events can participate in the logical OR operation. + * @param aptx APT register base address. + * @param emGroup The group of Event Management, which can be APT_EM_MODULE_A or APT_EM_MODULE_B. + * Each EM group has 2 events. All the 4 group events are enumerated in APT_EMGroupEvent. + * @param event1OREn The logical OR operation source of group event 1. + * @param event2OREn The logical OR operation source of group event 2. + * event1OREn and event2ORE are the logical OR of some valid values. + * Each valid values indicates that the corresponding event is enabled to participate in the + * logical OR operation of EM group event source. These valid values are: + * APT_EM_OR_EN_GPIO_EVENT_1 - GPIO event 1 is enabled + * APT_EM_OR_EN_GPIO_EVENT_2 - GPIO event 2 is enabled + * APT_EM_OR_EN_GPIO_EVENT_3 - GPIO event 3 is enabled + * APT_EM_OR_EN_MUX_EVENT_1 - MUX event 1 is enabled + * APT_EM_OR_EN_MUX_EVENT_2 - MUX event 2 is enabled + * APT_EM_OR_EN_MUX_EVENT_3 - MUX event 3 is enabled + * APT_EM_OR_EN_MUX_EVENT_4 - MUX event 4 is enabled + * APT_EM_OR_EN_MUX_EVENT_5 - MUX event 5 is enabled + * APT_EM_OR_EN_MUX_EVENT_6 - MUX event 6 is enabled + * @retval None. + */ +static inline void DCL_APT_SetEMEventOR(APT_RegStruct *aptx, + APT_EMGroup emGroup, + unsigned short event1OREn, + unsigned short event2OREn) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(emGroup >= APT_EM_MODULE_A); + APT_PARAM_CHECK_NO_RET(emGroup <= APT_EM_MODULE_B); + if (emGroup == APT_EM_MODULE_A) { + aptx->EM_AOR_EN.BIT.rg_em_a1_oren = event1OREn; + aptx->EM_AOR_EN.BIT.rg_em_a2_oren = event2OREn; + } else if (emGroup == APT_EM_MODULE_B) { + aptx->EM_BOR_EN.BIT.rg_em_b1_oren = event1OREn; + aptx->EM_BOR_EN.BIT.rg_em_b2_oren = event2OREn; + } +} + +/** + * @brief Select the combine event source of GRP_A1, GRP_A2, GRP_B1, GRP_B2. + * @param aptx APT register base address. + * @param evtGroup Combine event source group. + * @param combineEvtSrc Combine event source. + * @retval None. + */ +static inline void DCL_APT_SetCombineGroupSrc(APT_RegStruct *aptx, + APT_EMCombineEvtSrcGrp evtGroup, + APT_EMCombineEvtSrc combineEvtSrc) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(evtGroup >= APT_EM_COMBINE_SRC_GRP_A1); + APT_PARAM_CHECK_NO_RET(evtGroup <= APT_EM_COMBINE_SRC_GRP_B2); + APT_PARAM_CHECK_NO_RET(combineEvtSrc >= APT_EM_COMBINE_SRC_EVT_1); + APT_PARAM_CHECK_NO_RET(combineEvtSrc <= APT_EM_COMBINE_SRC_ALL_EVENT_OR); + unsigned int grpEvtFieldWidth = 4; /* Bit field width of combine event group input source setting */ + aptx->EM_MRG_SEL.reg &= (~(0b1111 << (evtGroup * grpEvtFieldWidth))); + aptx->EM_MRG_SEL.reg |= (combineEvtSrc << (evtGroup * grpEvtFieldWidth)); +} + +/** + * @brief Select Combine Mode + * @param aptx APT register base address. + * @param cmbEvt Combine event. + * @param cmbMode Combine mode. + * @retval None. + */ +static inline void DCL_APT_SetCombineEventSrc(APT_RegStruct *aptx, + APT_EMCombineEvent cmbEvt, + APT_EMCombineEvtMode cmbMode) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(cmbEvt >= APT_EM_COMBINE_EVENT_A1); + APT_PARAM_CHECK_NO_RET(cmbEvt <= APT_EM_COMBINE_EVENT_B2); + APT_PARAM_CHECK_NO_RET(cmbMode >= APT_EM_COMBINE_LOW_LEVEL); + APT_PARAM_CHECK_NO_RET(cmbMode <= APT_EM_COMBINE_EVT2); + unsigned int cmbModeOffset = 16; /* Offset of combine mode */ + unsigned int cmbModeFieldWidth = 4; /* Bit field width of combine mode */ + aptx->EM_MRG_SEL.reg &= (~(0b111 << (cmbModeOffset + cmbEvt * cmbModeFieldWidth))); + aptx->EM_MRG_SEL.reg |= (cmbMode << (cmbModeOffset + cmbEvt * cmbModeFieldWidth)); +} + +/** + * @brief Select the source of Event Management submodule filter event. + * @param aptx APT register base address. + * @param cmbEvt Combine event. + * @retval None. + */ +static inline void DCL_APT_SelectFilterEventInput(APT_RegStruct *aptx, APT_EMCombineEvent cmbEvt) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(cmbEvt >= APT_EM_COMBINE_EVENT_A1); + APT_PARAM_CHECK_NO_RET(cmbEvt <= APT_EM_COMBINE_EVENT_B2); + aptx->EM_OUT_SEL.BIT.rg_evtfilt_sel = cmbEvt; +} + +/** + * @brief Set the output type of combine event. + * @param aptx APT register base address. + * @param cmbEvt Combine event. + * @param filter Whether the output of combine event is filtered. + * @retval None. + */ +static inline void DCL_APT_SetCombineEventOut(APT_RegStruct *aptx, + APT_EMCombineEvent cmbEvt, + APT_EMCombineEventOut filter) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(cmbEvt >= APT_EM_COMBINE_EVENT_A1); + APT_PARAM_CHECK_NO_RET(cmbEvt <= APT_EM_COMBINE_EVENT_B2); + APT_PARAM_CHECK_NO_RET(filter >= APT_EM_COMBINE_EVENT_OUT_ORIG_SIGNAL); + APT_PARAM_CHECK_NO_RET(filter <= APT_EM_COMBINE_EVENT_OUT_FILT_SIGNAL); + aptx->EM_OUT_SEL.reg &= (~(0b1 << cmbEvt)); + aptx->EM_OUT_SEL.reg |= (filter << cmbEvt); +} + +/** + * @brief Select the sync-in source of slave APT module. + * @param aptx APT register base address. + * @param syncInSrc Sync-in source of slave APT module. + * @retval None. + */ +static inline void DCL_APT_SelectSyncInPulseSrc(APT_RegStruct *aptx, APT_SyncInSrc syncInSrc) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(syncInSrc >= APT_SYNCIN_SRC_APT0_SYNCOUT); + APT_PARAM_CHECK_NO_RET(syncInSrc <= APT_SYNCIN_SRC_DISABLE); + aptx->SYNI_CFG.BIT.rg_syni_sel = syncInSrc; +} + +/** + * @brief Get the flag of sync-in pulse. + * @param aptx APT register base address. + * @retval bool: true, false. + */ +static inline bool DCL_APT_GetSyncInPulseFlag(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + return (aptx->SYNI_CFG.BIT.ro_syni_flag); +} + +/** + * @brief Clear the flag of sync-in pulse. + * @param aptx APT register base address. + * @retval None. + */ +static inline void DCL_APT_ClearSyncInPulseFlag(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + aptx->SYNI_CFG.BIT.rg_syni_clr = BASE_CFG_SET; +} + +/** + * @brief Select the synchronization source of the time-base counter. + * @param aptx APT register base address. + * @param cntrSyncSrc The selection of synchronization source for the time-base counter. + * A logical OR of valid values can be passed as the cntrSyncSrc parameter. + * Valid values for cntrSyncSrc are: + * APT_CNTR_SYNC_SRC_COMBINE_EVENT_A1 - Enable combine event A1 as the counter synchronization source. + * APT_CNTR_SYNC_SRC_COMBINE_EVENT_B1 - Enable combine event B1 as the counter synchronization source. + * APT_CNTR_SYNC_SRC_SYNCIN - Enable Sync-In source as the counter synchronization source. + * @retval None. + */ +static inline void DCL_APT_SetTimeBaseCounterSyncSrc(APT_RegStruct *aptx, unsigned short cntrSyncSrc) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(cntrSyncSrc <= CNTR_SYNC_SOURCE_MAX); + aptx->SYNCNT_CFG.reg = cntrSyncSrc; +} + +/** + * @brief Select the source of synchronization out pulse. + * @param aptx APT register base address. + * @param syncOutSrc The source of synchronization out pulse. + * A logical OR of valid values can be passed as the syncOutSrc parameter. + * Valid values for syncOutSrc are: + * APT_SYNC_OUT_ON_CNTR_ZERO - Generate a sync out pulse when counter equals zero. + * APT_SYNC_OUT_ON_CNTR_PERIOD - Generate a sync out pulse when counter equals period. + * APT_SYNC_OUT_ON_COMBINE_EVENT_A1 - Generate a sync out pulse when combine event A1 happens. + * APT_SYNC_OUT_ON_COMBINE_EVENT_B1 - Generate a sync out pulse when combine event B1 happens. + * APT_SYNC_OUT_ON_CNTR_CMPB - Generate a sync out pulse when counter equals CMPB. + * APT_SYNC_OUT_ON_CNTR_CMPC - Generate a sync out pulse when counter equals CMPC. + * APT_SYNC_OUT_ON_CNTR_CMPD - Generate a sync out pulse when counter equals CMPD. + * @retval None. + */ +static inline void DCL_APT_SetSyncOutPulseSrc(APT_RegStruct *aptx, unsigned short syncOutSrc) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(syncOutSrc <= SYNC_OUT_SOURCE_MAX); + aptx->SYNO_CFG.reg &= (~(0xFF << 0)); + aptx->SYNO_CFG.reg |= (syncOutSrc << 0); +} + +/** + * @brief Set synchronization mode of master APT module. + * @param aptx APT register base address. + * @param syncOutMode Synchronization mode of master APT module. + * @retval None. + */ +static inline void DCL_APT_SetSyncOutMode(APT_RegStruct *aptx, APT_SyncOutMode syncOutMode) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(syncOutMode >= APT_SYNCOUT_ONE_SHOT_MODE); + APT_PARAM_CHECK_NO_RET(syncOutMode <= APT_SYNCOUT_MULTIPLE_MODE); + aptx->SYNO_CFG.BIT.rg_mode_syno = syncOutMode; +} + +/** + * @brief Select the latch source of one-shot sync-out mode. + * @param aptx APT register base address. + * @param latSetSel Latch source of one-shot sync-out mode. + * @retval None. + */ +static inline void DCL_APT_SelectSyncOutOneShotLatch(APT_RegStruct *aptx, APT_SyncOutLatSetSel latSetSel) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(latSetSel >= APT_SYNCOUT_LATCH_SET_ON_SW_FORCE); + APT_PARAM_CHECK_NO_RET(latSetSel <= APT_SYNCOUT_LATCH_SET_ON_GLB_LOAD); + aptx->SYNO_CFG.BIT.rg_latset_sel = latSetSel; +} + +/** + * @brief When in one-shot sync out mode and rg_latset_otsyn is selected as the latch set condition, + * this function is called to turn the one-shot latch condition ON. + * Upon occurrence of a chosen sync out source event, a sync out pulse is generated and the latch + * will be cleared. Hence writing 1 to rg_latset_otsyn will allow a sync out event to pass through + * and block other sync out source event. + * @param aptx APT register base address. + * @retval None. + */ +static inline void DCL_APT_SetSyncOutOneShotLatch(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + aptx->SYNO_CFG.BIT.rg_latset_otsyn = BASE_CFG_SET; +} + +/** + * @brief Select the pulse that causes global buffer load. + * @param aptx APT register base address. + * @param glbLoadEvt The pulse that causes global buffer load. + * A logical OR of valid values can be passed as the syncOutSrc parameter. + * Valid values for gloLoadTrg are: + * APT_GLB_LOAD_ON_CNTR_ZERO - Global buffer load when counter equals zero. + * APT_GLB_LOAD_ON_CNTR_PERIOD - Global buffer load when counter equals period. + * APT_GLB_LOAD_ON_CNTR_SYNC - Global buffer load when counter sync is effective. + * @retval None. + */ +static inline void DCL_APT_SetGlobalLoadEvent(APT_RegStruct *aptx, unsigned short glbLoadEvt) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + aptx->GLB_LOAD.reg &= (~(0b111 << 0)); + aptx->GLB_LOAD.reg |= (glbLoadEvt << 0); +} + +/** + * @brief Set the prescale value of multiple global buffer load mode. + * @param aptx APT register base address. + * @param gldCntPeriod Prescale value of multiple global buffer load mode. + * @retval None. + */ +static inline void DCL_APT_SetGlobalLoadPrescale(APT_RegStruct *aptx, unsigned short gldCntPeriod) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(gldCntPeriod <= GLOBAL_LOAD_CNT_MAX); + aptx->GLB_LOAD.BIT.rg_gld_prsc_prd = gldCntPeriod; +} + +/** + * @brief Set the global buffer load mode. + * @param aptx APT register base address. + * @param glbLoadMode Global buffer load mode. + * @retval None. + */ +static inline void DCL_APT_SetGlobalLoadMode(APT_RegStruct *aptx, APT_GlobalLoadMode glbLoadMode) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(glbLoadMode >= APT_GLB_LOAD_ONE_SHOT_MODE); + APT_PARAM_CHECK_NO_RET(glbLoadMode <= APT_GLB_LOAD_MULTIPLE_MODE); + aptx->GLB_LOAD.BIT.rg_mode_gld = glbLoadMode; +} + +/** + * @brief When in one-shot global buffer load mode, this function is called to turn the one-shot latch condition ON. + * Upon occurrence of a chosen global buffer load event, the registers that is set to global buffer load mode + * will load the buffer, and the one-shot latch will be cleared. Hence writing 1 to rg_latset_otgld will + * allow a global buffer load event to pass through and block other global buffer load event. + * @param aptx APT register base address. + * @retval None. + */ +static inline void DCL_APT_SetGlobalLoadOneShotLatch(APT_RegStruct *aptx) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + aptx->GLB_LOAD.BIT.rg_latset_otgld = BASE_CFG_SET; +} + +/** + * @brief Get buffer status of the registers that enable buffer load. + * @param aptx The base address of APT module. + * @param regBuf The buffer of the registers that enable buffer load. + * @retval true: The register buffer is full. + * @retval false: The register buffer is not full. + */ +static inline bool DCL_APT_GetRegBufferStatus(APT_RegStruct *aptx, APT_RegBuffer regBuf) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_WITH_RET(regBuf <= APT_REG_BUFFER_DG_CFG, false); + return ((aptx->LOAD_STS.reg & regBuf) == regBuf); +} + +/** + * @brief Generate a synchronization force event. + * @param aptx The base address of APT module. + * @param frcEvt Synchronization force event. + * @retval None. + */ +static inline void DCL_APT_ForceEvent(APT_RegStruct *aptx, APT_ForceEvtType frcEvt) +{ + APT_ASSERT_PARAM(IsAPTInstance(aptx)); + APT_PARAM_CHECK_NO_RET(frcEvt <= APT_FORCE_EVENT_PWM_ACTION_BUF_LOAD); + aptx->SYN_FRC.reg |= frcEvt; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_APT_IP_H */ diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/apt/src/apt.c b/vendor/others/demo/5-tim_adc/demo/drivers/apt/src/apt.c new file mode 100644 index 000000000..e0ac4efdd --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/apt/src/apt.c @@ -0,0 +1,1432 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file apt.c + * @author MCU Driver Team + * @brief APT module driver. + * @details This file provides firmware functions to manage the following functionalities of APT module. + * + Initialization and de-initialization functions + * + APT module synchronization functions. + * + PWM waveform configuration and ADC trigger time configuration functions. + * + Interrupt callback function and user registration function + */ + +#include "apt.h" +#include "crg.h" +#define MAX_DUTY 100 +#define ALL_EVT_INT_FLAGS 0xf770000U +#define RERF 4 +/** + * @brief The parameters of PWM waveform. + */ +typedef struct { + APT_PWMAction leftEdgeActA; /**< Action on the left edge of PWM channel A. */ + APT_PWMAction rightEdgeActA; /**< Action on the right edge of PWM channel A. */ + APT_PWMAction leftEdgeActB; /**< Action on the left edge of PWM channel B. */ + APT_PWMAction rightEdgeActB; /**< Action on the right edge of PWM channel B. */ + APT_REDInput redInput; /**< Input source of Dead-Band rising edge delay counter. */ + APT_REDOutMode redOutMode; /**< Output mode of Dead-Band rising edge delay counter. */ + APT_FEDInput fedInput; /**< Input source of Dead-Band falling edge delay counter. */ + APT_FEDOutMode fedOutMode; /**< Output mode of Dead-Band falling edge delay counter. */ +} APT_WaveformPara; + +/** + * @brief Initialize the time-base counter of APT module. + * @param aptHandle APT module handle. + * @retval None. + */ +static void APT_TimeBaseInit(APT_Handle *aptHandle) +{ + aptHandle->baseAddress->TC_MODE.BIT.rg_cnt_mode = aptHandle->waveform.cntMode; + aptHandle->baseAddress->TC_MODE.BIT.rg_div_fac = aptHandle->waveform.dividerFactor; + /* Disable buffer mode of TC_PRD */ + aptHandle->baseAddress->TC_BUF_EN.reg &= (~(0b11 << 0)); + aptHandle->baseAddress->TC_PRD.BIT.rg_cnt_prd = aptHandle->waveform.timerPeriod; + /* Set the override value of divier and timebase counter */ + aptHandle->baseAddress->TC_OVRID.BIT.rg_cnt_ovrid = aptHandle->waveform.cntInitVal; + aptHandle->baseAddress->TC_OVRID.BIT.rg_cnt_ovrid_en = 1; +} + +/** + * @brief Initialize the count compare points for PWM waveform generation. + * @param aptHandle APT module handle. + * @retval None. + */ +static void APT_SetPWMCompareVal(APT_Handle *aptHandle) +{ + /* Configure the compare point along the left and right edges of PWM waveform */ + TC_REFC_REG tmpC; + TC_REFD_REG tmpD; + /* Set the value of the active register of CMPC and CMPD */ + tmpC = aptHandle->baseAddress->TC_REFC; + tmpC.BIT.rg_cnt_refc = aptHandle->waveform.cntCmpLeftEdge; + aptHandle->baseAddress->TC_REFC = tmpC; + tmpD = aptHandle->baseAddress->TC_REFD; + tmpD.BIT.rg_cnt_refd = aptHandle->waveform.cntCmpRightEdge; + aptHandle->baseAddress->TC_REFD = tmpD; + /* Set the buffer load mode of CMPC and CMPD */ + if (aptHandle->waveform.cntCmpLoadMode == APT_BUFFER_DISABLE) { + aptHandle->baseAddress->TC_BUF_EN.BIT.rg_refc_buf_en = 0; + aptHandle->baseAddress->TC_BUF_EN.BIT.rg_refd_buf_en = 0; + } else { + aptHandle->baseAddress->TC_BUF_EN.BIT.rg_refc_buf_en = 1; + aptHandle->baseAddress->TC_BUF_EN.BIT.rg_refd_buf_en = 1; + unsigned int gldLdEn = (aptHandle->waveform.cntCmpLoadMode == APT_BUFFER_GLOBAL_LOAD) ? 1 : 0; + aptHandle->baseAddress->TC_BUF_EN.BIT.rg_refc_gld_en = gldLdEn; + aptHandle->baseAddress->TC_BUF_EN.BIT.rg_refd_gld_en = gldLdEn; + /* Set buffer load event */ + unsigned int refBufField = 8; /* reference buffer field */ + aptHandle->baseAddress->TC_REF_LOAD.reg &= (~(0x1F << (APT_COMPARE_REFERENCE_C * refBufField))); + aptHandle->baseAddress->TC_REF_LOAD.reg &= (~(0x1F << (APT_COMPARE_REFERENCE_D * refBufField))); + aptHandle->baseAddress->TC_REF_LOAD.reg |= + (aptHandle->waveform.cntCmpLoadEvt << (APT_COMPARE_REFERENCE_C * refBufField)); + aptHandle->baseAddress->TC_REF_LOAD.reg |= + (aptHandle->waveform.cntCmpLoadEvt << (APT_COMPARE_REFERENCE_D * refBufField)); + /* Set the value of the buffer register of CMPC and CMPD */ + tmpC = aptHandle->baseAddress->TC_REFC; /* read register */ + tmpC.BIT.rg_cnt_refc = aptHandle->waveform.cntCmpLeftEdge; + aptHandle->baseAddress->TC_REFC = tmpC; /* write back changed data back to register */ + tmpD = aptHandle->baseAddress->TC_REFD; /* read register */ + tmpD.BIT.rg_cnt_refd = aptHandle->waveform.cntCmpRightEdge; + aptHandle->baseAddress->TC_REFD = tmpD; /* write back changed data back to register */ + } +} + +/** + * @brief Configure the basic PWM A waveform output according to the waveform parameters. + * @param aptHandle APT module handle. + * @param wavePara PWM waveform parameter. + * @retval None. + */ +static void APT_SetOutputABasicType(APT_Handle *aptHandle, const APT_WaveformPara *wavePara) +{ + switch (aptHandle->waveform.cntMode) { + case APT_COUNT_MODE_UP: + aptHandle->baseAddress->PG_ACT_A.BIT.rg_pga_act_refc_inc = wavePara->leftEdgeActA; + aptHandle->baseAddress->PG_ACT_A.BIT.rg_pga_act_refd_inc = wavePara->rightEdgeActA; + break; + case APT_COUNT_MODE_DOWN: + aptHandle->baseAddress->PG_ACT_A.BIT.rg_pga_act_refc_dec = wavePara->rightEdgeActA; + aptHandle->baseAddress->PG_ACT_A.BIT.rg_pga_act_refd_dec = wavePara->leftEdgeActA; + break; + case APT_COUNT_MODE_UP_DOWN: + aptHandle->baseAddress->PG_ACT_A.BIT.rg_pga_act_refc_inc = wavePara->leftEdgeActA; + aptHandle->baseAddress->PG_ACT_A.BIT.rg_pga_act_refd_dec = wavePara->rightEdgeActA; + break; + default: + break; + } + return; +} + +/** + * @brief Configure the basic PWM B waveform output according to the waveform parameters. + * @param aptHandle APT module handle. + * @param wavePara PWM waveform parameter. + * @retval None. + */ +static void APT_SetOutputBBasicType(APT_Handle *aptHandle, const APT_WaveformPara *wavePara) +{ + switch (aptHandle->waveform.cntMode) { + case APT_COUNT_MODE_UP: + aptHandle->baseAddress->PG_ACT_B.BIT.rg_pgb_act_refc_inc = wavePara->leftEdgeActB; + aptHandle->baseAddress->PG_ACT_B.BIT.rg_pgb_act_refd_inc = wavePara->rightEdgeActB; + break; + case APT_COUNT_MODE_DOWN: + aptHandle->baseAddress->PG_ACT_B.BIT.rg_pgb_act_refc_dec = wavePara->rightEdgeActB; + aptHandle->baseAddress->PG_ACT_B.BIT.rg_pgb_act_refd_dec = wavePara->leftEdgeActB; + break; + case APT_COUNT_MODE_UP_DOWN: + aptHandle->baseAddress->PG_ACT_B.BIT.rg_pgb_act_refc_inc = wavePara->leftEdgeActB; + aptHandle->baseAddress->PG_ACT_B.BIT.rg_pgb_act_refd_dec = wavePara->rightEdgeActB; + break; + default: + break; + } + return; +} + +/** + * @brief Configure the basic PWM waveform output according to the waveform parameters. + * @param aptHandle APT module handle. + * @param wavePara PWM waveform parameter. + * @retval None. + */ +static void APT_SetPWMBasicType(APT_Handle *aptHandle, const APT_WaveformPara *wavePara) +{ + /* Configure PWM waveform of PWM channel A */ + if (aptHandle->waveform.chAOutType == APT_PWM_OUT_BASIC_TYPE) { + APT_SetOutputABasicType(aptHandle, wavePara); + } + /* Configure PWM waveform of PWM channel B */ + if (aptHandle->waveform.chBOutType == APT_PWM_OUT_BASIC_TYPE) { + APT_SetOutputBBasicType(aptHandle, wavePara); + } + /* Configure dead band of PWM channel A and channel B */ + if (aptHandle->waveform.chAOutType == APT_PWM_OUT_BASIC_TYPE && + aptHandle->waveform.chBOutType == APT_PWM_OUT_BASIC_TYPE) { + aptHandle->baseAddress->DG_CFG.BIT.rg_dg_red_isel = wavePara->redInput; + aptHandle->baseAddress->DG_CFG.BIT.rg_dg_red_osel = wavePara->redOutMode; + aptHandle->baseAddress->DG_RED.BIT.rg_dg_red = aptHandle->waveform.deadBandCnt; + aptHandle->baseAddress->DG_CFG.BIT.rg_dg_fed_isel = wavePara->fedInput; + aptHandle->baseAddress->DG_CFG.BIT.rg_dg_fed_osel = wavePara->fedOutMode; + aptHandle->baseAddress->DG_FED.BIT.rg_dg_fed = aptHandle->waveform.deadBandCnt; + } +} + +/** + * @brief Set the actual outputs of PWM channelA and channelB when basic PWM waveform type is not used. + * @param aptHandle APT module handle. + * @retval None. + */ +static void APT_SetContWaveform(APT_Handle *aptHandle) +{ + if (aptHandle->waveform.chAOutType != APT_PWM_OUT_BASIC_TYPE) { + unsigned int contActA = (aptHandle->waveform.chAOutType == APT_PWM_OUT_ALWAYS_LOW) ? 0b01 : 0b10; + aptHandle->baseAddress->PG_ACT_A.BIT.rg_pga_act_zro = contActA; + } + if (aptHandle->waveform.chBOutType != APT_PWM_OUT_BASIC_TYPE) { + unsigned int contActB = (aptHandle->waveform.chBOutType == APT_PWM_OUT_ALWAYS_LOW) ? 0b01 : 0b10; + aptHandle->baseAddress->PG_ACT_B.BIT.rg_pgb_act_zro = contActB; + } +} + +/** + * @brief Initialize the PWM waveform parameters according to the selected PWM basic type. + * @param aptHandle APT module handle. + * @retval None. + */ +static void APT_SetPWMWaveform(APT_Handle *aptHandle) +{ + APT_SetContWaveform(aptHandle); + /* Configure the basic type of PWM waveform */ + APT_WaveformPara wavePara = {0, 0, 0, 0, 0, 0, 0, 0}; + switch (aptHandle->waveform.basicType) { + case APT_PWM_BASIC_A_HIGH_B_LOW: + wavePara.leftEdgeActA = APT_PWM_ACTION_HIGH; + wavePara.rightEdgeActA = APT_PWM_ACTION_LOW; + wavePara.leftEdgeActB = APT_PWM_ACTION_HIGH; + wavePara.rightEdgeActB = APT_PWM_ACTION_LOW; + wavePara.redInput = APT_DB_RED_INPUT_PWM_A; + wavePara.redOutMode = APT_DB_RED_OUTPUT_NOT_INVERT; + wavePara.fedInput = APT_DB_FED_INPUT_PWM_B; + wavePara.fedOutMode = APT_DB_FED_OUTPUT_INVERT; + break; + case APT_PWM_BASIC_A_LOW_B_HIGH: + wavePara.leftEdgeActA = APT_PWM_ACTION_LOW; + wavePara.rightEdgeActA = APT_PWM_ACTION_HIGH; + wavePara.leftEdgeActB = APT_PWM_ACTION_LOW; + wavePara.rightEdgeActB = APT_PWM_ACTION_HIGH; + wavePara.fedInput = APT_DB_FED_INPUT_PWM_A; + wavePara.fedOutMode = APT_DB_FED_OUTPUT_INVERT; + wavePara.redInput = APT_DB_RED_INPUT_PWM_B; + wavePara.redOutMode = APT_DB_RED_OUTPUT_NOT_INVERT; + break; + case APT_PWM_BASIC_A_HIGH_B_HIGH: + wavePara.leftEdgeActA = APT_PWM_ACTION_HIGH; + wavePara.rightEdgeActA = APT_PWM_ACTION_LOW; + wavePara.leftEdgeActB = APT_PWM_ACTION_HIGH; + wavePara.rightEdgeActB = APT_PWM_ACTION_LOW; + wavePara.redInput = APT_DB_RED_INPUT_PWM_A; + wavePara.redOutMode = APT_DB_RED_OUTPUT_NOT_INVERT; + wavePara.fedInput = APT_DB_FED_INPUT_PWM_B; + wavePara.fedOutMode = APT_DB_FED_OUTPUT_NOT_INVERT; + break; + case APT_PWM_BASIC_A_LOW_B_LOW: + wavePara.leftEdgeActA = APT_PWM_ACTION_LOW; + wavePara.rightEdgeActA = APT_PWM_ACTION_HIGH; + wavePara.leftEdgeActB = APT_PWM_ACTION_LOW; + wavePara.rightEdgeActB = APT_PWM_ACTION_HIGH; + wavePara.fedInput = APT_DB_FED_INPUT_PWM_A; + wavePara.fedOutMode = APT_DB_FED_OUTPUT_NOT_INVERT; + wavePara.redInput = APT_DB_RED_INPUT_PWM_B; + wavePara.redOutMode = APT_DB_RED_OUTPUT_NOT_INVERT; + break; + default: + break; + } + APT_SetPWMBasicType(aptHandle, &wavePara); +} + +/** + * @brief Initialize the count compare points for triggering ADC sampling. + * @param aptHandle APT module handle. + * @retval None. + */ +static void APT_SetADCTrgCompareVal(APT_Handle *aptHandle) +{ + /* Configure the count compare point for triggering SOCA and SOCB */ + TC_REFA_REG tmpA; + TC_REFB_REG tmpB; + /* Set the value of active register for CMPA and CMPB */ + tmpA = aptHandle->baseAddress->TC_REFA; /* read register */ + tmpA.BIT.rg_cnt_refa = aptHandle->adcTrg.cntCmpSOCA; + aptHandle->baseAddress->TC_REFA = tmpA; /* write back changed data to register */ + tmpB = aptHandle->baseAddress->TC_REFB; + tmpB.BIT.rg_cnt_refb = aptHandle->adcTrg.cntCmpSOCB; + aptHandle->baseAddress->TC_REFB = tmpB; + /* Set the buffer load mode of CMPA and CMPB */ + if (aptHandle->adcTrg.cntCmpLoadMode == APT_BUFFER_DISABLE) { + aptHandle->baseAddress->TC_BUF_EN.BIT.rg_refa_buf_en = 0; /* disable buffer function */ + aptHandle->baseAddress->TC_BUF_EN.BIT.rg_refb_buf_en = 0; /* disable buffer function */ + } else { + aptHandle->baseAddress->TC_BUF_EN.BIT.rg_refa_buf_en = 1; + aptHandle->baseAddress->TC_BUF_EN.BIT.rg_refb_buf_en = 1; + /* Set global buffer */ + unsigned int gldLdEn = (aptHandle->adcTrg.cntCmpLoadMode == APT_BUFFER_GLOBAL_LOAD) ? 1 : 0; + aptHandle->baseAddress->TC_BUF_EN.BIT.rg_refa_gld_en = gldLdEn; + aptHandle->baseAddress->TC_BUF_EN.BIT.rg_refb_gld_en = gldLdEn; + /* Set buffer load event */ + unsigned int refBufField = 8; + aptHandle->baseAddress->TC_REF_LOAD.reg &= (~(0x1F << (APT_COMPARE_REFERENCE_A * refBufField))); + aptHandle->baseAddress->TC_REF_LOAD.reg &= (~(0x1F << (APT_COMPARE_REFERENCE_B * refBufField))); + aptHandle->baseAddress->TC_REF_LOAD.reg |= + (aptHandle->adcTrg.cntCmpLoadEvt << (APT_COMPARE_REFERENCE_A * refBufField)); + aptHandle->baseAddress->TC_REF_LOAD.reg |= + (aptHandle->adcTrg.cntCmpLoadEvt << (APT_COMPARE_REFERENCE_B * refBufField)); + /* Set the value of buffer register for CMPA and CMPB */ + tmpA = aptHandle->baseAddress->TC_REFA; + tmpA.BIT.rg_cnt_refa = aptHandle->adcTrg.cntCmpSOCA; + aptHandle->baseAddress->TC_REFA = tmpA; + tmpB = aptHandle->baseAddress->TC_REFB; + tmpB.BIT.rg_cnt_refb = aptHandle->adcTrg.cntCmpSOCB; + aptHandle->baseAddress->TC_REFB = tmpB; + } +} + +/** + * @brief Initialize the ADC trigger function of APT module. + * @param aptHandle APT module handle + * @retval None. + */ +static void APT_SetADCTrigger(APT_Handle *aptHandle) +{ + APT_PARAM_CHECK_NO_RET(aptHandle->adcTrg.trgScaleSOCA <= ADC_CONVERSION_START_CNT_MAX); + APT_PARAM_CHECK_NO_RET(aptHandle->adcTrg.trgScaleSOCB <= ADC_CONVERSION_START_CNT_MAX); + /* Configure ADC trigger source SOCA */ + aptHandle->baseAddress->CS_TMR_SELA.BIT.rg_csa_tmr_sel = aptHandle->adcTrg.trgSrcSOCA; + aptHandle->baseAddress->CS_PRSCA_CFG.BIT.rg_csa_prsc_prd = aptHandle->adcTrg.trgScaleSOCA; + aptHandle->baseAddress->CS_TMR_SELA.BIT.rg_csa_en_cs = aptHandle->adcTrg.trgEnSOCA; + /* Configure ADC trigger source SOCB */ + aptHandle->baseAddress->CS_TMR_SELB.BIT.rg_csb_tmr_sel = aptHandle->adcTrg.trgSrcSOCB; + aptHandle->baseAddress->CS_PRSCB_CFG.BIT.rg_csb_prsc_prd = aptHandle->adcTrg.trgScaleSOCB; + aptHandle->baseAddress->CS_TMR_SELB.BIT.rg_csb_en_cs = aptHandle->adcTrg.trgEnSOCB; +} + +/** + * @brief Initialize the timer interrupt of APT module. + * @param aptHandle APT module handle. + * @retval None. + */ +static void APT_SetTimerInterrupt(APT_Handle *aptHandle) +{ + APT_PARAM_CHECK_NO_RET(aptHandle->tmrInterrupt.tmrInterruptScale <= TIMER_INTERRUPT_CNT_MAX); + aptHandle->baseAddress->INT_TMR_SEL.BIT.rg_int_tmr_sel = aptHandle->tmrInterrupt.tmrInterruptSrc; + aptHandle->baseAddress->INT_PRSC_CFG.BIT.rg_int_prsc_prd = aptHandle->tmrInterrupt.tmrInterruptScale; + aptHandle->baseAddress->INT_TMR_EN.BIT.rg_int_en_tmr = aptHandle->tmrInterrupt.tmrInterruptEn; +} + +/** + * @brief Initialize the APT hardware configuration based on the APT module handle. + * @param aptHandle APT module handle. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_APT_PWMInit(APT_Handle *aptHandle) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + APT_PARAM_CHECK_WITH_RET(aptHandle->waveform.dividerFactor <= DIVIDER_FACTOR_MAX, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(aptHandle->waveform.divInitVal <= aptHandle->waveform.dividerFactor, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(aptHandle->waveform.cntInitVal < aptHandle->waveform.timerPeriod, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(aptHandle->waveform.cntCmpLeftEdge > 0, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(aptHandle->waveform.cntCmpLeftEdge < aptHandle->waveform.timerPeriod, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(aptHandle->waveform.cntCmpRightEdge > 0, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(aptHandle->waveform.cntCmpRightEdge < aptHandle->waveform.timerPeriod, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(aptHandle->adcTrg.cntCmpSOCA >= 0, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(aptHandle->adcTrg.cntCmpSOCA < aptHandle->waveform.timerPeriod, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(aptHandle->adcTrg.cntCmpSOCB >= 0, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(aptHandle->adcTrg.cntCmpSOCB < aptHandle->waveform.timerPeriod, BASE_STATUS_ERROR); + APT_TimeBaseInit(aptHandle); + APT_SetPWMCompareVal(aptHandle); + APT_SetPWMWaveform(aptHandle); + APT_SetADCTrgCompareVal(aptHandle); + APT_SetADCTrigger(aptHandle); + APT_SetTimerInterrupt(aptHandle); + return BASE_STATUS_OK; +} + +/** + * @brief Deinitialize the APT hardware configuration. + * @param aptHandle APT module handle. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_APT_PWMDeInit(APT_Handle *aptHandle) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + /* CallBack function set null. */ + aptHandle->userCallBack.EvtInterruptCallBack = NULL; + aptHandle->userCallBack.TmrInterruptCallBack = NULL; + /* Reset the Interrupt register. */ + aptHandle->baseAddress->INT_TMR_EN.BIT.rg_int_en_tmr = BASE_CFG_UNSET; + aptHandle->baseAddress->CS_TMR_SELA.BIT.rg_csa_en_cs = BASE_CFG_UNSET; + aptHandle->baseAddress->CS_TMR_SELB.BIT.rg_csb_en_cs = BASE_CFG_UNSET; + /* Reset reference points of APT. */ + aptHandle->baseAddress->TC_BUF_EN.reg = 0x0; + aptHandle->baseAddress->TC_REFA.reg = 0x0; + aptHandle->baseAddress->TC_REFB.reg = 0x0; + aptHandle->baseAddress->TC_REFC.reg = 0x0; + aptHandle->baseAddress->TC_REFD.reg = 0x0; + aptHandle->baseAddress->TC_PRD.BIT.rg_cnt_prd = 0x2710; /* 0x2710: default value */ + aptHandle->baseAddress->PG_ACT_A.reg = 0x0; /* Clear action register. */ + aptHandle->baseAddress->PG_ACT_B.reg = 0x0; + return BASE_STATUS_OK; +} + +/** + * @brief Configure output control protection mode. + * @param aptHandle APT module handle. + * @param protect Output control protection event handle. + * @retval None. + */ +static void APT_SetOutCtrlProtectMode(APT_Handle *aptHandle, APT_OutCtrlProtect *protect) +{ + /* Set output control protect mode */ + unsigned int ocModeOffset = 16; + unsigned int cbcClrOffsetPrd = 16; + if (protect->ocEventMode == APT_OUT_CTRL_ONE_SHOT) { + aptHandle->baseAddress->OC_MODE.reg &= (~(protect->ocEvent << ocModeOffset)); + } else if (protect->ocEventMode == APT_OUT_CTRL_CYCLE_BY_CYBLE) { + aptHandle->baseAddress->OC_MODE.reg |= (protect->ocEvent << ocModeOffset); + if ((protect->cbcClrMode & APT_CLEAR_CBC_ON_CNTR_ZERO) ==APT_CLEAR_CBC_ON_CNTR_ZERO) { + aptHandle->baseAddress->OC_PRD_CLR.reg |= protect->ocEvent; + } + if ((protect->cbcClrMode & APT_CLEAR_CBC_ON_CNTR_PERIOD) == APT_CLEAR_CBC_ON_CNTR_PERIOD) { + aptHandle->baseAddress->OC_PRD_CLR.reg |= (protect->ocEvent << cbcClrOffsetPrd); + } + } +} + +/** + * @brief Output control protection action selection. + * @param aptHandle APT module handle. + * @param ocAction Out control action. + * @param protect Output control protection event handle. + * @param outCtrlEvent output settings. + * @retval None. + */ +static void APT_SetOutCtrlAction(APT_Handle *aptHandle, APT_OutCtrlAction ocAction, APT_OutCtrlEventDir outCtrlEvent) +{ + /* Set output control action when counting up */ + aptHandle->baseAddress->OC_ACT_A.reg &= (~(0b111 << outCtrlEvent)); + aptHandle->baseAddress->OC_ACT_A.reg |= (ocAction << outCtrlEvent); + aptHandle->baseAddress->OC_ACT_B.reg &= (~(0b111 << outCtrlEvent)); + aptHandle->baseAddress->OC_ACT_B.reg |= (ocAction << outCtrlEvent); +} + +/** + * @brief Indicates the configuration of protection actions for different channels(PWMA and PWMB output action). + * @param aptHandle APT module handle. @ref APT_Handle + * @param ocActionA PWMA output action control. @ref APT_OutCtrlAction + * @param ocActionB PWMB output action control. @ref APT_OutCtrlAction + * @param outCtrlEvent Action configuration in different counting directions. @ref APT_OutCtrlEventDir + * @retval None. + */ +static void APT_SetOutCtrlActionEx(APT_Handle *aptHandle, APT_OutCtrlAction ocActionA, APT_OutCtrlAction ocActionB, + APT_OutCtrlEventDir outCtrlEvent) +{ + /* Set output control action when counting up */ + aptHandle->baseAddress->OC_ACT_A.reg &= (~(0b111 << outCtrlEvent)); + aptHandle->baseAddress->OC_ACT_A.reg |= (ocActionA << outCtrlEvent); + aptHandle->baseAddress->OC_ACT_B.reg &= (~(0b111 << outCtrlEvent)); + aptHandle->baseAddress->OC_ACT_B.reg |= (ocActionB << outCtrlEvent); +} + +/** + * @brief Change APT's OC Event to EM Event. + * @param ocEvent OC Event. + * @param emEvent EM Event. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType APT_ChangeOcEventToEmEvent(APT_OutCtrlEvent ocEvent, APT_EMIOSysEvent *emEvent) +{ + APT_ASSERT_PARAM(emEvent != NULL); + switch (ocEvent) { + case APT_OC_GPIO_EVENT_1: + *emEvent = APT_EM_GPIO_EVENT_1; + break; + case APT_OC_GPIO_EVENT_2: + *emEvent = APT_EM_GPIO_EVENT_2; + break; + case APT_OC_GPIO_EVENT_3: + *emEvent = APT_EM_GPIO_EVENT_3; + break; + case APT_OC_SYSTEM_EVENT_1: + *emEvent = APT_EM_SYSTEM_EVENT_1; + break; + case APT_OC_SYSTEM_EVENT_2: + *emEvent = APT_EM_SYSTEM_EVENT_2; + break; + case APT_OC_SYSTEM_EVENT_3: + *emEvent = APT_EM_SYSTEM_EVENT_3; + break; + default: + return BASE_STATUS_ERROR; + } + + return BASE_STATUS_OK; +} + +/** + * @brief Set combine event out control action. + * @param aptHandle APT module handle. + * @param protect Output control protection event handle. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType APT_SetCombieEvtOutCtrl(APT_Handle *aptHandle, APT_OutCtrlProtect *protect) +{ + switch (protect->ocEvent) { + case APT_OC_COMBINE_EVENT_A1: + APT_SetOutCtrlAction(aptHandle, protect->ocAction, APT_OC_EVT_COMBINE_EVENT_A1_UP); + APT_SetOutCtrlAction(aptHandle, protect->ocAction, APT_OC_EVT_COMBINE_EVENT_A1_DOWN); + break; + case APT_OC_COMBINE_EVENT_A2: + APT_SetOutCtrlAction(aptHandle, protect->ocAction, APT_OC_EVT_COMBINE_EVENT_A2_UP); + APT_SetOutCtrlAction(aptHandle, protect->ocAction, APT_OC_EVT_COMBINE_EVENT_A2_DOWN); + break; + case APT_OC_COMBINE_EVENT_B1: + APT_SetOutCtrlAction(aptHandle, protect->ocAction, APT_OC_EVT_COMBINE_EVENT_B1_UP); + APT_SetOutCtrlAction(aptHandle, protect->ocAction, APT_OC_EVT_COMBINE_EVENT_B1_DOWN); + break; + case APT_OC_COMBINE_EVENT_B2: + APT_SetOutCtrlAction(aptHandle, protect->ocAction, APT_OC_EVT_COMBINE_EVENT_B2_UP); + APT_SetOutCtrlAction(aptHandle, protect->ocAction, APT_OC_EVT_COMBINE_EVENT_B2_DOWN); + break; + default: + return BASE_STATUS_ERROR; + } + + return BASE_STATUS_OK; +} + +/** + * @brief Setting emulation mode of APT module. + * @param aptHandle APT module handle. + * @param protect Output control protection event handle. + * @retval None. + */ +static void APT_OcSetEmulation(APT_Handle *aptHandle, APT_OutCtrlProtect *protect) +{ + aptHandle->baseAddress->TC_MODE.BIT.rg_emu_stop = protect->emMode; + if (protect->emMode > APT_EMULATION_NO_STOP) { + aptHandle->baseAddress->OC_MODE.reg |= APT_OC_SYSTEM_EVENT_1; + } +} + +/** + * @brief Initialize the output control protection event of APT module. + * @param aptHandle APT module handle. + * @param protect Output control protection event handle. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_APT_ProtectInit(APT_Handle *aptHandle, APT_OutCtrlProtect *protect) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(protect != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + APT_PARAM_CHECK_WITH_RET(protect->ocEvent >= APT_OC_GPIO_EVENT_1, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(protect->ocEvent <= APT_OC_COMBINE_EVENT_B2, BASE_STATUS_ERROR); + APT_SetOutCtrlProtectMode(aptHandle, protect); + /* Emultion settings */ + APT_OcSetEmulation(aptHandle, protect); + + if ((protect->ocEvent >= APT_OC_COMBINE_EVENT_A1) && (protect->ocEvent <= APT_OC_COMBINE_EVENT_B2)) { + if (APT_SetCombieEvtOutCtrl(aptHandle, protect) == BASE_STATUS_ERROR) { + return BASE_STATUS_ERROR; + } + } else { + /* Set IO event polarity */ + APT_EMIOSysEvent ioSysEvt; + if (APT_ChangeOcEventToEmEvent(protect->ocEvent, &ioSysEvt) == BASE_STATUS_OK) { + aptHandle->baseAddress->EM_EVTIO_PSEL.reg &= (~(0b11 << ioSysEvt)); + aptHandle->baseAddress->EM_EVTIO_PSEL.reg |= (protect->evtPolarity << ioSysEvt); + } + /* Set output control action when counting up */ + APT_SetOutCtrlAction(aptHandle, protect->ocAction, APT_OC_EVT_GPIO_OR_SYSTEM_UP); + /* Set output control action when counting down */ + APT_SetOutCtrlAction(aptHandle, protect->ocAction, APT_OC_EVT_GPIO_OR_SYSTEM_DOWN); + } + if (protect->ocEventEn == BASE_CFG_ENABLE) { + aptHandle->baseAddress->OC_MODE.reg |= (protect->ocEvent); + } else { + aptHandle->baseAddress->OC_MODE.reg &= (~(protect->ocEvent)); + } + if (protect->ocEvtInterruptEn == BASE_CFG_ENABLE) { + aptHandle->baseAddress->INT_EVT_EN.reg |= (protect->ocEvent); + } else { + aptHandle->baseAddress->INT_EVT_EN.reg &= (~(protect->ocEvent)); + } + return BASE_STATUS_OK; +} + +/** + * @brief Setting protect source event filter, only support the same filter value. + * @param filterNum filter cycle number. + * @retval None. + */ +static void APT_SetEMEventFilterEx(unsigned char filterNum) +{ + unsigned int srcEvent; + unsigned int enableOffset = 24; + unsigned int valueShift = 8; + unsigned int maxEventNum = 3; /* every register can config 3 event's filer */ + for (srcEvent = 0; srcEvent < maxEventNum; srcEvent++) { + SYSCTRL1->APT_POE_FILTER.reg |= 0x1 << (enableOffset + srcEvent); + SYSCTRL1->APT_POE_FILTER.reg |= (((unsigned int)filterNum & 0xff) << (valueShift * srcEvent)); + SYSCTRL1->APT_EVTMP_FILTER.reg |= 0x1 << (enableOffset + srcEvent); + SYSCTRL1->APT_EVTMP_FILTER.reg |= (((unsigned int)filterNum & 0xff) << (valueShift * srcEvent)); + } +} + +/** + * @brief Set protect source event polarity. + * @param aptHandle APT module handle. + * @param polarityMask polarity bit mask. + * @retval None. + */ +static void APT_SetProtectSrcEventPolarityEx(APT_Handle *aptHandle, unsigned int polarityMask) +{ + unsigned int curEvent; + unsigned int curPolarity; + unsigned int curMpEventNum; /* System Compare Event Sources */ + unsigned int curIoEventNum; /* I/O Event Source */ + /* Sets the polarity of the trigger source. */ + for (int i = 0; i <= APT_EM_COMBINE_SRC_EVT_MP_6; i++) { + curEvent = i; + curPolarity = (polarityMask >> curEvent) & 0x01; + if (curEvent >= APT_EM_COMBINE_SRC_EVT_MP_1) { + curMpEventNum = (curEvent - APT_EM_COMBINE_SRC_EVT_MP_1) << 1; + /* set ACMP0~2 and EVTMP4~6 event polarity */ + aptHandle->baseAddress->EM_EVTMP_PSEL.reg &= (~(0b11 << curMpEventNum)); + aptHandle->baseAddress->EM_EVTMP_PSEL.reg |= (curPolarity << curMpEventNum); + } else { + /* set IO event polarity */ + curIoEventNum = curEvent << 1; + aptHandle->baseAddress->EM_EVTIO_PSEL.reg &= (~(0b11 << curIoEventNum)); + aptHandle->baseAddress->EM_EVTIO_PSEL.reg |= (curPolarity << curIoEventNum); + } + } +} + +/** + * @brief Configure output control protection mode. + * @param aptHandle APT module handle. + * @param protect Output control protection event handle. + * @retval None. + */ +static void APT_SetSysEventProtectModeEx(APT_Handle *aptHandle, APT_OutCtrlProtectEx *protect) +{ + /* Set output control protect mode */ + unsigned int ocModeOffset = 16; + unsigned int cbcClrOffsetPrd = 16; + if (protect->ocEventModeEx == APT_OUT_CTRL_ONE_SHOT) { + aptHandle->baseAddress->OC_MODE.reg &= (~(protect->ocSysEvent << ocModeOffset)); + } else if (protect->ocEventModeEx == APT_OUT_CTRL_CYCLE_BY_CYBLE) { + aptHandle->baseAddress->OC_MODE.reg |= (protect->ocSysEvent << ocModeOffset); + if ((protect->cbcClrModeEx & APT_CLEAR_CBC_ON_CNTR_ZERO) ==APT_CLEAR_CBC_ON_CNTR_ZERO) { + aptHandle->baseAddress->OC_PRD_CLR.reg |= protect->ocSysEvent; + } + if ((protect->cbcClrModeEx & APT_CLEAR_CBC_ON_CNTR_PERIOD) == APT_CLEAR_CBC_ON_CNTR_PERIOD) { + aptHandle->baseAddress->OC_PRD_CLR.reg |= (protect->ocSysEvent << cbcClrOffsetPrd); + } + } +} + +/** + * @brief System event protect initialize. + * @param aptHandle APT module handle. + * @param protect Output control protection event data. + * @retval None. + */ +static void APT_SysProtectInitEx(APT_Handle *aptHandle, APT_OutCtrlProtectEx *protect) +{ + APT_SetSysEventProtectModeEx(aptHandle, protect); + if (protect->ocEventEnEx == BASE_CFG_ENABLE) { + aptHandle->baseAddress->OC_MODE.reg |= protect->ocSysEvent; + } else { + aptHandle->baseAddress->OC_MODE.reg &= (~(protect->ocSysEvent)); + } + if (protect->ocEvtInterruptEnEx == BASE_CFG_ENABLE) { + aptHandle->baseAddress->INT_EVT_EN.reg |= protect->ocSysEvent; + } else { + aptHandle->baseAddress->INT_EVT_EN.reg &= (~(protect->ocSysEvent)); + } +} + +/** + * @brief Initialize the output control protection event of APT module (Extended interface). + * @param aptHandle APT module handle. + * @param protect Output control protection event data. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_APT_ProtectInitEx(APT_Handle *aptHandle, APT_OutCtrlProtectEx *protect) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(protect != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + APT_PARAM_CHECK_WITH_RET(protect->originalEvtEx >= 0, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(protect->originalEvtEx <= 0x1FF, BASE_STATUS_ERROR); /* 0x1FF : all event enable */ + unsigned int cbcClrOffsetPrd = 16; + aptHandle->baseAddress->OC_MODE.reg = 0x0; /* clear OC_MODE resgiter */ + aptHandle->baseAddress->TC_MODE.BIT.rg_emu_stop = 0x0; /* don't stop APT when emulation */ + aptHandle->baseAddress->OC_PRD_CLR.reg = 0x0; /* clear OC_PRD_CLR register */ + APT_SysProtectInitEx(aptHandle, protect); + /* event management configuration */ + aptHandle->baseAddress->EM_MRG_SEL.BIT.rg_em_a1_sel = EM_COMBINE_A1_SRC_ENABLE_ALL; /* open logic OR */ + aptHandle->baseAddress->EM_AOR_EN.BIT.rg_em_a1_oren = protect->originalEvtEx; /* open selected event */ + APT_SetProtectSrcEventPolarityEx(aptHandle, protect->evtPolarityMaskEx); + APT_SetEMEventFilterEx(protect->filterCycleNumEx); + aptHandle->baseAddress->EM_MRG_SEL.BIT.rg_evta1t_sel= APT_EM_COMBINE_EVT1; /* all event input to combine event A1 */ + /* out control configuration */ + APT_SetOutCtrlActionEx(aptHandle, protect->ocActionEx, protect->ocActionBEx, APT_OC_EVT_COMBINE_EVENT_A1_UP); + APT_SetOutCtrlActionEx(aptHandle, protect->ocActionEx, protect->ocActionBEx, APT_OC_EVT_COMBINE_EVENT_A1_DOWN); + /* system event protect setting. */ + APT_SetOutCtrlActionEx(aptHandle, protect->ocActionEx, protect->ocActionBEx, APT_OC_EVT_GPIO_OR_SYSTEM_UP); + APT_SetOutCtrlActionEx(aptHandle, protect->ocActionEx, protect->ocActionBEx, APT_OC_EVT_GPIO_OR_SYSTEM_DOWN); + aptHandle->baseAddress->OC_MODE.BIT.rg_oc_mode_evta1 = protect->ocEventModeEx; /* set protect mode */ + if ((protect->cbcClrModeEx & APT_CLEAR_CBC_ON_CNTR_ZERO) ==APT_CLEAR_CBC_ON_CNTR_ZERO) { + aptHandle->baseAddress->OC_PRD_CLR.reg |= APT_OC_COMBINE_EVENT_A1; /* set CBC clear mode */ + } + if ((protect->cbcClrModeEx & APT_CLEAR_CBC_ON_CNTR_PERIOD) == APT_CLEAR_CBC_ON_CNTR_PERIOD) { + aptHandle->baseAddress->OC_PRD_CLR.reg |= (APT_OC_COMBINE_EVENT_A1 << cbcClrOffsetPrd); + } + if (protect->ocEventEnEx == BASE_CFG_ENABLE) { + aptHandle->baseAddress->OC_MODE.reg |= APT_OC_COMBINE_EVENT_A1; /* OC input combine event A1 */ + } else { + aptHandle->baseAddress->OC_MODE.reg &= (~(APT_OC_COMBINE_EVENT_A1)); + } + if (protect->ocEvtInterruptEnEx == BASE_CFG_ENABLE) { + aptHandle->baseAddress->INT_EVT_EN.reg |= (APT_OC_COMBINE_EVENT_A1); + } else { + aptHandle->baseAddress->INT_EVT_EN.reg &= (~(APT_OC_COMBINE_EVENT_A1)); /* enable combine event A1 interrupt */ + } + return BASE_STATUS_OK; +} + +/** + * @brief De-initialize the output control protection event of APT module (Extended interface). + * @param aptHandle APT module handle. + * @param protect Output control protection event handle. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_APT_ProtectDeInitEx(APT_Handle *aptHandle, APT_OutCtrlProtectEx *protect) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(protect != NULL); + protect->ocEventEnEx = BASE_CFG_DISABLE; + aptHandle->baseAddress->OC_MODE.reg = 0x700070; /* 0x7000070: default value */ + + return BASE_STATUS_OK; +} + +/** + * @brief De-initialize the output control protection event of APT module. + * @param aptHandle APT module handle. + * @param protect Output control protection event handle. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_APT_ProtectDeInit(APT_Handle *aptHandle, APT_OutCtrlProtect *protect) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(protect != NULL); + protect->ocEventEn = BASE_CFG_DISABLE; + aptHandle->baseAddress->OC_MODE.reg = 0x700070; /* 0x7000070: default value */ + + return BASE_STATUS_OK; +} + +/** + * @brief Set event management's source events polarity. + * @param aptHandle APT module handle. + * @param emEvtSrc Source event selection. + * @param emEvtPolar Event polarity. + * @retval None. + */ +static void APT_SetEMInputEvtPolarity(APT_Handle *aptHandle, APT_EMCombineEvtSrc emEvtSrc, + APT_EMEventPolarity emEvtPolar) +{ + unsigned int eventPolarity; + if (emEvtSrc >= APT_EM_COMBINE_SRC_EVT_MP_1) { + /* set multiplex event polarity */ + eventPolarity = (emEvtSrc - APT_EM_COMBINE_SRC_EVT_MP_1) << 1; + aptHandle->baseAddress->EM_EVTMP_PSEL.reg &= (~(0b11 << eventPolarity)); + aptHandle->baseAddress->EM_EVTMP_PSEL.reg |= (emEvtPolar << eventPolarity); + } else { + /* set io event polarity */ + eventPolarity = (emEvtSrc) << 1; + aptHandle->baseAddress->EM_EVTIO_PSEL.reg &= (~(0b11 << eventPolarity)); + aptHandle->baseAddress->EM_EVTIO_PSEL.reg |= (emEvtPolar << eventPolarity); + } +} + + +/** + * @brief Set event management's source events input and event combine. + * (if enable logic or function, it do not support setting polarity, need use DCL to set polarity.) + * @param aptHandle APT module handle. + * @param emEvent EM event handle. + * @retval None. + */ +static void APT_EMCombineEventInit(APT_Handle *aptHandle, APT_CombineEvt *emEvent) +{ + unsigned int evtNum; + for (evtNum = 0; evtNum < EM_CMB_EVT_NUM; evtNum++) { + /* if select logical or */ + aptHandle->baseAddress->EM_MRG_SEL.reg |= emEvent[evtNum].emEvtSrc << (evtNum * EM_CMB_SRC_SEL_INTERVAL); + if (emEvent[evtNum].emEvtSrc == APT_EM_COMBINE_SRC_ALL_EVENT_OR) { + /* enable logical or events */ + if (evtNum < APT_EM_COMBINE_EVENT_B1) { + aptHandle->baseAddress->EM_AOR_EN.reg |= (emEvent[evtNum].emEvtOrEnBits << (evtNum * EM_OR_INTERVAL)); + } else { + aptHandle->baseAddress->EM_BOR_EN.reg |= (emEvent[evtNum].emEvtOrEnBits << \ + ((evtNum - APT_EM_COMBINE_EVENT_B1) * EM_OR_INTERVAL)); + } + } else { + /* set input event's polarity */ + APT_SetEMInputEvtPolarity(aptHandle, emEvent[evtNum].emEvtSrc, emEvent[evtNum].emEvtPolar); + } + aptHandle->baseAddress->EM_MRG_SEL.reg |= (emEvent[evtNum].emEvtCombineMode << \ + (evtNum * EM_CMB_MODE_INTERVAL)) << EM_CMB_MODE_OFFSET; + } +} + +/* + * @brief Initialize mask window and capture function of event management at up down mode. + * (do not support across cycles mask window). + * @param aptHandle APT module handle. + * @param emWdAndCp Mask window and capture configuration handle. + * @param totalWidth offset add window size value. + * @retval None. + */ +static void APT_EMWdAndCapUpDownModeInit(APT_Handle *aptHandle, APT_WdAndCap *emWdAndCap, unsigned int totalWidth) +{ + unsigned int pointA; /* window left point */ + unsigned int pointB; /* window right point */ + + if (totalWidth <= (aptHandle->waveform.timerPeriod)) { /* total width is little than period value */ + aptHandle->baseAddress->TC_MWDREFB.reg = totalWidth; + aptHandle->baseAddress->TC_MWD_ACT.BIT.rg_mwdrefa_act_inc = APT_PWM_ACTION_HIGH; + aptHandle->baseAddress->TC_MWD_ACT.BIT.rg_mwdrefb_act_inc = APT_PWM_ACTION_LOW; + } else { /* total width bigger than period */ + /* left point smaller or equal than period */ + if ((emWdAndCap->wdOffset) <= (aptHandle->waveform.timerPeriod)) { + /* 2: up down mode waveform period is (timer period * 2) */ + pointB = (2 * aptHandle->waveform.timerPeriod) - totalWidth; + aptHandle->baseAddress->TC_MWDREFB.reg = pointB; + aptHandle->baseAddress->TC_MWD_ACT.BIT.rg_mwdrefa_act_inc = APT_PWM_ACTION_HIGH; + aptHandle->baseAddress->TC_MWD_ACT.BIT.rg_mwdrefb_act_dec = APT_PWM_ACTION_LOW; + } else { /* left point bigger than period */ + /* 2: up down mode waveform period is (timer period * 2) */ + pointA = (2 * aptHandle->waveform.timerPeriod) - emWdAndCap->wdOffset; + aptHandle->baseAddress->TC_MWDREFA.reg = pointA; + aptHandle->baseAddress->TC_MWD_ACT.BIT.rg_mwdrefa_act_dec = APT_PWM_ACTION_HIGH; + aptHandle->baseAddress->TC_MWD_ACT.BIT.rg_mwdrefb_act_dec = APT_PWM_ACTION_LOW; + } + } +} + +/* + * @brief Initialize mask window and capture function of event management(do not support across cycles mask window). + * @param aptHandle APT module handle. + * @param emWdAndCp Mask window and capture configuration handle. + * @retval None. + */ +static void APT_EMWdAndCapInit(APT_Handle *aptHandle, APT_WdAndCap *emWdAndCap) +{ + unsigned int totalWidth; + if (emWdAndCap->wdEnable == true) { + /* filter source select */ + aptHandle->baseAddress->EM_OUT_SEL.BIT.rg_evtfilt_sel = emWdAndCap->eventSel; + /* enable mask window */ + aptHandle->baseAddress->TC_MWD_EN.BIT.rg_mskwd_en = BASE_CFG_ENABLE; + /* set polarity */ + aptHandle->baseAddress->TC_MWD_EN.BIT.rg_mskwd_psel = emWdAndCap->wdPolar; + /* set compare value */ + aptHandle->baseAddress->TC_MWDREFA.reg = emWdAndCap->wdOffset; + totalWidth = emWdAndCap->wdOffset + emWdAndCap->wdWidth; + if (aptHandle->waveform.cntMode == APT_COUNT_MODE_UP_DOWN) { + APT_EMWdAndCapUpDownModeInit(aptHandle, emWdAndCap, totalWidth); + } else if (aptHandle->waveform.cntMode == APT_COUNT_MODE_UP) { + aptHandle->baseAddress->TC_MWDREFB.reg = totalWidth; + aptHandle->baseAddress->TC_MWD_ACT.BIT.rg_mwdrefa_act_inc = APT_PWM_ACTION_HIGH; + aptHandle->baseAddress->TC_MWD_ACT.BIT.rg_mwdrefb_act_inc = APT_PWM_ACTION_LOW; + } else if (aptHandle->waveform.cntMode == APT_COUNT_MODE_DOWN) { + aptHandle->baseAddress->TC_MWDREFB.reg = totalWidth; + aptHandle->baseAddress->TC_MWD_ACT.BIT.rg_mwdrefa_act_dec = APT_PWM_ACTION_HIGH; + aptHandle->baseAddress->TC_MWD_ACT.BIT.rg_mwdrefb_act_dec = APT_PWM_ACTION_LOW; + } else { + return; + } + } + return; +} + +/** + * @brief Event management initialization interface. + * @param aptHandle APT module handle. + * @param eventManage Event management handle. + * @retval None. + */ +BASE_StatusType HAL_APT_EMInit(APT_Handle *aptHandle, APT_EventManage *eventManage) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(eventManage != NULL); + if (eventManage->emEnable == true) { /* event manage enable */ + APT_EMCombineEventInit(aptHandle, eventManage->emEvt); /* init combine event */ + if (eventManage->emWdAndCap.wdEnable == true) { + aptHandle->baseAddress->EM_OUT_SEL.reg |= EM_OUT_EVT_FILTER_EN; + APT_EMWdAndCapInit(aptHandle, &(eventManage->emWdAndCap)); + } + return BASE_STATUS_OK; + } + return BASE_STATUS_ERROR; +} + + +/** + * @brief Get capture value of Event management. + * @param aptHandle APT module handle. + * @retval unsigned short: Capture counting value. + */ +unsigned short HAL_APT_EMGetCapValue(APT_Handle *aptHandle) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + BASE_FUNC_UNUSED(aptHandle); + unsigned short capValue = 0; + return capValue; /* v1 don't have this function return 0 */ +} + +/** + * @brief Set vallet switch's software calibrate of Event management. + * @param aptHandle APT module handle. + * @param calibrate Delay calibration. + * @retval None. + */ +void HAL_APT_EMSetValleySwithSoftDelay(APT_Handle *aptHandle, unsigned short calibrate) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + BASE_FUNC_UNUSED(aptHandle); /* v1 don't have this function */ + BASE_FUNC_UNUSED(calibrate); /* v1 don't have this function */ + return; +} + +/** + * @brief Disable PWMA and PWMB output. PWMA and PWMB output low level. + * @param aptHandle APT module handle. + * @retval None. + */ +void HAL_APT_ForcePWMOutputLow(APT_Handle *aptHandle) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + DCL_APT_ForcePWMOutputLow(aptHandle->baseAddress); + + return; +} + +/** + * @brief Initialize the master APT module when using multiple sync-out mode. + * @param aptHandle APT module handle. + * @param syncOutSrc Master APT module synchronization source. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_APT_MasterSyncInit(APT_Handle *aptHandle, unsigned short syncOutSrc) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + APT_PARAM_CHECK_WITH_RET(syncOutSrc <= SYNC_OUT_SOURCE_MAX, BASE_STATUS_ERROR); + /* Configure the sync-out pulse source of APT module synchronization */ + aptHandle->baseAddress->SYNO_CFG.reg &= (~(0xFF << 0)); + aptHandle->baseAddress->SYNO_CFG.reg |= (syncOutSrc << 0); + aptHandle->baseAddress->SYNO_CFG.BIT.rg_mode_syno = APT_SYNCOUT_MULTIPLE_MODE; + return BASE_STATUS_OK; +} + +/** + * @brief Initialize the slave APT module. + * @param aptHandle APT module handle. + * @param slaveSyncIn Slave APT module synchronization handle. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_APT_SlaveSyncInit(APT_Handle *aptHandle, APT_SlaveSyncIn *slaveSyncIn) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(slaveSyncIn != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + APT_PARAM_CHECK_WITH_RET(slaveSyncIn->divPhase <= aptHandle->waveform.dividerFactor, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(slaveSyncIn->cntPhase < aptHandle->waveform.timerPeriod, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(slaveSyncIn->cntrSyncSrc <= CNTR_SYNC_SOURCE_MAX, BASE_STATUS_ERROR); + + aptHandle->baseAddress->TC_PHS.BIT.rg_cnt_dir = slaveSyncIn->syncCntMode; + TC_PHS_REG tmp = aptHandle->baseAddress->TC_PHS; + tmp.BIT.rg_cnt_phs = slaveSyncIn->cntPhase; + aptHandle->baseAddress->TC_PHS = tmp; + + aptHandle->baseAddress->SYNI_CFG.BIT.rg_syni_sel = slaveSyncIn->syncInSrc; + aptHandle->baseAddress->SYNCNT_CFG.reg = slaveSyncIn->cntrSyncSrc; + return BASE_STATUS_OK; +} + +/** + * @brief Start all of the used APT modules simultaneously. + * @param aptRunMask A logical OR of valid values that can be passed as the aptRunMask. + * Valid values for aptRunMask are: + * RUN_APT0 - apt0_run bit in SYSCTRL1 register. + * RUN_APT1 - apt1_run bit in SYSCTRL1 register. + * RUN_APT2 - apt2_run bit in SYSCTRL1 register. + * RUN_APT3 - apt3_run bit in SYSCTRL1 register. + * RUN_APT4 - apt4_run bit in SYSCTRL1 register. + * RUN_APT5 - apt5_run bit in SYSCTRL1 register. + * RUN_APT6 - apt6_run bit in SYSCTRL1 register. + * RUN_APT7 - apt7_run bit in SYSCTRL1 register. + * RUN_APT8 - apt8_run bit in SYSCTRL1 register. + * @retval None. + */ +void HAL_APT_StartModule(unsigned int aptRunMask) +{ + SYSCTRL1->APT_RUN.reg |= aptRunMask; +} + +/** + * @brief Stop all of the used APT modules simultaneously. + * @param aptRunMask A logical OR of valid values that can be passed as the aptRunMask. + * Valid values for aptRunMask are: + * RUN_APT0 - apt0_run bit in SYSCTRL1 register. + * RUN_APT1 - apt1_run bit in SYSCTRL1 register. + * RUN_APT2 - apt2_run bit in SYSCTRL1 register. + * RUN_APT3 - apt3_run bit in SYSCTRL1 register. + * RUN_APT4 - apt4_run bit in SYSCTRL1 register. + * RUN_APT5 - apt5_run bit in SYSCTRL1 register. + * RUN_APT6 - apt6_run bit in SYSCTRL1 register. + * RUN_APT7 - apt7_run bit in SYSCTRL1 register. + * RUN_APT8 - apt8_run bit in SYSCTRL1 register. + * @retval None. + */ +void HAL_APT_StopModule(unsigned int aptRunMask) +{ + SYSCTRL1->APT_RUN.reg &= (~aptRunMask); +} + +/** + * @brief Set the count compare points along the left and right edges of PWM waveform. + * @param aptHandle APT module handle. + * @param cntCmpLeftEdge The count compare point of the left edge of PWM waveform. Pull High on left edge. + * @param cntCmpRightEdge The count compare point of the right edge of PWM waveform. Pull Low on right edge. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_APT_SetPWMDuty(APT_Handle *aptHandle, unsigned short cntCmpLeftEdge, \ + unsigned short cntCmpRightEdge) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + APT_PARAM_CHECK_WITH_RET(cntCmpLeftEdge > 0, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(cntCmpLeftEdge < aptHandle->waveform.timerPeriod, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(cntCmpRightEdge > 0, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(cntCmpRightEdge < aptHandle->waveform.timerPeriod, BASE_STATUS_ERROR); + TC_REFC_REG tmpC; + TC_REFD_REG tmpD; + tmpC = aptHandle->baseAddress->TC_REFC; + tmpC.BIT.rg_cnt_refc = cntCmpLeftEdge; + aptHandle->baseAddress->TC_REFC = tmpC; + tmpD = aptHandle->baseAddress->TC_REFD; + tmpD.BIT.rg_cnt_refd = cntCmpRightEdge; + aptHandle->baseAddress->TC_REFD = tmpD; + return BASE_STATUS_OK; +} + +/** + * @brief Set the count compare points along the left and right edges of PWM waveform. + * @param aptHandle APT module handle. + * @param duty PWM duty. Range: 1 ~ 99. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_APT_SetPWMDutyByNumber(APT_Handle *aptHandle, unsigned int duty) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + APT_PARAM_CHECK_WITH_RET(duty < MAX_DUTY, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(duty > 0, BASE_STATUS_ERROR); + + unsigned int cntCmpLeftEdge, cntCmpRightEdge; + TC_REFC_REG tmpC; + TC_REFD_REG tmpD; + + if (aptHandle->waveform.cntMode == APT_COUNT_MODE_UP_DOWN) { + cntCmpLeftEdge = aptHandle->waveform.timerPeriod - \ + (int)(((float)aptHandle->waveform.timerPeriod / MAX_DUTY) * duty); + cntCmpRightEdge = cntCmpLeftEdge; + } else { + cntCmpLeftEdge = 1; + cntCmpRightEdge = (int)(((float)aptHandle->waveform.timerPeriod / MAX_DUTY) * duty + cntCmpLeftEdge); + } + tmpC = aptHandle->baseAddress->TC_REFC; + tmpC.BIT.rg_cnt_refc = cntCmpLeftEdge; + aptHandle->baseAddress->TC_REFC = tmpC; + tmpD = aptHandle->baseAddress->TC_REFD; + tmpD.BIT.rg_cnt_refd = cntCmpRightEdge; + aptHandle->baseAddress->TC_REFD = tmpD; + return BASE_STATUS_OK; +} + +/** + * @brief Set the count compare points to trigger the ADC sampling. + * @param aptHandle APT module handle. + * @param cntCmpSOCA The count compare point for triggering SOCA. + * @param cntCmpSOCB The count compare point for triggering SOCB. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_APT_SetADCTriggerTime(APT_Handle *aptHandle, unsigned short cntCmpSOCA, unsigned short cntCmpSOCB) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + APT_PARAM_CHECK_WITH_RET(cntCmpSOCA > 0, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(cntCmpSOCA < aptHandle->waveform.timerPeriod, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(cntCmpSOCB > 0, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(cntCmpSOCB < aptHandle->waveform.timerPeriod, BASE_STATUS_ERROR); + TC_REFA_REG tmpA; + TC_REFB_REG tmpB; + tmpA = aptHandle->baseAddress->TC_REFA; + tmpA.BIT.rg_cnt_refa = cntCmpSOCA; + aptHandle->baseAddress->TC_REFA = tmpA; + tmpB = aptHandle->baseAddress->TC_REFB; + tmpB.BIT.rg_cnt_refb = cntCmpSOCB; + aptHandle->baseAddress->TC_REFB = tmpB; + return BASE_STATUS_OK; +} + +/** + * @brief set outputs of channelA when use APT_PWM_BASIC_A_HIGH_B_HIGH. + * @param aptHandle APT module handle. + * @param aptAction output action type. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType APT_SetActionChannelA(APT_Handle *aptHandle, APT_PWMChannelOutType aptAction) +{ + switch (aptAction) { + case APT_PWM_OUT_BASIC_TYPE: + aptHandle->baseAddress->PG_OUT_FRC.BIT.rg_pga_frc_en = BASE_CFG_UNSET; /* disable force action */ + break; + case APT_PWM_OUT_ALWAYS_LOW: + aptHandle->baseAddress->PG_OUT_FRC.BIT.rg_pga_frc_act = APT_PWM_OUT_ALWAYS_LOW; /* force output low */ + aptHandle->baseAddress->PG_OUT_FRC.BIT.rg_pga_frc_en = BASE_CFG_SET; + break; + case APT_PWM_OUT_ALWAYS_HIGH: + aptHandle->baseAddress->PG_OUT_FRC.BIT.rg_pga_frc_act = APT_PWM_OUT_ALWAYS_HIGH; /* force output high */ + aptHandle->baseAddress->PG_OUT_FRC.BIT.rg_pga_frc_en = BASE_CFG_SET; + break; + default: + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief set outputs of channelB when use APT_PWM_BASIC_A_HIGH_B_HIGH. + * @param aptHandle APT module handle. + * @param aptAction output action type. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType APT_SetActionChannelB(APT_Handle *aptHandle, APT_PWMChannelOutType aptAction) +{ + switch (aptAction) { + case APT_PWM_OUT_BASIC_TYPE: + aptHandle->baseAddress->PG_OUT_FRC.BIT.rg_pgb_frc_en = BASE_CFG_UNSET; /* disable force action */ + break; + case APT_PWM_OUT_ALWAYS_LOW: + aptHandle->baseAddress->PG_OUT_FRC.BIT.rg_pgb_frc_act = APT_PWM_OUT_ALWAYS_LOW; /* force output low */ + aptHandle->baseAddress->PG_OUT_FRC.BIT.rg_pgb_frc_en = BASE_CFG_SET; + break; + case APT_PWM_OUT_ALWAYS_HIGH: + aptHandle->baseAddress->PG_OUT_FRC.BIT.rg_pgb_frc_act = APT_PWM_OUT_ALWAYS_HIGH; /* force output high */ + aptHandle->baseAddress->PG_OUT_FRC.BIT.rg_pgb_frc_en = BASE_CFG_SET; + break; + default: + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief Change outputs of channelA and channelB when use APT_PWM_BASIC_A_HIGH_B_HIGH. + * @param aptHandle APT module handle. + * @param channel channel number. + * @param aptAction output action type. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_APT_ChangeOutputType(APT_Handle *aptHandle, APT_PWMChannel channel, APT_PWMChannelOutType aptAction) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(aptHandle->baseAddress != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + APT_PARAM_CHECK_WITH_RET(channel >= APT_PWM_CHANNEL_A, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(channel <= APT_PWM_CHANNEL_B, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(aptAction >= APT_PWM_OUT_BASIC_TYPE, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(aptAction <= APT_PWM_OUT_ALWAYS_HIGH, BASE_STATUS_ERROR); + /* only use in APT_PWM_BASIC_A_HIGH_B_HIGH mode */ + if (aptHandle->waveform.basicType != APT_PWM_BASIC_A_HIGH_B_HIGH) { + return BASE_STATUS_ERROR; + } + if (channel == APT_PWM_CHANNEL_A) { + return APT_SetActionChannelA(aptHandle, aptAction); /* set channnelA's action */ + } else if (channel == APT_PWM_CHANNEL_B) { + return APT_SetActionChannelB(aptHandle, aptAction); /* set channelB's action */ + } else { + return BASE_STATUS_ERROR; /* error channnel number */ + } +} + +/** + * @brief APT event interrupt service processing function. + * @param handle APT module handle. + * @retval None. + */ +void HAL_APT_EventIrqHandler(void *handle) +{ + APT_ASSERT_PARAM(handle != NULL); + APT_Handle *aptHandle = (APT_Handle *)handle; + /* Continuous protection cannot clear the event flag. Clear the event flag by users. */ + if (aptHandle->baseAddress->OC_MODE.BIT.rg_oc_mode_evta1 == 0x1) { /* Protection by period. */ + /* Interrupt of the periodic protection clear event. */ + aptHandle->baseAddress->OC_EVT_FLAG.reg |= ALL_EVT_INT_FLAGS; + } + aptHandle->baseAddress->OC_EVT_FLAG.BIT.rg_int_clr_evt = 1; /* clear event flag */ + if (aptHandle->userCallBack.EvtInterruptCallBack != NULL) { + aptHandle->userCallBack.EvtInterruptCallBack(aptHandle); + } +} + +/** + * @brief APT timer interrupt service processing function. + * @param handle APT module handle. + * @retval None. + */ +void HAL_APT_TimerIrqHandler(void *handle) +{ + APT_ASSERT_PARAM(handle != NULL); + APT_Handle *aptHandle = (APT_Handle *)handle; + aptHandle->baseAddress->INT_TMR_FLAG.BIT.rg_int_clr_tmr = 1; /* clear timer interrupt flag */ + if (aptHandle->userCallBack.TmrInterruptCallBack != NULL) { + aptHandle->userCallBack.TmrInterruptCallBack(aptHandle); + } +} + +/** + * @brief Interrupt callback functions registration interface. + * @param aptHandle APT module handle. + * @param typeID ID of callback function type. + * @param pCallback Pointer for the user callback function. + * @retval None. + */ +void HAL_APT_RegisterCallBack(APT_Handle *aptHandle, APT_InterruputType typeID, APT_CallbackType pCallback) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + switch (typeID) { + case APT_TIMER_INTERRUPT: + aptHandle->userCallBack.TmrInterruptCallBack = pCallback; /* register timer interrupt callback */ + break; + case APT_EVENT_INTERRUPT: + aptHandle->userCallBack.EvtInterruptCallBack = pCallback; /* register event interrupt callback */ + break; + default: + break; + } +} + +/** + * @brief Set window's offset and width of Event management. + * @param aptHandle APT module handle. + * @param offset Window's offset. + * @param width Window's width. + * @note Not support this function in this version. Empty Function. + * @retval None. + */ +void HAL_APT_EMSetWdOffsetAndWidth(APT_Handle *aptHandle, unsigned short offset, unsigned short width) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + BASE_FUNC_UNUSED(aptHandle); /* Not support this function */ + BASE_FUNC_UNUSED(offset); + BASE_FUNC_UNUSED(width); + return; +} + +/** + * @brief Attribute configuration of the reference point. + * @param aptHandle APT module handle. + * @param refDotParameters Attribute structure of a reference point. + * @retval BASE_StatusType: OK, ERROR. + */ +static BASE_StatusType APT_ConfigAction(APT_Handle *aptHandle, APT_RefDotParameters *refDotParameters) +{ + /* Action configuration of the reference point of channel B. */ + if (refDotParameters->pwmChannel == APT_PWM_CHANNEL_B) { + aptHandle->baseAddress->PG_ACT_B.reg &= (~(0b11 << refDotParameters->actionEvent)); /* Reset configuration */ + aptHandle->baseAddress->PG_ACT_B.reg |= (refDotParameters->action << refDotParameters->actionEvent); + return BASE_STATUS_OK; + } + /* Action configuration of the reference point of channel A. */ + if (refDotParameters->pwmChannel == APT_PWM_CHANNEL_A) { + aptHandle->baseAddress->PG_ACT_A.reg &= (~(0b11 << refDotParameters->actionEvent)); /* Reset configuration */ + aptHandle->baseAddress->PG_ACT_A.reg |= (refDotParameters->action << refDotParameters->actionEvent); + return BASE_STATUS_OK; + } + return BASE_STATUS_ERROR; +} + +/** + * @brief Configure the value and action of the reference point A. + * @param aptHandle APT module handle. + * @param refDotParameters Reference point A configuration property set. + * @retval BASE_StatusType: OK, ERROR. + */ +BASE_StatusType APT_ConfigRefA(APT_Handle *aptHandle, APT_RefDotParameters *refDotParameters) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(aptHandle->baseAddress != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + /* Check the attributes of the reference point A: PWM Channel. */ + APT_PARAM_CHECK_WITH_RET(refDotParameters->pwmChannel >= APT_PWM_CHANNEL_A, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(refDotParameters->pwmChannel <= APT_PWM_CHANNEL_B, BASE_STATUS_ERROR); + /* Check the attributes of the reference point A: triggle action event. */ + APT_PARAM_CHECK_WITH_RET(refDotParameters->actionEvent >= APT_PWM_ACTION_ON_TIMEBASE_ZERO, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(refDotParameters->actionEvent <= APT_PWM_ACTION_ON_C2_COUNT_DOWN, BASE_STATUS_ERROR); + /* Check the attributes of the reference point A: triggle action. */ + APT_PARAM_CHECK_WITH_RET(refDotParameters->action <= APT_PWM_ACTION_TOGGLE, BASE_STATUS_ERROR); + /* Change reference dot A value and division value. */ + aptHandle->baseAddress->TC_REFA.BIT.rg_cnt_refa = refDotParameters->refDotValue; + /* Reference dot A triggle event and action */ + return APT_ConfigAction(aptHandle, refDotParameters); +} + +/** + * @brief Configure the value and action of the reference point B. + * @param aptHandle APT module handle. + * @param refDotParameters Reference point B configuration property set. + * @retval BASE_StatusType: OK, ERROR. + */ +BASE_StatusType APT_ConfigRefB(APT_Handle *aptHandle, APT_RefDotParameters *refDotParameters) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(aptHandle->baseAddress != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + /* Check the attributes of the reference point B: PWM Channel. */ + APT_PARAM_CHECK_WITH_RET(refDotParameters->pwmChannel >= APT_PWM_CHANNEL_A, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(refDotParameters->pwmChannel <= APT_PWM_CHANNEL_B, BASE_STATUS_ERROR); + /* Check the attributes of the reference point B: triggle action event. */ + APT_PARAM_CHECK_WITH_RET(refDotParameters->actionEvent >= APT_PWM_ACTION_ON_TIMEBASE_ZERO, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(refDotParameters->actionEvent <= APT_PWM_ACTION_ON_C2_COUNT_DOWN, BASE_STATUS_ERROR); + /* Check the attributes of the reference point B: triggle action. */ + APT_PARAM_CHECK_WITH_RET(refDotParameters->action <= APT_PWM_ACTION_TOGGLE, BASE_STATUS_ERROR); + /* Change reference dot B value and division value. */ + aptHandle->baseAddress->TC_REFB.BIT.rg_cnt_refb = refDotParameters->refDotValue; + /* Reference dot B triggle event and action. */ + return APT_ConfigAction(aptHandle, refDotParameters); +} + +/** + * @brief Configure the value and action of the reference point C. + * @param aptHandle APT module handle. + * @param refDotParameters Reference point C configuration property set. + * @retval BASE_StatusType: OK, ERROR. + */ +BASE_StatusType APT_ConfigRefC(APT_Handle *aptHandle, APT_RefDotParameters *refDotParameters) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(aptHandle->baseAddress != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + /* Check the attributes of the reference point C: PWM Channel. */ + APT_PARAM_CHECK_WITH_RET(refDotParameters->pwmChannel >= APT_PWM_CHANNEL_A, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(refDotParameters->pwmChannel <= APT_PWM_CHANNEL_B, BASE_STATUS_ERROR); + /* Check the attributes of the reference point C: triggle action event. */ + APT_PARAM_CHECK_WITH_RET(refDotParameters->actionEvent >= APT_PWM_ACTION_ON_TIMEBASE_ZERO, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(refDotParameters->actionEvent <= APT_PWM_ACTION_ON_C2_COUNT_DOWN, BASE_STATUS_ERROR); + /* Check the attributes of the reference point C: triggle action. */ + APT_PARAM_CHECK_WITH_RET(refDotParameters->action <= APT_PWM_ACTION_TOGGLE, BASE_STATUS_ERROR); + /* Change reference dot C value and division value. */ + aptHandle->baseAddress->TC_REFC.BIT.rg_cnt_refc = refDotParameters->refDotValue; + /* Reference dot C triggle event and action. */ + return APT_ConfigAction(aptHandle, refDotParameters); +} + +/** + * @brief Configure the value and action of the reference point D. + * @param aptHandle APT module handle. + * @param refDotParameters Reference point D configuration property set. + * @retval BASE_StatusType: OK, ERROR. + */ +BASE_StatusType APT_ConfigRefD(APT_Handle *aptHandle, APT_RefDotParameters *refDotParameters) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(aptHandle->baseAddress != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + /* Check the attributes of the reference point D: PWM Channel. */ + APT_PARAM_CHECK_WITH_RET(refDotParameters->pwmChannel >= APT_PWM_CHANNEL_A, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(refDotParameters->pwmChannel <= APT_PWM_CHANNEL_B, BASE_STATUS_ERROR); + /* Check the attributes of the reference point D: triggle action event. */ + APT_PARAM_CHECK_WITH_RET(refDotParameters->actionEvent >= APT_PWM_ACTION_ON_TIMEBASE_ZERO, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(refDotParameters->actionEvent <= APT_PWM_ACTION_ON_C2_COUNT_DOWN, BASE_STATUS_ERROR); + /* Check the attributes of the reference point D: triggle action. */ + APT_PARAM_CHECK_WITH_RET(refDotParameters->action <= APT_PWM_ACTION_TOGGLE, BASE_STATUS_ERROR); + /* Change reference dot D value and division value. */ + aptHandle->baseAddress->TC_REFD.BIT.rg_cnt_refd = refDotParameters->refDotValue; + /* Reference dot D triggle event and action. */ + return APT_ConfigAction(aptHandle, refDotParameters); +} + + +/** + * @brief Attribute configuration of any reference point. + * @param aptHandle APT module handle. + * @param refDotSelect Selection of reference points. + * @param refDotParameters The properties of the reference point. + * @retval BASE_StatusType: OK, ERROR. + */ +BASE_StatusType HAL_APT_ConfigRefDot(APT_Handle *aptHandle, APT_RefDotSelect refDotSelect, + APT_RefDotParameters *refDotParameters) +{ + APT_ASSERT_PARAM(aptHandle != NULL); + APT_ASSERT_PARAM(aptHandle->baseAddress != NULL); + APT_ASSERT_PARAM(IsAPTInstance(aptHandle->baseAddress)); + /* Reference point configuration, which must be point A, point B, point C, and point D. */ + APT_PARAM_CHECK_WITH_RET(refDotSelect >= APT_REFERENCE_DOTA, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(refDotSelect <= APT_REFERENCE_DOTD, BASE_STATUS_ERROR); + /* Channels A and B are optional. */ + APT_PARAM_CHECK_WITH_RET(refDotParameters->pwmChannel >= APT_PWM_CHANNEL_A, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(refDotParameters->pwmChannel <= APT_PWM_CHANNEL_B, BASE_STATUS_ERROR); + /* Trigger event type check. */ + APT_PARAM_CHECK_WITH_RET(refDotParameters->actionEvent >= APT_PWM_ACTION_ON_TIMEBASE_ZERO, BASE_STATUS_ERROR); + APT_PARAM_CHECK_WITH_RET(refDotParameters->actionEvent <= APT_PWM_ACTION_ON_C2_COUNT_DOWN, BASE_STATUS_ERROR); + /* There are four types of trigger actions. */ + APT_PARAM_CHECK_WITH_RET(refDotParameters->action <= APT_PWM_ACTION_TOGGLE, BASE_STATUS_ERROR); + /* Transfer table for setting reference dot. */ + BASE_StatusType (* APT_RefDotConfigTable[RERF])(APT_Handle *, APT_RefDotParameters *) = {APT_ConfigRefA, + APT_ConfigRefB, + APT_ConfigRefC, + APT_ConfigRefD}; + return APT_RefDotConfigTable[refDotSelect](aptHandle, refDotParameters); /* Configure reference point. */ +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/base/common/inc/baseinc.h b/vendor/others/demo/5-tim_adc/demo/drivers/base/common/inc/baseinc.h new file mode 100644 index 000000000..2f9c37a89 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/base/common/inc/baseinc.h @@ -0,0 +1,39 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file baseinc.h + * @author MCU Driver Team + * @brief BASE module driver + * @details Contains BASE-related header files. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_BASEINC_H +#define McuMagicTag_BASEINC_H + +/* Includes ------------------------------------------------------------------ */ +#include "chipinc.h" +#include "typedefs.h" +#include "assert.h" +#include "clock.h" +#include "lock.h" +#include "generalfunc.h" +#include "base_math.h" +#include "reset.h" +#include "interrupt.h" + +#endif /* McuMagicTag_BASEINC_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/assert.h b/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/assert.h new file mode 100644 index 000000000..4d17a1c80 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/assert.h @@ -0,0 +1,96 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file assert.h + * @author MCU Driver Team + * @brief BASE module driver + * @details This file provides functions declaration of the assert, + * + BASE_FUNC_PARAMCHECK_NO_RET macro function definition. + * + BASE_FUNC_PARAMCHECK_WITH_RET macro function definition. + * + BASE_FUNC_ASSERT_PARAM macro function definition. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_ASSERT_H +#define McuMagicTag_ASSERT_H + +/* Includes ------------------------------------------------------------------ */ +#include "chipinc.h" +#include "typedefs.h" +/** + * @defgroup BASE BASE + * @brief BASE module. + * @{ + */ + +void AssertErrorLog(char *file, unsigned int line); + +/** + * @defgroup ASSERT Assert Definition + * @brief Definition of different assert. + * @{ + */ + +/** + * @defgroup ASSERT_Macro ASSERT Macro Function Definition + * @{ + */ +/* Macro definitions --------------------------------------------------------- */ +#if (BASE_DEFINE_USE_ASSERT == BASE_CFG_ENABLE) +#define BASE_FUNC_PARAMCHECK_NO_RET(param) \ + do { \ + if (!(param)) { \ + AssertErrorLog(__FILE__, __LINE__); \ + return; \ + } \ + } while (0) + +#define BASE_FUNC_PARAMCHECK_WITH_RET(param, ret) \ + do { \ + if (!(param)) { \ + AssertErrorLog(__FILE__, __LINE__); \ + return ret; \ + } \ + } while (0) + +#define BASE_FUNC_ASSERT_PARAM(param) \ + do { \ + if (!(param)) { \ + AssertErrorLog(__FILE__, __LINE__); \ + while (1) { \ + }; \ + } \ + } while (0) + +#else +#define BASE_FUNC_ASSERT_PARAM(param) ((void)0U) +#define BASE_FUNC_PARAMCHECK_NO_RET(param) ((void)0U) +#define BASE_FUNC_PARAMCHECK_WITH_RET(param, ret) ((void)0U) + +#endif /* BASE_DEFINE_USE_ASSERT */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_ASSERT_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/base_math.h b/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/base_math.h new file mode 100644 index 000000000..defe9cb00 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/base_math.h @@ -0,0 +1,116 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file base_math.h + * @author MCU Driver Team + * @brief BASE module driver + * @details This file provides functions declaration of math + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_BASE_MATH_H +#define McuMagicTag_BASE_MATH_H + +/* Includes ------------------------------------------------------------------ */ +#include "chipinc.h" +#include "typedefs.h" +#include "assert.h" + +/** + * @defgroup BASE BASE + * @brief BASE module. + * @{ + */ + +/** + * @defgroup MATH Math Definition + * @brief Definition of MATH Definition. + * @{ + */ + +/** + * @defgroup MATH_STRUCTURE_DEFINITION math structure Definition + * @brief Definition of math structure Definition. + * @{ + */ +/* Typedef definitions ------------------------------------------------------- */ +/** + * @brief sin, cos status definition. + */ +typedef struct { + int sin : 16; + int cos : 16; +} BASE_MathTypeSinCos; + +/** + * @brief q-axis d-axis status definition. + */ +typedef struct { + int q : 16; + int d : 16; +} BASE_MathTypeQD; + +/** + * @brief current component a,b status definition. + */ +typedef struct { + int a : 16; + int b : 16; +} BASE_MathTypeAB; + +/** + * @brief alpha-axis beta-axis status definition. + */ +typedef struct { + int alpha : 16; + int beta : 16; +} BASE_MathTypeAlphaBeta; +/** + * @} + */ +/** + * @defgroup MATH_API_DEFINITION Math API + * @brief Definition of math API Definition. + * @{ + */ +/* Macro definitions --------------------------------------------------------- */ +#define BASE_MATH_ABS(x) ((x) < 0 ? -(x) : (x)) + +/* Radian to angle. */ +#define BASE_MATH_RADIAN_TO_ANGLE(radian) ((radian) * 57.295779524) + +/* Exported global functions ------------------------------------------------- */ +BASE_MathTypeSinCos BASE_MATH_GetSinCos(short angle); +float BASE_MATH_GetSin(float angle); +float BASE_MATH_GetCos(float angle); +float BASE_MATH_Sqrt(const float x); +float BASE_MATH_Pow(float x, int n); +BASE_MathTypeAlphaBeta BASE_MATH_Clarke(BASE_MathTypeAB input); +BASE_MathTypeQD BASE_MATH_Park(BASE_MathTypeAlphaBeta input, short theta); +BASE_MathTypeAlphaBeta BASE_MATH_RevPark(BASE_MathTypeQD input, short theta); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_BASE_MATH_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/clock.h b/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/clock.h new file mode 100644 index 000000000..0f5df18e3 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/clock.h @@ -0,0 +1,105 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file clock.h + * @author MCU Driver Team + * @brief BASE module driver + * @brief Include the header file of the clock.c file. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_CLOCK_H +#define McuMagicTag_CLOCK_H + +/* Includes ------------------------------------------------------------------ */ +#include "chipinc.h" +#include "typedefs.h" + +/** + * @defgroup BASE BASE + * @brief BASE module. + * @{ + */ + +/** + * @defgroup CLOCK Clock Definition + * @brief Definition of Clock Definition. + * @{ + */ + +/** + * @defgroup CLOCK_ENUM_DEFINITION Delay Enum Definition + * @brief Definition of BASE_DelayUnit enum + * @{ + */ + +/* Typedef definitions ------------------------------------------------------- */ +/** + * @brief Multiples of the parameters of the delay function based on microseconds in different time units. + * @details BASE_DelayUnit: + * + BASE_DEFINE_DELAY_SECS -- Needed delay amount is in seconds + * + BASE_DEFINE_DELAY_MILLISECS -- Needed delay amount is in milliseconds + * + BASE_DEFINE_DELAY_MICROSECS -- Needed delay amount is in microseconds + */ +typedef enum { + BASE_DEFINE_DELAY_SECS = 1, + BASE_DEFINE_DELAY_MILLISECS = 1000, + BASE_DEFINE_DELAY_MICROSECS = 1000000 +} BASE_DelayUnit; +/** + * @} + */ + +/** + * @defgroup CLOCK_MACRO_DEFINITION Delay Macro Function Definition + * @brief Definition of BASE_DelayUnit macro. + * @{ + */ +/* Macro definitions --------------------------------------------------------- */ +#define BASE_DEFINE_DELAY_MS_IN_SEC 1000 +#define BASE_DEFINE_DELAY_US_IN_MS 1000 + +#define BASE_FUNC_DELAY_S(n) BASE_FUNC_Delay(n, BASE_DEFINE_DELAY_SECS) +#define BASE_FUNC_DELAY_MS(n) BASE_FUNC_Delay(n, BASE_DEFINE_DELAY_MILLISECS) +#define BASE_FUNC_DELAY_US(n) BASE_FUNC_Delay(n, BASE_DEFINE_DELAY_MICROSECS) +/** + * @} + */ + +/** + * @defgroup CLOCK_API_DEFINITION Clock Delay API + * @brief Definition of clcok API. + * @{ + */ +/* Exported global functions ------------------------------------------------------------------ */ +unsigned int BASE_FUNC_GetCpuFreqHz(void); +void BASE_FUNC_Delay(unsigned int delay, BASE_DelayUnit units); +void BASE_FUNC_DelayUs(unsigned int us); +void BASE_FUNC_DelayMs(unsigned int ms); +void BASE_FUNC_DelaySeconds(unsigned int seconds); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_CLOCK_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/generalfunc.h b/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/generalfunc.h new file mode 100644 index 000000000..06ef81bbb --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/generalfunc.h @@ -0,0 +1,109 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file generalfunc.h + * @author MCU Driver Team + * @brief BASE module driver + * @details This file provides functions declaration of the basic function + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_GENERAL_FUNC_H +#define McuMagicTag_GENERAL_FUNC_H + +/* Includes ------------------------------------------------------------------ */ +#include "chipinc.h" +#include "typedefs.h" +#include "assert.h" +#include "clock.h" + +/** + * @defgroup BASE BASE + * @brief BASE module. + * @{ + */ + +/** + * @defgroup GeneralFunc GeneralFunc Definition + * @brief Definition of GeneralFunc function. + * @{ + */ + +/* Typedef definitions ------------------------------------------------------- */ +/** + * @defgroup BASIC_Structure_Definition BASE_AverageHandle Definition + * @{ + */ + +/** + * @brief Structure for configuring and controlling averaging + */ +typedef struct { + unsigned int cnt; /**< Used to record the divisor of the average */ + float *buf; /**< Buffer pointer */ + unsigned int size; /**< Buffer size */ + unsigned int at; /**< Index value of the currently inserted value */ + unsigned int calNum; /**< Total number to be averaged */ + float total; /**< Current Cumulative Sum */ +} BASE_AverageHandle; +/** + * @} + */ + +/** + * @defgroup BASIC_Structure_Definition BASE_FSM_Handle Definition + * @{ + */ +typedef BASE_FSM_Status (*FunType)(void); +/** + * @brief General state machine handle + */ +typedef struct { + FunType funList[BASE_DEFINE_FSM_END + 1]; /**< function list */ + BASE_FSM_Status nextFun; /**< next function status */ +} BASE_FSM_Handle; +/** + * @} + */ + +/** + * @defgroup GENERAL_API_Definition GENERAL_API + * @{ + */ +/* Exported global functions ------------------------------------------------- */ +unsigned int BASE_FUNC_GetTick(void); +unsigned int BASE_FUNC_FindArrayValue(const unsigned short *nums, unsigned int leng, unsigned int value); +unsigned char BASE_FUNC_CalcSumByte(const unsigned char *pt, unsigned int len); +unsigned short BASE_FUNC_CalcSumShort(unsigned char const * pt, unsigned int len); +BASE_StatusType BASE_FUNC_AverageInit(unsigned int index, float *buf, unsigned int size, unsigned int calNum); +float BASE_FUNC_GetSlipAverageVal(unsigned int index, float val); +void BASE_FUNC_AverageDeInit(unsigned int index); +void BASE_FSM_FunRegister(BASE_FSM_Status index, FunType funAddress); +void BASE_FSM_Run(unsigned int delayTime, BASE_DelayUnit delayUnit); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_GENERAL_FUNC_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/interrupt.h b/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/interrupt.h new file mode 100644 index 000000000..1fa09615b --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/interrupt.h @@ -0,0 +1,318 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file interrupt.h + * @author MCU Driver Team + * @brief BASE module driver + * @brief Header file containing functions prototypes of Interrupt HAL library. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_INTERRUPT_H +#define McuMagicTag_INTERRUPT_H + +/* Includes ------------------------------------------------------------------*/ +#include "feature.h" +#include "interrupt_ip.h" + +/* Macro definitions ---------------------------------------------------------*/ +#define INTERRUPT_USE_ASSERT +#ifdef INTERRUPT_USE_ASSERT +#define INTERRUPT_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define INTERRUPT_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define INTERRUPT_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define INTERRUPT_ASSERT_PARAM(para) ((void)0U) +#define INTERRUPT_PARAM_CHECK_NO_RET ((void)0U) +#define INTERRUPT_PARAM_CHECK_WITH_RET ((void)0U) +#endif +/** + * @defgroup BASE BASE + * @brief BASE module. + * @{ + */ + +/** + * @defgroup INTERRUPT Interrupt Definition + * @brief Definition of Interrupt Definition. + * @{ + */ + +/** + * @defgroup INTERRUPT_MACRO Macro Definition + * @brief Definition of Interrupt Definition. + * @{ + */ + +/** + * @brief IRQ module error code + */ +#define IRQ_ERRNO_PROC_FUNC_NULL 1 /**< Non-interrupted callback function */ +#define IRQ_ERRNO_NUM_INVALID 2 /**< Interrupt Number invalid */ +#define IRQ_ERRNO_ALREADY_CREATED 3 /**< Interrupt function is created */ +#define IRQ_ERRNO_NOT_CREATED 4 /**< Interrupt function not create */ +#define IRQ_ERRNO_PRIORITY_INVALID 5 /**< Invalid priority */ + +#define RISCV_U_MODE 0x8 /**< The Value in mcause for umode */ +#define RISCV_M_MODE 0xB /**< The Value in mcause for mmode */ +/** + * @} + */ + +/** + * @defgroup ASM Interrupt ASM Function Definition + * @brief Definition of Interrupt ASM Function Definition. + * @{ + */ + +/** + * @brief Read standard csr registers + */ +#define READ_CSR(csrReg) ({ \ + unsigned int tmp_; \ + asm volatile ("csrr %0, " #csrReg : "=r"(tmp_)); \ + tmp_; \ +}) + + +/** + * @brief Write standard csr registers + */ +#define WRITE_CSR(csrReg, csrVal) do { \ + if (__builtin_constant_p(csrVal) && ((unsigned int)(csrVal) < 32)) { \ + asm volatile ("csrw " #csrReg ", %0" :: "i"(csrVal)); \ + } else { \ + asm volatile ("csrw " #csrReg ", %0" :: "r"(csrVal)); \ + } \ +} while (0) + +/** + * @brief Set standard csr registers + */ +#define SET_CSR(csrReg, csrBit) do { \ + unsigned int tmp_; \ + if (__builtin_constant_p(csrBit) && ((unsigned int)(csrBit) < 32)) { \ + asm volatile ("csrrs %0, " #csrReg ", %1" : "=r"(tmp_) : "i"(csrBit)); \ + } else { \ + asm volatile ("csrrs %0, " #csrReg ", %1" : "=r"(tmp_): "r"(csrBit)); \ + } \ + (void)tmp_; \ +} while (0) + +/** + * @brief Clear standard csr registers + */ +#define CLEAR_CSR(csrReg, csrBit) do { \ + unsigned int tmp_; \ + if (__builtin_constant_p(csrBit) && ((unsigned int)(csrBit) < 32)) { \ + asm volatile ("csrrc %0, " #csrReg ", %1" : "=r"(tmp_) : "i"(csrBit)); \ + } else { \ + asm volatile ("csrrc %0, " #csrReg ", %1" : "=r"(tmp_) : "r"(csrBit)); \ + } \ + (void)tmp_; \ +} while (0) + +/** + * @brief Read the custom defined registers of the chip + */ +#define READ_CUSTOM_CSR(csrReg) ({ \ + unsigned int tmp_; \ + asm volatile ("csrr %0, %1" : "=r"(tmp_) : "i"(csrReg)); \ + tmp_; \ +}) + +/** + * @brief Write the custom defined registers of the chip + */ +#define WRITE_CUSTOM_CSR_VAL(csrRegAddr, csrVal) do { \ + if (__builtin_constant_p(csrVal)) { \ + asm volatile("li t0," "%0" : : "i"(csrVal)); \ + } else { \ + asm volatile("mv t0," "%0" : : "r"(csrVal)); \ + } \ + asm volatile("csrw %0, t0" :: "i"(csrRegAddr)); \ +} while (0) + +/** + * @brief Set the custom defined registers of the chip + */ +#define SET_CUSTOM_CSR(csrRegAddr, csrBit) do { \ + if (__builtin_constant_p(csrBit) && ((unsigned int)(csrBit) < 32)) { \ + asm volatile("li t0," "%0" : : "i"(csrBit)); \ + } else { \ + asm volatile("mv t0," "%0" : : "r"(csrBit)); \ + } \ + asm volatile("csrs %0, t0" :: "i"(csrRegAddr)); \ +} while (0) + +/** + * @brief Clear the custom defined registers of the chip + */ +#define CLEAR_CUSTOM_CSR(csrRegAddr, csrBit) do { \ + if (__builtin_constant_p(csrBit) && ((unsigned int)(csrBit) < 32)) { \ + asm volatile("li t0," "%0" : : "i"(csrBit)); \ + } else { \ + asm volatile("mv t0," "%0" : : "r"(csrBit)); \ + } \ + asm volatile("csrc %0, t0" :: "i"(csrRegAddr)); \ +} while (0) + +/* Configure the locipri register, that is, configure the interrupt priority */ +/** + * @brief Get the local interrupt register number. + */ +#define GET_LOCAL_INTER_CONFIGREG_NUM(interIndex) ((unsigned int)(interIndex) >> 3) + +/** + * @brief Set local interrupt registers priority. + */ +#define SET_LOCAL_INTER_NUM_PRI(configNum, priNum, pri) do { \ + unsigned int interPriVal = READ_CUSTOM_CSR(LOCIPRI(configNum)); \ + /* clear the irqNum-th local interrupt priority */ \ + interPriVal &= (~((0xfU << (((unsigned int)(priNum) & 0x7U) << 2)) & UINT32_CUT_MASK)); \ + /* set the irqNum-th local interrupt priority */ \ + interPriVal |= ((unsigned int)(pri) << (((unsigned int)(priNum) & 0x7U) << 2)); \ + WRITE_CUSTOM_CSR_VAL(LOCIPRI(configNum), interPriVal); \ +} while (0) + +/** + * @brief Get local interrupt registers priority. + */ +#define GET_LOCAL_INTER_NUM_PRI(configNum, priNum, pri) do { \ + (pri) = READ_CUSTOM_CSR(LOCIPRI(configNum)); \ + /* Get the irqNum-th local interrupt priority */ \ + (pri) >>= (((unsigned int)(priNum) & 0x7U) << 2); \ + (pri) &= 0x7U; \ +} while (0) + +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) +/** + * @brief Riscv mode switch in user mode + */ +#define RISCV_PRIV_MODE_SWITCH(priv) do { \ + if ((priv) == RISCV_U_MODE) { \ + asm volatile ("ecall"); \ + } \ +} while (0) +#else +#define RISCV_PRIV_MODE_SWITCH(priv) (void)(0) +#endif +/** + * @} + */ + +/** + * @brief Clear external interrupt + * @param irqNum external interrupt number + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_NOT_CREATED + */ +static inline void IRQ_ClearN(unsigned int irqNum) +{ + asm volatile("fence"); + WRITE_CUSTOM_CSR_VAL(LOCIPCLR, irqNum); +} +/** + * @defgroup INTERRUPT_STRUCTURE_DEFINITION Interrupt Structure Definition + * @brief Definition of interrupt STRUCTURE. + * @{ + */ +typedef void (* IRQ_PROC_FUNC)(void *arg); + +/** + * @brief Interrupt Handle Structure + */ +typedef struct { + IRQ_PROC_FUNC pfnHandler; + void *param; +} IRQ_ARG_FUNC; + +/** + * @brief System error context Structure + */ +typedef struct { + unsigned int ra; + unsigned int t0; + unsigned int t1; + unsigned int t2; + unsigned int a0; + unsigned int a1; + unsigned int a2; + unsigned int a3; + unsigned int a4; + unsigned int a5; + unsigned int a6; + unsigned int a7; + unsigned int t3; + unsigned int t4; + unsigned int t5; + unsigned int t6; + unsigned int s0; + unsigned int s1; + unsigned int s2; + unsigned int s3; + unsigned int s4; + unsigned int s5; + unsigned int s6; + unsigned int s7; + unsigned int s8; + unsigned int s9; + unsigned int s10; + unsigned int s11; + unsigned int sp; + unsigned int gp; + unsigned int tp; + unsigned int mepc; + unsigned int mstatus; + unsigned int mtval; + unsigned int mcause; + unsigned int ccause; +} SyserrContext; +/** + * @} + */ + +/** + * @defgroup INTERRUPT_API_DEFINITION Interrupt API + * @brief Definition of interrupt API. + * @{ + */ +unsigned int IRQ_SetPriority(unsigned int irqNum, unsigned int priority); +unsigned int IRQ_GetPriority(unsigned int irqNum, unsigned int *priority); +void IRQ_Enable(void); +void IRQ_Disable(void); +unsigned int IRQ_EnableN(unsigned int irqNum); +unsigned int IRQ_DisableN(unsigned int irqNum); +void IRQ_Init(void); +unsigned int IRQ_Register(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg); +unsigned int IRQ_Unregister(unsigned int irqNum); +unsigned int IRQ_ClearAll(void); +void SysErrNmiEntry(const SyserrContext *context); +void SysErrExcEntry(const SyserrContext *context); +void InterruptEntry(unsigned int irqNum); +void SysErrPrint(const SyserrContext *context); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_INTERRUPT_H */ diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/lock.h b/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/lock.h new file mode 100644 index 000000000..451ca83fd --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/lock.h @@ -0,0 +1,83 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file lock.h + * @author MCU Driver Team + * @brief BASE module driver + * @details This file provides functions declaration of lock + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_LOCK_H +#define McuMagicTag_LOCK_H + +/* Includes ------------------------------------------------------------------ */ +#include "chipinc.h" +#include "typedefs.h" +#include "assert.h" + +/** + * @defgroup BASE BASE + * @brief BASE module. + * @{ + */ + +/** + * @defgroup LOCK Lock Definition + * @brief Definition of LOCK Definition. + * @{ + */ + +/** + * @defgroup LOCK_ENUM_DEFINITION BASE_LockStatus Definition + * @brief Definition of LOCK Definition. + * @{ + */ +/* Typedef definitions ------------------------------------------------------- */ +/** + * @brief Lock status definition + */ +typedef enum { + BASE_STATUS_UNLOCKED = 0, + BASE_STATUS_LOCKED = 1 +} BASE_LockStatus; +/** + * @} + */ + +/** + * @defgroup LOCK_API_DEFINITION Lock API + * @brief Definition of lock API Definition. + * @{ + */ +/* Exported global functions ------------------------------------------------- */ +bool BASE_FUNC_SoftwareLock(unsigned int * const addr); +void BASE_FUNC_SoftwareUnLock(unsigned int * const addr); +bool BASE_FUNC_HardwareLock(CHIP_LockType const hwIndex); +void BASE_FUNC_HardwareUnLock(CHIP_LockType const hwIndex); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_LOCK_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/reset.h b/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/reset.h new file mode 100644 index 000000000..ffc144081 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/reset.h @@ -0,0 +1,60 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file reset.h + * @author MCU Driver Team + * @brief BASE module driver + * @details This file provides functions declaration of reset + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_RESET_H +#define McuMagicTag_RESET_H + +/* Includes ------------------------------------------------------------------ */ +#include "chipinc.h" +/** + * @defgroup BASE BASE + * @brief BASE module. + * @{ + */ + +/** + * @defgroup RESET Reset Definition + * @brief Definition of RESET Definition. + * @{ + */ + +/** + * @defgroup RESET_API_DEFINITION RESET API Definition + * @brief Definition of RESET API Definition. + * @{ + */ +/* Exported global functions ------------------------------------------------- */ +void BASE_FUNC_SoftReset(void); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_RESET_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/typedefs.h b/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/typedefs.h new file mode 100644 index 000000000..2af04be5a --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/base/inc/typedefs.h @@ -0,0 +1,137 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file typedefs.h + * @author MCU Driver Team + * @brief BASE module driver + * @brief This file contains generic definitions + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_TYPEDEFS_H +#define McuMagicTag_TYPEDEFS_H +/** + * @defgroup BASE BASE + * @brief BASE module. + * @{ + */ + +/** + * @defgroup TYPRDEF Typedef Definition + * @brief Definition of RESET Definition. + * @{ + */ + +/** + * @defgroup TYPEDEF_MACRO_DEFINITION TYPEDEF MACRO Definition + * @brief Definition of TYPEDEF MACRO Definition. + * @{ + */ +/* Macro definitions --------------------------------------------------------- */ +#ifndef bool +#define bool _Bool +#endif /* bool */ + +#ifndef false +#define false 0 +#endif /* false */ + +#ifndef true +#define true 1 +#endif /* true */ + +#ifndef NULL +#define NULL ((void *)0) +#endif /* NULL */ + +#ifndef FLT_EPSILON +#define FLT_EPSILON 0.000001 +#endif /* float min error definition */ + +#ifndef INT16_MAX +#define INT16_MAX 0x7FFF +#endif /* INT16_MAX */ + +#ifndef INT16_MIN +#define INT16_MIN (-0x8000) +#endif /* INT16_MIN */ + +#ifndef INT_MAX +#define INT_MAX 0x7FFFFFFF +#endif /* INT_MAX */ + +#ifndef UINT_MAX +#define UINT_MAX 0xFFFFFFFFU +#endif /* UINT_MAX */ + +#define BASE_FUNC_UNUSED(X) (void)(X) + +#ifndef __weak +#define __weak __attribute__((weak)) +#endif /* __weak */ + +#define BASE_CFG_UNSET 0x00 +#define BASE_CFG_SET 0x01 + +#define BASE_CFG_DISABLE 0x00 +#define BASE_CFG_ENABLE 0x01 + +#define RAM_CODE __attribute__((section(".text.sram"))) +#define RESERVED_DATA __attribute__((section(".reserved.data"))) + +typedef int intptr_t; +typedef unsigned int uintptr_t; +/** + * @} + */ + +/** + * @defgroup TYPEDEF_ENUM_DEFINITION TYPEDEF ENUM Definition + * @brief Definition of TYPEDEF ENUM Definition. + * @{ + */ +/** + * @brief BASE Status structures definition + */ +typedef enum { + BASE_STATUS_OK = 0x00000000U, + BASE_STATUS_ERROR = 0x00000001U, + BASE_STATUS_BUSY = 0x00000002U, + BASE_STATUS_TIMEOUT = 0x00000003U, + BASE_STATUS_NOT_SUPPORT = 0x00000004U, +} BASE_StatusType; + +/** + * @brief Indicates the status of the general state machine. The user should add the service status to this enum. + */ +typedef enum { + BASE_FSM_START, + BASE_DEFINE_FSM_END +} BASE_FSM_Status; + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_TYPEDEFS_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/base/src/assert.c b/vendor/others/demo/5-tim_adc/demo/drivers/base/src/assert.c new file mode 100644 index 000000000..b99ca6cad --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/base/src/assert.c @@ -0,0 +1,38 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file assert.c + * @author MCU Driver Team + * @brief Provides weak Error logger function. + */ + +/* Includes ------------------------------------------------------------------ */ +#include "assert.h" +#include "typedefs.h" + +/** + * @brief Error logger function. + * @param file Pointer to the name of the file where the error occurs. + * @param line Number of the line where the error occurs. + * @retval None. + */ +__weak void AssertErrorLog(char *file, unsigned int line) +{ + /* Use only if the user apllication is not defined. */ + BASE_FUNC_UNUSED(file); + BASE_FUNC_UNUSED(line); +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/base/src/base_math.c b/vendor/others/demo/5-tim_adc/demo/drivers/base/src/base_math.c new file mode 100644 index 000000000..05a2063e6 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/base/src/base_math.c @@ -0,0 +1,392 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file base_math.c + * @author MCU Driver Team + * @brief Provides functions about math. + */ + +/* Includes ------------------------------------------------------------------ */ +#include "base_math.h" + +/* Private macro ------------------------------------------------------------- */ +#if (BASE_MATH_SINCOS_MIDDLE_TABLE == BASE_CFG_ENABLE) +#define TRIGONOMETRIC_MAPPING_TABLE { \ + 0X0000, 0X012D, 0X01F6, 0X02BF, 0X0388, 0X0451, 0X051A, 0X05E3, \ + 0X06AC, 0X0775, 0X083D, 0X0906, 0X09CE, 0X0A97, 0X0B5F, 0X0C27, \ + 0X0CEF, 0X0DB7, 0X0E7F, 0X0F47, 0X100E, 0X10D6, 0X119D, 0X1264, \ + 0X132B, 0X13F2, 0X14B8, 0X157F, 0X1645, 0X170A, 0X17D0, 0X1896, \ + 0X195B, 0X1A20, 0X1AE4, 0X1BA9, 0X1C6D, 0X1D31, 0X1DF5, 0X1EB8, \ + 0X1F7B, 0X203E, 0X2100, 0X21C2, 0X2284, 0X2345, 0X2407, 0X24C7, \ + 0X2588, 0X2648, 0X2707, 0X27C7, 0X2886, 0X2944, 0X2A02, 0X2AC0, \ + 0X2B7D, 0X2C3A, 0X2CF7, 0X2DB3, 0X2E6E, 0X2F29, 0X2FE4, 0X309E, \ + 0X3158, 0X3211, 0X32CA, 0X3382, 0X343A, 0X34F2, 0X35A8, 0X365F, \ + 0X3714, 0X37CA, 0X387E, 0X3932, 0X39E6, 0X3A99, 0X3B4C, 0X3BFD, \ + 0X3CAF, 0X3D60, 0X3E10, 0X3EBF, 0X3F6E, 0X401D, 0X40CA, 0X4177, \ + 0X4224, 0X42D0, 0X437B, 0X4425, 0X44CF, 0X4578, 0X4621, 0X46C9, \ + 0X4770, 0X4816, 0X48BC, 0X4961, 0X4A06, 0X4AA9, 0X4B4C, 0X4BEF, \ + 0X4C90, 0X4D31, 0X4DD1, 0X4E70, 0X4F0F, 0X4FAC, 0X5049, 0X50E5, \ + 0X5181, 0X521C, 0X52B5, 0X534E, 0X53E7, 0X547E, 0X5515, 0X55AB, \ + 0X5640, 0X56D4, 0X5767, 0X57F9, 0X588B, 0X591C, 0X59AC, 0X5A3B, \ + 0X5AC9, 0X5B56, 0X5BE3, 0X5C6E, 0X5CF9, 0X5D83, 0X5E0B, 0X5E93, \ + 0X5F1A, 0X5FA0, 0X6026, 0X60AA, 0X612D, 0X61B0, 0X6231, 0X62B2, \ + 0X6331, 0X63B0, 0X642D, 0X64AA, 0X6526, 0X65A0, 0X661A, 0X6693, \ + 0X670B, 0X6782, 0X67F7, 0X686C, 0X68E0, 0X6953, 0X69C4, 0X6A35, \ + 0X6AA5, 0X6B13, 0X6B81, 0X6BEE, 0X6C59, 0X6CC4, 0X6D2D, 0X6D96, \ + 0X6DFD, 0X6E63, 0X6EC9, 0X6F2D, 0X6F90, 0X6FF2, 0X7053, 0X70B3, \ + 0X7112, 0X716F, 0X71CC, 0X7227, 0X7282, 0X72DB, 0X7333, 0X738A, \ + 0X73E0, 0X7435, 0X7489, 0X74DB, 0X752D, 0X757D, 0X75CC, 0X761B, \ + 0X7668, 0X76B3, 0X76FE, 0X7747, 0X7790, 0X77D7, 0X781D, 0X7862, \ + 0X78A6, 0X78E8, 0X792A, 0X796A, 0X79A9, 0X79E7, 0X7A24, 0X7A5F, \ + 0X7A9A, 0X7AD3, 0X7B0B, 0X7B42, 0X7B77, 0X7BAC, 0X7BDF, 0X7C11, \ + 0X7C42, 0X7C71, 0X7CA0, 0X7CCD, 0X7CF9, 0X7D24, 0X7D4E, 0X7D76, \ + 0X7D9D, 0X7DC3, 0X7DE8, 0X7E0C, 0X7E2E, 0X7E4F, 0X7E6F, 0X7E8E, \ + 0X7EAB, 0X7EC8, 0X7EE3, 0X7EFD, 0X7F15, 0X7F2D, 0X7F43, 0X7F58, \ + 0X7F6B, 0X7F7E, 0X7F8F, 0X7F9F, 0X7FAE, 0X7FBC, 0X7FC8, 0X7FD3, \ + 0X7FDD, 0X7FE5, 0X7FED, 0X7FF3, 0X7FF8, 0X7FFC, 0X7FFE, 0X7FFF } +#elif (BASE_MATH_SINCOS_MIDDLE_TABLE == BASE_CFG_DISABLE) +#define TRIGONOMETRIC_MAPPING_TABLE { \ + 0x0000, 0x00C9, 0x0192, 0x025B, 0x0324, 0x03ED, 0x04B6, 0x057F, \ + 0x0647, 0x0710, 0x07D9, 0x08A2, 0x096A, 0x0A33, 0x0AFB, 0x0BC3, \ + 0x0C8B, 0x0D53, 0x0E1B, 0x0EE3, 0x0FAB, 0x1072, 0x1139, 0x1201, \ + 0x12C8, 0x138E, 0x1455, 0x151B, 0x15E2, 0x16A8, 0x176D, 0x1833, \ + 0x18F8, 0x19BD, 0x1A82, 0x1B47, 0x1C0B, 0x1CCF, 0x1D93, 0x1E56, \ + 0x1F19, 0x1FDC, 0x209F, 0x2161, 0x2223, 0x22E5, 0x23A6, 0x2467, \ + 0x2528, 0x25E8, 0x26A8, 0x2767, 0x2826, 0x28E5, 0x29A3, 0x2A61, \ + 0x2B1F, 0x2BDC, 0x2C98, 0x2D55, 0x2E11, 0x2ECC, 0x2F87, 0x3041, \ + 0x30FB, 0x31B5, 0x326E, 0x3326, 0x33DE, 0x3496, 0x354D, 0x3604, \ + 0x36BA, 0x376F, 0x3824, 0x38D8, 0x398C, 0x3A40, 0x3AF2, 0x3BA5, \ + 0x3C56, 0x3D07, 0x3DB8, 0x3E68, 0x3F17, 0x3FC5, 0x4073, 0x4121, \ + 0x41CE, 0x427A, 0x4325, 0x43D0, 0x447A, 0x4524, 0x45CD, 0x4675, \ + 0x471C, 0x47C3, 0x4869, 0x490F, 0x49B4, 0x4A58, 0x4AFB, 0x4B9E, \ + 0x4C3F, 0x4CE1, 0x4D81, 0x4E21, 0x4EBF, 0x4F5E, 0x4FFB, 0x5097, \ + 0x5133, 0x51CE, 0x5269, 0x5302, 0x539B, 0x5433, 0x54CA, 0x5560, \ + 0x55F5, 0x568A, 0x571D, 0x57B0, 0x5842, 0x58D4, 0x5964, 0x59F3, \ + 0x5A82, 0x5B10, 0x5B9D, 0x5C29, 0x5CB4, 0x5D3E, 0x5DC7, 0x5E50, \ + 0x5ED7, 0x5F5E, 0x5FE3, 0x6068, 0x60EC, 0x616F, 0x61F1, 0x6271, \ + 0x62F2, 0x6371, 0x63EF, 0x646C, 0x64E8, 0x6563, 0x65DD, 0x6657, \ + 0x66CF, 0x6746, 0x67BD, 0x6832, 0x68A6, 0x6919, 0x698C, 0x69FD, \ + 0x6A6D, 0x6ADC, 0x6B4A, 0x6BB8, 0x6C24, 0x6C8F, 0x6CF9, 0x6D62, \ + 0x6DCA, 0x6E30, 0x6E96, 0x6EFB, 0x6F5F, 0x6FC1, 0x7023, 0x7083, \ + 0x70E2, 0x7141, 0x719E, 0x71FA, 0x7255, 0x72AF, 0x7307, 0x735F, \ + 0x73B5, 0x740B, 0x745F, 0x74B2, 0x7504, 0x7555, 0x75A5, 0x75F4, \ + 0x7641, 0x768E, 0x76D9, 0x7723, 0x776C, 0x77B4, 0x77FA, 0x7840, \ + 0x7884, 0x78C7, 0x7909, 0x794A, 0x798A, 0x79C8, 0x7A05, 0x7A42, \ + 0x7A7D, 0x7AB6, 0x7AEF, 0x7B26, 0x7B5D, 0x7B92, 0x7BC5, 0x7BF8, \ + 0x7C29, 0x7C5A, 0x7C89, 0x7CB7, 0x7CE3, 0x7D0F, 0x7D39, 0x7D62, \ + 0x7D8A, 0x7DB0, 0x7DD6, 0x7DFA, 0x7E1D, 0x7E3F, 0x7E5F, 0x7E7F, \ + 0x7E9D, 0x7EBA, 0x7ED5, 0x7EF0, 0x7F09, 0x7F21, 0x7F38, 0x7F4D, \ + 0x7F62, 0x7F75, 0x7F87, 0x7F97, 0x7FA7, 0x7FB5, 0x7FC2, 0x7FCE, \ + 0x7FD8, 0x7FE1, 0x7FE9, 0x7FF0, 0x7FF6, 0x7FFA, 0x7FFD, 0x7FFF } +#endif + +#define BASE_MATH_SIN_COS_MASK 0x0300u /**< All mask values of sincos */ +#define BASE_MATH_ANGLED0_90 0x0200u /**< Mask value of sincos ranging from 0 to 90 degrees */ +#define BASE_MATH_ANGLED90_180 0x0300u /**< Mask value of sincos ranging from 90 to 180 degrees */ +#define BASE_MATH_ANGLED180_270 0x0000u /**< Mask value of sincos ranging from 180 to 270 degrees */ +#define BASE_MATH_ANGLED270_360 0x0100u /**< Mask value of sincos ranging from 270 to 360 degrees */ +#define BASE_MATH_PAI 3.141592653 +#define BASE_MATH_FACTORIAL3_RECIPROCAL 0.166666667 /**< 1/6. */ +#define BASE_MATH_FACTORIAL5_RECIPROCAL 0.008333333 /**< 1/120. */ +#define BASE_MATH_FACTORIAL7_RECIPROCAL 0.000198413 /**< 1/5040. */ +#define BASE_MATH_ANGLE90 90 +#define BASE_MATH_ANGLE180 180 +#define BASE_MATH_ANGLE180_RECIPROCAL 0.005555556 /**< 1/180. */ +#define BASE_MATH_ANGLE270 270 +#define BASE_MATH_ANGLE360 360 + +#define BASE_DEFINE_MAPPING_TABLE_SIZE 255 +/** Value to be added to convert a signed 16-bit value to an unsigned 16-bit value. */ +#define BASE_DEFINE_INT16_ADDITIONS_VAL 32768 + +#define BASE_DEFINE_DIV_SQRT3 (int)0x49E6 /**< 1/sqrt(3) = 0.5773315 in q15 format. */ + +/* Private variables --------------------------------------------------------- */ +const short g_triFunMappingTable[] = TRIGONOMETRIC_MAPPING_TABLE; /**< trigonometric look-up table. */ + +/** + * @brief Calculate the value of the input angle by looking up the table. Data in Q15 format. + * @param angle: Angle value to be calculated. + * @retval Calculation result in BASE_MathTypeSinCos Structure. + */ +BASE_MathTypeSinCos BASE_MATH_GetSinCos(short angle) +{ + BASE_MathTypeSinCos ret = {0}; + unsigned short uhindex; + + /* Move the zero to ensure that the mapping result is positive. */ + uhindex = (unsigned short)((int)BASE_DEFINE_INT16_ADDITIONS_VAL + (int)angle); + + /* Shift right by 6 bits. */ + uhindex /= (unsigned short)64; /* 64:Reserved 10-bit precision. */ + + switch ((unsigned short)(uhindex) & BASE_MATH_SIN_COS_MASK) { + case BASE_MATH_ANGLED0_90: /* 0 ~ 90° */ + ret.sin = g_triFunMappingTable[(unsigned char)(uhindex)]; + ret.cos = g_triFunMappingTable[(unsigned char)(BASE_DEFINE_MAPPING_TABLE_SIZE - (unsigned char)(uhindex))]; + break; + + case BASE_MATH_ANGLED90_180: /* 90 ~ 180° */ + ret.sin = g_triFunMappingTable[(unsigned char)(BASE_DEFINE_MAPPING_TABLE_SIZE - (unsigned char)(uhindex))]; + ret.cos = -g_triFunMappingTable[(unsigned char)(uhindex)]; + break; + + case BASE_MATH_ANGLED180_270: /* 180 ~ 270° */ + ret.sin = -g_triFunMappingTable[(unsigned char)(uhindex)]; + ret.cos = -g_triFunMappingTable[(unsigned char)(BASE_DEFINE_MAPPING_TABLE_SIZE - (unsigned char)(uhindex))]; + break; + + case BASE_MATH_ANGLED270_360: /* 270 ~ 360° */ + ret.sin = -g_triFunMappingTable[(unsigned char)(BASE_DEFINE_MAPPING_TABLE_SIZE - (unsigned char)(uhindex))]; + ret.cos = g_triFunMappingTable[(unsigned char)(uhindex)]; + break; + + default: + break; + } + + return ret; +} + +/** + * @brief Using Taylor Expansion to Calculate Sin Values in 90 Degrees. + * @param angle Angle value to be calculated. Note: 0 <= angle <= 90. + * @retval float Calculated sin value. + */ +static float BASE_MATH_CalSinIn90(float angle) +{ + float radian = angle * BASE_MATH_PAI * BASE_MATH_ANGLE180_RECIPROCAL; + float radian3 = radian * radian * radian; /* power(3) */ + float radian5 = radian3 * radian * radian; + float radian7 = radian5 * radian * radian; /* power(7) */ + /* Using Taylor Expansion to Calculate Sin Values in 90 Degrees. */ + return (radian - radian3 * BASE_MATH_FACTORIAL3_RECIPROCAL + radian5 * BASE_MATH_FACTORIAL5_RECIPROCAL \ + - radian7 * BASE_MATH_FACTORIAL7_RECIPROCAL); +} + +/** + * @brief Using Taylor Expansion to Calculate Sin Values for Any Angle. + * @param angle Angle value to be calculated. + * @retval float Calculated sin value. + */ +float BASE_MATH_GetSin(float angle) +{ + float angleIn360; + angleIn360 = (int)angle % BASE_MATH_ANGLE360 + angle - (int)angle; + if (angleIn360 < 0) { + angleIn360 = angleIn360 + BASE_MATH_ANGLE360; + } + if (angleIn360 < BASE_MATH_ANGLE90) { /* 0 ~ 90° */ + return BASE_MATH_CalSinIn90(angleIn360); + } + if (angleIn360 < BASE_MATH_ANGLE180) { /* 90 ~ 180° */ + return BASE_MATH_CalSinIn90(BASE_MATH_ANGLE180 - angleIn360); + } + if (angleIn360 < BASE_MATH_ANGLE270) { /* 180 ~ 270° */ + return -BASE_MATH_CalSinIn90(angleIn360 - BASE_MATH_ANGLE180); + } + return -BASE_MATH_CalSinIn90(BASE_MATH_ANGLE360 - angleIn360); /* 270 ~ 360° */ +} + +/** + * @brief Using Taylor Expansion to Calculate Sin Values for Any Angle. + * @param angle Angle value to be calculated. + * @retval float Calculated sin value. + */ +float BASE_MATH_GetCos(float angle) +{ + float angleIn360; + angleIn360 = (int)angle % BASE_MATH_ANGLE360 + angle - (int)angle; + if (angleIn360 < 0) { + angleIn360 = angleIn360 + BASE_MATH_ANGLE360; + } + if (angleIn360 < BASE_MATH_ANGLE90) { /* 0 ~ 90° */ + return BASE_MATH_CalSinIn90(BASE_MATH_ANGLE90 - angleIn360); + } + if (angleIn360 < BASE_MATH_ANGLE180) { /* 90 ~ 180° */ + return -BASE_MATH_CalSinIn90(angleIn360 - BASE_MATH_ANGLE90); + } + if (angleIn360 < BASE_MATH_ANGLE270) { /* 180 ~ 270° */ + return -BASE_MATH_CalSinIn90(BASE_MATH_ANGLE270 - angleIn360); + } + return BASE_MATH_CalSinIn90(angleIn360 - BASE_MATH_ANGLE270); /* 270 ~ 360° */ +} + +/** + * @brief Using newton iteration method to realize sqrt. + * @param x Value to be squared. + * @retval float Value after square. + */ +float BASE_MATH_Sqrt(const float x) +{ + BASE_FUNC_ASSERT_PARAM(x >= FLT_EPSILON); + const float xHalf = 0.5f * x; /* 0.5f : coefficients. */ + + union { + float x; + unsigned int i; + } u; + u.x = x; + u.i = 0x5f3759df - (u.i >> 1); /* 0x5f3759df : Magic numbers for sqrt. */ + return x * u.x * (1.5f - xHalf * u.x * u.x); /* 1.5f : coefficients. */ +} + +/** + * @brief Compute x to the n power. + * @param x Cardinality to be calculated. + * @param n Power exponent to be calculated. + * @retval float Calculated value. + */ +float BASE_MATH_Pow(float x, int n) +{ + /* check x not equal zero */ + if (x > -FLT_EPSILON && x < FLT_EPSILON) { + return 0.0f; + } + float value = x; + int power = n; + float res = 1.0; + if (power < 0) { + value = 1 / value; + power = -power; + } + /* power multiplication */ + for (unsigned int i = 0; i < (unsigned int)power; ++i) { + res *= value; + } + return res; +} + +/** + * @brief This function performs Clarke conversion. Data in Q15 format. The conversion formula is as follows: + * alpha = a; + * beta = 1 / sqrt3 * a + 2 / sqrt3 *b. + * @param input Current values of a\b items. + * @retval BASE_MathTypeAlphaBeta Conversion result in BASE_MathTypeAlphaBeta Structure. + */ +BASE_MathTypeAlphaBeta BASE_MATH_Clarke(BASE_MathTypeAB input) +{ + BASE_MathTypeAlphaBeta ret; + int aDivSort3, bDivSort3, betaTmp32; + + /* qIalpha = qIas. */ + ret.alpha = input.a; + + aDivSort3 = BASE_DEFINE_DIV_SQRT3 * (int)input.a; + + bDivSort3 = BASE_DEFINE_DIV_SQRT3 * (int)input.b; + + /* qIbeta = (2*qIbs+qIas)/sqrt(3). */ + /* Because BASE_DEFINE_DIV_SQRT3 is in the Q15 format, divide it by 32768 to ensure that the result is correct. */ + betaTmp32 = (aDivSort3 + bDivSort3 + bDivSort3) >> 15; /* 15:Move 15 bits to the right, keep Q15 format. */ + + /* Check saturation of Ibeta */ + if (betaTmp32 > INT16_MAX) { + ret.beta = INT16_MAX; + } else if (betaTmp32 < INT16_MIN) { + ret.beta = INT16_MIN; + } else { + ret.beta = (short)(betaTmp32); + } + + return ret; +} + +/** + * @brief This function performs Park coordinate conversion. Data in Q15 format. The conversion formula is as follows: + * id = alpha * cos(theta) + beta * sin(theta); + * iq = -alpha * sin(theta) + beta * cos(theta). + * @param input stator values alpha and beta in BASE_MathTypeAlphaBeta format. + * @param theta rotating frame angular position. + * @retval BASE_MathTypeQD Conversion result in BASE_MathTypeQD Structure. + */ +BASE_MathTypeQD BASE_MATH_Park(BASE_MathTypeAlphaBeta input, short theta) +{ + BASE_MathTypeQD ret; + BASE_MathTypeSinCos thetaSinCos; + int d1, d2, q1, q2, tmp32; + + thetaSinCos = BASE_MATH_GetSinCos(theta); + + /* No overflow guaranteed. */ + d1 = input.alpha * (int)thetaSinCos.cos; + + /* No overflow guaranteed. */ + d2 = input.beta * (int)thetaSinCos.sin; + + /* Id component in Q1.15 Format. */ + tmp32 = (d1 + d2) >> 15; /* 15:Move 15 bits to the right, keep Q15 format. */ + + /* Check saturation of Id. */ + if (tmp32 > INT16_MAX) { + ret.d = INT16_MAX; + } else if (tmp32 < INT16_MIN) { + ret.d = INT16_MIN; + } else { + ret.d = (short)(tmp32); + } + + /* No overflow guaranteed. */ + q1 = input.alpha * (int)thetaSinCos.sin; + + /* No overflow guaranteed. */ + q2 = input.beta * (int)thetaSinCos.cos; + + /* Iq component in Q1.15 Format. */ + tmp32 = (q2 - q1) >> 15; /* 15:Move 15 bits to the right, keep Q15 format. */ + + /* Check saturation of Iq. */ + if (tmp32 > INT16_MAX) { + ret.q = INT16_MAX; + } else if (tmp32 < INT16_MIN) { + ret.q = INT16_MIN; + } else { + ret.q = (short)(tmp32); + } + + return ret; +} + +/** + * @brief This function performs Reverse Park coordinate conversion. Data in Q15 format. The conversion formula is as + * follows: alpha = d * cos(theta) - q * sin(theta); + * beta = d * sin(theta) + q * cos(theta). + * @param input stator voltage Vq and Vd in BASE_MathTypeQD format. + * @param theta rotating frame angular position. + * @retval BASE_MathTypeAlphaBeta Conversion result in BASE_MathTypeAlphaBeta Structure. + */ +BASE_MathTypeAlphaBeta BASE_MATH_RevPark(BASE_MathTypeQD input, short theta) +{ + int alpha1, alpha2, beta1, beta2; + BASE_MathTypeSinCos thetaSinCos; + BASE_MathTypeAlphaBeta ret; + + thetaSinCos = BASE_MATH_GetSinCos(theta); + + /* No overflow guaranteed. */ + alpha1 = input.q * (int)thetaSinCos.sin; + alpha2 = input.d * (int)thetaSinCos.cos; + + ret.alpha = (short)((alpha2 - alpha1) >> 15); /* 15:Move 15 bits to the right, keep Q15 format. */ + + beta1 = input.q * (int)thetaSinCos.cos; + beta2 = input.d * (int)thetaSinCos.sin; + + ret.beta = (short)((beta1 + beta2) >> 15); /* 15:Move 15 bits to the right, keep Q15 format. */ + + return ret; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/base/src/clock.c b/vendor/others/demo/5-tim_adc/demo/drivers/base/src/clock.c new file mode 100644 index 000000000..5a3641258 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/base/src/clock.c @@ -0,0 +1,103 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file clock.c + * @author MCU Driver Team + * @brief Provides functions related to the dominant frequency operation and delay. + */ + +/* Includes ------------------------------------------------------------------ */ +#include "ip_crg_common.h" +#include "crg.h" +#include "clock.h" + +/** + * @brief Get the current CPU frequency. + * @param None. + * @retval System clock frequency in Hz. + */ +unsigned int BASE_FUNC_GetCpuFreqHz(void) +{ + return HAL_CRG_GetCoreClkFreq(); +} + +/** + * @brief Delay number of us. + * @param us The number of us to delay. + * @retval None. + */ +void BASE_FUNC_DelayUs(unsigned int us) +{ + unsigned int preTick = DCL_SYSTICK_GetTick(); + unsigned int tickInUs = (SYSTICK_GetCRGHZ() / CRG_FREQ_1MHz) * us; + unsigned int curTick; + unsigned int delta; + + /* Wait until the delta is greater than tickInUs */ + do { + curTick = DCL_SYSTICK_GetTick(); + delta = (curTick >= preTick) ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick + 1; + } while (delta < tickInUs); +} + +/** + * @brief Delay number of ms. + * @param ms The number of ms to delay. + * @retval None. + */ +void BASE_FUNC_DelayMs(unsigned int ms) +{ + for (unsigned int i = 0; i < ms; ++i) { + BASE_FUNC_DelayUs(BASE_DEFINE_DELAY_US_IN_MS); + } +} + +/** + * @brief Delay number of seconds. + * @param seconds The number of seconds to delay. + * @retval None. + */ +void BASE_FUNC_DelaySeconds(unsigned int seconds) +{ + for (unsigned int i = 0; i < seconds; ++i) { + BASE_FUNC_DelayMs(BASE_DEFINE_DELAY_MS_IN_SEC); + } +} + +/** + * @brief Delay for a certain period of time based on parameters delay and units. + * @param delay The number of 'units' to delay. + * @param units Specifies the delay unit. + * @retval None. + */ +void BASE_FUNC_Delay(unsigned int delay, BASE_DelayUnit units) +{ + switch (units) { + case BASE_DEFINE_DELAY_SECS: + BASE_FUNC_DelaySeconds(delay); + break; + case BASE_DEFINE_DELAY_MILLISECS: + BASE_FUNC_DelayMs(delay); + break; + case BASE_DEFINE_DELAY_MICROSECS: + BASE_FUNC_DelayUs(delay); + break; + default: + break; + } + return; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/base/src/generalfunc.c b/vendor/others/demo/5-tim_adc/demo/drivers/base/src/generalfunc.c new file mode 100644 index 000000000..91c2d2fc2 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/base/src/generalfunc.c @@ -0,0 +1,223 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file basic.c + * @author MCU Driver Team + * @brief BASE module driver + * @details This file provides firmware functions to manage the following + * functionalities of the basic functions. + * + Verifying the timeout function + * + 8-bit, 16-bit checksum function + * + Sliding averaging function + * + General state machine + * @verbatim + * Sliding averaging interface usage: + * 1) Call the BASE_FUNC_AverageInit() function to initialize and configure the buffer, + * average the window size, and set the index value for identification. + * 2) Call the BASE_FUNC_GetSlipAverageVal() function based on the index value transferred + * in the initialization function to obtain the average value of the current window. + * 3) Call the BASE_FUNC_AverageDeInit() function to close the current index channel. + * + * General state machine usage: + * 1) Add your status to enum BASE_FSM_Status; + * 2) Write your code for each state. Note that the function prototype is BASE_FSM_Status xxx(void); + * 3) Use BASE_FSM_FunRegister() to register your functions and their status; + * 4) Start the state machine using BASE_FSM_Run(). + * @endverbatim + */ + +/* Includes ------------------------------------------------------------------ */ +#include "generalfunc.h" + +/* Private variables --------------------------------------------------------- */ +BASE_AverageHandle g_averageHandle[BASE_DEFINE_SLIPAVERAGE_NUM]; +BASE_FSM_Handle g_fsmHandle; + +/** + * @brief Obtains the current tick value. + * @retval unsigned int. Current tick value. + */ +unsigned int BASE_FUNC_GetTick(void) +{ + return DCL_SYSTICK_GetTick(); +} + +/** + * @brief Query an element in an array using dichotomous lookup. Note: Arrays are sorted in ascending order. + * Returns the left index when the array element does not exist. + * @param nums Array to be searched. + * @param leng Array Length. + * @param value Value to be searched for. + * @return unsigned int Index value corresponding to value. + */ +unsigned int BASE_FUNC_FindArrayValue(const unsigned short *nums, unsigned int leng, unsigned int value) +{ + BASE_FUNC_ASSERT_PARAM(nums != NULL); + BASE_FUNC_PARAMCHECK_WITH_RET(leng > 0, 0); + unsigned int left = 0; + unsigned int right = leng - 1; + while (left < right) { + unsigned int mid = (left + right) / 2; + if (value >= nums[mid] && value < nums[mid + 1]) { + return mid; + } else if (value < nums[mid]) { + right = mid - 1; + } else { + left = mid + 1; + } + } + return left; +} + +/** + * @brief 8-bit checksum. + * @param pt Pointer to the data to be computed. + * @param len Data length. + * @return unsigned char Calculation result. + */ +unsigned char BASE_FUNC_CalcSumByte(const unsigned char *pt, unsigned int len) +{ + BASE_FUNC_ASSERT_PARAM(pt != NULL); + BASE_FUNC_PARAMCHECK_WITH_RET((len > 0), 0); + + unsigned int sum = 0; + /* calculate sum value */ + while (len--) { + sum += *pt; + pt++; + } + /* Use 8 digits */ + return (unsigned char)sum; +} + +/** + * @brief 16-bit checksum. + * @param pt Pointer to the data to be computed. + * @param len Data length. + * @return unsigned char Calculation result. + */ +unsigned short BASE_FUNC_CalcSumShort(unsigned char const * pt, unsigned int len) +{ + BASE_FUNC_ASSERT_PARAM(pt != NULL); + BASE_FUNC_PARAMCHECK_WITH_RET((len > 0), 0); + unsigned int sum = 0; + /* calculate sum value */ + while (len--) { + sum += *pt; + pt++; + } + /* Use 16 digits */ + return (unsigned short)sum; +} + +/** + * @brief Sliding average initialization function. + * @param index User-entered index value used to identify the channel, in [0, BASE_DEFINE_SLIPAVERAGE_NUM). + * @param buf Pointer to the ring buffer, it stores historical data. + * @param size Ring buffer size. + * @param calNum Indicates the average window size, that is, the number of pieces of data to be averaged. + * @return BASE_StatusType @ref BASE_StatusType. + */ +BASE_StatusType BASE_FUNC_AverageInit(unsigned int index, float *buf, unsigned int size, unsigned int calNum) +{ + /* verify param */ + BASE_FUNC_ASSERT_PARAM(buf != NULL); + BASE_FUNC_PARAMCHECK_WITH_RET((calNum > 0), BASE_STATUS_ERROR); + BASE_FUNC_PARAMCHECK_WITH_RET((size >= calNum), BASE_STATUS_ERROR); + BASE_FUNC_PARAMCHECK_WITH_RET((index < BASE_DEFINE_SLIPAVERAGE_NUM), BASE_STATUS_ERROR); + /* init handle's member */ + g_averageHandle[index].buf = buf; + g_averageHandle[index].size = size; + g_averageHandle[index].at = 0; + g_averageHandle[index].calNum = calNum; + g_averageHandle[index].total = 0; + g_averageHandle[index].cnt = 0; + + return BASE_STATUS_OK; +} + +/** + * @brief Transfer new data and return the average value after the new data is inserted. + * @param index Index value of the handle array, which is set by the user in the initialization function. + * @param val Data value. + * @return float Calculated average. + */ +float BASE_FUNC_GetSlipAverageVal(unsigned int index, float val) +{ + /* verify param */ + BASE_FUNC_ASSERT_PARAM(index < BASE_DEFINE_SLIPAVERAGE_NUM); + /* The processing data volume does not reach the constant average amount. */ + if (g_averageHandle[index].cnt < g_averageHandle[index].calNum) { + (g_averageHandle[index].cnt)++; + g_averageHandle[index].total += val; + g_averageHandle[index].buf[g_averageHandle[index].at] = val; + (g_averageHandle[index].at)++; + return g_averageHandle[index].total / g_averageHandle[index].cnt; /* g_averageHandle[index].cnt > 0 */ + } + /* The processing data volume reach the constant average amount. */ + g_averageHandle[index].total += val - g_averageHandle[index].buf[(g_averageHandle[index].at + \ + g_averageHandle[index].size - g_averageHandle[index].calNum) % \ + g_averageHandle[index].size]; + g_averageHandle[index].buf[g_averageHandle[index].at] = val; + g_averageHandle[index].at = (g_averageHandle[index].at + 1) % g_averageHandle[index].size; + return g_averageHandle[index].total / g_averageHandle[index].calNum; /* g_averageHandle[index].calNum > 0 */ +} + +/** + * @brief Disables the channel specified by index. + * @param index Index value of the handle array, which is set by the user in the initialization function. + * @return None. + */ +void BASE_FUNC_AverageDeInit(unsigned int index) +{ + /* verify param */ + BASE_FUNC_ASSERT_PARAM(index < BASE_DEFINE_SLIPAVERAGE_NUM); + g_averageHandle[index].buf = NULL; +} + +/** + * @brief Registering functions to the state machine. Note that the function prototype is BASE_FSM_Status xxx(void). + * @param index Status of the function. + * @param funAddress Function Pointer. + * @return None. + */ +void BASE_FSM_FunRegister(BASE_FSM_Status index, FunType funAddress) +{ + BASE_FUNC_PARAMCHECK_NO_RET(index >= BASE_FSM_START && index <= BASE_DEFINE_FSM_END); + g_fsmHandle.funList[index] = funAddress; +} + +/** + * @brief Start the state machine. + * @param delayTime State switching delay time. + * @param delayUnit Indicates the unit of the state switch delay. + * @return None. + */ +void BASE_FSM_Run(unsigned int delayTime, BASE_DelayUnit delayUnit) +{ + g_fsmHandle.nextFun = BASE_FSM_START; + + FunType execFun; + while (1) { + execFun = g_fsmHandle.funList[g_fsmHandle.nextFun]; + g_fsmHandle.nextFun = execFun(); + if (g_fsmHandle.nextFun < BASE_FSM_START || g_fsmHandle.nextFun > BASE_DEFINE_FSM_END) { + break; + } + BASE_FUNC_Delay(delayTime, delayUnit); + } +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/base/src/interrupt.c b/vendor/others/demo/5-tim_adc/demo/drivers/base/src/interrupt.c new file mode 100644 index 000000000..c85e5fc1b --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/base/src/interrupt.c @@ -0,0 +1,555 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file interrupt.c + * @author MCU Driver Team + * @brief Provides the handle template functions for processing exceptions and interrupts supported by the current + * functionalities of the interrupt. + * + Initialization and de-initialization functions + * + Regester and de-regester interrupt + * + Enable and disable interrupt + * + Configure interrupt + */ + +/* Includes ------------------------------------------------------------------ */ +#include "interrupt.h" +#include "baseinc.h" + +/* Macro definitions ---------------------------------------------------------*/ + +/* Typedef definitions -------------------------------------------------------*/ +void IRQ_PriorityInit(void); +static void IRQ_DummyHandler(void *arg); +static void IRQ_SetCallBack(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg); + +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) +static inline unsigned int IRQ_GetCpuPrivilege(void); + +static struct IRQ_Mask { + unsigned int irqMie; + unsigned int irqLocien0; + unsigned int irqLocien1; + unsigned int irqLocien2; + unsigned int irqLocien3; +} g_irqMask; + +volatile unsigned int g_RiscvPrivMode = 0; +#endif + +/** + * @brief Interrupt vector table, supports up to IRQ_MAX interrupts, except for IRQ_VECTOR_CNT internal + * standard interrupts, which can be configured according to actual conditions. + */ +IRQ_ARG_FUNC g_irqCallbackFunc[IRQ_MAX]; + +/* Initialization and de-initialization functions ----------------------------*/ +/** + * @brief Exception/Interrupt Handler Entry. + * @param irqNum external interrupt number. + * @retval None + */ +void InterruptEntry(unsigned int irqNum) +{ + g_irqCallbackFunc[irqNum].pfnHandler(g_irqCallbackFunc[irqNum].param); + IRQ_ClearN(irqNum); +} + +/** + * @brief Irq initialization. + * @param none. + * @retval None + */ +void IRQ_Init(void) +{ + unsigned int index; + + for (index = 0; index < IRQ_MAX; index++) { + g_irqCallbackFunc[index].pfnHandler = IRQ_DummyHandler; + g_irqCallbackFunc[index].param = NULL; + } +} + +/* Register and Unregister interrupt -----------------------------------------*/ +/** + * @brief Register IRQ Callback function and parameter. + * @param irqNum External interrupt number. + * @param func Callback function. + * @param arg Parameter of callback function. + * @retval BASE_STATUS_OK(success) or IRQ_ERRNO_ALREADY_CREATED(fail) or IRQ_ERRNO_NUM_INVALID. + * @note In the corresponding interrupt handler, manually clear the interrupt source and the corresponding interrupt + * flag bit (call the IRQ_ClearN function to clear the interrupt), otherwise the interrupt will always be + * triggered. + */ +unsigned int IRQ_Register(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + INTERRUPT_ASSERT_PARAM(func != NULL); + INTERRUPT_PARAM_CHECK_WITH_RET(irqNum < IRQ_MAX, IRQ_ERRNO_NUM_INVALID); + + if (g_irqCallbackFunc[irqNum].pfnHandler != IRQ_DummyHandler) { + return IRQ_ERRNO_ALREADY_CREATED; + } + IRQ_SetCallBack(irqNum, func, arg); + return BASE_STATUS_OK; +} + +/** + * @brief Unregister IRQ Callback. + * @param irqNum External interrupt number. + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID. + */ +unsigned int IRQ_Unregister(unsigned int irqNum) +{ + INTERRUPT_PARAM_CHECK_WITH_RET(irqNum < IRQ_MAX, IRQ_ERRNO_NUM_INVALID); + g_irqCallbackFunc[irqNum].pfnHandler = IRQ_DummyHandler; + g_irqCallbackFunc[irqNum].param = NULL; + return BASE_STATUS_OK; +} + +/* Enable and disable interrupt ----------------------------------------------*/ +/** + * @brief Global Interrupt Enable. + * @retval None. + */ +void IRQ_Enable(void) +{ +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); + + RISCV_PRIV_MODE_SWITCH(priv); + + g_irqMask.irqMie |= READ_CSR(mie); + g_irqMask.irqLocien0 |= READ_CUSTOM_CSR(LOCIEN0); + g_irqMask.irqLocien1 |= READ_CUSTOM_CSR(LOCIEN1); + g_irqMask.irqLocien2 |= READ_CUSTOM_CSR(LOCIEN2); + g_irqMask.irqLocien3 |= READ_CUSTOM_CSR(LOCIEN3); + + WRITE_CSR(mie, g_irqMask.irqMie); + WRITE_CUSTOM_CSR_VAL(LOCIEN0, g_irqMask.irqLocien0); + WRITE_CUSTOM_CSR_VAL(LOCIEN1, g_irqMask.irqLocien1); + WRITE_CUSTOM_CSR_VAL(LOCIEN2, g_irqMask.irqLocien2); + WRITE_CUSTOM_CSR_VAL(LOCIEN3, g_irqMask.irqLocien3); + + RISCV_PRIV_MODE_SWITCH(priv); +#else + SET_CSR(mstatus, MSTATUS_MIE); +#endif +} + +/** + * @brief Global Interrupt Disable. + * @retval BASE_STATUS_OK. + * @note Must be called in Interrupt(Machine mode) + */ +void IRQ_Disable(void) +{ +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); + + RISCV_PRIV_MODE_SWITCH(priv); + + g_irqMask.irqMie = READ_CSR(mie); + g_irqMask.irqLocien0 = READ_CUSTOM_CSR(LOCIEN0); + g_irqMask.irqLocien1 = READ_CUSTOM_CSR(LOCIEN1); + g_irqMask.irqLocien2 = READ_CUSTOM_CSR(LOCIEN2); + g_irqMask.irqLocien3 = READ_CUSTOM_CSR(LOCIEN3); + + WRITE_CSR(mie, 0); + WRITE_CUSTOM_CSR_VAL(LOCIEN0, 0); + WRITE_CUSTOM_CSR_VAL(LOCIEN1, 0); + WRITE_CUSTOM_CSR_VAL(LOCIEN2, 0); + WRITE_CUSTOM_CSR_VAL(LOCIEN3, 0); + + RISCV_PRIV_MODE_SWITCH(priv); +#else + CLEAR_CSR(mstatus, MSTATUS_MIE | MSTATUS_MPIE); +#endif +} + +/** + * @brief Enable the specified interrupt. + * @param irqNum External interrupt number. + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID. + */ +unsigned int IRQ_EnableN(unsigned int irqNum) +{ + unsigned int irqOrder; + unsigned int locienVal; +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + + /* The interrupt enable bits that can be controlled in the mie register (32 bits), up to 32 + can be controlled, and each bit corresponds to an interrupt enable */ + + RISCV_PRIV_MODE_SWITCH(priv); + + if (irqNum < IRQ_MIE_TOTAL_CNT) { + irqOrder = 1U << irqNum; + SET_CSR(mie, irqOrder); + } else if (irqNum < IRQ_LOCIEN1_OFFSET) { + irqOrder = irqNum - IRQ_MIE_TOTAL_CNT; + locienVal = READ_CUSTOM_CSR(LOCIEN0); + locienVal |= (1U << irqOrder); + WRITE_CUSTOM_CSR_VAL(LOCIEN0, locienVal); + } else if (irqNum < IRQ_LOCIEN2_OFFSET) { + irqOrder = irqNum - IRQ_LOCIEN1_OFFSET; + locienVal = READ_CUSTOM_CSR(LOCIEN1); + locienVal |= (1U << irqOrder); + WRITE_CUSTOM_CSR_VAL(LOCIEN1, locienVal); + } else { + irqOrder = irqNum - IRQ_LOCIEN2_OFFSET; + locienVal = READ_CUSTOM_CSR(LOCIEN2); + locienVal |= (1U << irqOrder); + WRITE_CUSTOM_CSR_VAL(LOCIEN2, locienVal); + } + + RISCV_PRIV_MODE_SWITCH(priv); + + return BASE_STATUS_OK; +} + +/** + * @brief Disable the specified interrupt. + * @param irqNum External interrupt number. + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_NOT_CREATED. + */ +unsigned int IRQ_DisableN(unsigned int irqNum) +{ + unsigned int irqOrder; +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + INTERRUPT_PARAM_CHECK_WITH_RET((g_irqCallbackFunc[irqNum].pfnHandler != IRQ_DummyHandler), IRQ_ERRNO_NOT_CREATED); + + RISCV_PRIV_MODE_SWITCH(priv); + + if (irqNum < IRQ_MIE_TOTAL_CNT) { + irqOrder = 1U << irqNum; + CLEAR_CSR(mie, irqOrder); + } else if (irqNum < IRQ_LOCIEN1_OFFSET) { + irqOrder = 1U << (irqNum - IRQ_MIE_TOTAL_CNT); + CLEAR_CUSTOM_CSR(LOCIEN0, irqOrder); + } else if (irqNum < IRQ_LOCIEN2_OFFSET) { + irqOrder = 1U << (irqNum - IRQ_LOCIEN1_OFFSET); + CLEAR_CUSTOM_CSR(LOCIEN1, irqOrder); + } else { + irqOrder = 1U << (irqNum - IRQ_LOCIEN2_OFFSET); + CLEAR_CUSTOM_CSR(LOCIEN2, irqOrder); + } + + RISCV_PRIV_MODE_SWITCH(priv); + + return BASE_STATUS_OK; +} + +/** + * @brief Print RISCV register. + * @param context. + * @note The actual code is generated by IDE + * @retval None. + */ +__weak void SysErrPrint(const SyserrContext *context) +{ + BASE_FUNC_UNUSED(context); +} + +/** + * @brief System error completion processing + * @param None. + * @retval None. + */ +static void SysErrFinish(void) +{ +} + +/** + * @brief Exception Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrExcEntry(const SyserrContext *context) +{ + SysErrPrint(context); + SysErrFinish(); +} + +/** + * @brief NMI Interrupt Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrNmiEntry(const SyserrContext *context) +{ + INTERRUPT_ASSERT_PARAM(context != NULL); + SysErrPrint(context); + SysErrFinish(); +} +/** + * @brief Set the priority of local interrupt. + * @param intNum GROUP NUM. + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior local int prioroty. + * @retval None + */ +static void SetLocalIntNumPri(unsigned int intNum, unsigned int interPriNum, unsigned int prior) +{ + switch (intNum) { + case 8: /* GROUP8 */ + SET_LOCAL_INTER_NUM_PRI(8, interPriNum, prior); + break; + case 9: /* GROUP9 */ + SET_LOCAL_INTER_NUM_PRI(9, interPriNum, prior); + break; + case 10: /* GROUP10 */ + SET_LOCAL_INTER_NUM_PRI(10, interPriNum, prior); + break; + case 11: /* GROUP11 */ + SET_LOCAL_INTER_NUM_PRI(11, interPriNum, prior); + break; + case 12: /* GROUP12 */ + SET_LOCAL_INTER_NUM_PRI(12, interPriNum, prior); + break; + case 13: /* GROUP13 */ + SET_LOCAL_INTER_NUM_PRI(13, interPriNum, prior); + break; + case 14: /* GROUP14 */ + SET_LOCAL_INTER_NUM_PRI(14, interPriNum, prior); + break; + case 15: /* GROUP15 */ + SET_LOCAL_INTER_NUM_PRI(15, interPriNum, prior); + break; + default: + break; + } +} +/** + * @brief Set the priority of local interrupt. + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior Priority of this local interrupt to be set. + * @retval None. + */ +static void IRQ_SetLocalPriority(unsigned int interPriNum, unsigned int prior) +{ +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + RISCV_PRIV_MODE_SWITCH(priv); + unsigned int intNum = GET_LOCAL_INTER_CONFIGREG_NUM(interPriNum); + switch (intNum) { + case 0: /* GROUP0 */ + SET_LOCAL_INTER_NUM_PRI(0, interPriNum, prior); + break; + case 1: /* GROUP1 */ + SET_LOCAL_INTER_NUM_PRI(1, interPriNum, prior); + break; + case 2: /* GROUP2 */ + SET_LOCAL_INTER_NUM_PRI(2, interPriNum, prior); + break; + case 3: /* GROUP3 */ + SET_LOCAL_INTER_NUM_PRI(3, interPriNum, prior); + break; + case 4: /* GROUP4 */ + SET_LOCAL_INTER_NUM_PRI(4, interPriNum, prior); + break; + case 5: /* GROUP5 */ + SET_LOCAL_INTER_NUM_PRI(5, interPriNum, prior); + break; + case 6: /* GROUP6 */ + SET_LOCAL_INTER_NUM_PRI(6, interPriNum, prior); + break; + case 7: /* GROUP7 */ + SET_LOCAL_INTER_NUM_PRI(7, interPriNum, prior); + break; + default: + SetLocalIntNumPri(intNum, interPriNum, prior); + break; + } + RISCV_PRIV_MODE_SWITCH(priv); +} + +/** + * @brief Set the priority of external interrupt. + * @param irqNum External interrupt number. + * @param priority. + * @retval IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_PRIORITY_INVALID or BASE_STATUS_OK. + */ +unsigned int IRQ_SetPriority(unsigned int irqNum, unsigned int priority) +{ + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + INTERRUPT_PARAM_CHECK_WITH_RET((priority >= IRQ_PRIO_LOWEST && priority <= IRQ_PRIO_HIGHEST), \ + IRQ_ERRNO_PRIORITY_INVALID); + + /* The locipri register is specifically used to configure the priority of the + external non-standard interrupts of the CPU, so the number of internal + standard interrupts should be subtracted */ + IRQ_SetLocalPriority(irqNum - IRQ_VECTOR_CNT, priority); + + return BASE_STATUS_OK; +} +/** + * @brief Get the priority of local interrupt. + * @param intNum GROUP NUM. + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior local int prioroty. + * @retval None + */ +static void GetLocaIntNumPri(unsigned int intNum, unsigned int interPriNum, unsigned int prior) +{ + switch (intNum) { + case 8: /* GROUP8 */ + GET_LOCAL_INTER_NUM_PRI(8, interPriNum, prior); + break; + case 9: /* GROUP9 */ + GET_LOCAL_INTER_NUM_PRI(9, interPriNum, prior); + break; + case 10: /* GROUP10 */ + GET_LOCAL_INTER_NUM_PRI(10, interPriNum, prior); + break; + case 11: /* GROUP11 */ + GET_LOCAL_INTER_NUM_PRI(11, interPriNum, prior); + break; + case 12: /* GROUP12 */ + GET_LOCAL_INTER_NUM_PRI(12, interPriNum, prior); + break; + case 13: /* GROUP13 */ + GET_LOCAL_INTER_NUM_PRI(13, interPriNum, prior); + break; + case 14: /* GROUP14 */ + GET_LOCAL_INTER_NUM_PRI(14, interPriNum, prior); + break; + case 15: /* GROUP15 */ + GET_LOCAL_INTER_NUM_PRI(15, interPriNum, prior); + break; + default: + break; + } +} + +/** + * @brief Get the priority of local interrupt. + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @retval prior Priority of this local interrupt to be set. + */ +static unsigned int IRQ_GetLocalPriority(unsigned int interPriNum) +{ +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + unsigned int prior = 0; + RISCV_PRIV_MODE_SWITCH(priv); + unsigned int intNum = GET_LOCAL_INTER_CONFIGREG_NUM(interPriNum); + switch (intNum) { + case 0: /* GROUP0 */ + GET_LOCAL_INTER_NUM_PRI(0, interPriNum, prior); + break; + case 1: /* GROUP1 */ + GET_LOCAL_INTER_NUM_PRI(1, interPriNum, prior); + break; + case 2: /* GROUP2 */ + GET_LOCAL_INTER_NUM_PRI(2, interPriNum, prior); + break; + case 3: /* GROUP3 */ + GET_LOCAL_INTER_NUM_PRI(3, interPriNum, prior); + break; + case 4: /* GROUP4 */ + GET_LOCAL_INTER_NUM_PRI(4, interPriNum, prior); + break; + case 5: /* GROUP5 */ + GET_LOCAL_INTER_NUM_PRI(5, interPriNum, prior); + break; + case 6: /* GROUP6 */ + GET_LOCAL_INTER_NUM_PRI(6, interPriNum, prior); + break; + case 7: /* GROUP7 */ + GET_LOCAL_INTER_NUM_PRI(7, interPriNum, prior); + break; + default: + GetLocaIntNumPri(intNum, interPriNum, prior); + break; + } + RISCV_PRIV_MODE_SWITCH(priv); + return prior; +} +/** + * @brief Get the priority of external interrupt. + * @param irqNum External interrupt number. + * @output priority. + * @retval IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_PRIORITY_INVALID or BASE_STATUS_OK. + */ +unsigned int IRQ_GetPriority(unsigned int irqNum, unsigned int *priority) +{ + INTERRUPT_PARAM_CHECK_WITH_RET(irqNum < IRQ_MAX, IRQ_ERRNO_NUM_INVALID); + + /* The locipri register is specifically used to configure the priority of the + external non-standard interrupts of the CPU, so the number of internal + standard interrupts should be subtracted */ + *priority = IRQ_GetLocalPriority(irqNum - IRQ_VECTOR_CNT); + + return BASE_STATUS_OK; +} + +/** + * @brief Clear all external interrupts + * @retval BASE_STATUS_OK or IRQ_ERRNO_NOT_CREATED + */ +unsigned int IRQ_ClearAll(void) +{ + unsigned int index; + for (index = IRQ_VECTOR_CNT; index < IRQ_MAX; index++) { + IRQ_ClearN(index); + } + return BASE_STATUS_OK; +} + +/** + * @brief Interrupt dummy handler + * @param arg Not used + * @retval None. + */ +static void IRQ_DummyHandler(void *arg) +{ + BASE_FUNC_UNUSED(arg); +} + +/** + * @brief Construct a new irq setcallback object + * @param irqNum external interrupt number + * @param func callback function + * @param arg callback arg + * @retval None. + */ +static inline void IRQ_SetCallBack(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + g_irqCallbackFunc[irqNum].param = arg; + g_irqCallbackFunc[irqNum].pfnHandler = func; +} + +/** + * @brief Get CPU Privilege by ecall + * @param none + * @retval mcause value + */ +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) +static inline unsigned int IRQ_GetCpuPrivilege(void) +{ + return (g_RiscvPrivMode == 0) ? RISCV_U_MODE : RISCV_M_MODE; +} +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/base/src/lock.c b/vendor/others/demo/5-tim_adc/demo/drivers/base/src/lock.c new file mode 100644 index 000000000..764a7cf28 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/base/src/lock.c @@ -0,0 +1,82 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file lock.c + * @author MCU Driver Team + * @brief Provides functions about locks. + */ + +/* Includes ------------------------------------------------------------------ */ +#include "lock.h" + +/* Global Variables----------------------------------------------------------- */ +unsigned int g_baseLock[CHIP_LOCK_TOTAL]; /**< Used to store the hardware lock status */ + +/** + * @brief Attempt to acquire a lock for the specified address. + * @param addr Point to the address where the lock is obtained. + * @retval true, Succeeded in obtaining the lock. + * @retval false, Failed to obtain the lock. The resource has been locked. + */ +bool BASE_FUNC_SoftwareLock(unsigned int * const addr) +{ + BASE_FUNC_PARAMCHECK_WITH_RET(addr, false); + + unsigned int tmpLocked = *addr; + *addr = BASE_STATUS_LOCKED; + /* Atomic exchange instructions are not supported. Lock determination and locking may be interrupted by */ + /* interrupts. To ensure atomicity, disable the corresponding interrupts. */ + if (tmpLocked == BASE_STATUS_UNLOCKED) { + return true; + } + return false; +} + +/** + * @brief Releases the lock of the specified address. + * @param addr Point to the address that releases the lock. + * @retval None. + */ +void BASE_FUNC_SoftwareUnLock(unsigned int * const addr) +{ + BASE_FUNC_PARAMCHECK_NO_RET(addr); + + *addr = BASE_STATUS_UNLOCKED; +} + +/** + * @brief Attempt to acquire a lock on the specified hardware resource by hwIndex. + * @param hwIndex Hardware Resource ID. + * @retval true, Succeeded in obtaining the Hardware Resource lock. + * @retval false, Failed to obtain the Hardware Resource lock. The resource has been locked. + */ +bool BASE_FUNC_HardwareLock(CHIP_LockType const hwIndex) +{ + BASE_FUNC_PARAMCHECK_WITH_RET((hwIndex >= 0 && hwIndex < CHIP_LOCK_TOTAL), false); + return BASE_FUNC_SoftwareLock(&g_baseLock[hwIndex]); +} + +/** + * @brief Releases the lock of a specified hardware resource. + * @param hwIndex Hardware Resource ID. + * @retval None. + */ +void BASE_FUNC_HardwareUnLock(CHIP_LockType const hwIndex) +{ + BASE_FUNC_PARAMCHECK_NO_RET(hwIndex >= 0 && hwIndex < CHIP_LOCK_TOTAL); + BASE_FUNC_SoftwareUnLock(&g_baseLock[hwIndex]); +} diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/base/src/reset.c b/vendor/others/demo/5-tim_adc/demo/drivers/base/src/reset.c new file mode 100644 index 000000000..c7c4e0858 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/base/src/reset.c @@ -0,0 +1,41 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file reset.c + * @author MCU Driver Team + * @brief Provides functions related to software reset. + */ + +/* Includes ------------------------------------------------------------------ */ +#include "reset.h" +#include "crg_ip.h" + +/** + * @brief Soft reset interface + * @retval None. + */ +void BASE_FUNC_SoftReset(void) +{ + DCL_SYSCTRL_ScWriteProtectionDisable(); + /* Set core clock as CRG_CORE_CLK_SELECT_HOSC. */ + DCL_CRG_SetCoreClkSel(CRG, CRG_CORE_CLK_SELECT_HOSC); + DCL_SYSCTRL_SoftReset(); + + while (1) { + __asm__ volatile ("nop"); + } +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/can/common/inc/can.h b/vendor/others/demo/5-tim_adc/demo/drivers/can/common/inc/can.h new file mode 100644 index 000000000..b9f2e930a --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/can/common/inc/can.h @@ -0,0 +1,110 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file can.h + * @author MCU Driver Team + * @brief CAN module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the CAN. + * + Definition of the CAN handle structure. + * + Initialization and de-initialization functions. + * + Sending and receiving CAN data frames functions. + * + Interrupt handler function and user registration callback function. + */ + +/* Includes ------------------------------------------------------------------*/ +#ifndef McuMagicTag_CAN_H +#define McuMagicTag_CAN_H + +#include "can_ip.h" + + +/** + * @defgroup CAN CAN + * @brief CAN module. + * @{ + */ + +/** + * @defgroup CAN_Common CAN Common + * @brief CAN common external module. + * @{ + */ + +/** + * @defgroup CAN_Handle_Definition ADC Handle Definition + * @{ + */ + +/** + * @brief Definition of the CAN handle structure. + */ +typedef struct _CAN_Handle { + CAN_RegStruct *baseAddress; /**< CAN registers base address */ + CAN_TypeMode typeMode; /**< Work mode */ + CAN_TestMode_Configure *testModeConfigure; /**< Test mode configure */ + CAN_Seg1_Phase seg1Phase; /**< Seg1Phase: Phase Buffer Section 1, propagation section */ + CAN_Seg2_Phase seg2Phase; /**< Seg2Phase: Phase Buffer Section 2 */ + unsigned int prescalser; /**< CAN frequency divider, range: 1 ~ 64 */ + CAN_Sync_Jump_Width sjw; /**< Sync jump width coefficient */ + volatile CAN_State_Type state; /**< Transmit status of the CAN. */ + volatile CANFrame *rxFrame; /**< Rx buff */ + CAN_FilterConfigure *rxFilter; /**< Received Frame Filtering Configuration */ + unsigned int rxFIFODepth; /**< Number of receive FIFO composed by packet objects */ + bool autoRetrans; /**< Automatic retransmission of interfered message */ + + CAN_UserCallBack userCallBack; /**< User call back function of CAN */ + CAN_ExtendHandle handleEx; /**< CAN extend handle */ +} CAN_Handle; + +typedef void (* CAN_CallbackType)(void *handle); +/** + * @} + */ + +/** + * @defgroup CAN_API_Declaration CAN HAL API + * @{ + */ +BASE_StatusType HAL_CAN_Init(CAN_Handle *canHandle); +BASE_StatusType HAL_CAN_DeInit(CAN_Handle *canHandle); +BASE_StatusType HAL_CAN_ReadIT(CAN_Handle *canHandle, CANFrame *data, CAN_FilterConfigure *filterConfigure); +BASE_StatusType HAL_CAN_Write(CAN_Handle *canHandle, CANFrame *data); + +/* CAN status */ +CAN_ErrorStatus HAL_CAN_GetErrorStatus(CAN_Handle *canHandle); +unsigned int HAL_CAN_GetErrorStatusCode(CAN_Handle *canHandle); +CAN_BusOffStatus HAL_CAN_GetBusOffStatus(CAN_Handle *canHandle); +CAN_MessageReceiveStatus HAL_CAN_MessageReceiveStatus(CAN_Handle *canHandle); +CAN_MessageSendStatus HAL_CAN_MessageSendStatus(CAN_Handle *canHandle); +/* CAN interrupt service funciton. */ +void HAL_CAN_IrqHandler(void *handle); +BASE_StatusType HAL_CAN_RegisterCallBack(CAN_Handle *canHandle, CAN_CallBackFunType typeID, + CAN_CallbackType pCallback); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_CAN_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/can/inc/can_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/can/inc/can_ip.h new file mode 100644 index 000000000..f25c3836c --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/can/inc/can_ip.h @@ -0,0 +1,1738 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file can_ip.h + * @author MCU Driver Team + * @brief CAN module driver. + * @details This file provides DCL functions to manage CAN and Definition of + * specific parameters + * + Definition of CAN configuration parameters. + * + CAN register mapping structure. + * + Parameters check functions. + * + Direct configuration layer interface + */ + +/* Macro definitions */ +#ifndef McuMagicTag_CAN_IP_H +#define McuMagicTag_CAN_IP_H + +#define PRESCALSER_MIN 1 +#define PRESCALSER_MAX 64 + +#define MESSAGE_NUMBER_MIN 1 +#define MESSAGE_NUMBER_MAX 32 + +#ifdef CAN_PARAM_CHECK +#define CAN_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define CAN_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define CAN_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define CAN_ASSERT_PARAM(para) ((void)0U) +#define CAN_PARAM_CHECK_NO_RET(para) ((void)0U) +#define CAN_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +#include "baseinc.h" + +/** + * @addtogroup CAN + * @{ + */ + +/** + * @defgroup CAN_IP CAN_IP + * @brief CAN_IP: can_v0. + * @{ + */ + +/** + * @defgroup CAN_Param_Def CAN Parameters Definition + * @brief Definition of CAN configuration parameters. + * @{ + */ + +/** + * @brief Extent handle definition of CAN + */ +typedef struct { +} CAN_ExtendHandle; + +/** + * @brief Type ID of the callback function registered by the user. + */ +typedef enum { + CAN_WRITE_FINISH = 0x00000000U, + CAN_READ_FINISH = 0x00000001U, + CAN_TRNS_ERROR = 0x00000002U +} CAN_CallBackFunType; + +/** + * @brief Type define of user callback function + */ +typedef struct { + void (* WriteFinishCallBack)(void *handle); /**< CAN tx interrupt complete callback function for users */ + void (* ReadFinishCallBack)(void *handle); /**< CAN rx interrupt complete callback function for users */ + void (* TransmitErrorCallBack)(void *handle); /**< CAN mode error callback function for users */ +} CAN_UserCallBack; + +/** + * @brief CAN state type. + */ +typedef enum { + CAN_STATE_NONE_INIT = 0x00000000U, + CAN_STATE_READY = 0x00000001U, + CAN_STATE_BUSY_TX = 0x00000002U, + CAN_STATE_BUSY_RX = 0x00000003u, +} CAN_State_Type; + +/** + * @brief Error status code: the last error status on the CAN bus. + */ +typedef enum { + CAN_ERROR_NONE = 0x00000000U, + CAN_ERROR_PADDING = 0x00000001U, + CAN_ERROR_FORMAL = 0x00000002U, + CAN_ERROR_ANSWER = 0x00000003U, + CAN_ERROR_BIT1 = 0x00000004U, + CAN_ERROR_BIT0 = 0x00000005U, + CAN_ERROR_CRC = 0x00000006U +} CAN_ERROR_StatusCode; + +/** + * @brief Indicates the error status. + * @details CAN Error Status Code: + * +CAN_ACTIVE_ERROR: active error defined by the CAN protocol; + * +CAN_PASSIVE_ERROR: passive error defined by the CAN protocol. + */ +typedef enum { + CAN_ACTIVE_ERROR = 0x00000000U, + CAN_PASSIVE_ERROR = 0x00000001U +} CAN_ErrorStatus; + +/** + * @brief Bus-off status. + * @details CAN Bus-off Status: + * CAN_BUSSOFF_OFF: The CAN module is not in the bus-off state. + * CAN_BUSSOFF_ON: The CAN module is in the bus-off state. + */ +typedef enum { + CAN_BUSOFF_OFF = 0x00000000U, + CAN_BUSOFF_ON = 0x00000001U +} CAN_BusOffStatus; + +/** + * @brief Status of CAN message receive status. + * @details CAN message receive status: + * CAN_MESSAGE_RECEIVE_OK: receive message success. + * CAN_MESSAGE_RECEIVE_ERROR: receive message error. + */ +typedef enum { + CAN_MESSAGE_RECEIVE_OK = 0x00000000U, + CAN_MESSAGE_RECEIVE_ERROR = 0x00000001U +}CAN_MessageReceiveStatus; + +/** + * @brief Status of CAN message send status. + * @details CAN message receive status: + * CAN_MESSAGE_SEND_OK: send message success. + * CAN_MESSAGE_SEND_ERROR: send message error. + */ +typedef enum { + CAN_MESSAGE_SEND_OK = 0x00000000U, + CAN_MESSAGE_SEND_ERROR = 0x00000001U +}CAN_MessageSendStatus; + +/** + * @brief Work mode select. + */ +typedef enum { + CAN_MODE_NORMAL = 0x00000000U, + CAN_MODE_TEST = 0x00000001U +} CAN_TypeMode; + +/** + * @brief Test status select in test mode. + * @details Mode type: + * + loopBack mode, 1: enabele, rx can receive tx frame ; 0: disable + * + silent mode, 1: enabele, cannot send frame to others; 0: disable + * + basic mode, 1: enable, IF1 used for tx buffer, IF2 used for rx buffer; 0: disable + */ +typedef struct { + unsigned int loopBack; + unsigned int silent; + unsigned int basic; +} CAN_TestMode_Configure; + +/** + * @brief The type of CAN frame. + * @details CAN frame type: + * + CAN_TYPEFRAME_STD_DATA -- Standard data frame + * + CAN_TYPEFRAME_EXT_DATA -- Extended data Frame + * + CAN_TYPEFRAME_STD_REMOTE -- Standard remote frame + * + CAN_TYPEFRAME_EXT_REMOTE -- Extended remote Frame + */ +typedef enum { + CAN_TYPEFRAME_STD_DATA = 0x00000000U, + CAN_TYPEFRAME_EXT_DATA = 0x00000001U, + CAN_TYPEFRAME_STD_REMOTE = 0x00000002U, + CAN_TYPEFRAME_EXT_REMOTE = 0x00000003U +} CAN_TypeFrame; + +/** + * @brief Type of the received frame after filtering. + * @details Filtering receive frame type: + * + CAN_FILTERFRAME_STD_DATA -- Standard data frame + * + CAN_FILTERFRAME_EXT_DATA -- Extended data frame + * + CAN_FILTERFRAME_STD_EXT_DATA -- Standard remote frame + */ +typedef enum { + CAN_FILTERFRAME_STD_DATA = 0x00000000U, + CAN_FILTERFRAME_EXT_DATA = 0x00000001U, + CAN_FILTERFRAME_STD_EXT_DATA = 0x00000002U +} CAN_FilterFrame; + +/** + * @brief Time quanta of phase buffer section 1 and propagation section. + */ +typedef enum { + CAN_SEG1_2TQ = 0x00000002U, + CAN_SEG1_3TQ = 0x00000003U, + CAN_SEG1_4TQ = 0x00000004U, + CAN_SEG1_5TQ = 0x00000005U, + CAN_SEG1_6TQ = 0x00000006U, + CAN_SEG1_7TQ = 0x00000007U, + CAN_SEG1_8TQ = 0x00000008U, + CAN_SEG1_9TQ = 0x00000009U, + CAN_SEG1_10TQ = 0x0000000AU, + CAN_SEG1_11TQ = 0x0000000BU, + CAN_SEG1_12TQ = 0x0000000CU, + CAN_SEG1_13TQ = 0x0000000DU, + CAN_SEG1_14TQ = 0x0000000EU, + CAN_SEG1_15TQ = 0x0000000FU, + CAN_SEG1_16TQ = 0x00000010U +} CAN_Seg1_Phase; + +/** + * @brief Time quanta of phase buffer section 2. + */ +typedef enum { + CAN_SEG2_1TQ = 0x00000001U, + CAN_SEG2_2TQ = 0x00000002U, + CAN_SEG2_3TQ = 0x00000003U, + CAN_SEG2_4TQ = 0x00000004U, + CAN_SEG2_5TQ = 0x00000005U, + CAN_SEG2_6TQ = 0x00000006U, + CAN_SEG2_7TQ = 0x00000007U, + CAN_SEG2_8TQ = 0x00000008U +} CAN_Seg2_Phase; + +/** + * @brief Time quanta of Sync Jump Width. + */ +typedef enum { + CAN_SJW_1TQ = 0x00000001U, + CAN_SJW_2TQ = 0x00000002U, + CAN_SJW_3TQ = 0x00000003U, + CAN_SJW_4TQ = 0x00000004U +} CAN_Sync_Jump_Width; + +/** + * @brief Error status code: the last error status on the CAN bus. + */ +typedef enum { + CAN_WRITE_MASK = 0x00000008U, + CAN_READ_MASK = 0x00000010U, + CAN_EPASS_MASK = 0x00000020U, + CAN_EWARN_MASK = 0x00000040U, + CAN_BOFF_MASK = 0x00000080U, +} CAN_StatusMask; + +/** + * @brief CAN data frame format. + */ +typedef struct { + CAN_TypeFrame type; + unsigned int dataLength; + unsigned int CANId; + unsigned char frame[8]; +} CANFrame; + +/** + * @brief Received frame filtering configuration parameters. + */ +typedef struct { + CAN_FilterFrame receiveType; + unsigned int filterID; + unsigned int filterMask; +} CAN_FilterConfigure; + +/** + * @brief Bit timing parameters. + */ +typedef struct { + unsigned int Tseg2 : 3; + unsigned int Tseg1 : 4; + unsigned int SJW : 2; + unsigned int BRP : 1; +} Bit_Timing; +/** + * @} + */ + +/** + * @defgroup CAN_Reg_Def CAN Register Definition + * @brief CAN register mapping structure. + * @{ + */ + +/** + * @brief CAN control register, Control of basic functions. + */ +typedef union { + unsigned int reg; + struct { + unsigned int Init : 1; /**< Initialization enable. */ + unsigned int IE : 1; /**< Module interrupt enable. */ + unsigned int SIE : 1; /**< Status change interrupt enable. */ + unsigned int EIE : 1; /**< Error interrupt enable. */ + unsigned int reserved0 : 1; + unsigned int DAR : 1; /**< Automatic retransmission enable. */ + unsigned int CCE : 1; /**< Configuration change enable. */ + unsigned int Test : 1; /**< Test mode enable. */ + unsigned int reserved1 : 24; + } BIT; +} volatile CAN_CONTROL_REG; + +/** + * @brief CAN status register register.CAN error count register + */ +typedef union { + unsigned int reg; + struct { + unsigned int LEC : 3; /**< Error status code, used to indicate last error status on CAN bus. */ + unsigned int TxOk : 1; /**< Indicates the packet sending status. */ + unsigned int RxOk : 1; /**< Indicates the packet receiving status. */ + unsigned int Epass : 1; /**< Indicates the error status. */ + unsigned int Ewarn : 1; /**< Warning status. */ + unsigned int Boff : 1; /**< Bus-off status. */ + unsigned int reserved0 : 24; + } BIT; +} volatile CAN_STATUS_REG; + +/** + * @brief CAN error count register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int TEC : 8; /**< Indicates transmission error counter. */ + unsigned int REC : 7; /**< Receive error counter. */ + unsigned int RP : 1; /**< Indicates passive error reception status. */ + unsigned int reserved0 : 16; + } BIT; +} volatile CAN_ERROR_COUNTER_REG; + +/** + * @brief bit time register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int BRP : 6; /**< Baud rate coefficient. */ + unsigned int SJW : 2; /**< Resync jump width. */ + unsigned int TSeg1 : 4; /**< Phase buffer segment 1. */ + unsigned int TSeg2 : 3; /**< Phase buffer segment 2. */ + unsigned int reserved0 : 17; + } BIT; +} volatile BIT_TIMING_REG; + +/** + * @brief CAN interrupt register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int IntId : 16; /**< Interrupt packet object ID. */ + unsigned int reserved0 : 16; + } BIT; +} volatile CAN_INTERRUPT_REG; + +/** + * @brief CAN test register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int : 2; + unsigned int Basic : 1; /**< Basic mode enable. */ + unsigned int Silent : 1; /**< Silent mode enable. */ + unsigned int Lback : 1; /**< Loop back mode enable. */ + unsigned int Tx : 2; /**< CAN_TX pin control. */ + unsigned int Rx : 1; /**< Monitors the CAN_RX pin. */ + unsigned int reserved0 : 24; + } BIT; +} volatile CAN_TEST_REG; + +/** + * @brief Baud rate coefficient extension register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int BRPE : 4; /**< Baud rate coefficient expansion. */ + unsigned int reserved0 : 28; + } BIT; +} volatile BRP_EXTENSION_REG; + +/** + * @brief Request register for IF1 command. + */ +typedef union { + unsigned int reg; + struct { + unsigned int MessageNumber : 6; /**< Message object serial number. */ + unsigned int reserved0 : 9; + unsigned int BUSY : 1; /**< Busy signal. */ + unsigned int reserved1 : 16; + } BIT; +} volatile IF1_COMMAND_REQUEST_REG; + +/** + * @brief IF1 command mask register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int DataB : 1; /**< Command mask, which controls the transmission of IF1_DATAB. */ + unsigned int DataA : 1; /**< Command mask, which controls the transmission of IF1_DATAA. */ + unsigned int TxRqstNewDat : 1; /**< Command mask, which controls the TxRqst bit or NewDat bit of + the packet object. */ + unsigned int ClrIntPnd : 1; /**< Command mask, which is used to clear the interrupts of the + packet object to be processed. */ + unsigned int Control : 1; /**< Command mask, which controls the transmission of IF1_MESSAGE_CONTROL. */ + unsigned int Arb : 1; /**< Command mask, which controls the transmission of IF1_ARBITRATION. */ + unsigned int Mask : 1; /**< Command mask, which controls the transmission of IF1_MASK.*/ + unsigned int WRRD : 1; /**< Read/Write command, which controls the transfer direction + of the IF1 packet buffer register and Message RAM. */ + unsigned int reserved0 : 24; + } BIT; +} volatile IF1_COMMAND_MASK_REG; + +/** + * @brief IF1 mask register 1. + */ +typedef union { + unsigned int reg; + struct { + unsigned int Msk : 16; /**< Mask of the 15th to 0th bits of the packet object ID + which are used for packet receiving and filtering. */ + unsigned int reserved0 : 16; + } BIT; +} volatile IF1_MASK1_REG; + +/** + * @brief IF1 mask register 2. + */ +typedef union { + unsigned int reg; + struct { + unsigned int Msk : 13; /**< Mask of the 28th to 16th bits of the packet object ID + which are used to filter received packets. */ + unsigned int reserved0 : 1; + unsigned int MDir : 1; /**< Indicates the direction bit mask of the packet object + which is used for filtering received packets. */ + unsigned int MXtd : 1; /**< Indicates the extended ID (Xtd) mask of the packet object + which is used for filtering received packets. */ + unsigned int reserved1 : 16; + } BIT; +} volatile IF1_MASK2_REG; + +/** + * @brief IF1 arbitration register 1. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ID : 16; /**< Bits 15 to 0 of the packet ID of the packet object. */ + unsigned int reserved0 : 16; + } BIT; +} volatile IF1_ARBITRATION1_REG; + +/** + * @brief IF1 arbitration register 2. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ID : 13; /**< Bits 28 to 16 of packet ID of packet object. */ + unsigned int Dir : 1; /**< Indicates direction of the packet object. */ + unsigned int Xtd : 1; /**< Indicates format of received and sent frames of packet object. */ + unsigned int MsgVal : 1; /**< Packet object validity enable. */ + unsigned int reserved0 : 16; + } BIT; +} volatile IF1_ARBITRATION2_REG; + +/** + * @brief IF1 packet control register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int DLC : 4; /**< Data length. */ + unsigned int reserved0 : 3; + unsigned int EoB : 1; /**< Indicates the multi-packet receiving mode. */ + unsigned int TxRqst : 1; /**< Transfer request. */ + unsigned int RmtEn : 1; /**< Remote frame enable. */ + unsigned int RxIE : 1; /**< RX interrupt enable. */ + unsigned int TxIE : 1; /**< TX interrupt enable. */ + unsigned int Umask : 1; /**< Indicates whether the packet object uses the packet mask + which is used for packet receiving and filtering. */ + unsigned int IntPnd : 1; /**< Indicates the interrupt to be processed of the packet object. */ + unsigned int MsgLst : 1; /**< Indicates the packet loss flag of the packet object + parameter is valid only when packet object is in the receive direction. */ + unsigned int NewDat : 1; /**< Write status of the new data of the message object. */ + unsigned int reserved1 : 16; + } BIT; +} volatile IF1_MESSAGE_CONTROL_REG; + +/** + * @brief IF1 data A1 register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int DATA0 : 8; /**< CAN frame data byte 0. */ + unsigned int DATA1 : 8; /**< CAN frame data byte 1. */ + unsigned int reserved0 : 16; + } BIT; +} volatile IF1_DATAA1_REG; + +/** + * @brief IF1 data A2 register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int DATA2 : 8; /**< CAN frame data byte 2. */ + unsigned int DATA3 : 8; /**< CAN frame data byte 3. */ + unsigned int reserved0 : 16; + } BIT; +} volatile IF1_DATAA2_REG; + +/** + * @brief IF1 data B1 register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int DATA4 : 8; /**< CAN frame data byte 4. */ + unsigned int DATA5 : 8; /**< CAN frame data byte 5. */ + unsigned int reserved0 : 16; + } BIT; +} volatile IF1_DATAB1_REG; + +/** + * @brief IF1 data B2 register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int DATA6 : 8; /**< CAN frame data byte 6. */ + unsigned int DATA7 : 8; /**< CAN frame data byte 7. */ + unsigned int reserved0 : 16; + } BIT; +} volatile IF1_DATAB2_REG; + +/** + * @brief IF2 command request register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int MessageNumber : 6; /**< Indicates the sequence number of a packet object. */ + unsigned int reserved0 : 9; + unsigned int BUSY : 1; /**< Busy sign. */ + unsigned int reserved1 : 16; + } BIT; +} volatile IF2_COMMAND_REQUEST_REG; + +/** + * @brief IF2 command mask register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int DataB : 1; /**< Command mask, which controls the transmission of IF2_DATAB. */ + unsigned int DataA : 1; /**< Command mask, which controls the transmission of IF2_DATAA. */ + unsigned int TxRqstNewDat : 1;/**< Command mask, which controls TxRqst bit or NewDat bit of packet object. */ + unsigned int ClrIntPnd : 1; /**< Command mask, which is used to clear interrupts of packet + object to be processed. */ + unsigned int Control : 1; /**< Command mask, which controls the transmission of IF2_MESSAGE_CONTROL. */ + unsigned int Arb : 1; /**< Command mask, which controls the transmission of IF2_ARBITRATION. */ + unsigned int Mask : 1; /**< Command mask, which controls the transmission of IF2_MASK. */ + unsigned int WRRD : 1; /**< Read/Write command, which controls the transfer direction of + the IF2 packet buffer register and Message RAM. */ + unsigned int reserved0 : 24; + } BIT; +} volatile IF2_COMMAND_MASK_REG; + +/** + * @brief IF2 mask register 1. + */ +typedef union { + unsigned int reg; + struct { + unsigned int Msk : 16; /**< Mask of the 15th to 0th bits of the packet object ID + which are used for packet receiving and filtering. */ + unsigned int reserved0 : 16; + } BIT; +} volatile IF2_MASK1_REG; + +/** + * @brief IF2 mask register 2. + */ +typedef union { + unsigned int reg; + struct { + unsigned int Msk : 13; /**< Mask of the 28th to 16th bits of the packet object ID + which are used for packet receiving and filtering. */ + unsigned int reserved0 : 1; + unsigned int MDir : 1; /**< Indicates the direction bit mask of the packet object + which is used for packet receiving and filtering. */ + unsigned int MXtd : 1; /**< Extended ID mask (Xtd) of a packet object + which is used for packet receiving and filtering. */ + unsigned int reserved1 : 16; + } BIT; +} volatile IF2_MASK2_REG; + +/** + * @brief IF2 arbitration register 1. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ID : 16; /**< Bits 15 to 0 of the packet ID of the packet object. */ + unsigned int reserved0 : 16; + } BIT; +} volatile IF2_ARBITRATION1_REG; + +/** + * @brief IF2 arbitration register 2. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ID : 13; /**< Bits 28 to 16 of the packet ID of the packet object.*/ + unsigned int Dir : 1; /**< Indicates the direction of the packet object.*/ + unsigned int Xtd : 1; /**< Indicates format of received and sent frames of packet object.*/ + unsigned int MsgVal : 1; /**< Packet object validity enable.*/ + unsigned int reserved0 : 16; + } BIT; +} volatile IF2_ARBITRATION2_REG; + +/** + * @brief IF2 packet control register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int DLC : 4; /**< Data length */ + unsigned int reserved0 : 3; + unsigned int EoB : 1; /**< Indicates the multi-packet receiving mode. */ + unsigned int TxRqst : 1; /**< Transfer request. */ + unsigned int RmtEn : 1; /**< Remote frame enable. */ + unsigned int RxIE : 1; /**< RX interrupt enable. */ + unsigned int TxIE : 1; /**< TX interrupt enable. */ + unsigned int Umask : 1; /**< Indicates whether the packet object uses the packet mask + which is used for packet receiving and filtering. */ + unsigned int IntPnd : 1; /**< Indicates the interrupt to be processed of the packet object. */ + unsigned int MsgLst : 1; /**< Indicates the packet loss flag of the packet object + This parameter is valid only when packet object is in receive direction. */ + unsigned int NewDat : 1; /**< Indicates the frame data ID of the packet object. */ + unsigned int reserved1 : 16; + } BIT; +} volatile IF2_MESSAGE_CONTROL_REG; + +/** + * @brief IF2 data A1 register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int DATA0 : 8; /**< CAN frame data byte 0. */ + unsigned int DATA1 : 8; /**< CAN frame data byte 1. */ + unsigned int reserved0 : 16; + } BIT; +} volatile IF2_DATAA1_REG; + +/** + * @brief IF2 data A2 register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int DATA2 : 8; /**< CAN frame data byte 2. */ + unsigned int DATA3 : 8; /**< CAN frame data byte 3. */ + unsigned int reserved0 : 16; + } BIT; +} volatile IF2_DATAA2_REG; + +/** + * @brief IF2 data B1 register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int DATA4 : 8; /**< CAN frame data byte 4. */ + unsigned int DATA5 : 8; /**< CAN frame data byte 5. */ + unsigned int reserved0 : 16; + } BIT; +} volatile IF2_DATAB1_REG; + +/** + * @brief IF2 data B2 register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int DATA6 : 8; /**< CAN frame data byte 6. */ + unsigned int DATA7 : 8; /**< CAN frame data byte 7. */ + unsigned int reserved0 : 16; + } BIT; +} volatile IF2_DATAB2_REG; + +/** + * @brief Transfer request status register 1. + */ +typedef union { + unsigned int reg; + struct { + unsigned int TxRqst16_1 : 16; /**< Transfer request status. + Each bit of TxRqst16-1 corresponds to packet object 16-1. */ + unsigned int reserved0 : 16; + } BIT; +} volatile TRANSMISSION_REQUEST1_REG; + +/** + * @brief Transfer request status register 2. + */ +typedef union { + unsigned int reg; + struct { + unsigned int TxRqst32_17 : 16; /**< Transfer request status. + Each bit of TxRqst32-17 corresponds to packet objects 32-17. */ + unsigned int reserved0 : 16; + } BIT; +} volatile TRANSMISSION_REQUEST2_REG; + +/** + * @brief New data status register 1. + */ +typedef union { + unsigned int reg; + struct { + unsigned int NewDat16_1 : 16; /**< New data write status. + NewDat16-1 Each bit corresponds to the packet object 16-1. */ + unsigned int reserved0 : 16; + } BIT; +} volatile NEW_DATA1_REG; + +/** + * @brief New data status register 2. + */ +typedef union { + unsigned int reg; + struct { + unsigned int NewDat32_17 : 16; /**< New data write status. + Each bit of NewDat32-17 corresponds to packet objects 32-17. */ + unsigned int reserved0 : 16; + } BIT; +} volatile NEW_DATA2_REG; + +/** + * @brief Interrupt pending status register 1. + */ +typedef union { + unsigned int reg; + struct { + unsigned int IntPnd16_1 : 16; /**< Interrupt Pending Status. + Each bit of IntPnd16-1 corresponds to packet object 16-1. */ + unsigned int reserved0 : 16; + } BIT; +} volatile INTERRUPT_PENDING1_REG; + +/** + * @brief Interrupt pending status register 2. + */ +typedef union { + unsigned int reg; + struct { + unsigned int IntPnd32_17 : 16; /**< Interrupt Pending Status. + Each bit of IntPnd32-17 corresponds to packet objects 32-17. */ + unsigned int reserved0 : 16; + } BIT; +} volatile INTERRUPT_PENDING2_REG; + +/** + * @brief Packet validity status register 1. + */ +typedef union { + unsigned int reg; + struct { + unsigned int MsgVal16_1 : 16; /**< Indicates the validity status of the packet object + Each bit of MsgVal16-1 corresponds to packet object 16-1. */ + unsigned int reserved0 : 16; + } BIT; +} volatile MESSAGE_VALID1_REG; + +/** + * @brief Packet validity status register 2. + */ +typedef union { + unsigned int reg; + struct { + unsigned int MsgVal32_17 : 16; /**< Indicates the validity status of the packet object. + Each bit of MsgVal32-17 corresponds to packet objects 32-17. */ + unsigned int reserved0 : 16; + } BIT; +} volatile MESSAGE_VALID2_REG; + +/** + * @brief Register mapping structure. + */ +typedef struct _CAN_RegStruct { + CAN_CONTROL_REG CAN_CONTROL; /**< CAN control register, Offset address: 0x00000000U. */ + CAN_STATUS_REG CAN_STATUS; /**< CAN status register. Offset address: 0x00000004U.*/ + CAN_ERROR_COUNTER_REG CAN_ERROR_COUNTER; /**< CAN error count register. Offset address: 0x00000008U.*/ + BIT_TIMING_REG BIT_TIMING; /**< Bit time register. Offset address: 0x0000000CU. */ + CAN_INTERRUPT_REG CAN_INTERRUPT; /**< CAN interrupt register. Offset address: 0x00000010U. */ + CAN_TEST_REG CAN_TEST; /**< CAN debug register. Offset address: 0x00000014U. */ + BRP_EXTENSION_REG BRP_EXTENSION; /**< BRP extension register. Offset address: 0x00000018U. */ + char space0[4]; + IF1_COMMAND_REQUEST_REG IF1_COMMAND_REQUEST; /**< IF1 command request register. Offset address: 0x00000020U. */ + IF1_COMMAND_MASK_REG IF1_COMMAND_MASK; /**< IF1 command mask register. Offset address: 0x00000024U. */ + IF1_MASK1_REG IF1_MASK1; /**< IF1 mask register 1. Offset address: 0x00000028U. */ + IF1_MASK2_REG IF1_MASK2; /**< IF1 mask register 2. Offset address: 0x0000002CU. */ + IF1_ARBITRATION1_REG IF1_ARBITRATION1; /**< IF1 arbitration register 1. Offset address: 0x00000030U. */ + IF1_ARBITRATION2_REG IF1_ARBITRATION2; /**< IF1 arbitration register 2. Offset address: 0x00000034U. */ + IF1_MESSAGE_CONTROL_REG IF1_MESSAGE_CONTROL; /**< IF1 packet control register. Offset address: 0x00000038U. */ + IF1_DATAA1_REG IF1_DATAA1; /**< IF1 data A1 register. Offset address: 0x0000003CU. */ + IF1_DATAA2_REG IF1_DATAA2; /**< IF1 data A2 register. Offset address: 0x00000040U. */ + IF1_DATAB1_REG IF1_DATAB1; /**< IF1 data B1 register. Offset address: 0x00000044U. */ + IF1_DATAB2_REG IF1_DATAB2; /**< IF1 data B2 register. Offset address: 0x00000048U. */ + char space1[52]; + IF2_COMMAND_REQUEST_REG IF2_COMMAND_REQUEST; /**< IF2 command request register. Offset address: 0x00000080U. */ + IF2_COMMAND_MASK_REG IF2_COMMAND_MASK; /**< IF2 command mask register. Offset address: 0x00000084U. */ + IF2_MASK1_REG IF2_MASK1; /**< IF2 mask register 1. Offset address: 0x00000088U. */ + IF2_MASK2_REG IF2_MASK2; /**< IF2 mask register 2. Offset address: 0x0000008CU. */ + IF2_ARBITRATION1_REG IF2_ARBITRATION1; /**< IF2 arbitration register 1. Offset address: 0x00000090U. */ + IF2_ARBITRATION2_REG IF2_ARBITRATION2; /**< IF2 arbitration register 2. Offset address: 0x00000094U. */ + IF2_MESSAGE_CONTROL_REG IF2_MESSAGE_CONTROL; /**< IF2 packet control register. Offset address: 0x00000098U.*/ + IF2_DATAA1_REG IF2_DATAA1; /**< IF2 data A1 register. Offset address: 0x0000009CU. */ + IF2_DATAA2_REG IF2_DATAA2; /**< IF2 data A2 register. Offset address: 0x000000A0U. */ + IF2_DATAB1_REG IF2_DATAB1; /**< IF2 data B1 register. Offset address: 0x000000A4U. */ + IF2_DATAB2_REG IF2_DATAB2; /**< IF2 data B2 register. Offset address: 0x000000A8U. */ + char space2[84]; + TRANSMISSION_REQUEST1_REG TRANSMISSION_REQUEST1;/**< Trans_request status reg 1. Offset address: 0x00000100U. */ + TRANSMISSION_REQUEST2_REG TRANSMISSION_REQUEST2;/**< Trans_request status reg 2. Offset address: 0x00000104U. */ + char space3[24]; + NEW_DATA1_REG NEW_DATA1; /**< New data status register 1. Offset address: 0x00000120U. */ + NEW_DATA2_REG NEW_DATA2; /**< New data status register 2. Offset address: 0x00000124U. */ + char space4[24]; + INTERRUPT_PENDING1_REG INTERRUPT_PENDING1; /**< INT pending status reg 1. Offset address: 0x00000140U. */ + INTERRUPT_PENDING2_REG INTERRUPT_PENDING2; /**< INT pending status reg 2. Offset address: 0x00000144U. */ + char space5[24]; + MESSAGE_VALID1_REG MESSAGE_VALID1; /**< Packet validity status reg 1. Offset address: 0x00000160U. */ + MESSAGE_VALID2_REG MESSAGE_VALID2; /**< Packet validity status reg 2. Offset address: 0x00000164U.*/ +} volatile CAN_RegStruct; +/** + * @} + */ + + +/** + * @brief Check CAN typemode parameter. + * @param typemode Work mode, @ref CAN_TypeMode + * @retval bool + */ +static inline bool IsCanMode(CAN_TypeMode typemode) +{ + return (typemode == CAN_MODE_NORMAL) || (typemode == CAN_MODE_TEST); +} + +/** + * @brief Check CAN prescalser parameter. + * @param prescalser Bit timing prescalser. + * @retval bool + */ +static inline bool IsCanPrescalser(unsigned int prescalser) +{ + return prescalser >= PRESCALSER_MIN && prescalser <= PRESCALSER_MAX; +} + +/** + * @brief Check CAN seg1Phase parameter. + * @param seg1Phase Phase buffer section 1, @ref CAN_Seg1_Phase + * @retval bool + */ +static inline bool IsCanSeg1phase(CAN_Seg1_Phase seg1Phase) +{ + return (seg1Phase >= CAN_SEG1_2TQ) && (seg1Phase <= CAN_SEG1_16TQ); +} + +/** + * @brief Check CAN seg2Phase parameter. + * @param seg2Phase Phase buffer section 2, @ref CAN_Seg2_Phase + * @retval bool + */ +static inline bool IsCanSeg2phase(CAN_Seg2_Phase seg2Phase) +{ + return (seg2Phase >= CAN_SEG2_1TQ) && (seg2Phase <= CAN_SEG2_8TQ); +} + +/** + * @brief Check CAN syncJumpWidth parameter. + * @param syncJumpWidth Sync jump width, @ref CAN_Sync_Jump_Width + * @retval bool + */ +static inline bool IsCanSJW(CAN_Sync_Jump_Width syncJumpWidth) +{ + return (syncJumpWidth >= CAN_SJW_1TQ) && (syncJumpWidth <= CAN_SJW_4TQ); +} + +/* Direct configuration layer */ +/** + * @brief CAN bit timing setting. + * @param canx CAN register base address. + * @param bitSetting CAN bit timing parameter, @ref Bit_Timing + * @retval None. + */ +static inline void DCL_CAN_BitSetting(CAN_RegStruct * const canx, Bit_Timing bitSetting) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + CAN_PARAM_CHECK_NO_RET(bitSetting.Tseg1 > 0); + canx->CAN_CONTROL.reg |= 0x00000041U; /* Bit_Timing setting, [0] and [6] bit need are set, others clear */ + unsigned int val = bitSetting.BRP; /* The prescalser is set to the lower 6 bits, [5:0] */ + val |= (bitSetting.SJW) << 6; /* The sjw needs to be shifted leftwards by 6 bits, range : 0~3 */ + val |= (bitSetting.Tseg1) << 8; /* The seg1Phase needs to be shifted leftwards by 8 bits, range : 1~15 */ + val |= (bitSetting.Tseg2) << 12; /* The seg2Phase needs to be shifted leftwards by 12 bits, range : 0~63 */ + canx->BIT_TIMING.reg = val; +} + +/** + * @brief CAN interrupt enable. + * @param canx CAN register base address. + * @retval None. + */ +static inline void DCL_CAN_EnableInterrupt(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_CONTROL.BIT.IE = BASE_CFG_ENABLE; +} + +/** + * @brief CAN interrupt disable. + * @param canx CAN register base address. + * @retval None. + */ +static inline void DCL_CAN_DisableInterrupt(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_CONTROL.BIT.IE = BASE_CFG_DISABLE; +} + +/** + * @brief CAN status interrupt enable. + * @param canx CAN register base address. + * @retval None. + */ +static inline void DCL_CAN_EnableStatusInterrupt(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_CONTROL.BIT.SIE = BASE_CFG_ENABLE; +} + +/** + * @brief CAN status interrupt disable. + * @param canx CAN register base address. + * @retval None. + */ +static inline void DCL_CAN_DisableStatusInterrupt(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_CONTROL.BIT.SIE = BASE_CFG_DISABLE; +} + +/** + * @brief CAN error interrupt enable. + * @param canx CAN register base address. + * @retval None. + */ +static inline void DCL_CAN_EnableErrorInterrupt(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_CONTROL.BIT.EIE = BASE_CFG_ENABLE; +} + +/** + * @brief CAN error interrupt disable. + * @param canx CAN register base address. + * @retval None. + */ +static inline void DCL_CAN_DisableErrorInterrupt(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_CONTROL.BIT.EIE = BASE_CFG_DISABLE; +} + +/** + * @brief Enable Automatic Retransmission + * @param canx CAN register base address. + * @retval None + */ +static inline void DCL_CAN_EnableAutoRetrans(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_CONTROL.BIT.DAR = BASE_CFG_DISABLE; +} + +/** + * @brief Disable Automatic Retransmission + * @param canx CAN register base address. + * @retval None + */ +static inline void DCL_CAN_DisableAutoRetrans(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_CONTROL.BIT.DAR = BASE_CFG_ENABLE; +} + +/** + * @brief Enable CAN test mode + * @param canx CAN register base address. + * @retval None + */ +static inline void DCL_CAN_EnableTestMode(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_CONTROL.BIT.Test = BASE_CFG_ENABLE; +} + +/** + * @brief Disable CAN test mode + * @param canx CAN register base address. + * @retval None + */ +static inline void DCL_CAN_DisableTestMode(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_CONTROL.BIT.Test = BASE_CFG_DISABLE; +} + +/** + * @brief Enable CAN bit timing config + * @param canx CAN register base address. + * @retval None + */ +static inline void DCL_CAN_EnableBitTimingConfig(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_CONTROL.BIT.CCE = BASE_CFG_ENABLE; +} + +/** + * @brief Disable CAN bit timing config + * @param canx CAN register base address. + * @retval None + */ +static inline void DCL_CAN_DisableBitTimingConfig(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_CONTROL.BIT.CCE = BASE_CFG_DISABLE; +} + +/** + * @brief Enable CAN Init. + * @param canx CAN register base address. + * @retval None + */ +static inline void DCL_CAN_EnableInit(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_CONTROL.BIT.Init = BASE_CFG_ENABLE; +} + +/** + * @brief Disable CAN init. + * @param canx CAN register base address. + * @retval None + */ +static inline void DCL_CAN_DisableInit(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_CONTROL.BIT.Init = BASE_CFG_DISABLE; +} + +/** + * @brief Initializes a specified packet object. + * @param canx CAN register base address. + * @param objID ID of message object. + * @retval None. + */ +static inline void DCL_CAN_InitObj(CAN_RegStruct * const canx, unsigned int objID) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + CAN_PARAM_CHECK_NO_RET((objID >= MESSAGE_NUMBER_MIN) && (objID <= MESSAGE_NUMBER_MAX)); + unsigned int busy; + canx->IF1_COMMAND_REQUEST.reg = objID; + do { + busy = canx->IF1_COMMAND_REQUEST.BIT.BUSY; + } while (busy == 0x00000001U); + return; +} + +/** + * @brief Get IF1 CAN status + * @param canx CAN register base address. + * @retval bool: 0 command is being executed, 1 command has been completed. + */ +static inline bool DCL_CAN_GetIF1Status(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF1_COMMAND_REQUEST.BIT.BUSY; +} + +/** + * @brief Setting IF1 message number + * @param canx CAN register base address. + * @param objID message number + * @retval None + */ +static inline void DCL_CAN_SetIF1MessageNumber(CAN_RegStruct * const canx, unsigned int objID) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + CAN_PARAM_CHECK_NO_RET((objID >= MESSAGE_NUMBER_MIN) && (objID <= MESSAGE_NUMBER_MAX)); + canx->IF1_COMMAND_REQUEST.BIT.MessageNumber = objID; +} + +/** + * @brief Query the CAN interrupt generation source. + * @param canx CAN register base address. + * @retval IDs of the packet objects for which the interrupt is generated. + */ +static inline unsigned int DCL_CAN_GetInterruptID(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->CAN_INTERRUPT.reg; +} + +/** + * @brief Confrguration command mask + * @param canx CAN register base address. + * @param maskValue Mask value for command register. + * @retval None + */ +static inline void DCL_CAN_ConfigMaskValue(CAN_RegStruct * const canx, unsigned int maskValue) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF1_COMMAND_MASK.reg = maskValue; +} + +/** + * @brief Get IF2 CAN status. + * @param canx CAN register base address. + * @retval bool: 0 command is being executed, 1 command has been completed. + */ +static inline bool DCL_CAN_GetIF2Status(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF2_COMMAND_REQUEST.BIT.BUSY; +} + +/** + * @brief Setting IF2 message number. + * @param canx CAN register base address. + * @param objID message number. + * @retval None + */ +static inline void DCL_CAN_SetIF2MessageNumber(CAN_RegStruct * const canx, unsigned int objID) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + CAN_PARAM_CHECK_NO_RET((objID >= MESSAGE_NUMBER_MIN) && (objID <= MESSAGE_NUMBER_MAX)); + canx->IF2_COMMAND_REQUEST.BIT.MessageNumber = objID; +} + +/** + * @brief Enable CAN loop back mode. + * @param canx CAN register base address. + * @retval None. + */ +static inline void DCL_CAN_EnableLoopBack(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_TEST.BIT.Lback = BASE_CFG_ENABLE; +} + +/** + * @brief Disable CAN loop back mode. + * @param canx CAN register base address. + * @retval None. + */ +static inline void DCL_CAN_DisableLoopBack(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_TEST.BIT.Lback = BASE_CFG_DISABLE; +} + +/** + * @brief Enable CAN silent mode. + * @param canx CAN register base address. + * @retval None. + */ +static inline void DCL_CAN_EnableSilent(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_TEST.BIT.Silent = BASE_CFG_ENABLE; +} + +/** + * @brief Disable CAN silent mode. + * @param canx CAN register base address. + * @retval None. + */ +static inline void DCL_CAN_DisableSilent(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_TEST.BIT.Silent = BASE_CFG_DISABLE; +} + +/** + * @brief Enable CAN basic mode. + * @param canx CAN register base address. + * @retval None. + */ +static inline void DCL_CAN_EnableBasic(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_TEST.BIT.Basic = BASE_CFG_ENABLE; +} + +/** + * @brief Disable CAN basic mode. + * @param canx CAN register base address. + * @retval None. + */ +static inline void DCL_CAN_DisableBasic(CAN_RegStruct * const canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->CAN_TEST.BIT.Basic = BASE_CFG_DISABLE; +} + +/** + * @brief Config IF1_ARBITRATION1. + * @param canx CAN register base address. + * @param maskValue Mask value for arbitration 1 register. + * @retval None. + */ +static inline void DCL_CAN_ConfigIF1ARBITRATION1(CAN_RegStruct * const canx, unsigned int maskValue) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF1_ARBITRATION1.reg = maskValue; +} + +/** + * @brief Low bit(0-15) obj ID number using IF1. + * @param canx CAN register base address. + * @retval unsigned int: Low bit ID number. + */ +static inline unsigned int DCL_CAN_GetIF1LoWBitObjNumber(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF1_ARBITRATION1.BIT.ID; +} + +/** + * @brief Config IF1_ARBITRATION2. + * @param canx CAN register base address. + * @param maskValue Mask value for arbitration 2 register. + * @retval None. + */ +static inline void DCL_CAN_ConfigIF1ARBITRATION2(CAN_RegStruct * const canx, unsigned int maskValue) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF1_ARBITRATION2.reg = maskValue; +} + +/** + * @brief Config IF2_ARBITRATION1. + * @param canx CAN register base address. + * @param maskValue Mask value for arbitration 1 register. + * @retval None. + */ +static inline void DCL_CAN_ConfigIF2ARBITRATION1(CAN_RegStruct * const canx, unsigned int maskValue) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF2_ARBITRATION1.reg = maskValue; +} + +/** + * @brief Low bit(0-15) obj ID number using IF2. + * @param canx CAN register base address. + * @retval unsigned int: Low bit ID number. + */ +static inline unsigned int DCL_CAN_GetIF2LoWBitObjNumber(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF2_ARBITRATION1.BIT.ID; +} + +/** + * @brief Config IF2_ARBITRATION2. + * @param canx CAN register base address. + * @param maskValue Mask value for arbitration 2 register. + * @retval None + */ +static inline void DCL_CAN_ConfigIF2ARBITRATION2(CAN_RegStruct * const canx, unsigned int maskValue) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF2_ARBITRATION2.reg = maskValue; +} + +/** + * @brief Get objection format of transmitted and received frame of IF2. + * @param canx CAN register base address. + * @retval bool: 0: Message object receives and transmits frames in standard format. + * @retval 1: Message object receives and transmits frames in extended format. + */ +static inline bool DCL_CAN_GetIF2ObjFormat(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF2_ARBITRATION2.BIT.Xtd; +} + +/** + * @brief Get objection format of transmitted and received frame of IF1. + * @param canx CAN register base address. + * @retval bool: 0: Message object receives and transmits frames in standard format. + * @retval 1: Message object receives and transmits frames in extended format. + */ +static inline bool DCL_CAN_GetIF1ObjFormat(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF1_ARBITRATION2.BIT.Xtd; +} + +/** + * @brief Get direction of transmitted and received frame of IF1. + * @param canx CAN register base address. + * @retval bool: 0: Message object is received in receive direction. + * @retval 1: Message object is in transmit direction. + */ +static inline bool DCL_CAN_GetIF1ObjDirection(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF1_ARBITRATION2.BIT.Dir; +} + +/** + * @brief Get the status of whether objection is valid using IF1. + * @param canx CAN register base address. + * @retval bool: 1 message object valid, 0 message object invalid. + */ +static inline bool DCL_CAN_GetIF1ObjStatus(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF1_ARBITRATION2.BIT.MsgVal; +} + +/** + * @brief high bit(16-28) obj ID number using IF1. + * @param canx CAN register base address. + * @retval unsigned int: high bit ID number. + */ +static inline unsigned int DCL_CAN_GetIF1HighBitObjNumber(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF1_ARBITRATION2.BIT.ID; +} + +/** + * @brief Get direction of transmitted and received frame of IF2. + * @param canx CAN register base address. + * @retval bool: 0: Message object is received in receive direction. + * @retval 1: Message object is in transmit direction. + */ +static inline bool DCL_CAN_GetIF2ObjDirection(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF2_ARBITRATION2.BIT.Dir; +} + +/** + * @brief Get the status of whether objection is valid using IF2. + * @param canx CAN register base address. + * @retval bool: 1: message object valid. + * @retval 0: message object invalid. + */ +static inline bool DCL_CAN_GetIF2ObjStatus(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF2_ARBITRATION2.BIT.MsgVal; +} + +/** + * @brief high bit(16-28) obj ID number using IF2 + * @param canx CAN register base address. + * @retval unsigned int: high bit ID number + */ +static inline unsigned int DCL_CAN_GetIF2HighBitObjNumber(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF2_ARBITRATION2.BIT.ID; +} + +/** + * @brief Get obj data length using IF2. + * @param canx CAN register base address. + * @retval unsigned int: data length + */ +static inline unsigned int DCL_CAN_GetIF2ObjDataLength(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF2_MESSAGE_CONTROL.BIT.DLC; +} + +/** + * @brief config message control using IF2 + * @param canx CAN register base address. + * @param messageControlValue Message control command value. + * @retval None + */ +static inline void DCL_CAN_ConfigIF2MessageControl(CAN_RegStruct * const canx, unsigned int messageControlValue) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF2_MESSAGE_CONTROL.reg = messageControlValue; +} + +/** + * @brief Get obj data length using IF1 + * @param canx CAN register base address. + * @retval unsigned int: message object data length + */ +static inline unsigned int DCL_CAN_GetIF1ObjDataLength(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF1_MESSAGE_CONTROL.BIT.DLC; +} + +/** + * @brief config message control using IF1 + * @param canx CAN register base address. + * @param messageControlValue Message control command value. + * @retval None + */ +static inline void DCL_CAN_ConfigIF1MessageControl(CAN_RegStruct * const canx, unsigned int messageControlValue) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF1_MESSAGE_CONTROL.reg = messageControlValue; +} + +/** + * @brief Get A1 data using IF2 + * @param canx CAN register base address. + * @retval byte 1 and byte 2 of data + */ +static inline unsigned int DCL_CAN_GetIF2ObjDataA1(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF2_DATAA1.reg; +} + +/** + * @brief Set A1 data using IF2 + * @param canx CAN register base address. + * @param dataA1 Data of A1. + * @retval None. + */ +static inline void DCL_CAN_SetIF2ObjDataA1(CAN_RegStruct * const canx, unsigned int dataA1) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF2_DATAA1.reg = dataA1; +} + +/** + * @brief Get A2 data using IF2 + * @param canx CAN register base address. + * @retval byte 3 and byte 4 of data + */ +static inline unsigned int DCL_CAN_GetIF2ObjDataA2(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF2_DATAA2.reg; +} + +/** + * @brief Set A2 data using IF2 + * @param canx CAN register base address. + * @param dataA2 Data of A2. + * @retval None. + */ +static inline void DCL_CAN_SetIF2ObjDataA2(CAN_RegStruct * const canx, unsigned int dataA2) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF2_DATAA2.reg = dataA2; +} + +/** + * @brief Get B1 data using IF2 + * @param canx CAN register base address. + * @retval byte 5 and byte 6 of data + */ +static inline unsigned int DCL_CAN_GetIF2ObjDataB1(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF2_DATAB1.reg; +} + +/** + * @brief Set B1 data using IF2, set byte 5 and byte 6 of data. + * @param canx CAN register base address. + * @param dataB1 Data of B1. + * @retval None. + */ +static inline void DCL_CAN_SetIF2ObjDataB1(CAN_RegStruct * const canx, unsigned int dataB1) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF2_DATAB1.reg = dataB1; +} + +/** + * @brief Get B2 data using IF2 + * @param canx CAN register base address. + * @retval byte 7 and byte 8 of data + */ +static inline unsigned int DCL_CAN_GetIF2ObjDataB2(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF2_DATAB2.reg; +} + +/** + * @brief Set B2 data using IF2, set byte 7 and byte 8 of data + * @param canx CAN register base address. + * @param dataB2 Data of B2. + * @retval None. + */ +static inline void DCL_CAN_SetIF2ObjDataB2(CAN_RegStruct * const canx, unsigned int dataB2) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF2_DATAB2.reg = dataB2; +} + +/** + * @brief Get A1 data using IF1. + * @param canx CAN register base address. + * @retval byte 1 and byte 2 of data. + */ +static inline unsigned int DCL_CAN_GetIF1ObjDataA1(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF1_DATAA1.reg; +} + +/** + * @brief Set A1 data using IF1, Set byte 1 and byte 2 of data + * @param canx CAN register base address. + * @param dataA1 Data of A1. + * @retval None. + */ +static inline void DCL_CAN_SetIF1ObjDataA1(CAN_RegStruct * const canx, unsigned int dataA1) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF1_DATAA1.reg = dataA1; +} + +/** + * @brief Get A2 data using IF1 + * @param canx CAN register base address. + * @retval byte 3 and byte 4 of data + */ +static inline unsigned int DCL_CAN_GetIF1ObjDataA2(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF1_DATAA2.reg; +} + +/** + * @brief Set A2 data using IF1, Set byte 3 and byte 4 of data + * @param canx CAN register base address. + * @param dataA2 Data of A2. + * @retval None. + */ +static inline void DCL_CAN_SetIF1ObjDataA2(CAN_RegStruct * const canx, unsigned int dataA2) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF1_DATAA2.reg = dataA2; +} + +/** + * @brief Get B1 data using IF1 + * @param canx CAN register base address. + * @retval byte 5 and byte 6 of data + */ +static inline unsigned int DCL_CAN_GetIF1ObjDataB1(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF1_DATAB1.reg; +} + +/** + * @brief Set B1 data using IF1, Set byte 5 and byte 6 of data + * @param canx CAN register base address. + * @param dataB1 Data of B1. + * @retval None. + */ +static inline void DCL_CAN_SetIF1ObjDataB1(CAN_RegStruct * const canx, unsigned int dataB1) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF1_DATAB1.reg = dataB1; +} + +/** + * @brief Get B2 data using IF1 + * @param canx CAN register base address. + * @retval byte 7 and byte 8 of data + */ +static inline unsigned int DCL_CAN_GetIF1ObjDataB2(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->IF1_DATAB2.reg; +} + +/** + * @brief Set B2 data using IF1, Set byte 7 and byte 8 of data + * @param canx CAN register base address. + * @param dataB2 Data of B2. + * @retval None. + */ +static inline void DCL_CAN_SetIF1ObjDataB2(CAN_RegStruct * const canx, unsigned int dataB2) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF1_DATAB2.reg = dataB2; +} + +/** + * @brief Set IF2 mask + * @param canx CAN register base address. + * @param mask Mask value + * @retval None + */ +static inline void DCL_CAN_SetIF2Mask(CAN_RegStruct * const canx, unsigned int mask) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF2_MASK2.reg = mask; +} + +/** + * @brief Set objection mask using IF2 + * @param canx CAN register base address. + * @param maskChg Mask value. + * @retval None + */ +static inline void DCL_CAN_SetIF2ObjFilterMask(CAN_RegStruct * const canx, unsigned int maskChg) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF2_MASK1.reg = maskChg; +} + +/** + * @brief Set IF1 mask + * @param canx CAN register base address. + * @param mask Mask value. + * @retval None + */ +static inline void DCL_CAN_SetIF1Mask(CAN_RegStruct * const canx, unsigned int mask) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF1_MASK2.reg = mask; +} + +/** + * @brief Set objection mask using IF1 + * @param canx CAN register base address. + * @param maskChg Mask value. + * @retval None + */ +static inline void DCL_CAN_SetIF1ObjFilterMask(CAN_RegStruct * const canx, unsigned int maskChg) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF1_MASK1.reg = maskChg; +} + +/** + * @brief Set command mask using IF2.return + * @param canx CAN register base address. + * @param commandMask command mask value. + * @retval None + */ +static inline void DCL_CAN_SetIF2CommandMask(CAN_RegStruct * const canx, unsigned int commandMask) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + canx->IF2_COMMAND_MASK.reg = commandMask; +} + +/** + * @brief Get Can Status + * @param canx CAN register base address. + * @retval Overall status of the CAN. + */ +static inline unsigned int DCL_CAN_GetStatus(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->CAN_STATUS.reg; +} + +/** + * @brief Get object interrupt ID. + * @param canx CAN register base address. + * @retval Interrupt status of obj 1 to 16 + */ +static inline unsigned int DCL_CAN_GetInterruptPend1(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->INTERRUPT_PENDING1.reg; +} + +/** + * @brief Get objects interrupt ID. + * @param canx CAN register base address. + * @retval Interrupt status of obj 17 to 32 + */ +static inline unsigned int DCL_CAN_GetInterruptPend2(const CAN_RegStruct *canx) +{ + CAN_ASSERT_PARAM(IsCANInstance(canx)); + return canx->INTERRUPT_PENDING2.reg; +} + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_CAN_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/can/src/can.c b/vendor/others/demo/5-tim_adc/demo/drivers/can/src/can.c new file mode 100644 index 000000000..13a403cec --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/can/src/can.c @@ -0,0 +1,663 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file can.c + * @author MCU Driver Team + * @brief CAN module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the CAN. + * + Initialization and de-initialization functions + * + Sending and receiving CAN data frames functions + * + Interrupt handling function and user registration callback function + * + CAN data frame filtering function + */ + +/* Includes ------------------------------------------------------------------*/ +#include "can.h" +#include "interrupt.h" + +/* Macro definitions ---------------------------------------------------------*/ + +#define BOUND_ID 24 /* ObjID 1 ~ 24 used for receive, 25 ~ 32 used for send */ +#define CAN_OBJ_MAXNUM 32 + +#define CAN_EFF_FLAG 0x80000000 /* EFF/SFF is set in the MSB */ +#define CAN_RTR_FLAG 0x40000000 /* Remote transmission request */ +#define CAN_ERR_FLAG 0x20000000 /* Error message frame */ + +/* Valid bits in CAN ID for frame formats */ +#define CAN_STD_MASK 0x000007FF /* Standard frame format (SFF) */ +#define CAN_EXT_MASK 0x1FFFFFFF /* Extended frame format (EFF) */ +#define CAN_ERR_MASK 0x1FFFFFFF /* Omit EFF, RTR, ERR flags */ +#define CAN_TIME_WAIT 11 /* CAN initialization wait time */ + +static unsigned int g_stdRecvMap = 0x00000FFF; +static unsigned int g_extRecvMap = 0x00FFF000; +static unsigned int g_allSendMap = 0xFF000000; +static unsigned int g_allRecvMap = 0x00FFFFFF; + +static unsigned int g_msgObj[CAN_OBJ_MAXNUM] = {0}; + +static BASE_StatusType CAN_ReadCallback(CAN_Handle *canHandle, unsigned int objId); +static BASE_StatusType CAN_ConfigReadReq(CAN_Handle *canHandle, unsigned int objId); +static BASE_StatusType WriteFinishClear(CAN_Handle *canHandle, unsigned int objId); +static void CAN_ReceiveFilter(CAN_Handle *canHandle, const CAN_FilterConfigure *filterConfigure, unsigned int objId); +static void CAN_WaitTime(CAN_Handle *canHandle); +static void CAN_AutoRetrans(CAN_Handle *canHandle); + +/* Initialization and de-initialization functions ----------------------------*/ +/** + * @brief Wait 11 CAN bit time. + * @param canHandle CAN handle. + * @retval void + */ +static void CAN_WaitTime(CAN_Handle *canHandle) +{ + /* CAN clock frequency */ + unsigned int canFrep = HAL_CRG_GetIpFreq((void *)canHandle->baseAddress) / (canHandle->prescalser); + unsigned int waitTime = canFrep / (1 + canHandle->seg1Phase + canHandle->seg2Phase); + /* 1000000 equals 1 us to wait for 11 time bits */ + unsigned int waitTimeCount = CAN_TIME_WAIT * ((1000000) / waitTime); + BASE_FUNC_DelayUs(waitTimeCount); +} + +/** + * @brief CAN Setting Automatic Retransmission. + * @param canHandle CAN handle. + * @retval void + */ +static void CAN_AutoRetrans(CAN_Handle *canHandle) +{ + if (canHandle->autoRetrans == BASE_CFG_DISABLE) { + /* Turn off auto retransmission */ + canHandle->baseAddress->CAN_CONTROL.BIT.DAR = BASE_CFG_ENABLE; + } else { + /* Turn on auto retransmission */ + canHandle->baseAddress->CAN_CONTROL.BIT.DAR = BASE_CFG_DISABLE; + } +} + +/** + * @brief Initialize the CAN hardware configuration and configure parameters based on the specified handle. + * @param canHandle CAN handle. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT + */ +BASE_StatusType HAL_CAN_Init(CAN_Handle *canHandle) +{ + CAN_ASSERT_PARAM(canHandle != NULL); + CAN_ASSERT_PARAM(IsCANInstance(canHandle->baseAddress)); + CAN_PARAM_CHECK_WITH_RET(IsCanMode(canHandle->typeMode), BASE_STATUS_ERROR); /* Check initialization parameters */ + CAN_PARAM_CHECK_WITH_RET(IsCanPrescalser(canHandle->prescalser), BASE_STATUS_ERROR); + CAN_PARAM_CHECK_WITH_RET(IsCanSeg1phase(canHandle->seg1Phase), BASE_STATUS_ERROR); + CAN_PARAM_CHECK_WITH_RET(IsCanSeg2phase(canHandle->seg2Phase), BASE_STATUS_ERROR); + CAN_PARAM_CHECK_WITH_RET(IsCanSJW(canHandle->sjw), BASE_STATUS_ERROR); + unsigned int busy; + /* Step1: init enable */ + canHandle->baseAddress->CAN_CONTROL.BIT.Init = BASE_CFG_ENABLE; + /* Step2: configuration command mask register, set 0xF3 to write into packet objects */ + canHandle->baseAddress->IF1_COMMAND_MASK.reg = 0xF3; + /* Step3 ~ 4: init packet object 1 ~ 32 */ + for (int i = 1; i <= CAN_OBJ_MAXNUM; i++) { + canHandle->baseAddress->IF1_COMMAND_REQUEST.reg = i; + do { + busy = canHandle->baseAddress->IF1_COMMAND_REQUEST.BIT.BUSY; + } while (busy == BASE_CFG_ENABLE); + } + /* Step5: Bit_Timing setting enable, [0]bit and [6]bit need are set, others clear */ + canHandle->baseAddress->CAN_CONTROL.reg = 0x41; + /* Step6: Bit_Timing configuration */ + unsigned int val = canHandle->prescalser - 1; /* The prescalser is set to the lower 6 bits, [5:0] */ + val |= (canHandle->sjw - 1) << 6; /* The sjw needs to be shifted leftwards by 6 bits, [7:6] */ + val |= (canHandle->seg1Phase - 1) << 8; /* The seg1Phase needs to be shifted leftwards by 8 bits, [11:8] */ + val |= (canHandle->seg2Phase - 1) << 12; /* The seg2Phase needs to be shifted leftwards by 12 bits, [14:12] */ + canHandle->baseAddress->BIT_TIMING.reg = val; + /* Step7: setting interrupt configuration, error interrupt and module interrupt */ + canHandle->baseAddress->CAN_CONTROL.reg = 0x0B; + /* Step8: setting automatic retransmission */ + CAN_AutoRetrans(canHandle); + /* Step9: finish init */ + if (canHandle->typeMode == CAN_MODE_TEST && canHandle->testModeConfigure != NULL) { + canHandle->baseAddress->CAN_CONTROL.BIT.Test = BASE_CFG_ENABLE; + canHandle->baseAddress->CAN_TEST.BIT.Lback = canHandle->testModeConfigure->loopBack; + canHandle->baseAddress->CAN_TEST.BIT.Silent = canHandle->testModeConfigure->silent; + canHandle->baseAddress->CAN_TEST.BIT.Basic = canHandle->testModeConfigure->basic; + } + canHandle->baseAddress->CAN_CONTROL.BIT.Init = BASE_CFG_DISABLE; + /* Each packet object configuration before read CAN frame */ + for (int i = 1; i <= CAN_OBJ_MAXNUM; i++) { + if (i <= BOUND_ID) { + CAN_ConfigReadReq(canHandle, i); /* The default configuration is no filter receive */ + } + g_msgObj[i - 1] = 0; + } + CAN_WaitTime(canHandle); + canHandle->state = CAN_STATE_READY; + return BASE_STATUS_OK; +} + +/** + * @brief DeInitialize the CAN and restoring default parameters based on the specified handle. + * @param canHandle CAN handle. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT + */ +BASE_StatusType HAL_CAN_DeInit(CAN_Handle *canHandle) +{ + CAN_ASSERT_PARAM(canHandle != NULL); + CAN_ASSERT_PARAM(IsCANInstance(canHandle->baseAddress)); + canHandle->baseAddress->CAN_CONTROL.reg = BASE_CFG_DISABLE; /* Disables the control register. */ + canHandle->baseAddress->CAN_STATUS.reg = BASE_CFG_DISABLE; /* Clear the status of the CAN. */ + canHandle->userCallBack.ReadFinishCallBack = NULL; /* Clear all user call back function. */ + canHandle->userCallBack.TransmitErrorCallBack = NULL; + canHandle->userCallBack.WriteFinishCallBack = NULL; + canHandle->state = CAN_STATE_NONE_INIT; /* Set the CAN to the uninitialized state. */ + return BASE_STATUS_OK; +} + +/** + * @brief CAN error status. + * @param canHandle CAN handle. + * @retval CAN_ErrorStatus: + * CAN_PASSIVE_ERROR: CAN is in passive error. + * CAN_ACTIVE_ERROR: CAN is in active error. + */ +CAN_ErrorStatus HAL_CAN_GetErrorStatus(CAN_Handle *canHandle) +{ + CAN_ASSERT_PARAM(canHandle != NULL); + CAN_ASSERT_PARAM(IsCANInstance(canHandle->baseAddress)); + CAN_STATUS_REG canStatus; + /* CAN error status reg. */ + canStatus.reg = canHandle->baseAddress->CAN_STATUS.reg; + if (canStatus.BIT.Epass == BASE_CFG_ENABLE) { + return CAN_PASSIVE_ERROR; /* Passive error */ + } + return CAN_ACTIVE_ERROR; /* active error */ +} + +/** + * @brief Return the specified CAN error status code. + * @param canHandle CAN handle. + * @retval CAN bus error status. @ref CAN_ERROR_StatusCode + * @note CAN_ERROR_NONE -- No error normal. + * CAN_ERROR_PADDING -- Filling error. + * CAN_ERROR_FORMAL -- The format is incorrect. + * CAN_ERROR_ANSWER -- response error. + * CAN_ERROR_BIT1 -- Bit 1 error. + * CAN_ERROR_BIT0 -- bit 0 error. + * CAN_ERROR_CRC -- CRC error. + */ +unsigned int HAL_CAN_GetErrorStatusCode(CAN_Handle *canHandle) +{ + CAN_ASSERT_PARAM(canHandle != NULL); + CAN_ASSERT_PARAM(IsCANInstance(canHandle->baseAddress)); + CAN_STATUS_REG canStatus; + canStatus.reg = canHandle->baseAddress->CAN_STATUS.reg; /* Obtains the full status of the CAN. */ + unsigned int errorStatus = canStatus.BIT.LEC; + return errorStatus; +} + +/** + * @brief CAN Bus-off status. + * @param canHandle CAN handle. + * @retval CAN Bus off status: + * CAN_BUSOFF_ON: In bus-off state. + * CAN_BUSOFF_OFF: Not in the bus-off state. + */ +CAN_BusOffStatus HAL_CAN_GetBusOffStatus(CAN_Handle *canHandle) +{ + CAN_ASSERT_PARAM(canHandle != NULL); + CAN_ASSERT_PARAM(IsCANInstance(canHandle->baseAddress)); + CAN_STATUS_REG canStatus; /* CAN status reg. */ + canStatus.reg = canHandle->baseAddress->CAN_STATUS.reg; /* Obtains all status of the CAN. */ + if (canStatus.BIT.Boff == BASE_CFG_ENABLE) { + return CAN_BUSOFF_ON; + } + return CAN_BUSOFF_OFF; +} + +/** + * @brief CAN message receive status. + * @param canHandle CAN handle. + * @retval CAN message receive status: + * CAN_MESSAGE_RECEIVE_OK: message receive successful. + * CAN_MESSAGE_RECEIVE_ERROR: message receive failed. + */ +CAN_MessageReceiveStatus HAL_CAN_MessageReceiveStatus(CAN_Handle *canHandle) +{ + CAN_ASSERT_PARAM(canHandle != NULL); + CAN_ASSERT_PARAM(IsCANInstance(canHandle->baseAddress)); + CAN_STATUS_REG canStatus; + /* Obtains the CAN RX status. */ + canStatus.reg = canHandle->baseAddress->CAN_STATUS.reg; + if (canStatus.BIT.RxOk == BASE_CFG_ENABLE) { + return CAN_MESSAGE_RECEIVE_OK; /* CAN receive succeeded. */ + } + return CAN_MESSAGE_RECEIVE_ERROR; +} + +/** + * @brief CAN message send status. + * @param canHandle CAN handle. + * @retval CAN message send status: + * CAN_MESSAGE_SEND_OK: message send successful. + * CAN_MESSAGE_SEND_ERROR: message send failed. + */ +CAN_MessageSendStatus HAL_CAN_MessageSendStatus(CAN_Handle *canHandle) +{ + CAN_ASSERT_PARAM(canHandle != NULL); + CAN_ASSERT_PARAM(IsCANInstance(canHandle->baseAddress)); + CAN_STATUS_REG canStatus; + /* Obtains the CAN RX status. */ + canStatus.reg = canHandle->baseAddress->CAN_STATUS.reg; + if (canStatus.BIT.TxOk == BASE_CFG_ENABLE) { + return CAN_MESSAGE_SEND_OK; /* CAN send succeeded. */ + } + return CAN_MESSAGE_SEND_ERROR; +} + +/** + * @brief Padding can data frame 8-bit data. + * @param canHandle CAN handle. + * @param data Pointer address of the CAN data frame to be sent, @ref CANFrame + * @retval None. + */ +static void WriteData(CAN_Handle *canHandle, CANFrame *data) +{ + IF1_DATAA1_REG dataA1; + dataA1.BIT.DATA0 = data->frame[0]; /* Data of bit 0 */ + dataA1.BIT.DATA1 = data->frame[1]; /* Data of bit 0 */ + canHandle->baseAddress->IF1_DATAA1 = dataA1; + IF1_DATAA2_REG dataA2; + dataA2.BIT.DATA2 = data->frame[2]; /* Data of bit 2 */ + dataA2.BIT.DATA3 = data->frame[3]; /* Data of bit 3 */ + canHandle->baseAddress->IF1_DATAA2 = dataA2; + IF1_DATAB1_REG dataB1; + dataB1.BIT.DATA4 = data->frame[4]; /* Data of bit 4 */ + dataB1.BIT.DATA5 = data->frame[5]; /* Data of bit 5 */ + canHandle->baseAddress->IF1_DATAB1 = dataB1; + IF1_DATAB2_REG dataB2; + dataB2.BIT.DATA6 = data->frame[6]; /* Data of bit 6 */ + dataB2.BIT.DATA7 = data->frame[7]; /* Data of bit 7 */ + canHandle->baseAddress->IF1_DATAB2 = dataB2; +} + +/** + * @brief Send data immediately. + * @param canHandle CAN handle. + * @param data Pointer address of the CAN data frame to be sent, @ref CANFrame + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT + * @note: + * IF1 and IF2 have the same functions. To facilitate management, + * IF1 is used for sending and IF2 is used for receiving. + */ +BASE_StatusType HAL_CAN_Write(CAN_Handle *canHandle, CANFrame *data) +{ + CAN_ASSERT_PARAM(canHandle != NULL && data != NULL); + CAN_ASSERT_PARAM(IsCANInstance(canHandle->baseAddress)); + CAN_PARAM_CHECK_WITH_RET(data->dataLength <= 8, BASE_STATUS_ERROR); /* CAN frame length: 1 ~ 8 */ + if (canHandle->state != CAN_STATE_READY) { + return BASE_STATUS_BUSY; + } + canHandle->state = CAN_STATE_BUSY_TX; + unsigned int objId = 0; + unsigned int id; + for (int i = BOUND_ID + 1; i <= CAN_OBJ_MAXNUM; i++) { + if (g_msgObj[i - 1] == 0) { + g_msgObj[i - 1] = 1; + objId = i; + break; + } + } + if (objId == 0) { + return BASE_STATUS_ERROR; + } + /* Step1: write id into register arbitration according frame type */ + switch (data->type) { + case CAN_TYPEFRAME_STD_DATA: /* Standard data frame */ + id = (data->CANId & CAN_STD_MASK) << 2; /* Bit[12:2] = CANId */ + id |= 0xA000; /* [15:13] = 0x05 */ + canHandle->baseAddress->IF1_ARBITRATION1.reg = 0x00; + break; + case CAN_TYPEFRAME_EXT_DATA: /* Extended data frame */ + id = (data->CANId & CAN_EXT_MASK) >> 16; /* Bit[12:0] = CANId(28bit~16bit) */ + id |= 0xE000; /* [15:13] = 0x07 */ + canHandle->baseAddress->IF1_ARBITRATION1.reg = (data->CANId & 0xFFFF); /* write lower 16bits CANId */ + break; + case CAN_TYPEFRAME_STD_REMOTE: /* Standard remote frame */ + id = (data->CANId & CAN_EXT_MASK) << 2; /* Bit[12:2] = CANId */ + id |= 0x8000; /* [15:13] = 0x04 */ + canHandle->baseAddress->IF1_ARBITRATION1.reg = 0x00; + break; + case CAN_TYPEFRAME_EXT_REMOTE: /* Extended remote frame */ + id = (data->CANId & CAN_EXT_MASK) >> 16; /* Bit[12:0] = CANId(28bit~16bit) */ + id |= 0xC000; /* [15:13] = 0x06 */ + canHandle->baseAddress->IF1_ARBITRATION1.reg = (data->CANId & 0xFFFF); /* write lower 16bits CANId */ + break; + default: + return BASE_STATUS_ERROR; + } + canHandle->baseAddress->IF1_ARBITRATION2.reg = id; + /* Step2: setting mask register 2 */ + canHandle->baseAddress->IF1_MASK2.reg = 0x8000; + /* Step3: setting mask register 1 */ + canHandle->baseAddress->IF1_MASK1.reg = 0x0000; + /* Step4: setting message control register */ + canHandle->baseAddress->IF1_MESSAGE_CONTROL.reg |= 0x8980; + canHandle->baseAddress->IF1_MESSAGE_CONTROL.BIT.DLC = data->dataLength; + /* Step5: write data to be sent */ + WriteData(canHandle, data); + /* Step6: send configuration to packet objects */ + canHandle->baseAddress->IF1_COMMAND_MASK.reg = 0xF3; + /* Step7: write IF1 request command */ + canHandle->baseAddress->IF1_COMMAND_REQUEST.BIT.MessageNumber = objId; + canHandle->state = CAN_STATE_READY; + return BASE_STATUS_OK; +} + +/** + * @brief Interrupt receiving callback function. + * @param canHandle CAN handle. + * @param objId Indicates the packet object ID. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType CAN_ReadCallback(CAN_Handle *canHandle, unsigned int objId) +{ + CAN_ASSERT_PARAM(canHandle != NULL); + CAN_ASSERT_PARAM(IsCANInstance(canHandle->baseAddress)); + CAN_PARAM_CHECK_WITH_RET(canHandle->rxFrame != NULL, BASE_STATUS_ERROR); + CAN_PARAM_CHECK_WITH_RET((objID >= MESSAGE_NUMBER_MIN) && (objID <= MESSAGE_NUMBER_MAX), BASE_STATUS_ERROR); + unsigned int busy, id, idLow, idHigh, extendedFrame, remoteFrame; + /* Step1: setting request transfer to packet object */ + canHandle->baseAddress->IF2_COMMAND_MASK.reg = 0x7F; /* 0x7F indicates reading data from the packet object */ + /* Step2: Request specififed packet object */ + canHandle->baseAddress->IF2_COMMAND_REQUEST.BIT.MessageNumber = objId; + do { + busy = canHandle->baseAddress->IF2_COMMAND_REQUEST.BIT.BUSY; + } while (busy != 0x00); + /* Step3: Obtains packet information */ + extendedFrame = canHandle->baseAddress->IF2_ARBITRATION2.BIT.Xtd; + remoteFrame = canHandle->baseAddress->IF2_ARBITRATION2.BIT.Dir; + if (extendedFrame == BASE_CFG_ENABLE) { + idLow = canHandle->baseAddress->IF2_ARBITRATION1.BIT.ID; + idHigh = canHandle->baseAddress->IF2_ARBITRATION2.BIT.ID; + id = idLow; + idHigh <<= 16; /* High 16 bits ID */ + id |= idHigh; + canHandle->rxFrame->CANId = id; + id |= CAN_EFF_FLAG; + if (remoteFrame == BASE_CFG_ENABLE) { + id |= CAN_RTR_FLAG; + canHandle->rxFrame->type = CAN_TYPEFRAME_EXT_REMOTE; + } else { + canHandle->rxFrame->type = CAN_TYPEFRAME_EXT_DATA; + } + } else { + id = canHandle->baseAddress->IF2_ARBITRATION2.BIT.ID; + id >>= 2; /* 2: Standard frame CAN id. */ + canHandle->rxFrame->CANId = id; + if (remoteFrame == BASE_CFG_ENABLE) { + id |= CAN_RTR_FLAG; + canHandle->rxFrame->type = CAN_TYPEFRAME_STD_REMOTE; + } else { + canHandle->rxFrame->type = CAN_TYPEFRAME_STD_DATA; + } + } + canHandle->rxFrame->dataLength = canHandle->baseAddress->IF2_MESSAGE_CONTROL.BIT.DLC; + canHandle->rxFrame->frame[0] = canHandle->baseAddress->IF2_DATAA1.BIT.DATA0; /* Data of bit 0 */ + canHandle->rxFrame->frame[1] = canHandle->baseAddress->IF2_DATAA1.BIT.DATA1; /* Data of bit 1 */ + canHandle->rxFrame->frame[2] = canHandle->baseAddress->IF2_DATAA2.BIT.DATA2; /* Data of bit 2 */ + canHandle->rxFrame->frame[3] = canHandle->baseAddress->IF2_DATAA2.BIT.DATA3; /* Data of bit 3 */ + canHandle->rxFrame->frame[4] = canHandle->baseAddress->IF2_DATAB1.BIT.DATA4; /* Data of bit 4 */ + canHandle->rxFrame->frame[5] = canHandle->baseAddress->IF2_DATAB1.BIT.DATA5; /* Data of bit 5 */ + canHandle->rxFrame->frame[6] = canHandle->baseAddress->IF2_DATAB2.BIT.DATA6; /* Data of bit 6 */ + canHandle->rxFrame->frame[7] = canHandle->baseAddress->IF2_DATAB2.BIT.DATA7; /* Data of bit 7 */ + return BASE_STATUS_OK; +} + +/** + * @brief CAN Bus receive filtering configuration. + * @param canHandle CAN handle. + * @param CAN_FilterConfigure handle of filtering configuration, @ref CAN_FilterConfigure + * @param objId Indicates the packet object ID. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static void CAN_ReceiveFilter(CAN_Handle *canHandle, const CAN_FilterConfigure *filterConfigure, unsigned int objId) +{ + unsigned int id, idChg; + unsigned int mask, maskChg; + idChg = filterConfigure->filterID & 0xFFFF; + maskChg = filterConfigure->filterMask & 0xFFFF; + switch (filterConfigure->receiveType) { + case CAN_FILTERFRAME_STD_DATA: + id = (filterConfigure->filterID & CAN_STD_MASK) << 2; /* Bit[12:2] = CANId */ + id |= 0x8000; + idChg = 0x0000; + /* Shift left by 2 bits. The upper 11 bits of [12:0] are used */ + mask = (filterConfigure->filterMask & CAN_STD_MASK) << 2; + mask |= 0xC000; + maskChg = 0x0000; + break; + case CAN_FILTERFRAME_EXT_DATA: + id = (filterConfigure->filterID & CAN_EXT_MASK) >> 16; /* Bit[12:0] = CANId(28bit ~ 16bit) */ + id |= 0xC000; + /* write lower 16bits CANId */ + mask = (filterConfigure->filterMask & CAN_EXT_MASK) >> 16; /* Remove the lower 16 bits */ + mask |= 0xC000; + break; + case CAN_FILTERFRAME_STD_EXT_DATA: + id = (filterConfigure->filterID & CAN_EXT_MASK) >> 16; /* Remove the lower 16 bits */ + id |= 0xC000; + mask = (filterConfigure->filterMask & CAN_EXT_MASK) >> 16; /* Remove the lower 16 bits */ + mask |= 0x4000; /* [15]MXtd = 0 */ + break; + default: + return; + } + canHandle->baseAddress->IF2_ARBITRATION2.reg = id; + canHandle->baseAddress->IF2_ARBITRATION1.reg = idChg; + canHandle->baseAddress->IF2_MASK2.reg = mask; + canHandle->baseAddress->IF2_MASK1.reg = maskChg; + if (canHandle->rxFIFODepth > BOUND_ID) { + canHandle->rxFIFODepth = BOUND_ID; + } + if (objId < canHandle->rxFIFODepth) { /* packet objects form the receiving FIFO */ + canHandle->baseAddress->IF2_MESSAGE_CONTROL.reg = 0x1408; /* EOB is set 0 */ + } else { + canHandle->baseAddress->IF2_MESSAGE_CONTROL.reg = 0x1488; /* EOB is set 1 */ + } + /* Step5: send configuration to packet objects */ + canHandle->baseAddress->IF2_COMMAND_MASK.reg = 0x00F3; + /* Step6: write IF2 request command */ + canHandle->baseAddress->IF2_COMMAND_REQUEST.BIT.MessageNumber = objId; + canHandle->baseAddress->IF2_COMMAND_REQUEST.BIT.BUSY = 0x01; +} + +/** + * @brief Receive CAN data frames asynchronously. + * @param canHandle CAN handle. + * @param data Address for storing CAN data frames, @ref CANFrame + * @param filterConfigure handle of filtering configuration, @ref CAN_FilterConfigure + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_CAN_ReadIT(CAN_Handle *canHandle, CANFrame *data, CAN_FilterConfigure *filterConfigure) +{ + CAN_ASSERT_PARAM(canHandle != NULL); + CAN_ASSERT_PARAM(IsCANInstance(canHandle->baseAddress)); + CAN_PARAM_CHECK_WITH_RET(data != NULL, BASE_STATUS_ERROR); + CAN_PARAM_CHECK_WITH_RET(filterConfigure != NULL, BASE_STATUS_ERROR); + if (canHandle->state != CAN_STATE_READY) { + return BASE_STATUS_BUSY; + } + canHandle->state = CAN_STATE_BUSY_RX; + canHandle->rxFrame = data; + canHandle->rxFilter = filterConfigure; + for (int i = 1; i <= BOUND_ID; i++) { + CAN_ReceiveFilter(canHandle, filterConfigure, i); + } + canHandle->state = CAN_STATE_READY; + return BASE_STATUS_OK; +} + +/** + * @brief Pre-configuration of Receive CAN Data Frames. + * @param canHandle CAN handle. + * @param objId Indicates the packet object ID. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType CAN_ConfigReadReq(CAN_Handle *canHandle, unsigned int objId) +{ + CAN_ASSERT_PARAM(canHandle != NULL); + CAN_ASSERT_PARAM(IsCANInstance(canHandle->baseAddress)); + unsigned int map = 1; + map <<= objId - 1; + /* Step1: write id into register arbitration according frame type */ + if ((map & g_stdRecvMap) != 0) { /* STD DATA FRAME */ + canHandle->baseAddress->IF2_ARBITRATION2.reg = 0x8000; + canHandle->baseAddress->IF2_ARBITRATION1.reg = 0x0000; + } else if ((map & g_extRecvMap) != 0) { /* EXTENDED DATA FRAME */ + canHandle->baseAddress->IF2_ARBITRATION2.reg = 0xC000; + canHandle->baseAddress->IF2_ARBITRATION1.reg = 0x0000; + } else { + return BASE_STATUS_ERROR; + } + /* Step2: setting mask register 2 */ + canHandle->baseAddress->IF2_MASK2.reg = 0xC000; + /* Step3: setting mask register 1 */ + canHandle->baseAddress->IF2_MASK1.reg = 0x0000; + /* Step4: setting message control register. By default, there is no RX FIFO and no filtering is performed */ + canHandle->baseAddress->IF2_MESSAGE_CONTROL.reg = 0x1488; + /* Step5: send configuration to packet objects */ + canHandle->baseAddress->IF2_COMMAND_MASK.reg = 0x00F3; + /* Step6: write IF2 request command */ + canHandle->baseAddress->IF2_COMMAND_REQUEST.BIT.MessageNumber = objId; + canHandle->baseAddress->IF2_COMMAND_REQUEST.BIT.BUSY = BASE_CFG_ENABLE; + return BASE_STATUS_OK; +} + +/** + * @brief The object of the sent packet is cleared. + * @param canHandle CAN handle. + * @param objId Indicates the packet object ID. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType WriteFinishClear(CAN_Handle *canHandle, unsigned int objId) +{ + CAN_ASSERT_PARAM(canHandle != NULL); + CAN_ASSERT_PARAM(IsCANInstance(canHandle->baseAddress)); + unsigned int busy; + canHandle->baseAddress->IF2_COMMAND_MASK.reg = 0x7F; + canHandle->baseAddress->IF2_COMMAND_REQUEST.BIT.MessageNumber = objId; + do { + busy = canHandle->baseAddress->IF2_COMMAND_REQUEST.BIT.BUSY; + } while (busy != 0x00); + return BASE_STATUS_OK; +} + +/** + * @brief Write interrupt service function. + * @param canHandle CAN handle. + * @param irqIndex Packet object interrupt ID. + * @retval None. + */ +static void WriteIrqService(CAN_Handle *canHandle, unsigned int irqIndex) +{ + WriteFinishClear(canHandle, irqIndex); + g_msgObj[irqIndex - 1] = 0; + if (canHandle->userCallBack.WriteFinishCallBack != NULL) { + canHandle->userCallBack.WriteFinishCallBack(canHandle); + } +} + +/** + * @brief Read interrupt service function. + * @param canHandle CAN handle. + * @param irqIndex Packet object interrupt ID. + * @retval None. + */ +static void ReadIrqService(CAN_Handle *canHandle, unsigned int irqIndex) +{ + CAN_ReadCallback(canHandle, irqIndex); + if (canHandle->userCallBack.ReadFinishCallBack != NULL) { + canHandle->userCallBack.ReadFinishCallBack(canHandle); + } +} + +/** + * @brief CAN interrupt service processing function. + * @param handle CAN handle. + * @retval None. + */ +void HAL_CAN_IrqHandler(void *handle) +{ + CAN_ASSERT_PARAM(handle != NULL); + CAN_Handle *canHandle = (CAN_Handle *)handle; + CAN_ASSERT_PARAM(IsCANInstance(canHandle->baseAddress)); + unsigned int irqIndex; + unsigned int idLow, idHigh, id; + irqIndex = canHandle->baseAddress->CAN_INTERRUPT.reg; + /* Status interrupt ID: 0x8000 */ + if (irqIndex == 0x8000) { + /* Offline status of the CAN bus. */ + unsigned int statusBusoff = canHandle->baseAddress->CAN_STATUS.BIT.Boff; + if (statusBusoff == BASE_CFG_ENABLE) { /* true when the bus-off state is displayed. */ + canHandle->baseAddress->CAN_CONTROL.BIT.Init = 0x01; + __asm__ volatile ("nop"); /* Hold-off time */ + canHandle->baseAddress->CAN_CONTROL.BIT.Init = 0x00; + } + if (canHandle->userCallBack.TransmitErrorCallBack != NULL) { + canHandle->userCallBack.TransmitErrorCallBack(canHandle); + } + } else if (irqIndex >= 0x01 && irqIndex <= 0x20) { /* Packet object interrupt ID from 0x01 to 0x20 */ + idLow = canHandle->baseAddress->INTERRUPT_PENDING1.BIT.IntPnd16_1; + idHigh = canHandle->baseAddress->INTERRUPT_PENDING2.BIT.IntPnd32_17; + id = idLow; + id |= idHigh << 16; /* High 16 bits ID */ + if (id & g_allSendMap) { /* Write complete */ + WriteIrqService(canHandle, irqIndex); + } + if (id & g_allRecvMap) { + ReadIrqService(canHandle, irqIndex); + } + } + return; +} + +/** + * @brief Handle CAN interrupt request. + * @param canHandle CAN handle. + * @param typeID Id of callback function type, @ref CAN_CallBackFunType + * @param pCallback Pointer of the specified callbcak function, @ref CAN_CallbackType + * @retval BASE_StatusType: BASE_STATUS_ERROR register error, BASE_STATUS_OK register success. + */ +BASE_StatusType HAL_CAN_RegisterCallBack(CAN_Handle *canHandle, CAN_CallBackFunType typeID, CAN_CallbackType pCallback) +{ + CAN_ASSERT_PARAM(canHandle != NULL); + CAN_ASSERT_PARAM(IsCANInstance(canHandle->baseAddress)); + switch (typeID) { + case CAN_WRITE_FINISH: /* CAN write finish call back. */ + canHandle->userCallBack.WriteFinishCallBack = pCallback; + break; + case CAN_READ_FINISH: /* CAN read finish call back. */ + canHandle->userCallBack.ReadFinishCallBack = pCallback; + break; + case CAN_TRNS_ERROR: /* CAN transmit finish call back. */ + canHandle->userCallBack.TransmitErrorCallBack = pCallback; + break; + default: + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/capm/common/inc/capm.h b/vendor/others/demo/5-tim_adc/demo/drivers/capm/common/inc/capm.h new file mode 100644 index 000000000..eae8fb20b --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/capm/common/inc/capm.h @@ -0,0 +1,186 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file capm.h + * @author MCU Driver Team + * @brief CAPM module driver + * @details This file provides firmware CAPM Handle Structure and functions + * prototypes to manage the following functionalities of the CAPM. + * + CAPM handle structure definition. + * + Initialization and de-initialization functions. + * + CAPM Service Functions. + */ +#ifndef McuMagicTag_CAPM_H +#define McuMagicTag_CAPM_H + +#include "typedefs.h" +#include "dma.h" +#include "capm_ip.h" + +/** + * @defgroup CAPM CAPM + * @brief CAPM module. + * @{ + */ + +/** + * @defgroup CAPM_Common CAPM Common + * @brief CAPM common external module. + * @{ + */ + + +/** + * @defgroup CAPM_Common_Param CAPM Common Parameters + * @{ + */ +#define CAPM_NUM_0 0 +#define CAPM_NUM_1 1 +#define CAPM_NUM_2 2 + +/** + * @brief Capture edge mode + */ +typedef enum { + CAPM_FALLING, + CAPM_RISING, +} CAPM_CapEvent; + +/** + * @brief Reset mode + */ +typedef enum { + CAPM_NOTRESET, + CAPM_RESET, +} CAPM_RegRestMode; + +/** + * @brief Signal level + */ +typedef enum { + CAPM_LOW_LEVEL, + CAPM_UP_EDGE, + CAPM_DOWN_EDGE, + CAPM_HIGHT_LEVEL, +} CAPM_CaptureLevel; + +/** + * @brief Numbers of ECR + */ +typedef enum { + CAPM_ECR_NUM1, + CAPM_ECR_NUM2, + CAPM_ECR_NUM3, + CAPM_ECR_NUM4 +} CAPM_ECRNum; + +/** + * @brief Used ECR of next load + */ +typedef enum { + CAPM_NEXT_LOAD_ECR1, + CAPM_NEXT_LOAD_ECR2, + CAPM_NEXT_LOAD_ECR3, + CAPM_NEXT_LOAD_ECR4, +} CAPM_NextLoadECR; + +/** + * @brief CAPM callback function type + */ +typedef enum { + CAPM_EVT_FINISH = 0x00000000U, + CAPM_DMA_ERROR = 0x00000001U, + CAPM_DMA_FINISH = 0x00000002U +} CAPM_CallbackFuncType; + +/** + * @} + */ + +/** + * @defgroup CAPM_Handle_Definition CAPM Handle Definition + * @{ + */ + +/** + * @brief Configurations of each capture register + */ +typedef struct CapmCapRegConfig { + CAPM_CapEvent capEvent; + CAPM_RegRestMode regReset; +} CAPM_CapRegConfig; + +/** + * @brief The definition of the CAPM handle structure + */ +typedef struct _CAPM_Handle { + CAPM_RegStruct *baseAddress; /**< base address */ + unsigned int tscntDiv; /**< TSR count division, value range: 0~65535 */ + DMA_Handle *dmaHandle; /**< DMA handle */ + unsigned int dmaChannel; /**< Used DMA channel */ + + unsigned int preScale; /**< preScale factor. value range: 0~127 */ + unsigned int deburrNum; /**< deburr level. value range:0~8192. 0: Disable deburr */ + unsigned int useCapNum; /**< number of cap to be use. + value range: 1~CAPM_MAX_CAP_REG_NUM */ + unsigned int triggleDmaReg; /**< which ECR to triggle DMA interrupt. + value range:1 ~ useCapNum */ + unsigned int syncPhs; /**< TSRֵ sync phase value */ + bool enableSync; /**< enable sync */ + CAPM_SyncSrc syncSrc; /**< CAPM synchronized input source */ + unsigned int enableIntFlags; /**< enable interrupt */ + CAPM_CapMode capMode; /**< capture mode. continue or one-shot */ + CAPM_InputSrc inputSrc; /**< capture input source */ + CAPM_CapRegConfig capRegConfig[CAPM_MAX_CAP_REG_NUM]; /**< each capture register configuration */ + CAPM_UserCallBack userCallBack; /**< CAPM Interrupt callback functions.*/ + CAPM_ExtendHandle handleEx; /**< CAPM extend parameter */ +} CAPM_Handle; + +typedef void (* CAPM_CallbackType)(void *handle); +/** + * @} + */ + +/** + * @defgroup CAPM_API_Declaration CAPM HAL API + * @{ + */ +BASE_StatusType HAL_CAPM_Init(CAPM_Handle *handle); +BASE_StatusType HAL_CAPM_DeInit(CAPM_Handle *handle); + +unsigned int HAL_CAPM_GetECRValue(CAPM_Handle *handle, CAPM_ECRNum ecrNum); +unsigned char HAL_CAPM_GetCrtEdge(CAPM_Handle *handle); +unsigned char HAL_CAPM_GetNextLoadECRNum(CAPM_Handle *handle); +BASE_StatusType HAL_CAPM_GetECRValueDMA(CAPM_Handle *handle, unsigned int *saveData, unsigned int dataLength); + +void HAL_CAPM_SetSyncPhs(CAPM_Handle *handle, unsigned int phase); +unsigned int HAL_CAPM_GetSyncPhs(CAPM_Handle *handle); + +void HAL_CAPM_IrqHandler(void *handle); +void HAL_CAPM_RegisterCallback(CAPM_Handle *capmHandle, CAPM_CallbackFuncType typeID, CAPM_CallbackType pCallback); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/capm/inc/capm_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/capm/inc/capm_ip.h new file mode 100644 index 000000000..7fa19345f --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/capm/inc/capm_ip.h @@ -0,0 +1,1854 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file capm_ip.h + * @author MCU Driver Team + * @brief CAPM DCL level module driver. + * @details This file provides DCL functions to manage CAPM and Definition of + * specific parameters. + * + Definition of CAPM configuration parameters. + * + CAPM register mapping structure. + * + Direct configuration layer interface. + */ +#ifndef McuMagicTag_CAPM_IP_H +#define McuMagicTag_CAPM_IP_H + +#include "baseinc.h" +#include "baseaddr.h" + +#ifdef CAPM_PARAM_CHECK +#define CAPM_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define CAPM_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define CAPM_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define CAPM_ASSERT_PARAM(para) ((void)0U) +#define CAPM_PARAM_CHECK_NO_RET(para) ((void)0U) +#define CAPM_PARAM_CHECK_WITH_RET(param, ret) ((void)0U) +#endif + +/** + * @addtogroup CAPM + * @{ + */ + +/** + * @defgroup CAPM_IP CAPM_IP + * @brief CAPM_IP: capm_v1. + * @{ + */ + +/** + * @defgroup CAPM_Param_Def CAPM Parameters Definition + * @brief Definition of CAPM configuration parameters + * @{ + */ + +#define CAPM_IP_VER_MASK 0x0F000000U +#define CAPM_NEXT_LOAD_REG_MASK 0x00000003U +#define CAPM_INTERRUPT_MASK 0x0000001FU +#define CAPM_MAX_FILTER_VALUE 16 +#define CAPM_MAX_PRESCALE 127 +#define CAPM_MAX_CAP_REG_NUM 4 +#define CAPM_MAX_FILTER_LEVEL 0x00001FFFU +#define CAPM_BIT_SHIFT_TWO 2 +#define CAPM_MAX_INTERRUPT_NUMBER 8 + +#define CAPM0_BASEADDR CAPM0 +#define CAPM1_BASEADDR CAPM1 +#define CAPM2_BASEADDR CAPM2 + +/** + * @brief EAR count types. + * @details Count type: + * + CAPM_COUNT_NONE -- EAR do not count + * + CAPM_COUNT_RISING_EDGE -- EAR counting at rising edge + * + CAPM_COUNT_FALLING_EDGE -- EAR counting at falling edge + * + CAPM_COUNT_DOUBLE_EDGE -- EAR counting at rising edge or edge + */ +typedef enum { + CAPM_COUNT_NONE = 0x00000000U, + CAPM_COUNT_RISING_EDGE = 0x00000001U, + CAPM_COUNT_FALLING_EDGE = 0x00000002U, + CAPM_COUNT_DOUBLE_EDGE = 0x00000003U, +} CAPM_CountType; + +/** + * @brief Interrupt types. + * @details Type: + * + CAPM_REG1CAP -- ECR0 interrupt + * + CAPM_REG2CAP -- ECR1 interrupt + * + CAPM_REG3CAP -- ECR2 interrupt + * + CAPM_REG4CAP -- ECR3 interrupt + * + CAPM_TSROVF -- TSR register overflow interrupt + * + CAPM_ECROVF -- ECR register overflow interrupt + * + CAPM_EARCMPMATCH -- EAR compare match interrupt + * + CAPM_EAROVF -- EAR register overflow interrupt + * + CAPM_DMAREQOVF -- DMA require overflow interrupt + */ +typedef enum { + CAPM_REG1CAP = 0x00000001U, + CAPM_REG2CAP = 0x00000002U, + CAPM_REG3CAP = 0x00000004U, + CAPM_REG4CAP = 0x00000008U, + CAPM_TSROVF = 0x00000010U, + CAPM_ECROVF = 0x00000020U, + CAPM_EARCMPMATCH = 0x00000040U, + CAPM_EAROVF = 0x00000080U, + CAPM_DMAREQOVF = 0x00000100U, +} CAPM_Interrupt; + +/** + * @brief ECR number to be used. + */ +typedef enum { + CAPM_EVT0 = 0x00000000U, + CAPM_EVT1 = 0x00000001U, + CAPM_EVT2 = 0x00000002U, + CAPM_EVT3 = 0x00000003U, +} CampConfigCapRegNum; + +/** + * @brief CAPM capture mode. + * @details Capture mode: + * + CAPM_CONTINUECAP -- continue cap + * + CAPM_ONESHOTCAP -- one-shot cap + */ +typedef enum { + CAPM_CONTINUECAP = 0x00000000U, /**< continue cap */ + CAPM_ONESHOTCAP = 0x00000001U, /**< one-shot cap */ +} CAPM_CapMode; + +/** + * @brief CAPM capture edge. + * @details Capture edge: + * + CAPM_FALLING_EDGE -- capture falling edge + * + CAPM_RISING_EDGE -- capture rising edge + */ +typedef enum { + CAPM_FALLING_EDGE = 0x00000000U, + CAPM_RISING_EDGE = 0x00000001U, +} CAPM_POLAR; + +/** + * @brief CAPM input source selection. + * @details Capture edge: + * + CAPM_INPUT -- CAPMx_IN + * + CAPM_NONE -- No input source + */ +typedef enum { + CAPM_INPUT = 0x00000000U, + CAPM_NONE = 0x00000001U, +} CAPM_InputSrc; + +/** + * @brief CAPM sync input source selection. + * @details Capture edge: + * + CAPM_SYNC_SRC_NONE -- source none + * + CAPM_SYNC_SRC_APT0 -- source apt0 + * + CAPM_SYNC_SRC_APT1 -- source apt1 + * + CAPM_SYNC_SRC_APT2 -- source apt2 + * + CAPM_SYNC_SRC_APT3 -- source apt3 + * + CAPM_SYNC_SRC_APT4 -- source apt4 + * + CAPM_SYNC_SRC_APT5 -- source apt5 + * + CAPM_SYNC_SRC_APT6 -- source apt6 + * + CAPM_SYNC_SRC_APT7 -- source apt7 + * + CAPM_SYNC_SRC_APT8 -- source apt8 + */ +typedef enum { + CAPM_SYNC_SRC_NONE = 0x00000000U, + CAPM_SYNC_SRC_APT0 = 0x00000001U, + CAPM_SYNC_SRC_APT1 = 0x00000002U, + CAPM_SYNC_SRC_APT2 = 0x00000003U, + CAPM_SYNC_SRC_APT3 = 0x00000004U, + CAPM_SYNC_SRC_APT4 = 0x00000005U, + CAPM_SYNC_SRC_APT5 = 0x00000006U, + CAPM_SYNC_SRC_APT6 = 0x00000007U, + CAPM_SYNC_SRC_APT7 = 0x00000008U, + CAPM_SYNC_SRC_APT8 = 0x00000009U, +} CAPM_SyncSrc; + +/** + * @} + */ + +/** + * @defgroup CAPM_REG_Definition CAPM Register Structure. + * @brief CAPM Register Structure Definition. + * @{ + */ + +/** + * @brief CAPM revision information registers structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved1 : 24; + unsigned int revision : 4; /**< IP version number. */ + unsigned int reserved0 : 4; + } BIT; +} volatile REV_INFO_REG; + +/** + * @brief CAPM time-stamp divider registers structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int tscnt_div : 16; /**< Counter division. */ + unsigned int reserved : 16; + } BIT; +} volatile TSR_DIV_REG; + +/** + * @brief CAPM edge amount registers structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int ear : 16; /**< Edge count value. */ + unsigned int reserved : 16; + } BIT; +} volatile EAR_REG; + +/** + * @brief EAR compare value registers structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int earcmp : 16; /**< Edge count compare value. */ + unsigned int reserved : 16; + } BIT; +} volatile EAR_CMP_REG; + +/** + * @brief Event capture sequence registers structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int nxtldecr : 2; /**< Read next loaded ECR. */ + unsigned int crt_edge : 2; /**< Current input signal level. */ + unsigned int reserved : 28; + } BIT; +} volatile ECSEQR_REG; + +/** + * @brief Filter control registers structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int ft_en : 1; /**< Filter function enable. */ + unsigned int ft_lev : 13; /**< Filter level. */ + unsigned int reserved : 18; + } BIT; +} volatile FTCR_REG; + +/** + * @brief CCR0 registers structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int evt0pol : 1; /**< Event0 capture edge selection. */ + unsigned int evt0rst : 1; /**< Event0 reset TSR. */ + unsigned int evt1pol : 1; /**< Event0 capture edge selection. */ + unsigned int evt1rst : 1; /**< Event0 reset TSR. */ + unsigned int evt2pol : 1; /**< Event1 capture edge selection. */ + unsigned int evt2rst : 1; /**< Event1 reset TSR. */ + unsigned int evt3pol : 1; /**< Event2 capture edge selection. */ + unsigned int evt3rst : 1; /**< Event2 reset TSR. */ + unsigned int ecrlden : 1; /**< Capture enable. */ + unsigned int dmaevt_sel : 2; /**< DMA request event selection. */ + unsigned int psc : 8; /**< Pre-division coefficient of the input signal. */ + unsigned int cnt_edge_sel : 2; /**< Edge type selection of edge count.*/ + unsigned int reserved : 11; + } BIT; +} volatile CCR0_REG; + +/** + * @brief CCR1 registers structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 3; + unsigned int emu_stop_en : 1; /**< Emulation stop TSR enable. */ + unsigned int reserved1 : 28; + } BIT; +} volatile CCR1_REG; + +/** + * @brief CCR2 registers structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int cap_mode : 1; /**< Capture mode selection. */ + unsigned int seq_stop : 2; /**< End of capture sequence/Boundary of circulation. */ + unsigned int reserved : 29; + } BIT; +} volatile CCR2_REG; + +/** + * @brief CAPM interrupt enable registers structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int evt0_en : 1; /**< Event0 interrupt enable. */ + unsigned int evt1_en : 1; /**< Event1 interrupt enable. */ + unsigned int evt2_en : 1; /**< Event2 interrupt enable. */ + unsigned int evt3_en : 1; /**< Event3 interrupt enable. */ + unsigned int tsr_ovf_en : 1; /**< TSR overflow interrupt enable. */ + unsigned int ecr_ovf_en : 1; /**< Capture overflow interrupt enable. */ + unsigned int earcmp_match_en : 1; /**< Edge count compare match interrupt enable. */ + unsigned int ear_ovf_en : 1; /**< Edge count overflow interrupt enable. */ + unsigned int dmareq_ovf_en : 1; /**< DMA request overflow interrupt enable. */ + unsigned int reserved : 23; + } BIT; +} volatile INTENR_REG; + +/** + * @brief CAPM initial interrupt registers structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int evt0_raw : 1; /**< Event0 initial interrupt. */ + unsigned int evt1_raw : 1; /**< Event1 initial interrupt. */ + unsigned int evt2_raw : 1; /**< Event2 initial interrupt. */ + unsigned int evt3_raw : 1; /**< Event3 initial interrupt. */ + unsigned int tsr_ovf_raw : 1; /**< TSR overflow initial interrupt. */ + unsigned int ecr_ovf_raw : 1; /**< Capture overflow initial interrupt. */ + unsigned int earcmp_match_raw : 1; /**< Edge count compare match initial interrupt. */ + unsigned int ear_ovf_raw : 1; /**< Edge count overflow initial interrupt. */ + unsigned int dmareq_ovf_raw : 1; /**< DMA request overflow initial interrupt. */ + unsigned int reserved : 23; + } BIT; +} volatile INTRAWR_REG; + +/** + * @brief CAPM interrupt injection registers structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int evt0_inj : 1; /**< Event0 interrupt injection. */ + unsigned int evt1_inj : 1; /**< Event1 interrupt injection. */ + unsigned int evt2_inj : 1; /**< Event2 interrupt injection. */ + unsigned int evt3_inj : 1; /**< Event3 interrupt injection. */ + unsigned int tsr_ovf_inj : 1; /**< TSR overflow interrupt injection. */ + unsigned int ecr_ovf_inj : 1; /**< Capture overflow interrupt injection. */ + unsigned int earcmp_match_inj : 1; /**< Edge count compare match interrupt injection. */ + unsigned int ear_ovf_inj : 1; /**< Edge count overflow interrupt injection. */ + unsigned int dmareq_ovf_inj : 1; /**< DMA request overflow interrupt injection. */ + unsigned int reserved : 23; + } BIT; +} volatile INTINJR_REG; + +/** + * @brief CAPM interrupt status registers structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int evt0_int : 1; /**< Event0 interrupt status. */ + unsigned int evt1_int : 1; /**< Event1 interrupt status. */ + unsigned int evt2_int : 1; /**< Event2 interrupt status. */ + unsigned int evt3_int : 1; /**< Event3 interrupt status. */ + unsigned int tsr_ovf_int : 1; /**< TSR overflow interrupt status. */ + unsigned int ecr_ovf_int : 1; /**< Capture overflow interrupt status. */ + unsigned int earcmp_match_int : 1; /**< Edge count compare match interrupt status. */ + unsigned int ear_ovf_int : 1; /**< Edge count overflow interrupt status. */ + unsigned int dmareq_ovf_int : 1; /**< DMA request overflow interrupt status. */ + unsigned int reserved : 23; + } BIT; +} volatile INTFLGR_REG; + +/** + * @brief Event interrupt + */ +typedef enum { + CAPM_INTREG1CAP = 0x00000000U, + CAPM_INTREG2CAP = 0x00000001U, + CAPM_INTREG3CAP = 0x00000002U, + CAPM_INTREG4CAP = 0x00000003U, + CAPM_INTTSROVF = 0x00000004U, + CAPM_INTECROVF = 0x00000005U, + CAPM_INTEARCMPMATCH = 0x00000006U, + CAPM_INTEAROVF = 0x00000007U, + CAPM_INTDMAREQOVF = 0x00000008U, +} CAPM_IntEvent; + +/** + * @brief CAPM Interrupt callback functions. + * + */ +typedef void (*EvtCallbackType)(void *handle, CAPM_IntEvent intValue); +typedef struct { + EvtCallbackType EvtFinishCallback; /**< event finish callback function. */ + void (*DmaFinishCallback)(void *handle); /**< DMA finish callback function. */ + void (*DmaErrorCallback)(void *handle); /**< DMA error callback function. */ +} CAPM_UserCallBack; + +/** + * @brief CAPM extend handle. + */ +typedef struct _CAPM_ExtendeHandle { +} CAPM_ExtendHandle; + +/** + * @brief CAPM registers definition structure. + */ +typedef struct { + REV_INFO_REG REV_INFO; /**< CAPM revision information register, offset address: 0x0000. */ + unsigned int tsr; /**< CAPM time-stamp register, offset address: 0x0004. */ + TSR_DIV_REG TSR_DIV; /**< CAPM time-stamp divider register, offset address: 0x0008. */ + EAR_REG EAR; /**< CAPM edge amount register, offset address: 0x000C. */ + EAR_CMP_REG EAR_CMP; /**< EAR compare value register, offset address: 0x0010. */ + unsigned int SYNC_PHS; /**< Sync phase, offset address: 0x0014. */ + unsigned int ECR0; /**< Event0 capture register, offset address: 0x0018. */ + unsigned int ECR1; /**< Event1 capture register, offset address: 0x001C. */ + unsigned int ECR2; /**< Event2 capture register, offset address: 0x0020. */ + unsigned int ECR3; /**< Event3 capture register, offset address: 0x0024. */ + ECSEQR_REG ECSEQR; /**< Event capture sequence register, offset address: 0x0028. */ + FTCR_REG FTCR; /**< Filter control register, offset address: 0x002C. */ + CCR0_REG CCR0; /**< CCR0 register, offset address: 0x0030. */ + CCR1_REG CCR1; /**< CCR1 register, offset address: 0x0034. */ + CCR2_REG CCR2; /**< CCR2 register, offset address: 0x0038. */ + unsigned int reserve; + INTENR_REG INTENR; /**< CAPM interrupt enable register, offset address: 0x0040. */ + INTRAWR_REG INTRAWR; /**< CAPM initial interrupt register, offset address: 0x0044. */ + INTINJR_REG INTINJR; /**< CAPM interrupt injection register, offset address: 0x0048. */ + INTFLGR_REG INTFLGR; /**< CAPM interrupt status register, offset address: 0x004C. */ +} volatile CAPM_RegStruct; + +/** + * @brief Capture module general control registers structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int restart_capm0 : 1; /**< CAPM0 start a new single round capture. */ + unsigned int restart_capm1 : 1; /**< CAPM1 start a new single round capture. */ + unsigned int restart_capm2 : 1; /**< CAPM2 start a new single round capture. */ + unsigned int reserved1 : 5; + unsigned int tsr_stop_capm0 : 1; /**< CAPM0 TSR stop count enable. */ + unsigned int tsr_stop_capm1 : 1; /**< CAPM1 TSR stop count enable. */ + unsigned int tsr_stop_capm2 : 1; /**< CAPM2 TSR stop count enable. */ + unsigned int reserved2 : 5; + unsigned int stat_rst_capm0 : 1; /**< CAPM0 work state reset. */ + unsigned int stat_rst_capm1 : 1; /**< CAPM1 work state reset. */ + unsigned int stat_rst_capm2 : 1; /**< CAPM2 work state reset. */ + unsigned int reserve3 : 5; + unsigned int sync_sw_capm0 : 1; /**< Triggle CAPM0 sync, TSR reset, capture sequence reset. */ + unsigned int sync_sw_capm1 : 1; /**< Triggle CAPM1 sync, TSR reset, capture sequence reset. */ + unsigned int sync_sw_capm2 : 1; /**< Triggle CAPM2 sync, TSR reset, capture sequence reset. */ + unsigned int reserve4 : 5; + } BIT; +} volatile CAPM_GENE_CR_REG; + +/** + * @brief Sync selection register for CAPM0 structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int capm0_sync_sel : 4; /**< CAPM0 hardware sync source selection. */ + unsigned int capm0_synci_en : 1; /**< CAPM0 sync enable. */ + unsigned int reserved : 27; + }BIT; +} volatile SYNC_SELR0_REG; + +/** + * @brief Sync selection register for CAPM1 structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int capm1_sync_sel : 4; /**< CAPM1 hardware sync source selection. */ + unsigned int capm1_synci_en : 1; /**< CAPM1 sync enable. */ + unsigned int reserved : 27; + }BIT; +} volatile SYNC_SELR1_REG; + +/** + * @brief Sync selection register for CAPM2 structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int capm2_sync_sel : 4; /**< CAPM2 hardware sync source selection. */ + unsigned int capm2_synci_en : 1; /**< CAPM2 sync enable. */ + unsigned int reserved : 27; + }BIT; +} volatile SYNC_SELR2_REG; + +/** + * @brief Input source selection register for CAPM0 structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int capm0_in_sel : 1; /**< CAPM0 input source selection. */ + unsigned int reserved : 31; + }BIT; +} volatile INPUT_SELR0_REG; + +/** + * @brief Input source selection register for CAPM1 structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int capm1_in_sel : 1; /**< CAPM1 input source selection. */ + unsigned int reserved : 31; + }BIT; +} volatile INPUT_SELR1_REG; + +/** + * @brief Input source selection register for CAPM2 structure definition + */ +typedef union { + unsigned int reg; + struct { + unsigned int capm2_in_sel : 1; /**< CAPM2 input source selection. */ + unsigned int reserved : 31; + }BIT; +} volatile INPUT_SELR2_REG; + +/** + * @brief Define the CAPM common register struct. + */ +typedef struct { + REV_INFO_REG REV_INFO; /**< Revision information, offset address: 0x0000. */ + CAPM_GENE_CR_REG CAPM_GENE_CR; /**< Capture module general control register, offset address: 0x0004. */ + SYNC_SELR0_REG SYNC_SELR0; /**< Sync selection register for CAPM0, offset address: 0x0008. */ + SYNC_SELR1_REG SYNC_SELR1; /**< Sync selection register for CAPM1, offset address: 0x000C. */ + SYNC_SELR2_REG SYNC_SELR2; /**< Sync selection register for CAPM2, offset address: 0x0010. */ + unsigned char reserved[20]; + INPUT_SELR0_REG INPUT_SELR0; /**< Input source selection register for CAPM0, offset address: 0x0028. */ + INPUT_SELR1_REG INPUT_SELR1; /**< Input source selection register for CAPM1, offset address: 0x002C. */ + INPUT_SELR2_REG INPUT_SELR2; /**< Input source selection register for CAPM2, offset address: 0x0030. */ +} volatile CAPM_COMM_RegStruct; + + +/** + * @brief Get CAPM IP's version. + * @param capmx: CAPM register base address. + * @retval CAPM IP's version. + */ +static inline unsigned int DCL_CAPM_GetIPVer(const CAPM_RegStruct *capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + return (capmx->REV_INFO.reg) & CAPM_IP_VER_MASK; +} + +/** + * @brief Get TSR value. + * @param capmx: CAPM register base address. + * @retval TSR value. + */ +static inline unsigned int DCL_CAPM_GetTSR(const CAPM_RegStruct *capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + return capmx->tsr; +} +/** + * @brief Set TSR divide value. + * @param capmx: CAPM register base address. + * @param divValue: Divide value. Range: 0~65535 + * @retval None. + */ +static inline void DCL_CAPM_SetTSRDiv(CAPM_RegStruct * const capmx, unsigned short divValue) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->TSR_DIV.BIT.tscnt_div = divValue; + return; +} + +/** + * @brief Get EAR value. + * @param capmx: CAPM register base address. + * @retval EAR value. + */ +static inline unsigned int DCL_CAPM_GetEar(const CAPM_RegStruct *capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + return capmx->EAR.BIT.ear; +} + +/** + * @brief Get EAR_CMP value. + * @param capmx: CAPM register base address. + * @retval EAR_CMP value. + */ +static inline unsigned int DCL_CAPM_GetEarCmp(const CAPM_RegStruct *capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + return capmx->EAR_CMP.BIT.earcmp; +} + +/** + * @brief Set sync phase value. + * @param capmx: CAPM register base address. + * @param syncPhs: Phase value. Range: 0~0xFFFF FFFF. + * @retval None. + */ +static inline void DCL_CAPM_SetSyncPhase(CAPM_RegStruct * const capmx, unsigned int syncPhs) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->SYNC_PHS = syncPhs; + return; +} + +/** + * @brief Get sync phase value. + * @param capmx: CAPM register base address. + * @retval Phase value. + */ +static inline unsigned int DCL_CAPM_GetSyncPhase(const CAPM_RegStruct *capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + return capmx->SYNC_PHS; +} + +/** + * @brief Get ECR0 value. + * @param capmx: CAPM register base address. + * @retval ECR0 value. + */ +static inline unsigned int DCL_CAPM_GetECR0(const CAPM_RegStruct *capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + return capmx->ECR0; +} + +/** + * @brief Get ECR1 value. + * @param capmx: CAPM register base address. + * @retval ECR1 value. + */ +static inline unsigned int DCL_CAPM_GetECR1(const CAPM_RegStruct *capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + return capmx->ECR1; +} + +/** + * @brief Get ECR2 value. + * @param capmx: CAPM register base address. + * @retval ECR2 value. + */ +static inline unsigned int DCL_CAPM_GetECR2(const CAPM_RegStruct *capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + return capmx->ECR2; +} + +/** + * @brief Get ECR3 value. + * @param capmx: CAPM register base address. + * @retval ECR3 value. + */ +static inline unsigned int DCL_CAPM_GetECR3(const CAPM_RegStruct *capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + return capmx->ECR3; +} + +/** + * @brief Get current signal level. + * @param capmx: CAPM register base address. + * @retval Signal level. + */ +static inline unsigned char DCL_CAPM_GetCRTEdge(const CAPM_RegStruct *capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + return (capmx->ECSEQR.BIT.crt_edge); +} + +/** + * @brief Get next ECR number. + * @param capmx: CAPM register base address. + * @retval Next ECR number. + */ +static inline unsigned char DCL_CAPM_GetNextECRNum(const CAPM_RegStruct *capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + return (capmx->ECSEQR.BIT.nxtldecr); +} + +/** + * @brief Set capture rising edge register. + * @param capmx: CAPM register base address. + * @param capReg: Capture rising edge register. + * Input argument value: 0(CapReg 1),1(CapReg 2),2(CapReg 3),3(CapReg 4).Register set value:1,4,16,64. + * @retval None. + */ +static inline void DCL_CAPM_RisingCap(CAPM_RegStruct * const capmx, unsigned int capReg) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + if (capReg > CAPM_MAX_CAP_REG_NUM) { + return; + } + capmx->CCR0.reg |= (unsigned int)((1 << capReg) * (1 << capReg)); + return; +} + +/** + * @brief Set capture falling edge register. + * @param capmx: CAPM register base address. + * @param capReg: Capture falling edge register. + * Input argument value:0(CapReg 1),1(CapReg 2),2(CapReg 3),3(CapReg 4).Register set value:1,4,16,64. + * @retval None. + */ +static inline void DCL_CAPM_FallingCap(CAPM_RegStruct * const capmx, unsigned int capReg) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + if (capReg > CAPM_MAX_CAP_REG_NUM) { + return; + } + capmx->CCR0.reg &= (~(unsigned int)((1 << capReg) * (1 << capReg))); + return; +} + +/** + * @brief Enable capture register reset TSR function. + * @param capmx: CAPM register base address. + * @param capReg: Reset TSR's capture register. + * Input argument value:0(CapReg 1),1(CapReg 2),2(CapReg 3),3(CapReg 4).Register set value:2,8,32,128. + * @retval None. + */ +static inline void DCL_CAPM_EnableCapReset(CAPM_RegStruct * const capmx, unsigned int capReg) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + if (capReg > CAPM_MAX_CAP_REG_NUM) { + return; + } + capmx->CCR0.reg |= (unsigned int)((CAPM_BIT_SHIFT_TWO * (1 << capReg) * (1 << capReg))); + return; +} + +/** + * @brief Disable capture register reset TSR function. + * @param capmx: CAPM register base address. + * @param capReg: Non-reset TSR's capture register. + * Input argument value:0(CapReg 1),1(CapReg 2),2(CapReg 3),3(CapReg 4).Register set value:2,8,32,128. + * @retval None. + */ +static inline void DCL_CAPM_DisableCapReset(CAPM_RegStruct * const capmx, unsigned int capReg) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + if (capReg > CAPM_MAX_CAP_REG_NUM) { + return; + } + capmx->CCR0.reg &= ~(unsigned int)(CAPM_BIT_SHIFT_TWO * (1 << capReg) * (1 << capReg)); + return; +} + +/** + * @brief Set ECR0 capture falling edge. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_ECR0FallingCap(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.evt0pol = CAPM_FALLING_EDGE; + return; +} + +/** + * @brief Set ECR0 capture rising edge. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_ECR0RisingCap(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.evt0pol = CAPM_RISING_EDGE; + return; +} + +/** + * @brief Enable ECR0 reset after each capture action. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableECR0CapReset(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.evt0rst = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable ECR0 reset after each capture action. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableECR0CapReset(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.evt0rst = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Set ECR1 capture falling edge. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_ECR1FallingCap(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.evt1pol = CAPM_FALLING_EDGE; + return; +} + +/** + * @brief Set ECR1 capture rising edge. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_ECR1RisingCap(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.evt1pol = CAPM_RISING_EDGE; + return; +} + +/** + * @brief Enable ECR1 reset after each capture action. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableECR1CapReset(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.evt1rst = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable ECR1 reset after each capture action. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableECR1CapReset(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.evt1rst = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Set ECR2 capture falling edge. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_ECR2FallingCap(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.evt2pol = CAPM_FALLING_EDGE; + return; +} + +/** + * @brief Set ECR2 capture rising edge. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_ECR2RisingCap(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.evt2pol = CAPM_RISING_EDGE; + return; +} + +/** + * @brief Enable ECR2 reset after each capture action. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableECR2CapReset(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.evt2rst = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable ECR2 reset after each capture action. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableECR2CapReset(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.evt2rst = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Set ECR2 capture Falling edge. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_ECR3FallingCap(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.evt3pol = CAPM_FALLING_EDGE; + return; +} + +/** + * @brief Set ECR2 capture Rising edge. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_ECR3RisingCap(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.evt3pol = CAPM_RISING_EDGE; + return; +} + +/** + * @brief Enable ECR3 after each capture action. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableECR3CapReset(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.evt3rst = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable ECR3 after each capture action. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableECR3CapReset(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.evt3rst = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Enable capture register load. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableCapRegLoad(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.ecrlden = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable capture register load. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableCapRegLoad(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.ecrlden = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Set the capture register's number which trggle DMA interrupt. + * @param capmx: CAPM register base address. + * @param capNum: Capture register number. + * @retval None. + */ +static inline void DCL_CAPM_SetDMATriggleReg(CAPM_RegStruct * const capmx, CampConfigCapRegNum capNum) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + CAPM_PARAM_CHECK_NO_RET(capNum >= 0); + CAPM_PARAM_CHECK_NO_RET(capNum < CAPM_MAX_CAP_REG_NUM); + capmx->CCR0.BIT.dmaevt_sel = capNum; + return; +} + +/** + * @brief Set prescale value. + * @param base: CAPM register base address. + * @param preScale PreScale value. Range: 0, 1, 2, 3 ... 127. + * @retval None. + */ +static inline void DCL_CAPM_SetPreScale(CAPM_RegStruct * const capmx, unsigned short preScale) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + CAPM_PARAM_CHECK_NO_RET(preScale <= CAPM_MAX_PRESCALE); + capmx->CCR0.BIT.psc = preScale; + return; +} + +/** + * @brief Set count edge type. + * @param capmx: CAPM register base address. + * @param countType: Count edge type. + * @retval None. + */ +static inline void DCL_CAPM_SetCountType(CAPM_RegStruct * const capmx, CAPM_CountType countType) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR0.BIT.cnt_edge_sel = countType; + return; +} + +/** + * @brief Set filer value. + * @param capmx: CAPM register base address. + * @param filterValue: Filter value. Range: 0 ~ 8191. + * @retval None. + */ +static inline void DCL_CAPM_SetFilterLevel(CAPM_RegStruct * const capmx, unsigned short filterValue) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->FTCR.BIT.ft_lev = filterValue; + return; +} + +/** + * @brief Get filer value. + * @param capmx: CAPM register base address. + * @retval Filer value. + */ +static inline unsigned int DCL_CAPM_GetFilterLevel(const CAPM_RegStruct *capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + return capmx->FTCR.BIT.ft_lev; +} + +/** + * @brief Enable input filter. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableFilter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->FTCR.BIT.ft_en = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable input filter. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableFilter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->FTCR.BIT.ft_en = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Restart CAPM0 one-shot capture. + * @param capmComm: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_RestartOneShotCap0(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->CAPM_GENE_CR.BIT.restart_capm0 = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Restart CAPM1 one-shot capture. + * @param capmComm: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_RestartOneShotCap1(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->CAPM_GENE_CR.BIT.restart_capm1 = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Restart CAPM2 one-shot capture. + * @param capmComm: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_RestartOneShotCap2(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->CAPM_GENE_CR.BIT.restart_capm2 = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Suspend capm0 TSR count. + * @param capmComm: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_SuspendTSRCount0(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->CAPM_GENE_CR.BIT.tsr_stop_capm0 = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Resume capm0 TSR counter. + * @param capmx: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_ResumeTSRCount0(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->CAPM_GENE_CR.BIT.tsr_stop_capm0 = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Suspend capm1 TSR count. + * @param capmComm: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_SuspendTSRCount1(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->CAPM_GENE_CR.BIT.tsr_stop_capm1 = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Resume capm1 TSR counter. + * @param capmx: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_ResumeTSRCount1(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->CAPM_GENE_CR.BIT.tsr_stop_capm1 = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Suspend capm2 TSR count. + * @param capmComm: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_SuspendTSRCount2(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->CAPM_GENE_CR.BIT.tsr_stop_capm2 = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Resume capm0 TSR counter. + * @param capmx: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_ResumeTSRCount2(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->CAPM_GENE_CR.BIT.tsr_stop_capm2 = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Reset capm0 TSR value. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_ResetTSRCount0(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->CAPM_GENE_CR.BIT.stat_rst_capm0 = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Reset capm1 TSR value. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_ResetTSRCount1(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->CAPM_GENE_CR.BIT.stat_rst_capm1 = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Reset capm2 TSR value. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_ResetTSRCount2(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->CAPM_GENE_CR.BIT.stat_rst_capm2 = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Set capture mode. + * @param capmx: CAPM register base address. + * @param capMode: Capture mode. + * @retval None. + */ +static inline void DCL_CAPM_SetCapMode(CAPM_RegStruct * const capmx, CAPM_CapMode capMode) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + CAPM_PARAM_CHECK_NO_RET(capMode == CAPM_CONTINUECAP || capMode == CAPM_ONESHOTCAP); + capmx->CCR2.BIT.cap_mode = capMode; + return; +} + +/** + * @brief Set capture stop on which register's capture event. + * @param capmx: CAPM register base address. + * @param capNum: Stop capture register number. + * @retval None. + */ +static inline void DCL_CAPM_SetStopSeq(CAPM_RegStruct * const capmx, CampConfigCapRegNum capNum) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + CAPM_PARAM_CHECK_NO_RET(capNum >= 0); + CAPM_PARAM_CHECK_NO_RET(capNum < CAPM_MAX_CAP_REG_NUM); + capmx->CCR2.BIT.seq_stop = capNum; + return; +} + +/** + * @brief Enable capm0 sync input. + * @param capmComm: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableSyncIn0(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->SYNC_SELR0.BIT.capm0_synci_en = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Enable capm1 sync input. + * @param capmComm: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableSyncIn1(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->SYNC_SELR1.BIT.capm1_synci_en = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Enable capm2 sync input. + * @param capmComm: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableSyncIn2(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->SYNC_SELR2.BIT.capm2_synci_en = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable capm0 sync input. + * @param capmComm: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableSyncIn0(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->SYNC_SELR0.BIT.capm0_synci_en = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Disable capm1 sync input. + * @param capmComm: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableSyncIn1(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->SYNC_SELR1.BIT.capm1_synci_en = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Disable capm2 sync input. + * @param capmComm: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableSyncIn2(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->SYNC_SELR2.BIT.capm2_synci_en = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Triggle a software sync event for capm0. + * @param capmComm: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_TriggleSoftSync0(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->CAPM_GENE_CR.BIT.sync_sw_capm0 = BASE_CFG_SET; + return; +} + +/** + * @brief Triggle a software sync event for capm1. + * @param capmComm: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_TriggleSoftSync1(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->CAPM_GENE_CR.BIT.sync_sw_capm1 = BASE_CFG_SET; + return; +} + +/** + * @brief Triggle a software sync event for capm2. + * @param capmComm: CAPM COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_TriggleSoftSync2(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->CAPM_GENE_CR.BIT.sync_sw_capm2 = BASE_CFG_SET; + return; +} + +/** + * @brief Clear all CAPM interrupt flags. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_ClearAllInter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTRAWR.reg = 0x1FF; + return; +} + +/** + * @brief Clear specific interrupt. + * @param capmx: CAPM register base address. + * @param eventNumber: Specific interrupt. + * @retval None. + */ +static inline void DCL_CAPM_ClearInter(CAPM_RegStruct * const capmx, CAPM_Interrupt eventNumber) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTRAWR.reg |= (unsigned int)eventNumber; + return; +} + +/** + * @brief Enable specific interrupt. + * @param capmx: CAPM register base address. + * @param eventNumber: Specific interrupt. + * @retval None. + */ +static inline void DCL_CAPM_EnableInter(CAPM_RegStruct * const capmx, CAPM_Interrupt eventNumber) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.reg |= (unsigned int)eventNumber; + return; +} + +/** + * @brief Disable specific interrupt. + * @param capmx: CAPM register base address. + * @param eventNumber: Specific interrupt. + * @retval None. + */ +static inline void DCL_CAPM_DisableInter(CAPM_RegStruct * const capmx, CAPM_Interrupt eventNumber) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.reg &= (~(unsigned int)eventNumber); + return; +} + +/** + * @brief Enable event1 interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableEvt1Inter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.evt0_en = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable event1 interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableEvt1Inter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.evt0_en = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Enable event2 interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableEvt2Inter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.evt1_en = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable event2 interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableEvt2Inter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.evt1_en = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Enable event3 interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableEvt3Inter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.evt2_en = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable event3 interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableEvt3Inter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.evt2_en = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Enable event4 interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableEvt4Inter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.evt3_en = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable event4 interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableEvt4Inter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.evt3_en = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Enable TSR overflow interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableTsrovfInter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.tsr_ovf_en = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable TSR overflow interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableTsrovfInter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.tsr_ovf_en = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Enable ECR overflow interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableEcrovfInter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.ecr_ovf_en = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable ECR overflow interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableEcrovfInter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.ecr_ovf_en = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Enable EAR compare match interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableEARCMPMatchInter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.earcmp_match_en = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable EAR compare match interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableEARCMPMatchInter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.earcmp_match_en = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Enable EAR overflow interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableEarovfInter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.ear_ovf_en = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable EAR overflow interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableEarovfInter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.ear_ovf_en = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Enable DMA overflow interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableDmaovfInter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.dmareq_ovf_en = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable DMA overflow interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableDmaovfInter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTENR.BIT.dmareq_ovf_en = BASE_CFG_DISABLE; + return; +} + +/** + * @brief Get all interrupt flags. + * @param capmx: CAPM register base address. + * @retval Interrupt flags. + */ +static inline unsigned int DCL_CAPM_GetInterFlag(const CAPM_RegStruct *capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + return capmx->INTFLGR.reg; +} + +/** + * @brief Inject interrupts by software. + * @param capmx: CAPM register base address. + * @param eventNumber: Inject interrupt. + * @retval None. + */ +static inline void DCL_CAPM_InjectInter(CAPM_RegStruct * const capmx, CAPM_Interrupt eventNumber) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTFLGR.reg |= (unsigned int)eventNumber; + return; +} + +/** + * @brief Inject event1 interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_InjectEvt1Inter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTINJR.BIT.evt0_inj |= 0x01; + return; +} + +/** + * @brief Inject event2 interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_InjectEvt2Inter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTINJR.BIT.evt1_inj |= 0x01; + return; +} + +/** + * @brief Inject event3 interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_InjectEvt3Inter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTINJR.BIT.evt2_inj |= 0x01; + return; +} + +/** + * @brief Inject event4 interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_InjectEvt4Inter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTINJR.BIT.evt3_inj |= 0x01; + return; +} + +/** + * @brief Inject TSR overflow interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_IngectTsrovfInter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTINJR.BIT.tsr_ovf_inj |= 0x01; + return; +} + +/** + * @brief Inject ECR overflow interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_InjectEcrovfInter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTINJR.BIT.ecr_ovf_inj |= 0x01; + return; +} + +/** + * @brief Inject EAR overflow interrupt. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_InjectEarOvfInter(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->INTINJR.BIT.ear_ovf_inj |= 0x01; + return; +} + +/** + * @brief Enable emulation stop TSR count. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_EnableEmuStopTSR(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR1.BIT.emu_stop_en = BASE_CFG_ENABLE; + return; +} + +/** + * @brief Disable emulation stop TSR count. + * @param capmx: CAPM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableEmuStopTSR(CAPM_RegStruct * const capmx) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmx)); + capmx->CCR1.BIT.emu_stop_en = BASE_CFG_DISABLE; +} + +/** + * @brief Disable TSR count stop control + * @param capmComm: CAPM_COMM register base address. + * @retval None. + */ +static inline void DCL_CAPM_DisableTSRStop(CAPM_COMM_RegStruct * const capmComm) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->CAPM_GENE_CR.BIT.tsr_stop_capm0 = BASE_CFG_DISABLE; + capmComm->CAPM_GENE_CR.BIT.tsr_stop_capm1 = BASE_CFG_DISABLE; + capmComm->CAPM_GENE_CR.BIT.tsr_stop_capm2 = BASE_CFG_DISABLE; +} + +/** + * @brief Set CAPM0 input source + * @param capmComm: CAPM_COMM register base address. + * @param src: source selection + * @retval None. + */ +static inline void DCL_CAPM_SetInputSEL0(CAPM_COMM_RegStruct * const capmComm, CAPM_InputSrc src) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->INPUT_SELR0.BIT.capm0_in_sel = src; +} + +/** + * @brief Set CAPM1 input source + * @param capmComm: CAPM_COMM register base address. + * @param src: source selection + * @retval None. + */ +static inline void DCL_CAPM_SetInputSEL1(CAPM_COMM_RegStruct * const capmComm, CAPM_InputSrc src) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->INPUT_SELR1.BIT.capm1_in_sel = src; +} + +/** + * @brief Set CAPM2 input source + * @param capmComm: CAPM_COMM register base address. + * @param src: source selection + * @retval None. + */ +static inline void DCL_CAPM_SetInputSEL2(CAPM_COMM_RegStruct * const capmComm, CAPM_InputSrc src) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + capmComm->INPUT_SELR2.BIT.capm2_in_sel = src; +} + +/** + * @brief Set CAPM0 sync input source + * @param capmComm: CAPM_COMM register base address. + * @param src: apt source selection + * @retval None. + */ +static inline void DCL_CAPM_SetSyncInput0(CAPM_COMM_RegStruct * const capmComm, CAPM_SyncSrc src) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + CAPM_PARAM_CHECK_NO_RET(src >= CAPM_SYNC_SRC_NONE); + CAPM_PARAM_CHECK_NO_RET(src <= CAPM_SYNC_SRC_APT8); + capmComm->SYNC_SELR0.BIT.capm0_sync_sel = src; +} + +/** + * @brief Set CAPM1 sync input source + * @param capmComm: CAPM_COMM register base address. + * @param src: apt source selection + * @retval None. + */ +static inline void DCL_CAPM_SetSyncInput1(CAPM_COMM_RegStruct * const capmComm, CAPM_SyncSrc src) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + CAPM_PARAM_CHECK_NO_RET(src >= CAPM_SYNC_SRC_NONE); + CAPM_PARAM_CHECK_NO_RET(src <= CAPM_SYNC_SRC_APT8); + capmComm->SYNC_SELR1.BIT.capm1_sync_sel = src; +} + +/** + * @brief Set CAPM2 sync input source + * @param capmComm: CAPM_COMM register base address. + * @param src: apt source selection + * @retval None. + */ +static inline void DCL_CAPM_SetSyncInput2(CAPM_COMM_RegStruct * const capmComm, CAPM_SyncSrc src) +{ + CAPM_ASSERT_PARAM(IsCAPMCOMMInstance(capmComm)); + CAPM_PARAM_CHECK_NO_RET(src >= CAPM_SYNC_SRC_NONE); + CAPM_PARAM_CHECK_NO_RET(src <= CAPM_SYNC_SRC_APT8); + capmComm->SYNC_SELR2.BIT.capm2_sync_sel = src; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/capm/src/capm.c b/vendor/others/demo/5-tim_adc/demo/drivers/capm/src/capm.c new file mode 100644 index 000000000..0372e3915 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/capm/src/capm.c @@ -0,0 +1,439 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file capm.c + * @author MCU Driver Team. + * @brief CAPM HAL level module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the CAPM. + * + Initialization and de-initialization functions. + * + Get CAPM ECR value and next load ECR number. + * + Get CAPM CRT edge. + * + Enable/Disable CAPM sync function. + * + Get/Set CAPM sync phase(TSR) value. + * + Config CAPM interrupt function. + */ +#include "capm.h" +#include "assert.h" +#include "interrupt.h" + +/** + * @brief Config whether the ECR capture event need reset TSR. + * @param handle: CAPM handle. + * @param number: ECR number. + * @retval None. + */ +static inline void CAPM_SetCapReset(CAPM_Handle *handle, unsigned int number) +{ + CAPM_ASSERT_PARAM(handle != NULL); + CAPM_ASSERT_PARAM(IsCAPMInstance(handle->baseAddress)); + CAPM_PARAM_CHECK_NO_RET(number <= CAPM_MAX_CAP_REG_NUM); + if (handle->capRegConfig[number].regReset == CAPM_RESET) { + /* Enable ECR capture event need reset TSR */ + DCL_CAPM_EnableCapReset(handle->baseAddress, number); + } else { + /* Disable ECR capture event need reset TSR */ + DCL_CAPM_DisableCapReset(handle->baseAddress, number); + } + return; +} + +/** + * @brief Config triggle ECR capture event source. + * @param handle: CAPM handle. + * @retval BASE status type: BASE_STATUS_OK, BASE_STATUS_ERROR. + */ +static BASE_StatusType CAPM_SetRegCaptureEvent(CAPM_Handle *handle) +{ + CAPM_ASSERT_PARAM(handle != NULL); + CAPM_PARAM_CHECK_WITH_RET(handle->useCapNum <= CAPM_MAX_CAP_REG_NUM, BASE_STATUS_ERROR); + unsigned int i; + for (i = 0; i < handle->useCapNum; i++) { + if (handle->capRegConfig[i].capEvent == CAPM_RISING) { /* CAPM rising capture. */ + DCL_CAPM_RisingCap(handle->baseAddress, i); + CAPM_SetCapReset(handle, i); + } else if (handle->capRegConfig[i].capEvent == CAPM_FALLING) { /* CAPM falling capture. */ + DCL_CAPM_FallingCap(handle->baseAddress, i); + CAPM_SetCapReset(handle, i); + } else { + return BASE_STATUS_ERROR; + } + } + return BASE_STATUS_OK; +} + +/** + * @brief Set deburr number. + * @param handle: CAPM handle. + * @retval BASE status type: BASE_STATUS_OK, BASE_STATUS_ERROR. + */ +static BASE_StatusType CAPM_SetDeburrNum(CAPM_Handle *handle) +{ + CAPM_ASSERT_PARAM(handle != NULL); + if ((handle->deburrNum > 0) && (handle->deburrNum <= CAPM_MAX_FILTER_LEVEL)) { + DCL_CAPM_EnableFilter(handle->baseAddress); + DCL_CAPM_SetFilterLevel(handle->baseAddress, handle->deburrNum - 1); + } else { + /* deburrNum = 0: Disable filter. */ + DCL_CAPM_DisableFilter(handle->baseAddress); + } + return BASE_STATUS_OK; +} + +/** + * @brief IRQ Handler + * @param handle: CAPM handle. + * @retval None + */ +void HAL_CAPM_IrqHandler(void *handle) +{ + CAPM_ASSERT_PARAM(handle != NULL); + CAPM_Handle *useHandle = (CAPM_Handle *)handle; + CAPM_ASSERT_PARAM(IsCAPMInstance(useHandle->baseAddress)); + if (useHandle->userCallBack.EvtFinishCallback != NULL) { + /* Get interrupt flag. */ + unsigned int intMask = DCL_CAPM_GetInterFlag(useHandle->baseAddress); + unsigned int intBit; + for (unsigned int i = 0; i <= CAPM_INTDMAREQOVF; i++) { + if (((intMask >> i) & 0x1) == 0x1) { + intBit = (intMask & (0x1 << i)); + /* Clear interrupt. */ + DCL_CAPM_ClearInter(useHandle->baseAddress, intBit); + useHandle->userCallBack.EvtFinishCallback(useHandle, i); + } + } + } + return; +} + +/** + * @brief Register IRQ callback functions + * @param capmHandle: CAPM handle. + * @param typeID: callback function type ID. + * @param pCallback: pointer of callback function. + * @retval None + */ +void HAL_CAPM_RegisterCallback(CAPM_Handle *capmHandle, CAPM_CallbackFuncType typeID, CAPM_CallbackType pCallback) +{ + CAPM_ASSERT_PARAM(capmHandle != NULL); + CAPM_ASSERT_PARAM(IsCAPMInstance(capmHandle->baseAddress)); + CAPM_ASSERT_PARAM(pCallback != NULL); + + switch (typeID) { + case CAPM_EVT_FINISH: + capmHandle->userCallBack.EvtFinishCallback = (EvtCallbackType)pCallback; /**< Event finish callback. */ + break; + case CAPM_DMA_ERROR: + capmHandle->userCallBack.DmaErrorCallback = pCallback; /**< DMA error callback function. */ + break; + case CAPM_DMA_FINISH: + capmHandle->userCallBack.DmaFinishCallback = pCallback; /**< DMA finish callback function. */ + default: + return; + } +} + +/** + * @brief DMA error interrupt service routine. + * @param handle: CAPM handle. + * @retval None. + */ +static void CAPM_DmaErrorIRQService(void *handle) +{ + CAPM_ASSERT_PARAM(handle != NULL); + + CAPM_Handle *useHandle = (CAPM_Handle *)handle; + if (useHandle->userCallBack.DmaErrorCallback != NULL) { /* if callback not equal to null */ + useHandle->userCallBack.DmaErrorCallback(useHandle); + } + return; +} + +/** + * @brief DMA finish interrupt service routine. + * @param handle: CAPM handle. + * @retval None. + */ +static void CAPM_DmaFinishIRQService(void *handle) +{ + CAPM_ASSERT_PARAM(handle != NULL); + + CAPM_Handle *useHandle = (CAPM_Handle *)handle; + if (useHandle->userCallBack.DmaFinishCallback != NULL) { /* if callback not equal to null */ + useHandle->userCallBack.DmaFinishCallback(useHandle); + } + return; +} + +/** + * @brief Get camp number. + * @param handle: CAPM handle. + * @retval camp number. + */ +static unsigned char CAPM_GetCapmNumber(CAPM_Handle *capmHandle) +{ + CAPM_ASSERT_PARAM(IsCAPMInstance(capmHandle->baseAddress)); + if (capmHandle->baseAddress == CAPM0_BASE) { + return CAPM_NUM_0; /* capm0 */ + } else if (capmHandle->baseAddress == CAPM1_BASE) { + return CAPM_NUM_1; /* capm1 */ + } else if (capmHandle->baseAddress == CAPM2_BASE) { + return CAPM_NUM_2; /* capm2 */ + } else { + return CAPM_NUM_0; + } +} + +/** + * @brief Setting camp sync. + * @param capmHandle: CAPM handle. + * @param capmNum: capm number. + * @retval camp number. + */ +static void CAPM_SyncSetByNumber(CAPM_Handle *capmHandle, unsigned char capmNum) +{ + switch (capmNum) { + case CAPM_NUM_0: + DCL_CAPM_EnableSyncIn0(CAPM_COMM); /* enable capm0 sync */ + DCL_CAPM_SetSyncInput0(CAPM_COMM, capmHandle->syncSrc); + break; + case CAPM_NUM_1: + DCL_CAPM_EnableSyncIn1(CAPM_COMM); /* enable capm1 sync */ + DCL_CAPM_SetSyncInput1(CAPM_COMM, capmHandle->syncSrc); + break; + case CAPM_NUM_2: + DCL_CAPM_EnableSyncIn2(CAPM_COMM); /* enable capm2 sync */ + DCL_CAPM_SetSyncInput2(CAPM_COMM, capmHandle->syncSrc); + break; + default: + break; + } +} + +/** + * @brief Disable sync by capm number. + * @param capmNum: CAPM number. + * @retval None. + */ +static void CAPM_SyncDisableByNumber(unsigned char capmNum) +{ + switch (capmNum) { + case CAPM_NUM_0: + DCL_CAPM_DisableSyncIn0(CAPM_COMM); /* disable capm0 sync */ + break; + case CAPM_NUM_1: + DCL_CAPM_DisableSyncIn1(CAPM_COMM); /* disable camp1 sync */ + break; + case CAPM_NUM_2: + DCL_CAPM_DisableSyncIn2(CAPM_COMM); /* disable capm2 sync */ + break; + default: + break; + } +} + +/** + * @brief Capm sync initialize. + * @param capmHandle: CAPM handle. + * @retval None. + */ +static void CAPM_SyncInit(CAPM_Handle *capmHandle) +{ + unsigned char capmNum; + CAPM_ASSERT_PARAM(capmHandle != NULL); + capmNum = CAPM_GetCapmNumber(capmHandle); + if (capmHandle->enableSync == true) { /* if enable sync */ + CAPM_SyncSetByNumber(capmHandle, capmNum); + } else { /* if do not enable sync */ + CAPM_SyncDisableByNumber(capmNum); + } +} + +/** + * @brief Capm select input. + * @param capmHandle: CAPM handle. + * @retval None. + */ +static BASE_StatusType CAPM_InputSel(CAPM_Handle *capmHandle) +{ + CAPM_ASSERT_PARAM(capmHandle != NULL); + if (capmHandle->baseAddress == CAPM0_BASE) { + DCL_CAPM_SetInputSEL0(CAPM_COMM, capmHandle->inputSrc); /* set capm0 input selection */ + } else if (capmHandle->baseAddress == CAPM1_BASE) { + DCL_CAPM_SetInputSEL1(CAPM_COMM, capmHandle->inputSrc); /* set capm1 input selection */ + } else if (capmHandle->baseAddress == CAPM2_BASE) { + DCL_CAPM_SetInputSEL2(CAPM_COMM, capmHandle->inputSrc); /* set capm2 input selection */ + } else { /* error value */ + return BASE_STATUS_ERROR; + } + + return BASE_STATUS_OK; +} + +/** + * @brief CAPM initialize function. + * @param handle: CAPM handle. + * @retval BASE status type: BASE_STATUS_OK, BASE_STATUS_ERROR. + */ +BASE_StatusType HAL_CAPM_Init(CAPM_Handle *handle) +{ + CAPM_ASSERT_PARAM(handle != NULL); + CAPM_ASSERT_PARAM(IsCAPMInstance(handle->baseAddress)); + CAPM_PARAM_CHECK_WITH_RET(handle->useCapNum <= CAPM_MAX_CAP_REG_NUM, BASE_STATUS_ERROR); + CAPM_PARAM_CHECK_WITH_RET(handle->preScale <= CAPM_MAX_PRESCALE, BASE_STATUS_ERROR); + /* Init CAPM TSR division. */ + DCL_CAPM_SetTSRDiv(handle->baseAddress, handle->tscntDiv); + /* Init CAPM capture mode. */ + DCL_CAPM_SetCapMode(handle->baseAddress, handle->capMode); + DCL_CAPM_SetStopSeq(handle->baseAddress, handle->useCapNum - 1); + CAPM_SetDeburrNum(handle); + /* Init CAPM prescale. */ + DCL_CAPM_SetPreScale(handle->baseAddress, handle->preScale); + DCL_CAPM_SetDMATriggleReg(handle->baseAddress, handle->useCapNum - 1); + CAPM_SetRegCaptureEvent(handle); + CAPM_SyncInit(handle); + if (CAPM_InputSel(handle) == BASE_STATUS_ERROR) { + return BASE_STATUS_ERROR; + } + DCL_CAPM_DisableTSRStop((CAPM_COMM_RegStruct *) CAPM_COMM); + /* Enable CAPM interrupt. */ + DCL_CAPM_EnableInter(handle->baseAddress, handle->enableIntFlags); + DCL_CAPM_EnableCapRegLoad(handle->baseAddress); + + return BASE_STATUS_OK; +} + +/** + * @brief CAPM deinitialize function. + * @param handle: CAPM handle. + * @retval BASE status type: BASE_STATUS_OK, BASE_STATUS_ERROR. + */ +BASE_StatusType HAL_CAPM_DeInit(CAPM_Handle *handle) +{ + CAPM_ASSERT_PARAM(handle != NULL); + CAPM_ASSERT_PARAM(IsCAPMInstance(handle->baseAddress)); + /* Clear interrupt callback function. */ + handle->userCallBack.EvtFinishCallback = NULL; + handle->userCallBack.DmaErrorCallback = NULL; + handle->userCallBack.DmaFinishCallback = NULL; + + /* Clear enable operations. */ + DCL_CAPM_DisableInter(handle->baseAddress, handle->enableIntFlags); + DCL_CAPM_DisableCapRegLoad(handle->baseAddress); + return BASE_STATUS_OK; +} + +/** + * @brief Get ECR value. + * @param handle: CAPM handle. + * @param ecrNum: ECR number. + * @retval ECR value. + */ +unsigned int HAL_CAPM_GetECRValue(CAPM_Handle *handle, CAPM_ECRNum ecrNum) +{ + CAPM_ASSERT_PARAM(handle != NULL); + CAPM_PARAM_CHECK_WITH_RET(ecrNum > 0, BASE_STATUS_ERROR); + CAPM_PARAM_CHECK_WITH_RET(ecrNum < CAPM_MAX_CAP_REG_NUM, BASE_STATUS_ERROR); + switch (ecrNum) { + case CAPM_ECR_NUM1: + return DCL_CAPM_GetECR0(handle->baseAddress); /* Get ECR0 value. */ + case CAPM_ECR_NUM2: + return DCL_CAPM_GetECR1(handle->baseAddress); /* Get ECR1 value. */ + case CAPM_ECR_NUM3: + return DCL_CAPM_GetECR2(handle->baseAddress); /* Get ECR2 value. */ + case CAPM_ECR_NUM4: + return DCL_CAPM_GetECR3(handle->baseAddress); /* Get ECR3 value. */ + default: + return BASE_STATUS_OK; + } +} + +/** + * @brief Get current signal level. + * @param handle: CAPM handle. + * @retval Current signal level: CAPM_LOW_LEVEL, CAPM_UP_EDGE, CAPM_DOWN_EDGE, CAPM_HIGH_LEVEL. + */ +unsigned char HAL_CAPM_GetCrtEdge(CAPM_Handle *handle) +{ + CAPM_ASSERT_PARAM(handle != NULL); + return DCL_CAPM_GetCRTEdge(handle->baseAddress); +} + +/** + * @brief Get the number of next ECR to be loaded. + * @param handle: CAPM handle. + * @retval Next ECR number:NEXT_LOAD_ECR0, NEXT_LOAD_ECR1, NEXT_LOAD_ECR2, NEXT_LOAD_ECR3. + */ +unsigned char HAL_CAPM_GetNextLoadECRNum(CAPM_Handle *handle) +{ + CAPM_ASSERT_PARAM(handle != NULL); + return DCL_CAPM_GetNextECRNum(handle->baseAddress); +} + +/** + * @brief Set sync phase value. + * @param handle: CAPM handle. + * @param phase: Default sync phase value. + * @retval None. + */ +void HAL_CAPM_SetSyncPhs(CAPM_Handle *handle, unsigned int phase) +{ + CAPM_ASSERT_PARAM(handle != NULL); + DCL_CAPM_SetSyncPhase(handle->baseAddress, phase); + return; +} + +/** + * @brief Get sync phase value. + * @param handle: CAPM handle. + * @retval Sync phase value. + */ +unsigned int HAL_CAPM_GetSyncPhs(CAPM_Handle *handle) +{ + CAPM_ASSERT_PARAM(handle != NULL); + return DCL_CAPM_GetSyncPhase(handle->baseAddress); +} + +/** + * @brief Get ECR register value by DMA. + * @param handle: CAPM handle. + * @param distAddr: Distance address. + * @param dataLength: CAPM handle. + * @retval BASE status type: BASE_STATUS_OK, BASE_STATUS_ERROR. + */ +BASE_StatusType HAL_CAPM_GetECRValueDMA(CAPM_Handle *handle, unsigned int *distAddr, + unsigned int dataLength) +{ + CAPM_ASSERT_PARAM(handle != NULL); + CAPM_ASSERT_PARAM(handle->dmaHandle != NULL); + CAPM_ASSERT_PARAM(distAddr != NULL); + CAPM_PARAM_CHECK_WITH_RET(dataLength > 0, BASE_STATUS_ERROR); + unsigned int channel; + channel = handle->dmaChannel; + if (channel >= CHANNEL_MAX_NUM) { + return BASE_STATUS_ERROR; + } + /* Config DMA callback. */ + handle->dmaHandle->userCallBack.DMA_CallbackFuns[channel].ChannelFinishCallBack = CAPM_DmaFinishIRQService; + handle->dmaHandle->userCallBack.DMA_CallbackFuns[channel].ChannelErrorCallBack = CAPM_DmaErrorIRQService; + /* Get ECR value by DMA. */ + if (HAL_DMA_StartIT(handle->dmaHandle, (unsigned int)(uintptr_t)(void *)&(handle->baseAddress->ECR0), + (unsigned int)(uintptr_t)(void *)distAddr, dataLength, channel) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/cfd/common/inc/cfd.h b/vendor/others/demo/5-tim_adc/demo/drivers/cfd/common/inc/cfd.h new file mode 100644 index 000000000..c697a72fd --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/cfd/common/inc/cfd.h @@ -0,0 +1,111 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file cfd.h + * @author MCU Driver Team + * @brief CFD module driver. + * @details This file provides firmware CFD Handle structure and Functions + * prototypes to manage the following functionalities of the CFD module. + * + Initialization and de-initialization functions + * + config the register of CFD module + */ + +#ifndef McuMagicTag_CFD_H +#define McuMagicTag_CFD_H + +/* Includes ------------------------------------------------------------------ */ +#include "cfd_ip.h" + +/* Macro definitions ---------------------------------------------------------*/ +/** + * @defgroup CFD CFD + * @brief CFD module. + * @{ + */ + +/** + * @defgroup CFD_Common CFD Common + * @brief CFD common external module. + * @{ + */ + +/** + * @defgroup CFD_Handle_Definition CFD Handle Definition + * @{ + */ + +/* Typedef definitions -------------------------------------------------------*/ + +/** + * @brief CFD module configurable item. + */ +typedef enum { + CFD_CFG_UPPER_BOUND = 0x00000001U, + CFD_CFG_INT_TYPE = 0x00000002U, + CFD_CFG_MAX +} CFD_CFG_TYPE; + +/** + * @brief CFD handle. + */ +typedef struct _CFD_Handle { + CFD_RegStruct *baseAddress; /**< CFD registers base address. */ + unsigned char upperBound; /**< Upper boundary. */ + unsigned int interruptType; /**< Enabled interrupt type. */ + CFD_UserCallBack userCallBack; /**< CFD Interrupt callback functions.*/ + CFD_ExtendHandle handleEx; /**< CFD extend parameter */ +} CFD_Handle; + +/** + * @brief Typedef callback function of CFD + */ +typedef void (*CFD_CallBackFuncType)(void *handle); + +/** + * @} + */ + +/** + * @defgroup CFD_API_Declaration CFD HAL API + * @{ + */ + +/* Hardware abstraction layer functions -------------------------------------------------------- */ +BASE_StatusType HAL_CFD_Init(CFD_Handle *handle); +BASE_StatusType HAL_CFD_DeInit(CFD_Handle *handle); +BASE_StatusType CFD_RspInit(CFD_Handle *handle); +BASE_StatusType CFD_RspDeInit(CFD_Handle *handle); +BASE_StatusType HAL_CFD_Config(CFD_Handle *handle, CFD_CFG_TYPE cfgType); +void HAL_CFD_GetConfig(CFD_Handle *handle); +void HAL_CFD_Start(CFD_Handle *handle); +void HAL_CFD_Stop(CFD_Handle *handle); +BASE_StatusType HAL_CFD_RegisterCallback(CFD_Handle *handle, CFD_Interrupt_Type type, CFD_CallBackFuncType callback); +void HAL_CFD_IrqHandler(void *handle); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_UART_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/cfd/inc/cfd_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/cfd/inc/cfd_ip.h new file mode 100644 index 000000000..8af191578 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/cfd/inc/cfd_ip.h @@ -0,0 +1,284 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file cfd_ip.h + * @author MCU Driver Team + * @brief CFD module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the CFD. + * + Register Struct of CFD + * + CFD Register Map struct + * + Direct Configuration Layer functions of CFD + */ + +#ifndef McuMagicTag_CFD_IP_H +#define McuMagicTag_CFD_IP_H + +/* Includes ------------------------------------------------------------------ */ +#include "baseinc.h" +#include "cmm_ip.h" +#include "crg_ip.h" +/* Macro definitions ---------------------------------------------------------*/ +#ifdef CFD_PARAM_CHECK + #define CFD_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM + #define CFD_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET + #define CFD_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else + #define CFD_ASSERT_PARAM(para) ((void)0U) + #define CFD_PARAM_CHECK_NO_RET(para) ((void)0U) + #define CFD_PARAM_CHECK_WITH_RET(param, ret) ((void)0U) +#endif +/** + * @addtogroup CFD + * @{ + */ + +/** + * @defgroup CFD_IP + * @{ + */ + +/** + * @defgroup CFD_Param_Def CFD Parameters Definition + * @brief Description of CFD configuration parameters. + * @{ + */ + +/* Typedef definitions ------------------------------------------------------- */ +/** + * @brief The CFD module interrupt type mask. + */ +typedef enum { + CFD_INT_CHECK_END_MASK = 0x00000002U, + CFD_INT_PLL_REF_CLOCK_STOP_MASK = 0x00000008U, + CFD_INT_MAX_MASK +} CFD_Interrupt_Type; + +/** + * @} + */ + +/** + * @brief CFD interrupt callback functions. + * + */ +typedef struct { + void (*PllClockStopCallback)(void *handle); /**< Pll clock stop callback function. */ + void (*CheckEndCallback)(void *handle); /**< End of each check callback function. */ +} CFD_UserCallBack; + +/** + * @brief CFD extend handle. + */ +typedef struct _CFD_ExtendeHandle { +} CFD_ExtendHandle; + + +/** + * @brief CFD register mapping structure. + */ +typedef CMM_RegStruct CFD_RegStruct; + +/** + * @} + */ + +/** + * @brief Enable CFD module. + * @param cfdx CFD register base address. + * @retval None. + */ +static inline void DCL_CFD_Enable(CFD_RegStruct *cfdx) +{ + CFD_ASSERT_PARAM(IsCFDInstance(cfdx)); + cfdx->CMCTRL.BIT.cfen = BASE_CFG_ENABLE; + cfdx->CMCTRL.BIT.cmen = BASE_CFG_ENABLE; +} + +/** + * @brief Disable CFD module. + * @param cfdx CFD register base address. + * @retval None. + */ +static inline void DCL_CFD_Disable(CFD_RegStruct *cfdx) +{ + CFD_ASSERT_PARAM(IsCFDInstance(cfdx)); + cfdx->CMCTRL.BIT.cfen = BASE_CFG_DISABLE; + cfdx->CMCTRL.BIT.cmen = BASE_CFG_DISABLE; +} + +/** + * @brief Sets the target and reference clock source of the CFD. + * @param cfdx CFD register base address. + * @retval None. + */ +static inline void DCL_CFD_SetCfdClock(CFD_RegStruct *cfdx) +{ + CFD_ASSERT_PARAM(IsCFDInstance(cfdx)); + if (DCL_CRG_GetPllRefClkSel(CRG) == CRG_PLL_REF_CLK_SELECT_HOSC) { + cfdx->CMTGTCTRL.BIT.tgtsel = CMM_TARGET_CLK_HOSC; + } else { + cfdx->CMTGTCTRL.BIT.tgtsel = CMM_TARGET_CLK_TCXO; + } + cfdx->CMTGTCTRL.BIT.tgtscale = CMM_TARGET_FREQ_DIV_8192; /* target clock frequence 8192 division. */ + cfdx->CMREFCTRL.BIT.refsel = CMM_REF_CLK_LOSC; + cfdx->CMREFCTRL.BIT.refdiv = CMM_REF_FREQ_DIV_0; +} + +/** + * @brief Sets the upper boundary of the detection window. + * @param cfdx CFD register base address. + * @param value The value of the upper bound. + * @retval None. + */ +static inline void DCL_CFD_SetWindowUpperBound(CFD_RegStruct *cfdx, unsigned int value) +{ + CFD_ASSERT_PARAM(IsCFDInstance(cfdx)); + CMWDOH_Reg cfdwdoh; + cfdwdoh.reg = cfdx->CMWDOH.reg; /* Retain the cmwdoh original value. */ + cfdwdoh.BIT.cfdwdoh = value; + cfdx->CMWDOH.reg = cfdwdoh.reg; +} + +/** + * @brief Gets the upper boundary of the detection window. + * @param cfdx CFD register base address. + * @retval The value of the upper bound. + */ +static inline unsigned int DCL_CFD_GetWindowUpperBound(CFD_RegStruct *cfdx) +{ + CFD_ASSERT_PARAM(IsCFDInstance(cfdx)); + CMWDOH_Reg cfdwdoh; + cfdwdoh.reg = cfdx->CMWDOH.reg; + return cfdwdoh.BIT.cfdwdoh; +} + +/** + * @brief Internal counter count latch value. + * @param cfdx CFD register base address. + * @retval unsigned int. latch value. + */ +static inline unsigned int DCL_CFD_GetCntValue(CFD_RegStruct *cfdx) +{ + CFD_ASSERT_PARAM(IsCFDInstance(cfdx)); + return cfdx->CMCNTLOCK.BIT.cmcnt_lock; +} + +/** + * @brief Enables the specified type of interrupt. + * @param cfdx CFD register base address. + * @param type Mask of the interrupt type. + * @retval None. + */ +static inline void DCL_CFD_EnableInterrupt(CFD_RegStruct *cfdx, CFD_Interrupt_Type type) +{ + CFD_ASSERT_PARAM(IsCFDInstance(cfdx)); + CFD_PARAM_CHECK_NO_RET(type == CFD_INT_CHECK_END_MASK || \ + type == CFD_INT_PLL_REF_CLOCK_STOP_MASK); + cfdx->CMINTENA.reg |= type; +} + +/** + * @brief Disables the specified type of interrupt. + * @param cfdx CFD register base address. + * @param type Mask of the interrupt type. + * @retval None. + */ +static inline void DCL_CFD_DisableInterrupt(CFD_RegStruct *cfdx, CFD_Interrupt_Type type) +{ + CFD_ASSERT_PARAM(IsCFDInstance(cfdx)); + CFD_PARAM_CHECK_NO_RET(type == CFD_INT_CHECK_END_MASK || \ + type == CFD_INT_PLL_REF_CLOCK_STOP_MASK); + cfdx->CMINTENA.reg &= (~type); +} + +/** + * @brief Get CFD interrupt type. + * @param cfdx CFD register base address. + * @retval unsigned int. + */ +static inline unsigned int DCL_CFD_GetInterruptType(CFD_RegStruct *cfdx) +{ + CFD_ASSERT_PARAM(IsCFDInstance(cfdx)); + return cfdx->CMINTENA.reg; +} + +/** + * @brief Check whether the specified interrupt is triggered. + * @param cfdx CFD register base address. + * @param type Mask of the interrupt type. + * @retval bool. + */ +static inline bool DCL_CFD_GetInterruptStatus(CFD_RegStruct *cfdx, CFD_Interrupt_Type type) +{ + CFD_ASSERT_PARAM(IsCFDInstance(cfdx)); + CFD_PARAM_CHECK_WITH_RET(type == CFD_INT_CHECK_END_MASK || \ + type == CFD_INT_PLL_REF_CLOCK_STOP_MASK, false); + return (cfdx->CMINTSTS.reg & type) == 0 ? false : true; +} + +/** + * @brief Clears interrupts of the specified type. + * @param cfdx CFD register base address. + * @param type Mask of the interrupt type. + * @retval None. + */ +static inline void DCL_CFD_ClearInterrupt(CFD_RegStruct *cfdx, CFD_Interrupt_Type type) +{ + CFD_ASSERT_PARAM(IsCFDInstance(cfdx)); + CFD_PARAM_CHECK_NO_RET(type == CFD_INT_CHECK_END_MASK || \ + type == CFD_INT_PLL_REF_CLOCK_STOP_MASK); + cfdx->CMINTRAW.reg |= type; +} + +/** + * @brief Injects interrupts of the specified type. + * @param cfdx CFD register base address. + * @param type Mask of the interrupt type. + * @retval None. + */ +static inline void DCL_CFD_EnableInterruptInject(CFD_RegStruct *cfdx, CFD_Interrupt_Type type) +{ + CFD_ASSERT_PARAM(IsCFDInstance(cfdx)); + CFD_PARAM_CHECK_NO_RET(type == CFD_INT_CHECK_END_MASK || \ + type == CFD_INT_PLL_REF_CLOCK_STOP_MASK); + cfdx->CMINTINJ.reg |= type; +} + +/** + * @brief Stop injecting interrupts of a specified type. + * @param cfdx CFD register base address. + * @param type Mask of the interrupt type. + * @retval None. + */ +static inline void DCL_CFD_DisableInterruptInject(CFD_RegStruct *cfdx, CFD_Interrupt_Type type) +{ + CFD_ASSERT_PARAM(IsCFDInstance(cfdx)); + CFD_PARAM_CHECK_NO_RET(type == CFD_INT_CHECK_END_MASK || \ + type == CFD_INT_PLL_REF_CLOCK_STOP_MASK); + cfdx->CMINTINJ.reg &= (~type); +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_CFD_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/cfd/src/cfd.c b/vendor/others/demo/5-tim_adc/demo/drivers/cfd/src/cfd.c new file mode 100644 index 000000000..76f51e03c --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/cfd/src/cfd.c @@ -0,0 +1,181 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file cfd.c + * @author MCU Driver Team + * @brief CFD module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the CFD. + * + Initialization and de-initialization functions. + * + Config the register of cfd. + * + Interrupt callback function and user registration function. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "interrupt.h" +#include "cfd.h" + +/** + * @brief Perform initial configuration based on the handle. + * @param handle CFD handle. + * @retval @ref BASE_StatusType. + */ +BASE_StatusType HAL_CFD_Init(CFD_Handle *handle) +{ + CFD_ASSERT_PARAM(handle != NULL); + CFD_ASSERT_PARAM(IsCFDInstance(handle->baseAddress)); + DCL_CFD_SetWindowUpperBound(handle->baseAddress, handle->upperBound); + DCL_CFD_EnableInterrupt(handle->baseAddress, handle->interruptType); + /* Set CFD clock. */ + if (handle->baseAddress->CMWDOH.BIT.cmwdoh == 0xFFFF) { + DCL_CFD_SetCfdClock(handle->baseAddress); + } + return BASE_STATUS_OK; +} + +/** + * @brief Deinitialize configurations based on the handle. + * @param handle CFD handle. + * @retval @ref BASE_StatusType. + */ +BASE_StatusType HAL_CFD_DeInit(CFD_Handle *handle) +{ + CFD_ASSERT_PARAM(handle != NULL); + CFD_ASSERT_PARAM(IsCFDInstance(handle->baseAddress)); + /* Clear interrupt callback function. */ + handle->userCallBack.PllClockStopCallback = NULL; + handle->userCallBack.CheckEndCallback = NULL; + /* Clear register value. */ + DCL_CFD_DisableInterrupt(handle->baseAddress, BASE_CFG_DISABLE); + return BASE_STATUS_OK; +} + +/** + * @brief Set this parameter based on the configuration item parameters. + * @param handle CFD handle. + * @param cfgType Configurable item. @ref CFD_CFG_TYPE. + * @retval @ref BASE_StatusType. + */ +BASE_StatusType HAL_CFD_Config(CFD_Handle *handle, CFD_CFG_TYPE cfgType) +{ + CFD_ASSERT_PARAM(handle != NULL); + CFD_ASSERT_PARAM(IsCFDInstance(handle->baseAddress)); + /* CFD config type. */ + switch (cfgType) { + case CFD_CFG_UPPER_BOUND: /* Config upperbound. */ + DCL_CFD_SetWindowUpperBound(handle->baseAddress, handle->upperBound); + break; + case CFD_CFG_INT_TYPE: /* Config interrupt type. */ + DCL_CFD_EnableInterrupt(handle->baseAddress, handle->interruptType); + break; + default: + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief Reads the register configuration value to the handle. + * @param handle CFD handle. + * @retval None. + */ +void HAL_CFD_GetConfig(CFD_Handle *handle) +{ + CFD_ASSERT_PARAM(handle != NULL); + CFD_ASSERT_PARAM(IsCFDInstance(handle->baseAddress)); + handle->upperBound = DCL_CFD_GetWindowUpperBound(handle->baseAddress); + handle->interruptType = DCL_CFD_GetInterruptType(handle->baseAddress); +} + +/** + * @brief Start CFD Module. + * @param handle CFD handle. + * @retval None. + */ +void HAL_CFD_Start(CFD_Handle *handle) +{ + CFD_ASSERT_PARAM(handle != NULL); + CFD_ASSERT_PARAM(IsCFDInstance(handle->baseAddress)); + DCL_CFD_Enable(handle->baseAddress); +} + +/** + * @brief Stop CFD Module. + * @param handle CFD handle. + * @retval None. + */ +void HAL_CFD_Stop(CFD_Handle *handle) +{ + CFD_ASSERT_PARAM(handle != NULL); + CFD_ASSERT_PARAM(IsCFDInstance(handle->baseAddress)); + DCL_CFD_Disable(handle->baseAddress); +} + +/** + * @brief Registers the interrupt function to the specified interrupt type. + * @param handle CFD handle. + * @param type Specified interrupt type. + * @param callback Interrupt callback function. + * @retval @ref BASE_StatusType. + */ +BASE_StatusType HAL_CFD_RegisterCallback(CFD_Handle *handle, CFD_Interrupt_Type type, CFD_CallBackFuncType callback) +{ + CFD_ASSERT_PARAM(handle != NULL); + CFD_ASSERT_PARAM(callback != NULL); + CFD_ASSERT_PARAM(IsCFDInstance(handle->baseAddress)); + /* Interrupt type. */ + switch (type) { + case CFD_INT_PLL_REF_CLOCK_STOP_MASK: /* Clock stop interrupt. */ + handle->userCallBack.PllClockStopCallback = callback; + break; + case CFD_INT_CHECK_END_MASK: /* Check end interrupt. */ + handle->userCallBack.CheckEndCallback = callback; + break; + default: + return BASE_STATUS_ERROR; + } + + return BASE_STATUS_OK; +} + +/** + * @brief Interrupt service processing function. + * @param handle CFD Handle. + * @retval None. + */ +void HAL_CFD_IrqHandler(void *handle) +{ + CFD_ASSERT_PARAM(handle != NULL); + CFD_Handle *cfdHandle = (CFD_Handle *)handle; + CFD_ASSERT_PARAM(IsCFDInstance(cfdHandle->baseAddress)); + + /* PLL clock stop interrupt. */ + if (cfdHandle->baseAddress->CMINTSTS.BIT.clk_fail_int == 0x01) { + cfdHandle->baseAddress->CMINTRAW.BIT.clk_fail_raw = BASE_CFG_SET; + if (cfdHandle->userCallBack.PllClockStopCallback) { + cfdHandle->userCallBack.PllClockStopCallback(cfdHandle); + } + } + + /* Check end interrupt. */ + if (cfdHandle->baseAddress->CMINTSTS.BIT.chk_end_int == 0x01) { + cfdHandle->baseAddress->CMINTRAW.BIT.chk_end_raw = BASE_CFG_SET; + if (cfdHandle->userCallBack.CheckEndCallback) { + cfdHandle->userCallBack.CheckEndCallback(cfdHandle); + } + } +} diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/cmm/common/inc/cmm.h b/vendor/others/demo/5-tim_adc/demo/drivers/cmm/common/inc/cmm.h new file mode 100644 index 000000000..fedc5f368 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/cmm/common/inc/cmm.h @@ -0,0 +1,121 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file cmm.h + * @author MCU Driver Team + * @brief CMM module driver. + * @details This file provides firmware CMM Handle structure and Functions + * prototypes to manage the following functionalities of the CMM module. + * + Initialization and de-initialization functions + * + config the register of CMM module + */ + +#ifndef McuMagicTag_CMM_H +#define McuMagicTag_CMM_H + +/* Includes ------------------------------------------------------------------ */ +#include "cmm_ip.h" + +/* Macro definitions ---------------------------------------------------------*/ +/** + * @defgroup CMM CMM + * @brief CMM module. + * @{ + */ + +/** + * @defgroup CMM_Common CMM Common + * @brief CMM common external module. + * @{ + */ + +/** + * @defgroup CMM_Handle_Definition CMM Handle Definition + * @{ + */ + +/* Typedef definitions -------------------------------------------------------*/ + +/** + * @brief CMM module configurable item. + */ +typedef enum { + CMM_CFG_TRIGGER_MODE = 0x00000001U, + CMM_CFG_TARGET_SOURCE = 0x00000002U, + CMM_CFG_TARGET_FREQ_DIV = 0x00000003U, + CMM_CFG_REF_SOURCE = 0x00000004U, + CMM_CFG_REF_FREQ_DIV = 0x00000005U, + CMM_CFG_UPPER_BOUND = 0x00000006U, + CMM_CFG_LOWER_BOUND = 0x00000007U, + CMM_CFG_INT_TYPE = 0x00000008U, + CMM_CFG_MAX +} CMM_CFG_TYPE; + +/** + * @brief CMM handle. + */ +typedef struct _CMM_Handle { + CMM_RegStruct *baseAddress; /**< CMM registers base address. */ + CMM_Trigger_Mode mode; /**< Effective edge of the target clock. */ + CMM_Target_Freq_Div_Value targetFreqDivision; /**< Frequency divider of the working target clock. */ + CMM_Ref_Freq_Div_Value refFreqDivision; /**< Frequency divider of the working reference clock. */ + CMM_Target_Clock_Source targetClockSource; /**< Working target clock source selection. */ + CMM_Ref_Clock_Source refClockSource; /**< Working reference clock source selection. */ + unsigned short upperBound; /**< Upper bound of window. */ + unsigned short lowerBound; /**< Lower bound of window. */ + CMM_Interrupt_Type interruptType; /**< Enabled interrupt type. */ + CMM_UserCallBack userCallBack; /**< CMM Interrupt callback functions.*/ + CMM_ExtendHandle handleEx; /**< CMM extend parameter */ +} CMM_Handle; + +/** + * @brief Typedef callback function of CMM + */ +typedef void (*CMM_CallBackFuncType)(void *handle); + +/** + * @} + */ + +/** + * @defgroup CMM_API_Declaration CMM HAL API + * @{ + */ + +/* Hardware abstraction layer functions -------------------------------------------------------- */ +BASE_StatusType HAL_CMM_Init(CMM_Handle *handle); +BASE_StatusType HAL_CMM_DeInit(CMM_Handle *handle); +BASE_StatusType HAL_CMM_Config(CMM_Handle *handle, CMM_CFG_TYPE cfgType); +void HAL_CMM_GetConfig(CMM_Handle *handle); +void HAL_CMM_Start(CMM_Handle *handle); +void HAL_CMM_Stop(CMM_Handle *handle); +BASE_StatusType HAL_CMM_RegisterCallback(CMM_Handle *handle, CMM_Interrupt_Type type, CMM_CallBackFuncType callback); +void HAL_CMM_IrqHandler(void *handle); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_UART_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/cmm/inc/cmm_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/cmm/inc/cmm_ip.h new file mode 100644 index 000000000..129916eb3 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/cmm/inc/cmm_ip.h @@ -0,0 +1,612 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file cmm_ip.h + * @author MCU Driver Team + * @brief CMM module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the CMM. + * + Register Struct of CMM + * + CMM Register Map struct + * + Direct Configuration Layer functions of CMM + */ + +#ifndef McuMagicTag_CMM_IP_H +#define McuMagicTag_CMM_IP_H + +/* Includes ------------------------------------------------------------------ */ +#include "baseinc.h" +/* Macro definitions ------------------------------------------------------- */ +#ifdef CMM_PARAM_CHECK + #define CMM_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM + #define CMM_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET + #define CMM_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else + #define CMM_ASSERT_PARAM(para) ((void)0U) + #define CMM_PARAM_CHECK_NO_RET(para) ((void)0U) + #define CMM_PARAM_CHECK_WITH_RET(param, ret) ((void)0U) +#endif +/** + * @addtogroup CMM + * @{ + */ + +/** + * @defgroup CMM_IP: cmm_v1 + * @{ + */ + +/** + * @defgroup CMM_Param_Def CMM Parameters Definition + * @brief Description of CMM configuration parameters. + * @{ + */ + +/* Typedef definitions ------------------------------------------------------- */ +typedef enum { + CMM_TRIGGER_RISE = 0x00000000U, + CMM_TRIGGER_FALL = 0x00000001U, + CMM_TRIGGER_BOTH = 0x00000002U, + CMM_TRIGGER_NONE = 0x00000003U, + CMM_TRIGGER_MAX +} CMM_Trigger_Mode; + +typedef enum { + CMM_TARGET_FREQ_DIV_0 = 0x00000000U, + CMM_TARGET_FREQ_DIV_32 = 0x00000001U, + CMM_TARGET_FREQ_DIV_128 = 0x00000002U, + CMM_TARGET_FREQ_DIV_1024 = 0x00000003U, + CMM_TARGET_FREQ_DIV_8192 = 0x00000004U, + CMM_TARGET_FREQ_DIV_MAX +} CMM_Target_Freq_Div_Value; + +typedef enum { + CMM_REF_FREQ_DIV_0 = 0x00000000U, + CMM_REF_FREQ_DIV_4 = 0x00000001U, + CMM_REF_FREQ_DIV_8 = 0x00000002U, + CMM_REF_FREQ_DIV_32 = 0x00000003U, + CMM_REF_FREQ_DIV_MAX +} CMM_Ref_Freq_Div_Value; + +typedef enum { + CMM_TARGET_CLK_LOSC = 0x00000000U, + CMM_TARGET_CLK_HOSC = 0x00000001U, + CMM_TARGET_CLK_TCXO = 0x00000002U, + CMM_TARGET_CLK_HS_SYS = 0x00000003U, + CMM_TARGET_CLK_MAX +} CMM_Target_Clock_Source; + +typedef enum { + CMM_REF_CLK_LOSC = 0x00000000U, + CMM_REF_CLK_HOSC = 0x00000001U, + CMM_REF_CLK_TCXO = 0x00000002U, + CMM_REF_CLK_HS_SYS = 0x00000003U, + CMM_REF_CLK_MAX +} CMM_Ref_Clock_Source; + +typedef enum { + CMM_INT_COUNTER_OVERFLOW_MASK = 0x00000001U, + CMM_INT_CHECK_END_MASK = 0x00000002U, + CMM_INT_FREQ_ERR_MASK = 0x00000004U, + CMM_INT_CLOCK_FAIL_MASK = 0x00000008U, + CMM_INT_MAX +} CMM_Interrupt_Type; + +/** + * @} + */ + +/** + * @defgroup CMM_Reg_Def CMM Register Definition + * @brief Description CMM register mapping structure. + * @{ + */ + +/** + * @brief CMM version registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int month_day : 16; /**< Month and day. */ + unsigned int year : 8; /**< Year. */ + unsigned int release_ver : 3; /**< Version information. */ + unsigned int reserved0 : 5; + } BIT; +} volatile CMVER_Reg; + +/** + * @brief CMM control registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cmen : 1; /**< CMM enable or disable. */ + unsigned int cfen : 1; /**< CFD clock failure detection enable. */ + unsigned int reserved0 : 30; + } BIT; +} volatile CMCTRL_Reg; + +/** + * @brief CMM target clock control registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int tgtsel : 3; /**< CMM target clock source. */ + unsigned int reserved0 : 1; + unsigned int tgtscale : 3; /**< CMM target clock divide factor. */ + unsigned int reserved1 : 1; + unsigned int reserved2 : 24; + } BIT; +} volatile CMTGTCTRL_Reg; + +/** + * @brief CMM reference clock control registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int refsel : 2; /**< CMM reference clock source. */ + unsigned int reserved0 : 2; + unsigned int refdiv : 2; /**< CMM reference clock divide factor. */ + unsigned int reserved1 : 26; + } BIT; +} volatile CMREFCTRL_Reg; + +/** + * @brief CMM check window upper bound registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cmwdoh : 16; /**< CMM clock frequence error check window upper bound value. */ + unsigned int cfdwdoh : 16; /**< CMM clock failure check window upper bound value. */ + } BIT; +} volatile CMWDOH_Reg; + +/** + * @brief CMM check window low bound registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cmwdol : 16; /**< CMM check window low bound value. */ + unsigned int reserved0 : 16; + } BIT; +} volatile CMWDOL_Reg; + +/** + * @brief CMM count locked value registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cmcnt_lock : 16; /**< CMM count locked value */ + unsigned int reserved0 : 16; + } BIT; +} volatile CMCNTLOCK_Reg; + +/** + * @brief CMM interrupt enable registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cnt_ovf_en : 1; /**< CMM count overflow interrupt enable. */ + unsigned int chk_end_en : 1; /**< CMM check end interrupt enable. */ + unsigned int freq_err_en : 1; /**< CMM frequence error interrupt enable. */ + unsigned int clk_fail_en : 1; /**< CMM clock failure interrupt enable. */ + unsigned int reserved0 : 28; + } BIT; +} volatile CMINTENA_Reg; + +/** + * @brief CMM interrupt status registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cnt_ovf_int : 1; /**< CMM count overflow interrupt status. */ + unsigned int chk_end_int : 1; /**< CMM check end interrupt status. */ + unsigned int freq_err_int : 1; /**< CMM frequence error interrupt status. */ + unsigned int clk_fail_int : 1; /**< CMM clock failure interrupt status. */ + unsigned int reserved0 : 28; + } BIT; +} volatile CMINTSTS_Reg; + +/** + * @brief CMM initial interrupt registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cnt_ovf_raw : 1; /**< CMM count overflow initial interrupt. */ + unsigned int chk_end_raw : 1; /**< CMM check end initial interrupt. */ + unsigned int freq_err_raw : 1; /**< CMM frequence error initial interrupt. */ + unsigned int clk_fail_raw : 1; /**< CMM clock failure initial interrupt. */ + unsigned int reserved0 : 28; + } BIT; +} volatile CMINTRAW_Reg; + +/** + * @brief CMM interrupt injection registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cnt_ovf_inj : 1; /**< CMM frequence error interrupt injection. */ + unsigned int chk_end_inj : 1; /**< CMM check end interrupt injection. */ + unsigned int freq_err_inj : 1; /**< CMM frequence error interrupt injection. */ + unsigned int clk_fail_inj : 1; /**< CMM clock failure interrupt injection. */ + unsigned int reserved0 : 28; + } BIT; +} volatile CMINTINJ_Reg; + +/** + * @brief CMM status registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cnt_frozen : 1; /**< CMM counter frozen status. */ + unsigned int reserved0 : 31; + } BIT; +} volatile CMSTS_Reg; + +/** + * @brief CMM Interrupt callback functions. + * + */ +typedef struct { + void (*FreqErrorCallback)(void *handle); /**< Clock frequency error callback function */ + void (*CheckEndCallback)(void *handle); /**< End of each check callback function */ + void (*CountOverflowCallback)(void *handle); /**< Count Overflow callback function */ +} CMM_UserCallBack; + +/** + * @brief CMM extend handle. + */ +typedef struct _CMM_ExtendeHandle { +} CMM_ExtendHandle; + +/** + * @brief CMM register mapping structure. + */ +typedef struct { + CMVER_Reg CMVER; /**< CMM version register, offset address: 0x0000. */ + CMCTRL_Reg CMCTRL; /**< CMM control register, offset address: 0x0004. */ + CMTGTCTRL_Reg CMTGTCTRL; /**< CMM target clock control register, offset address: 0x0008. */ + CMREFCTRL_Reg CMREFCTRL; /**< CMM reference clock control register, offset address: 0x000C. */ + CMWDOH_Reg CMWDOH; /**< CMM check window upper bound register, offset address: 0x0010. */ + CMWDOL_Reg CMWDOL; /**< CMM check window low bound register, offset address: 0x0014. */ + CMCNTLOCK_Reg CMCNTLOCK; /**< CMM count locked value register, offset address: 0x0018. */ + CMINTENA_Reg CMINTENA; /**< CMM interrupt enable register, offset address: 0x001C. */ + CMINTSTS_Reg CMINTSTS; /**< CMM interrupt status register, offset address: 0x0020. */ + CMINTRAW_Reg CMINTRAW; /**< CMM initial interrupt register, offset address: 0x0024. */ + CMINTINJ_Reg CMINTINJ; /**< CMM interrupt injection register, offset address: 0x0028. */ + CMSTS_Reg CMSTS; /**< CMM status register, offset Address: 0x002C. */ +} volatile CMM_RegStruct; + +/** + * @} + */ +/** + * @brief Get CMM's release ver and year and month day. + * @param cmmx CMM register base address. + * @retval None. + */ +static inline unsigned int DCL_CMM_GetVersion(CMM_RegStruct *cmmx) +{ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + return cmmx->CMVER.reg; +} + + +/** + * @brief Enable CMM's clock monitor function. + * @param cmmx CMM register base address. + * @retval None. + */ +static inline void DCL_CMM_Enable(CMM_RegStruct *cmmx) +{ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + cmmx->CMCTRL.BIT.cmen = BASE_CFG_ENABLE; +} + +/** + * @brief Disable CMM's clock monitor function. + * @param cmmx CMM register base address. + * @retval None. + */ +static inline void DCL_CMM_Disable(CMM_RegStruct *cmmx) +{ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + cmmx->CMCTRL.BIT.cmen = BASE_CFG_DISABLE; +} + +/** + * @brief Sets the frequency divider of the target clock. + * @param cmmx CMM register base address. + * @param value Specified frequency divider. + * @retval None. + */ +static inline void DCL_CMM_SetTargetClockFreqDivision(CMM_RegStruct *cmmx, CMM_Target_Freq_Div_Value value) +{ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + CMM_PARAM_CHECK_NO_RET(value < CMM_TARGET_FREQ_DIV_MAX); + cmmx->CMTGTCTRL.BIT.tgtscale = value; +} + +/** + * @brief Gets the frequency divider of the target clock. + * @param cmmx CMM register base address. + * @retval unsigned int @ref CMM_Target_Freq_Div_Value. + */ +static inline unsigned int DCL_CMM_GetTargetClockFreqDivision(CMM_RegStruct *cmmx) +{ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + return cmmx->CMTGTCTRL.BIT.tgtscale; +} + +/** + * @brief Sets the target clock source. + * @param cmmx CMM register base address. + * @param clockSource Specifies the type of the clock source. + * @retval None. + */ +static inline void DCL_CMM_SetTargetClockSource(CMM_RegStruct *cmmx, CMM_Target_Clock_Source clockSource) +{ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + CMM_PARAM_CHECK_NO_RET(clockSource < CMM_TARGET_CLK_MAX); + cmmx->CMTGTCTRL.BIT.tgtsel = clockSource; +} + +/** + * @brief Gets the target clock source. + * @param cmmx CMM register base address. + * @retval unsigned int @ref CMM_Target_Clock_Source. + */ +static inline unsigned int DCL_CMM_GetTargetClockSource(CMM_RegStruct *cmmx) +{ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + return cmmx->CMTGTCTRL.BIT.tgtsel; +} + +/** + * @brief Sets the frequency divider of the reference clock. + * @param cmmx CMM register base address. + * @param value Specified frequency divider. + * @retval None. + */ +static inline void DCL_CMM_SetRefClockFreqDivision(CMM_RegStruct *cmmx, CMM_Ref_Freq_Div_Value value) +{ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + CMM_PARAM_CHECK_NO_RET(value < CMM_REF_FREQ_DIV_MAX); + cmmx->CMREFCTRL.BIT.refdiv = value; +} + +/** + * @brief Gets the frequency divider of the reference clock. + * @param cmmx CMM register base address. + * @retval unsigned int @ref CMM_Ref_Freq_Div_Value. + */ +static inline unsigned int DCL_CMM_GetRefClockFreqDivision(CMM_RegStruct *cmmx) +{ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + return cmmx->CMREFCTRL.BIT.refdiv; +} + +/** + * @brief Sets the reference clock source. + * @param cmmx CMM register base address. + * @param clockSource Specified reference clock source. + * @retval None. + */ +static inline void DCL_CMM_SetRefClockSource(CMM_RegStruct *cmmx, CMM_Ref_Clock_Source clockSource) +{ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + CMM_PARAM_CHECK_NO_RET(clockSource < CMM_REF_CLK_MAX); + cmmx->CMREFCTRL.BIT.refsel = clockSource; +} + +/** + * @brief Gets the reference clock source. + * @param cmmx CMM register base address. + * @retval unsigned int @ref CMM_Ref_Clock_Source. + */ +static inline unsigned int DCL_CMM_GetRefClockSource(CMM_RegStruct *cmmx) +{ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + return cmmx->CMREFCTRL.BIT.refsel; +} + +/** + * @brief Set the cmm's upper boundary of the detection windowL. + * @param cmmx CMM register base address. + * @param value The value of the cmm upper bound. + * @retval None. + */ +static inline void DCL_CMM_SetCmmWindowUpperBound(CMM_RegStruct *cmmx, unsigned short value) +{ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + cmmx->CMWDOH.BIT.cmwdoh = value; +} + +/** + * @brief Gets the cmm's upper boundary of the detection window. + * @param cmmx CMM register base address. + * @retval The value of the cmm's upper bound. + */ +static inline unsigned short DCL_CMM_GetCmmWindowUpperBound(CMM_RegStruct *cmmx) +{ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + return cmmx->CMWDOH.BIT.cmwdoh; +} + +/** + * @brief Sets the cmm's lower boundary of the detection window. + * @param cmmx CMM register base address. + * @param value The value of the cmm's lower bound. + * @retval None. + */ +static inline void DCL_CMM_SetCmmWindowLowerBound(CMM_RegStruct *cmmx, unsigned short value) +{ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + cmmx->CMWDOL.BIT.cmwdol = value; +} + +/** + * @brief Gets the lower boundary of the detection window. + * @param cmmx CMM register base address. + * @retval The value of the cmm's lower bound. + */ +static inline unsigned short DCL_CMM_GetCmmWindowLowerBound(CMM_RegStruct *cmmx) +{ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + return cmmx->CMWDOL.BIT.cmwdol; +} + +/** + * @brief Internal counter count latch value. + * @param cmmx CMM register base address. + * @retval unsigned short. latch value. + */ +static inline unsigned short DCL_CMM_GetCntValue(CMM_RegStruct *cmmx) +{ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + return cmmx->CMCNTLOCK.BIT.cmcnt_lock; +} + +/** + * @brief check whether is interrupt type. + * @param type Mask of the interrupt type. + * @retval bool. + */ +static inline bool IsCMMInterruptType(CMM_Interrupt_Type type) +{ + return (type == CMM_INT_COUNTER_OVERFLOW_MASK || \ + type == CMM_INT_CHECK_END_MASK || \ + type == CMM_INT_CLOCK_FAIL_MASK || \ + type == CMM_INT_FREQ_ERR_MASK); +} + +/** + * @brief Enables the specified type of interrupt. + * @param cmmx CMM register base address. + * @param type Mask of the interrupt type. + * @retval None. + */ +static inline void DCL_CMM_EnableInterrupt(CMM_RegStruct *cmmx, CMM_Interrupt_Type type) +{ + /* if define macro CMM_PARAM_CHECK, function of param check is valid */ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + CMM_PARAM_CHECK_NO_RET(IsCMMInterruptType(type)); + cmmx->CMINTENA.reg |= type; +} + +/** + * @brief Disables the specified type of interrupt. + * @param cmmx CMM register base address. + * @param type Mask of the interrupt type. + * @retval None. + */ +static inline void DCL_CMM_DisableInterrupt(CMM_RegStruct *cmmx, CMM_Interrupt_Type type) +{ + /* if define macro CMM_PARAM_CHECK, function of param check is valid */ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + CMM_PARAM_CHECK_NO_RET(IsCMMInterruptType(type)); + cmmx->CMINTENA.reg &= (~type); +} + +/** + * @brief Check whether the specified interrupt is triggered. + * @param cmmx CMM register base address. + * @param type Mask of the interrupt type. + * @retval bool. + */ +static inline bool DCL_CMM_GetInterruptStatus(CMM_RegStruct *cmmx, CMM_Interrupt_Type type) +{ + /* if define macro CMM_PARAM_CHECK, function of param check is valid */ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + CMM_PARAM_CHECK_WITH_RET(IsCMMInterruptType(type), false); + return (cmmx->CMINTSTS.reg & type) == 0 ? false : true; +} + +/** + * @brief Clears interrupts of the specified type. + * @param cmmx CMM register base address. + * @param type Mask of the interrupt type. + * @retval None. + */ +static inline void DCL_CMM_ClearInterrupt(CMM_RegStruct *cmmx, CMM_Interrupt_Type type) +{ + /* if define macro CMM_PARAM_CHECK, function of param check is valid */ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + CMM_PARAM_CHECK_NO_RET(IsCMMInterruptType(type)); + cmmx->CMINTRAW.reg |= type; +} + +/** + * @brief Injects interrupts of the specified type. + * @param cmmx CMM register base address. + * @param type Mask of the interrupt type. + * @retval None. + */ +static inline void DCL_CMM_EnableInterruptInject(CMM_RegStruct *cmmx, CMM_Interrupt_Type type) +{ + /* if define macro CMM_PARAM_CHECK, function of param check is valid */ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + CMM_PARAM_CHECK_NO_RET(IsCMMInterruptType(type)); + cmmx->CMINTINJ.reg |= type; +} + +/** + * @brief Stop injecting interrupts of a specified type. + * @param cmmx CMM register base address. + * @param type Mask of the interrupt type. + * @retval None. + */ +static inline void DCL_CMM_DisableInterruptInject(CMM_RegStruct *cmmx, CMM_Interrupt_Type type) +{ + /* if define macro CMM_PARAM_CHECK, function of param check is valid */ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + CMM_PARAM_CHECK_NO_RET(IsCMMInterruptType(type)); + cmmx->CMINTINJ.reg &= (~type); +} + +/** + * @brief Check cmm cnt whether is frozen or not. + * @param cmmx CMM register base address. + * @retval bool. + */ +static inline bool DCL_CMM_CheckCntFrozenState(CMM_RegStruct *cmmx) +{ + /* if define macro CMM_PARAM_CHECK, function of param check is valid */ + CMM_ASSERT_PARAM(IsCMMInstance(cmmx)); + return cmmx->CMSTS.BIT.cnt_frozen; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_CMM_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/cmm/src/cmm.c b/vendor/others/demo/5-tim_adc/demo/drivers/cmm/src/cmm.c new file mode 100644 index 000000000..fbc8e26bb --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/cmm/src/cmm.c @@ -0,0 +1,235 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file cmm.c + * @author MCU Driver Team + * @brief CMM module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the CMM. + * + Initialization and de-initialization functions. + * + Config the register of CMM. + * + Interrupt callback function and user registration function. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "interrupt.h" +#include "cmm.h" + +/** + * @brief Perform initial configuration based on the handle. + * @param handle CMM handle. + * @retval @ref BASE_StatusType. + */ +BASE_StatusType HAL_CMM_Init(CMM_Handle *handle) +{ + /* param check */ + CMM_ASSERT_PARAM(handle != NULL); + CMM_ASSERT_PARAM(IsCMMInstance(handle->baseAddress)); + CMM_PARAM_CHECK_WITH_RET(handle->targetClockSource < CMM_TARGET_CLK_MAX, BASE_STATUS_ERROR); + CMM_PARAM_CHECK_WITH_RET(handle->targetFreqDivision < CMM_TARGET_FREQ_DIV_MAX, BASE_STATUS_ERROR); + CMM_PARAM_CHECK_WITH_RET(handle->refClockSource < CMM_REF_CLK_MAX, BASE_STATUS_ERROR); + CMM_PARAM_CHECK_WITH_RET(handle->refFreqDivision < CMM_REF_FREQ_DIV_MAX, BASE_STATUS_ERROR); + CMM_PARAM_CHECK_WITH_RET(handle->interruptType < CMM_INT_MAX, BASE_STATUS_ERROR); + /* init handle value into register */ + /* Init CMM target clock. */ + DCL_CMM_SetTargetClockSource(handle->baseAddress, handle->targetClockSource); + DCL_CMM_SetTargetClockFreqDivision(handle->baseAddress, handle->targetFreqDivision); + /* Init CMM reference clock. */ + DCL_CMM_SetRefClockSource(handle->baseAddress, handle->refClockSource); + DCL_CMM_SetRefClockFreqDivision(handle->baseAddress, handle->refFreqDivision); + /* Init CMM UpperBound and LowerBound. */ + DCL_CMM_SetCmmWindowUpperBound(handle->baseAddress, handle->upperBound); + DCL_CMM_SetCmmWindowLowerBound(handle->baseAddress, handle->lowerBound); + DCL_CMM_EnableInterrupt(handle->baseAddress, handle->interruptType); + return BASE_STATUS_OK; +} + +/** + * @brief Deinitialize configurations based on the handle. + * @param handle CMM handle. + * @retval @ref BASE_StatusType. + */ +BASE_StatusType HAL_CMM_DeInit(CMM_Handle *handle) +{ + CMM_ASSERT_PARAM(handle != NULL); + CMM_ASSERT_PARAM(IsCMMInstance(handle->baseAddress)); + /* Clear interrupt callback function. */ + handle->userCallBack.FreqErrorCallback = NULL; + handle->userCallBack.CheckEndCallback = NULL; + handle->userCallBack.CountOverflowCallback = NULL; + /* Disables the specified type of interrupt. */ + DCL_CMM_DisableInterrupt(handle->baseAddress, handle->interruptType); + return BASE_STATUS_OK; +} + +/** + * @brief Set this parameter based on the configuration item parameters. + * @param handle CMM handle. + * @param cfgType Configurable item. @ref CMM_CFG_TYPE. + * @retval @ref BASE_StatusType. + */ +BASE_StatusType HAL_CMM_Config(CMM_Handle *handle, CMM_CFG_TYPE cfgType) +{ + /* param check */ + CMM_ASSERT_PARAM(handle != NULL); + CMM_ASSERT_PARAM(IsCMMInstance(handle->baseAddress)); + CMM_PARAM_CHECK_WITH_RET(handle->targetClockSource < CMM_TARGET_CLK_MAX, BASE_STATUS_ERROR); + CMM_PARAM_CHECK_WITH_RET(handle->targetFreqDivision < CMM_TARGET_FREQ_DIV_MAX, BASE_STATUS_ERROR); + CMM_PARAM_CHECK_WITH_RET(handle->refClockSource < CMM_REF_CLK_MAX, BASE_STATUS_ERROR); + CMM_PARAM_CHECK_WITH_RET(handle->refFreqDivision < CMM_REF_FREQ_DIV_MAX, BASE_STATUS_ERROR); + CMM_PARAM_CHECK_WITH_RET(handle->interruptType < CMM_INT_MAX, BASE_STATUS_ERROR); + /* config register value with different type of cmm member */ + switch (cfgType) { + case CMM_CFG_UPPER_BOUND: + DCL_CMM_SetCmmWindowUpperBound(handle->baseAddress, handle->upperBound); /* upperBound value */ + break; + case CMM_CFG_LOWER_BOUND: + DCL_CMM_SetCmmWindowLowerBound(handle->baseAddress, handle->lowerBound); /* lowerBound value */ + break; + case CMM_CFG_TARGET_SOURCE: + DCL_CMM_SetTargetClockSource(handle->baseAddress, handle->targetClockSource); /* target Clock Source */ + break; + case CMM_CFG_TARGET_FREQ_DIV: + /* target Freq Division */ + DCL_CMM_SetTargetClockFreqDivision(handle->baseAddress, handle->targetFreqDivision); + break; + case CMM_CFG_REF_SOURCE: + DCL_CMM_SetRefClockSource(handle->baseAddress, handle->refClockSource); /* ref Clock Source */ + break; + case CMM_CFG_REF_FREQ_DIV: + DCL_CMM_SetRefClockFreqDivision(handle->baseAddress, handle->refFreqDivision); /* ref Freq Division */ + break; + case CMM_CFG_INT_TYPE: + DCL_CMM_EnableInterrupt(handle->baseAddress, handle->interruptType); /* interrupt Type */ + break; + default: + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief Reads the register configuration value to the handle. + * @param handle CMM handle. + * @retval None. + */ +void HAL_CMM_GetConfig(CMM_Handle *handle) +{ + /* param check */ + CMM_ASSERT_PARAM(handle != NULL); + CMM_ASSERT_PARAM(IsCMMInstance(handle->baseAddress)); + /* Get config of cmm member from register */ + handle->upperBound = DCL_CMM_GetCmmWindowUpperBound(handle->baseAddress); + handle->lowerBound = DCL_CMM_GetCmmWindowLowerBound(handle->baseAddress); + handle->targetClockSource = DCL_CMM_GetTargetClockSource(handle->baseAddress); + handle->targetFreqDivision = DCL_CMM_GetTargetClockFreqDivision(handle->baseAddress); + handle->refClockSource = DCL_CMM_GetRefClockSource(handle->baseAddress); + handle->refFreqDivision = DCL_CMM_GetRefClockFreqDivision(handle->baseAddress); +} + +/** + * @brief Start CMM Module. + * @param handle CMM handle. + * @retval None. + */ +void HAL_CMM_Start(CMM_Handle *handle) +{ + CMM_ASSERT_PARAM(handle != NULL); + CMM_ASSERT_PARAM(IsCMMInstance(handle->baseAddress)); + DCL_CMM_Enable(handle->baseAddress); +} + +/** + * @brief Stop CMM Module. + * @param handle CMM handle. + * @retval None. + */ +void HAL_CMM_Stop(CMM_Handle *handle) +{ + CMM_ASSERT_PARAM(handle != NULL); + CMM_ASSERT_PARAM(IsCMMInstance(handle->baseAddress)); + DCL_CMM_Disable(handle->baseAddress); +} + +/** + * @brief Registers the interrupt function to the specified interrupt type. + * @param handle CMM handle. + * @param type Specified interrupt type. + * @param callback Interrupt callback function. + * @retval @ref BASE_StatusType. + */ +BASE_StatusType HAL_CMM_RegisterCallback(CMM_Handle *handle, CMM_Interrupt_Type type, CMM_CallBackFuncType callback) +{ + CMM_ASSERT_PARAM(handle != NULL); + CMM_ASSERT_PARAM(callback != NULL); + CMM_ASSERT_PARAM(IsCMMInstance(handle->baseAddress)); + + switch (type) { + case CMM_INT_FREQ_ERR_MASK: /* Frequence error interrupt. */ + handle->userCallBack.FreqErrorCallback = callback; + break; + case CMM_INT_CHECK_END_MASK: /* Check end interrupt. */ + handle->userCallBack.CheckEndCallback = callback; + break; + case CMM_INT_COUNTER_OVERFLOW_MASK: /* Counter overflow interrupt. */ + handle->userCallBack.CountOverflowCallback = callback; + break; + default: + return BASE_STATUS_ERROR; + } + + return BASE_STATUS_OK; +} + +/** + * @brief Interrupt service processing function. + * @param handle CMM Handle. + * @retval None. + */ +void HAL_CMM_IrqHandler(void *handle) +{ + CMM_ASSERT_PARAM(handle != NULL); + CMM_Handle *cmmHandle = (CMM_Handle *)handle; + CMM_ASSERT_PARAM(IsCMMInstance(cmmHandle->baseAddress)); + + /* Frequence error interrupt. */ + if (cmmHandle->baseAddress->CMINTSTS.BIT.freq_err_int == 0x01) { + cmmHandle->baseAddress->CMINTRAW.BIT.freq_err_raw = BASE_CFG_SET; + /* Disable and then enable the CMM to ensure that the CMM can still work. */ + cmmHandle->baseAddress->CMCTRL.BIT.cmen = BASE_CFG_UNSET; + cmmHandle->baseAddress->CMCTRL.BIT.cmen = BASE_CFG_SET; + if (cmmHandle->userCallBack.FreqErrorCallback) { + cmmHandle->userCallBack.FreqErrorCallback(cmmHandle); + } + } + + /* Check end interrupt. */ + if (cmmHandle->baseAddress->CMINTSTS.BIT.chk_end_int == 0x01) { + cmmHandle->baseAddress->CMINTRAW.BIT.chk_end_raw = BASE_CFG_SET; + if (cmmHandle->userCallBack.CheckEndCallback) { + cmmHandle->userCallBack.CheckEndCallback(cmmHandle); + } + } + + /* Counter overflow interrupt. */ + if (cmmHandle->baseAddress->CMINTSTS.BIT.cnt_ovf_int == 0x01) { + cmmHandle->baseAddress->CMINTRAW.BIT.cnt_ovf_raw = BASE_CFG_SET; + if (cmmHandle->userCallBack.CountOverflowCallback) { + cmmHandle->userCallBack.CountOverflowCallback(cmmHandle); + } + } +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/crc/common/inc/crc.h b/vendor/others/demo/5-tim_adc/demo/drivers/crc/common/inc/crc.h new file mode 100644 index 000000000..4e73620c0 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/crc/common/inc/crc.h @@ -0,0 +1,100 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file crc.h + * @author MCU Driver Team + * @brief CRC module driver + * @details The header file contains the following declaration: + * + CRC handle structure definition. + * + Initialization functions. + * + CRC Set And Get Functions. + * + Interrupt Handler Functions. + */ + +#ifndef McuMagicTag_CRC_H +#define McuMagicTag_CRC_H +/* Includes ------------------------------------------------------------------*/ +#include "crc_ip.h" + +/* Macro definition */ +/** + * @defgroup CRC CRC + * @brief CRC module. + * @{ + */ + +/** + * @defgroup CRC_Common CRC Common + * @brief CRC common external module. + * @{ + */ + +/** + * @defgroup CRC_Handle_Definition CRC Handle Definition + * @{ + */ + +/* Typedef definitions -------------------------------------------------------*/ +typedef void (* CRC_CallbackType)(void *handle); + +/** + * @brief CRC handle structure definition. + */ +typedef struct _CRC_Handle { + CRC_RegStruct *baseAddress; /**< CRC Registers */ + CRC_InputDataFormat inputDataFormat; /**< CRC byte mode */ + CRC_PolynomialMode polyMode; /**< CRC polynomial mode */ + CRC_InitValueType initValueType; /**< CRC init value type */ + CRC_ResultXorValueType resultXorValueType; /**< CRC result xor value type */ + CRC_ReverseEnableType reverseEnableType; /**< input and output reverse type */ + CRC_XorEndianEnableType xorEndianEnbaleType; /**< xor enable and endian enable type */ + CRC_UserCallBack userCallBack; /**< User callback */ + CRC_ExtendHandle handleEx; /**< CRC extend parameter */ +} CRC_Handle; + +/** + * @} + */ + +/** + * @defgroup CRC_API_Declaration CRC HAL API + * @{ + */ +BASE_StatusType HAL_CRC_Init(CRC_Handle *handle); +void HAL_CRC_DeInit(CRC_Handle *handle); +unsigned int HAL_CRC_SetInputDataGetCheck(CRC_Handle *handle, unsigned int data); +unsigned int HAL_CRC_Accumulate(CRC_Handle *handle, const void *pData, unsigned int length); +unsigned int HAL_CRC_Calculate(CRC_Handle *handle, const void *pData, unsigned int length); +bool HAL_CRC_CheckInputData(CRC_Handle *handle, const void *pData, unsigned int length, unsigned int crcValue); +void HAL_CRC_SetCheckInData(CRC_Handle *handle, unsigned int data); +unsigned int HAL_CRC_LoadCheckInData(CRC_Handle *handle); +void HAL_CRC_RegisterCallback(CRC_Handle *handle, CRC_CallbackType callBackFunc); +void HAL_CRC_IrqHandler(void *handle); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_CRC_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/crc/inc/crc_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/crc/inc/crc_ip.h new file mode 100644 index 000000000..3eb7502f1 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/crc/inc/crc_ip.h @@ -0,0 +1,613 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file crc_ip.h + * @author MCU Driver Team + * @brief CRC module driver + * @details The header file contains the following declaration: + * + CRC configuration enums. + * + CRC register structures. + * + CRC DCL Functions. + * + Parameters check functions. + */ + +#ifndef McuMagicTag_CRC_IP_H +#define McuMagicTag_CRC_IP_H +/* Includes ------------------------------------------------------------------*/ +#include "baseinc.h" +/* Macro definitions -------------------------------------------------------*/ + +#ifdef CRC_PARAM_CHECK + #define CRC_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM + #define CRC_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET + #define CRC_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else + #define CRC_ASSERT_PARAM(para) ((void)0U) + #define CRC_PARAM_CHECK_NO_RET(para) ((void)0U) + #define CRC_PARAM_CHECK_WITH_RET(param, ret) ((void)0U) +#endif + +#define TYPE_POLY_MASK 0x0000000FU +#define TYPE_INIT_MASK 0x00000F00U +#define TYPE_XOR_VALUE_MASK 0x000F0000U +#define TYPE_REVERSE_ENABLE_MASK 0x0F000000U +#define TYPE_XOR_ENDIAN_ENABLE_MASK 0xF0000000U + +#define TYPE_ENDIAN_MSB_BIT 0x10000000U +#define TYPE_XOR_ENABLE_BIT 0x20000000U +#define TYPE_OUTPUT_REVERSE_ENABLE_BIT 0x01000000U +#define TYPE_BYTE_REVERSE_ENABLE_BIT 0x02000000U +/** + * @addtogroup CRC + * @{ + */ + +/** + * @defgroup CRC_IP CRC_IP + * @brief CRC_IP: crc_v1. + * @{ + */ + +/** + * @defgroup CRC_Param_Def CRC Parameters Definition + * @brief Description of CRC configuration parameters. + * @{ + */ + +/* Typedef definitions -------------------------------------------------------*/ +typedef enum { + CRC8_07_POLY_MODE = 0x00000000U, + CRC8_07_POLY_MODE_BK = 0x00000001U, + CRC16_8005_POLY_MODE = 0x00000002U, + CRC16_1021_POLY_MODE = 0x00000003U, + CRC32_04C11D87_POLY_MODE = 0x00000004U, + CRC32_04C11D87_POLY_MODE_BK = 0x00000005U, + CRC_POLY_MODE_MAX +} CRC_PolynomialMode; + +typedef enum { + TYPE_CRC_INIT_VALUE_00 = 0x00000100U, + TYPE_CRC_INIT_VALUE_FF = 0x00000200U, + TYPE_CRC_INIT_VALUE_0000 = 0x00000300U, + TYPE_CRC_INIT_VALUE_FFFF = 0x00000400U, + TYPE_CRC_INIT_VALUE_FFFFFFFF = 0x00000500U +} CRC_InitValueType; + +typedef enum { + CRC_INIT_VALUE_00 = 0x00000000U, + CRC_INIT_VALUE_FF = 0x000000FFU, + CRC_INIT_VALUE_0000 = 0x00000000U, + CRC_INIT_VALUE_FFFF = 0x0000FFFFU, + CRC_INIT_VALUE_FFFFFFFF = 0xFFFFFFFFU +} CRC_InitValue; + +typedef enum { + TYPE_CRC_XOR_VALUE_00 = 0x00010000U, + TYPE_CRC_XOR_VALUE_55 = 0x00020000U, + TYPE_CRC_XOR_VALUE_0000 = 0x00030000U, + TYPE_CRC_XOR_VALUE_FFFF = 0x00040000U, + TYPE_CRC_XOR_VALUE_00000000 = 0x00050000U, + TYPE_CRC_XOR_VALUE_FFFFFFFF = 0x00060000U +} CRC_ResultXorValueType; + +typedef enum { + CRC_XOR_VALUE_00 = 0x00000000U, + CRC_XOR_VALUE_55 = 0x00000055U, + CRC_XOR_VALUE_0000 = 0x00000000U, + CRC_XOR_VALUE_FFFF = 0x0000FFFFU, + CRC_XOR_VALUE_00000000 = 0x00000000U, + CRC_XOR_VALUE_FFFFFFFF = 0xFFFFFFFFU +} CRC_ResultXorValue; + +typedef enum { + REVERSE_INPUT_FALSE_OUTPUT_FALSE = 0x00000000U, + REVERSE_INPUT_FALSE_OUTPUT_TRUE = 0x01000000U, + REVERSE_INPUT_TURE_OUTPUT_FALSE = 0x02000000U, + REVERSE_INPUT_TURE_OUTPUT_TRUE = 0x03000000U +} CRC_ReverseEnableType; + +typedef enum { + DISABLE_XOR_ENABLE_LSB = 0x00000000U, + DISABLE_XOR_ENABLE_MSB = 0x10000000U, + ENABLE_XOR_ENABLE_LSB = 0x20000000U, + ENABLE_XOR_ENABLE_MSB = 0x30000000U +} CRC_XorEndianEnableType; + +/** + * @brief CRC byte type register configuration. + */ +typedef enum { + CRC_MODE_BIT8 = 0x00000000U, + CRC_MODE_BIT16 = 0x00000001U, + CRC_MODE_BIT32 = 0x00000002U +} CRC_InputDataFormat; + +/** + * @brief CRC algorithm type. + */ +typedef enum { + CRC8 = ENABLE_XOR_ENABLE_LSB | REVERSE_INPUT_FALSE_OUTPUT_FALSE | TYPE_CRC_XOR_VALUE_00 | \ + TYPE_CRC_INIT_VALUE_00 | CRC8_07_POLY_MODE, + CRC8_ITU = ENABLE_XOR_ENABLE_LSB | REVERSE_INPUT_FALSE_OUTPUT_FALSE | TYPE_CRC_XOR_VALUE_55 | \ + TYPE_CRC_INIT_VALUE_00 | CRC8_07_POLY_MODE, + CRC8_ROHC = ENABLE_XOR_ENABLE_LSB | REVERSE_INPUT_TURE_OUTPUT_TRUE | TYPE_CRC_XOR_VALUE_00 | \ + TYPE_CRC_INIT_VALUE_FF | CRC8_07_POLY_MODE, + CRC16_IBM = ENABLE_XOR_ENABLE_LSB | REVERSE_INPUT_TURE_OUTPUT_TRUE | TYPE_CRC_XOR_VALUE_0000 | \ + TYPE_CRC_INIT_VALUE_0000 | CRC16_8005_POLY_MODE, + CRC16_MAXIM = ENABLE_XOR_ENABLE_LSB | REVERSE_INPUT_TURE_OUTPUT_TRUE | TYPE_CRC_XOR_VALUE_FFFF | \ + TYPE_CRC_INIT_VALUE_0000 | CRC16_8005_POLY_MODE, + CRC16_USB = ENABLE_XOR_ENABLE_LSB | REVERSE_INPUT_TURE_OUTPUT_TRUE | TYPE_CRC_XOR_VALUE_FFFF | \ + TYPE_CRC_INIT_VALUE_FFFF | CRC16_8005_POLY_MODE, + CRC16_MODBUS = ENABLE_XOR_ENABLE_LSB | REVERSE_INPUT_TURE_OUTPUT_TRUE | TYPE_CRC_XOR_VALUE_0000 | \ + TYPE_CRC_INIT_VALUE_FFFF | CRC16_8005_POLY_MODE, + CRC16_CCITT = ENABLE_XOR_ENABLE_LSB | REVERSE_INPUT_TURE_OUTPUT_TRUE | TYPE_CRC_XOR_VALUE_0000 | \ + TYPE_CRC_INIT_VALUE_0000 | CRC16_1021_POLY_MODE, + CRC16_CCITT_FALSE = ENABLE_XOR_ENABLE_LSB | REVERSE_INPUT_FALSE_OUTPUT_FALSE | TYPE_CRC_XOR_VALUE_0000 | \ + TYPE_CRC_INIT_VALUE_FFFF | CRC16_1021_POLY_MODE, + CRC16_X25 = ENABLE_XOR_ENABLE_LSB | REVERSE_INPUT_TURE_OUTPUT_TRUE | TYPE_CRC_XOR_VALUE_FFFF | \ + TYPE_CRC_INIT_VALUE_FFFF | CRC16_1021_POLY_MODE, + CRC16_XMODEM = ENABLE_XOR_ENABLE_LSB | REVERSE_INPUT_FALSE_OUTPUT_FALSE | TYPE_CRC_XOR_VALUE_0000 | \ + TYPE_CRC_INIT_VALUE_0000 | CRC16_1021_POLY_MODE, + CRC32 = ENABLE_XOR_ENABLE_LSB | REVERSE_INPUT_TURE_OUTPUT_TRUE | TYPE_CRC_XOR_VALUE_FFFFFFFF | \ + TYPE_CRC_INIT_VALUE_FFFFFFFF | CRC32_04C11D87_POLY_MODE, + CRC32_MPEG2 = ENABLE_XOR_ENABLE_LSB | REVERSE_INPUT_FALSE_OUTPUT_FALSE | TYPE_CRC_XOR_VALUE_00000000 | \ + TYPE_CRC_INIT_VALUE_FFFFFFFF | CRC32_04C11D87_POLY_MODE, + CRC_ALG_MODE_MAX +} CRC_AlgorithmMode; + +/** + * @brief CRC extend handle. + */ +typedef struct _CRC_ExtendeHandle { + CRC_AlgorithmMode algoMode; /**< CRC calculate algorithm mode */ +} CRC_ExtendHandle; + +/** + * @brief CRC user callback. + */ +typedef struct { +} CRC_UserCallBack; +/** + * @} + */ + +/** + * @defgroup CRC_Reg_Def CRC Register Definition + * @brief Description CRC register mapping structure. + * @{ + */ + +/** + * @brief CRC calc poly register union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int crc_calc_poly : 3; /**< crc calc polynomial set. */ + unsigned int reserved0 : 29; + } BIT; +} volatile CRC_CALC_CFG_REG; + +/** + * @brief CRC soft reset register union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int crc_calc_reset : 1; /**< crc calc soft reset signal. */ + unsigned int reserved0 : 31; + } BIT; +} volatile CRC_CALC_RESET_REG; + +/** + * @brief CRC init register union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int crc_calc_init : 1; /**< crc init value load signal. */ + unsigned int reserved0 : 31; + } BIT; +} volatile CRC_CALC_INIT_REG; + +/** + * @brief CRC pre set register union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int crc_pre_byte_reverse : 1; /**< crc pre byte reverse enable. */ + unsigned int crc_pre_endian_mode : 1; /**< crc pre endian set mode. */ + unsigned int reserved0 : 30; + } BIT; +} volatile CRC_PRE_CFG_REG; + +/** + * @brief CRC post set register union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int crc_post_xor_enable : 1; /**< crc result xor enable. */ + unsigned int crc_post_out_reverse : 1; /**< crc result reverse enable. */ + unsigned int reserved0 : 30; + } BIT; +} volatile CRC_POST_CFG_REG; + +/** + * @brief CRC assemble registers structure definition + */ +typedef struct { + CRC_CALC_CFG_REG CRC_CALC_CFG; /**< crc calc poly register. */ + CRC_CALC_RESET_REG CRC_CALC_RESET; /**< crc soft reset register. */ + CRC_CALC_INIT_REG CRC_CALC_INIT; /**< crc init register. */ + unsigned int crc_post_xor_value; /**< crc post process xor value register. */ + unsigned int crc_calc_init_value; /**< crc init value register. */ + unsigned int crc_data_in; /**< crc input data register. */ + unsigned int crc_out; /**< crc result register. */ + CRC_PRE_CFG_REG CRC_PRE_CFG; /**< crc pre set register. */ + CRC_POST_CFG_REG CRC_POST_CFG; /**< crc post set register. */ +} volatile CRC_RegStruct; + +/** + * @} + */ +/** + * @brief Set CRC polyniaml mode. + * @param crcx Value of @ref CRC_RegStruct. + * @param polyMode Value of @ref CRC_PolynomialMode. + * @retval None. + */ +static inline void DCL_CRC_SetPolynomialMode(CRC_RegStruct *crcx, CRC_PolynomialMode polyMode) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + CRC_PARAM_CHECK_NO_RET(polyMode < CRC_POLY_MODE_MAX && polyMode >= CRC8_07_POLY_MODE); + crcx->CRC_CALC_CFG.BIT.crc_calc_poly = polyMode; +} + +/** + * @brief Get CRC polyniaml mode. + * @param crcx Value of @ref CRC_RegStruct. + * @retval CRC_PolynomialMode. + */ +static inline CRC_PolynomialMode DCL_CRC_GetPolynomialMode(CRC_RegStruct *crcx) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + return crcx->CRC_CALC_CFG.BIT.crc_calc_poly; +} + +/** + * @brief Set CRC soft reset function. + * @param crcx Value of @ref CRC_RegStruct. + * @retval None. + */ +static inline void DCL_CRC_SoftReset(CRC_RegStruct *crcx) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + crcx->CRC_CALC_RESET.BIT.crc_calc_reset = BASE_CFG_SET; +} + +/** + * @brief Enable CRC init function. + * @param crcx Value of @ref CRC_RegStruct. + * @retval None. + */ +static inline void DCL_CRC_LoadInitValue(CRC_RegStruct *crcx) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + crcx->CRC_CALC_INIT.BIT.crc_calc_init = BASE_CFG_SET; +} + +/** + * @brief Set CRC result xor value function. + * @param crcx Value of @ref CRC_RegStruct. + * @param value Value of CRC calulate result. + * @retval None. + */ +static inline void DCL_CRC_SetResultXorValue(CRC_RegStruct *crcx, unsigned int value) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + crcx->crc_post_xor_value = value; +} + +/** + * @brief Get CRC result xor value function. + * @param crcx Value of @ref CRC_RegStruct. + * @retval unsigned int value of result xor value. + */ +static inline unsigned int DCL_CRC_GetResultXorValue(CRC_RegStruct *crcx) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + return crcx->crc_post_xor_value; +} + +/** + * @brief Set CRC init value function. + * @param crcx Value of @ref CRC_RegStruct. + * @param initValue value of CRC calulate init value. + * @retval None. + */ +static inline void DCL_CRC_SetInitValue(CRC_RegStruct *crcx, unsigned int initValue) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + crcx->crc_calc_init_value = initValue; +} + +/** + * @brief Get CRC init value function. + * @param crcx Value of @ref CRC_RegStruct. + * @retval unsigned int init value. + */ +static inline unsigned int DCL_CRC_GetInitValue(CRC_RegStruct *crcx) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + return crcx->crc_calc_init_value; +} + +/** + * @brief Set CRC data 8 in value function. + * @param crcx Value of @ref CRC_RegStruct. + * @param data value of CRC calulate data value. + * @retval None. + */ +static inline void DCL_CRC_SetInputData8(CRC_RegStruct *crcx, unsigned char data) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + volatile unsigned char *crcData8 = (unsigned char *)(void *)(&crcx->crc_data_in); + *(crcData8) = data; +} + +/** + * @brief Set CRC data 16 in value function. + * @param crcx Value of @ref CRC_RegStruct. + * @param data value of CRC calulate data value. + * @retval None. + */ +static inline void DCL_CRC_SetInputData16(CRC_RegStruct *crcx, unsigned short data) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + volatile unsigned short *crcData16 = (unsigned short *)(void *)(&crcx->crc_data_in); + *(crcData16) = data; +} + +/** + * @brief Set CRC data 32 in value function. + * @param crcx Value of @ref CRC_RegStruct. + * @param data value of CRC calulate data value. + * @retval None. + */ +static inline void DCL_CRC_SetInputData32(CRC_RegStruct *crcx, unsigned int data) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + crcx->crc_data_in = data; +} + +/** + * @brief Get CRC data in value function. + * @param crcx Value of @ref CRC_RegStruct. + * @retval unsigned int crc data in. + */ +static inline unsigned int DCL_CRC_GetInputData(CRC_RegStruct *crcx) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + return crcx->crc_data_in; +} + +/** + * @brief Get CRC data in value function. + * @param crcx Value of @ref CRC_RegStruct. + * @retval unsigned int crc data out. + */ +static inline unsigned int DCL_CRC_GetOutputData(CRC_RegStruct *crcx) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + return crcx->crc_out; +} + +/** + * @brief Set CRC input data endian mode function. + * @param crcx Value of @ref CRC_RegStruct. + * @param mode true means big endian, false means little endian. + * @retval None. + */ +static inline void DCL_CRC_SetEndianMode(CRC_RegStruct *crcx, bool mode) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + crcx->CRC_PRE_CFG.BIT.crc_pre_endian_mode = mode; +} + +/** + * @brief Get CRC input data endian mode function. + * @param crcx Value of @ref CRC_RegStruct. + * @retval bool crc endian mode. + */ +static inline bool DCL_CRC_GetEndianMode(CRC_RegStruct *crcx) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + return crcx->CRC_PRE_CFG.BIT.crc_pre_endian_mode; +} + +/** + * @brief Set CRC input data byte reverse function. + * @param crcx Value of @ref CRC_RegStruct. + * @param mode true means reverse, false means none. + * @retval None. + */ +static inline void DCL_CRC_SetByteReverseMode(CRC_RegStruct *crcx, bool mode) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + crcx->CRC_PRE_CFG.BIT.crc_pre_byte_reverse = mode; +} + +/** + * @brief Get CRC input data byte reverse function. + * @param crcx Value of @ref CRC_RegStruct. + * @retval bool crc byte reverse mode. + */ +static inline bool DCL_CRC_GetByteReverseMode(CRC_RegStruct *crcx) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + return crcx->CRC_PRE_CFG.BIT.crc_pre_byte_reverse; +} + +/** + * @brief Set CRC output result reverse function. + * @param crcx Value of @ref CRC_RegStruct. + * @param mode true means reverse, false means none. + * @retval None. + */ +static inline void DCL_CRC_SetOutputReverseMode(CRC_RegStruct *crcx, bool mode) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + crcx->CRC_POST_CFG.BIT.crc_post_out_reverse = mode; +} + +/** + * @brief Get CRC output result reverse function. + * @param crcx Value of @ref CRC_RegStruct. + * @retval bool crc out reverse mode. + */ +static inline bool DCL_CRC_GetOutputReverseMode(CRC_RegStruct *crcx) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + return crcx->CRC_POST_CFG.BIT.crc_post_out_reverse; +} + +/** + * @brief Set CRC result xor mode function. + * @param crcx Value of @ref CRC_RegStruct. + * @param mode true means reverse, false means none. + * @retval None. + */ +static inline void DCL_CRC_SetXorResultMode(CRC_RegStruct *crcx, bool mode) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + crcx->CRC_POST_CFG.BIT.crc_post_xor_enable = mode; /* 0 means disable, 1 means enable */ +} + +/** + * @brief Get CRC result xor mode function. + * @param crcx Value of @ref CRC_RegStruct. + * @retval bool crc xor enable mode. + */ +static inline bool DCL_CRC_GetXorResultMode(CRC_RegStruct *crcx) +{ + CRC_ASSERT_PARAM(IsCRCInstance(crcx)); + return crcx->CRC_POST_CFG.BIT.crc_post_xor_enable; +} + +/** + * @brief Check crc polynomial mode. + * @param mode Value of @ref CRC_PolynomialMode. + * @retval Bool + */ +static inline bool IsCrcPolynomial(unsigned int mode) +{ + /* Check crc polynomial mode. */ + return (mode == CRC8_07_POLY_MODE || mode == CRC8_07_POLY_MODE_BK || \ + mode == CRC16_8005_POLY_MODE || mode == CRC16_1021_POLY_MODE || \ + mode == CRC32_04C11D87_POLY_MODE || mode == CRC32_04C11D87_POLY_MODE_BK); +} + +/** + * @brief Check crc init value type. + * @param mode Value of @ref CRC_InitValueType. + * @retval Bool + */ +static inline bool IsCrcInitValueType(unsigned int value) +{ + /* Check crc polynomial mode. */ + return (value == TYPE_CRC_INIT_VALUE_00 || value == TYPE_CRC_INIT_VALUE_FF || \ + value == TYPE_CRC_INIT_VALUE_0000 || value == TYPE_CRC_INIT_VALUE_FFFF || \ + value == TYPE_CRC_INIT_VALUE_FFFFFFFF); +} + +/** + * @brief Check crc result xor value type. + * @param mode Value of @ref CRC_ResultXorValueType. + * @retval Bool + */ +static inline bool IsCrcResultXorValueType(unsigned int value) +{ + /* Check crc polynomial mode. */ + return (value == TYPE_CRC_XOR_VALUE_00 || value == TYPE_CRC_XOR_VALUE_55 || \ + value == TYPE_CRC_XOR_VALUE_0000 || value == TYPE_CRC_XOR_VALUE_FFFF || \ + value == TYPE_CRC_XOR_VALUE_00000000 || value == TYPE_CRC_XOR_VALUE_FFFFFFFF); +} + +/** + * @brief Check crc reverse enable type. + * @param mode Value of @ref CRC_ReverseEnableType. + * @retval Bool + */ +static inline bool IsCrcXorEndianEnableType(unsigned int type) +{ + /* Check crc reverse enable type. */ + return (type == ENABLE_XOR_ENABLE_LSB || type == ENABLE_XOR_ENABLE_MSB || \ + type == DISABLE_XOR_ENABLE_LSB || type == DISABLE_XOR_ENABLE_MSB); +} + +/** + * @brief Check crc reverse enable type. + * @param mode Value of @ref CRC_ReverseEnableType. + * @retval Bool + */ +static inline bool IsCrcReverseEnableType(unsigned int type) +{ + /* Check crc reverse enable type. */ + return (type == REVERSE_INPUT_FALSE_OUTPUT_FALSE || type == REVERSE_INPUT_FALSE_OUTPUT_TRUE || \ + type == REVERSE_INPUT_TURE_OUTPUT_FALSE || type == REVERSE_INPUT_TURE_OUTPUT_TRUE); +} + +/** + * @brief Check crc valid byte mode. + * @param mode Value of @ref CRC_InputDataFormat. + * @retval Bool + */ +static inline bool IsCrcInputDataFormat(unsigned int mode) +{ + return (mode == CRC_MODE_BIT8 || + mode == CRC_MODE_BIT16 || + mode == CRC_MODE_BIT32); +} + +/** + * @brief Check crc algorithm mode. + * @param mode Value of @ref CRC_AlgorithmMode. + * @retval Bool + */ +static inline bool IsCrcAlgorithm(CRC_AlgorithmMode mode) +{ + /* Check crc algorithm mode. */ + return (mode == CRC8 || mode == CRC8_ITU || \ + mode == CRC8_ROHC || mode == CRC16_IBM || \ + mode == CRC16_MAXIM || mode == CRC16_USB || \ + mode == CRC16_MODBUS || mode == CRC16_CCITT || \ + mode == CRC16_CCITT_FALSE || mode == CRC16_X25 || \ + mode == CRC16_XMODEM || mode == CRC32 || \ + mode == CRC32_MPEG2); +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_CRC_IP_H */ diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/crc/src/crc.c b/vendor/others/demo/5-tim_adc/demo/drivers/crc/src/crc.c new file mode 100644 index 000000000..5b010ead2 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/crc/src/crc.c @@ -0,0 +1,441 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file crc.c + * @author MCU Driver Team + * @brief CRC module driver + * @details This file provides firmware functions to manage the following functionalities of the GPIO. + * + Initialization functions. + * + CRC Set And Get Functions. + * + Interrupt Handler Functions. + */ + +/* Includes ------------------------------------------------------------------ */ +#include "interrupt.h" +#include "crc.h" + +#define WORD_DIV_BYTE_SIZE 4 +#define WORD_DIV_DOUBLE_SIZE 2 + +#define OFFSET_ONE_BYTE 1 +#define OFFSET_TWO_BYTE 2 +#define OFFSET_THREE_BYTE 3 + +#define BIT_SHIFT24 24 +#define BIT_SHIFT16 16 +#define BIT_SHIFT8 8 + +#define REMAINDER_SIZE_ONE 1 +#define REMAINDER_SIZE_TWO 2 +#define REMAINDER_SIZE_THREE 3 +#define REMAINDER_RANGE_THREE 3 +#define REMAINDER_RANGE_ONE 1 + +#define CRC8_MODE_07_REG_VALUE 0 +#define CRC16_MODE_8005_REG_VALUE 2 +#define CRC16_MODE_1021_REG_VALUE 3 +#define CRC32_MODE_04C11D87_REG_VALUE 4 + +static void CRC_Handle_8(CRC_Handle *handle, const unsigned char *pData, unsigned int length); +static void CRC_Handle_16(CRC_Handle *handle, const unsigned short *pData, unsigned int length); +static void CRC_Handle_32(CRC_Handle *handle, const unsigned int *pData, unsigned int length); +static void CRC_SetPolynomialModeByAlgorithm(CRC_Handle *handle, CRC_AlgorithmMode algorithmMode); +static void CRC_SetXorEndianReverseEnableByAlgorithm(CRC_Handle *handle, CRC_AlgorithmMode algorithmMode); +static void CRC_SetXorValueByAlgorithm(CRC_Handle *handle, CRC_AlgorithmMode algorithmMode); +static void CRC_SetInitValueByAlgorithm(CRC_Handle *handle, CRC_AlgorithmMode algorithmMode); +static void CRC_SetResultXorValue(CRC_Handle *handle, CRC_ResultXorValueType type); +static void CRC_SetInitValue(CRC_Handle *handle, CRC_InitValueType type); + +/** + * @brief Initializing CRC register values. + * @param handle Value of @ref CRC_Handle. + * @retval BASE_StatusType BASE Status. + */ +BASE_StatusType HAL_CRC_Init(CRC_Handle *handle) +{ + /* PARAM check */ + CRC_ASSERT_PARAM(handle != NULL); + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + CRC_PARAM_CHECK_WITH_RET(IsCrcInputDataFormat(handle->inputDataFormat), BASE_STATUS_ERROR); + DCL_CRC_SoftReset(handle->baseAddress); + if (IsCrcAlgorithm(handle->handleEx.algoMode)) { + /* Algorithm Mode Parameter Configuration */ + CRC_SetPolynomialModeByAlgorithm(handle, handle->handleEx.algoMode); + CRC_SetXorEndianReverseEnableByAlgorithm(handle, handle->handleEx.algoMode); + CRC_SetXorValueByAlgorithm(handle, handle->handleEx.algoMode); + CRC_SetInitValueByAlgorithm(handle, handle->handleEx.algoMode); + } else { + /* CRC PARAM check */ + CRC_PARAM_CHECK_WITH_RET(IsCrcPolynomial(handle->polyMode), BASE_STATUS_ERROR); + CRC_PARAM_CHECK_WITH_RET(IsCrcInitValueType(handle->initValueType), BASE_STATUS_ERROR); + CRC_PARAM_CHECK_WITH_RET(IsCrcResultXorValueType(handle->resultXorValueType), BASE_STATUS_ERROR); + CRC_PARAM_CHECK_WITH_RET(IsCrcReverseEnableType(handle->reverseEnableType), BASE_STATUS_ERROR); + CRC_PARAM_CHECK_WITH_RET(IsCrcXorEndianEnableType(handle->xorEndianEnbaleType), BASE_STATUS_ERROR); + unsigned int polyMode = handle->polyMode; /* algorithmic polynomial mode */ + bool inputEndianMode = ((handle->xorEndianEnbaleType & TYPE_ENDIAN_MSB_BIT) == TYPE_ENDIAN_MSB_BIT); + bool inputByteReverse = + ((handle->reverseEnableType & TYPE_BYTE_REVERSE_ENABLE_BIT) == TYPE_BYTE_REVERSE_ENABLE_BIT); + bool outputReverse = + ((handle->reverseEnableType & TYPE_OUTPUT_REVERSE_ENABLE_BIT) == TYPE_OUTPUT_REVERSE_ENABLE_BIT); + bool resultXorEnable = ((handle->xorEndianEnbaleType & TYPE_XOR_ENABLE_BIT) == TYPE_XOR_ENABLE_BIT); + /* DCL CRC set parameters */ + DCL_CRC_SetPolynomialMode(handle->baseAddress, polyMode); + DCL_CRC_SetEndianMode(handle->baseAddress, inputEndianMode); + DCL_CRC_SetByteReverseMode(handle->baseAddress, inputByteReverse); + DCL_CRC_SetOutputReverseMode(handle->baseAddress, outputReverse); + DCL_CRC_SetXorResultMode(handle->baseAddress, resultXorEnable); + /* Extended Interface Parameter Settings */ + if (handle->baseAddress->CRC_POST_CFG.BIT.crc_post_xor_enable == BASE_CFG_ENABLE) { + CRC_SetResultXorValue(handle, handle->resultXorValueType); + } + CRC_SetInitValue(handle, handle->initValueType); + DCL_CRC_LoadInitValue(handle->baseAddress); + } + return BASE_STATUS_OK; +} + +/** + * @brief DeInitializing CRC register values. + * @param handle Value of @ref CRC_Handle. + * @retval None. + */ +void HAL_CRC_DeInit(CRC_Handle *handle) +{ + CRC_ASSERT_PARAM(handle != NULL); + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + /* Reset CRC calculation data */ + DCL_CRC_SoftReset(handle->baseAddress); +} + +/** + * @brief Set CRC input data and get CRC output. + * @param handle Value of @ref CRC_Handle. + * @param data CRC input data. + * @retval unsigned int CRC output data. + */ +unsigned int HAL_CRC_SetInputDataGetCheck(CRC_Handle *handle, unsigned int data) +{ + CRC_ASSERT_PARAM(handle != NULL); + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + DCL_CRC_SetInputData32(handle->baseAddress, data); /* Set CRC input data */ + return DCL_CRC_GetOutputData(handle->baseAddress); +} + +/** + * @brief Compute the 8, 16 or 32-bit CRC value of an 8, 16 or + 32-bit data buffer starting with the previously computed CRC as initialization value. + * @param handle Value of @ref CRC_Handle. + * @param pData Pointer to the input data buffer. + * @param length pData array length. + * @retval unsigned int CRC output data. + */ +unsigned int HAL_CRC_Accumulate(CRC_Handle *handle, const void *pData, unsigned int length) +{ + CRC_ASSERT_PARAM(handle != NULL); + CRC_ASSERT_PARAM(pData != NULL); + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + switch (handle->inputDataFormat) { + case CRC_MODE_BIT8: + CRC_Handle_8(handle, (unsigned char *)pData, length); /* Input register to compute 8-bit data value */ + break; + case CRC_MODE_BIT16: + CRC_Handle_16(handle, (unsigned short *)pData, length); /* Input register to compute 16-bit data value */ + break; + case CRC_MODE_BIT32: + CRC_Handle_32(handle, (unsigned int *)pData, length); /* Input register to compute 32-bit data value */ + break; + default: + break; + } + return DCL_CRC_GetOutputData(handle->baseAddress); +} + +/** + * @brief Compute the 8, 16 or 32-bit CRC value of an 8, 16 or + 32-bit data buffer starting with default initialization value. + * @param handle Value of @ref CRC_Handle. + * @param pData Pointer to the input data buffer. + * @param length pData array length. + * @retval unsigned int CRC output data. + */ +unsigned int HAL_CRC_Calculate(CRC_Handle *handle, const void *pData, unsigned int length) +{ + CRC_ASSERT_PARAM(handle != NULL); + CRC_ASSERT_PARAM(pData != NULL); + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + DCL_CRC_LoadInitValue(handle->baseAddress); /* load init value */ + return HAL_CRC_Accumulate(handle, pData, length); +} + +/** + * @brief Compute the 8-bit input data to the CRC calculator. + * @param handle Value of @ref CRC_Handle. + * @param pData Pointer to the input data buffer. + * @param length pData array length. + * @retval unsigned int CRC output data. + */ +static void CRC_Handle_8(CRC_Handle *handle, const unsigned char *pData, unsigned int length) +{ + CRC_ASSERT_PARAM(handle != NULL); + CRC_ASSERT_PARAM(pData != NULL); + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + volatile unsigned char *crcData8 = (unsigned char *)(void *)(&handle->baseAddress->crc_data_in); + for (unsigned int i = 0; i < length; i++) { + *(crcData8) = pData[i]; /* input crc data */ + } +} + +/** + * @brief Compute the 16-bit input data to the CRC calculator. + * @param handle Value of @ref CRC_Handle. + * @param pData Pointer to the input data buffer. + * @param length pData array length. + * @retval unsigned int CRC output data. + */ +static void CRC_Handle_16(CRC_Handle *handle, const unsigned short *pData, unsigned int length) +{ + CRC_ASSERT_PARAM(handle != NULL); + CRC_ASSERT_PARAM(pData != NULL); + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + volatile unsigned short *crcData16 = (unsigned short *)(void *)(&handle->baseAddress->crc_data_in); + for (unsigned int i = 0; i < length; i++) { + *(crcData16) = pData[i]; /* input crc data */ + } +} + +/** + * @brief Compute the 32-bit input data to the CRC calculator. + * @param handle Value of @ref CRC_Handle. + * @param pData Pointer to the input data buffer. + * @param length pData array length. + * @retval unsigned int CRC output data. + */ +static void CRC_Handle_32(CRC_Handle *handle, const unsigned int *pData, unsigned int length) +{ + CRC_ASSERT_PARAM(handle != NULL); + CRC_ASSERT_PARAM(pData != NULL); + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + volatile unsigned int *crcData32 = (unsigned int *)(void *)(&handle->baseAddress->crc_data_in); + for (unsigned int i = 0; i < length; i++) { + *(crcData32) = pData[i]; /* input crc data */ + } +} + +/** + * @brief Check whether the recived data CRC value is the same as the expected value. + * @param handle Value of @ref CRC_Handle. + * @param pData Pointer to the input data buffer, + exact input data byte mode is provided by handle->inputDataFormat. + * @param length pData array length. + * @param crcValue CRC check value. + * @retval unsigned int CRC check result + */ +bool HAL_CRC_CheckInputData(CRC_Handle *handle, const void *pData, unsigned int length, unsigned int crcValue) +{ + CRC_ASSERT_PARAM(handle != NULL); + CRC_ASSERT_PARAM(pData != NULL); + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + return (HAL_CRC_Calculate(handle, pData, length) == crcValue); +} + +/** + * @brief Set CRC check_in data to register. + * @param handle Value of @ref CRC_Handle. + * @retval None. + */ +void HAL_CRC_SetCheckInData(CRC_Handle *handle, unsigned int data) +{ + CRC_ASSERT_PARAM(handle != NULL); + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + handle->baseAddress->crc_calc_init_value = data; +} + +/** + * @brief Load CRC check_in register data to crc_out register. + * @param handle Value of @ref CRC_Handle. + * @retval unsigned int Reversed check_in data. + */ +unsigned int HAL_CRC_LoadCheckInData(CRC_Handle *handle) +{ + CRC_ASSERT_PARAM(handle != NULL); + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + DCL_CRC_LoadInitValue(handle->baseAddress); + return DCL_CRC_GetInitValue(handle->baseAddress); +} + +/** + * @brief Register CRC interrupt callback. + * @param handle Value of @ref CRC_handle. + * @param callBackFunc Value of @ref CRC_CallbackType. + * @retval None + */ +void HAL_CRC_RegisterCallback(CRC_Handle *handle, CRC_CallbackType callBackFunc) +{ + BASE_FUNC_UNUSED(handle); + BASE_FUNC_UNUSED(callBackFunc); +} + +/** + * @brief Interrupt handler processing function. + * @param handle CRC_Handle. + * @retval None. + */ +void HAL_CRC_IrqHandler(void *handle) +{ + BASE_FUNC_UNUSED(handle); + return; +} + +/** + * @brief Set CRC init value by algorithmMode. + * @param handle Value of @ref CRC_Handle. + * @param algorithmMode value of CRC algorithm. + * @retval None. + */ +static void CRC_SetInitValueByAlgorithm(CRC_Handle *handle, CRC_AlgorithmMode algorithmMode) +{ + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + /* 0x000000FF : MASK of initValueType in crc algorithm */ + unsigned int initValueType = (algorithmMode & TYPE_INIT_MASK); + CRC_SetInitValue(handle, initValueType); + DCL_CRC_LoadInitValue(handle->baseAddress); +} + + +/** + * @brief Set CRC xor value by algorithmMode. + * @param handle Value of @ref CRC_Handle. + * @param algorithmMode value of CRC algorithm. + * @retval None. + */ +static void CRC_SetXorValueByAlgorithm(CRC_Handle *handle, CRC_AlgorithmMode algorithmMode) +{ + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + unsigned int xorValueType = (algorithmMode & TYPE_XOR_VALUE_MASK); + if (handle->baseAddress->CRC_POST_CFG.BIT.crc_post_xor_enable == BASE_CFG_ENABLE) { + /* Setting result xor value */ + CRC_SetResultXorValue(handle, xorValueType); + } +} + +/** + * @brief Set CRC xor endian reverse enable type by algorithmMode. + * @param handle Value of @ref CRC_Handle. + * @param algorithmMode value of CRC algorithm. + * @retval None. + */ +static void CRC_SetXorEndianReverseEnableByAlgorithm(CRC_Handle *handle, CRC_AlgorithmMode algorithmMode) +{ + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + /* 0x000000FF : MASK of initValueType in crc algorithm */ + unsigned int xorEndianEnableType = (algorithmMode & TYPE_XOR_ENDIAN_ENABLE_MASK); + unsigned int reverseEnableType = (algorithmMode & TYPE_REVERSE_ENABLE_MASK); + if ((IsCrcXorEndianEnableType(xorEndianEnableType))) { + /* config register */ + DCL_CRC_SetEndianMode(handle->baseAddress, + ((xorEndianEnableType & TYPE_ENDIAN_MSB_BIT) == TYPE_ENDIAN_MSB_BIT)); + DCL_CRC_SetXorResultMode(handle->baseAddress, + ((xorEndianEnableType & TYPE_XOR_ENABLE_BIT) == TYPE_XOR_ENABLE_BIT)); + } + if (IsCrcReverseEnableType(reverseEnableType)) { + /* config register */ + DCL_CRC_SetByteReverseMode(handle->baseAddress, + ((reverseEnableType & TYPE_BYTE_REVERSE_ENABLE_BIT) == TYPE_BYTE_REVERSE_ENABLE_BIT)); + DCL_CRC_SetOutputReverseMode(handle->baseAddress, + ((reverseEnableType & TYPE_OUTPUT_REVERSE_ENABLE_BIT) == TYPE_OUTPUT_REVERSE_ENABLE_BIT)); + } +} + +/** + * @brief Set CRC Polynomial Mode by algorithmMode. + * @param handle Value of @ref CRC_Handle. + * @param algorithmMode value of CRC algorithm. + * @retval None. + */ +static void CRC_SetPolynomialModeByAlgorithm(CRC_Handle *handle, CRC_AlgorithmMode algorithmMode) +{ + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + unsigned int polynomialMode = (algorithmMode & TYPE_POLY_MASK); + if (IsCrcPolynomial(polynomialMode)) { + DCL_CRC_SetPolynomialMode(handle->baseAddress, polynomialMode); + } +} + +/** + * @brief Set CRC xor value mode. + * @param handle Value of @ref CRC_Handle. + * @param type Value of @ref CRC_ResultXorValueType + * @retval None. + */ +static void CRC_SetResultXorValue(CRC_Handle *handle, CRC_ResultXorValueType type) +{ + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + CRC_PARAM_CHECK_NO_RET(IsCrcResultXorValueType(type)); + switch (type) { + case TYPE_CRC_XOR_VALUE_00: /* xor value tyep 00 */ + *(unsigned char *)(void *)(&handle->baseAddress->crc_post_xor_value) = CRC_XOR_VALUE_00; + break; + case TYPE_CRC_XOR_VALUE_55: + *(unsigned char *)(void *)(&handle->baseAddress->crc_post_xor_value) = CRC_XOR_VALUE_55; + break; + case TYPE_CRC_XOR_VALUE_0000: /* xor value type 0000 */ + *(unsigned short *)(void *)(&handle->baseAddress->crc_post_xor_value) = CRC_XOR_VALUE_0000; + break; + case TYPE_CRC_XOR_VALUE_FFFF: + *(unsigned short *)(void *)(&handle->baseAddress->crc_post_xor_value) = CRC_XOR_VALUE_FFFF; + break; + case TYPE_CRC_XOR_VALUE_00000000: /* xor value type 00000000 */ + *(unsigned int *)(void *)(&handle->baseAddress->crc_post_xor_value) = CRC_XOR_VALUE_00000000; + break; + case TYPE_CRC_XOR_VALUE_FFFFFFFF: /* xor value type FFFFFFFF */ + *(unsigned int *)(void *)(&handle->baseAddress->crc_post_xor_value) = CRC_XOR_VALUE_FFFFFFFF; + break; + default: + break; + } +} + +/** + * @brief Set CRC init value. + * @param handle Value of @ref CRC_Handle. + * @param type Value of @ref CRC_InitValueType. + * @retval None. + */ +static void CRC_SetInitValue(CRC_Handle *handle, CRC_InitValueType type) +{ + CRC_ASSERT_PARAM(IsCRCInstance(handle->baseAddress)); + CRC_PARAM_CHECK_NO_RET(IsCrcInitValueType(type)); + switch (type) { + case TYPE_CRC_INIT_VALUE_00: /* init value type 00 */ + *(unsigned char *)(void *)(&handle->baseAddress->crc_calc_init_value) = CRC_INIT_VALUE_00; + break; + case TYPE_CRC_INIT_VALUE_FF: /* init value type FF */ + *(unsigned char *)(void *)(&handle->baseAddress->crc_calc_init_value) = CRC_INIT_VALUE_FF; + break; + case TYPE_CRC_INIT_VALUE_0000: /* init value type 0000 */ + *(unsigned short *)(void *)(&handle->baseAddress->crc_calc_init_value) = CRC_INIT_VALUE_0000; + break; + case TYPE_CRC_INIT_VALUE_FFFF: /* init value type FFFF */ + *(unsigned short *)(void *)(&handle->baseAddress->crc_calc_init_value) = CRC_INIT_VALUE_FFFF; + break; + case TYPE_CRC_INIT_VALUE_FFFFFFFF: /* init value type FFFFFFFF */ + *(unsigned int *)(void *)(&handle->baseAddress->crc_calc_init_value) = CRC_INIT_VALUE_FFFFFFFF; + break; + default: + break; + } +} diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/crg/common/inc/crg.h b/vendor/others/demo/5-tim_adc/demo/drivers/crg/common/inc/crg.h new file mode 100644 index 000000000..ed10ef588 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/crg/common/inc/crg.h @@ -0,0 +1,123 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file crg.h + * @author MCU Driver Team + * @brief CRG module driver + * @details This file provides firmware CRG Handle Structure and functions + * prototypes to manage the following functionalities of the CRG. + * + Config CRG + * + Config IP Clock + * + Get the Config of CRG + * + Get the frequency of cpu and IP + */ +#ifndef McuMagicTag_CRG_H +#define McuMagicTag_CRG_H + +/* Includes ------------------------------------------------------------------*/ +#include "crg_ip.h" + +/* Macro definitions ---------------------------------------------------------*/ + +/** + * @defgroup CRG CRG + * @brief CRG module. + * @{ + */ + +/** + * @defgroup CRG_Common CRG Common + * @brief CRG common external module. + * @{ + */ + +/** + * @defgroup CRG_Handle_Definition CRG Handle Definition + * @{ + */ +/** + * @brief Typedef callback function of CRG + */ +typedef void (*CRG_CallBackFunc)(void *param); + +/** + * @brief CRG Handle, include clock config and ip clock ip config + */ +typedef struct { + CRG_RegStruct *baseAddress; /**< Base address of CLOCK register */ + CRG_PllRefClkSelect pllRefClkSelect; /**< PLL Refer clock selection */ + CRG_PllPreDiv pllPreDiv; /**< PLL pre division */ + unsigned int pllFbDiv; /**< PLL loop divider ratio */ + CRG_PllPostDiv pllPostDiv; /**< PLL post ratio */ + bool pllPd; /**< Pll Power down or not */ + CRG_CoreClkSelect coreClkSelect; /**< Core clock selection */ + CRG_ExtendHandle handleEx; /**< CRG handle extra */ +} CRG_Handle; +/** + * @} + */ + +/** + * @defgroup CRG_API_Declaration CRG HAL API + * @{ + */ +BASE_StatusType HAL_CRG_Init(const CRG_Handle *handle); + +BASE_StatusType HAL_CRG_DeInit(const CRG_Handle *handle); + +BASE_StatusType HAL_CRG_GetConfig(CRG_Handle *handle); + +BASE_StatusType HAL_CRG_SetCoreClockSelect(CRG_Handle *handle); + +BASE_StatusType HAL_CRG_InitWithTargetFrequence(const CRG_Handle *handle, unsigned int targetFreq); + +BASE_StatusType HAL_CRG_IpEnableSet(const void *baseAddress, unsigned int enable); + +BASE_StatusType HAL_CRG_IpEnableGet(const void *baseAddress, unsigned int *enable); + +BASE_StatusType HAL_CRG_IpClkSelectSet(const void *baseAddress, unsigned int select); + +BASE_StatusType HAL_CRG_IpClkSelectGet(const void *baseAddress, unsigned int *select); + +BASE_StatusType HAL_CRG_IpClkResetSet(const void *baseAddress, unsigned int reset); + +BASE_StatusType HAL_CRG_IpClkResetGet(const void *baseAddress, unsigned int *reset); + +BASE_StatusType HAL_CRG_IpClkDivSet(const void *baseAddress, unsigned int div); + +BASE_StatusType HAL_CRG_IpClkDivGet(const void *baseAddress, unsigned int *div); + +void HAL_CRG_PvdResetEnable(bool enable); + +unsigned int HAL_CRG_GetPllFreq(void); + +unsigned int HAL_CRG_GetCoreClkFreq(void); + +unsigned int HAL_CRG_GetIpFreq(const void *ipBaseAddr); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_CRG_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/crg/inc/crg_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/crg/inc/crg_ip.h new file mode 100644 index 000000000..3ee147c20 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/crg/inc/crg_ip.h @@ -0,0 +1,1730 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file crg_ip.h + * @author MCU Driver Team + * @brief TIMER module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the TIMER. + * + CRG register mapping structure + * + Direct Configuration Layer functions of CRG + */ +#ifndef McuMagicTag_CRG_IP_H +#define McuMagicTag_CRG_IP_H + +/* Includes ------------------------------------------------------------------*/ +#include "baseinc.h" + +/** + * @addtogroup CRG + * @{ + */ + +/** + * @defgroup CRG_IP CRG_IP + * @brief CRG_IP: crg_v1 + * @{ + */ + +/** + * @defgroup CRG_Param_Def CRG Parameters Definition + * @brief Definition of CRG configuration parameters. + * @{ + */ +#ifdef CRG_PARAM_CHECK +#define CRG_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define CRG_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define CRG_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define CRG_ASSERT_PARAM(para) ((void)0U) +#define CRG_PARAM_CHECK_NO_RET(para) ((void)0U) +#define CRG_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +#define IP_CLK_DISABLE 0x00000000U /**< IP Clock disable bitmask */ +#define IP_CLK_ENABLE 0x00000001U /**< IP Clock disable bitmask */ +#define HPM_CLK_ENABLE 0x00000001U /**< HPM Clock enable bitmask */ +#define HPM_1M_CLK_ENABLE 0x00000002U /**< HPM 1M Clock enable bitmask */ +#define IP_SYSCLK_ENABLE 0x00000002U /**< IP SysClock disable bitmask, Only valid for ADC */ + +#define DAC_DIV_BITLEN 4U /**< DIV bit length */ +#define DAC_DIV_MASK ((1 << DAC_DIV_BITLEN) - 1) /**< DAC div mask, base on the bit length */ + +#define ADC_DIV_FACTOR (1 << 1) /**< ADC div min factor */ +#define CRG_1MHZ_CLK_MAX_DIV 63 +#define CRG_FREQ_1MHz (1000 * 1000) +#define CRG_CLK_PFD_MIN_FREQ (4 * CRG_FREQ_1MHz) +#define CRG_CLK_PFD_MAX_FREQ (75 * CRG_FREQ_1MHz / 10) +#define CRG_CLK_VCO_MIN_FREQ (100 * CRG_FREQ_1MHz) +#define CRG_CLK_VCO_MAX_FREQ (300 * CRG_FREQ_1MHz) +#define CRG_CLK_TARGET_MAX_FREQ (150 * CRG_FREQ_1MHz) +#define CRG_CLK_PST2_MAX_FREQ (100 * CRG_FREQ_1MHz) +/** + * @brief PLL refer clock Select + */ +typedef enum { + CRG_PLL_REF_CLK_SELECT_HOSC = 0, + CRG_PLL_REF_CLK_SELECT_XTAL = 1, +} CRG_PllRefClkSelect; + +/** + * @brief PLL previous divsion value in register + */ +typedef enum { + CRG_PLL_PREDIV_1 = 0, + CRG_PLL_PREDIV_2 = 1, + CRG_PLL_PREDIV_3 = 2, + CRG_PLL_PREDIV_4 = 3, + CRG_PLL_PREDIV_5 = 4, + CRG_PLL_PREDIV_6 = 5, + CRG_PLL_PREDIV_7 = 6, + CRG_PLL_PREDIV_8 = 7, +} CRG_PllPreDiv; + +/** + * @brief PLL previous divison value in Calc frequency + */ +typedef enum { + PLL_PREDIV_OUT_1 = 1, + PLL_PREDIV_OUT_2 = 2, + PLL_PREDIV_OUT_3 = 3, + PLL_PREDIV_OUT_4 = 4, + PLL_PREDIV_OUT_5 = 5, + PLL_PREDIV_OUT_6 = 6, + PLL_PREDIV_OUT_7 = 7, + PLL_PREDIV_OUT_8 = 8, +} PLL_PreDivOut; + +/** + * @brief PLL post division 1 value in register + */ +typedef enum { + CRG_PLL_POSTDIV_1 = 0, + CRG_PLL_POSTDIV_2 = 1, + CRG_PLL_POSTDIV_3 = 2, + CRG_PLL_POSTDIV_4 = 3, + CRG_PLL_POSTDIV_5 = 4, + CRG_PLL_POSTDIV_6 = 5, + CRG_PLL_POSTDIV_7 = 6, + CRG_PLL_POSTDIV_8 = 7, +} CRG_PllPostDiv; + +/** + * @brief PLL post division 2 value in register + */ +typedef enum { + CRG_PLL_POSTDIV2_1 = 0, + CRG_PLL_POSTDIV2_2 = 1, + CRG_PLL_POSTDIV2_3 = 2, + CRG_PLL_POSTDIV2_4 = 3, + CRG_PLL_POSTDIV2_5 = 4, + CRG_PLL_POSTDIV2_6 = 5, + CRG_PLL_POSTDIV2_7 = 6, + CRG_PLL_POSTDIV2_8_MAX = 7, +} CRG_PllPostDiv2; + + +/** + * @brief Core clock selection + * @note default select HOSC + */ +typedef enum { + CRG_CORE_CLK_SELECT_HOSC = 0, + CRG_CORE_CLK_SELECT_TCXO = 1, + CRG_CORE_CLK_SELECT_PLL = 2, +} CRG_CoreClkSelect; + +/** + * @brief Core clock selection 2 + * @note default select HOSC + */ +typedef enum { + CRG_CORE_CLK2_SELECT_HOSC = 0, + CRG_CORE_CLK2_SELECT_TCXO = 1, + CRG_CORE_CLK2_SELECT_PLL = 2, +} CRG_CoreClkSelect2; + +/** + * @brief 1M clock selection + * @note default select HOSC + */ +typedef enum { + CRG_1M_CLK_SELECT_HOSC = 0, + CRG_1M_CLK_SELECT_TCXO = 1, +} CRG_1MClkSelect; + +/** + * @brief PLL frequency multiplication range + */ +typedef enum { + CRG_PLL_FBDIV_MIN = 6, + CRG_PLL_FBDIV_MAX = 127, +} CRG_PllFbDivRange; + +/** + * @brief PLL diagnose post div selection + */ +typedef enum { + CRG_PLL_DIG_POST_DIV_SELECT_FREF = 0, + CRG_PLL_DIG_POST_DIV_SELECT_PLL = 1, +} CRG_PllDigPostDivInSelect; + +/** + * @brief PLL diagnose loct detect lpsel + */ +typedef enum { + CRG_PLL_DIG_LOCKDET_LP_SELECT_2048 = 0, + CRG_PLL_DIG_LOCKDET_LP_SELECT_1024 = 1, + CRG_PLL_DIG_LOCKDET_LP_SELECT_512 = 2, + CRG_PLL_DIG_LOCKDET_LP_SELECT_256 = 3, +} CRG_PllDigLockDetLpSelect; + +/** + * @brief PLL Test selection + */ +typedef enum { + CRG_PLL_TEST_SELECT_FPFD = 0, + CRG_PLL_TEST_SELECT_CKFB = 1, + CRG_PLL_TEST_SELECT_LOCKDET_OUTPUT = 2, + CRG_PLL_TEST_SELECT_FOUTPOSTDIV_128 = 3, + CRG_PLL_TEST_SELECT_OUTPUT_0 = 4, +} CRG_PllDigTestSelect; + +/** + * @brief CRG Test Clock Select + */ +typedef enum { + CRG_TEST_CLK_PLL_PFD = 0x00000000U, + CRG_TEST_CLK_HOSC = 0x00000001U, + CRG_TEST_CLK_LOSC = 0x00000002U, + CRG_TEST_CLK_TCXO = 0x00000003U, + CRG_TEST_CLK_BG_CHOPPER = 0x00000004U, + CRG_TEST_CLK_ADC_DIV4 = 0x00000005U, + CRG_TEST_CLK_HCLK_DIV6 = 0x00000006U, + CRG_TEST_CLK_HOSC_DIV = 0x00000007U, +} CRG_TestClkSel; + +/** + * @brief ADC source clock select + */ +typedef enum { + CRG_ADC_CLK_ASYN_HOSC = 0, + CRG_ADC_CLK_ASYN_TCXO = 1, + CRG_ADC_CLK_ASYN_PLL_DIV = 2, + CRG_ADC_CLK_SYN_CORE = 3, +} CRG_AdcClkSelect; + +/** + * @brief ADC synchronous and asynchronous clock source selection + */ +typedef enum { + CRG_ADC_CLK_ASYNCHRONOUS = 0, + CRG_ADC_CLK_SYNCHRONOUS = 1, +} CRG_AdcClkModeSelect; + +/** + * @brief ADC Div set Value + */ +typedef enum { + CRG_ADC_DIV_1 = 0, + CRG_ADC_DIV_2 = 1, + CRG_ADC_DIV_3 = 2, + CRG_ADC_DIV_4 = 3, +} CRG_AdcDiv; + +/** + * @brief CRG Extra Handle, include CRG's other config + */ +typedef struct { + CRG_PllPostDiv2 pllPostDiv2; /**< PLL post 2 ratio */ + CRG_1MClkSelect clk1MSelect; /**< 1M clock selection */ + unsigned int clk1MDiv; /**< 1M clock ratio */ +} CRG_ExtendHandle; + +/** + * @brief PLL Divison Config + */ +typedef struct { + unsigned int PreDiv; + unsigned int fbDiv; + unsigned int postDiv; +} CRG_PllDivCfg; + +/** + * @brief APB_HS_SUBSYS IP config + */ +typedef union { + unsigned int value; + struct { + unsigned int clkEnMask : 16; + unsigned int softResetReq : 16; + } BIT; +} volatile CRG_IpWoClkSelectCfg; + +/** + * @brief ADC config + * @see PERI_CRG41_Reg and PERI_CRG42_Reg and PERI_CRG43_Reg + */ +typedef union { + unsigned int value[2]; + struct { + unsigned int eflash_cken : 1; + unsigned int reserved : 31; + unsigned int eflash_clk_tick_cksel : 1; + unsigned int reserved1 : 31; + } BIT; +} volatile CRG_EfcIpCfg; + +typedef union { + unsigned int value[2]; + struct { + unsigned int clk_adc_div0 : 2; + unsigned int reserved : 6; + unsigned int clk_adc_div1 : 2; + unsigned int reserved1 : 22; + unsigned int clk_adc_cken : 1; + unsigned int reserved2 : 15; + unsigned int adc_srst_req : 1; + unsigned int reserved3 : 7; + unsigned int cfg_adc_ckmode_sel : 1; + unsigned int reserved4 : 7; + } BIT; +} volatile CRG_AdcIpCfg; + +/** + * @brief DAC config + * @see PERI_CRG45_Reg + */ +typedef union { + unsigned int value; + struct { + unsigned int clkEnMask : 3; + unsigned int reserved_0 : 1; + unsigned int div : 12; + unsigned int softResetReq : 3; + unsigned int reserved_1 : 13; + } BIT; +} volatile CRG_DacIpCfg; + +/** + * @brief ANA config + * @see PERI_CRG664_Reg - PERI_CRG677_Reg + */ +typedef union { + unsigned int value; + struct { + unsigned int reserved : 16; + unsigned int ip_srst_req : 1; + unsigned int reserved1 : 15; + } BIT; +} volatile CRG_AnaIpCfg; + +/** + * @brief IP match info for ip process + */ +typedef struct { + void *baseAddr; /**< Base address of ip */ + unsigned int offset; /**< The offset in CRG_RegStruct */ + unsigned int idx; /**< index in Reg, for example: 0 -capm0_cken 1 - capm1_cken in PERI_CRG30_Reg */ +} CRG_IpMatchInfo; + +/** + * @} + */ + +/** + * @brief CRG REG0 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pll_ref_cksel : 1; /**< pll reference select */ + unsigned int reserved : 31; + } BIT; +} volatile PERI_CRG0_REG; + +/** + * @brief CRG REG1 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pll_prediv : 4; /**< predivider value */ + unsigned int reserved : 28; + } BIT; +} volatile PERI_CRG1_REG; + +/** + * @brief CRG REG2 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pll_fbdiv : 8; /**< feedback divider value */ + unsigned int reserved : 24; + } BIT; +} volatile PERI_CRG2_REG; + +/** + * @brief CRG REG3 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pll_postdiv1 : 4; /**< post divider value */ + unsigned int pll_postdiv2 : 4; + unsigned int reserved : 24; + } BIT; +} volatile PERI_CRG3_REG; + +/** + * @brief CRG REG4 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pll_pd : 1; /**< pll power down */ + unsigned int reserved : 31; + } BIT; +} volatile PERI_CRG4_REG; + +/** + * @brief CRG REG 7 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pll_lock : 1; /**< pll lock flag */ + unsigned int reserved : 31; + } BIT; +} volatile PERI_CRG7_REG; + +/** + * @brief CRG REG 8 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pll_lock_deglitch : 1; /**< pll out without deburring */ + unsigned int reserved : 31; + } BIT; +} volatile PERI_CRG8_REG; + +/** + * @brief CRG REG64 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int clk_pst1_sw_sel : 2; /**< hclk_sw_sel select */ + unsigned int reserved : 2; + unsigned int clk_pst2_sw_sel : 2; /**< clk_pst2_sw_sel select */ + unsigned int reserved1 : 2; + unsigned int reserved2 : 24; + } BIT; +} volatile PERI_CRG64_REG; + +/** + * @brief CRG REG65 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pvd_rst_enable : 1; /**< pvd reset enable */ + unsigned int reserved : 3; + unsigned int reserved1 : 28; + } BIT; +} volatile PERI_CRG65_REG; + +/** + * @brief CRG REG66 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int clk_1m_ini_cksel : 1; /**< clock 1M selection */ + unsigned int reserved : 3; + unsigned int reserved1 : 28; + } BIT; +} volatile PERI_CRG66_REG; + +/** + * @brief CRG REG registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int clk_1m_div : 6; /**< clock 1M divide */ + unsigned int reserved : 2; + unsigned int reserved1 : 24; + } BIT; +} volatile PERI_CRG67_REG; + +/** + * @brief CRG REG80 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int uart0_cken : 1; /**< uart0 clock enable */ + unsigned int reserved : 15; + unsigned int uart0_srst_req : 1; /**< uart0 reset request */ + unsigned int reserved1 : 15; + } BIT; +} volatile PERI_CRG80_REG; + +/** + * @brief CRG REG81 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int uart1_cken : 1; /**< uart1 clock enable */ + unsigned int reserved : 15; + unsigned int uart1_srst_req : 1; /**< uart1 reset request */ + unsigned int reserved1 : 15; + } BIT; +} volatile PERI_CRG81_REG; + +/** + * @brief CRG REG82 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int uart2_cken : 1; /**< uart2 clock enable */ + unsigned int reserved : 15; + unsigned int uart2_srst_req : 1; /**< uart2 reset request */ + unsigned int reserved1 : 15; + } BIT; +} volatile PERI_CRG82_REG; + +/** + * @brief CRG REG83 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int uart3_cken : 1; /**< uart3 clock enable */ + unsigned int reserved : 15; + unsigned int uart3_srst_req : 1; /**< uart3 reset request */ + unsigned int reserved1 : 15; + } BIT; +} volatile PERI_CRG83_REG; + +/** + * @brief CRG REG96 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int spi0_cken : 1; /**< spi0 clock enable */ + unsigned int reserved : 15; + unsigned int spi0_srst_req : 1; /**< spi0 reset request */ + unsigned int reserved1 : 15; + } BIT; +} volatile PERI_CRG96_REG; + +/** + * @brief CRG REG97 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int spi1_cken : 1; /**< spi1 clock enable */ + unsigned int reserved : 15; + unsigned int spi1_srst_req : 1; /**< spi1 reset request */ + unsigned int reserved1 : 15; + } BIT; +} volatile PERI_CRG97_REG; + +/** + * @brief CRG REG112 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int i2c0_cken : 1; /**< i2c0 clock enable */ + unsigned int reserved : 15; + unsigned int i2c0_srst_req : 1; /**< i2c0 reset request */ + unsigned int reserved1 : 15; + } BIT; +} volatile PERI_CRG112_REG; + +/** + * @brief CRG REG113 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int i2c1_cken : 1; /**< i2c1 clock enable */ + unsigned int reserved : 15; + unsigned int i2c1_srst_req : 1; /**< i2c1 reset request */ + unsigned int reserved1 : 15; + } BIT; +} volatile PERI_CRG113_REG; + +/** + * @brief CRG REG128 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int wwdg_cken : 1; /**< wwdg clock enable */ + unsigned int reserved : 15; + unsigned int wwdg_srst_req : 1; /**< wwdg reset request */ + unsigned int reserved1 : 15; + } BIT; +} volatile PERI_CRG128_REG; + +/** + * @brief CRG REG144 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int timer0_cken : 1; /**< timer0 clock enable */ + unsigned int reserved : 15; + unsigned int timer0_srst_req : 1; /**< timer0 reset request */ + unsigned int reserved1 : 15; + } BIT; +} volatile PERI_CRG144_REG; + +/** + * @brief CRG REG145 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int timer1_cken : 1; /**< timer1 clock enable */ + unsigned int reserved : 15; + unsigned int timer1_srst_req : 1; /**< timer1 reset request */ + unsigned int reserved1 : 15; + } BIT; +} volatile PERI_CRG145_REG; + +/** + * @brief CRG REG146 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int timer2_cken : 1; /**< timer2 clock enable */ + unsigned int reserved : 15; + unsigned int timer2_srst_req : 1; /**< timer2 reset request */ + unsigned int reserved1 : 15; + } BIT; +} volatile PERI_CRG146_REG; + +/** + * @brief CRG REG147 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int timer3_cken : 1; /**< timer3 clock enable */ + unsigned int reserved : 15; + unsigned int timer3_srst_req : 1; /**< timer3 reset request */ + unsigned int reserved1 : 15; + } BIT; +} volatile PERI_CRG147_REG; + +/** + * @brief CRG REG160 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int capm0_cken : 1; /**< capm0 clock enable */ + unsigned int reserved : 15; + unsigned int capm0_srst_req : 1; /**< capm1 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG160_REG; + +/** + * @brief CRG REG161 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int capm1_cken : 1; /**< capm1 clock enable */ + unsigned int reserved : 15; + unsigned int capm1_srst_req : 1; /**< capm1 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG161_REG; + +/** + * @brief CRG REG162 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int capm2_cken : 1; /**< capm2 clock enable */ + unsigned int reserved : 15; + unsigned int capm2_srst_req : 1; /**< capm2 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG162_REG; + +/** + * @brief CRG REG176 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int can_cken : 1; /**< can clock enable */ + unsigned int reserved : 15; + unsigned int can_srst_req : 1; /**< can reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG176_REG; + +/** + * @brief CRG REG192 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int dma_cken : 1; /**< dma clock enable */ + unsigned int reserved : 15; + unsigned int dma_srst_req : 1; /**< dma reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG192_REG; + +/** + * @brief CRG REG208 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cmm_cken : 1; /**< cmm clock enable */ + unsigned int reserved : 15; + unsigned int cmm_srst_req : 1; /**< cmm reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG208_REG; + +/** + * @brief CRG REG224 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int crc_cken : 1; /**< crc clock enable */ + unsigned int reserved : 15; + unsigned int crc_srst_req : 1; /**< crc reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG224_REG; + +/** + * @brief CRG REG240 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int iwdg_cken : 1; /**< iwdg clock enable */ + unsigned int reserved : 15; + unsigned int iwdg_srst_req : 1; /**< iwdg reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG240_REG; + +/** + * @brief CRG REG256 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int apt0_cken : 1; /**< apt0 clock enable */ + unsigned int reserved : 15; + unsigned int apt0_srst_req : 1; /**< apt0 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG256_REG; + +/** + * @brief CRG REG257 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int apt1_cken : 1; /**< apt1 clock enable */ + unsigned int reserved : 15; + unsigned int apt1_srst_req : 1; /**< apt1 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG257_REG; + +/** + * @brief CRG REG258 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int apt2_cken : 1; /**< apt2 clock enable */ + unsigned int reserved : 15; + unsigned int apt2_srst_req : 1; /**< apt2 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG258_REG; + +/** + * @brief CRG REG259 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int apt3_cken : 1; /**< apt3 clock enable */ + unsigned int reserved : 15; + unsigned int apt3_srst_req : 1; /**< apt3 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG259_REG; + +/** + * @brief CRG REG272 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int gpt0_cken : 1; /**< gpt0 clock enable */ + unsigned int reserved : 15; + unsigned int gpt0_srst_req : 1; /**< gpt0 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG272_REG; + +/** + * @brief CRG REG273 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int gpt1_cken : 1; /**< gpt1 clock enable */ + unsigned int reserved : 15; + unsigned int gpt1_srst_req : 1; /**< gpt1 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG273_REG; + +/** + * @brief CRG REG274 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int gpt2_cken : 1; /**< gpt2 clock enable */ + unsigned int reserved : 15; + unsigned int gpt2_srst_req : 1; /**< gpt2 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG274_REG; + +/** + * @brief CRG REG275 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int gpt3_cken : 1; /**< gpt3 clock enable */ + unsigned int reserved : 15; + unsigned int gpt3_srst_req : 1; /**< gpt3 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG275_REG; + +/** + * @brief CRG REG288 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int gpio0_cken : 1; /**< gpio0 clock enable */ + unsigned int reserved : 15; + unsigned int gpio0_srst_req : 1; /**< gpio0 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG288_REG; + +/** + * @brief CRG REG289 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int gpio1_cken : 1; /**< gpio1 clock enable */ + unsigned int reserved : 15; + unsigned int gpio1_srst_req : 1; /**< gpio1 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG289_REG; + +/** + * @brief CRG REG290 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int gpio2_cken : 1; /**< gpio2 clock enable */ + unsigned int reserved : 15; + unsigned int gpio2_srst_req : 1; /**< gpio2 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG290_REG; + +/** + * @brief CRG REG291 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int gpio3_cken : 1; /**< gpio3 clock enable */ + unsigned int reserved : 15; + unsigned int gpio3_srst_req : 1; /**< gpio3 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG291_REG; + +/** + * @brief CRG REG292 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int gpio4_cken : 1; /**< gpio4 clock enable */ + unsigned int reserved : 15; + unsigned int gpio4_srst_req : 1; /**< gpio4 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG292_REG; + +/** + * @brief CRG REG293 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int gpio5_cken : 1; /**< gpio5 clock enable */ + unsigned int reserved : 15; + unsigned int gpio5_srst_req : 1; /**< gpio5 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG293_REG; + +/** + * @brief CRG REG304 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int qdm0_cken : 1; /**< qdm0 clock enable */ + unsigned int reserved : 15; + unsigned int qdm0_srst_req : 1; /**< qdm0 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG304_REG; + +/** + * @brief CRG REG305 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int qdm1_cken : 1; /**< qdm1 clock enable */ + unsigned int reserved : 15; + unsigned int qdm1_srst_req : 1; /**< qdm1 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG305_REG; + +/** + * @brief CRG REG320 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int eflash_cken : 1; /**< eflash clock enable */ + unsigned int reserved : 15; + unsigned int reserved1 : 16; + } BIT; +} volatile PERI_CRG320_REG; + +/** + * @brief CRG REG639 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int test_clk_en : 1; /**< test clock enable */ + unsigned int reserved : 15; + unsigned int test_clk_sel : 3; /**< test clock select */ + unsigned int reserved1 : 13; + } BIT; +} volatile PERI_CRG639_REG; + +/** + * @brief CRG REG640 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int clk_adc_div0 : 2; /**< adc divide register 0 */ + unsigned int reserved : 6; + unsigned int clk_adc_div1 : 2; /**< adc divide register 1 */ + unsigned int reserved1 : 22; + } BIT; +} volatile PERI_CRG640_REG; + +/** + * @brief CRG REG641 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int adc_cken : 1; /**< adc clock enable */ + unsigned int reserved : 15; + unsigned int adc_srst_req : 1; /**< adc reset request */ + unsigned int reserved1 : 7; + unsigned int adc_clk_mode : 1; /**< adc clock selection */ + unsigned int reserved2 : 7; + } BIT; +} volatile PERI_CRG641_REG; + +/** + * @brief CRG REG656 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int clk_bg_chopper_div : 6; /**< clk_bg_chopper divide factor */ + unsigned int reserved : 2; + unsigned int clk_bg_chopper_div_bypass : 1; /**< clk_bg_chopper divide bypass signal */ + unsigned int reserved1 : 23; + } BIT; +} volatile PERI_CRG656_REG; + +/** + * @brief CRG REG660 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int clk_ana_cken : 1; /**< anolog clock enable */ + unsigned int reserved : 15; + unsigned int ana_srst_req : 1; /**< anolog reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG660_REG; + +/** + * @brief CRG REG664 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved : 16; + unsigned int vref_srst_req : 1; /**< VREF reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG664_REG; + +/** + * @brief CRG REG668 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved : 16; + unsigned int acmp_srst_req : 1; /**< acmp reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG668_REG; + +/** + * @brief CRG REG672 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved : 16; + unsigned int dac_srst_req : 1; /**< dac reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG672_REG; + +/** + * @brief CRG REG676 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved : 16; + unsigned int pga0_srst_req : 1; /**< pga0 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG676_REG; + +/** + * @brief CRG REG677 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved : 16; + unsigned int pga1_srst_req : 1; /**< pga1 reset request */ + unsigned int reserved1 : 7; + unsigned int reserved2 : 8; + } BIT; +} volatile PERI_CRG677_REG; + + +/** + * @brief HOSC CTRL4 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int hosc_pd : 1; /**< HOSC power down enable bit */ + unsigned int reserved : 31; + } BIT; +} volatile HOSC_PD_REG; + +/** + * @brief HOSC CTRL5 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int hosc_lock : 1; /**< HOSC lock signal */ + unsigned int reserved : 31; + } BIT; +} volatile HOSC_LOCK_REG; + +typedef struct { + PERI_CRG0_REG PERI_CRG0; /**< CRG0 register. Offset address 0x00000000U. */ + PERI_CRG1_REG PERI_CRG1; /**< CRG1 register. Offset address 0x00000004U. */ + PERI_CRG2_REG PERI_CRG2; /**< CRG2 register. Offset address 0x00000008U. */ + PERI_CRG3_REG PERI_CRG3; /**< CRG3 register. Offset address 0x0000000CU. */ + PERI_CRG4_REG PERI_CRG4; /**< CRG4 register. Offset address 0x00000010U. */ + unsigned char reserved0[8]; + PERI_CRG7_REG PERI_CRG7; /**< CRG7 register. Offset address 0x0000001CU. */ + PERI_CRG8_REG PERI_CRG8; /**< CRG8 register. Offset address 0x00000020U. */ + unsigned char reserved1[0xdc]; + PERI_CRG64_REG PERI_CRG64; /**< CRG64 register. Offset address 0x00000100U. */ + PERI_CRG65_REG PERI_CRG65; /**< CRG65 register. Offset address 0x00000104U. */ + PERI_CRG66_REG PERI_CRG66; /**< CRG66 register. Offset address 0x00000108U. */ + PERI_CRG67_REG PERI_CRG67; /**< CRG67 register. Offset address 0x0000010CU. */ + unsigned char reserved2[0x30]; + PERI_CRG80_REG PERI_CRG80; /**< CRG80 register. Offset address 0x00000140U. */ + PERI_CRG81_REG PERI_CRG81; /**< CRG81 register. Offset address 0x00000144U. */ + PERI_CRG82_REG PERI_CRG82; /**< CRG82 register. Offset address 0x00000148U. */ + PERI_CRG83_REG PERI_CRG83; /**< CRG83 register. Offset address 0x0000014CU. */ + unsigned char reserved3[0x30]; + PERI_CRG96_REG PERI_CRG96; /**< CRG96 register. Offset address 0x00000180U. */ + PERI_CRG97_REG PERI_CRG97; /**< CRG97 register. Offset address 0x00000184U. */ + unsigned char reserved4[0x38]; + PERI_CRG112_REG PERI_CRG112; /**< CRG112 register. Offset address 0x000001C0U. */ + PERI_CRG113_REG PERI_CRG113; /**< CRG113 register. Offset address 0x000001C4U. */ + unsigned char reserved5[0x38]; + PERI_CRG128_REG PERI_CRG128; /**< CRG128 register. Offset address 0x00000200U. */ + unsigned char reserved6[0x3c]; + PERI_CRG144_REG PERI_CRG144; /**< CRG144 register. Offset address 0x00000240U. */ + PERI_CRG145_REG PERI_CRG145; /**< CRG145 register. Offset address 0x00000244U. */ + PERI_CRG146_REG PERI_CRG146; /**< CRG146 register. Offset address 0x00000248U. */ + PERI_CRG147_REG PERI_CRG147; /**< CRG147 register. Offset address 0x0000024CU. */ + unsigned char reserved7[0x30]; + PERI_CRG160_REG PERI_CRG160; /**< CRG160 register. Offset address 0x00000280U. */ + PERI_CRG161_REG PERI_CRG161; /**< CRG161 register. Offset address 0x00000284U. */ + PERI_CRG162_REG PERI_CRG162; /**< CRG162 register. Offset address 0x00000288U. */ + unsigned char reserved8[0x34]; + PERI_CRG176_REG PERI_CRG176; /**< CRG176 register. Offset address 0x000002C0U. */ + unsigned char reserved9[0x3c]; + PERI_CRG192_REG PERI_CRG192; /**< CRG192 register. Offset address 0x00000300U. */ + unsigned char reserved10[0x3c]; + PERI_CRG208_REG PERI_CRG208; /**< CRG208 register. Offset address 0x00000340U. */ + unsigned char reserved11[0x3c]; + PERI_CRG224_REG PERI_CRG224; /**< CRG224 register. Offset address 0x00000380U. */ + unsigned char reserved12[0x3c]; + PERI_CRG240_REG PERI_CRG240; /**< CRG240 register. Offset address 0x000003C0U. */ + unsigned char reserved13[0x3c]; + PERI_CRG256_REG PERI_CRG256; /**< CRG256 register. Offset address 0x00000400U. */ + PERI_CRG257_REG PERI_CRG257; /**< CRG257 register. Offset address 0x00000404U. */ + PERI_CRG258_REG PERI_CRG258; /**< CRG258 register. Offset address 0x00000408U. */ + PERI_CRG259_REG PERI_CRG259; /**< CRG259 register. Offset address 0x0000040CU. */ + unsigned char reserved14[0x30]; + PERI_CRG272_REG PERI_CRG272; /**< CRG272 register. Offset address 0x00000440U. */ + PERI_CRG273_REG PERI_CRG273; /**< CRG273 register. Offset address 0x00000444U. */ + PERI_CRG274_REG PERI_CRG274; /**< CRG274 register. Offset address 0x00000448U. */ + PERI_CRG275_REG PERI_CRG275; /**< CRG275 register. Offset address 0x0000044CU. */ + unsigned char reserved15[0x30]; + PERI_CRG288_REG PERI_CRG288; /**< CRG288 register. Offset address 0x00000480U. */ + PERI_CRG289_REG PERI_CRG289; /**< CRG289 register. Offset address 0x00000484U. */ + PERI_CRG290_REG PERI_CRG290; /**< CRG290 register. Offset address 0x00000488U. */ + PERI_CRG291_REG PERI_CRG291; /**< CRG291 register. Offset address 0x0000048cU. */ + PERI_CRG292_REG PERI_CRG292; /**< CRG292 register. Offset address 0x00000490U. */ + PERI_CRG293_REG PERI_CRG293; /**< CRG293 register. Offset address 0x00000494U. */ + unsigned char reserved16[0x28]; + PERI_CRG304_REG PERI_CRG304; /**< CRG304 register. Offset address 0x000004C0U. */ + PERI_CRG305_REG PERI_CRG305; /**< CRG305 register. Offset address 0x000004C4U. */ + unsigned char reserved17[0x38]; + PERI_CRG320_REG PERI_CRG320; /**< CRG320 register. Offset address 0x00000500U. */ + unsigned char reserved18[0x4f8]; + PERI_CRG639_REG PERI_CRG639; /**< CRG639 register. Offset address 0x000009FCU. */ + PERI_CRG640_REG PERI_CRG640; /**< CRG640 register. Offset address 0x00000A00U. */ + PERI_CRG641_REG PERI_CRG641; /**< CRG640 register. Offset address 0x00000A04U. */ + unsigned char reserved19[0x38]; + PERI_CRG656_REG PERI_CRG656; /**< CRG656 register. Offset address 0x00000A40U. */ + unsigned char reserved20[0xc]; + PERI_CRG660_REG PERI_CRG660; /**< CRG660 register. Offset address 0x00000A50U. */ + unsigned char reserved21[0xc]; + PERI_CRG664_REG PERI_CRG664; /**< CRG664 register. Offset address 0x00000A60U. */ + unsigned char reserved22[0xc]; + PERI_CRG668_REG PERI_CRG668; /**< CRG668 register. Offset address 0x00000A70U. */ + unsigned char reserved23[0xc]; + PERI_CRG672_REG PERI_CRG672; /**< CRG672 register. Offset address 0x00000A80U. */ + unsigned char reserved24[0xc]; + PERI_CRG676_REG PERI_CRG676; /**< CRG676 register. Offset address 0x00000A90U. */ + PERI_CRG677_REG PERI_CRG677; /**< CRG677 register. Offset address 0x00000A94U. */ + unsigned char reserved25[1140]; + HOSC_PD_REG HOSC_PD; /**< HOSC_PD register. Offset address 0x000000F0CU. */ + HOSC_LOCK_REG HOSC_LOCK; /**< HOSC_LOCK register. Offset address 0x000000F10U. */ +} volatile CRG_RegStruct; + +/** + * @} + */ + +/* Parameter Check -----------------------------------------------------------*/ +/** + * @brief Verify pll_ref_cksel configuration + * @param clkSelect pll_ref_cksel + * @retval true + * @retval false + */ +static inline bool IsCrgPllRefClkSelect(CRG_PllRefClkSelect clkSelect) +{ + return ((clkSelect == CRG_PLL_REF_CLK_SELECT_HOSC) || + (clkSelect == CRG_PLL_REF_CLK_SELECT_XTAL)); +} + +/** + * @brief Verify Crg pll_prediv configuration + * @param preDiv pll prediv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPreDiv(CRG_PllPreDiv preDiv) +{ + return ((preDiv >= CRG_PLL_PREDIV_1) && + (preDiv <= CRG_PLL_PREDIV_8)); +} + +/** + * @brief Verify Crg pll_postdiv configuration + * @param postDiv pll_postdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv(CRG_PllPostDiv postDiv) +{ + return ((postDiv >= CRG_PLL_POSTDIV_1) && + (postDiv <= CRG_PLL_POSTDIV_8)); +} + +/** + * @brief Verify Crg pll_postdiv2 configuration + * @param postDiv pll_postdiv2 value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv2(CRG_PllPostDiv2 postDiv) +{ + return ((postDiv >= CRG_PLL_POSTDIV2_1) && + (postDiv <= CRG_PLL_POSTDIV2_8_MAX)); +} + +/** + * @brief Verify Crg pll_fbdiv configuration + * @param fbDiv pll fbdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllFbDiv(unsigned int fbDiv) +{ + return (fbDiv <= CRG_PLL_FBDIV_MAX); +} + +/** + * @brief Verify Crg pll_digpostdiv_in_sel configuration + * @param select pll_digpostdiv_in_sel value + * @retval true + * @retval false + */ +static inline bool IsCrgPllDigPostDivInSel(CRG_PllDigPostDivInSelect select) +{ + return ((select == CRG_PLL_DIG_POST_DIV_SELECT_FREF) || + (select == CRG_PLL_DIG_POST_DIV_SELECT_PLL)); +} + +/** + * @brief Verify Crg core_cksel configuration + * @param select core_cksel value + * @retval true + * @retval false + */ +static inline bool IsCrgCoreCkSel(CRG_CoreClkSelect select) +{ + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + (select == CRG_CORE_CLK_SELECT_TCXO) || + (select == CRG_CORE_CLK_SELECT_PLL)); +} + +/** + * @brief Verify Crg configuration + * @param select 1M clock selection + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkSel(CRG_1MClkSelect select) +{ + return ((select == CRG_1M_CLK_SELECT_HOSC) || + (select == CRG_1M_CLK_SELECT_TCXO)); +} + +/** + * @brief Verify Crg configuration + * @param div 1M clock ratio + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkDiv(unsigned int div) +{ + return (div <= CRG_1MHZ_CLK_MAX_DIV); +} + +/** + * @brief Verify Crg Ip (exclude adc) clock enable configuration + * @param enable ip clock enable value + * @retval true + * @retval false + */ +static inline bool IsCrgIpClkEnable(unsigned int enable) +{ + return ((enable == IP_CLK_DISABLE) || + (enable == IP_CLK_ENABLE)); +} + +/** + * @brief Check the PLL PreDiv is valid or not + * @param clkPllRef PLL Refer clock + * @param preDiv PLL Previous Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPreDiv(unsigned int pllRefFreq, unsigned int preDiv) +{ + unsigned int freq = pllRefFreq; + if (preDiv != 0) { + freq /= preDiv; + } + return (freq >= CRG_CLK_PFD_MIN_FREQ) && (freq <= CRG_CLK_PFD_MAX_FREQ); +} + +/** + * @brief Check the PLL FbDiv is valid or not + * @param clkPfdFreq PLL PFD clock + * @param fdDiv PLL FD Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidFdDiv(unsigned int clkPfdFreq, unsigned int fdDiv) +{ + if (clkPfdFreq > 30000000U) { /* The maximum speed of the external clock source is 30000000U. */ + return false; + } else if (fdDiv > CRG_PLL_FBDIV_MAX) { + return false; + } + + unsigned int freq = (fdDiv > 0x6) ? (clkPfdFreq * fdDiv) : (clkPfdFreq * 0x6); /* 0x0-0x6: divided by 0x6 */ + return (freq >= CRG_CLK_VCO_MIN_FREQ) && (freq <= CRG_CLK_VCO_MAX_FREQ); +} + +/** + * @brief Check the PLL PostDiv is valid or not + * @param clkPllRef PLL Vco clock + * @param postDiv PLL Post Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv(unsigned int clkVcoFreq, unsigned int postDiv) +{ + unsigned int freq = clkVcoFreq; + if (postDiv != 0) { + freq /= (postDiv + 1); + } + return (freq <= CRG_CLK_TARGET_MAX_FREQ); +} + +/** + * @brief Check the PLL PostDiv is valid or not + * @param clkPllRef PLL Vco clock + * @param postDiv2 PLL Post Divsion2 + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv2(unsigned int clkVcoFreq, unsigned int postDiv2) +{ + unsigned int freq = clkVcoFreq; + if (postDiv2 != 0) { + freq /= (postDiv2 + 1); + } + return (freq <= CRG_CLK_PST2_MAX_FREQ); +} + +/** + * @brief Check the adc clock select value + * @param adcClkSelect the value of adc clock select + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkModeSelect(CRG_AdcClkSelect adcClkSelect) +{ + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + adcClkSelect == CRG_ADC_CLK_SYN_CORE); +} + +/** + * @brief Check the adc clock div value + * @param div the value of adc clock div + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkDiv(CRG_AdcDiv div) +{ + return (div == CRG_ADC_DIV_1 || \ + div == CRG_ADC_DIV_2 || \ + div == CRG_ADC_DIV_3 || \ + div == CRG_ADC_DIV_4); +} + +/** + * @brief Set Pll Ref clock select + * @param clk Clock register base address + * @param clkSel clock source select + * @retval None + */ +static inline void DCL_CRG_SetPllRefClkSel(CRG_RegStruct *clk, CRG_PllRefClkSelect clkSel) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + CRG_PARAM_CHECK_NO_RET(IsCrgPllRefClkSelect(clkSel)); + clk->PERI_CRG0.BIT.pll_ref_cksel = (unsigned int)clkSel; +} + +/** + * @brief Get Pll Ref clock selection + * @param clk Clock register base address + * @retval pll_ref_cksel Ref clock selection + */ +static inline CRG_PllRefClkSelect DCL_CRG_GetPllRefClkSel(const CRG_RegStruct *clk) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + return (CRG_PllRefClkSelect)clk->PERI_CRG0.BIT.pll_ref_cksel; +} + +/** + * @brief Set prevous division ratio + * @param clk Clock register base address + * @param preDiv prevous division ratio + * @retval None + */ +static inline void DCL_CRG_SetPllPreDiv(CRG_RegStruct *clk, CRG_PllPreDiv preDiv) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + CRG_PARAM_CHECK_NO_RET(IsCrgPllPreDiv(preDiv)); + clk->PERI_CRG1.BIT.pll_prediv = (unsigned int)preDiv; +} + +/** + * @brief Get prevous division ratio + * @param clk Clock register base address + * @retval prediv prevous division ratio + */ +static inline CRG_PllPreDiv DCL_CRG_GetPllPreDiv(const CRG_RegStruct *clk) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + return (CRG_PllPreDiv)clk->PERI_CRG1.BIT.pll_prediv; +} + +/** + * @brief Set PLL frequency multiplication factor + * @param clk Clock register base address + * @param fbDiv Multiplication factor + * @retval None + */ +static inline void DCL_CRG_SetPllFbDiv(CRG_RegStruct *clk, unsigned int fbDiv) +{ + unsigned int div = fbDiv; + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + CRG_PARAM_CHECK_NO_RET(IsCrgPllFbDiv(fbDiv)); + clk->PERI_CRG2.BIT.pll_fbdiv = div; +} + +/** + * @brief Get PLL frequency multiplication factor + * @param clk Clock register base address + * @retval pll_fbdiv Multiplication factor + */ +static inline unsigned int DCL_CRG_GetPllFbDiv(const CRG_RegStruct *clk) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + return clk->PERI_CRG2.BIT.pll_fbdiv; +} + +/** + * @brief Set PLL post division ratio + * @param clk Clock register base address + * @param postDiv Post division ratio + * @retval None + */ +static inline void DCL_CRG_SetPllPostDiv1(CRG_RegStruct *clk, CRG_PllPostDiv postDiv) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + CRG_PARAM_CHECK_NO_RET(IsCrgPllPostDiv(postDiv)); + clk->PERI_CRG3.BIT.pll_postdiv1 = (unsigned int)postDiv; +} + +/** + * @brief Get PLL post division ratio + * @param clk Clock register base address + * @retval pll_postdiv Post division ratio + */ +static inline CRG_PllPostDiv DCL_CRG_GetPllPostDiv1(const CRG_RegStruct *clk) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + return (CRG_PllPostDiv)clk->PERI_CRG3.BIT.pll_postdiv1; +} + +/** + * @brief Set PLL post division ratio + * @param clk Clock register base address + * @param postDiv Post division ratio + * @retval None + */ +static inline void DCL_CRG_SetPllPostDiv2(CRG_RegStruct *clk, CRG_PllPostDiv postDiv) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + CRG_PARAM_CHECK_NO_RET(IsCrgPllPostDiv(postDiv)); + clk->PERI_CRG3.BIT.pll_postdiv2 = (unsigned int)postDiv; +} + +/** + * @brief Get PLL post division ratio + * @param clk Clock register base address + * @retval pll_postdiv Post division ratio + */ +static inline CRG_PllPostDiv DCL_CRG_GetPllPostDiv2(const CRG_RegStruct *clk) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + return (CRG_PllPostDiv)clk->PERI_CRG3.BIT.pll_postdiv2; +} + +/** + * @brief Set PLL Power + * @param clk Clock register base address + * @param pd pll power down or not + * @retval None + */ +static inline void DCL_CRG_SetPllPd(CRG_RegStruct *clk, bool pd) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + clk->PERI_CRG4.BIT.pll_pd = (unsigned int)pd; +} + +/** + * @brief Get PLL power status + * @param clk Clock register base address + * @retval 0: power up, 1: power down + */ +static inline bool DCL_CRG_GetPllPd(const CRG_RegStruct *clk) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + return clk->PERI_CRG4.BIT.pll_pd; +} + +/** + * @brief Set core clock selection + * @param clk Clock register base address + * @param select Core clock selection + * @retval None + */ +static inline void DCL_CRG_SetCoreClkSel(CRG_RegStruct *clk, CRG_CoreClkSelect select) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + CRG_PARAM_CHECK_NO_RET(IsCrgCoreCkSel(select)); + clk->PERI_CRG64.BIT.clk_pst1_sw_sel = select; +} + +/** + * @brief Get core clock selection + * @param clk Clock register base address + * @retval Core clock selection + */ +static inline unsigned int DCL_CRG_GetCoreClkSel(const CRG_RegStruct *clk) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + return clk->PERI_CRG64.BIT.clk_pst1_sw_sel; +} + +/** + * @brief Set core clock selection + * @param clk Clock register base address + * @param select Core clock selection + * @retval None + */ +static inline void DCL_CRG_SetAdcAsynClkSel(CRG_RegStruct *clk, CRG_CoreClkSelect select) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + CRG_PARAM_CHECK_NO_RET(IsCrgCoreCkSel(select)); + clk->PERI_CRG64.BIT.clk_pst2_sw_sel = select; +} + +/** + * @brief Get adc core clock selection + * @param clk Clock register base address + * @retval Core clock selection + */ +static inline unsigned int DCL_CRG_GetAdcAsynClkSel(const CRG_RegStruct *clk) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + return clk->PERI_CRG64.BIT.clk_pst2_sw_sel; +} + +/** + * @brief Set 1M clock selection + * @param clk Clock register base address + * @param select Core clock selection + * @retval None + */ +static inline void DCL_CRG_Set1MClkSel(CRG_RegStruct *clk, CRG_1MClkSelect select) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + CRG_PARAM_CHECK_NO_RET(IsCrg1MCkSel(select)); + clk->PERI_CRG66.BIT.clk_1m_ini_cksel = select; +} + +/** + * @brief Get 1M clock selection + * @param clk Clock register base address + * @retval Core clock selection + */ +static inline unsigned int DCL_CRG_Get1MClkSel(const CRG_RegStruct *clk) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + return clk->PERI_CRG66.BIT.clk_1m_ini_cksel; +} + +/** + * @brief Set 1M clock division ratio + * @param clk Clock register base address + * @param div Division ratio + * @retval None + */ +static inline void DCL_CRG_Set1MClkDiv(CRG_RegStruct *clk, unsigned int div) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + CRG_PARAM_CHECK_NO_RET(div <= CRG_1MHZ_CLK_MAX_DIV); + clk->PERI_CRG67.BIT.clk_1m_div = div; +} + +/** + * @brief Enable test clock function + * @param clk Clock register base address + * @retval None + */ +static inline void DCL_CRG_TestClkEnable(CRG_RegStruct *clk) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + clk->PERI_CRG639.BIT.test_clk_en = BASE_CFG_ENABLE; /* Enable the test clock. */ +} + +/** + * @brief Disable test clock function + * @param clk Clock register base address + * @retval None + */ +static inline void DCL_CRG_TestClkDisable(CRG_RegStruct *clk) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + clk->PERI_CRG639.BIT.test_clk_en = BASE_CFG_DISABLE; /* Disable the test clock. */ +} + +/** + * @brief CRG test clock select. + * @param clk Clock register base address + * @param clkSel Clock select. + * @retval None + */ +static inline void DCL_CRG_TestClkSel(CRG_RegStruct *clk, CRG_TestClkSel clkSel) +{ + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + CRG_PARAM_CHECK_NO_RET(clkSel >= CRG_TEST_CLK_PLL_PFD); + CRG_PARAM_CHECK_NO_RET(clkSel <= CRG_TEST_CLK_HOSC_DIV); + clk->PERI_CRG639.BIT.test_clk_sel = clkSel; /* Set the test clock select. */ +} +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_CRG_IP_H */ diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/crg/src/crg.c b/vendor/others/demo/5-tim_adc/demo/drivers/crg/src/crg.c new file mode 100644 index 000000000..9dd7c7af8 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/crg/src/crg.c @@ -0,0 +1,1130 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file crg.c + * @author MCU Driver Team + * @brief CRG module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the CRG. + * + Initialization and de-initialization functions + * + Config the register of CRG + * + Config the register of IP,such as Uart,Timer and so on + */ + +/* Includes ------------------------------------------------------------------*/ +#include "crg.h" +/* Macro definitions ---------------------------------------------------------*/ +#define CRG_HOSC_CTRL2_ADDR 0x10000F04 +/* Private Function -----------------------------------------------------------*/ +static unsigned int CRG_GetPllRefIni(CRG_PllRefClkSelect pllRefClkSelect); +static unsigned int CRG_GetPreDivValue(CRG_PllPreDiv pllPredDiv); +static unsigned int CRG_GetPllFbDivValue(unsigned int pllFbDiv); +static unsigned int CRG_GetPllPostDivValue(unsigned int pllPostDiv); +static inline unsigned int CRG_GetVcoFreq(void); +static BASE_StatusType CRG_IsValidPllConfig(const CRG_Handle *handle); +static void CRG_GetPllOptConfig(unsigned int targetFreq, unsigned int pllRefFreq, CRG_PllDivCfg *div); +static BASE_StatusType CRG_IsValid1MHzConfig(const CRG_Handle *handle); + +static void CRG_IpWoClkSelEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable); +static void CRG_IpWoClkSelResetSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int reset); +static unsigned int CRG_IpWoClkSelEnableGet(const CHIP_CrgIpMatchInfo *matchInfo); +static unsigned int CRG_IpWoClkSelResetGet(const CHIP_CrgIpMatchInfo *matchInfo); + +static void CRG_AdcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable); +static void CRG_AdcDivSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int div); +static void CRG_AdcClkSelectSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int clkSelect); +static unsigned int CRG_AdcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo); +static unsigned int CRG_AdcClkSelectGet(const CHIP_CrgIpMatchInfo *matchInfo); +static unsigned int CRG_AdcDivGet(const CHIP_CrgIpMatchInfo *matchInfo); + +static void CRG_EfcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable); +static unsigned int CRG_EfcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo); +static void CRG_AnaEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable); +static unsigned int CRG_AnaEnableGet(const CHIP_CrgIpMatchInfo *matchInfo); + +#ifndef FPGA +static unsigned int CRG_GetAdcIpFreq(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int baseClkRate, + unsigned int coreClkFreq); +#endif + +typedef CHIP_CrgIpMatchInfo *(*FindFunc)(const void *baseAddress); +typedef void (*SetFunc)(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int value); +typedef unsigned int (*GetFunc)(const CHIP_CrgIpMatchInfo *matchInfo); + +typedef struct { + CHIP_CrgIpType type; + SetFunc resetSet; + SetFunc enableSet; + SetFunc clkSelSet; + SetFunc clkDivSet; + GetFunc resetGet; + GetFunc enableGet; + GetFunc clkSelGet; + GetFunc clkDivGet; +} CRG_IpProc; + +static CRG_IpProc g_ipClkProc[CRG_IP_MAX_TYPE] = { + {CRG_IP_NONE_CLK_SEL, + CRG_IpWoClkSelResetSet, CRG_IpWoClkSelEnableSet, NULL, NULL, + CRG_IpWoClkSelResetGet, CRG_IpWoClkSelEnableGet, NULL, NULL}, + {CRG_IP_CAN, + CRG_IpWoClkSelResetSet, CRG_IpWoClkSelEnableSet, NULL, NULL, + CRG_IpWoClkSelResetGet, CRG_IpWoClkSelEnableGet, NULL, NULL}, + {CRG_IP_ADC, + NULL, CRG_AdcEnableSet, CRG_AdcClkSelectSet, CRG_AdcDivSet, + NULL, CRG_AdcEnableGet, CRG_AdcClkSelectGet, CRG_AdcDivGet}, + {CRG_IP_EFC, + NULL, CRG_EfcEnableSet, NULL, NULL, + NULL, CRG_EfcEnableGet, NULL, NULL}, + {CRG_IP_IWDG, + CRG_IpWoClkSelResetSet, CRG_IpWoClkSelEnableSet, NULL, NULL, + CRG_IpWoClkSelResetGet, CRG_IpWoClkSelEnableGet, NULL, NULL}, + {CRG_IP_ANA, + CRG_IpWoClkSelResetSet, CRG_AnaEnableSet, NULL, NULL, + CRG_IpWoClkSelResetGet, CRG_AnaEnableGet, NULL, NULL} +}; + +static CRG_RegStruct *g_crgBaseAddr; +static unsigned char g_anaEnableFlag = 0; + +/* Public Function -----------------------------------------------------------*/ +/** + * @brief Clock Init + * @param handle CRG Handle + * @retval BASE_STATUS_ERROR Parameter Check fail + * @retval BASE_STATUS_OK Success + */ +BASE_StatusType HAL_CRG_Init(const CRG_Handle *handle) +{ + CRG_ASSERT_PARAM(handle != NULL); + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + /* Check the validity of PLL-related parameters. */ + CRG_PARAM_CHECK_WITH_RET(IsCrgPllRefClkSelect(handle->pllRefClkSelect), BASE_STATUS_ERROR); + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPreDiv(handle->pllPreDiv), BASE_STATUS_ERROR); + CRG_PARAM_CHECK_WITH_RET(IsCrgPllFbDiv(handle->pllFbDiv), BASE_STATUS_ERROR); + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv(handle->pllPostDiv), BASE_STATUS_ERROR); + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv2(handle->handleEx.pllPostDiv2), BASE_STATUS_ERROR); + /* Check the Clock Source and Frequency Divider of the 1 MHz Clock. */ + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkSel(handle->handleEx.clk1MSelect), BASE_STATUS_ERROR); + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkDiv(handle->handleEx.clk1MDiv), BASE_STATUS_ERROR); + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + + *(unsigned int *)CRG_HOSC_CTRL2_ADDR = 0x306E; /* Optimized HOSC temperature drift performance parameter. */ + + CRG_RegStruct *reg = handle->baseAddress; + g_crgBaseAddr = (void *)reg; + /* Check the validity of the PLL parameter configuration. */ + if (CRG_IsValidPllConfig(handle) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + /* Disable the write protection function of the CRG register. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + + reg->PERI_CRG0.BIT.pll_ref_cksel = handle->pllRefClkSelect; + reg->PERI_CRG1.BIT.pll_prediv = handle->pllPreDiv; + reg->PERI_CRG2.BIT.pll_fbdiv = handle->pllFbDiv; + reg->PERI_CRG3.BIT.pll_postdiv1 = handle->pllPostDiv; + reg->PERI_CRG3.BIT.pll_postdiv2 = handle->handleEx.pllPostDiv2; + reg->PERI_CRG4.BIT.pll_pd = BASE_CFG_UNSET; + + while (reg->PERI_CRG7.BIT.pll_lock != BASE_CFG_SET) { + ; /* Wait for PLL to lock */ + } + + DCL_SYSCTRL_CrgWriteProtectionEnable(); + /* Check the 1MHz clock parameter configuration. */ + if (CRG_IsValid1MHzConfig(handle) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + while (reg->HOSC_LOCK.BIT.hosc_lock != BASE_CFG_SET) { + ; /* Wait for HOSC to lock */ + } + /* Set the Clock Source and Frequency Divider of the 1 MHz Clock. */ + reg->PERI_CRG67.BIT.clk_1m_div = handle->handleEx.clk1MDiv; + reg->PERI_CRG66.BIT.clk_1m_ini_cksel = handle->handleEx.clk1MSelect; + return BASE_STATUS_OK; +} + +/** + * @brief Set Crg Core clock by target frequecy + * @param handle CRG handle + * @param targetFreq Target Frequency, unit: Hz. + * @retval BASE_STATUS_ERROR Parameter Check fail + * @retval BASE_STATUS_OK Success + */ +BASE_StatusType HAL_CRG_InitWithTargetFrequence(const CRG_Handle *handle, unsigned int targetFreq) +{ + CRG_ASSERT_PARAM(handle != NULL); + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + CRG_PARAM_CHECK_WITH_RET(IsCrgPllRefClkSelect(handle->pllRefClkSelect), BASE_STATUS_ERROR); + CRG_PARAM_CHECK_WITH_RET((targetFreq <= CRG_CLK_TARGET_MAX_FREQ), BASE_STATUS_ERROR); + + CRG_Handle crgHandle; + CRG_PllDivCfg divCfg; + unsigned int pllRefFreq; + unsigned int fbFreq; + unsigned int temp; + /* Check the validity of the external crystal oscillator frequency. */ + if ((handle->pllRefClkSelect == CRG_PLL_REF_CLK_SELECT_XTAL) && \ + (XTRAIL_FREQ > 30000000U)) { /* The maximum of the external clock source is 30000000U. */ + return BASE_STATUS_ERROR; + } + /* Obtain the clock frequency based on the clock source. */ + pllRefFreq = (handle->pllRefClkSelect == CRG_PLL_REF_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + CRG_GetPllOptConfig(targetFreq, pllRefFreq, &divCfg); + crgHandle = *handle; + crgHandle.pllPreDiv = divCfg.PreDiv; + crgHandle.pllFbDiv = divCfg.fbDiv; + crgHandle.pllPostDiv = divCfg.postDiv; + /* Calculate the posdiv2 frequency divider. */ + fbFreq = (pllRefFreq / (divCfg.PreDiv + 1)) * (divCfg.fbDiv + 1); + for (unsigned int i = CRG_PLL_POSTDIV2_1; i <= CRG_PLL_POSTDIV2_8_MAX; i++) { + temp = fbFreq / (i + 1); + if (temp <= CRG_CLK_PST2_MAX_FREQ) { /* The maximum value is used when the configuration is valid. */ + crgHandle.handleEx.pllPostDiv2 = i; + break; + } + if (i == CRG_PLL_POSTDIV2_8_MAX) { /* No valid value. */ + return BASE_STATUS_ERROR; + } + } + return HAL_CRG_Init(&crgHandle); +} + +/** + * @brief Clock Deinit + * @param handle CRG Handle + * @retval BASE_STATUS_OK + */ +BASE_StatusType HAL_CRG_DeInit(const CRG_Handle *handle) +{ + CRG_ASSERT_PARAM(handle != NULL); + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + CRG_RegStruct *reg = handle->baseAddress; + DCL_SYSCTRL_CrgWriteProtectionDisable(); + + reg->PERI_CRG0.BIT.pll_ref_cksel = 0x0; /* 0x0: default value */ + reg->PERI_CRG1.BIT.pll_prediv = 0x3; /* 0x3: default value */ + reg->PERI_CRG2.BIT.pll_fbdiv = 0x30; /* 0x30: default value */ + reg->PERI_CRG3.BIT.pll_postdiv1 = 0x1; /* 0x0: default value */ + reg->PERI_CRG4.BIT.pll_pd = 0x1; /* 0x1: default value */ + + DCL_SYSCTRL_CrgWriteProtectionEnable(); + + reg->PERI_CRG67.BIT.clk_1m_div = 0x29; /* 0x29: default value */ + reg->PERI_CRG66.BIT.clk_1m_ini_cksel = 0x0; /* 0x0: default value */ + return BASE_STATUS_OK; +} + +/** + * @brief Get Clock Config + * @param handle CRG Handle + * @retval BASE_STATUS_OK Success + */ +BASE_StatusType HAL_CRG_GetConfig(CRG_Handle *handle) +{ + CRG_ASSERT_PARAM(handle != NULL); + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + /* Obtains configuration parameters from registers. */ + CRG_RegStruct *reg = handle->baseAddress; + handle->pllRefClkSelect = reg->PERI_CRG0.BIT.pll_ref_cksel; + handle->pllPreDiv = reg->PERI_CRG1.BIT.pll_prediv; + handle->pllFbDiv = reg->PERI_CRG2.BIT.pll_fbdiv; + handle->pllPostDiv = reg->PERI_CRG3.BIT.pll_postdiv1; + handle->handleEx.pllPostDiv2 = reg->PERI_CRG3.BIT.pll_postdiv2; + /* Enable the PLL and start the PLL output clock frequency. */ + handle->pllPd = reg->PERI_CRG4.BIT.pll_pd; + handle->coreClkSelect = reg->PERI_CRG64.BIT.clk_pst1_sw_sel; + /* Get the 1MHz clock select and frequency division. */ + handle->handleEx.clk1MDiv = reg->PERI_CRG67.BIT.clk_1m_div; + handle->handleEx.clk1MSelect = reg->PERI_CRG66.BIT.clk_1m_ini_cksel; + return BASE_STATUS_OK; +} + +/** + * @brief Set CRG Core Clock Select + * @param handle CRG Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Paramter check fail + */ +BASE_StatusType HAL_CRG_SetCoreClockSelect(CRG_Handle *handle) +{ + CRG_ASSERT_PARAM(handle != 0); + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + + CRG_RegStruct *reg = handle->baseAddress; + /* The write protection of the CRG register needs to be disabled. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + DCL_CRG_SetCoreClkSel(reg, handle->coreClkSelect); + DCL_SYSCTRL_CrgWriteProtectionEnable(); + + return BASE_STATUS_OK; +} + +/** + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +static inline unsigned int CRG_GetVcoFreq(void) +{ + unsigned int freq; + unsigned int regFbdiv; + CRG_RegStruct *crg = g_crgBaseAddr; + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + CRG_ASSERT_PARAM((XTRAIL_FREQ <= 30000000U)); /* The maximum of the external clock source is 30000000U. */ + + freq = CRG_GetPllRefIni(crg->PERI_CRG0.BIT.pll_ref_cksel); + freq /= CRG_GetPreDivValue(crg->PERI_CRG1.BIT.pll_prediv); + regFbdiv = CRG_GetPllFbDivValue(crg->PERI_CRG2.BIT.pll_fbdiv); /* Get the value of the fbdiv register. */ + freq *= (regFbdiv >= 0x06) ? regFbdiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + return freq; +} + +/** + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +unsigned int HAL_CRG_GetPllFreq(void) +{ + unsigned int freq; + unsigned int pllPostDivValue; + CRG_RegStruct *crg = g_crgBaseAddr; + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + freq = CRG_GetVcoFreq(); + pllPostDivValue = CRG_GetPllPostDivValue((CRG_PllPostDiv)crg->PERI_CRG3.BIT.pll_postdiv1); + /* Calculate the PLL output clock frequency based on the VCO clock frequency and post-division coefficient. */ + if (pllPostDivValue != 0) { + freq /= pllPostDivValue; + } + return freq; +} + +/** + * @brief Get Core Clock Frequence + * @param None + * @retval unsigned int Core clock frequency + */ +unsigned int HAL_CRG_GetCoreClkFreq(void) +{ + unsigned int freq; + unsigned int coreClkSelect; + CRG_RegStruct *crg = g_crgBaseAddr; + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + coreClkSelect = crg->PERI_CRG64.BIT.clk_pst1_sw_sel; + switch (coreClkSelect) { + case CRG_CORE_CLK_SELECT_HOSC: /* The clock source is an internal high-speed clock. */ + freq = HOSC_FREQ; + break; + + case CRG_CORE_CLK_SELECT_TCXO: /* The clock source is the external crystal oscillator clock. */ + freq = XTRAIL_FREQ; + break; + + case CRG_CORE_CLK_SELECT_PLL: /* The clock source is the PLL. */ + freq = HAL_CRG_GetPllFreq(); + break; + + default: + freq = LOSC_FREQ; + break; + } + return freq; +} + +/** + * @brief Get Clock Frequence + * @param handle CRG Handle + * @retval Frequece of IP + */ +unsigned int HAL_CRG_GetIpFreq(const void *baseAddress) +{ + CRG_ASSERT_PARAM(baseAddress != NULL); + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); +#ifdef FPGA + /* Use this function to obtain the clock frequency during the FPGA phase. */ + return CHIP_GetIpFreqHz(baseAddress); +#else + unsigned int hclk = HAL_CRG_GetCoreClkFreq(); + unsigned int freq = LOSC_FREQ; + unsigned int coreClkFreq; + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + if (p == NULL) { + return freq; + } + switch (p->type) { + case CRG_IP_NONE_CLK_SEL: + case CRG_IP_EFC: + case CRG_IP_ANA: + freq = hclk; /* Returns the internal high speed clock frequency. */ + break; + + case CRG_IP_CAN: + freq = CRG_GetPllRefIni(g_crgBaseAddr->PERI_CRG0.BIT.pll_ref_cksel); + break; + + case CRG_IP_ADC: + /* Get core clock frequence for calculating the ADC clock frequency. */ + coreClkFreq = HAL_CRG_GetCoreClkFreq(); + freq = CRG_GetAdcIpFreq(p, CRG_GetVcoFreq(), coreClkFreq); + break; + + case CRG_IP_IWDG: /* The IWDG clock frequency is an internal low-speed clock. */ + default: + break; + } + if (freq == 0) { + freq = LOSC_FREQ; + } + return freq; +#endif +} + +/** + * @brief Enable clock of ip + * @param baseAddress Ip base address + * @param enable enable mask + * @retval BASE_STATUS_ERROR Can't find the Match or operation is not support + * @retval BASE_STATUS_OK Operation Success + */ +BASE_StatusType HAL_CRG_IpEnableSet(const void *baseAddress, unsigned int enable) +{ + CRG_ASSERT_PARAM(baseAddress != NULL); + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + /* Check the validity of the input parameters. */ + CRG_PARAM_CHECK_WITH_RET((enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE), BASE_STATUS_ERROR); + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + return BASE_STATUS_ERROR; + } + if (g_ipClkProc[p->type].enableSet == NULL) { + return BASE_STATUS_ERROR; + } + g_ipClkProc[p->type].enableSet(p, enable); + return BASE_STATUS_OK; +} + +/** + * @brief Get clock enable status of ip + * @param baseAddress Ip base address + * @param enable parameter out for ip enable status + * @retval BASE_STATUS_ERROR Can't find the Match or operation is not support + * @retval BASE_STATUS_OK Operation Success + */ +BASE_StatusType HAL_CRG_IpEnableGet(const void *baseAddress, unsigned int *enable) +{ + CRG_ASSERT_PARAM(baseAddress != NULL); + CRG_ASSERT_PARAM(enable != NULL); + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + if ((p == NULL) || (p->type < 0) || (p->type >= CRG_IP_MAX_TYPE)) { + return BASE_STATUS_ERROR; + } + if (g_ipClkProc[p->type].enableGet == NULL) { + return BASE_STATUS_ERROR; + } + *enable = g_ipClkProc[p->type].enableGet(p); /* Returns the module clock enable status. */ + return BASE_STATUS_OK; +} + +/** + * @brief Set clock select ip + * @param baseAddress Ip base address + * @param select clock select, @see CRG_APBLsClkSelect for ip in apb_ls_subsys or CRG_AdcClkSelect for adc + * @retval BASE_STATUS_OK success + * @retval BASE_STATUS_ERROR fail + */ +BASE_StatusType HAL_CRG_IpClkSelectSet(const void *baseAddress, unsigned int select) +{ + CRG_ASSERT_PARAM(baseAddress != NULL); + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + return BASE_STATUS_ERROR; + } + if (g_ipClkProc[p->type].clkSelSet == NULL) { + return BASE_STATUS_ERROR; + } + g_ipClkProc[p->type].clkSelSet(p, select); /* Clock selection of the configuration module. */ + return BASE_STATUS_OK; +} + +/** + * @brief Get clock select of ip + * @param baseAddress Ip base address + * @param clkSel Get clkSet value + * @retval BASE_STATUS_OK + * @retval BASE_STATUS_ERROR Match Fail or Not support + */ +BASE_StatusType HAL_CRG_IpClkSelectGet(const void *baseAddress, unsigned int *clkSel) +{ + CRG_ASSERT_PARAM(baseAddress != NULL); + CRG_ASSERT_PARAM(clkSel != NULL); + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + return BASE_STATUS_ERROR; + } + if (g_ipClkProc[p->type].clkSelGet == NULL) { + return BASE_STATUS_ERROR; + } + *clkSel = g_ipClkProc[p->type].clkSelGet(p); /* Obtains the module clock selection. */ + return BASE_STATUS_OK; +} + +/** + * @brief Reset/Set clock of ip + * @param baseAddress Ip base address + * @param reset Set reset value + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Match Fail or Not support + */ +BASE_StatusType HAL_CRG_IpClkResetSet(const void *baseAddress, unsigned int reset) +{ + CRG_ASSERT_PARAM(baseAddress != NULL); + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + CRG_PARAM_CHECK_WITH_RET((reset == BASE_CFG_SET || reset == BASE_CFG_UNSET), BASE_STATUS_ERROR); + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + return BASE_STATUS_ERROR; + } + if (g_ipClkProc[p->type].resetSet == NULL) { + return BASE_STATUS_ERROR; + } + g_ipClkProc[p->type].resetSet(p, reset); /* Configure the reset value of the module clock. */ + return BASE_STATUS_OK; +} + +/** + * @brief Get clock select of ip + * @param baseAddress Ip base address + * @param reset Get reset value + * @retval BASE_STATUS_OK Success + * @retval BASE_CFG_UNSET Match Fail or Not support + */ +BASE_StatusType HAL_CRG_IpClkResetGet(const void *baseAddress, unsigned int *reset) +{ + CRG_ASSERT_PARAM(baseAddress != NULL); + CRG_ASSERT_PARAM(reset != NULL); + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + return BASE_STATUS_ERROR; + } + if (g_ipClkProc[p->type].resetGet == NULL) { + return BASE_STATUS_ERROR; + } + *reset = g_ipClkProc[p->type].resetGet(p); /* Query the reset status of the module clock. */ + return BASE_STATUS_OK; +} + +/** + * @brief Reset/Set clock of ip + * @param baseAddress Ip base address + * @param div set div value + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Match Fail or Not support + */ +BASE_StatusType HAL_CRG_IpClkDivSet(const void *baseAddress, unsigned int div) +{ + CRG_ASSERT_PARAM(baseAddress != NULL); + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + return BASE_STATUS_ERROR; + } + if (g_ipClkProc[p->type].clkDivSet == NULL) { + return BASE_STATUS_ERROR; + } + g_ipClkProc[p->type].clkDivSet(p, div); /* Configure the clock frequency divider of the module. */ + return BASE_STATUS_OK; +} + +/** + * @brief Get clock select of ip + * @param baseAddress Ip base address + * @param div get div value + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Match Fail or Not support + */ +BASE_StatusType HAL_CRG_IpClkDivGet(const void *baseAddress, unsigned int *div) +{ + CRG_ASSERT_PARAM(baseAddress != NULL); + CRG_ASSERT_PARAM(div != NULL); + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + return BASE_STATUS_ERROR; + } + if (g_ipClkProc[p->type].clkDivGet == NULL) { + return BASE_STATUS_ERROR; + } + *div = g_ipClkProc[p->type].clkDivGet(p); /* Get the clock frequency division coefficient of a module. */ + return BASE_STATUS_OK; +} + +/** + * @brief PVD reset function enable switch + * @param pvd reset enable select + * @retval None + */ +void HAL_CRG_PvdResetEnable(bool enable) +{ + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + g_crgBaseAddr->PERI_CRG65.BIT.pvd_rst_enable = enable; +} + +/** + * @brief Based on the target frequency, obtain the post division of the pll + * @param targetFreq Target frequency + * @param clkPfdFreq The freq of Pll after frequency multiplication + * @param divCfg Output Pll division config + * @retval None + */ +static void CRG_GetPllTargetFreqPostDiv(unsigned int targetFreq, unsigned int preDiv, unsigned int fbDiv, + unsigned int clkPfdFreq, CRG_PllDivCfg *divCfg) +{ + unsigned int clkVcoFreq; + unsigned int freq; + unsigned int delta; + unsigned int minDelta = 0xFFFFFFFF; /* Set the maximum value and initialize the default value. */ + unsigned int postDiv; + + clkVcoFreq = clkPfdFreq * fbDiv; + for (unsigned int i = CRG_PLL_POSTDIV_1; i <= CRG_PLL_POSTDIV_8; i++) { + postDiv = i; + /* Check whether the frequency after frequency division is valid. */ + if (!IsCrgValidPostDiv(clkVcoFreq, postDiv)) { + continue; + } + freq = clkVcoFreq / (postDiv + 1); + delta = (targetFreq >= freq) ? targetFreq - freq : freq - targetFreq; + if (delta < minDelta) { /* Updating Configuration Parameter Values. */ + minDelta = delta; + divCfg->PreDiv = preDiv; + divCfg->fbDiv = fbDiv; + divCfg->postDiv = i; + } + } +} + +/** + * @brief Based on the target frequency, obtain the optimal frequency division coefficient of the pll + * @param targetFreq Target frequency + * @param pllRefFreq Pll refer clock frequency + * @param divCfg Output Pll division config + * @retval None + */ +static void CRG_GetPllOptConfig(unsigned int targetFreq, unsigned int pllRefFreq, CRG_PllDivCfg *divCfg) +{ + unsigned int preDiv[] = {CRG_PLL_PREDIV_1, CRG_PLL_PREDIV_2, CRG_PLL_PREDIV_3, CRG_PLL_PREDIV_4, CRG_PLL_PREDIV_5, + CRG_PLL_PREDIV_6, CRG_PLL_PREDIV_7, CRG_PLL_PREDIV_8}; + unsigned int preDivOut; + unsigned int clkPfdFreq; + /* Configuring PLL Parameter Initialization. */ + divCfg->PreDiv = CRG_PLL_PREDIV_1; + divCfg->fbDiv = CRG_PLL_FBDIV_MIN; + divCfg->postDiv = CRG_PLL_POSTDIV_1; + + for (unsigned int i = 0; i < sizeof(preDiv) / sizeof(preDiv[0]); ++i) { + preDivOut = CRG_GetPreDivValue(preDiv[i]); + /* Check whether the frequency value after pre-division is valid. */ + if (!IsCrgValidPreDiv(pllRefFreq, preDivOut)) { + continue; + } + clkPfdFreq = pllRefFreq / preDivOut; + + for (unsigned int j = CRG_PLL_FBDIV_MIN; j <= CRG_PLL_FBDIV_MAX; ++j) { + /* Check whether the frequency value after frequency multiplication is valid. */ + if (!IsCrgValidFdDiv(clkPfdFreq, j)) { + continue; + } + /* Get the post division of the pll. */ + CRG_GetPllTargetFreqPostDiv(targetFreq, preDiv[i], j, clkPfdFreq, divCfg); + } + } +} + +#ifndef FPGA +/** + * @brief Get ADC Clock Frequence + * @param matchInfo match info + * @param baseClkRate clock rate + * @param coreClkFreq core clock rate + * @retval Ip Frequence + */ +static unsigned int CRG_GetAdcIpFreq(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int baseClkRate, + unsigned int coreClkFreq) +{ + CRG_ASSERT_PARAM(matchInfo != NULL); + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + + unsigned int clkSel; + unsigned int clkDiv; + unsigned int pst2Div; + unsigned int freq = 0; + + /* Obtains the clock source selection of the ADC. */ + const CRG_IpProc *proc = &g_ipClkProc[matchInfo->type]; + if (proc->clkSelGet == NULL) { + return 0; + } + clkSel = proc->clkSelGet(matchInfo); + /* Calculate the frequency from the ADC's clock source. */ + if (clkSel == CRG_ADC_CLK_SYN_CORE) { + freq = coreClkFreq; + } else if (clkSel == CRG_ADC_CLK_ASYN_HOSC) { + freq = HOSC_FREQ; + } else if (clkSel == CRG_ADC_CLK_ASYN_TCXO) { + /* The maximum speed of the external clock source is 30000000U. */ + freq = (XTRAIL_FREQ > 30000000U) ? 0 : XTRAIL_FREQ; + } else if (clkSel == CRG_ADC_CLK_ASYN_PLL_DIV) { + pst2Div = CRG_GetPllPostDivValue((CRG_PllPostDiv)g_crgBaseAddr->PERI_CRG3.BIT.pll_postdiv2); + freq = baseClkRate / pst2Div; + } + + /* Obtain the frequency divider based on the ADC clock source. */ + if (proc->clkDivGet == NULL) { + return 0; + } + clkDiv = proc->clkDivGet(matchInfo); + /* Calculate the clock frequency of the ADC. */ + return (freq / (clkDiv + 1)); +} + +#endif +/** + * @brief Check is Valid Pll Config + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValidPllConfig(const CRG_Handle *handle) +{ + unsigned int preDiv; + unsigned int freq; + + freq = CRG_GetPllRefIni(handle->pllRefClkSelect); + preDiv = CRG_GetPreDivValue(handle->pllPreDiv); + /* Check the validity of the prescaled clock frequency. */ + if (!IsCrgValidPreDiv(freq, preDiv)) { + return BASE_STATUS_ERROR; + } + freq /= preDiv; + /* Check the validity of the clock frequency after frequency multiplication. */ + if (!IsCrgValidFdDiv(freq, handle->pllFbDiv)) { + return BASE_STATUS_ERROR; + } + freq *= (handle->pllFbDiv > 0x06) ? handle->pllFbDiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + /* Check whether the PLL output frequency is valid. */ + if (IsCrgValidPostDiv(freq, handle->pllPostDiv) && IsCrgValidPostDiv2(freq, handle->handleEx.pllPostDiv2)) { + return BASE_STATUS_OK; + } + return BASE_STATUS_ERROR; +} + +/** + * @brief Check is Valid 1MHz Config + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValid1MHzConfig(const CRG_Handle *handle) +{ + unsigned int freq; + /* Get the ref frequency of the 1 MHz clock. */ + freq = (handle->handleEx.clk1MSelect == CRG_1M_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + /* Check whether the 1MHz output frequency is valid. */ + if ((freq / (handle->handleEx.clk1MDiv + 1)) == CRG_FREQ_1MHz) { + return BASE_STATUS_OK; + } + return BASE_STATUS_ERROR; +} + +/** + * @brief Get clock frequence + * @param crg CRG_RegStruct + * @retval The frequence fo clock + */ +static inline unsigned int CRG_GetPllRefIni(CRG_PllRefClkSelect pllRefClkSelect) +{ + /* The maximum speed of the external clock source is 30000000U. */ + if (pllRefClkSelect == CRG_PLL_REF_CLK_SELECT_XTAL && XTRAIL_FREQ > 30000000U) { + return 0; + } + return (pllRefClkSelect == (unsigned int)CRG_PLL_REF_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; +} + +/** + * @brief Get previous division Value before PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPreDivValue(CRG_PllPreDiv pllPredDiv) +{ + unsigned int preDiv; + if (pllPredDiv <= CRG_PLL_PREDIV_1) { /* 0 or 1 returns PLL_PREDIV_OUT_1. */ + preDiv = PLL_PREDIV_OUT_1; + } else { + preDiv = pllPredDiv + 1; + } + return preDiv; +} + +/** + * @brief Get PLL loop divider ratio + * @param crg CRG_RegStruct + * @retval PLL loop divider ratio + */ +static inline unsigned int CRG_GetPllFbDivValue(unsigned int pllFbDiv) +{ + unsigned int div = pllFbDiv; + /* Check the validity of the minimum frequency multiplication parameter. */ + if (div < CRG_PLL_FBDIV_MIN) { + div = CRG_PLL_FBDIV_MIN; + } + /* Check the validity of the maximum frequency multiplication parameter. */ + if (div > CRG_PLL_FBDIV_MAX) { + div = CRG_PLL_FBDIV_MAX; + } + return div; +} + +/** + * @brief Get post division Value after PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPllPostDivValue(unsigned int pllPostDiv) +{ + unsigned int div = pllPostDiv; + if (div > CRG_PLL_POSTDIV_8) { + div = (CRG_PLL_POSTDIV_8 + 1); /* If the postdiv is greater than 8, set this postdiv to 8. */ + } else { + div += 1; + } + return div; +} + +/** + * @brief Enable Set of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @param enable BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + CRG_ASSERT_PARAM(matchInfo != NULL); + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + if (enable & IP_CLK_ENABLE) { /* Set enable of target ip. */ + cfg.BIT.clkEnMask |= 1 << matchInfo->bitOffset; + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); + } else { + cfg.BIT.clkEnMask &= ~(1 << matchInfo->bitOffset); /* Disable of target ip. */ + cfg.BIT.softResetReq |= (1 << matchInfo->bitOffset); + } + p->value = cfg.value; +} + +/** + * @brief Get Enable status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock Enable status + */ +static unsigned int CRG_IpWoClkSelEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + CRG_ASSERT_PARAM(matchInfo != NULL); + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + /* Get enable status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + CRG_IpWoClkSelectCfg cfg; + + cfg.value = p->value; + return (cfg.BIT.clkEnMask & (1 << matchInfo->bitOffset)) == 0 ? false : true; +} + +/** + * @brief Reset/undo reset of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @param reset BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelResetSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int reset) +{ + CRG_ASSERT_PARAM(matchInfo != NULL); + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + if (reset & BASE_CFG_SET) { + cfg.BIT.softResetReq |= 1 << matchInfo->bitOffset; /* reset of target ip. */ + } else { + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); /* Undo reset of target ip. */ + } + p->value = cfg.value; +} + +/** + * @brief Get Reset status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock select reset status + */ +static unsigned int CRG_IpWoClkSelResetGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + CRG_ASSERT_PARAM(matchInfo != NULL); + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + /* Get the reset status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + return (cfg.BIT.softResetReq & (1 << matchInfo->bitOffset)) ? BASE_CFG_SET : BASE_CFG_UNSET; +} + +/** + * @brief Enable/Disable ADC Clock + * @param matchInfo ADC match info + * @param enable IP_CLK_ENABLE + * @retval None + */ +static void CRG_AdcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + CRG_ASSERT_PARAM(matchInfo != NULL); + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + CRG_AdcIpCfg cfg; + cfg.value[1] = p->value[1]; + if (enable) { /* Enables and Deassert reset the ADC clock. */ + cfg.BIT.clk_adc_cken = BASE_CFG_SET; + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + } else { /* Disable and reset the ADC clock. */ + cfg.BIT.clk_adc_cken = BASE_CFG_UNSET; + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + } + p->value[1] = cfg.value[1]; +} + +/** + * @brief Get Enable status of ADC + * @param matchInfo ADC match info + * @retval Cken of ADC + */ +static unsigned int CRG_AdcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + CRG_ASSERT_PARAM(matchInfo != NULL); + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + unsigned int enable; + /* Get the enable status of the ADC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + enable = ((p->BIT.clk_adc_cken != 0)) ? IP_CLK_ENABLE : IP_CLK_DISABLE; + return enable; +} + +/** + * @brief Set ADC Clock Select + * @param matchInfo ADC match info + * @param clkSelect @see CRG_AdcClkSelect + * @retval None + */ +static void CRG_AdcClkSelectSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int clkSelect) +{ + CRG_ASSERT_PARAM(matchInfo != NULL); + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkModeSelect(clkSelect)); + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + if (clkSelect == CRG_ADC_CLK_SYN_CORE) { + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_SET; /* use sync clock */ + } else { + DCL_SYSCTRL_CrgWriteProtectionDisable(); + g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel = clkSelect; /* write clock selection */ + DCL_SYSCTRL_CrgWriteProtectionEnable(); + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_UNSET; + } +} + +/** + * @brief Get ADC Clock Select + * @param matchInfo ADC match info + * @retval Adc Clock select @see CRG_AdcClkSelect + */ +static unsigned int CRG_AdcClkSelectGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + CRG_ASSERT_PARAM(matchInfo != NULL); + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + if (p->BIT.cfg_adc_ckmode_sel == BASE_CFG_SET) { + return CRG_ADC_CLK_SYN_CORE; /* Synchronous clock signal */ + } + return g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel; /* asynchronous clock signal */ +} + +/** + * @brief Set ADC Div + * @param matchInfo ADC match info + * @param div Adc clock division + * @retval None + */ +static void CRG_AdcDivSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int div) +{ + CRG_ASSERT_PARAM(matchInfo != NULL); + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkDiv(div)); + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + p->BIT.clk_adc_div1 = div; /* write div to I1 */ + } else { + p->BIT.clk_adc_div0 = div; /* write div to I0 */ + } +} + +/** + * @brief Get ADC clock division + * @param matchInfo ADC match info + * @retval Adc clock division + */ +static unsigned int CRG_AdcDivGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + CRG_ASSERT_PARAM(matchInfo != NULL); + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + return p->BIT.clk_adc_div1; /* return div value I1 */ + } + return p->BIT.clk_adc_div0; /* return div valye I0 */ +} + +/** + * @brief Enable Clock of EFC + * @param matchInfo EFC match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_EfcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + CRG_ASSERT_PARAM(matchInfo != NULL); + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + /* Enables or disables EFC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + p->BIT.eflash_cken = (enable & IP_CLK_ENABLE) ? BASE_CFG_SET : BASE_CFG_UNSET; +} + +/** + * @brief Disable Clock of EFC + * @param matchInfo EFC match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_EfcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + CRG_ASSERT_PARAM(matchInfo != NULL); + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + /* Get the value of the EFC register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + return p->BIT.eflash_cken; +} + + +/** + * @brief Enable Clock of ANA + * @param matchInfo ANA match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_AnaEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + CRG_ASSERT_PARAM(matchInfo != NULL); + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + CRG_PARAM_CHECK_NO_RET(enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE); + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + + if ((enable == IP_CLK_ENABLE) && (p->BIT.ip_srst_req == BASE_CFG_SET)) { + p->BIT.ip_srst_req = BASE_CFG_UNSET; + g_anaEnableFlag++; /* count enable analog IP number */ + } else if ((enable == IP_CLK_DISABLE) && (p->BIT.ip_srst_req == BASE_CFG_UNSET)) { + p->BIT.ip_srst_req = BASE_CFG_SET; + if (g_anaEnableFlag > 0) { + g_anaEnableFlag--; /* Decreasing the count to enable the analog IP number. */ + } + } + + if ((g_anaEnableFlag == 0) && (enable == IP_CLK_DISABLE)) { /* all analog clock disable */ + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_UNSET; + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_SET; + } else if ((g_anaEnableFlag > 0) && (enable == IP_CLK_ENABLE)) { /* all analog clock enable */ + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_UNSET; + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_SET; + } +} + +/** + * @brief Get Clock of ANA + * @param matchInfo ANA match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_AnaEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + CRG_ASSERT_PARAM(matchInfo != NULL); + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + /* The clock is enabled based on the IP reset status. */ + return (p->BIT.ip_srst_req) ? BASE_CFG_UNSET : BASE_CFG_SET; +} diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/dac/common/inc/dac.h b/vendor/others/demo/5-tim_adc/demo/drivers/dac/common/inc/dac.h new file mode 100644 index 000000000..4849c0926 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/dac/common/inc/dac.h @@ -0,0 +1,81 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file dac.h + * @author MCU Driver Team. + * @brief DAC module driver. + * This file provides functions declaration of the Comparator. + * + DAC's Initialization and de-initialization functions + * + Set DAC value function + */ +#ifndef McuMagicTag_DAC_H +#define McuMagicTag_DAC_H + +#include "dac_ip.h" + +/** + * @defgroup DAC DAC + * @brief DAC module. + * @{ + */ + +/** + * @defgroup DAC_Common DAC Common + * @brief DAC common external module. + * @{ + */ + +/** + * @defgroup DAC_Handle_Definition DAC Handle Definition + * @{ + */ + +/** + * @brief DAC Handle + */ +typedef struct _DAC_Handle { + DAC_RegStruct *baseAddress; /**< DAC registers base address. */ + volatile unsigned int dacValue; /**< DAC configuration value. */ + + DAC_ExtendHandle handleEx; /* DAC Handle Ex. */ +} DAC_Handle; + +/** + * @} + */ + +/** + * @defgroup DAC_API_Declaration DAC HAL API + * @{ + */ +/* DAC APIs */ +BASE_StatusType HAL_DAC_Init(DAC_Handle *dacHandle); +BASE_StatusType HAL_DAC_DeInit(DAC_Handle *dacHandle); +void HAL_DAC_SetValue(DAC_Handle *dacHandle, unsigned int value); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/dac/inc/dac_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/dac/inc/dac_ip.h new file mode 100644 index 000000000..f51391252 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/dac/inc/dac_ip.h @@ -0,0 +1,180 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file dac_ip.h + * @author MCU Driver Team + * @brief DAC module driver. + * This file provides DCL functions to manage DAC and Definitions of specific parameters. + * + Definition of DAC configuration parameters. + * + DAC register mapping structure. + * + Parameters check functions. + * + Direct configuration layer interface. + */ +#ifndef McuMagicTag_DAC_IP_H +#define McuMagicTag_DAC_IP_H + +#include "baseinc.h" + +#ifdef DAC_PARAM_CHECK +#define DAC_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define DAC_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define DAC_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define DAC_ASSERT_PARAM(para) ((void)0U) +#define DAC_PARAM_CHECK_NO_RET(para) ((void)0U) +#define DAC_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +#define DAC_MAX_OUT_VALUE 0x3FF + +/** + * @addtogroup DAC + * @{ + */ + +/** + * @defgroup DAC_IP DAC_IP + * @brief DAC_IP: dac_v1. + * @{ + */ + +/** + * @defgroup DAC_REG_Definition DAC Register Structure. + * @brief DAC Register Structure Definition. + * @{ + */ + +/** + * @brief Extent handle definition of DAC. + */ +typedef struct { +} DAC_ExtendHandle; + +/** + * @brief Control register 0. + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_dac_enh : 1; /**< DAC Enable. */ + unsigned int reserved_0 : 31; + } BIT; +} volatile DAC_CTRL_REG0; + +/** + * @brief Control register 1. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_dac_vset : 10; /**< DAC voltage level. */ + unsigned int reserved_0 : 22; + } BIT; +} volatile DAC_CTRL_REG1; + +/** + * @brief DAC TRIM register 0. + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_dac_trim : 8; /**< ATE determines configured value, and system reset clears. */ + unsigned int reserved_0 : 24; + } BIT; +} volatile DAC_TRIM_REG0; + +/** + * @brief DAC TRIM register 1. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_dac_k_trim : 11; /**< Value of DAC gain trim. */ + unsigned int reserved_0 : 5; + unsigned int cfg_dac_b_trim : 9; /**< Value of DAC offset trim. */ + unsigned int reserved_1 : 7; + } BIT; +} volatile DAC_TRIM_REG1; + +/** + * @brief DAC registers definition structure. + */ +typedef struct _DAC_RegStruct { + DAC_CTRL_REG0 DAC_CTRL; /**< DAC control register. Offset address: 0x00000000U */ + unsigned char space0[12]; + DAC_CTRL_REG1 DAC_VALUE; /**< DAC voltage level configuration register. Offset address: 0x00000010U */ +} volatile DAC_RegStruct; + +/* Parameter Check -----------------------------------------------------------*/ + +/** + * @brief Verify count value of the DAC sine wave interval. + * @param dacValue Pwm number, only valid if keep equ 0 + * @retval true + * @retval false + */ +static inline bool IsDacConfigureValue(unsigned short dacValue) +{ + return ((dacValue) <= DAC_MAX_OUT_VALUE); +} + +/** + * @brief Enable DAC + * @param dacx: DAC register base address. + * @retval None. + */ +static inline void DCL_DAC_Enable(DAC_RegStruct *dacx) +{ + DAC_ASSERT_PARAM(IsDACInstance(dacx)); + dacx->DAC_CTRL.BIT.da_dac_enh = BASE_CFG_ENABLE; +} + +/** + * @brief Disable DAC + * @param dacx: DAC register base address. + * @retval None. + */ +static inline void DCL_DAC_Disable(DAC_RegStruct *dacx) +{ + DAC_ASSERT_PARAM(IsDACInstance(dacx)); + dacx->DAC_CTRL.BIT.da_dac_enh = BASE_CFG_DISABLE; +} + +/** + * @brief Set DAC value + * @param dacx: DAC register base address. + * @param value: DAC value. + */ +static inline void DCL_DAC_SetValue(DAC_RegStruct *dacx, unsigned int value) +{ + DAC_ASSERT_PARAM(IsDACInstance(dacx)); + DAC_PARAM_CHECK_NO_RET(value <= DAC_MAX_OUT_VALUE); + dacx->DAC_VALUE.BIT.cfg_dac_vset = value; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/dac/src/dac.c b/vendor/others/demo/5-tim_adc/demo/drivers/dac/src/dac.c new file mode 100644 index 000000000..7dbd89f6f --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/dac/src/dac.c @@ -0,0 +1,77 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file dac.c + * @author MCU Driver Team. + * @brief DAC HAL level module driver. + * This file provides firmware functions to manage the following + * functionalities of the DAC and Comparator. + * + DAC's Initialization and de-initialization functions + * + Set DAC value function + */ +#include "dac.h" +#include "assert.h" + +/** + * @brief Set DAC value + * @param dacHandle: DAC handle. + * @param value: DAC value. + * @retval None. + */ +void HAL_DAC_SetValue(DAC_Handle *dacHandle, unsigned int value) +{ + DAC_ASSERT_PARAM(dacHandle != NULL); + DAC_ASSERT_PARAM(IsDACInstance(dacHandle->baseAddress)); + DAC_PARAM_CHECK_NO_RET(value <= DAC_MAX_OUT_VALUE); + /* Change the conversion value of the DAC. */ + dacHandle->baseAddress->DAC_VALUE.BIT.cfg_dac_vset = value; +} + +/** + * @brief DAC HAL Init + * @param dacHandle: DAC handle. + * @retval BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_DAC_Init(DAC_Handle *dacHandle) +{ + /* Repeat config stable time */ + BASE_FUNC_DELAY_US(4); /* delay 4us */ + DAC_ASSERT_PARAM(dacHandle != NULL); + DAC_ASSERT_PARAM(IsDACInstance(dacHandle->baseAddress)); + DAC_PARAM_CHECK_WITH_RET(IsDacConfigureValue(dacHandle->dacValue), BASE_STATUS_ERROR); + /* Conversion value of the DAC. */ + dacHandle->baseAddress->DAC_VALUE.BIT.cfg_dac_vset = dacHandle->dacValue; + /* Turn on the DAC. */ + dacHandle->baseAddress->DAC_CTRL.BIT.da_dac_enh = BASE_CFG_ENABLE; + /* Wait output stable */ + BASE_FUNC_DELAY_US(60); /* delay 60us */ + return BASE_STATUS_OK; +} + +/** + * @brief DAC HAL DeInit + * @param dacHandle: DAC handle. + * @retval BASE_StatusType: OK + */ +BASE_StatusType HAL_DAC_DeInit(DAC_Handle *dacHandle) +{ + DAC_ASSERT_PARAM(dacHandle != NULL); + DAC_ASSERT_PARAM(IsDACInstance(dacHandle->baseAddress)); + dacHandle->baseAddress->DAC_CTRL.reg = BASE_CFG_DISABLE; /* Disable DAC, clears the count value. */ + dacHandle->baseAddress->DAC_VALUE.reg = BASE_CFG_DISABLE; /* Clear DAC value. */ + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/inc/debug.h b/vendor/others/demo/5-tim_adc/demo/drivers/debug/inc/debug.h new file mode 100644 index 000000000..ce2a1aa52 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/inc/debug.h @@ -0,0 +1,90 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file debug.h + * @author MCU Driver Team + * @brief Header file containing functions prototypes of DEBUG module. + * + Initialization and de-initialization functions + * + Format print function + */ + +#ifndef McuMagicTag_DEBUG_H +#define McuMagicTag_DEBUG_H + +#include "uart.h" + +#ifdef DEBUG_PARAM_CHECK +#define DEBUG_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define DEBUG_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define DEBUG_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define DEBUG_ASSERT_PARAM(para) ((void)0U) +#define DEBUG_PARAM_CHECK_NO_RET(para) ((void)0U) +#define DEBUG_PARAM_CHECK_WITH_RET(param, ret) ((void)0U) +#endif + +/** + * @defgroup DEBUG DEBUG + * @brief DEBUG module. + * @{ + */ + + +/** + * @defgroup DEBUG_Common DEBUG Common + * @brief DEBUG common external module. + * @{ + */ + +/* Macro definitions for enabling the function of DEBUG_PRINT submodule */ +#define BAUDRATE 115200 + +#if (DBG_PRINTF_USE == DBG_USE_NO_PRINTF) +static inline int DBG_dummy(const char *format, ...) +{ + BASE_FUNC_UNUSED(format); + return 0; +} /* dummy debug function */ +#define DBG_PRINTF DBG_dummy /* Delete all print statement */ +#endif + +#if (DBG_PRINTF_USE == DBG_USE_UART_PRINTF) +#define DBG_PRINTF DBG_UartPrintf /**< Select the customized printf function */ +#endif + +/** + * @defgroup DEBUG_API_Declaration DEBUG HAL API + * @{ + */ +BASE_StatusType DBG_UartPrintInit(unsigned int baudRate); +BASE_StatusType DBG_UartPrintDeInit(void); + +/* Format print function */ +int DBG_UartPrintf(const char *format, ...); /* Supported format: %c, %s, %d, %u, %x, %X, %p, %f */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_DEBUG_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/cmd.h b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/cmd.h new file mode 100644 index 000000000..ae00b8e9e --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/cmd.h @@ -0,0 +1,89 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file cmd.h + * @author MCU Driver Team + * @brief Header file containing functions prototypes of DEBUG module. + * + Initialization and de-initialization functions + * + Format cmd function + */ +#ifndef CMD_H +#define CMD_H + +#include "module.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +#ifndef CMD_REGESTER_MAX_NUM +#define CMD_REGESTER_MAX_NUM 128 // The maximum length of the command +#endif + +/** + * @addtogroup DEBUG_Log + * @brief DEBUG external module. + * @{ + */ + + /** + * @defgroup CMD_Def CMD_Def + * @brief Command line registration initialization. + * @{ + */ + +/* Defines a function pointer to command registered function */ +typedef int (*pfncmd)(unsigned int argc, const char *argv[]); +/* defines the structure required for registering a function */ +struct cmdRegisterTable { + char *name; + pfncmd func; +}; + +/** + * @brief cmd_regester + * @attention None + * + * @param cmdName [IN] registration name, which is a character string + * @param func [IN] register the function corresponding to the name + * @retval void None + */ +void ExtCmdRegister(char *cmdName, pfncmd func); + +/** + * @brief get regester address + * @attention None + * + * @retval struct cmdRegisterTable * + */ +struct cmdRegisterTable *GetRegisterAddr(void); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ +/** + * @} + */ + +/** + * @} + */ +#endif /* __EXT_DEBUG_H__ */ diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/cmd_common.h b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/cmd_common.h new file mode 100644 index 000000000..909206c80 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/cmd_common.h @@ -0,0 +1,109 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file cmd_common.h + * @author MCU Driver Team + * @brief cmd module driver + * @details The header file contains the following declaration: + * + cmd configuration enums. + * + cmd register structures. + * + cmd DCL Functions. + * + Parameters check functions. + */ +#ifndef CMD_COMMON_H +#define CMD_COMMON_H + +/* Include Header Files */ +#include "type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +/* Macro Definition */ +#define MATCH_CMD_BUF_CNT 8 + +#define ARGS_NUM_MAX 16 +#define CMD_BUF_MAX 128 + +#define CMD_NUM_MAX 5 + +#define DIR_KEY_HEAD (0x1b) +#define DEL ((char)255) +#define DEL7 ((char)127) + +#define CTL_CH(c) ((c) - 'a' + 1) +#define CTL_CH_C 3 /* define the ctl c key */ +#define CTL_CH_P 16 /* define the ctl p key */ +#define CTL_CH_N 14 /* define the ctl n key */ +#define CTL_BACKSPACE ('\b') +#define SPACE_KEY (' ') +#define TAB_KEY 9 /* define the tab key */ +#define ENTER_KEY1 13 /* define the '\r' */ +#define ENTER_KEY2 10 /* define the '\n' */ + +#define APP_CMD_ERR_PRINT(fmt...) EXT_ERR_PRINT(EXT_MODULE_APP_CMD, fmt) + +/** + * @addtogroup DEBUG + * @brief DEBUG module. + * @{ + */ + +/** + * @defgroup DEBUG_Log DEBUG_Log + * @brief DEBUG external module. + * @{ + */ + + /** + * @defgroup CMD_COMMON_Def CMD_COMMON_Def + * @brief Common Command Line Interface. + * @{ + */ +/** + * @} + */ + +/** + * @brief Interprets the string of characters. + * @param cmdStr command string + * @argv At the command line, type a string of cosmonies + * @retval the following is the standard + */ +unsigned int CmdParserParam(char *cmdStr, const char *argv[]); +/** + * @brief Interprets the string of characters. + * @param None + * @retval None + */ +void ExtAppCmdProcess(void); +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ +/** + * @} + */ + +/** + * @} + */ +#endif /* __APP_COMMAND_H__ */ diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/command.h b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/command.h new file mode 100644 index 000000000..4732fafa7 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/command.h @@ -0,0 +1,91 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file command.h + * @author MCU Driver Team + * @brief Header file containing functions prototypes of DEBUG module. + * + Initialization and de-initialization functions + * + Format command function + */ +#ifndef COMMAND_H +#define COMMAND_H + +#include "cmd.h" + +#define UART_SWITCH_CMD "soct_pq_tool" + +#define CMD_SECTION __attribute__((unused, section(".command"))) + +struct CmdTable { + const char *name; /* Command Name */ + int (*pfncmd)(unsigned int argc, const char *argv[]); +}; + +#define CMD_REGESTER(name, cmd) \ + struct CmdTable __cmd_##name CMD_SECTION = { #name, cmd } + +/** + * @addtogroup DEBUG_Log + * @brief DEBUG external module. + * @{ + */ + + /** + * @defgroup COMMAND_Def COMMAND_Def + * @brief Command processing. + * @{ + */ + +/** + * @brief use cmd line to find cmd + * @attention None + * + * @param str [IN] command character string carried in the command line + * @retval struct cmdRegisterTable * + */ +struct cmdRegisterTable *ExtCmdFindCmd(const char *str); + +/** + * @brief use cmd line to match cmd read + * @attention None + * @param head [IN] enter a portion of the complete command you want at the command line + * @param res [out] the string array is used to store all matching strings + * @param len [IN] length of the string array + * @param findCnt [out] Number of matched strings + * @param tailId [out] Record the location of the last search + * @retval unsigned char Whether the matching is complete. + * If the matching is successful, true is returned. If the matching fails, false is returned + */ +unsigned char ExtCmdFindMatchCmd(const char *head, const char *res[], unsigned char resLen, unsigned char *findCnt, + unsigned int *tailId); +#define UESR_CMD_SECTION __attribute__((unused, section(".user_command"))) + +struct UserCmdTable { + unsigned short cmd; /* Command ID */ + int (*pfnUserMCUCmd)(unsigned char len, unsigned char* param); +}; + +#define USRER_CMD_REGESTER(pfn, cmd) \ + struct UserCmdTable __user_cmd_##pfn USER_CMD_SECTION = { cmd, pfn } +/** + * @} + */ + +/** + * @} + */ +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/common.h b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/common.h new file mode 100644 index 000000000..0e13687c5 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/common.h @@ -0,0 +1,90 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file common.h + * @author MCU Driver Team + * @brief Header file containing functions prototypes of cmd module. + * + Initialization and de-initialization functions + * + Format common function + */ +#ifndef COMMON_H +#define COMMON_H + +#include "type.h" +#include "ext_log.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/** + * @addtogroup DEBUG_Log + * @brief DEBUG external module. + * @{ + */ + + /** + * @defgroup CONFIG_Def CONFIG_Def + * @brief Processing Special Characters. + * @{ + */ + +#define EXT_ARRAY_COUNT(x) (sizeof(x) / sizeof(x[0])) +#define EXT_ALIGN_4(x) ((unsigned int)(x + 0x3) & (~0x3)) +#define CHAR_CR '\r' /* 0x0D */ +#define CHAR_LF '\n' /* 0x0A */ + +#define EXT_REG_WRITE(addr, val) (*(volatile unsigned int *)(addr) = (val)) /* Write by register address */ +#define EXT_REG_READ(addr, val) ((val) = *(volatile unsigned int *)(addr)) /* Read by register address */ +#define EXT_REG_READ32(addr) (*(volatile unsigned int *)(addr)) +#define EXT_REG_WRITE32(addr, val) (*(volatile unsigned int *)(addr) = (val)) +#define EXT_REG_WRITE_MASK(addr, val, mask) (*(volatile unsigned int *)((addr) & 0xFFFFFFFC) = \ + ((*(volatile unsigned int *)((addr)& 0xFFFFFFFC)) & (~(mask))) | ((val) & (mask))) +#define EXT_REG_TOOLWRITE(addr, val) (*(volatile unsigned int *)((addr) & 0xFFFFFFFC) = (val)) +#define EXT_REG_TOOLREAD(addr, val) ((val) = *(volatile unsigned int *)((addr) & 0xFFFFFFFC)) + +#define ABS(x) (((x) >= 0) ? (x) : -(x)) +#define MAX(a, b) (((a) >= (b)) ? (a) : (b)) +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define CLIP(a) (((a) >= 0) ? (a) : 0) +#define CLIP2(m, n, a) (((a) > (m)) ? (m) : ((a) < (n) ? (n) : (a))) +#define CLIP3(low, high, x) (MAX(MIN((x), high), low)) +#define RSHFT(x, n) ((x) >= 1 ? \ + (((x) + (1 << ((n)-1))) >> (n)) : (-(((-(x)) + (1 << ((n)-1))) >> (n)))) + +#define ROUND_UP(x, align) (((x) + (align)-1) & ~((align)-1)) +#define ROUND_DOWN(x, align) ((x) & (~((align) - 1))) + +#define EXT_FENCE(void) do { \ + __asm__("fence\n\r"); \ +} while (0) +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ +/** + * @} + */ + +/** + * @} + */ +#endif /* __EXT_COMMON_H__ */ + diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/config.h b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/config.h new file mode 100644 index 000000000..573eaa740 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/config.h @@ -0,0 +1,114 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file config.h + * @author MCU Driver Team + * @brief Header file containing functions prototypes of config module. + * + Initialization and de-initialization functions + * + Format config function + */ +#ifndef CONFIG_H +#define CONFIG_H + + +#include "module.h" +#include "type.h" +#include "typedefs.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + + +#define DATA_ITEM_MAX_LEN 256 /* maximum length of data items */ + +enum DataItem { + DATA_ITEM_EVENT, + DATA_ITEM_NUM_MAX, +}; + +/** + * @addtogroup DEBUG_Log + * @brief DEBUG external module. + * @{ + */ + + /** + * @defgroup CONFIG_Def CONFIG_Def + * @brief Content read/write. + * @{ + */ + +/** + * @brief load_read Reads the content in the configuration address based on the address + * @attention None + * + * @param add [IN] Indicates the address to be read + * @param value [OUT] read content + * @param len [OUT] Length of the read content + * @retval None + */ +void ExtLoadRead(uintptr_t add, char *value, int len); + +/** + * @extLoadWrite Write the content in the configuration address according to the address + * @attention None + * + * @param add [IN] Address to be written + * @param value [IN] What is written + * @param len [IN] Length of the content to be written + * @retval None + */ +void ExtLoadWrite(uintptr_t add, const char *value, int len); + +/** + * @extConfigRead Reads content based on data items + * @attention None + * + * @param item [IN] Read Data Items + * @param value [OUT] Read content + * @param len [OUT] Length of the read content + * @retval None + */ +void ExtConfigRead(enum DataItem item, char *value, int len); + +/** + * @brief load_write Write content based on data items + * @attention Nonw + * + * @param item [IN] Data Items Written + * @param value [IN] Contents of write + * @param len [IN] Length of the content to be written + * @retval None + */ +void ExtConfigWrite(enum DataItem item, const char *value, int len); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ +/** + * @} + */ + +/** + * @} + */ +#endif /* __EXT_DEBUG_H__ */ diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/console.h b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/console.h new file mode 100644 index 000000000..d870fd981 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/console.h @@ -0,0 +1,73 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file console.h + * @author MCU Driver Team + * @brief Header file containing functions prototypes of console module. + * + Initialization and de-initialization functions + * + Format console function + */ +#ifndef CONSOLE_H +#define CONSOLE_H + +#include "uart.h" + +/** + * @addtogroup DEBUG_Log + * @brief DEBUG external module. + * @{ + */ + + /** + * @defgroup CONSOLE_Def CONSOLE_Def + * @brief Serial port printing initialization. + * @{ + */ + + /** + * @brief Read Status Query + * @{ + */ +int ConsoleGetQuery(void); + /** + * @brief Read a single character + * @{ + */ +int ConsoleGetc(void); + /** + * @brief Output String + * @{ + */ +int ConsolePuts(const char *str); + /** + * @brief Output Characters + * @{ + */ +void ConsolePutc(const char c); +/* Format print function */ +int UartPrintf(const char *format, ...); + +/* init console uart */ +void ConsoleInit(UART_Handle uart); +/** + * @} + */ + +/** + * @} + */ +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/dfx_debug.h b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/dfx_debug.h new file mode 100644 index 000000000..69d44fb91 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/dfx_debug.h @@ -0,0 +1,74 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file dfx_debug.h + * @author MCU Driver Team + * @brief Header file containing functions prototypes of DFX_DEBUG module. + * + Initialization and de-initialization functions + * + Format DFX_DEBUG function + */ +#ifndef DFX_DEBUG_H +#define DFX_DEBUG_H + +#include "module.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/** + * @addtogroup DEBUG_Log + * @brief DEBUG external module. + * @{ + */ + + /** + * @defgroup DFX_DEBUG_Def DFX_DEBUG_Def + * @brief Setting the Debug Mode. + * @{ + */ + +enum ExtDebugMode { + DEBUG, + RUNNING +}; +/** + * @brief extSetDebugMode + * @attention None + * + * @param ExtDebugMode [IN] Operation mode + * @retval None + */ +void ExtSetDebugMode(enum ExtDebugMode mode); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* DFX_DEBUG_H */ diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/dfx_log.h b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/dfx_log.h new file mode 100644 index 000000000..bbb51567b --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/dfx_log.h @@ -0,0 +1,142 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file dfx_log.h + * @author MCU Driver Team + * @brief dfx_log module driver + * @details The header file contains the following declaration: + * + Perhaps and print the log content. + */ +#ifndef DFX_LOG_H +#define DFX_LOG_H + +#include "ext_log.h" + +#ifdef __cplusplus__ +#if __cplusplus__ +extern "C" { +#endif +#endif + +#define LOG_UINT_MAX_LEN 512 +#define LOG_MEM_POOL_MAX_LEN 1024 +#define LOG_LAST_WORD_MAX_LEN 1024 + +#define LOG_STATEMENT_MAX_LEN 20 + +/** + * @addtogroup DEBUG_Log + * @brief DEBUG external module. + * @{ + */ + + /** + * @defgroup DFX_LOG_Def DFX_LOG_Def + * @brief Initialization of Miniaturized Logs. + * @{ + */ + +struct MemoryLog { + unsigned char enable; + unsigned char mmzBuf[LOG_MEM_POOL_MAX_LEN]; + unsigned int writePos; + unsigned int logLen; +}; +struct SysLogCtx { + unsigned char init; + char **modStr; + enum ExtLogLevel logLevel[EXT_MODULE_BUTT]; + struct MemoryLog memLog; +}; +struct SysDebugSwitch { + unsigned char enable; + struct SysLogCtx logCtx; +}; + +/** + * @brief get log context. + * @attention None + * + * @retval struct SysLogCtx *. + */ +struct SysLogCtx *GetLogCtx(void); + +/** + * @brief init log context. + * @attention None + * + * @param ctx: Pointer to the SysLogCtx structure to be initialized. + * @retval None + */ +void LogCtxInit(struct SysLogCtx *ctx); + +/** + * @brief init struct MemoryLog. + * @attention None + * + * @param memData: Pointer to the MemoryLog structure to be initialized + * @retval None + */ +void InitMemoryData(struct MemoryLog *memData); + +/** + * @brief get debug switch. + * @attention None + * + * @retval struct SysDebugSwitch *. + */ +struct SysDebugSwitch *GetDebugSwitch(void); + +/** + * @brief get memory data. + * @attention None + * + * @retval struct MemoryLog *. + */ +struct MemoryLog *GetMemoryData(void); + +/** + * @brief Register the dfx cmd + * @attention None + * + * @retval None + */ +void DfxCmdRegister(void); + +/** + * @brief get version info cmd + * @attention None + * + * @param argc: Number of input parameters. + * @param argv: Array of pointers + * @retval Return the setting result, success or failure. + */ +int CmdGetVersionInfo(void); + +#ifdef __cplusplus__ +#if __cplusplus__ +} +#endif +#endif /* end of __cplusplus */ +/** + * @} + */ + +/** + * @} + */ +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/errno.h b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/errno.h new file mode 100644 index 000000000..df88fbf37 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/errno.h @@ -0,0 +1,65 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file errno.h + * @author MCU Driver Team + * @brief Header file containing functions prototypes of erron module. + * + Initialization and de-initialization functions + * + Format erron function + */ +#ifndef ERRNO_H +#define ERRNO_H + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/** + * @addtogroup DEBUG_Log + * @brief DEBUG external module. + * @{ + */ + + /** + * @defgroup ERRNO_Def ERRNO_Def + * @brief Define the success flag. + * @{ + */ + +/* Customize the required return value */ +typedef enum { + EXT_SUCCESS = 0x0, + EXT_ERR_USER_BUSY = 0x01060002, + EXT_INVALID = 0xFFFFFFFE, + EXT_FAILURE = 0xFFFFFFFF, +} EXT_MCU_ERRNO; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ +/** + * @} + */ + +/** + * @} + */ +#endif /* __EXT_ERRNO_H__ */ diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/event.h b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/event.h new file mode 100644 index 000000000..7d7482e44 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/event.h @@ -0,0 +1,143 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file event.h + * @author MCU Driver Team + * @brief Header file containing functions prototypes of erron module. + * + Defines the function of reporting initialization events. + */ +#ifndef EVENT_CODE_H +#define EVENT_CODE_H + +#include "module.h" +#include "type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +/** + * @addtogroup DEBUG_Log + * @brief DEBUG external module. + * @{ + */ + + /** + * @defgroup EVENT_Def EVENT_Def + * @brief Definition of the Event Reporting Function. + * @{ + */ + +#define SYS_GPIO_GROUP_REPORT 0 +#define USER_CMD_MAX_LEN 8 +#define EVENT_MAX_LEN 5 + +#define REPORT_EVENT_DONE 0xFFFFFFFF + + +typedef enum { + REPORT_LAST_WORD_EVENT, +} REPORT_EVENT; + +typedef enum { + BUS_SLAVE_IRQ_INT_WRITE_START, + BUS_SLAVE_IRQ_INT_WRITE_END, + BUS_SLAVE_IRQ_INT_READ_START, + BUS_SLAVE_IRQ_INT_READ_END, + BUS_SLAVE_IRQ_PGM_WRITE_START, + BUS_SLAVE_IRQ_PGM_WRITE_END, + BUS_SLAVE_IRQ_PGM_READ_START, + BUS_SLAVE_IRQ_PGM_READ_END, + BUS_SLAVE_IRQ_INT_FIFO, + BUS_SLAVE_IRQ_EXCEPTION, + BUS_SLAVE_IRQ_BUTT +} BUSS_IRQ_Type; + +typedef struct { + unsigned short cmd; /* Commands delivered by the user */ + unsigned char ack; + unsigned char len; + unsigned char param[USER_CMD_MAX_LEN]; +} UserCmd; + +typedef void (*pfnCB)(unsigned int); + +typedef enum { + DATA_TYPE_NOISE, DATA_TYPE_SELF, DATA_TYPE_STYLUS, DATA_TYPE_MUTUAL +} DataType; + +typedef struct { + unsigned char eventType; + unsigned char ack; + unsigned char len; + unsigned char param[EVENT_MAX_LEN]; +} McuEvent; + +typedef struct { + unsigned int reportType; /* Report Type */ + McuEvent event; +} McuReport; + +typedef struct { + McuReport report; + pfnCB pfnevent; +} UserEventObj; + +typedef struct { + unsigned int reportLock; + int gpioHandle; + unsigned int reportAddr; + unsigned short cmdNotFoudCount; + unsigned short reportFailedCount; + UserEventObj eventObj; + UserCmd cmd; +} UserMgr; + +/** + * @brief report event + * @attention None + * + * @param report event struct + * @retval The return value indicates that the event is reported successfully or failed. + */ +int UserReportEvent(UserEventObj *eventObj); + +/** + * @brief init event + * @attention None + * + * @retval The return value indicates that the event is reported successfully or failed. + */ +int EventInit(void); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* __EXT_DEBUG_H__ */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/ext_log.h b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/ext_log.h new file mode 100644 index 000000000..1a211d0d9 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/ext_log.h @@ -0,0 +1,275 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file ext_loh.h + * @author MCU Driver Team + * @brief log module driver + * @details The header file contains the following declaration: + * + Definition of the Miniaturized Log Structure + * + Definition of Miniaturized Log Output Functions + */ +#ifndef EXT_LOG_H +#define EXT_LOG_H + +#include "module.h" +#include "console.h" +#include "file_id_defs.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +/* Serial port print definition */ +#define EXT_PRINT UartPrintf +/** + * @brief Initializing the Log Output Level + */ +enum ExtLogLevel { + EXT_LOG_LEVEL_FATAL, + EXT_LOG_LEVEL_ERROR, + EXT_LOG_LEVEL_WARNING, + EXT_LOG_LEVEL_INFO, + EXT_LOG_LEVEL_DBG, + EXT_LOG_LEVEL_BUTT, +}; + +enum ExtLogLevelToken { + FATAL, + ERR, + WARN, + INFO, + DBG, +}; +#define MAKE_XML_ID_UINT32(a, b) ((unsigned int)(((unsigned short)(a)) | ((unsigned int)((unsigned short)(b))) << 16)) + +#define EXT_FATAL_PRINT(modId, fmt...) +#define EXT_ERR_PRINT(modId, fmt...) UartPrintf(fmt) +#define EXT_WARN_PRINT(modId, fmt...) +#define EXT_INFO_PRINT(modId, fmt...) UartPrintf(fmt) +#define EXT_DBG_PRINT(modId, fmt...) + +#ifndef CFG_DFX_MINILOG_SUPPORT +#define CFG_DFX_MINILOG_SUPPORT 1 +#endif + +/** + * @addtogroup DEBUG_Log + * @brief DEBUG external module. + * @{ + */ + + /** + * @defgroup EXT_LOG_Def EXT_LOG_Def + * @brief Interface for Printing Miniaturized Logs. + * @{ + */ + +/** + * @defgroup Various types of miniaturized log output + * @brief log output external module. + * @{ + */ +int ExtDrvLogOutBuf(enum ExtLogLevel level, enum ExtModule modId, unsigned int xmlId, + const unsigned int* logBuf, unsigned short logBufLen); +int ExtDrvLogOut0(enum ExtLogLevel level, enum ExtModule modId, unsigned int xmlId); +int ExtDrvLogOut1(enum ExtLogLevel level, enum ExtModule modId, unsigned int xmlId, unsigned int d0); +int ExtDrvLogOut2(enum ExtLogLevel level, enum ExtModule modId, unsigned int xmlId, unsigned int d0, unsigned int d1); +int ExtDrvLogOut3(enum ExtLogLevel level, enum ExtModule modId, unsigned int xmlId, unsigned int d0, unsigned int d1, + unsigned int d2); + +/** + * @defgroup Printing and outputting miniaturized logs + * @brief log output external module. + * @{ + */ +int ExtDrvLogSetLogLevel(enum ExtModule modId, enum ExtLogLevel level); +int ExtDrvLogOutFmt(enum ExtLogLevel level, enum ExtModule id, const char *fmt, ...); + +#ifndef EXT_LOG_LEVEL +#define EXT_LOG_LEVEL EXT_LOG_LEVEL_DBG +#endif +#define EXT_LOG_0(level, modId, msg) LOG_##level##_0(modId, msg) +#define EXT_LOG_1(level, modId, msg, d0) LOG_##level##_1(modId, msg, d0) +#define EXT_LOG_2(level, modId, msg, d0, d1) LOG_##level##_2(modId, msg, d0, d1) +#define EXT_LOG_3(level, modId, msg, d0, d1, d2) LOG_##level##_3(modId, msg, d0, d1, d2) +#define EXT_LOG_BUF(level, modId, msg, logBuf, logBufLen) LOG_##level##_BUF(modId, msg, logBuf, logBufLen) + +#ifdef MAKE_PRIM_XML_PROCESS_IN + +#define LOG_FATAL_0(modId, msg) \ + { \ + _PRIM_ST_, _PRIM_PRI_ = 0, _PRIM_MSG_ = msg, _PRIM_LINE_ = __LINE__, \ + _PRIM_FILE_ID_ = __FILE_IDX__, _PRIM_MOD_ID_ = modId, _PRIM_END_ \ + } +#define LOG_FATAL_1(modId, msg, d0) LOG_FATAL_0(modId, msg) +#define LOG_FATAL_2(modId, msg, d0, d1) LOG_FATAL_0(modId, msg) +#define LOG_FATAL_3(modId, msg, d0, d1, d2) LOG_FATAL_0(modId, msg) +#define LOG_FATAL_BUF(modId, msg, logBuf, logBufLen) LOG_FATAL_0(modId, msg) +#define LOG_LAST_WORD_BUF(modId, msg, logBuf, logBufLen) LOG_FATAL_0(modId, msg) + + +#define LOG_ERR_0(modId, msg) \ + { \ + _PRIM_ST_, _PRIM_PRI_ = 1, _PRIM_MSG_ = msg, _PRIM_LINE_ = __LINE__, \ + _PRIM_FILE_ID_ = __FILE_IDX__, _PRIM_MOD_ID_ = modId, _PRIM_END_ \ + } +#define LOG_ERR_1(modId, msg, d0) LOG_ERR_0(modId, msg) +#define LOG_ERR_2(modId, msg, d0, d1) LOG_ERR_0(modId, msg) +#define LOG_ERR_3(modId, msg, d0, d1, d2) LOG_ERR_0(modId, msg) +#define LOG_ERR_BUF(modId, msg, logBuf, logBufLen) LOG_ERR_0(modId, msg) + +#define LOG_WARN_0(modId, msg) \ + { \ + _PRIM_ST_, _PRIM_PRI_ = 2, _PRIM_MSG_ = msg, _PRIM_LINE_ = __LINE__, \ + _PRIM_FILE_ID_ = __FILE_IDX__, _PRIM_MOD_ID_ = modId, _PRIM_END_ \ + } +#define LOG_WARN_1(modId, msg, d0) LOG_WARN_0(modId, msg) +#define LOG_WARN_2(modId, msg, d0, d1) LOG_WARN_0(modId, msg) +#define LOG_WARN_3(modId, msg, d0, d1, d2) LOG_WARN_0(modId, msg) +#define LOG_WARN_BUF(modId, msg, logBuf, logBufLen) LOG_WARN_0(modId, msg) + +#define LOG_INFO_0(modId, msg) \ + { \ + _PRIM_ST_, _PRIM_PRI_ = 3, _PRIM_MSG_ = msg, _PRIM_LINE_ = __LINE__, \ + _PRIM_FILE_ID_ = __FILE_IDX__, _PRIM_MOD_ID_ = modId, _PRIM_END_ \ + } +#define LOG_INFO_1(modId, msg, d0) LOG_INFO_0(modId, msg) +#define LOG_INFO_2(modId, msg, d0, d1) LOG_INFO_0(modId, msg) +#define LOG_INFO_3(modId, msg, d0, d1, d2) LOG_INFO_0(modId, msg) +#define LOG_INFO_BUF(modId, msg, logBuf, logBufLen) LOG_INFO_0(modId, msg) + +#define LOG_DBG_0(modId, msg) \ + { \ + _PRIM_ST_, _PRIM_PRI_ = 4, _PRIM_MSG_ = msg, _PRIM_LINE_ = __LINE__, \ + _PRIM_FILE_ID_ = __FILE_IDX__, _PRIM_MOD_ID_ = modId, _PRIM_END_ \ + } +#define LOG_DBG_1(modId, msg, d0) LOG_DBG_0(modId, msg) +#define LOG_DBG_2(modId, msg, d0, d1) LOG_DBG_0(modId, msg) +#define LOG_DBG_3(modId, msg, d0, d1, d2) LOG_DBG_0(modId, msg) +#define LOG_DBG_BUF(modId, msg, logBuf, logBufLen) LOG_DBG_0(modId, msg) + +#else + +#define MAKE_XML_ID_UINT32(a, b) ((unsigned int)(((unsigned short)(a)) | ((unsigned int)((unsigned short)(b))) << 16)) + +#define LOG_0(level, modId, msg) \ + ExtDrvLogOut0(level, modId, MAKE_XML_ID_UINT32(__LINE__, THIS_FILE_ID)) +#define LOG_1(level, modId, msg, d0) \ + ExtDrvLogOut1(level, modId, MAKE_XML_ID_UINT32(__LINE__, THIS_FILE_ID), d0) +#define LOG_2(level, modId, msg, d0, d1) \ + ExtDrvLogOut2(level, modId, MAKE_XML_ID_UINT32(__LINE__, THIS_FILE_ID), d0, d1) +#define LOG_3(level, modId, msg, d0, d1, d2) \ + ExtDrvLogOut3(level, modId, MAKE_XML_ID_UINT32(__LINE__, THIS_FILE_ID), d0, d1, d2) + +#if CFG_DFX_MINILOG_SUPPORT +#define LOG_FATAL_0(modId, msg) \ + LOG_0(EXT_LOG_LEVEL_FATAL, modId, msg) +#define LOG_FATAL_1(modId, msg, d0) \ + LOG_1(EXT_LOG_LEVEL_FATAL, modId, msg, d0) +#define LOG_FATAL_2(modId, msg, d0, d1) \ + LOG_2(EXT_LOG_LEVEL_FATAL, modId, msg, d0, d1) +#define LOG_FATAL_3(modId, msg, d0, d1, d2) \ + LOG_3(EXT_LOG_LEVEL_FATAL, modId, msg, d0, d1, d2) +#define LOG_ERR_0(modId, msg) \ + LOG_0(EXT_LOG_LEVEL_ERROR, modId, msg) +#define LOG_ERR_1(modId, msg, d0) \ + LOG_1(EXT_LOG_LEVEL_ERROR, modId, msg, d0) +#define LOG_ERR_2(modId, msg, d0, d1) \ + LOG_2(EXT_LOG_LEVEL_ERROR, modId, msg, d0, d1) +#define LOG_ERR_3(modId, msg, d0, d1, d2) \ + LOG_3(EXT_LOG_LEVEL_ERROR, modId, msg, d0, d1, d2) +#define LOG_WARN_0(modId, msg) \ + LOG_0(EXT_LOG_LEVEL_WARNING, modId, msg) +#define LOG_WARN_1(modId, msg, d0) \ + LOG_1(EXT_LOG_LEVEL_WARNING, modId, msg, d0) +#define LOG_WARN_2(modId, msg, d0, d1) \ + LOG_2(EXT_LOG_LEVEL_WARNING, modId, msg, d0, d1) +#define LOG_WARN_3(modId, msg, d0, d1, d2) \ + LOG_3(EXT_LOG_LEVEL_WARNING, modId, msg, d0, d1, d2) +#define LOG_INFO_0(modId, msg) \ + LOG_0(EXT_LOG_LEVEL_INFO, modId, msg) +#define LOG_INFO_1(modId, msg, d0) \ + LOG_1(EXT_LOG_LEVEL_INFO, modId, msg, d0) +#define LOG_INFO_2(modId, msg, d0, d1) \ + LOG_2(EXT_LOG_LEVEL_INFO, modId, msg, d0, d1) +#define LOG_INFO_3(modId, msg, d0, d1, d2) \ + LOG_3(EXT_LOG_LEVEL_INFO, modId, msg, d0, d1, d2) +#define LOG_DBG_0(modId, msg) \ + LOG_0(EXT_LOG_LEVEL_DBG, modId, msg) +#define LOG_DBG_1(modId, msg, d0) \ + LOG_1(EXT_LOG_LEVEL_DBG, modId, msg, d0) +#define LOG_DBG_2(modId, msg, d0, d1) \ + LOG_2(EXT_LOG_LEVEL_DBG, modId, msg, d0, d1) +#define LOG_DBG_3(modId, msg, d0, d1, d2) \ + LOG_3(EXT_LOG_LEVEL_DBG, modId, msg, d0, d1, d2) +#else +#define LOG_FATAL_0(modId, fmt...) ExtDrvLogOutFmt(EXT_LOG_LEVEL_FATAL, modId, fmt) +#define LOG_FATAL_1(modId, fmt...) LOG_FATAL_0(modId, fmt) +#define LOG_FATAL_2(modId, fmt...) LOG_FATAL_0(modId, fmt) +#define LOG_FATAL_3(modId, fmt...) LOG_FATAL_0(modId, fmt) +#define LOG_ERR_0(modId, fmt...) ExtDrvLogOutFmt(EXT_LOG_LEVEL_ERROR, modId, fmt) +#define LOG_ERR_1(modId, fmt...) LOG_ERR_0(modId, fmt) +#define LOG_ERR_2(modId, fmt...) LOG_ERR_0(modId, fmt) +#define LOG_ERR_3(modId, fmt...) LOG_ERR_0(modId, fmt) +#define LOG_WARN_0(modId, fmt...) ExtDrvLogOutFmt(EXT_LOG_LEVEL_WARNING, modId, fmt) +#define LOG_WARN_1(modId, fmt...) LOG_WARN_0(modId, fmt) +#define LOG_WARN_2(modId, fmt...) LOG_WARN_0(modId, fmt) +#define LOG_WARN_3(modId, fmt...) LOG_WARN_0(modId, fmt) +#define LOG_INFO_0(modId, fmt...) ExtDrvLogOutFmt(EXT_LOG_LEVEL_INFO, modId, fmt) +#define LOG_INFO_1(modId, fmt...) LOG_INFO_0(modId, fmt) +#define LOG_INFO_2(modId, fmt...) LOG_INFO_0(modId, fmt) +#define LOG_INFO_3(modId, fmt...) LOG_INFO_0(modId, fmt) +#define LOG_DBG_0(modId, fmt...) ExtDrvLogOutFmt(EXT_LOG_LEVEL_DBG, modId, fmt) +#define LOG_DBG_1(modId, fmt...) LOG_DBG_0(modId, fmt) +#define LOG_DBG_2(modId, fmt...) LOG_DBG_0(modId, fmt) +#define LOG_DBG_3(modId, fmt...) LOG_DBG_0(modId, fmt) +#endif + +#define LOG_BUF(level, modId, msg, logBuf, logBufLen) \ + ExtDrvLogOutBuf(level, modId, MAKE_XML_ID_UINT32(__LINE__, THIS_FILE_ID), logBuf, logBufLen) + + +#define LOG_FATAL_BUF(modId, msg, logBuf, logBufLen) \ + LOG_BUF(EXT_LOG_LEVEL_FATAL, modId, msg, logBuf, logBufLen) +#define LOG_ERR_BUF(modId, msg, logBuf, logBufLen) \ + LOG_BUF(EXT_LOG_LEVEL_ERROR, modId, msg, logBuf, logBufLen) +#define LOG_WARN_BUF(modId, msg, logBuf, logBufLen) \ + LOG_BUF(EXT_LOG_LEVEL_WARNING, modId, msg, logBuf, logBufLen) +#define LOG_INFO_BUF(modId, msg, logBuf, logBufLen) \ + LOG_BUF(EXT_LOG_LEVEL_INFO, modId, msg, logBuf, logBufLen) +#define LOG_DBG_BUF(modId, msg, logBuf, logBufLen) \ + LOG_BUF(EXT_LOG_LEVEL_DBG, modId, msg, logBuf, logBufLen) + +#endif + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* __EXT_DEBUG_H__ */ diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/file_id_defs.h b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/file_id_defs.h new file mode 100644 index 000000000..b1005a51f --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/file_id_defs.h @@ -0,0 +1,63 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file file_id_defs.h + * @author MCU Driver Team + * @brief file id module driver + * @details The header file contains the following declaration: + * +Definition of miniaturized log event IDs + */ +#ifndef FILE_ID_DEFS_H +#define FILE_ID_DEFS_H + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif + +/** + * @addtogroup DEBUG_Log + * @brief DEBUG external module. + * @{ + */ + + /** + * @defgroup FILE_ID_DEFS_Def FILE_ID_DEFS_Def + * @brief Define source files and ID. + * @{ + */ + +typedef enum { + FILE_ID_LOG_C = 2001, /* this is a test sample */ +} file_id_enum; + +#ifdef __cplusplus +#if __cplusplus + } +#endif +#endif + +/** + * @} + */ + +/** + * @} + */ + +#endif /* FILE_ID_DEFS_H */ diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/log.h b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/log.h new file mode 100644 index 000000000..70653a310 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/log.h @@ -0,0 +1,146 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file log.h + * @author MCU Driver Team + * @brief log module driver + * @details The header file contains the following declaration: + * + Definition of log level settings for miniaturization. + * + Output of miniaturized logs based on different conditions. + */ +#ifndef LOG_H +#define LOG_H + +#include "ext_log.h" +#include "module.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +/** + * @addtogroup DEBUG_Log + * @brief DEBUG external module. + * @{ + */ + + /** + * @defgroup LOG_Def LOG_Def + * @brief Printing miniaturized logs. + * @{ + */ + +/** + * @brief Set Log Level. + * @attention None + * + * @param id [IN] ID of the module whose log level is to be set, which is defined by ExtModule. + * @param logLevel [IN] Log level, which is defined by ExtLogLevel. + * @retval int Whether the setting is successful + */ +int ExtSetLogLevel(enum ExtModule id, enum ExtLogLevel logLevel); + +/** + * @brief Used to report the content of a specified buffer to the message interface of the PC tool. + * @attention None + * + * @param logLevel [IN] Log level, which is defined by ExtLogLevel. + * @param modId [IN] Module ID, which is planned in advance based on the service scenario. + * @param msg [IN] The value is a character string constant and does not support carriage returns. + * The current version does not support parameter formatting. Only the character string is displayed. + * @param log_buf[IN] Log buffer + * @param log_buf_len[IN] Length of the log buffer, in bytes + * + * @retval None + */ +#define ExtLogBuf(logLevel, modId, msg, logBuf, logBufLen) EXT_LOG_BUF(logLevel, modId, msg, logBuf, logBufLen) + +/** + * @brief extLog0,Output logs without variables + * @attention None + * + * @param logLevel [IN] Log level, which is defined by ExtLogLevel + * @param modId [IN] Module ID, which is planned in advance based on the service scenario. + * @param msg [IN] The value is a character string constant and does not support carriage returns. + * The current version does not support parameter formatting. Only the character string is displayed. + * + * @retval None + */ +#define ExtLog0(logLevel, modId, msg) EXT_LOG_0(logLevel, modId, msg) + +/** + * @brief Logs with one int value are output + * @attention None + * + * @param logLevel [IN] Log level, which is defined by ExtLogLevel + * @param modId [IN] Module ID, which is planned in advance based on the service scenario. + * @param msg [IN] The value is a character string constant and does not support carriage returns. + * The current version does not support parameter formatting. Only the character string is displayed. + * @param d0 [IN] Variable of the unsigned int type + * + * @retval None + */ +#define ExtLog1(logLevel, modId, msg, d0) EXT_LOG_1(logLevel, modId, msg, d0) + +/** + * @brief Logs with two int values are output. + * @attention None + * + * @param logLevel [IN] Log level, which is defined by ExtLogLevel + * @param modId [IN] Module ID, which is planned in advance based on the service scenario. + * @param msg [IN] The value is a character string constant and does not support carriage returns. + * The current version does not support parameter formatting. Only the character string is displayed. + * @param d0 [IN] Variable of the unsigned int type + * @param d1 [IN] Variable of the unsigned int type + * + * @retval None + */ +#define ExtLog2(logLevel, modId, msg, d0, d1) EXT_LOG_2(logLevel, modId, msg, d0, d1) + +/** + * @brief Logs with three int values are output + * @attention None + * + * @param logLevel [IN] Log level, which is defined by ExtLogLevel + * @param modId [IN] Module ID, which is planned in advance based on the service scenario. + * @param msg [IN] The value is a character string constant and does not support carriage returns. + * The current version does not support parameter formatting. Only the character string is displayed. + * @param d0 [IN] Variable of the unsigned int type + * @param d1 [IN] Variable of the unsigned int type + * @param d2 [IN] Variable of the unsigned int type + * + * @retval None + */ +#define ExtLog3(logLevel, modId, msg, d0, d1, d2) EXT_LOG_3(logLevel, modId, msg, d0, d1, d2) + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* __EXT_DEBUG_H__ */ diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/module.h b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/module.h new file mode 100644 index 000000000..ca565e1f7 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/module.h @@ -0,0 +1,96 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mpdule.h + * @author MCU Driver Team + * @brief Definition of the Miniaturized Log Module + * @details The header file contains the following declaration: + * + Definition of the ID of the miniaturized log module + */ +#ifndef MODULE_H +#define MODULE_H + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/** + * @addtogroup DEBUG_Log + * @brief DEBUG external module. + * @{ + */ + + /** + * @defgroup MODULE_Def MODULE_Def + * @brief define the device model. + * @{ + */ + +/* * Module ID flags */ +enum ExtModule { + EXT_MODULE_APP_MAIN, + EXT_MODULE_APP_CONSOLE, + EXT_MODULE_APP_CHIP, + EXT_MODULE_DRV_BASE, + EXT_MODULE_DRV_CHIPS, + EXT_MODULE_DRV_CRG, + EXT_MODULE_DRV_GPIO, + EXT_MODULE_DRV_I2C, + EXT_MODULE_DRV_IRQ, + EXT_MODULE_DRV_PINCTRL, + EXT_MODULE_DRV_TIMER, + EXT_MODULE_DRV_UART, + EXT_MODULE_DFX, + EXT_MODULE_BUTT +}; + +#define MODULE_ID_MASK 0xFF000000 +#define FEATURE_ID_MASK 0x00FF0000 +#define PARAM_USE_ID_MASK 0x0000FFFF + +#define MODULE_ID_OFFSET 0x18 +#define FEATURE_ID_OFFSET 0x10 +#define PARAM_USE_ID_OFFSET 0x8 + +#define SCENE_UINT_MAX_ID 0xFF + +#define SCENE_END_LABEL 0xABCDABCD + +#define STATE_CODE_MODULE_MASK 0x10 +#define STATE_CODE_MASK 0xFFFF0000 + +#define STATE_CODE(moduleId, stateCode) (moduleId << STATE_CODE_MODULE_MASK | (stateCode & STATE_CODE_MASK)) +#define STATE_CODE_ERR_CHECK(ret) ((ret & STATE_CODE_MASK) > EXT_RIGHT_UNKNOWN) +#define STATE_CODE_RIGHT_CHECK(ret) ((ret & STATE_CODE_MASK) <= EXT_RIGHT_UNKNOWN) + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* __EXT__MODULE__ */ diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/type.h b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/type.h new file mode 100644 index 000000000..2e4fdbfd3 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/inc/type.h @@ -0,0 +1,73 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file type.h + * @author MCU Driver Team + * @brief type module driver + * @details The header file contains the following declaration: + * + Basic Data Type Definition + */ +#ifndef TYPE_H +#define TYPE_H + +#include "errno.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/** + * @addtogroup DEBUG_Log + * @brief DEBUG external module. + * @{ + */ + + /** + * @defgroup TYPE_Def TYPE_Def + * @brief define the return value type. + * @{ + */ + +/** + * @brief Basic Data Type Definition + */ +#ifndef NULL +#define NULL 0L +#endif +#define NULL_PTR ((void*)0) + +#define EXT_FALSE 0 +#define EXT_TRUE 1 + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* __EXT_TYPE_H__ */ + diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/app_command.c b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/app_command.c new file mode 100644 index 000000000..a512fcae2 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/app_command.c @@ -0,0 +1,525 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file app_command.c + * @author MCU Driver Team + * @brief command module driver + * @details The header file contains the following declaration: + * + Receive and parse the command input through the serial port. + * + implementation of serial port output function + * + Key Character Detection + */ +#include +#include +#include "common.h" +#include "command.h" +#include "console.h" +#include "cmd_common.h" +#include "cmd.h" +#include "securec.h" + +typedef struct { + char ch; + char c; +} DirMapRes; + +/** + * @brief Command Input Keyword Initialization + */ +struct CmdInput { + char buf[CMD_BUF_MAX]; + size_t cursor; +}; + +/** + * @brief Initialize the command storage address. + */ +struct CmdRecord { + char cmdLogList[CMD_NUM_MAX][CMD_BUF_MAX]; + signed char max; + signed char addIdx; + signed char cur; +}; + +/** + * @brief Initialize the command sending variable. + */ +struct CmdCtx { + char cmdBuf[CMD_BUF_MAX]; + const char *argv[ARGS_NUM_MAX]; + unsigned char dirKeyLen; + char uartRxch; /* stores the characters */ + + struct CmdInput inputCmd; + struct CmdRecord cmdLog; +}; + +static struct CmdCtx g_cmdCtx = { 0 }; +static struct CmdCtx *AppCmdGetCtx(void) +{ + /* Initialize the structure value */ + return &g_cmdCtx; +} + +/** + * @brief Get Previous Command + * @param cmdLog: Commands from user + * @retval : Parse the subscript or error return value of a character string. + */ +static char *GetPreCmd(struct CmdRecord *cmdLog) +{ + if (cmdLog->max == 0) { /* Failed to initialize the maximum value */ + return NULL; + } + + if (cmdLog->max < CMD_NUM_MAX - 1) { + if (cmdLog->cur == 0) { + return NULL; + } + return cmdLog->cmdLogList[--cmdLog->cur]; + } + + if (cmdLog->cur == 0) { + if (cmdLog->addIdx == cmdLog->max) { + return NULL; + } + cmdLog->cur = cmdLog->max; + return cmdLog->cmdLogList[cmdLog->cur]; + } + + if (cmdLog->addIdx == cmdLog->cur - 1) { + return NULL; + } + return cmdLog->cmdLogList[--cmdLog->cur]; /* the pointer address is returned */ +} + +/** + * @brief Read the next command + * @param cmdLog: Commands from user + * @retval : Parse the subscript or error return value of a character string. + */ +static char *GetNextCmd(struct CmdRecord *cmdLog) +{ + if (cmdLog == NULL || cmdLog->max == 0) { /* Failed to initialize the maximum value */ + return NULL; + } + + if (cmdLog->max < CMD_NUM_MAX - 1) { + if (cmdLog->cur == cmdLog->max) { + return NULL; + } + return cmdLog->cmdLogList[++cmdLog->cur]; + } + + if (cmdLog->cur == cmdLog->max) { + if (cmdLog->addIdx == 0) { + return NULL; + } + cmdLog->cur = 0; + return cmdLog->cmdLogList[cmdLog->cur]; + } + + if (cmdLog->addIdx == cmdLog->cur + 1) { + return NULL; + } + return cmdLog->cmdLogList[++cmdLog->cur]; /* the pointer address is returned */ +} + +/** + * @brief Delete End Identifier + * @param inputcmd : Entered character string information. + * @retval None. + */ +static void CmdDeleteTailChar(struct CmdInput *inputCmd) +{ + if (inputCmd == NULL || inputCmd->cursor == 0) { + return; + } + /* Add a closing marker to a string */ + ConsolePutc(CTL_BACKSPACE); + ConsolePutc(SPACE_KEY); + ConsolePutc(CTL_BACKSPACE); + inputCmd->buf[--(inputCmd->cursor)] = '\0'; +} + +/** + * @brief Add a terminator at the end of a string + * @param inputcmd : Entered character string information. + * @retval None. + */ +static void CmdAddTailChar(struct CmdInput *inputCmd, char ch) +{ + if (inputCmd->cursor >= CMD_BUF_MAX - 1) { + return; + } + inputCmd->buf[(inputCmd->cursor)++] = ch; + /* Remove '\n' characters and add '\r\n' */ + ConsolePutc(ch); +} + +/** + * @brief Ignore the effects of key characters + * @param ch : Characters contained in the command + * @retval Indicates whether the implementation is successful. + */ +static unsigned char IgnoreCmdKey(char ch) +{ + /* end character and type character for the crt key */ + char ignoreKeys[] = {'\0', CTL_CH('a'), CTL_CH('b'), CTL_CH('e'), CTL_CH('f'), CTL_CH('x'), + CTL_CH('o'), CTL_CH('u')}; + + for (unsigned char i = 0; i < sizeof(ignoreKeys); i++) { + if (ch == ignoreKeys[i]) { + return EXT_TRUE; + } + } + return EXT_FALSE; +} + +/** + * @brief deleted Command Keys + * @param ch : Characters contained in the command + * @retval Indicates whether the implementation is successful. + */ +static unsigned char DeleteCmdKey(char ch) +{ + /* Backspace key delete key and other special key input */ + char deleteKeys[] = {DEL, DEL7, CTL_CH('h'), CTL_CH('d'), CTL_CH('k')}; + + for (unsigned char i = 0; i < sizeof(deleteKeys); i++) { + if (ch == deleteKeys[i]) { + return EXT_TRUE; + } + } + return EXT_FALSE; +} + +/** + * @brief Output Log Commands + * @param ch : Characters contained in the command + * @param cmdlog : Command log information + * @param input : Entering command information + * @retval None + */ +static void OutputLogCmd(struct CmdCtx *cmdCtx) +{ + char *cmd = NULL; + + cmd = (cmdCtx->uartRxch == CTL_CH('p')) ? GetPreCmd(&(cmdCtx->cmdLog)) : GetNextCmd(&(cmdCtx->cmdLog)); + /* If the value is empty, direct returned */ + if (cmd == NULL) { + return; + } + + /* Clears the array of characters */ + while (cmdCtx->inputCmd.cursor) { + CmdDeleteTailChar(&(cmdCtx->inputCmd)); + } + if (strncpy_s(cmdCtx->inputCmd.buf, CMD_BUF_MAX, cmd, strlen(cmd)) != EXT_SUCCESS) { + APP_CMD_ERR_PRINT("backup logcmd err\n"); + return; + } + /* Update pointer coordinates */ + cmdCtx->inputCmd.cursor = strlen(cmdCtx->inputCmd.buf); + EXT_PRINT("%s", cmdCtx->inputCmd.buf); +} + +/** + * @brief Output log commands + * @param cmd : Command string + * @param cmdlog : Command log information + * @retval Indicates whether the implementation is successful + */ +static int RecordCmd(const char *cmd, struct CmdRecord *cmdLog) +{ + /* not record uart switch cmd */ + if (strncmp(cmd, UART_SWITCH_CMD, strlen(UART_SWITCH_CMD)) == 0) { + return EXT_SUCCESS; + } + + /* clear buf and copy cmd to buf */ + memset_s(cmdLog->cmdLogList[cmdLog->addIdx], CMD_BUF_MAX, 0, CMD_BUF_MAX); + if (strncpy_s(cmdLog->cmdLogList[cmdLog->addIdx], CMD_BUF_MAX, cmd, strlen(cmd)) != EXT_SUCCESS) { + return EXT_FAILURE; + } + cmdLog->addIdx = (cmdLog->addIdx + 1) % CMD_NUM_MAX; + cmdLog->max = (cmdLog->addIdx > cmdLog->max) ? cmdLog->addIdx : cmdLog->max; + cmdLog->cur = cmdLog->addIdx; + return EXT_SUCCESS; +} + +/** + * @brief Clear the command and initialize the address + * @param inputCmd : Entering command information + * @retval None + */ +static void CleanInputCmd(struct CmdCtx *cmdCtx) +{ + /* the address pointer points to the start address */ + cmdCtx->inputCmd.buf[0] = '\0'; + cmdCtx->inputCmd.cursor = 0; + ConsolePuts("\n$ "); +} + +/** + * @brief Parse the arrow keys in the command. + * @param ch : Characters entered + * @param dirKeyLen : Arrow key flag + * @retval end character or non-direction character entered + */ +static char CmdDirectionKey(char ch, unsigned char *dirKeyLen) +{ + char c = '\0'; + DirMapRes dirMap[5] = { + /* Dir chd have 5 */ + {'D', CTL_CH('b')}, /* left key, convert to ctrl + b */ + {'C', CTL_CH('f')}, /* right key, convert to ctrl + c */ + {'H', CTL_CH('a')}, /* Home key, convert to ctrl + a */ + {'A', CTL_CH('p')}, /* up arrow, convert to ctrl + p */ + {'B', CTL_CH('n')} /* down arrow, convert to ctrl + n */ + }; + + if (*dirKeyLen == 0) { + if (ch == DIR_KEY_HEAD) { + *dirKeyLen = 1; + return c; + } + return ch; + } + + if (*dirKeyLen == 1) { + *dirKeyLen = (ch == '[') ? 2 : 0; /* 2 is directionKeyLen */ + return c; + } + + /* handle the third char sended by direction key */ + for (unsigned char i = 0; i < sizeof(dirMap) / sizeof(DirMapRes); i++) { + if (ch == dirMap[i].ch) { + c = dirMap[i].c; + break; + } + } + *dirKeyLen = 0; + return c; +} + +/** + * @brief tabkey alignment implementation + * @param res : Entered string + * @param inputCmd : Entering command information + * @retval None + */ +static void CompletesTabKey(const char *res, struct CmdInput *inputCmd) +{ + if (res == NULL || inputCmd == NULL) { + APP_CMD_ERR_PRINT("param err\n"); + return; + } + /* Obtains the array length */ + size_t len = strlen(res); + + while (len > inputCmd->cursor && inputCmd->cursor < CMD_BUF_MAX) { + /* Output Characters */ + ConsolePutc(res[inputCmd->cursor]); + + inputCmd->buf[inputCmd->cursor] = res[inputCmd->cursor]; + inputCmd->cursor++; + } +} + +/** + * @brief tabkey alignment implementation + * @param inputCmd : Entering command information + * @retval None + */ +static void CmdTabKey(struct CmdCtx *cmdCtx) +{ + const char* res[MATCH_CMD_BUF_CNT] = { NULL }; + /* Numeric element initialization */ + unsigned char findCnt = 0; + unsigned char cycle = 0; + unsigned int tailId = 0; + unsigned char searchFinish = EXT_TRUE; + + cmdCtx->inputCmd.buf[cmdCtx->inputCmd.cursor] = '\0'; + while (EXT_TRUE) { + /* The printing is performed cyclically until the tabkey detection is complete */ + searchFinish = ExtCmdFindMatchCmd(cmdCtx->inputCmd.buf, res, MATCH_CMD_BUF_CNT, &findCnt, &tailId); + cycle++; + if (searchFinish && cycle ==1) { + if (findCnt) { + CompletesTabKey(res[0], &(cmdCtx->inputCmd)); + } + break; + } + /* Print newline key after end */ + if (cycle == 1) { + EXT_PRINT("\n"); + } + /* cyclic print characters */ + for (unsigned char i = 0; i < findCnt; i++) { + EXT_PRINT("%s ", res[i]); + } + EXT_PRINT("\n"); + if (searchFinish) { + EXT_PRINT("$"); + EXT_PRINT("%s", cmdCtx->inputCmd.buf); + break; + } + /* Clear the count value */ + findCnt = 0; + } +} + +/** + * @brief tabkey alignment implementation + * @param inputCmd : Entering command information + * @param cmdBuf ;Command storage array + * @param cmdLog : Address for storing printed log information + * @retval None + */ +static void CmdEnterKey(struct CmdCtx *cmdCtx) +{ + if (cmdCtx->inputCmd.cursor == 0) { + ConsolePuts("\n$ "); + return; + } + + if (memcpy_s(cmdCtx->cmdBuf, CMD_BUF_MAX, cmdCtx->inputCmd.buf, cmdCtx->inputCmd.cursor) != EXT_SUCCESS) { + ConsolePuts("\n$ "); /* Add the end character */ + return; + } + cmdCtx->cmdBuf[cmdCtx->inputCmd.cursor] = '\0'; + + if (RecordCmd(cmdCtx->cmdBuf, &(cmdCtx->cmdLog)) != EXT_SUCCESS) { + ConsolePuts("\n$ "); /* Add the end character */ + return; + } + CleanInputCmd(cmdCtx); +} + +/** + * @brief Setting the log level + * @param None + * @retval Returns the value of the character's ASCII code + */ +static int CmdStrSetLevel(void) +{ + int ret; + for (unsigned char i = 0; i < EXT_MODULE_BUTT; i++) { + /* Setting the log level cyclically */ + ret = ExtDrvLogSetLogLevel(i, EXT_LOG_LEVEL_FATAL); + if (ret != EXT_SUCCESS) { + break; + } + } + return ret; +} + +typedef struct { + unsigned int ulEventBit; + void (*Func)(struct CmdCtx *cmdCtx); +} EventDoWithTable_t; +static const EventDoWithTable_t astDoWithTable[] = { + { CTL_CH_C, CleanInputCmd}, + { TAB_KEY, CmdTabKey}, /* detrct the tab key */ + { ENTER_KEY1, CmdEnterKey}, /* detected '\r' */ + { ENTER_KEY2, CmdEnterKey}, /* detected '\n' */ + { CTL_CH_P, OutputLogCmd}, + { CTL_CH_N, OutputLogCmd} +}; +/** + * @brief Parse characters one by one + * @param cmdCtx : string information + * @retval Returns the value of the character's ASCII code + */ +static int GetCmdStr(struct CmdCtx *cmdCtx) +{ + int ret = EXT_SUCCESS; + char c; + /* Query the status of the serial port register */ + while ((cmdCtx->uartRxch = ConsoleGetc()) != 0) { + if (cmdCtx->inputCmd.cursor >= CMD_BUF_MAX) { + APP_CMD_ERR_PRINT("\ncmd overflow\n"); + /* Clear Character Cache */ + CleanInputCmd(cmdCtx); + return EXT_FAILURE; + } + /* Get cmd direct key word */ + c = CmdDirectionKey(cmdCtx->uartRxch, &cmdCtx->dirKeyLen); + if (IgnoreCmdKey(c)) { + return ret; + } + /* Delete cmd key word */ + if (DeleteCmdKey(c)) { + CmdDeleteTailChar(&cmdCtx->inputCmd); + return ret; + } + /* Invoke the function drive table */ + for (unsigned int i = 0 ; i < (unsigned int)sizeof(astDoWithTable)/sizeof(astDoWithTable[0]); i ++) { + if ((unsigned int)c == astDoWithTable[i].ulEventBit) { + astDoWithTable[i].Func(cmdCtx); + return ret; + } + } + /* Setting the log level */ + if (c == CTL_CH('l')) { + ret = CmdStrSetLevel(); + return ret; + } + /* Add key word to tail */ + CmdAddTailChar(&cmdCtx->inputCmd, c); + } + return ret; +} + +/** + * @brief encapsulation of Serial Port Transmission + * @param None + * @retval None + */ +void ExtAppCmdProcess(void) +{ + int ret; + unsigned int argsNum; + struct cmdRegisterTable *cmd; + /* Initialize the structure */ + struct CmdCtx *cmdCtx = AppCmdGetCtx(); + ret = GetCmdStr(cmdCtx); + if ((ret != EXT_SUCCESS) || (cmdCtx->cmdBuf[0] == '\0')) { + return; + } + argsNum = CmdParserParam(cmdCtx->cmdBuf, cmdCtx->argv); + if (argsNum == 0) { + /* Clear the memory in the structure */ + (void)memset_s(&cmdCtx->inputCmd, sizeof(cmdCtx->inputCmd), 0, sizeof(cmdCtx->inputCmd)); + (void)memset_s(&cmdCtx->cmdBuf, sizeof(cmdCtx->cmdBuf), 0, sizeof(cmdCtx->cmdBuf)); + return; + } + cmd = ExtCmdFindCmd(cmdCtx->argv[0]); + if (cmd == NULL || cmd->func == NULL) { + /* Initialization Structure */ + (void)memset_s(&cmdCtx->inputCmd, sizeof(cmdCtx->inputCmd), 0, sizeof(cmdCtx->inputCmd)); + (void)memset_s(&cmdCtx->cmdBuf, sizeof(cmdCtx->cmdBuf), 0, sizeof(cmdCtx->cmdBuf)); + return; + } + cmd->func(argsNum, cmdCtx->argv); + EXT_PRINT("\n$ "); + /* Initialization Structure */ + (void)memset_s(&cmdCtx->inputCmd, sizeof(cmdCtx->inputCmd), 0, sizeof(cmdCtx->inputCmd)); + (void)memset_s(&cmdCtx->cmdBuf, sizeof(cmdCtx->cmdBuf), 0, sizeof(cmdCtx->cmdBuf)); +} diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/cmd.c b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/cmd.c new file mode 100644 index 000000000..06a08d9c9 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/cmd.c @@ -0,0 +1,56 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file cmd.c + * @author MCU Driver Team + * @brief cmd module driver + * @details The header file contains the following declaration: + * + basic register information assignment + */ +#include "cmd.h" +#include "console.h" +#include "ext_log.h" +struct cmdRegisterTable g_cmdRegister[CMD_REGESTER_MAX_NUM] = {0}; + +int g_cmdIndex = 0; + +/** + * @brief assign a value to the information in the RX register. + * @param None + * @retval the information in the RX register. + */ +struct cmdRegisterTable *GetRegisterAddr(void) +{ + return g_cmdRegister; +} + +/** + * @brief Registering a User-Defined Function + * @param cmdName : customize a name for the implemented function. + * @param func : pointer to the customized function. + * @retval None + */ +void ExtCmdRegister(char *cmdName, pfncmd func) +{ + if (g_cmdIndex >= CMD_REGESTER_MAX_NUM || g_cmdIndex < 0) { + EXT_PRINT("the number of registration commmamds has reached the maximum\n"); + return; + } + g_cmdRegister[g_cmdIndex].name = cmdName; /* enter the user-defined name */ + g_cmdRegister[g_cmdIndex].func = func; /* pointing a function pointer to a user-defined function */ + g_cmdIndex++; +} diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/cmd_common.c b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/cmd_common.c new file mode 100644 index 000000000..b20ef5e77 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/cmd_common.c @@ -0,0 +1,67 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file cmd_common.c + * @author MCU Driver Team + * @brief cmd module driver + * @details The header file contains the following declaration: + * + total invoking of entry parameter parsing + */ +#include "cmd_common.h" + +/** + * @brief invoking of entry parameter parsing + * @param cdmStr : single character from user + * @param argv[] : Character string directly entered through the serial port + * @retval pointer address of the string + */ +unsigned int CmdParserParam(char *cmdStr, const char *argv[]) +{ + unsigned int nargs = 0; + + while (nargs < ARGS_NUM_MAX) { + /* skip any white space */ + while ((*cmdStr == ' ') || (*cmdStr == '\t')) { + ++cmdStr; + } + + /* end of line, no more args */ + if (*cmdStr == '\0') { + argv[nargs] = NULL; + return (nargs); + } + + /* begin of argument string */ + argv[nargs++] = cmdStr; + + /* find end of string */ + while ((*cmdStr != '\0') && (*cmdStr != ' ') && (*cmdStr != '\t')) { + ++cmdStr; + } + + /* end of line, no more args */ + if (*cmdStr == '\0') { + argv[nargs] = NULL; + return (nargs); + } + + /* terminate current arg */ + *cmdStr++ = '\0'; + } + return nargs; +} + diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/config.c b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/config.c new file mode 100644 index 000000000..2cdb30cdd --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/config.c @@ -0,0 +1,143 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file config.c + * @author MCU Driver Team + * @brief config module driver + * @details The header file contains the following declaration: + * + Miniaturized logs are written based on addresses. + * + Abnormal event reporting + */ +#include +#include "config.h" +#include "common.h" +#include "console.h" +#include "type.h" +#include "string.h" +#include "securec.h" + +/** + * @brief read information by address + * @param add : register address of the information to be read + * @param value : storage array of read information + * @param len : length of the information to be read + * @retval None. + */ +void ExtLoadRead(uintptr_t add, char *value, int len) +{ + /* Check whether the address is out of range */ + if (add > REGISTER_END || add < REGISTER_START) { + EXT_PRINT("The address is out of range"); + return; + } + /* check param vaild */ + if (value == NULL) { + EXT_PRINT("read data is null, please check value\n"); + return; + } + /* Read information cyclically */ + for (int i = 0; i < len; i++) { + *(value + i) = *(volatile char *)(add + i); + } +} + +/** + * @brief write information by address + * @param add : register address of the information to write + * @param value : storage array of write information + * @param len : length of the information to write + * @retval None. + */ +void ExtLoadWrite(uintptr_t add, const char *value, int len) +{ + /* Check whether the address is out of range */ + if (add > REGISTER_END || add < REGISTER_START) { + EXT_PRINT("The address is out of range"); + return; + } + /* check param vaild */ + if (value == NULL) { + EXT_PRINT("write data is null, please check value\n"); + return; + } + /* Write information cyclically */ + for (int i = 0; i < len; i++) { + *(volatile char *)(add + i) = *(value + i); + } +} + +char g_dataItem[DATA_ITEM_NUM_MAX][DATA_ITEM_MAX_LEN]; + +/** + * @brief read information by config + * @param item : event that starts to read data + * @param value : storage array of read information + * @param len : length of the information to be read + * @retval None. + */ +void ExtConfigRead(enum DataItem item, char *value, int len) +{ + /* Exceeded the maximum scenario value */ + if (item > DATA_ITEM_NUM_MAX) { + EXT_PRINT("The config has exceeded max vaule"); + return; + } + /* check param vaild */ + if (len >= DATA_ITEM_MAX_LEN) { + EXT_PRINT("The length of the read data exceeds 256\n"); + return; + } + if (value == NULL) { + EXT_PRINT("The read content is empty, read err"); + return; + } + /* Reads the data stored in the register */ + if (memcpy_s(value, len, &g_dataItem[item], len) != EXT_SUCCESS) { + EXT_PRINT("config read memcpy failed"); + } + return; +} + +/** + * @brief write information by config + * @param add : register address of the information to write + * @param value : storage array of write information + * @param len : length of the information to write + * @retval None. + */ +void ExtConfigWrite(enum DataItem item, const char *value, int len) +{ + /* Exceeded the maximum scenario value */ + if (item > DATA_ITEM_NUM_MAX) { + EXT_PRINT("The config has exceeded max vaule"); + return; + } + /* check param vaild */ + if (len >= DATA_ITEM_MAX_LEN) { + EXT_PRINT("The length of the write data exceeds 256\n"); + return; + } + if (value == NULL) { + EXT_PRINT("The written content is empty, write err"); + return; + } + /* Writes data to a register for storage */ + if (memcpy_s(&g_dataItem[item], DATA_ITEM_MAX_LEN, value, len) != EXT_SUCCESS) { + EXT_PRINT("config write memcpy failed"); + } + return; +} diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/console.c b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/console.c new file mode 100644 index 000000000..2c31c2488 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/console.c @@ -0,0 +1,442 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file console.c + * @author MCU Driver Team + * @brief console module driver + * @details The header file contains the following declaration: + * + GPIO configuration enums. + * + GPIO register structures. + * + GPIO DCL Functions. + * + Parameters check functions. + */ +#include "console.h" +#include "errno.h" +#include "ext_log.h" +#include "dfx_log.h" +#define UART_READ_TIME_MS 1000 + +#define VA_START(v, l) __builtin_va_start(v, l) +#define VA_ARG(v, l) __builtin_va_arg(v, l) +#define VA_END(v) __builtin_va_end(v) + +#define DECIMAL_BASE 10U /* Cardinality of decimal numbers */ +#define HALF_ADJUST_BOUNDARY 5U /* The boundary for rounding the floating number */ +#define MAX_DIV_TIMES 31U + +typedef __builtin_va_list va_list; + +/* defines the number of output numbers */ +typedef enum { + BINARY = 2U, + OCTAL = 8U, + DECIMAL = 10U, + HEXADECIMAL = 16U, +} NumBase; +UART_Handle g_console_uart; + +/** + * @brief query the status of a serial port reading register + * @param uartHandle: indicates the serial port information corresponding to the value assignment + * @param isEmpty: pointer to the array that stores status information + * @retval whether data is received + */ +static BASE_StatusType QueryUartRxStatus(UART_Handle *uartHandle, unsigned char *isEmpty) +{ + *isEmpty = uartHandle->baseAddress->UART_FR.BIT.rxfe; /* read register status address */ + return BASE_STATUS_OK; +} + +/** + * @brief Single Character Output + * @param c: single character to be output + * @retval None + */ +void ConsolePutc(const char c) +{ + unsigned int length = 1; + unsigned char p; + /* add newline characters for standby */ + p = (unsigned char)c; + if (c == '\n') { + p = '\r'; + HAL_UART_WriteBlocking(&g_console_uart, &p, length, UART_READ_TIME_MS); + p = '\n'; + } + HAL_UART_WriteBlocking(&g_console_uart, &p, length, UART_READ_TIME_MS); +} + +/** + * @brief output the entire string. + * @param str: string to be output. + * @retval None + */ +int ConsolePuts(const char *str) +{ + int cnt = 0; + /* decompose a string into a single character output */ + while (*str != '\0') { + ConsolePutc(*str); + str++; + cnt++; + } + return cnt; +} + +/** + * @brief Read a single character + * @param None + * @retval ASCII value of the read character + */ +int ConsoleGetc(void) +{ + unsigned char rxStr; + unsigned int length = 1; + int ret; + + /* reads a single character from the serial port */ + ret = HAL_UART_ReadBlocking(&g_console_uart, &rxStr, length, UART_READ_TIME_MS); + if (ret == EXT_SUCCESS) { + return (int)rxStr; + } else { + return -1; + } +} + +/** + * @brief reads the register reception status + * @param None + * @retval register Status + */ +int ConsoleGetQuery(void) +{ + unsigned char isEmpty; + + QueryUartRxStatus(&g_console_uart, &isEmpty); + return !(isEmpty); +} + +/** + * @brief reads the pointer coordinates of the register. + * @param base: pointer initial address value. + * @param exponent: number of times the pointer needs to be moved + * @retval pointer coordinate value + */ +static unsigned long DBG_Pow(unsigned int base, unsigned int exponent) +{ + unsigned long ret = 1; + while (exponent--) { + ret *= base; + } + return ret; /* ret = base ^ exponent */ +} + +/** + * @brief calculate the number of digits entered + * @param num: numbers to be calculated + * @param base: number of digits entered + * @retval number of digits of the calculated number + */ +static unsigned int DBG_CountDigits(int num, NumBase base) +{ + unsigned int cnt = 0; + if (base == 0) { + return 0; + } + /* Cyclic Conversion Count */ + while (num != 0) { + cnt++; + if (cnt > MAX_DIV_TIMES) { + break; + } + num /= base; + } + /* Returns the number of digits */ + return cnt; +} + +/** + * @brief Output unsigned digits + * @param num: numbers to be output + * @param base: number of digits entered + * @param digits: number of digits output + * @retval None + */ +static void DBG_PutUnsignedNum(unsigned int num, NumBase base, unsigned int digits) +{ + unsigned char ch; + while (digits != 0) { + ch = num / DBG_Pow(base, digits - 1); + num %= DBG_Pow(base, digits - 1); + if (base == DECIMAL) { + ConsolePutc(ch + '0'); /* characters that convert numbers to decimal numbers */ + } else if (base == HEXADECIMAL) { + if (ch < DECIMAL_BASE) { + ConsolePutc(ch + '0'); /* Character that converts a number to a hexadecimal number */ + } else { + ConsolePutc(ch - DECIMAL_BASE + 'A'); + } + } + digits--; + } +} + +/** + * @brief print Numbers + * @param intNum: numbers to be output + * @retval returns the number of digits of the output number + */ +static unsigned int DBG_PrintInt(int intNum) +{ + unsigned int cnt; + if (intNum == 0) { + ConsolePutc('0'); /* add '0' */ + return 1; + } + if (intNum < 0) { + ConsolePutc('-'); /* need to manually add a negative sign */ + intNum = -intNum; + } + /* Calculate the number of digits */ + cnt = DBG_CountDigits(intNum, DECIMAL); + DBG_PutUnsignedNum(intNum, DECIMAL, cnt); + return cnt; +} + +/** + * @brief print hexadecimal digits + * @param hexNum: numbers to be output + * @retval returns the number of digits of the output number + */ +static unsigned int DBG_PrintHex(unsigned int hexNum) +{ + unsigned int cnt; + if (hexNum == 0) { + ConsolePutc('0'); /* add '0' */ + return 1; + } + /* Calculate the number of hexadecimal digits */ + cnt = DBG_CountDigits(hexNum, HEXADECIMAL); + DBG_PutUnsignedNum(hexNum, HEXADECIMAL, cnt); + return cnt; +} + +/** + * @brief Print Single Precision Decimals + * @param fltNum: numbers to be output + * @param precision: number of decimal places to print + * @retval returns the number of digits of the output number + */ +static unsigned int DBG_PrintFlt(float fltNum, unsigned int precision) +{ + unsigned int cnt = 0; + unsigned int floatScale; + + if (fltNum < 0) { + ConsolePutc('-'); + cnt += 1; + fltNum = -fltNum; + } + int integerVal = (int)fltNum; + floatScale = DBG_Pow(10, (precision + 1)); /* 10: decimal */ + int floatVal = (long)(floatScale * (fltNum - integerVal)); + /* Half-adjust: round up or round down */ + if (floatVal % DECIMAL_BASE >= HALF_ADJUST_BOUNDARY) { + floatVal = floatVal / DECIMAL_BASE + 1; + } else { + floatVal = floatVal / DECIMAL_BASE; + } + cnt += DBG_PrintInt(integerVal); + ConsolePutc('.'); + cnt += 1; + /* Pad 0 in float part */ + unsigned int fltCnt = DBG_CountDigits(floatVal, DECIMAL); + if (precision > fltCnt) { + for (unsigned int i = 0; i < precision - fltCnt; i++) { + ConsolePutc('0'); /* add '0' */ + } + } + DBG_PutUnsignedNum(floatVal, DECIMAL, fltCnt); /* print unsigned number */ + cnt += precision; + return cnt; +} + +/** + * @brief Resolving Special Characters + * @param ch: single character to be parsed + * @param *paramList: elements that implement parsing + * @retval returns the number of digits of the output number + */ +static unsigned int ParseSpecifier(const char ch, va_list *paramList) +{ + /* Value Definition Initialization */ + unsigned int cnt = 0; + unsigned int tmpCnt; + char chVal = 0; + const char *strVal = 0; + int intVal = 0; + unsigned int unsignedVal = 0; + unsigned int hexVal = 0; + float fltVal = 0; + switch (ch) { + case 'c': + chVal = VA_ARG(*paramList, int); /* Use type int because of byte alignment */ + ConsolePutc(chVal); + cnt += 1; + break; + case 's': + /* received 's', print the string */ + strVal = VA_ARG(*paramList, const char *); + cnt += ConsolePuts(strVal); + break; + case 'd': + /* Received character'd', print initialization */ + intVal = VA_ARG(*paramList, int); + cnt += DBG_PrintInt(intVal); + break; + case 'u': + unsignedVal = VA_ARG(*paramList, unsigned int); + tmpCnt = DBG_CountDigits(unsignedVal, DECIMAL); + DBG_PutUnsignedNum(unsignedVal, DECIMAL, tmpCnt); + cnt += tmpCnt; + break; + case 'x': + case 'X': + case 'p': + /* Received'p' and returned hexadecimal number */ + hexVal = VA_ARG(*paramList, unsigned int); + cnt += DBG_PrintHex(hexVal); + break; + case 'f': + fltVal = VA_ARG(*paramList, double); + cnt += DBG_PrintFlt(fltVal, 5); /* default precision: 5 */ + break; + default: + ConsolePutc(ch); /* Output the original input characters */ + cnt += 1; + break; + } + /* returns the count value */ + return cnt; +} + +/** + * @brief Printed number with width + * @param intNum: Numbers to be printed + * @param *paramList: Number of digits to be printed + * @retval returns the number of digits of the output number + */ +static unsigned int DBG_PrintIntWithField(int intNum, int fieldWidth) +{ + int zeroCnt = 0; + int digitsCnt = 0; + unsigned int cnt = 0; + + if (intNum == 0) { + ConsolePutc('0'); + return 1; + } + if (intNum < 0) { + ConsolePutc('-'); /* add symbol */ + cnt++; + intNum = -intNum; + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + zeroCnt = fieldWidth - digitsCnt; + for (int i = 0; i < zeroCnt; i++) { + ConsolePutc('0'); /* add '0' */ + cnt++; + } + cnt += digitsCnt; + } else { + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + cnt = digitsCnt; + zeroCnt = fieldWidth - digitsCnt; + for (int i = 0; i < zeroCnt; i++) { + ConsolePutc('0'); /* add '0' */ + cnt++; + } + } + DBG_PutUnsignedNum(intNum, DECIMAL, digitsCnt); + return cnt; +} + +/** + * @brief Convert a numeric string to a number + * @param **s: Number string to be converted + * @retval Number after conversion + */ +static int DBG_Atoi(const char **s) +{ + int i, c; + + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + i = i * 10 + c - '0'; /* 10: decimal */ + } + return i; +} + +/** + * @brief Print the entry parameters + * @param *format: thing need to print + * @retval returns the number of digits of the output number + */ +int UartPrintf(const char *format, ...) +{ + /* Define Value Initialization */ + int cnt = 0; + int fieldWidth = 0; + int floatPrecision = 0; + float fltVal = 0; + int intVal = 0; + va_list paramList; + VA_START(paramList, format); + + while (*format != '\0') { + if (*format != '%') { + /* received '%', print characters directly */ + ConsolePutc(*format); + cnt += 1; + } else { + format++; + /* Check whether the value is an integer */ + if (*format == '0') { + format++; + fieldWidth = DBG_Atoi(&format); + intVal = VA_ARG(paramList, int); + cnt += DBG_PrintIntWithField(intVal, fieldWidth); + } else if (*format == '.') { + format++; + floatPrecision = DBG_Atoi(&format); /* Convert to Integer */ + fltVal = VA_ARG(paramList, double); + cnt += DBG_PrintFlt(fltVal, floatPrecision); + } else { + cnt += ParseSpecifier(*format, ¶mList); + } + } + format++; + } + VA_END(paramList); + /* Returns the value of count */ + return cnt; +} + +/* init console uart */ +void ConsoleInit(UART_Handle uart) +{ + g_console_uart = uart; + DfxCmdRegister(); +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/dfx_debug.c b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/dfx_debug.c new file mode 100644 index 000000000..3084eb4c3 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/dfx_debug.c @@ -0,0 +1,43 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file dfx_debug.c + * @author MCU Driver Team + * @brief debug module driver + * @details The header file contains the following declaration: + * + Setting the Debug Mode + */ +#include "dfx_debug.h" +#include "cmd.h" +#include "console.h" +#include "dfx_log.h" + +/** + * @brief Enables or disables the debug mode. + * @param mode: Status to be set + * @retval None. + */ +void ExtSetDebugMode(enum ExtDebugMode mode) +{ + struct SysDebugSwitch *debugSwitch = GetDebugSwitch(); + if (mode == RUNNING) { + debugSwitch->enable = 0; /* 0 indicates that the debug mode is disabled */ + return; + } + debugSwitch->enable = 1; /* not 0 indicates that the debug mode is enabled */ + return; +} diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/dfx_log.c b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/dfx_log.c new file mode 100644 index 000000000..b0cba421d --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/dfx_log.c @@ -0,0 +1,468 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file dfx_log.c + * @author MCU Driver Team + * @brief dfx_log module driver + * @details The header file contains the following declaration: + * + Small-scale log output + * + Miniaturized log output with different numbers of int types + */ +#include +#include "string.h" +#include "stdarg.h" +#include "type.h" +#include "dfx_log.h" +#include "common.h" +#include "log.h" +#include "ext_log.h" +#include "securec.h" + +#define EXT_DEFAULT_LOG_LEVEL EXT_LOG_LEVEL_ERROR +#define THIS_FILE_ID FILE_ID_LOG_C +static struct MemoryLog g_memoryLog = {0}; +#define DIVISOR 10 +#define EXT_MODULE_DFX 12 /* Test Version Information Cases */ +/* Address of the test case for obtaining version information */ +#define VERSION_INFO_ADDR 0x4000000 +/* Device Name */ +char *moduleStr[EXT_MODULE_BUTT] = { + "app_main", + "app_console", + "app_chip", + "drv_base", + "drv_chips", + "drv_crg", + "drv_gpio", + "drv_i2c", + "drv_irq", + "drv_pinctrl", + "drv_timer", + "drv_uart", + "dfx", +}; +/* Levels that can be set */ +char *ExtLogLevel1[6] = { + "EXT_LOG_LEVEL_FATAL", + "EXT_LOG_LEVEL_ERROR", + "EXT_LOG_LEVEL_WARNING", + "EXT_LOG_LEVEL_INFO", + "EXT_LOG_LEVEL_DBG", + "EXT_LOG_LEVEL_BUTT", +}; +struct SysLogCtx g_logCtx = { 0 }; +/** + * @defgroup log Common + * @brief Initialize miniaturization log information. + * @{ + */ +struct SysLogCtx *GetLogCtx(void) +{ + return &g_logCtx; +} +static struct SysDebugSwitch g_debugSwitch = {.enable = 1}; +struct SysDebugSwitch *GetDebugSwitch(void) +{ + /* Return Enable Initialization */ + return &g_debugSwitch; +} +/** + * @brief Initialize register information. + * @param memData: Register structure variable + * @retval None. + */ +void InitMemoryData(struct MemoryLog *memData) +{ + memData->enable = EXT_TRUE; + memData->logLen = 0; + memData->writePos = 0; +} + +/** + * @brief Obtains the value of register information. + * @param None. + * @retval memory address + */ +struct MemoryLog *GetMemoryData(void) +{ + return &g_memoryLog; +} + +/** + * @brief Initialize the environment information for miniaturization logs. + * @param ctx: Environment information of miniaturized logs + * @retval None. + */ +void LogCtxInit(struct SysLogCtx *ctx) +{ + ctx->modStr = moduleStr; + for (unsigned char i = 0; i < EXT_MODULE_BUTT; i++) { + ctx->logLevel[i] = EXT_DEFAULT_LOG_LEVEL; + } + ctx->init = EXT_TRUE; +} + +/** + * @brief Write the log to the memory. + * @param *memlog: memory address + * @param src: Stored Information + * @param cnt: Length of the stored information + * @retval None. + */ +static void PutLogToMem(struct MemoryLog *memLog, const char *src, unsigned char cnt) +{ + unsigned char len = cnt; /* default mem write pos < LOG_MEM_POOL_MAX_LEN - cnt */ + + if (cnt > LOG_MEM_POOL_MAX_LEN - memLog->writePos) { + len = LOG_MEM_POOL_MAX_LEN - memLog->writePos; + /* put log data to buf */ + if (memcpy_s(memLog->mmzBuf + memLog->writePos, LOG_MEM_POOL_MAX_LEN - memLog->writePos, src, len) != + EXT_SUCCESS) { + EXT_PRINT("put log to memory memcpy err\n"); + return; + } + /* if the data is full, the position pointer returns to the origin. */ + memLog->writePos = 0; + src += len; + len = cnt - len; + } + /* if the data is full, cyclic write log data */ + if (memcpy_s(memLog->mmzBuf + memLog->writePos, LOG_MEM_POOL_MAX_LEN - memLog->writePos, src, len) != EXT_SUCCESS) { + EXT_PRINT("put log to memory memcpy err\n"); + return; + } + + /* The pointer position is increased by the write length */ + memLog->writePos += len; + memLog->logLen += cnt; + if (memLog->logLen > LOG_MEM_POOL_MAX_LEN) { + memLog->logLen = LOG_MEM_POOL_MAX_LEN; + } +} + +/** + * @brief Calculates the length of an int number converted to a character string. + * @param num: number to calculate. + * @retval Length after being converted to a character string. + */ +static int CountNumberLen(unsigned int num) +{ + int count = 0; + do { + count += 1; + num = num/DIVISOR; + } while (num != 0); /* divided by 10 to round */ + return count; +} + +/** + * @brief Check whether the log output is proper. + * @param level: Specifies the log level. + * @param debugSwitch: Pointer to the debug mode + * @param modId: Device ID + * @param ctx Pointer to storing log information + * @retval Indicates whether the printing is successful. + */ +static unsigned int IsLogOutBufLegal(enum ExtLogLevel level, struct SysDebugSwitch *debugSwitch, + enum ExtModule modId, struct SysLogCtx *ctx) +{ + /* Check whether the value is out of range */ + if (level > EXT_LOG_LEVEL_BUTT || modId > EXT_MODULE_BUTT) + return EXT_FAILURE; + /* Checking the Status of debug */ + if (((!debugSwitch->enable) && (level != EXT_LOG_LEVEL_ERROR)) || (level > ctx->logLevel[modId])) { + return EXT_SUCCESS; + } + return EXT_FAILURE; +} + +/** + * @brief Log output and printing + * @param level: Specifies the log level. + * @param modId: Device ID + * @param id: device name + * @param logBuf: Character string information to be printed + * @param logBuflen: Indicates the length of the printed information. + * @retval Indicates whether the printing is successful. + */ +int ExtDrvLogOutBuf(enum ExtLogLevel level, enum ExtModule modId, unsigned int id, const unsigned int* logBuf, + unsigned short logBufLen) +{ + /* Check whether the array is empty */ + if (logBuf == NULL) + return EXT_FAILURE; + /* Value Definition Initialization */ + char buf[LOG_UINT_MAX_LEN] = { 0 }; + int cnt = 0; + int len = 0; + int count = 0; + + struct SysLogCtx *ctx = GetLogCtx(); + + struct SysDebugSwitch *debugSwitch = GetDebugSwitch(); + if (!ctx->init) { LogCtxInit(ctx); } /* Initialize the structure */ + if (!(IsLogOutBufLegal(level, debugSwitch, modId, ctx))) { return EXT_SUCCESS; } + cnt = sprintf_s(buf, LOG_UINT_MAX_LEN, "%u", id); + /* an error message is displayed when the return value is a negative value */ + if (cnt < 0) { + EXT_PRINT("sprintf err\n"); + return EXT_FAILURE; + } + len += cnt; + + unsigned short i = 0; + /* Write characters cyclically */ + for (; i < logBufLen; ++i) { + count = CountNumberLen(logBuf[i]); + if ((count + len + 1) >= LOG_UINT_MAX_LEN) { return EXT_FAILURE; } + cnt = sprintf_s(buf + len, LOG_UINT_MAX_LEN - len, " %u", logBuf[i]); + /* an error message is displayed when the return value is a negative value */ + if (cnt < 0) { + EXT_PRINT("sprintf err\n"); + return EXT_FAILURE; + } + len += cnt; + } + cnt = sprintf_s(buf + len, LOG_UINT_MAX_LEN - len, "\n"); + len += cnt; + /* an error message is displayed when the return value is a negative value */ + if (cnt < 0) { + EXT_PRINT("sprintf err\n"); + return EXT_FAILURE; + } else if (!ctx->memLog.enable) { + EXT_PRINT("%s", buf); + return EXT_SUCCESS; + } + + PutLogToMem(&ctx->memLog, buf, len); /* Storing the log information into the memory */ + return EXT_SUCCESS; +} + + +/** + * @brief get version info cmd + * @param None + * @retval Return the setting result, success or failure. + */ +int CmdGetVersionInfo(void) +{ + int versionInfo; + versionInfo = EXT_REG_READ32(VERSION_INFO_ADDR); + /* Print version information */ + ExtLog1(ERR, EXT_MODULE_DFX, "version info is : %x\n", versionInfo); + return EXT_SUCCESS; +} +/** + * @brief Processing log buffer + * @param len: Length of the processed data. + * @param level: Specifies the log level. + * @param modId: Device ID + * @param buf: Log information to be processed. + * @retval Indicates whether the printing is successful. + */ +static int DealLogBuf(int len, enum ExtLogLevel level, enum ExtModule modId, const char buf[]) +{ + struct SysLogCtx *ctx = GetLogCtx(); + struct SysDebugSwitch *debugSwitch = GetDebugSwitch(); + /* Checking the Status of debug */ + if (!debugSwitch->enable) { + if (level != EXT_LOG_LEVEL_ERROR) { + return EXT_SUCCESS; + } + } + + if (!ctx->init) { LogCtxInit(ctx); } /* Initialize the structure */ + + if (level > ctx->logLevel[modId]) { return EXT_SUCCESS; } + /* If the length is negative, an error value is returned */ + if (len < 0) { + EXT_PRINT("sprintf err\n"); + return EXT_FAILURE; + } + + if (!ctx->memLog.enable) { + EXT_PRINT("%s", buf); + return EXT_SUCCESS; + } + + PutLogToMem(&ctx->memLog, buf, len); /* Storing the log information into the memory */ + return EXT_SUCCESS; +} + +/** + * @brief Print with no int number + * @param level: Specifies the log level. + * @param modId: Device ID + * @param id: custom string variable + * @retval Indicates whether the printing is successful. + */ +int ExtDrvLogOut0(enum ExtLogLevel level, enum ExtModule modId, unsigned int id) +{ + /* Check whether the value is out of range */ + if (level > EXT_LOG_LEVEL_BUTT || modId > EXT_MODULE_BUTT) + return EXT_FAILURE; + char buf[LOG_UINT_MAX_LEN] = { 0 }; + int len = 0; + len = sprintf_s(buf, LOG_UINT_MAX_LEN, "%u\n", id); + if (len < 0) { + EXT_PRINT("sprintf err\n"); + return EXT_FAILURE; + } + /* Process logs and determine whether to write to memory */ + return (DealLogBuf(len, level, modId, buf)); +} + +/** + * @brief Print with an int number + * @param level: Specifies the log level. + * @param modId: Device ID + * @param id: custom string variable + * @param d0: User-defined first variable of the int type + * @retval Indicates whether the printing is successful. + */ +int ExtDrvLogOut1(enum ExtLogLevel level, enum ExtModule modId, unsigned int id, unsigned int d0) +{ + /* Check whether the value is out of range */ + if (level > EXT_LOG_LEVEL_BUTT || modId > EXT_MODULE_BUTT) + return EXT_FAILURE; + char buf[LOG_UINT_MAX_LEN] = { 0 }; + int len = 0; + len = sprintf_s(buf, LOG_UINT_MAX_LEN, "%u %u\n", id, d0); + if (len < 0) { + EXT_PRINT("sprintf err\n"); + return EXT_FAILURE; + } + /* Process logs and determine whether to write to memory */ + return (DealLogBuf(len, level, modId, buf)); +} + +/** + * @brief Print with two int numbers + * @param level: Specifies the log level. + * @param modId: Device ID + * @param id: custom string variable + * @param d0: User-defined first variable of the int type + * @param d1: User-defined second variable of the int type + * @retval Indicates whether the printing is successful. + */ +int ExtDrvLogOut2(enum ExtLogLevel level, enum ExtModule modId, unsigned int id, unsigned int d0, unsigned int d1) +{ + /* Check whether the value is out of range */ + if (level > EXT_LOG_LEVEL_BUTT || modId > EXT_MODULE_BUTT) + return EXT_FAILURE; + char buf[LOG_UINT_MAX_LEN] = { 0 }; + int len = 0; + len = sprintf_s(buf, LOG_UINT_MAX_LEN, "%u %u %u\n", id, d0, d1); + if (len < 0) { + EXT_PRINT("sprintf err\n"); + return EXT_FAILURE; + } + /* Process logs and determine whether to write to memory */ + return (DealLogBuf(len, level, modId, buf)); +} + +/** + * @brief Print with three int numbers + * @param level: Specifies the log level. + * @param modId: Device ID + * @param id: custom string variable + * @param d0: User-defined first variable of the int type + * @param d1: User-defined second variable of the int type + * @param d2: User-defined third variable of the int type + * @retval Indicates whether the printing is successful. + */ +int ExtDrvLogOut3(enum ExtLogLevel level, enum ExtModule modId, unsigned int id, unsigned int d0, unsigned int d1, + unsigned int d2) +{ + /* Check whether the value is out of range */ + if (level > EXT_LOG_LEVEL_BUTT || modId > EXT_MODULE_BUTT) + return EXT_FAILURE; + char buf[LOG_UINT_MAX_LEN] = { 0 }; + int len = 0; + len = sprintf_s(buf, LOG_UINT_MAX_LEN, "%u %u %u %u\n", id, d0, d1, d2); + if (len < 0) { + EXT_PRINT("sprintf err\n"); + return EXT_FAILURE; + } + /* Process logs and determine whether to write to memory */ + return (DealLogBuf(len, level, modId, buf)); +} + +/** + * @brief Setting the log level + * @param id: Indicates the device ID of the specified level + * @param level: Level set for the device + * @retval Indicates whether the printing is successful + */ +int ExtDrvLogSetLogLevel(enum ExtModule id, enum ExtLogLevel level) +{ + /* Exceeded the maximum value of the storage array */ + if (level >= EXT_LOG_LEVEL_BUTT || id >= EXT_MODULE_BUTT) { + EXT_PRINT("module or level unsupport\n"); + return EXT_FAILURE; + } + + struct SysLogCtx *ctx = GetLogCtx(); + + if (!ctx->init) { + LogCtxInit(ctx); /* Initialize the structure */ + } + ctx->logLevel[id] = level; + return EXT_SUCCESS; +} + +/** + * @brief Logs are output based on different levels + * @param level: Pre-set level + * @param id: Indicates the device ID of the output log + * @param fmt: character string to be output + * @retval Indicates whether the printing is successful + */ +int ExtDrvLogOutFmt(enum ExtLogLevel level, enum ExtModule id, const char *fmt, ...) +{ + /* define value initialization */ + va_list args; + + struct SysDebugSwitch *debugSwitch = GetDebugSwitch(); + if ((!debugSwitch->enable) && (level != EXT_LOG_LEVEL_ERROR)) { + return EXT_SUCCESS; + } + + /* Outputs character strings by level and ID */ + if (level >= EXT_LOG_LEVEL_BUTT || id >= EXT_MODULE_BUTT) { + EXT_PRINT("level %d or module %d err\n", level, id); + return EXT_FAILURE; + } + + char *tag = "FEWIDB"; + struct SysLogCtx *ctx = GetLogCtx(); + + if (!ctx->init) { + LogCtxInit(ctx); /* Initialize the structure */ + } + + if (level > ctx->logLevel[id]) { + return EXT_SUCCESS; + } + EXT_PRINT("%c-%s:", *(tag + level), ctx->modStr[id]); /* Calculate the print length */ + + va_start(args, fmt); + EXT_PRINT(fmt, args); + va_end(args); + EXT_PRINT("\r\n"); + return EXT_SUCCESS; +} diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/dfx_log_proc.c b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/dfx_log_proc.c new file mode 100644 index 000000000..03e80edc1 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/dfx_log_proc.c @@ -0,0 +1,195 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file gpio_ip.h + * @author MCU Driver Team + * @brief GPIO module driver + * @details The header file contains the following declaration: + * + GPIO configuration enums. + * + GPIO register structures. + * + GPIO DCL Functions. + * + Parameters check functions. + */ +#include +#include +#include "command.h" +#include "dfx_log.h" +#include "log.h" +#include "console.h" +#include "type.h" + +/** + * @brief show the log information. + * @param None + * @retval return whether the display is successful + */ +static int DrvLogShowLogLevel(void) +{ + struct SysLogCtx *ctx = GetLogCtx(); + + if (!ctx->init) { + LogCtxInit(ctx); /* Initialize the structure */ + } + + EXT_PRINT("\n"); + EXT_PRINT("\t ------- module log level -------\n"); /* Delimiter Display Title */ + struct SysDebugSwitch *debugSwitch = GetDebugSwitch(); + if (!debugSwitch->enable) { + EXT_PRINT("The debug mode is disabled, and only err-level information is output\n"); + } + EXT_PRINT("\n"); + EXT_PRINT("ModuleName ModuleId LogLevel\n"); + /* Displays log information line by line in sequence */ + for (unsigned char i = 0; i < EXT_MODULE_BUTT; i++) { + EXT_PRINT("%s\t", ctx->modStr[i]); + EXT_PRINT("%d\t", i); + EXT_PRINT("%d", ctx->logLevel[i]); + EXT_PRINT("\n"); + } + return EXT_SUCCESS; +} + +/** + * @brief write log to memory + * @param enable: Enables log writing to the memory + * @retval return whether the display is successful + */ +static int DrvLogPutLogToMem(unsigned char enable) +{ + if (enable != EXT_TRUE && enable != EXT_FALSE) { + EXT_PRINT("param err\n"); + return EXT_FAILURE; + } + + struct SysLogCtx *ctx = GetLogCtx(); + if (!ctx->init) { + LogCtxInit(ctx); /* Initialize the structure */ + } + /* Flag bit 1 to start writing */ + if (enable) { + ctx->memLog.enable = EXT_TRUE; + EXT_PRINT("log put memory:0x%x enable\n", ctx->memLog.mmzBuf); + } else { + ctx->memLog.enable = EXT_FALSE; + EXT_PRINT("log put memory disable\n"); + } + + /* Initialize Pointer */ + ctx->memLog.writePos = 0; + ctx->memLog.logLen = 0; + return EXT_SUCCESS; +} + +/** + * @brief print the logs stored in the memory + * @param None + * @retval None + */ +static void DrvLogPrintMemLog(void) +{ + struct SysLogCtx *ctx = GetLogCtx(); + if (!ctx->init) { + LogCtxInit(ctx); /* Initialize the structure */ + } + + if (!ctx->memLog.enable) { + EXT_PRINT("mem record log not enable\n"); + return; + } + + unsigned short i; + if (ctx->memLog.logLen == LOG_MEM_POOL_MAX_LEN) { + /* Logs are printed one by one */ + for (i = ctx->memLog.writePos; i < LOG_MEM_POOL_MAX_LEN; ++i) { + EXT_PRINT("%c", ctx->memLog.mmzBuf[i]); + } + } + + /* Cyclic Print Characters */ + for (i = 0; i < ctx->memLog.writePos; ++i) { + EXT_PRINT("%c", ctx->memLog.mmzBuf[i]); + } +} + +/** + * @brief Prints the help information about the log command + * @param None + * @retval None + */ +static void DrvLogCmdHelp(void) +{ + /* Print Command Prompt */ + EXT_PRINT("Usage:\n"); + EXT_PRINT("logcmd show show log info\n"); + EXT_PRINT("logcmd setlevel [moduleId][level] set log level(0:F,1:E,2:W,3:I,4:D)\n"); + EXT_PRINT("logcmd setmem [0/1] enable mem log(1: print to memory, 0: print to console)\n"); + EXT_PRINT("logcmd print print log from memory\n"); +} + +/** + * @brief Command Parsing of Driver Miniaturization Logs + * @param argc: Total number of input strings + * @param argv[]: Entered character string information. + * @retval return whether the display is successful + */ +static int DrvLogCmd(unsigned int argc, const char *argv[]) +{ + char *endp = NULL; + if (argc < 2) { /* 2 is agrc */ + DrvLogCmdHelp(); + return EXT_FAILURE; + } else if (strcmp(argv[1], "show") == 0) { + DrvLogShowLogLevel(); + } else if (strcmp(argv[1], "setlevel") == 0) { + if (argc < 4) { /* 4 is argc */ + DrvLogCmdHelp(); + return EXT_FAILURE; + } + unsigned int modId = strtoul(argv[2], &endp, 0); /* 2 is argv */ + unsigned int level = strtoul(argv[3], &endp, 0); /* 3 is argv */ + if (ExtDrvLogSetLogLevel(modId, level) != EXT_SUCCESS) { + EXT_PRINT("set log level err\n"); + return EXT_FAILURE; + } + EXT_PRINT("setlevel succsee!\r\n"); + } else if (strcmp(argv[1], "setmem") == 0) { + if (argc < 3) { /* 3 is argc */ + DrvLogCmdHelp(); + return EXT_FAILURE; + } + + unsigned char enable = (unsigned char)strtoul(argv[2], &endp, 0); /* 2 is argv */ + if (DrvLogPutLogToMem(enable) != EXT_SUCCESS) { + EXT_PRINT("set put mem err\n"); + return EXT_FAILURE; + } + } else if (strcmp(argv[1], "print") == 0) { + DrvLogPrintMemLog(); + } + + return EXT_SUCCESS; +} + +/** + * @brief init dfx + * @param None + * @retval None + */ +void DfxCmdRegister(void) +{ + ExtCmdRegister("logcmd", &DrvLogCmd); +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/event.c b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/event.c new file mode 100644 index 000000000..0f8eb7a69 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/event.c @@ -0,0 +1,91 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file event.c + * @author MCU Driver Team + * @brief Header file containing functions prototypes of erron module. + * + Defines the function of reporting initialization events. + */ +#include "event.h" +#include "console.h" +#include "command.h" +#include "common.h" +#include "typedefs.h" + +UserMgr g_userMgr; + +/** + * @brief Event report. + * @param eventObj : Unsolicitedly reported events + * @retval Indicates whether the upload is successful. + */ +static inline int UserReport(UserEventObj *eventObj) +{ + unsigned int *reportAddr = (unsigned int *)&g_userMgr.reportAddr; + + /* Obtain reported events */ + *reportAddr = (uintptr_t)(void *)&eventObj->report; + EXT_PRINT("event report type: %u event type: %u ", eventObj->report.event.eventType, eventObj->report.reportType); + g_userMgr.reportLock = 0; + return EXT_SUCCESS; +} + +/** + * @brief Obtains the address for reporting events. + * @param None + * @retval Address to which the event is reported. + */ +static UserEventObj *UserGetEventObj(void) +{ + /* The event is locked and cannot be reported */ + if (g_userMgr.reportLock == 1) { + g_userMgr.reportFailedCount++; + return NULL; + } + + g_userMgr.reportLock = 1; + return &g_userMgr.eventObj; +} + +/** + * @brief Reporting an event + * @param eventObj: Structure for storing reported events + * @retval Indicates whether the upload is successful. + */ +int UserReportEvent(UserEventObj *eventObj) +{ + UserEventObj *obj = (UserEventObj *)UserGetEventObj(); + /* If it is locked, it cannot be reported */ + if (obj == NULL) { + return EXT_FAILURE; + } + + *obj = *eventObj; + + return UserReport(&g_userMgr.eventObj); +} + +/** + * @brief RInitializing event reporting + * @param None + * @retval For user-defined + */ +int EventInit(void) +{ + /* Users can customize event reporting based on their requirements */ + return 0; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/ext_command.c b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/ext_command.c new file mode 100644 index 000000000..7bbf842c5 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/log/src/ext_command.c @@ -0,0 +1,123 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file ext_command.c + * @author MCU Driver Team + * @brief command module driver + * @details The header file contains the following declaration: + * + Mainly including query commands. + * + Mainly including matching command. + */ +#include +#include +#include "command.h" +#include "cmd.h" +#include "common.h" +#define USER_COMMAND_START 0x50000 +#define USER_COMMAND_END 0x60000 + +/** + * @brief Commands contained in the query string. + * @param cmd: Contains command information. + * @retval Indicates whether the query is successful. + */ +struct cmdRegisterTable *ExtCmdFindCmd(const char *cmd) +{ + struct cmdRegisterTable *cmdtp = GetRegisterAddr(); + const char *p = NULL; + + unsigned int tblLen = CMD_REGESTER_MAX_NUM; + unsigned int cmdLen; + + if (tblLen == 0 || cmd == NULL) { + return NULL; + } + + /* compare command name only until first dot */ + p = strchr(cmd, '.'); + cmdLen = (p == NULL) ? (unsigned char)strlen(cmd) : (unsigned char)(p - cmd); + + for (int i = 0; i < CMD_REGESTER_MAX_NUM; i++, cmdtp++) { + if (cmdtp->name == NULL) { + return NULL; + } + + if ((p != NULL) && (cmdLen != 0)) { + if (strncmp(cmd, cmdtp->name, cmdLen) == 0) { + return cmdtp; /* only match part before dot */ + } + } + + if (strcmp(cmd, cmdtp->name) == 0) { + return cmdtp; /* full match */ + } + } + return NULL; /* not found */ +} + +/** + * @brief Matches valid commands based on included commands. + * @param head: Command to be queried. + * @param resLen: Length of the string to be found. + * @param finCnt: Set the number of times to be searched. + * @param tailId: End Flag Character + * @retval Indicates whether the query is successful. + */ +static unsigned char IsFindMatchCmdParamLegal(const char *head, unsigned char resLen, unsigned char *findCnt, + const char *res[]) +{ + if (head == NULL || resLen == 0 || findCnt == NULL || res == NULL) { return EXT_FALSE; } + return EXT_TRUE; +} + +/** + * @brief Matches valid commands based on included commands. + * @param head: Command to be queried. + * @param *res[]: An array that temporarily stores strings. + * @param resLen: Length of the string to be found. + * @param finCnt: Set the number of times to be searched. + * @param tailId: End Flag Character + * @retval Indicates whether the query is successful. + */ +unsigned char ExtCmdFindMatchCmd(const char *head, const char *res[], unsigned char resLen, unsigned char *findCnt, + unsigned int *tailId) +{ + /* Define Value Initialization */ + unsigned char ret = EXT_TRUE; + unsigned int cmdId = 0; + size_t headLen = 0; + /* initialization structure */ + struct cmdRegisterTable *cmdtp = GetRegisterAddr(); + + if (!IsFindMatchCmdParamLegal(head, resLen, findCnt, res)) { return EXT_FALSE; } + headLen = strlen(head); + for (int i = 0; i < CMD_REGESTER_MAX_NUM; cmdtp++, cmdId++, i++) { + if (cmdtp->name == NULL) { break; } /* search finish */ + if (*findCnt >= resLen) { /* search not finish */ + ret = EXT_FALSE; + break; + } + + /* detect registered name */ + if ((*tailId > 0 && (unsigned int)cmdId < *tailId) || strlen(cmdtp->name) < (unsigned int)headLen + || strcmp(cmdtp->name, UART_SWITCH_CMD) == 0) { continue; } + + if (strncmp(head, cmdtp->name, headLen) == 0) { res[(*findCnt)++] = cmdtp->name; } + } + *tailId = cmdId; + return ret; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/debug/src/debug.c b/vendor/others/demo/5-tim_adc/demo/drivers/debug/src/debug.c new file mode 100644 index 000000000..d7cb26bc3 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/debug/src/debug.c @@ -0,0 +1,416 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file debug.c + * @author MCU Driver Team + * @brief DEBUG module driver. + * This file provides functions to manage the following functionalities of the DEBUG module. + * + Initialization and de-initialization functions + * + Format string print function + */ + +#include "debug.h" + +#if (DBG_PRINTF_USE == DBG_USE_UART_PRINTF) +/* Macro definitions of stdarg.h to prevent using standard library */ +#define VA_START(v, l) __builtin_va_start(v, l) +#define VA_ARG(v, l) __builtin_va_arg(v, l) +#define VA_END(v) __builtin_va_end(v) + +#define DECIMAL_BASE 10U /* Cardinality of decimal numbers */ +#define HALF_ADJUST_BOUNDARY 5U /* The boundary for rounding the floating number */ +#define MAX_DIV_TIMES 31U +/* FLOAT_SCALE = DECIMAL_BASE ^ (FLOAT_PRECISION + 1) */ +#endif + +typedef __builtin_va_list va_list; + +#if (DBG_PRINTF_USE == DBG_USE_UART_PRINTF) +/** + * @brief Cardinality of binary, octal, decimal, and hexadecimal numbers. + */ +typedef enum { + BINARY = 2U, + OCTAL = 8U, + DECIMAL = 10U, + HEXADECIMAL = 16U, +} NumBase; +#endif + +#if (DBG_PRINTF_USE == DBG_USE_UART_PRINTF) +UART_Handle g_dbgUart; +/** + * @brief Initialize the UART port for DBG_UartPrintf(). + * @param baudRate The baud rate of UART port. + * @retval BASE_StatusType BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType DBG_UartPrintInit(unsigned int baudRate) +{ + g_dbgUart.baseAddress = DBG_PRINTF_UART_PORT; + g_dbgUart.baudRate = baudRate; + g_dbgUart.dataLength = UART_DATALENGTH_8BIT; + g_dbgUart.stopBits = UART_STOPBITS_ONE; + g_dbgUart.parity = UART_PARITY_NONE; + g_dbgUart.txMode = UART_MODE_BLOCKING; + g_dbgUart.rxMode = UART_MODE_BLOCKING; + g_dbgUart.fifoMode = true; + g_dbgUart.fifoTxThr = UART_FIFOFULL_ONE_EIGHT; + g_dbgUart.fifoRxThr = UART_FIFOFULL_ONE_EIGHT; + g_dbgUart.hwFlowCtr = UART_HW_FLOWCTR_DISABLE; + return HAL_UART_Init(&g_dbgUart); +} + +/** + * @brief De-initialize the UART port for DBG_UartPrintf(). + * @retval BASE_StatusType BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType DBG_UartPrintDeInit(void) +{ + return HAL_UART_DeInit(&g_dbgUart); +} +#endif + +/* Format string print function */ +#if (DBG_PRINTF_USE == DBG_USE_UART_PRINTF) +/** + * @brief Write a character to the UART port. + * @param ch The int promotion of the character to be written. + * @retval None. + */ +static void DBG_PrintCh(unsigned int ch) +{ + while (DBG_PRINTF_UART_PORT->UART_FR.BIT.txff == 1) { + ; + } + DBG_PRINTF_UART_PORT->UART_DR.BIT.data = (unsigned char)ch; +} + +/** + * @brief Print a string through the UART port. + * @param str The string to be printed. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, a BASE_STATUS_ERROR is returned. + */ +static int DBG_PrintStr(const char *str) +{ + DEBUG_ASSERT_PARAM(str != NULL); + int cnt = 0; + while (*str != '\0') { + DBG_PrintCh(*str); + str++; + cnt++; + } + return cnt; +} + +/** + * @brief Raise base value to the power exponent value. + * @param base Base value. + * @param exponent Exponent value. + * @retval unsigned long The result of raising base to the power exponent. + */ +static unsigned long DBG_Pow(unsigned int base, unsigned int exponent) +{ + unsigned long ret = 1; + while (exponent--) { + ret *= base; + } + return ret; /* ret = base ^ exponent */ +} + +/** + * @brief Count the digits of the number. + * @param num The number to be counted. + * @param base The number base of num. + * @retval unsigned int The number of digits. + */ +static unsigned int DBG_CountDigits(int num, NumBase base) +{ + unsigned int cnt = 0; + if (base == 0) { + return 0; + } + while (num != 0) { + cnt++; + if (cnt > MAX_DIV_TIMES) { + break; + } + num /= base; + } + cnt = (cnt == 0) ? 1 : cnt; + return cnt; +} + +/** + * @brief Print unsigned number through UART port. + * @param num The unsigned number to be printed. + * @param base The number base of num. + * @param digits The digits of num. + */ +static void DBG_PutUnsignedNum(unsigned int num, NumBase base, unsigned int digits) +{ + unsigned char ch; + while (digits != 0) { + ch = num / DBG_Pow(base, digits - 1); + num %= DBG_Pow(base, digits - 1); + if (base == DECIMAL) { + DBG_PrintCh(ch + '0'); + } else if (base == HEXADECIMAL) { + if (ch < DECIMAL_BASE) { + DBG_PrintCh(ch + '0'); + } else { + DBG_PrintCh(ch - DECIMAL_BASE + 'A'); + } + } else { + break; + } + digits--; + } +} + +/** + * @brief Print decimal number through UART port. + * @param intNum The decimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintInt(int intNum) +{ + unsigned int cnt; + if (intNum == 0) { + DBG_PrintCh('0'); + return 1; + } + if (intNum < 0) { + DBG_PrintCh('-'); + intNum = -intNum; + } + cnt = DBG_CountDigits(intNum, DECIMAL); + DBG_PutUnsignedNum(intNum, DECIMAL, cnt); + return cnt; +} + +/** + * @brief Print hexadecimal number through UART port. + * @param hexNum The hexadecimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintHex(unsigned int hexNum) +{ + unsigned int cnt; + if (hexNum == 0) { + DBG_PrintCh('0'); + return 1; + } + cnt = DBG_CountDigits(hexNum, HEXADECIMAL); + DBG_PutUnsignedNum(hexNum, HEXADECIMAL, cnt); + return cnt; +} + +/** + * @brief Print floating-point number through UART port. + * @param fltNum The floating-point number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintFlt(float fltNum, unsigned int precision) +{ + unsigned int cnt = 0; + unsigned int floatScale; + + if (fltNum < 0) { + DBG_PrintCh('-'); + cnt += 1; + fltNum = -fltNum; + } + int integerVal = (int)fltNum; + floatScale = DBG_Pow(10, (precision + 1)); /* 10: decimal */ + int floatVal = (long)(floatScale * (fltNum - integerVal)); + /* Half-adjust: round up or round down */ + if (floatVal % DECIMAL_BASE >= HALF_ADJUST_BOUNDARY) { + floatVal = floatVal / DECIMAL_BASE + 1; + } else { + floatVal = floatVal / DECIMAL_BASE; + } + cnt += DBG_PrintInt(integerVal); + DBG_PrintCh('.'); + cnt += 1; + /* Pad 0 in float part */ + unsigned int fltCnt = DBG_CountDigits(floatVal, DECIMAL); + if (precision > fltCnt) { + for (unsigned int i = 0; i < precision - fltCnt; i++) { + DBG_PrintCh('0'); /* add '0' */ + } + } + DBG_PutUnsignedNum(floatVal, DECIMAL, fltCnt); /* print unsigned number */ + cnt += precision; + return cnt; +} + +/** + * @brief Parse the format specifier and print the parameter by format. + * @param ch The format specifier. + * @param paramList The pointer of the variable parameter list. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int ParseSpecifier(const char ch, va_list *paramList) +{ + unsigned int cnt = 0; + unsigned int tmpCnt; + char chVal = 0; + const char *strVal = NULL; + int intVal = 0; + unsigned int unsignedVal = 0; + unsigned int hexVal = 0; + float fltVal = 0; + switch (ch) { + case 'c': /* Character format data. */ + chVal = VA_ARG(*paramList, int); /* Use type int because of byte alignment */ + DBG_PrintCh(chVal); + cnt += 1; + break; + case 's': /* String format data. */ + strVal = VA_ARG(*paramList, const char *); + cnt += DBG_PrintStr(strVal); + break; + case 'd': /* Integer decimal data. */ + intVal = VA_ARG(*paramList, int); + cnt += DBG_PrintInt(intVal); + break; + case 'u': /* Unsigned decimal data. */ + unsignedVal = VA_ARG(*paramList, unsigned int); + tmpCnt = DBG_CountDigits(unsignedVal, DECIMAL); + DBG_PutUnsignedNum(unsignedVal, DECIMAL, tmpCnt); + cnt += tmpCnt; + break; + case 'x': /* Hexadecimal data. */ + case 'X': + case 'p': /* Address data. */ + hexVal = VA_ARG(*paramList, unsigned int); + cnt += DBG_PrintHex(hexVal); + break; + case 'f': /* Floating-point data. */ + fltVal = VA_ARG(*paramList, double); + cnt += DBG_PrintFlt(fltVal, 5); /* default precision: 5 */ + break; + default: + DBG_PrintCh(ch); + cnt += 1; + break; + } + return cnt; +} + +/** + * @brief Print decimal number with field width. + * @param intNum The decimal number to be printed. + * @param fieldWidth Field width. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintIntWithField(int intNum, int fieldWidth) +{ + int zeroCnt = 0; + int digitsCnt = 0; + unsigned int cnt = 0; + + if (intNum == 0) { + DBG_PrintCh('0'); + return 1; + } + if (intNum < 0) { + DBG_PrintCh('-'); /* add symbol */ + cnt++; + intNum = -intNum; + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + zeroCnt = fieldWidth - digitsCnt; + for (int i = 0; i < zeroCnt; i++) { + DBG_PrintCh('0'); /* add '0' */ + cnt++; + } + cnt += digitsCnt; + } else { + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + cnt = digitsCnt; + zeroCnt = fieldWidth - digitsCnt; + for (int i = 0; i < zeroCnt; i++) { + DBG_PrintCh('0'); /* add '0' */ + cnt++; + } + } + DBG_PutUnsignedNum(intNum, DECIMAL, digitsCnt); + return cnt; +} + +static int DBG_Atoi(const char **s) +{ + int i, c; + + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + i = i * 10 + c - '0'; /* 10: decimal */ + } + return i; +} + +/** + * @brief Print format string through UART port, supporting %c, %s, %d, %u, %x, %X, %p, %f. + * %c To print a character. + * %s To print a string. + * %d To print a decimal value. + * %u To print an unsigned decimal value. + * %x, %X To print a hexadecimal value using upper case letters. + * %p To print a pointer as a hexadecimal value. + * %f To print a floating-point number with a fixed precision determined by FLOAT_PRECISION. + * @param format A string that contains the text to be printed and the format specifiers. + * @param ... Variable parameter list. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, return BASE_STATUS_ERROR. + */ +int DBG_UartPrintf(const char *format, ...) +{ + DEBUG_ASSERT_PARAM(format != NULL); + int cnt = 0; + int fieldWidth = 0; + int floatPrecision = 0; + float fltVal = 0; + int intVal = 0; + va_list paramList; + VA_START(paramList, format); + + while (*format != '\0') { + if (*format != '%') { + DBG_PrintCh(*format); + cnt += 1; + } else { + format++; + if (*format == '0') { + format++; + fieldWidth = DBG_Atoi(&format); + intVal = VA_ARG(paramList, int); + cnt += DBG_PrintIntWithField(intVal, fieldWidth); + } else if (*format == '.') { + format++; + floatPrecision = DBG_Atoi(&format); + fltVal = VA_ARG(paramList, double); + cnt += DBG_PrintFlt(fltVal, floatPrecision); + } else { + cnt += ParseSpecifier(*format, ¶mList); + } + } + format++; + } + VA_END(paramList); + return cnt; +} +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/dma/common/inc/dma.h b/vendor/others/demo/5-tim_adc/demo/drivers/dma/common/inc/dma.h new file mode 100644 index 000000000..acd7381b3 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/dma/common/inc/dma.h @@ -0,0 +1,134 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file dma.h + * @author MCU Driver Team + * @brief DMA module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the DMA. + * + The definition of the DMA handle structure. + * + Initialization and de-initialization functions + * + Peripheral querying the transmission functions. + * + Peripheral interrupt handler and callback registration functions. + */ + +/* Includes ------------------------------------------------------------------*/ +#ifndef McuMagicTag_DMA_H +#define McuMagicTag_DMA_H +#include "dma_ip.h" + +/** + * @defgroup DMA DMA + * @brief DMA module. + * @{ + */ + +/** + * @defgroup DMA_Common DMA Common + * @brief DMA common external module. + * @{ + */ + +/** + * @defgroup DMA_Handle_Definition DMA Handle Definition + * @{ + */ + +/** + * @brief The definition of the DMA handle structure. + */ +typedef struct _DMA_Handle { + DMA_RegStruct *baseAddress; /**< DMA common registers base address */ + struct { + DMA_ChannelRegStruct *channelAddr; /**< DMA channel registers base address */ + DMA_TransDirection direction; /**< The transmission direction type */ + DMA_RequestLineNum srcPeriph; /**< Source device request line, memory ignore configuration */ + DMA_RequestLineNum destPeriph; /**< Destination device request line, memory ignore configuration */ + DMA_AddrIncMode srcAddrInc; /**< Address increase configuration of source device */ + DMA_AddrIncMode destAddrInc; /**< Address increase configuration of destination device */ + DMA_BurstLength srcBurst; /**< Burst length of source device */ + DMA_BurstLength destBurst; /**< Burst length of destination device */ + DMA_TransmisWidth srcWidth; /**< Transfer width of source device */ + DMA_TransmisWidth destWidth; /**< Transfer width of destination device */ + void *pHandle; /**< Handle of the modules that use the DMA */ + unsigned int srcAddr; /**< Readback value from the source address to the register */ + unsigned int destAddr; /**< Readback value from the destnation address to the register */ + unsigned int controlVal; /**< Readback value of the DMA control register */ + unsigned int configVal; /**< Readback value of the DMA configuration register */ + } DMA_Channels[CHANNEL_MAX_NUM]; + DMA_UserCallBack userCallBack; /**< User callback */ + DMA_ExtendHandle handleEx; /**< DMA extend parameter */ +} DMA_Handle; + +/** + * @brief The definition of the DMA channel param structure. + */ +typedef struct { + DMA_RequestLineNum srcPeriph; /**< Source device request line, memory ignore configuration */ + DMA_RequestLineNum destPeriph; /**< Destination device request line, memory ignore configuration */ + DMA_TransDirection direction; /**< The transmission direction type */ + DMA_AddrIncMode srcAddrInc; /**< Address increase configuration of source device */ + DMA_AddrIncMode destAddrInc; /**< Address increase configuration of destination device */ + DMA_BurstLength srcBurst; /**< Burst length of source device */ + DMA_BurstLength destBurst; /**< Burst length of destination device */ + DMA_TransmisWidth srcWidth; /**< Transfer width of source device */ + DMA_TransmisWidth destWidth; /**< Transfer width of destination device */ + void *pHandle; /**< Parameter handle of the users callback function */ +} DMA_ChannelParam; + +typedef void (* DMA_CallbackType)(void *handle); +/** + * @} + */ + +/** + * @defgroup DMA_API_Declaration DMA HAL API + * @{ + */ +/* Hardware abstraction layer */ +BASE_StatusType HAL_DMA_Init(DMA_Handle *dmaHandle); +BASE_StatusType HAL_DMA_Deinit(DMA_Handle *dmaHandle); +BASE_StatusType HAL_DMA_Start(DMA_Handle *dmaHandle, unsigned int srcAddr, + unsigned int destAddr, unsigned int dataLength, unsigned int channel); +BASE_StatusType HAL_DMA_StartIT(DMA_Handle *dmaHandle, unsigned int srcAddr, + unsigned int destAddr, unsigned int dataLength, unsigned int channel); +BASE_StatusType HAL_DMA_StopChannel(DMA_Handle *dmaHandle, unsigned int channel); +BASE_StatusType HAL_DMA_GetChannelState(DMA_Handle *dmaHandle, unsigned int channel); +BASE_StatusType HAL_DMA_InitChannel(DMA_Handle *dmaHandle, DMA_ChannelParam *channelParam, unsigned int channel); +void HAL_DMA_IrqHandlerTc(void *handle); +void HAL_DMA_IrqHandlerError(void *handle); +void HAL_DMA_RegisterCallback(DMA_Handle *dmaHandle, DMA_CallbackFun_Type typeID, + DMA_ChannelNum channel, DMA_CallbackType pCallback); +BASE_StatusType HAL_DMA_ListAddNode(DMA_LinkList *head, DMA_LinkList *newNode); +BASE_StatusType HAL_DMA_InitNewNode(DMA_LinkList *node, const DMA_ChannelParam *param, + unsigned int srcAddr, unsigned int destAddr, unsigned int tranSize); +BASE_StatusType HAL_DMA_StartListTransfer(DMA_Handle *dmaHandle, DMA_LinkList *head, unsigned int channel); +#ifdef BASE_DEFINE_DMA_QUICKSTART +void HAL_DMA_QuickStart(DMA_Handle *dmaHandle, unsigned int channel); +#endif +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_DMA_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/dma/inc/dma_ex.h b/vendor/others/demo/5-tim_adc/demo/drivers/dma/inc/dma_ex.h new file mode 100644 index 000000000..1cf910d31 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/dma/inc/dma_ex.h @@ -0,0 +1,50 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file dma_ex.h + * @author MCU Driver Team + * @brief DMA module driver + * @details This file provides firmware functions to manage the following. + * functionalities of the DMA. + * + DMA Set Functions + */ + +#ifndef McuMagicTag_DMA_EX_H +#define McuMagicTag_DMA_EX_H + +#include "dma.h" + +/* Macro definitions ---------------------------------------------------------*/ +/** + * @addtogroup DMA_IP + * @{ + */ + +/** + * @defgroup DMA_EX_API_Declaration DMA HAL API EX + * @{ + */ + +void HAL_DMA_SetChannelPriorityEx(DMA_Handle *dmaHandle, unsigned int channel, DMA_ChannelPriority priority); +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_DMA_EX_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/dma/inc/dma_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/dma/inc/dma_ip.h new file mode 100644 index 000000000..156b280f5 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/dma/inc/dma_ip.h @@ -0,0 +1,919 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file dma_ip.h + * @author MCU Driver Team + * @brief DMA module driver + * @details This file provides DCL functions to manage DMA and Definition of + * specific parameters. + * + Definition of DMA configuration parameters. + * + DMA register mapping structure. + * + Parameters check functions. + * + Direct configuration layer interface. + */ + +#ifndef McuMagicTag_DMA_IP_H +#define McuMagicTag_DMA_IP_H + +#include "baseinc.h" +#define CHANNEL_MAX_NUM 6 + +#define TRANSIZE_MAX 4095 +#define TRANS_BLOCK 4092 + +#ifdef DMA_PARAM_CHECK +#define DMA_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define DMA_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define DMA_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define DMA_ASSERT_PARAM(para) ((void)0U) +#define DMA_PARAM_CHECK_NO_RET(para) ((void)0U) +#define DMA_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +/** + * @addtogroup DMA + * @{ + */ + +/** + * @defgroup DMA_IP DMA_IP + * @brief DMA_IP: dma_v1. + * @{ + */ + +/** + * @defgroup DMA_Param_Def DMA Parameters Definition + * @brief Description of DMA configuration parameters. + * @{ + */ + +/** + * @brief Indicates the burst length of the destination device and the source device. + */ +typedef enum { + DMA_BURST_LENGTH_1 = 0x00000000U, + DMA_BURST_LENGTH_4 = 0x00000001U, + DMA_BURST_LENGTH_8 = 0x00000002U, + DMA_BURST_LENGTH_16 = 0x00000003U, + DMA_BURST_LENGTH_32 = 0x00000004U, + DMA_BURST_LENGTH_64 = 0x00000005U, + DMA_BURST_LENGTH_128 = 0x00000006U, + DMA_BURST_LENGTH_256 = 0x00000007U +} DMA_BurstLength; + +/** + * @brief DMA transfer width definition. + */ +typedef enum { + DMA_TRANSWIDTH_BYTE = 0x00000000U, + DMA_TRANSWIDTH_HALFWORD = 0x00000001U, + DMA_TRANSWIDTH_WORD = 0x00000002U +} DMA_TransmisWidth; + +/** + * @brief DMA channel ID, a smaller channel ID indicates a higher priority. + */ +typedef enum { + DMA_CHANNEL_ZERO = 0x00000000U, + DMA_CHANNEL_ONE = 0x00000001U, + DMA_CHANNEL_TWO = 0x00000002U, + DMA_CHANNEL_THREE = 0x00000003U, + DMA_CHANNEL_FOUR = 0x00000004U, + DMA_CHANNEL_FIVE = 0x00000005U, +} DMA_ChannelNum; + +/** + * @brief DMA callback type. + */ +typedef enum { + DMA_CHANNEL_FINISH = 0x00000000U, + DMA_CHANNEL_ERROR = 0x00000001U +} DMA_CallbackFun_Type; + +/** + * @brief DMA channel priority. + */ +typedef enum { + DMA_PRIORITY_LOW = 0x00000000U, + DMA_PRIORITY_MEDIUM = 0x00000001U, + DMA_PRIORITY_HIGH = 0x00000002U, + DMA_PRIORITY_HIGHEST = 0x00000003U, +} DMA_ChannelPriority; + +/** + * @brief DMA request peripheral. The multiplexed transmitter requires additional + * configuration of the system register. + * @details DMA request line type: + * + DMA_REQUEST_I2C0_RX -- I2C0_RX use the request line numbered 0 + * + DMA_REQUEST_I2C0_TX -- I2C0_TX use the request line numbered 1 + * + DMA_REQUEST_I2C1_RX -- I2C1_RX use the request line numbered 2 + * + DMA_REQUEST_I2C1_TX -- I2C1_RX use the request line numbered 3 + * + DMA_REQUEST_UART0_RX -- UART0_TX use the request line numbered 4 + * + DMA_REQUEST_UART0_TX -- UART0_TX use the request line numbered 5 + * + DMA_REQUEST_UART1_RX -- UART1_RX use the request line numbered 6 + * + DMA_REQUEST_UART1_TX -- UART1_TX use the request line numbered 7 + * + DMA_REQUEST_UART2_RX -- UART2_RX use the request line numbered 8 + * + DMA_REQUEST_UART2_TX -- UART2_TX use the request line numbered 9 + * + DMA_REQUEST_UART3_RX -- UART3_RX use the request line numbered 30 + * + DMA_REQUEST_UART3_TX -- UART3_TX use the request line numbered 31 + * + DMA_REQUEST_CAPM0 -- CAPM0 use the request line numbered 10 + * + DMA_REQUEST_CAPM1 -- CAPM1 use the request line numbered 11 + * + DMA_REQUEST_CAPM2 -- CAPM2 use the request line numbered 12 + * + DMA_REQUEST_ADC0 -- ADC0 use the request line numbered 13 + * + DMA_REQUEST_TIMER0 -- TIMER0 use the request line numbered 14 + * + DMA_REQUEST_TIMER1 -- TIMER1 use the request line numbered 15 + * + DMA_REQUEST_TIMER2 -- TIMER2 use the request line numbered 16 + * + DMA_REQUEST_TIMER3 -- TIMER3 use the request line numbered 17 + * + DMA_REQUEST_SPI0_RX -- SPI0_RX ause the request line numbered 18 + * + DMA_REQUEST_SPI0_TX -- SPI0_TX use the request line numbered 19 + * + DMA_REQUEST_SPI1_RX -- SPI1_RX use the request line numbered 20 + * + DMA_REQUEST_SPI1_TX -- SPI1_TX use the request line numbered 21 + * + DMA_REQUEST_APT0 -- APT0 use the request line numbered 22 + * + DMA_REQUEST_APT1 -- APT1 use the request line numbered 23 + * + DMA_REQUEST_APT2 -- APT2 use the request line numbered 24 + * + DMA_REQUEST_APT3 -- APT3 use the request line numbered 25 + * + DMA_REQUEST_GPT0 -- GPT0 use the request line numbered 26 + * + DMA_REQUEST_GPT1 -- GPT1 use the request line numbered 27 + * + DMA_REQUEST_GPT2 -- GPT2 use the request line numbered 28 + * + DMA_REQUEST_GPT3 -- GPT3 use the request line numbered 29 + * + DMA_REQUEST_MEM -- The source and destination devices are memory + */ +typedef enum { + DMA_REQUEST_I2C0_RX = 0x00000000U, + DMA_REQUEST_I2C0_TX = 0x00000001U, + DMA_REQUEST_I2C1_RX = 0x00000002U, + DMA_REQUEST_I2C1_TX = 0x00000003U, + DMA_REQUEST_UART0_RX = 0x00000004U, + DMA_REQUEST_UART0_TX = 0x00000005U, + DMA_REQUEST_UART1_RX = 0x00000006U, + DMA_REQUEST_UART1_TX = 0x00000007U, + DMA_REQUEST_UART2_RX = 0x00000008U, + DMA_REQUEST_UART2_TX = 0x00000009U, + DMA_REQUEST_UART3_RX = 0x0000001EU, + DMA_REQUEST_UART3_TX = 0x0000001FU, + DMA_REQUEST_CAPM0 = 0x0000000AU, + DMA_REQUEST_CAPM1 = 0x0000000BU, + DMA_REQUEST_CAPM2 = 0x0000000CU, + DMA_REQUEST_ADC0 = 0x0000000DU, + DMA_REQUEST_TIMER0 = 0x0000000EU, + DMA_REQUEST_TIMER1 = 0x0000000FU, + DMA_REQUEST_TIMER2 = 0x00000010U, + DMA_REQUEST_TIMER3 = 0x00000011U, + DMA_REQUEST_SPI0_RX = 0x00000012U, + DMA_REQUEST_SPI0_TX = 0x00000013U, + DMA_REQUEST_SPI1_RX = 0x00000014U, + DMA_REQUEST_SPI1_TX = 0x00000015U, + DMA_REQUEST_APT0 = 0x00000016U, + DMA_REQUEST_APT1 = 0x00000017U, + DMA_REQUEST_APT2 = 0x00000018U, + DMA_REQUEST_APT3 = 0x00000019U, + DMA_REQUEST_GPT0 = 0x0000001AU, + DMA_REQUEST_GPT1 = 0x0000001BU, + DMA_REQUEST_GPT2 = 0x0000001CU, + DMA_REQUEST_GPT3 = 0x0000001DU, + DMA_REQUEST_MEM = 0x00000020U, +} DMA_RequestLineNum; + +/** + * @brief DMA peripheral request line. The multiplexed transmitter requires additional + * configuration of the system register. + */ +typedef enum { + DMA_REQLINEVAL_0 = 0x00000000U, + DMA_REQLINEVAL_1 = 0x00000001U, + DMA_REQLINEVAL_2 = 0x00000002U, + DMA_REQLINEVAL_3 = 0x00000003U, + DMA_REQLINEVAL_4 = 0x00000004U, + DMA_REQLINEVAL_5 = 0x00000005U, + DMA_REQLINEVAL_6 = 0x00000006U, + DMA_REQLINEVAL_7 = 0x00000007U, + DMA_REQLINEVAL_8 = 0x00000008U, + DMA_REQLINEVAL_9 = 0x00000009U, + DMA_REQLINEVAL_10 = 0x0000000AU, + DMA_REQLINEVAL_11 = 0x0000000BU, + DMA_REQLINEVAL_12 = 0x0000000CU, + DMA_REQLINEVAL_13 = 0x0000000DU, + DMA_REQLINEVAL_14 = 0x0000000EU, + DMA_REQLINEVAL_15 = 0x0000000FU +} DMA_ReqLineVal; + +/** + * @brief Configuration value definition of the peripheral multiplexing DMA request line. + */ +typedef enum { + DMA_SYSCTRLSET_0 = 0x00000000U, + DMA_SYSCTRLSET_1 = 0x00000001U, + DMA_SYSCTRLSET_2 = 0x00000002U +} DMA_SysctrlSet; + +/** + * @brief DMA Transfer Byte Order. + */ +typedef enum { + DMA_BYTEORDER_SMALLENDIAN = 0x00000000U, + DMA_BYTEORDER_BIGENDIAN = 0x00000001U +} DMA_ByteOrder; + +/** + * @brief Define the transmission direction type and data flow controller. + * @details Transmission direction type: + * + DMA_MEMORY_TO_MEMORY_BY_DMAC -- Direc: memory to memory, control: DMA + * + DMA_MEMORY_TO_PERIPH_BY_DMAC -- Direc: memory to peripheral, control: DMA + * + DMA_PERIPH_TO_MEMORY_BY_DMAC -- Direc: peripheral to memory, control: DMA + * + DMA_PERIPH_TO_PERIPH_BY_DMAC -- irec: peripheral to peripheral, control: DMA + * + DMA_PERIPH_TO_PERIPH_BY_DES -- Direc: peripheral to peripheral, control: destination peripheral + * + DMA_MEMORY_TO_PERIPH_BY_DES -- Direc: memory to peripheral, control: destination peripheral + * + DMA_PERIPH_TO_MEMORY_BY_SRC -- Direc: peripheral to memory, control: source peripheral + * + DMA_PERIPH_TO_PERIPH_BY_SRC -- Direc: peripheral to peripheral, control: source peripheral + */ +typedef enum { + DMA_MEMORY_TO_MEMORY_BY_DMAC = 0x00000000U, + DMA_MEMORY_TO_PERIPH_BY_DMAC = 0x00000001U, + DMA_PERIPH_TO_MEMORY_BY_DMAC = 0x00000002U, + DMA_PERIPH_TO_PERIPH_BY_DMAC = 0x00000003U, + DMA_PERIPH_TO_PERIPH_BY_DES = 0x00000004U, + DMA_MEMORY_TO_PERIPH_BY_DES = 0x00000005U, + DMA_PERIPH_TO_MEMORY_BY_SRC = 0x00000006U, + DMA_PERIPH_TO_PERIPH_BY_SRC = 0x00000007U +} DMA_TransDirection; + +/** + * @brief Address increase configuration. Peripherals can only be set to unaltered, memory can be set to two mode. + */ +typedef enum { + DMA_ADDR_UNALTERED = 0x00000000U, + DMA_ADDR_INCREASE = 0x00000001U +} DMA_AddrIncMode; + +/** + * @brief DMA extend handle. + */ +typedef struct _DMA_ExtendHandle { +} DMA_ExtendHandle; + +/** + * @brief DMA user callback. + */ +typedef struct { + struct { + void (* ChannelFinishCallBack)(void *handle); + void (* ChannelErrorCallBack)(void *handle); + } DMA_CallbackFuns[CHANNEL_MAX_NUM]; +} DMA_UserCallBack; +/** + * @} + */ + +/** + * @defgroup DMA_Reg_Def DMA Register Definition + * @brief Description DMA register mapping structure. + * @{ + */ + +/** + * @brief DMA interrupt status register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ch0_int_stat : 1; /**< Masked interrupt status of channel 0. */ + unsigned int ch1_int_stat : 1; /**< Masked interrupt status of channel 1. */ + unsigned int ch2_int_stat : 1; /**< Masked interrupt status of channel 2. */ + unsigned int ch3_int_stat : 1; /**< Masked interrupt status of channel 3. */ + unsigned int ch4_int_stat : 1; /**< Masked interrupt status of channel 4. */ + unsigned int ch5_int_stat : 1; /**< Masked interrupt status of channel 5. */ + unsigned int reserved0 : 26; + } BIT; +} volatile DMA_INT_STAT_REG; + +/** + * @brief DMA transfer completion interrupt status register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ch0_int_tc_stat : 1; /**< Masked transfer completion interrupt status of channel 0. */ + unsigned int ch1_int_tc_stat : 1; /**< Masked transfer completion interrupt status of channel 1. */ + unsigned int ch2_int_tc_stat : 1; /**< Masked transfer completion interrupt status of channel 2. */ + unsigned int ch3_int_tc_stat : 1; /**< Masked transfer completion interrupt status of channel 3. */ + unsigned int ch4_int_tc_stat : 1; /**< Masked transfer completion interrupt status of channel 4. */ + unsigned int ch5_int_tc_stat : 1; /**< Masked transfer completion interrupt status of channel 5. */ + unsigned int reserved0 : 26; + } BIT; +} volatile DMA_INT_TC_STAT_REG; + +/** + * @brief DMA transfer completion interrupt clear register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ch0_int_tc_clr : 1; /**< Clear the channel 0 transfer completion interrupt. */ + unsigned int ch1_int_tc_clr : 1; /**< Clear the channel 1 transfer completion interrupt. */ + unsigned int ch2_int_tc_clr : 1; /**< Clear the channel 2 transfer completion interrupt. */ + unsigned int ch3_int_tc_clr : 1; /**< Clear the channel 3 transfer completion interrupt. */ + unsigned int ch4_int_tc_clr : 1; /**< Clear the channel 4 transfer completion interrupt. */ + unsigned int ch5_int_tc_clr : 1; /**< Clear the channel 5 transfer completion interrupt. */ + unsigned int reserved0 : 26; + } BIT; +} volatile DMA_INT_TC_CLR_REG; + +/** + * @brief DMA error interrupt status register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ch0_int_err_stat : 1; /**< Masked error interrupt status of channel 0. */ + unsigned int ch1_int_err_stat : 1; /**< Masked error interrupt status of channel 1. */ + unsigned int ch2_int_err_stat : 1; /**< Masked error interrupt status of channel 2. */ + unsigned int ch3_int_err_stat : 1; /**< Masked error interrupt status of channel 3. */ + unsigned int ch4_int_err_stat : 1; /**< Masked error interrupt status of channel 4. */ + unsigned int ch5_int_err_stat : 1; /**< Masked error interrupt status of channel 5. */ + unsigned int reserved0 : 26; + } BIT; +} volatile DMA_INT_ERR_STAT_REG; + +/** + * @brief DMA error interrupt clear register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ch0_int_err_clr : 1; /**< Clear channel 0 error interrupt. */ + unsigned int ch1_int_err_clr : 1; /**< Clear channel 1 error interrupt. */ + unsigned int ch2_int_err_clr : 1; /**< Clear channel 2 error interrupt. */ + unsigned int ch3_int_err_clr : 1; /**< Clear channel 3 error interrupt. */ + unsigned int ch4_int_err_clr : 1; /**< Clear channel 4 error interrupt. */ + unsigned int ch5_int_err_clr : 1; /**< Clear channel 5 error interrupt. */ + unsigned int reserved0 : 26; + } BIT; +} volatile DMA_INT_ERR_CLR_REG; + +/** + * @brief DMA raw transfer completion interrupt register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ch0_raw_int_tc : 1; /**< Raw transfer completion interrupt status of channel 0. */ + unsigned int ch1_raw_int_tc : 1; /**< Raw transfer completion interrupt status of channel 1. */ + unsigned int ch2_raw_int_tc : 1; /**< Raw transfer completion interrupt status of channel 2. */ + unsigned int ch3_raw_int_tc : 1; /**< Raw transfer completion interrupt status of channel 3. */ + unsigned int ch4_raw_int_tc : 1; /**< Raw transfer completion interrupt status of channel 4. */ + unsigned int ch5_raw_int_tc : 1; /**< Raw transfer completion interrupt status of channel 5. */ + unsigned int reserved0 : 26; + } BIT; +} volatile DMA_RAW_INT_TC_STAT_REG; + +/** + * @brief DMA raw error interrupt register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ch0_raw_int_err : 1; /**< Raw error interrupt status of channel 0. */ + unsigned int ch1_raw_int_err : 1; /**< Raw error interrupt status of channel 1. */ + unsigned int ch2_raw_int_err : 1; /**< Raw error interrupt status of channel 2. */ + unsigned int ch3_raw_int_err : 1; /**< Raw error interrupt status of channel 3. */ + unsigned int ch4_raw_int_err : 1; /**< Raw error interrupt status of channel 4. */ + unsigned int ch5_raw_int_err : 1; /**< Raw error interrupt status of channel 5. */ + unsigned int reserved0 : 26; + } BIT; +} volatile DMA_RAW_INT_ERR_STAT_REG; + +/** + * @brief DMA channel enable status register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ch0_enabled : 1; /**< Channel 0 enable status. */ + unsigned int ch1_enabled : 1; /**< Channel 1 enable status. */ + unsigned int ch2_enabled : 1; /**< Channel 2 enable status. */ + unsigned int ch3_enabled : 1; /**< Channel 3 enable status. */ + unsigned int ch4_enabled : 1; /**< Channel 4 enable status. */ + unsigned int ch5_enabled : 1; /**< Channel 5 enable status. */ + unsigned int reserved0 : 26; + } BIT; +} volatile DMA_ENABLED_CHNS_REG; + +/** + * @brief DMA parameter configuration register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int dma_enable : 1; /**< DMA controller enable. */ + unsigned int reserved0 : 31; + } BIT; +} volatile DMA_CONFIG_REG; + + +/** + * @brief DMA request line synchronization enable. + */ +typedef union { + unsigned int reg; + struct { + unsigned int dma_sync_disable : 32; /**< Control whether the request line needs to be synchronized.. */ + } BIT; +} volatile DMA_SYNC_REG; + +/** + * @brief Source address register of DMA channel n (n = 0, 1, 2, 3). + */ +typedef union { + unsigned int reg; + struct { + unsigned int src_addr : 32; /**< DMA source address. */ + } BIT; +} volatile DMA_Cn_SRC_ADDR_REG; + +/** + * @brief Destination address register of DMA channel n (n = 0, 1, 2, 3). + */ +typedef union { + unsigned int reg; + struct { + unsigned int dest_addr : 32; /**< DMA destination address. */ + } BIT; +} volatile DMA_Cn_DEST_ADDR_REG; + +/** + * @brief Linked list information register for DMA channel n (n = 0, 1, 2, 3). + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 2; + unsigned int ll_item : 30; /**< Address of the next linked list node. */ + } BIT; +} volatile DMA_Cn_LLI_REG; + +/** + * @brief DMA channel n (n = 0, 1, 2, 3) control register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int trans_size : 12; /**< Length of the DMA transfer, provided that the DMA flow controller. */ + unsigned int sbsize : 3; /**< Burst length of the source device. */ + unsigned int dbsize : 3; /**< Burst length of the destination device. */ + unsigned int swidth : 3; /**< Transfer bit width of the source device, + which cannot be greater than Master bit width. */ + unsigned int dwidth : 3; /**< Transfer bit width of the destination device, + which cannot be greater than Master bit width. */ + unsigned int reserved0 : 2; + unsigned int src_incr : 1; /**< Set the incremental mode of the source address. */ + unsigned int dest_incr : 1; /**< Set the incremental mode of the destination address. */ + unsigned int reserved1 : 3; + unsigned int int_tc_enable : 1; /**< Transfer completion interrupt enable. */ + } BIT; +} volatile DMA_Cn_CONTROL_REG; + +/** + * @brief DMA channel n (n = 0, 1, 2, 3) configuration register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ch_en : 1; /**< Channel enable. */ + unsigned int src_periph : 5; /**< Source device, ignore this field if memory device. */ + unsigned int dest_periph : 5; /**< Destination device, ignore this field if memory device. */ + unsigned int flow_ctrl : 3; /**< Flow control and transmission Type. */ + unsigned int err_int_msk : 1; /**< Error interrupt mask flag. */ + unsigned int tc_int_msk : 1; /**< Transfer completion interrupt mask flag. */ + unsigned int ch_lock : 1; /**< Lock transmission enable on the bus. */ + unsigned int ch_active : 1; /**< Whether the data in the channel FIFO. */ + unsigned int ch_halt : 1; /**< Whether ignore DMA requests. */ + unsigned int reserved0 : 5; + unsigned int ch_priority : 2; /**< Channel Priority, larger value indicates a higher priority. */ + unsigned int reserved1 : 6; + } BIT; +} volatile DMA_Cn_CONFIG_REG; + +/** + * @brief DMA register mapping structure. + */ +typedef struct { + DMA_INT_STAT_REG DMA_INT_STAT; /**< DMA interrupt status register. + Offset address: 0x00000000U. */ + DMA_INT_TC_STAT_REG DMA_INT_TC_STAT; /**< DMA transfer completion interrupt status register. + Offset address: 0x00000004U. */ + DMA_INT_TC_CLR_REG DMA_INT_TC_CLR; /**< DMA transfer completion interrupt clear register. + Offset address: 0x00000008U. */ + DMA_INT_ERR_STAT_REG DMA_INT_ERR_STAT; /**< DMA error interrupt status register. + Offset address: 0x0000000CU. */ + DMA_INT_ERR_CLR_REG DMA_INT_ERR_CLR; /**< DMA error interrupt clear register. + Offset address: 0x00000010U. */ + DMA_RAW_INT_TC_STAT_REG DMA_RAW_INT_TC_STAT; /**< DMA raw transfer completion interrupt register. + Offset address: 0x00000014U. */ + DMA_RAW_INT_ERR_STAT_REG DMA_RAW_INT_ERR_STAT; /**< DMA raw error interrupt register. + Offset address: 0x00000018U. */ + DMA_ENABLED_CHNS_REG DMA_ENABLED_CHNS; /**< DMA channel enable status register. + Offset address: 0x0000001CU. */ + unsigned char space0[16]; + DMA_CONFIG_REG DMA_CONFIG; /**< DMA parameter configuration register. + Offset address: 0x00000030U. */ + DMA_SYNC_REG DMA_SYNC; /**< DMA request line synchronization enable. + Offset address: 0x00000034U. */ + unsigned char space1[200]; + DMA_Cn_SRC_ADDR_REG DMA_C0_SRC_ADDR; /**< Source address register of DMA channel 0. + Offset address: 0x00000100U. */ + DMA_Cn_DEST_ADDR_REG DMA_C0_DEST_ADDR; /**< Destination address register of DMA channel 0. + Offset address: 0x00000104U. */ + DMA_Cn_LLI_REG DMA_C0_LLI; /**< Linked list information register for DMA channel 0. + Offset address: 0x00000108U. */ + DMA_Cn_CONTROL_REG DMA_C0_CONTROL; /**< DMA channel 0 control register. + Offset address: 0x0000010CU. */ + DMA_Cn_CONFIG_REG DMA_C0_CONFIG; /**< DMA channel 0 configuration register. + Offset address: 0x00000110U. */ + unsigned char space2[12]; + DMA_Cn_SRC_ADDR_REG DMA_C1_SRC_ADDR; /**< Source address register of DMA channel 1. + Offset address: 0x00000120U. */ + DMA_Cn_DEST_ADDR_REG DMA_C1_DEST_ADDR; /**< Destination address register of DMA channel 1. + Offset address: 0x00000124U. */ + DMA_Cn_LLI_REG DMA_C1_LLI; /**< Linked list information register for DMA channel 1. + Offset address: 0x00000128U. */ + DMA_Cn_CONTROL_REG DMA_C1_CONTROL; /**< DMA channel 1 control register. + Offset address: 0x0000012CU. */ + DMA_Cn_CONFIG_REG DMA_C1_CONFIG; /**< DMA channel 1 configuration register. + Offset address: 0x00000130U. */ + unsigned char space3[12]; + DMA_Cn_SRC_ADDR_REG DMA_C2_SRC_ADDR; /**< Source address register of DMA channel 2. + Offset address: 0x00000140U. */ + DMA_Cn_DEST_ADDR_REG DMA_C2_DEST_ADDR; /**< Destination address register of DMA channel 2. + Offset address: 0x00000144U. */ + DMA_Cn_LLI_REG DMA_C2_LLI; /**< Linked list information register for DMA channel 2. + Offset address: 0x00000148U. */ + DMA_Cn_CONTROL_REG DMA_C2_CONTROL; /**< DMA channel 2 control register. + Offset address: 0x0000014CU. */ + DMA_Cn_CONFIG_REG DMA_C2_CONFIG; /**< DMA channel 2 configuration register. + Offset address: 0x00000150U. */ + unsigned char space4[12]; + DMA_Cn_SRC_ADDR_REG DMA_C3_SRC_ADDR; /**< Source address register of DMA channel 3. + Offset address: 0x00000160U. */ + DMA_Cn_DEST_ADDR_REG DMA_C3_DEST_ADDR; /**< Destination address register of DMA channel 3. + Offset address: 0x00000164U. */ + DMA_Cn_LLI_REG DMA_C3_LLI; /**< Linked list information register for DMA channel 3. + Offset address: 0x00000168U. */ + DMA_Cn_CONTROL_REG DMA_C3_CONTROL; /**< DMA channel 3 control register. + Offset address: 0x0000016CU. */ + DMA_Cn_CONFIG_REG DMA_C3_CONFIG; /**< DMA channel 3 configuration register. + Offset address: 0x00000170U. */ + unsigned char space5[12]; + DMA_Cn_SRC_ADDR_REG DMA_C4_SRC_ADDR; /**< Source address register of DMA channel 4. + Offset address: 0x00000180U. */ + DMA_Cn_DEST_ADDR_REG DMA_C4_DEST_ADDR; /**< Destination address register of DMA channel 4. + Offset address: 0x00000184U. */ + DMA_Cn_LLI_REG DMA_C4_LLI; /**< Linked list information register for DMA channel 4. + Offset address: 0x00000188U. */ + DMA_Cn_CONTROL_REG DMA_C4_CONTROL; /**< DMA channel 4 control register. + Offset address: 0x0000018CU. */ + DMA_Cn_CONFIG_REG DMA_C4_CONFIG; /**< DMA channel 4 configuration register. + Offset address: 0x00000190U. */ + unsigned char space6[12]; + DMA_Cn_SRC_ADDR_REG DMA_C5_SRC_ADDR; /**< Source address register of DMA channel 5. + Offset address: 0x00000200U. */ + DMA_Cn_DEST_ADDR_REG DMA_C5_DEST_ADDR; /**< Destination address register of DMA channel 5. + Offset address: 0x00000204U. */ + DMA_Cn_LLI_REG DMA_C5_LLI; /**< Linked list information register for DMA channel 5. + Offset address: 0x00000208U. */ + DMA_Cn_CONTROL_REG DMA_C5_CONTROL; /**< DMA channel 5 control register. + Offset address: 0x0000020CU. */ + DMA_Cn_CONFIG_REG DMA_C5_CONFIG; /**< DMA channel 5 configuration register. + Offset address: 0x00000210U. */ +} volatile DMA_RegStruct; + +/** + * @brief Channel register mapping structure. + */ +typedef struct { + DMA_Cn_SRC_ADDR_REG DMA_Cn_SRC_ADDR; /**< Source address register of DMA channel. */ + DMA_Cn_DEST_ADDR_REG DMA_Cn_DEST_ADDR; /**< Destination address register of DMA channel. */ + DMA_Cn_LLI_REG DMA_Cn_LLI; /**< Linked list information register for DMA channel. */ + DMA_Cn_CONTROL_REG DMA_Cn_CONTROL; /**< DMA channel control register. */ + DMA_Cn_CONFIG_REG DMA_Cn_CONFIG; /**< DMA channel configuration register. */ +} volatile DMA_ChannelRegStruct; + +/** + * @brief DMA linked list structure. + */ +typedef struct _DMA_LinkList { + unsigned int srcAddr; /**< Source device start address. */ + unsigned int destAddr; /**< Destination device start address. */ + struct _DMA_LinkList *lliNext; /**< Pointer to the next node. */ + DMA_Cn_CONTROL_REG control; /**< Channel parameters configured for the node. */ +} DMA_LinkList; + +/** + * @brief A large amount of block data needs to be Splitd. Split functions need to transfer the following structure. + */ +typedef struct { + unsigned int srcAddr; /**< Source device start address. */ + unsigned int destAddr; /**< Destination device start address. */ + unsigned int srcIn; /**< Source address single increment size. */ + unsigned int destIn; /**< destnation address single increment size. */ + unsigned int chnParam; /**< Channel parameters configured for the splited node. */ + unsigned int totalSize; /**< Total amount of block data. */ +} DMA_SplitParam; +/** + * @} + */ + + +/** + * @brief Check DMA channel num parameter. + * @param channel The number of channel. + * @retval bool + */ +static inline bool IsDmaChannelNum(DMA_ChannelNum channel) +{ + /* channel 0-5 */ + if ((channel == DMA_CHANNEL_ZERO) || (channel == DMA_CHANNEL_ONE) || + (channel == DMA_CHANNEL_TWO) || (channel == DMA_CHANNEL_THREE) || + (channel == DMA_CHANNEL_FOUR) || (channel == DMA_CHANNEL_FIVE)) { + return true; + } + return false; +} + +/** + * @brief Check DMA channel transfer width. + * @param width DMA transfer width. + * @retval bool + */ +static inline bool IsDmaWidth(DMA_TransmisWidth width) +{ + if ((width == DMA_TRANSWIDTH_BYTE) || + (width == DMA_TRANSWIDTH_HALFWORD) || + (width == DMA_TRANSWIDTH_WORD)) { + return true; + } + return false; +} + +/** + * @brief Check DMA channel burst length. + * @param burstLength DMA transfer burst length. + * @retval bool + */ +static inline bool IsDmaBurstLength(DMA_BurstLength burstLength) +{ + if ((burstLength == DMA_BURST_LENGTH_1) || (burstLength == DMA_BURST_LENGTH_4) || + (burstLength == DMA_BURST_LENGTH_8) || (burstLength == DMA_BURST_LENGTH_16) || + (burstLength == DMA_BURST_LENGTH_32) || (burstLength == DMA_BURST_LENGTH_64) || + (burstLength == DMA_BURST_LENGTH_128) || (burstLength == DMA_BURST_LENGTH_256)) { + return true; + } + return false; +} + +/** + * @brief Check DMA type of address change. + * @param byteOrder DMA source/destination address change type. + * @retval bool + */ +static inline bool IsDmaAddrMode(DMA_AddrIncMode addrMode) +{ + return (addrMode == DMA_ADDR_UNALTERED) || (addrMode == DMA_ADDR_INCREASE); +} + +/** + * @brief Check DMA type of direction. + * @param direction DMA transmfer direction. + * @retval bool + */ +static inline bool IsDmaDirection(DMA_TransDirection direction) +{ + if ((direction == DMA_MEMORY_TO_MEMORY_BY_DMAC) || (direction == DMA_MEMORY_TO_PERIPH_BY_DMAC) || + (direction == DMA_PERIPH_TO_MEMORY_BY_DMAC) || (direction == DMA_PERIPH_TO_PERIPH_BY_DMAC) || + (direction == DMA_PERIPH_TO_PERIPH_BY_DES) || (direction == DMA_MEMORY_TO_PERIPH_BY_DES) || + (direction == DMA_PERIPH_TO_MEMORY_BY_SRC) || (direction == DMA_PERIPH_TO_PERIPH_BY_SRC)) { + return true; + } + return false; +} + +/** + * @brief Check DMA channel priority. + * @param priority DMA channel priority. + * @retval bool + */ +static inline bool IsDmaPriority(DMA_ChannelPriority priority) +{ + if ((priority == DMA_PRIORITY_LOW) || (priority == DMA_PRIORITY_MEDIUM) || + (priority == DMA_PRIORITY_HIGH) || (priority == DMA_PRIORITY_HIGHEST)) { + return true; + } + return false; +} + +/** + * @brief Check DMA num of request peripheral. + * @param reqPeriph peripherals supported by the DMA. + * @retval bool + */ +static inline bool IsDmaReqPeriph(DMA_RequestLineNum reqPeriph) +{ + return (reqPeriph >= DMA_REQUEST_I2C0_RX) && (reqPeriph <= DMA_REQUEST_MEM); +} + +/** + * @brief Check whether the address is valid. + * @param address Address for the DMA to transfer data. + * @retval bool + */ +static inline bool IsDmaValidAddress(unsigned int address) +{ + return (address >= SRAM_START && address <= SRAM_END) || (address >= REGISTER_START && address <= REGISTER_END); +} + +/** + * @brief DMA configurate the direction. + * @param dmaChannelx DMA channel register base address. + * @retval None. + */ +static inline void DCL_DMA_SetDirection(DMA_ChannelRegStruct * const dmaChannelx, DMA_TransDirection direction) +{ + DMA_ASSERT_PARAM(IsDMACHXInstance(dmaChannelx)); + DMA_PARAM_CHECK_NO_RET(IsDmaDirection(direction)); + dmaChannelx->DMA_Cn_CONFIG.BIT.flow_ctrl = direction; +} + +/** + * @brief DMA configurate the address of source. + * @param dmaChannelx DMA channel register base address. + * @retval None. + */ +static inline void DCL_DMA_SetSrcAddr(DMA_ChannelRegStruct * const dmaChannelx, unsigned int srcAddr) +{ + DMA_ASSERT_PARAM(IsDMACHXInstance(dmaChannelx)); + DMA_PARAM_CHECK_NO_RET(srcAddr > 0); + dmaChannelx->DMA_Cn_SRC_ADDR.BIT.src_addr = srcAddr; +} + +/** + * @brief DMA configurate the address of destnation. + * @param dmaChannelx DMA channel register base address. + * @retval None. + */ +static inline void DCL_DMA_SetDestAddr(DMA_ChannelRegStruct * const dmaChannelx, unsigned int destAddr) +{ + DMA_ASSERT_PARAM(IsDMACHXInstance(dmaChannelx)); + DMA_PARAM_CHECK_NO_RET(destAddr > 0); + dmaChannelx->DMA_Cn_DEST_ADDR.BIT.dest_addr = destAddr; +} + +/** + * @brief DMA configurate the address mode of source. + * @param dmaChannelx DMA channel register base address. + * @retval None. + */ +static inline void DCL_DMA_SetSrcAddrMode(DMA_ChannelRegStruct * const dmaChannelx, DMA_AddrIncMode srcAddrInc) +{ + DMA_ASSERT_PARAM(IsDMACHXInstance(dmaChannelx)); + DMA_PARAM_CHECK_NO_RET(IsDmaAddrMode(srcAddrInc)); + dmaChannelx->DMA_Cn_CONTROL.BIT.src_incr = srcAddrInc; +} + +/** + * @brief DMA configurate the address mode of destnation. + * @param dmaChannelx DMA channel register base address. + * @retval None. + */ +static inline void DCL_DMA_SetDestAddrMode(DMA_ChannelRegStruct * const dmaChannelx, DMA_AddrIncMode destAddrInc) +{ + DMA_ASSERT_PARAM(IsDMACHXInstance(dmaChannelx)); + DMA_PARAM_CHECK_NO_RET(IsDmaAddrMode(destAddrInc)); + dmaChannelx->DMA_Cn_CONTROL.BIT.dest_incr = destAddrInc; +} + +/** + * @brief DMA configurate the bit width of source. + * @param dmaChannelx DMA channel register base address. + * @retval None. + */ +static inline void DCL_DMA_SetSrcWidth(DMA_ChannelRegStruct * const dmaChannelx, DMA_TransmisWidth srcWidth) +{ + DMA_ASSERT_PARAM(IsDMACHXInstance(dmaChannelx)); + DMA_PARAM_CHECK_NO_RET(IsDmaWidth(srcWidth)); + dmaChannelx->DMA_Cn_CONTROL.BIT.swidth = srcWidth; +} + +/** + * @brief DMA configurate the bit width of destnation. + * @param dmaChannelx DMA channel register base address. + * @retval None. + */ +static inline void DCL_DMA_SetDestWidth(DMA_ChannelRegStruct * const dmaChannelx, DMA_TransmisWidth destWidth) +{ + DMA_ASSERT_PARAM(IsDMACHXInstance(dmaChannelx)); + DMA_PARAM_CHECK_NO_RET(IsDmaWidth(destWidth)); + dmaChannelx->DMA_Cn_CONTROL.BIT.dwidth = destWidth; +} + +/** + * @brief DMA configurate the burst size of source. + * @param dmaChannelx DMA channel register base address. + * @retval None. + */ +static inline void DCL_DMA_SetSrcBurst(DMA_ChannelRegStruct * const dmaChannelx, DMA_BurstLength srcBurst) +{ + DMA_ASSERT_PARAM(IsDMACHXInstance(dmaChannelx)); + DMA_PARAM_CHECK_NO_RET(IsDmaBurstLength(srcBurst)); + dmaChannelx->DMA_Cn_CONTROL.BIT.sbsize = srcBurst; +} + +/** + * @brief DMA configurate the burst size of source. + * @param dmaChannelx DMA channel register base address. + * @retval None. + */ +static inline void DCL_DMA_SetDestBurst(DMA_ChannelRegStruct * const dmaChannelx, DMA_BurstLength destBurst) +{ + DMA_ASSERT_PARAM(IsDMACHXInstance(dmaChannelx)); + DMA_PARAM_CHECK_NO_RET(IsDmaBurstLength(destBurst)); + dmaChannelx->DMA_Cn_CONTROL.BIT.dbsize = destBurst; +} + +/** + * @brief DMA configurate the transfer size. + * @param dmaChannelx DMA channel register base address. + * @retval None. + */ +static inline void DCL_DMA_SetTransferSize(DMA_ChannelRegStruct * const dmaChannelx, unsigned int dataLength) +{ + DMA_ASSERT_PARAM(IsDMACHXInstance(dmaChannelx)); + DMA_PARAM_CHECK_NO_RET(dataLength <= 0xFFF); + dmaChannelx->DMA_Cn_CONTROL.BIT.trans_size = dataLength; +} + +/** + * @brief Enable channel completion interrupt. + * @param dmaChannelx DMA channel register base address. + * @retval None. + */ +static inline void DCL_DMA_EnableIT(DMA_ChannelRegStruct * const dmaChannelx) +{ + DMA_ASSERT_PARAM(IsDMACHXInstance(dmaChannelx)); + dmaChannelx->DMA_Cn_CONTROL.BIT.int_tc_enable = BASE_CFG_ENABLE; + dmaChannelx->DMA_Cn_CONFIG.BIT.tc_int_msk = BASE_CFG_ENABLE; +} + +/** + * @brief Disable channel completion interrupt. + * @param dmaChannelx DMA channel register base address. + * @retval None. + */ +static inline void DCL_DMA_DisableIT(DMA_ChannelRegStruct * const dmaChannelx) +{ + DMA_ASSERT_PARAM(IsDMACHXInstance(dmaChannelx)); + dmaChannelx->DMA_Cn_CONFIG.BIT.tc_int_msk = BASE_CFG_DISABLE; +} + +/** + * @brief Enables the channel to start transmission. + * @param dmaChannelx DMA channel register base address. + * @retval None. + */ +static inline void DCL_DMA_EnableChannel(DMA_ChannelRegStruct * const dmaChannelx) +{ + DMA_ASSERT_PARAM(IsDMACHXInstance(dmaChannelx)); + dmaChannelx->DMA_Cn_CONFIG.BIT.ch_en = BASE_CFG_ENABLE; +} + +/** + * @brief Disable the channel to start transmission. + * @param dmaChannelx DMA channel register base address. + * @retval None. + */ +static inline void DCL_DMA_DisableChannel(DMA_ChannelRegStruct * const dmaChannelx) +{ + DMA_ASSERT_PARAM(IsDMACHXInstance(dmaChannelx)); + dmaChannelx->DMA_Cn_CONFIG.BIT.ch_en = BASE_CFG_DISABLE; +} +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_DMA_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/dma/src/dma.c b/vendor/others/demo/5-tim_adc/demo/drivers/dma/src/dma.c new file mode 100644 index 000000000..860a9ad72 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/dma/src/dma.c @@ -0,0 +1,722 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file dma.c + * @author MCU Driver Team + * @brief DMA module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the DMA. + * + Initialization and de-initialization functions. + * + Start DMA transfer with interrupt mode. + * + Start DMA transfer without interrupt mode. + * + Stop DMA transfer and query the state of DMA. + * + Interrupt callback function and user registration function. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "interrupt.h" +#include "dma.h" + +static DMA_LinkList g_listTable[LISTNODE_MAX] = {0}; +static unsigned int g_listIndex = 0; + +static BASE_StatusType DMA_SetChannelAndDirection(DMA_Handle *dmaHandle, unsigned int srcAddr, unsigned int destAddr, + unsigned int dataLength, unsigned int channel); +static BASE_StatusType DMA_SetDirection(DMA_Handle *dmaHandle, unsigned int channel); +static BASE_StatusType DMA_SetChannel(DMA_Handle *dmaHandle, unsigned int srcAddr, unsigned int destAddr, + unsigned int dataLength, unsigned int channel); + +static void DMA_SplitToBlock(DMA_LinkList *node, DMA_SplitParam *split); +/** + * @brief Initialize the DMA hardware controller configuration. + * @param dmaHandle DMA handle. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_DMA_Init(DMA_Handle *dmaHandle) +{ + DMA_ASSERT_PARAM(dmaHandle != NULL); + DMA_ASSERT_PARAM(IsDMAInstance(dmaHandle->baseAddress)); + dmaHandle->baseAddress->DMA_CONFIG.BIT.dma_enable = BASE_CFG_ENABLE; /* Enable the DMA controller */ + dmaHandle->baseAddress->DMA_INT_ERR_CLR.reg |= 0x3F; + dmaHandle->baseAddress->DMA_INT_TC_CLR.reg |= 0x3F; + dmaHandle->baseAddress->DMA_SYNC.reg = 0x00; + dmaHandle->baseAddress->DMA_C0_CONFIG.reg = 0x00; + dmaHandle->baseAddress->DMA_C1_CONFIG.reg = 0x00; + dmaHandle->baseAddress->DMA_C2_CONFIG.reg = 0x00; + dmaHandle->baseAddress->DMA_C3_CONFIG.reg = 0x00; + dmaHandle->baseAddress->DMA_C4_CONFIG.reg = 0x00; + dmaHandle->baseAddress->DMA_C5_CONFIG.reg = 0x00; + + dmaHandle->DMA_Channels[0].channelAddr = DMA_CHANNEL0; /* Setting the base Address of channel 0 registers */ + dmaHandle->DMA_Channels[1].channelAddr = DMA_CHANNEL1; /* Setting the base Address of channel 1 registers */ + dmaHandle->DMA_Channels[2].channelAddr = DMA_CHANNEL2; /* Setting the base Address of channel 2 registers */ + dmaHandle->DMA_Channels[3].channelAddr = DMA_CHANNEL3; /* Setting the base Address of channel 3 registers */ + dmaHandle->DMA_Channels[4].channelAddr = DMA_CHANNEL4; /* Setting the base Address of channel 4 registers */ + dmaHandle->DMA_Channels[5].channelAddr = DMA_CHANNEL5; /* Setting the base Address of channel 5 registers */ + return BASE_STATUS_OK; +} + +/** + * @brief DeInitialize the DMA, close all channels. + * @param dmaHandle DMA handle. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_DMA_Deinit(DMA_Handle *dmaHandle) +{ + DMA_ASSERT_PARAM(dmaHandle != NULL); + DMA_ASSERT_PARAM(IsDMAInstance(dmaHandle->baseAddress)); + dmaHandle->baseAddress->DMA_INT_ERR_CLR.reg |= 0x3F; + dmaHandle->baseAddress->DMA_INT_TC_CLR.reg |= 0x3F; + dmaHandle->baseAddress->DMA_C0_CONFIG.reg = 0x00; + dmaHandle->baseAddress->DMA_C1_CONFIG.reg = 0x00; + dmaHandle->baseAddress->DMA_C2_CONFIG.reg = 0x00; + dmaHandle->baseAddress->DMA_C3_CONFIG.reg = 0x00; + dmaHandle->baseAddress->DMA_C4_CONFIG.reg = 0x00; + dmaHandle->baseAddress->DMA_C5_CONFIG.reg = 0x00; + dmaHandle->baseAddress->DMA_CONFIG.BIT.dma_enable = BASE_CFG_DISABLE; + /* Clean callback */ + for (unsigned int i = 0; i < CHANNEL_MAX_NUM; i++) { + dmaHandle->userCallBack.DMA_CallbackFuns[i].ChannelFinishCallBack = NULL; + dmaHandle->userCallBack.DMA_CallbackFuns[i].ChannelErrorCallBack = NULL; + } + return BASE_STATUS_OK; +} + +/** + * @brief Return the specified DMA channel state. + * @param dmaHandle DMA handle. + * @param channel ID of the selected DMA channel @ref DMA_ChannelNum. + * @retval Channel state: BASE_STATUS_BUSY, BASE_STATUS_OK. + */ +BASE_StatusType HAL_DMA_GetChannelState(DMA_Handle *dmaHandle, unsigned int channel) +{ + DMA_ASSERT_PARAM(dmaHandle != NULL); + DMA_ASSERT_PARAM(IsDMAInstance(dmaHandle->baseAddress)); + DMA_PARAM_CHECK_WITH_RET(IsDmaChannelNum(channel) == true, BASE_STATUS_ERROR); + unsigned int chns = dmaHandle->baseAddress->DMA_ENABLED_CHNS.reg; /* Obtains the channel enabling status */ + unsigned int channelStatus = chns & (1 << channel); + if (channelStatus == (uintptr_t)(1 << channel)) { + return BASE_STATUS_BUSY; + } + return BASE_STATUS_OK; +} + +/** + * @brief Modifying DMA channel parameters. + * @param dmaHandle DMA handle. + * @param channelParam DMA specific channel handle. + * @param channel ID of the selected DMA channel @ref DMA_ChannelNum. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_DMA_InitChannel(DMA_Handle *dmaHandle, DMA_ChannelParam *channelParam, unsigned int channel) +{ + DMA_ASSERT_PARAM(dmaHandle != NULL); + DMA_ASSERT_PARAM(channelParam != NULL); + DMA_ASSERT_PARAM(IsDMAInstance(dmaHandle->baseAddress)); + DMA_PARAM_CHECK_WITH_RET(IsDmaDirection(channelParam->direction) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaReqPeriph(channelParam->srcPeriph) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaReqPeriph(channelParam->destPeriph) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaWidth(channelParam->srcWidth) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaWidth(channelParam->destWidth) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaBurstLength(channelParam->srcBurst) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaBurstLength(channelParam->destBurst) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaAddrMode(channelParam->srcAddrInc) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaAddrMode(channelParam->destAddrInc) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaChannelNum(channel) == true, BASE_STATUS_ERROR); + dmaHandle->DMA_Channels[channel].direction = channelParam->direction; + dmaHandle->DMA_Channels[channel].srcPeriph = channelParam->srcPeriph; + dmaHandle->DMA_Channels[channel].destPeriph = channelParam->destPeriph; + dmaHandle->DMA_Channels[channel].srcWidth = channelParam->srcWidth; + dmaHandle->DMA_Channels[channel].destWidth = channelParam->destWidth; + dmaHandle->DMA_Channels[channel].srcBurst = channelParam->srcBurst; + dmaHandle->DMA_Channels[channel].destBurst = channelParam->destBurst; + dmaHandle->DMA_Channels[channel].srcAddrInc = channelParam->srcAddrInc; + dmaHandle->DMA_Channels[channel].destAddrInc = channelParam->destAddrInc; + dmaHandle->DMA_Channels[channel].pHandle = channelParam->pHandle; + return BASE_STATUS_OK; +} + +/** + * @brief Configuring the DMA source device. + * @param dmaHandle DMA handle. + * @param channel ID of the selected DMA channel @ref DMA_ChannelNum. + * @retval None. + */ +static void DMA_SetSrcPeriph(DMA_Handle *dmaHandle, unsigned int channel) +{ + unsigned int periphNum = dmaHandle->DMA_Channels[channel].srcPeriph; + if (periphNum >= DMA_REQUEST_MEM) { + return; + } + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONFIG.BIT.src_periph = periphNum; +} + +/** + * @brief Configuring the DMA destination device. + * @param dmaHandle DMA handle. + * @param channel ID of the selected DMA channel @ref DMA_ChannelNum. + * @retval None. + */ +static void DMA_SetDestPeriph(DMA_Handle *dmaHandle, unsigned int channel) +{ + unsigned int periphNum = dmaHandle->DMA_Channels[channel].destPeriph; + if (periphNum >= DMA_REQUEST_MEM) { + return; + } + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONFIG.BIT.dest_periph = periphNum; +} + +/** + * @brief Configuring the transmission direction of the DMA channel. + * @param dmaHandle DMA handle. + * @param channel ID of the selected DMA channel @ref DMA_ChannelNum. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +static BASE_StatusType DMA_SetDirection(DMA_Handle *dmaHandle, unsigned int channel) +{ + unsigned int direction = dmaHandle->DMA_Channels[channel].direction; + DMA_PARAM_CHECK_WITH_RET(IsDmaDirection(direction) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaReqPeriph(dmaHandle->DMA_Channels[channel].srcPeriph) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaReqPeriph(dmaHandle->DMA_Channels[channel].destPeriph) == true, BASE_STATUS_ERROR); + /* Setting Channel Configuration Parameters */ + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONFIG.BIT.flow_ctrl = direction; + switch (direction) { + case DMA_MEMORY_TO_PERIPH_BY_DMAC: + DMA_SetDestPeriph(dmaHandle, channel); + break; + /* The transfer type is peripheral to memory, flow control is controlled by DMA */ + case DMA_PERIPH_TO_MEMORY_BY_DMAC: + DMA_SetSrcPeriph(dmaHandle, channel); + break; + case DMA_PERIPH_TO_PERIPH_BY_DMAC: + DMA_SetSrcPeriph(dmaHandle, channel); + DMA_SetDestPeriph(dmaHandle, channel); + break; + /* The transfer type is peripheral to peripheral, flow control is controlled by destination periphera */ + case DMA_PERIPH_TO_PERIPH_BY_DES: + DMA_SetSrcPeriph(dmaHandle, channel); + DMA_SetDestPeriph(dmaHandle, channel); + break; + case DMA_MEMORY_TO_PERIPH_BY_DES: + DMA_SetDestPeriph(dmaHandle, channel); + break; + /* The transfer type is peripheral to memory, flow control is controlled by source periphera */ + case DMA_PERIPH_TO_MEMORY_BY_SRC: + DMA_SetSrcPeriph(dmaHandle, channel); + break; + case DMA_PERIPH_TO_PERIPH_BY_SRC: + DMA_SetSrcPeriph(dmaHandle, channel); + DMA_SetDestPeriph(dmaHandle, channel); + break; + default: + break; + } + return BASE_STATUS_OK; +} + +/** + * @brief Calculate the configured value based on the channel configuration parameters. + * @param dmaHandle DMA handle. + * @param channel ID of the selected DMA channel @ref DMA_ChannelNum. + * @retval val Calculation result. + */ +static unsigned int DMA_CalControlval(DMA_Handle *dmaHandle, unsigned int channel) +{ + unsigned int val = 0x80000000; /* 0x80000000 indicates int_tc_enable is set */ + val |= (dmaHandle->DMA_Channels[channel].srcBurst) << 12; /* Shift left by 12 bits for source burst */ + val |= (dmaHandle->DMA_Channels[channel].destBurst) << 15; /* Shift left by 15 bits for destination burst */ + val |= (dmaHandle->DMA_Channels[channel].srcWidth) << 18; /* Shift left by 18 bits for source width */ + val |= (dmaHandle->DMA_Channels[channel].destWidth) << 21; /* Shift left by 21 bits for destination width */ + val |= (dmaHandle->DMA_Channels[channel].srcAddrInc) << 26; /* Shift left by 26 bits for source address */ + val |= (dmaHandle->DMA_Channels[channel].destAddrInc) << 27; /* Shift left by 27 bits for destination address */ + return val; +} + +/** + * @brief Configuring Segmentation Parameters. + * @param dmaHandle DMA handle. + * @param srcAddr Data source address. + * @param destAddr Data destination address + * @param dataLength Length of data to be transferred. + * @param channel ID of the selected DMA channel @ref DMA_ChannelNum. + * @retval None. + */ +static void DMA_ConfigureSplit(DMA_Handle *dmaHandle, unsigned int srcAddr, + unsigned int destAddr, unsigned int dataLength, unsigned int channel) +{ + unsigned int val = DMA_CalControlval(dmaHandle, channel); /* Convert the configuration parameter to the value */ + DMA_SplitParam split; + split.chnParam = val; /* Setting channel parameters by val */ + split.srcAddr = srcAddr; + split.destAddr = destAddr; + split.srcIn = dmaHandle->DMA_Channels[channel].srcAddrInc * (1 << dmaHandle->DMA_Channels[channel].srcWidth); + split.destIn = dmaHandle->DMA_Channels[channel].destAddrInc * (1 << dmaHandle->DMA_Channels[channel].destWidth); + split.totalSize = dataLength; + DMA_LinkList *head = &(g_listTable[g_listIndex]); + g_listIndex++; + head->lliNext = NULL; + val |= TRANS_BLOCK; /* Set the size of the data to be transferred, TRANS_BLOCK is 4092 */ + head->control.reg = val; + DMA_SplitToBlock(head, &split); + /* After DMA_SplitToBlock return, head->control.reg[31] int_tc_enable is set 0 */ + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONTROL.reg = head->control.reg; + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_LLI.reg = (uintptr_t)(void *)head->lliNext; +} + +/** + * @brief Configuring DMA channel and direction. + * @param dmaHandle DMA handle. + * @param srcAddr Data source address. + * @param destAddr Data destination address + * @param dataLength Length of data to be transferred. + * @param channel ID of the selected DMA channel @ref DMA_ChannelNum. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +static BASE_StatusType DMA_SetChannelAndDirection(DMA_Handle *dmaHandle, unsigned int srcAddr, unsigned int destAddr, + unsigned int dataLength, unsigned int channel) +{ + DMA_PARAM_CHECK_WITH_RET(IsDmaValidAddress(srcAddr), BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaValidAddress(destAddr), BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(dataLength > 0, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaValidAddress(srcAddr + dataLength), BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaValidAddress(destAddr + dataLength), BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaChannelNum(channel) == true, BASE_STATUS_ERROR); + if (HAL_DMA_GetChannelState(dmaHandle, channel) != BASE_STATUS_OK) { + return BASE_STATUS_BUSY; + } + /* Indicates whether to clear the corresponding channel interrupt */ + dmaHandle->baseAddress->DMA_INT_ERR_CLR.reg |= (1 << channel); + dmaHandle->baseAddress->DMA_INT_TC_CLR.reg |= (1 << channel); + if (DMA_SetChannel(dmaHandle, srcAddr, destAddr, dataLength, channel) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + /* Setting channel direction */ + if (DMA_SetDirection(dmaHandle, channel) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief Configuring DMA channel transmission parameters. + * @param dmaHandle DMA handle. + * @param srcAddr Data source address. + * @param destAddr Data destination address + * @param dataLength Length of data to be transferred. + * @param channel ID of the selected DMA channel @ref DMA_ChannelNum. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +static BASE_StatusType DMA_SetChannel(DMA_Handle *dmaHandle, unsigned int srcAddr, unsigned int destAddr, + unsigned int dataLength, unsigned int channel) +{ + DMA_PARAM_CHECK_WITH_RET(IsDmaWidth(dmaHandle->DMA_Channels[channel].srcWidth) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaWidth(dmaHandle->DMA_Channels[channel].destWidth) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaBurstLength(dmaHandle->DMA_Channels[channel].srcBurst) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaBurstLength(dmaHandle->DMA_Channels[channel].destBurst) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaAddrMode(dmaHandle->DMA_Channels[channel].srcAddrInc) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaAddrMode(dmaHandle->DMA_Channels[channel].destAddrInc) == true, BASE_STATUS_ERROR); + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_SRC_ADDR.reg = srcAddr; + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_DEST_ADDR.reg = destAddr; + /* If the data size is greater than 4095, data needs to be transferred in blocks */ + if (dataLength > TRANSIZE_MAX) { + if (g_listIndex >= LISTNODE_MAX) { + return BASE_STATUS_ERROR; + } + DMA_ConfigureSplit(dmaHandle, srcAddr, destAddr, dataLength, channel); + } else { + unsigned int val = DMA_CalControlval(dmaHandle, channel); + val |= dataLength; + /* Configure the corresponding channel control parameters based on the value */ + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONTROL.reg = val; /**/ + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_LLI.reg = 0x00; + } + return BASE_STATUS_OK; +} + +/** + * @brief DMA start data transfer without interrupt enable. + * @param dmaHandle DMA handle. + * @param srcAddr Data source address. + * @param destAddr Data destination address + * @param dataLength Length of data to be transferred + * @param channel DMA channel num @ref DMA_ChannelNum. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_DMA_Start(DMA_Handle *dmaHandle, unsigned int srcAddr, + unsigned int destAddr, unsigned int dataLength, unsigned int channel) +{ + DMA_ASSERT_PARAM(dmaHandle != NULL); + DMA_ASSERT_PARAM(IsDMAInstance(dmaHandle->baseAddress)); + BASE_StatusType status; + /* Setting channel parameter */ + status = DMA_SetChannelAndDirection(dmaHandle, srcAddr, destAddr, dataLength, channel); + if (status != BASE_STATUS_OK) { + return status; + } + /* Mask completion interrupts and error interrupts, enable channels */ + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONFIG.reg &= ~(0x0000C000); + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONFIG.BIT.ch_en = BASE_CFG_ENABLE; +#ifdef BASE_DEFINE_DMA_QUICKSTART + dmaHandle->DMA_Channels[channel].srcAddr = dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_SRC_ADDR.reg; + dmaHandle->DMA_Channels[channel].destAddr = dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_DEST_ADDR.reg; + dmaHandle->DMA_Channels[channel].controlVal = dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONTROL.reg; + dmaHandle->DMA_Channels[channel].configVal = dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONFIG.reg; +#endif + return BASE_STATUS_OK; +} + +/** + * @brief DMA start data transfer with interrupt enable. + * @param dmaHandle DMA handle. + * @param srcAddr Data source address. + * @param destAddr Data destination address + * @param dataLength Length of data to be transferred + * @param channel DMA channel num @ref DMA_ChannelNum. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_DMA_StartIT(DMA_Handle *dmaHandle, unsigned int srcAddr, + unsigned int destAddr, unsigned int dataLength, unsigned int channel) +{ + DMA_ASSERT_PARAM(dmaHandle != NULL); + DMA_ASSERT_PARAM(IsDMAInstance(dmaHandle->baseAddress)); + BASE_StatusType status; + /* Setting channel parameter */ + status = DMA_SetChannelAndDirection(dmaHandle, srcAddr, destAddr, dataLength, channel); + if (status != BASE_STATUS_OK) { + return status; + } + /* Set tc_int_msk, err_int_msk, ch_en */ + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONFIG.reg |= 0xC001; +#ifdef BASE_DEFINE_DMA_QUICKSTART + dmaHandle->DMA_Channels[channel].srcAddr = dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_SRC_ADDR.reg; + dmaHandle->DMA_Channels[channel].destAddr = dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_DEST_ADDR.reg; + dmaHandle->DMA_Channels[channel].controlVal = dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONTROL.reg; + dmaHandle->DMA_Channels[channel].configVal = dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONFIG.reg; +#endif + return BASE_STATUS_OK; +} + +/** + * @brief DMA specified channel stops transporting. + * @param dmaHandle DMA handle. + * @param channel ID of the selected DMA channel @ref DMA_ChannelNum. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_DMA_StopChannel(DMA_Handle *dmaHandle, unsigned int channel) +{ + DMA_ASSERT_PARAM(dmaHandle != NULL); + DMA_ASSERT_PARAM(IsDMAInstance(dmaHandle->baseAddress)); + DMA_PARAM_CHECK_WITH_RET(IsDmaChannelNum(channel) == true, BASE_STATUS_ERROR); + /* Ignore subsequent DMA requests */ + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONFIG.BIT.ch_halt = BASE_CFG_ENABLE; + unsigned int active; + /* Processes the remaining data in the channel FIFO */ + do { + active = dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONFIG.BIT.ch_active; + } while (active != 0); + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONFIG.BIT.ch_en = BASE_CFG_DISABLE; + return BASE_STATUS_OK; +} + +/** + * @brief DMA specified channel transfer complete interrupt service processing function. + * @param dmaHandle DMA handle. + * @param channel ID of the selected DMA channel @ref DMA_ChannelNum. + * @retval None. + */ +static void DMA_ChannelIrqHandlerTc(DMA_Handle *dmaHandle, unsigned int channel) +{ + unsigned int finishStatus = dmaHandle->baseAddress->DMA_INT_TC_STAT.reg; + if ((finishStatus & (1 << channel)) != 0) { + dmaHandle->baseAddress->DMA_INT_TC_CLR.reg |= (1 << channel); /* Clear channel tc interrupt */ + if (dmaHandle->userCallBack.DMA_CallbackFuns[channel].ChannelFinishCallBack != NULL) { + dmaHandle->userCallBack.DMA_CallbackFuns[channel].ChannelFinishCallBack( + dmaHandle->DMA_Channels[channel].pHandle); + } + } + return; +} + +/** + * @brief DMA specified channel error interrupt service processing function. + * @param dmaHandle DMA handle. + * @param channel ID of the selected DMA channel @ref DMA_ChannelNum. + * @retval None. + */ +static void DMA_ChannelIrqHandlerError(DMA_Handle *dmaHandle, unsigned int channel) +{ + unsigned int errorStatus = dmaHandle->baseAddress->DMA_INT_ERR_STAT.reg; + if ((errorStatus & (1 << channel)) != 0) { + dmaHandle->baseAddress->DMA_INT_ERR_CLR.reg |= (1 << channel); /* Clear channel err interrupt */ + if (dmaHandle->userCallBack.DMA_CallbackFuns[channel].ChannelErrorCallBack != NULL) { + dmaHandle->userCallBack.DMA_CallbackFuns[channel].ChannelErrorCallBack( + dmaHandle->DMA_Channels[channel].pHandle); + } + } + return; +} + +/** + * @brief DMA transfer complete interrupt service processing function. + * @param handle DMA handle. + * @retval None. + */ +void HAL_DMA_IrqHandlerTc(void *handle) +{ + DMA_ASSERT_PARAM(handle != NULL); + DMA_Handle *dmaHandle = (DMA_Handle *)handle; + DMA_ASSERT_PARAM(IsDMAInstance(dmaHandle->baseAddress)); + unsigned int intStatus = dmaHandle->baseAddress->DMA_INT_STAT.reg; + for (int i = 0; i < CHANNEL_MAX_NUM; i++) { + if (intStatus & (1 << i)) { /* DMA channel status */ + DMA_ChannelIrqHandlerTc(dmaHandle, i); + } + } + return; +} + +/** + * @brief DMA error interrupt service processing function. + * @param handle DMA handle. + * @retval None. + */ +void HAL_DMA_IrqHandlerError(void *handle) +{ + DMA_ASSERT_PARAM(handle != NULL); + DMA_Handle *dmaHandle = (DMA_Handle *)handle; + DMA_ASSERT_PARAM(IsDMAInstance(dmaHandle->baseAddress)); + unsigned int intStatus = dmaHandle->baseAddress->DMA_INT_STAT.reg; + for (int i = 0; i < CHANNEL_MAX_NUM; i++) { + if (intStatus & (1 << i)) { /* DMA channel status */ + DMA_ChannelIrqHandlerError(dmaHandle, i); + } + } + return; +} + +/** + * @brief User callback function registration interface. + * @param dmaHandle DMA handle. + * @param typeID Id of callback function type. + * @param channel ID of the selected DMA channel @ref DMA_ChannelNum. + * @param pCallback pointer of the specified callbcak function. + * @retval None. + */ +void HAL_DMA_RegisterCallback(DMA_Handle *dmaHandle, DMA_CallbackFun_Type typeID, + DMA_ChannelNum channel, DMA_CallbackType pCallback) +{ + DMA_ASSERT_PARAM(dmaHandle != NULL); + DMA_ASSERT_PARAM(IsDMAInstance(dmaHandle->baseAddress)); + DMA_PARAM_CHECK_NO_RET(IsDmaChannelNum(channel) == true); + switch (typeID) { + case DMA_CHANNEL_FINISH: + dmaHandle->userCallBack.DMA_CallbackFuns[channel].ChannelFinishCallBack = pCallback; + break; + case DMA_CHANNEL_ERROR: + dmaHandle->userCallBack.DMA_CallbackFuns[channel].ChannelErrorCallBack = pCallback; + break; + default: + return; + } +} + +/** + * @brief Find the last node in the linked list. + * @param head Pointer to the transfer header of the linked list. + * @retval retNode End node of the linked list. + */ +static DMA_LinkList* DMA_FindListEndNode(DMA_LinkList *head) +{ + DMA_LinkList* retNode = head; + while (retNode->lliNext != NULL) { + retNode = retNode->lliNext; + } + return retNode; +} + +/** + * @brief Add a new node to the end of the linked list. + * @param head Pointer to the transfer header of the linked list. + * @param newNode Node to be added. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_DMA_ListAddNode(DMA_LinkList *head, DMA_LinkList *newNode) +{ + DMA_ASSERT_PARAM(head != NULL); + DMA_ASSERT_PARAM(newNode != NULL); + DMA_LinkList *node = NULL; + node = DMA_FindListEndNode(head); + if (node != NULL) { + node->lliNext = newNode; + node->control.BIT.int_tc_enable = 0x0; /* current node does not trigger the transfer completion interrupt */ + newNode->control.BIT.int_tc_enable = 0x01; /* current node trigger the transfer completion interrupt */ + } + return BASE_STATUS_OK; +} + +/** + * @brief Create a new node and add it to the end of the linked list. + * @param head Linked blocked head node. + * @param split Argument handle that splits into small blocks. + * @param index Sequence number of the new node in the linked list. + * @param controlVal Channel control parameters for the new node. + * @retval None. + */ +static void DMA_CreateNode(DMA_LinkList *head, DMA_SplitParam *split, unsigned int index, unsigned int controlVal) +{ + if (g_listIndex >= LISTNODE_MAX) { + return; + } + DMA_LinkList *newNode = &(g_listTable[g_listIndex]); + g_listIndex++; + newNode->srcAddr = split->srcAddr + (index * TRANS_BLOCK * split->srcIn); + newNode->destAddr = split->destAddr + (index * TRANS_BLOCK * split->destIn); + newNode->lliNext = NULL; + newNode->control.reg = controlVal; /* Channel parameters configured for the node */ + HAL_DMA_ListAddNode(head, newNode); +} + +/** + * @brief The upper limit of a DMA transfer is TRANSIZE_MAX. If the upper limit is greater than this value, + * the DMA needs to be divided into small blocks, and each small block is linked for transmission. + * @param head Linked blocked head node. + * @param split Argument handle that splits into small blocks. + * @retval None. + */ +static void DMA_SplitToBlock(DMA_LinkList *head, DMA_SplitParam *split) +{ + unsigned int totalSize = split->totalSize; + unsigned remainSize = totalSize % TRANS_BLOCK; + unsigned int index, controlVal; + for (index = 1; index < totalSize / TRANS_BLOCK; index++) { /* Block transfer based on the 4092 size */ + controlVal = split->chnParam; + controlVal |= TRANS_BLOCK; + DMA_CreateNode(head, split, index, controlVal); + } + if (remainSize != 0) { /* The remaining data size is less than 4092 */ + controlVal = split->chnParam; + controlVal |= remainSize; + DMA_CreateNode(head, split, index, controlVal); + } +} + +/** + * @brief In DMA chain transmission, initialize each node. + * @param node Node to be initialized. + * @param param Channel transmission parameters. + * @param srcAddr Transport source address of this node. + * @param destAddr Transport destnation address of this node. + * @param tranSize Data transmitted by this node. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_DMA_InitNewNode(DMA_LinkList *node, const DMA_ChannelParam *param, + unsigned int srcAddr, unsigned int destAddr, unsigned int tranSize) +{ + DMA_ASSERT_PARAM(node != NULL); + DMA_ASSERT_PARAM(param != NULL); + DMA_PARAM_CHECK_WITH_RET(IsDmaValidAddress(srcAddr), BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaValidAddress(destAddr), BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(tranSize > 0, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaValidAddress(srcAddr + tranSize), BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaValidAddress(destAddr + tranSize), BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaBurstLength(param->srcBurst) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaBurstLength(param->destBurst) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaWidth(param->srcWidth) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaWidth(param->destWidth) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaAddrMode(param->srcAddrInc) == true, BASE_STATUS_ERROR); + DMA_PARAM_CHECK_WITH_RET(IsDmaAddrMode(param->destAddrInc) == true, BASE_STATUS_ERROR); + node->srcAddr = srcAddr; + node->destAddr = destAddr; + node->lliNext = NULL; + unsigned int val = 0x80000000; /* 0x80000000 indicates int_tc_enable */ + val |= (param->srcBurst) << 12; /* Shift left by 12 bits for source burst */ + val |= (param->destBurst) << 15; /* Shift left by 15 bits for destination burst */ + val |= (param->srcWidth) << 18; /* Shift left by 18 bits for source width */ + val |= (param->destWidth) << 21; /* Shift left by 21 bits for destination width */ + val |= (param->srcAddrInc) << 26; /* Shift left by 26 bits for source address */ + val |= (param->destAddrInc) << 27; /* Shift left by 27 bits for destination address */ + if (tranSize > TRANSIZE_MAX) { + DMA_SplitParam split; + split.chnParam = val; + split.srcAddr = srcAddr; + split.destAddr = destAddr; + /* Source and destnation address single increment size */ + split.srcIn = param->srcAddrInc * (1 << param->srcWidth); + split.destIn = param->destAddrInc * (1 << param->destWidth); + split.totalSize = tranSize; + val |= TRANS_BLOCK; + node->control.reg = val; + DMA_SplitToBlock(node, &split); /* Shift left by 27 bits for destination address */ + } else { + val |= tranSize; + node->control.reg = val; + } + return BASE_STATUS_OK; +} + +/** + * @brief Start DMA chain transmission. Chain transfer, which is used to transfer data to discontinuous + * address spaces in memory. After the transmission task of the last node is complete, an interrupt is reported. + * @param dmaHandle DMA handle. + * @param head Pointer to the transfer header of the linked list. + * @param channel DMA channel num @ref DMA_ChannelNum. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_DMA_StartListTransfer(DMA_Handle *dmaHandle, DMA_LinkList *head, unsigned int channel) +{ + DMA_ASSERT_PARAM(dmaHandle != NULL); + DMA_ASSERT_PARAM(head != NULL); + DMA_ASSERT_PARAM(IsDMAInstance(dmaHandle->baseAddress)); + DMA_PARAM_CHECK_WITH_RET(IsDmaChannelNum(channel) == true, BASE_STATUS_ERROR); + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_SRC_ADDR.reg = head->srcAddr; + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_DEST_ADDR.reg = head->destAddr; + if (head->lliNext != NULL) { + /* Configure the next node address of the linked list */ + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_LLI.reg = (uintptr_t)(void *)head->lliNext; + } else { + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_LLI.reg = 0x00; + } + if (head->lliNext == head) { + head->control.BIT.int_tc_enable = 0; /* current node does not trigger the transfer completion interrupt */ + } + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONTROL.reg = head->control.reg; + DMA_SetDirection(dmaHandle, channel); + /* Set tc_int_msk, ch_en */ + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONFIG.BIT.tc_int_msk = BASE_CFG_ENABLE; + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONFIG.BIT.ch_en = BASE_CFG_ENABLE; + return BASE_STATUS_OK; +} + +#ifdef BASE_DEFINE_DMA_QUICKSTART +/** + * @brief DMA start data transfer without parameter verification Use the parameters of the last DMA configuration. + * @param dmaHandle DMA handle. + * @param channel DMA channel num @ref DMA_ChannelNum. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +void HAL_DMA_QuickStart(DMA_Handle *dmaHandle, unsigned int channel) +{ + DMA_ASSERT_PARAM(dmaHandle != NULL); + DMA_ASSERT_PARAM(IsDMAInstance(dmaHandle->baseAddress)); + DMA_PARAM_CHECK_NO_RET(IsDmaChannelNum(channel)); + /* Readback value configuration channel parameters */ + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_SRC_ADDR.reg = dmaHandle->DMA_Channels[channel].srcAddr; + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_DEST_ADDR.reg = dmaHandle->DMA_Channels[channel].destAddr; + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONTROL.reg = dmaHandle->DMA_Channels[channel].controlVal; + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONFIG.reg = dmaHandle->DMA_Channels[channel].configVal; +} +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/dma/src/dma_ex.c b/vendor/others/demo/5-tim_adc/demo/drivers/dma/src/dma_ex.c new file mode 100644 index 000000000..d70c792cc --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/dma/src/dma_ex.c @@ -0,0 +1,42 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file dma_ex.c + * @author MCU Driver Team + * @brief DMA module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the DMA. + * + DMA Set Functions. + */ + +/* Includes ------------------------------------------------------------------*/ + +#include "dma_ex.h" +/** + * @brief Configuring the Transmission Channel Priority on the DMA. + * @param dmaHandle DMA handle. + * @param channel DMA channel num @ref DMA_ChannelNum. + * @param priority DMA channel num @ref DMA_ChannelPriority. + * @retval None. + */ +void HAL_DMA_SetChannelPriorityEx(DMA_Handle *dmaHandle, unsigned int channel, DMA_ChannelPriority priority) +{ + DMA_ASSERT_PARAM(dmaHandle != NULL); + DMA_PARAM_CHECK_NO_RET(IsDmaChannelNum(channel)); + DMA_PARAM_CHECK_NO_RET(IsDmaPriority(priority)); + dmaHandle->DMA_Channels[channel].channelAddr->DMA_Cn_CONFIG.BIT.ch_priority = priority; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/flash/common/inc/flash.h b/vendor/others/demo/5-tim_adc/demo/drivers/flash/common/inc/flash.h new file mode 100644 index 000000000..ede119d30 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/flash/common/inc/flash.h @@ -0,0 +1,124 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file flash.h + * @author MCU Driver Team + * @brief FLASH module driver. + * @details This file provides firmware functions to manage the following functionalities of the FLASH. + * + Basic parameter configuration macro. + * + FLASH parameter handle definition. + * + Initialization and de-initialization functions. + * + Definition of flash read/write erase functions. + */ +#ifndef McuMagicTag_FLASH_H +#define McuMagicTag_FLASH_H + +/* Includes ---------------------------------------------------------------------*/ +#include "flash_ip.h" + +/** + * @defgroup FLASH FLASH + * @brief FLASH module. + * @{ + */ + +/** + * @defgroup FLASH_Common FLASH Common + * @brief FLASH common external module. + * @{ + */ + +/* Macro definitions -----------------------------------------------------------*/ + +/** + * @defgroup FLASH_Handle_Definition FLASH Handle Definition + * @{ + */ + +/** + * @brief Module Status Enumeration Definition + */ +typedef enum { + FLASH_STATE_RESET = 0x00000000U, + FLASH_STATE_READY = 0x00000001U, + FLASH_STATE_PGM = 0x00000002U, + FLASH_STATE_ERASE = 0x00000003U, + FLASH_STATE_ERROR = 0x00000004U +} FLASH_StateType; + +/** + * @brief Module handle structure definition + */ +typedef struct _FLASH_Handle { + EFC_RegStruct *baseAddress; /**< Register base address. */ + FLASH_PE_OpMode peMode; /**< PE operation type. For details, see FLASH_PE_OpMode. */ + volatile unsigned int destAddr; /**< Destination address for storing interrupt operations. */ + volatile unsigned int srcAddr; /**< Used to store the source address in interrupt mode. */ + volatile unsigned int writeLen; /**< Indicates the length of the data to be written in interrupt mode. */ + volatile unsigned int eraseNum; /**< Used to store the number of erase blocks in interrupt mode. */ + FLASH_StateType state; /**< Running status of the flash module. For details, see FLASH_StateType. */ + FLASH_UserCallBcak userCallBack; /**< User-defined callback function. */ + FLASH_ExtendHandle handleEx; /**< Extend handle, configuring some special parameters. */ +} FLASH_Handle; + +/** + * @brief Callback Function Type Definition. + */ +typedef void (*FLASH_CallbackFunType)(void *handle, FLASH_CallBackEvent event, unsigned int opAddr); +/** + * @} + */ + +/** + * @defgroup FLASH_API_Declaration FLASH HAL API + * @{ + */ +BASE_StatusType HAL_FLASH_Init(FLASH_Handle *handle); +BASE_StatusType HAL_FLASH_DeInit(FLASH_Handle *handle); +BASE_StatusType HAL_FLASH_RegisterCallback(FLASH_Handle *handle, FLASH_CallbackFunType pcallback); +BASE_StatusType HAL_FLASH_WriteBlocking(FLASH_Handle *handle, unsigned int srcAddr, + unsigned int destAddr, unsigned int srcLen); +BASE_StatusType HAL_FLASH_EraseBlocking(FLASH_Handle *handle, + FLASH_EraseMode eraseMode, + FLASH_SectorAddr startAddr, + unsigned int eraseNum); +BASE_StatusType HAL_FLASH_WriteIT(FLASH_Handle *handle, unsigned int srcAddr, + unsigned int destAddr, unsigned int srcLen); +BASE_StatusType HAL_FLASH_EraseIT(FLASH_Handle *handle, + FLASH_EraseMode eraseMode, + FLASH_SectorAddr startAddr, + unsigned int eraseNum); +BASE_StatusType HAL_FLASH_Read(FLASH_Handle *handle, + unsigned int srcAddr, + unsigned int readLen, + unsigned char *dataBuff, + unsigned int buffLen); +void HAL_FLASH_IrqHandler(void *handle); +void HAL_FLASH_IrqHandlerError(void *handle); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* #ifndef McuMagicTag_FLASH_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/flash/inc/flash_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/flash/inc/flash_ip.h new file mode 100644 index 000000000..1492bacf6 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/flash/inc/flash_ip.h @@ -0,0 +1,1156 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file flash_ip.h + * @author MCU Driver Team + * @brief FLASH module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the FLASH. + * + Register definition structure + * + Basic parameter configuration macro + */ + +/* Define to prevent recursive inclusion ----------------------------------------*/ +#ifndef McuMagicTag_FLASH_IP_H +#define McuMagicTag_FLASH_IP_H + +/* Includes ---------------------------------------------------------------------*/ +#include "baseinc.h" + +/* Macro definitions -----------------------------------------------------------*/ +#ifdef FLASH_PARAM_CHECK +#define FLASH_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define FLASH_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define FLASH_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define FLASH_ASSERT_PARAM(para) ((void)0U) +#define FLASH_PARAM_CHECK_NO_RET(para) ((void)0U) +#define FLASH_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +/** + * @addtogroup FLASH + * @{ + */ + +/** + * @defgroup FLASH_IP FLASH_IP + * @brief FLASH_IP: flash_v1 + * @{ + */ + +#define FLASH_BASE 0x0U /* Flash PE operation base address. */ +#define FLASH_READ_BASE 0x3000000U /* Base address for the flash read operation. */ +#define FLASH_ONE_PAGE_SIZE 0x400U /* Size of a page, unit: bytes. 1K. */ +#define FLASH_ONE_PAGE_WORD_SIZE 0x100U /* Size of a page, unit: word. 1K. */ + +#define FLASH_KEY_REGISTER_UNLOCK_VALUE 0xFEDCBA98 +#define FLASH_KEY_REGISTER_LOCK_VALUE 0x0 + +#define FLASH_MAX_PGM_BYTE_SIZE 0x100 +#define FLASH_MAX_PGM_WORD_SIZE 0x40 +#define FLASH_MIN_PGM_BYTES_SIZE 0x10 +#define FLASH_MIN_PGM_WORDS_SIZE 4 +#define FLASH_PGM_WORDS_LEGAL_DIVISOR 4 +#define FLASH_ONE_WORD_BYTES_SIZE 4 + +#define FLASH_PGM_WDATA_BYTE_SIZE 8 +#define FLASH_INFORMATUON_CAPACITY_POS 16 +#define FLASH_INFORMATUON_CAPACITY_MASK (0xFFFF << FLASH_INFORMATUON_CAPACITY_POS) + +#define FLASH_PGM_WBUF_CNT_POS 8 +#define FLASH_PGM_WBUF_CNT_MASK (0xFF << FLASH_PGM_WBUF_CNT_POS) + +#define FLASH_MAX_CMD_PROGRAM_SIZE 0x10 /* The value is cmd program size, unit: 32bits. */ + +#define FLASH_SRAM_START_ADDRESS 0x04000000 +#define FLASH_SRAM_END_ADDRESS 0x04007FFF +#define FLASH_MAIN_RNG_START_ADDRESS 0x03000000 + +/* Only CHIP_3061MNPICA, CHIP_3061MNPIKA is supported 128K. */ +#if defined (CHIP_3061MNPICA) || defined (CHIP_3061MNPIKA) +#define FLASH_MAIN_RNG_END_ADDRESS 0x0301FFFF +#define FLASH_MAX_SIZE 0x20000U /* Flash space size 128k bytes. */ +#define FLASH_MAX_PAGE_NUM 128 +#else +#define FLASH_MAIN_RNG_END_ADDRESS 0x0300FFFF /* The chip only is supported 64K. */ +#define FLASH_MAX_SIZE 0x10000U /* Flash space size 64k bytes. */ +#define FLASH_MAX_PAGE_NUM 64 /* The chip only is supported 64K. */ +#endif + +/** + * @defgroup FLASH_Param_Def FLASH Parameters Definition + * @brief Definition of FLASH configuration parameters. + * @{ + */ +/* Typedef definitions --------------------------------------------------------*/ +/** + * @brief PE Operation Mode Enumeration Definition. + */ +typedef enum { + FLASH_PE_OP_BLOCK = 0x00000000U, + FLASH_PE_OP_IT = 0x00000001U +} FLASH_PE_OpMode; + +/** + * @brief Erase operation type enumeration definition. + */ +typedef enum { + FLASH_ERASE_MODE_PAGE = 0x00000004U, + FLASH_ERASE_MODE_CHIP = 0x00000006U +} FLASH_EraseMode; + +/** + * @brief Flash page address enumeration. + */ +typedef enum { + FLASH_PAGE_0 = FLASH_BASE, + FLASH_PAGE_1 = FLASH_BASE + FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_2 = FLASH_BASE + 2 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_3 = FLASH_BASE + 3 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_4 = FLASH_BASE + 4 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_5 = FLASH_BASE + 5 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_6 = FLASH_BASE + 6 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_7 = FLASH_BASE + 7 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_8 = FLASH_BASE + 8 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_9 = FLASH_BASE + 9 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_10 = FLASH_BASE + 10 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_11 = FLASH_BASE + 11 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_12 = FLASH_BASE + 12 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_13 = FLASH_BASE + 13 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_14 = FLASH_BASE + 14 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_15 = FLASH_BASE + 15 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_16 = FLASH_BASE + 16 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_17 = FLASH_BASE + 17 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_18 = FLASH_BASE + 18 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_19 = FLASH_BASE + 19 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_20 = FLASH_BASE + 20 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_21 = FLASH_BASE + 21 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_22 = FLASH_BASE + 22 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_23 = FLASH_BASE + 23 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_24 = FLASH_BASE + 24 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_25 = FLASH_BASE + 25 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_26 = FLASH_BASE + 26 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_27 = FLASH_BASE + 27 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_28 = FLASH_BASE + 28 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_29 = FLASH_BASE + 29 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_30 = FLASH_BASE + 30 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_31 = FLASH_BASE + 31 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_32 = FLASH_BASE + 32 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_33 = FLASH_BASE + 33 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_34 = FLASH_BASE + 34 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_35 = FLASH_BASE + 35 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_36 = FLASH_BASE + 36 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_37 = FLASH_BASE + 37 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_38 = FLASH_BASE + 38 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_39 = FLASH_BASE + 39 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_40 = FLASH_BASE + 40 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_41 = FLASH_BASE + 41 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_42 = FLASH_BASE + 42 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_43 = FLASH_BASE + 43 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_44 = FLASH_BASE + 44 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_45 = FLASH_BASE + 45 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_46 = FLASH_BASE + 46 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_47 = FLASH_BASE + 47 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_48 = FLASH_BASE + 48 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_49 = FLASH_BASE + 49 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_50 = FLASH_BASE + 50 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_51 = FLASH_BASE + 51 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_52 = FLASH_BASE + 52 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_53 = FLASH_BASE + 53 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_54 = FLASH_BASE + 54 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_55 = FLASH_BASE + 55 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_56 = FLASH_BASE + 56 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_57 = FLASH_BASE + 57 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_58 = FLASH_BASE + 58 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_59 = FLASH_BASE + 59 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_60 = FLASH_BASE + 60 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_61 = FLASH_BASE + 61 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_62 = FLASH_BASE + 62 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_63 = FLASH_BASE + 63 * FLASH_ONE_PAGE_SIZE, + /* Only CHIP_3061MNPICA, CHIP_3061MNPIKA is supported 128K. */ +#if defined (CHIP_3061MNPICA) || defined (CHIP_3061MNPIKA) + FLASH_PAGE_64 = FLASH_BASE + 64 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_65 = FLASH_BASE + 65 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_66 = FLASH_BASE + 66 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_67 = FLASH_BASE + 67 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_68 = FLASH_BASE + 68 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_69 = FLASH_BASE + 69 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_70 = FLASH_BASE + 70 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_71 = FLASH_BASE + 71 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_72 = FLASH_BASE + 72 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_73 = FLASH_BASE + 73 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_74 = FLASH_BASE + 74 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_75 = FLASH_BASE + 75 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_76 = FLASH_BASE + 76 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_77 = FLASH_BASE + 77 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_78 = FLASH_BASE + 78 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_79 = FLASH_BASE + 79 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_80 = FLASH_BASE + 80 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_81 = FLASH_BASE + 81 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_82 = FLASH_BASE + 82 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_83 = FLASH_BASE + 83 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_84 = FLASH_BASE + 84 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_85 = FLASH_BASE + 85 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_86 = FLASH_BASE + 86 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_87 = FLASH_BASE + 87 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_88 = FLASH_BASE + 88 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_89 = FLASH_BASE + 89 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_90 = FLASH_BASE + 90 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_91 = FLASH_BASE + 91 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_92 = FLASH_BASE + 92 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_93 = FLASH_BASE + 93 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_94 = FLASH_BASE + 94 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_95 = FLASH_BASE + 95 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_96 = FLASH_BASE + 96 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_97 = FLASH_BASE + 97 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_98 = FLASH_BASE + 98 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_99 = FLASH_BASE + 99 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_100 = FLASH_BASE + 100 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_101 = FLASH_BASE + 101 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_102 = FLASH_BASE + 102 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_103 = FLASH_BASE + 103 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_104 = FLASH_BASE + 104 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_105 = FLASH_BASE + 105 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_106 = FLASH_BASE + 106 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_107 = FLASH_BASE + 107 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_108 = FLASH_BASE + 108 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_109 = FLASH_BASE + 109 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_110 = FLASH_BASE + 110 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_111 = FLASH_BASE + 111 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_112 = FLASH_BASE + 112 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_113 = FLASH_BASE + 113 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_114 = FLASH_BASE + 114 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_115 = FLASH_BASE + 115 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_116 = FLASH_BASE + 116 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_117 = FLASH_BASE + 117 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_118 = FLASH_BASE + 118 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_119 = FLASH_BASE + 119 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_120 = FLASH_BASE + 120 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_121 = FLASH_BASE + 121 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_122 = FLASH_BASE + 122 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_123 = FLASH_BASE + 123 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_124 = FLASH_BASE + 124 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_125 = FLASH_BASE + 125 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_126 = FLASH_BASE + 126 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_127 = FLASH_BASE + 127 * FLASH_ONE_PAGE_SIZE, + FLASH_PAGE_MAX = FLASH_PAGE_127 +#else + FLASH_PAGE_MAX = FLASH_PAGE_63 +#endif +} FLASH_SectorAddr; + +/** + * @brief Flash operation word enumeration definition. + */ +typedef enum { + FLASH_OPERATION_READ = 0x00000001U, + FLASH_OPERATION_PROGRAM = 0x00000002U, + FLASH_OPERATION_ERASE = 0x00000004U, + FLASH_OPERATION_MASS_ERASE = 0x00000006U +} FLASH_OperationType; + +/** + * @brief Flash operation cmd code enumeration definition. + */ +typedef enum { + FLASH_CMD_READ = 0x00000001U, + FLASH_CMD_MAIN_PROGEAM = 0x00000002U, + FLASH_CMD_INFO_PROGEAM = 0x00000003U, + FLASH_CMD_MAIN_ERASE = 0x00000004U, + FLASH_CMD_INFO_ERASE = 0x00000005U, + FLASH_CMD_MASS_ERASE = 0x00000006U +} FLASH_CmdCodeType; + +/** + * @brief Callback Triggering Event Enumeration Definition + */ +typedef enum { + FLASH_WRITE_EVENT_SUCCESS, + FLASH_WRITE_EVENT_DONE, + FLASH_WRITE_EVENT_FAIL, + FLASH_ERASE_EVENT_SUCCESS, + FLASH_ERASE_EVENT_DONE, + FLASH_ERASE_EVENT_FAIL, +} FLASH_CallBackEvent; + +/** + * @brief FLASH extend handle, configuring some special parameters. + */ +typedef struct { + unsigned int onceOperateLen; /* Length of the flash memory to be operaten, write unit: byte, erase unit: page. */ +} FLASH_ExtendHandle; + +/** + * @brief User-defined callback function. + */ +typedef struct { + /** Event callback function of the flash module */ + void (*FlashCallBack)(void *handle, FLASH_CallBackEvent event, unsigned int opAddr); +} FLASH_UserCallBcak; +/** + * @} + */ + +/** + * @defgroup FLASH_Reg_Def FLASH Register Definition + * @brief register mapping structure + * @{ + */ + +/** + * @brief EFLASH command registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cmd_start : 1; /**< Write 0:no effect, 1:start cmd operation; + Read 0:cmd operation is complete, 1:cmd operation isn't complete. */ + unsigned int reserved0 : 5; + unsigned int exec_state : 2; /**< Read 0: no operation or operation completed, + 1: an operation is being performed, + 2: the operation is complete. */ + unsigned int cmd_code : 3; /**< Values represent 1: read, + 2: main_rgn Program, + 3: info_rgn Program, + 4: main_rgn Erase, + 5: info_rgn Erase, + 6: mass erase. */ + unsigned int reserved1 : 9; + unsigned int cmd_pgm_size : 6; /**< Program Size, unit:word(32bits). + 0x0:2, 0x1:4, 0x2:8,..., 0x0F:60, 0x10:64, + other values are invalid. */ + unsigned int reserved2 : 2; + unsigned int cmd_read_size : 2; /**< Read Size, unit:word(32bits). 0x0:1, 0x1:4, 0x2:8, 0x3:12. */ + unsigned int reserved3 : 2; + } BIT; +} volatile EFLASH_CMD_REG; + +/** + * @brief EFLASH address registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 2; + unsigned int cmd_addr : 22; /**< Program, erase, or read start address register. Unit:byte(8bits). + start address of Main_rgn: 0x00_0000, + start address of info_rgn: 0x80_0000, + note: the lower 2 bits cannot be written. */ + unsigned int reserved1 : 8; + } BIT; +} volatile EFLASH_ADDR_REG; + +/** + * @brief Command configuration registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 1; + unsigned int int_mode : 1; /**< Command operation mode 0:blocking mode, 1:interrupt mode. */ + unsigned int reserved1 : 30; + } BIT; +} volatile CMD_CFG_COMMON_REG; + +/** + * @brief The raw interrupt status registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 4; + unsigned int int_raw_finish : 1; /**< Operation completion status, + 0:no operation performed or operation completed, + 1:the operation completed. */ + unsigned int reserved1 : 11; + unsigned int int_raw_err_illegal : 1; /**< Invalid cmd operation errors, 0:no errors, + 1:cmd operation error. */ + unsigned int int_raw_err_erase : 1; /**< ERASE error, 0:pass, 1:failure. */ + unsigned int int_raw_err_ahb : 1; /**< AHB request error, 0:no errors, 1:AHB read address request + exceeds the range of MAIN Information Region or + AHB write request occurs. */ + unsigned int int_raw_err_ecc_corr : 1; /**< MAIN Information Region Read Data ECC Correction Error, + 0:no errors, 1:Uncorrectable ECC error occurred. */ + unsigned int int_raw_err_ecc_chk : 1; /**< MAIN Information Region read data ECC error, 0:no errors, + 1:an ECC check error occurred. */ + unsigned int reserved2 : 11; + } BIT; +} volatile INT_RAW_STATUS_REG; + +/** + * @brief The interrupt status registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 4; + unsigned int int_finish : 1; /**< Operation completion status, + 0:no operation performed or operation completed, + 1:the operation completed. */ + unsigned int reserved1 : 11; + unsigned int int_err_illegal : 1; /**< Invalid cmd operation errors, 0:no errors, + 1:cmd operation error. */ + unsigned int int_err_erase : 1; /**< ERASE error, 0:pass, 1:failure. */ + unsigned int int_err_ahb : 1; /**< AHB request error, 0:no errors, 1:AHB read address request + exceeds the range of MAIN Information Region or + AHB write request occurs. */ + unsigned int int_err_ecc_corr : 1; /**< MAIN Information Region Read Data ECC Correction Error, 0:no errors, + 1:Uncorrectable ECC error occurred. */ + unsigned int int_err_ecc_chk : 1; /**< MAIN Information Region read data ECC error, 0:no errors, + 1:an ECC check error occurred. */ + unsigned int reserved2 : 11; + } BIT; +} volatile INT_STATUS_REG; + +/** + * @brief The interrupt enable configuration registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 4; + unsigned int int_en_finish : 1; /**< Operation completion interrupt enable, 0:disable, 1:enable. */ + unsigned int reserved1 : 11; + unsigned int int_en_err_illegal : 1; /**< Invalid Cmd operation error interrupt enable, + 0:disable, 1:enable. */ + unsigned int int_en_err_erase : 1; /**< ERASE error interrupt enable, 0:disable, 1:enable. */ + unsigned int int_en_err_ahb : 1; /**< AHB request error interrupt enable, 0:disable, 1:enable. */ + unsigned int int_en_err_ecc_corr : 1; /**< Main Information region read data ECC correction error interrupt, + 0:disable, 1:enable. */ + unsigned int int_en_err_ecc_chk : 1; /**< Main Information region read data ECC check error interrupt enable, + 0:disable, 1:enable. */ + unsigned int reserved2 : 11; + } BIT; +} volatile INT_ENABLE_REG; + +/** + * @brief Interrupt clear registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 4; + unsigned int int_clr_finish : 1; /**< Operation completion interrupt clear, 0:not clear, + 1:clear raw interrupts and interrupt status. */ + unsigned int reserved1 : 11; + unsigned int int_clr_err_illegal : 1; /**< Invalid CMD operation error interrupt clear, 0:not clear, + 1:clear raw interrupts and interrupt status. */ + unsigned int int_clr_err_erase : 1; /**< erase error interrupt clear, 0:not clear, + 1:clear raw interrupts and interrupt status. */ + unsigned int int_clr_err_ahb : 1; /**< AHB request error interrupt clear, 0:not clear, + 1:clear raw interrupts and interrupt status. */ + unsigned int int_clr_err_ecc_corr : 1; /**< Main Information region read data ECC correction error + interrupt clear, 0:not clear, + 1:clear raw interrupts and interrupt status. */ + unsigned int int_clr_err_ecc_chk : 1; /**< Main Information region read data ECC error interrupt clear, + 0:not clear, 1:clear raw interrupts and interrupt status. */ + unsigned int reserved2 : 11; + } BIT; +} volatile INT_CLEAR_REG; + +/** + * @brief Prefetch control registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int prefetch_enable : 1; /**< Prefetch control enable, 0:disabled, 1:enable. */ + unsigned int reserved0 : 7; + unsigned int prefetch_invalid_req : 1; /**< Cache Data Invalid Request Control. */ + unsigned int reserved1 : 23; + } BIT; +} volatile PREFETCH_CTRL_REG; + +/** + * @brief Cache control registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cache_enable : 1; /**< Prefetch control enable, 0:disabled, 1:enable. */ + unsigned int reserved0 : 3; + unsigned int cache_replacement_sel : 1; /**< Cache replacement policy selection, 0:PLRU policy, + 1:round robin policy. */ + unsigned int reserved1 : 3; + unsigned int cache_invalid_req : 1; /**< Cache data invalid request, 0:invalidation, + 1:request cache invalid. */ + unsigned int reserved2 : 3; + unsigned int cache_policy_sel : 1; /**< Selecting a cache policy, 0:Normal Cache, + 1:Branch Cache. */ + unsigned int reserved3 : 19; + } BIT; +} volatile CACHE_CTRL_REG; + +/** + * @brief Flash ECC error detection and correction enable control registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int flash_main_ecc_check_enable : 1; /**< Flash Main region error detection enable, + 0:no ECC check, 1:ECC check. */ + unsigned int flash_main_ecc_correct_enable : 1; /**< Flash Main region error correction enable, + 0:no ECC correction, 1:ECC correction. */ + unsigned int flash_info_ecc_check_enable : 1; /**< Flash Information region ECC error detection enable, + 0:no ECC check, 1:ECC check. */ + unsigned int flash_info_ecc_correct_enable : 1; /**< Flash Information region ECC error correction function, + 0:no ECC correction, 1:ECC correction. */ + unsigned int flash_ecc_blank_filter_enable : 1; /**< Flash unprogrammed area ECC mask and filter enable, + 0:disable, 1:enable. */ + unsigned int reserved0 : 27; + } BIT; +} volatile FLASH_ECC_CTRL_REG; + +/** + * @brief Flash status registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int opcode_illegal : 3; /**< Invalid opcode value. */ + unsigned int reserved0 : 1; + unsigned int mid_illegal : 3; /**< Invalid mid value. */ + unsigned int reserved1 : 1; + unsigned int info_rgn0_illegal : 1; /**< Illegally operation info_rgn0, 0:no error, + 1:illegally access occurs. */ + unsigned int info_rgn1_illegal : 1; /**< Illegally operation info_rgn1, 0:no error, + 1:illegally access occurs. */ + unsigned int info_rgn2_illegal : 1; /**< Illegally operation info_rgn2, 0:no error, + 1:illegally access occurs. */ + unsigned int reserved2 : 1; + unsigned int main_rgn0_illegal : 1; /**< Illegally operation main_rgn0, 0:no error, + 1:illegally access occurs. */ + unsigned int main_rgn1_illegal : 1; /**< Illegally operation main_rgn1, 0:no error, + 1:illegally access occurs. */ + unsigned int reserved3 : 2; + unsigned int parameter_illegal : 1; /**< Operation parameter is valid, 0:no error, + 1:Operation parameter error. */ + unsigned int address_unmap : 1; /**< Operation address out-of-bounds, 0:no error, + 1:address out-of-bounds error. */ + unsigned int reserved4 : 14; + } BIT; +} volatile FLASH_STATUS_REG; + +/** + * @brief Main region 0 start address registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 2; + unsigned int main_rgn0_start_addr : 15; /**< Region0 Access Start Address, Unit:Word(32bit). */ + unsigned int reserved1 : 15; + } BIT; +} volatile FLASH_REGION_0_START_ADDR_REG; + +/** + * @brief Main region 0 end address registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 2; + unsigned int main_rgn0_end_addr : 15; /**< Region0 Access End Address, Unit:Word(32bit). */ + unsigned int reserved1 : 15; + } BIT; +} volatile FLASH_REGION_0_END_ADDR_REG; + +/** + * @brief Main region0 control registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int main_rgn0_mid_r : 8; /**< Indicates the mid that allows the read operation on region0. */ + unsigned int main_rgn0_mid_p : 8; /**< Indicates the MID that allows programming operations on region0. */ + unsigned int main_rgn0_mid_e : 8; /**< Indicates the MID that allows the erase operation on region0. */ + unsigned int reserved0 : 7; + unsigned int main_rgn0_active : 1; /**< Activate Zone Access Control, 0:not activated, 1:activated. */ + } BIT; +} volatile FLASH_REGION_0_CTRL_REG; + +/** + * @brief Main region 1 start address registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 2; + unsigned int main_rgn1_start_addr : 15; /**< Region1 Access Start Address, Unit:Word(32bit). */ + unsigned int reserved1 : 15; + } BIT; +} volatile FLASH_REGION_1_START_ADDR_REG; + +/** + * @brief Main region 1 end address registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 2; + unsigned int main_rgn1_end_addr : 15; /**< Region1 Access end Address, Unit:Word(32bit). */ + unsigned int reserved1 : 15; + } BIT; +} volatile FLASH_REGION_1_END_ADDR_REG; + +/** + * @brief Main region1 control registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int main_rgn1_mid_r : 8; /**< Indicates the mid that allows the read operation on region1. */ + unsigned int main_rgn1_mid_p : 8; /**< Indicates the MID that allows programming operations on region1. */ + unsigned int main_rgn1_mid_e : 8; /**< Indicates the MID that allows the erase operation on region1. */ + unsigned int reserved0 : 7; + unsigned int main_rgn1_active : 1; /**< Activate Zone Access Control, 0:not activated, 1:activated. */ + } BIT; +} volatile FLASH_REGION_1_CTRL_REG; + +/** + * @brief Flash Module information 1 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int page_size : 16; /**< Info_rgn0/info_rgn1 capacity, unit:byte. */ + unsigned int information_capacity : 16; /**< Eflash page capacity, unit:byte. */ + } BIT; +} volatile EFLASH_CAPACITY_1_REG; + +/** + * @brief Flash Module information 2 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int io_read_length : 4; /**< Read I/O size. */ + unsigned int io_write_length_information : 4; /**< Write info region I/O size. */ + unsigned int io_write_length_main : 4; /**< Write main region I/O size. */ + unsigned int min_pgm_size_information : 4; /**< Minimal programming size of information region. */ + unsigned int min_pgm_size_main : 4; /**< Minimal programming size of main region. */ + unsigned int max_pgm_size : 4; /**< Max programming size. */ + unsigned int min_erase_size : 4; /**< Minimal erase size. */ + unsigned int reserved0 : 4; + } BIT; +} volatile EFLASH_CAPACITY_2_REG; + +/** + * @brief Flash clears the programming data buffer registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pgm_wdata_clr : 1; /**< Clear Control, 0:no effect, 1:clear current buffer. */ + unsigned int reserved0 : 7; + unsigned int pgm_wbuf_cnt : 8; /**< Obtains the size of the data in the buffer, unit:word. */ + unsigned int reserved1 : 16; + } BIT; +} volatile BUF_CLEAR_REG; + +/** + * @brief Flash clock divider registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 4; + unsigned int nread_div : 4; /**< Ratio of the system bus master clock to EFlash clock (n + 1). */ + unsigned int reserved1 : 12; + unsigned int busclk_sw_req : 1; /**< Check the cur_read_vref_cal or nread_div switchover is complete, + read 0:no finish, 1:finish. */ + unsigned int busclk_sw_protect : 1; /**< Frequency switching process protection, 0:enable, 1:disable. */ + unsigned int cur_read_vref_cal : 1; /**< Flash reference voltage calibration completion indicator. */ + unsigned int reserved2 : 1; + unsigned int data_vld_sel : 2; /**< Data_vld: one beat in advance or one beat later, + 0x0 and 0x01:no change, 0x02:take an early beat, + 0x03:delay a beat */ + unsigned int reserved3 : 6; + } BIT; +} volatile EFLASH_CLK_CFG_REG; + +/** + * @brief FLASH Register definition structure + */ +typedef struct { + EFLASH_CMD_REG EFLASH_CMD; /**< Command register, Offset Address: 0x0000. */ + EFLASH_ADDR_REG EFLASH_ADDR; /**< Address register, Offset Address: 0x0004. */ + unsigned char space0[120]; + CMD_CFG_COMMON_REG CMD_CFG_COMMON; /**< CMD configuration register, + Offset Address: 0x0080. */ + unsigned char space1[124]; + INT_RAW_STATUS_REG INT_RAW_STATUS; /**< Raw interrupt status register, + Offset Address: 0x0100. */ + INT_STATUS_REG INT_STATUS; /**< Interrupt status register, + Offset Address: 0x0104. */ + INT_ENABLE_REG INT_ENABLE; /**< Interrupt enable configuration register, + Offset Address: 0x0108. */ + INT_CLEAR_REG INT_CLEAR; /**< Interrupt clear register, + Offset Address: 0x010c. */ + unsigned char space2[16]; + PREFETCH_CTRL_REG PREFETCH_CTRL; /**< Prefetch control register, + Offset Address: 0x0120. */ + CACHE_CTRL_REG CACHE_CTRL; /**< Cache control register, Offset Address: 0x0124. */ + unsigned char space3[4]; + FLASH_ECC_CTRL_REG FLASH_ECC_CTRL; /**< Flash ECC error detection and correction enable + control register, Offset Address: 0x012c. */ + FLASH_STATUS_REG FLASH_STATUS; /**< CMD operation flash status register, + Offset Address: 0x0130. */ + unsigned char space4[4]; + unsigned int AHB_ERR_ADDR; /**< AHB error request address record register, + Offset Address: 0x0138. */ + unsigned char space5[8]; + FLASH_REGION_0_START_ADDR_REG FLASH_REGION0_START_ADDR; /**< Main region 0 start address, + Offset Address: 0x0144. */ + FLASH_REGION_0_END_ADDR_REG FLASH_REGION0_END_ADDR; /**< Main region 0 end address, + Offset Address: 0x0148. */ + FLASH_REGION_0_CTRL_REG FLASH_REGION0_CTRL; /**< Main region0 control register, + Offset Address: 0x014c. */ + FLASH_REGION_1_START_ADDR_REG FLASH_REGION1_START_ADDR; /**< Main region 1 start address, + Offset Address: 0x0150. */ + FLASH_REGION_1_END_ADDR_REG FLASH_REGION1_END_ADDR; /**< Main region 1 end address, + Offset Address: 0x0154. */ + FLASH_REGION_1_CTRL_REG FLASH_REGION1_CTRL; /**< Main region 1 control register, + Offset Address: 0x0158. */ + unsigned char space6[164]; + unsigned int MAGIC_LOCK; /**< CMD magic word protection register, + Offset Address: 0x0200. */ + unsigned char space7[492]; + unsigned int EFLASH_CAPACITY_0; /**< Module information register 0, + Offset Address: 0x03f0. */ + EFLASH_CAPACITY_1_REG EFLASH_CAPACITY_1; /**< Module information register 1, + Offset Address: 0x03f4. */ + EFLASH_CAPACITY_2_REG EFLASH_CAPACITY_2; /**< Module information register 2, + Offset Address: 0x03f8. */ + unsigned char space8[4]; + unsigned int PGM_WDATA; /**< Program data register, Offset Address: 0x0400. */ + unsigned char space9[508]; + unsigned int FLASH_RDATA; /**< Read data register, Offset Address: 0x0600. */ + BUF_CLEAR_REG BUF_CLEAR; /**< Programming data buffer cleanup register, + Offset Address: 0x0604. */ + unsigned int space10[206]; + EFLASH_CLK_CFG_REG EFLASH_CLK_CFG; /**< Clock divider register, Offset Address: 0x0940. */ +} volatile EFC_RegStruct; + +/** + * @} + */ + +/* Parameter check definition-------------------------------------------*/ +/** + * @brief Check Operation mode selection. + * @param opMode Flash Operation mode. + * @retval true + * @retval false + */ +static inline bool IsFlashOperationMode(FLASH_PE_OpMode opMode) +{ + return (opMode == FLASH_PE_OP_BLOCK || + opMode == FLASH_PE_OP_IT); +} + +/** + * @brief Check flash cmd code. + * @param cmdCode Flash cmd code. + * @retval true + * @retval false + */ +static inline bool IsFlashCmdCode(FLASH_CmdCodeType cmdCode) +{ + return (cmdCode == FLASH_CMD_READ || cmdCode == FLASH_CMD_MAIN_PROGEAM || \ + cmdCode == FLASH_CMD_INFO_PROGEAM || cmdCode == FLASH_CMD_MAIN_ERASE || \ + cmdCode == FLASH_CMD_INFO_ERASE || cmdCode == FLASH_CMD_MASS_ERASE); +} + +/** + * @brief Check flash cmd program size. + * @param size cmd program size, unit:Word(32bit). + * @retval true + * @retval false + */ +static inline bool IsFlashCmdProgramSize(unsigned int size) +{ + return size <= FLASH_MAX_CMD_PROGRAM_SIZE; +} + +/** + * @brief Check flash program address. + * @param addr program address, unit:Byte(8bit). + * @retval true + * @retval false + */ +static inline bool IsFlashProgramAddress(unsigned int addr) +{ + return (((addr % FLASH_MIN_PGM_BYTES_SIZE) == 0) && (addr < FLASH_MAX_SIZE)); +} + +/** + * @brief Check flash erase address. + * @param addr erase address, unit:Byte(8bit). + * @retval true + * @retval false + */ +static inline bool IsFlashEraseAddress(unsigned int addr) +{ + return ((addr % FLASH_ONE_PAGE_SIZE) == 0) && (addr <= FLASH_PAGE_MAX); +} + +/** + * @brief Check flash write source addresss. + * @param addr write source addresss. + * @retval true + * @retval false + */ +static inline bool IsFlashWriteSrcAddress(unsigned int addr) +{ + return ((addr >= FLASH_SRAM_START_ADDRESS && addr <= FLASH_SRAM_END_ADDRESS) || + (addr >= FLASH_MAIN_RNG_START_ADDRESS && addr <= FLASH_MAIN_RNG_END_ADDRESS)); +} + +/** + * @brief Check flash erase mode. + * @param mode flash erase mode. + * @retval true + * @retval false + */ +static inline bool IsFlashEraseMode(FLASH_EraseMode mode) +{ + return (mode == FLASH_ERASE_MODE_PAGE || mode == FLASH_ERASE_MODE_CHIP); +} + +/** + * @brief Enable flash command start. + * @param efc FLASH register base address. + * @retval None. + */ +static inline void DCL_FLASH_CmdStartEnable(EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + efcx->EFLASH_CMD.BIT.cmd_start = BASE_CFG_ENABLE; +} + +/** + * @brief Disable flash command start. + * @param efcx FLASH register base address. + * @retval None. + */ +static inline void DCL_FLASH_CmdStartDisable(EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + efcx->EFLASH_CMD.BIT.cmd_start = BASE_CFG_DISABLE; +} + +/** + * @brief Getting flash command start State. + * @param efcx FLASH register base address. + * @retval command start value, 1: Operation complete or no operation, 0: Operation is not complete. + */ +static inline unsigned int DCL_FLASH_GetCmdStartState(const EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + return efcx->EFLASH_CMD.BIT.cmd_start; +} + +/** + * @brief Setting FLASH cmd code. + * @param efcx FLASH register base address. + * @param cmdCode flash cmd code. + * @retval None. + */ +static inline void DCL_FLASH_SetCmdCode(EFC_RegStruct *efcx, FLASH_CmdCodeType cmdCode) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + FLASH_PARAM_CHECK_NO_RET(IsFlashCmdCode(cmdCode)); + efcx->EFLASH_CMD.BIT.cmd_code = cmdCode; +} + +/** + * @brief Getting FLASH cmd code. + * @param efcx FLASH register base address. + * @param cmdCode flash cmd code. + * @retval cmd code, 1:READ, 2:FLASH_CMD_MAIN_PROGEAM, 3:FLASH_CMD_INFO_PROGEAM, 4:FLASH_CMD_MAIN_ERASE, + 5:FLASH_CMD_INFO_ERASE, 6:FLASH_CMD_MASS_ERASE. + */ +static inline unsigned int DCL_FLASH_GetCmdCode(const EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + return efcx->EFLASH_CMD.BIT.cmd_code; +} + +/** + * @brief Setting FLASH cmd program size. + * @param efcx FLASH register base address. + * @param size flash cmd program size, unit:Word(32bit). + * @retval None. + */ +static inline void DCL_FLASH_SetCmdProgramSize(EFC_RegStruct *efcx, unsigned int size) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + FLASH_PARAM_CHECK_NO_RET(IsFlashCmdProgramSize(size)); + efcx->EFLASH_CMD.BIT.cmd_pgm_size = size; +} + +/** + * @brief Getting FLASH cmd program size. + * @param efcx FLASH register base address. + * @retval cmd program size, unit:Word(32bit). + */ +static inline unsigned int DCL_FLASH_GetCmdProgramSize(const EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + return efcx->EFLASH_CMD.BIT.cmd_pgm_size; +} + +/** + * @brief Setting FLASH program start address. + * @param efcx FLASH register base address. + * @param addr flash cmd program start address, unit:Byte(8bit). + * @retval None. + */ +static inline void DCL_FLASH_SetProgramAddress(EFC_RegStruct *efcx, unsigned int addr) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + FLASH_PARAM_CHECK_NO_RET(IsFlashProgramAddress(addr)); + efcx->EFLASH_ADDR.BIT.cmd_addr = addr; +} + +/** + * @brief Setting FLASH erase start address. + * @param efcx FLASH register base address. + * @param addr flash cmd erase start address, unit:Byte(8bit). + * @retval None. + */ +static inline void DCL_FLASH_SetEraseAddress(EFC_RegStruct *efcx, unsigned int addr) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + FLASH_PARAM_CHECK_NO_RET(IsFlashEraseAddress(addr)); + efcx->EFLASH_ADDR.BIT.cmd_addr = addr; +} + +/** + * @brief Getting FLASH cmd program, erase, read start address. + * @param efcx FLASH register base address. + * @retval cmd program, erase, read start address, unit:Byte(8bit). + */ +static inline unsigned int DCL_FLASH_GetCmdStartAddress(const EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + return efcx->EFLASH_ADDR.BIT.cmd_addr; +} + +/** + * @brief Setting FLASH operation mode. + * @param efcx FLASH register base address. + * @param mode flash operation mode. + * @retval None. + */ +static inline void DCL_FLASH_SetOptMode(EFC_RegStruct *efcx, FLASH_PE_OpMode mode) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + FLASH_PARAM_CHECK_NO_RET(IsFlashOperationMode(mode)); + efcx->CMD_CFG_COMMON.BIT.int_mode = mode; +} + +/** + * @brief Getting FLASH operation mode. + * @param efcx FLASH register base address. + * @retval operation mode, 0:FLASH_PE_OP_BLOCK, 1:FLASH_PE_OP_IT. + */ +static inline unsigned int DCL_FLASH_GetOptMode(const EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + return efcx->CMD_CFG_COMMON.BIT.int_mode; +} + +/** + * @brief Obtains the interrupt status. + * @param efcx FLASH register base address. + * @retval Interrupt Status. + */ +static inline unsigned int DCL_FLASH_GetInterrupRawtStatus(const EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + return efcx->INT_RAW_STATUS.reg; +} + +/** + * @brief Configuring Interrupt Enable. + * @param efcx FLASH register base address. + * @param intrEn Corresponding interrupt enable bit, for example, 110011. + * @retval None. + */ +static inline void DCL_FLASH_SetInterruptEn(EFC_RegStruct *efcx, unsigned int intrEn) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + efcx->INT_ENABLE.reg = intrEn; +} + +/** + * @brief Obtaining the Interrupt Enable Configuration. + * @param efcx FLASH register base address. + * @retval Interrupt enable value. + */ +static inline unsigned int DCL_FLASH_GetInterruptEnState(const EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + return efcx->INT_ENABLE.reg; +} + +/** + * @brief Clear Interrupt. + * @param efcx FLASH register base address. + * @param intrRaw Corresponding interrupt bit, for example, 110011. + * @retval None. + */ +static inline void DCL_FLASH_ClearIrq(EFC_RegStruct *efcx, unsigned int intrRaw) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + efcx->INT_CLEAR.reg = intrRaw; +} + +/** + * @brief FLASH cache invalid request enable. + * @param efcx FLASH register base address. + * @retval None. + */ +static inline void DCL_FLASH_CacheInvalidRequestEnable(EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + efcx->CACHE_CTRL.BIT.cache_invalid_req = BASE_CFG_ENABLE; +} + +/** + * @brief FLASH cache invalid request disable. + * @param efcx FLASH register base address. + * @retval None. + */ +static inline void DCL_FLASH_CacheInvalidRequestDisable(EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + efcx->CACHE_CTRL.BIT.cache_invalid_req = BASE_CFG_DISABLE; +} + +/** + * @brief Getting FLASH cache invalid request state. + * @param efcx FLASH register base address. + * @retval state 0:The latest invalid request has been completed, + 1:The latest invalid request is not completed. + */ +static inline unsigned int DCL_FLASH_GetCacheInvalidRequestState(const EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + return efcx->CACHE_CTRL.BIT.cache_invalid_req; +} + +/** + * @brief Getting FLASH command operation status. + * @param efcx FLASH register base address. + * @retval command operation status. + */ +static inline unsigned int DCL_FLASH_GetCommandOptStatus(const EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + return efcx->FLASH_STATUS.reg; +} + +/** + * @brief Setting FLASH magic lock. + * @param efcx FLASH register base address. + * @retval None. + */ +static inline void DCL_FLASH_MagicLock(EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + efcx->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; +} + +/** + * @brief Setting FLASH magic unlock. + * @param efcx FLASH register base address. + * @retval None. + */ +static inline void DCL_FLASH_MagicUnlock(EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + efcx->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; +} + +/** + * @brief Getting FLASH magic lock. + * @param efcx FLASH register base address. + * @retval The value of magic lock, The value 0xFEDC_BA98 indicates magic unlock, others values is magic lock. + */ +static inline unsigned int DCL_FLASH_GetMagicLock(const EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + return efcx->MAGIC_LOCK; +} + +/** + * @brief Setting FLASH program wdata value. + * @param efcx FLASH register base address. + * @param value The value of program wdata. + * @retval None. + */ +static inline void DCL_FLASH_SetProgramWdata(EFC_RegStruct *efcx, unsigned int value) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + efcx->PGM_WDATA = value; +} + +/** + * @brief FLASH program wdata celar enable. + * @param efcx FLASH register base address. + * @retval None. + */ +static inline void DCL_FLASH_ProgramWdataClearEnable(EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + efcx->BUF_CLEAR.BIT.pgm_wdata_clr = BASE_CFG_ENABLE; +} + +/** + * @brief FLASH program wdata celar disable. + * @param efcx FLASH register base address. + * @retval None. + */ +static inline void DCL_FLASH_ProgramWdataClearDisable(EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + efcx->BUF_CLEAR.BIT.pgm_wdata_clr = BASE_CFG_DISABLE; +} + +/** + * @brief Getting FLASH buf clear value. + * @param efcx FLASH register base address. + * @retval None. + */ +static inline unsigned int DCL_FLASH_GetBufClearValue(const EFC_RegStruct *efcx) +{ + FLASH_ASSERT_PARAM(IsEFCInstance(efcx)); + return efcx->BUF_CLEAR.reg; +} + +/** + * @} + */ + +/** + * @} + */ +#endif /* #ifndef McuMagicTag_FLASH_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/flash/src/flash.c b/vendor/others/demo/5-tim_adc/demo/drivers/flash/src/flash.c new file mode 100644 index 000000000..aff56ee93 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/flash/src/flash.c @@ -0,0 +1,749 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file flash.c + * @author MCU Driver Team + * @brief FLASH module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the FLASH. + * + Initialization and de-initialization functions. + * + Read, write, and erase functions. + */ + +/* Includes ------------------------------------------------------------------ */ +#include "flash.h" + +#define FLASH_CRC_SAVE_BUFFER_LEN 2 +#define FLASH_ALL_INTERRUPT_ENABLE 0x001F0010 +#define FLASH_ERR_INTERRUPT_MASK 0x001F0000 +#define FLASH_CMD_INTERRUPT_MASK 0x00000010 + +#define FLASH_KEY_REGISTER_UNLOCK_VALUE 0xFEDCBA98 +#define FLASH_KEY_REGISTER_LOCK_VALUE 0x0 + +#define FLASH_INT_ERR_ECC_CHK_MASK (1 << 20) +#define FLASH_INT_ERR_ECC_CORR_MASK (1 << 19) +#define FLASH_INT_ERR_AHB_MASK (1 << 18) +#define FLASH_INT_ERR_SMWR_MASK (1 << 17) +#define FLASH_INT_ERR_ILLEGAL_MASK (1 << 16) +#define FLASH_INT_FINISH_MASK (1<< 4) + +#define FLASH_INT_CLEAR_ALL 0xFFFFFFFF + +/** + * @brief Check whether errors occur. + * @param handle FLASH handle. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +static BASE_StatusType CheckErrorStatus(FLASH_Handle *handle) +{ + /* Check whether errors occur. */ + if (handle->baseAddress->INT_RAW_STATUS.BIT.int_raw_err_illegal || + handle->baseAddress->INT_RAW_STATUS.BIT.int_raw_err_erase) { + return BASE_STATUS_ERROR; + } + if (handle->baseAddress->FLASH_STATUS.reg != 0) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief Writes to the flash memory in the unit of words. + * @param handle FLASH handle. + * @param wordNum Number of size written, unit: word. + * @retval None. + */ +static void FlashPopulateDefaults(FLASH_Handle *handle, const unsigned int wordNum) +{ + /* Complement missing data values. */ + if (wordNum % FLASH_MIN_PGM_WORDS_SIZE) { + for (unsigned int i = (wordNum % FLASH_MIN_PGM_WORDS_SIZE); i < FLASH_MIN_PGM_WORDS_SIZE; i++) { + handle->baseAddress->PGM_WDATA = 0xFFFFFFFF; /* The default value of flash is 0xFFFFFFFF. */ + } + } +} + +/** + * @brief Writes to the flash memory in the unit of words. + * @param handle FLASH handle. + * @param srcAddr Start address of the data buffer to be written. + * @param destAddr Flash destination address, which must be word-aligned. + * @param size Number of size written, unit: byte. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +static BASE_StatusType FLASH_WriteWords(FLASH_Handle *handle, + const unsigned int srcAddr, + const unsigned int destAddr, + const unsigned int size) +{ + unsigned int *data = NULL; + unsigned int i; + unsigned int writeSize; + unsigned int wordNum; + /* Make sure the last operation is complete. */ + if (handle->baseAddress->EFLASH_CMD.BIT.cmd_start) { + return BASE_STATUS_BUSY; + } + + /* Get the number of last remaining data. */ + wordNum = size / FLASH_ONE_WORD_BYTES_SIZE; + wordNum += ((size % FLASH_ONE_WORD_BYTES_SIZE) == 0) ? 0 : 1; + + handle->baseAddress->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; + /* The mask of program wdata celar is 0xFF. */ + if ((handle->baseAddress->BUF_CLEAR.reg >> FLASH_PGM_WBUF_CNT_POS) & 0xFF) { + handle->baseAddress->BUF_CLEAR.BIT.pgm_wdata_clr = BASE_CFG_SET; /* program wdata celar enable. */ + } + + /* Step 1: Calculated the cmd program size, get srcAddress and get destAddress. */ + writeSize = ((wordNum % FLASH_MIN_PGM_WORDS_SIZE) != 0) ? (wordNum / FLASH_MIN_PGM_WORDS_SIZE + 1) : + wordNum / FLASH_MIN_PGM_WORDS_SIZE; + data = (unsigned int *)(uintptr_t)srcAddr; + handle->baseAddress->EFLASH_ADDR.BIT.cmd_addr = destAddr; + for (i = 0; i < wordNum; i++) { + handle->baseAddress->PGM_WDATA = *data; + data++; + } + /* Complement missing data values. */ + FlashPopulateDefaults(handle, wordNum); + + /* Step 2: Configure the parameters and start programming. */ + handle->baseAddress->EFLASH_CMD.BIT.cmd_pgm_size = writeSize; + handle->baseAddress->EFLASH_CMD.BIT.cmd_code = FLASH_OPERATION_PROGRAM; + handle->baseAddress->EFLASH_CMD.BIT.cmd_start = BASE_CFG_SET; + + /* Step 3: If the blocking mode is used, wait until the program operation is complete. */ + if (handle->peMode == FLASH_PE_OP_BLOCK) { + while (handle->baseAddress->EFLASH_CMD.BIT.cmd_start) { + ; + } + if (CheckErrorStatus(handle) != BASE_STATUS_OK) { + /* Clears data in the cache and clears the interrupt flag. */ + handle->baseAddress->CACHE_CTRL.BIT.cache_invalid_req = BASE_CFG_SET; + handle->baseAddress->INT_CLEAR.reg = FLASH_INT_CLEAR_ALL; + handle->baseAddress->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + return BASE_STATUS_ERROR; + } + handle->baseAddress->CACHE_CTRL.BIT.cache_invalid_req = BASE_CFG_SET; + handle->baseAddress->INT_CLEAR.reg = FLASH_INT_CLEAR_ALL; + } + handle->baseAddress->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + return BASE_STATUS_OK; +} + +/** + * @brief Obtains the number of words to be supplemented for write alignment to prevent cross-page write. + * @param handle FLASH handle. + * @retval Words. + */ +static unsigned int FLASH_GetWriteAlignmentWords(FLASH_Handle *handle) +{ + unsigned int numWords; + /* Step 1: Calculate the number of words occupied at the start address. */ + numWords = handle->destAddr % FLASH_MAX_PGM_WORD_SIZE; + if (numWords > 0) { + /* Step 2: Calculate the number of words in the remaining space of the ROW. */ + return FLASH_MAX_PGM_WORD_SIZE - numWords; + } + return 0; +} + +/** + * @brief Flash erase operation. + * @param handle FLASH handle. + * @param startAddr Erasing start address, which must be aligned with the minimum erasing unit. + * @param mode Erasing operation mode, supporting chip,and page. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +static BASE_StatusType FLASH_EraseWithMode(FLASH_Handle *handle, unsigned int startAddr, unsigned int mode) +{ + /* Make sure the last operation is complete. */ + if (handle->baseAddress->EFLASH_CMD.BIT.cmd_start) { + return BASE_STATUS_BUSY; + } + + handle->baseAddress->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; + + /* Step 1: Configure the erase start address and erase mode, then make cmd_satrt enable. */ + handle->baseAddress->EFLASH_ADDR.BIT.cmd_addr = startAddr; + handle->baseAddress->EFLASH_CMD.BIT.cmd_code = mode; + handle->baseAddress->EFLASH_CMD.BIT.cmd_start = BASE_CFG_SET; + + /* Step 2: If the blocking mode is used, wait until the erase operation is complete. */ + if (handle->peMode == FLASH_PE_OP_BLOCK) { + while (handle->baseAddress->EFLASH_CMD.BIT.cmd_start) { + ; + } + /* Check whether errors occur. */ + if (handle->baseAddress->INT_RAW_STATUS.BIT.int_raw_err_illegal || + handle->baseAddress->INT_RAW_STATUS.BIT.int_raw_err_erase) { + handle->baseAddress->CACHE_CTRL.BIT.cache_invalid_req = BASE_CFG_SET; + handle->baseAddress->INT_CLEAR.reg = FLASH_INT_CLEAR_ALL; + handle->baseAddress->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + return BASE_STATUS_ERROR; + } + if (handle->baseAddress->FLASH_STATUS.reg != 0) { + handle->baseAddress->CACHE_CTRL.BIT.cache_invalid_req = BASE_CFG_SET; + handle->baseAddress->INT_CLEAR.reg = FLASH_INT_CLEAR_ALL; + handle->baseAddress->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + return BASE_STATUS_ERROR; + } + } + handle->baseAddress->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + return BASE_STATUS_OK; +} + +/** + * @brief Write interrupt processing function, + * which completes the internal processing of the write operation in interrupt mode. + * @param handle FLASH handle. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +static BASE_StatusType FLASH_WriteHandler(FLASH_Handle *handle) +{ + unsigned int dataLeft; + unsigned int tempAddr; + BASE_StatusType ret; + /* If the number of bytes to be written is greater than a Row, + data is written based on the bytes number of a row. */ + if ((handle->writeLen / FLASH_MAX_PGM_BYTE_SIZE) > 0) { + handle->handleEx.onceOperateLen = FLASH_MAX_PGM_BYTE_SIZE; + ret = FLASH_WriteWords(handle, handle->srcAddr, handle->destAddr, FLASH_MAX_PGM_BYTE_SIZE); + if (ret != BASE_STATUS_OK) { + handle->handleEx.onceOperateLen = 0; + return ret; + } + } else if (handle->writeLen > 0) { + /* If the number of bytes to be written is less than a Row, + data is written in the unit of words. In addition, if data is less than one word, complete one word. */ + dataLeft = handle->writeLen; + + /* Updata the srcAddress, destAddress and write length. */ + tempAddr = (dataLeft / FLASH_ONE_WORD_BYTES_SIZE); + if (tempAddr == 0) { + tempAddr = FLASH_ONE_WORD_BYTES_SIZE; + } else { /* Get the address change value, aligned with 4words. */ + tempAddr = ((tempAddr % FLASH_ONE_WORD_BYTES_SIZE) == 0) ? tempAddr : + ((tempAddr / FLASH_ONE_WORD_BYTES_SIZE + 1) * FLASH_ONE_WORD_BYTES_SIZE); + } + handle->handleEx.onceOperateLen = tempAddr; + + ret = FLASH_WriteWords(handle, handle->srcAddr, handle->destAddr, dataLeft); + if (ret != BASE_STATUS_OK) { + handle->handleEx.onceOperateLen = 0; + return ret; + } + } + return BASE_STATUS_OK; +} + +/** + * @brief Erase interrupt processing function, + * which completes the internal processing of the erase operation in interrupt mode. + * @param handle FLASH handle. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +static BASE_StatusType FLASH_EraseHandler(FLASH_Handle *handle) +{ + /* Check whether the erasing mode is valid. */ + FLASH_PARAM_CHECK_WITH_RET((handle->destAddr <= (FLASH_PAGE_MAX / FLASH_ONE_WORD_BYTES_SIZE)), BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET((handle->destAddr % (FLASH_ONE_PAGE_WORD_SIZE) == 0), BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET((((FLASH_MAX_PAGE_NUM - (handle->destAddr / FLASH_ONE_PAGE_WORD_SIZE)) >=\ + handle->eraseNum) && handle->eraseNum > 0), BASE_STATUS_ERROR); + + BASE_StatusType ret; + handle->handleEx.onceOperateLen = 0x01; /* Erase 1 page at a time. */ + ret = FLASH_EraseWithMode(handle, handle->destAddr, FLASH_ERASE_MODE_PAGE); + if (ret != BASE_STATUS_OK) { + handle->handleEx.onceOperateLen = 0; + return ret; + } + return BASE_STATUS_OK; +} + +/** + * @brief Initializing the FLASH Module. + * @param handle FLASH handle. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_FLASH_Init(FLASH_Handle *handle) +{ + FLASH_ASSERT_PARAM(handle != NULL); + FLASH_ASSERT_PARAM(IsEFCInstance(handle->baseAddress)); + FLASH_PARAM_CHECK_WITH_RET(IsFlashOperationMode(handle->peMode), BASE_STATUS_ERROR); + + handle->baseAddress->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; /* Unlock key registers */ + if (handle->peMode == FLASH_PE_OP_IT) { + /* Enable the interrupt mode and clear the interrupt flag bit. */ + handle->baseAddress->CMD_CFG_COMMON.BIT.int_mode = BASE_CFG_SET; + handle->baseAddress->INT_ENABLE.reg = FLASH_ALL_INTERRUPT_ENABLE; + handle->baseAddress->INT_CLEAR.reg = FLASH_ALL_INTERRUPT_ENABLE; + } else { + /* If blocking mode is used, disable int_mode. */ + handle->baseAddress->CMD_CFG_COMMON.BIT.int_mode = BASE_CFG_UNSET; + } + handle->baseAddress->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; /* Lock key registers */ + handle->state = FLASH_STATE_READY; + return BASE_STATUS_OK; +} + +/** + * @brief Deinitialize the FLASH Module. + * @param handle FLASH handle. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_FLASH_DeInit(FLASH_Handle *handle) +{ + FLASH_ASSERT_PARAM(handle != NULL); + FLASH_ASSERT_PARAM(IsEFCInstance(handle->baseAddress)); + handle->state = FLASH_STATE_RESET; + handle->userCallBack.FlashCallBack = NULL; /* Clean interrupt callback functions. */ + handle->baseAddress->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; + /* Disable interrupt mode and interrupt enable bit. */ + handle->baseAddress->CMD_CFG_COMMON.BIT.int_mode = BASE_CFG_UNSET; + handle->baseAddress->INT_ENABLE.reg = 0x00000000; + handle->baseAddress->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; /* Locking Key Registers */ + return BASE_STATUS_OK; +} + +/** + * @brief Registering the Callback Function of the Flash Module. + * @param handle FLASH handle. + * @param pcallback Pointer to the callback function. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_FLASH_RegisterCallback(FLASH_Handle *handle, FLASH_CallbackFunType pcallback) +{ + FLASH_ASSERT_PARAM(handle != NULL); + FLASH_ASSERT_PARAM(IsEFCInstance(handle->baseAddress)); + handle->userCallBack.FlashCallBack = pcallback; + return BASE_STATUS_OK; +} + +/** + * @brief blocking write error handle. + * @param handle FLASH handle. + * @retval None. + */ +static void FLASH_WritteBlockingErrorHandle(FLASH_Handle *handle) +{ + handle->baseAddress->CACHE_CTRL.BIT.cache_invalid_req = BASE_CFG_SET; + handle->baseAddress->INT_CLEAR.reg = FLASH_INT_CLEAR_ALL; + handle->state = FLASH_STATE_READY; +} + +/** + * @brief Write the flash memory in blocking mode. + * @param handle FLASH handle. + * @param srcAddr Start address of the data buffer to be written. + * @param destAddr Start address of the flash to be written.The address must be aligned with the minimum writable unit. + * @param srcLen Length of data to be written,unit:bytes. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_FLASH_WriteBlocking(FLASH_Handle *handle, unsigned int srcAddr, + unsigned int destAddr, const unsigned int srcLen) +{ + BASE_StatusType ret; + unsigned int i; + unsigned int currentLen; + unsigned int currentWords; + unsigned int dataLeft; + /* Check related parameters. */ + FLASH_ASSERT_PARAM(handle != NULL); + FLASH_ASSERT_PARAM(IsEFCInstance(handle->baseAddress)); + FLASH_PARAM_CHECK_WITH_RET((handle->peMode == FLASH_PE_OP_BLOCK), BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET(handle->state == FLASH_STATE_READY, BASE_STATUS_ERROR); + /* Check whether the write address is valid. */ + FLASH_PARAM_CHECK_WITH_RET(IsFlashWriteSrcAddress(srcAddr), BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET((destAddr < FLASH_MAX_SIZE), BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET((destAddr % FLASH_MIN_PGM_BYTES_SIZE) == 0, BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET(srcLen > 0, BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET(srcLen <= (FLASH_MAX_SIZE - destAddr), BASE_STATUS_ERROR); + + handle->state = FLASH_STATE_PGM; + handle->destAddr = destAddr / FLASH_ONE_WORD_BYTES_SIZE; /* Convert the destination address unit to word. */ + handle->srcAddr = srcAddr; + + /* Get the number of words in the remaining space of the ROW. */ + currentWords = FLASH_GetWriteAlignmentWords(handle); + /* Step 1: If there is remaining space and write length greater than remaining space, + write data in the remaining space. */ + if (srcLen > (currentWords * FLASH_ONE_WORD_BYTES_SIZE) && currentWords > 0) { + ret = FLASH_WriteWords(handle, handle->srcAddr, handle->destAddr, (currentWords * FLASH_ONE_WORD_BYTES_SIZE)); + if (ret != BASE_STATUS_OK) { + FLASH_WritteBlockingErrorHandle(handle); + return ret; + } + handle->srcAddr += currentWords * FLASH_ONE_WORD_BYTES_SIZE; + handle->destAddr += currentWords; + currentLen = srcLen - currentWords * FLASH_ONE_WORD_BYTES_SIZE; + } else { + currentLen = srcLen; + } + /* Step 2: If the number of bytes to be written is greater than a Row, + data is written based on the bytes number of a row. */ + for (i = 0; i < currentLen / FLASH_MAX_PGM_BYTE_SIZE; i++) { + ret = FLASH_WriteWords(handle, handle->srcAddr, handle->destAddr, FLASH_MAX_PGM_BYTE_SIZE); + if (ret != BASE_STATUS_OK) { + FLASH_WritteBlockingErrorHandle(handle); + return ret; + } + handle->srcAddr += FLASH_MAX_PGM_WORD_SIZE * FLASH_ONE_WORD_BYTES_SIZE; + handle->destAddr += FLASH_MAX_PGM_WORD_SIZE; + } + + /* Get the number of last remaining data. */ + dataLeft = currentLen % FLASH_MAX_PGM_BYTE_SIZE; + if (dataLeft > 0) { /* This branch is executed only when the remaining data is not completely written. */ + ret = FLASH_WriteWords(handle, handle->srcAddr, handle->destAddr, dataLeft); + } + + FLASH_WritteBlockingErrorHandle(handle); + return ret; +} + +/** + * @brief WriteErase the flash memory in blocking mode. + * @param handle FLASH handle. + * @param eraseMode Erasing mode. The options are chip erasing and page erasing. + * @param startAddr Start address of the flash to be erase. The address must be aligned with the minimum erasable unit. + * @param eraseNum Number of pages to be erased. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_FLASH_EraseBlocking(FLASH_Handle *handle, FLASH_EraseMode eraseMode, + FLASH_SectorAddr startAddr, unsigned int eraseNum) +{ + /* Check related parameters. */ + FLASH_ASSERT_PARAM(handle != NULL); + FLASH_ASSERT_PARAM(IsEFCInstance(handle->baseAddress)); + FLASH_PARAM_CHECK_WITH_RET((handle->peMode == FLASH_PE_OP_BLOCK), BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET(handle->state == FLASH_STATE_READY, BASE_STATUS_ERROR); + /* Check whether the erasing mode is valid. */ + FLASH_PARAM_CHECK_WITH_RET(IsFlashEraseMode(eraseMode), BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET((startAddr <= FLASH_PAGE_MAX), BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET((startAddr % FLASH_ONE_PAGE_SIZE == 0) || (eraseMode == FLASH_ERASE_MODE_CHIP),\ + BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET(eraseNum > 0 && eraseNum <= (FLASH_MAX_PAGE_NUM - startAddr / FLASH_ONE_PAGE_SIZE),\ + BASE_STATUS_ERROR); + + BASE_StatusType ret = BASE_STATUS_OK; + + handle->eraseNum = eraseNum; + handle->destAddr = startAddr / sizeof(unsigned int); /* Convert the destination address unit to word. */ + handle->state = FLASH_STATE_ERASE; + + if (eraseMode == FLASH_ERASE_MODE_CHIP) { + /* If the FLASH_ERASE_MODE_CHIP mode is used, all contents in the flash memory are erased. */ + ret = FLASH_EraseWithMode(handle, handle->destAddr, FLASH_ERASE_MODE_CHIP); + if (ret != BASE_STATUS_OK) { + handle->baseAddress->CACHE_CTRL.BIT.cache_invalid_req = BASE_CFG_SET; + handle->state = FLASH_STATE_READY; + return ret; + } + } else if (eraseMode == FLASH_ERASE_MODE_PAGE) { + /* If the FLASH_ERASE_MODE_PAGE mode is used, erasing requires page-by-page. */ + while (handle->eraseNum) { + ret = FLASH_EraseHandler(handle); + if (ret != BASE_STATUS_OK) { + handle->baseAddress->CACHE_CTRL.BIT.cache_invalid_req = BASE_CFG_SET; + handle->state = FLASH_STATE_READY; + return ret; + } + /* Updata the erase destAddress and erase number. */ + handle->destAddr += FLASH_ONE_PAGE_SIZE / sizeof(unsigned int); + handle->eraseNum--; + } + } + /* Clear the data in the cache to invalidate the data. */ + handle->baseAddress->CACHE_CTRL.BIT.cache_invalid_req = BASE_CFG_SET; + handle->state = FLASH_STATE_READY; + return ret; +} + +/** + * @brief Write the flash memory in interrupt mode. + * @param handle FLASH handle. + * @param srcAddr Start address of the data buffer to be written. + * @param destAddr Start address of the flash to be written.The address must be aligned with the minimum writable unit. + * @param srcLen Length of data to be written,unit:bytes. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_FLASH_WriteIT(FLASH_Handle *handle, unsigned int srcAddr, + unsigned int destAddr, unsigned int srcLen) +{ + unsigned int currentWords; + BASE_StatusType ret; + /* Check the validity of the base address and operation mode of the flash memory. */ + FLASH_ASSERT_PARAM(handle != NULL); + FLASH_ASSERT_PARAM(IsEFCInstance(handle->baseAddress)); + FLASH_PARAM_CHECK_WITH_RET((handle->peMode == FLASH_PE_OP_IT), BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET(handle->state == FLASH_STATE_READY, BASE_STATUS_ERROR); + /* Check whether the write address is valid. */ + FLASH_PARAM_CHECK_WITH_RET(IsFlashWriteSrcAddress(srcAddr), BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET((destAddr < FLASH_MAX_SIZE), BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET((destAddr % FLASH_MIN_PGM_BYTES_SIZE) == 0, BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET((srcLen > 0), BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET(srcLen <= (FLASH_MAX_SIZE - destAddr), BASE_STATUS_ERROR); + + handle->state = FLASH_STATE_PGM; + handle->destAddr = destAddr / FLASH_ONE_WORD_BYTES_SIZE; /* Convert the destination address unit to word. */ + handle->srcAddr = srcAddr; + handle->writeLen = srcLen; + + /* Get the number of words in the remaining space of the ROW. */ + currentWords = FLASH_GetWriteAlignmentWords(handle); + /* If there is remaining space and write length greater than remaining space, + write data in the remaining space. */ + if (handle->writeLen > (currentWords * FLASH_ONE_WORD_BYTES_SIZE) && currentWords > 0) { + handle->handleEx.onceOperateLen = (currentWords * FLASH_ONE_WORD_BYTES_SIZE); + ret = FLASH_WriteWords(handle, handle->srcAddr, handle->destAddr, (currentWords * FLASH_ONE_WORD_BYTES_SIZE)); + if (ret != BASE_STATUS_OK) { + handle->handleEx.onceOperateLen = 0; + handle->state = FLASH_STATE_READY; + return ret; + } + } else { + /* Write the last remaining data. */ + ret = FLASH_WriteHandler(handle); + if (ret != BASE_STATUS_OK) { + handle->state = FLASH_STATE_READY; + return ret; + } + } + return BASE_STATUS_OK; +} + +/** + * @brief WriteErase the flash memory in interrupt mode. + * @param handle FLASH handle. + * @param eraseMode Erasing mode. The options are chip erasing and page erasing. + * @param startAddr Start address of the flash to be erase. The address must be aligned with the minimum erasable unit. + * @param eraseNum Number of pages to be erased. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_FLASH_EraseIT(FLASH_Handle *handle, FLASH_EraseMode eraseMode, + FLASH_SectorAddr startAddr, unsigned int eraseNum) +{ + BASE_StatusType ret = BASE_STATUS_OK; + FLASH_ASSERT_PARAM(handle != NULL); + FLASH_ASSERT_PARAM(IsEFCInstance(handle->baseAddress)); + FLASH_PARAM_CHECK_WITH_RET((handle->peMode == FLASH_PE_OP_IT), BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET((handle->state == FLASH_STATE_READY), BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET(IsFlashEraseMode(eraseMode), BASE_STATUS_ERROR); + /* Check whether the address is valid. */ + FLASH_PARAM_CHECK_WITH_RET((startAddr <= FLASH_PAGE_MAX), BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET((startAddr % FLASH_ONE_PAGE_SIZE == 0) || (eraseMode == FLASH_ERASE_MODE_CHIP),\ + BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET(eraseNum > 0 && eraseNum <= (FLASH_MAX_PAGE_NUM - startAddr / FLASH_ONE_PAGE_SIZE),\ + BASE_STATUS_ERROR); + /* Obtains the value entered by the user. */ + handle->eraseNum = eraseNum; + handle->state = FLASH_STATE_ERASE; + handle->destAddr = startAddr / sizeof(unsigned int); /* Convert the destination address unit to word. */ + + if (eraseMode == FLASH_ERASE_MODE_CHIP) { + /* If the FLASH_ERASE_MODE_CHIP mode is used, all contents in the flash memory are erased. */ + handle->handleEx.onceOperateLen = handle->eraseNum; + ret = FLASH_EraseWithMode(handle, handle->destAddr, FLASH_ERASE_MODE_CHIP); + if (ret != BASE_STATUS_OK) { + handle->handleEx.onceOperateLen = 0; + handle->state = FLASH_STATE_READY; + return ret; + } + } else if (eraseMode == FLASH_ERASE_MODE_PAGE) { + /* If the FLASH_ERASE_MODE_PAGE mode is used, erasing requires page-by-page. */ + ret = FLASH_EraseHandler(handle); + if (ret != BASE_STATUS_OK) { + handle->state = FLASH_STATE_READY; + return ret; + } + } + return BASE_STATUS_OK; +} + +/** + * @brief Interface for reading data from the flash memory. + * @param handle FLASH handle. + * @param srcAddr Flash address of the data to be read. The address must be aligned with the minimum readable unit. + * @param readLen Read Data Length,unit:bytes. + * @param dataBuff Buffer for storing read data. + * @param buffLen Buffer size for storing read data,unit:bytes. + * @retval BASE_StatusType: BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT. + */ +BASE_StatusType HAL_FLASH_Read(FLASH_Handle *handle, + unsigned int srcAddr, + unsigned int readLen, + unsigned char *dataBuff, + unsigned int buffLen) +{ + unsigned char *ptemp = NULL; + unsigned char *dtemp = NULL; + unsigned int tempLen = readLen; +#ifndef FLASH_PARAM_CHECK + BASE_FUNC_UNUSED(handle); /* Used to avoid code check alarm prompts. */ +#endif + FLASH_ASSERT_PARAM(handle != NULL); + FLASH_ASSERT_PARAM(IsEFCInstance(handle->baseAddress)); + FLASH_ASSERT_PARAM(dataBuff != NULL); + FLASH_PARAM_CHECK_WITH_RET(srcAddr < FLASH_MAX_SIZE, BASE_STATUS_ERROR); + FLASH_PARAM_CHECK_WITH_RET(readLen <= (FLASH_MAX_SIZE - srcAddr), BASE_STATUS_ERROR); + + dtemp = dataBuff; + /* The basic offset address needs to be added to srcAddress. */ + ptemp = (unsigned char *)(uintptr_t)srcAddr + FLASH_READ_BASE; + if (readLen > buffLen) { + return BASE_STATUS_ERROR; + } + while (tempLen > 0) { /* Read data cyclically. */ + tempLen--; + *dtemp++ = *ptemp++; + } + return BASE_STATUS_OK; +} + +/** + * @brief Interrupt Processing Write. + * @param handle FLASH handle. + * @param status Interrupt status + * @retval None + */ +static void InterruptWriteHandle(FLASH_Handle *handle, unsigned int status) +{ + /* Check whether the parameter is valid. */ + FLASH_PARAM_CHECK_NO_RET(IsFlashWriteSrcAddress(handle->srcAddr)); + FLASH_PARAM_CHECK_NO_RET((handle->destAddr % FLASH_MIN_PGM_WORDS_SIZE) == 0); + FLASH_PARAM_CHECK_NO_RET((handle->destAddr <= (FLASH_MAX_SIZE / FLASH_ONE_WORD_BYTES_SIZE))); + FLASH_PARAM_CHECK_NO_RET(handle->writeLen <= (FLASH_MAX_SIZE - (handle->destAddr * FLASH_ONE_WORD_BYTES_SIZE))); + /* One operation complete */ + if ((status & FLASH_INT_FINISH_MASK) > 0) { + if (handle->userCallBack.FlashCallBack != NULL) { + handle->userCallBack.FlashCallBack(handle, FLASH_WRITE_EVENT_SUCCESS, handle->destAddr); + } + } + /* All operations are complete. */ + if (handle->writeLen == 0) { + if (handle->userCallBack.FlashCallBack != NULL) { + handle->userCallBack.FlashCallBack(handle, FLASH_WRITE_EVENT_DONE, handle->destAddr); + } + handle->baseAddress->CACHE_CTRL.BIT.cache_invalid_req = BASE_CFG_SET; + handle->state = FLASH_STATE_READY; + } else { + FLASH_WriteHandler(handle); + } +} + +/** + * @brief Interrupt processing erase. + * @param handle FLASH handle. + * @param status Interrupt status + * @retval None + */ +static void InterruptEraseHandle(FLASH_Handle *handle, unsigned int status) +{ + /* One operation complete */ + if ((status & FLASH_INT_FINISH_MASK) > 0) { + if (handle->userCallBack.FlashCallBack != NULL) { + handle->userCallBack.FlashCallBack(handle, FLASH_ERASE_EVENT_SUCCESS, handle->destAddr); + } + } + /* All operations are complete. */ + if (handle->eraseNum == 0) { + if (handle->userCallBack.FlashCallBack != NULL) { + handle->userCallBack.FlashCallBack(handle, FLASH_ERASE_EVENT_DONE, handle->destAddr); + } + handle->baseAddress->CACHE_CTRL.BIT.cache_invalid_req = BASE_CFG_SET; + handle->state = FLASH_STATE_READY; + } else { + FLASH_EraseHandler(handle); + } +} + +/** + * @brief Interrupt Handling Function. + * @param handle Handle pointers + * @retval None + */ +void HAL_FLASH_IrqHandler(void *handle) +{ + FLASH_Handle *flashHandle = (FLASH_Handle *)handle; + unsigned int status; + FLASH_ASSERT_PARAM(flashHandle != NULL); + FLASH_ASSERT_PARAM(IsEFCInstance(flashHandle->baseAddress)); + FLASH_PARAM_CHECK_NO_RET(flashHandle->peMode == FLASH_PE_OP_IT); + + status = flashHandle->baseAddress->INT_RAW_STATUS.reg; + flashHandle->baseAddress->INT_CLEAR.reg = status & FLASH_CMD_INTERRUPT_MASK; + /* Invoke the function for programming or erasing. */ + if (flashHandle->state == FLASH_STATE_PGM) { /* If state is FLASH_STATE_PGM, call write callback function. */ + if (flashHandle->writeLen < flashHandle->handleEx.onceOperateLen) { + flashHandle->writeLen = 0; + flashHandle->destAddr += flashHandle->handleEx.onceOperateLen >> 0x02; + } else { + flashHandle->writeLen -= flashHandle->handleEx.onceOperateLen; + flashHandle->srcAddr += flashHandle->handleEx.onceOperateLen; + flashHandle->destAddr += flashHandle->handleEx.onceOperateLen >> 0x02; /* Unit conversion to word */ + } + flashHandle->handleEx.onceOperateLen = 0; + InterruptWriteHandle(flashHandle, status); + } else if (flashHandle->state == FLASH_STATE_ERASE) { + if (flashHandle->handleEx.onceOperateLen != 0x00) { /* Erase page data valid. */ + flashHandle->destAddr += + (FLASH_ONE_PAGE_SIZE * flashHandle->handleEx.onceOperateLen) / sizeof(unsigned int); + flashHandle->eraseNum -= flashHandle->handleEx.onceOperateLen; + } else { + flashHandle->eraseNum = 0; /* Illegal state generation, and the status data is cleared. */ + } + flashHandle->handleEx.onceOperateLen = 0; + + /* If state is FLASH_STATE_ERASE, call erase callback function. */ + InterruptEraseHandle(flashHandle, status); + } +} + +/** + * @brief Flash Error interrupt Handling Function. + * @param handle Handle pointers + * @retval None + */ +void HAL_FLASH_IrqHandlerError(void *handle) +{ + FLASH_Handle *flashHandle = (FLASH_Handle *)handle; + unsigned int status; + FLASH_ASSERT_PARAM(flashHandle != NULL); + FLASH_ASSERT_PARAM(IsEFCInstance(flashHandle->baseAddress)); + status = flashHandle->baseAddress->INT_RAW_STATUS.reg; + flashHandle->baseAddress->INT_CLEAR.reg = status & FLASH_ERR_INTERRUPT_MASK; + + /* If any error occurs, call the programming error or erase error callback function. */ + if ((status & (FLASH_INT_ERR_ECC_CHK_MASK | FLASH_INT_ERR_ECC_CORR_MASK | + FLASH_INT_ERR_AHB_MASK | FLASH_INT_ERR_SMWR_MASK | FLASH_INT_ERR_ILLEGAL_MASK)) > 0) { + if (flashHandle->userCallBack.FlashCallBack != NULL) { + switch (flashHandle->state) { + case FLASH_STATE_PGM : /* If state is FLASH_STATE_PGM, call write error callback function. */ + flashHandle->userCallBack.FlashCallBack(flashHandle, FLASH_WRITE_EVENT_FAIL, flashHandle->destAddr); + break; + case FLASH_STATE_ERASE : /* If state is FLASH_STATE_ERASE, call erase error callback function. */ + flashHandle->userCallBack.FlashCallBack(flashHandle, FLASH_ERASE_EVENT_FAIL, flashHandle->destAddr); + break; + default: + break; + } + } + flashHandle->state = FLASH_STATE_READY; + } +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/gpio/common/inc/gpio.h b/vendor/others/demo/5-tim_adc/demo/drivers/gpio/common/inc/gpio.h new file mode 100644 index 000000000..21cb00f3e --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/gpio/common/inc/gpio.h @@ -0,0 +1,95 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file gpio.h + * @author MCU Driver Team + * @brief GPIO module driver + * @details The header file contains the following declaration: + * + GPIO handle structure definition. + * + Initialization functions. + * + GPIO Set And Get Functions. + * + Interrupt Service Functions. + */ + +#ifndef McuMagicTag_GPIO_H +#define McuMagicTag_GPIO_H + +/* Includes ------------------------------------------------------------------*/ +#include "gpio_ip.h" + +/* Macro definition */ +/** + * @defgroup GPIO GPIO + * @brief GPIO module. + * @{ + */ + +/** + * @defgroup GPIO_Common GPIO Common + * @brief GPIO common external module. + * @{ + */ + +/** + * @defgroup GPIO_Handle_Definition GPIO Handle Definition + * @{ + */ + +/* Typedef definitions -------------------------------------------------------*/ +typedef void (* GPIO_CallbackType)(void *param); + +typedef struct _GPIO_Handle { + GPIO_RegStruct *baseAddress; /**< GPIO Registers. */ + unsigned int pins; /**< Selected GPIO Pins. */ + GPIO_UserCallBcak userCallBack; /**< User-defined callback function. */ + GPIO_ExtendHandle handleEx; /**< Extend handle, configuring some special parameters. */ +} GPIO_Handle; + +/** + * @} + */ + +/** + * @defgroup GPIO_API_Declaration GPIO HAL API + * @{ + */ +void HAL_GPIO_Init(GPIO_Handle *handle); +void HAL_GPIO_DeInit(GPIO_Handle *handle); +void HAL_GPIO_SetDirection(GPIO_Handle *handle, unsigned int pins, GPIO_Direction dir); +void HAL_GPIO_SetValue(GPIO_Handle *handle, unsigned int pins, GPIO_Value value); +GPIO_InterruptMode HAL_GPIO_GetPinIrqType(GPIO_Handle *handle, GPIO_PIN pin); +GPIO_Value HAL_GPIO_GetPinValue(GPIO_Handle *handle, GPIO_PIN pin); +unsigned int HAL_GPIO_GetAllValue(GPIO_Handle *handle); +GPIO_Direction HAL_GPIO_GetPinDirection(GPIO_Handle *handle, GPIO_PIN pin); +unsigned int HAL_GPIO_GetAllDirection(GPIO_Handle *handle); +void HAL_GPIO_TogglePin(GPIO_Handle *handle, unsigned int pins); +BASE_StatusType HAL_GPIO_SetIrqType(GPIO_Handle *handle, unsigned int pins, GPIO_InterruptMode mode); +void HAL_GPIO_RegisterCallBack(GPIO_Handle *handle, GPIO_PIN pin, GPIO_CallbackType pCallback); +void HAL_GPIO_IrqHandler(void *handle); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_GPIO_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/gpio/inc/gpio_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/gpio/inc/gpio_ip.h new file mode 100644 index 000000000..ebf8d09eb --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/gpio/inc/gpio_ip.h @@ -0,0 +1,678 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file gpio_ip.h + * @author MCU Driver Team + * @brief GPIO module driver + * @details The header file contains the following declaration: + * + GPIO configuration enums. + * + GPIO register structures. + * + GPIO DCL Functions. + * + Parameters check functions. + */ + +#ifndef McuMagicTag_GPIO_IP_H +#define McuMagicTag_GPIO_IP_H + +/* Includes ------------------------------------------------------------------*/ +#include "baseinc.h" +/* Macro definitions ---------------------------------------------------------*/ +#ifdef GPIO_PARAM_CHECK + #define GPIO_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM + #define GPIO_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET + #define GPIO_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else + #define GPIO_ASSERT_PARAM(para) ((void)0U) + #define GPIO_PARAM_CHECK_NO_RET(para) ((void)0U) + #define GPIO_PARAM_CHECK_WITH_RET(param, ret) ((void)0U) +#endif + +/** + * @addtogroup GPIO + * @{ + */ + +/** + * @defgroup GPIO_IP + * @{ + */ + +/* Macro definitions ---------------------------------------------------------*/ +#define GPIO_PIN_NUM (0x00000008U) +#define GPIO_PIN_MASK (0x000000FFU) + +/** + * @defgroup GPIO_Param_Def GPIO Parameters Definition + * @brief Description of GPIO configuration parameters. + * @{ + */ + +/* Typedef definitions -------------------------------------------------------*/ +/** + * @brief GPIO PIN enum definition + */ +typedef enum { + GPIO_PIN_0 = 0x00000001U, + GPIO_PIN_1 = 0x00000002U, + GPIO_PIN_2 = 0x00000004U, + GPIO_PIN_3 = 0x00000008U, + GPIO_PIN_4 = 0x00000010U, + GPIO_PIN_5 = 0x00000020U, + GPIO_PIN_6 = 0x00000040U, + GPIO_PIN_7 = 0x00000080U, + GPIO_PIN_ALL = 0x000000FFU +} GPIO_PIN; + +/** + * @brief GPIO PIN value enum definition. + */ +typedef enum { + GPIO_LOW_LEVEL = 0x00000000U, + GPIO_HIGH_LEVEL = 0x00000001U +} GPIO_Value; + +/** + * @brief GPIO direction mode enum definition. + * @details status flag: + * + GPIO_INPUT_MODE -- GPIO pin as input, + * maximum input voltage of 3.63V for all types of I/O except 5V I/O, + * maximum input voltage of 5.0V for 5V I/O type. + * + GPIO_OUTPUT_MODE -- GPIO pin as output, + */ +typedef enum { + GPIO_INPUT_MODE = 0x00000000U, + GPIO_OUTPUT_MODE = 0x00000001U +} GPIO_Direction; + +/** + * @brief GPIO interrupt mode enum definition. + */ +typedef enum { + GPIO_INT_TYPE_FALL_EDGE = 0x00000000U, + GPIO_INT_TYPE_RISE_EDGE = 0x00000001U, + GPIO_INT_TYPE_LOW_LEVEL = 0x00000002U, + GPIO_INT_TYPE_HIGH_LEVEL = 0x00000003U, + GPIO_INT_TYPE_BOTH_EDGE = 0x00000004U, + GPIO_INT_TYPE_NONE = 0x00000005U +} GPIO_InterruptMode; + +/** + * @brief GPIO extend handle, configuring some special parameters. + */ +typedef struct { +} GPIO_ExtendHandle; + +/** + * @brief User-defined callback function. + */ +typedef struct { + /* GPIO pin callback functions */ + struct { + GPIO_PIN pin; + void (*callbackFunc)(void* handle); + } GPIO_CallbackFuncs[GPIO_PIN_NUM]; +} GPIO_UserCallBcak; + +/** + * @} + */ + +/** + * @defgroup GPIO_Reg_Def GPIO Register Definition + * @brief Description GPIO register mapping structure. + * @{ + */ + +/** + * @brief GPIO data registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pin0 : 1; /**< pin0 0:Input Data, 1:OutPut Data. */ + unsigned int pin1 : 1; /**< pin1 0:Input Data, 1:OutPut Data. */ + unsigned int pin2 : 1; /**< pin2 0:Input Data, 1:OutPut Data. */ + unsigned int pin3 : 1; /**< pin3 0:Input Data, 1:OutPut Data. */ + unsigned int pin4 : 1; /**< pin4 0:Input Data, 1:OutPut Data. */ + unsigned int pin5 : 1; /**< pin5 0:Input Data, 1:OutPut Data. */ + unsigned int pin6 : 1; /**< pin6 0:Input Data, 1:OutPut Data. */ + unsigned int pin7 : 1; /**< pin7 0:Input Data, 1:OutPut Data. */ + unsigned int reserved0 : 24; + } BIT; +} volatile GPIO_DATA_REG[256]; + +/** + * @brief GPIO direction registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pin0 : 1; /**< pin0 0:Input Direction, 1:OutPut Direction. */ + unsigned int pin1 : 1; /**< pin1 0:Input Direction, 1:OutPut Direction. */ + unsigned int pin2 : 1; /**< pin2 0:Input Direction, 1:OutPut Direction. */ + unsigned int pin3 : 1; /**< pin3 0:Input Direction, 1:OutPut Direction. */ + unsigned int pin4 : 1; /**< pin4 0:Input Direction, 1:OutPut Direction. */ + unsigned int pin5 : 1; /**< pin5 0:Input Direction, 1:OutPut Direction. */ + unsigned int pin6 : 1; /**< pin6 0:Input Direction, 1:OutPut Direction. */ + unsigned int pin7 : 1; /**< pin7 0:Input Direction, 1:OutPut Direction. */ + unsigned int reserved0 : 24; + } BIT; +} volatile GPIO_DIR_REG; + +/** + * @brief GPIO interrupt type registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pin0 : 1; /**< pin0 0:edge interrupt, 1:level interrupt. */ + unsigned int pin1 : 1; /**< pin1 0:edge interrupt, 1:level interrupt. */ + unsigned int pin2 : 1; /**< pin2 0:edge interrupt, 1:level interrupt. */ + unsigned int pin3 : 1; /**< pin3 0:edge interrupt, 1:level interrupt. */ + unsigned int pin4 : 1; /**< pin4 0:edge interrupt, 1:level interrupt. */ + unsigned int pin5 : 1; /**< pin5 0:edge interrupt, 1:level interrupt. */ + unsigned int pin6 : 1; /**< pin6 0:edge interrupt, 1:level interrupt. */ + unsigned int pin7 : 1; /**< pin7 0:edge interrupt, 1:level interrupt. */ + unsigned int reserved0 : 24; + } BIT; +} volatile GPIO_IS_REG; + +/** + * @brief GPIO edge type registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pin0 : 1; /**< pin0 0:rising or falling edge, 1: both edge. */ + unsigned int pin1 : 1; /**< pin1 0:rising or falling edge, 1: both edge. */ + unsigned int pin2 : 1; /**< pin2 0:rising or falling edge, 1: both edge. */ + unsigned int pin3 : 1; /**< pin3 0:rising or falling edge, 1: both edge. */ + unsigned int pin4 : 1; /**< pin4 0:rising or falling edge, 1: both edge. */ + unsigned int pin5 : 1; /**< pin5 0:rising or falling edge, 1: both edge. */ + unsigned int pin6 : 1; /**< pin6 0:rising or falling edge, 1: both edge. */ + unsigned int pin7 : 1; /**< pin7 0:rising or falling edge, 1: both edge. */ + unsigned int reserved0 : 24; + } BIT; +} volatile GPIO_IBE_REG; + +/** + * @brief GPIO interrupt condition registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pin0 : 1; /**< pin0 0:falling edge / low level, 1:rising edge / high level. */ + unsigned int pin1 : 1; /**< pin1 0:falling edge / low level, 1:rising edge / high level. */ + unsigned int pin2 : 1; /**< pin2 0:falling edge / low level, 1:rising edge / high level. */ + unsigned int pin3 : 1; /**< pin3 0:falling edge / low level, 1:rising edge / high level. */ + unsigned int pin4 : 1; /**< pin4 0:falling edge / low level, 1:rising edge / high level. */ + unsigned int pin5 : 1; /**< pin5 0:falling edge / low level, 1:rising edge / high level. */ + unsigned int pin6 : 1; /**< pin6 0:falling edge / low level, 1:rising edge / high level. */ + unsigned int pin7 : 1; /**< pin7 0:falling edge / low level, 1:rising edge / high level. */ + unsigned int reserved0 : 24; + } BIT; +} volatile GPIO_IEV_REG; + +/** + * @brief GPIO interrupt enable registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pin0 : 1; /**< pin0 0:mask interrupt, 1:unmask interrupt. */ + unsigned int pin1 : 1; /**< pin1 0:mask interrupt, 1:unmask interrupt. */ + unsigned int pin2 : 1; /**< pin2 0:mask interrupt, 1:unmask interrupt. */ + unsigned int pin3 : 1; /**< pin3 0:mask interrupt, 1:unmask interrupt. */ + unsigned int pin4 : 1; /**< pin4 0:mask interrupt, 1:unmask interrupt. */ + unsigned int pin5 : 1; /**< pin5 0:mask interrupt, 1:unmask interrupt. */ + unsigned int pin6 : 1; /**< pin6 0:mask interrupt, 1:unmask interrupt. */ + unsigned int pin7 : 1; /**< pin7 0:mask interrupt, 1:unmask interrupt. */ + unsigned int reserved0 : 24; + } BIT; +} volatile GPIO_IE_REG; + +/** + * @brief GPIO original interrupt signal registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pin0 : 1; /**< pin0 0:no interrupt, 1:has interrupt. */ + unsigned int pin1 : 1; /**< pin1 0:no interrupt, 1:has interrupt. */ + unsigned int pin2 : 1; /**< pin2 0:no interrupt, 1:has interrupt. */ + unsigned int pin3 : 1; /**< pin3 0:no interrupt, 1:has interrupt. */ + unsigned int pin4 : 1; /**< pin4 0:no interrupt, 1:has interrupt. */ + unsigned int pin5 : 1; /**< pin5 0:no interrupt, 1:has interrupt. */ + unsigned int pin6 : 1;; /**< pin6 0:no interrupt, 1:has interrupt. */ + unsigned int pin7 : 1; /**< pin7 0:no interrupt, 1:has interrupt. */ + unsigned int reserved0 : 24; + } BIT; +} volatile GPIO_RIS_REG; + +/** + * @brief GPIO mask interrupt signal registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pin0 : 1; /**< pin0 0:no interrupt, 1:has interrupt. */ + unsigned int pin1 : 1; /**< pin1 0:no interrupt, 1:has interrupt. */ + unsigned int pin2 : 1; /**< pin2 0:no interrupt, 1:has interrupt. */ + unsigned int pin3 : 1; /**< pin3 0:no interrupt, 1:has interrupt. */ + unsigned int pin4 : 1; /**< pin4 0:no interrupt, 1:has interrupt. */ + unsigned int pin5 : 1; /**< pin5 0:no interrupt, 1:has interrupt. */ + unsigned int pin6 : 1; /**< pin6 0:no interrupt, 1:has interrupt. */ + unsigned int pin7 : 1; /**< pin7 0:no interrupt, 1:has interrupt. */ + unsigned int reserved0 : 24; + } BIT; +} volatile GPIO_MIS_REG; + +/** + * @brief GPIO interrupt clear registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pin0 : 1; /**< pin0 0:no effect, 1:clear interrupt. */ + unsigned int pin1 : 1; /**< pin1 0:no effect, 1:clear interrupt. */ + unsigned int pin2 : 1; /**< pin2 0:no effect, 1:clear interrupt. */ + unsigned int pin3 : 1; /**< pin3 0:no effect, 1:clear interrupt. */ + unsigned int pin4 : 1; /**< pin4 0:no effect, 1:clear interrupt. */ + unsigned int pin5 : 1; /**< pin5 0:no effect, 1:clear interrupt. */ + unsigned int pin6 : 1; /**< pin6 0:no effect, 1:clear interrupt. */ + unsigned int pin7 : 1; /**< pin7 0:no effect, 1:clear interrupt. */ + unsigned int reserved0 : 24; + } BIT; +} volatile GPIO_IC_REG; + +/** + * @brief GPIO assemble registers structure definition + */ +typedef struct { + GPIO_DATA_REG GPIO_DATA; /**< gpio data register. Offset Address: 0x000~0x3FC.*/ + GPIO_DIR_REG GPIO_DIR; /**< gpio direction register. Offset Address: 0x400. */ + GPIO_IS_REG GPIO_IS; /**< gpio interrupt type register. Offset Address: 0x404. */ + GPIO_IBE_REG GPIO_IBE; /**< gpio edge type register. Offset Address: 0x408. */ + GPIO_IEV_REG GPIO_IEV; /**< gpio interrupt condition register. Offset Address: 0x40C. */ + GPIO_IE_REG GPIO_IE; /**< gpio interrupt enable register. Offset Address: 0x410. */ + GPIO_RIS_REG GPIO_RIS; /**< gpio original interrupt register. Offset Address: 0x414. */ + GPIO_MIS_REG GPIO_MIS; /**< gpio mask interrupt register. Offset Address: 0x418. */ + GPIO_IC_REG GPIO_IC; /**< gpio interrupt clear register. Offset Address: 0x41C. */ +} volatile GPIO_RegStruct; +/** + * @} + */ + +/** + * @brief Struct of map GPIO register and lock type. + */ +typedef struct { + GPIO_RegStruct *gpioGroup; + CHIP_LockType lockType; +} GPIO_MatchLockType; + +/** + * @brief Check gpio value parameter. + * @param value Value of @ref GPIO_Value + * @retval Bool. + */ +static inline bool IsGpioValue(GPIO_Value value) +{ + return (value == GPIO_LOW_LEVEL || value == GPIO_HIGH_LEVEL); +} + +/** + * @brief Check gpio direction parameter. + * @param dir Value of @ref GPIO_Direction. + * @retval Bool. + */ +static inline bool IsGpioDirection(GPIO_Direction dir) +{ + return (dir == GPIO_INPUT_MODE || dir == GPIO_OUTPUT_MODE); +} + +/** + * @brief Check gpio pins parameter. + * @param pins OR logical combination of pin. + * @retval Bool. + */ +static inline bool IsGpioPins(unsigned int pins) +{ + return ((pins & GPIO_PIN_MASK) != BASE_CFG_UNSET) && ((pins & ~GPIO_PIN_MASK) == BASE_CFG_UNSET); +} + +/** + * @brief Check gpio pin parameter. + * @param pin Value of @ref GPIO_PIN. + * @retval Bool. + */ +static inline bool IsGpioPin(GPIO_PIN pin) +{ + /* Check whether gpio pin */ + return (pin == GPIO_PIN_0 || pin == GPIO_PIN_1 || \ + pin == GPIO_PIN_2 || pin == GPIO_PIN_3 || \ + pin == GPIO_PIN_4 || pin == GPIO_PIN_5 || \ + pin == GPIO_PIN_6 || pin == GPIO_PIN_7 || \ + pin == GPIO_PIN_ALL); +} + +/** + * @brief Check gpio interrupt mode parameter. + * @param mode Value of @ref GPIO_InterruptMode. + * @retval Bool. + */ +static inline bool IsGpioITMode(GPIO_InterruptMode mode) +{ + /* Check whether gpio interrupt mode */ + return (mode == GPIO_INT_TYPE_HIGH_LEVEL || \ + mode == GPIO_INT_TYPE_LOW_LEVEL || \ + mode == GPIO_INT_TYPE_RISE_EDGE || \ + mode == GPIO_INT_TYPE_FALL_EDGE || \ + mode == GPIO_INT_TYPE_BOTH_EDGE || \ + mode == GPIO_INT_TYPE_NONE); +} + +/** + * @brief Setting GPIO pin level + * @param gpiox Value of @ref GPIO_RegStruct. + * @param pins OR logical combination of pin. + * @param value Value of @ref GPIO_Value. + * @retval None. + */ +static inline void DCL_GPIO_SetValue(GPIO_RegStruct *gpiox, unsigned int pins, GPIO_Value value) +{ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + GPIO_PARAM_CHECK_NO_RET(IsGpioValue(value)); + gpiox->GPIO_DATA[pins].reg = (value == GPIO_HIGH_LEVEL ? pins : BASE_CFG_UNSET); /* Set GPIO pin level */ +} + +/** + * @brief Getting all GPIO level. + * @param gpiox Value of @ref GPIO_RegStruct. + * @retval unsigned int All GPIO pin level. + */ +static inline unsigned int DCL_GPIO_GetAllValue(const GPIO_RegStruct *gpiox) +{ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + return gpiox->GPIO_DATA[GPIO_PIN_MASK].reg & GPIO_PIN_MASK; /* Get all GPIO level. */ +} + +/** + * @brief Getting pin GPIO level. + * @param gpiox Value of @ref GPIO_RegStruct. + * @param pin OR logical combination of pin. + * @retval unsigned int GPIO pin level. + */ +static inline GPIO_Value DCL_GPIO_GetPinValue(const GPIO_RegStruct *gpiox, GPIO_PIN pin) +{ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + GPIO_ASSERT_PARAM(IsGpioPin(pin)); + /* Get pin GPIO level. */ + return (gpiox->GPIO_DATA[GPIO_PIN_MASK].reg & pin) == BASE_CFG_UNSET ? GPIO_LOW_LEVEL : GPIO_HIGH_LEVEL; +} + +/** + * @brief Setting GPIO pin direction. + * @param gpiox Value of @ref GPIO_RegStruct. + * @param pins OR logical combination of pin. + * @param dir Value of @ref GPIO_Direction. + * @retval None. + */ +static inline void DCL_GPIO_SetDirection(GPIO_RegStruct *gpiox, unsigned int pins, GPIO_Direction dir) +{ + /* param check */ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + GPIO_PARAM_CHECK_NO_RET(IsGpioDirection(dir)); + if (dir == GPIO_INPUT_MODE) { /* Set GPIO pin direction */ + gpiox->GPIO_DIR.reg &= ~pins; + } else if (dir == GPIO_OUTPUT_MODE) { + gpiox->GPIO_DIR.reg |= pins; + } +} + +/** + * @brief Getting GPIO pin direction. + * @param gpiox Value of @ref GPIO_RegStruct. + * @param pin OR logical combination of pin. + * @retval GPIO direction, 0:input mode, 1:output mode. + */ +static inline GPIO_Direction DCL_GPIO_GetPinDirection(const GPIO_RegStruct *gpiox, GPIO_PIN pin) +{ + /* param check */ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + GPIO_ASSERT_PARAM(IsGpioPin(pin)); + return (gpiox->GPIO_DIR.reg & pin) == BASE_CFG_UNSET ? GPIO_INPUT_MODE : GPIO_OUTPUT_MODE; +} + +/** + * @brief Getting GPIO all pin direction. + * @param gpiox Value of @ref GPIO_RegStruct. + * @retval unsigned int All GPIO pin direction. + */ +static inline unsigned int DCL_GPIO_GetAllPinDirection(const GPIO_RegStruct *gpiox) +{ + /* param check */ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + return gpiox->GPIO_DIR.reg & GPIO_PIN_MASK; +} + +/** + * @brief Setting GPIO pins edge trigger. + * @param gpiox Value of @ref GPIO_RegStruct. + * @param pins OR logical combination of pin. + * @retval None. + */ +static inline void DCL_GPIO_SetPinsEdgeTrigger(GPIO_RegStruct *gpiox, unsigned int pins) +{ + /* param check */ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + gpiox->GPIO_IS.reg &= ~pins; +} + +/** + * @brief Setting GPIO pins level trigger. + * @param gpiox Value of @ref GPIO_RegStruct. + * @param pins OR logical combination of pin. + * @retval None. + */ +static inline void DCL_GPIO_SetPinsLevelTrigger(GPIO_RegStruct *gpiox, unsigned int pins) +{ + /* param check */ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + gpiox->GPIO_IS.reg |= pins; +} + +/** + * @brief Getting GPIO pin trigger type. + * @param gpiox Value of @ref GPIO_RegStruct. + * @retval trigger type, 0:edge trigger; 1:level trigger. + */ +static inline unsigned int DCL_GPIO_GetPinsTriggerType(const GPIO_RegStruct *gpiox) +{ + /* param check */ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + return (gpiox->GPIO_IS.reg & GPIO_PIN_MASK); +} + +/** + * @brief Setting GPIO pins single edge trigger. + * @param gpiox Value of @ref GPIO_RegStruct. + * @param pins OR logical combination of pin. + * @retval None. + */ +static inline void DCL_GPIO_SetPinsSingleEdgeTrigger(GPIO_RegStruct *gpiox, unsigned int pins) +{ + /* param check */ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + gpiox->GPIO_IBE.reg &= ~pins; +} + +/** + * @brief Setting GPIO pins both edge trigger. + * @param gpiox Value of @ref GPIO_RegStruct. + * @param pins OR logical combination of pin. + * @retval None. + */ +static inline void DCL_GPIO_SetPinsBothEdgeTrigger(GPIO_RegStruct *gpiox, unsigned int pins) +{ + /* param check */ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + gpiox->GPIO_IBE.reg |= pins; +} + +/** + * @brief Getting GPIO pin edge trigger type. + * @param gpiox Value of @ref GPIO_RegStruct. + * @retval edge trigger type, pin value is 0:signle edge trigger; 1:both edge trigger. + */ +static inline unsigned int DCL_GPIO_GetPinsEdgeTriggerType(const GPIO_RegStruct *gpiox) +{ + /* param check */ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + return (gpiox->GPIO_IBE.reg & GPIO_PIN_MASK); +} + +/** + * @brief Setting GPIO pins falling edge or low level trigger. + * @param gpiox Value of @ref GPIO_RegStruct. + * @param pins OR logical combination of pin. + * @retval None. + */ +static inline void DCL_GPIO_SetPinsFallingEdgeOrLowLevelTrigger(GPIO_RegStruct *gpiox, unsigned int pins) +{ + /* param check */ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + gpiox->GPIO_IEV.reg &= ~pins; +} + +/** + * @brief Setting GPIO pins rising edge or high level trigger. + * @param gpiox Value of @ref GPIO_RegStruct. + * @param pins OR logical combination of pin. + * @retval None. + */ +static inline void DCL_GPIO_SetPinsRisingEdgeOrHighLevelTrigger(GPIO_RegStruct *gpiox, unsigned int pins) +{ + /* param check */ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + gpiox->GPIO_IEV.reg |= pins; +} + +/** + * @brief Getting GPIO pins trigger condition type. + * @param gpiox Value of @ref GPIO_RegStruct. + * @retval trigger condition type, pin value is 0:falling edge or low level trigger; + * @retval trigger condition type, pin value is 1:rising edge or high level trigger. + */ +static inline unsigned int DCL_GPIO_GetPinsTriggerConditionType(const GPIO_RegStruct *gpiox) +{ + /* param check */ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + return (gpiox->GPIO_IEV.reg & GPIO_PIN_MASK); +} + +/** + * @brief Clear all gpio interrupt signal. + * @param gpiox Value of @ref GPIO_RegStruct. + * @param pins OR logical combination of pin. + * @retval None. + */ +static inline void DCL_GPIO_ClearIrq(GPIO_RegStruct *gpiox, unsigned int pins) +{ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + gpiox->GPIO_IC.reg |= pins; +} + +/** + * @brief Enable gpio group interrupt. + * @param gpiox Value of @ref GPIO_RegStruct. + * @param pins OR logical combination of pins. + * @retval None. + */ +static inline void DCL_GPIO_EnableIrq(GPIO_RegStruct *gpiox, unsigned int pins) +{ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + /* must clear interrupt first, prevents interrupts triggered by previous output mode. */ + DCL_GPIO_ClearIrq(gpiox, pins); + gpiox->GPIO_IE.reg |= pins; +} + +/** + * @brief Disable gpio interrupt. + * @param gpiox Value of @ref GPIO_RegStruct. + * @param pins OR logical combination of pin. + * @retval None. + */ +static inline void DCL_GPIO_DisableIrq(GPIO_RegStruct *gpiox, unsigned int pins) +{ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + gpiox->GPIO_IE.reg &= ~pins; +} + +/** + * @brief Getting all values of GPIO IE register. + * @param gpiox Value of @ref GPIO_RegStruct. + * @retval unsigned int All values of GPIO IE register. + */ +static inline unsigned int DCL_GPIO_GetIE(const GPIO_RegStruct *gpiox) +{ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + return gpiox->GPIO_IE.reg & GPIO_PIN_MASK; +} + +/** + * @brief Getting all values of GPIO RIS register. + * @param gpiox Value of @ref GPIO_RegStruct. + * @retval unsigned int All values of GPIO RIS register. + */ +static inline unsigned int DCL_GPIO_GetRIS(const GPIO_RegStruct *gpiox) +{ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + return gpiox->GPIO_RIS.reg & GPIO_PIN_MASK; +} + +/** + * @brief Getting all values of GPIO MIS register. + * @param gpiox Value of @ref GPIO_RegStruct. + * @retval unsigned int All values of GPIO MIS register. + */ +static inline unsigned int DCL_GPIO_GetMIS(const GPIO_RegStruct *gpiox) +{ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + return gpiox->GPIO_MIS.reg & GPIO_PIN_MASK; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_GPIO_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/gpio/src/gpio.c b/vendor/others/demo/5-tim_adc/demo/drivers/gpio/src/gpio.c new file mode 100644 index 000000000..1a3e1a20f --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/gpio/src/gpio.c @@ -0,0 +1,330 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file gpio.c + * @author MCU Driver Team + * @brief GPIO module driver + * @details This file provides firmware functions to manage the following functionalities of the GPIO. + * + GPIO configuration definetion. + * + Initialization functions. + * + GPIO Set And Get Functions. + * + Interrupt Service Functions. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "interrupt.h" +#include "gpio.h" + +static void GPIO_ExcuteCallBack(GPIO_Handle *handle, GPIO_PIN pin); +static void GPIO_SetLevelIrqType(GPIO_Handle *handle, unsigned int pins, GPIO_InterruptMode mode); +static void GPIO_SetEdgeIrqType(GPIO_Handle *handle, unsigned int pins, GPIO_InterruptMode mode); + +/** + * @brief Initializing GPIO register values. + * @param handle Value of @ref GPIO_Handle. + * @retval None. + */ +void HAL_GPIO_Init(GPIO_Handle *handle) +{ + GPIO_ASSERT_PARAM(handle != NULL); + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(handle->pins)); + + /* Register GPIO callback ID */ + for (unsigned int i = 0; i < GPIO_PIN_NUM; i++) { + handle->userCallBack.GPIO_CallbackFuncs[i].pin = (1 << i); + } +} + +/** + * @brief DeInitializing GPIO register values. + * @param handle Value of @ref GPIO_Handle. + * @retval None. + */ +void HAL_GPIO_DeInit(GPIO_Handle *handle) +{ + GPIO_ASSERT_PARAM(handle != NULL); + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + /* Clean GPIO callback ID and interrupt callback functions. */ + for (unsigned int i = 0; i < GPIO_PIN_NUM; i++) { + handle->userCallBack.GPIO_CallbackFuncs[i].pin = 0x00000000; + handle->userCallBack.GPIO_CallbackFuncs[i].callbackFunc = NULL; + } + handle->pins = 0x00000000; /* Reset GPIO pins. */ +} + +/** + * @brief Setting GPIO pins direction. + * @param handle Value of @ref GPIO_Handle. + * @param pins OR logical combination of pin. + * @param dir GPIO pin direction. + * @retval None. + */ +void HAL_GPIO_SetDirection(GPIO_Handle *handle, unsigned int pins, GPIO_Direction dir) +{ + GPIO_ASSERT_PARAM(handle != NULL); + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + GPIO_PARAM_CHECK_NO_RET(IsGpioDirection(dir)); + DCL_GPIO_SetDirection(handle->baseAddress, pins, dir); +} + +/** + * @brief Setting GPIO pins level + * @param handle Value of @ref GPIO_Handle. + * @param pins OR logical combination of pin. + * @param value Value of @ref GPIO_Value. + * @retval None. + */ +void HAL_GPIO_SetValue(GPIO_Handle *handle, unsigned int pins, GPIO_Value value) +{ + GPIO_ASSERT_PARAM(handle != NULL); + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + GPIO_PARAM_CHECK_NO_RET(IsGpioValue(value)); + DCL_GPIO_SetValue(handle->baseAddress, pins, value); +} + +/** + * @brief Getting GPIO pin level + * @param handle Value of @ref GPIO_Handle. + * @param pin Value of @ref GPIO_PIN. + * @retval GPIO_Value Value of @ref GPIO_Value. + */ +GPIO_Value HAL_GPIO_GetPinValue(GPIO_Handle *handle, GPIO_PIN pin) +{ + GPIO_ASSERT_PARAM(handle != NULL); + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + GPIO_ASSERT_PARAM(IsGpioPin(pin)); + return (handle->baseAddress->GPIO_DATA[GPIO_PIN_MASK].reg & pin) == BASE_CFG_UNSET ? \ + GPIO_LOW_LEVEL : GPIO_HIGH_LEVEL; +} + +/** + * @brief Getting GPIO pins level + * @param handle Value of @ref GPIO_Handle. + * @retval unsigned int Value of all GPIO pin. + */ +unsigned int HAL_GPIO_GetAllValue(GPIO_Handle *handle) +{ + GPIO_ASSERT_PARAM(handle != NULL); + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + return handle->baseAddress->GPIO_DATA[GPIO_PIN_MASK].reg & GPIO_PIN_MASK; +} + +/** + * @brief Getting GPIO pin direction + * @param handle Value of @ref GPIO_Handle. + * @param pin GPIO pin. + * @retval Value of @ref BASE_StatusType. + */ +GPIO_Direction HAL_GPIO_GetPinDirection(GPIO_Handle *handle, GPIO_PIN pin) +{ + GPIO_ASSERT_PARAM(handle != NULL); + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + GPIO_ASSERT_PARAM(IsGpioPin(pin)); + return (handle->baseAddress->GPIO_DIR.reg & pin) == BASE_CFG_UNSET ? GPIO_INPUT_MODE : GPIO_OUTPUT_MODE; +} + +/** + * @brief Getting GPIO pins direction + * @param handle Value of @ref GPIO_Handle. + * @retval Value of @ref BASE_StatusType. + */ +unsigned int HAL_GPIO_GetAllDirection(GPIO_Handle *handle) +{ + GPIO_ASSERT_PARAM(handle != NULL); + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + return handle->baseAddress->GPIO_DIR.reg & GPIO_PIN_MASK; +} + +/** + * @brief Toggle GPIO level + * @param handle Value of @ref GPIO_Handle. + * @param pins GPIO pins. + * @retval None. + */ +void HAL_GPIO_TogglePin(GPIO_Handle *handle, unsigned int pins) +{ + GPIO_ASSERT_PARAM(handle != NULL); + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + handle->baseAddress->GPIO_DATA[pins].reg ^= pins; +} + +/** + * @brief Get GPIO pin interrupt types. + * @param handle Value of @ref GPIO_Handle. + * @param pin Value of @ref GPIO_PIN. + * @retval GPIO_InterruptMode Value of @ref GPIO_InterruptMode. + */ +GPIO_InterruptMode HAL_GPIO_GetPinIrqType(GPIO_Handle *handle, GPIO_PIN pin) +{ + GPIO_ASSERT_PARAM(handle != NULL); + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + GPIO_ASSERT_PARAM(IsGpioPin(pin)); + /* If disable pin interrupt, return None mode */ + if ((handle->baseAddress->GPIO_IE.reg & pin) == BASE_CFG_UNSET) { + return GPIO_INT_TYPE_NONE; + } + unsigned int iev = ((handle->baseAddress->GPIO_IEV.reg & pin) != 0) ? 1 : 0; /* 1: iev effect. */ + unsigned int is = ((handle->baseAddress->GPIO_IS.reg & pin) != 0) ? 2 : 0; /* 2: is effect. */ + unsigned int ibe = ((handle->baseAddress->GPIO_IBE.reg & pin) != 0) ? 4 : 0; /* 4: ibe effect. */ + unsigned int value = (iev | is | ibe); + if (value >= GPIO_INT_TYPE_NONE) { + return GPIO_INT_TYPE_NONE; + } + return value; +} + +/** + * @brief Set GPIO level interrupt types. + * @param handle Value of @ref GPIO_Handle. + * @param pins OR logical combination of pin. + * @param mode Value of @ref GPIO_InterruptMode. + * @retval None. + */ +static void GPIO_SetLevelIrqType(GPIO_Handle *handle, unsigned int pins, GPIO_InterruptMode mode) +{ + handle->baseAddress->GPIO_IBE.reg &= ~pins; /* Disable edge detection */ + handle->baseAddress->GPIO_IS.reg |= pins; /* Enable level detection */ + if (mode == GPIO_INT_TYPE_HIGH_LEVEL) { + handle->baseAddress->GPIO_IEV.reg |= pins; + } else { + handle->baseAddress->GPIO_IEV.reg &= ~pins; + } +} + +/** + * @brief Set GPIO edge interrupt types. + * @param handle Value of @ref GPIO_Handle. + * @param pins OR logical combination of pin. + * @param mode Value of @ref GPIO_InterruptMode. + * @retval None. + */ +static void GPIO_SetEdgeIrqType(GPIO_Handle *handle, unsigned int pins, GPIO_InterruptMode mode) +{ + handle->baseAddress->GPIO_IS.reg &= ~pins; /* Disable level detection. */ + handle->baseAddress->GPIO_IBE.reg &= ~pins; /* Clear detection on both edges. */ + if (mode == GPIO_INT_TYPE_RISE_EDGE) { + handle->baseAddress->GPIO_IEV.reg |= pins; + } else { + handle->baseAddress->GPIO_IEV.reg &= ~pins; + } +} + +/** + * @brief Setting GPIO interrupt mode. + * @param handle Value of @ref GPIO_Handle. + * @param pins OR logical combination of pin. + * @param mode Value of @ref GPIO_InterruptMode. + * @retval Value of @ref BASE_StatusType. + */ +BASE_StatusType HAL_GPIO_SetIrqType(GPIO_Handle *handle, unsigned int pins, GPIO_InterruptMode mode) +{ + GPIO_ASSERT_PARAM(handle != NULL); + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + GPIO_PARAM_CHECK_WITH_RET(IsGpioPins(pins), BASE_STATUS_ERROR); + GPIO_PARAM_CHECK_WITH_RET(IsGpioITMode(mode), BASE_STATUS_ERROR); + + /* It must be disabled to avoid triggering interrupts during configuration. */ + DCL_GPIO_DisableIrq(handle->baseAddress, pins); + + if ((mode == GPIO_INT_TYPE_HIGH_LEVEL) || (mode == GPIO_INT_TYPE_LOW_LEVEL)) { + GPIO_SetLevelIrqType(handle, pins, mode); + } else if (mode == GPIO_INT_TYPE_BOTH_EDGE) { + handle->baseAddress->GPIO_IEV.reg &= ~pins; + handle->baseAddress->GPIO_IS.reg &= ~pins; + handle->baseAddress->GPIO_IBE.reg |= pins; + } else if ((mode == GPIO_INT_TYPE_RISE_EDGE) || (mode == GPIO_INT_TYPE_FALL_EDGE)) { + GPIO_SetEdgeIrqType(handle, pins, mode); + } else if (mode == GPIO_INT_TYPE_NONE) { + /* No interruptMode: disable everything. */ + handle->baseAddress->GPIO_IEV.reg &= ~pins; + handle->baseAddress->GPIO_IS.reg &= ~pins; + handle->baseAddress->GPIO_IBE.reg &= ~pins; + return BASE_STATUS_ERROR; + } + + DCL_GPIO_EnableIrq(handle->baseAddress, pins); + return BASE_STATUS_OK; +} + +/** + * @brief Handle GPIO interrupt request. + * @param handle Value of @ref GPIO_Handle. + * @param pin Value of @ref GPIO_PIN. + * @retval None. + */ +static void GPIO_ExcuteCallBack(GPIO_Handle *handle, GPIO_PIN pin) +{ + GPIO_ASSERT_PARAM(handle != NULL); + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pin)); + for (unsigned int i = 0; i < GPIO_PIN_NUM; i++) { + if (handle->userCallBack.GPIO_CallbackFuncs[i].pin == pin) { + if (handle->userCallBack.GPIO_CallbackFuncs[i].callbackFunc != NULL) { + handle->userCallBack.GPIO_CallbackFuncs[i].callbackFunc(handle); + } + } + } +} + +/** + * @brief Handle GPIO interrupt request. + * @param handle Interrupt parameter. + * @retval None. + */ +void HAL_GPIO_IrqHandler(void *handle) +{ + GPIO_Handle *gpioHandle = (GPIO_Handle *)handle; + GPIO_ASSERT_PARAM(gpioHandle != NULL); + GPIO_ASSERT_PARAM(IsGPIOInstance(gpioHandle->baseAddress)); + unsigned int position = 0x00000000U; + unsigned int pinCurrent = 0x00000000U; + unsigned int mis = DCL_GPIO_GetMIS(gpioHandle->baseAddress); /* Queries the masked GPIO interrupt status. */ + + /* Determine which pin sets the callback function. */ + while ((mis >> position) != BASE_CFG_UNSET) { + pinCurrent = mis & (1 << position); + if (pinCurrent) { + gpioHandle->pins = pinCurrent; + DCL_GPIO_ClearIrq(gpioHandle->baseAddress, pinCurrent); + GPIO_ExcuteCallBack(gpioHandle, pinCurrent); + } + position++; + } +} + +/** + * @brief Handle GPIO interrupt request. + * @param handle Value of @ref GPIO_Handle. + * @param pin Value of @ref GPIO_PIN. + * @param pCallback Value of @ref GPIO_CallbackType. + * @retval None. + */ +void HAL_GPIO_RegisterCallBack(GPIO_Handle *handle, GPIO_PIN pin, GPIO_CallbackType pCallback) +{ + GPIO_ASSERT_PARAM(handle != NULL); + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + GPIO_PARAM_CHECK_NO_RET(IsGpioPin(pin)); + for (unsigned int i = 0; i < GPIO_PIN_NUM; i++) { + if (handle->userCallBack.GPIO_CallbackFuncs[i].pin == pin) { + handle->userCallBack.GPIO_CallbackFuncs[i].callbackFunc = pCallback; + } + } +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/gpt/common/inc/gpt.h b/vendor/others/demo/5-tim_adc/demo/drivers/gpt/common/inc/gpt.h new file mode 100644 index 000000000..bebbc326c --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/gpt/common/inc/gpt.h @@ -0,0 +1,134 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file gpt.c + * @author MCU Driver Team + * @brief GPT module driver. + * @details This file provides firmware GPT Handle Structure and functions + * prototypes to manage the following functionalities of the GPT. + * + Initialization and de-initialization functions + * + config the register of GPT + * + interrupt register and register functions + */ + +#ifndef McuMagicTag_GPT_H +#define McuMagicTag_GPT_H + +/* Includes-------------------------------------------------------------------*/ +#include "gpt_ip.h" + +/** + * @defgroup GPT GPT + * @brief GPT module. + * @{ + */ + +/** + * @defgroup GPT_Common GPT Common + * @brief GPT common external module. + * @{ + */ + +/** + * @defgroup GPT_Handle_Definition GPT Handle Definition + * @{ + */ +typedef struct { + GPT_RegStruct *baseAddress; /**< Base address of GPT register. */ + GPT_CountMode cntMode; /**< GPT count mode. */ + unsigned int clockDiv; /**< GPT clock div. */ + volatile GPT_RefValueAction refA0; /**< GPT refA0 action setting. */ + volatile GPT_RefValueAction refB0; /**< GPT refB0 action setting. */ + volatile unsigned int period; /**< PWM period. */ + volatile unsigned int pwmNum; /**< PWM number, only valid when pwmKeep is false. */ + bool pwmKeep; /**< PWM output mode. */ + bool bufLoad; /**< Indicates whether the cache is loaded immediately. */ + bool triggleAdcPeriod; /**< triggle ADC when PWM counting period out finish. */ + bool triggleAdcOutFinish; /**< triggle ADC when PWM out finish. */ + + GPT_UserCallBack userCallBack; /**< User callback function of GPT. */ + GPT_ExtendHandle handleEx; /**< GPT extend handle. */ +} GPT_Handle; + +typedef void (* GPT_CallBackFunc)(void *handle); + +/** + * @} + */ + +/** + * @defgroup GPT_API_Declaration GPT HAL API + * @{ + */ +/** + * GPT Control functions + */ +BASE_StatusType HAL_GPT_Init(GPT_Handle *handle); + +void HAL_GPT_Start(GPT_Handle *handle); + +void HAL_GPT_Stop(GPT_Handle *handle); + +BASE_StatusType HAL_GPT_Config(GPT_Handle *handle); + +BASE_StatusType HAL_GPT_GetConfig(GPT_Handle *handle); + +/* Setting PWM reference points and corresponding actions */ +BASE_StatusType HAL_GPT_SetReferCounterAndAction(GPT_Handle *handle, const GPT_ReferCfg *refer); + +void HAL_GPT_GetReferCounterAndAction(GPT_Handle *handle, GPT_ReferCfg *refer); + +/* GPT frequency divider and period. */ +BASE_StatusType HAL_GPT_SetCountPeriod(GPT_Handle *handle, unsigned int period); + +unsigned int HAL_GPT_GetCountPeriod(GPT_Handle *handle); + +BASE_StatusType HAL_GPT_SetDivFactor(GPT_Handle *handle, unsigned int div); + +unsigned int HAL_GPT_GetDivFactor(GPT_Handle *handle); + +/* GPT cache loading settings and cache status. */ +BASE_StatusType HAL_GPT_SetBufferLoad(GPT_Handle *handle, GPT_SetOption bufferLoad); + +unsigned int HAL_GPT_GetBufferLoadStatus(GPT_Handle *handle); + +/* Output completion interrupt configuration for the GPT channel. */ +BASE_StatusType HAL_GPT_SetOutFinishInt(GPT_Handle *handle, GPT_SetOption outFinishInt); + +/* GPT period interrupt configuration. */ +BASE_StatusType HAL_GPT_SetPeriodInt(GPT_Handle *handle, GPT_SetOption periodInt); + +/* GPT interrupt service and callback registration functions */ +void HAL_GPT_IrqOutFinishHandler(void *handle); + +void HAL_GPT_IrqPeriodHandler(void *handle); + +BASE_StatusType HAL_GPT_RegisterCallBack(GPT_Handle *gptHandle, GPT_CallBackFunType typeID, + GPT_CallBackFunc pCallback); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_GPT_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/gpt/inc/gpt_ex.h b/vendor/others/demo/5-tim_adc/demo/drivers/gpt/inc/gpt_ex.h new file mode 100644 index 000000000..0247b76d6 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/gpt/inc/gpt_ex.h @@ -0,0 +1,68 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file gpt_ex.h + * @author MCU Driver Team + * @brief GPT module driver. + * @details This file provides firmware functions to manage the extension + * functionalities of the GPT. + */ + +#ifndef McuMagicTag_GPT_EX_H +#define McuMagicTag_GPT_EX_H + +#include "gpt.h" + +/** + * @addtogroup GPT_IP + * @{ + */ + +/** + * @defgroup GPT_EX_API_Declaration GPT HAL API EX + * @{ + */ + +/* The current count value of the counter. */ +unsigned int HAL_GPT_GetCounterValueEx(GPT_Handle *handle); + +/* Period trigger for DMA and ADC. */ +BASE_StatusType HAL_GPT_TriggerDMAEnableEx(GPT_Handle *handle, GPT_TriggerDMAType triggerDMAType); + +BASE_StatusType HAL_GPT_TriggerDMADisableEx(GPT_Handle *handle, GPT_TriggerDMAType triggerDMAType); + +BASE_StatusType HAL_GPT_TriggerADCEnableEx(GPT_Handle *handle, GPT_TriggerADCType triggerADCType); + +BASE_StatusType HAL_GPT_TriggerADCDisableEx(GPT_Handle *handle, GPT_TriggerADCType triggerADCType); + +/* Current PWM Number, Only valid when PWM0_CFG.rg_pwm0_keep = 1 */ +unsigned int HAL_GPT_GetCurrentPWM0NumberEx(GPT_Handle *handle); + +/* Injected PWM output completion interrupt, which takes effect only when PWM waves are output. */ +BASE_StatusType HAL_GPT_SoftInjOutFinIntEx(GPT_Handle *handle, GPT_SetOption softInjOutFin); + +/* Injected PWM period finish interrupt, which takes effect only when PWM waves are output. */ +BASE_StatusType HAL_GPT_SoftInjPeriodFinIntEx(GPT_Handle *handle, GPT_SetOption softInjPeriod); + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_GPT_EX_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/gpt/inc/gpt_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/gpt/inc/gpt_ip.h new file mode 100644 index 000000000..cd963ee65 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/gpt/inc/gpt_ip.h @@ -0,0 +1,950 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file gpt_ip.h + * @author MCU Driver Team + * @brief GPT module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the GPT. + * + Register Struct of GPT + * + GPT Register Map struct + * + Direct Configuration Layer functions of GPT + */ + +#ifndef McuMagicTag_GPT_IP_H +#define McuMagicTag_GPT_IP_H + +/* Includes-------------------------------------------------------------------*/ +#include "baseinc.h" + +/* Macro definitions ---------------------------------------------------------*/ +#ifdef GPT_PARAM_CHECK +#define GPT_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define GPT_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define GPT_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define GPT_ASSERT_PARAM(para) ((void)0U) +#define GPT_PARAM_CHECK_NO_RET(para) ((void)0U) +#define GPT_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +#define GPT_PWM_MAX_NUM 0x000003FFU +#define GPT_PWM_PERIOD_MIN_VALUE 0x00000002U +#define GPT_PWM_PERIOD_MAX_VALUE 0x0000FFFFUL +#define GPT_PWM_DIV_FACTOR_MAX_VALUE 0x00000FFFUL +#define GPT_TC_PRD_MAX_VALUE 0x0000FFFFUL +#define GPT_DIV_FACTOR_MAX_VALUE 0x00000FFFUL + +/** + * @addtogroup GPT + * @{ + */ +/** + * @defgroup GPT_IP GPT_IP + * @brief GPT_IP: gpt_v1. + * @{ + */ + +/** + * @defgroup GPT_Param_Def GPT Parameters Definition + * @brief Description of GPT configuration parameters. + * @{ + */ + +/** + * @brief GPT common enable setting. + */ +typedef enum { + GPT_SET_DISABLE = 0x00000000U, + GPT_SET_ENABLE = 0x00000001U, +} GPT_SetOption; + +/** + * @brief Trigger DMA request option. + * @details DMA request type: + * + GPT_PWM0_TRIGGER_DMA -- pwm output finish triggle + * + GPT_PERIOD_TRIGGER_DMA -- gpt period triggle + * + GPT_PWM0_PERIOD_TRIGGER_DMA -- pwm output finish and gpt period triggle + */ +typedef enum { + GPT_PWM0_TRIGGER_DMA = 0x00000001U, + GPT_PERIOD_TRIGGER_DMA = 0x00000002U, + GPT_PWM0_PERIOD_TRIGGER_DMA = 0x00000003U, +} GPT_TriggerDMAType; + +/** + * @brief Trigger ADC request option. + * @details ADC request type: + * + GPT_PWM0_TRIGGER_ADC -- pwm output finish triggle + * + GPT_PERIOD_TRIGGER_ADC -- gpt period triggle + * + GPT_PWM0_PERIOD_TRIGGER_ADC -- pwm output finish and gpt period triggle + */ +typedef enum { + GPT_PWM0_TRIGGER_ADC = 0x00000001U, + GPT_PERIOD_TRIGGER_ADC = 0x00000002U, + GPT_PWM0_PERIOD_TRIGGER_ADC = 0x00000003U, +} GPT_TriggerADCType; + +/** + * @brief GPT cache loading status. + * @details Loading status: + * + GPT_PERIOD_LOAD_STATUS -- Status of the count period register buffer. + * + GPT_REFERA0_LOAD_STATUS -- Status of the counter reference value A0 register buffer + * + GPT_REFERB0_LOAD_STATUS -- Status of the counter reference value B0 register buffer + * + GPT_ACT0_LOAD_STATUS -- Status of the channel action configuration register buffer + * + GPT_PWM0_CFG_LOAD_STATUS -- Status of the configuration register buffer for channel. + */ +typedef enum { + GPT_PERIOD_LOAD_STATUS = 0x00000001U, + GPT_REFERA0_LOAD_STATUS = 0x00000002U, + GPT_REFERB0_LOAD_STATUS = 0x00000004U, + GPT_ACT0_LOAD_STATUS = 0x00000100U, + GPT_PWM0_CFG_LOAD_STATUS = 0x00001000U, +} GPT_LoadStatus; + +/** + * @brief GPT count mode. + */ +typedef enum { + GPT_COUNT_UP = 0x00000000U, + GPT_COUNT_DOWN = 0x00000001U +} GPT_CountMode; + +/** + * @brief PWM output action for referent dot. + * @details Output action: + * + GPT_ACTION_NO_ACTION -- Prohibit action. + * + GPT_ACTION_OUTPUT_LOW -- Low level. + * + GPT_ACTION_OUTPUT_HIGH -- High level. + * + GPT_ACTION_OUTPUT_FLIP -- Flip the level. + */ +typedef enum { + GPT_ACTION_NO_ACTION = 0x00000000U, + GPT_ACTION_OUTPUT_LOW = 0x00000001U, + GPT_ACTION_OUTPUT_HIGH = 0x00000002U, + GPT_ACTION_OUTPUT_FLIP = 0x00000003U +} GPT_ActionType; + +/** + * @brief GPT PWM output reference dot and action. + */ +typedef struct { + unsigned int refdot; + GPT_ActionType refAction; +}GPT_RefValueAction; + +/** + * @brief GPT reference dot and action config. + */ +typedef struct { + GPT_RefValueAction refA0; + GPT_RefValueAction refB0; +} GPT_ReferCfg; + +/** + * @brief GPT user interrupt callback function type. + * @details Function type: + * + GPT_INT_PWM_OUTPUT_FIN -- PWM output finish. + * + GPT_INT_PERIOD -- PWM period output finish. + */ +typedef enum { + GPT_INT_PWM_OUTPUT_FIN = 0x00000001, + GPT_INT_PERIOD = 0x00000002 +}GPT_CallBackFunType; + +/** + * @brief GPT user interrupt callback function. + */ +typedef struct { + void (* PWMOutPutFin)(void *handle); /**< GPT PWM channel out finish callback function for users */ + void (* PWMPeriod)(void *handle); /**< GPT PWM period output finish callback function for users */ +} GPT_UserCallBack; + +/** + * @brief GPT extend configure + */ +typedef struct { + bool periodIntEnable; /**< PWM period output finish interrupt. */ + bool outputFinIntEnable; /**< PWM channel output finish interrupt. */ +} GPT_ExtendHandle; + +/** + * @} + */ + +/** + * @defgroup GPT_Reg_Def GPT Register Definition + * @brief register mapping structure + * @{ + */ + +/** + * @brief GPT Version structure + */ +typedef union { + unsigned int reg; + struct { + unsigned int sub_version : 4; /**< Subversion number. */ + unsigned int main_version : 4; /**< Major version number. */ + unsigned int reserved : 24; + } BIT; +} volatile GPT_VER_INFO_REG; + +/** + * @brief Frequency division coefficient register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rg_div_fac : 12; /**< Frequency division coefficient. + Frequency divider = Frequency division coefficient + 1. */ + unsigned int reserved : 20; + } BIT; +} volatile GPT_TC_DIV_REG; + +/** + * @brief Count period register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rg_cnt_prd : 16; /**< Counting period of the counter. */ + unsigned int reserved : 16; + } BIT; +} volatile GPT_TC_PRD_REG; + +/** + * @brief Count reference value A0 register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rg_cnt_refa0 : 16; /**< Count reference value A0, Less than or equal to count period. */ + unsigned int reserved : 16; + } BIT; +} volatile GPT_TC_REFA0_REG; + +/** + * @brief Count reference value B0 register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rg_cnt_refb0 : 16; /**< Count reference value B0, Less than or equal to count period. */ + unsigned int reserved : 16; + } BIT; +} volatile GPT_TC_REFB0_REG; + +/** + * @brief Count status register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ro_cnt_val : 16; /**< Current count value of the counterr. */ + unsigned int ro_div_cnt : 12; /**< Current count value of the divide. */ + unsigned int reserved : 4; + } BIT; +} volatile GPT_TC_STS_REG; + +/** + * @brief Channel action configuration register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rg_pg_act0_refa0 : 2; /**< When counter is equal to the reference value A0, + PWM output of Channel acts. */ + unsigned int reserved : 2; + unsigned int rg_pg_act0_refb0 : 2; /**< When counter is equal to the reference value A0, + PWM output of Channel acts. */ + unsigned int reserved1 : 26; + } BIT; +} volatile GPT_PG_ACT0_REG; + +/** + * @brief Interrupt enable register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rg_prd_int_en : 1; /**< PWM period output finish interrupt enable. */ + unsigned int reserved : 3; + unsigned int rg_pwm0_int_en : 1; /**< PWM output finish interrupt enable. */ + unsigned int reserved1 : 27; + } BIT; +} volatile GPT_INT_EN_REG; + +/** + * @brief Interrupt flag register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ro_prd_int_flag : 1; /**< Interrupt flag of periodic interrupt. */ + unsigned int reserved : 3; + unsigned int ro_pwm0_int_flag : 1; /**< Interrupt flag of output completion interrupt of channel. */ + unsigned int reserved1 : 11; + unsigned int rg_prd_int_clr : 1; /**< Periodic interrupt clear. Writing 1 clears the bit. */ + unsigned int reserved2 : 3; + unsigned int rg_pwm0_int_clr : 1; /**< Channel output finish interrupt clear. Writing 1 clears the bit. */ + unsigned int reserved3 : 11; + } BIT; +} volatile GPT_INT_FLAG_REG; + +/** + * @brief Interrupt injection register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rg_prd_int_inj : 1; /**< Software injection period finish interrupt. Writing 1 clears */ + unsigned int reserved : 3; + unsigned int rg_pwm0_int_inj : 1; /**< Software injection output finish interrupt. Writing 1 clears */ + unsigned int reserved1 : 27; + } BIT; +} volatile GPT_INT_INJ_REG; + +/** + * @brief SOC/DMA request enable register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rg_soc_prd_en : 1; /**< Enable for generating the ADC signal at end of counting period. */ + unsigned int rg_soc_pwm0_en : 1; /**< Enable for channel output completion to generate ADC signal. */ + unsigned int reserved : 2; + unsigned int rg_dsr_prd_en : 1; /**< DMA single request signal at end of the counting period. */ + unsigned int rg_dsr_pwm0_en : 1; /**< DMA single request signal after the output of channel is complete. */ + unsigned int reserved1 : 2; + unsigned int rg_dbr_prd_en : 1; /**< DMA burst request signal at end of the counting period. */ + unsigned int rg_dbr_pwm0_en : 1; /**< DMA burst request signal after output of channel is complete. */ + unsigned int reserved2 : 22; + } BIT; +} volatile GPT_SOCDR_EN_REG; + +/** + * @brief Channel configuration register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rg_pwm0_num : 10; /**< Number of PWM output by channel. */ + unsigned int reserved : 21; + unsigned int rg_pwm0_keep : 1; /**< PWM output mode of channel. */ + } BIT; +} volatile GPT_PWM0_CFG_REG; + +/** + * @brief GPT enable register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rg_gpt_en : 1; /**< GPT enable control. 0: The GPT channel is disabled. + 1: The GPT channel is enabled. */ + unsigned int reserved : 31; + } BIT; +} volatile GPT_EN_REG; + +/** + * @brief Channel status register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ro_pwm0_num_sta : 10; /**< Number of output PWMs of channel. */ + unsigned int reserved : 21; + unsigned int ro_pwm0_run_sta : 1; /**< Output status of channel. */ + } BIT; +} volatile GPT_PWM0_STA_REG; + +/** + * @brief Buffer loading enable register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rg_buf_load_en : 1; /**< Buffer loading enable for registers that support buffer function. */ + unsigned int reserved : 31; + } BIT; +} volatile GPT_BUF_LOAD_EN_REG; + +/** + * @brief Buffer loading status register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int tc_prd_ld_sts : 1; /**< Status of the count cycle register buffer. */ + unsigned int tc_refa0_ld_sts : 1; /**< Status of the counter reference value A0 register buffer. */ + unsigned int tc_refb0_ld_sts : 1; /**< Status of the count reference value B0 register buffer. */ + unsigned int reserved : 5; + unsigned int pg_act0_ld_sts : 1; /**< Status of the channel action configuration register buffer. */ + unsigned int reserved1 : 3; + unsigned int pwm0_cfg_ld_sts : 1; /**< Status of the channel configuration register buffer. */ + unsigned int reserved2 : 19; + } BIT; +} volatile GPT_LOAD_STS_REG; + +/** + * @brief Register mapping structure of GPT. + */ +typedef struct { + GPT_VER_INFO_REG GPT_VER_INFO; /**< Version information register, offset address: 0x00000000U */ + unsigned int resereved_0[3]; + GPT_TC_DIV_REG GPT_TC_DIV; /**< Frequency division coefficient register, offset address: 0x00000010U */ + GPT_TC_PRD_REG GPT_TC_PRD; /**< Count cycle register, offset address: 0x00000014U */ + GPT_TC_REFA0_REG GPT_TC_REFA0; /**< Count reference value A0 register, offset address: 0x00000018U */ + GPT_TC_REFB0_REG GPT_TC_REFB0; /**< Count reference value B0 register, offset address: 0x0000001CU */ + unsigned int reserved_1[4]; + GPT_TC_STS_REG GPT_TC_STS; /**< Count status register, offset address: 0x00000030U */ + unsigned int reserved_2[51]; + GPT_PG_ACT0_REG GPT_PG_ACT0; /**< Channel action configuration register, offset address: 0x00000100U */ + unsigned int reserved_3[63]; + GPT_INT_EN_REG GPT_INT_EN; /**< Interrupt enable register, offset address: 0x00000200U */ + GPT_INT_FLAG_REG GPT_INT_FLAG; /**< Interrupt flag register, offset address: 0x00000204U */ + GPT_INT_INJ_REG GPT_INT_INJ; /**< Interrupt injection register, offset address: 0x00000208U */ + unsigned int reserved_4[61]; + GPT_SOCDR_EN_REG GPT_SOCDR_EN; /**< ADC/DMA request enable register, offset address: 0x00000300U */ + unsigned int reserved_5[63]; + GPT_PWM0_CFG_REG GPT_PWM0_CFG; /**< Channel configuration register, offset address: 0x00000400U */ + unsigned int reserved_6[2]; + GPT_EN_REG GPT_EN; /**< GPT enable register., offset address: 0x0000040CU */ + GPT_PWM0_STA_REG GPT_PWM0_STA; /**< Channel status register, offset address: 0x00000410U */ + unsigned int reserved_7[59]; + GPT_BUF_LOAD_EN_REG GPT_BUF_LOAD_EN; /**< Cache loading enable register, offset address: 0x00000500U */ + GPT_LOAD_STS_REG GPT_LOAD_STS; /**< Buffer loading status register, offset address: 0x00000504U */ +} volatile GPT_RegStruct; + +/** + * @} + */ + +/* Parameter Check -----------------------------------------------------------*/ + +/** + * @brief Verify GPT max pwm num + * @param num Pwm number, only valid if keep equ 0 + * @retval true + * @retval false + */ +static inline bool IsGptPwmNum(unsigned int num) +{ + return ((num) <= GPT_PWM_MAX_NUM); +} + +/** + * @brief Verify GPT div value + * @param div division factor of GPT + * @retval true + * @retval false + */ +static inline bool IsGptDiv(unsigned int div) +{ + return (div <= GPT_PWM_DIV_FACTOR_MAX_VALUE); +} + +/** + * @brief Verify GPT period value + * @param period Period of GPT + * @retval true + * @retval false + */ +static inline bool IsGptPeriod(unsigned int period) +{ + return ((period >= GPT_PWM_PERIOD_MIN_VALUE) && (period <= GPT_PWM_PERIOD_MAX_VALUE)); +} + +/** + * @brief Verify GPT ref dot value + * @param value value of GPT ref dot + * @retval true + * @retval false + */ +static inline bool IsGptRefDot(unsigned int value) +{ + return (value <= GPT_TC_PRD_MAX_VALUE); +} + +/** + * @brief Verify GPT period value + * @param period Period of GPT + * @retval true + * @retval false + */ +static inline bool IsGptAction(unsigned int action) +{ + return (action <= GPT_ACTION_OUTPUT_FLIP); +} + +/** + * @brief Verify GPT period value + * @param period Period of GPT + * @retval true + * @retval false + */ +static inline bool IsGptSetOption(unsigned int option) +{ + return ((option == BASE_CFG_SET) || (option == BASE_CFG_UNSET)); +} + +/** + * @brief Verify GPT triggle DMA type + * @param period Period of GPT + * @retval true + * @retval false + */ +static inline bool IsGptTriggleDMAType(unsigned int triggleType) +{ + return ((triggleType <= GPT_PWM0_PERIOD_TRIGGER_DMA) && (triggleType >= GPT_PWM0_TRIGGER_DMA)); +} + + +/* Direct Configuration Layer Functions --------------------------------------*/ +/** + * @brief Set PWM Period + * @param gptx GPTx register baseAddr + * @param period Number of cycles of PWM + * @retval None + */ +static inline void DCL_GPT_SetPeriod(GPT_RegStruct *gptx, unsigned int period) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + GPT_PARAM_CHECK_NO_RET(IsGptPeriod(period)); + /* Setting the GPT Period */ + GPT_TC_PRD_REG prd; + prd.reg = gptx->GPT_TC_PRD.reg; + prd.BIT.rg_cnt_prd = period; + gptx->GPT_TC_PRD.reg = prd.reg; +} + +/** + * @brief Get PWM Period + * @param gptx GPTx register baseAdd + * @retval period Number of cycles of PWM + */ +static inline unsigned int DCL_GPT_GetPeriod(const GPT_RegStruct *gptx) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + GPT_TC_PRD_REG prd; + prd.reg = gptx->GPT_TC_PRD.reg; + return prd.BIT.rg_cnt_prd; +} + +/** + * @brief Set GPT buffer load + * @param gptx GPTx register baseAddr + * @param buffLoad Buffer loading + * @retval None + */ +static inline void DCL_GPT_SetBufLoad(GPT_RegStruct *gptx, bool buffLoad) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + /* 0x1: enable the buffer load, 0: disable the buffer load */ + GPT_BUF_LOAD_EN_REG load; + load.reg = gptx->GPT_BUF_LOAD_EN.reg; + load.BIT.rg_buf_load_en = buffLoad; + gptx->GPT_BUF_LOAD_EN.reg = load.reg; +} + +/** + * @brief Get GPT buffer load status + * @param gptx GPTx register baseAddr + * @retval bool 1: buffer load enable, 0: buffer load disable. + */ +static inline bool DCL_GPT_GetBufLoad(const GPT_RegStruct *gptx) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + GPT_TC_PRD_REG prd; + prd.reg = gptx->GPT_TC_PRD.reg; + return prd.BIT.rg_cnt_prd; +} + +/** + * @brief Set GPT PWM output mode + * @param gptx GPTx register baseAddr + * @param keepEnable KeepEnable 1: Outputs PWM waves all the time, 0: Fixed number of PWM waves are output. + * @retval None + */ +static inline void DCL_GPT_SetOutputMode(GPT_RegStruct *gptx, bool keepEnable) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + GPT_PWM0_CFG_REG outMode; + /* PWM output mode. 1: continuous output of PWM waveforms; 0: output of a fixed number of PWMs. */ + outMode.reg = gptx->GPT_PWM0_CFG.reg; + outMode.BIT.rg_pwm0_keep = keepEnable; + gptx->GPT_PWM0_CFG.reg = outMode.reg; +} + +/** + * @brief Get GPT PWM output mode + * @param gptx GPTx register baseAddr + * @retval bool 1: Outputs PWM waves all the time, 0: Fixed number of PWM waves are output. + */ +static inline bool DCL_GPT_GetOutputMode(const GPT_RegStruct *gptx) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + GPT_PWM0_CFG_REG outMode; + outMode.reg = gptx->GPT_PWM0_CFG.reg; + return outMode.BIT.rg_pwm0_keep; +} + +/** + * @brief Set GPT PWM output numbers, only valid when 'rg_pwm0_keep' is set to false. + * @param gptx GPTx register baseAddr + * @param pwmNumber The number of output PWMs. + * @retval None + */ +static inline void DCL_GPT_SetPWMNumber(GPT_RegStruct *gptx, bool pwmNumber) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + /* Specifies the number of output PWM wavelengths. This parameter is valid only when PWM output mode is fixed. */ + GPT_PWM0_CFG_REG pwmset; + pwmset.reg = gptx->GPT_PWM0_CFG.reg; + pwmset.BIT.rg_pwm0_num = pwmNumber; + gptx->GPT_PWM0_CFG.reg = pwmset.reg; +} + +/** + * @brief Obtains the sequence number of the PWM wave that is being output in a channel. + * @param gptx GPTx register baseAddr + * @retval When PWM0_CFG.rg_pwm0_keep is 1, the value is always 0. + * When PWM0_CFG.rg_pwm0_keep is 0, PWM0_STA.ro_pwm0_num_sta indicates + * sequence number of the PWM wave being output by channel. + */ +static inline unsigned int DCL_GPT_GetChannelPWMNumber(GPT_RegStruct *gptx) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + GPT_PWM0_STA_REG pwmStatus; + pwmStatus.reg = gptx->GPT_PWM0_STA.reg; + return pwmStatus.BIT.ro_pwm0_num_sta; +} + +/** + * @brief PWM output status + * @param gptx GPTx register baseAddr + * @retval bool : 0: Channel does not output PWM waves. + * 1: Channel is outputting PWM waves. + */ +static inline bool DCL_GPT_GetPWMOutPutStatus(GPT_RegStruct *gptx) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + GPT_PWM0_STA_REG pwmStatus; + pwmStatus.reg = gptx->GPT_PWM0_STA.reg; + return pwmStatus.BIT.ro_pwm0_run_sta; +} + +/** + * @brief Enable output period finish interrupt of software injection channel, only valid when GPT outputs PWM + * @param gptx GPTx register baseAddr + * @retval None + */ +static inline void DCL_GPT_InjPeriodIntrruptEn(GPT_RegStruct *gptx) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + /* 0x1: enables the software injection period finish interrupt, + 0x0: disables the software injection period finish interrupt. */ + GPT_INT_INJ_REG injEn; + injEn.reg = gptx->GPT_INT_INJ.reg; + injEn.BIT.rg_prd_int_inj = BASE_CFG_ENABLE; + gptx->GPT_INT_INJ.reg = injEn.reg; +} + +/** + * @brief Enable output finish interrupt of software injection channel, only valid when GPT outputs PWM + * @param gptx GPTx register baseAddr + * @retval None + */ +static inline void DCL_GPT_InjOutFinishIntrruptEn(GPT_RegStruct *gptx) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + /* 0x1: enables the software injection output finish interrupt, + 0x0: disables the software injection output finish interrupt. */ + GPT_INT_INJ_REG injEn; + injEn.reg = gptx->GPT_INT_INJ.reg; + injEn.BIT.rg_pwm0_int_inj = BASE_CFG_ENABLE; + gptx->GPT_INT_INJ.reg = injEn.reg; +} + +/** + * @brief Enable for generating the DMA burst request signal after the output of channel is complete. + * @param gptx GPTx register baseAddr + * @param enable bool: + * 0: The DMA burst request is disabled when the output of channel is complete. + * 1: The DMA burst request signal is generated when the output of channel is complete. + * @retval None + */ +static inline void DCL_GPT_SetBurstDMAReqOutFin(GPT_RegStruct *gptx, bool enable) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + /* Sets the DMA burst request. 0x1:enable, 0x0:disable */ + GPT_SOCDR_EN_REG socDMA; + socDMA.reg = gptx->GPT_SOCDR_EN.reg; + socDMA.BIT.rg_dbr_pwm0_en = enable; + gptx->GPT_SOCDR_EN.reg = socDMA.reg; +} + +/** + * @brief Enable for generating the DMA single request signal after the output of channel is complete. + * @param gptx GPTx register baseAddr + * @param enable bool: + * 0: The DMA single request is disabled when the output of channel is complete. + * 1: The DMA single request signal is generated when the output of channel is complete. + * @retval None + */ +static inline void DCL_GPT_SetSingleDMAReqOutFin(GPT_RegStruct *gptx, bool enable) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + GPT_SOCDR_EN_REG socDMA; + /* Single DMA request when pwm out finish, 0x1: enable, 0:disable */ + socDMA.reg = gptx->GPT_SOCDR_EN.reg; + socDMA.BIT.rg_dsr_pwm0_en = enable; + gptx->GPT_SOCDR_EN.reg = socDMA.reg; +} + +/** + * @brief Enable for generating the DMA single request signal at the end of the counting period. + * @param gptx GPTx register baseAddr + * @param enable bool: + * 0: The DMA single request is disabled at the end of the counting period. + * 1: The DMA single request signal is generated at the end of the counting period. + * @retval None + */ +static inline void DCL_GPT_SetSingleDMAReqPeriod(GPT_RegStruct *gptx, bool enable) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + /* Single DMA request when pwm period output finish, 0x1: enable, 0:disable */ + GPT_SOCDR_EN_REG socDMA; + socDMA.reg = gptx->GPT_SOCDR_EN.reg; + socDMA.BIT.rg_dsr_prd_en = enable; + gptx->GPT_SOCDR_EN.reg = socDMA.reg; +} + +/** + * @brief Enable for generating the DMA burst request signal at the end of the counting period. + * @param gptx GPTx register baseAddr + * @param enable bool: + * 0: The DMA burst request is disabled at the end of the counting period. + * 1: The DMA burst request signal is generated at the end of the counting period. + * @retval None + */ +static inline void DCL_GPT_SetBurstDMAReqPeriod(GPT_RegStruct *gptx, bool enable) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + GPT_SOCDR_EN_REG socDMA; + /* Sets whether to initiate a DMA burst request after the PWM period output finish. */ + socDMA.reg = gptx->GPT_SOCDR_EN.reg; + socDMA.BIT.rg_dbr_prd_en = enable; + gptx->GPT_SOCDR_EN.reg = socDMA.reg; +} + +/** + * @brief Enable for generating the ADC signal at the end of the counting period. + * @param gptx GPTx register baseAddr + * @param enable bool: + * 0: The ADC signal is disabled when the counting period ends. + * 1: The ADC signal is generated at the end of the counting period. + * @retval None + */ +static inline void DCL_GPT_SetADCReqPeriod(GPT_RegStruct *gptx, bool enable) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + /* Sets whether to initiate an ADC request after the PWM period output finish. */ + GPT_SOCDR_EN_REG socDMA; + socDMA.reg = gptx->GPT_SOCDR_EN.reg; + socDMA.BIT.rg_soc_prd_en = enable; + gptx->GPT_SOCDR_EN.reg = socDMA.reg; +} + +/** + * @brief Enables the SOC signal generated when the output of channel is complete. + * @param gptx GPTx register baseAddr + * @param enable bool: + 0: The SOC signal is disabled when the output of channel is complete. + 1: The SoC signal is generated when the output of channel is complete. + * @retval None + */ +static inline void DCL_GPT_SetADCReqOutFin(GPT_RegStruct *gptx, bool enable) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + /* Sets whether to initiate an ADC request after the PWM output finish. */ + GPT_SOCDR_EN_REG socDMA; + socDMA.reg = gptx->GPT_SOCDR_EN.reg; + socDMA.BIT.rg_soc_pwm0_en = enable; + gptx->GPT_SOCDR_EN.reg = socDMA.reg; +} + + +/** + * @brief Set PWM Divider factor + * @param gptx GPTx register baseAddr + * @param div divison factor + * @retval None + */ +static inline void DCL_GPT_SetDiv(GPT_RegStruct *gptx, unsigned int div) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + GPT_PARAM_CHECK_NO_RET(IsGptDiv(div)); + GPT_TC_DIV_REG gptDiv; + /* Sets the frequency division of GPT. The value ranges from 1 to 4095. */ + gptDiv.reg = gptx->GPT_TC_DIV.reg; + gptDiv.BIT.rg_div_fac = div; + gptx->GPT_TC_DIV.reg = gptDiv.reg; +} + +/** + * @brief Get PWM Divider factor + * @param gptx GPTx register baseAddr + * @retval div divison factor + */ +static inline unsigned int DCL_GPT_GetDiv(const GPT_RegStruct *gptx) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + GPT_TC_DIV_REG div; + div.reg = gptx->GPT_TC_DIV.reg; + return div.BIT.rg_div_fac; +} + +/** + * @brief Get PWM current count value of the divider + * @param gptx GPTx register baseAddr + * @retval divcnt Counter of current div counter value + */ +static inline unsigned int DCL_GPT_GetDivCnt(const GPT_RegStruct *gptx) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + GPT_TC_STS_REG value; + value.reg = gptx->GPT_TC_STS.reg; + return value.BIT.ro_div_cnt; +} + +/** + * @brief Set PWM Current Counter value + * @param gptx GPTx register baseAddr + * @retval counter The current count value of the counter. + */ +static inline unsigned int DCL_GPT_GetCounterValue(GPT_RegStruct *gptx) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + GPT_TC_STS_REG value; + value.reg = gptx->GPT_TC_STS.reg; + return value.BIT.ro_cnt_val; +} + +/** + * @brief Set Reference A Action + * @param gptx GPTx register baseAddr + * @param action When the counter is equal to the reference value A, the PWM output action, @ref GPT_ActionType + * @retval None + */ +static inline void DCL_GPT_SetRefAAction(GPT_RegStruct *gptx, GPT_ActionType action) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + GPT_PARAM_CHECK_NO_RET(IsGptAction(action)); + gptx->GPT_PG_ACT0.BIT.rg_pg_act0_refa0 = action; +} + +/** + * @brief Get Reference A Action + * @param gptx GPTx register baseAddr + * @retval action When the counter is equal to the reference value A, the PWM output action + */ +static inline unsigned int DCL_GPT_GetRefAAction(const GPT_RegStruct *gptx) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + return gptx->GPT_PG_ACT0.BIT.rg_pg_act0_refa0; +} + +/** + * @brief Set Reference B Action + * @param gptx GPTx register baseAddr + * @param action When the counter is equal to the reference value B, the PWM output action, @ref GPT_ActionType + * @retval None + */ +static inline void DCL_GPT_SetRefBAction(GPT_RegStruct *gptx, GPT_ActionType action) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + GPT_PARAM_CHECK_NO_RET(IsGptAction(action)); + gptx->GPT_PG_ACT0.BIT.rg_pg_act0_refb0 = action; +} + +/** + * @brief Get Reference B Action + * @param gptx GPTx register baseAddr + * @retval action When the counter is equal to the reference value B, the PWM output action + */ +static inline unsigned int DCL_GPT_GetRefBAction(const GPT_RegStruct *gptx) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + return gptx->GPT_PG_ACT0.BIT.rg_pg_act0_refb0; +} + +/** + * @brief Set Interrupt Enable/Disable + * @param gptx GPTx register baseAddr + * @param enable interrupt enable or disable + * @retval None + */ +static inline void DCL_GPT_SetInterruptEn(GPT_RegStruct *gptx, bool enable) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + gptx->GPT_INT_EN.BIT.rg_pwm0_int_en = enable; +} + +/** + * @brief Set Interrupt Enable/Disable + * @param gptx GPTx register baseAddr + * @retval enable interrupt enable or disable + */ +static inline unsigned int DCL_GPT_GetInterruptEn(const GPT_RegStruct *gptx) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + return gptx->GPT_INT_EN.BIT.rg_pwm0_int_en; +} + +/** + * @brief Set Period Interrupt Enable/Disable + * @param gptx GPTx register baseAddr + * @param enable interrupt enable or disable + * @retval None + */ +static inline void DCL_GPT_SetPeriodInterruptEn(GPT_RegStruct *gptx, bool enable) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + gptx->GPT_INT_EN.BIT.rg_prd_int_en = enable; +} + +/** + * @brief Get Period Interrupt Enable/Disable + * @param gptx GPTx register baseAddr + * @retval enable interrupt enable or disable + */ +static inline unsigned int DCL_GPT_GetPeriodInterruptEn(const GPT_RegStruct *gptx) +{ + GPT_ASSERT_PARAM(IsGPTInstance(gptx)); + return gptx->GPT_INT_EN.BIT.rg_prd_int_en; +} + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_GPT_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/gpt/src/gpt.c b/vendor/others/demo/5-tim_adc/demo/drivers/gpt/src/gpt.c new file mode 100644 index 000000000..0ad8dad38 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/gpt/src/gpt.c @@ -0,0 +1,446 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file gpt.c + * @author MCU Driver Team + * @brief GPT module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the GPT. + * + Initialization function of GPT + * + Clock Configuration of GPT + * + Get GPT State and Apply GPT + */ + +#include "gpt.h" + +static unsigned int GPT_GetKeepState(GPT_Handle *handle); + +/** + * @brief Get Keep state + * @param handle GPT Handle + * @retval keep 0: Outputs a fixed number of square waves + * 1: Output continuous square wave + */ +static unsigned int GPT_GetKeepState(GPT_Handle *handle) +{ + GPT_PWM0_CFG_REG pwm0Cfg; + pwm0Cfg.reg = handle->baseAddress->GPT_PWM0_CFG.reg; + return pwm0Cfg.BIT.rg_pwm0_keep; +} + +/** + * @brief Init the GPT. + * @param handle GPT Handle. + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Paramter check fail + */ +BASE_StatusType HAL_GPT_Init(GPT_Handle *handle) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + + HAL_GPT_Stop(handle); + if (HAL_GPT_Config(handle) == BASE_STATUS_ERROR) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief Start GPT + * @param handle GPT Handle. + * @retval None + */ +void HAL_GPT_Start(GPT_Handle *handle) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + /* Enables the GPT to output PWM waves according to the configuration. */ + GPT_EN_REG gptEn; + gptEn.BIT.rg_gpt_en = BASE_CFG_SET; + handle->baseAddress->GPT_EN.reg = gptEn.reg; +} + +/** + * @brief Stop GPT + * @param handle GPT Handle. + * @retval None + */ +void HAL_GPT_Stop(GPT_Handle *handle) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + /* Disable the GPT to output PWM waves. */ + GPT_EN_REG gptEn; + gptEn.BIT.rg_gpt_en = BASE_CFG_UNSET; + handle->baseAddress->GPT_EN.reg = gptEn.reg; +} + +/** + * @brief GPT Configuration + * @param handle GPT Handle. + * @retval BASE_STATUS_OK + * @retval BASE_STATUS_ERROR + */ +BASE_StatusType HAL_GPT_Config(GPT_Handle *handle) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + GPT_PARAM_CHECK_WITH_RET(IsGptPeriod(handle->period), BASE_STATUS_ERROR); + GPT_PARAM_CHECK_WITH_RET(IsGptDiv(handle->clockDiv), BASE_STATUS_ERROR); + GPT_PARAM_CHECK_WITH_RET(IsGptRefDot(handle->refA0.refdot), BASE_STATUS_ERROR); + GPT_PARAM_CHECK_WITH_RET(IsGptRefDot(handle->refB0.refdot), BASE_STATUS_ERROR); + GPT_PARAM_CHECK_WITH_RET(handle->refA0.refdot <= handle->refB0.refdot, BASE_STATUS_ERROR); + GPT_PARAM_CHECK_WITH_RET(handle->refB0.refdot <= handle->period, BASE_STATUS_ERROR); + GPT_PARAM_CHECK_WITH_RET(IsGptAction(handle->refA0.refAction), BASE_STATUS_ERROR); + GPT_PARAM_CHECK_WITH_RET(IsGptAction(handle->refB0.refAction), BASE_STATUS_ERROR); + GPT_PARAM_CHECK_WITH_RET(IsGptPwmNum(handle->pwmNum), BASE_STATUS_ERROR); + + GPT_RegStruct *gptReg; + gptReg = handle->baseAddress; + /* Configure whether to enable cache loading. */ + gptReg->GPT_BUF_LOAD_EN.BIT.rg_buf_load_en = handle->bufLoad; + + /* Configuring the Cycle and Frequency Divider */ + gptReg->GPT_TC_DIV.reg = handle->clockDiv; + gptReg->GPT_TC_PRD.reg = handle->period; + /* Set the count reference point and the corresponding reference action. */ + gptReg->GPT_TC_REFA0.reg = handle->refA0.refdot; + gptReg->GPT_PG_ACT0.BIT.rg_pg_act0_refa0 = handle->refA0.refAction; + gptReg->GPT_TC_REFB0.reg = handle->refB0.refdot; + gptReg->GPT_PG_ACT0.BIT.rg_pg_act0_refb0 = handle->refB0.refAction; + + /* Sets the PWM output mode: outputs infinite PWM waves and outputs fixed number PWM. */ + gptReg->GPT_PWM0_CFG.BIT.rg_pwm0_keep = handle->pwmKeep; + /* Sets the number of output PWM wavelengths. This parameter is valid only when outputs fixed number PWM. */ + gptReg->GPT_PWM0_CFG.BIT.rg_pwm0_num = handle->pwmNum; + + /* Sets the GPT output completion interrupt and periodic interrupt. */ + gptReg->GPT_INT_EN.BIT.rg_prd_int_en = handle->handleEx.periodIntEnable; + gptReg->GPT_INT_EN.BIT.rg_pwm0_int_en = handle->handleEx.outputFinIntEnable; + + /* ADC Trigger Sampling Configuration */ + gptReg->GPT_SOCDR_EN.BIT.rg_soc_pwm0_en = handle->triggleAdcOutFinish; + gptReg->GPT_SOCDR_EN.BIT.rg_soc_prd_en = handle->triggleAdcPeriod; + return BASE_STATUS_OK; +} + +/** + * @brief Obtains GPT configuration parameters. + * @param handle GPT Handle. + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Fail + */ +BASE_StatusType HAL_GPT_GetConfig(GPT_Handle *handle) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + + GPT_RegStruct *gptReg = handle->baseAddress; + /* Obtains the configuration parameters of the PWM wavelength. */ + handle->clockDiv = gptReg->GPT_TC_DIV.reg; + handle->period = gptReg->GPT_TC_PRD.reg; + handle->refA0.refdot = gptReg->GPT_TC_REFA0.reg; + handle->refB0.refdot = gptReg->GPT_TC_REFB0.reg; + handle->refA0.refAction = gptReg->GPT_PG_ACT0.BIT.rg_pg_act0_refa0; + handle->refB0.refAction = gptReg->GPT_PG_ACT0.BIT.rg_pg_act0_refb0; + /* Obtains the cache loading status. */ + handle->bufLoad = gptReg->GPT_BUF_LOAD_EN.BIT.rg_buf_load_en; + + /* Obtaining the Interrupt Status */ + handle->handleEx.periodIntEnable = gptReg->GPT_INT_EN.BIT.rg_prd_int_en; + handle->handleEx.outputFinIntEnable = gptReg->GPT_INT_EN.BIT.rg_pwm0_int_en; + + /* Obtains ADC configuration parameters. */ + handle->triggleAdcOutFinish = gptReg->GPT_SOCDR_EN.BIT.rg_soc_pwm0_en; + handle->triggleAdcPeriod = gptReg->GPT_SOCDR_EN.BIT.rg_soc_prd_en; + + /* Obtains the PWM output mode. */ + GPT_PWM0_CFG_REG pwm0Cfg; + pwm0Cfg.reg = gptReg->GPT_PWM0_CFG.reg; + handle->pwmKeep = GPT_GetKeepState(handle); + handle->pwmNum = pwm0Cfg.BIT.rg_pwm0_num; + return BASE_STATUS_OK; +} + +/** + * @brief Set GPT count reference value and action configuration. + * @param handle GPT Handle. + * @param refer Input Pointer to the reference, @ref GPT_ReferCfg + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_GPT_SetReferCounterAndAction(GPT_Handle *handle, const GPT_ReferCfg *refer) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(refer != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + + unsigned int period = handle->baseAddress->GPT_TC_PRD.reg; + /* Verifying ref value parameters */ + if ((refer->refA0.refdot > period) || (refer->refB0.refdot > period)) { + return BASE_STATUS_ERROR; + } + GPT_RegStruct *gptReg = handle->baseAddress; + /* Set reference value parameters. */ + gptReg->GPT_TC_REFA0.reg = refer->refA0.refdot; + gptReg->GPT_TC_REFB0.reg = refer->refB0.refdot; + /* Set reference dot action */ + gptReg->GPT_PG_ACT0.BIT.rg_pg_act0_refa0 = refer->refA0.refAction; + gptReg->GPT_PG_ACT0.BIT.rg_pg_act0_refb0 = refer->refB0.refAction; + return BASE_STATUS_OK; +} + +/** + * @brief Get GPT count reference value and action configuration + * @param handle GPT Handle. + * @param refer Pointer to the reference, @ref GPT_ReferCfg + * @retval None + */ +void HAL_GPT_GetReferCounterAndAction(GPT_Handle *handle, GPT_ReferCfg *refer) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(refer != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + GPT_RegStruct *gptReg = handle->baseAddress; + /* Obtain the reference value of PWM. */ + refer->refA0.refdot = gptReg->GPT_TC_REFA0.reg; + refer->refB0.refdot = gptReg->GPT_TC_REFB0.reg; + /* The action of obtaining a reference value. */ + refer->refA0.refAction = gptReg->GPT_PG_ACT0.BIT.rg_pg_act0_refa0; + refer->refB0.refAction = gptReg->GPT_PG_ACT0.BIT.rg_pg_act0_refb0; +} + +/** + * @brief Set GPT counting period + * @param handle GPT Handle. + * @param period Counting period. + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_GPT_SetCountPeriod(GPT_Handle *handle, unsigned int period) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + GPT_PARAM_CHECK_WITH_RET(IsGptPeriod(period), BASE_STATUS_ERROR); + /* Sets the GPT counting period. The larger the value, the longer the period time. */ + GPT_TC_PRD_REG periodReg; + periodReg.reg = handle->baseAddress->GPT_TC_PRD.reg; + periodReg.BIT.rg_cnt_prd = period; + handle->baseAddress->GPT_TC_PRD.reg = periodReg.reg; + return BASE_STATUS_OK; +} + +/** + * @brief Get GPT Period + * @param handle GPT Handle. + * @retval unsigned int GPT Counting Period. + */ +unsigned int HAL_GPT_GetCountPeriod(GPT_Handle *handle) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + GPT_TC_PRD_REG periodReg; + /* return period value index */ + periodReg.reg = handle->baseAddress->GPT_TC_PRD.reg; + return periodReg.BIT.rg_cnt_prd; +} + +/** + * @brief Set GPT divider factor + * @param handle GPT Handle. + * @param div Input divider factor, Frequency division multiple equal configured + * frequency division factor + 1 + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_GPT_SetDivFactor(GPT_Handle *handle, unsigned int div) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + GPT_PARAM_CHECK_WITH_RET((div <= GPT_DIV_FACTOR_MAX_VALUE), BASE_STATUS_ERROR); + GPT_TC_DIV_REG divReg; + + /* Frequency division multiple = configured frequency division factor + 1 */ + divReg.reg = handle->baseAddress->GPT_TC_DIV.reg; + divReg.BIT.rg_div_fac = div; + handle->baseAddress->GPT_TC_DIV.reg = divReg.reg; + return BASE_STATUS_OK; +} + +/** + * @brief Get GPT Divison Factor + * @param handle GPT Handle + * @retval divCnt The current count value of the divider + */ +unsigned int HAL_GPT_GetDivFactor(GPT_Handle *handle) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + + GPT_TC_DIV_REG tcValue; + /* Obtains the frequency division value of the counter. */ + tcValue.reg = handle->baseAddress->GPT_TC_DIV.reg; + return tcValue.BIT.rg_div_fac; +} + +/** + * @brief Set GPT Cache Load Enable/Disable for Cache-enabled Registers + * @param handle GPT Handle + * @param bufferLoad Cache load enable/disable, @ref GPT_SetOption + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Fail + */ +BASE_StatusType HAL_GPT_SetBufferLoad(GPT_Handle *handle, GPT_SetOption bufferLoad) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + GPT_PARAM_CHECK_WITH_RET(IsGptSetOption(bufferLoad), BASE_STATUS_ERROR); + + GPT_BUF_LOAD_EN_REG bufLoadEn; + /* Set buffer load of GPT */ + bufLoadEn.reg = handle->baseAddress->GPT_BUF_LOAD_EN.reg; + bufLoadEn.BIT.rg_buf_load_en = bufferLoad; + handle->baseAddress->GPT_BUF_LOAD_EN.reg = bufLoadEn.reg; + return BASE_STATUS_OK; +} + +/** + * @brief Get Buffer status + * @param handle GPT Handle + * @retval loadStatus @ref GPT_LoadStatus + */ +unsigned int HAL_GPT_GetBufferLoadStatus(GPT_Handle *handle) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + + return handle->baseAddress->GPT_LOAD_STS.reg; +} + + +/** + * @brief Set GPT PWM output finish interrupt + * @param handle GPT Handle + * @param outFinishInt Out finish interrupt enable/disable @ref GPT_SetOption + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Fail + */ +BASE_StatusType HAL_GPT_SetOutFinishInt(GPT_Handle *handle, GPT_SetOption outFinishInt) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + GPT_PARAM_CHECK_WITH_RET(IsGptSetOption(outFinishInt), BASE_STATUS_ERROR); + /* Set output finish interrupt, 0x1: enabel, 0x0: disable. */ + GPT_INT_EN_REG intEn; + intEn.reg = handle->baseAddress->GPT_INT_EN.reg; + intEn.BIT.rg_pwm0_int_en = outFinishInt; + handle->baseAddress->GPT_INT_EN.reg = intEn.reg; + return BASE_STATUS_OK; +} + +/** + * @brief Set GPT period interrupt enable + * @param handle GPT Handle + * @param periodInt Period interrupt enable/disable @ref GPT_SetOption + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Fail + */ +BASE_StatusType HAL_GPT_SetPeriodInt(GPT_Handle *handle, GPT_SetOption periodInt) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + GPT_PARAM_CHECK_WITH_RET(IsGptSetOption(periodInt), BASE_STATUS_ERROR); + /* Set period output finish interrupt, 0x1: enable, 0x0:disable. */ + GPT_INT_EN_REG intEn; + intEn.reg = handle->baseAddress->GPT_INT_EN.reg; + intEn.BIT.rg_prd_int_en = periodInt; + handle->baseAddress->GPT_INT_EN.reg = intEn.reg; + return BASE_STATUS_OK; +} + +/** + * @brief Gpt pwm output finish interrupt service processing function. + * @param handle GPT Handle + * @retval None + */ +void HAL_GPT_IrqOutFinishHandler(void *handle) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_Handle *gptHandle = (GPT_Handle *)handle; + GPT_ASSERT_PARAM(IsGPTInstance(gptHandle->baseAddress)); + /* Check interrupt whether the injection interrupt */ + /* period and finish interrupt */ + if (gptHandle->baseAddress->GPT_INT_FLAG.BIT.ro_pwm0_int_flag == BASE_CFG_ENABLE) { + /* channel out put finish interrupt */ + gptHandle->baseAddress->GPT_INT_FLAG.BIT.rg_pwm0_int_clr = BASE_CFG_ENABLE; + if (gptHandle->userCallBack.PWMOutPutFin != NULL) { + gptHandle->userCallBack.PWMOutPutFin(gptHandle); + } + } + return; +} + +/** + * @brief Gpt period interrupt service processing function. + * @param handle GPT Handle + * @retval None + */ +void HAL_GPT_IrqPeriodHandler(void *handle) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_Handle *gptHandle = (GPT_Handle *)handle; + GPT_ASSERT_PARAM(IsGPTInstance(gptHandle->baseAddress)); + + if (gptHandle->baseAddress->GPT_INT_FLAG.BIT.ro_prd_int_flag == BASE_CFG_ENABLE) { + /* period interrupt */ + gptHandle->baseAddress->GPT_INT_FLAG.BIT.rg_prd_int_clr = BASE_CFG_ENABLE; + if (gptHandle->userCallBack.PWMPeriod != NULL) { + gptHandle->userCallBack.PWMPeriod(gptHandle); + } + } + return; +} + +/** + * @brief User callback function registration interface. + * @param gptHandle GPT handle. + * @param typeID Id of callback function type. @ref GPT_CallBackFunType + * @param pCallback pointer of the specified callbcak function. @ref GPT_CallBackFunc + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR fail + */ +BASE_StatusType HAL_GPT_RegisterCallBack(GPT_Handle *gptHandle, GPT_CallBackFunType typeID, + GPT_CallBackFunc pCallback) +{ + GPT_ASSERT_PARAM(gptHandle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(gptHandle->baseAddress)); + /* Registering interrupt callback function according to different types */ + switch (typeID) { + case GPT_INT_PERIOD: + /* Registers function for handling period output finish interrupt. */ + gptHandle->userCallBack.PWMPeriod = pCallback; + break; + case GPT_INT_PWM_OUTPUT_FIN: + /* Registers function for handling output finish interrupt. */ + gptHandle->userCallBack.PWMOutPutFin = pCallback; + break; + default: + return BASE_STATUS_ERROR; /* Failed to register the callback function. */ + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/gpt/src/gpt_ex.c b/vendor/others/demo/5-tim_adc/demo/drivers/gpt/src/gpt_ex.c new file mode 100644 index 000000000..44aaff7bd --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/gpt/src/gpt_ex.c @@ -0,0 +1,243 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file gpt_ex.c + * @author MCU Driver Team + * @brief GPT module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the GPT. + * + Initialization function of GPT + * + Clock Configuration of GPT + * + Get GPT State and Apply GPT + */ + +#include "gpt_ex.h" + +/** + * @brief Get GPT Counter Value + * @param handle GPT Handle + * @retval counter The current count value of the counter + */ +unsigned int HAL_GPT_GetCounterValueEx(GPT_Handle *handle) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + /* Returns count value of the counter. */ + GPT_TC_STS_REG tcValue; + tcValue.reg = handle->baseAddress->GPT_TC_STS.reg; + return tcValue.BIT.ro_cnt_val; +} + +/** + * @brief GPT Trigger DMA Enable + * @param handle GPT Handle + * @param triggerDMAType Trigger DMA Type Mask, @ref GPT_TriggerDMAType + * @retval BASE_STATUS_OK Setting succeeded. + * @retval BASE_STATUS_ERROR Setting failed. + */ +BASE_StatusType HAL_GPT_TriggerDMAEnableEx(GPT_Handle *handle, GPT_TriggerDMAType triggerDMAType) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + + GPT_SOCDR_EN_REG socdrEn; + /* Set GPT trigger DMA enable flags */ + socdrEn.reg = handle->baseAddress->GPT_SOCDR_EN.reg; + switch (triggerDMAType) { + case GPT_PWM0_TRIGGER_DMA: /* DMA request is triggered when the PWM output finish. */ + socdrEn.BIT.rg_dbr_pwm0_en = BASE_CFG_ENABLE; + socdrEn.BIT.rg_dsr_pwm0_en = BASE_CFG_ENABLE; + break; + case GPT_PERIOD_TRIGGER_DMA: /* DMA request is triggered when the PWM period output finish. */ + socdrEn.BIT.rg_dbr_prd_en = BASE_CFG_ENABLE; + socdrEn.BIT.rg_dsr_prd_en = BASE_CFG_ENABLE; + break; + /* DMA request is triggered when the PWM output finish or period output finish. */ + case GPT_PWM0_PERIOD_TRIGGER_DMA: + socdrEn.BIT.rg_dbr_pwm0_en = BASE_CFG_ENABLE; + socdrEn.BIT.rg_dsr_pwm0_en = BASE_CFG_ENABLE; + socdrEn.BIT.rg_dbr_prd_en = BASE_CFG_ENABLE; + socdrEn.BIT.rg_dsr_prd_en = BASE_CFG_ENABLE; + break; + default: + return BASE_STATUS_ERROR; /* Failed to set the DMA trigger. */ + } + handle->baseAddress->GPT_SOCDR_EN.reg = socdrEn.reg; + return BASE_STATUS_OK; +} + +/** + * @brief GPT Trigger DMA Disable + * @param handle GPT Handle + * @param triggerDMAType Trigger DMA Type Mask, @ref GPT_TriggerDMAType + * @retval BASE_STATUS_OK succeeded. + * @retval BASE_STATUS_ERROR failed. + */ +BASE_StatusType HAL_GPT_TriggerDMADisableEx(GPT_Handle *handle, GPT_TriggerDMAType triggerDMAType) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + + GPT_SOCDR_EN_REG socdrEn; + /* Set GPT trigger DMA enable flags */ + socdrEn.reg = handle->baseAddress->GPT_SOCDR_EN.reg; + switch (triggerDMAType) { + case GPT_PWM0_TRIGGER_DMA: /* Disables triggering DMA request when the PWM output finish. */ + socdrEn.BIT.rg_dbr_pwm0_en = BASE_CFG_DISABLE; + socdrEn.BIT.rg_dsr_pwm0_en = BASE_CFG_DISABLE; + break; + case GPT_PERIOD_TRIGGER_DMA: /* Disables triggering DMA request when the PWM period out finish. */ + socdrEn.BIT.rg_dbr_prd_en = BASE_CFG_DISABLE; + socdrEn.BIT.rg_dsr_prd_en = BASE_CFG_DISABLE; + break; + /* Disables triggering DMA request when the PWM output finish or period output finish. */ + case GPT_PWM0_PERIOD_TRIGGER_DMA: + socdrEn.BIT.rg_dbr_pwm0_en = BASE_CFG_DISABLE; + socdrEn.BIT.rg_dsr_pwm0_en = BASE_CFG_DISABLE; + socdrEn.BIT.rg_dbr_prd_en = BASE_CFG_DISABLE; + socdrEn.BIT.rg_dsr_prd_en = BASE_CFG_DISABLE; + break; + default: + return BASE_STATUS_ERROR; /* Failed to set the DMA trigger. */ + } + handle->baseAddress->GPT_SOCDR_EN.reg = socdrEn.reg; + return BASE_STATUS_OK; +} + +/** + * @brief GPT Trigger ADC Enable + * @param handle GPT Handle + * @param triggerADCType ADC Type Mask, @ref GPT_TriggerADCType + * @retval BASE_STATUS_OK succeeded. + * @retval BASE_STATUS_ERROR failed. + */ +BASE_StatusType HAL_GPT_TriggerADCEnableEx(GPT_Handle *handle, GPT_TriggerADCType triggerADCType) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + + GPT_SOCDR_EN_REG socdrEn; + /* Set GPT trigger ADC enable flags */ + socdrEn.reg = handle->baseAddress->GPT_SOCDR_EN.reg; + switch (triggerADCType) { + case GPT_PWM0_TRIGGER_ADC: /* Enable triggering ADC request when the PWM output finish. */ + socdrEn.BIT.rg_soc_pwm0_en = BASE_CFG_ENABLE; + break; + case GPT_PERIOD_TRIGGER_ADC: /* Enable triggering ADC request when the PWM period output finish. */ + socdrEn.BIT.rg_soc_prd_en = BASE_CFG_ENABLE; + break; + /* Enable triggering ADC request when the PWM period output finish and PWM output finish. */ + case GPT_PWM0_PERIOD_TRIGGER_ADC: + socdrEn.BIT.rg_soc_pwm0_en = BASE_CFG_ENABLE; + socdrEn.BIT.rg_soc_prd_en = BASE_CFG_ENABLE; + break; + default: + return BASE_STATUS_ERROR; /* Failed to set the ADC trigger. */ + } + handle->baseAddress->GPT_SOCDR_EN.reg = socdrEn.reg; + return BASE_STATUS_OK; +} + +/** + * @brief GPT Trigger ADC Disable + * @param handle GPT Handle + * @param triggerADCType Trigger DMA Type Mask, @ref GPT_TriggerADCType + * @retval BASE_STATUS_OK succeeded. + * @retval BASE_STATUS_ERROR failed. + */ +BASE_StatusType HAL_GPT_TriggerADCDisableEx(GPT_Handle *handle, GPT_TriggerADCType triggerADCType) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + + GPT_SOCDR_EN_REG socdrEn; + /* Set GPT trigger ADC enable flags */ + socdrEn.reg = handle->baseAddress->GPT_SOCDR_EN.reg; + switch (triggerADCType) { + case GPT_PWM0_TRIGGER_ADC: /* Disable triggering ADC request when the PWM output finish. */ + socdrEn.BIT.rg_soc_pwm0_en = BASE_CFG_DISABLE; + break; + case GPT_PERIOD_TRIGGER_ADC: /* Disable triggering ADC request when the PWM period output finish. */ + socdrEn.BIT.rg_soc_prd_en = BASE_CFG_DISABLE; + break; + /* Disable triggering ADC request when the PWM output finish and period output finish. */ + case GPT_PWM0_PERIOD_TRIGGER_ADC: + socdrEn.BIT.rg_soc_pwm0_en = BASE_CFG_DISABLE; + socdrEn.BIT.rg_soc_prd_en = BASE_CFG_DISABLE; + break; + default: + return BASE_STATUS_ERROR; /* Failed to set the ADC trigger. */ + } + handle->baseAddress->GPT_SOCDR_EN.reg = socdrEn.reg; + return BASE_STATUS_OK; +} + +/** + * @brief Get Current PWM0 Number + * @param handle GPT Handle + * @retval pwmNumber Current PWM0 Number, Only valid when PWM0_CFG.rg_pwm0_keep = 1 + */ +unsigned int HAL_GPT_GetCurrentPWM0NumberEx(GPT_Handle *handle) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + + GPT_PWM0_STA_REG pwm0Stat; + /* Clear GPT trigger ADC enable flags */ + pwm0Stat.reg = handle->baseAddress->GPT_PWM0_STA.reg; + return pwm0Stat.BIT.ro_pwm0_num_sta; +} + +/** + * @brief Injected PWM output completion interrupt, which takes effect only when PWM waves are output. + * @param handle GPT Handle + * @param softInjOutFin 1: enable 0: disable @ref GPT_SetOption + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_GPT_SoftInjOutFinIntEx(GPT_Handle *handle, GPT_SetOption softInjOutFin) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + GPT_PARAM_CHECK_WITH_RET(IsGptSetOption(softInjOutFin), BASE_STATUS_ERROR); + /* Software injection PWM period output finish interrupt. */ + GPT_INT_INJ_REG intInj; + intInj.reg = handle->baseAddress->GPT_INT_INJ.reg; + intInj.BIT.rg_pwm0_int_inj = softInjOutFin; + handle->baseAddress->GPT_INT_INJ.reg = intInj.reg; + return BASE_STATUS_OK; +} + +/** + * @brief Injected PWM period finish interrupt, which takes effect only when PWM waves are output. + * @param handle GPT Handle + * @param softInjPeriod 1: enable 0: disable, @ref GPT_SetOption + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_GPT_SoftInjPeriodFinIntEx(GPT_Handle *handle, GPT_SetOption softInjPeriod) +{ + GPT_ASSERT_PARAM(handle != NULL); + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + GPT_PARAM_CHECK_WITH_RET(IsGptSetOption(softInjPeriod), BASE_STATUS_ERROR); + /* Software injection PWM output finish interrupt. */ + GPT_INT_INJ_REG intInj; + intInj.reg = handle->baseAddress->GPT_INT_INJ.reg; + intInj.BIT.rg_prd_int_inj = softInjPeriod; + handle->baseAddress->GPT_INT_INJ.reg = intInj.reg; + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/i2c/common/inc/i2c.h b/vendor/others/demo/5-tim_adc/demo/drivers/i2c/common/inc/i2c.h new file mode 100644 index 000000000..decd4f3b3 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/i2c/common/inc/i2c.h @@ -0,0 +1,169 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file i2c.h + * @author MCU Driver Team, + * @brief I2C module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the I2C. + * + Initialization and de-initialization functions. + * + Peripheral transmit and receiving functions. + * + I2C parameter handle definition. + * + Basic Configuration Parameter Enumeration Definition. + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef McuMagicTag_I2C_H +#define McuMagicTag_I2C_H + +/* Includes ------------------------------------------------------------------*/ +#include "dma.h" +#include "i2c_ip.h" + +/** + * @defgroup I2C I2C + * @brief I2C module. + * @{ + */ + +/** + * @defgroup I2C_Common I2C Common + * @brief I2C common external module. + * @{ + */ + +/* Typedef definitions -------------------------------------------------------*/ + +/** + * @defgroup I2C_Handle_Definition I2C Handle Definition + * @{ + */ + +/** + * @brief Module Status Enumeration Definition + */ +typedef enum { + I2C_STATE_RESET = 0x00000000U, + I2C_STATE_READY = 0x00000001U, + I2C_STATE_BUSY = 0x00000002U, + I2C_STATE_BUSY_MASTER_TX = 0x00000003U, + I2C_STATE_BUSY_MASTER_RX = 0x00000004U, + I2C_STATE_BUSY_SLAVE_TX = 0x00000005U, + I2C_STATE_BUSY_SLAVE_RX = 0x00000006U, + I2C_STATE_TIMEOUT = 0x00000007U, + I2C_STATE_ERROR = 0x00000008U, +} I2C_StateType; + +/** + * @brief Module handle structure definition + */ +typedef struct _I2C_Handle { + I2C_RegStruct *baseAddress; /**< Register base address. */ + I2C_ModeSelectType functionMode; /**< Set master or slave. */ + I2C_AddressMode addrMode; /**< 7bit or 10bit. */ + unsigned int slaveOwnAddress; /**< Own address as slave. */ + unsigned int sdaHoldTime; /**< SDA hold time. */ + unsigned int freq; /**< Operating Frequency. */ + unsigned int ignoreAckFlag; /**< Ignore the response flag bit. */ + unsigned int generalCallMode; /**< General call mode. */ + + volatile unsigned char *transferBuff; /**< Transmission Data buffer. */ + volatile unsigned int transferSize; /**< Transmission Data Length. */ + volatile unsigned int transferCount; /**< Transferred Data Count. */ + + unsigned int timeout; /**< Timeout period. */ + unsigned int rxWaterMark; /**< RX threshold configuration. */ + unsigned int txWaterMark; /**< TX threshold configuration. */ + unsigned int rxDmaCh; /**< RX DMA channel */ + unsigned int txDmaCh; /**< TX DMA channel */ + DMA_Handle *dmaHandle; /**< DMA handle */ + + I2C_StateType state; /**< Running Status. */ + BASE_StatusType errorCode; /**< Error Code. */ + I2C_UserCallBack userCallBack; /**< User-defined callback function. */ + I2C_ExtendHandle handleEx; /**< Extend handle, configuring some special parameters. */ +} I2C_Handle; +/** + * @} + */ + +/** + * @defgroup I2C_API_Declaration I2C HAL API + * @{ + */ +/** + * @brief Callback Function Type Definition. + */ +typedef void (*I2C_CallbackFunType)(void *handle); + +/* Function Interface Definition -------------------------------------------------------*/ +BASE_StatusType HAL_I2C_Init(I2C_Handle *handle); +BASE_StatusType HAL_I2C_Deinit(I2C_Handle *handle); +BASE_StatusType HAL_I2C_RegisterCallback(I2C_Handle *handle, I2C_CallbackId callbackID, I2C_CallbackFunType pcallback); +BASE_StatusType HAL_I2C_MasterReadBlocking(I2C_Handle *handle, + unsigned short devAddr, + unsigned char *rData, + unsigned int dataSize, + unsigned int timeout); +BASE_StatusType HAL_I2C_MasterWriteBlocking(I2C_Handle *handle, + unsigned short devAddr, + unsigned char *wData, + unsigned int dataSize, + unsigned int timeout); +BASE_StatusType HAL_I2C_SlaveReadBlocking(I2C_Handle *handle, + unsigned char *rData, + unsigned int dataSize, + unsigned int timeout); +BASE_StatusType HAL_I2C_SlaveWriteBlocking(I2C_Handle *handle, + unsigned char *wData, + unsigned int dataSize, + unsigned int timeout); + +BASE_StatusType HAL_I2C_MasterReadIT(I2C_Handle *handle, + unsigned short devAddr, + unsigned char *rData, + unsigned int dataSize); +BASE_StatusType HAL_I2C_MasterWriteIT(I2C_Handle *handle, + unsigned short devAddr, + unsigned char *wData, + unsigned int dataSize); +BASE_StatusType HAL_I2C_SlaveReadIT(I2C_Handle *handle, unsigned char *rData, unsigned int dataSize); +BASE_StatusType HAL_I2C_SlaveWriteIT(I2C_Handle *handle, unsigned char *wData, unsigned int dataSize); + +BASE_StatusType HAL_I2C_MasterReadDMA(I2C_Handle *handle, + unsigned short devAddr, + unsigned char *rData, + unsigned int dataSize); +BASE_StatusType HAL_I2C_MasterWriteDMA(I2C_Handle *handle, + unsigned short devAddr, + unsigned char *wData, + unsigned int dataSize); +BASE_StatusType HAL_I2C_SlaveReadDMA(I2C_Handle *handle, unsigned char *rData, unsigned int dataSize); +BASE_StatusType HAL_I2C_SlaveWriteDMA(I2C_Handle *handle, unsigned char *wData, unsigned int dataSize); +void HAL_I2C_IrqHandler(void *handle); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* #ifndef McuMagicTag_I2C_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/i2c/inc/i2c_ex.h b/vendor/others/demo/5-tim_adc/demo/drivers/i2c/inc/i2c_ex.h new file mode 100644 index 000000000..5cc504486 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/i2c/inc/i2c_ex.h @@ -0,0 +1,57 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file i2c_ex.h + * @author MCU Driver Team + * @brief I2C module driver + * @details The header file contains the following declaration: + * + Setting the Special Function Configuration. + */ + +#ifndef McuMagicTag_I2C_EX_H +#define McuMagicTag_I2C_EX_H + +/* Includes ------------------------------------------------------------------*/ +#include "i2c.h" +/* Macro definitions ---------------------------------------------------------*/ +/** + * @addtogroup I2C_IP + * @{ + */ + +/** + * @defgroup I2C_EX_API_Declaration I2C HAL API EX + * @{ + */ +BASE_StatusType HAL_I2C_SetDataTransferSequenceEx(I2C_Handle *handle, I2C_DataTransferSequenceType sequence); +BASE_StatusType HAL_I2C_SetSclStretchModeEx(I2C_Handle *handle, I2C_ClockStretchType clkStretch); +BASE_StatusType HAL_I2C_SetSclLowTimeoutEx(I2C_Handle *handle, unsigned int sclLowTimeout); +BASE_StatusType HAL_I2C_SetBusFreeTimeEx(I2C_Handle *handle, unsigned int busFreeTime); +BASE_StatusType HAL_I2C_Set10BitSlaveEnableEx(I2C_Handle *handle); +BASE_StatusType HAL_I2C_SetDeviceIdAddressEnableEx(I2C_Handle *handle); +BASE_StatusType HAL_I2C_SetStartByteEnableEx(I2C_Handle *handle); +BASE_StatusType HAL_I2C_SetOwnAddressMaskEx(I2C_Handle *handle, unsigned int addrMask); +BASE_StatusType HAL_I2C_SetOwnXmbAddressMaskEx(I2C_Handle *handle, unsigned int addrMask); +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_I2C_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/i2c/inc/i2c_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/i2c/inc/i2c_ip.h new file mode 100644 index 000000000..dcd04953d --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/i2c/inc/i2c_ip.h @@ -0,0 +1,1960 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file i2c_ip.h + * @author MCU Driver Team + * @brief I2C module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the I2C. + * + Extended Configuration Parameter Struct Definition. + * + Register definition structure. + * + Timing command enumeration. + * + Direct configuration layer interface. + * + Basic parameter configuration macro. + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef McuMagicTag_I2C_IP_H +#define McuMagicTag_I2C_IP_H + +/* Includes ------------------------------------------------------------------*/ +#include "baseinc.h" + +/* Macro definitions --------------------------------------------------------- */ +#ifdef I2C_PARAM_CHECK +#define I2C_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define I2C_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define I2C_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define I2C_ASSERT_PARAM(para) ((void)0U) +#define I2C_PARAM_CHECK_NO_RET(para) ((void)0U) +#define I2C_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +/** + * @addtogroup I2C + * @{ + */ + +/** + * @defgroup I2C_IP I2C_IP + * @brief I2C_IP: i2c_v1 + * @{ + */ + +#define I2C_IGNORE_NAK_ENABLE BASE_CFG_ENABLE /**< Ignore acknowledgment configuration enable. */ +#define I2C_IGNORE_NAK_DISABLE BASE_CFG_DISABLE /**< Ignore acknowledgment configuration disable. */ + +#define I2C_STANDARD_FREQ_TH 100000 /**< Standard mode,the frequency band is less than or equal to 100 kHz. */ + +#define I2C_INTR_RAW_ALL_ENABLE 0x00FFFFFFU /**< 1111111111111 */ +#define I2C_INTR_RAW_ALL_DISABLE 0x00000000U /**< 0000000000000 */ + +#define I2C_INTR_EN_ALL_ENABLE 0x00FFFFFFU /**< 1111111111111 */ +#define I2C_INTR_EN_ALL_DISABLE 0x00000000U /**< 0000000000000 */ + +#define I2C_ONCE_TRANS_MAX_NUM 0x400 + +#define I2C_SCL_HIGH_TIME_POS 16 +#define I2C_SCL_HIGHT_TIME_MASK (0xFFFF << I2C_SCL_HIGH_TIME_POS) +#define I2C_SCL_LOW_TIME_POS 0 +#define I2C_SCL_LOW_TIME_MASK (0xFFFF << I2C_SCL_LOW_TIME_POS) + +#define I2C_SDA_HOLD_DURATION_POS 16 +#define I2C_SDA_HOLD_DURATION_MASK (0xFFFF << I2C_SDA_HOLD_DURATION_POS) + +#define I2C_TXFIFO_WDATA_POS 0 +#define I2C_TXFIFO_WDATA_MASK (0xFF << I2C_TXFIFO_WDATA_POS) +#define I2C_TXFIFO_CMD_POS 8 +#define I2C_TXFIFO_CMD_MASK (0xF << I2C_TXFIFO_CMD_POS) + +#define XMBUS_OWN_ADDRESS_MASK 0x3FF + +/** + * @defgroup I2C_Param_Def I2C Parameters Definition. + * @brief Definition of I2C configuration parameters. + * @{ + */ +/* Typedef definitions -------------------------------------------------------*/ +/** + * @brief Address Mode Selection Enumeration Definition + */ +typedef enum { + I2C_7_BITS = 0x00000000U, + I2C_10_BITS = 0x00000001U +} I2C_AddressMode; + +/** + * @brief I2C DMA operation type enumeration definition + */ +typedef enum { + I2C_DMA_OP_NONE = 0x00000000U, + I2C_DMA_OP_READ = 0x00000001U, + I2C_DMA_OP_WRITE = 0x00000002U, + I2C_DMA_OP_WRITE_READ = 0x00000003U +} I2C_DmaOperationType; + +/** + * @brief I2C mode selection enumeration definition + */ +typedef enum { + I2C_MODE_SELECT_NONE = 0x00000000U, + I2C_MODE_SELECT_MASTER_ONLY = 0x00000001U, + I2C_MODE_SELECT_SLAVE_ONLY = 0x00000002U, + I2C_MODE_SELECT_MASTER_SLAVE = 0x00000003U +} I2C_ModeSelectType; + +/** + * @brief Callback Function ID Enumeration Definition + */ +typedef enum { + I2C_MASTER_TX_COMPLETE_CB_ID = 0x00000000U, + I2C_MASTER_RX_COMPLETE_CB_ID = 0x00000001U, + I2C_SLAVE_TX_COMPLETE_CB_ID = 0x00000002U, + I2C_SLAVE_RX_COMPLETE_CB_ID = 0x00000003U, + I2C_ERROR_CB_ID = 0x00000004U, +} I2C_CallbackId; +/** + * @brief I2C operation timing enumeration definition + */ +typedef enum { + I2C_CMD_INT1 = 0x00000000U, + I2C_CMD_S = 0x00000001U, + I2C_CMD_M_TD_RACK_S_RD_TACK = 0x00000002U, + I2C_CMD_M_TD_RNACK_S_RD_TNACK = 0x00000003U, + I2C_CMD_M_TD_S_RD = 0x00000004U, + I2C_CMD_M_RD_TACK_S_TD_RACK = 0x00000005U, + I2C_CMD_M_RD_TNACK_S_TD_RNACK = 0x00000006U, + I2C_CMD_M_RD_S_TD = 0x00000007U, + I2C_CMD_M_TPEC_RACK_S_RPEC_TACK = 0x0000000AU, + I2C_CMD_M_TPEC_RNACK_S_RPEC_TNACK = 0x0000000BU, + I2C_CMD_M_RPEC_TACK_S_TPEC_RACK = 0x0000000DU, + I2C_CMD_M_RPEC_TNACK_S_TPEC_RNACK = 0x0000000EU, + I2C_CMD_P = 0x0000000FU +} I2C_CmdType; + +/** + * @brief I2C data transfer sequence enumeration definition. + */ +typedef enum { + I2C_BIG_BIT_FIRST = 0x00000000U, + I2C_LITTLE_BIT_FIRST = 0x00000001U, +} I2C_DataTransferSequenceType; + +/** + * @brief I2C clock stretching enumeration definition. + */ +typedef enum { + I2C_CLOCK_STRETCH_ENABLE = 0x00000000U, + I2C_CLOCK_STRETCH_DISABLE = 0x00000001U, +} I2C_ClockStretchType; + +/** + * @brief I2C extend handle, configuring some special parameters. + */ +typedef struct { + unsigned int spikeFilterTime; /**< The SDA and SCL Glitch Filtering Configuration. */ + unsigned int sdaDelayTime; /**< The SDA delay sampling configuration. */ + unsigned int slaveOwnXmbAddressEnable; /**< Enable the I2C second own address function. */ + unsigned int slaveOwnXmbAddress; /**< The second own address as slave. */ +} I2C_ExtendHandle; + +/** + * @brief User-defined callback function. + */ +typedef struct { + void (*TxCplCallback)(void* handle); /**< Sending completion callback function. */ + void (*RxCplCallback)(void* handle); /**< Receive completion callback function. */ + void (*ErrorCallback)(void* handle); /**< Error callback function. */ +} I2C_UserCallBack; + +/** + * @} + */ + +/** + * @defgroup I2C_Reg_Def I2C Register Definition + * @brief Description I2C register mapping structure + * @{ + */ + +/** + * @brief I2C mode configuration registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int mst_slv_function : 2; /**< Master and Slave Function Selection. */ + unsigned int lit_end : 1; /**< Data Transfer Sequence. 0:MSbit-First mode, 1:LSbit-First mode. */ + unsigned int xmb_pec_en : 1; /**< PEC calculation enable for SMBus and PMBus, + 0:disable, 1:enable. */ + unsigned int rack_mode : 1; /**< ACK/NACK receiving mode, 0:ack mode, 1:ignore ack. */ + unsigned int scl_stretch_disable : 1; /**< Clock stretching enable. 0:enable, 1:disable. */ + unsigned int reserved0 : 26; + } BIT; +} volatile I2C_MODE_REG; + +/** + * @brief I2C SCL high-level and low-level duration registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int scl_low_time : 16; /**< SCL Low Level Duration. */ + unsigned int scl_high_time : 16; /**< SCL High Level Duration. */ + } BIT; +} volatile I2C_SCL_CFG_REG; + +/** + * @brief I2C SDA timing configuration registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int sda_delay_time : 4; /**< SDA delay sampling configuration. */ + unsigned int reserved0 : 12; + unsigned int sda_hold_time : 16; /**< SDA hold time configuration. */ + } BIT; +} volatile I2C_SDA_CFG_REG; + +/** + * @brief I2C Slave Address Configuration registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int own_address : 10; /**< Own address as slave. */ + unsigned int reserved0 : 2; + unsigned int own_address_mask : 10; /**< Slave's own address mask. */ + unsigned int reserved1 : 2; + unsigned int i2c_general_call_en : 1; /**< Enable General Call Address Receiving, 0:disable, 1:enable. */ + unsigned int i2c_device_id_en : 1; /**< Enable the function of receiving device ID addresses, + 0:disable, 1:enable. */ + unsigned int i2c_start_byte_en : 1; /**< Enable START Byte Address Receiving, 0:disable, 1:enable. */ + unsigned int i2c_10bit_slave_en : 1; /**< Enable 10bit Slave Addressing Receiving, 0:disable, 1:enable. */ + unsigned int reserved2 : 4; + } BIT; +} volatile I2C_OWN_ADDR_REG; + +/** + * @brief I2C SMBus PMBus Device Dedicated Address Configuration registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int xmb_address : 10; /**< I2C SMBus PMBus Device Dedicated Address. */ + unsigned int reserved0 : 2; + unsigned int xmb_address_mask : 10; /**< I2C SMBus PMBus Device Private Address Mask. */ + unsigned int xmb_address_en : 1; /**< I2C SMBus PMBus Device Dedicated Address Enable, + 0:disable, 1:enable. */ + unsigned int reserved1 : 1; + unsigned int smb_host_notify_en : 1; /**< Enable receiving SMBus Host Address, 0:disable, 1:enable. */ + unsigned int smb_alert_response_en : 1; /**< Enable receiving SMBus Alert Response Address, + 0:disable, 1:enable. */ + unsigned int smb_dev_default_en : 1; /**< Enable receiving SMBus Device Default Address, + 0:disable, 1:enable. */ + unsigned int reserved2 : 1; + unsigned int pmb_zone_read_en : 1; /**< Enable RX PMBus Zone Read Address, 0:disable, 1:enable. */ + unsigned int pmb_zone_write_en : 1; /**< Enable PMBus Zone Write Address Receiving, + 0:disable, 1:enable. */ + unsigned int reserved3 : 2; + } BIT; +} volatile XMB_DEV_ADDR_REG; + +/** + * @brief Address received by the I2C slave, R/W bit registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rx_rw : 1; /**< The address received by the slave. */ + unsigned int rx_addr : 10; /**< R/W bit received by the slave. */ + unsigned int reserved0 : 21; + } BIT; +} volatile I2C_RX_ADDR_REG; + +/** + * @brief I2C TX FIFO registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int tx_fifo_wdata : 8; /**< The software writes the data to be sent, write only. */ + unsigned int mst_slv_cmd : 4; /**< Master Timing Command. */ + unsigned int reserved0 : 20; + } BIT; +} volatile I2C_TX_FIFO_REG; + +/** + * @brief I2C RX FIFO registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rx_fifo_rdata : 8; /**< The software writes the data to be receive, read only. */ + unsigned int reserved0 : 24; + } BIT; +} volatile I2C_RX_FIFO_REG; + +/** + * @brief I2C TX threshold registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int tx_watermark : 4; /**< TX FIFO Threshold. */ + unsigned int reserved0 : 28; + } BIT; +} volatile I2C_TX_WATERMARK_REG; + +/** + * @brief I2C RX threshold registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rx_watermark : 4; /**< RX FIFO Threshold. */ + unsigned int reserved0 : 28; + } BIT; +} volatile I2C_RX_WATERMARK_REG; + +/** + * @brief I2C control 1 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int mst_start : 1; /**< Master startup control, 0:disable, 1:enable. */ + unsigned int reserved0 : 1; + unsigned int rst_rx_fifo : 1; /**< Resetting the RX FIFO, 0:clearing completed, 1:clearing in progress. */ + unsigned int rst_tx_fifo : 1; /**< Resetting the TX FIFO, 0:clearing completed, 1:clearing in progress. */ + unsigned int reserved1 : 4; + unsigned int dma_operation : 2; /**< DMA operation control. */ + unsigned int dma_rx_lsreq_en : 1; /**< Flow control enable for the RX peripheral of the DMA I2C module, + 0:disable, 1:enable. */ + unsigned int reserved2 : 21; + } BIT; +} volatile I2C_CTRL1_REG; + +/** + * @brief I2C control 2 registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int force_sda : 1; /**< Forcibly sets the value of an I2C pin, 0:set 0, 1:set 1. */ + unsigned int reserved0 : 3; + unsigned int force_scl : 1; /**< Forcibly sets the value of an I2C pin, 0:set 0, 1:set 1. */ + unsigned int reserved1 : 3; + unsigned int gpio_mode : 1; /**< The I2C pin is used as a GPIO pin. */ + unsigned int reserved2 : 3; + unsigned int smb_alert_n_oe_n : 1; /**< SMBus SMBALERT# Output Value, + 0:Low-level Open-Drain output, + 1:Open-Drain output high impedance. */ + unsigned int smb_alert_n_in : 1; /**< SMBus SMBALERT# Input value, + 0:Low level input, 1:High level input . */ + unsigned int reserved3 : 2; + unsigned int smb_suspend_n_oe_n : 1; /**< SMBus SMBSUS# is output, 0:push-pull output, + 1:no output, high impedance. */ + unsigned int smb_suspend_n_out : 1; /**< SMBus SMBSUS# Output Value, + 0:low level output, 1:high level output. */ + unsigned int smb_suspend_n_in : 1; /**< SMBus SMBSUS# Input Value, + 0:low level output, 1:high level output. */ + unsigned int reserved4 : 13; + } BIT; +} volatile I2C_CTRL2_REG; + +/** + * @brief I2C FIFO status registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rx_fifo_vld_num : 5; /**< Number of valid values in the RX FIFO. */ + unsigned int reserved0 : 3; + unsigned int tx_fifo_vld_num : 5; /**< Number of valid values in the TX FIFO. */ + unsigned int reserved1 : 3; + unsigned int reserved2 : 16; + } BIT; +} volatile I2C_FIFO_STAT_REG; + +/** + * @brief I2C state machine status registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 10; + unsigned int mst_cmd_exe : 4; /**< Sequence command being executed by the master. */ + unsigned int mst_busy : 1; /**< Master Busy, 0:master idle, 1:master busy. */ + unsigned int reserved1 : 6; + unsigned int slv_cmd_exe : 4; /**< Sequence command being executed by the slave node. */ + unsigned int slv_busy : 1; /**< Slave Busy, 0:slave idle, 1:slave busy. */ + unsigned int reserved3 : 4; + unsigned int i2c_bus_free : 1; /**< I2C bus idele, 0:i2c bus busy, 1:i2c bus idle. */ + unsigned int reserved2 : 1; + } BIT; +} volatile I2C_FSM_STAT_REG; + +/** + * @brief I2C raw interrupt registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int mst_rx_ack_unmatch_raw : 1; /**< The RX acknowledgment bit meets the expectation, + 0:match, 1:unmatch. */ + unsigned int rx_fifo_not_empty_raw : 1; /**< The RX FIFO is not empty, 0:no interrupt, 1:have interrupt. */ + unsigned int rx_ge_watermark_raw : 1; /**< The number of data records in the RX FIFO is greater than or + equal to the threshold, 0:no interrupt, 1:have interrupt. */ + unsigned int rx_fifo_full_raw : 1; /**< RX FIFO Full, 0:no interrupt, 1:have interrupt. */ + unsigned int tx_le_watermark_raw : 1; /**< The number of data records in the TX FIFO is less than or + equal to the threshold, 0:no interrupt, 1:have interrupt. */ + unsigned int tx_fifo_empty_raw : 1; /**< The TX FIFO is empty, 0:no interrupt, 1:have interrupt. */ + unsigned int tx_fifo_not_full_raw : 1; /**< The TX FIFO is not full, 0:no interrupt, 1:have interrupt. */ + unsigned int rx_data_ready_raw : 1; /**< The RX FIFO receives new data, + 0:no interrupt, 1:have interrupt. */ + unsigned int tx_data_request_raw : 1; /**< The TX FIFO requests new commands and data, + 0:no interrupt, 1:have interrupt. */ + unsigned int stop_det_raw : 1; /**< STOP detected, 0:no interrupt, 1:have interrupt. */ + unsigned int start_det_raw : 1; /**< Checked to START, 0:no interrupt, 1:have interrupt. */ + unsigned int arb_lost_raw : 1; /**< Arbitration loss, 0:no interrupt, 1:have interrupt. */ + unsigned int mst_cmd_done_raw : 1; /**< The master timing command is completed normally, + 0:no interrupt, 1:have interrupt. */ + unsigned int scl_low_timeout_raw : 1; /**< SCL Low Timeout Detected, 0:no interrupt, 1:have interrupt. */ + unsigned int smb_alert_raw : 1; /**< Falling edge of SMBus SMBALERT# input signal detected, + 0:no interrupt, 1:have interrupt. */ + unsigned int smb_suspend_raw : 1; /**< Falling edge of SMBus SMBALERT# input signal detected, + 0:no interrupt, 1:have interrupt. */ + unsigned int mst_cmd_int1_raw : 1; /**< Master timing command interrupt 1, + 0:no interrupt, 1:have interrupt. */ + unsigned int slv_cmd_int1_raw : 1; /**< Slave timing command interrupt 1, + 0:no interrupt, 1:have interrupt. */ + unsigned int mst_pec_check_fail_raw : 1; /**< The master checks the received PEC error, + 0:no interrupt, 1:have interrupt. */ + unsigned int slv_pec_check_fail_raw : 1; /**< The slave node checks the received PEC error, + 0:no interrupt, 1:have interrupt. */ + unsigned int slv_rx_ack_unmatch_raw : 1; /**< Check whether the Slave RX acknowledgment bit meets the + expectation of the timing command, + 0:no interrupt, 1:have interrupt. */ + unsigned int slv_addr_match_raw : 1; /**< The slave detects the received address matches, + 0:no interrupt, 1:have interrupt. */ + unsigned int reserved0 : 10; + } BIT; +} volatile I2C_INTR_RAW_REG; + +/** + * @brief I2C interrupt enable registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int mst_rx_ack_unmatch_en : 1; /**< The RX acknowledgment bit meets the expectation, + 0:disable, 1:enable. */ + unsigned int rx_fifo_not_empty_en : 1; /**< The RX FIFO is not empty, 0:disable, 1:enable. */ + unsigned int rx_ge_watermark_en : 1; /**< The rx_ge_watermark enable, 0:disable, 1:enable. */ + unsigned int rx_fifo_full_en : 1; /**< RX FIFO Full enable, 0:disable, 1:enable. */ + unsigned int tx_le_watermark_en : 1; /**< The tx_le_watermark, 0:disable, 1:enable. */ + unsigned int tx_fifo_empty_en : 1; /**< The TX FIFO is empty, 0:disable, 1:enable. */ + unsigned int tx_fifo_not_full_en : 1; /**< The TX FIFO is not full, 0:disable, 1:enable. */ + unsigned int rx_data_ready_en : 1; /**< The RX FIFO receives new data, 0:disable, 1:enable. */ + unsigned int tx_data_request_en : 1; /**< The TX FIFO requests new commands and data, + 0:disable, 1:enable. */ + unsigned int stop_det_en : 1; /**< STOP detected enable, 0:disable, 1:enable. */ + unsigned int start_det_en : 1; /**< Checked to START enable, 0:disable, 1:enable. */ + unsigned int arb_lost_en : 1; /**< Arbitration loss enable, 0:disable, 1:enable. */ + unsigned int mst_cmd_done_en : 1; /**< The master timing command is completed normally, + 0:disable, 1:enable. */ + unsigned int scl_low_timeout_en : 1; /**< SCL Low Timeout Detected enable, 0:disable, 1:enable. */ + unsigned int smb_alert_en : 1; /**< Falling edge of SMBus SMBALERT# input signal detected, + 0:disable, 1:enable. */ + unsigned int smb_suspend_en : 1; /**< Falling edge of SMBus SMBALERT# input signal detected, + 0:disable, 1:enable. */ + unsigned int mst_cmd_int1_en : 1; /**< Master timing command interrupt 1 enable, 0:disable, 1:enable. */ + unsigned int slv_cmd_int1_en : 1; /**< Slave timing command interrupt 1 enable, 0:disable, 1:enable. */ + unsigned int mst_pec_check_fail_en : 1; /**< The master checks the received PEC error, 0:disable, 1:enable. */ + unsigned int slv_pec_check_fail_en : 1; /**< The slave node checks the received PEC error, + 0:disable, 1:enable. */ + unsigned int slv_rx_ack_unmatch_en : 1; /**< Check whether the Slave RX acknowledgment bit meets the + expectation of the timing command, 0:disable, 1:enable. */ + unsigned int slv_addr_match_en : 1; /**< The slave detects the received address matches, + 0:disable, 1:enable. */ + unsigned int reserved0 : 10; + } BIT; +} volatile I2C_INTR_EN_REG; + +/** + * @brief I2C interrupt status registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int mst_rx_ack_unmatch_int : 1; /**< The RX acknowledgment bit meets the expectation, + 0:match, 1:unmatch. */ + unsigned int rx_fifo_not_empty_int : 1; /**< The RX FIFO is not empty, 0:no interrupt, 1:have interrupt. */ + unsigned int rx_ge_watermark_int : 1; /**< The number of data records in the RX FIFO is greater than or + equal to the threshold, 0:no interrupt, 1:have interrupt. */ + unsigned int rx_fifo_full_int : 1; /**< RX FIFO Full, 0:no interrupt, 1:have interrupt. */ + unsigned int tx_le_watermark_int : 1; /**< The number of data records in the TX FIFO is less than or + equal to the threshold, 0:no interrupt, 1:have interrupt. */ + unsigned int tx_fifo_empty_int : 1; /**< The TX FIFO is empty, 0:no interrupt, 1:have interrupt. */ + unsigned int tx_fifo_not_full_int : 1; /**< The TX FIFO is not full, 0:no interrupt, 1:have interrupt. */ + unsigned int rx_data_ready_int : 1; /**< The RX FIFO receives new data, + 0:no interrupt, 1:have interrupt. */ + unsigned int tx_data_request_int : 1; /**< The TX FIFO requests new commands and data, + 0:no interrupt, 1:have interrupt. */ + unsigned int stop_det_int : 1; /**< STOP detected, 0:no interrupt, 1:have interrupt. */ + unsigned int start_det_int : 1; /**< Checked to START, 0:no interrupt, 1:have interrupt. */ + unsigned int arb_lost_int : 1; /**< Arbitration loss, 0:no interrupt, 1:have interrupt. */ + unsigned int mst_cmd_done_int : 1; /**< The master timing command is completed normally, + 0:no interrupt, 1:have interrupt. */ + unsigned int scl_low_timeout_int : 1; /**< SCL Low Timeout Detected, 0:no interrupt, 1:have interrupt. */ + unsigned int smb_alert_int : 1; /**< Falling edge of SMBus SMBALERT# input signal detected, + 0:no interrupt, 1:have interrupt. */ + unsigned int smb_suspend_int : 1; /**< Falling edge of SMBus SMBALERT# input signal detected, + 0:no interrupt, 1:have interrupt. */ + unsigned int mst_cmd_int1 : 1; /**< Master timing command interrupt 1, + 0:no interrupt, 1:have interrupt. */ + unsigned int slv_cmd_int1 : 1; /**< Slave timing command interrupt 1, + 0:no interrupt, 1:have interrupt. */ + unsigned int mst_pec_check_fail_int : 1; /**< The master checks the received PEC error, + 0:no interrupt, 1:have interrupt. */ + unsigned int slv_pec_check_fail_int : 1; /**< The slave node checks the received PEC error, + 0:no interrupt, 1:have interrupt. */ + unsigned int slv_rx_ack_unmatch_int : 1; /**< Check whether the Slave RX acknowledgment bit meets the + expectation of the timing command, + 0:no interrupt, 1:have interrupt. */ + unsigned int slv_addr_match_int : 1; /**< The slave detects the received address matches, + 0:no interrupt, 1:have interrupt. */ + unsigned int reserved0 : 10; + } BIT; +} volatile I2C_INTR_STAT_REG; + +/** + * @brief I2C version number registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int version : 32; /**< I2C controller version. */ + } BIT; +} volatile I2C_VERSION_REG; + +/** + * @brief I2C SCL timeout threshold registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int scl_low_timeout : 23; /**< SCL low-level timeout configuration. */ + unsigned int reserved0 : 9; + } BIT; +} volatile I2C_SCL_TIMEOUT_REG; + +/** + * @brief I2C bus idle threshold registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int bus_free_time : 16; /**< Bus Idle Threshold. */ + unsigned int reserved0 : 16; + } BIT; +} volatile I2C_BUS_FREE_REG; + +/** + * @brief I2C SDA and SCL filtering configuration registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int spike_filter_time : 4; /**< SDA and SCL Glitch Filtering Configuration. */ + unsigned int reserved0 : 28; + } BIT; +} volatile I2C_FILTER_REG; + +/** + * @brief Define the I2C register structure + */ +typedef struct { + I2C_MODE_REG I2C_MODE; /**< I2C mode configuration register, Offset address: 0x0000U. */ + I2C_SCL_CFG_REG I2C_SCL_CFG; /**< I2C SCL high/low level time register, Offset address: 0x0004U. */ + I2C_SDA_CFG_REG I2C_SDA_CFG; /**< I2C SDA timing configuration register, Offset address: 0x0008U. */ + I2C_OWN_ADDR_REG I2C_OWN_ADDR; /**< I2C slave address configuration register, + Offset address: 0x000CU. */ + XMB_DEV_ADDR_REG XMB_DEV_ADDR; /**< I2C SMBus PMBus Device Dedicated Address Configuration register, + Offset address: 0x0010U. */ + unsigned char space0[4]; + I2C_RX_ADDR_REG I2C_RX_ADDR; /**< Address received by the I2C slave, R/W bit register, + Offset address: 0x0018U. */ + unsigned char space1[4]; + I2C_TX_FIFO_REG I2C_TX_FIFO; /**< I2C TX FIFO register, Offset address: 0x0020U. */ + I2C_RX_FIFO_REG I2C_RX_FIFO; /**< I2C_RX_FIFO register, Offset address: 0x0024U. */ + unsigned char space2[160]; + I2C_TX_WATERMARK_REG I2C_TX_WATERMARK; /**< I2C TX threshold register, Offset address: 0x00C8U. */ + I2C_RX_WATERMARK_REG I2C_RX_WATERMARK; /**< I2C RX threshold register, Offset address: 0x00CCU. */ + I2C_CTRL1_REG I2C_CTRL1; /**< I2C control register 1, Offset address: 0x00D0U. */ + I2C_CTRL2_REG I2C_CTRL2; /**< I2C control register 2, Offset address: 0x00D4U. */ + I2C_FIFO_STAT_REG I2C_FIFO_STAT; /**< I2C FIFO status register, Offset address: 0x00D8U. */ + I2C_FSM_STAT_REG I2C_FSM_STAT; /**< I2C state machine status register, Offset address: 0x00DCU. */ + I2C_INTR_RAW_REG I2C_INTR_RAW; /**< I2C raw interrupt register, Offset address: 0x00E0U. */ + I2C_INTR_EN_REG I2C_INTR_EN; /**< I2C interrupt enable register, Offset address: 0x00E4U. */ + I2C_INTR_STAT_REG I2C_INTR_STAT; /**< I2C interrupt status register, Offset address: 0x00E8U. */ + unsigned char space3[20]; + I2C_VERSION_REG I2C_VERSION; /**< I2C version number register, Offset address: 0x0100U. */ + I2C_SCL_TIMEOUT_REG I2C_SCL_TIMEOUT; /**< I2C SCL timeout threshold register, Offset address: 0x0104U. */ + I2C_BUS_FREE_REG I2C_BUS_FREE; /**< I2C bus idle threshold register, Offset address: 0x0108U. */ + I2C_FILTER_REG I2C_FILTER; /**< I2C SDA and SCL filtering configuration register, + Offset address: 0x010CU. */ +} volatile I2C_RegStruct; +/** + * @} + */ + +/* Parameter check definition-------------------------------------------*/ +/** + * @brief Check I2C function mode selection. + * @param functionMode I2C function mode type. + * @retval true + * @retval false + */ +static inline bool IsI2cFunctionMode(I2C_ModeSelectType functionMode) +{ + return (functionMode == I2C_MODE_SELECT_NONE || + functionMode == I2C_MODE_SELECT_MASTER_ONLY || + functionMode == I2C_MODE_SELECT_SLAVE_ONLY || + functionMode == I2C_MODE_SELECT_MASTER_SLAVE); +} + +/** + * @brief Check address mode selection. + * @param addrMode I2C instance + * @retval true + * @retval false + */ +static inline bool IsI2cAddressMode(I2C_AddressMode addrMode) +{ + return (addrMode == I2C_7_BITS || + addrMode == I2C_10_BITS); +} + +/** + * @brief Check i2c sda hold time. + * @param sdaHoldTime I2C instance + * @retval true + * @retval false + */ +static inline bool IsI2cSdaHoldTime(unsigned int sdaHoldTime) +{ + return (sdaHoldTime <= 0xFFFF); /* SdaHoldTime value is 0 to 0xFFFF */ +} + +/** + * @brief Check I2C general call mode. + * @param generalCallMode I2C general call mode. + * @retval true + * @retval false + */ +static inline bool IsI2cGeneralCallMode(unsigned int generalCallMode) +{ + return (generalCallMode == BASE_CFG_ENABLE || + generalCallMode == BASE_CFG_DISABLE); +} + +/** + * @brief Check I2C lit end mode. + * @param litEnd I2C lit end mode. + * @retval true + * @retval false + */ +static inline bool IsI2cLitEndMode(unsigned int litEnd) +{ + return (litEnd == BASE_CFG_ENABLE || + litEnd == BASE_CFG_DISABLE); +} + +/** + * @brief Check I2C scl stretch Disable mode. + * @param sclStretchDisable I2C scl stretch Disable mode. + * @retval true + * @retval false + */ +static inline bool IsI2cSclStretchDisableMode(unsigned int sclStretchDisable) +{ + return (sclStretchDisable == BASE_CFG_ENABLE || + sclStretchDisable == BASE_CFG_DISABLE); +} + +/** + * @brief Check i2c own address. + * @param ownAddress I2C own address. + * @retval true + * @retval false + */ +static inline bool IsI2cOwnAddressOrMask(unsigned int ownAddress) +{ + return (ownAddress <= XMBUS_OWN_ADDRESS_MASK); /* Own address value is 0 to 0x3FF */ +} + +/** + * @brief Check XMBus address. + * @param xmbusAddress XMBus address. + * @retval true + * @retval false + */ +static inline bool IsXMBusAddressOrMask(unsigned int xmbusAddress) +{ + return (xmbusAddress <= XMBUS_OWN_ADDRESS_MASK); /* XMBus address value is 0 to 0x3FF */ +} + +/** + * @brief Check XMBus address Enable. + * @param xmbusAddress XMBus address. + * @retval true + * @retval false + */ +static inline bool IsXMBusAddressEnable(unsigned int slaveOwnXmbAddressEnable) +{ + return (slaveOwnXmbAddressEnable == BASE_CFG_ENABLE || slaveOwnXmbAddressEnable == BASE_CFG_DISABLE); +} + +/** + * @brief Check i2c SDA and SCL Glitch Filtering Time Configuration. + * @param spikeFilterTime I2C SDA and SCL Glitch Filtering Time. + * @retval true + * @retval false + */ +static inline bool IsI2cSpikeFilterTime(unsigned int spikeFilterTime) +{ + return (spikeFilterTime <= 0xF); /* The spikeFilterTime value is 0 to 0xF */ +} + + +/** + * @brief Check i2c freq. + * @param freq I2C freq + * @retval true + * @retval false + */ +static inline bool IsI2cFreq(unsigned int freq) +{ + return (freq > 0); +} + +/** + * @brief Check i2c ignore ack flag. + * @param ignoreAckFlag I2C ignore ack flag. + * @retval true + * @retval false + */ +static inline bool IsI2cIgnoreAckFlag(unsigned int ignoreAckFlag) +{ + return (ignoreAckFlag == I2C_IGNORE_NAK_ENABLE || + ignoreAckFlag == I2C_IGNORE_NAK_DISABLE); +} + +/** + * @brief Check i2c tx water mark. + * @param txWaterMark I2C tx water mark. + * @retval true + * @retval false + */ +static inline bool IsI2cTxWaterMark(unsigned int txWaterMark) +{ + return (txWaterMark <= 0xF); /* The txWaterMark value is 0 to 0xF */ +} + +/** + * @brief Check i2c rx water mark. + * @param rxWaterMark I2C rx water mark. + * @retval true + * @retval false + */ +static inline bool IsI2cRxWaterMark(unsigned int rxWaterMark) +{ + return (rxWaterMark <= 0xF); /* The rxWaterMark value is 0 to 0xF */ +} + +/** + * @brief Check i2c DMA Operation type. + * @param mode I2C DMA Operation type. + * @retval true + * @retval false + */ +static inline bool IsI2CDmaOperationType(I2C_DmaOperationType mode) +{ + return (mode == I2C_DMA_OP_NONE || + mode == I2C_DMA_OP_WRITE || + mode == I2C_DMA_OP_READ || + mode == I2C_DMA_OP_WRITE_READ); +} + +/** + * @brief Check i2c set one bit value. + * @param value value is set. + * @retval true + * @retval false + */ +static inline bool IsI2cSetOneBitValue(unsigned int value) +{ + return (value == BASE_CFG_UNSET || value == BASE_CFG_SET); +} + +/** + * @brief Check i2c scl timeout value. + * @param time the value of scl time out. + * @retval true + * @retval false + */ +static inline bool IsI2cSclTimoutValue(unsigned int time) +{ + return (time <= 0x7FFFFF); /* The i2c scl timeout max value is 0x7FFFFF. */ +} + +/** + * @brief Check i2c bus free time value. + * @param time the value of bus free time. + * @retval true + * @retval false + */ +static inline bool IsI2cBusFreeTimeValue(unsigned int time) +{ + return (time <= 0xFFFF); /* The i2c bus free time max value is 0xFFFF. */ +} + +/** + * @brief Check i2c data transfer sequence value. + * @param arg data transfer sequence value. + * @retval true + * @retval false + */ +static inline bool IsI2cDataTransferSequence(I2C_DataTransferSequenceType arg) +{ + return (arg == I2C_BIG_BIT_FIRST || arg == I2C_LITTLE_BIT_FIRST); +} + +/** + * @brief Check i2c clock stretching enumeration value. + * @param arg clock stretching enumeration value. + * @retval true + * @retval false + */ +static inline bool IsI2cClockStretchValue(I2C_ClockStretchType arg) +{ + return (arg == I2C_CLOCK_STRETCH_ENABLE || arg == I2C_CLOCK_STRETCH_DISABLE); +} + +/** + * @brief Check i2c SCL low-level timeout value. + * @param sclLowTimeout SCL low-level timeout value. + * @retval true + * @retval false + */ +static inline bool IsI2cSclLowTimeout(unsigned int sclLowTimeout) +{ + return (sclLowTimeout <= 0x7FFFFF); /* The SCL low-level timeout upper limit is 0x7FFFFF. */ +} + +/** + * @brief Check i2c SDA delay time. + * @param sdaDelayTime The value of SDA delay time. + * @retval true + * @retval false + */ +static inline bool IsI2cSdaDelayTime(unsigned int sdaDelayTime) +{ + return (sdaDelayTime <= 0x0F); /* The SDA delay time upper limit is 0x0F. */ +} + +/** + * @brief Check i2c bus idle threshold value. + * @param busFreeTime bus idle threshold value. + * @retval true + * @retval false + */ +static inline bool IsI2cBusFreeTime(unsigned int busFreeTime) +{ + return (busFreeTime <= 0xFFFF); /* The SCL bus idle threshold is 0xFFFF. */ +} + +/** + * @brief DCL I2C mode function set. + * @param i2cx I2C register base address. + * @param function I2C mode function + * @retval None. + */ +static inline void DCL_I2C_SetFunction(I2C_RegStruct *i2cx, unsigned int function) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_ASSERT_PARAM(IsI2cFunctionMode(function)); + i2cx->I2C_MODE.BIT.mst_slv_function = function; +} + +/** + * @brief DCL I2C mode function get. + * @param i2cx I2C register base address. + * @retval I2C mode function. + */ +static inline unsigned int DCL_I2C_GetFunction(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_MODE.BIT.mst_slv_function; +} + +/** + * @brief DCL I2C endian set. + * @param i2cx I2C register base address. + * @param endian data transfer sequence enumeration value. + * @retval None. + */ +static inline void DCL_I2C_SetEndian(I2C_RegStruct *i2cx, I2C_DataTransferSequenceType endian) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_PARAM_CHECK_NO_RET(IsI2cDataTransferSequence(endian)); + i2cx->I2C_MODE.BIT.lit_end = endian; +} + +/** + * @brief DCL I2C endian get. + * @param i2cx I2C register base address. + * @retval I2C endian. + */ +static inline unsigned int DCL_I2C_GetEndian(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_MODE.BIT.lit_end; +} + +/** + * @brief DCL I2C enable PEC. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_PECEnable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_MODE.BIT.xmb_pec_en = BASE_CFG_ENABLE; +} + +/** + * @brief DCL I2C disable PEC. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_PECDisable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_MODE.BIT.xmb_pec_en = BASE_CFG_DISABLE; +} + +/** + * @brief DCL I2C PEC status get. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline unsigned int DCL_I2C_GetPECStatus(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_MODE.BIT.xmb_pec_en; +} + +/** + * @brief DCL I2C enable ignore rack mode. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_IgnoreRackModeEnable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_MODE.BIT.rack_mode = I2C_IGNORE_NAK_ENABLE; +} + +/** + * @brief DCL I2C disable ignore rack mode. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_IgnoreRackModeDisable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_MODE.BIT.rack_mode = I2C_IGNORE_NAK_DISABLE; +} + +/** + * @brief DCL I2C enable scl stretch function. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_SclStrechEnable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_MODE.BIT.scl_stretch_disable = BASE_CFG_DISABLE; +} + +/** + * @brief DCL I2C disable scl stretch function. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_SclStrechDisable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_MODE.BIT.scl_stretch_disable = BASE_CFG_ENABLE; +} + +/** + * @brief DCL Configuring i2c SDA Hold Time. + * @param i2cx I2C register base address. + * @param sdaHoldTime Sda hold time. + * @retval None. + */ +static inline void DCL_I2C_SetSdaHoldDuration(I2C_RegStruct *i2cx, unsigned short sdaHoldTime) +{ + unsigned int glbReg; + unsigned int temp; + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + /* Read the entire register and write it back. */ + temp = ((unsigned int)sdaHoldTime) << I2C_SDA_HOLD_DURATION_POS; + glbReg = (i2cx->I2C_SDA_CFG.reg & 0xF) | temp; + i2cx->I2C_SDA_CFG.reg = glbReg; +} + +/** + * @brief Get DCL Configuring i2c SDA Hold Time. + * @param i2cx I2C register base address. + * @retval Sda hold time, 0-65535. + */ +static inline int DCL_I2C_GetSdaHoldDuration(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return ((i2cx->I2C_SDA_CFG.reg >> I2C_SDA_HOLD_DURATION_POS) & 0xFFFF); /* The mask of sda hold time is 0xFFFF. */ +} + +/** + * @brief DCL Configuring i2c SDA delay Time. + * @param i2cx I2C register base address. + * @param delay Sda delay time. + * @retval None. + */ +static inline void DCL_I2C_SetSdaDelayTime(I2C_RegStruct *i2cx, unsigned delay) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_PARAM_CHECK_NO_RET(IsI2cSdaDelayTime(delay)); + i2cx->I2C_SDA_CFG.BIT.sda_delay_time = delay; +} + +/** + * @brief DCL Get i2c SDA delay Time. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline unsigned int DCL_I2C_GetSdaDelayTime(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_SDA_CFG.BIT.sda_delay_time; +} + +/** + * @brief DCL Configuring i2c SCL High Hold Time. + * @param i2cx I2C register base address. + * @param sclHighTime Scl high hold time. + * @retval None. + */ +static inline void DCL_I2C_SetHighDuration(I2C_RegStruct *i2cx, unsigned short sclHighTime) +{ + unsigned int tempReg; + unsigned int temp; + + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + tempReg = i2cx->I2C_SCL_CFG.reg; + /* Read the entire register and write it back. */ + temp = ((unsigned int)sclHighTime) << I2C_SCL_HIGH_TIME_POS; + tempReg = (i2cx->I2C_SCL_CFG.reg & I2C_SCL_LOW_TIME_MASK) | temp; + i2cx->I2C_SCL_CFG.reg = tempReg; +} + +/** + * @brief DCL get i2c SCL High Hold Time. + * @param i2cx I2C register base address. + * @retval Scl high hold time,0-65535. + */ +static inline int DCL_I2C_GetHighDuration(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return ((i2cx->I2C_SCL_CFG.reg >> I2C_SCL_HIGH_TIME_POS) & 0xFFFF); /* The mask of scl high hold time is 0xFFFF. */ +} + +/** + * @brief DCL Configuring i2c SCL low Hold Time. + * @param i2cx I2C register base address. + * @param sclLowTime The value of I2C SCL low time. + * @retval None. + */ +static inline void DCL_I2C_SetLowDuration(I2C_RegStruct *i2cx, unsigned short sclLowTime) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_SCL_CFG.BIT.scl_low_time = sclLowTime; +} + +/** + * @brief DCL Get i2c SCL low Hold Time. + * @param i2cx I2C register base address. + * @retval Scl low hold time,0-65535. + */ +static inline int DCL_I2C_GetLowDuration(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_SCL_CFG.BIT.scl_low_time; +} + +/** + * @brief DCL Set I2C owner Address. + * @param i2cx I2C register base address. + * @param ownAddr Slave address + * @retval None. + */ +static inline void DCL_I2C_SetOwnAddr(I2C_RegStruct *i2cx, unsigned int ownAddr) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_ASSERT_PARAM(IsI2cOwnAddressOrMask(ownAddr)); + i2cx->I2C_OWN_ADDR.BIT.own_address = ownAddr; +} + +/** + * @brief DCL Get I2C owner Address. + * @param i2cx I2C register base address. + * @retval I2C owner address. + */ +static inline unsigned int DCL_I2C_GetOwnAddr(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_OWN_ADDR.BIT.own_address; +} + +/** + * @brief DCL Set I2C owner address mask. + * @param i2cx I2C register base address. + * @param ownAddrMask The maske of I2C slave address. + * @retval None. + */ +static inline void DCL_I2C_SetOwnMaskAddr(I2C_RegStruct *i2cx, unsigned int ownAddrMask) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_ASSERT_PARAM(IsI2cOwnAddressOrMask(ownAddrMask)); + i2cx->I2C_OWN_ADDR.BIT.own_address_mask = ownAddrMask; +} + +/** + * @brief DCL Set I2C owner address mask. + * @param i2cx I2C register base address. + * @retval I2C owner address mask. + */ +static inline unsigned int DCL_I2C_GetOwnMaskAddr(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_OWN_ADDR.BIT.own_address_mask; +} + +/** + * @brief DCL Set I2C 10bit slave enable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_10BitSlaveEnable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_OWN_ADDR.BIT.i2c_10bit_slave_en = BASE_CFG_ENABLE; +} + +/** + * @brief DCL Set I2C 10bit slave disable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_10BitSlaveDisable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_OWN_ADDR.BIT.i2c_10bit_slave_en = BASE_CFG_DISABLE; +} + +/** + * @brief DCL Set XMBus Address. + * @param i2cx I2C register base address. + * @param xmbusAddr The address is used for I2C, SMBus and PMBus Device. + * @retval None. + */ +static inline void DCL_I2C_SetXMBusAddr(I2C_RegStruct *i2cx, unsigned int xmbusAddr) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_ASSERT_PARAM(IsXMBusAddressOrMask(xmbusAddr)); + i2cx->XMB_DEV_ADDR.BIT.xmb_address = xmbusAddr; +} + +/** + * @brief DCL Get XMBus Address. + * @param i2cx I2C register base address. + * @retval The address of I2C, SMBus and PMBus Device. + */ +static inline unsigned int DCL_I2C_GetXMBusAddr(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->XMB_DEV_ADDR.BIT.xmb_address; +} + +/** + * @brief DCL Set xmbus address mask. + * @param i2cx I2C register base address. + * @param xmbusAddrMask The maske of xmbus device address. + * @retval None. + */ +static inline void DCL_I2C_SetXMBusMaskAddr(I2C_RegStruct *i2cx, unsigned int xmbusAddrMask) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_ASSERT_PARAM(IsXMBusAddressOrMask(xmbusAddrMask)); + i2cx->XMB_DEV_ADDR.BIT.xmb_address_mask = xmbusAddrMask; +} + +/** + * @brief DCL Get XMBus device address mask. + * @param i2cx I2C register base address. + * @retval XMBus device address mask. + */ +static inline unsigned int DCL_I2C_GetXMBusMaskAddr(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->XMB_DEV_ADDR.BIT.xmb_address_mask; +} + +/** + * @brief DCL Set XMBus address enable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_XMBusAddressEnable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->XMB_DEV_ADDR.BIT.xmb_address_en = BASE_CFG_ENABLE; +} + +/** + * @brief DCL Set XMBus address disable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_XMBusAddressDisable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->XMB_DEV_ADDR.BIT.xmb_address_en = BASE_CFG_DISABLE; +} + +/** + * @brief DCL Set SMBus host notify enable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_SMBusHostNotifyEnable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->XMB_DEV_ADDR.BIT.smb_host_notify_en = BASE_CFG_ENABLE; +} + +/** + * @brief DCL Set SMBus host notify disable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_SMBusHostNotifyDisable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->XMB_DEV_ADDR.BIT.smb_host_notify_en = BASE_CFG_DISABLE; +} + +/** + * @brief DCL Set SMBus alert response enable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_SMBusAlertResponseEnable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->XMB_DEV_ADDR.BIT.smb_alert_response_en = BASE_CFG_ENABLE; +} + +/** + * @brief DCL Set SMBus SMBus alert response disable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_SMBusAlertResponseDisable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->XMB_DEV_ADDR.BIT.smb_alert_response_en = BASE_CFG_DISABLE; +} + +/** + * @brief DCL Set Receive SMBus device default address enable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_SMBusDevDefaultEnable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->XMB_DEV_ADDR.BIT.smb_dev_default_en = BASE_CFG_ENABLE; +} + +/** + * @brief DCL Set Receive SMBus device default address disable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_SMBusDevDefaultDisable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->XMB_DEV_ADDR.BIT.smb_dev_default_en = BASE_CFG_DISABLE; +} + +/** + * @brief DCL Set Receive PMBus Zone Read Address Enable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_PMBusZoneReadEnable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->XMB_DEV_ADDR.BIT.pmb_zone_read_en = BASE_CFG_ENABLE; +} + +/** + * @brief DCL Set Receive PMBus Zone Read Address Disable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_PMBusZoneReadDisable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->XMB_DEV_ADDR.BIT.pmb_zone_read_en = BASE_CFG_DISABLE; +} + +/** + * @brief DCL Set Receive PMBus Zone Write Address Enable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_PMBusZoneWriteEnable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->XMB_DEV_ADDR.BIT.pmb_zone_write_en = BASE_CFG_ENABLE; +} + +/** + * @brief DCL Set Receive PMBus Zone Write Address Disable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_PMBusZoneWriteDisable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->XMB_DEV_ADDR.BIT.pmb_zone_write_en = BASE_CFG_DISABLE; +} + +/** + * @brief DCL Set I2C start byte enable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_StartByteEnable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_OWN_ADDR.BIT.i2c_start_byte_en = BASE_CFG_ENABLE; +} + +/** + * @brief DCL Set I2C start byte disable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_StartByteDisable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_OWN_ADDR.BIT.i2c_start_byte_en = BASE_CFG_DISABLE; +} + +/** + * @brief DCL Set I2C device id enable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_DeviceIDEnable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_OWN_ADDR.BIT.i2c_device_id_en = BASE_CFG_ENABLE; +} + +/** + * @brief DCL Set I2C device id disable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_DeviceIDDisable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_OWN_ADDR.BIT.i2c_device_id_en = BASE_CFG_DISABLE; +} + +/** + * @brief DCL Set I2C general call enable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_GeneralCallEnable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_OWN_ADDR.BIT.i2c_general_call_en = BASE_CFG_ENABLE; +} + +/** + * @brief DCL Set I2C general call disable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_GeneralCallDisable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_OWN_ADDR.BIT.i2c_general_call_en = BASE_CFG_DISABLE; +} + +/** + * @brief Get the I2C RX received R/W Bits. + * @param i2cx I2C register base address. + * @retval The value of I2C RX received R/W Bits, 0: write, 1: read. + */ +static inline unsigned int DCL_I2C_GetRxReadOrWrite(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_RX_ADDR.BIT.rx_rw; +} + +/** + * @brief Get the I2C RX address. + * @param i2cx I2C register base address. + * @retval RX address. + */ +static inline unsigned int DCL_I2C_GetRxAddr(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_RX_ADDR.reg & 0x3FF; /* The mask of RX address is 0x3FF. */ +} + +/** + * @brief Set the I2C TX FIFO. + * @param i2cx I2C register base address. + * @param cmd I2C operation commands. + * @param data I2C operation data + * @retval None. + */ +static inline void DCL_I2C_SetTxFIFO(I2C_RegStruct *i2cx, I2C_CmdType cmd, unsigned char data) +{ + unsigned int temp; + + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + temp = (((unsigned int)cmd << I2C_TXFIFO_CMD_POS) & I2C_TXFIFO_CMD_MASK); + temp |= (((unsigned int)data << I2C_TXFIFO_WDATA_POS) & I2C_TXFIFO_WDATA_MASK); + i2cx->I2C_TX_FIFO.reg = temp; /* Set xommand and data */ +} + +/** + * @brief Get the I2C RX FIFO. + * @param i2cx I2C register base address. + * @retval RX FIFO data. + */ +static inline unsigned int DCL_I2C_GetRxFIFO(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_RX_FIFO.reg; +} + +/** + * @brief Set the I2C TX threshold. + * @param i2cx I2C register base address. + * @param waterMark I2C Tx threshold, 0-15. + * @retval None. + */ +static inline void DCL_I2C_SetTxWaterMark(I2C_RegStruct *i2cx, unsigned char waterMark) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_PARAM_CHECK_NO_RET(IsI2cTxWaterMark(waterMark)); + i2cx->I2C_TX_WATERMARK.BIT.tx_watermark = waterMark; +} + +/** + * @brief Get the I2C TX threshold. + * @param i2cx I2C register base address. + * @retval I2C tx threshold. + */ +static inline unsigned int DCL_I2C_GetTxWaterMark(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_TX_WATERMARK.BIT.tx_watermark; +} + +/** + * @brief Set the I2C RX threshold. + * @param i2cx I2C register base address. + * @param waterMark I2C Rx threshold, 0-15. + * @retval None. + */ +static inline void DCL_I2C_SetRxWaterMark(I2C_RegStruct *i2cx, unsigned char waterMark) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_PARAM_CHECK_NO_RET(IsI2cRxWaterMark(waterMark)); + i2cx->I2C_RX_WATERMARK.BIT.rx_watermark = waterMark; +} + +/** + * @brief Get the I2C RX threshold. + * @param i2cx I2C register base address. + * @retval I2C rx threshold. + */ +static inline int DCL_I2C_GetRxWaterMark(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_RX_WATERMARK.BIT.rx_watermark; +} + +/** + * @brief Set the I2C DMA mode. + * @param i2cx I2C register base address. + * @param mode I2C DMA operation mode. + * @retval None. + */ +static inline void DCL_I2C_SetDmaMode(I2C_RegStruct *i2cx, I2C_DmaOperationType mode) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_ASSERT_PARAM(IsI2CDmaOperationType(mode)); + i2cx->I2C_CTRL1.BIT.dma_operation = mode; +} + +/** + * @brief DCL Set Start I2C timing execution Enable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_SetMasterStartEnable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_CTRL1.BIT.mst_start = BASE_CFG_SET; +} + +/** + * @brief DCL Set Start I2C timing execution Disable. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_SetMasterStartDisable(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_CTRL1.BIT.mst_start = BASE_CFG_UNSET; +} + +/** + * @brief Get start and stop I2C timing status. + * @param i2cx I2C register base address. + * @retval start : 1, stop :0. + */ +static inline unsigned int DCL_I2C_GetStart(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_CTRL1.BIT.mst_start; +} + +/** + * @brief Rest Tx FIFO. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_ResetTxFIFO(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_CTRL1.BIT.rst_tx_fifo = BASE_CFG_SET; +} + +/** + * @brief Rest Rx FIFO. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_ResetRxFIFO(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_CTRL1.BIT.rst_rx_fifo = BASE_CFG_SET; +} + +/** + * @brief Set the SCL and SDA pins of the I2C to GPIO mode. + * @param i2cx I2C register base address. + * @param mode 0 disable,1 enable. + * @retval None. + */ +static inline void DCL_I2C_SetGpioMode(I2C_RegStruct *i2cx, unsigned char mode) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_ASSERT_PARAM(IsI2cSetOneBitValue(mode)); + i2cx->I2C_CTRL2.BIT.gpio_mode = mode; +} + +/** + * @brief Get the SCL and SDA pins of the I2C to GPIO mode. + * @param i2cx I2C register base address. + * @retval 0 or 1 + */ +static inline unsigned int DCL_I2C_GetGpioMode(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_CTRL2.BIT.gpio_mode; +} + +/** + * @brief Set the SDA output level. + * @param i2cx I2C register base address. + * @param level The sda output level. + * @retval 0 or 1. + */ +static inline void DCL_I2C_SetSdaLevel(I2C_RegStruct *i2cx, unsigned int level) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_ASSERT_PARAM(IsI2cSetOneBitValue(level)); + i2cx->I2C_CTRL2.BIT.force_sda = level; +} + +/** + * @brief Get the SDA output level. + * @param i2cx I2C register base address. + * @retval 0 or 1. + */ +static inline unsigned int DCL_I2C_GetSdaLevel(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_CTRL2.BIT.force_sda; +} + +/** + * @brief Set the SCL output level. + * @param i2cx I2C register base address. + * @param level The scl output level. + * @retval None. + */ +static inline void DCL_I2C_SetSclLevel(I2C_RegStruct *i2cx, unsigned int level) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_ASSERT_PARAM(IsI2cSetOneBitValue(level)); + i2cx->I2C_CTRL2.BIT.force_scl = level; +} + +/** + * @brief Get the SCL output level. + * @param i2cx I2C register base address. + * @retval 0 or 1. + */ +static inline unsigned int DCL_I2C_GetSclLevel(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_CTRL2.BIT.force_scl; +} + +/** + * @brief Get SMBus suspend_n_in level. + * @param i2cx I2C register base address. + * @retval 0 or 1. + */ +static inline unsigned int DCL_I2C_GetSMBusSuspendIn(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_CTRL2.BIT.smb_suspend_n_in; +} + +/** + * @brief Set SMBus suspend_n_out low level. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_SetSMBusSuspendOutLowLevel(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_CTRL2.BIT.smb_suspend_n_out = BASE_CFG_DISABLE; +} + +/** + * @brief Set SMBus suspend_n_out high level. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_SetSMBusSuspendOutHighLevel(I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_CTRL2.BIT.smb_suspend_n_out = BASE_CFG_ENABLE; +} + +/** + * @brief Get SMBus suspend_n_out level. + * @param i2cx I2C register base address. + * @retval 0 or 1. + */ +static inline unsigned int DCL_I2C_GetSMBusSuspendOut(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_CTRL2.BIT.smb_suspend_n_out; +} + +/** + * @brief Set SMBus suspend_n_oe_n. + * @param i2cx I2C register base address. + * @param selcet The output value of SMBSUS#. + * @retval None. + */ +static inline void DCL_I2C_SetSMBusSuspendOe(I2C_RegStruct *i2cx, unsigned int selcet) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_ASSERT_PARAM(IsI2cSetOneBitValue(selcet)); + i2cx->I2C_CTRL2.BIT.smb_suspend_n_oe_n = selcet; +} + +/** + * @brief Get SMBus suspend_n_oe_n. + * @param i2cx I2C register base address. + * @retval 0 or 1. + */ +static inline unsigned int DCL_I2C_GetSMBusSuspendOe(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_CTRL2.BIT.smb_suspend_n_oe_n; +} + +/** + * @brief Get SMBus alert_n_in. + * @param i2cx I2C register base address. + * @retval 0 or 1. + */ +static inline unsigned int DCL_I2C_GetSMBusAlertIn(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_CTRL2.BIT.smb_alert_n_in; +} + +/** + * @brief Set SMBus alert_n_oe_n. + * @param i2cx I2C register base address. + * @param selcet The smbus alert set or unset. + * @retval None. + */ +static inline void DCL_I2C_SetSMBusAlertOe(I2C_RegStruct *i2cx, unsigned int selcet) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_ASSERT_PARAM(IsI2cSetOneBitValue(selcet)); + i2cx->I2C_CTRL2.BIT.smb_alert_n_oe_n = selcet; +} + +/** + * @brief Get SMBus alert_n_oe_n. + * @param i2cx I2C register base address. + * @retval The smbus alert value. + */ +static inline unsigned int DCL_I2C_GetSMBusAlertOe(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_CTRL2.BIT.smb_alert_n_oe_n; +} + +/** + * @brief Get the number of valid Tx FIFOs. + * @param i2cx I2C register base address. + * @retval Tx FIFO valid value. + */ +static inline unsigned int DCL_I2C_GetTxFIFOValidNum(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_FIFO_STAT.BIT.tx_fifo_vld_num; +} + +/** + * @brief Get the number of valid Rx FIFOs. + * @param i2cx I2C register base address. + * @retval Tx FIFO valid value. + */ +static inline unsigned int DCL_I2C_GetRxFIFOValidNum(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_FIFO_STAT.BIT.rx_fifo_vld_num; +} + +/** + * @brief Get the status of I2C bus. + * @param i2cx I2C register base address. + * @retval 0: bus busy, 1: bus free. + */ +static inline unsigned int DCL_I2C_GetI2cBusSatus(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_FSM_STAT.BIT.i2c_bus_free; +} + +/** + * @brief Clearing I2C raw interrupts. + * @param i2cx I2C register base address. + * @param cleanStatus Need to clean Raw status + * @retval None. + */ +static inline void DCL_I2C_CleanRawINT(I2C_RegStruct *i2cx, unsigned int cleanStatus) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_INTR_RAW.reg = cleanStatus; +} + +/** + * @brief Get I2C raw interrupts status. + * @param i2cx I2C register base address. + * @retval The value of I2C raw interrupts status. + */ +static inline unsigned int DCL_I2C_GetRawINTStatus(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_INTR_RAW.reg; +} + +/** + * @brief Set enable I2C interrupts. + * @param i2cx I2C register base address. + * @param enableSelect Need to set interrupt enable. + * @retval None. + */ +static inline void DCL_I2C_SetInterruptsEnable(I2C_RegStruct *i2cx, unsigned int enableSelect) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + i2cx->I2C_INTR_EN.reg = enableSelect; +} + +/** + * @brief Get enable I2C interrupts. + * @param i2cx I2C register base address. + * @retval I2C interrupt enable value. + */ +static inline unsigned int DCL_I2C_GetInterruptsEnable(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_INTR_EN.reg; +} + +/** + * @brief Get I2C Interrupts Status. + * @param i2cx I2C register base address. + * @retval I2C interrupt status. + */ +static inline unsigned int DCL_I2C_GetInterruptsStatus(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_INTR_STAT.reg; +} + +/** + * @brief Get I2C version ID. + * @param i2cx I2C register base address. + * @retval I2C version ID. + */ +static inline unsigned int DCL_I2C_GetVersionID(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_VERSION.reg; +} + +/** + * @brief Set I2C SCL timeout. + * @param i2cx I2C register base address. + * @param timeout SCL low-level timeout configuration. + * @retval None. + */ +static inline void DCL_I2C_SetSclTimeout(I2C_RegStruct *i2cx, unsigned int timeout) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_ASSERT_PARAM(IsI2cSclTimoutValue(timeout)); + i2cx->I2C_SCL_TIMEOUT.reg = timeout; +} + +/** + * @brief Get I2C SCL timeout. + * @param i2cx I2C register base address. + * @retval I2C Scl timeout value. + */ +static inline unsigned int DCL_I2C_GetSclTimeout(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_SCL_TIMEOUT.BIT.scl_low_timeout; +} + +/** + * @brief I2C bus idle threshold configuration. + * @param i2cx I2C register base address. + * @param time The I2C bus idle threshold. + * @retval None. + */ +static inline void DCL_I2C_SetIdleThreshold(I2C_RegStruct *i2cx, unsigned int time) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_ASSERT_PARAM(IsI2cBusFreeTimeValue(time)); + i2cx->I2C_BUS_FREE.BIT.bus_free_time = time; +} + +/** + * @brief Get I2C bus idle threshold. + * @param i2cx I2C register base address. + * @retval I2C bus idle threshold. + */ +static inline unsigned int DCL_I2C_GetIdleThreshold(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_BUS_FREE.BIT.bus_free_time; +} + +/** + * @brief I2C filtering configuration. + * @param i2cx I2C register base address. + * @retval None. + */ +static inline void DCL_I2C_SetFilter(I2C_RegStruct *i2cx, unsigned int time) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + I2C_PARAM_CHECK_NO_RET(time <= 0xF); /* The maximum spike filter time is 0xF; */ + i2cx->I2C_FILTER.BIT.spike_filter_time = time; +} + +/** + * @brief Get I2C filtering configuration. + * @param i2cx I2C register base address. + * @retval I2C filtering configuration. + */ +static inline unsigned int DCL_I2C_GetFilter(const I2C_RegStruct *i2cx) +{ + I2C_ASSERT_PARAM(IsI2CInstance(i2cx)); + return i2cx->I2C_FILTER.BIT.spike_filter_time; +} + +/** + * @} + */ + +/** + * @} + */ +#endif /* #ifndef McuMagicTag_I2C_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/i2c/src/i2c.c b/vendor/others/demo/5-tim_adc/demo/drivers/i2c/src/i2c.c new file mode 100644 index 000000000..8d3e8d6c2 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/i2c/src/i2c.c @@ -0,0 +1,2037 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file i2c.c + * @author MCU Driver Team + * @brief I2C module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the I2C. + * + Initialization and de-initialization functions + * + Peripheral Control functions + */ + +/* Includes ------------------------------------------------------------------*/ +#include "interrupt.h" +#include "i2c.h" + +/* Macro definitions ---------------------------------------------------------*/ +#define I2C_INTERFACE_INDEX_0 0 +#define I2C_INTERFACE_INDEX_1 1 +#define I2C_MAX_INDEX_NUM 2 + +#define I2C_MASTER_STATUS 0x00 +#define I2C_SLAVE_STATUS 0x01 + +#define I2C_MAX_FIFO_SIZE 16 +#define I2C_WAIT_TIMEOUT 0x400 +#define I2C_MAX_DEV_ADDR 0x3FF + +#define I2C_OPERATION_WRITE 0 +#define I2C_OPERATION_READ 1 + +#define I2C_SEND_ADDR_STATUS_NONE 0 +#define I2C_SEND_ADDR_STATUS_WRITE 1 +#define I2C_SEND_ADDR_STATUS_READ 2 + +#define I2C_DATA_OPT_SETP_PRE 1 +#define I2C_DATA_OPT_SETP_NORMAL 2 + +/* Enable scl_low_timeout\mst_cmd_done\arb_lost\tx_fifo_not_full\rx_fifo_not_empty\mst_rx_ack_unmatch */ +#define I2C_CFG_INTERRUPT_MASTER_RX 0x3843 + +/* Enable scl_low_timeout\mst_cmd_done\arb_lost\tx_fifo_not_full\mst_rx_ack_unmatch */ +#define I2C_CFG_INTERRUPT_MASTER_TX 0x3841 + +/* Enable slv_addr_match_int\slv_rx_ack_unmatch_int\stop_det_int */ +#define I2C_CFG_INTERRUPT_SLAVE 0x300200 +#define I2C_TICK_MS_DIV 1000 + +#define I2C_INTR_RAW_SLAVE_ADDR_MATCH_MASK (0x1 << 21) +#define I2C_INTR_RAW_SLAVE_ACK_UNMATCH_MASK (0x1 << 20) +#define I2C_INTR_RAW_SLAVE_PEC_CHECK_FAIL_MASK (0x1 << 19) +#define I2C_INTR_RAW_MASTER_PEC_CHECK_FAIL_MASK (0x1 << 18) +#define I2C_INTR_RAW_SLAVE_CMD_INT1_MASK (0x1 << 17) +#define I2C_INTR_RAW_MASTER_CMD_INT1_MASK (0x1 << 16) +#define I2C_INTR_RAW_SMB_SUSPEND_MASK (0x1 << 15) +#define I2C_INTR_RAW_SMB_ALERT_MASK (0x1 << 14) +#define I2C_INTR_RAW_SCL_LOW_TIMEOUT_MASK (0x1 << 13) +#define I2C_INTR_RAW_ALL_CMD_DONE_MASK (0x1 << 12) +#define I2C_INTR_RAW_ARB_LOST_MASK (0x1 << 11) +#define I2C_INTR_RAW_START_DET_MASK (0x1 << 10) +#define I2C_INTR_RAW_STOP_DET_MASK (0x1 << 9) +#define I2C_INTR_RAW_TX_DATA_REQUEST_MASK (0x1 << 8) +#define I2C_INTR_RAW_RX_DATA_READY_MASK (0x1 << 7) +#define I2C_INTR_RAW_TX_FIFO_NOT_FULL_MASK (0x1 << 6) +#define I2C_INTR_RAW_TX_FIFO_EMPTY_MASK (0x1 << 5) +#define I2C_INTR_RAW_TX_LE_WATERMARK_MASK (0x1 << 4) +#define I2C_INTR_RAW_RX_FIFO_FULL_MASK (0x1 << 3) +#define I2C_INTR_RAW_RX_GE_WATERMARK_MASK (0x1 << 2) +#define I2C_INTR_RAW_RX_FIFO_NOT_EMPTY_MASK (0x1 << 1) +#define I2C_INTR_RAW_ACK_BIT_UNMATCH_MASK (0x1 << 0) + +#define I2C_10BIT_SLAVE_READ_ADDR_MASK (0xFEFF0000) +#define I2C_10BIT_SLAVE_WRITE_ADDR_MASK (0x0000FEFF) +#define I2C_10BIT_SLAVE_READ_OPT_MASK (0x01000000) + +#define I2C_7BIT_SLAVE_READ_ADDR_MASK (0x00FE0000) +#define I2C_7BIT_SLAVE_WRITE_ADDR_MASK (0x000000FE) +#define I2C_7BIT_SLAVE_READ_OPT_MASK (0x00010000) + +#define I2C_SLAVE_WRITE_ADDR_POS 8 +#define I2C_SLAVE_READ_FIX_ADDR_POS 24 +#define I2C_SLAVE_READ_DEV_ADDR_POS 16 +#define I2C_SLAVE_ADDR_MASK 0xFF +#define I2C_10BIT_SLAVE_ADDR_POS 16 + +#define HIGH_HOLD_TIME_POS 16 +#define HIGH_HOLD_TIME_MASK 0xFFFF0000 +#define LOW_HOLD_TIME_MASK 0x0000FFFF + +#define DMA_RX_CHANNEL_POS 8 +#define DMA_CHANNEL_MASK 0x00FF + +#define COMMAND_ALL_DONE 0 +#define I2C_BUS_IS_FREE 1 +#define SLAVE_ADDRESS_MATCH 2 +#define TX_FIFO_NOT_FULL 3 +#define RX_FIFO_NOT_EMPTY 4 + +#define I2C_FREQ_HIGH_PARAMTER 8 +#define I2C_FREQ_LOW_PARAMTER 9 +#define I2C_ERROR_BIT_MASK 0x100801 /* slv_rx_ack_unmatch\arb_lost\mst_rx_ack_unmatch */ +#define I2C_SCL_LOW_TIMEOUT_MASK 0x2000 + +static BASE_StatusType DmaMasterReadData(I2C_Handle *handle, unsigned int size, unsigned int index); +static BASE_StatusType DmaMasterWriteData(I2C_Handle *handle, unsigned int size, unsigned int index); +static BASE_StatusType DmaSlaveReadData(I2C_Handle *handle, unsigned int size, unsigned int index); +static BASE_StatusType DmaSlaveWriteData(I2C_Handle *handle, unsigned int size, unsigned int index); + +typedef struct { + unsigned int txReadCmdCnt; + /* The lower 16 bits are used for write operations, + and the high 16 bits are used for read operations. */ + unsigned int slaveAddress; + unsigned int sendAddressStatus; +} I2C_InternalConfigParam; + +/* Some global parameters used for module internal operations */ +static volatile I2C_InternalConfigParam g_internalConfigParam[I2C_MAX_INDEX_NUM] = {0}; +static volatile unsigned int g_internalTxBuffDMA[I2C_MAX_INDEX_NUM][I2C_ONCE_TRANS_MAX_NUM] = {0}; +static volatile unsigned int g_dmaTransferSize = 0; +/** + * @brief Check all initial configuration parameters. + * @param handle I2C handle. + * @param clockFreq I2C work clock freq; + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType CheckAllInitParameters(I2C_Handle *handle, unsigned int clockFreq) +{ + /* Check the configuration of basic function parameters. */ + I2C_PARAM_CHECK_WITH_RET(IsI2cFunctionMode(handle->functionMode), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(IsI2cAddressMode(handle->addrMode), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(IsI2cSdaHoldTime(handle->sdaHoldTime), BASE_STATUS_ERROR); + /* Check whether the I2C freq is valid. */ + I2C_PARAM_CHECK_WITH_RET(IsI2cFreq(handle->freq), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET((clockFreq > 0), BASE_STATUS_ERROR); + + if (handle->freq > clockFreq) { + return BASE_STATUS_ERROR; + } + /* Check the configuration of basic function parameters. */ + I2C_PARAM_CHECK_WITH_RET(IsI2cIgnoreAckFlag(handle->ignoreAckFlag), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(IsI2cTxWaterMark(handle->txWaterMark), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(IsI2cRxWaterMark(handle->rxWaterMark), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(IsI2cSpikeFilterTime(handle->handleEx.spikeFilterTime), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(IsI2cSdaDelayTime(handle->handleEx.sdaDelayTime), BASE_STATUS_ERROR); + + /* Checking the own address and generalCall parameter enable when is used as slave. */ + if (handle->functionMode == I2C_MODE_SELECT_SLAVE_ONLY || handle->functionMode == I2C_MODE_SELECT_MASTER_SLAVE) { + I2C_PARAM_CHECK_WITH_RET(IsI2cOwnAddressOrMask(handle->slaveOwnAddress), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(IsI2cGeneralCallMode(handle->generalCallMode), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(IsXMBusAddressEnable(handle->handleEx.slaveOwnXmbAddressEnable), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(IsXMBusAddressOrMask(handle->handleEx.slaveOwnXmbAddress), BASE_STATUS_ERROR); + } + return BASE_STATUS_OK; +} + +/** + * @brief Configuring the I2C Slave Device Address. + * @param handle I2C handle. + * @param devAddr Slave device address + * @retval None. + */ +static void SetSlaveDevAddr(I2C_Handle *handle, const unsigned int devAddr) +{ + unsigned int addr; + + if (handle->addrMode == I2C_10_BITS) { + /* The upper 16 bits are the read operation address, and the lower 16 bits are the write operation address. */ + addr = (((devAddr << 16) & I2C_10BIT_SLAVE_READ_ADDR_MASK) | I2C_10BIT_SLAVE_READ_OPT_MASK) | + (devAddr & I2C_10BIT_SLAVE_WRITE_ADDR_MASK); + } else { + /* The upper 16 bits are the read operation address, and the lower 16 bits are the write operation address. */ + addr = (((devAddr << 16) & I2C_7BIT_SLAVE_READ_ADDR_MASK) | I2C_7BIT_SLAVE_READ_OPT_MASK) | + (devAddr & I2C_7BIT_SLAVE_WRITE_ADDR_MASK); + } + + if (handle->baseAddress == I2C0) { + g_internalConfigParam[I2C_INTERFACE_INDEX_0].slaveAddress = addr; + } else if (handle->baseAddress == I2C1) { + g_internalConfigParam[I2C_INTERFACE_INDEX_1].slaveAddress = addr; + } +} + +/** + * @brief I2C Bus clear. + * @param handle I2C handle. + * @retval None. + */ +static void I2cBusClear(I2C_Handle *handle) +{ + handle->state = I2C_STATE_READY; + handle->baseAddress->I2C_MODE.BIT.mst_slv_function = I2C_STATE_RESET; + /* Clears interrupts and disables interrupt reporting to + facilitate switching between different working modes. */ + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + + /* Set the SCL and SDA pins of the I2C to GPIO mode. */ + handle->baseAddress->I2C_CTRL2.BIT.gpio_mode = BASE_CFG_ENABLE; + handle->baseAddress->I2C_CTRL2.BIT.force_scl = BASE_CFG_ENABLE; + handle->baseAddress->I2C_CTRL2.BIT.force_sda = BASE_CFG_ENABLE; + /* The device that controls the bus to be pulled down needs to release the bus within the 9 clocks. */ + for (unsigned int index = 0; index < 9; index++) { + handle->baseAddress->I2C_CTRL2.BIT.force_scl = BASE_CFG_UNSET; + BASE_FUNC_DELAY_US(5); /* The I2C timing is required. The delay is about 5 μs. */ + handle->baseAddress->I2C_CTRL2.BIT.force_scl = BASE_CFG_SET; + BASE_FUNC_DELAY_US(5); /* The I2C timing is required. The delay is about 5 μs. */ + } + handle->baseAddress->I2C_CTRL2.BIT.force_scl = BASE_CFG_ENABLE; + handle->baseAddress->I2C_CTRL2.BIT.force_sda = BASE_CFG_ENABLE; + /* I2C start */ + handle->baseAddress->I2C_CTRL2.BIT.force_sda = BASE_CFG_UNSET; + BASE_FUNC_DELAY_US(10); /* The I2C timing is required. The delay is about 10 μs. */ + /* I2C stop */ + handle->baseAddress->I2C_CTRL2.BIT.force_sda = BASE_CFG_SET; + handle->baseAddress->I2C_CTRL2.BIT.gpio_mode = BASE_CFG_DISABLE; /* Exit the I2C GPIO mode. */ +} + +/** + * @brief Setting Error Handling. + * @param handle I2C handle. + * @retval None. + */ +static void SetErrorHandling(I2C_Handle *handle) +{ + /* If the low level times out, the I2C bus is cleared and the bus is expected to be released. */ + if (handle->baseAddress->I2C_INTR_RAW.BIT.scl_low_timeout_raw == BASE_CFG_ENABLE) { + I2cBusClear(handle); + handle->baseAddress->I2C_INTR_RAW.BIT.scl_low_timeout_raw = BASE_CFG_ENABLE; + } + + if (handle->errorCode != BASE_STATUS_OK && handle->userCallBack.ErrorCallback != NULL) { + handle->userCallBack.ErrorCallback(handle); + } + /* Clears interrupts and disables interrupt reporting to + facilitate switching between different working modes. */ + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + + handle->state = I2C_STATE_READY; +} + +/** + * @brief Item is checked for readiness. + * @param handle I2C handle. + * @param checkItem The item to be checked. + * @param opt Read or write flag. + * @retval false, item is not ready. true, item is ready. + */ +static unsigned int CheckItemStatus(I2C_Handle *handle, unsigned int checkItem, unsigned int opt) +{ + unsigned int ret = 0; + unsigned int tempStatusValue = 0; + switch (checkItem) { + case COMMAND_ALL_DONE: + /* The 0x1200 is the bit of mst_cmd_done_raw and stop_det_raw. */ + tempStatusValue = (handle->baseAddress->I2C_INTR_RAW.reg & 0x1200); /* Check the I2C is all command done. */ + ret = tempStatusValue; + break; + case I2C_BUS_IS_FREE: + /* The I2C bus is free. */ + ret = handle->baseAddress->I2C_FSM_STAT.BIT.i2c_bus_free; + break; + case SLAVE_ADDRESS_MATCH: + /* Slave servers are matched */ + tempStatusValue = (handle->baseAddress->I2C_RX_ADDR.BIT.rx_rw == opt) ? 1 : 0; + tempStatusValue |= handle->baseAddress->I2C_INTR_RAW.BIT.slv_addr_match_raw; + ret = tempStatusValue; + break; + case TX_FIFO_NOT_FULL: + /* Tx fifo is not full. */ + ret = ((handle->baseAddress->I2C_FIFO_STAT.BIT.tx_fifo_vld_num < I2C_MAX_FIFO_SIZE)) ? 1 : 0; + break; + case RX_FIFO_NOT_EMPTY: + /* Rx fifo is not empty. */ + ret = handle->baseAddress->I2C_FIFO_STAT.BIT.rx_fifo_vld_num; + break; + default: + break; + } + return ret; +} + +/** + * @brief Wait for the item status to be ready. + * @param handle I2C handle. + * @param checkItem The item to be checked. + * @param opt Read or write flag. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType WaitStatusReady(I2C_Handle *handle, unsigned int checkItem, unsigned int opt) +{ + unsigned int preTick = DCL_SYSTICK_GetTick(); + unsigned int curTick; + unsigned long long delta = 0; + unsigned long long targetDelta = HAL_CRG_GetIpFreq(SYSTICK_BASE) / I2C_TICK_MS_DIV * handle->timeout; + + while (true) { + if (handle->baseAddress->I2C_INTR_RAW.reg & I2C_ERROR_BIT_MASK) { + SetErrorHandling(handle); + return BASE_STATUS_ERROR; + } + + /* Check the status of the item is ready. */ + if (CheckItemStatus(handle, checkItem, opt)) { + if (checkItem == SLAVE_ADDRESS_MATCH) { + /* Clear slave address match raw interrupt */ + handle->baseAddress->I2C_INTR_RAW.BIT.slv_addr_match_raw = BASE_CFG_SET; + } + return BASE_STATUS_OK; + } + + curTick = DCL_SYSTICK_GetTick(); + delta += curTick > preTick ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick; + if (delta >= targetDelta) { /* Check timeout. */ + break; + } + preTick = curTick; + } + return BASE_STATUS_TIMEOUT; +} + +/** + * @brief Set the sending data and operation commands. + * @param handle I2C handle. + * @param cmd Operation commands. + * @param data Sending data. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType SetTxFIFODataAndCmd(I2C_Handle *handle, I2C_CmdType cmd, unsigned char data) +{ + BASE_StatusType ret; + unsigned int temp; + + ret = WaitStatusReady(handle, TX_FIFO_NOT_FULL, I2C_OPERATION_WRITE); + if (ret != BASE_STATUS_OK) { + return ret; + } + /* The 8 to 11 bits are the Timing Commands, and the 0 to 7 bits are the write data. */ + temp = (((unsigned int)cmd << I2C_TXFIFO_CMD_POS) & I2C_TXFIFO_CMD_MASK); + temp |= (((unsigned int)data << I2C_TXFIFO_WDATA_POS) & I2C_TXFIFO_WDATA_MASK); + handle->baseAddress->I2C_TX_FIFO.reg = temp; /* Sets the data and commands to be sent. */ + return BASE_STATUS_OK; +} + +/** + * @brief Send a write command to the slave device. + * @param handle I2C handle. + * @param index The number of I2C. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType SendSlaveAddressWriteCmd(I2C_Handle *handle, unsigned int index) +{ + BASE_StatusType ret; + unsigned char addr; + /* Write slave address */ + if (handle->addrMode == I2C_10_BITS) { /* 10bit address Configuration */ + if (handle->transferCount == 0) { + /* The first address of a 10-bit address configuration */ + addr = (unsigned char)((g_internalConfigParam[index].slaveAddress >> I2C_SLAVE_WRITE_ADDR_POS) & + I2C_SLAVE_ADDR_MASK); + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_M_TD_RACK_S_RD_TACK, addr); + if (ret != BASE_STATUS_OK) { + return ret; + } + /* The second address of the 10-bit address configuration */ + addr = (unsigned char)(g_internalConfigParam[index].slaveAddress & I2C_SLAVE_ADDR_MASK); + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_M_TD_RACK_S_RD_TACK, addr); + if (ret != BASE_STATUS_OK) { + return ret; + } + } else { + addr = (unsigned char)((g_internalConfigParam[index].slaveAddress >> I2C_SLAVE_WRITE_ADDR_POS) & + I2C_SLAVE_ADDR_MASK); + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_M_TD_RACK_S_RD_TACK, addr); + if (ret != BASE_STATUS_OK) { + return ret; + } + } + } else { /* 7bit address Configuration */ + addr = (unsigned char)(g_internalConfigParam[index].slaveAddress & I2C_SLAVE_ADDR_MASK); + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_M_TD_RACK_S_RD_TACK, addr); + if (ret != BASE_STATUS_OK) { + return ret; + } + } + return BASE_STATUS_OK; +} + +/** + * @brief Send a read command to the slave device. + * @param handle I2C handle. + * @param index The number of I2C. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType SendSlaveAddressReadCmd(I2C_Handle *handle, unsigned int index) +{ + BASE_StatusType ret; + unsigned char addr; + /* Write slave address */ + if (handle->addrMode == I2C_10_BITS) { /* 10bit address Configuration */ + if (handle->transferCount == 0) { + /* The first address of a 10-bit address configuration */ + addr = (unsigned char)((g_internalConfigParam[index].slaveAddress >> I2C_SLAVE_READ_FIX_ADDR_POS) & + I2C_SLAVE_ADDR_MASK); + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_M_TD_RACK_S_RD_TACK, addr); + if (ret != BASE_STATUS_OK) { + return ret; + } + /* The second address of the 10-bit address configuration */ + addr = (unsigned char)((g_internalConfigParam[index].slaveAddress >> I2C_SLAVE_READ_DEV_ADDR_POS) & + I2C_SLAVE_ADDR_MASK); + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_M_TD_RACK_S_RD_TACK, addr); + if (ret != BASE_STATUS_OK) { + return ret; + } + } else { + addr = (unsigned char)((g_internalConfigParam[index].slaveAddress >> I2C_SLAVE_READ_FIX_ADDR_POS) & + I2C_SLAVE_ADDR_MASK); + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_M_TD_RACK_S_RD_TACK, addr); + if (ret != BASE_STATUS_OK) { + return ret; + } + } + } else { /* 7bit address Configuration */ + addr = (unsigned char)((g_internalConfigParam[index].slaveAddress >> I2C_SLAVE_READ_DEV_ADDR_POS) & + I2C_SLAVE_ADDR_MASK); + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_M_TD_RACK_S_RD_TACK, addr); + if (ret != BASE_STATUS_OK) { + return ret; + } + } + return BASE_STATUS_OK; +} + +/** + * @brief I2C Parameter Configuration in blocking. + * @param handle I2C handle. + * @param transferStatus The status is used to indicate read or write. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType I2C_ConfigParametersAndStartBlocking(I2C_Handle *handle, unsigned int transferStatus) +{ + BASE_StatusType ret; + /* Startup Control */ + handle->baseAddress->I2C_CTRL1.BIT.dma_operation = I2C_DMA_OP_NONE; + handle->baseAddress->I2C_CTRL1.BIT.rst_rx_fifo = BASE_CFG_SET; + handle->baseAddress->I2C_CTRL1.BIT.rst_tx_fifo = BASE_CFG_SET; + + handle->baseAddress->I2C_CTRL1.BIT.mst_start = (transferStatus == I2C_MASTER_STATUS) ? BASE_CFG_SET : + BASE_CFG_UNSET; + if (transferStatus == I2C_SLAVE_STATUS) { + return BASE_STATUS_OK; + } + /* Send I2C start */ + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_S, 0); /* Sets the start command to be sent. */ + if (ret != BASE_STATUS_OK) { + SetErrorHandling(handle); + return ret; + } + return ret; +} + +/** + * @brief Master send stop command in blocking. + * @param handle I2C handle. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType BlockingSendStopCommand(I2C_Handle *handle) +{ + BASE_StatusType ret; + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_P, 0); + if (ret != BASE_STATUS_OK) { + SetErrorHandling(handle); + return ret; + } + /* Wait until all commands are executed. */ + ret = WaitStatusReady(handle, COMMAND_ALL_DONE, I2C_OPERATION_WRITE); + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; +} + +/** + * @brief The step of receive normal data in blocking as master. + * @param handle I2C handle. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType BlockingMasterRxDataOptStepNormal(I2C_Handle *handle) +{ + BASE_StatusType ret = BASE_STATUS_OK; + while (handle->transferCount < handle->transferSize) { + if (handle->transferCount == handle->transferSize - 1) { + /* Reads the last frame of data without ack. */ + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_M_RD_TNACK_S_TD_RNACK, 0); + } else { + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_M_RD_TACK_S_TD_RACK, 0); + } + if (ret != BASE_STATUS_OK) { + SetErrorHandling(handle); + return ret; + } + /* Wait the RX FIFO is not empty. */ + ret = WaitStatusReady(handle, RX_FIFO_NOT_EMPTY, I2C_OPERATION_READ); + if (ret != BASE_STATUS_OK) { + SetErrorHandling(handle); + return ret; + } + /* Obtains the data received from the RX FIFO. */ + *handle->transferBuff = handle->baseAddress->I2C_RX_FIFO.BIT.rx_fifo_rdata; + handle->transferBuff++; + handle->transferCount++; + } + return ret; +} + +/** + * @brief The step of transmit normal data in blocking as master. + * @param handle I2C handle. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType BlockingMasterTxDataOptStepNormal(I2C_Handle *handle) +{ + BASE_StatusType ret; + /* Sets data to be sent cyclically. */ + while (handle->transferCount < handle->transferSize) { + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_M_TD_RACK_S_RD_TACK, *handle->transferBuff); + if (ret != BASE_STATUS_OK) { + SetErrorHandling(handle); + return ret; + } + handle->transferBuff++; + handle->transferCount++; + } + return BASE_STATUS_OK; +} + +/** + * @brief The step of receive normal data in blocking as slave. + * @param handle I2C handle. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType BlockingSlaveRxDataOptStepNormal(I2C_Handle *handle) +{ + while (handle->transferCount < handle->transferSize) { + /* Sets the data to be received. */ + if (SetTxFIFODataAndCmd(handle, I2C_CMD_M_TD_RACK_S_RD_TACK, 0) != BASE_STATUS_OK) { + SetErrorHandling(handle); + return BASE_STATUS_TIMEOUT; + } + if (WaitStatusReady(handle, RX_FIFO_NOT_EMPTY, I2C_OPERATION_READ) != BASE_STATUS_OK) { + SetErrorHandling(handle); + return BASE_STATUS_TIMEOUT; + } + /* Obtains the data received in the RX FIFO. */ + *handle->transferBuff = handle->baseAddress->I2C_RX_FIFO.BIT.rx_fifo_rdata; + handle->transferBuff++; + handle->transferCount++; + } + return BASE_STATUS_OK; +} + +/** + * @brief Checking Interrupts Caused by I2C Timing Errors. + * @param handle I2C handle. + * @param status Status of the I2C. + * @retval true or false + */ +static bool IsInterruptErrorStatus(I2C_Handle *handle, unsigned int status) +{ + if (status & I2C_ERROR_BIT_MASK) { + /* If the low level times out, the I2C bus is cleared and the bus is expected to be released. */ + if (status & I2C_SCL_LOW_TIMEOUT_MASK) { + I2cBusClear(handle); + } + /* Disable */ + handle->errorCode = BASE_STATUS_ERROR; + handle->baseAddress->I2C_CTRL1.BIT.mst_start = BASE_CFG_DISABLE; + /* Clears interrupts and disables interrupt reporting to + facilitate switching between different working modes. */ + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + handle->state = I2C_STATE_READY; + if (handle->userCallBack.ErrorCallback != NULL) { + handle->userCallBack.ErrorCallback(handle); + } + return true; + } + return false; +} + +/** + * @brief Interrupt handle send start command. + * @param handle I2C handle. + * @param index The number of I2C. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType InterruptSendStart(I2C_Handle *handle, unsigned index) +{ + unsigned int temp; + if (g_internalConfigParam[index].sendAddressStatus <= I2C_SEND_ADDR_STATUS_NONE) { + return BASE_STATUS_OK; + } + + if (handle->baseAddress->I2C_FIFO_STAT.BIT.tx_fifo_vld_num < I2C_MAX_FIFO_SIZE) { + /* The 8 to 11 bits are the Timing Commands, and the 0 to 7 bits are the write data. */ + temp = (((unsigned int)I2C_CMD_S << I2C_TXFIFO_CMD_POS) & I2C_TXFIFO_CMD_MASK); + handle->baseAddress->I2C_TX_FIFO.reg = temp; /* Sets the data and commands to be sent. */ + } else { + return BASE_STATUS_ERROR; + } + switch (g_internalConfigParam[index].sendAddressStatus) { + case I2C_SEND_ADDR_STATUS_WRITE: + /* Send a write command to the slave. */ + if (SendSlaveAddressWriteCmd(handle, index) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + break; + case I2C_SEND_ADDR_STATUS_READ: + /* Send a read command to the slave. */ + if (SendSlaveAddressReadCmd(handle, index) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + break; + default: + break; + } + g_internalConfigParam[index].sendAddressStatus = I2C_SEND_ADDR_STATUS_NONE; + return BASE_STATUS_OK; +} + +/** + * @brief I2C Interrupt done Handling + * @param handle I2C handle. + * @param status I2C interrupt raw status. + * @retval None. + */ +static void InterruptAllDoneHandle(I2C_Handle *handle, unsigned int status) +{ + /* After all data transmission is complete, call the user's callback function. */ + unsigned int masterAllDone = status & I2C_INTR_RAW_ALL_CMD_DONE_MASK; + unsigned int slaveReceiveStop = status & I2C_INTR_RAW_STOP_DET_MASK; + unsigned int allDoneItFlag = (masterAllDone || slaveReceiveStop); + if ((handle->transferCount >= handle->transferSize) && allDoneItFlag) { + /* Clears interrupts and disables interrupt reporting to + facilitate switching between different working modes. */ + handle->baseAddress->I2C_CTRL1.BIT.mst_start = BASE_CFG_DISABLE; + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + if (handle->userCallBack.RxCplCallback != NULL && + (handle->state == I2C_STATE_BUSY_MASTER_RX || handle->state == I2C_STATE_BUSY_SLAVE_RX)) { + handle->userCallBack.RxCplCallback(handle); /* Invoke the RX callback processing function. */ + } else if (handle->userCallBack.TxCplCallback != NULL && + (handle->state == I2C_STATE_BUSY_MASTER_TX || handle->state == I2C_STATE_BUSY_SLAVE_TX)) { + handle->userCallBack.TxCplCallback(handle); /* Invoke the TX callback processing function. */ + } + handle->state = I2C_STATE_READY; + } +} + +/** + * @brief I2C interrupt TX handling + * @param handle I2C handle. + * @param index The number of I2C. + * @retval None. + */ +static void InterruptMasterTxHandle(I2C_Handle *handle, unsigned int index) +{ + I2C_ASSERT_PARAM(handle != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_ASSERT_PARAM(handle->transferBuff != NULL); + unsigned int temp; + /* Send a start command to the slave. */ + if (InterruptSendStart(handle, index) != BASE_STATUS_OK) { + return; + } + while (handle->baseAddress->I2C_FIFO_STAT.BIT.tx_fifo_vld_num < I2C_MAX_FIFO_SIZE && + handle->transferCount < handle->transferSize) { + /* Sets the data to be sent. */ + temp = (((unsigned int)I2C_CMD_M_TD_RACK_S_RD_TACK << I2C_TXFIFO_CMD_POS) & I2C_TXFIFO_CMD_MASK); + temp |= ((unsigned int)(*handle->transferBuff) & I2C_TXFIFO_WDATA_MASK); + handle->baseAddress->I2C_TX_FIFO.reg = temp; /* Sets the data and commands to be sent. */ + handle->transferBuff++; + handle->transferCount++; + } +} + +/** + * @brief I2C Interrupt RX Handling + * @param handle I2C handle. + * @param index The number of I2C. + * @retval None. + */ +static void InterruptMasterRxHandle(I2C_Handle *handle, unsigned int index) +{ + I2C_ASSERT_PARAM(handle != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_ASSERT_PARAM(handle->transferBuff != NULL); + /* Send a start command to the slave. */ + if (InterruptSendStart(handle, index) != BASE_STATUS_OK) { + return; + } + /* The I2C controller fills in the receive command and starts to receive data. */ + while (handle->baseAddress->I2C_FIFO_STAT.BIT.tx_fifo_vld_num < I2C_MAX_FIFO_SIZE && + g_internalConfigParam[index].txReadCmdCnt < handle->transferSize) { + if (g_internalConfigParam[index].txReadCmdCnt == handle->transferSize - 1) { + handle->baseAddress->I2C_TX_FIFO.reg = + (((unsigned int)I2C_CMD_M_RD_TNACK_S_TD_RNACK << I2C_TXFIFO_CMD_POS) & I2C_TXFIFO_CMD_MASK); + } else { /* Normal data transmission. */ + handle->baseAddress->I2C_TX_FIFO.reg = + (((unsigned int)I2C_CMD_M_RD_TACK_S_TD_RACK << I2C_TXFIFO_CMD_POS) & I2C_TXFIFO_CMD_MASK); + } + g_internalConfigParam[index].txReadCmdCnt++; + } + /* Obtains the data received in the RX FIFO. */ + while (handle->baseAddress->I2C_FIFO_STAT.BIT.rx_fifo_vld_num > 0 && + handle->transferCount < handle->transferSize) { + *handle->transferBuff++ = handle->baseAddress->I2C_RX_FIFO.BIT.rx_fifo_rdata; + handle->transferCount++; + } +} + +/** + * @brief I2C interrupt slave TX handling + * @param handle I2C handle. + * @retval None. + */ +static void InterruptSlaveTxHandle(I2C_Handle *handle) +{ + I2C_ASSERT_PARAM(handle != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_ASSERT_PARAM(handle->transferBuff != NULL); + unsigned int temp; + while (handle->baseAddress->I2C_FIFO_STAT.BIT.tx_fifo_vld_num < I2C_MAX_FIFO_SIZE && + handle->transferCount < handle->transferSize) { + if (handle->transferCount == handle->transferSize - 1) { /* no need ack. */ + temp = (((unsigned int)I2C_CMD_M_RD_TNACK_S_TD_RNACK << I2C_TXFIFO_CMD_POS) & I2C_TXFIFO_CMD_MASK); + temp |= ((unsigned int)(*handle->transferBuff) & I2C_TXFIFO_WDATA_MASK); + handle->baseAddress->I2C_TX_FIFO.reg = temp; /* Sets the data and commands to be sent. */ + } else { /* Normal data transmission. */ + temp = (((unsigned int)I2C_CMD_M_RD_TACK_S_TD_RACK << I2C_TXFIFO_CMD_POS) & I2C_TXFIFO_CMD_MASK); + temp |= ((unsigned int)(*handle->transferBuff) & I2C_TXFIFO_WDATA_MASK); + handle->baseAddress->I2C_TX_FIFO.reg = temp; /* Sets the data and commands to be sent. */ + } + handle->transferBuff++; + handle->transferCount++; + } +} + +/** + * @brief I2C interrupt slave RX handling + * @param handle I2C handle. + * @param index The number of I2C. + * @retval None. + */ +static void InterruptSlaveRxHandle(I2C_Handle *handle, unsigned int index) +{ + I2C_ASSERT_PARAM(handle != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_ASSERT_PARAM(handle->transferBuff != NULL); + /* Set the data receiving command. */ + while (handle->baseAddress->I2C_FIFO_STAT.BIT.tx_fifo_vld_num < I2C_MAX_FIFO_SIZE && + g_internalConfigParam[index].txReadCmdCnt < handle->transferSize) { + handle->baseAddress->I2C_TX_FIFO.reg = + (((unsigned int)I2C_CMD_M_TD_RACK_S_RD_TACK << I2C_TXFIFO_CMD_POS) & I2C_TXFIFO_CMD_MASK); + g_internalConfigParam[index].txReadCmdCnt++; + } + /* Obtained data from RX FIFO. */ + while (handle->baseAddress->I2C_FIFO_STAT.BIT.rx_fifo_vld_num > 0 && + handle->transferCount < handle->transferSize) { + *handle->transferBuff = handle->baseAddress->I2C_RX_FIFO.BIT.rx_fifo_rdata; + handle->transferBuff++; + handle->transferCount++; + } +} + +/** + * @brief ICallback function corresponding to the interrupt processing function. + * @param handle I2C handle. + * @param status Status of the I2C. + * @param index The number of I2C. + * @retval None. + */ +static void InterruptHandle(I2C_Handle *handle, unsigned int status, unsigned int index) +{ + if (handle->state == I2C_STATE_BUSY_MASTER_TX) { + InterruptMasterTxHandle(handle, index); /* Transfer data as a host. */ + return; + } else if (handle->state == I2C_STATE_BUSY_MASTER_RX) { + InterruptMasterRxHandle(handle, index); /* Receive data as a host. */ + return; + } else if (handle->state == I2C_STATE_BUSY_SLAVE_TX) { + if (status & I2C_INTR_RAW_SLAVE_ADDR_MATCH_MASK) { + /* Set TX FIFO the waterline. */ + handle->baseAddress->I2C_INTR_EN.BIT.tx_fifo_not_full_en = BASE_CFG_SET; + } + if (handle->baseAddress->I2C_RX_ADDR.BIT.rx_rw == I2C_OPERATION_READ) { + InterruptSlaveTxHandle(handle); /* Transfer data as slave. */ + } + return; + } else if (handle->state == I2C_STATE_BUSY_SLAVE_RX) { + if (status & I2C_INTR_RAW_SLAVE_ADDR_MATCH_MASK) { + /* Set TX FIFO the waterline. */ + handle->baseAddress->I2C_INTR_EN.BIT.tx_fifo_not_full_en = BASE_CFG_SET; + /* Set RX FIFO the waterline. */ + handle->baseAddress->I2C_INTR_EN.BIT.rx_fifo_not_empty_en = BASE_CFG_SET; + } + if (handle->baseAddress->I2C_RX_ADDR.BIT.rx_rw == I2C_OPERATION_WRITE) { + InterruptSlaveRxHandle(handle, index); /* Receive data as slave. */ + } + return; + } + handle->errorCode = BASE_STATUS_ERROR; + /* Clears interrupts and disables interrupt reporting to + facilitate switching between different working modes. */ + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + handle->state = I2C_STATE_READY; /* Changing the I2C Bus Status. */ + if (handle->userCallBack.ErrorCallback != NULL) { + handle->userCallBack.ErrorCallback(handle); + } +} + +/** + * @brief DMA Command Configuration. + * @param handle I2C handle. + * @param cmd The command type of I2C. + * @param size The number of the data to be receiving or sending. + * @retval Value of the command. + */ +static unsigned int DmaConfigCommandData(I2C_Handle *handle, I2C_CmdType cmd, unsigned int size) +{ + unsigned int temp; + /* Sets the command data. */ + if ((cmd == I2C_CMD_M_RD_TACK_S_TD_RACK) && (size == 1) && (handle->transferCount >= handle->transferSize)) { + temp = (((unsigned int)I2C_CMD_M_RD_TNACK_S_TD_RNACK << I2C_TXFIFO_CMD_POS) & I2C_TXFIFO_CMD_MASK); + } else { + temp = (((unsigned int)cmd << I2C_TXFIFO_CMD_POS) & I2C_TXFIFO_CMD_MASK); + } + return temp; +} + +/** + * @brief Config commands and data in dma as master. + * @param handle I2C handle. + * @param txBuff Address of the data buff to be receiving or sending. + * @param cmd The command type of I2C. + * @param size The number of the data to be receiving or sending. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType DmaMasterConfigDataAndCmd(I2C_Handle *handle, unsigned int *txBuff, I2C_CmdType cmd, + unsigned int size) +{ + unsigned int temp; + unsigned int *tempTxBuff = txBuff; + unsigned char *tempsrcTxBuff = (unsigned char*)handle->transferBuff; + unsigned int tempSize = size; + while (tempSize) { + /* Sets the command data. */ + temp = DmaConfigCommandData(handle, cmd, tempSize); + /* Sets the normal data. */ + if (cmd == I2C_CMD_M_TD_RACK_S_RD_TACK) { + temp |= (((unsigned int)*tempsrcTxBuff << I2C_TXFIFO_WDATA_POS) & I2C_TXFIFO_WDATA_MASK); + tempsrcTxBuff++; + } else if ((cmd == I2C_CMD_M_RD_TACK_S_TD_RACK) && (tempSize > 1)) { + temp |= ((0x0 << I2C_TXFIFO_WDATA_POS) & I2C_TXFIFO_WDATA_MASK); + } + *tempTxBuff = temp; /* Set the combined data. */ + tempTxBuff++; + tempSize--; + temp = 0; + } + return BASE_STATUS_OK; +} + +/** + * @brief Config commands and data in dma as slave. + * @param handle I2C handle. + * @param txBuff Address of the data buff to be receiving or sending. + * @param cmd The command type of I2C. + * @param size The number of the data to be receiving or sending. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType DmaSlaveConfigDataAndCmd(I2C_Handle *handle, unsigned int *txBuff, I2C_CmdType cmd, + unsigned int size) +{ + unsigned int temp; + unsigned int *tempTxBuff = txBuff; + unsigned char *tempsrcTxBuff = (unsigned char*)handle->transferBuff; + unsigned int tempSize = size; + while (tempSize) { + /* Sets the command data. */ + temp = DmaConfigCommandData(handle, cmd, tempSize); + /* Sets the normal data. */ + if (cmd == I2C_CMD_M_RD_TACK_S_TD_RACK) { + temp |= (((unsigned int)*tempsrcTxBuff << I2C_TXFIFO_WDATA_POS) & I2C_TXFIFO_WDATA_MASK); + tempsrcTxBuff++; + } else if (cmd == I2C_CMD_M_TD_RACK_S_RD_TACK) { + temp |= ((0x0 << I2C_TXFIFO_WDATA_POS) & I2C_TXFIFO_WDATA_MASK); + } + *tempTxBuff = temp; /* Set the combined data. */ + tempTxBuff++; + tempSize--; + temp = 0; + } + return BASE_STATUS_OK; +} + +/** + * @brief I2C DMA Error Handling. + * @param handle I2C handle. + * @retval None. + */ +static void I2C_DmaErrorHandle(I2C_Handle *handle) +{ + /* Some settings when an error occurs. */ + handle->baseAddress->I2C_CTRL1.BIT.dma_operation = I2C_DMA_OP_NONE; + handle->baseAddress->I2C_CTRL1.BIT.mst_start = BASE_CFG_UNSET; + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + handle->errorCode = BASE_STATUS_ERROR; + if (handle->userCallBack.ErrorCallback != NULL) { + handle->userCallBack.ErrorCallback(handle); + } + handle->state = I2C_STATE_READY; +} + +/** + * @brief I2C DMA completes processing. + * @param handle I2C handle. + * @retval None. + */ +static void I2C_DmaDoneHandle(I2C_Handle *handle) +{ + /* Disable the DMA operation and configure parameters. */ + handle->baseAddress->I2C_CTRL1.BIT.dma_operation = I2C_DMA_OP_NONE; + handle->baseAddress->I2C_CTRL1.BIT.mst_start = BASE_CFG_UNSET; + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + /* Call the corresponding callback function. */ + if (handle->state == I2C_STATE_BUSY_MASTER_RX || handle->state == I2C_STATE_BUSY_SLAVE_RX) { + if (handle->userCallBack.RxCplCallback != NULL) { + handle->userCallBack.RxCplCallback(handle); + } + } else if (handle->state == I2C_STATE_BUSY_MASTER_TX || handle->state == I2C_STATE_BUSY_SLAVE_TX) { + if (handle->userCallBack.TxCplCallback != NULL) { + handle->userCallBack.TxCplCallback(handle); + } + } + handle->state = I2C_STATE_READY; +} + +/** + * @brief Wait until all I2C timings are processed. + * @param handle I2C handle. + * @retval None. + */ +static void DmaWaitHandleFinish(I2C_Handle *handle) +{ + unsigned int intrRwa; + unsigned int preTick; + unsigned int curTick; + unsigned long long delta; + unsigned long long targetDelta; + + delta = 0; + preTick = DCL_SYSTICK_GetTick(); + /* Set the timeout threshold to 10000ms. */ + targetDelta = HAL_CRG_GetIpFreq(SYSTICK_BASE) / I2C_TICK_MS_DIV * handle->timeout; + + while (true) { + /* Waiting for the last DMA transfer to complete. */ + intrRwa = handle->baseAddress->I2C_INTR_RAW.reg; + /* Check for errors. */ + if ((intrRwa & (I2C_INTR_RAW_ARB_LOST_MASK | I2C_INTR_RAW_ACK_BIT_UNMATCH_MASK | + I2C_INTR_RAW_SLAVE_ACK_UNMATCH_MASK)) > 0) { + I2C_DmaErrorHandle(handle); + break; + } + /* DMA transfer completed normally. */ + if ((intrRwa & (I2C_INTR_RAW_ALL_CMD_DONE_MASK | I2C_INTR_RAW_STOP_DET_MASK)) > 0) { + I2C_DmaDoneHandle(handle); + break; + } + curTick = DCL_SYSTICK_GetTick(); + delta += curTick > preTick ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick; + if (delta >= targetDelta) { /* Check timeout. */ + return; + } + preTick = curTick; + } +} + +/** + * @brief The I2C uses the DMA completion callback function registered by the DMA module. + * @param handle I2C handle. + * @retval None. + */ +static void DmaOptStepNormalFinishFun(void *handle) +{ + I2C_ASSERT_PARAM(handle != NULL); + I2C_Handle *i2cHandle = (I2C_Handle *)(handle); + I2C_ASSERT_PARAM(IsI2CInstance(i2cHandle->baseAddress)); + + BASE_StatusType ret = BASE_STATUS_OK; + unsigned int tempOnceTransferSize; + unsigned int index; + unsigned int offset; + + /* Determine which I2C is used. */ + index = (i2cHandle->baseAddress == I2C0) ? I2C_INTERFACE_INDEX_0 : I2C_INTERFACE_INDEX_1; + offset = i2cHandle->transferCount % I2C_ONCE_TRANS_MAX_NUM; + i2cHandle->transferBuff += (offset == 0) ? I2C_ONCE_TRANS_MAX_NUM : offset; /* Update Transferred Data. */ + + if (i2cHandle->transferCount < i2cHandle->transferSize) { + /* Determine the amount of data transmitted at a time. */ + tempOnceTransferSize = (g_dmaTransferSize >= I2C_ONCE_TRANS_MAX_NUM) ? I2C_ONCE_TRANS_MAX_NUM : + g_dmaTransferSize; + g_dmaTransferSize -= tempOnceTransferSize; + i2cHandle->transferCount += tempOnceTransferSize; + /* Configuring the I2C Timing */ + if (i2cHandle->state == I2C_STATE_BUSY_MASTER_RX) { + ret = DmaMasterReadData(i2cHandle, tempOnceTransferSize, index); + } else if (i2cHandle->state == I2C_STATE_BUSY_MASTER_TX) { + ret = DmaMasterWriteData(i2cHandle, tempOnceTransferSize, index); + } else if (i2cHandle->state == I2C_STATE_BUSY_SLAVE_RX) { + ret = DmaSlaveReadData(i2cHandle, tempOnceTransferSize, index); + } else if (i2cHandle->state == I2C_STATE_BUSY_SLAVE_TX) { + ret = DmaSlaveWriteData(i2cHandle, tempOnceTransferSize, index); + } + /* Check whether errors occur. */ + if (ret != BASE_STATUS_OK) { + SetErrorHandling(handle); + } + return; + } + SetTxFIFODataAndCmd(i2cHandle, I2C_CMD_P, 0); + DmaWaitHandleFinish(i2cHandle); +} + +/** + * @brief The I2C uses the DMA error callback function registered by the DMA module. + * @param handle I2C handle. + * @retval None. + */ +static void DmaErrorHandlerFun(void *handle) +{ + I2C_ASSERT_PARAM(handle != NULL); + I2C_Handle *i2cHandle = (I2C_Handle *)(handle); + I2C_ASSERT_PARAM(IsI2CInstance(i2cHandle->baseAddress)); + /* Disable the interrupt and call the error callback function. */ + i2cHandle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + i2cHandle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + i2cHandle->errorCode = BASE_STATUS_ERROR; + if (i2cHandle->userCallBack.ErrorCallback != NULL) { + i2cHandle->userCallBack.ErrorCallback(i2cHandle); + } + /* Stop DMA channel transfer. */ + HAL_DMA_StopChannel(i2cHandle->dmaHandle, i2cHandle->txDmaCh); + if (i2cHandle->state == I2C_STATE_BUSY_MASTER_RX || i2cHandle->state == I2C_STATE_BUSY_SLAVE_RX) { + HAL_DMA_StopChannel(i2cHandle->dmaHandle, i2cHandle->rxDmaCh); + } + i2cHandle->state = I2C_STATE_READY; +} + +/** + * @brief Receive data as master by the DMA module. + * @param handle I2C handle. + * @param size Number of the data to be transmitted. + * @param index The number of I2C. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType DmaMasterReadData(I2C_Handle *handle, unsigned int size, unsigned int index) +{ + /* Combine commands and data. */ + DmaMasterConfigDataAndCmd(handle, (unsigned int *)g_internalTxBuffDMA[index], I2C_CMD_M_RD_TACK_S_TD_RACK, size); + + /* Configuring the DMA Callback Function. */ + handle->dmaHandle->userCallBack.DMA_CallbackFuns[handle->txDmaCh].ChannelFinishCallBack = NULL; + handle->dmaHandle->userCallBack.DMA_CallbackFuns[handle->txDmaCh].ChannelErrorCallBack = DmaErrorHandlerFun; + handle->dmaHandle->userCallBack.DMA_CallbackFuns[handle->rxDmaCh].ChannelFinishCallBack = DmaOptStepNormalFinishFun; + handle->dmaHandle->userCallBack.DMA_CallbackFuns[handle->rxDmaCh].ChannelErrorCallBack = DmaErrorHandlerFun; + /* Start the DMA for data transmission. */ + if (HAL_DMA_StartIT(handle->dmaHandle, (uintptr_t)g_internalTxBuffDMA[index], + (uintptr_t)&(handle->baseAddress->I2C_TX_FIFO.reg), + size, handle->txDmaCh) != BASE_STATUS_OK) { + handle->state = I2C_STATE_READY; + return BASE_STATUS_ERROR; + } + if (HAL_DMA_StartIT(handle->dmaHandle, (uintptr_t)&(handle->baseAddress->I2C_RX_FIFO), + (uintptr_t)handle->transferBuff, size, + handle->rxDmaCh) != BASE_STATUS_OK) { + handle->state = I2C_STATE_READY; + return BASE_STATUS_ERROR; + } + handle->baseAddress->I2C_CTRL1.BIT.dma_operation = I2C_DMA_OP_WRITE_READ; + return BASE_STATUS_OK; +} + +/** + * @brief Transmit data as master by the DMA module. + * @param handle I2C handle. + * @param size Number of the data to be transmitted. + * @param index The number of I2C. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType DmaMasterWriteData(I2C_Handle *handle, unsigned int size, unsigned int index) +{ + /* Combine commands and data. */ + DmaMasterConfigDataAndCmd(handle, (unsigned int *)g_internalTxBuffDMA[index], I2C_CMD_M_TD_RACK_S_RD_TACK, size); + + /* Configuring the DMA Callback Function. */ + handle->dmaHandle->userCallBack.DMA_CallbackFuns[handle->txDmaCh].ChannelFinishCallBack = DmaOptStepNormalFinishFun; + handle->dmaHandle->userCallBack.DMA_CallbackFuns[handle->txDmaCh].ChannelErrorCallBack = DmaErrorHandlerFun; + /* Start the DMA for data transmission. */ + if (HAL_DMA_StartIT(handle->dmaHandle, (uintptr_t)g_internalTxBuffDMA[index], + (uintptr_t)&(handle->baseAddress->I2C_TX_FIFO.reg), + size, handle->txDmaCh) != BASE_STATUS_OK) { + handle->state = I2C_STATE_READY; + return BASE_STATUS_ERROR; + } + handle->baseAddress->I2C_CTRL1.BIT.dma_operation = I2C_DMA_OP_WRITE; + return BASE_STATUS_OK; +} + +/** + * @brief Receive data as slave by the DMA module. + * @param handle I2C handle. + * @param size Number of the data to be transmitted. + * @param index The number of I2C. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType DmaSlaveReadData(I2C_Handle *handle, unsigned int size, unsigned int index) +{ + /* Combine commands and data. */ + DmaSlaveConfigDataAndCmd(handle, (unsigned int *)g_internalTxBuffDMA[index], I2C_CMD_M_TD_RACK_S_RD_TACK, size); + + /* Configuring the DMA Callback Function. */ + handle->dmaHandle->userCallBack.DMA_CallbackFuns[handle->txDmaCh].ChannelFinishCallBack = NULL; + handle->dmaHandle->userCallBack.DMA_CallbackFuns[handle->txDmaCh].ChannelErrorCallBack = DmaErrorHandlerFun; + handle->dmaHandle->userCallBack.DMA_CallbackFuns[handle->rxDmaCh].ChannelFinishCallBack = DmaOptStepNormalFinishFun; + handle->dmaHandle->userCallBack.DMA_CallbackFuns[handle->rxDmaCh].ChannelErrorCallBack = DmaErrorHandlerFun; + /* Start the DMA for data transmission. */ + if (HAL_DMA_StartIT(handle->dmaHandle, (uintptr_t)&(handle->baseAddress->I2C_RX_FIFO), + (uintptr_t)handle->transferBuff, size, + handle->rxDmaCh) != BASE_STATUS_OK) { + handle->state = I2C_STATE_READY; + return BASE_STATUS_ERROR; + } + if (HAL_DMA_StartIT(handle->dmaHandle, (uintptr_t)g_internalTxBuffDMA[index], + (uintptr_t)&(handle->baseAddress->I2C_TX_FIFO), + size, handle->txDmaCh) != BASE_STATUS_OK) { + handle->state = I2C_STATE_READY; + return BASE_STATUS_ERROR; + } + handle->baseAddress->I2C_CTRL1.BIT.dma_operation = I2C_DMA_OP_WRITE_READ; + return BASE_STATUS_OK; +} + +/** + * @brief Transmit data as slave by the DMA module. + * @param handle I2C handle. + * @param size Number of the data to be transmitted. + * @param index The number of I2C. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType DmaSlaveWriteData(I2C_Handle *handle, unsigned int size, unsigned int index) +{ + /* Combine commands and data. */ + DmaSlaveConfigDataAndCmd(handle, (unsigned int *)g_internalTxBuffDMA[index], I2C_CMD_M_RD_TACK_S_TD_RACK, size); + /* Configure DMA Parameters */ + handle->dmaHandle->userCallBack.DMA_CallbackFuns[handle->txDmaCh].ChannelFinishCallBack = DmaOptStepNormalFinishFun; + handle->dmaHandle->userCallBack.DMA_CallbackFuns[handle->txDmaCh].ChannelErrorCallBack = DmaErrorHandlerFun; + if (HAL_DMA_StartIT(handle->dmaHandle, (uintptr_t)g_internalTxBuffDMA[index], + (uintptr_t)&(handle->baseAddress->I2C_TX_FIFO.reg), size, handle->txDmaCh) != BASE_STATUS_OK) { + handle->state = I2C_STATE_READY; + return BASE_STATUS_ERROR; + } + handle->baseAddress->I2C_CTRL1.BIT.dma_operation = I2C_DMA_OP_WRITE; + return BASE_STATUS_OK; +} + +/** + * @brief Transmit data by the DMA module. + * @param handle I2C handle. + * @param index The number of I2C. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType I2cTransferDataDma(I2C_Handle *handle, unsigned int index) +{ + BASE_StatusType ret = BASE_STATUS_OK; + unsigned int tempOnceTransferSize; + + g_dmaTransferSize = handle->transferSize; + /* Determine the amount of data transmitted at a time. */ + tempOnceTransferSize = (g_dmaTransferSize >= I2C_ONCE_TRANS_MAX_NUM) ? I2C_ONCE_TRANS_MAX_NUM : + g_dmaTransferSize; + g_dmaTransferSize -= tempOnceTransferSize; + handle->transferCount += tempOnceTransferSize; + /* Configuring the I2C Timing */ + if (handle->state == I2C_STATE_BUSY_MASTER_RX) { + ret = DmaMasterReadData(handle, tempOnceTransferSize, index); + } else if (handle->state == I2C_STATE_BUSY_MASTER_TX) { + ret = DmaMasterWriteData(handle, tempOnceTransferSize, index); + } else if (handle->state == I2C_STATE_BUSY_SLAVE_RX) { + ret = DmaSlaveReadData(handle, tempOnceTransferSize, index); + } else if (handle->state == I2C_STATE_BUSY_SLAVE_TX) { + ret = DmaSlaveWriteData(handle, tempOnceTransferSize, index); + } + /* Check whether errors occur. */ + if (ret != BASE_STATUS_OK) { + SetErrorHandling(handle); + } + return ret; +} + +/** + * @brief As Slave Multiplex Interrupt Write or Read. + * @param handle I2C handle. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +static BASE_StatusType I2C_SlaveMultiplexIT(I2C_Handle *handle) +{ + unsigned int index = 0; + /* Determine which I2C is used. */ + index = (handle->baseAddress == I2C0) ? I2C_INTERFACE_INDEX_0 : I2C_INTERFACE_INDEX_1; + /* Parameter Settings. */ + g_internalConfigParam[index].txReadCmdCnt = 0; + g_internalConfigParam[index].sendAddressStatus = I2C_SEND_ADDR_STATUS_NONE; + /* Clean interrupt */ + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + /* Startup Control */ + handle->baseAddress->I2C_CTRL1.BIT.dma_operation = I2C_DMA_OP_NONE; + handle->baseAddress->I2C_CTRL1.BIT.rst_rx_fifo = BASE_CFG_SET; + handle->baseAddress->I2C_CTRL1.BIT.rst_tx_fifo = BASE_CFG_SET; + /* Enable interrupt */ + handle->baseAddress->I2C_INTR_EN.reg = I2C_CFG_INTERRUPT_SLAVE; + return BASE_STATUS_OK; +} + +/** + * @brief Initializing the I2C Module. + * @param handle I2C handle. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_Init(I2C_Handle *handle) +{ + unsigned int clockFreq; + unsigned int val; + unsigned int tempReg; + unsigned int temp; + unsigned int tempSclLowTime; + unsigned int tempSclHighTime; + + I2C_ASSERT_PARAM(handle != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + + clockFreq = HAL_CRG_GetIpFreq((void *)handle->baseAddress); + if (CheckAllInitParameters(handle, clockFreq) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + + handle->state = I2C_STATE_BUSY; + /* Clears interrupts and disables interrupt reporting to facilitate switching between different working modes. */ + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + + /* Set SDA and SCL glitch filtering time. */ + handle->baseAddress->I2C_FILTER.BIT.spike_filter_time = handle->handleEx.spikeFilterTime; + /* Set SCL high and low duratiom time */ + tempSclLowTime = I2C_FREQ_LOW_PARAMTER + handle->handleEx.spikeFilterTime; + tempSclHighTime = I2C_FREQ_HIGH_PARAMTER + handle->handleEx.spikeFilterTime; + if (handle->freq <= I2C_STANDARD_FREQ_TH) { + /* scl_high_time = (fclk_i2c/fSCL) x 0.5 - 8 - spike_filter_time. */ + val = clockFreq / (handle->freq * 2) - tempSclHighTime; /* The clockFreq / (freq * 2) = cloclFreq/0.5/freq. */ + /* scl_low_time = (fclk_i2c/fSCL) x 0.5 - 9 - spike_filter_time. */ + val = ((val - 1) & LOW_HOLD_TIME_MASK) | ((val << HIGH_HOLD_TIME_POS) & HIGH_HOLD_TIME_MASK); + } else { + /* scl_high_time = (fclk_i2c/fSCL) x 0.36 - 8 - spike_filter_time. (n/100*36)=0.36n. */ + val = ((((clockFreq / 100) * 36) / handle->freq) - tempSclHighTime) << HIGH_HOLD_TIME_POS; + /* scl_low_time = (fclk_i2c/fSCL) x 0.64 - 9 - spike_filter_time. (n/100*64)=0.64n. */ + val |= (((((clockFreq / 100) * 64) / handle->freq) - tempSclLowTime) & LOW_HOLD_TIME_MASK); + } + handle->baseAddress->I2C_SCL_CFG.reg = val; + + /* Set sda hold duration.The value is fixed to 0xa */ + temp = ((handle->sdaHoldTime & 0x0000FFFF) << I2C_SDA_HOLD_DURATION_POS); + tempReg = (handle->handleEx.sdaDelayTime & 0x0000000F) | temp; + handle->baseAddress->I2C_SDA_CFG.reg = tempReg; + + /* Set I2C TX FIFO watermark */ + handle->baseAddress->I2C_TX_WATERMARK.BIT.tx_watermark = handle->txWaterMark; + /* Set I2C RX FIFO watermark */ + handle->baseAddress->I2C_RX_WATERMARK.BIT.rx_watermark = handle->rxWaterMark; + handle->baseAddress->I2C_MODE.BIT.mst_slv_function = handle->functionMode; + handle->baseAddress->I2C_MODE.BIT.rack_mode = handle->ignoreAckFlag; + + if (handle->functionMode == I2C_MODE_SELECT_SLAVE_ONLY || handle->functionMode == I2C_MODE_SELECT_MASTER_SLAVE) { + /* Sets the first own address of the slave. */ + handle->baseAddress->I2C_OWN_ADDR.BIT.own_address = handle->slaveOwnAddress; + handle->baseAddress->I2C_OWN_ADDR.BIT.i2c_general_call_en = handle->generalCallMode; + /* Sets the second own address of the slave. */ + if (handle->handleEx.slaveOwnXmbAddressEnable == BASE_CFG_ENABLE) { + handle->baseAddress->XMB_DEV_ADDR.BIT.xmb_address_en = BASE_CFG_ENABLE; + handle->baseAddress->XMB_DEV_ADDR.BIT.xmb_address = handle->handleEx.slaveOwnXmbAddress; + } + } + handle->state = I2C_STATE_READY; + return BASE_STATUS_OK; +} + +/** + * @brief Deinitialize the I2C module. + * @param handle I2C handle. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_Deinit(I2C_Handle *handle) +{ + I2C_ASSERT_PARAM(handle != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + + handle->state = I2C_STATE_BUSY; + /* Disable */ + handle->baseAddress->I2C_MODE.BIT.mst_slv_function = I2C_MODE_SELECT_NONE; + /* Clears interrupts and disables interrupt reporting to + facilitate switching between different working modes. */ + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + /* Clean interrupt callback functions. */ + handle->userCallBack.TxCplCallback = NULL; + handle->userCallBack.RxCplCallback = NULL; + handle->userCallBack.ErrorCallback = NULL; + handle->state = I2C_STATE_RESET; + + return BASE_STATUS_OK; +} + +/** + * @brief Callback Function Registration. + * @param handle I2C handle. + * @param callbackID Callback function ID. + * @param pcallback Pointer to the address of the registered callback function. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_RegisterCallback(I2C_Handle *handle, I2C_CallbackId callbackID, I2C_CallbackFunType pcallback) +{ + BASE_StatusType ret = BASE_STATUS_OK; + /* Check the parameter validity. */ + I2C_ASSERT_PARAM(handle != NULL && pcallback != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_ASSERT_PARAM(pcallback != NULL); + + if (handle->state == I2C_STATE_READY) { + switch (callbackID) { + case I2C_MASTER_TX_COMPLETE_CB_ID : + case I2C_SLAVE_TX_COMPLETE_CB_ID : + handle->userCallBack.TxCplCallback = pcallback; /* Invoke the transfer completion callback function. */ + break; + case I2C_MASTER_RX_COMPLETE_CB_ID : + case I2C_SLAVE_RX_COMPLETE_CB_ID : + handle->userCallBack.RxCplCallback = pcallback; /* Invoke the receive completion callback function. */ + break; + case I2C_ERROR_CB_ID : + handle->userCallBack.ErrorCallback = pcallback; /* Invoke the error callback function. */ + break; + default: + ret = BASE_STATUS_ERROR; + handle->errorCode = BASE_STATUS_ERROR; + break; + } + } else { /* If I2C state is not ready, don't invoke callback function. */ + ret = BASE_STATUS_ERROR; + handle->errorCode = BASE_STATUS_ERROR; + } + return ret; +} + +/** + * @brief Receiving data in blocking mode. + * @param handle I2C handle. + * @param devAddr Slave Device Address. + * @param rData Address of the data buff to be receiving. + * @param dataSize Number of the data to be receiving. + * @param timeout Timeout period,unit: ms. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_MasterReadBlocking(I2C_Handle *handle, unsigned short devAddr, unsigned char *rData, + unsigned int dataSize, unsigned int timeout) +{ + I2C_ASSERT_PARAM(handle != NULL && rData != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_PARAM_CHECK_WITH_RET(devAddr <= I2C_MAX_DEV_ADDR, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(timeout > 0, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(handle->state == I2C_STATE_READY, BASE_STATUS_ERROR); + + BASE_StatusType ret; + unsigned int index = 0; + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + + /* Determine which I2C is used. */ + index = (handle->baseAddress == I2C0) ? I2C_INTERFACE_INDEX_0 : I2C_INTERFACE_INDEX_1; + /* Waiting for the i2c bus to be idle. */ + ret = WaitStatusReady(handle, I2C_BUS_IS_FREE, I2C_SEND_ADDR_STATUS_WRITE); + if (ret != BASE_STATUS_OK) { + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; + } + /* Configuring I2C Parameters. */ + handle->state = I2C_STATE_BUSY_MASTER_RX; + handle->transferBuff = rData; + handle->transferSize = dataSize; + handle->transferCount = 0; + handle->timeout = timeout; + SetSlaveDevAddr(handle, devAddr); + + /* step1 : Parameter Settings and startup Control. */ + ret = I2C_ConfigParametersAndStartBlocking(handle, I2C_MASTER_STATUS); + if (ret != BASE_STATUS_OK) { + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; + } + /* step2 : Send slave address and read command. */ + ret = SendSlaveAddressReadCmd(handle, index); + if (ret != BASE_STATUS_OK) { + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; + } + /* step3 : start receive data. */ + ret = BlockingMasterRxDataOptStepNormal(handle); + if (ret != BASE_STATUS_OK) { + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; + } + /* step4 :send stop CMD. */ + ret = BlockingSendStopCommand(handle); + + return ret; +} + +/** + * @brief Send data in blocking mode. + * @param handle I2C handle. + * @param devAddr Slave Device Address. + * @param wData Address of the data buff to be sent. + * @param dataSize Number of the data to be sent. + * @param timeout Timeout period,unit: ms. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_MasterWriteBlocking(I2C_Handle *handle, unsigned short devAddr, unsigned char *wData, + unsigned int dataSize, unsigned int timeout) +{ + I2C_ASSERT_PARAM(handle != NULL && wData != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_PARAM_CHECK_WITH_RET(devAddr <= I2C_MAX_DEV_ADDR, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(timeout > 0, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(handle->state == I2C_STATE_READY, BASE_STATUS_ERROR); + + BASE_StatusType ret = BASE_STATUS_OK; + unsigned int index; + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + + /* Determine which I2C is used. */ + index = (handle->baseAddress == I2C0) ? I2C_INTERFACE_INDEX_0 : I2C_INTERFACE_INDEX_1; + + /* Configuring I2C Parameters. */ + handle->state = I2C_STATE_BUSY_MASTER_TX; + handle->transferBuff = wData; + handle->transferSize = dataSize; + handle->transferCount = 0; + handle->timeout = timeout; + SetSlaveDevAddr(handle, devAddr); + + /* Waiting for the i2c bus to be idle. */ + ret = WaitStatusReady(handle, I2C_BUS_IS_FREE, I2C_SEND_ADDR_STATUS_READ); + if (ret != BASE_STATUS_OK) { + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; + } + + /* step1 : Parameter Settings and startup Control. */ + ret = I2C_ConfigParametersAndStartBlocking(handle, I2C_MASTER_STATUS); + if (ret != BASE_STATUS_OK) { + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; + } + /* step2 : send slave addr */ + ret = SendSlaveAddressWriteCmd(handle, index); + if (ret != BASE_STATUS_OK) { + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; + } + /* step3 : Send to slave data */ + ret = BlockingMasterTxDataOptStepNormal(handle); + if (ret != BASE_STATUS_OK) { + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; + } + /* step4 : send stop CMD */ + ret = BlockingSendStopCommand(handle); + + return ret; +} + +/** + * @brief Receiving data in blocking mode as slave. + * @param handle I2C handle. + * @param rData Address of the data buff to be receiving. + * @param dataSize Number of the data to be receiving. + * @param timeout Timeout period,unit: ms. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_SlaveReadBlocking(I2C_Handle *handle, unsigned char *rData, + unsigned int dataSize, unsigned int timeout) +{ + I2C_ASSERT_PARAM(handle != NULL && rData != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(timeout > 0, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(handle->state == I2C_STATE_READY, BASE_STATUS_ERROR); + + BASE_StatusType ret = BASE_STATUS_OK; + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + + /* Configuring I2C Parameters. */ + handle->state = I2C_STATE_BUSY_SLAVE_RX; + handle->transferBuff = rData; + handle->transferSize = dataSize; + handle->transferCount = 0; + handle->timeout = timeout; + + /* step1 : Parameter Settings. */ + I2C_ConfigParametersAndStartBlocking(handle, I2C_SLAVE_STATUS); + /* step2 : Waiting for slave address match. */ + ret = WaitStatusReady(handle, SLAVE_ADDRESS_MATCH, I2C_OPERATION_WRITE); + if (ret != BASE_STATUS_OK) { + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; + } + /* step3 : Slave receives data from the master device. */ + ret = BlockingSlaveRxDataOptStepNormal(handle); + if (ret != BASE_STATUS_OK) { + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; + } + /* step4 : Send stop CMD */ + ret = BlockingSendStopCommand(handle); + + return ret; +} + +/** + * @brief Send data in blocking mode as slave. + * @param handle I2C handle. + * @param wData Address of the data buff to be sent. + * @param dataSize Number of the data to be sent. + * @param timeout Timeout period,unit: ms. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_SlaveWriteBlocking(I2C_Handle *handle, unsigned char *wData, + unsigned int dataSize, unsigned int timeout) +{ + I2C_ASSERT_PARAM(handle != NULL && wData != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(timeout > 0, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(handle->state == I2C_STATE_READY, BASE_STATUS_ERROR); + + BASE_StatusType ret = BASE_STATUS_OK; + /* Clean interrupt */ + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + + /* Configuring Transmission Parameters of I2C. */ + handle->state = I2C_STATE_BUSY_SLAVE_TX; + handle->transferBuff = wData; + handle->transferSize = dataSize; + handle->transferCount = 0; + handle->timeout = timeout; + + /* Parameter Settings. */ + I2C_ConfigParametersAndStartBlocking(handle, I2C_SLAVE_STATUS); + + /* step1 : Waiting for slave address match. */ + ret = WaitStatusReady(handle, SLAVE_ADDRESS_MATCH, I2C_OPERATION_READ); + if (ret != BASE_STATUS_OK) { + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; + } + /* step2 : Slave send data to the master device. */ + while (handle->transferCount < (handle->transferSize - 1)) { + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_M_RD_TACK_S_TD_RACK, *handle->transferBuff); + if (ret != BASE_STATUS_OK) { + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; + } + handle->transferBuff++; + handle->transferCount++; + } + /* step3 : Slave send last data without ack to the master device. */ + if (handle->transferCount == (handle->transferSize - 1)) { + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_M_RD_TNACK_S_TD_RNACK, *handle->transferBuff); + if (ret != BASE_STATUS_OK) { + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; + } + } + /* step4 : send stop CMD */ + ret = BlockingSendStopCommand(handle); + + return ret; +} + +/** + * @brief Receiving data in interrupts mode. + * @param handle I2C handle. + * @param devAddr Slave Device Address. + * @param rData Address of the data buff to be receiving. + * @param dataSize Number of the data to be receiving. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_MasterReadIT(I2C_Handle *handle, unsigned short devAddr, + unsigned char *rData, unsigned int dataSize) +{ + I2C_ASSERT_PARAM(handle != NULL && rData != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_PARAM_CHECK_WITH_RET(devAddr <= I2C_MAX_DEV_ADDR, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(handle->state == I2C_STATE_READY, BASE_STATUS_ERROR); + + unsigned int index; + /* Determine which I2C is used. */ + index = (handle->baseAddress == I2C0) ? I2C_INTERFACE_INDEX_0 : I2C_INTERFACE_INDEX_1; + + /* Configuring I2C Parameters. */ + handle->state = I2C_STATE_BUSY_MASTER_RX; + handle->transferBuff = rData; + handle->transferSize = dataSize; + handle->transferCount = 0; + SetSlaveDevAddr(handle, devAddr); + g_internalConfigParam[index].txReadCmdCnt = 0; + g_internalConfigParam[index].sendAddressStatus = I2C_SEND_ADDR_STATUS_READ; + + /* Clean interrupt */ + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + + /* Startup Control */ + handle->baseAddress->I2C_CTRL1.BIT.dma_operation = I2C_DMA_OP_NONE; + handle->baseAddress->I2C_CTRL1.BIT.rst_rx_fifo = BASE_CFG_SET; + handle->baseAddress->I2C_CTRL1.BIT.rst_tx_fifo = BASE_CFG_SET; + handle->baseAddress->I2C_CTRL1.BIT.mst_start = BASE_CFG_SET; + + /* Enable interrupt */ + handle->baseAddress->I2C_INTR_EN.reg = I2C_CFG_INTERRUPT_MASTER_RX; + + return BASE_STATUS_OK; +} + +/** + * @brief Send data in interrupts mode. + * @param handle I2C handle. + * @param devAddr Slave Device Address. + * @param wData Address of the data buff to be sent. + * @param dataSize Number of the data to be sent. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_MasterWriteIT(I2C_Handle *handle, unsigned short devAddr, + unsigned char *wData, unsigned int dataSize) +{ + I2C_ASSERT_PARAM(handle != NULL && wData != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_PARAM_CHECK_WITH_RET(devAddr <= I2C_MAX_DEV_ADDR, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(handle->state == I2C_STATE_READY, BASE_STATUS_ERROR); + + unsigned int index; + /* Determine which I2C is used. */ + index = (handle->baseAddress == I2C0) ? I2C_INTERFACE_INDEX_0 : I2C_INTERFACE_INDEX_1; + + /* Configuring I2C Parameters. */ + handle->state = I2C_STATE_BUSY_MASTER_TX; + handle->transferBuff = wData; + handle->transferSize = dataSize; + handle->transferCount = 0; + SetSlaveDevAddr(handle, devAddr); + g_internalConfigParam[index].txReadCmdCnt = 0; + g_internalConfigParam[index].sendAddressStatus = I2C_SEND_ADDR_STATUS_WRITE; + + /* Clean interrupt */ + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_RAW_ALL_DISABLE; + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + + /* Startup Control */ + handle->baseAddress->I2C_CTRL1.BIT.dma_operation = I2C_DMA_OP_NONE; + handle->baseAddress->I2C_CTRL1.BIT.rst_rx_fifo = BASE_CFG_SET; + handle->baseAddress->I2C_CTRL1.BIT.rst_tx_fifo = BASE_CFG_SET; + handle->baseAddress->I2C_CTRL1.BIT.mst_start = BASE_CFG_SET; + + /* Enable interrupt */ + handle->baseAddress->I2C_INTR_EN.reg = I2C_CFG_INTERRUPT_MASTER_TX; + + return BASE_STATUS_OK; +} + +/** + * @brief Receiving data in interrupts mode as slave. + * @param handle I2C handle. + * @param rData Address of the data buff to be receiving. + * @param dataSize Number of the data to be receiving. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_SlaveReadIT(I2C_Handle *handle, unsigned char *rData, unsigned int dataSize) +{ + BASE_StatusType ret = BASE_STATUS_OK; + + I2C_ASSERT_PARAM(handle != NULL && rData != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(handle->state == I2C_STATE_READY, BASE_STATUS_ERROR); + + /* Configuring Transmission Parameters of I2C. */ + handle->state = I2C_STATE_BUSY_SLAVE_RX; + handle->transferBuff = rData; + handle->transferSize = dataSize; + handle->transferCount = 0; + + /* Configuring the I2C Timing */ + ret = I2C_SlaveMultiplexIT(handle); + + return ret; +} + +/** + * @brief Send data in interrupts mode as slave. + * @param handle I2C handle. + * @param wData Address of the data buff to be sent. + * @param dataSize Number of the data to be sent. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_SlaveWriteIT(I2C_Handle *handle, unsigned char *wData, unsigned int dataSize) +{ + BASE_StatusType ret = BASE_STATUS_OK; + + I2C_ASSERT_PARAM(handle != NULL && wData != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(handle->state == I2C_STATE_READY, BASE_STATUS_ERROR); + + /* Configuring Transmission Parameters of I2C. */ + handle->state = I2C_STATE_BUSY_SLAVE_TX; + handle->transferBuff = wData; + handle->transferSize = dataSize; + handle->transferCount = 0; + + /* Configuring the I2C Timing */ + ret = I2C_SlaveMultiplexIT(handle); + return ret; +} + +/** + * @brief Receiving data in DMA mode. + * @param handle I2C handle. + * @param devAddr Slave Device Address. + * @param rData Address of the data buff to be receiving. + * @param dataSize Number of the data to be receiving. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_MasterReadDMA(I2C_Handle *handle, unsigned short devAddr, + unsigned char *rData, unsigned int dataSize) +{ + I2C_ASSERT_PARAM(handle != NULL && rData != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + /* Check the DMA transfer handle and channel. */ + I2C_ASSERT_PARAM(handle->dmaHandle != NULL); + I2C_PARAM_CHECK_WITH_RET((handle->txDmaCh < CHANNEL_MAX_NUM), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET((handle->rxDmaCh < CHANNEL_MAX_NUM), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET((handle->rxDmaCh != handle->txDmaCh), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(devAddr <= I2C_MAX_DEV_ADDR, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(handle->state == I2C_STATE_READY, BASE_STATUS_ERROR); + + BASE_StatusType ret = BASE_STATUS_OK; + + unsigned int index; + /* Determine which I2C is used. */ + index = (handle->baseAddress == I2C0) ? I2C_INTERFACE_INDEX_0 : I2C_INTERFACE_INDEX_1; + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + + /* Configuring I2C Parameters. */ + handle->state = I2C_STATE_BUSY_MASTER_RX; + handle->transferBuff = rData; + handle->transferSize = dataSize; + handle->transferCount = 0; + SetSlaveDevAddr(handle, devAddr); + + /* Waiting for the i2c bus to be idle. */ + ret = WaitStatusReady(handle, I2C_BUS_IS_FREE, I2C_SEND_ADDR_STATUS_READ); + if (ret != BASE_STATUS_OK) { + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; + } + + /* Startup Control */ + handle->baseAddress->I2C_CTRL1.BIT.rst_rx_fifo = BASE_CFG_SET; + handle->baseAddress->I2C_CTRL1.BIT.rst_tx_fifo = BASE_CFG_SET; + handle->baseAddress->I2C_CTRL1.BIT.mst_start = BASE_CFG_SET; + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_S, 0); /* Sets the start command to be sent. */ + if (ret != BASE_STATUS_OK) { + SetErrorHandling(handle); + return ret; + } + ret = SendSlaveAddressReadCmd(handle, index); /* Send Address to Slave. */ + if (ret != BASE_STATUS_OK) { + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; + } + ret = I2cTransferDataDma(handle, index); + return ret; +} + +/** + * @brief Send data in DMA mode. + * @param handle I2C handle. + * @param devAddr Slave Device Address. + * @param wData Address of the data buff to be sent. + * @param dataSize Number of the data to be sent. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_MasterWriteDMA(I2C_Handle *handle, unsigned short devAddr, + unsigned char *wData, unsigned int dataSize) +{ + I2C_ASSERT_PARAM(handle != NULL && wData != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + /* Check the DMA transfer handle and channel. */ + I2C_ASSERT_PARAM(handle->dmaHandle != NULL); + I2C_PARAM_CHECK_WITH_RET((handle->txDmaCh < CHANNEL_MAX_NUM), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(devAddr <= I2C_MAX_DEV_ADDR, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(handle->state == I2C_STATE_READY, BASE_STATUS_ERROR); + + BASE_StatusType ret = BASE_STATUS_OK; + unsigned int index; + /* Determine which I2C is used. */ + index = (handle->baseAddress == I2C0) ? I2C_INTERFACE_INDEX_0 : I2C_INTERFACE_INDEX_1; + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + + /* Waiting for the i2c bus to be idle. */ + ret = WaitStatusReady(handle, I2C_BUS_IS_FREE, I2C_SEND_ADDR_STATUS_READ); + if (ret != BASE_STATUS_OK) { + handle->errorCode = ret; + SetErrorHandling(handle); + return ret; + } + /* Configuring I2C Parameters. */ + handle->state = I2C_STATE_BUSY_MASTER_TX; + handle->transferBuff = wData; + handle->transferSize = dataSize; + handle->transferCount = 0; + SetSlaveDevAddr(handle, devAddr); + + /* Startup Control */ + handle->baseAddress->I2C_CTRL1.BIT.rst_rx_fifo = BASE_CFG_SET; + handle->baseAddress->I2C_CTRL1.BIT.rst_tx_fifo = BASE_CFG_SET; + handle->baseAddress->I2C_CTRL1.BIT.mst_start = BASE_CFG_SET; + /* Send I2C start */ + ret = SetTxFIFODataAndCmd(handle, I2C_CMD_S, 0); /* Sets the start command to be sent. */ + if (ret != BASE_STATUS_OK) { + SetErrorHandling(handle); + return ret; + } + /* send slave addr */ + ret = SendSlaveAddressWriteCmd(handle, index); + if (ret != BASE_STATUS_OK) { + SetErrorHandling(handle); + return ret; + } + ret = I2cTransferDataDma(handle, index); + + return ret; +} + +/** + * @brief Receiving data in DMA mode as slave. + * @param handle I2C handle. + * @param rData Address of the data buff to be receiving. + * @param dataSize Number of the data to be receiving. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_SlaveReadDMA(I2C_Handle *handle, unsigned char *rData, unsigned int dataSize) +{ + I2C_ASSERT_PARAM(handle != NULL && rData != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + /* Check the DMA transfer handle and channel. */ + I2C_ASSERT_PARAM(handle->dmaHandle != NULL); + I2C_PARAM_CHECK_WITH_RET((handle->txDmaCh < CHANNEL_MAX_NUM), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET((handle->rxDmaCh < CHANNEL_MAX_NUM), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET((handle->rxDmaCh != handle->txDmaCh), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(handle->state == I2C_STATE_READY, BASE_STATUS_ERROR); + + BASE_StatusType ret = BASE_STATUS_OK; + unsigned int index; + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + /* Configuring Transmission Parameters of I2C. */ + handle->state = I2C_STATE_BUSY_SLAVE_RX; + handle->transferSize = dataSize; + handle->transferBuff = rData; + handle->transferCount = 0; + + /* Startup Control */ + handle->baseAddress->I2C_CTRL1.BIT.rst_rx_fifo = BASE_CFG_SET; + handle->baseAddress->I2C_CTRL1.BIT.rst_tx_fifo = BASE_CFG_SET; + handle->baseAddress->I2C_CTRL1.BIT.mst_start = BASE_CFG_UNSET; + ret = WaitStatusReady(handle, SLAVE_ADDRESS_MATCH, I2C_OPERATION_WRITE); /* Waiting to match master. */ + if (ret != BASE_STATUS_OK) { + SetErrorHandling(handle); + return ret; + } + + /* Determine which I2C is used. */ + index = (handle->baseAddress == I2C0) ? I2C_INTERFACE_INDEX_0 : I2C_INTERFACE_INDEX_1; + I2cTransferDataDma(handle, index); + return ret; +} + +/** + * @brief Send data in DMA mode as slave. + * @param handle I2C handle. + * @param wData Address of the data buff to be sent. + * @param dataSize Number of the data to be sent. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_SlaveWriteDMA(I2C_Handle *handle, unsigned char *wData, unsigned int dataSize) +{ + I2C_ASSERT_PARAM(handle != NULL && wData != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + /* Check the DMA transfer handle and channel. */ + I2C_ASSERT_PARAM(handle->dmaHandle != NULL); + I2C_PARAM_CHECK_WITH_RET((handle->txDmaCh < CHANNEL_MAX_NUM), BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + I2C_PARAM_CHECK_WITH_RET(handle->state == I2C_STATE_READY, BASE_STATUS_ERROR); + + BASE_StatusType ret = BASE_STATUS_OK; + unsigned int index; + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + /* Configuring Transmission Parameters of I2C. */ + handle->state = I2C_STATE_BUSY_SLAVE_TX; + handle->transferSize = dataSize; + handle->transferBuff = wData; + handle->transferCount = 0; + + /* Startup Control */ + handle->baseAddress->I2C_CTRL1.BIT.rst_rx_fifo = BASE_CFG_SET; + handle->baseAddress->I2C_CTRL1.BIT.rst_tx_fifo = BASE_CFG_SET; + handle->baseAddress->I2C_CTRL1.BIT.mst_start = BASE_CFG_UNSET; + /* Waiting for slave address match. */ + ret = WaitStatusReady(handle, SLAVE_ADDRESS_MATCH, I2C_OPERATION_READ); + if (ret != BASE_STATUS_OK) { + SetErrorHandling(handle); + return ret; + } + /* Determine which I2C is used. */ + index = (handle->baseAddress == I2C0) ? I2C_INTERFACE_INDEX_0 : I2C_INTERFACE_INDEX_1; + I2cTransferDataDma(handle, index); + return ret; +} + +/** + * @brief Interrupt Handling Function. + * @param handle Handle pointers + * @retval None + */ +void HAL_I2C_IrqHandler(void *handle) +{ + I2C_Handle *i2cHandle = (I2C_Handle *)handle; + I2C_ASSERT_PARAM(i2cHandle != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(i2cHandle->baseAddress)); + + unsigned int status; + unsigned int index; + + status = i2cHandle->baseAddress->I2C_INTR_STAT.reg; + i2cHandle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + if (IsInterruptErrorStatus(i2cHandle, status)) { + return; + } + /* Determine which I2C is used. */ + index = (i2cHandle->baseAddress == I2C0) ? I2C_INTERFACE_INDEX_0 : I2C_INTERFACE_INDEX_1; + /* Callback interrupt handler function. */ + InterruptHandle(i2cHandle, status, index); + if ((i2cHandle->transferCount >= i2cHandle->transferSize) && + (!(status & (I2C_INTR_RAW_ALL_CMD_DONE_MASK | I2C_INTR_RAW_STOP_DET_MASK)))) { + if (i2cHandle->baseAddress->I2C_FIFO_STAT.BIT.tx_fifo_vld_num < I2C_MAX_FIFO_SIZE) { + i2cHandle->baseAddress->I2C_TX_FIFO.reg = + (((unsigned int)I2C_CMD_P << I2C_TXFIFO_CMD_POS) & I2C_TXFIFO_CMD_MASK); + i2cHandle->baseAddress->I2C_INTR_EN.BIT.tx_fifo_not_full_en = BASE_CFG_DISABLE; + i2cHandle->transferCount++; + } + } + /* After all data transmission is complete, call the user's callback function. */ + InterruptAllDoneHandle(i2cHandle, status); +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/i2c/src/i2c_ex.c b/vendor/others/demo/5-tim_adc/demo/drivers/i2c/src/i2c_ex.c new file mode 100644 index 000000000..29e584d5e --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/i2c/src/i2c_ex.c @@ -0,0 +1,166 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file i2c_ex.c + * @author MCU Driver Team + * @brief I2C module driver + * @details The header file contains the following declaration: + * + Setting the Special Function Configuration. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "i2c_ex.h" + +/* Macro definitions ---------------------------------------------------------*/ + +/** + * @brief Set data transfer sequence. + * @param handle: I2C handle. + * @param sequence: data transfer sequence enumeration value. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_SetDataTransferSequenceEx(I2C_Handle *handle, I2C_DataTransferSequenceType sequence) +{ + I2C_ASSERT_PARAM(handle != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_PARAM_CHECK_WITH_RET(IsI2cDataTransferSequence(sequence), BASE_STATUS_ERROR); + /**< Data Transfer Sequence. 0:I2C_BIG_BIT_FIRST, 1:I2C_LITTLE_BIT_FIRST. */ + handle->baseAddress->I2C_MODE.BIT.lit_end = sequence; + return BASE_STATUS_OK; +} + +/** + * @brief Set I2C clock stretching function. + * @param handle: I2C handle. + * @param clkStretch: clock stretching enumeration value. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_SetSclStretchModeEx(I2C_Handle *handle, I2C_ClockStretchType clkStretch) +{ + I2C_ASSERT_PARAM(handle != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_PARAM_CHECK_WITH_RET(IsI2cClockStretchValue(clkStretch), BASE_STATUS_ERROR); + /**< Clock stretching enable. 0:enable, 1:disable. */ + handle->baseAddress->I2C_MODE.BIT.scl_stretch_disable = clkStretch; + return BASE_STATUS_OK; +} + +/** + * @brief Set I2C SCL low-level timeout. + * @param handle: I2C handle. + * @param sclLowTimeout: SCL low-level timeout value. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_SetSclLowTimeoutEx(I2C_Handle *handle, unsigned int sclLowTimeout) +{ + I2C_ASSERT_PARAM(handle != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_PARAM_CHECK_WITH_RET(IsI2cSclLowTimeout(sclLowTimeout), BASE_STATUS_ERROR); + /* The unit of bus free time is I2C working clock cycle. */ + handle->baseAddress->I2C_SCL_TIMEOUT.BIT.scl_low_timeout = sclLowTimeout; + return BASE_STATUS_OK; +} + +/** + * @brief Set I2C bus idle threshold value. + * @param handle: I2C handle. + * @param busFreeTime: bus idle threshold value. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_SetBusFreeTimeEx(I2C_Handle *handle, unsigned int busFreeTime) +{ + I2C_ASSERT_PARAM(handle != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_PARAM_CHECK_WITH_RET(IsI2cBusFreeTime(busFreeTime), BASE_STATUS_ERROR); + /* The unit of bus free time is I2C working clock cycle. */ + handle->baseAddress->I2C_BUS_FREE.BIT.bus_free_time = busFreeTime; + return BASE_STATUS_OK; +} + +/** + * @brief Set I2C slave receive 10-bit slave addressing. + * @param handle: I2C handle. + * @param arg: slave special function set enumeration value. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_Set10BitSlaveEnableEx(I2C_Handle *handle) +{ + I2C_ASSERT_PARAM(handle != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + /**< Enable the slave receives the 10bit addressing. */ + handle->baseAddress->I2C_OWN_ADDR.BIT.i2c_10bit_slave_en = BASE_CFG_SET; + return BASE_STATUS_OK; +} + +/** + * @brief Set I2C slave receive device ID address. + * @param handle: I2C handle. + * @param arg: slave special function set enumeration value. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_SetDeviceIdAddressEnableEx(I2C_Handle *handle) +{ + I2C_ASSERT_PARAM(handle != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + /**< Enable the function of receiving device ID addresses. */ + handle->baseAddress->I2C_OWN_ADDR.BIT.i2c_device_id_en = BASE_CFG_SET; + return BASE_STATUS_OK; +} + +/** + * @brief Set I2C slave receive start byte address. + * @param handle: I2C handle. + * @param arg: slave special function set enumeration value. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_SetStartByteEnableEx(I2C_Handle *handle) +{ + I2C_ASSERT_PARAM(handle != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + handle->baseAddress->I2C_OWN_ADDR.BIT.i2c_start_byte_en = BASE_CFG_SET; /**< Enable receiving START Byte Address. */ + return BASE_STATUS_OK; +} + +/** + * @brief Set I2C slave own address mask. + * @param handle: I2C handle. + * @param addrMask: own address mask. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_SetOwnAddressMaskEx(I2C_Handle *handle, unsigned int addrMask) +{ + I2C_ASSERT_PARAM(handle != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_PARAM_CHECK_WITH_RET(IsI2cOwnAddressOrMask(addrMask), BASE_STATUS_ERROR); + handle->baseAddress->I2C_OWN_ADDR.BIT.own_address_mask = addrMask; /**< Slave's own address mask. */ + return BASE_STATUS_OK; +} + +/** + * @brief Set I2C slave XMBus address mask. + * @param handle: I2C handle. + * @param addrMask: XMBus address mask. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT, NOT SUPPORT. + */ +BASE_StatusType HAL_I2C_SetOwnXmbAddressMaskEx(I2C_Handle *handle, unsigned int addrMask) +{ + I2C_ASSERT_PARAM(handle != NULL); + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + I2C_PARAM_CHECK_WITH_RET(IsXMBusAddressOrMask(addrMask), BASE_STATUS_ERROR); + handle->baseAddress->XMB_DEV_ADDR.BIT.xmb_address_mask = addrMask; /**< The second own address mask as slave. */ + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/iocmg/common/iocmg.h b/vendor/others/demo/5-tim_adc/demo/drivers/iocmg/common/iocmg.h new file mode 100644 index 000000000..5127d7a69 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/iocmg/common/iocmg.h @@ -0,0 +1,92 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file iocmg.h + * @author MCU Driver Team + * @brief IOCMG module driver + * @details This file provides functions declaration of iocmg + */ +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_IOCMG_H +#define McuMagicTag_IOCMG_H + +/* Includes ------------------------------------------------------------------ */ +#include "iocmg_ip.h" +/** + * @defgroup IOCMG ICOMG + * @brief IOCMG module. + * @{ + */ + +/** + * @defgroup IOCMG_Common IOMG Common + * @brief IOCMG common external module. + * @{ + */ + +/** + * @defgroup IOCMG_Handle_Definition IOCMG Handle Definition + * @{ + */ +typedef struct { + unsigned int pinTypedef; + IOCMG_PullMode pullMode; + IOCMG_SchmidtMode schmidtMode; + IOCMG_LevelShiftRate levelShiftRate; + IOCMG_DriveRate driveRate; + IOCMG_ExtendHandle handleEx; /**< Extend handle, configuring some special parameters. */ +} IOCMG_Handle; +/** + * @} + */ + +/** + * @defgroup IOCMG_API_Declaration IOCMG HAL API + * @{ + */ +/* Exported global functions ------------------------------------------------- */ +IOCMG_Status HAL_IOCMG_Init(IOCMG_Handle* handle); +IOCMG_Status HAL_IOCMG_SetPinAltFuncMode(unsigned int pinTypedef); +IOCMG_Status HAL_IOCMG_SetPinPullMode(unsigned int pinTypedef, IOCMG_PullMode pullMode); +IOCMG_Status HAL_IOCMG_SetPinSchmidtMode(unsigned int pinTypedef, IOCMG_SchmidtMode schmidtMode); +IOCMG_Status HAL_IOCMG_SetPinLevelShiftRate(unsigned int pinTypedef, IOCMG_LevelShiftRate levelShiftRate); +IOCMG_Status HAL_IOCMG_SetPinDriveRate(unsigned int pinTypedef, IOCMG_DriveRate driveRate); + +IOCMG_Status HAL_IOCMG_SetOscClkOutputMode(bool mode); +IOCMG_Status HAL_IOCMG_SetOscClkFuncMode(bool mode); +IOCMG_Status HAL_IOCMG_SetOscClkDriveRate(IOCMG_OscClkDriveRate oscClkDriveRate); + +IOCMG_FuncMode HAL_IOCMG_GetPinAltFuncMode(unsigned int pinTypedef); +IOCMG_PullMode HAL_IOCMG_GetPinPullMode(unsigned int pinTypedef); +IOCMG_SchmidtMode HAL_IOCMG_GetPinSchmidtMode(unsigned int pinTypedef); +IOCMG_LevelShiftRate HAL_IOCMG_GetPinLevelShiftRate(unsigned int pinTypedef); +IOCMG_DriveRate HAL_IOCMG_GetPinDriveRate(unsigned int pinTypedef); +bool HAL_IOCMG_GetOscClkOutputMode(void); +bool HAL_IOCMG_GetOscClkFuncMode(void); +IOCMG_OscClkDriveRate HAL_IOCMG_GetOscClkDriveRate(void); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_IOCMG_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/iocmg/inc/iocmg_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/iocmg/inc/iocmg_ip.h new file mode 100644 index 000000000..050b4cec5 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/iocmg/inc/iocmg_ip.h @@ -0,0 +1,348 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file iocmg_ip.h + * @author MCU Driver Team + * @brief IOCMG module driver + * @details This file provides IOConfig register mapping structure. + */ + +/* Macro definitions */ +#ifndef McuMagicTag_IOCMG_IP_H +#define McuMagicTag_IOCMG_IP_H + +/* Includes ------------------------------------------------------------------ */ +#include "baseinc.h" +#include "ioconfig.h" +#include "iomap.h" +/* Macro definitions ---------------------------------------------------------*/ +#ifdef IOCMG_PARAM_CHECK + #define IOCMG_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM + #define IOCMG_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET + #define IOCMG_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else + #define IOCMG_ASSERT_PARAM(para) ((void)0U) + #define IOCMG_PARAM_CHECK_NO_RET(para) ((void)0U) + #define IOCMG_PARAM_CHECK_WITH_RET(param, ret) ((void)0U) +#endif +/** + * @addtogroup IOCMG + * @{ + */ + +/** + * @defgroup IOCMG_IP + * @{ + */ +#define IOCMG_BASE_ADDR_MASK 0xFFFF0000 +#define IOCMG_FUNC_NUM_MASK 0x0000000F +#define IOCMG_REG_VALUE_MASK 0x0000FFFF +/** + * @defgroup IOCMG_Param_Def IOCMG Parameters Definition + * @brief Description of IOCMG configuration parameters. + * @{ + */ +typedef enum { + FUNC_MODE_0 = 0u, + FUNC_MODE_1, + FUNC_MODE_2, + FUNC_MODE_3, + FUNC_MODE_4, + FUNC_MODE_5, + FUNC_MODE_6, + FUNC_MODE_7, + FUNC_MODE_8, + FUNC_MODE_9, + FUNC_MODE_10, + FUNC_MODE_11, + FUNC_MODE_12, + FUNC_MODE_13, + FUNC_MODE_14, + FUNC_MODE_15, + FUNC_MODE_MAX +} IOCMG_FuncMode; + +typedef enum { + SCHMIDT_DISABLE = 0u, + SCHMIDT_ENABLE +} IOCMG_SchmidtMode; + +typedef enum { + PULL_NONE = 0u, + PULL_DOWN, + PULL_UP, + PULL_BOTH, + PULL_MODE_MAX +} IOCMG_PullMode; + +typedef enum { + LEVEL_SHIFT_RATE_FAST = 0u, + LEVEL_SHIFT_RATE_SLOW, + LEVEL_SHIFT_RATE_MAX +} IOCMG_LevelShiftRate; + +typedef enum { + DRIVER_RATE_4 = 0u, + DRIVER_RATE_3, + DRIVER_RATE_2, + DRIVER_RATE_1, + DRIVER_RATE_MAX +} IOCMG_DriveRate; + +typedef enum { + OSC_CLK_DRIVER_RATE_1 = 0u, + OSC_CLK_DRIVER_RATE_2, + OSC_CLK_DRIVER_RATE_3, + OSC_CLK_DRIVER_RATE_4, + OSC_CLK_DRIVER_RATE_MAX +} IOCMG_OscClkDriveRate; + +typedef enum { + IOCMG_STATUS_OK, + IOCMG_BASE_ADDR_ERROR, + IOCMG_REG_ADDR_ERROR, + IOCMG_PIN_FUNC_ERROR, + IOCMG_PARAM_ERROR +} IOCMG_Status; + +/** + * @brief IOCMG extend handle, configuring some special parameters. + */ +typedef struct { +} IOCMG_ExtendHandle; +/** + * @} + */ + +/** + * @brief Set iocmg reg value. + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param regValue value of @ref IOCMG_REG. + * @retval None. + */ +static inline void DCL_IOCMG_SetRegValue(IOCMG_REG *iocmgRegx, unsigned int regValue) +{ + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + iocmgRegx->reg = regValue; +} + +/** + * @brief Get iocmg reg value. + * @param iocmgRegx Value of @ref IOCMG_REG. + * @retval None. + */ +static inline unsigned int DCL_IOCMG_GetRegValue(IOCMG_REG *iocmgRegx) +{ + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + return iocmgRegx->reg; +} + +/** + * @brief Set iocmg function number mode. + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param funcnum value of @ref IOCMG_FuncMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetFuncNum(IOCMG_REG *iocmgRegx, IOCMG_FuncMode funcnum) +{ + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + IOCMG_PARAM_CHECK_NO_RET(funcnum < FUNC_MODE_MAX && funcnum >= FUNC_MODE_0); + iocmgRegx->BIT.func = funcnum; +} + +/** + * @brief Get iocmg function number mode. + * @param iocmgRegx Value of @ref IOCMG_REG. + * @retval Value of @ref IOCMG_FuncMode. + */ +static inline IOCMG_FuncMode DCL_IOCMG_GetFuncMode(IOCMG_REG *iocmgRegx) +{ + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + return iocmgRegx->BIT.func; +} + +/** + * @brief Set iocmg drive rate mode. + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param driveRate value of @ref IOCMG_DriveRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetDriveRate(IOCMG_REG *iocmgRegx, IOCMG_DriveRate driveRate) +{ + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + IOCMG_PARAM_CHECK_NO_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4); + iocmgRegx->BIT.ds = driveRate; +} + +/** + * @brief Get iocmg drive rate mode. + * @param iocmgRegx Value of @ref IOCMG_REG. + * @retval Value of @ref IOCMG_DriveRate. + */ +static inline IOCMG_DriveRate DCL_IOCMG_GetDriveRate(IOCMG_REG *iocmgRegx) +{ + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + return iocmgRegx->BIT.ds; +} + +/** + * @brief Set iocmg pull up or down mode. + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param pullMode value of @ref IOCMG_PullMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetPullMode(IOCMG_REG *iocmgRegx, IOCMG_PullMode pullMode) +{ + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + IOCMG_PARAM_CHECK_NO_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE); + iocmgRegx->BIT.pu = (pullMode & 0x02) >> 1; /* 10b: pull up mode */ + iocmgRegx->BIT.pd = pullMode & 0x01; /* 01b: pull down mode */ +} + +/** + * @brief Get iocmg pull up or down mode. + * @param iocmgRegx Value of @ref IOCMG_REG. + * @retval pullMode value of @ref IOCMG_PullMode. + */ +static inline IOCMG_PullMode DCL_IOCMG_GetPullMode(IOCMG_REG *iocmgRegx) +{ + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + unsigned int pullUpMode = iocmgRegx->BIT.pu; + unsigned int pullDownMode = iocmgRegx->BIT.pd; + return (pullUpMode << 1) | pullDownMode; /* 1: shift for up mode bit */ +} + +/** + * @brief Set iocmg level shift rate mode. + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param levelShiftRate value of @ref IOCMG_LevelShiftRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetLevelShiftRate(IOCMG_REG *iocmgRegx, IOCMG_LevelShiftRate levelShiftRate) +{ + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + IOCMG_PARAM_CHECK_NO_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX && levelShiftRate >= LEVEL_SHIFT_RATE_FAST); + iocmgRegx->BIT.sr = levelShiftRate; +} + +/** + * @brief Get iocmg level shift rate mode. + * @param iocmgRegx Value of @ref IOCMG_REG. + * @retval levelShiftRate value of @ref IOCMG_LevelShiftRate. + */ +static inline IOCMG_LevelShiftRate DCL_IOCMG_GetLevelShiftRate(IOCMG_REG *iocmgRegx) +{ + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + return iocmgRegx->BIT.sr; +} + +/** + * @brief Set iocmg schmidt enable mode. + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param schmidtMode value of @ref IOCMG_SchmidtMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetSchmidtMode(IOCMG_REG *iocmgRegx, IOCMG_SchmidtMode schmidtMode) +{ + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + IOCMG_PARAM_CHECK_NO_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE); + iocmgRegx->BIT.se = schmidtMode; +} + +/** + * @brief Get iocmg schmidt enable mode. + * @param iocmgRegx Value of @ref IOCMG_REG. + * @retval schmidtMode value of @ref IOCMG_SchmidtMode. + */ +static inline IOCMG_SchmidtMode DCL_IOCMG_GetSchmidtMode(IOCMG_REG *iocmgRegx) +{ + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + return iocmgRegx->BIT.se; +} + +/** + * @brief set iocmg OSC clock output mode. + * @param mode function enable or not. + * @retval None. + */ +static inline void DCL_IOCMG_SetOscClkOutputMode(bool mode) +{ + IOCMG_ASSERT_PARAM(mode == BASE_CFG_ENABLE || mode == BASE_CFG_DISABLE); + SYSCTRL1->XTAL_CFG.BIT.ose_e = mode; +} + +/** + * @brief Get iocmg OSC clock output mode. + * @param None + * @retval None. + */ +static inline bool DCL_IOCMG_GetOscClkOutputMode(void) +{ + return SYSCTRL1->XTAL_CFG.BIT.ose_e; +} + +/** + * @brief set iocmg OSC clock output mode. + * @param mode function enable or not. + * @retval None. + */ +static inline void DCL_IOCMG_SetOscClkFuncMode(bool mode) +{ + IOCMG_ASSERT_PARAM(mode == BASE_CFG_ENABLE || mode == BASE_CFG_DISABLE); + SYSCTRL1->XTAL_CFG.BIT.osc_ie = mode; +} + +/** + * @brief Get iocmg OSC clock output enable mode. + * @param None. + * @retval None. + */ +static inline bool DCL_IOCMG_GetOscClkFuncMode(void) +{ + return SYSCTRL1->XTAL_CFG.BIT.osc_ie; +} + +/** + * @brief Set iocmg OSC drive rate mode. + * @param oscClkDriveRate value of @ref IOCMG_DriveRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetOscClkDriveRate(IOCMG_OscClkDriveRate oscClkDriveRate) +{ + IOCMG_PARAM_CHECK_NO_RET(oscClkDriveRate < OSC_CLK_DRIVER_RATE_MAX && oscClkDriveRate >= OSC_CLK_DRIVER_RATE_1); + SYSCTRL1->XTAL_CFG.BIT.osc_ds = oscClkDriveRate; +} + +/** + * @brief Get iocmg OSC drive rate mode. + * @param None. + * @retval oscClkDriveRate value of @ref IOCMG_DriveRate. + */ +static inline IOCMG_DriveRate DCL_IOCMG_GetOscClkDriveRate(void) +{ + return SYSCTRL1->XTAL_CFG.BIT.osc_ds; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_IOCMG_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/iocmg/src/iocmg.c b/vendor/others/demo/5-tim_adc/demo/drivers/iocmg/src/iocmg.c new file mode 100644 index 000000000..f9d0d94ef --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/iocmg/src/iocmg.c @@ -0,0 +1,283 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file iocmg.c + * @author MCU Driver Team + * @brief Provides functions about iocmg reg init and config. + */ + +/* Includes ---------------------------------------------------------------------- */ +#include "iocmg.h" +/* param definition -------------------------------------------------------------- */ +/* Function declaration----------------------------------------------------------- */ +static IOCMG_REG* IOCMG_GetRegAddr(unsigned int pinTypedef); + +IOCMG_Status HAL_IOCMG_Init(IOCMG_Handle* handle); +IOCMG_Status HAL_IOCMG_SetPinAltFuncMode(unsigned int pinTypedef); +IOCMG_Status HAL_IOCMG_SetPinPullMode(unsigned int pinTypedef, IOCMG_PullMode pullMode); +IOCMG_Status HAL_IOCMG_SetPinSchmidtMode(unsigned int pinTypedef, IOCMG_SchmidtMode schmidtMode); +IOCMG_Status HAL_IOCMG_SetPinLevelShiftRate(unsigned int pinTypedef, IOCMG_LevelShiftRate levelShiftRate); +IOCMG_Status HAL_IOCMG_SetPinDriveRate(unsigned int pinTypedef, IOCMG_DriveRate driveRate); +IOCMG_Status HAL_IOCMG_SetOscClkOutputMode(bool mode); +IOCMG_Status HAL_IOCMG_SetOscClkFuncMode(bool mode); +IOCMG_Status HAL_IOCMG_SetOscClkDriveRate(IOCMG_OscClkDriveRate oscClkDriveRate); + +IOCMG_FuncMode HAL_IOCMG_GetPinAltFuncMode(unsigned int pinTypedef); +IOCMG_PullMode HAL_IOCMG_GetPinPullMode(unsigned int pinTypedef); +IOCMG_SchmidtMode HAL_IOCMG_GetPinSchmidtMode(unsigned int pinTypedef); +IOCMG_LevelShiftRate HAL_IOCMG_GetPinLevelShiftRate(unsigned int pinTypedef); +IOCMG_DriveRate HAL_IOCMG_GetPinDriveRate(unsigned int pinTypedef); +bool HAL_IOCMG_GetOscClkOutputMode(void); +bool HAL_IOCMG_GetOscClkFuncMode(void); +IOCMG_OscClkDriveRate HAL_IOCMG_GetOscClkDriveRate(void); +/* Function definiton----------------------------------------------------------- */ +/** + * @brief Get pins iocmg reg address + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_REG iocmg reg address. + */ +static IOCMG_REG* IOCMG_GetRegAddr(unsigned int pinTypedef) +{ + /* decode pin's iocmg reg offset address in base address, and conver value to point address */ + unsigned int iocmgBaseAddrValue = (uintptr_t)IOCMG_BASE; + unsigned int iocmgRegOffsetAddrValue = (pinTypedef >> 16) & 0x00000FFF; /* 16 : shift 16 bit */ + IOCMG_REG* iocmgRegxAddr = (IOCMG_REG*)(void*)(iocmgBaseAddrValue + iocmgRegOffsetAddrValue); + if (!IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegxAddr & IOCMG_BASE_ADDR_MASK))) { + return NULL; + } + return iocmgRegxAddr; +} + +/** + * @brief Initial IOCMG reg by pin number and function mode. + * @param handle IOCMG_Handle. + * @retval status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_Init(IOCMG_Handle* handle) +{ + IOCMG_ASSERT_PARAM(handle != NULL); + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(handle->pinTypedef); + IOCMG_REG regValue = {0}; + regValue.BIT.func = (handle->pinTypedef & IOCMG_FUNC_NUM_MASK); + regValue.BIT.ds = handle->driveRate; + regValue.BIT.pd = handle->pullMode & 0x01; /* bit0 : pd */ + regValue.BIT.pu = handle->pullMode >> 1; /* bit1 : pu */ + regValue.BIT.se = handle->schmidtMode; + regValue.BIT.sr = handle->levelShiftRate; + DCL_IOCMG_SetRegValue(iocmgRegx, regValue.reg); + return IOCMG_STATUS_OK; +} + +/** + * @brief Set pins as function mode + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinAltFuncMode(unsigned int pinTypedef) +{ + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + /* get iocmg reg default value */ + unsigned int regValue = pinTypedef & IOCMG_REG_VALUE_MASK; + DCL_IOCMG_SetRegValue(iocmgRegx, regValue); + return IOCMG_STATUS_OK; +} + +/** + * @brief Get pins func number + * @param pinTypedef the pin type defined in iomap.h + * @retval pin func number @ref IOCMG_FuncMode. + */ +IOCMG_FuncMode HAL_IOCMG_GetPinAltFuncMode(unsigned int pinTypedef) +{ + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + return DCL_IOCMG_GetFuncMode(iocmgRegx); +} + +/** + * @brief Set pins pull mode + * @param pinTypedef the pin type defined in iomap.h + * @param pullMode function define as @ref IOCMG_PullMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinPullMode(unsigned int pinTypedef, IOCMG_PullMode pullMode) +{ + IOCMG_PARAM_CHECK_WITH_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE, IOCMG_PARAM_ERROR); + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + DCL_IOCMG_SetPullMode(iocmgRegx, pullMode); + return IOCMG_STATUS_OK; +} + +/** + * @brief Get pins pull mode + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_PullMode HAL_IOCMG_GetPinPullMode(unsigned int pinTypedef) +{ + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + return DCL_IOCMG_GetPullMode(iocmgRegx); +} + +/** + * @brief Set Pin Schmidt Mode + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinSchmidtMode(unsigned int pinTypedef, IOCMG_SchmidtMode schmidtMode) +{ + IOCMG_PARAM_CHECK_WITH_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE, IOCMG_PARAM_ERROR); + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + DCL_IOCMG_SetSchmidtMode(iocmgRegx, schmidtMode); + return IOCMG_STATUS_OK; +} + +/** + * @brief Get Pin Schmidt Mode + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_SchmidtMode HAL_IOCMG_GetPinSchmidtMode(unsigned int pinTypedef) +{ + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + return DCL_IOCMG_GetSchmidtMode(iocmgRegx); +} + +/** + * @brief Set Pin level Shift Rate Mode + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinLevelShiftRate(unsigned int pinTypedef, IOCMG_LevelShiftRate levelShiftRate) +{ + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX, IOCMG_PARAM_ERROR); + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate >= LEVEL_SHIFT_RATE_FAST, IOCMG_PARAM_ERROR); + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + DCL_IOCMG_SetLevelShiftRate(iocmgRegx, levelShiftRate); + return IOCMG_STATUS_OK; +} + +/** + * @brief Get Pin Schmidt Mode + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_LevelShiftRate HAL_IOCMG_GetPinLevelShiftRate(unsigned int pinTypedef) +{ + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + return DCL_IOCMG_GetLevelShiftRate(iocmgRegx); +} + +/** + * @brief Set Pin drive Rate Mode + * @param pinTypedef the pin type defined in iomap.h + * @param driveRate function define as @ref IOCMG_DriveRate + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinDriveRate(unsigned int pinTypedef, IOCMG_DriveRate driveRate) +{ + /* get iocmg reg address */ + IOCMG_PARAM_CHECK_WITH_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4, IOCMG_PARAM_ERROR); + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + DCL_IOCMG_SetDriveRate(iocmgRegx, driveRate); + return IOCMG_STATUS_OK; +} + +/** + * @brief Get Pin drive Rate Mode + * @param pinTypedef the pin type defined in iomap.h + * @retval Value of @ref IOCMG_DriveRate. + */ +IOCMG_DriveRate HAL_IOCMG_GetPinDriveRate(unsigned int pinTypedef) +{ + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + return DCL_IOCMG_GetDriveRate(iocmgRegx); +} + +/** + * @brief Set OSC Pin clock output enable mode + * @param mode function enable or not + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetOscClkOutputMode(bool mode) +{ + IOCMG_ASSERT_PARAM(mode == BASE_CFG_ENABLE || mode == BASE_CFG_DISABLE); + DCL_IOCMG_SetOscClkOutputMode(mode); + return IOCMG_STATUS_OK; +} + +/** + * @brief Get OSC Pin clock output enable mode + * @retval bool enable or not + */ +bool HAL_IOCMG_GetOscClkOutputMode(void) +{ + return DCL_IOCMG_GetOscClkOutputMode(); +} + +/** + * @brief Set OSC Pin function enable mode + * @param mode function enable or not + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetOscClkFuncMode(bool mode) +{ + IOCMG_ASSERT_PARAM(mode == BASE_CFG_ENABLE || mode == BASE_CFG_DISABLE); + DCL_IOCMG_SetOscClkFuncMode(mode); + return IOCMG_STATUS_OK; +} + +/** + * @brief Get OSC Pin Pin function enable mode + * @retval bool enable or not + */ +bool HAL_IOCMG_GetOscClkFuncMode(void) +{ + return DCL_IOCMG_GetOscClkFuncMode(); +} + +/** + * @brief Set OSC Pin drive rate mode + * @param driveRate osc drive rate + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetOscClkDriveRate(IOCMG_OscClkDriveRate oscClkDriveRate) +{ + IOCMG_PARAM_CHECK_WITH_RET(oscClkDriveRate < OSC_CLK_DRIVER_RATE_MAX && \ + oscClkDriveRate >= OSC_CLK_DRIVER_RATE_1, IOCMG_PARAM_ERROR); + DCL_IOCMG_SetOscClkDriveRate(oscClkDriveRate); + return IOCMG_STATUS_OK; +} + +/** + * @brief Get OSC Pin drive rate mode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_OscClkDriveRate HAL_IOCMG_GetOscClkDriveRate(void) +{ + return DCL_IOCMG_GetOscClkDriveRate(); +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/iwdg/common/inc/iwdg.h b/vendor/others/demo/5-tim_adc/demo/drivers/iwdg/common/inc/iwdg.h new file mode 100644 index 000000000..48dc1086b --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/iwdg/common/inc/iwdg.h @@ -0,0 +1,97 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file iwdg.h + * @author MCU Driver Team + * @brief IWDG module driver + * @details The header file contains the following declaration: + * + IWDG handle structure definition. + * + Initialization functions. + * + IWDG Set And Get Functions. + * + Interrupt Handler Functions. + */ + +#ifndef McuMagicTag_IWDG_H +#define McuMagicTag_IWDG_H + +/* Includes ------------------------------------------------------------------*/ +#include "iwdg_ip.h" +/** + * @defgroup IWDG IWDG + * @brief IWDG module. + * @{ + */ + +/** + * @defgroup IWDG_Common IWDG Common + * @brief IWDG common external module. + * @{ + */ + +/** + * @defgroup IWDG_Handle_Definition IWDG Handle Definition + * @{ + */ + +/* Typedef definitions -------------------------------------------------------*/ +typedef void (* IWDG_CallbackType)(void *handle); + +/** + * @brief IWDG handle structure definition. + */ +typedef struct _IWDG_Handle { + IWDG_RegStruct *baseAddress; /**< IWDG Registers address. */ + unsigned int timeValue; /**< IWDG time value. */ + unsigned int freqDivValue; /**< IWDG freq div value. */ + IWDG_TimeType timeType; /**< IWDG time type. */ + bool enableIT; /**< true:enable false:disable interrupt. */ + IWDG_UserCallBack userCallBack; /**< User callback */ + IWDG_ExtendHandle handleEx; /**< IWDG extend parameter */ +} IWDG_Handle; + +/** + * @} + */ + +/** + * @defgroup IWDG_API_Declaration IWDG HAL API + * @{ + */ + +BASE_StatusType HAL_IWDG_Init(IWDG_Handle *handle); +void HAL_IWDG_SetTimeValue(IWDG_Handle *handle, unsigned int timeValue, IWDG_TimeType timeType); +unsigned int HAL_IWDG_GetLoadValue(IWDG_Handle *handle); +unsigned int HAL_IWDG_GetCounterValue(IWDG_Handle *handle); +void HAL_IWDG_Refresh(IWDG_Handle *handle); +void HAL_IWDG_Start(IWDG_Handle *handle); +void HAL_IWDG_Stop(IWDG_Handle *handle); +void HAL_IWDG_RegisterCallback(IWDG_Handle *handle, IWDG_CallbackType callBackFunc); +void HAL_IWDG_IrqHandler(void *handle); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_IWDG_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/iwdg/inc/iwdg_ex.h b/vendor/others/demo/5-tim_adc/demo/drivers/iwdg/inc/iwdg_ex.h new file mode 100644 index 000000000..3467382a6 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/iwdg/inc/iwdg_ex.h @@ -0,0 +1,50 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file iwdg_ex.h + * @author MCU Driver Team + * @brief IWDG module driver + * @details The header file contains the following declaration: + * + IWDG Set And Get Functions. + */ + +#ifndef McuMagicTag_IWDG_EX_H +#define McuMagicTag_IWDG_EX_H + +/* Includes ------------------------------------------------------------------*/ +#include "iwdg.h" +/** + * @addtogroup IWDG_IP + * @{ + */ + +/** + * @defgroup IWDG_API_EX_Declaration IWDG HAL API EX + * @{ + */ +void HAL_IWDG_SetWindowValueEx(IWDG_Handle *handle, unsigned int windowValue, IWDG_TimeType timeType); +unsigned int HAL_IWDG_GetWindowValueEx(IWDG_Handle *handle); +void HAL_IWDG_EnableWindowModeEx(IWDG_Handle *handle); +void HAL_IWDG_DisableWindowModeEx(IWDG_Handle *handle); +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_IWDG_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/iwdg/inc/iwdg_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/iwdg/inc/iwdg_ip.h new file mode 100644 index 000000000..470629db7 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/iwdg/inc/iwdg_ip.h @@ -0,0 +1,439 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file iwdg_ip.h + * @author MCU Driver Team + * @brief IWDG module driver + * @details The header file contains the following declaration: + * + IWDG configuration enums. + * + IWDG register structures. + * + IWDG DCL Functions. + * + Parameters check functions. + */ + +#ifndef McuMagicTag_IWDG_IP_H +#define McuMagicTag_IWDG_IP_H + +/* Includes ------------------------------------------------------------------*/ +#include "baseinc.h" + +/* Macro definition */ + +#ifdef IWDG_PARAM_CHECK + #define IWDG_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM + #define IWDG_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET + #define IWDG_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else + #define IWDG_ASSERT_PARAM(para) ((void)0U) + #define IWDG_PARAM_CHECK_NO_RET(para) ((void)0U) + #define IWDG_PARAM_CHECK_WITH_RET(param, ret) ((void)0U) +#endif + +/** + * @addtogroup IWDG + * @{ + */ + +/** + * @defgroup IWDG_IP IWDG_IP + * @brief IWDG_IP: iwdg_v1. + * @{ + */ + +/** + * @defgroup IWDG_Param_Def IWDG Parameters Definition + * @brief Description of IWDG configuration parameters. + * @{ + */ +/* MACRO definitions -------------------------------------------------------*/ +#define FREQ_CONVERT_MS_UNIT 1000 +#define FREQ_CONVERT_US_UNIT 1000000 +#define IWDG_UNLOCK_REG_CMD 0x55 /* 0x55 CMD: key equal 0x55 will unlock all reg write function */ +#define IWDG_LOCK_REG_CMD 0xFF /* 0xFF CMD: key not equal 0x55 will lock reg write function except key reg */ + +/* Typedef definitions -------------------------------------------------------*/ +typedef enum { + IWDG_TIME_UNIT_TICK = 0x00000000U, + IWDG_TIME_UNIT_S = 0x00000001U, + IWDG_TIME_UNIT_MS = 0x00000002U, + IWDG_TIME_UNIT_US = 0x00000003U +} IWDG_TimeType; + +typedef enum { + IWDG_FREQ_DIV_NONE = 0x00000000U, + IWDG_FREQ_DIV_2 = 0x00000001U, + IWDG_FREQ_DIV_4 = 0x00000002U, + IWDG_FREQ_DIV_8 = 0x00000003U, + IWDG_FREQ_DIV_16 = 0x00000004U, + IWDG_FREQ_DIV_32 = 0x00000005U, + IWDG_FREQ_DIV_64 = 0x00000006U, + IWDG_FREQ_DIV_128 = 0x00000007U, + IWDG_FREQ_DIV_256 = 0x00000008U, + IWDG_FREQ_DIV_MAX +} IWDG_FreqDivType; + +/** + * @brief IWDG extend handle. + */ +typedef struct _IWDG_ExtendHandle { +} IWDG_ExtendHandle; + +/** + * @brief IWDG user callback. + */ +typedef struct { + void (* CallbackFunc)(void *handle); /**< IWDG callback Function */ +} IWDG_UserCallBack; +/** + * @} + */ + +/** + * @defgroup IWDG_Reg_Def IWDG Register Definition + * @brief Description IWDG register mapping structure. + * @{ + */ +/** + * @brief IWDG load init value. + */ +typedef union { + unsigned int reg; + struct { + unsigned int iwdg_load : 8; /**< init value. */ + unsigned int reserved0 : 24; + } BIT; +} volatile IWDG_LOAD_REG; + +/** + * @brief IWDG get current value. + */ +typedef union { + unsigned int reg; + struct { + unsigned int iwdg_value : 8; /**< current value. */ + unsigned int reserved0 : 24; + } BIT; +} volatile IWDG_VALUE_REG; + +/** + * @brief IWDG set window value. + */ +typedef union { + unsigned int reg; + struct { + unsigned int iwdg_window : 8; /**< window value. */ + unsigned int reserved0 : 24; + } BIT; +} volatile IWDG_WINDOW_REG; + +/** + * @brief IWDG cmd function value. + */ +typedef union { + unsigned int reg; + struct { + unsigned int iwdg_key : 8; /**< cmd function value. */ + unsigned int reserved0 : 24; + } BIT; +} volatile IWDG_KEY_REG; + +/** + * @brief IWDG clk pre div value. + */ +typedef union { + unsigned int reg; + struct { + unsigned int iwdg_pre_div : 4; /**< clk pre div value. */ + unsigned int reserved0 : 28; + } BIT; +} volatile IWDG_PRE_DIV_REG; + +/** + * @brief IWDG enable interrupt and reset. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 1; + unsigned int resen : 1; /**< enable reset. */ + unsigned int window_mode_en : 1; /**< enable window mode. */ + unsigned int reserved1 : 29; + } BIT; +} volatile IWDG_CONTROL_REG; + +/** + * @brief IWDG Register Structure definition. + */ +typedef struct { + IWDG_LOAD_REG IWDOG_LOAD; /**< IWDG load value register. */ + IWDG_VALUE_REG IWDOG_VALUE; /**< IWDG current value register. */ + IWDG_WINDOW_REG IWDOG_WINDOW; /**< IWDG Window value register. */ + IWDG_KEY_REG IWDOG_KEY; /**< IWDG instruction word register. */ + IWDG_PRE_DIV_REG IWDOG_PRE_DIV; /**< IWDG prescale register. */ + IWDG_CONTROL_REG IWDOG_CONTROL; /**< IWDG interrupt, reset and window enable register. */ +} volatile IWDG_RegStruct; + +/** + * @} + */ + +/** + * @brief Setting the load value of the IWDG counter. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @param loadValue Load value of the IWDG counter. + * @retval None. + */ +static inline void DCL_IWDG_SetLoadValue(IWDG_RegStruct *iwdgx, unsigned char loadValue) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + iwdgx->IWDOG_KEY.BIT.iwdg_key = IWDG_UNLOCK_REG_CMD; + iwdgx->IWDOG_LOAD.BIT.iwdg_load = loadValue; + iwdgx->IWDOG_KEY.BIT.iwdg_key = IWDG_LOCK_REG_CMD; +} + +/** + * @brief Getting the load value of the IWDG load register. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @retval unsigned char IWDG load value. + */ +static inline unsigned char DCL_IWDG_GetLoadValue(const IWDG_RegStruct *iwdgx) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + return iwdgx->IWDOG_LOAD.BIT.iwdg_load; +} + +/** + * @brief Getting the value of the IWDG counter register. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @retval unsigned char IWDG counter value. + */ +static inline unsigned char DCL_IWDG_GetCounterValue(const IWDG_RegStruct *iwdgx) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + return iwdgx->IWDOG_VALUE.BIT.iwdg_value; +} + +/** + * @brief Setting window value, windowValue need bigger than 4. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @param windowValue window value of the IWDG counter. + * @retval None. + */ +static inline void DCL_IWDG_SetWindowValue(IWDG_RegStruct *iwdgx, unsigned char windowValue) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + IWDG_PARAM_CHECK_NO_RET(windowValue > 4); /* litter than 4 could be error */ + iwdgx->IWDOG_KEY.BIT.iwdg_key = IWDG_UNLOCK_REG_CMD; + iwdgx->IWDOG_WINDOW.BIT.iwdg_window = windowValue; + iwdgx->IWDOG_KEY.BIT.iwdg_key = IWDG_LOCK_REG_CMD; +} + +/** + * @brief Getting window value, windowValue need bigger than 4. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @param windowValue window value of the IWDG counter. + * @retval unsigned char iwdg window value. + */ +static inline unsigned char DCL_IWDG_GetWindowValue(IWDG_RegStruct *iwdgx) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + return iwdgx->IWDOG_WINDOW.BIT.iwdg_window; +} + +/** + * @brief Start iwdg function. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @retval None. + */ +static inline void DCL_IWDG_Start(IWDG_RegStruct *iwdgx) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + iwdgx->IWDOG_KEY.BIT.iwdg_key = 0xCC; /* 0xCC CMD: start iwdg function */ +} + +/** + * @brief Stop iwdg function. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @retval None. + */ +static inline void DCL_IWDG_Stop(IWDG_RegStruct *iwdgx) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + iwdgx->IWDOG_KEY.BIT.iwdg_key = 0xDD; /* 0xDD CMD: stop iwdg function */ +} + +/** + * @brief Clear interrupt and reload watchdog counter value. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @retval None. + */ +static inline void DCL_IWDG_Refresh(IWDG_RegStruct *iwdgx) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + iwdgx->IWDOG_KEY.BIT.iwdg_key = 0xAA; /* 0xAA CMD: clear interrupt and reload value */ +} + +/** + * @brief Disable write and read IWDG registers except IWDG_LOCK. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @retval None. + */ +static inline void DCL_IWDG_LockReg(IWDG_RegStruct *iwdgx) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + iwdgx->IWDOG_KEY.BIT.iwdg_key = 0xFF; /* 0xFF CMD: key not equal 0x55 will lock reg write function except key reg */ +} + +/** + * @brief Enable write and read IWDG registers. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @retval None. + */ +static inline void DCL_IWDG_UnlockReg(IWDG_RegStruct *iwdgx) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + iwdgx->IWDOG_KEY.BIT.iwdg_key = 0x55; /* 0x55 CMD: key equal 0x55 will unlock all reg write function */ +} + +/** + * @brief Setting freq div value. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @param freqDiv freqDiv value of the IWDG counter. + * @retval None. + */ +static inline void DCL_IWDG_SetFreqDivValue(IWDG_RegStruct *iwdgx, IWDG_FreqDivType freqDiv) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + IWDG_PARAM_CHECK_NO_RET(freqDiv < IWDG_FREQ_DIV_MAX); + iwdgx->IWDOG_KEY.BIT.iwdg_key = IWDG_UNLOCK_REG_CMD; + iwdgx->IWDOG_PRE_DIV.BIT.iwdg_pre_div = freqDiv; /* freqDiv parameters set */ + iwdgx->IWDOG_KEY.BIT.iwdg_key = IWDG_UNLOCK_REG_CMD; +} + +/** + * @brief Getting freq div value. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @param freqDiv freqDiv value of the IWDG counter. + * @retval None. + */ +static inline unsigned char DCL_IWDG_GetFreqDivValue(IWDG_RegStruct *iwdgx) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + return iwdgx->IWDOG_PRE_DIV.BIT.iwdg_pre_div; +} + +/** + * @brief Enable reset signal. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @retval None. + */ +static inline void DCL_IWDG_EnableReset(IWDG_RegStruct *iwdgx) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + iwdgx->IWDOG_KEY.BIT.iwdg_key = IWDG_UNLOCK_REG_CMD; + iwdgx->IWDOG_CONTROL.BIT.resen = BASE_CFG_SET; + iwdgx->IWDOG_KEY.BIT.iwdg_key = IWDG_LOCK_REG_CMD; +} + +/** + * @brief Disable reset signal. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @retval None. + */ +static inline void DCL_IWDG_DisableReset(IWDG_RegStruct *iwdgx) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + iwdgx->IWDOG_KEY.BIT.iwdg_key = IWDG_UNLOCK_REG_CMD; + iwdgx->IWDOG_CONTROL.BIT.resen = BASE_CFG_UNSET; + iwdgx->IWDOG_KEY.BIT.iwdg_key = IWDG_LOCK_REG_CMD; +} + +/** + * @brief Ensable Windows mode. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @retval None. + */ +static inline void DCL_IWDG_EnableWindowsMode(IWDG_RegStruct *iwdgx) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + iwdgx->IWDOG_KEY.BIT.iwdg_key = IWDG_UNLOCK_REG_CMD; + iwdgx->IWDOG_CONTROL.BIT.window_mode_en = BASE_CFG_SET; + iwdgx->IWDOG_KEY.BIT.iwdg_key = IWDG_LOCK_REG_CMD; +} + +/** + * @brief Disable Windows mode. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @retval None. + */ +static inline void DCL_IWDG_DisableWindowsMode(IWDG_RegStruct *iwdgx) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + iwdgx->IWDOG_KEY.BIT.iwdg_key = IWDG_UNLOCK_REG_CMD; + iwdgx->IWDOG_CONTROL.BIT.window_mode_en = BASE_CFG_UNSET; + iwdgx->IWDOG_KEY.BIT.iwdg_key = IWDG_LOCK_REG_CMD; +} + +/** + * @brief Get Windows mode. + * @param iwdgx Value of @ref IWDG_RegStruct. + * @retval bool is enable or disable. + */ +static inline bool DCL_IWDG_GetWindowsMode(IWDG_RegStruct *iwdgx) +{ + IWDG_ASSERT_PARAM(IsIWDGInstance(iwdgx)); + return iwdgx->IWDOG_CONTROL.BIT.window_mode_en; +} + +/** + * @brief check iwdg time type parameter. + * @param timeType Value of @ref IWDG_TimeType. + * @retval Bool. + */ +static inline bool IsIwdgTimeType(IWDG_TimeType timeType) +{ + return (timeType == IWDG_TIME_UNIT_TICK || + timeType == IWDG_TIME_UNIT_S || + timeType == IWDG_TIME_UNIT_MS || + timeType == IWDG_TIME_UNIT_US); +} + +/** + * @brief check iwdg time value parameter. + * @param baseAddress Value of @ref IWDG_RegStruct + * @param timeValue time value + * @param timeType Value of @ref IWDG_TimeType. + * @retval Bool. + */ +static inline bool IsIwdgTimeValue(IWDG_RegStruct *baseAddress, float timeValue, IWDG_TimeType timeType) +{ + float clockFreq = (float)HAL_CRG_GetIpFreq((void *)baseAddress); + float maxSecond = (float)(0xFFFFFFFF / clockFreq); /* 0xFFFFFFFF max input value */ + return ((timeType == IWDG_TIME_UNIT_TICK && timeValue <= 0xFFFFFFFF) || + (timeType == IWDG_TIME_UNIT_S && maxSecond >= timeValue) || + (timeType == IWDG_TIME_UNIT_MS && maxSecond >= timeValue / FREQ_CONVERT_MS_UNIT) || + (timeType == IWDG_TIME_UNIT_US && maxSecond >= timeValue / FREQ_CONVERT_US_UNIT)); +} +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_IWDG_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/iwdg/src/iwdg.c b/vendor/others/demo/5-tim_adc/demo/drivers/iwdg/src/iwdg.c new file mode 100644 index 000000000..ff4181089 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/iwdg/src/iwdg.c @@ -0,0 +1,220 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file iwdg.c + * @author MCU Driver Team + * @brief IWDG module driver + * @details This file provides firmware functions to manage the following functionalities of the IWDG and IWDG. + * + Initialization functions. + * + IWDG Set And Get Functions. + * + Interrupt Handler Functions. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "interrupt.h" +#include "iwdg.h" + +/* Macro definitions ---------------------------------------------------------*/ +#define IWDG_LOAD_VALUE_LIMIT 255 +#define IWDG_WINDOW_VALUE_UPPER_LIMIT 255 +#define IWDG_WINDOW_VALUE_LOWER_LIMIT 5 +static unsigned int IWDG_CalculateRegTimeout(IWDG_RegStruct *baseAddress, float timeValue, IWDG_TimeType timeType); + +/** + * @brief Initializing IWDG or IWDG register values + * @param handle Value of @ref IWDG_handle. + * @retval BASE_StatusType: OK, ERROR + */ +BASE_StatusType HAL_IWDG_Init(IWDG_Handle *handle) +{ + IWDG_ASSERT_PARAM(handle != NULL); + IWDG_ASSERT_PARAM(IsIWDGInstance(handle->baseAddress)); + IWDG_PARAM_CHECK_WITH_RET(IsIwdgTimeType(handle->timeType), BASE_STATUS_ERROR); + IWDG_PARAM_CHECK_WITH_RET(IsIwdgTimeValue(handle->baseAddress, handle->timeValue, handle->timeType), + BASE_STATUS_ERROR); + BASE_FUNC_DELAY_US(200); /* IWDG need delay 200 us */ + /* IWDG frequency division value less than 256 */ + unsigned int freqDivVal = (handle->freqDivValue > IWDG_FREQ_DIV_256) ? IWDG_FREQ_DIV_256 : handle->freqDivValue; + DCL_IWDG_SetFreqDivValue(handle->baseAddress, freqDivVal); + HAL_IWDG_SetTimeValue(handle, handle->timeValue, handle->timeType); + DCL_IWDG_EnableReset(handle->baseAddress); /* enable reset */ + return BASE_STATUS_OK; +} + +/** + * @brief Calculate Reg Timeout. + * @param timeValue Value to be load to iwdg. + * @param timeType Value of @ref IWDG_TimeType. + * @retval unsigned int timeout Value. + */ +static unsigned int IWDG_CalculateRegTimeout(IWDG_RegStruct *baseAddress, float timeValue, IWDG_TimeType timeType) +{ + float clockFreq = (float)HAL_CRG_GetIpFreq((void *)baseAddress); + unsigned int timeoutValue = 0x00000000U; + switch (timeType) { + case IWDG_TIME_UNIT_TICK: /* If the time type is tick, calculate the timeout value. */ + timeoutValue = (unsigned int)timeValue; + break; + case IWDG_TIME_UNIT_S: /* If the time type is s, calculate the timeout value. */ + timeoutValue = (unsigned int)(timeValue * clockFreq); + break; + case IWDG_TIME_UNIT_MS: /* If the time type is ms, calculate the timeout value. */ + timeoutValue = (unsigned int)(timeValue * clockFreq / FREQ_CONVERT_MS_UNIT); + break; + case IWDG_TIME_UNIT_US: /* If the time type is us, calculate the timeout value. */ + timeoutValue = (unsigned int)(timeValue * clockFreq / FREQ_CONVERT_US_UNIT); + break; + default: + break; + } + return timeoutValue; +} + +/** + * @brief Setting the load value of the IWDG counter. + * @param handle Value of @ref IWDG_handle. + * @param timeValue Load value of the IWDG counter. + * @param timeType IWDG time type. + * @retval None. + */ +void HAL_IWDG_SetTimeValue(IWDG_Handle *handle, unsigned int timeValue, IWDG_TimeType timeType) +{ + IWDG_ASSERT_PARAM(handle != NULL); + IWDG_ASSERT_PARAM(IsIWDGInstance(handle->baseAddress)); + IWDG_PARAM_CHECK_NO_RET(IsIwdgTimeType(timeType)); + IWDG_PARAM_CHECK_NO_RET(IsIwdgTimeValue(handle->baseAddress, timeValue, timeType)); + /* handle->baseAddress only could be configed IWDG or IWDG */ + unsigned int value = IWDG_CalculateRegTimeout(handle->baseAddress, timeValue, timeType); + unsigned int freqDiv = DCL_IWDG_GetFreqDivValue(handle->baseAddress); + value = (value / (1 << freqDiv)); + /* The upper limit of the loaded value is determined. */ + value = (value <= IWDG_LOAD_VALUE_LIMIT) ? value : IWDG_LOAD_VALUE_LIMIT; + DCL_IWDG_SetLoadValue(handle->baseAddress, value); +} + +/** + * @brief refresh the IWDG counter. + * @param handle Value of @ref IWDG_handle. + * @retval None. + */ +void HAL_IWDG_Refresh(IWDG_Handle *handle) +{ + IWDG_ASSERT_PARAM(handle != NULL); + IWDG_ASSERT_PARAM(IsIWDGInstance(handle->baseAddress)); + DCL_IWDG_Refresh(handle->baseAddress); +} + +/** + * @brief obtain the IWDG load value. + * @param handle Value of @ref IWDG_handle. + * @retval unsigned int Load value. + */ +unsigned int HAL_IWDG_GetLoadValue(IWDG_Handle *handle) +{ + IWDG_ASSERT_PARAM(handle != NULL); + IWDG_ASSERT_PARAM(IsIWDGInstance(handle->baseAddress)); + return DCL_IWDG_GetLoadValue(handle->baseAddress); +} + +/** + * @brief Refresh the IWDG counter value. + * @param handle Value of @ref IWDG_handle. + * @retval unsigned int Counter value. + */ +unsigned int HAL_IWDG_GetCounterValue(IWDG_Handle *handle) +{ + IWDG_ASSERT_PARAM(handle != NULL); + IWDG_ASSERT_PARAM(IsIWDGInstance(handle->baseAddress)); + + float res = (float)handle->baseAddress->IWDOG_VALUE.BIT.iwdg_value; + if (res >= 255) { /* 255 is IWDG maximum current count */ + return handle->timeValue; + } + unsigned int freq = HAL_CRG_GetIpFreq((void *)handle->baseAddress); + /* check clockFreq not equal zero */ + if (freq == 0) { + return 0; + } + unsigned int freqDiv = DCL_IWDG_GetFreqDivValue(handle->baseAddress); + switch (handle->timeType) { + case IWDG_TIME_UNIT_TICK: /* Number of tick currently calculated */ + res = res * (1 << freqDiv); + break; + case IWDG_TIME_UNIT_S: + /* Number of seconds currently calculated */ + res = res * (1 << freqDiv) / freq; + break; + case IWDG_TIME_UNIT_MS: + res = res * (1 << freqDiv) * FREQ_CONVERT_MS_UNIT / freq; + break; + case IWDG_TIME_UNIT_US: + /* Number of seconds currently calculated */ + res = res * (1 << freqDiv) * FREQ_CONVERT_US_UNIT / freq; + break; + default: + break; + } + return (unsigned int)res; /* return current counter value */ +} + +/** + * @brief Start the IWDG count. + * @param handle Value of @ref IWDG_handle. + * @retval None. + */ +void HAL_IWDG_Start(IWDG_Handle *handle) +{ + IWDG_ASSERT_PARAM(handle != NULL); + IWDG_ASSERT_PARAM(IsIWDGInstance(handle->baseAddress)); + DCL_IWDG_Start(handle->baseAddress); +} + +/** + * @brief Stop the IWDG count. + * @param handle Value of @ref IWDG_handle. + * @retval None. + */ +void HAL_IWDG_Stop(IWDG_Handle *handle) +{ + IWDG_ASSERT_PARAM(handle != NULL); + IWDG_ASSERT_PARAM(IsIWDGInstance(handle->baseAddress)); + DCL_IWDG_Stop(handle->baseAddress); +} + +/** + * @brief Register IWDG interrupt callback. + * @param handle Value of @ref IWDG_handle. + * @param callBackFunc Value of @ref IWDG_CallbackType. + * @retval None + */ +void HAL_IWDG_RegisterCallback(IWDG_Handle *handle, IWDG_CallbackType callBackFunc) +{ + BASE_FUNC_UNUSED(handle); + BASE_FUNC_UNUSED(callBackFunc); + /* This function is not supported. */ +} + +/** + * @brief Interrupt handler processing function. + * @param handle IWDG_Handle. + * @retval None. + */ +void HAL_IWDG_IrqHandler(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* This function is not supported. */ +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/iwdg/src/iwdg_ex.c b/vendor/others/demo/5-tim_adc/demo/drivers/iwdg/src/iwdg_ex.c new file mode 100644 index 000000000..92a11f835 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/iwdg/src/iwdg_ex.c @@ -0,0 +1,129 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file iwdg_ex.c + * @author MCU Driver Team + * @brief IWDG module driver + * @details This file provides firmware functions to manage the following functionalities of the IWDG and IWDG. + * + IWDG Set And Get Functions. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "interrupt.h" +#include "iwdg_ex.h" + +/* Macro definitions ---------------------------------------------------------*/ +#define IWDG_WINDOW_VALUE_UPPER_LIMIT 255 +#define IWDG_WINDOW_VALUE_LOWER_LIMIT 5 + +static unsigned int IWDG_CalculateRegTimeoutEx(IWDG_RegStruct *baseAddress, float timeValue, IWDG_TimeType timeType); +/** + * @brief Setting the window value of the IWDG counter. + * @param handle Value of @ref IWDG_handle. + * @param windowValue Load value of the IWDG counter. + * @param timeType IWDG time type. + * @retval None. + */ +void HAL_IWDG_SetWindowValueEx(IWDG_Handle *handle, unsigned int windowValue, IWDG_TimeType timeType) +{ + IWDG_ASSERT_PARAM(handle != NULL); + IWDG_ASSERT_PARAM(IsIWDGInstance(handle->baseAddress)); + IWDG_PARAM_CHECK_NO_RET(IsIwdgTimeType(timeType)); + /* handle->baseAddress only could be configed IWDG or IWDG */ + if (handle->baseAddress->IWDOG_CONTROL.BIT.window_mode_en == BASE_CFG_SET) { + handle->timeType = timeType; + unsigned int value = IWDG_CalculateRegTimeoutEx(handle->baseAddress, windowValue, timeType); + unsigned int freqDiv = DCL_IWDG_GetFreqDivValue(handle->baseAddress); + value = (value / (1 << freqDiv)); + /* The upper limit of the window value is determined. */ + value = (value <= IWDG_WINDOW_VALUE_UPPER_LIMIT) ? value : IWDG_WINDOW_VALUE_UPPER_LIMIT; + /* IWDG window value litter than 4 could be error */ + value = (value < IWDG_WINDOW_VALUE_LOWER_LIMIT) ? IWDG_WINDOW_VALUE_LOWER_LIMIT : value; + /* window value only could be set litter than load value */ + value = (value < handle->baseAddress->IWDOG_LOAD.BIT.iwdg_load) ? value : + handle->baseAddress->IWDOG_LOAD.BIT.iwdg_load; + DCL_IWDG_SetWindowValue(handle->baseAddress, value); + } +} + +/** + * @brief Calculate Reg Timeout. + * @param timeValue Value to be load to iwdg. + * @param timeType Value of @ref IWDG_TimeType. + * @retval unsigned int timeout Value. + */ +static unsigned int IWDG_CalculateRegTimeoutEx(IWDG_RegStruct *baseAddress, float timeValue, IWDG_TimeType timeType) +{ + float clockFreq = (float)HAL_CRG_GetIpFreq((void *)baseAddress); + unsigned int timeoutValue = 0x00000000U; + + switch (timeType) { + case IWDG_TIME_UNIT_TICK: /* timeout value when time is tick */ + timeoutValue = (unsigned int)timeValue; + break; + case IWDG_TIME_UNIT_US: /* timeout value when time is us */ + timeoutValue = (unsigned int)(timeValue * clockFreq / FREQ_CONVERT_US_UNIT); + break; + case IWDG_TIME_UNIT_MS: /* timeout value when time is ms */ + timeoutValue = (unsigned int)(timeValue * clockFreq / FREQ_CONVERT_MS_UNIT); + break; + case IWDG_TIME_UNIT_S: /* timeout value when time is s */ + timeoutValue = (unsigned int)(timeValue * clockFreq); + break; + default: + break; + } + return timeoutValue; +} + +/** + * @brief Getting the window value of the IWDG counter. + * @param handle Value of @ref IWDG_handle. + * @retval unsigned int the value of window reg value. + */ +unsigned int HAL_IWDG_GetWindowValueEx(IWDG_Handle *handle) +{ + IWDG_ASSERT_PARAM(handle != NULL); + IWDG_ASSERT_PARAM(IsIWDGInstance(handle->baseAddress)); + IWDG_ASSERT_PARAM(IsIwdgTimeType(handle->timeType)); + /* handle->baseAddress only could be configed IWDG or IWDG */ + return DCL_IWDG_GetWindowValue(handle->baseAddress); +} + +/** + * @brief Enable window mode. + * @param handle Value of @ref IWDG_handle. + * @retval None. + */ +void HAL_IWDG_EnableWindowModeEx(IWDG_Handle *handle) +{ + IWDG_ASSERT_PARAM(handle != NULL); + IWDG_ASSERT_PARAM(IsIWDGInstance(handle->baseAddress)); + DCL_IWDG_EnableWindowsMode(handle->baseAddress); +} + +/** + * @brief Disable window mode. + * @param handle Value of @ref IWDG_handle. + * @retval None. + */ +void HAL_IWDG_DisableWindowModeEx(IWDG_Handle *handle) +{ + IWDG_ASSERT_PARAM(handle != NULL); + IWDG_ASSERT_PARAM(IsIWDGInstance(handle->baseAddress)); + DCL_IWDG_DisableWindowsMode(handle->baseAddress); +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/pga/common/inc/pga.h b/vendor/others/demo/5-tim_adc/demo/drivers/pga/common/inc/pga.h new file mode 100644 index 000000000..4507a9f25 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/pga/common/inc/pga.h @@ -0,0 +1,81 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file pga.h + * @author MCU Driver Team + * @brief Programmable Gain Apmlifier HAL level module driver head file. + * This file provides firmware functions to manage the following + * functionalities of the Amplifier. + * + Initialization and de-initialization functions + * + Programmable Gain Amplifier set gain value functions + */ +#ifndef McuMagicTag_PGA_H +#define McuMagicTag_PGA_H + +#include "pga_ip.h" +#include "baseinc.h" + +/** + * @defgroup PGA PGA + * @brief PGA module. + * @{ + */ + +/** + * @defgroup PGA_Common PGA Common + * @brief PGA common external module. + * @{ + */ + +/** + * @defgroup PGA_Handle_Definition PGA Handle Definition + * @{ + */ +/** + * @brief The define of the PGA handle structure + */ +typedef struct _PGA_Handle { + PGA_RegStruct *baseAddress; /**< PGA registers base address. */ + PGA_GainValue gain; /**< PGA gain selection. */ + bool externalResistorMode; /**< PGA resistance mode. */ + + PGA_ExtendHandle handleEx; /**< PGA handle extend. */ +} PGA_Handle; + +/** + * @} + */ + +/** + * @defgroup PGA_API_Declaration PGA HAL API + * @{ + */ +BASE_StatusType HAL_PGA_Init(PGA_Handle *pgaHandle); /* Initializet function */ +BASE_StatusType HAL_PGA_DeInit(PGA_Handle *pgaHandle); /* Deinitialize function */ +void HAL_PGA_SetGain(PGA_Handle *pgaHandle, PGA_GainValue gain); /* Set amplifier's gain function */ +void HAL_PGA_Start(PGA_Handle *pgaHandle); /* Start PGA */ +void HAL_PGA_Stop(PGA_Handle *pgaHandle); /* Stop PGA */ +/** + * @} + */ +/** + * @} + */ +/** + * @} + */ +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/pga/inc/pga_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/pga/inc/pga_ip.h new file mode 100644 index 000000000..f2fad2ee2 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/pga/inc/pga_ip.h @@ -0,0 +1,333 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file pga_ip.h + * @author MCU Driver Team + * @brief Programmable Gain Amplifier module driver. + * This file provides DCL functions to manage amplifier. + * + Programmable Gain Amplifier register mapping strtucture. + * + Direct configuration layer interface. + */ + +#ifndef McuMagicTag_PGA_IP_H +#define McuMagicTag_PGA_IP_H + +#include "baseinc.h" + +#ifdef PGA_PARAM_CHECK +#define PGA_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define PGA_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define PGA_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define PGA_ASSERT_PARAM(para) ((void)0U) +#define PGA_PARAM_CHECK_NO_RET(para) ((void)0U) +#define PGA_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +#define PGA_PGA_MAX_GAIN 7 +#define PGA_MAX_GAIN_VALUE 3 +#define PGA_MAX_EXT_CAP_COMP 7 +#define PGA_EXT_VLAUE 3 +/** + * @addtogroup PGA + * @{ + */ + +/** + * @defgroup PGA_IP PGA_IP + * @brief PGA_IP: pga_v1. + * @{ + */ + +/** + * @defgroup PGA_REG_Definition PGA Register Structure. + * @brief PGA Register Structure Definition. + * @{ + */ + +/** + * @brief PGA gain value selection + */ +typedef enum { + PGA_GAIN_2X = 0x00000000U, + PGA_GAIN_4X = 0x00000001U, + PGA_GAIN_8X = 0x00000002U, + PGA_GAIN_16X = 0x00000003U, +} PGA_GainValue; + +/** + * @brief PGA gain value selection + */ +typedef enum { + PGA_EXT_COMPENSATION_2X = 0x00000000U, + PGA_EXT_COMPENSATION_3X = 0x00000001U, + PGA_EXT_COMPENSATION_4X = 0x00000002U, + PGA_EXT_COMPENSATION_5X = 0x00000003U, + PGA_EXT_COMPENSATION_6X = 0x00000004U, + PGA_EXT_COMPENSATION_7X = 0x00000005U, + PGA_EXT_COMPENSATION_8X = 0x00000006U, + PGA_EXT_COMPENSATION_9X = 0x00000007U, +} PGA_ExtCapCompValue; + +/** + * @brief Extent handle definition of PGA. + */ +typedef struct { + PGA_ExtCapCompValue extCapCompensation; /**< Feedforward Capacitance Compensation in PGA External Gain Mode. */ +} PGA_ExtendHandle; + +/** + * @brief PGA control 0. + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_pga_enh : 1; /**< Overall enable of the PGA. */ + unsigned int reserved_0 : 31; + } BIT; +} volatile PGA_CTRL0_REG; + +/** + * @brief PGA control 1. + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_pga_cf_ctrl : 3; /**< Feedforward capacitor compensation config in PGA external gain mode. */ + unsigned int reserved_0 : 5; + unsigned int da_pga_gain_ctrl : 3; /**< Gain configuration of the internal resistor of the PGA. */ + unsigned int reserved_1 : 5; + unsigned int da_pga_mode_ctrl : 2; /**< PGA mode configuration. 0: internal resistor gain mode; + 1: external resistor gain mode; */ + unsigned int reserved_2 : 14; + } BIT; +} volatile PGA_CTRL1_REG; + +/** + * @brief PGA control register 2. + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_pga_ibias_sel : 4; /**< PGA bias current configuration level select. */ + unsigned int reserved_0 : 28; + } BIT; +} volatile PGA_CTRL2_REG; + +/** + * @brief PGA TRIM register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_pga_vos_trim : 9; /**< Offset trim information of the PGA. */ + unsigned int reserved_0 : 23; + } BIT; +} volatile PGA_TRIM_REG; + +/** + * @brief PGA test register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_pga_test_enh : 1; /**< PGA test enable. */ + unsigned int da_pga_test_sel : 2; /**< PGA test select. */ + unsigned int reserved_0 : 29; + } BIT; +} volatile PGA_TEST_REG; + +/** + * @brief PGA reserved register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int da_pga_cf_ctrl1 : 2; /**< Feedforward capacitor compensation config in external gain mode. */ + unsigned int reserved_0 : 30; + } BIT; +} volatile PGA_RSV_REG; + +/** + * @brief Register mapping structure. + */ +typedef struct _PGA_RegStruct { + PGA_CTRL0_REG PGA_CTRL0; /**< PGA control 0 register. Offset address: 0x00000000U. */ + PGA_CTRL1_REG PGA_CTRL1; /**< PGA control 1 register. Offset address: 0x00000004U. */ + PGA_CTRL2_REG PGA_CTRL2; /**< PGA control 2 register. Offset address: 0x00000008U. */ + unsigned char space0[20]; + PGA_TRIM_REG PGA_TRIM; /**< PGA TRIM register. Offset address: 0x00000020U. */ + unsigned char space1[28]; + PGA_TEST_REG PGA_TEST; /**< PGA test control register. Offset address: 0x00000040U. */ + unsigned char space2[28]; + PGA_RSV_REG PGA_RSV; /**< PGA reserved register. Offset address: 0x00000060U. */ +} volatile PGA_RegStruct; + +/* Parameter Check -----------------------------------------------------------*/ + +/** + * @brief Verify gain value of PGA. + * @param pgaGainValue pga gain value @ref PGA_GainValue + * @retval true + * @retval false + */ +static inline bool IsPgaGain(PGA_GainValue pgaGainValue) +{ + return (pgaGainValue <= PGA_MAX_GAIN_VALUE); +} + +/** + * @brief Verify feedforward capacitance compensation value. + * @param pgaExtCapCompValue feedforward capacitance compensation value @ref PGA_ExtCapCompValue + * @retval true + * @retval false + */ +static inline bool IsPgaExtCapCompensation(PGA_ExtCapCompValue pgaExtCapCompValue) +{ + return (pgaExtCapCompValue <= PGA_MAX_EXT_CAP_COMP); +} + +/* DCL layer -----------------------------------------------------------*/ +/** + * @brief Enable amplifier's output + * @param pgax: amplifier register base address. + * @retval None. + */ +static inline void DCL_PGA_EnableOut(PGA_RegStruct *pgax) +{ + PGA_ASSERT_PARAM(IsPGAInstance(pgax)); + pgax->PGA_CTRL0.BIT.da_pga_enh = BASE_CFG_ENABLE; +} + +/** + * @brief Disable amplifier's output + * @param pgax: amplifier register base address. + * @retval None. + */ +static inline void DCL_PGA_DisableOut(PGA_RegStruct *pgax) +{ + PGA_ASSERT_PARAM(IsPGAInstance(pgax)); + pgax->PGA_CTRL0.BIT.da_pga_enh = BASE_CFG_DISABLE; +} + +/** + * @brief Set amplifier's gain + * @param pgax: amplifier register base address. + * @param value: gain value. + * @retval None. + */ +static inline void DCL_PGA_SetGain(PGA_RegStruct *pgax, unsigned int value) +{ + PGA_ASSERT_PARAM(IsPGAInstance(pgax)); + PGA_PARAM_CHECK_NO_RET(value <= PGA_PGA_MAX_GAIN); + pgax->PGA_CTRL1.BIT.da_pga_gain_ctrl = value; +} + +/** + * @brief Get amplifier's gain + * @param pgax: amplifier register base address. + * @retval gain value. + */ +static inline unsigned int DCL_PGA_GetGain(PGA_RegStruct *pgax) +{ + PGA_ASSERT_PARAM(IsPGAInstance(pgax)); + return pgax->PGA_CTRL1.BIT.da_pga_gain_ctrl; +} + +/** + * @brief PGA mode configuration, enable external resistor gain mode. + * @param pgax: amplifier register base address. + * @retval None. + */ +static inline void DCL_PGA_EnableExtGainMode(PGA_RegStruct *pgax) +{ + PGA_ASSERT_PARAM(IsPGAInstance(pgax)); + pgax->PGA_CTRL1.BIT.da_pga_mode_ctrl = BASE_CFG_ENABLE; +} + +/** + * @brief PGA mode configuration, disable external resistor gain mode. + * @param pgax: amplifier register base address. + * @retval None. + */ +static inline void DCL_PGA_DisableExtGainMode(PGA_RegStruct *pgax) +{ + PGA_ASSERT_PARAM(IsPGAInstance(pgax)); + pgax->PGA_CTRL1.BIT.da_pga_mode_ctrl = BASE_CFG_DISABLE; +} + +/** + * @brief Fedforward capacitor compensation configuration in PGA external gain mode + * @param pgax: amplifier register base address. + * @param extValue: Configured value of the capacitor compensation. + * @retval None. + */ +static inline void DCL_PGA_SetExtCompensation(PGA_RegStruct *pgax, unsigned short extValue) +{ + PGA_ASSERT_PARAM(IsPGAInstance(pgax)); + PGA_PARAM_CHECK_NO_RET(extValue <= PGA_PGA_MAX_GAIN); + pgax->PGA_CTRL1.BIT.da_pga_cf_ctrl = extValue; +} + +/** + * @brief PGA enable Test mode. + * @param pgax: amplifier register base address. + * @retval None. + */ +static inline void DCL_PGA_EnableTestMode(PGA_RegStruct *pgax) +{ + PGA_ASSERT_PARAM(IsPGAInstance(pgax)); + pgax->PGA_TEST.BIT.da_pga_test_enh = BASE_CFG_ENABLE; +} + +/** + * @brief PGA disable Test mode. + * @param pgax: amplifier register base address. + * @retval None. + */ +static inline void DCL_PGA_DisableTestMode(PGA_RegStruct *pgax) +{ + PGA_ASSERT_PARAM(IsPGAInstance(pgax)); + pgax->PGA_TEST.BIT.da_pga_test_enh = BASE_CFG_DISABLE; +} + +/** + * @brief Set feedforward capacitance compensation in external gain mode. + * @param pgax: amplifier register base address. + * @param extBigvalue feedforward capacitance compensation. + * @retval None. + * @note To configure this register, must set da_pga_cf_ctrl to 111. + */ +static inline void DCL_PGA_SetExtCapCompValue(PGA_RegStruct *pgax, unsigned short extBigvalue) +{ + PGA_ASSERT_PARAM(IsPGAInstance(pgax)); + PGA_PARAM_CHECK_NO_RET(extBigvalue <= PGA_EXT_VLAUE); + pgax->PGA_RSV.BIT.da_pga_cf_ctrl1 = extBigvalue; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/pga/src/pga.c b/vendor/others/demo/5-tim_adc/demo/drivers/pga/src/pga.c new file mode 100644 index 000000000..ebc94a1f6 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/pga/src/pga.c @@ -0,0 +1,101 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file pga.c + * @author MCU Driver Team. + * @brief Programmable Gain Amplifier HAL level module driver. + * This file provides firmware functions to manage the following + * functionalities of the amplifier + * + Programmable Gain Amplifier's Initialization and de-initialization functions + * + Set amplifier's gain value + */ +#include "pga.h" +#include "assert.h" + +/** + * @brief PGA HAL Init + * @param pgaHandle: PGA handle. + * @retval BASE_StatusType. BASE_STATUS_OK: success, BASE_STATUS_ERROR: fail. + */ +BASE_StatusType HAL_PGA_Init(PGA_Handle *pgaHandle) +{ + PGA_ASSERT_PARAM(pgaHandle != NULL); + PGA_ASSERT_PARAM(IsPGAInstance(pgaHandle->baseAddress)); + PGA_PARAM_CHECK_WITH_RET(IsPgaGain(pgaHandle->gain), BASE_STATUS_ERROR); + PGA_PARAM_CHECK_WITH_RET(IsPgaExtCapCompensation(pgaHandle->handleEx.extCapCompensation), BASE_STATUS_ERROR); + /* Initial configuration of the PGA. */ + PGA_CTRL1_REG pgaControl1; + pgaControl1.reg = pgaHandle->baseAddress->PGA_CTRL1.reg; + pgaControl1.BIT.da_pga_mode_ctrl = pgaHandle->externalResistorMode; /* PGA mode configuration. */ + pgaControl1.BIT.da_pga_gain_ctrl = pgaHandle->gain; /* PGA gain setting. */ + pgaControl1.BIT.da_pga_cf_ctrl = pgaHandle->handleEx.extCapCompensation; + pgaHandle->baseAddress->PGA_CTRL1.reg = pgaControl1.reg; + /* Enable PGA */ + pgaHandle->baseAddress->PGA_CTRL0.BIT.da_pga_enh = BASE_CFG_ENABLE; + return BASE_STATUS_OK; +} + +/** + * @brief PGA HAL DeInit + * @param pgaHandle: PGA handle. + * @retval BASE_StatusType. + */ +BASE_StatusType HAL_PGA_DeInit(PGA_Handle *pgaHandle) +{ + PGA_ASSERT_PARAM(pgaHandle != NULL); + PGA_ASSERT_PARAM(IsPGAInstance(pgaHandle->baseAddress)); + pgaHandle->baseAddress->PGA_CTRL0.reg = BASE_CFG_DISABLE; /* Disable PGA. */ + pgaHandle->baseAddress->PGA_CTRL1.reg = BASE_CFG_DISABLE; /* Gain and mode deinitialization. */ + return BASE_STATUS_OK; +} + +/** + * @brief Set Gain value + * @param pgaHandle: PGA handle. + * @param gain: gain value. @ref PGA_GainValue + * @retval None. + */ +void HAL_PGA_SetGain(PGA_Handle *pgaHandle, PGA_GainValue gain) +{ + PGA_ASSERT_PARAM(pgaHandle != NULL); + PGA_ASSERT_PARAM(IsPGAInstance(pgaHandle->baseAddress)); + pgaHandle->baseAddress->PGA_CTRL1.BIT.da_pga_gain_ctrl = gain; /* Gain value setting. */ +} + +/** + * @brief Start PGA + * @param pgaHandle: PGA handle. + * @retval None + */ +void HAL_PGA_Start(PGA_Handle *pgaHandle) +{ + PGA_ASSERT_PARAM(pgaHandle != NULL); + PGA_ASSERT_PARAM(IsPGAInstance(pgaHandle->baseAddress)); + pgaHandle->baseAddress->PGA_CTRL0.BIT.da_pga_enh = BASE_CFG_ENABLE; /* Enable PGA. */ +} + +/** + * @brief Stop PGA + * @param pgaHandle: PGA handle. + * @retval None + */ +void HAL_PGA_Stop(PGA_Handle *pgaHandle) +{ + PGA_ASSERT_PARAM(pgaHandle != NULL); + PGA_ASSERT_PARAM(IsPGAInstance(pgaHandle->baseAddress)); + pgaHandle->baseAddress->PGA_CTRL0.BIT.da_pga_enh = BASE_CFG_DISABLE; /* Disable PGA. */ +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/pmc/common/inc/pmc.h b/vendor/others/demo/5-tim_adc/demo/drivers/pmc/common/inc/pmc.h new file mode 100644 index 000000000..d05b66358 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/pmc/common/inc/pmc.h @@ -0,0 +1,96 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file pmc.h + * @author MCU Driver Team. + * @brief PMC module driver. + * This file provides functions declaration of PMC. + * + PMC's initialization and de-initialization functions. + * + Interface declaration of enter sleep, deepsleep and shutdowm mode. + * + PMC's register callback function. + */ + +#ifndef __McuMagicTag_PMC_H__ +#define __McuMagicTag_PMC_H__ +#include "pmc_ip.h" + +/** + * @defgroup PMC PMC + * @brief PMC module. + * @{ + */ + +/** + * @defgroup PMC_Common PMC Common + * @brief PMC common external module. + * @{ + */ + + +/** + * @defgroup PMC_Common_Param PMC Common Parameters + * @{ + */ + +/** + * @brief Definition of callback function type + */ +typedef void (* PMC_CallbackType)(void *pmcHandle); + +/** + * @brief PMC Handle + */ +typedef struct _PMC_Handle { + PMC_RegStruct *baseAddress; /**< Register base address. */ + PMC_LowpowerWakeupSrc wakeupSrc; /**< Wakeup source of deep sleep. */ + PMC_ActMode wakeupActMode; /**< Wakeup pin level mode of PMC module. */ + unsigned int wakeupTime; /**< Wakeup time of deep sleep. */ + bool pvdEnable; /**< PVD function enable. */ + PMC_PvdThreshold pvdThreshold; /**< PVD threshold voltage level. */ + PMC_UserCallBack userCallBack; /**< User-defined callback function. */ + PMC_ExtendHandle handleEx; /**< Extend handle, configuring some special parameters. */ +} PMC_Handle; + +/** + * @} + */ + +/** + * @defgroup PMC_API_Declaration PMC HAL API + * @{ + */ +void HAL_PMC_Init(PMC_Handle *handle); +void HAL_PMC_DeInit(PMC_Handle *handle); +void HAL_PMC_EnterSleepMode(void); +void HAL_PMC_EnterDeepSleepMode(PMC_Handle *handle); +void HAL_PMC_EnterShutdownMode(PMC_Handle *handle); +PMC_LowpowerType HAL_PMC_GetWakeupType(PMC_Handle *handle); +void HAL_PMC_RegisterCallback(PMC_Handle *handle, PMC_CallBackID callbackID, PMC_CallbackType pCallback); +void HAL_PMC_IrqHandler(void *handle); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/pmc/inc/pmc_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/pmc/inc/pmc_ip.h new file mode 100644 index 000000000..d3a4b234d --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/pmc/inc/pmc_ip.h @@ -0,0 +1,632 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file pmc_ip.h + * @author MCU Driver Team + * @brief Header file containing PMC module DCL driver functions. + * This file provides functions to manage the following functionalities of PMC module. + * + Definition of PMC configuration parameters. + * + PMC registers mapping structures. + * + Direct Configutration Layer driver functions. + */ +#ifndef McuMagicTag_PMC_IP_H +#define McuMagicTag_PMC_IP_H + +#include "baseinc.h" + +#ifdef PMC_PARAM_CHECK +#define PMC_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define PMC_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define PMC_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define PMC_ASSERT_PARAM(para) ((void)0U) +#define PMC_PARAM_CHECK_NO_RET(para) ((void)0U) +#define PMC_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +#define PMC_WAKEUP_SRC_MARSK 0x3F +#define PMC_WAKEUP_ACT_MODE_MARSK 0x3 + +/** + * @addtogroup PMC + * @{ + */ + +/** + * @defgroup PMC_IP PMC_IP + * @brief PMC_IP: pmc_v1. + * @{ + */ + +/** + * @defgroup PMC_Param_Def PMC Parameters Definition + * @brief Definition of PMC configuration parameters + * @{ + */ + + +/** + * @brief wakeup pin level mode of PMC module. + * @details status flag: + * + PMC_WAKEUP_ACT_UP_EDGE -- Wakeup valid in up edge + * + PMC_WAKEUP_ACT_DOWN_EDGE -- Wakeup valid in down edge + * + PMC_WAKEUP_ACT_HIGH_LEVEL -- Wakeup valid in high edge + * + PMC_WAKEUP_ACT_LOW_LEVEL -- Wakeup valid in low edge + */ +typedef enum { + PMC_WAKEUP_ACT_UP_EDGE = 0x00000000U, + PMC_WAKEUP_ACT_DOWN_EDGE = 0x00000001U, + PMC_WAKEUP_ACT_HIGH_LEVEL = 0x00000002U, + PMC_WAKEUP_ACT_LOW_LEVEL = 0x00000003U, +} PMC_ActMode; + +/** + * @brief Wakeup source of deep sleep. + * @details status flag: + * + PMC_WAKEUP_0 -- Wakeup from DS_WAKEUP0. + * + PMC_WAKEUP_2 -- Wakeup from DS_WAKEUP2. + * + PMC_WAKEUP_3 -- Wakeup from DS_WAKEUP3. + * + PMC_WAKEUP_CNT -- Wakeup from timer. + * + PMC_WAKEUP_NONE --No Wakeup source. + */ +typedef enum { + PMC_WAKEUP_0 = 0x00000000U, + PMC_WAKEUP_2 = 0x00000002U, + PMC_WAKEUP_3 = 0x00000003U, + PMC_WAKEUP_CNT = 0x00000004U, + PMC_WAKEUP_NONE = 0x00000005U, +} PMC_LowpowerWakeupSrc; + +/** + * @brief Callback Triggering Event Enumeration Definition + */ +typedef enum { + PMC_PVD_INT_ID = 0x00, +} PMC_CallBackID; + +/** + * @brief Lowpower type. + * @details status flag: + * + PMC_LP_NONE -- Non-lowpower mode. + * + PMC_LP_DEEPSLEEP -- Deepsleep mode. + */ +typedef enum { + PMC_LP_NONE = 0x00000000U, + PMC_LP_DEEPSLEEP = 0x00000001U, +} PMC_LowpowerType; + +static unsigned int g_internalPvdValueTable[8][2] = { + {0x00, 0x00}, /* rising edge 2.18V, falling edge 2.08V. */ + {0x01, 0x01}, /* rising edge 2.28V, falling edge 2.18V. */ + {0x02, 0x02}, /* rising edge 2.38V, falling edge 2.28V. */ + {0x03, 0x03}, /* rising edge 2.48V, falling edge 2.38V. */ + {0x04, 0x04}, /* rising edge 2.58V, falling edge 2.48V. */ + {0x05, 0x05}, /* rising edge 2.68V, falling edge 2.58V. */ + {0x06, 0x06}, /* rising edge 2.78V, falling edge 2.68V. */ + {0x07, 0x07}, /* rising edge 2.88V, falling edge 2.78V. */ +}; + +/** + * @brief PMC PVD threshold voltage level. + * @details PMC_PVD_THRED_LEVEL, For details, see g_pvdValueTable. + */ +typedef enum { + PMC_PVD_THRED_LEVEL0 = 0x00000000U, + PMC_PVD_THRED_LEVEL1 = 0x00000001U, + PMC_PVD_THRED_LEVEL2 = 0x00000002U, + PMC_PVD_THRED_LEVEL3 = 0x00000003U, + PMC_PVD_THRED_LEVEL4 = 0x00000004U, + PMC_PVD_THRED_LEVEL5 = 0x00000005U, + PMC_PVD_THRED_LEVEL6 = 0x00000006U, + PMC_PVD_THRED_LEVEL7 = 0x00000007U, +} PMC_PvdThreshold; + +/** + * @brief PMC extend handle, configuring some special parameters. + */ +typedef struct { +} PMC_ExtendHandle; + +/** + * @brief User-defined callback function. + */ +typedef struct { + /** Event callback function of the flash module */ + void (*PmcCallBack)(void *handle); +} PMC_UserCallBack; + +/** + * @} + */ + +/** + * @defgroup PMC_REG_Definition PMC Register Structure. + * @brief PMC Register Structure Definition. + * @{ + */ + +/** + * @brief Low-power mode control registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved_0 : 4; + unsigned int deepsleep_req : 1; /**< The system enters the deepsleep mode. */ + unsigned int reserved_1 : 27; + } BIT; +} volatile PMC_LOWPOWER_MODE; + +/** + * @brief Wakeup control in deepsleep mode registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int wakeup0_act_mode : 2; /**< Valid mode select of WakeUP0. */ + unsigned int reserved_3 : 2; + unsigned int wakeup2_act_mode : 2; /**< Valid mode select of wakeup2. */ + unsigned int wakeup3_act_mode : 2; /**< Valid mode select of wakeup3. */ + unsigned int wakeup0_en : 1; /**< Wakeup0 enable. */ + unsigned int reserved_2 : 1; + unsigned int wakeup2_en : 1; /**< Wakeup2 enable. */ + unsigned int wakeup3_en : 1; /**< Wakeup3 enable. */ + unsigned int reserved_0 : 4; + unsigned int cnt32k_wakeup_en : 1; /**< Scheduled wakeup enable. */ + unsigned int reserved_1 : 15; + } BIT; +} volatile PMC_WAKEUP_CTRL; + +/** + * @brief Low-power status query registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int wakeup_src_lock : 6; /**< Starts the wakeup source query. */ + unsigned int reserved_0 : 3; + unsigned int starup_from_deepsleep : 1; /**< Start from the deepsleep state. */ + unsigned int reserved_1 : 2; + unsigned int wakeup0_status : 1; /**< Wakeup0 wakeup source status. */ + unsigned int reserved_3 : 1; + unsigned int wakeup2_status : 1; /**< Wakeup2 wakeup source status. */ + unsigned int wakeup3_status : 1; /**< Wakeup3 wakeup source status. */ + unsigned int reserved_2 : 16; + } BIT; +} volatile PMC_LOWPOWER_STATUS; + +/** + * @brief PMC registers definition structure. + */ +typedef struct { + unsigned int reserved_0[128]; + PMC_LOWPOWER_MODE LOWPOWER_MODE; /**< Low-power mode control register. Offset address: 0x200. */ + unsigned int CNT32K_WAKE_CYC; /**< Timed wakeup period config reg. Offset address: 0x204. */ + PMC_WAKEUP_CTRL WAKEUP_CTRL; /**< Wakeup control register in deepsleep mode. + Offset address: 0x208. */ + PMC_LOWPOWER_STATUS LOWPOWER_STATUS; /**< Low-power status query register. Offset address: 0x20C. */ + unsigned int reserved_1[828]; + unsigned int AON_USER_REG0; /**< AON domain user register 0. Offset address: 0xF00. */ + unsigned int AON_USER_REG1; /**< AON domain user register 1. Offset address: 0xF04. */ + unsigned int AON_USER_REG2; /**< AON domain user register 2. Offset address: 0xF08. */ + unsigned int AON_USER_REG3; /**< AON domain user register 3. Offset address: 0xF0C. */ +} volatile PMC_RegStruct; + +/** + * @brief Check PVD threshold voltage level. + * @param value value of losc rtrim value. + * @retval true + * @retval false + */ +static inline bool IsPvdThreshold(PMC_PvdThreshold value) +{ + return (value == PMC_PVD_THRED_LEVEL0 || value == PMC_PVD_THRED_LEVEL1 || \ + value == PMC_PVD_THRED_LEVEL2 || value == PMC_PVD_THRED_LEVEL3 || \ + value == PMC_PVD_THRED_LEVEL4 || value == PMC_PVD_THRED_LEVEL5 || \ + value == PMC_PVD_THRED_LEVEL6 || value == PMC_PVD_THRED_LEVEL7); +} + +/** + * @brief Check PMC Wakeup source. + * @param wakeSrc value of Wakeup source. + * @retval true + * @retval false + */ +static inline bool IsWakeupSrc(PMC_LowpowerWakeupSrc wakeSrc) +{ + return (wakeSrc == PMC_WAKEUP_0 || \ + wakeSrc == PMC_WAKEUP_2 || wakeSrc == PMC_WAKEUP_3 || \ + wakeSrc == PMC_WAKEUP_CNT); +} + +/** + * @brief Check PMC active mode. + * @param mode value of active mode. + * @retval true + * @retval false + */ +static inline bool IsActiveMode(PMC_ActMode mode) +{ + return (mode == PMC_WAKEUP_ACT_UP_EDGE || mode == PMC_WAKEUP_ACT_DOWN_EDGE || \ + mode == PMC_WAKEUP_ACT_HIGH_LEVEL || mode == PMC_WAKEUP_ACT_LOW_LEVEL); +} + +/** + * @brief Enter sleep mode interface. + * @param None. + * @retval None. + */ +static inline void DCL_PMC_EnterSleep(void) +{ +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + /* If user mode is supported, make sure to execute WFI + commands in machine mode */ + static unsigned int priv = RISCV_U_MODE; + RISCV_PRIV_MODE_SWITCH(priv); + __asm("wfi"); + RISCV_PRIV_MODE_SWITCH(priv); +#else + /* Only machine mode, no need for mode switching */ + __asm("wfi"); +#endif +} + +/** + * @brief Enter deepsleep mode interface. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_EnterDeepSleep(PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + pmcx->LOWPOWER_MODE.BIT.deepsleep_req = BASE_CFG_ENABLE; +} + +/** + * @brief Quit deepsleep mode interface. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_QuitDeepSleep(PMC_RegStruct * const pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + pmcx->LOWPOWER_MODE.BIT.deepsleep_req = BASE_CFG_DISABLE; +} +/** + * @brief Setting wakeup timer cycle. + * @param pmcx PMC register base address. + * @param cycle Timer cycle value. + * @retval None. + */ +static inline void DCL_PMC_SetFixTimeWakeupTimer(PMC_RegStruct *pmcx, unsigned int cycle) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + pmcx->CNT32K_WAKE_CYC = cycle; +} + +/** + * @brief Enable wakeup from timer. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_FixTimeWakeupEnable(PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + pmcx->WAKEUP_CTRL.BIT.cnt32k_wakeup_en = BASE_CFG_ENABLE; +} + +/** + * @brief Disable wakeup from timer. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_FixTimeWakeupDisable(PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + pmcx->WAKEUP_CTRL.BIT.cnt32k_wakeup_en = BASE_CFG_DISABLE; +} + +/** + * @brief Enable wakeup from WAKEUP0. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_Wakeup0Enable(PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + pmcx->WAKEUP_CTRL.BIT.wakeup0_en = BASE_CFG_ENABLE; +} + +/** + * @brief Disable wakeup from WAKEUP0. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_Wakeup0Disable(PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + pmcx->WAKEUP_CTRL.BIT.wakeup0_en = BASE_CFG_DISABLE; +} + +/** + * @brief Enable wakeup from WAKEUP2. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_Wakeup2Enable(PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + pmcx->WAKEUP_CTRL.BIT.wakeup2_en = BASE_CFG_ENABLE; +} + +/** + * @brief Disable wakeup from WAKEUP2. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_Wakeup2Disable(PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + pmcx->WAKEUP_CTRL.BIT.wakeup2_en = BASE_CFG_DISABLE; +} + +/** + * @brief Enable wakeup from WAKEUP3. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_Wakeup3Enable(PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + pmcx->WAKEUP_CTRL.BIT.wakeup3_en = BASE_CFG_ENABLE; +} + +/** + * @brief Disable wakeup from WAKEUP3. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_Wakeup3Disable(PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + pmcx->WAKEUP_CTRL.BIT.wakeup3_en = BASE_CFG_DISABLE; +} + +/** + * @brief Setting WAKEUP0 active level mode. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_SetWakeup0ActiveMode(PMC_RegStruct *pmcx, PMC_ActMode mode) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + PMC_PARAM_CHECK_NO_RET(IsActiveMode(mode)); + pmcx->WAKEUP_CTRL.BIT.wakeup0_act_mode = ((unsigned int)mode & PMC_WAKEUP_ACT_MODE_MARSK); +} + +/** + * @brief Setting WAKEUP2 active level mode. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_SetWakeup2ActiveMode(PMC_RegStruct *pmcx, PMC_ActMode mode) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + PMC_PARAM_CHECK_NO_RET(IsActiveMode(mode)); + pmcx->WAKEUP_CTRL.BIT.wakeup2_act_mode = ((unsigned int)mode & PMC_WAKEUP_ACT_MODE_MARSK); +} + +/** + * @brief Setting WAKEUP3 active level mode. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_SetWakeup3ActiveMode(PMC_RegStruct *pmcx, PMC_ActMode mode) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + PMC_PARAM_CHECK_NO_RET(IsActiveMode(mode)); + pmcx->WAKEUP_CTRL.BIT.wakeup3_act_mode = ((unsigned int)mode & PMC_WAKEUP_ACT_MODE_MARSK); +} + +/** + * @brief Getting WAKEUP0 status. + * @param pmcx PMC register base address. + * @retval Wakeup status. + */ +static inline bool DCL_PMC_GetWakeup0Status(const PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + return (pmcx->LOWPOWER_STATUS.BIT.wakeup0_status); +} + +/** + * @brief Getting WAKEUP2 status. + * @param pmcx PMC register base address. + * @retval Wakeup status. + */ +static inline bool DCL_PMC_GetWakeup2Status(const PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + return (pmcx->LOWPOWER_STATUS.BIT.wakeup2_status); +} + +/** + * @brief Getting WAKEUP3 status. + * @param pmcx PMC register base address. + * @retval Wakeup status. + */ +static inline bool DCL_PMC_GetWakeup3Status(const PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + return (pmcx->LOWPOWER_STATUS.BIT.wakeup3_status); +} + +/** + * @brief Getting flag of wakeup from deepsleep mode. + * @param pmcx PMC register base address. + * @retval flag of wakeup from deepsleep mode. + */ +static inline bool DCL_PMC_GetStartupFromDeepSleepFlag(const PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + return (pmcx->LOWPOWER_STATUS.BIT.starup_from_deepsleep); +} + +/** + * @brief Getting wakeup source. + * @param pmcx PMC register base address. + * @retval source of wakeup. + */ +static inline unsigned int DCL_PMC_GetWakeupSrc(const PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + return (pmcx->LOWPOWER_STATUS.BIT.wakeup_src_lock & PMC_WAKEUP_SRC_MARSK); +} + +/** + * @brief Setting always on user's regsiter 0. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_SetAlwaysOnUserReg0(PMC_RegStruct *pmcx, unsigned int value) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + pmcx->AON_USER_REG0 = value; +} + +/** + * @brief Getting always on user's regsiter 0. + * @param pmcx PMC register base address. + * @retval Register0's value. + */ +static inline unsigned int DCL_PMC_GetAlwaysOnUserReg0(const PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + return (pmcx->AON_USER_REG0); +} + +/** + * @brief Setting always on user's regsiter 1. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_SetAlwaysOnUserReg1(PMC_RegStruct *pmcx, unsigned int value) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + pmcx->AON_USER_REG1 = value; +} + +/** + * @brief Getting always on user's regsiter 1. + * @param pmcx PMC register base address. + * @retval Register1's value. + */ +static inline unsigned int DCL_PMC_GetAlwaysOnUserReg1(const PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + return (pmcx->AON_USER_REG1); +} + +/** + * @brief Setting always on user's regsiter 2. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_SetAlwaysOnUserReg2(PMC_RegStruct *pmcx, unsigned int value) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + pmcx->AON_USER_REG2 = value; +} + +/** + * @brief Getting always on user's regsiter 2. + * @param pmcx PMC register base address. + * @retval Register2's value. + */ +static inline unsigned int DCL_PMC_GetAlwaysOnUserReg2(const PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + return (pmcx->AON_USER_REG2); +} + +/** + * @brief Setting always on user's regsiter 3. + * @param pmcx PMC register base address. + * @retval None. + */ +static inline void DCL_PMC_SetAlwaysOnUserReg3(PMC_RegStruct *pmcx, unsigned int value) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + pmcx->AON_USER_REG3 = value; +} + +/** + * @brief Getting always on user's regsiter 3. + * @param pmcx PMC register base address. + * @retval Register3's value. + */ +static inline unsigned int DCL_PMC_GetAlwaysOnUserReg3(const PMC_RegStruct *pmcx) +{ + PMC_ASSERT_PARAM(IsPMCInstance(pmcx)); + return (pmcx->AON_USER_REG3); +} + +/** + * @brief Enable PVD function. + * @retval None. + */ +static inline void DCL_PMC_EnablePvd(void) +{ + SYSCTRL1_RegStruct *sysCtrl1x = SYSCTRL1_BASE; + sysCtrl1x->PVD_CFG.BIT.pvd_en = BASE_CFG_ENABLE; +} + +/** + * @brief Disable PVD function. + * @retval None. + */ +static inline void DCL_PMC_DisablePvd(void) +{ + SYSCTRL1_RegStruct *sysCtrl1x = SYSCTRL1_BASE; + sysCtrl1x->PVD_CFG.BIT.pvd_en = BASE_CFG_DISABLE; +} + +/** + * @brief Set PVD threshold. + * @param threshold PMC PVD threshold voltage level. + * @retval None. + */ +static inline void DCL_PMC_SetPvdThreshold(PMC_PvdThreshold threshold) +{ + PMC_ASSERT_PARAM(IsPvdThreshold(threshold)); + SYSCTRL1_RegStruct *sysCtrl1x = SYSCTRL1_BASE; + sysCtrl1x->PVD_CFG.BIT.pvd_fall_thd = g_internalPvdValueTable[threshold][0]; + sysCtrl1x->PVD_CFG.BIT.pvd_rise_thd = g_internalPvdValueTable[threshold][1]; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_PMC_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/pmc/src/pmc.c b/vendor/others/demo/5-tim_adc/demo/drivers/pmc/src/pmc.c new file mode 100644 index 000000000..34ecd0747 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/pmc/src/pmc.c @@ -0,0 +1,199 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file pmc.c + * @author MCU Driver Team. + * @brief ACMP HAL level module driver. + * This file provides firmware functions to manage the following + * functionalities of the DAC and Comparator. + * + PMC's initialization and de-initialization functions. + * + Enter sleep, deepsleep mode functions. + */ + +#include "pmc_ip.h" +#include "pmc.h" + +#define WAKEUP_ENABLE_OFFSET 0x8 +#define WAKE_ACT_MODE_REG_WIDTH 0x2 + +/** + * @brief Setting deepsleep wakeup source. + * @param pmcHandle: PMC handle. + * @retval None. + */ +static void PMC_SetDeepSleepWakeupSrc(PMC_Handle *pmcHandle) +{ + PMC_ASSERT_PARAM(pmcHandle != NULL); + PMC_ASSERT_PARAM(IsPMCInstance(pmcHandle->baseAddress)); + PMC_PARAM_CHECK_NO_RET(IsWakeupSrc(pmcHandle->wakeupSrc)); + if (pmcHandle->wakeupSrc == PMC_WAKEUP_NONE) { /* No wakeup source. */ + return; + } + + if (pmcHandle->wakeupSrc == PMC_WAKEUP_CNT) { + pmcHandle->baseAddress->CNT32K_WAKE_CYC = pmcHandle->wakeupTime; /* Set wakeup time */ + pmcHandle->baseAddress->WAKEUP_CTRL.BIT.cnt32k_wakeup_en = BASE_CFG_ENABLE; /* Enable wakeup from timer */ + } else { + PMC_PARAM_CHECK_NO_RET(IsActiveMode(pmcHandle->wakeupActMode)); + pmcHandle->baseAddress->WAKEUP_CTRL.reg |= (pmcHandle->wakeupActMode) \ + << (pmcHandle->wakeupSrc * WAKE_ACT_MODE_REG_WIDTH); + pmcHandle->baseAddress->WAKEUP_CTRL.reg |= ((0x1 << pmcHandle->wakeupSrc) << WAKEUP_ENABLE_OFFSET); + } +} + +/** + * @brief Init PVD function. + * @param pmcHandle: PMC handle. + * @retval None. + */ +static void PMC_PvdInit(PMC_Handle *pmcHandle) +{ + PMC_ASSERT_PARAM(pmcHandle != NULL); + PMC_ASSERT_PARAM(IsPMCInstance(pmcHandle->baseAddress)); + PMC_PARAM_CHECK_NO_RET(pmcHandle->pvdThreshold <= PMC_PVD_THRED_LEVEL7); + if (pmcHandle->pvdEnable == BASE_CFG_ENABLE) { /* if PVD function is enable */ + DCL_PMC_EnablePvd(); + DCL_PMC_SetPvdThreshold(pmcHandle->pvdThreshold); /* set PVD threhold voltage */ + } else { + DCL_PMC_DisablePvd(); + } +} + +/** + * @brief PMC initialize interface. + * @param handle: PMC handle. + * @retval None. + */ +void HAL_PMC_Init(PMC_Handle *handle) +{ + PMC_ASSERT_PARAM(handle != NULL); + PMC_ASSERT_PARAM(IsPMCInstance(handle->baseAddress)); + PMC_PvdInit(handle); + PMC_SetDeepSleepWakeupSrc(handle); +} + +/** + * @brief PMC deinitialize interface. + * @param handle: PMC handle. + * @retval None. + */ +void HAL_PMC_DeInit(PMC_Handle *handle) +{ + PMC_ASSERT_PARAM(handle != NULL); + PMC_ASSERT_PARAM(IsPMCInstance(handle->baseAddress)); + DCL_PMC_DisablePvd(); + handle->baseAddress->WAKEUP_CTRL.reg = BASE_CFG_DISABLE; /* Disable all wakeup source. */ + handle->userCallBack.PmcCallBack = NULL; /* Clean interrupt callback functions. */ +} + +/** + * @brief Enter sleep interface. + * @param None. + * @retval None. + */ +void HAL_PMC_EnterSleepMode(void) +{ +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + /* If user mode is supported, make sure to execute WFI + commands in machine mode */ + static unsigned int priv = RISCV_U_MODE; + RISCV_PRIV_MODE_SWITCH(priv); + __asm("wfi"); + RISCV_PRIV_MODE_SWITCH(priv); +#else + __asm("wfi"); +#endif +} + +/** + * @brief Enter deep sleep interface. + * @param handle: PMC handle. + * @retval None. + */ +void HAL_PMC_EnterDeepSleepMode(PMC_Handle *handle) +{ + PMC_ASSERT_PARAM(handle != NULL); + PMC_ASSERT_PARAM(IsPMCInstance(handle->baseAddress)); + handle->baseAddress->LOWPOWER_MODE.BIT.deepsleep_req = BASE_CFG_ENABLE; +} + +/** + * @brief Enter shutdown interface. + * @param handle: PMC handle. + * @retval None. + */ +void HAL_PMC_EnterShutdownMode(PMC_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* The 3061M does not support this function. */ +} + +/** + * @brief Get wakeup source type. + * @param handle: PMC handle. + * @retval Lowpower type. + */ +PMC_LowpowerType HAL_PMC_GetWakeupType(PMC_Handle *handle) +{ + PMC_ASSERT_PARAM(handle != NULL); + PMC_ASSERT_PARAM(IsPMCInstance(handle->baseAddress)); + + PMC_LowpowerType wakeupMode; + bool deepsleepFlag = BASE_CFG_UNSET; /* Set as default. */ + deepsleepFlag = handle->baseAddress->LOWPOWER_STATUS.BIT.starup_from_deepsleep; + if (deepsleepFlag == BASE_CFG_SET) { /* If deepsleep flag is set */ + wakeupMode = PMC_LP_DEEPSLEEP; + } else { + wakeupMode = PMC_LP_NONE; + } + return wakeupMode; +} + +/** + * @brief Interrupt handler function. + * @param handle PMC module handle. + * @retval None. + */ +void HAL_PMC_IrqHandler(void *handle) +{ + PMC_ASSERT_PARAM(handle != NULL); + PMC_Handle *pmcHandle = (PMC_Handle *)handle; + PMC_ASSERT_PARAM(IsPMCInstance(pmcHandle->baseAddress)); + + SYSCTRL1_RegStruct *sysCtrl1x = SYSCTRL1_BASE; + if (sysCtrl1x->PVD_STATUS.BIT.pvd_toggle == 1) { /* PVD interrupt */ + if (pmcHandle->userCallBack.PmcCallBack != NULL) { + pmcHandle->userCallBack.PmcCallBack(pmcHandle); /* execute user's callback */ + } + } +} + +/** + * @brief Interrupt callback functions registration interface. + * @param handle PMC module handle. + * @param callbackID base callback id + * @param pCallback Pointer for the user callback function. + * @retval None. + */ +void HAL_PMC_RegisterCallback(PMC_Handle *handle, PMC_CallBackID callbackID, PMC_CallbackType pCallback) +{ + PMC_ASSERT_PARAM(handle != NULL); + PMC_ASSERT_PARAM(IsPMCInstance(handle->baseAddress)); + PMC_ASSERT_PARAM(pCallback != NULL); + BASE_FUNC_UNUSED(callbackID); /* This parameter is not used to prevent compilation errors. */ + handle->userCallBack.PmcCallBack = pCallback; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/qdm/common/inc/qdm.h b/vendor/others/demo/5-tim_adc/demo/drivers/qdm/common/inc/qdm.h new file mode 100644 index 000000000..b890338e9 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/qdm/common/inc/qdm.h @@ -0,0 +1,156 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file qdm.h + * @author MCU Driver Team + * @brief QDM HAL level module driver head file. + * @details This file provides firmware functions to manage the following + * functionalities of the QDM. + * + Initialization and de-initialization functions. + * + Capm Module Control functions. + * + Speed measure use M function. + * + Stall condition detection. + */ +#ifndef McuMagicTag_QDM_H +#define McuMagicTag_QDM_H + +#include "typedefs.h" +#include "qdm_ip.h" + +#define SECONDS_PER_MINUTES 60 + +/** + * @defgroup QDM QDM + * @brief QDM module. + * @{ + */ + +/** + * @defgroup QDM_Common QDM Common + * @brief QDM common external module. + * @{ + */ + + +/** + * @defgroup QDM_Common_Param QDM Common Parameters + * @{ + */ + +/** + * @brief QDM callback function type + */ +typedef enum { + QDM_TSU_CYCLE = 0x00000000U, + QDM_SPEED_LOSE = 0x00000001U, + QDM_INDEX_LOCKED = 0x00000002U, + QDM_DIR_CHANGE = 0x00000003U, + QDM_PHASE_ERROR = 0x00000004U, + QDM_POS_MATCH = 0x00000005U, + QDM_POS_READY = 0x00000006U, + QDM_POS_CNT_ERROR = 0x00000007U, + QDM_POS_CNT_OVERFLOW = 0x00000008U, + QDM_POS_CNT_UNDERFLOW = 0x00000009U +} QDM_CallbackFuncType; + +/** + * @} + */ + +/** + * @defgroup QDM_Handle_Definition QDM Handle Definition + * @{ + */ + +/** + * @brief configurations of QDU register + */ +typedef struct { + QDM_DecoderMode decoderMode; + QDM_Resolution resolution; + QDM_QtrgLockMode trgLockMode; + QDM_PtuMode ptuMode; + QDM_SwapSelect swap; + unsigned int polarity; +} QDMCtrlConfigure; + +/** + * @brief configurations of input filter level + */ +typedef struct { + unsigned int qdmAFilterLevel; + unsigned int qdmBFilterLevel; + unsigned int qdmZFilterLevel; +} QDMFilter; + +/** + * @brief configurations of input filter level + */ +typedef struct _QDM_handle { + QDM_RegStruct *baseAddress; /**< base address */ + QDM_EmulationMode emuMode; /**< emulation mode select */ + QDMFilter inputFilter; /**< filter settings */ + QDMCtrlConfigure ctrlConfig; /**< QDM control configurations */ + QDM_PcntMode pcntMode; /**< position count mode */ + QDM_PcntRstMode pcntRstMode; /**< position count reset mode */ + QDM_PcntIdxInitMode pcntIdxInitMode; /**< position count index initial mode */ + bool subModeEn; /**< sub-module enable */ + QDM_TSUPrescaler tsuPrescaler; /**< tsu prescaler */ + QDM_CEVTPrescaler cevtPrescaler; /**< cevt prescaler */ + unsigned int posInit; /**< init position */ + unsigned int posMax; /**< max position */ + unsigned int qcMax; /**< TSU maximum counter number, default zero */ + unsigned int period; /**< PTU period*/ + unsigned int interruptEn; /**< interrupt settings by bits */ + int motorLineNum; /**< encoder line number */ + int speedRpm; /**< motor speed */ + QDM_IndexLockMode lock_mode; /**< QDM Z index lock mode */ + QDM_UserCallBack userCallBack; /**< QDM Interrupt callback functions */ + QDM_ExtendHandle handleEx; /**< QDM extend parameter */ +} QDM_Handle; + +typedef void (* QDM_CallbackType)(void *handle); +/** + * @} + */ + +/** + * @defgroup QDM_API_Declaration QDM HAL API + * @{ + */ + +/* Hardware abstraction layer */ +BASE_StatusType HAL_QDM_Init(QDM_Handle *qdmHandle); +BASE_StatusType HAL_QDM_DeInit(QDM_Handle *qdmHandle); +void HAL_QDM_GetPhaseErrorStatus(const QDM_Handle *qdmHandle, unsigned int *errStatus); +void HAL_QDM_ReadPosCountAndDir(const QDM_Handle *qdmHandle, unsigned int *count, unsigned int *dir); +int HAL_QDM_GetSpeedRpmM(QDM_Handle *qdmHandle); +int HAL_QDM_GetSpeedRpmMT(QDM_Handle *qdmHandle); +void HAL_QDM_IrqHandler(void *handle); +void HAL_QDM_RegisterCallback(QDM_Handle *qdmHandle, QDM_CallbackFuncType typeID, QDM_CallbackType pCallback); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/qdm/inc/qdm_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/qdm/inc/qdm_ip.h new file mode 100644 index 000000000..e19e6caf2 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/qdm/inc/qdm_ip.h @@ -0,0 +1,1663 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file qdm_ip.h + * @author MCU Driver Team + * @brief Header file containing QDM module DCL driver functions. + * This file provides functions to manage the following functionalities of QDM module. + * + Definition of QDM configuration parameters. + * + QDM registers mapping structure. + * + Direct Configuration Layer driver functions. + */ + +#ifndef McuMagicTag_QDM_IP_H +#define McuMagicTag_QDM_IP_H + +#include "baseinc.h" + +#ifdef QDM_PARAM_CHECK +#define QDM_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define QDM_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define QDM_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define QDM_ASSERT_PARAM(para) ((void)0U) +#define QDM_PARAM_CHECK_NO_RET(para) ((void)0U) +#define QDM_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +#define QDM_MAX_FILTER_LEVEL 0x00001FFF +#define QDM_PPU_MAX_SYNCOUT_PW 0x00000FFF +/** + * @addtogroup QDM + * @{ + */ + +/** + * @defgroup QDM_IP QDM_IP + * @brief QDM_IP: qdm_v0. + * @{ + */ + +/** + * @defgroup QDM_Param_Def QDM Parameters Definition + * @brief Definition of QDM configuration parameters + * @{ + */ + + +/** + * @brief Emulation mode of QDM module. + * @details Emulation mode: + * + QDM_EMULATION_MODE_STOP_IMMEDIATELY -- The position counter, unit timer, + * capture timer all stop immediately. + * + QDM_EMULATION_MODE_STOP_AT_ROLLOVER -- + * The position counter, unit timer count until period rollover, + * and the capture timer counts until the next unit period event. + * + QDM_EMULATION_MODE_RUN_FREE -- The position counter, unit timer, + * capture timer are all unaffected by an emulation suspend. + */ +typedef enum { + QDM_EMULATION_MODE_STOP_IMMEDIATELY = 0x00000000U, + QDM_EMULATION_MODE_STOP_AT_ROLLOVER = 0x00000001U, + QDM_EMULATION_MODE_RUN_FREE = 0x00000002U, +} QDM_EmulationMode; + +/** + * @brief Status flag of QDM module. + * @details status flag: + * + QDM_STATUS_POS_CNT_ERR -- Position counter error + * + QDM_STATUS_1ST_IDX_OCCURRED -- First index pulse occurred + * + QDM_STATUS_DIR_ON_1ST_IDX -- Direction of first index event + * + QDM_STATUS_CAP_DIR_ERR -- Direction changed between position capture events + * + QDM_STATUS_TSU_OVERFLW_ERR -- Timer stamp timer overflow + * + QDM_STATUS_SPEED_LOST -- Speed lost status + * + QDM_STATUS_DIR_FLAG -- Quadrature direction + * + QDM_STATUS_UNIT_POS_EVENT -- Unit position event detected + */ +typedef enum { + QDM_STATUS_POS_CNT_ERR = 0x00000001U, + QDM_STATUS_1ST_IDX_OCCURRED = 0x00000002U, + QDM_STATUS_DIR_ON_1ST_IDX = 0x00000004U, + QDM_STATUS_CAP_DIR_ERR = 0x00000008U, + QDM_STATUS_TSU_OVERFLW_ERR = 0x00000010U, + QDM_STATUS_SPEED_LOST = 0x00000020U, + QDM_STATUS_DIR_FLAG = 0x00000040U, + QDM_STATUS_UNIT_POS_EVENT = 0x00000080U, +} QDM_StatusFlag; + +/** + * @brief Decoder mode of QDM module. + * @details Decoder mode + * + QDM_QUADRATURE_COUNT -- Quadrature-clock mode + * + QDM_CLOCK_DIR_COUNT -- Direction-count mode + * + QDM_NONSTANDARD_TYPE1 -- Non-standard mode 1 + * + QDM_NONSTANDARD_TYPE2 -- Non-standard mode 2 + */ +typedef enum { + QDM_QUADRATURE_COUNT = 0x00000000U, + QDM_CLOCK_DIR_COUNT = 0x00000001U, + QDM_NONSTANDARD_TYPE1 = 0x00000002U, + QDM_NONSTANDARD_TYPE2 = 0x00000003U, +} QDM_DecoderMode; + +/** + * @brief Decode resolution of QDM module. + * @details Decode resolution: + * + QDM_1X_RESOLUTION -- Count rising edge of QDMA/QDMB only + * + QDM_2X_RESOLUTION -- Count rising and falling edge of QDMA/QDMB + * + QDM_4X_RESOLUTION -- Count rising and falling edge of both QDMA and QDMB + */ +typedef enum { + QDM_1X_RESOLUTION = 0x00000000U, + QDM_2X_RESOLUTION = 0x00000001U, + QDM_4X_RESOLUTION = 0x00000002U, +} QDM_Resolution; + +/** + * @brief Count mode of position processing submodule. + */ +typedef enum { + QDM_PPU_COUNT_MODE_CLK_DIR = 0x00000000U, + QDM_PPU_COUNT_MODE_INCREASE = 0x00000001U, + QDM_PPU_COUNT_MODE_DECREASE = 0x00000002U, +} QDM_PPUCountMode; + +/** + * @brief Reset mode of position counter. + * @details Reset mode: + * + QDM_POSITION_RESET_IDX -- Reset position on the rising edge of inde pulse + * + QDM_POSITION_RESET_MAX_POS -- Reset position on maximum position QCNTMAX + * + QDM_POSITION_RESET_1ST_IDX -- Reset position on the first index pulse + * + QDM_POSITION_RESET_UNIT_TIME_OUT -- Reset position on a unit time trigger + */ +typedef enum { + QDM_POSITION_RESET_IDX = 0x00000000, + QDM_POSITION_RESET_MAX_POS = 0x00000001, + QDM_POSITION_RESET_1ST_IDX = 0x00000002, + QDM_POSITION_RESET_UNIT_TIME_OUT = 0x00000003, +} QDM_PosResetMode; + +/** + * @brief Initializaion mode of the index of position counter. + * @details Initializaion mode: + * + QDM_POSITION_INIT_DO_NOTHING -- No action is configured + * + QDM_POSITION_INIT_RISING_INDEX -- On rising edge of index + * + QDM_POSITION_INIT_FALLING_INDEX -- On falling edge of index + */ +typedef enum { + QDM_POSITION_INIT_DO_NOTHING = 0x00000000U, + QDM_POSITION_INIT_RISING_INDEX = 0x00000002U, + QDM_POSITION_INIT_FALLING_INDEX = 0x00000003U, +} QDM_PosIdxInitMode; + +/** + * @brief Shadow load mode of compare counter. + * @details Load mode: + * + QDM_COMPARE_LOAD_ON_ZERO -- Load on QPOSCNT = 0 + * + QDM_COMPARE_LOAD_ON_MATCH -- Load on QPOSCNT = QPOSCMP + */ +typedef enum { + QDM_COMPARE_LOAD_ON_ZERO = 0x00000000U, + QDM_COMPARE_LOAD_ON_MATCH = 0x00000001U, +} QDM_CompShadowLoad; + +/** + * @brief Polarity of sync-out pulse for position compare. + */ +typedef enum { + QDM_SYNC_OUT_HIGH = 0x00000000U, + QDM_SYNC_OUT_LOW = 0x00000001U, +} QDM_CompSyncOutPolarity; + +/** + * @brief Lock mode of index event. + * @details Lock mode: + * + QDM_LOCK_RESERVE -- Do not lock + * + QDM_LOCK_RISING_INDEX -- On rising edge of index + * + QDM_LOCK_FALLING_INDEX -- On falling edge of index + * + QDM_LOCK_SW_INDEX_MARKER -- On software index marker + */ +typedef enum { + QDM_LOCK_RESERVE = 0x00000000, + QDM_LOCK_RISING_INDEX = 0x00000001, + QDM_LOCK_FALLING_INDEX = 0x00000002, + QDM_LOCK_SW_INDEX_MARKER = 0x00000003, +} QDM_IndexLockMode; + +/** + * @brief Prescaler of Time Stamp Unit clock. + * @details Prescaler: + * + QDM_TSU_CLK_DIV_1 -- TSUCLK = SYSCLKOUT/1 + * + QDM_TSU_CLK_DIV_2 -- TSUCLK = SYSCLKOUT/2 + * + QDM_TSU_CLK_DIV_4 -- TSUCLK = SYSCLKOUT/4 + * + QDM_TSUE_CLK_DIV_8 -- TSUCLK = SYSCLKOUT/8 + * + QDM_TSU_CLK_DIV_16 -- TSUCLK = SYSCLKOUT/16 + * + QDM_TSU_CLK_DIV_32 -- TSUCLK = SYSCLKOUT/32 + * + QDM_TSU_CLK_DIV_64 -- TSUCLK = SYSCLKOUT/64 + * + QDM_TSU_CLK_DIV_128 -- TSUCLK = SYSCLKOUT/128 + * + QDM_TSU_CLK_DIV_256 -- TSUCLK = SYSCLKOUT/256 + */ +typedef enum { + QDM_TSU_CLK_DIV_1 = 0x00000000U, + QDM_TSU_CLK_DIV_2 = 0x00000001U, + QDM_TSU_CLK_DIV_4 = 0x00000002U, + QDM_TSUE_CLK_DIV_8 = 0x00000003U, + QDM_TSU_CLK_DIV_16 = 0x00000004U, + QDM_TSU_CLK_DIV_32 = 0x00000005U, + QDM_TSU_CLK_DIV_64 = 0x00000006U, + QDM_TSU_CLK_DIV_128 = 0x00000007U, + QDM_TSU_CLK_DIV_256 = 0x00000008U, +} QDM_TSUCLKPrescale; + +/** + * @brief Prescaler of Unit Position Event. + * @details Prescaler: + * + QDM_UNIT_POS_EVNT_DIV_1 -- UPEVNT = QCLK/1 + * + QDM_UNIT_POS_EVNT_DIV_2 -- UPEVNT = QCLK/2 + * + QDM_UNIT_POS_EVNT_DIV_4 -- UPEVNT = QCLK/4 + * + QDM_UNIT_POS_EVNT_DIV_8 -- UPEVNT = QCLK/8 + * + QDM_UNIT_POS_EVNT_DIV_16 -- UPEVNT = QCLK/16 + * + QDM_UNIT_POS_EVNT_DIV_32 -- UPEVNT = QCLK/32 + * + QDM_UNIT_POS_EVNT_DIV_64 -- UPEVNT = QCLK/64 + * + QDM_UNIT_POS_EVNT_DIV_128 -- UPEVNT = QCLK/128 + * + QDM_UNIT_POS_EVNT_DIV_256 -- UPEVNT = QCLK/256 + * + QDM_UNIT_POS_EVNT_DIV_512 -- UPEVNT = QCLK/512 + * + QDM_UNIT_POS_EVNT_DIV_1024 -- UPEVNT = QCLK/1024 + * + QDM_UNIT_POS_EVNT_DIV_2048 -- UPEVNT = QCLK/2048 + */ +typedef enum { + QDM_UNIT_POS_EVNT_DIV_1 = 0x00000000U, + QDM_UNIT_POS_EVNT_DIV_2 = 0x00000001U, + QDM_UNIT_POS_EVNT_DIV_4 = 0x00000002U, + QDM_UNIT_POS_EVNT_DIV_8 = 0x00000003U, + QDM_UNIT_POS_EVNT_DIV_16 = 0x00000004U, + QDM_UNIT_POS_EVNT_DIV_32 = 0x00000005U, + QDM_UNIT_POS_EVNT_DIV_64 = 0x00000006U, + QDM_UNIT_POS_EVNT_DIV_128 = 0x00000007U, + QDM_UNIT_POS_EVNT_DIV_256 = 0x00000008U, + QDM_UNIT_POS_EVNT_DIV_512 = 0x00000009U, + QDM_UNIT_POS_EVNT_DIV_1024 = 0x0000000AU, + QDM_UNIT_POS_EVNT_DIV_2048 = 0x0000000BU, +} QDM_UPEvntPrescale; + +/** + * @brief Lock mode of Time Stamp Unit. + * @details Lock mode: + * + QDM_TSU_LOCK_ON_SW_READ -- When software read QPOSCNT + * + QDM_TSU_LOCK_ON_UTTRG -- When unit time trigger happens + */ +typedef enum { + QDM_TSU_LOCK_ON_SW_READ = 0x00000000U, + QDM_TSU_LOCK_ON_UTTRG = 0x00000001U, +} QDM_TSULockMode; + +/** + * @brief Working mode of Period Trigger Unit. + */ +typedef enum { + QDM_PERIOD_TRIGGER_MODE = 0x00000000U, + QDM_WATCHDOG_MODE = 0x00000001U, +} QDM_PTUMode; + +/** + * @brief Lock mode of Period Trigger Unit. + * @details Lock mode: + * + QDM_LOCK_POSCNT_READ_BY_CPU -- When QPOSCNT read by CPU/DMA, + * QCTMR and QCPRD are locked + * + QDM_LOCK_UNIT_TIME_TRIGGER,-- When PTU is enabled and unit time triggers, + * QPOSCNT, QCTMR, QCPRD are locked + */ +typedef enum { + QDM_LOCK_POSCNT_READ_BY_CPU, + QDM_LOCK_UNIT_TIME_TRIGGER, +} QDM_TriggerLockMode; /* QPOSCNT, QCTMR, QCPRD lock event */ + +/** + * @brief Interrupt events of QMD module. + * @details Interrupt events: + * + QDM_INT_POS_CNT_ERROR -- Position count error + * + QDM_INT_PHASE_ERROR -- Quadrature phase error + * + QDM_INT_WATCHDOG -- Speed lost error + * + QDM_INT_DIR_CHANGE -- Quadrature direction change + * + QDM_INT_UNDERFLOW -- Position counter underflow + * + QDM_INT_OVERFLOW -- Position counter overflow + * + QDM_INT_POS_COMP_READY -- Position-compare ready + * + QDM_INT_POS_COMP_MATCH -- Position-compare match + * + QDM_INT_INDEX_EVNT_LATCH -- Index event lock + * + QDM_INT_UNIT_TIME_OUT -- Unit time-out + */ +typedef enum { + QDM_INT_POS_CNT_ERROR = 0x00000001U, + QDM_INT_PHASE_ERROR = 0x00000002U, + QDM_INT_WATCHDOG = 0x00000004U, + QDM_INT_DIR_CHANGE = 0x00000008U, + QDM_INT_UNDERFLOW = 0x00000010U, + QDM_INT_OVERFLOW = 0x00000020U, + QDM_INT_POS_COMP_READY = 0x00000040U, + QDM_INT_POS_COMP_MATCH = 0x00000080U, + QDM_INT_INDEX_EVNT_LATCH = 0x00000100U, + QDM_INT_UNIT_TIME_OUT = 0x00000200U, +} QDM_InterruptEvent; + +/** + * @brief QDM TSU prescaler + * @details prescaler values: + * + QDM_TSU_PRESCALER_EQUAL -- Equal to the clock cycle + * + QDM_TSU_PRESCALER_2X -- 2x clock cycle + * + QDM_TSU_PRESCALER_4X -- 2x clock cycle + * + QDM_TSU_PRESCALER_8X -- 8x clock cycle + * + QDM_TSU_PRESCALER_16X -- 16x clock cycle + * + QDM_TSU_PRESCALER_32X -- 32x clock cycle + * + QDM_TSU_PRESCALER_64X -- 64x clock cycle + * + QDM_TSU_PRESCALER_128X -- 128x clock cycle + * + QDM_TSU_PRESCALER_256X -- 256x clock cycle + */ +typedef enum { + QDM_TSU_PRESCALER_EQUAL = 0x00000000U, + QDM_TSU_PRESCALER_2X = 0x00000001U, + QDM_TSU_PRESCALER_4X = 0x00000002U, + QDM_TSU_PRESCALER_8X = 0x00000003U, + QDM_TSU_PRESCALER_16X = 0x00000004U, + QDM_TSU_PRESCALER_32X = 0x00000005U, + QDM_TSU_PRESCALER_64X = 0x00000006U, + QDM_TSU_PRESCALER_128X = 0x00000007U, + QDM_TSU_PRESCALER_256X = 0x00000008U, +} QDM_TSUPrescaler; + +/** + * @brief QDM CEVT prescaler + * @details prescaler values: + * + QDM_CEVT_PRESCALER_DIVI1 -- Don't divided + * + QDM_CEVT_PRESCALER_DIVI2 -- Divide by 2 + * + QDM_CEVT_PRESCALER_DIVI4 -- Divide by 4 + * + QDM_CEVT_PRESCALER_DIVI8 -- Divide by 8 + * + QDM_CEVT_PRESCALER_DIVI16 -- Divide by 16 + * + QDM_CEVT_PRESCALER_DIVI32 -- Divide by 32 + * + QDM_CEVT_PRESCALER_DIVI64 -- Divide by 64 + * + QDM_CEVT_PRESCALER_DIVI128 -- Divide by 128 + * + QDM_CEVT_PRESCALER_DIVI256 -- Divide by 256 + * + QDM_CEVT_PRESCALER_DIVI512 -- Divide by 512 + * + QDM_CEVT_PRESCALER_DIVI1024 -- Divide by 1024 + * + QDM_CEVT_PRESCALER_DIVI2048 -- Divide by 2048 + */ +typedef enum { + QDM_CEVT_PRESCALER_DIVI1 = 0x00000000U, + QDM_CEVT_PRESCALER_DIVI2 = 0x00000001U, + QDM_CEVT_PRESCALER_DIVI4 = 0x00000002U, + QDM_CEVT_PRESCALER_DIVI8 = 0x00000003U, + QDM_CEVT_PRESCALER_DIVI16 = 0x00000004U, + QDM_CEVT_PRESCALER_DIVI32 = 0x00000005U, + QDM_CEVT_PRESCALER_DIVI64 = 0x00000006U, + QDM_CEVT_PRESCALER_DIVI128 = 0x00000007U, + QDM_CEVT_PRESCALER_DIVI256 = 0x00000008U, + QDM_CEVT_PRESCALER_DIVI512 = 0x00000009U, + QDM_CEVT_PRESCALER_DIVI1024 = 0x0000000AU, + QDM_CEVT_PRESCALER_DIVI2048 = 0x0000000BU, +} QDM_CEVTPrescaler; + +/** + * @brief QDM counter reset mode + */ +typedef enum { + QDM_IDX_INIT_DISABLE = 0x00000000U, + QDM_IDX_INIT_AUTO = 0x00000001U, + QDM_IDX_INIT_Z_UP = 0x00000002U, + QDM_IDX_INIT_Z_DOWN = 0x00000003U, +} QDM_PcntIdxInitMode; + +/** + * @brief QDM lock triggle mode + */ +typedef enum { + QDM_TRG_BY_READ = 0x00000000U, + QDM_TRG_BY_CYCLE = 0x00000001U, +} QDM_QtrgLockMode; + +/** + * @brief QDM PTU work mode + */ +typedef enum { + QDM_PTU_MODE_CYCLE = 0x00000000U, + QDM_PTU_MODE_WATCHDOG = 0x00000001U, +} QDM_PtuMode; + +/** + * @brief QDM count mode + */ +typedef enum { + QDM_PCNT_MODE_BY_DIR = 0x00000000U, + QDM_PCNT_MODE_UP = 0x00000001U, + QDM_PCNT_MODE_DOWN = 0x00000002U, +} QDM_PcntMode; + +/** + * @brief QDM counter reset mode + */ +typedef enum { + QDM_PCNT_RST_AUTO = 0x00000000U, + QDM_PCNT_RST_OVF = 0x00000001U, + QDM_PCNT_RST_HARDWARE_ONCE = 0x00000002U, + QDM_PCNT_RST_BY_PTU = 0x00000003U, +} QDM_PcntRstMode; + +/** + * @brief QDM swap selection + */ +typedef enum { + QDM_SWAP_DISABLE = 0x00000000U, + QDM_SWAP_ENABLE = 0x00000001U, +} QDM_SwapSelect; + +/** + * @brief Check whether the EMU mode is used. + * @param mode QDM mode + * @retval true + * @retval false + */ +static inline bool IsEmuMode(unsigned int mode) +{ + if (mode == QDM_EMULATION_MODE_STOP_IMMEDIATELY || mode == QDM_EMULATION_MODE_STOP_AT_ROLLOVER || + mode == QDM_EMULATION_MODE_RUN_FREE) { + return true; + } + return false; +} + +/** + * @brief Check whether the Z Index lock mode is used. + * @param mode QDM mode + * @retval true + * @retval false + */ +static inline bool IsLockMode(unsigned int mode) +{ + if (mode == QDM_LOCK_RESERVE || mode == QDM_LOCK_RISING_INDEX || + mode == QDM_LOCK_FALLING_INDEX || mode == QDM_LOCK_SW_INDEX_MARKER) { + return true; + } + return false; +} + +/** + * @brief Check whether the Decode mode is used. + * @param mode QDM decode mode + * @retval true + * @retval false + */ +static inline bool IsDecodeMode(unsigned int mode) +{ + if (mode <= QDM_NONSTANDARD_TYPE2) { + return true; + } + return false; +} + +/** + * @brief Check whether the resolution is right. + * @param mode QDM mode + * @retval true + * @retval false + */ +static inline bool IsResolution(unsigned int mode) +{ + if (mode == QDM_1X_RESOLUTION || mode == QDM_2X_RESOLUTION || mode == QDM_4X_RESOLUTION) { + return true; + } + return false; +} + +/** + * @brief Check whether the swap is right. + * @param mode QDM mode + * @retval true + * @retval false + */ +static inline bool IsSwap(unsigned int mode) +{ + if (mode == QDM_SWAP_DISABLE || mode == QDM_SWAP_ENABLE) { + return true; + } + return false; +} + +/** + * @brief Check whether the lock triggle mode is used. + * @param mode QDM mode + * @retval true + * @retval false + */ +static inline bool IsTrgLockMode(unsigned int mode) +{ + if (mode == QDM_TRG_BY_READ || mode == QDM_TRG_BY_CYCLE) { + return true; + } + return false; +} + +/** + * @brief Check whether the ptu mode is used. + * @param mode QDM mode + * @retval true + * @retval false + */ +static inline bool IsPtuMode(unsigned int mode) +{ + if (mode == QDM_PTU_MODE_CYCLE || mode == QDM_PTU_MODE_WATCHDOG) { + return true; + } + return false; +} + +/** + * @brief Check whether the position counter is used. + * @param mode QDM mode + * @retval true + * @retval false + */ +static inline bool IsPcntMode(unsigned int mode) +{ + if (mode == QDM_PCNT_MODE_BY_DIR || mode == QDM_PCNT_MODE_UP || mode == QDM_PCNT_MODE_DOWN) { + return true; + } + return false; +} + +/** + * @brief Check whether the PcntRstMode is used. + * @param mode QDM mode + * @retval true + * @retval false + */ +static inline bool IsPcntRstMode(unsigned int mode) +{ + if (mode == QDM_PCNT_RST_AUTO || mode == QDM_PCNT_RST_OVF || + mode == QDM_PCNT_RST_HARDWARE_ONCE || mode == QDM_PCNT_RST_BY_PTU) { + return true; + } + return false; +} + +/** + * @brief Check whether the PcntIdxInitMode is used. + * @param mode QDM mode + * @retval true + * @retval false + */ +static inline bool IsPcntIdxInitMode(unsigned int mode) +{ + if (mode == QDM_IDX_INIT_DISABLE || mode == QDM_IDX_INIT_AUTO || + mode == QDM_IDX_INIT_Z_UP || mode == QDM_IDX_INIT_Z_DOWN) { + return true; + } + return false; +} + +/** + * @brief Check whether the TsuPrescaler is used. + * @param mode QDM mode + * @retval true + * @retval false + */ +static inline bool IsTsuPrescaler(unsigned int mode) +{ + /* Check whether the TSU prescaler is right. */ + if (mode == QDM_TSU_PRESCALER_EQUAL || mode == QDM_TSU_PRESCALER_2X || + mode == QDM_TSU_PRESCALER_4X || mode == QDM_TSU_PRESCALER_8X || + mode == QDM_TSU_PRESCALER_16X || mode == QDM_TSU_PRESCALER_32X || + mode == QDM_TSU_PRESCALER_64X || mode == QDM_TSU_PRESCALER_128X || + mode == QDM_TSU_PRESCALER_256X) { + return true; + } + return false; +} + +/** + * @brief Check whether the CevtPrescaler is used. + * @param mode QDM mode + * @retval true + * @retval false + */ +static inline bool IsCevtPrescaler(unsigned int mode) +{ + /* Check whether the CEVT prescaler is right. */ + if (mode == QDM_CEVT_PRESCALER_DIVI1 || mode == QDM_CEVT_PRESCALER_DIVI2 || + mode == QDM_CEVT_PRESCALER_DIVI4 || mode == QDM_CEVT_PRESCALER_DIVI8 || + mode == QDM_CEVT_PRESCALER_DIVI16 || mode == QDM_CEVT_PRESCALER_DIVI32 || + mode == QDM_CEVT_PRESCALER_DIVI64 || mode == QDM_CEVT_PRESCALER_DIVI128 || + mode == QDM_CEVT_PRESCALER_DIVI256 || mode == QDM_CEVT_PRESCALER_DIVI512 || + mode == QDM_CEVT_PRESCALER_DIVI1024 || mode == QDM_CEVT_PRESCALER_DIVI2048) { + return true; + } + return false; +} + +/** + * @brief Check whether the QDM_StatusFlag is used. + * @param status QDM status flag + * @retval true + * @retval false + */ +static inline bool IsQDMStatusMode(QDM_StatusFlag status) +{ + /* Check whether the QDM Status flag is right. */ + if (status == QDM_STATUS_POS_CNT_ERR || status == QDM_STATUS_1ST_IDX_OCCURRED || + status == QDM_STATUS_DIR_ON_1ST_IDX || status == QDM_STATUS_CAP_DIR_ERR || + status == QDM_STATUS_TSU_OVERFLW_ERR || status == QDM_STATUS_SPEED_LOST || + status == QDM_STATUS_DIR_FLAG || status == QDM_STATUS_UNIT_POS_EVENT) { + return true; + } + return false; +} + +/** + * @brief Check whether the QDM interrupt event type is right. + * @param status QDM interrupt event + * @retval true + * @retval false + */ +static inline bool IsQDMInterruptEvent(QDM_InterruptEvent intEvt) +{ + /* Check whether the QDM interrupt type is right. */ + QDM_PARAM_CHECK_WITH_RET(intEvt >= QDM_INT_POS_CNT_ERROR, BASE_STATUS_ERROR); + QDM_PARAM_CHECK_WITH_RET(intEvt <= QDM_INT_UNIT_TIME_OUT, BASE_STATUS_ERROR); + if (intEvt == QDM_INT_POS_CNT_ERROR || ((unsigned int)intEvt % 2U) == 0) { + return true; + } + return false; +} + +/** + * @} + */ + + +/** + * @defgroup QDM_REG_Definition QDM Register Structure. + * @brief QDM Register Structure Definition. + * @{ + */ + +/** + * @brief QDM version registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int month_day : 16; /**< Month and day. */ + unsigned int year : 8; /**< Year. */ + unsigned int release_substep : 1; /**< Version information. */ + unsigned int release_step : 1; /**< Version information. */ + unsigned int release_ver : 1; /**< Version information. */ + unsigned int reserved_0 : 5; + } BIT; +} volatile QDM_QDMVER_REG; + +/** + * @brief QDM emulation mode configuration registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int emu_mode : 2; /**< QDM emulation access mode. */ + unsigned int reserved_0 : 30; + } BIT; +} volatile QDM_QEMUMODE_REG; + +/** + * @brief QDM control registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ptu_en : 1; /**< PTU period triggle unit enable. */ + unsigned int ppu_en : 1; /**< PPU position process unit enable. */ + unsigned int tsu_en : 1; /**< TSU timestamp unit enable. */ + unsigned int ptu_mode : 1; /**< PTU work mode. */ + unsigned int qtrg_lock_mode : 1; /**< QDM triggle locked mode selection. */ + unsigned int reserved_0 : 3; + unsigned int qdmi_polarity : 1; /**< Z pulse polarity selection. */ + unsigned int qdmb_polarity : 1; /**< B pulse polarity selection. */ + unsigned int qdma_polarity : 1; /**< A pulse polarity selection. */ + unsigned int qdm_ab_swap : 1; /**< Input signal swap of A pulse and B pulse. */ + unsigned int qdu_xclk : 2; /**< QDM position pulse frequency multiplication. */ + unsigned int qdu_mode : 2; /**< QDM decode mode. */ + unsigned int reserved_1 : 16; + } BIT; +} volatile QDM_QCTRL_REG; + +/** + * @brief PPU control registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int ppu_syncout_pw : 12; /**< Pulse width selection of position comparison sync output. */ + unsigned int ppu_syncout_pl : 1; /**< Polarity of position comparison sync output. */ + unsigned int syncout_en : 1; /**< Position comparison sync output enable. */ + unsigned int reserved_0 : 2; + unsigned int ppu_poscmp_en : 1; /**< Position comparison function enable. */ + unsigned int ppu_cmpshd_ld : 1; /**< Load mode of position comparison buffer register. */ + unsigned int ppu_cmpshd_en : 1; /**< Position comparison buffer register enable. */ + unsigned int reserved_1 : 1; + unsigned int pcnt_idx_lock_mode : 2; /**< Z pulse locked mode selection of position counter. */ + unsigned int pcnt_idx_init_mode : 2; /**< Z pulse initialization mode of position counter. */ + unsigned int pcnt_rst_mode : 2; /**< Reset selection of position counter. */ + unsigned int pcnt_mode : 2; /**< Count mode of position counter. */ + unsigned int pcnt_sw_init : 1; /**< Software initialization of position counter. */ + unsigned int reserved_2 : 3; + } BIT; +} volatile QDM_QPPUCTRL_REG; + +/** + * @brief TSU control registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cevt_prescaler : 4; /**< Frequency division selection of the capture event CEVT. */ + unsigned int tsu_prescaler : 4; /**< TSU timing step length selection. */ + unsigned int qtmr_lock_mode : 1; /**< TSU locked mode. */ + unsigned int reserved_0 : 23; + } BIT; +} volatile QDM_QTSUCTRL_REG; + +/** + * @brief QDM interrupt enable registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pcnt_err_en : 1; /**< Position count error interrupt enable. */ + unsigned int qphs_err_en : 1; /**< Quadrature pulse error interrupt enable. */ + unsigned int sped_lst_en : 1; /**< QDM speed loss interrupt enable. */ + unsigned int qdir_chg_en : 1; /**< Quadrature direction change interrupt enable. */ + unsigned int pcnt_udf_en : 1; /**< Position counter underflow interrupt enable. */ + unsigned int pcnt_ovf_en : 1; /**< Position counter overflow interrupt enable. */ + unsigned int pcnt_cpr_en : 1; /**< Position comparision ready interrupt enable. */ + unsigned int pcnt_cpm_en : 1; /**< Position comparision match interrupt enable. */ + unsigned int indx_lck_en : 1; /**< Z pulse locked fuction interrupt enable. */ + unsigned int utmr_prd_en : 1; /**< PTU period interrupt enable. */ + unsigned int reserved_0 : 2; + unsigned int reserved_1 : 20; + } BIT; +} volatile QDM_QINTENA_REG; + +/** + * @brief QDM interrupt status registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pcnt_err_int : 1; /**< Position count error interrupt. */ + unsigned int qphs_err_int : 1; /**< Quadrature pulse error interrupt. */ + unsigned int sped_lst_int : 1; /**< QDM speed loss interrupt. */ + unsigned int qdir_chg_int : 1; /**< Quadrature direction change interrupt. */ + unsigned int pcnt_udf_int : 1; /**< Position counter underflow interrupt. */ + unsigned int pcnt_ovf_int : 1; /**< Position counter overflow interrupt. */ + unsigned int pcnt_cpr_int : 1; /**< Position comparision ready interrupt. */ + unsigned int pcnt_cpm_int : 1; /**< Position comparision match interrupt. */ + unsigned int indx_lck_int : 1; /**< Z pulse locked fuction interrupt. */ + unsigned int utmr_prd_int : 1; /**< PTU period interrupt. */ + unsigned int reserved_0 : 2; + unsigned int reserved_1 : 20; + } BIT; +} volatile QDM_QINTSTS_REG; + +/** + * @brief QDM initial interrupt registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pcnt_err_raw : 1; /**< Position count error initial interrupt. */ + unsigned int qphs_err_raw : 1; /**< Quadrature pulse error initial interrupt. */ + unsigned int sped_lst_raw : 1; /**< QDM speed loss initial interrupt. */ + unsigned int qdir_chg_raw : 1; /**< Quadrature direction change initial interrupt. */ + unsigned int pcnt_udf_raw : 1; /**< Position counter underflow initial interrupt. */ + unsigned int pcnt_ovf_raw : 1; /**< Position counter overflow initial interrupt. */ + unsigned int pcnt_cpr_raw : 1; /**< Position comparision ready initial interrupt. */ + unsigned int pcnt_cpm_raw : 1; /**< Position comparision match initial interrupt. */ + unsigned int indx_lck_raw : 1; /**< Z pulse locked fuction initial interrupt. */ + unsigned int utmr_prd_raw : 1; /**< PTU period initial interrupt. */ + unsigned int reserved_0 : 2; + unsigned int reserved_1 : 20; + } BIT; +} volatile QDM_QINTRAW_REG; + +/** + * @brief QDM injection interrupt registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pcnt_err_inj : 1; /**< Position count error injection interrupt. */ + unsigned int qphs_err_inj : 1; /**< Quadrature pulse error injection interrupt. */ + unsigned int sped_lst_inj : 1; /**< QDM speed loss injection interrupt. */ + unsigned int qdir_chg_inj : 1; /**< Quadrature direction change injection interrupt. */ + unsigned int pcnt_udf_inj : 1; /**< Position counter underflow injection interrupt. */ + unsigned int pcnt_ovf_inj : 1; /**< Position counter overflow injection interrupt. */ + unsigned int pcnt_cpr_inj : 1; /**< Position comparision ready injection interrupt. */ + unsigned int pcnt_cpm_inj : 1; /**< Position comparision match injection interrupt. */ + unsigned int indx_lck_inj : 1; /**< Z pulse locked fuction injection interrupt. */ + unsigned int utmr_prd_inj : 1; /**< PTU period injection interrupt. */ + unsigned int reserved_0 : 2; + unsigned int reserved_1 : 20; + } BIT; +} volatile QDM_QINTINJ_REG; + +/** + * @brief QDM status registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int pcnt_err_sts : 1; /**< Position count error status. */ + unsigned int fidx_is_sts : 1; /**< Whether QDM passes the first Z-phase marker. */ + unsigned int fidx_dir_sts : 1; /**< The direction of QDM firstly passes the Z-phase marker. */ + unsigned int qcdr_err_sts : 1; /**< QDM capture direction error status. */ + unsigned int qctmr_ovf_sts : 1; /**< TSU timing count overflow status. */ + unsigned int sepd_lst_sts : 1; /**< QDM speed loss status. */ + unsigned int qdir_sts : 1; /**< QDM quadrature direction status. */ + unsigned int cevt_sts : 1; /**< QDM capture events status. */ + unsigned int reserved_0 : 24; + } BIT; +} volatile QDM_QDMSTS_REG; + +/** + * @brief QDM A-phase signal filter registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int qdma_ft_level : 13; /**< The filter level of A-phase signal. */ + unsigned int reserved_0 : 19; + } BIT; +} volatile QDM_QDMAFT_REG; + +/** + * @brief QDM B-phase signal filter registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int qdmb_ft_level : 13; /**< The filter level of B-phase signal. */ + unsigned int reserved_0 : 19; + } BIT; +} volatile QDM_QDMBFT_REG; + +/** + * @brief QDM Z-phase signal filter registers union structure definition. + */ +typedef union { + unsigned int reg; + struct { + unsigned int qdmi_ft_level : 13; /**< The filter level of Z-phase signal. */ + unsigned int reserved_0 : 19; + } BIT; +} volatile QDM_QDMIFT_REG; + +/** + * @brief QDM Interrupt callback functions. + * + */ +typedef struct { + void (* PtuCycleTrgCallback)(void *handle); /**< PTU triggle interrupt callback */ + void (* SpeedLoseCallback)(void *handle); /**< speed lose detection callback */ + void (* ZIndexLockedCallBack)(void *handle); /**< Z index lock interrupt callback.*/ + void (* PositionCompareMatchCallBack)(void *handle); /**< Position compare match interrupt. */ + void (* PositionCompareReadyCallBack)(void *handle); /**< Position compare ready interrupt. */ + void (* PositionCounterOverflowCallBack)(void *handle); /**< Position counter overflow interrupt. */ + void (* PositionCounterUnderflowCallBack)(void *handle); /**< Position counter underflow interrupt. */ + void (* OrthogonalDirectionChangeCallBack)(void *handle); /**< Orthogonal direction change interrupt. */ + void (* OrthogonalPhaseErrorCallBack)(void *handle); /**< Orthogonal phase error interrupt. */ + void (* PositionCounterErrorCallBack)(void *handle); /**< Position counter error interrupt. */ +} QDM_UserCallBack; + +/** + * @brief QDM extend handle. + */ +typedef struct _QDM_ExtendeHandle { +} QDM_ExtendHandle; + +/** + * @brief QDM registers definition structure. + */ +typedef struct { + QDM_QDMVER_REG QDMVER; /**< QDM version register, offset address: 0x0000. */ + QDM_QEMUMODE_REG QEMUMODE; /**< QDM emulation mode configuration register, offset address: 0x0004. */ + QDM_QCTRL_REG QCTRL; /**< QDM control register, offset address: 0x0008. */ + QDM_QPPUCTRL_REG QPPUCTRL; /**< PPU control register, offset address: 0x000C. */ + QDM_QTSUCTRL_REG QTSUCTRL; /**< TSU control register, offset address: 0x0010. */ + QDM_QINTENA_REG QINTENA; /**< QDM interrupt enable register, offset address: 0x0014. */ + QDM_QINTSTS_REG QINTSTS; /**< QDM interrupt status register, offset address: 0x0018. */ + QDM_QINTRAW_REG QINTRAW; /**< QDM initial interrupt register, offset address: 0x001C. */ + QDM_QINTINJ_REG QINTINJ; /**< QDM injection interrupt register, offset address: 0x0020. */ + QDM_QDMSTS_REG QDMSTS; /**< QDM status register, offset address: 0x0024. */ + unsigned int QPOSCNT; /**< PPU position counter value, offset address: 0x0028. */ + unsigned int QPOSINIT; /**< PPU position counter initialization value, offset address: 0x002C. */ + unsigned int QPOSMAX; /**< PPU position counter maximum value, offset address: 0x0030. */ + unsigned int QPOSCMP; /**< PPU position counter compare value, offset address: 0x0034. */ + unsigned int QPOSILOCK; /**< PPU QPOSCNT inde locked value, offset address: 0x0038. */ + unsigned int QPOSLOCK; /**< PPU QPOSCNT locked value, offset address: 0x003C. */ + unsigned int QUTMR; /**< PTU counter value, offset address: 0x0040. */ + unsigned int QUPRD; /**< PTU period value, offset address: 0x0044. */ + unsigned int QCTMR; /**< TSU counter value, offset address: 0x0048. */ + unsigned int QCMAX; /**< TSU counter maximum value, offset address: 0x004C. */ + unsigned int QCPRD; /**< TSU-captured CEVT's period, offset address: 0x0050. */ + unsigned int QCTMRLOCK; /**< QCTMR locked value, offset address: 0x0054. */ + unsigned int QCPRDLOCK; /**< QCPRD locked value, offset address: 0x0058. */ + QDM_QDMAFT_REG QDMAFT; /**< QDM A-phase signal filter register, offset address: 0x005C. */ + QDM_QDMBFT_REG QDMBFT; /**< QDM B-phase signal filter register, offset address: 0x0060. */ + QDM_QDMIFT_REG QDMIFT; /**< QDM Z-phase signal filter register, offset address: 0x0064. */ + unsigned int QPOSCMPA; /**< QDM Position Counter Active Compare Value, offset address: 0x0068. */ +} volatile QDM_RegStruct; + +/** + * @brief Set the emulation mode of QDM module. + * @param qdmx QDM register base address. + * @param emuMode Emulation mode. + * @retval None. + */ +static inline void DCL_QDM_SetEmulationMode(QDM_RegStruct *qdmx, QDM_EmulationMode emuMode) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + QDM_PARAM_CHECK_NO_RET(emuMode >= QDM_EMULATION_MODE_STOP_IMMEDIATELY); + QDM_PARAM_CHECK_NO_RET(emuMode <= QDM_EMULATION_MODE_RUN_FREE); + qdmx->QEMUMODE.BIT.emu_mode = emuMode; +} + +/** + * @brief Get the working status of QDM module. + * @param qdmx QDM register base address. + * @param status Working status flag. + * @retval unsigned short The flag value. + */ +static inline bool DCL_QDM_GetModuleStatus(const QDM_RegStruct *qdmx, QDM_StatusFlag status) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + QDM_ASSERT_PARAM(IsQDMStatusMode(status)); + return ((qdmx->QDMSTS.reg & (unsigned int)status) == status); +} + +/** + * @brief Clear the specific working status of QDM module. + * @param qdmx QDM register base address. + * @param status Working status flag. + * @retval None. + */ +static inline void DCL_QDM_ClearModuleStatus(QDM_RegStruct *qdmx, QDM_StatusFlag status) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + QDM_ASSERT_PARAM(IsQDMStatusMode(status)); + qdmx->QDMSTS.reg |= (unsigned int)status; +} + +/* Quadrature Decoder Unit --------------------------------------------------------------------- */ +/** + * @brief Set the polarity of QDM module inputs. + * @param qdmx QDM register base address. + * @param ivtQDMA QDMA input. + * @param ivtQDMB QDMB input. + * @param ivtQDMI QDMI input. + * @retval None. + */ +static inline void DCL_QDM_SetInputPolarity(QDM_RegStruct *qdmx, bool ivtQDMA, bool ivtQDMB, bool ivtQDMI) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QCTRL.BIT.qdma_polarity = ivtQDMA; + qdmx->QCTRL.BIT.qdmb_polarity = ivtQDMB; + qdmx->QCTRL.BIT.qdmi_polarity = ivtQDMI; +} + +/** + * @brief Set the filter width of QDM module inputs. + * @param qdmx QDM register base address. + * @param filtWidthQDMA Filter width of QDMA input. + * @param filtWidthQDMB Filter width of QDMB input. + * @param filtWidthQDMI Filter width of QDMI input. + * @retval None. + */ +static inline void DCL_QDM_SetInputFilterWidth(QDM_RegStruct *qdmx, + unsigned short filtWidthQDMA, + unsigned short filtWidthQDMB, + unsigned short filtWidthQDMI) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + QDM_PARAM_CHECK_NO_RET(filtWidthQDMA <= QDM_MAX_FILTER_LEVEL); + QDM_PARAM_CHECK_NO_RET(filtWidthQDMB <= QDM_MAX_FILTER_LEVEL); + QDM_PARAM_CHECK_NO_RET(filtWidthQDMI <= QDM_MAX_FILTER_LEVEL); + /* Set QDM input filter width. */ + qdmx->QDMAFT.BIT.qdma_ft_level = filtWidthQDMA; + qdmx->QDMBFT.BIT.qdmb_ft_level = filtWidthQDMB; + qdmx->QDMIFT.BIT.qdmi_ft_level = filtWidthQDMI; +} + +/** + * @brief Swap the inputs of QDMA and QDMB. + * @param qdmx QDM register base address. + * @param swap Swap enable. + * @retval None. + */ +static inline void DCL_QDM_SetABSwap(QDM_RegStruct *qdmx, bool swap) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QCTRL.BIT.qdm_ab_swap = swap; +} + +/** + * @brief Set the decoder mode of QDM module. + * @param qdmx QDM register base address. + * @param decoderMode Decoder mode. + * @retval None. + */ +static inline void DCL_QDM_SetDecoderMode(QDM_RegStruct *qdmx, QDM_DecoderMode decoderMode) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + QDM_PARAM_CHECK_NO_RET(IsDecodeMode(decoderMode)); + qdmx->QCTRL.BIT.qdu_mode = decoderMode; +} + +/** + * @brief Set the resolution of decoder. + * @param qdmx QDM register base address. + * @param resolution Decoder resolution. + * @retval None. + */ +static inline void DCL_QDM_SetResolution(QDM_RegStruct *qdmx, QDM_Resolution resolution) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + QDM_PARAM_CHECK_NO_RET(resolution >= QDM_1X_RESOLUTION); + QDM_PARAM_CHECK_NO_RET(resolution <= QDM_4X_RESOLUTION); + qdmx->QCTRL.BIT.qdu_xclk = resolution; +} + +/* Position Process Unit ----------------------------------------------------------------------- */ +/** + * @brief Enable Position Process Unit. + * @param qdmx QDM register base address. + * @retval None. + */ +static inline void DCL_QDM_EnablePosProcess(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QCTRL.BIT.ppu_en = BASE_CFG_ENABLE; +} + +/** + * @brief Disable Position Process Unit. + * @param qdmx QDM register base address. + * @retval None. + */ +static inline void DCL_QDM_DisablePosProcess(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QCTRL.BIT.ppu_en = BASE_CFG_DISABLE; +} + +/** + * @brief Enable/Disable software initialization of position counter. + * @param qdmx QDM register base address. + * @param swInit Software enable. + * @retval None. + */ +static inline void DCL_QDM_SetSWPosInit(QDM_RegStruct *qdmx, bool swInit) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QPPUCTRL.BIT.pcnt_sw_init = swInit; +} + +/** + * @brief Set the count mode of position counter. + * @param qdmx QDM register base address. + * @param cntMode Count mode. + * @retval None. + */ +static inline void DCL_QDM_SetCountMode(QDM_RegStruct *qdmx, QDM_PPUCountMode cntMode) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + QDM_PARAM_CHECK_NO_RET(cntMode >= QDM_PPU_COUNT_MODE_CLK_DIR); + QDM_PARAM_CHECK_NO_RET(cntMode <= QDM_PPU_COUNT_MODE_DECREASE); + qdmx->QPPUCTRL.BIT.pcnt_mode = cntMode; +} + +/** + * @brief Set the reset mode of position counter. + * @param qdmx QDM register base address. + * @param rstMode Reset mode. + * @retval None. + */ +static inline void DCL_QDM_SetPosResetMode(QDM_RegStruct *qdmx, QDM_PosResetMode rstMode) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + QDM_PARAM_CHECK_NO_RET(rstMode >= QDM_POSITION_RESET_IDX); + QDM_PARAM_CHECK_NO_RET(rstMode <= QDM_POSITION_RESET_UNIT_TIME_OUT); + qdmx->QPPUCTRL.BIT.pcnt_rst_mode = rstMode; +} + +/** + * @brief Set the initialization mode of position counter. + * @param qdmx QDM register base address. + * @param initMode Initialization mode. + * @retval None. + */ +static inline void DCL_QDM_SetPosInitMode(QDM_RegStruct *qdmx, QDM_PosIdxInitMode initMode) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + QDM_PARAM_CHECK_NO_RET(initMode >= QDM_POSITION_INIT_DO_NOTHING); + QDM_PARAM_CHECK_NO_RET(initMode <= QDM_POSITION_INIT_FALLING_INDEX); + qdmx->QPPUCTRL.BIT.pcnt_idx_init_mode = initMode; +} + +/** + * @brief Set the index lock mode. + * @param qdmx QDM register base address. + * @param lockMode Lock mode of index. + * @retval None. + */ +static inline void DCL_QDM_SetIndexLockMode(QDM_RegStruct *qdmx, QDM_IndexLockMode lockMode) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + QDM_PARAM_CHECK_NO_RET(lockMode >= QDM_LOCK_RESERVE); + QDM_PARAM_CHECK_NO_RET(lockMode <= QDM_LOCK_SW_INDEX_MARKER); + qdmx->QPPUCTRL.BIT.pcnt_idx_lock_mode = lockMode; +} + +/** + * @brief Set the initial value of position counter. + * @param qdmx QDM register base address. + * @param position Initial value. + * @retval None. + */ +static inline void DCL_QDM_SetInitialPos(QDM_RegStruct *qdmx, unsigned int position) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QPOSINIT = position; +} + +/** + * @brief Set the max value of position counter. + * @param qdmx QDM register base address. + * @param maxPos Max value. + * @retval None. + */ +static inline void DCL_QDM_SetMaxPos(QDM_RegStruct *qdmx, unsigned int maxPos) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QPOSMAX = maxPos; +} + +/** + * @brief Get the current value of position counter. + * @param qdmx QDM register base address. + * @retval unsigned int Value of position counter. + * @retval None. + */ +static inline unsigned int DCL_QDM_GetCurPos(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + return (qdmx->QPOSCNT); +} + +/** + * @brief Enable position compare. + * @param qdmx QDM register base address. + * @retval None. + */ +static inline void DCL_QDM_EnablePosComp(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QPPUCTRL.BIT.ppu_poscmp_en = BASE_CFG_ENABLE; +} + +/** + * @brief Disable position compare. + * @param qdmx QDM register base address. + * @retval None. + */ +static inline void DCL_QDM_DisablePosComp(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QPPUCTRL.BIT.ppu_poscmp_en = BASE_CFG_DISABLE; +} + +/** + * @brief Set the position compare value. + * @param qdmx QDM register base address. + * @param compVal Compare value. + * @retval None. + */ +static inline void DCL_QDM_SetPosCompVal(QDM_RegStruct *qdmx, unsigned int compVal) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QPOSCMP = compVal; +} + +/** + * @brief Enable position compare sync-out pulse. + * @param qdmx QDM register base address. + * @retval None. + */ +static inline void DCL_QDM_EnableCompSyncOut(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QPPUCTRL.BIT.syncout_en = BASE_CFG_ENABLE; +} + +/** + * @brief Disable position compare sync-out pulse. + * @param qdmx QDM register base address. + * @retval None. + */ +static inline void DCL_QDM_DisableCompSyncOut(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QPPUCTRL.BIT.syncout_en = BASE_CFG_DISABLE; +} + +/** + * @brief Set the pulse width of position compare sync-out pulse. + * @param qdmx QDM register base address. + * @param width Pulse width. + * @retval None. + */ +static inline void DCL_QDM_SetCompSyncOutWidth(QDM_RegStruct *qdmx, unsigned short width) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + QDM_PARAM_CHECK_NO_RET(width <= QDM_PPU_MAX_SYNCOUT_PW); + /* In units of 4 PCLK cycles */ + qdmx->QPPUCTRL.BIT.ppu_syncout_pw = width; +} + +/** + * @brief Set the polarity of position compare sync-out pulse. + * @param qdmx QDM register base address. + * @param polarity Sync-out pulse polarity. + * @retval None. + */ +static inline void DCL_QDM_SetCompSyncOutPolarity(QDM_RegStruct *qdmx, QDM_CompSyncOutPolarity polarity) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + QDM_PARAM_CHECK_NO_RET(polarity == QDM_SYNC_OUT_HIGH || polarity == QDM_SYNC_OUT_LOW); + qdmx->QPPUCTRL.BIT.ppu_syncout_pl = polarity; +} + +/** + * @brief Enable shadow mode of position compare. + * @param qdmx QDM register base address. + * @retval None. + */ +static inline void DCL_QDM_EnablePosCompShadow(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QPPUCTRL.BIT.ppu_cmpshd_en = BASE_CFG_ENABLE; +} + +/** + * @brief Disable shadow mode of position compare. + * @param qdmx QDM register base address. + * @retval None. + */ +static inline void DCL_QDM_DisablePosCompShadow(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QPPUCTRL.BIT.ppu_cmpshd_en = BASE_CFG_DISABLE; +} + +/** + * @brief Set the shadow load mode of position compare. + * @param qdmx QDM register base address. + * @param shadowMode Shadow load mode. + * @retval None. + */ +static inline void DCL_QDM_SetCompShadowMode(QDM_RegStruct *qdmx, QDM_CompShadowLoad shadowMode) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + QDM_PARAM_CHECK_NO_RET(shadowMode == QDM_COMPARE_LOAD_ON_ZERO || shadowMode == QDM_COMPARE_LOAD_ON_MATCH); + qdmx->QPPUCTRL.BIT.ppu_cmpshd_ld = shadowMode; +} + +/** + * @brief Get the position index lock value. + * @param qdmx QDM register base address. + * @retval unsigned int Index lock value. + */ +static inline unsigned int DCL_QDM_GetPosIndexLock(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + return (qdmx->QPOSILOCK); +} + +/** + * @brief Get the unit time position lock value. + * @param qdmx QDM register base address. + * @retval unsigned int Unit time position lock value. + */ +static inline unsigned int DCL_QDM_GetPosUnitTimeLock(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + return (qdmx->QPOSLOCK); +} + +/* Time Stamp Unit ----------------------------------------------------------------------------- */ +/** + * @brief Enable Time Stamp Unit capture. + * @param qdmx QDM register base address. + * @retval None. + */ +static inline void DCL_QDM_EnableTSUCap(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + /* EQEP_enableCapture */ + qdmx->QCTRL.BIT.tsu_en = BASE_CFG_ENABLE; +} + +/** + * @brief Disable Time Stamp Unit capture. + * @param qdmx QDM register base address. + * @retval None. + */ +static inline void DCL_QDM_DisableTSUCap(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + /* EQEP_disableCapture */ + qdmx->QCTRL.BIT.tsu_en = BASE_CFG_DISABLE; +} + +/** + * @brief Configure Time Stamp Unit capture. + * @param qdmx QDM register base address. + * @param tscPrsc Clock prescaler. + * @param evtPrsc Unit position event prescaler. + * @param tsuLock Time Stamp Unit lock mode. + * @retval None. + */ +static inline void DCL_QDM_ConfigTSUCap(QDM_RegStruct *qdmx, + QDM_TSUCLKPrescale tscPrsc, + QDM_UPEvntPrescale evtPrsc, + QDM_TSULockMode tsuLock) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + /* Check whether function parameters the is right. */ + QDM_PARAM_CHECK_NO_RET(tscPrsc >= QDM_TSU_CLK_DIV_1); + QDM_PARAM_CHECK_NO_RET(tscPrsc <= QDM_TSU_CLK_DIV_256); + QDM_PARAM_CHECK_NO_RET(evtPrsc >= QDM_UNIT_POS_EVNT_DIV_1); + QDM_PARAM_CHECK_NO_RET(evtPrsc <= QDM_UNIT_POS_EVNT_DIV_2048); + QDM_PARAM_CHECK_NO_RET(tsuLock == QDM_TSU_LOCK_ON_SW_READ || tsuLock == QDM_TSU_LOCK_ON_UTTRG); + qdmx->QTSUCTRL.BIT.tsu_prescaler = tscPrsc; + qdmx->QTSUCTRL.BIT.cevt_prescaler = evtPrsc; + qdmx->QTSUCTRL.BIT.qtmr_lock_mode = tsuLock; +} + +/** + * @brief Get the capture timer value. + * @param qdmx QDM register base address. + * @retval unsigned int The capture timer value. + */ +static inline unsigned int DCL_QDM_GetCapTimer(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + return (qdmx->QCTMR); +} + +/** + * @brief Set the max value of capture timer. + * @param qdmx QDM register base address. + * @param maxCount Max value. + * @retval None. + */ +static inline void DCL_QDM_SetCapMaxCnt(QDM_RegStruct *qdmx, unsigned int maxCount) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QCMAX = maxCount; +} + +/** + * @brief Get the period of capture timer. + * @param qdmx QDM register base address. + * @retval unsigned int Period of capture timer. + */ +static inline unsigned int DCL_QDM_GetCapPeriod(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + return (qdmx->QCPRD); +} + +/** + * @brief Get the lock value of capture timer. + * @param qdmx QDM register base address. + * @retval unsigned int Lock value. + */ +static inline unsigned int DCL_QDM_GetCapTimerLock(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + return (qdmx->QCTMRLOCK); +} + +/** + * @brief Get the period value of capture timer. + * @param qdmx QDM register base address. + * @retval unsigned int Period value of capture timer. + */ +static inline unsigned int DCL_QDM_GetCapPeriodLock(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + return (qdmx->QCPRDLOCK); +} + +/* Period Trigger Unit ------------------------------------------------------------------------- */ +/** + * @brief Enable Period Trigger Unit. + * @param qdmx QDM register base address. + * @retval None. + */ +static inline void DCL_QDM_EnablePeriodTrigger(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QCTRL.BIT.ptu_en = BASE_CFG_ENABLE; +} + +/** + * @brief Disable Period Trigger Unit. + * @param qdmx QDM register base address. + * @retval None. + */ +static inline void DCL_QDM_DisablePeriodTrigger(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QCTRL.BIT.ptu_en = BASE_CFG_DISABLE; +} + +/** + * @brief Set the working mode of Period Trigger Unit. + * @param qdmx QDM register base address. + * @param ptuMode Working mode of Period Trigger Unit. + * @retval None. + */ +static inline void DCL_QDM_SetPeriodTriggerUnitMode(QDM_RegStruct *qdmx, QDM_PTUMode ptuMode) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + QDM_PARAM_CHECK_NO_RET(ptuMode == QDM_PERIOD_TRIGGER_MODE || ptuMode == QDM_WATCHDOG_MODE); + qdmx->QCTRL.BIT.ptu_mode = ptuMode; +} + +/** + * @brief Set the trigger lock mode. + * @param qdmx QDM register base address. + * @param lockMode Trigger lock mode. + * @retval None. + */ +static inline void DCL_QDM_SetTriggerLockMode(QDM_RegStruct *qdmx, QDM_TriggerLockMode lockMode) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + QDM_PARAM_CHECK_NO_RET(lockMode == QDM_LOCK_POSCNT_READ_BY_CPU || lockMode == QDM_LOCK_UNIT_TIME_TRIGGER); + qdmx->QCTRL.BIT.qtrg_lock_mode = lockMode; +} + +/** + * @brief Set the period of unit time event. + * @param qdmx QDM register base address. + * @param period Period of unit time event. + * @retval None. + */ +static inline void DCL_QDM_SetTriggerPeriod(QDM_RegStruct *qdmx, unsigned int period) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QUPRD = period; +} + +/** + * @brief Get the value of period counter. + * @param qdmx QDM register base address. + * @retval unsigned int Value of period counter. + */ +static inline unsigned int DCL_QDM_GetPeriodCounter(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + return (qdmx->QUTMR); +} + +/* Interrupt Generator ------------------------------------------------------------------------- */ +/** + * @brief Enable specific interrupt. + * @param qdmx QDM register base address. + * @param intEvt Interrupt event. + * @retval None. + */ +static inline void DCL_QDM_EnableInterrupt(QDM_RegStruct *qdmx, QDM_InterruptEvent intEvt) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + /* Check whether the QDM interrupt type is right. */ + QDM_PARAM_CHECK_NO_RET(IsQDMInterruptEvent(intEvt)); + qdmx->QINTENA.reg |= (unsigned int)intEvt; +} + +/** + * @brief Disable specific interrupt. + * @param qdmx QDM register base address. + * @param intEvt Interrupt event. + * @retval None. + */ +static inline void DCL_QDM_DisableInterrupt(QDM_RegStruct *qdmx, QDM_InterruptEvent intEvt) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + /* Check whether the QDM interrupt type is right. */ + QDM_PARAM_CHECK_NO_RET(IsQDMInterruptEvent(intEvt)); + qdmx->QINTENA.reg &= (~(unsigned int)intEvt); +} + +/** + * @brief Get the specific interrupt flag. + * @param qdmx QDM register base address. + * @param intEvt Interrupt event. + * @retval bool true, false. + */ +static inline bool DCL_QDM_GetInterruptFlag(QDM_RegStruct *qdmx, QDM_InterruptEvent intEvt) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + /* Check whether the QDM interrupt type is right. */ + QDM_ASSERT_PARAM(IsQDMInterruptEvent(intEvt)); + return ((qdmx->QINTSTS.reg & (unsigned int)intEvt) == intEvt); +} + +/** + * @brief Clear the specific interrupt flag. + * @param qdmx QDM register base address. + * @param intEvt Interrupt event. + * @retval None. + */ +static inline void DCL_QDM_ClearInterrupt(QDM_RegStruct *qdmx, QDM_InterruptEvent intEvt) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + /* Check whether the QDM interrupt type is right. */ + QDM_PARAM_CHECK_NO_RET(IsQDMInterruptEvent(intEvt)); + qdmx->QINTRAW.reg |= (unsigned int)intEvt; +} + +/** + * @brief Force a specific interrupt. + * @param qdmx QDM register base address. + * @param intEvt Interrupt event. + * @retval None. + */ +static inline void DCL_QDM_ForceInterrupt(QDM_RegStruct *qdmx, QDM_InterruptEvent intEvt) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + /* Check whether the QDM interrupt type is right. */ + QDM_PARAM_CHECK_NO_RET(IsQDMInterruptEvent(intEvt)); + qdmx->QINTINJ.reg |= (unsigned int)intEvt; +} + +/** + * @brief Enable speed lost raw interrupt. + * @param qdmx QDM register base address. + * @retval None. + */ +static inline void DCL_QDM_EnableSpedLstRaw(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QINTRAW.BIT.sped_lst_raw = BASE_CFG_ENABLE; +} + +/** + * @brief Enable PTU period raw interrupt. + * @param qdmx QDM register base address. + * @retval None. + */ +static inline void DCL_QDM_EnableUtmrPrdRaw(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QINTRAW.BIT.utmr_prd_raw = BASE_CFG_ENABLE; +} + +/** + * @brief Set the event status. + * @param qdmx QDM register base address. + * @retval None. + */ +static inline void DCL_QDM_SetCevtSts(QDM_RegStruct *qdmx, unsigned int status) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + qdmx->QDMSTS.BIT.cevt_sts = status; +} + +/** + * @brief Get the event status. + * @param qdmx QDM register base address. + * @retval unsigned int Value of cevt_sts. + */ +static inline unsigned int DCL_QDM_GetCevtSts(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + return qdmx->QDMSTS.BIT.cevt_sts; +} + +/** + * @brief Get TSU overflow status. + * @param qdmx QDM register base address. + * @retval unsigned int Value of qctmr_ovf_sts. + */ +static inline unsigned int DCL_QDM_GetQctmrOvfSts(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + return qdmx->QDMSTS.BIT.qctmr_ovf_sts; +} + +/** + * @brief Get quadrature direction status. + * @param qdmx QDM register base address. + * @retval unsigned int Value of qdir_sts. + */ +static inline unsigned int DCL_QDM_GetQdirSts(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + return qdmx->QDMSTS.BIT.qdir_sts; +} + +/** + * @brief Get the direction error status. + * @param qdmx QDM register base address. + * @retval unsigned int Value of qcdr_err_sts. + */ +static inline unsigned int DCL_QDM_GetQcdrErrSts(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + return qdmx->QDMSTS.BIT.qcdr_err_sts; +} + +/** + * @brief Get the position counter active compare value. + * @param qdmx QDM register base address. + * @retval unsigned int Value of qposcmpa. + */ +static inline unsigned int DCL_QDM_GetPositionCompareValue(QDM_RegStruct *qdmx) +{ + QDM_ASSERT_PARAM(IsQDMInstance(qdmx)); + return qdmx->QPOSCMPA; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_QDM_IP_H */ diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/qdm/src/qdm.c b/vendor/others/demo/5-tim_adc/demo/drivers/qdm/src/qdm.c new file mode 100644 index 000000000..5c0083d4d --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/qdm/src/qdm.c @@ -0,0 +1,550 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file qdm.c + * @author MCU Driver Team. + * @brief QDM HAL level module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the QDM. + * + Initialization and de-initialization functions. + * + Qdm Module Control functions. + * + Speed measure use M function. + * + Stall condition detection. + */ +#include "qdm.h" +#include "interrupt.h" + +#define QDM_INT_MASK 0x38 +/** + * @brief Set Decoder configurations + * @param qdmHandle Value of @ref QDM_Handle. + * @retval None + */ +static void QDM_DecoderConfig(QDM_Handle *qdmHandle) +{ + QDM_ASSERT_PARAM(qdmHandle != NULL); + QDM_ASSERT_PARAM(IsQDMInstance(qdmHandle->baseAddress)); + QDM_PARAM_CHECK_NO_RET(IsDecodeMode(qdmHandle->ctrlConfig.decoderMode)); + QDM_PARAM_CHECK_NO_RET(IsSwap(qdmHandle->ctrlConfig.swap)); + QDM_PARAM_CHECK_NO_RET(IsResolution(qdmHandle->ctrlConfig.resolution)); + QDM_PARAM_CHECK_NO_RET(IsTrgLockMode(qdmHandle->ctrlConfig.trgLockMode)); + QDM_PARAM_CHECK_NO_RET(IsPtuMode(qdmHandle->ctrlConfig.ptuMode)); + + /* input mode setting */ + qdmHandle->baseAddress->QCTRL.BIT.qdu_mode = qdmHandle->ctrlConfig.decoderMode; + /* swap */ + qdmHandle->baseAddress->QCTRL.BIT.qdm_ab_swap = qdmHandle->ctrlConfig.swap; + /* qdm xclk */ + qdmHandle->baseAddress->QCTRL.BIT.qdu_xclk = qdmHandle->ctrlConfig.resolution; + /* polarity */ + /* bit0: A input polarity, bit value: 0--direct input, 1--invert input */ + qdmHandle->baseAddress->QCTRL.BIT.qdma_polarity = (qdmHandle->ctrlConfig.polarity & 0x01); + /* bit1: B input polarity, bit value: 0--direct input, 1--invert input */ + qdmHandle->baseAddress->QCTRL.BIT.qdmb_polarity = ((qdmHandle->ctrlConfig.polarity >> 1) & 0x01); + /* bit2: index input polarity, bit value: 0--direct input, 1--invert input */ + qdmHandle->baseAddress->QCTRL.BIT.qdmi_polarity = ((qdmHandle->ctrlConfig.polarity >> 2) & 0x01); + /* lock mode */ + qdmHandle->baseAddress->QCTRL.BIT.qtrg_lock_mode = qdmHandle->ctrlConfig.trgLockMode; + /* ptu mode */ + qdmHandle->baseAddress->QCTRL.BIT.ptu_mode = qdmHandle->ctrlConfig.ptuMode; +} + +/** + * @brief Set counter configurations + * @param qdmHandle Value of @ref QDM_Handle. + * @retval None + */ +static void QDM_CounterConfig(QDM_Handle *qdmHandle) +{ + QDM_ASSERT_PARAM(qdmHandle != NULL); + QDM_ASSERT_PARAM(IsQDMInstance(qdmHandle->baseAddress)); + QDM_PARAM_CHECK_NO_RET(IsPcntMode(qdmHandle->pcntMode)); + QDM_PARAM_CHECK_NO_RET(IsPcntRstMode(qdmHandle->pcntRstMode)); + QDM_PARAM_CHECK_NO_RET(IsPcntIdxInitMode(qdmHandle->pcntIdxInitMode)); + QDM_PARAM_CHECK_NO_RET(IsTsuPrescaler(qdmHandle->tsuPrescaler)); + QDM_PARAM_CHECK_NO_RET(IsCevtPrescaler(qdmHandle->cevtPrescaler)); + + /* set pcnt mode */ + qdmHandle->baseAddress->QPPUCTRL.BIT.pcnt_mode = qdmHandle->pcntMode; + qdmHandle->baseAddress->QPPUCTRL.BIT.pcnt_rst_mode = qdmHandle->pcntRstMode; + qdmHandle->baseAddress->QPPUCTRL.BIT.pcnt_idx_init_mode = qdmHandle->pcntIdxInitMode; + /* set TSU */ + qdmHandle->baseAddress->QTSUCTRL.BIT.tsu_prescaler = qdmHandle->tsuPrescaler; + qdmHandle->baseAddress->QTSUCTRL.BIT.cevt_prescaler = qdmHandle->cevtPrescaler; + /* set init value */ + qdmHandle->baseAddress->QPOSINIT = qdmHandle->posInit; + /* set count max value */ + qdmHandle->baseAddress->QPOSMAX = qdmHandle->posMax; + qdmHandle->baseAddress->QUPRD = qdmHandle->period; + qdmHandle->baseAddress->QCMAX = qdmHandle->qcMax; +} + +/** + * @brief enable submodules + * @param qdmHandle Value of @ref QDM_Handle. + * @retval None + */ +static void QDM_EnableSubmodule(QDM_Handle *qdmHandle) +{ + QDM_ASSERT_PARAM(qdmHandle != NULL); + QDM_ASSERT_PARAM(IsQDMInstance(qdmHandle->baseAddress)); + if (qdmHandle->subModeEn == true) { + qdmHandle->baseAddress->QCTRL.BIT.ppu_en = BASE_CFG_ENABLE; + qdmHandle->baseAddress->QCTRL.BIT.ptu_en = BASE_CFG_ENABLE; + qdmHandle->baseAddress->QCTRL.BIT.tsu_en = BASE_CFG_ENABLE; + } +} + +/** + * @brief enable interrupt + * @param qdmHandle Value of @ref QDM_Handle. + * @retval None + */ +static void QDM_InterruptEnable(QDM_Handle *qdmHandle) +{ + QDM_ASSERT_PARAM(qdmHandle != NULL); + QDM_ASSERT_PARAM(IsQDMInstance(qdmHandle->baseAddress)); + qdmHandle->baseAddress->QINTENA.reg = qdmHandle->interruptEn; +} + +/** + * @brief Speed lose interrupt. + * @param qdmHandle Value of @ref QDM_Handle. + * @retval None + */ +static void SpeedLose(QDM_Handle *qdmHandle) +{ + if (qdmHandle->userCallBack.SpeedLoseCallback != NULL) { + qdmHandle->userCallBack.SpeedLoseCallback(qdmHandle); + } +} + +/** + * @brief QDM Z index lock interrupt. + * @param qdmHandle Value of @ref QDM_Handle. + * @retval None + */ +static void ZIndexLock(QDM_Handle *qdmHandle) +{ + if (qdmHandle->userCallBack.ZIndexLockedCallBack != NULL) { + qdmHandle->userCallBack.ZIndexLockedCallBack(qdmHandle); + } +} + +/** + * @brief Orthogonal direction change interrupt. + * @param qdmHandle Value of @ref QDM_Handle. + * @retval None + */ +static void OrthoDirChange(QDM_Handle *qdmHandle) +{ + if (qdmHandle->userCallBack.OrthogonalDirectionChangeCallBack != NULL) { + qdmHandle->userCallBack.OrthogonalDirectionChangeCallBack(qdmHandle); + } +} + +/** + * @brief Orthogonal phase error interrupt. + * @param qdmHandle Value of @ref QDM_Handle. + * @retval None + */ +static void OrthoPhaseErr(QDM_Handle *qdmHandle) +{ + if (qdmHandle->userCallBack.OrthogonalPhaseErrorCallBack != NULL) { + qdmHandle->userCallBack.OrthogonalPhaseErrorCallBack(qdmHandle); + } +} + +/** + * @brief Position compare match interrupt. + * @param qdmHandle Value of @ref QDM_Handle. + * @retval None + */ +static void PosCompareMatch(QDM_Handle *qdmHandle) +{ + if (qdmHandle->userCallBack.PositionCompareMatchCallBack != NULL) { + qdmHandle->userCallBack.PositionCompareMatchCallBack(qdmHandle); + } +} + +/** + * @brief Position compare ready interrupt. + * @param qdmHandle Value of @ref QDM_Handle. + * @retval None + */ +static void PosCompareReady(QDM_Handle *qdmHandle) +{ + if (qdmHandle->userCallBack.PositionCompareReadyCallBack != NULL) { + qdmHandle->userCallBack.PositionCompareReadyCallBack(qdmHandle); + } +} + +/** + * @brief Position counter error interrupt. + * @param qdmHandle Value of @ref QDM_Handle. + * @retval None + */ +static void PosCounterErr(QDM_Handle *qdmHandle) +{ + if (qdmHandle->userCallBack.PositionCounterErrorCallBack != NULL) { + qdmHandle->userCallBack.PositionCounterErrorCallBack(qdmHandle); + } +} + +/** + * @brief Position counter overflow interrupt. + * @param qdmHandle Value of @ref QDM_Handle. + * @retval None + */ +static void PosCounterOverflow(QDM_Handle *qdmHandle) +{ + if (qdmHandle->userCallBack.PositionCounterOverflowCallBack != NULL) { + qdmHandle->userCallBack.PositionCounterOverflowCallBack(qdmHandle); + } +} + +/** + * @brief Position counter underflow interrupt. + * @param qdmHandle Value of @ref QDM_Handle. + * @retval None + */ +static void PosCounterUnderflow(QDM_Handle *qdmHandle) +{ + if (qdmHandle->userCallBack.PositionCounterUnderflowCallBack != NULL) { + qdmHandle->userCallBack.PositionCounterUnderflowCallBack(qdmHandle); + } +} + +/** + * @brief Other interrupt callback function. + * @param qdmHandle Value of @ref QDM_Handle. + * @param qinsts: Interrupt status register. + * @retval None + */ +static void OtherInterruptCallBack(QDM_Handle *qdmHandle, QDM_QINTSTS_REG qinsts) +{ + if (qinsts.BIT.qphs_err_int == BASE_CFG_SET) { + /* Orthogonal phase error interrupt. */ + OrthoPhaseErr(qdmHandle); + qdmHandle->baseAddress->QINTRAW.BIT.qphs_err_raw = BASE_CFG_ENABLE; + } + if (qinsts.BIT.pcnt_cpm_int == BASE_CFG_SET) { + /* Position compare match interrupt. */ + PosCompareMatch(qdmHandle); + qdmHandle->baseAddress->QINTRAW.BIT.pcnt_cpm_raw = BASE_CFG_ENABLE; + } + if (qinsts.BIT.pcnt_cpr_int == BASE_CFG_SET) { + /* Position compare ready interrupt. */ + PosCompareReady(qdmHandle); + qdmHandle->baseAddress->QINTRAW.BIT.pcnt_cpr_raw = BASE_CFG_ENABLE; + } + if (qinsts.BIT.pcnt_err_int == BASE_CFG_SET) { + /* Position counter error interrupt. */ + PosCounterErr(qdmHandle); + qdmHandle->baseAddress->QINTRAW.BIT.pcnt_err_raw = BASE_CFG_ENABLE; + } + if (qinsts.BIT.pcnt_ovf_int == BASE_CFG_SET) { + /* Position counter overflow interrupt. */ + PosCounterOverflow(qdmHandle); + qdmHandle->baseAddress->QINTRAW.BIT.pcnt_ovf_raw = BASE_CFG_ENABLE; + } + if (qinsts.BIT.pcnt_udf_int == BASE_CFG_SET) { + /* Position counter underflow interrupt. */ + PosCounterUnderflow(qdmHandle); + qdmHandle->baseAddress->QINTRAW.BIT.pcnt_udf_raw = BASE_CFG_ENABLE; + } +} + +/** + * @brief M-method speed calculation. + * @param qdmHandle Value of @ref QDM_Handle. + * @retval None + */ +static void CalculateSpeed(QDM_Handle *qdmHandle) +{ + unsigned int deltaValue, tmp, intFlag; + /* Last QPOSLOCK value */ + static unsigned int lastPoslockValue = 0; + int speed; + deltaValue = qdmHandle->baseAddress->QPOSLOCK; + /* The position count reset mode is overflow reset. */ + intFlag = (qdmHandle->baseAddress->QINTSTS.reg & QDM_INT_MASK); + if ((qdmHandle->pcntRstMode == QDM_PCNT_RST_OVF) && (intFlag == 0)) { + deltaValue = qdmHandle->baseAddress->QPOSLOCK - lastPoslockValue; + } + lastPoslockValue = qdmHandle->baseAddress->QPOSLOCK; + if (qdmHandle->baseAddress->QDMSTS.BIT.qdir_sts == 1) { /* forward */ + tmp = deltaValue >> qdmHandle->baseAddress->QCTRL.BIT.qdu_xclk; + speed = ((tmp * SECONDS_PER_MINUTES) / qdmHandle->motorLineNum) \ + * (BASE_FUNC_GetCpuFreqHz() / qdmHandle->period); + qdmHandle->speedRpm = speed; + } else { /* reverse */ + tmp = (qdmHandle->posMax - deltaValue) >> qdmHandle->baseAddress->QCTRL.BIT.qdu_xclk; + speed = ((tmp * SECONDS_PER_MINUTES) / qdmHandle->motorLineNum) \ + * (BASE_FUNC_GetCpuFreqHz() / qdmHandle->period); + qdmHandle->speedRpm = -speed; + } +} + +/** + * @brief IRQ Handler + * @param handle: QDM handle. + * @retval None + */ +void HAL_QDM_IrqHandler(void *handle) +{ + QDM_ASSERT_PARAM(handle != NULL); + QDM_Handle *qdmHandle = (QDM_Handle *)handle; + QDM_ASSERT_PARAM(IsQDMInstance(qdmHandle->baseAddress)); + + if (qdmHandle->motorLineNum == 0 || qdmHandle->period == 0) { + /* clear interrupt */ + qdmHandle->baseAddress->QINTRAW.BIT.sped_lst_raw = BASE_CFG_ENABLE; + qdmHandle->baseAddress->QINTRAW.BIT.utmr_prd_raw = BASE_CFG_ENABLE; + return; + } + + QDM_QINTSTS_REG qinsts = qdmHandle->baseAddress->QINTSTS; + if (qinsts.BIT.utmr_prd_int == BASE_CFG_SET) { + CalculateSpeed(qdmHandle); + /* PTU timer cycle triggle interrupt */ + if (qdmHandle->userCallBack.PtuCycleTrgCallback != NULL) { + qdmHandle->userCallBack.PtuCycleTrgCallback(qdmHandle); + } + qdmHandle->baseAddress->QINTRAW.BIT.utmr_prd_raw = BASE_CFG_ENABLE; + } + if (qinsts.BIT.sped_lst_int == BASE_CFG_SET) { + /* speed lose interrupt */ + SpeedLose(qdmHandle); + qdmHandle->baseAddress->QINTRAW.BIT.sped_lst_raw = BASE_CFG_ENABLE; + } + if (qinsts.BIT.indx_lck_int == BASE_CFG_SET) { + /* QDM Z index lock interrupt. */ + ZIndexLock(qdmHandle); + qdmHandle->baseAddress->QINTRAW.BIT.indx_lck_raw = BASE_CFG_ENABLE; + } + if (qinsts.BIT.qdir_chg_int == BASE_CFG_SET) { + /* Orthogonal direction change interrupt. */ + OrthoDirChange(qdmHandle); + qdmHandle->baseAddress->QINTRAW.BIT.qdir_chg_raw = BASE_CFG_ENABLE; + } + OtherInterruptCallBack(qdmHandle, qinsts); + return; +} + +/** + * @brief Select the interrupt callback function by the switch-case. + * @param qdmHandle Value of @ref QDM_Handle. + * @param typeId: Interrupt type. + * @param pCallBack: Interrupt callback function. + * @retval None + */ +static void SelectInterruptCallback(QDM_Handle *qdmHandle, QDM_CallbackFuncType typeID, QDM_CallbackType pCallback) +{ + switch (typeID) { + case QDM_TSU_CYCLE: + /* PTU timer cycle triggle interrupt. */ + qdmHandle->userCallBack.PtuCycleTrgCallback = pCallback; + break; + case QDM_SPEED_LOSE: + /* Speed lose interrupt. */ + qdmHandle->userCallBack.SpeedLoseCallback = pCallback; + break; + case QDM_INDEX_LOCKED: + /* QDM Z index lock interrupt. */ + qdmHandle->userCallBack.ZIndexLockedCallBack = pCallback; + break; + case QDM_DIR_CHANGE: + /* Orthogonal direction change interrupt. */ + qdmHandle->userCallBack.OrthogonalDirectionChangeCallBack = pCallback; + break; + case QDM_PHASE_ERROR: + /* Orthogonal phase error interrupt. */ + qdmHandle->userCallBack.OrthogonalPhaseErrorCallBack = pCallback; + break; + case QDM_POS_MATCH: + /* Position compare match interrupt. */ + qdmHandle->userCallBack.PositionCompareMatchCallBack = pCallback; + break; + case QDM_POS_READY: + /* Position compare ready interrupt. */ + qdmHandle->userCallBack.PositionCompareReadyCallBack = pCallback; + break; + case QDM_POS_CNT_ERROR: + /* Position counter error interrupt. */ + qdmHandle->userCallBack.PositionCounterErrorCallBack = pCallback; + break; + case QDM_POS_CNT_OVERFLOW: + /* Position counter overflow interrupt. */ + qdmHandle->userCallBack.PositionCounterOverflowCallBack = pCallback; + break; + case QDM_POS_CNT_UNDERFLOW: + /* Position counter underflow interrupt. */ + qdmHandle->userCallBack.PositionCounterUnderflowCallBack = pCallback; + break; + default: + return; + } +} + +/** + * @brief Register IRQ callback functions + * @param qdmHandle Value of @ref QDM_Handle. + * @param typeID: callback function type ID. + * @param pCallback: pointer of callback function. + * @retval None + */ +void HAL_QDM_RegisterCallback(QDM_Handle *qdmHandle, QDM_CallbackFuncType typeID, QDM_CallbackType pCallback) +{ + QDM_ASSERT_PARAM(qdmHandle != NULL); + QDM_ASSERT_PARAM(pCallback != NULL); + QDM_ASSERT_PARAM(IsQDMInstance(qdmHandle->baseAddress)); + /* Select the interrupt callback function by the switch-case. */ + SelectInterruptCallback(qdmHandle, typeID, pCallback); +} + +/** + * @brief QDM initialization functions + * @param qdmHandle Value of @ref QDM_Handle. + * @retval BASE_StatusType:BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT + */ +BASE_StatusType HAL_QDM_Init(QDM_Handle *qdmHandle) +{ + QDM_ASSERT_PARAM(qdmHandle != NULL); + QDM_ASSERT_PARAM(IsQDMInstance(qdmHandle->baseAddress)); + QDM_PARAM_CHECK_WITH_RET(IsEmuMode(qdmHandle->emuMode), BASE_STATUS_ERROR); + QDM_PARAM_CHECK_WITH_RET(IsLockMode(qdmHandle->lock_mode), BASE_STATUS_ERROR); + + qdmHandle->baseAddress->QEMUMODE.BIT.emu_mode = qdmHandle->emuMode; + /* Set Z index locked mode. */ + if ((qdmHandle->interruptEn & QDM_INT_INDEX_EVNT_LATCH) == QDM_INT_INDEX_EVNT_LATCH) { + DCL_QDM_SetIndexLockMode(qdmHandle->baseAddress, qdmHandle->lock_mode); + } + /* Set input filter width. */ + DCL_QDM_SetInputFilterWidth(qdmHandle->baseAddress, qdmHandle->inputFilter.qdmAFilterLevel, \ + qdmHandle->inputFilter.qdmBFilterLevel, qdmHandle->inputFilter.qdmZFilterLevel); + QDM_DecoderConfig(qdmHandle); + QDM_CounterConfig(qdmHandle); + /* Enable interrupt. */ + QDM_InterruptEnable(qdmHandle); + QDM_EnableSubmodule(qdmHandle); + return BASE_STATUS_OK; +} + +/** + * @brief QDM deinitialization functions + * @param qdmHandle Value of @ref QDM_Handle. + * @retval BASE_StatusType:BASE_STATUS_OK, BASE_STATUS_ERROR, BASE_STATUS_BUSY, BASE_STATUS_TIMEOUT + */ +BASE_StatusType HAL_QDM_DeInit(QDM_Handle *qdmHandle) +{ + QDM_ASSERT_PARAM(qdmHandle != NULL); + QDM_ASSERT_PARAM(IsQDMInstance(qdmHandle->baseAddress)); + /* Clear QDM interrupt callback functions. */ + qdmHandle->userCallBack.PtuCycleTrgCallback = NULL; + qdmHandle->userCallBack.SpeedLoseCallback = NULL; + + /* Disable interrupt. */ + qdmHandle->baseAddress->QINTENA.reg = BASE_CFG_DISABLE; + /* Disable submodules. */ + qdmHandle->baseAddress->QCTRL.BIT.ppu_en = BASE_CFG_DISABLE; + qdmHandle->baseAddress->QCTRL.BIT.ptu_en = BASE_CFG_DISABLE; + qdmHandle->baseAddress->QCTRL.BIT.tsu_en = BASE_CFG_DISABLE; + return BASE_STATUS_OK; +} + +/** + * @brief read position count register value and direct + * @param qdmHandle Value of @ref QDM_Handle. + * @param count: count value pointer. + * @param dir: dir. + * @retval none. + */ +void HAL_QDM_ReadPosCountAndDir(const QDM_Handle *qdmHandle, unsigned int *count, unsigned int *dir) +{ + QDM_ASSERT_PARAM(qdmHandle != NULL); + QDM_ASSERT_PARAM(count != NULL); + QDM_ASSERT_PARAM(dir != NULL); + QDM_ASSERT_PARAM(IsQDMInstance(qdmHandle->baseAddress)); + *count = qdmHandle->baseAddress->QPOSCNT; + *dir = qdmHandle->baseAddress->QDMSTS.BIT.qdir_sts; + + return; +} + +/** + * @brief get phase error status. + * @param qdmHandle Value of @ref QDM_Handle. + * @param errStatus: phase error status. + * @retval none. + */ +void HAL_QDM_GetPhaseErrorStatus(const QDM_Handle *qdmHandle, unsigned int *errStatus) +{ + QDM_ASSERT_PARAM(qdmHandle != NULL); + QDM_ASSERT_PARAM(errStatus != NULL); + QDM_ASSERT_PARAM(IsQDMInstance(qdmHandle->baseAddress)); + *errStatus = qdmHandle->baseAddress->QDMSTS.BIT.qcdr_err_sts; + + return; +} + +/** + * @brief Get motor speed use M method + * @param qdmHandle Value of @ref QDM_Handle. + * @retval int: motor's speed + */ +int HAL_QDM_GetSpeedRpmM(QDM_Handle *qdmHandle) +{ + QDM_ASSERT_PARAM(qdmHandle != NULL); + return qdmHandle->speedRpm; +} + +/** + * @brief Get motor speed use MT method + * @param qdmHandle Value of @ref QDM_Handle. + * @retval int: motor's speed + */ +int HAL_QDM_GetSpeedRpmMT(QDM_Handle *qdmHandle) +{ + int rpm; + unsigned int utime; + unsigned int tmp; + + QDM_ASSERT_PARAM(qdmHandle != NULL); + QDM_ASSERT_PARAM(IsQDMInstance(qdmHandle->baseAddress)); + QDM_ASSERT_PARAM(qdmHandle->motorLineNum != 0); + qdmHandle->baseAddress->QDMSTS.BIT.cevt_sts = BASE_CFG_SET; /* clear cevt status bit */ + while (qdmHandle->baseAddress->QDMSTS.BIT.cevt_sts != BASE_CFG_SET) { + ; + } + if (qdmHandle->baseAddress->QDMSTS.BIT.qctmr_ovf_sts == BASE_CFG_SET) { + qdmHandle->baseAddress->QDMSTS.reg = BASE_CFG_SET; /* clear qctmr overflow status */ + return 0; + } + utime = BASE_FUNC_GetCpuFreqHz() / qdmHandle->motorLineNum; + tmp = utime << qdmHandle->baseAddress->QTSUCTRL.BIT.cevt_prescaler \ + >> qdmHandle->baseAddress->QTSUCTRL.BIT.tsu_prescaler >> qdmHandle->baseAddress->QCTRL.BIT.qdu_xclk; + rpm = tmp * SECONDS_PER_MINUTES / qdmHandle->baseAddress->QCPRD; + + if (qdmHandle->baseAddress->QDMSTS.BIT.qdir_sts == BASE_CFG_SET) { + qdmHandle->speedRpm = rpm; + } else { + qdmHandle->speedRpm = -rpm; + } + + return qdmHandle->speedRpm; +} diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/spi/common/inc/spi.h b/vendor/others/demo/5-tim_adc/demo/drivers/spi/common/inc/spi.h new file mode 100644 index 000000000..f6c8ef2f4 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/spi/common/inc/spi.h @@ -0,0 +1,188 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file spi.h + * @author MCU Driver Team + * @brief SPI module driver. + * @details This file provides firmware functions to manage the following. + * functionalities of the SPI. + * + Initialization and de-initialization functions. + * + Peripheral transmit and receiving functions. + * + Enumerated definition of SPI basic parameter configuration. + */ +#ifndef McuMagicTag_SPI_H +#define McuMagicTag_SPI_H + +/* Includes ------------------------------------------------------------------*/ +#include "dma.h" +#include "spi_ip.h" + +/** + * @defgroup SPI SPI + * @brief SPI module. + * @{ + */ + + /** + * @defgroup SPI_Common SPI Common + * @brief SPI common external module. + * @{ + */ + +/* Macro definitions ---------------------------------------------------------*/ + +/* Definition of the chip selection configuration macro */ +#define SPI_CHIP_DESELECT 0 +#define SPI_CHIP_SELECT 1 + +/* Definition of the chip selection mode selection macro */ +#define SPI_CHIP_SELECT_MODE_INTERNAL 0 +#define SPI_CHIP_SELECT_MODE_CALLBACK 1 + +/** + * @defgroup SPI_Handle_Definition SPI Handle Definition + * @{ + */ + +/* Typedef definitions -------------------------------------------------------*/ +/** + * @brief Callback Function ID Enumeration Definition. + */ +typedef enum { + SPI_TX_COMPLETE_CB_ID = 0x00000000U, + SPI_RX_COMPLETE_CB_ID = 0x00000001U, + SPI_TX_RX_COMPLETE_CB_ID = 0x00000002U, + SPI_ERROR_CB_ID = 0x00000003U, + SPI_CS_CB_ID = 0x00000004U +} HAL_SPI_CallbackID; + +/** + * @brief Module Status Enumeration Definition. + */ +typedef enum { + HAL_SPI_STATE_RESET = 0x00000000U, /**< Peripheral not Initialized */ + HAL_SPI_STATE_READY = 0x00000001U, /**< Peripheral Initialized and ready for use */ + HAL_SPI_STATE_BUSY = 0x00000002U, /**< An internal process is ongoing */ + HAL_SPI_STATE_BUSY_TX = 0x00000003U, /**< Data Transmission process is ongoing */ + HAL_SPI_STATE_BUSY_RX = 0x00000004U, /**< Data Reception process is ongoing */ + HAL_SPI_STATE_BUSY_TX_RX = 0x00000005U, /**< Data Transmission and Reception process is ongoing */ + HAL_SPI_STATE_ERROR = 0x00000006U, /**< SPI error state */ + HAL_SPI_STATE_ABORT = 0x00000007U /**< SPI abort is ongoing */ +} HAL_SPI_State; + +/** + * @brief Module handle structure definition. + */ +typedef struct _SPI_Handle { + SPI_RegStruct *baseAddress; /**< Register base address. */ + + unsigned int mode; /**< See HAL_SPI_Mode. */ + unsigned int csMode; /**< SPI_CHIP_SELECT_MODE_INTERNAL or SPI_CHIP_SELECT_MODE_CALLBACK. */ + unsigned int xFerMode; /**< See HAL_SPI_XferMode. */ + unsigned int clkPolarity; /**< See HAL_SPI_ClkPol. */ + unsigned int clkPhase; /**< See HAL_SPI_ClkPha. */ + unsigned int endian; /**< See HAL_SPI_Endian. */ + unsigned int frameFormat; /**< See HAL_SPI_FrameMode. */ + unsigned int dataWidth; /**< See HAL_SPI_DataWidth. */ + unsigned char freqScr; /**< Frequency scr, value range: 0 to 255. */ + unsigned char freqCpsdvsr; /**< Frequency Cpsdvsr, an even number ranging from 0 to 254. */ + unsigned char waitVal; /**< Number of beats waiting between write and read in National + Microwire frame format. */ + bool waitEn; /**< SPI Microwire waiting enable. */ + unsigned int txIntSize; /**< TX interrupt transmission threshold. */ + unsigned int rxIntSize; /**< RX interrupt transmission threshold. */ + + unsigned int txDMABurstSize; /**< TX DMA transmission threshold. */ + unsigned int rxDMABurstSize; /**< RX DMA transmission threshold. */ + DMA_Handle *dmaHandle; /**< SPI_DMA control handle*/ + unsigned int txDmaCh; /**< SPI DMA tx channel */ + unsigned int rxDmaCh; /**< SPI DMA rx channel */ + + unsigned int csCtrl; /**< Chip select status. */ + unsigned char *rxBuff; /**< Rx buffer pointer address. */ + unsigned char *txBuff; /**< Tx buffer pointer address. */ + unsigned int transferSize; /**< Total length of transmitted data. */ + unsigned int txCount; /**< Tx Length of data transferred. */ + unsigned int rxCount; /**< Rx Length of data transferred. */ + + HAL_SPI_State state; /**< Running Status. */ + BASE_StatusType errorCode; /**< Error Code. */ + SPI_UserCallBack userCallBack; /**< User callback. */ + SPI_ExtendHandle handleEx; /**< SPI extend parameter. */ +} SPI_Handle; +/** + * @} + */ + +/** + * @brief Callback Function Type Definition. + */ +typedef void (* SPI_CallbackFuncType)(void *handle); + +/** + * @defgroup SPI_API_Declaration SPI HAL API + * @{ + */ + +BASE_StatusType HAL_SPI_Init(SPI_Handle *handle); +BASE_StatusType HAL_SPI_Deinit(SPI_Handle *handle); +BASE_StatusType HAL_SPI_ConfigParameter(SPI_Handle *handle); +BASE_StatusType HAL_SPI_RegisterCallback(SPI_Handle *handle, + HAL_SPI_CallbackID callbackID, + SPI_CallbackFuncType pcallback); +BASE_StatusType HAL_SPI_ReadBlocking(SPI_Handle *handle, + unsigned char *rData, + unsigned int dataSize, + unsigned int timeout); +BASE_StatusType HAL_SPI_WriteBlocking(SPI_Handle *handle, + unsigned char *wData, + unsigned int dataSize, + unsigned int timeout); +BASE_StatusType HAL_SPI_WriteReadBlocking(SPI_Handle *handle, + unsigned char *rData, + unsigned char *wData, + unsigned int dataSize, + unsigned int timeout); +BASE_StatusType HAL_SPI_ReadIT(SPI_Handle *handle, unsigned char *rData, unsigned int dataSize); +BASE_StatusType HAL_SPI_WriteIT(SPI_Handle *handle, unsigned char *wData, unsigned int dataSize); +BASE_StatusType HAL_SPI_WriteReadIT(SPI_Handle *handle, + unsigned char *rData, + unsigned char *wData, + unsigned int dataSizeout); +BASE_StatusType HAL_SPI_ReadDMA(SPI_Handle *handle, unsigned char *rData, unsigned int dataSize); +BASE_StatusType HAL_SPI_WriteDMA(SPI_Handle *handle, unsigned char *wData, unsigned int dataSize); +BASE_StatusType HAL_SPI_WriteReadDMA(SPI_Handle *handle, + unsigned char *rData, + unsigned char *wData, + unsigned int dataSizeout); +BASE_StatusType HAL_SPI_DMAStop(SPI_Handle *handle); +BASE_StatusType HAL_SPI_ChipSelectChannelSet(SPI_Handle *handle, SPI_ChipSelectChannel channel); +BASE_StatusType HAL_SPI_ChipSelectChannelGet(SPI_Handle *handle, SPI_ChipSelectChannel *channel); +void HAL_SPI_IrqHandler(void *handle); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* #ifndef McuMagicTag_SPI_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/spi/inc/spi_ex.h b/vendor/others/demo/5-tim_adc/demo/drivers/spi/inc/spi_ex.h new file mode 100644 index 000000000..22684be76 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/spi/inc/spi_ex.h @@ -0,0 +1,49 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file spi_ex.h + * @author MCU Driver Team + * @brief SPI module driver. + * @details This file provides firmware functions to manage the following. + * functionalities of the SPI. + * + SPI Set Functions. + */ +#ifndef McuMagicTag_SPI_EX_H +#define McuMagicTag_SPI_EX_H +/* Includes ------------------------------------------------------------------*/ +#include "spi.h" + +/* Macro definitions ---------------------------------------------------------*/ +/** + * @addtogroup SPI_IP + * @{ + */ + +/** + * @defgroup SPI_EX_API_Declaration SPI HAL API EX + * @{ + */ +BASE_StatusType HAL_SPI_SetChipConfigSelectEx(SPI_Handle *handle, HAL_SPI_CHIP_CONFIG mode); +HAL_SPI_CHIP_CONFIG HAL_SPI_GetChipConfigSelectEx(SPI_Handle *handle); +/** + * @} + */ + +/** + * @} + */ +#endif /* #ifndef McuMagicTag_SPI_EX_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/spi/inc/spi_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/spi/inc/spi_ip.h new file mode 100644 index 000000000..b51a0a113 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/spi/inc/spi_ip.h @@ -0,0 +1,1237 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file spi_ip.h + * @author MCU Driver Team. + * @brief SPI module driver. + * @details This file provides firmware functions to manage the following. + * functionalities of the SPI. + * + Register definition structure. + * + Direct configuration layer interface. + * + Parameter check inline function. + */ +#ifndef McuMagicTag_SPI_IP_H +#define McuMagicTag_SPI_IP_H + +/* Includes ------------------------------------------------------------------*/ +#include "baseinc.h" +#ifdef SPI_PARAM_CHECK +#define SPI_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define SPI_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define SPI_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define SPI_ASSERT_PARAM(para) ((void)0U) +#define SPI_PARAM_CHECK_NO_RET(para) ((void)0U) +#define SPI_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +/** + * @addtogroup SPI + * @{ + */ + +/** + * @defgroup SPI_IP SPI_IP + * @brief SPI_IP: spi_v1. + * @{ + */ + +#define SPI_CR0_SCR_POS 8 +#define SPI_CR0_SCR_MASK (0xFF << SPI_CR0_SCR_POS) + +/** + * @defgroup SPI_Param_Def SPI Parameters Definition + * @brief Definition of SPI configuration parameters. + * @{ + */ + +/* Typedef definitions -------------------------------------------------------*/ +/** + * @brief Master and Slave Device Enumeration Definition. + */ +typedef enum { + HAL_SPI_MASTER = 0x00000000U, + HAL_SPI_SLAVE = 0x00000001U +} HAL_SPI_Mode; + +/** + * @brief Clock Polarity Enumeration Definition. + */ +typedef enum { + HAL_SPI_CLKPOL_0 = 0x00000000U, + HAL_SPI_CLKPOL_1 = 0x00000001U +} HAL_SPI_ClkPol; + +/** + * @brief Clock Phase Enumeration Definition. + */ +typedef enum { + HAL_SPI_CLKPHA_0 = 0x00000000U, + HAL_SPI_CLKPHA_1 = 0x00000001U +} HAL_SPI_ClkPha; + +/** + * @brief Enumeration definition of data endian. + */ +typedef enum { + HAL_SPI_BIG_ENDIAN = 0x00000000U, + HAL_SPI_LITTILE_ENDIAN = 0x00000001U +} HAL_SPI_Endian; + +/** + * @brief Enumerated definition of data frame mode selection. + */ +typedef enum { + HAL_SPI_MODE_MOTOROLA = 0x00000000U, + HAL_SPI_MODE_TI = 0x00000001U, + HAL_SPI_MODE_MICROWIRE = 0x00000002U +} HAL_SPI_FrameMode; + +/** + * @brief Transmission Mode Selection Enumeration Definition. + */ +typedef enum { + HAL_XFER_MODE_BLOCKING = 0x00000000U, + HAL_XFER_MODE_INTERRUPTS = 0x00000001U, + HAL_XFER_MODE_DMA = 0x00000002U +} HAL_SPI_XferMode; + +/** + * @brief SPI Chip Select Config Definition. + */ +typedef enum { + HAL_SPI_CHIP_CONFIG_AUTO = 0x00000000U, + HAL_SPI_CHIP_CONFIG_ALTASENS = 0x00000001U, + HAL_SPI_CHIP_CONFIG_SOFR_UNSET = 0x00000002U, + HAL_SPI_CHIP_CONFIG_SOFR_SET = 0x00000003U +} HAL_SPI_CHIP_CONFIG; + +/** + * @brief Data Bit Width Enumeration Definition. + */ +typedef enum { + SPI_DATA_WIDTH_4BIT = 0x00000003U, + SPI_DATA_WIDTH_5BIT = 0x00000004U, + SPI_DATA_WIDTH_6BIT = 0x00000005U, + SPI_DATA_WIDTH_7BIT = 0x00000006U, + SPI_DATA_WIDTH_8BIT = 0x00000007U, + SPI_DATA_WIDTH_9BIT = 0x00000008U, + SPI_DATA_WIDTH_10BIT = 0x00000009U, + SPI_DATA_WIDTH_11BIT = 0x0000000aU, + SPI_DATA_WIDTH_12BIT = 0x0000000bU, + SPI_DATA_WIDTH_13BIT = 0x0000000cU, + SPI_DATA_WIDTH_14BIT = 0x0000000dU, + SPI_DATA_WIDTH_15BIT = 0x0000000eU, + SPI_DATA_WIDTH_16BIT = 0x0000000fU +} HAL_SPI_DataWidth; + +/** + * @brief Definitions of available parameters for interrupt Tx thresholds. + */ +typedef enum { + SPI_TX_INTERRUPT_SIZE_0 = 0x00000000U, + SPI_TX_INTERRUPT_SIZE_1 = 0x00000001U, + SPI_TX_INTERRUPT_SIZE_2 = 0x00000002U, + SPI_TX_INTERRUPT_SIZE_3 = 0x00000003U, + SPI_TX_INTERRUPT_SIZE_4 = 0x00000004U, + SPI_TX_INTERRUPT_SIZE_5 = 0x00000005U, + SPI_TX_INTERRUPT_SIZE_6 = 0x00000006U, + SPI_TX_INTERRUPT_SIZE_7 = 0x00000007U, + SPI_TX_INTERRUPT_SIZE_8 = 0x00000008U, + SPI_TX_INTERRUPT_SIZE_9 = 0x00000009U, + SPI_TX_INTERRUPT_SIZE_10 = 0x0000000AU, + SPI_TX_INTERRUPT_SIZE_11 = 0x0000000BU, + SPI_TX_INTERRUPT_SIZE_12 = 0x0000000CU, + SPI_TX_INTERRUPT_SIZE_13 = 0x0000000DU, + SPI_TX_INTERRUPT_SIZE_14 = 0x0000000EU, + SPI_TX_INTERRUPT_SIZE_15 = 0x0000000FU +} HAL_SPI_TxInterruptSize; + +/** + * @brief Definitions of available parameters for interrupt Rx thresholds. + */ +typedef enum { + SPI_RX_INTERRUPT_SIZE_0 = 0x00000000U, + SPI_RX_INTERRUPT_SIZE_1 = 0x00000001U, + SPI_RX_INTERRUPT_SIZE_2 = 0x00000002U, + SPI_RX_INTERRUPT_SIZE_3 = 0x00000003U, + SPI_RX_INTERRUPT_SIZE_4 = 0x00000004U, + SPI_RX_INTERRUPT_SIZE_5 = 0x00000005U, + SPI_RX_INTERRUPT_SIZE_6 = 0x00000006U, + SPI_RX_INTERRUPT_SIZE_7 = 0x00000007U, + SPI_RX_INTERRUPT_SIZE_8 = 0x00000008U, + SPI_RX_INTERRUPT_SIZE_9 = 0x00000009U, + SPI_RX_INTERRUPT_SIZE_10 = 0x0000000AU, + SPI_RX_INTERRUPT_SIZE_11 = 0x0000000BU, + SPI_RX_INTERRUPT_SIZE_12 = 0x0000000CU, + SPI_RX_INTERRUPT_SIZE_13 = 0x0000000DU, + SPI_RX_INTERRUPT_SIZE_14 = 0x0000000EU, + SPI_RX_INTERRUPT_SIZE_15 = 0x0000000FU, +} HAL_SPI_RxInterruptSize; + +/** + * @brief Definitions of available parameters for DMA Tx thresholds. + */ +typedef enum { + SPI_TX_DMA_BURST_SIZE_0 = 0x00000000U, + SPI_TX_DMA_BURST_SIZE_1 = 0x00000001U, + SPI_TX_DMA_BURST_SIZE_2 = 0x00000002U, + SPI_TX_DMA_BURST_SIZE_3 = 0x00000003U, + SPI_TX_DMA_BURST_SIZE_4 = 0x00000004U, + SPI_TX_DMA_BURST_SIZE_5 = 0x00000005U, + SPI_TX_DMA_BURST_SIZE_6 = 0x00000006U, + SPI_TX_DMA_BURST_SIZE_7 = 0x00000007U, + SPI_TX_DMA_BURST_SIZE_8 = 0x00000008U, + SPI_TX_DMA_BURST_SIZE_9 = 0x00000009U, + SPI_TX_DMA_BURST_SIZE_10 = 0x0000000AU, + SPI_TX_DMA_BURST_SIZE_11 = 0x0000000BU, + SPI_TX_DMA_BURST_SIZE_12 = 0x0000000CU, + SPI_TX_DMA_BURST_SIZE_13 = 0x0000000DU, + SPI_TX_DMA_BURST_SIZE_14 = 0x0000000EU, + SPI_TX_DMA_BURST_SIZE_15 = 0x0000000FU, +} HAL_SPI_TxDmaBurstSize; + +/** + * @brief Definitions of available parameters for DMA Rx thresholds. + */ +typedef enum { + SPI_RX_DMA_BURST_SIZE_0 = 0x00000000U, + SPI_RX_DMA_BURST_SIZE_1 = 0x00000001U, + SPI_RX_DMA_BURST_SIZE_2 = 0x00000002U, + SPI_RX_DMA_BURST_SIZE_3 = 0x00000003U, + SPI_RX_DMA_BURST_SIZE_4 = 0x00000004U, + SPI_RX_DMA_BURST_SIZE_5 = 0x00000005U, + SPI_RX_DMA_BURST_SIZE_6 = 0x00000006U, + SPI_RX_DMA_BURST_SIZE_7 = 0x00000007U, + SPI_RX_DMA_BURST_SIZE_8 = 0x00000008U, + SPI_RX_DMA_BURST_SIZE_9 = 0x00000009U, + SPI_RX_DMA_BURST_SIZE_10 = 0x0000000AU, + SPI_RX_DMA_BURST_SIZE_11 = 0x0000000BU, + SPI_RX_DMA_BURST_SIZE_12 = 0x0000000CU, + SPI_RX_DMA_BURST_SIZE_13 = 0x0000000DU, + SPI_RX_DMA_BURST_SIZE_14 = 0x0000000EU, + SPI_RX_DMA_BURST_SIZE_15 = 0x0000000FU, +} HAL_SPI_RxDmaBurstSize; + +/** + * @brief Defines the SPI chip select channel. + */ +typedef enum { + SPI_CHIP_SELECT_CHANNEL_0 = 0x00000000U, + SPI_CHIP_SELECT_CHANNEL_1 = 0x00000001U, + SPI_CHIP_SELECT_CHANNEL_2 = 0x00000002U, + SPI_CHIP_SELECT_CHANNEL_3 = 0x00000003U, + SPI_CHIP_SELECT_CHANNEL_MAX = 0x00000004U +} SPI_ChipSelectChannel; + +/** + * @brief SPI extend handle. + */ +typedef struct _SPI_ExtendHandle { +} SPI_ExtendHandle; + +/** + * @brief SPI user callback. + */ +typedef struct { + /* Sending completion callback function */ + void (* TxCpltCallback)(void *handle); + /* Receive completion callback function */ + void (* RxCpltCallback)(void *handle); + /* Receive and Sending completion callback function */ + void (* TxRxCpltCallback)(void *handle); + /* Error callback function */ + void (* ErrorCallback)(void *handle); + /* CS callback function */ + void (* CsCtrlCallback)(void *handle); +} SPI_UserCallBack; +/** + * @} + */ + +/** + * @defgroup SPI_Reg_Def SPI Register Definition + * @brief register mapping structure + * @{ + */ +/* Register Description Definition----------------------------------- */ + +/** + * @brief SPI clock, polarity, phase, frame format, data bit control register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int dss : 4; /**< data width. */ + unsigned int frf : 2; /**< frame format: Motorola TI Mircowire. */ + unsigned int spo : 1; /**< motorola polarity. */ + unsigned int sph : 1; /**< motorola phase. */ + unsigned int scr : 8; /**< serial clock rate. */ + unsigned int reserved0 : 16; + } BIT; +} volatile SPICR0_REG; + +/** + * @brief SPI parameter control register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int lbm : 1; /**< loopback mode enable. */ + unsigned int sse : 1; /**< SPI enable. */ + unsigned int ms : 1; /**< Master or Salve mode. */ + unsigned int reserved0 : 1; + unsigned int bitend : 1; /**< set the endian mode. */ + unsigned int reserved1 : 3; + unsigned int waitval : 7; /**< Microwire wait time. */ + unsigned int waiten : 1; /**< Microwire wait enable. */ + unsigned int reserved2 : 16; + } BIT; +} volatile SPICR1_REG; + +/** + * @brief SPI data FIFO register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int data : 16; /**< send and receive FIFO. */ + unsigned int reserved0 : 16; + } BIT; +} volatile SPIDR_REG; + +/** + * @brief SPI status register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int tfe : 1; /**< tx FIFO empty flag. */ + unsigned int tnf : 1; /**< tx FIFO not full flag. */ + unsigned int rne : 1; /**< rx FIFO not empty flag. */ + unsigned int rff : 1; /**< rx FIFO full flag. */ + unsigned int bsy : 1; /**< SPI busy flag. */ + unsigned int reserved0 : 27; + } BIT; +} volatile SPISR_REG; + +/** + * @brief SPI clock divider register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cpsdvsr : 8; /**< clock divider value, value is even number between 2 and 254. */ + unsigned int reserved0 : 24; + } BIT; +} volatile SPICPSR_REG; + +/** + * @brief SPI interrupt mask control register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rorim : 1; /**< rx overflow interrupt mask. */ + unsigned int rtim : 1; /**< rx timeout interrupt mask. */ + unsigned int rxim : 1; /**< rx FIFO interrupt mask. */ + unsigned int txim : 1; /**< tx FIFO interrupt mask. */ + unsigned int reserved0 : 28; + } BIT; +} volatile SPIIMSC_REG; + +/** + * @brief SPI raw interrupt status register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rorris : 1; /**< raw status of the rx overflow interrupt. */ + unsigned int rtris : 1; /**< raw status of the rx timeout interrupt. */ + unsigned int rxris : 1; /**< raw status of the rx FIFO interrupt. */ + unsigned int txris : 1; /**< raw status of the tx FIFO interrupt. */ + unsigned int reserved0 : 28; + } BIT; +} volatile SPIRIS_REG; + +/** + * @brief SPI masked interrupt status register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rormis : 1; /**< masked status of the rx overflow interrupt. */ + unsigned int rtmis : 1; /**< masked status of the rx timeout interrupt. */ + unsigned int rxmis : 1; /**< masked status of the rx FIFO interrupt. */ + unsigned int txmis : 1; /**< masked status of the tx FIFO interrupt. */ + unsigned int reserved0 : 28; + } BIT; +} volatile SPIMIS_REG; + +/** + * @brief SPI interrupt clear register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int roric : 1; /**< clear the rx overflow interrupt. */ + unsigned int rtic : 1; /**< clear the rx timeout interrupt. */ + unsigned int reserved0 : 30; + } BIT; +} volatile SPIICR_REG; + +/** + * @brief SPI DMA control register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rxdmae : 1; /**< DMA rx FIFO enable. */ + unsigned int txdmae : 1; /**< DMA tx FIFO enable. */ + unsigned int rxdmalsreqe : 1; /**< DMA rx FIFO SPI flow control. */ + unsigned int reserved0 : 29; + } BIT; +} volatile SPIDMACR_REG; + +/** + * @brief SPI tx FIFO control register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int txintsize : 4; /**< set the threshold of the tx FIFO request interrupt. */ + unsigned int reserved0 : 28; + } BIT; +} volatile SPITXFIFOCR_REG; + +/** + * @brief SPI rx FIFO control register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rxintsize : 4; /**< set the threshold of the rx FIFO request interrupt. */ + unsigned int reserved0 : 28; + } BIT; +} volatile SPIRXFIFOCR_REG; + + +/** + * @brief SPI cs mode control register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int spi_csn_sel : 2; /**< chip select. */ + unsigned int reserved0 : 2; + unsigned int spi_csn_mode : 2; /**< chip select mode. */ + unsigned int reserved1 : 26; + } BIT; +} volatile SPICSNCR_REG; + +/** + * @brief SPI Register definition structure + */ +typedef struct { + SPICR0_REG SPICR0; /**< SPI parameter control register 0. */ + SPICR1_REG SPICR1; /**< SPI parameter control register 1. */ + SPIDR_REG SPIDR; /**< SPI data FIFO register. */ + SPISR_REG SPISR; /**< SPI status register. */ + SPICPSR_REG SPICPSR; /**< SPI clock divider register. */ + SPIIMSC_REG SPIIMSC; /**< SPI interrupt mask control register. */ + SPIRIS_REG SPIRIS; /**< SPI raw interrupt status register. */ + SPIMIS_REG SPIMIS; /**< SPI masked interrupt status register. */ + SPIICR_REG SPIICR; /**< SPI interrupt clear register. */ + SPIDMACR_REG SPIDMACR; /**< SPI DMA control register. */ + SPITXFIFOCR_REG SPITXFIFOCR; /**< SPI tx FIFO control register. */ + SPIRXFIFOCR_REG SPIRXFIFOCR; /**< SPI rx FIFO control register. */ + SPICSNCR_REG SPICSNCR; /**< SPI cs mode control register. */ +} volatile SPI_RegStruct; +/** + * @} + */ + +/** + * @brief Check whether the SPI mode is used. + * @param mode Spi mode + * @retval true + * @retval false + */ +static inline bool IsSpiMode(unsigned int mode) +{ + if (mode == HAL_SPI_MASTER || mode == HAL_SPI_SLAVE) { + return true; + } + return false; +} + +/** + * @brief Check if the transfer mode specified for the SPI. + * @param xFermode Transfer mode. + * @retval true + * @retval false + */ +static inline bool IsSpiXferMode(unsigned int xFermode) +{ + if (xFermode == HAL_XFER_MODE_BLOCKING || + xFermode == HAL_XFER_MODE_INTERRUPTS || + xFermode == HAL_XFER_MODE_DMA) { + return true; + } + return false; +} + +/** + * @brief Checking SPI Polarity Parameters. + * @param clkPolarity Polarity Parameters. + * @retval true + * @retval false + */ +static inline bool IsSpiClkPolarity(unsigned int clkPolarity) +{ + if (clkPolarity == HAL_SPI_CLKPOL_0 || + clkPolarity == HAL_SPI_CLKPOL_1) { + return true; + } + return false; +} + +/** + * @brief Checking SPI Phase Parameters. + * @param clkPhase Phase Parameters. + * @retval true + * @retval false + */ +static inline bool IsSpiClkPhase(unsigned int clkPhase) +{ + if (clkPhase == HAL_SPI_CLKPHA_0 || + clkPhase == HAL_SPI_CLKPHA_1) { + return true; + } + return false; +} + +/** + * @brief Check the SPI big-endian configuration parameters. + * @param endian Big-endian configuration parameters. + * @retval true + * @retval false + */ +static inline bool IsSpiEndian(unsigned int endian) +{ + if (endian == HAL_SPI_BIG_ENDIAN || + endian == HAL_SPI_LITTILE_ENDIAN) { + return true; + } + return false; +} + +/** + * @brief Check the SPI frame format configuration. + * @param framFormat Frame format. + * @retval true + * @retval false + */ +static inline bool IsSpiFrameFormat(unsigned int framFormat) +{ + if (framFormat == HAL_SPI_MODE_MOTOROLA || + framFormat == HAL_SPI_MODE_TI || + framFormat == HAL_SPI_MODE_MICROWIRE) { + return true; + } + return false; +} + +/** + * @brief Checking the SPI Data Bit Width Configuration. + * @param dataWidth Data Bit Width. + * @retval true + * @retval false + */ +static inline bool IsSpiDataWidth(unsigned int dataWidth) +{ + if (dataWidth >= SPI_DATA_WIDTH_4BIT && dataWidth <= SPI_DATA_WIDTH_16BIT) { + return true; + } + return false; +} + +/** + * @brief Check the configuration of the waiting time between the TX and RX in the SPI microwire frame format. + * @param waitVal Waiting time. + * @retval true + * @retval false + */ +static inline bool IsSpiWaitVal(unsigned char waitVal) +{ + /* waitval value is 0 to 0x7f */ + if (waitVal <= 0x7f) { + return true; + } + return false; +} + +/** + * @brief Check the SPI interrupt TX threshold configuration. + * @param txIntSize TX threshold configuration. + * @retval true + * @retval false + */ +static inline bool IsSpiTxIntSize(unsigned int txIntSize) +{ + if (txIntSize <= SPI_TX_INTERRUPT_SIZE_15) { + return true; + } + return false; +} + +/** + * @brief Check the SPI interrupt RX threshold configuration. + * @param rxIntSize RX threshold configuration. + * @retval true + * @retval false + */ +static inline bool IsSpiRxIntSize(unsigned int rxIntSize) +{ + if (rxIntSize <= SPI_RX_INTERRUPT_SIZE_15) { + return true; + } + return false; +} + +/** + * @brief Check the SPI DMA TX threshold configuration. + * @param txDMABurstSize TX threshold. + * @retval true + * @retval false + */ +static inline bool IsSpiTxDmaBurstSize(unsigned int txDMABurstSize) +{ + if (txDMABurstSize <= SPI_TX_DMA_BURST_SIZE_15) { + return true; + } + return false; +} + +/** + * @brief Check the SPI DMA RX threshold configuration. + * @param rxDMABurstSize RX threshold. + * @retval true + * @retval false + */ +static inline bool IsSpiRxDmaBurstSize(unsigned int rxDMABurstSize) +{ + if (rxDMABurstSize <= SPI_RX_DMA_BURST_SIZE_15) { + return true; + } + return false; +} + +/** + * @brief Checking SPI frequency divider parameters. + * @param freqCpsdvsr Frequency division parameters to be checked. + * @retval true + * @retval false + */ +static inline bool IsSpiFreqCpsdvsr(unsigned char freqCpsdvsr) +{ + /* FreqCpsdvsr value is 0 to 255 */ + if (freqCpsdvsr >= 2) { + return true; + } + return false; +} + +/** + * @brief Setting SPI Chip Config Mode + * @param mode Spi Chip Config Mode + * @retval true + * @retval false + */ +static inline bool IsSpiChipConfigMode(unsigned int mode) +{ + if (mode <= HAL_SPI_CHIP_CONFIG_SOFR_SET) { + return true; + } + return false; +} + +/** + * @brief Setting SPI Chip Select Channel + * @param csn Spi Chip Select + * @retval true + * @retval false + */ +static inline bool IsSpiChipSelectChannel(unsigned int csn) +{ + if (csn < SPI_CHIP_SELECT_CHANNEL_MAX) { + return true; + } + return false; +} + +/* Direct configuration layer interface----------------------------------*/ +/** + * @brief SPI module enable. + * @param spix SPI register base address. + * @param spiEnable SPI enable or disable. + * @retval None. + */ +static inline void DCL_SPI_SetSpiEnable(SPI_RegStruct *spix, bool spiEnable) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + spix->SPICR1.BIT.sse = spiEnable; +} + +/** + * @brief Get SPI enable status. + * @param spix SPI register base address. + * @retval bool SPI enable or disable. + */ +static inline bool DCL_SPI_GetSpiEnable(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPICR1.BIT.sse; +} + +/** + * @brief Set SPI loopback. + * @param spix SPI register base address. + * @param loop enable or disable + * @retval None. + */ +static inline void DCL_SPI_SetLoopBack(SPI_RegStruct *spix, bool loop) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + spix->SPICR1.BIT.lbm = loop; +} + +/** + * @brief Get SPI loopback. + * @param spix SPI register base address. + * @retval bool loopback is enable or disable. + */ +static inline bool DCL_SPI_GetLoopBack(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPICR1.BIT.lbm; +} + +/** + * @brief Configuring SPI polarity + * @param spix SPI register base address. + * @param clkPolarity SPI Polarity,the value is 0 or 1. + * @retval None. + */ +static inline void DCL_SPI_SetClkPolarity(SPI_RegStruct *spix, unsigned int clkPolarity) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + SPI_PARAM_CHECK_NO_RET(IsSpiClkPolarity(clkPolarity)); + spix->SPICR0.BIT.spo = clkPolarity; +} + +/** + * @brief Get SPI polarity. + * @param spix SPI register base address. + * @retval SPI Polarity,the value is 0 or 1. + */ +static inline unsigned char DCL_SPI_GetClkPolarity(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPICR0.BIT.spo; +} + +/** + * @brief Configuring SPI phase. + * @param spix SPI register base address. + * @param clkPhase SPI phase,the value is 0 or 1. + * @retval None. + */ +static inline void DCL_SPI_SetClkPhase(SPI_RegStruct *spix, unsigned int clkPhase) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + SPI_PARAM_CHECK_NO_RET(IsSpiClkPhase(clkPhase)); + spix->SPICR0.BIT.sph = clkPhase; +} + +/** + * @brief Get SPI phase. + * @param spix SPI register base address. + * @retval SPI phase,the value is 0 or 1. + */ +static inline unsigned char DCL_SPI_GetClkPhase(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPICR0.BIT.sph; +} + +/** + * @brief SPI data big endian configuration. + * @param spix SPI register base address. + * @param bitEnd Big-endian configuration parameter. The value can be 0 or 1. + * @retval None. + */ +static inline void DCL_SPI_SetBitEnd(SPI_RegStruct *spix, unsigned int bitEnd) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + SPI_PARAM_CHECK_NO_RET(IsSpiEndian(bitEnd)); + spix->SPICR1.BIT.bitend = bitEnd; +} + +/** + * @brief Get SPI data big endian configuration. + * @param spix SPI register base address. + * @retval Big-endian configuration parameter. The value is 0 or 1. + */ +static inline unsigned char DCL_SPI_GetBitEnd(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPICR1.BIT.bitend; +} + +/** + * @brief SPI frame format configuration. + * @param spix SPI register base address. + * @param frameFormat Value: Motorola: 00, TI synchronous serial: 01, National Microwire: 10. + * @retval None. + */ +static inline void DCL_SPI_SetFrameFormat(SPI_RegStruct *spix, unsigned int frameFormat) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + SPI_PARAM_CHECK_NO_RET(IsSpiFrameFormat(frameFormat)); + spix->SPICR0.BIT.frf = frameFormat; +} + +/** + * @brief Get SPI frame format configuration. + * @param spix SPI register base address. + * @retval Motorola: 00, TI synchronous serial: 01, National Microwire: 10. + */ +static inline unsigned char DCL_SPI_GetFrameFormat(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPICR0.BIT.frf; +} + +/** + * @brief Configuring the SPI data bit width. + * @param spix SPI register base address. + * @param dataWidth The data bit width can be set to 4 to 16 bits. + * @retval None. + */ +static inline void DCL_SPI_SetDataWidth(SPI_RegStruct *spix, unsigned int dataWidth) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + SPI_PARAM_CHECK_NO_RET(IsSpiDataWidth(dataWidth)); + spix->SPICR0.BIT.dss = dataWidth; +} + +/** + * @brief Get the SPI data bit width configuring. + * @param spix SPI register base address. + * @retval SPI Data Bit Width configuring. + */ +static inline unsigned char DCL_SPI_GetDataWidth(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPICR0.BIT.dss; +} + +/** + * @brief SPI serial clock rate configuration. + * @param spix SPI register base address. + * @param freqScr Value range: 0 to 255. + * @retval None. + */ +static inline void DCL_SPI_SetFreqScr(SPI_RegStruct *spix, unsigned char freqScr) +{ + unsigned int cr0Reg; + unsigned int temp; + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + /* Read the entire register and write it back. */ + temp = ((unsigned int)freqScr) << SPI_CR0_SCR_POS; + cr0Reg = (spix->SPICR0.reg & (~SPI_CR0_SCR_MASK)) | temp; + spix->SPICR0.reg = cr0Reg; +} + +/** + * @brief Get SPI serial clock rate configuration. + * @param spix SPI register base address. + * @retval Value range: 0 to 255. + */ +static inline unsigned char DCL_SPI_GetFreqScr(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return ((spix->SPICR0.reg >> SPI_CR0_SCR_POS) & 0xFF); /* Minimum 8-bit mask 0xFF */ +} + +/** + * @brief SPI clock divider setting. + * @param spix SPI register base address. + * @param freqCpsdvsr The value must be an even number between 2 and 255. + * @retval None. + */ +static inline void DCL_SPI_SetFreqCpsdvsr(SPI_RegStruct *spix, unsigned char freqCpsdvsr) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + SPI_PARAM_CHECK_NO_RET(IsSpiFreqCpsdvsr(freqCpsdvsr)); + spix->SPICPSR.BIT.cpsdvsr = freqCpsdvsr; +} + +/** + * @brief Get SPI clock divider setting. + * @param spix SPI register base address. + * @retval The value is an even number between 2 and 255. + */ +static inline unsigned char DCL_SPI_GetFreqCpsdvsr(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPICPSR.BIT.cpsdvsr; +} + +/** + * @brief Configuring the SPI TX threshold. + * @param spix SPI register base address. + * @param txIntSize The value can be 0-15. For details, see the register manual. + * @retval None. + */ +static inline void DCL_SPI_SetTxIntSize(SPI_RegStruct *spix, unsigned int txIntSize) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + SPI_PARAM_CHECK_NO_RET(IsSpiTxIntSize(txIntSize)); + spix->SPITXFIFOCR.BIT.txintsize = txIntSize; +} + +/** + * @brief Get the SPI TX threshold configuring. + * @param spix SPI register base address. + * @retval The value is 0-15. For details, see the register manual. + */ +static inline unsigned char DCL_SPI_GetTxIntSize(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPITXFIFOCR.BIT.txintsize; +} + +/** + * @brief Configuring the SPI RX threshold. + * @param spix SPI register base address. + * @param rxIntSize The value can be 0-15. For details, see the register manual. + * @retval None. + */ +static inline void DCL_SPI_SetRxIntSize(SPI_RegStruct *spix, unsigned int rxIntSize) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + SPI_PARAM_CHECK_NO_RET(IsSpiRxIntSize(rxIntSize)); + spix->SPIRXFIFOCR.BIT.rxintsize = rxIntSize; +} + +/** + * @brief Get the SPI RX threshold configuring. + * @param spix SPI register base address. + * @retval The value is 0-15. For details, see the register manual. + */ +static inline unsigned char DCL_SPI_GetRxIntSize(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPIRXFIFOCR.BIT.rxintsize; +} + +/** + * @brief Configuring the CS Channel. + * @param spix SPI register base address. + * @param channel SPI chip select channel. + * @retval None. + */ +static inline void DCL_SPI_SetChipSelect(SPI_RegStruct *spix, unsigned int channel) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + SPI_PARAM_CHECK_NO_RET(IsSpiChipSelectChannel(channel)); + spix->SPICSNCR.BIT.spi_csn_sel = channel; +} + +/** + * @brief Obtains the channel of the current CS. + * @param spix SPI register base address. + * @retval SPI_ChipSelectChannel. + */ +static inline unsigned char DCL_SPI_GetChipSelect(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPICSNCR.BIT.spi_csn_sel; +} + +/** + * @brief SPI CHIP CONFIG SET. + * @param spix SPI register base address. + * @param mode The value can be 0-4. For details, see the register manual. + * @retval None. + */ +static inline void DCL_SPI_SetChipConfigSelect(SPI_RegStruct *spix, HAL_SPI_CHIP_CONFIG mode) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + SPI_PARAM_CHECK_NO_RET(IsSpiChipConfigMode(mode)); + spix->SPICSNCR.BIT.spi_csn_mode = mode; +} + +/** + * @brief SPI CHIP CONFIG GET. + * @param spix SPI register base address. + * @retval HAL_SPI_CHIP_CONFIG. + */ +static inline HAL_SPI_CHIP_CONFIG DCL_SPI_GetChipConfigSelect(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPICSNCR.BIT.spi_csn_mode; +} + +/** + * @brief Setting the Master/Slave Mode. + * @param spix SPI register base address. + * @param mode @ref HAL_SPI_Mode. + * @retval None. + */ +static inline void DCL_SPI_SetMasterSlaveMode(SPI_RegStruct *spix, HAL_SPI_Mode mode) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + SPI_PARAM_CHECK_NO_RET(IsSpiMode(mode)); + spix->SPICR1.BIT.ms = mode; +} + +/** + * @brief Getting the Master/Slave Mode. + * @param spix SPI register base address. + * @retval HAL_SPI_Mode master or slave. + */ +static inline HAL_SPI_Mode DCL_SPI_GetMasterSlaveMode(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPICR1.BIT.ms; +} + +/** + * @brief Set microwire waitval. + * @param spix SPI register base address. + * @param value is microwire wait beats. + * @retval None. + */ +static inline void DCL_SPI_SetMircoWaitVal(SPI_RegStruct *spix, unsigned char value) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + SPI_PARAM_CHECK_NO_RET(IsSpiWaitVal(value)); + spix->SPICR1.BIT.waitval = value; +} + +/** + * @brief Get microwire waitval. + * @param spix SPI register base address. + * @retval unsigned char, For details, see the register manual + */ +static inline unsigned char DCL_SPI_GetMircoWaitVal(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPICR1.BIT.waitval; +} + +/** + * @brief Set microwire wait enable or disable. + * @param spix SPI register base address. + * @param waitEn is microwire wait enable or disable. + * @retval None. + */ +static inline void DCL_SPI_SetMircoWaitEn(SPI_RegStruct *spix, bool waitEn) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + spix->SPICR1.BIT.waiten = waitEn; +} + +/** + * @brief Get microwire wait enable or disable. + * @param spix SPI register base address. + * @retval bool is microwire wait enable or disable + */ +static inline bool DCL_SPI_GetMircoWaitEn(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPICR1.BIT.waiten; +} + +/** + * @brief Put the data into the TX FIFO. + * @param spix SPI register base address. + * @param data is input data. + * @retval None. + */ +static inline void DCL_SPI_SetData(SPI_RegStruct *spix, unsigned short data) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + spix->SPIDR.reg = data; +} + +/** + * @brief Get data from the RX FIFO. + * @param spix SPI register base address. + * @retval unsigned short data from the RX FIFO. + */ +static inline unsigned short DCL_SPI_GetData(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPIDR.reg; +} + +/** + * @brief Get whether the TX FIFO is empty. + * @param spix SPI register base address. + * @retval bool TX FIFO is not empty or is empty. + */ +static inline bool DCL_SPI_GetTxFifoEmpty(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPISR.BIT.tfe; +} + +/** + * @brief Get whether the TX FIFO is full. + * @param spix SPI register base address. + * @retval bool TX FIFO is not full or is full. + */ +static inline bool DCL_SPI_GetTxFifoFull(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPISR.BIT.tnf; +} + +/** + * @brief Get whether the RX FIFO is empty. + * @param spix SPI register base address. + * @retval bool RX FIFO is not empty or is empty. + */ +static inline bool DCL_SPI_GetRxFifoEmpty(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPISR.BIT.rne; +} + +/** + * @brief Get whether the RX FIFO is full. + * @param spix SPI register base address. + * @retval bool RX FIFO is not full or is full. + */ +static inline bool DCL_SPI_GetRxFifoFull(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPISR.BIT.rff; +} + +/** + * @brief Get Whether the SPI is busy. + * @param spix SPI register base address. + * @retval bool SPI is busy or not busy. + */ +static inline bool DCL_SPI_GetBusyFlag(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPISR.BIT.bsy; +} + +/** + * @brief Set the interrupt mask. + * @param spix SPI register base address. + * @param intMask For details, see the register manual. + * @retval None. + */ +static inline void DCL_SPI_SetIntMask(SPI_RegStruct *spix, unsigned int intMask) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + spix->SPIIMSC.reg = intMask; +} + +/** + * @brief Get the interrupt mask. + * @param spix SPI register base address. + * @retval unsigned int interrupt mask. + */ +static inline unsigned int DCL_SPI_GetIntMask(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPIIMSC.reg; +} + +/** + * @brief Get SPIMIS register all mask interrupt status. + * @param spix SPI register base address. + * @retval unsigned short SPIMIS register interrupt mask. + */ +static inline unsigned int DCL_SPI_GetMisInt(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPIMIS.reg; +} + +/** + * @brief Clear RX timeout interrupt + * @param spix SPI register base address. + * @retval None. + */ +static inline void DCL_SPI_ClearRxTimeInt(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + spix->SPIICR.BIT.roric = BASE_CFG_SET; +} + +/** + * @brief Clear RX overflow interrupt + * @param spix SPI register base address. + * @retval None. + */ +static inline void DCL_SPI_ClearRxOverInt(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + spix->SPIICR.BIT.rtic = BASE_CFG_SET; +} + +/** + * @brief Set DMA FIFO enable register. + * @param spix SPI register base address. + * @param dmaCtl control DMA FIFO enable. + * @retval None. + */ +static inline void DCL_SPI_SetDmaTxFifo(SPI_RegStruct *spix, unsigned int dmaCtl) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + spix->SPIDMACR.reg = dmaCtl; +} + +/** + * @brief Get DMA FIFO enable register status. + * @param spix SPI register base address. + * @retval unsigned int DMA Control Register Status. + */ +static inline unsigned int DCL_SPI_GetDmaTxFifo(SPI_RegStruct *spix) +{ + SPI_ASSERT_PARAM(IsSPIInstance(spix)); + return spix->SPIDMACR.reg; +} + +/** + * @} + */ + +/** + * @} + */ +#endif /* #ifndef McuMagicTag_SPI_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/spi/src/spi.c b/vendor/others/demo/5-tim_adc/demo/drivers/spi/src/spi.c new file mode 100644 index 000000000..59a37f14a --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/spi/src/spi.c @@ -0,0 +1,1171 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file spi.c + * @author MCU Driver Team + * @brief SPI module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the SPI. + * + Initialization and de-initialization functions + * + Peripheral Control functions + */ + +/* Includes ------------------------------------------------------------------*/ +#include "interrupt.h" +#include "systick.h" +#include "spi.h" +/* Macro definitions ---------------------------------------------------------*/ +#define SPI_WAIT_TIMEOUT 0x400 + +#define SPI_DATA_WIDTH_SHIFT_8BIT 1 +#define SPI_DATA_WIDTH_SHIFT_16BIT 2 +#define SPI_WRITE_FIFO_SIZE 2 + +#define SPI_INTERRUPT_SET_ALL 0xF +#define SPI_DMA_FIFO_ENABLE 0x3 + +#define SPI_TICK_MS_DIV 1000 +/** + * @brief Check all initial configuration parameters. + * @param handle SPI handle. + * @retval BASE status type: OK, ERROR. + */ +static BASE_StatusType CheckAllInitParameters(SPI_Handle *handle) +{ + SPI_PARAM_CHECK_WITH_RET(IsSpiMode(handle->mode), BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(IsSpiXferMode(handle->xFerMode), BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(IsSpiEndian(handle->endian), BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(IsSpiFrameFormat(handle->frameFormat), BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(IsSpiDataWidth(handle->dataWidth), BASE_STATUS_ERROR); + /* Check spi freqCpsdvsr */ + if (handle->mode == HAL_SPI_MASTER) { + SPI_PARAM_CHECK_WITH_RET(IsSpiFreqCpsdvsr(handle->freqCpsdvsr), BASE_STATUS_ERROR); + } + /* Check motorola clkPolarity and clkPhase */ + if (handle->frameFormat == HAL_SPI_MODE_MOTOROLA) { + SPI_PARAM_CHECK_WITH_RET(IsSpiClkPolarity(handle->clkPolarity), BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(IsSpiClkPhase(handle->clkPhase), BASE_STATUS_ERROR); + } + /* Check microwire waitVal */ + if (handle->frameFormat == HAL_SPI_MODE_MICROWIRE) { + SPI_PARAM_CHECK_WITH_RET(IsSpiWaitVal(handle->waitVal), BASE_STATUS_ERROR); + } + /* Check tx rx interrupt size */ + if (handle->xFerMode == HAL_XFER_MODE_INTERRUPTS) { + SPI_PARAM_CHECK_WITH_RET(IsSpiTxIntSize(handle->txIntSize), BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(IsSpiRxIntSize(handle->rxIntSize), BASE_STATUS_ERROR); + } + /* Check tx rx dma burst size */ + if (handle->xFerMode == HAL_XFER_MODE_DMA) { + SPI_PARAM_CHECK_WITH_RET(IsSpiTxDmaBurstSize(handle->txDMABurstSize), BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(IsSpiRxDmaBurstSize(handle->rxDMABurstSize), BASE_STATUS_ERROR); + } + return BASE_STATUS_OK; +} + +/** + * @brief Configuring the Register Parameters of the Three Transfer Modes. + * @param handle SPI handle. + * @retval BASE status type: OK, ERROR. + */ +static BASE_StatusType ConfigThreeTransferParam(SPI_Handle *handle) +{ + SPI_ASSERT_PARAM(handle != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + /* Configurations related to the three transmission modes */ + if (handle->xFerMode == HAL_XFER_MODE_BLOCKING) { + handle->baseAddress->SPIIMSC.reg = 0x0; + } else if (handle->xFerMode == HAL_XFER_MODE_INTERRUPTS) { + handle->baseAddress->SPIIMSC.reg = SPI_INTERRUPT_SET_ALL; + /* Setting the rx and tx interrupt transfer size */ + handle->baseAddress->SPITXFIFOCR.BIT.txintsize = handle->txIntSize; + handle->baseAddress->SPIRXFIFOCR.BIT.rxintsize = handle->rxIntSize; + } else if (handle->xFerMode == HAL_XFER_MODE_DMA) { + handle->baseAddress->SPIIMSC.reg = 0x0; + /* Setting the DMA rx and tx burst transfer size */ + handle->baseAddress->SPITXFIFOCR.BIT.txintsize = handle->txDMABurstSize; + handle->baseAddress->SPIRXFIFOCR.BIT.rxintsize = handle->rxDMABurstSize; + } else { + /* xFerMode set error */ + handle->errorCode = BASE_STATUS_ERROR; + handle->state = HAL_SPI_STATE_RESET; + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief Internal chip select control. + * @param handle SPI handle. + * @param control SPI_CHIP_DESELECT or SPI_CHIP_SELECT + * @retval None. + */ +static void InternalCsControl(SPI_Handle *handle, unsigned int control) +{ + BASE_FUNC_UNUSED(handle); + BASE_FUNC_UNUSED(control); +} + +/** + * @brief Chip select control. + * @param handle SPI handle. + * @param control SPI_CHIP_DESELECT or SPI_CHIP_SELECT + * @retval None. + */ +static void SpiCsControl(SPI_Handle *handle, unsigned int control) +{ + /* The chip select signal is determined by the chip logic. */ + if (handle->csMode == SPI_CHIP_SELECT_MODE_INTERNAL) { + InternalCsControl(handle, control); + } else { + /* The chip select signal is determined by callback */ + if (handle->userCallBack.CsCtrlCallback != NULL) { + handle->csCtrl = control; + handle->userCallBack.CsCtrlCallback(handle); + } + } +} + +/** + * @brief Invoke rx tx callback function. + * @param handle SPI handle. + * @retval None. + */ +static void SpiRxTxCallack(void *handle) +{ + SPI_Handle *spiHandle = (SPI_Handle *) handle; + SPI_ASSERT_PARAM(spiHandle != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(spiHandle->baseAddress)); + if (spiHandle->txCount == spiHandle->transferSize) { + /* Invoke tx callback function. */ + if (spiHandle->userCallBack.TxCpltCallback != NULL) { + spiHandle->userCallBack.TxCpltCallback(spiHandle); + } + spiHandle->baseAddress->SPIIMSC.BIT.txim = 0x0; + } + + if (spiHandle->rxCount >= spiHandle->transferSize) { + /* Disable all interrupt */ + spiHandle->baseAddress->SPIIMSC.reg = 0x0; + /* Clear all interrupt */ + spiHandle->baseAddress->SPIICR.BIT.roric = BASE_CFG_SET; + spiHandle->baseAddress->SPIICR.BIT.rtic = BASE_CFG_SET; + + SpiCsControl(spiHandle, SPI_CHIP_DESELECT); + + /* Invoke rx callback function. */ + if (spiHandle->userCallBack.RxCpltCallback != NULL) { + spiHandle->userCallBack.RxCpltCallback(spiHandle); + } + /* Invoke tx rx callback function. */ + if (spiHandle->userCallBack.TxRxCpltCallback != NULL) { + spiHandle->userCallBack.TxRxCpltCallback(spiHandle); + } + spiHandle->state = HAL_SPI_STATE_READY; + } +} + +/** + * @brief Writes data from the buffer to the FIFO. + * @param handle SPI handle. + * @retval None. + */ +static void WriteData(SPI_Handle *handle) +{ + unsigned int size = 0; + while ((size < SPI_WRITE_FIFO_SIZE) && (handle->baseAddress->SPISR.BIT.tnf) && + (handle->transferSize > handle->txCount)) { + if (handle->dataWidth > SPI_DATA_WIDTH_8BIT) { + /* Only data needs to be read. Due to SPI characteristics, + data must be transmitted before data can be read. Therefore, 0x0 is transmitted. */ + if (handle->txBuff == NULL) { + handle->baseAddress->SPIDR.reg = 0x0; + handle->txCount += SPI_DATA_WIDTH_SHIFT_16BIT; + } else { + handle->baseAddress->SPIDR.reg = *(unsigned short *)handle->txBuff; + handle->txCount += SPI_DATA_WIDTH_SHIFT_16BIT; /* txCount is number of bytes transferred */ + handle->txBuff += SPI_DATA_WIDTH_SHIFT_16BIT; + } + } else { /* datawidth is 8bit */ + if (handle->txBuff == NULL) { + handle->baseAddress->SPIDR.reg = 0x0; + handle->txCount += SPI_DATA_WIDTH_SHIFT_8BIT; + } else { + handle->baseAddress->SPIDR.reg = *(unsigned char *)handle->txBuff; + handle->txCount += SPI_DATA_WIDTH_SHIFT_8BIT; /* txCount is number of bytes transferred */ + handle->txBuff += SPI_DATA_WIDTH_SHIFT_8BIT; + } + } + size++; + } +} + +/** + * @brief Reads data from the FIFO to the buffer. + * @param handle SPI handle. + * @retval None. + */ +static void ReadData(SPI_Handle *handle) +{ + unsigned short val; + + while ((handle->baseAddress->SPISR.BIT.rne) && (handle->transferSize > handle->rxCount)) { + if (handle->dataWidth > SPI_DATA_WIDTH_8BIT) { + /* When only data is transmitted, the data in the RX FIFO needs to be read. */ + if (handle->rxBuff == NULL) { + val = handle->baseAddress->SPIDR.reg; + BASE_FUNC_UNUSED(val); + handle->rxCount += SPI_DATA_WIDTH_SHIFT_16BIT; + } else { + *(unsigned short *)handle->rxBuff = handle->baseAddress->SPIDR.reg; + handle->rxCount += SPI_DATA_WIDTH_SHIFT_16BIT; + handle->rxBuff += SPI_DATA_WIDTH_SHIFT_16BIT; + } + } else { /* datawidth is 8bit */ + if (handle->rxBuff == NULL) { + val = handle->baseAddress->SPIDR.reg; + BASE_FUNC_UNUSED(val); + handle->rxCount += SPI_DATA_WIDTH_SHIFT_8BIT; + } else { + *(unsigned char *)handle->rxBuff = handle->baseAddress->SPIDR.reg & 0xff; + handle->rxCount += SPI_DATA_WIDTH_SHIFT_8BIT; + handle->rxBuff += SPI_DATA_WIDTH_SHIFT_8BIT; + } + } + } +} + +/** + * @brief Read/write based on input parameters. + * The Motorola SPI/TI synchronous serial interface is full-duplex. + * Each data is received. Even if only data needs to be transmitted, + * the RX FIFO needs to be cleared. + * @param handle SPI handle. + * @retval None. + */ +static void ReadWriteData(SPI_Handle *handle) +{ + unsigned int preTick = DCL_SYSTICK_GetTick(); + unsigned int curTick = preTick; + unsigned long long delta = 0; + /* Calculate the timeout tick. */ + unsigned long long targetDelta = HAL_CRG_GetIpFreq(SYSTICK_BASE) / SPI_TICK_MS_DIV * SPI_WAIT_TIMEOUT; + WriteData(handle); + while (true) { + /* Wait for the write operation to complete */ + if (handle->baseAddress->SPISR.BIT.bsy == BASE_CFG_UNSET && + handle->baseAddress->SPISR.BIT.tfe == BASE_CFG_SET && + handle->baseAddress->SPISR.BIT.rne == BASE_CFG_SET) { + break; + } + curTick = DCL_SYSTICK_GetTick(); + delta += curTick > preTick ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick; + /* Exit upon timeout */ + if (delta >= targetDelta) { + handle->errorCode = BASE_STATUS_TIMEOUT; + break; + } + preTick = curTick; + } + ReadData(handle); +} + +/** + * @brief Reads and writes data based on the interrupt flag. + * @param handle SPI handle. + * @retval None. + */ +static void ReadWriteInt(SPI_Handle *handle) +{ + /* 0x02 Receive timeout interrupt, 0x04 receive FIFO interrupt */ + if ((handle->mode == HAL_SPI_SLAVE) && + ((handle->baseAddress->SPIMIS.reg == 0x04) || + (handle->baseAddress->SPIMIS.reg == 0x02))) { + ReadData(handle); + } else { /* master mode */ + if (handle->baseAddress->SPIMIS.BIT.rxmis || handle->baseAddress->SPIMIS.BIT.rtmis) { + ReadData(handle); + } + if (handle->baseAddress->SPIMIS.BIT.txmis) { + WriteData(handle); + } + } +} + +/** + * @brief Blocking read data processing. + * @param handle SPI handle. + * @param timeout Timeout period,unit: ms. + * @retval None. + */ +static void ReadBlocking(SPI_Handle *handle, unsigned int timeout) +{ + unsigned int preTick = DCL_SYSTICK_GetTick(); + unsigned int curTick = preTick; + unsigned long long delta = 0; + unsigned long long targetDelta = HAL_CRG_GetIpFreq(SYSTICK_BASE) / SPI_TICK_MS_DIV * timeout; + + /* Pull down the CS before transmitting data. */ + SpiCsControl(handle, SPI_CHIP_SELECT); + if (!handle->baseAddress->SPICR1.BIT.sse) { + handle->baseAddress->SPICR1.BIT.sse = BASE_CFG_SET; /* spi enable */ + } + while (handle->transferSize > handle->rxCount) { + curTick = DCL_SYSTICK_GetTick(); + delta += curTick > preTick ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick; + if (delta >= targetDelta) { /* The configured timeout period is exceeded. */ + handle->errorCode = BASE_STATUS_TIMEOUT; + break; + } + ReadData(handle); + preTick = curTick; + } + /* Pull up the CS after transmitting data. */ + SpiCsControl(handle, SPI_CHIP_DESELECT); + handle->state = HAL_SPI_STATE_READY; +} + +/** + * @brief Blocking read/write data processing. + * @param handle SPI handle. + * @param timeout Timeout period,unit: ms. + * @retval None. + */ +static void ReadWriteBlocking(SPI_Handle *handle, unsigned int timeout) +{ + unsigned int preTick = DCL_SYSTICK_GetTick(); + unsigned int curTick = preTick; + unsigned long long delta = 0; + unsigned long long targetDelta = HAL_CRG_GetIpFreq(SYSTICK_BASE) / SPI_TICK_MS_DIV * timeout; + /* Pull down the CS before transmitting data. */ + SpiCsControl(handle, SPI_CHIP_SELECT); + if (!handle->baseAddress->SPICR1.BIT.sse) { + handle->baseAddress->SPICR1.BIT.sse = BASE_CFG_SET; /* spi enable */ + } + + while (handle->transferSize > handle->txCount || handle->transferSize > handle->rxCount) { + curTick = DCL_SYSTICK_GetTick(); + delta += curTick > preTick ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick; + if (delta >= targetDelta) { /* The configured timeout period is exceeded. */ + handle->errorCode = BASE_STATUS_TIMEOUT; + break; + } + ReadWriteData(handle); + preTick = curTick; + } + /* Pull up the CS after transmitting data. */ + SpiCsControl(handle, SPI_CHIP_DESELECT); + handle->state = HAL_SPI_STATE_READY; +} + +/** + * @brief SPI read/write parameter configuration. + * @param handle SPI handle. + * @param rData Address of the data buff to be Receiving. + * @param wData Address of the data buff to be sent. + * @param dataSiz Number of the data to be Receivingd and sent. + * @retval None. + */ +static void ConfigTransmissionParameter(SPI_Handle *handle, + unsigned char *rData, + unsigned char *wData, + unsigned int dataSize) +{ + handle->errorCode = BASE_STATUS_OK; + handle->rxBuff = rData; + handle->txBuff = wData; + if (handle->dataWidth > SPI_DATA_WIDTH_8BIT && + handle->xFerMode == HAL_XFER_MODE_DMA) { + handle->transferSize = dataSize / 2; /* Processes 2 bytes at a time */ + } else { + handle->transferSize = dataSize; + } + handle->txCount = 0; + handle->rxCount = 0; +} + +/** + * @brief SPI Clear Rx Fifo. + * @param handle SPI handle. + * @retval None. + */ +static void ClearSpiRxFifo(SPI_Handle *handle) +{ + /* Invalid data in the RX FIFO, Clearing the RX FIFO. */ + unsigned short val; + while (handle->baseAddress->SPISR.BIT.rne) { + val = handle->baseAddress->SPIDR.reg; + BASE_FUNC_UNUSED(val); + } +} + +/** + * @brief Initializing the SPI Module. + * @param handle SPI handle. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_SPI_Init(SPI_Handle *handle) +{ + unsigned int cr0Reg; + unsigned int temp; + unsigned char frCps; + SPI_ASSERT_PARAM(handle != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + /* Check whether initialization parameters are correctly set */ + if (CheckAllInitParameters(handle) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + + handle->state = HAL_SPI_STATE_BUSY; + + handle->baseAddress->SPICR1.BIT.lbm = BASE_CFG_UNSET; + handle->baseAddress->SPICR1.BIT.sse = BASE_CFG_UNSET; + handle->baseAddress->SPICR1.BIT.bitend = handle->endian; /* Setting the endian mode */ + handle->baseAddress->SPICR1.BIT.ms = handle->mode; + + temp = ((unsigned int)handle->freqScr) << SPI_CR0_SCR_POS; + cr0Reg = (handle->baseAddress->SPICR0.reg & (~SPI_CR0_SCR_MASK)) | temp; + handle->baseAddress->SPICR0.reg = cr0Reg; + + if (handle->mode == HAL_SPI_MASTER) { + frCps = handle->freqCpsdvsr; + /* Modulo 2 to get an even number */ + handle->baseAddress->SPICPSR.BIT.cpsdvsr = ((frCps % 2) == 0 ? frCps : frCps - 1); + } + if (handle->frameFormat == HAL_SPI_MODE_MOTOROLA) { + handle->baseAddress->SPICR0.BIT.sph = handle->clkPhase; + handle->baseAddress->SPICR0.BIT.spo = handle->clkPolarity; + } + + handle->baseAddress->SPICR0.BIT.frf = handle->frameFormat; + handle->baseAddress->SPICR0.BIT.dss = handle->dataWidth; + + /* Indicates whether to enable the Microwire wait period. */ + if ((handle->frameFormat == HAL_SPI_MODE_MICROWIRE) && (handle->waitEn == BASE_CFG_ENABLE)) { + handle->baseAddress->SPICR1.BIT.waitval = handle->waitVal; + handle->baseAddress->SPICR1.BIT.waiten = BASE_CFG_SET; + } else { + handle->baseAddress->SPICR1.BIT.waiten = BASE_CFG_UNSET; + } + + if (ConfigThreeTransferParam(handle) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + handle->state = HAL_SPI_STATE_READY; + return BASE_STATUS_OK; +} + +/** + * @brief Deinitialize the SPI module. + * @param handle SPI handle. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_SPI_Deinit(SPI_Handle *handle) +{ + SPI_ASSERT_PARAM(handle != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + + handle->state = HAL_SPI_STATE_BUSY; + + /* Disable rx and tx DMA, SPI disable */ + handle->baseAddress->SPIIMSC.reg = 0x0; + handle->baseAddress->SPIDMACR.BIT.rxdmae = BASE_CFG_UNSET; + handle->baseAddress->SPIDMACR.BIT.txdmae = BASE_CFG_UNSET; + handle->baseAddress->SPICR1.BIT.sse = BASE_CFG_UNSET; + handle->state = HAL_SPI_STATE_RESET; + /* Clean callback */ + handle->userCallBack.TxCpltCallback = NULL; + handle->userCallBack.RxCpltCallback = NULL; + handle->userCallBack.TxRxCpltCallback = NULL; + handle->userCallBack.ErrorCallback = NULL; + handle->userCallBack.CsCtrlCallback = NULL; + return BASE_STATUS_OK; +} + +/** + * @brief SPI Parameter Configuration. + * @param handle SPI handle. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_SPI_ConfigParameter(SPI_Handle *handle) +{ + unsigned int cr0Reg; + unsigned int temp; + unsigned char frCps; + SPI_ASSERT_PARAM(handle != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + if (CheckAllInitParameters(handle) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + + handle->baseAddress->SPICR1.BIT.sse = BASE_CFG_UNSET; + handle->baseAddress->SPICR1.BIT.ms = handle->mode; + handle->baseAddress->SPICR0.BIT.frf = handle->frameFormat; + handle->baseAddress->SPICR0.BIT.dss = handle->dataWidth; + handle->baseAddress->SPICR1.BIT.bitend = handle->endian; + /* Set freqScr */ + temp = ((unsigned int)handle->freqScr) << SPI_CR0_SCR_POS; + cr0Reg = (handle->baseAddress->SPICR0.reg & (~SPI_CR0_SCR_MASK)) | temp; + handle->baseAddress->SPICR0.reg = cr0Reg; + + if (handle->mode == HAL_SPI_MASTER) { + frCps = handle->freqCpsdvsr; + /* Modulo 2 to get an even number */ + handle->baseAddress->SPICPSR.BIT.cpsdvsr = ((frCps % 2) == 0 ? frCps : frCps - 1); + } + if (handle->frameFormat == HAL_SPI_MODE_MOTOROLA) { + handle->baseAddress->SPICR0.BIT.sph = handle->clkPhase; + handle->baseAddress->SPICR0.BIT.spo = handle->clkPolarity; + } + + if (handle->frameFormat == HAL_SPI_MODE_MICROWIRE) { + handle->baseAddress->SPICR1.BIT.waitval = handle->waitVal; + } + + /* Setting the Interrupt Thresholds */ + if (handle->xFerMode == HAL_XFER_MODE_INTERRUPTS) { + handle->baseAddress->SPITXFIFOCR.BIT.txintsize = handle->txIntSize; + handle->baseAddress->SPIRXFIFOCR.BIT.rxintsize = handle->rxIntSize; + } else if (handle->xFerMode == HAL_XFER_MODE_DMA) { + handle->baseAddress->SPITXFIFOCR.BIT.txintsize = handle->txDMABurstSize; + handle->baseAddress->SPIRXFIFOCR.BIT.rxintsize = handle->rxDMABurstSize; + } else { + ; + } + + return BASE_STATUS_OK; +} + +/** + * @brief Callback Function Registration. + * @param handle SPI handle. + * @param callbackID Callback function ID.. + * @param pcallback Pointer to the address of the registered callback function. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_SPI_RegisterCallback(SPI_Handle *handle, + HAL_SPI_CallbackID callbackID, + SPI_CallbackFuncType pcallback) +{ + BASE_StatusType ret = BASE_STATUS_OK; + SPI_ASSERT_PARAM(handle != NULL && pcallback != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + + if (handle->state == HAL_SPI_STATE_READY) { + switch (callbackID) { + case SPI_TX_COMPLETE_CB_ID : + handle->userCallBack.TxCpltCallback = pcallback; + break; + case SPI_RX_COMPLETE_CB_ID : + handle->userCallBack.RxCpltCallback = pcallback; + break; + case SPI_TX_RX_COMPLETE_CB_ID : + handle->userCallBack.TxRxCpltCallback = pcallback; + break; + case SPI_ERROR_CB_ID : + handle->userCallBack.ErrorCallback = pcallback; + break; + case SPI_CS_CB_ID: + handle->userCallBack.CsCtrlCallback = pcallback; + break; + default : + handle->errorCode = BASE_STATUS_ERROR; + ret = BASE_STATUS_ERROR; + break; + } + } else { + handle->errorCode = BASE_STATUS_ERROR; + ret = BASE_STATUS_ERROR; + } + return ret; +} + +/** + * @brief Receiving data in blocking mode. + * @param handle SPI handle. + * @param rData Address of the data buff to be Receiving. + * @param dataSize Number of the data to be Receiving. + * @param timeout Timeout period,unit: ms. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_SPI_ReadBlocking(SPI_Handle *handle, + unsigned char *rData, + unsigned int dataSize, + unsigned int timeout) +{ + SPI_ASSERT_PARAM(handle != NULL && rData != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + SPI_PARAM_CHECK_WITH_RET(handle->state == HAL_SPI_STATE_READY, BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + + handle->state = HAL_SPI_STATE_BUSY_RX; + /* Configuring SPI transmission parameters */ + ConfigTransmissionParameter(handle, rData, NULL, dataSize); + ClearSpiRxFifo(handle); /* If there is residual data in the read FIFO, clear the data. */ + if (handle->mode == HAL_SPI_MASTER) { + ReadWriteBlocking(handle, timeout); + } else { + ReadBlocking(handle, timeout); + } + + if (handle->errorCode != BASE_STATUS_OK) { + if (handle->userCallBack.ErrorCallback != NULL) { + handle->userCallBack.ErrorCallback(handle); + } + return handle->errorCode; + } + if (handle->userCallBack.RxCpltCallback != NULL) { + handle->userCallBack.RxCpltCallback(handle); + } + return BASE_STATUS_OK; +} + +/** + * @brief Send data in blocking mode. + * @param handle SPI handle. + * @param wData Address of the data buff to be sent. + * @param dataSize Number of the data to be sent. + * @param timeout Timeout period,unit: ms. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_SPI_WriteBlocking(SPI_Handle *handle, + unsigned char *wData, + unsigned int dataSize, + unsigned int timeout) +{ + SPI_ASSERT_PARAM(handle != NULL && wData != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + + SPI_PARAM_CHECK_WITH_RET(handle->state == HAL_SPI_STATE_READY, BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + + handle->state = HAL_SPI_STATE_BUSY_TX; + /* Configuring SPI transmission parameters */ + ConfigTransmissionParameter(handle, NULL, wData, dataSize); + ClearSpiRxFifo(handle); /* If there is residual data in the read FIFO, clear the data. */ + ReadWriteBlocking(handle, timeout); + if (handle->errorCode != BASE_STATUS_OK) { + if (handle->userCallBack.ErrorCallback != NULL) { + handle->userCallBack.ErrorCallback(handle); + } + return handle->errorCode; + } + if (handle->userCallBack.TxCpltCallback != NULL) { + handle->userCallBack.TxCpltCallback(handle); + } + return BASE_STATUS_OK; +} + +/** + * @brief Receiving and send data in blocking mode. + * @param handle SPI handle. + * @param rData Address of the data buff to be Receiving. + * @param wData Address of the data buff to be sent. + * @param dataSize Number of the data to be Receivingd and sent. + * @param timeout Timeout period,unit: ms. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_SPI_WriteReadBlocking(SPI_Handle *handle, + unsigned char *rData, + unsigned char *wData, + unsigned int dataSize, + unsigned int timeout) +{ + SPI_ASSERT_PARAM(handle != NULL && rData != NULL && wData != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + + SPI_PARAM_CHECK_WITH_RET(handle->state == HAL_SPI_STATE_READY, BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + + handle->state = HAL_SPI_STATE_BUSY_TX_RX; + /* Configuring SPI transmission parameters */ + ConfigTransmissionParameter(handle, rData, wData, dataSize); + ClearSpiRxFifo(handle); /* If there is residual data in the read FIFO, clear the data. */ + ReadWriteBlocking(handle, timeout); + if (handle->errorCode != BASE_STATUS_OK) { + if (handle->userCallBack.ErrorCallback != NULL) { + handle->userCallBack.ErrorCallback(handle); + } + return handle->errorCode; + } + if (handle->userCallBack.TxRxCpltCallback != NULL) { + handle->userCallBack.TxRxCpltCallback(handle); + } + return BASE_STATUS_OK; +} + +/** + * @brief Receiving data in interrupts mode. + * @param handle SPI handle. + * @param rData Address of the data buff to be Receiving. + * @param dataSize Number of the data to be Receiving. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_SPI_ReadIT(SPI_Handle *handle, unsigned char *rData, unsigned int dataSize) +{ + SPI_ASSERT_PARAM(handle != NULL && rData != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + + SPI_PARAM_CHECK_WITH_RET(handle->state == HAL_SPI_STATE_READY, BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + + handle->state = HAL_SPI_STATE_BUSY_RX; + ConfigTransmissionParameter(handle, rData, NULL, dataSize); + ClearSpiRxFifo(handle); /* If there is residual data in the read FIFO, clear the data. */ + SpiCsControl(handle, SPI_CHIP_SELECT); + if (!handle->baseAddress->SPICR1.BIT.sse) { + handle->baseAddress->SPICR1.BIT.sse = BASE_CFG_SET; + } + /* Enable related interrupts. */ + if (handle->mode == HAL_SPI_MASTER) { + /* 0x0F indicate enables all interrupt. */ + handle->baseAddress->SPIIMSC.reg = 0x0F; + } else { + /* 0x07 indicate enables the RX FIFO, RX timeout, and RX overflow interrupt. */ + handle->baseAddress->SPIIMSC.reg = 0x07; + } + return BASE_STATUS_OK; +} + +/** + * @brief Send data in interrupts mode. + * @param handle SPI handle. + * @param wData Address of the data buff to be sent. + * @param dataSize Number of the data to be sent. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_SPI_WriteIT(SPI_Handle *handle, unsigned char *wData, unsigned int dataSize) +{ + SPI_ASSERT_PARAM(handle != NULL && wData != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + + SPI_PARAM_CHECK_WITH_RET(handle->state == HAL_SPI_STATE_READY, BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + + handle->state = HAL_SPI_STATE_BUSY_TX; + ConfigTransmissionParameter(handle, NULL, wData, dataSize); + ClearSpiRxFifo(handle); /* If there is residual data in the read FIFO, clear the data. */ + /* interrupt enable */ + SpiCsControl(handle, SPI_CHIP_SELECT); + if (!handle->baseAddress->SPICR1.BIT.sse) { + handle->baseAddress->SPICR1.BIT.sse = BASE_CFG_SET; + } + /* 0x0F indicate enables all interrupt. */ + handle->baseAddress->SPIIMSC.reg = 0x0F; + + return BASE_STATUS_OK; +} + +/** + * @brief Receiving and send data in interrupts mode. + * @param handle SPI handle. + * @param rData Address of the data buff to be Receiving. + * @param wData Address of the data buff to be sent. + * @param dataSize Number of the data to be Receiving and sent. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_SPI_WriteReadIT(SPI_Handle *handle, + unsigned char *rData, + unsigned char *wData, + unsigned int dataSize) +{ + SPI_ASSERT_PARAM(handle != NULL && rData != NULL && wData != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + + SPI_PARAM_CHECK_WITH_RET(handle->state == HAL_SPI_STATE_READY, BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + + handle->state = HAL_SPI_STATE_BUSY_TX_RX; + ConfigTransmissionParameter(handle, rData, wData, dataSize); + ClearSpiRxFifo(handle); /* If there is residual data in the read FIFO, clear the data. */ + SpiCsControl(handle, SPI_CHIP_SELECT); + if (!handle->baseAddress->SPICR1.BIT.sse) { + handle->baseAddress->SPICR1.BIT.sse = BASE_CFG_SET; + } + /* 0x0F indicate enables all interrupt. */ + handle->baseAddress->SPIIMSC.reg = 0x0F; + + return BASE_STATUS_OK; +} + +/** + * @brief Wait until the SPI data transmission is complete. + * @param handle SPI handle. + * @retval None. + */ +static void WaitComplete(void *handle) +{ + SPI_ASSERT_PARAM(handle != NULL); + SPI_Handle *spiHandle = (SPI_Handle *)(handle); + SPI_ASSERT_PARAM(IsSPIInstance(spiHandle->baseAddress)); + while (true) { + /* Wait for the write operation to complete */ + if (spiHandle->baseAddress->SPISR.BIT.bsy == BASE_CFG_UNSET && + spiHandle->baseAddress->SPISR.BIT.tfe == BASE_CFG_SET && + spiHandle->baseAddress->SPISR.BIT.rne == BASE_CFG_UNSET) { + break; + } + } +} + +/** + * @brief SPI DMA read completion callback function. + * @param handle SPI handle. + * @retval None + */ +static void ReadDmaFinishFun(void *handle) +{ + SPI_ASSERT_PARAM(handle != NULL); + SPI_Handle *spiHandle = (SPI_Handle *)(handle); + SPI_ASSERT_PARAM(IsSPIInstance(spiHandle->baseAddress)); + /* Waiting for SPI data transfer to complete */ + WaitComplete(spiHandle); + SpiCsControl(spiHandle, SPI_CHIP_DESELECT); + + if (spiHandle->state == HAL_SPI_STATE_BUSY_RX) { + if (spiHandle->userCallBack.RxCpltCallback != NULL) { + spiHandle->userCallBack.RxCpltCallback(spiHandle); + } + } + + if (spiHandle->state == HAL_SPI_STATE_BUSY_TX_RX) { + if (spiHandle->userCallBack.TxRxCpltCallback != NULL) { + spiHandle->userCallBack.TxRxCpltCallback(spiHandle); + } + } + + if (spiHandle->state == HAL_SPI_STATE_BUSY_TX) { + if (spiHandle->userCallBack.TxCpltCallback != NULL) { + spiHandle->userCallBack.TxCpltCallback(spiHandle); + } + } + + spiHandle->state = HAL_SPI_STATE_READY; + /* Disable rx fifo DMA */ + spiHandle->baseAddress->SPIDMACR.BIT.rxdmae = BASE_CFG_UNSET; +} + +/** + * @brief SPI DMA write completion callback function. + * @param handle SPI handle. + * @retval None + */ +static void WriteDmaFinishFun(void *handle) +{ + SPI_ASSERT_PARAM(handle != NULL); + SPI_Handle *spiHandle = (SPI_Handle *)(handle); + SPI_ASSERT_PARAM(IsSPIInstance(spiHandle->baseAddress)); + /* Waiting for SPI data transfer to complete */ + WaitComplete(spiHandle); + SpiCsControl(spiHandle, SPI_CHIP_DESELECT); + /* Disable tx fifo DMA */ + spiHandle->baseAddress->SPIDMACR.BIT.txdmae = BASE_CFG_UNSET; + if (spiHandle->userCallBack.TxCpltCallback != NULL && spiHandle->state == HAL_SPI_STATE_READY) { + spiHandle->userCallBack.TxCpltCallback(spiHandle); + } + if (spiHandle->frameFormat == HAL_SPI_MODE_MICROWIRE) { + spiHandle->state = HAL_SPI_STATE_READY; + } +} + +/** + * @brief SPI DMA error callback function. + * @param handle SPI handle. + * @retval None + */ +static void DmaErrorFun(void *handle) +{ + SPI_ASSERT_PARAM(handle != NULL); + SPI_Handle *spiHandle = (SPI_Handle *)(handle); + SPI_ASSERT_PARAM(IsSPIInstance(spiHandle->baseAddress)); + SpiCsControl(spiHandle, SPI_CHIP_DESELECT); + /* Disable rx and tx fifo DMA */ + spiHandle->baseAddress->SPIDMACR.reg = 0; + + if (spiHandle->userCallBack.ErrorCallback != NULL) { + spiHandle->userCallBack.ErrorCallback(spiHandle); + } + spiHandle->state = HAL_SPI_STATE_READY; +} + +/** + * @brief DMA enable Configuration. + * @param handle SPI handle. + * @retval None + */ +static void EnableDma(SPI_Handle *handle) +{ + handle->baseAddress->SPIIMSC.reg = 0x0; + SpiCsControl(handle, SPI_CHIP_SELECT); + if (!handle->baseAddress->SPICR1.BIT.sse) { + handle->baseAddress->SPICR1.BIT.sse = BASE_CFG_SET; + } + handle->baseAddress->SPIDMACR.reg = SPI_DMA_FIFO_ENABLE; +} + +/** + * @brief SPI read and write configures the DMA for channel callback functions. + * @param handle SPI handle. + * @retval None + */ +static void SetDmaCallBack(SPI_Handle *handle) +{ + handle->dmaHandle->userCallBack.DMA_CallbackFuns[handle->rxDmaCh].ChannelFinishCallBack = ReadDmaFinishFun; + handle->dmaHandle->userCallBack.DMA_CallbackFuns[handle->rxDmaCh].ChannelErrorCallBack = DmaErrorFun; + handle->dmaHandle->userCallBack.DMA_CallbackFuns[handle->txDmaCh].ChannelFinishCallBack = WriteDmaFinishFun; + handle->dmaHandle->userCallBack.DMA_CallbackFuns[handle->txDmaCh].ChannelErrorCallBack = DmaErrorFun; +} + +/** + * @brief Receiving data in DMA mode. + * @param handle SPI handle. + * @param rData Address of the data buff to be Receiving. + * @param dataSize Number of the data to be Receiving. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_SPI_ReadDMA(SPI_Handle *handle, unsigned char *rData, unsigned int dataSize) +{ + static unsigned short writeVal = 0; + BASE_StatusType ret; + + SPI_ASSERT_PARAM(handle != NULL && rData != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + SPI_ASSERT_PARAM(handle->dmaHandle != NULL); /* Check the DMA transfer handle and channel. */ + SPI_PARAM_CHECK_WITH_RET(handle->txDmaCh < CHANNEL_MAX_NUM, BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(handle->rxDmaCh < CHANNEL_MAX_NUM, BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET((handle->rxDmaCh != handle->txDmaCh), BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(handle->state == HAL_SPI_STATE_READY, BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + + handle->state = HAL_SPI_STATE_BUSY_RX; + /* Configuring SPI transmission parameters */ + ConfigTransmissionParameter(handle, rData, NULL, dataSize); + ClearSpiRxFifo(handle); /* If there is residual data in the read FIFO, clear the data. */ + SetDmaCallBack(handle); + /* To set the auto-increment mode of the source and destination addresses */ + handle->dmaHandle->DMA_Channels[handle->rxDmaCh].srcAddrInc = DMA_ADDR_UNALTERED; + handle->dmaHandle->DMA_Channels[handle->rxDmaCh].destAddrInc = DMA_ADDR_INCREASE; + handle->dmaHandle->DMA_Channels[handle->txDmaCh].srcAddrInc = DMA_ADDR_UNALTERED; + handle->dmaHandle->DMA_Channels[handle->txDmaCh].destAddrInc = DMA_ADDR_UNALTERED; + + /* DMA rx channel Interrupt Transfer */ + ret = HAL_DMA_StartIT(handle->dmaHandle, (uintptr_t) & (handle->baseAddress->SPIDR.reg), + (uintptr_t)handle->rxBuff, handle->transferSize, handle->rxDmaCh); + if (ret != BASE_STATUS_OK) { + handle->state = HAL_SPI_STATE_READY; + return ret; + } + /* DMA tx channel Interrupt Transfer */ + if (handle->mode == HAL_SPI_MASTER) { + ret = HAL_DMA_StartIT(handle->dmaHandle, (uintptr_t) & writeVal, (uintptr_t) & (handle->baseAddress->SPIDR.reg), + handle->transferSize, handle->txDmaCh); + if (ret != BASE_STATUS_OK) { + handle->state = HAL_SPI_STATE_READY; + return ret; + } + } + EnableDma(handle); + return ret; +} + +/** + * @brief Send data in DMA mode. + * @param handle SPI handle. + * @param wData Address of the data buff to be sent. + * @param dataSize Number of the data to be sent. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_SPI_WriteDMA(SPI_Handle *handle, unsigned char *wData, unsigned int dataSize) +{ + static unsigned short readVal; + BASE_StatusType ret; + + SPI_ASSERT_PARAM(handle != NULL && wData != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + SPI_ASSERT_PARAM(handle->dmaHandle != NULL); /* Check the DMA transfer handle and channel. */ + SPI_PARAM_CHECK_WITH_RET(handle->txDmaCh < CHANNEL_MAX_NUM, BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(handle->rxDmaCh < CHANNEL_MAX_NUM, BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET((handle->rxDmaCh != handle->txDmaCh), BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(handle->state == HAL_SPI_STATE_READY, BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + + handle->state = HAL_SPI_STATE_BUSY_TX; + /* Configuring SPI transmission parameters */ + ConfigTransmissionParameter(handle, NULL, wData, dataSize); + ClearSpiRxFifo(handle); /* If there is residual data in the read FIFO, clear the data. */ + SetDmaCallBack(handle); + /* To set the auto-increment mode of the source and destination addresses */ + handle->dmaHandle->DMA_Channels[handle->rxDmaCh].srcAddrInc = DMA_ADDR_UNALTERED; + handle->dmaHandle->DMA_Channels[handle->rxDmaCh].destAddrInc = DMA_ADDR_UNALTERED; + handle->dmaHandle->DMA_Channels[handle->txDmaCh].srcAddrInc = DMA_ADDR_INCREASE; + handle->dmaHandle->DMA_Channels[handle->txDmaCh].destAddrInc = DMA_ADDR_UNALTERED; + /* DMA tx channel Interrupt Transfer */ + ret = HAL_DMA_StartIT(handle->dmaHandle, (uintptr_t)handle->txBuff, + (uintptr_t) & (handle->baseAddress->SPIDR.reg), handle->transferSize, handle->txDmaCh); + if (ret != BASE_STATUS_OK) { + handle->state = HAL_SPI_STATE_READY; + return ret; + } + /* DMA rx channel Interrupt Transfer */ + ret = HAL_DMA_StartIT(handle->dmaHandle, (uintptr_t) & (handle->baseAddress->SPIDR.reg), + (uintptr_t) & readVal, handle->transferSize, handle->rxDmaCh); + if (ret != BASE_STATUS_OK) { + handle->state = HAL_SPI_STATE_READY; + return ret; + } + EnableDma(handle); + return ret; +} + +/** + * @brief Receiving and send data in DMA mode. + * @param handle SPI handle. + * @param rData Address of the data buff to be Receiving. + * @param wData Address of the data buff to be sent. + * @param dataSize Number of the data to be Receiving and sent. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_SPI_WriteReadDMA(SPI_Handle *handle, + unsigned char *rData, + unsigned char *wData, + unsigned int dataSize) +{ + BASE_StatusType ret; + + SPI_ASSERT_PARAM(handle != NULL && rData != NULL && wData != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + SPI_ASSERT_PARAM(handle->dmaHandle != NULL); /* Check the DMA transfer handle and channel. */ + SPI_PARAM_CHECK_WITH_RET(handle->txDmaCh < CHANNEL_MAX_NUM, BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(handle->rxDmaCh < CHANNEL_MAX_NUM, BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET((handle->rxDmaCh != handle->txDmaCh), BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(handle->state == HAL_SPI_STATE_READY, BASE_STATUS_ERROR); + SPI_PARAM_CHECK_WITH_RET(dataSize > 0, BASE_STATUS_ERROR); + + handle->state = HAL_SPI_STATE_BUSY_TX_RX; + /* Configuring SPI transmission parameters */ + ConfigTransmissionParameter(handle, rData, wData, dataSize); + ClearSpiRxFifo(handle); /* If there is residual data in the read FIFO, clear the data. */ + SetDmaCallBack(handle); + /* To set the auto-increment mode of the source and destination addresses */ + handle->dmaHandle->DMA_Channels[handle->rxDmaCh].srcAddrInc = DMA_ADDR_UNALTERED; + handle->dmaHandle->DMA_Channels[handle->rxDmaCh].destAddrInc = DMA_ADDR_INCREASE; + handle->dmaHandle->DMA_Channels[handle->txDmaCh].srcAddrInc = DMA_ADDR_INCREASE; + handle->dmaHandle->DMA_Channels[handle->txDmaCh].destAddrInc = DMA_ADDR_UNALTERED; + /* DMA rx channel Interrupt Transfer */ + ret = HAL_DMA_StartIT(handle->dmaHandle, (uintptr_t) & (handle->baseAddress->SPIDR.reg), + (uintptr_t)handle->rxBuff, handle->transferSize, handle->rxDmaCh); + if (ret != BASE_STATUS_OK) { + handle->state = HAL_SPI_STATE_READY; + return ret; + } + /* DMA tx channel Interrupt Transfer */ + ret = HAL_DMA_StartIT(handle->dmaHandle, (uintptr_t)handle->txBuff, + (uintptr_t) & (handle->baseAddress->SPIDR.reg), handle->transferSize, handle->txDmaCh); + if (ret != BASE_STATUS_OK) { + handle->state = HAL_SPI_STATE_READY; + return ret; + } + EnableDma(handle); + return ret; +} + +/** + * @brief Stop DMA transfer. + * @param handle SPI handle. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_SPI_DMAStop(SPI_Handle *handle) +{ + SPI_ASSERT_PARAM(handle != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + BASE_StatusType ret; + + ret = HAL_DMA_StopChannel(handle->dmaHandle, handle->txDmaCh); + if (ret != BASE_STATUS_OK) { + return ret; + } + ret = HAL_DMA_StopChannel(handle->dmaHandle, handle->rxDmaCh); + return ret; +} + +/** + * @brief CS Channel Configuration. + * @param handle SPI handle. + * @param channel SPI CS channel.For details, see the enumeration definition of SPI_ChipSelectChannel. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_SPI_ChipSelectChannelSet(SPI_Handle *handle, SPI_ChipSelectChannel channel) +{ + SPI_ASSERT_PARAM(handle != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + /* Check the validity of the CS parameters. */ + SPI_PARAM_CHECK_WITH_RET(channel >= SPI_CHIP_SELECT_CHANNEL_0 && channel < SPI_CHIP_SELECT_CHANNEL_MAX, + BASE_STATUS_ERROR); + handle->baseAddress->SPICSNCR.BIT.spi_csn_sel = channel; + return BASE_STATUS_OK; +} + +/** + * @brief Obtains the currently configured CS channel. + * @param handle SPI handle. + * @param channel Pointer to the address for storing the obtained CS channel value. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_SPI_ChipSelectChannelGet(SPI_Handle *handle, SPI_ChipSelectChannel *channel) +{ + SPI_ASSERT_PARAM(handle != NULL && channel != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + *channel = handle->baseAddress->SPICSNCR.BIT.spi_csn_sel; + return BASE_STATUS_OK; +} + + +/** + * @brief Interrupt Handling Function. + * @param handle SPI_Handle. + * @retval None. + */ +void HAL_SPI_IrqHandler(void *handle) +{ + SPI_Handle *spiHandle = (SPI_Handle *)handle; + SPI_ASSERT_PARAM(spiHandle != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(spiHandle->baseAddress)); + /* Indicates that there is no interruption. */ + if (spiHandle->baseAddress->SPIMIS.reg == 0) { + return; + } + + /* Generating RX overflow interrupt. */ + if (spiHandle->baseAddress->SPIMIS.BIT.rormis) { + spiHandle->baseAddress->SPIIMSC.reg = 0x0; + /* Clear rx interrupt. */ + spiHandle->baseAddress->SPIICR.BIT.roric = BASE_CFG_SET; + spiHandle->baseAddress->SPIICR.BIT.rtic = BASE_CFG_SET; + + spiHandle->errorCode = BASE_STATUS_ERROR; + spiHandle->state = HAL_SPI_STATE_ERROR; + /* Invoke the error callback function. */ + if (spiHandle->userCallBack.ErrorCallback != NULL) { + spiHandle->userCallBack.ErrorCallback(spiHandle); + } + SpiCsControl(spiHandle, SPI_CHIP_DESELECT); + return; + } + /* Reads and writes data based on the interrupt flag. */ + ReadWriteInt(spiHandle); + SpiRxTxCallack(spiHandle); +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/spi/src/spi_ex.c b/vendor/others/demo/5-tim_adc/demo/drivers/spi/src/spi_ex.c new file mode 100644 index 000000000..c13bb3526 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/spi/src/spi_ex.c @@ -0,0 +1,54 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file spi_ex.c + * @author MCU Driver Team + * @brief SPI module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the SPI. + * + Peripheral Control functions + */ + +/* Includes ------------------------------------------------------------------*/ +#include "spi_ex.h" + +/** + * @brief SPI SET CHIP CONGFIG SELECT. + * @param handle SPI_handle. + * @param mode SPI CS mode.For details, see the enumeration definition of HAL_SPI_CHIP_CONFIG + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_SPI_SetChipConfigSelectEx(SPI_Handle *handle, HAL_SPI_CHIP_CONFIG mode) +{ + SPI_ASSERT_PARAM(handle != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + SPI_PARAM_CHECK_WITH_RET(IsSpiChipConfigMode(mode), BASE_STATUS_ERROR); + handle->baseAddress->SPICSNCR.BIT.spi_csn_mode = mode; /* set chip mode */ + return BASE_STATUS_OK; +} + +/** + * @brief SPI GET CHIP CONGFIG SELECT. + * @param handle SPI_handle. + * @retval HAL_SPI_CHIP_CONFIG. + */ +HAL_SPI_CHIP_CONFIG HAL_SPI_GetChipConfigSelectEx(SPI_Handle *handle) +{ + SPI_ASSERT_PARAM(handle != NULL); + SPI_ASSERT_PARAM(IsSPIInstance(handle->baseAddress)); + return handle->baseAddress->SPICSNCR.BIT.spi_csn_mode; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/timer/common/inc/timer.h b/vendor/others/demo/5-tim_adc/demo/drivers/timer/common/inc/timer.h new file mode 100644 index 000000000..edd902cdb --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/timer/common/inc/timer.h @@ -0,0 +1,112 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file timer.h + * @author MCU Driver Team + * @brief TIMER module driver. + * @details This file provides firmware TIMER Handle structure and Functions + * prototypes to manage the following functionalities of the TIMER. + * + Initialization and de-initialization functions + * + config the register of timer + */ + +#ifndef McuMagicTag_TIMER_H +#define McuMagicTag_TIMER_H + +/* Includes ------------------------------------------------------------------*/ +#include "timer_ip.h" + +/* Macro definitions ---------------------------------------------------------*/ + +/** + * @defgroup TIMER TIMER + * @brief TIMER module. + * @{ + */ + +/** + * @defgroup TIMER_Common TIMER Common + * @brief TIMER common external module. + * @{ + */ + +/** + * @defgroup TIMER_Handle_Definition TIMER Handle Definition + * @{ + */ + +/** + * @brief Time base address and Configuration Structure definition + */ +typedef struct _TIMER_Handle { + TIMER_RegStruct *baseAddress; /**< Base address of timer. */ + TIMER_CountMode cntMode; /**< Timer cnt Mode. */ + TIMER_Mode mode; /**< Timer counting mode selection. */ + TIMER_PrescalerFactor prescaler; /**< Timer prescaler. */ + TIMER_Size size; /**< Timer size 16 or 32 bits. */ + volatile unsigned int load; /**< Period, set the TIMERx_LOAD. */ + volatile unsigned int bgLoad; /**< Backgroud period, set the TIMEx_BGLOAD. */ + bool interruptEn; /**< Interrupt enable or disable. */ + bool adcSocReqEnable; /**< Trigger ADC Enable Sampling. */ + bool dmaReqEnable; /**< Enable bit for DMA single request and DAM burst sampling. */ + TIMER_UserCallBack userCallBack; /**< Callback function of timer. */ + TIMER_ExtendHandle handleEx; /**< TIMER extend handle */ +} TIMER_Handle; + +/** + * @brief Typedef callback function of TIMER + */ +typedef void (*TIMER_CallBackFunc)(void *param); + +/** + * @} + */ + +/** + * @defgroup TIMER_API_Declaration TIMER HAL API + * @{ + */ +BASE_StatusType HAL_TIMER_Init(TIMER_Handle *handle); + +void HAL_TIMER_DeInit(TIMER_Handle *handle); + +void HAL_TIMER_Start(TIMER_Handle *handle); + +void HAL_TIMER_Stop(TIMER_Handle *handle); + +BASE_StatusType HAL_TIMER_Config(TIMER_Handle *handle, TIMER_CFG_TYPE cfgType); + +BASE_StatusType HAL_TIMER_GetConfig(TIMER_Handle *handle); + +BASE_StatusType HAL_TIMER_RegisterCallback(TIMER_Handle *handle, TIMER_InterruptType typeID, + TIMER_CallBackFunc callBackFunc); + +BASE_StatusType HAL_TIMER_UnRegisterCallback(TIMER_Handle *handle, TIMER_InterruptType typeID); + +void HAL_TIMER_IrqHandler(void *handle); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_TIMER_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/timer/inc/timer_ex.h b/vendor/others/demo/5-tim_adc/demo/drivers/timer/inc/timer_ex.h new file mode 100644 index 000000000..0b04725c9 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/timer/inc/timer_ex.h @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file timer_ex.h + * @author MCU Driver Team + * @brief TIMER module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the TIMER. + * + Defines extended functions of the timer module. + */ +#ifndef McuMagicTag_TIMER_EX_H +#define McuMagicTag_TIMER_EX_H +#include "timer.h" +/** + * @addtogroup TIMER_IP + * @{ + */ + +/** + * @defgroup TIMER_EX_API_Declaration TIMER HAL API EX + * @{ + */ + +/* Setting DMA the request overflow interrupt */ +void HAL_TIMER_DMARequestOverFlowEx(TIMER_Handle *handle, bool overflow); +BASE_StatusType HAL_TIMER_TriggerAdcEx(TIMER_Handle *handle, bool enable); +/** + * @} + */ + +/** + * @} + */ +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/timer/inc/timer_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/timer/inc/timer_ip.h new file mode 100644 index 000000000..877b9ffbe --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/timer/inc/timer_ip.h @@ -0,0 +1,666 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file timer_ip.h + * @author MCU Driver Team + * @brief TIMER module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the TIMER. + * + TIMER register mapping structure + * + Direct Configuration Layer functions of TIMER + */ + + +#ifndef McuMagicTag_TIMER_IP_H +#define McuMagicTag_TIMER_IP_H + +/* Includes ------------------------------------------------------------------*/ +#include "baseinc.h" + +/** + * @addtogroup TIMER + * @{ + */ + +/** + * @defgroup TIMER_IP TIMER_IP + * @brief TIMER_IP: timer_v1 + * @{ + */ + +/** + * @defgroup TIMER_Param_Def TIMER Parameters Definition + * @brief Definition of TIMER configuration parameters. + * @{ + */ +#ifdef TIMER_PARAM_CHECK +#define TIMER_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define TIMER_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define TIMER_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define TIMER_ASSERT_PARAM(para) ((void)0U) +#define TIMER_PARAM_CHECK_NO_RET(para) ((void)0U) +#define TIMER_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +/** + * @brief Period min value + */ +#define PERIOD_MIN_VALUE 1 + +/** + * @brief Extent handle definition of timer + */ +typedef struct { +} TIMER_ExtendHandle; + +/** + * @brief TIMER type of user callback function + */ +typedef enum { + TIMER_PERIOD_FIN = 0x00000000U, + TIMER_OVER_FLOW = 0x00000001U, +} TIMER_InterruptType; + +/** + * @brief TIMER type of user callback function + */ +typedef struct { + void (* TimerPeriodFinCallBack)(void *handle); + void (* TimerOverFlowCallBack)(void *handle); +} TIMER_UserCallBack; + +/** + * @brief TIMER operating mode definition + */ +typedef enum { + TIMER_MODE_RUN_FREE = 0x00000000U, + TIMER_MODE_RUN_PERIODIC = 0x00000001U, + TIMER_MODE_RUN_ONTSHOT = 0x00000002U, +} TIMER_Mode; + +/** + * @brief TIMER counting mode definition + */ +typedef enum { + TIMER_COUNT_UP = 0x00000000U, + TIMER_COUNT_DOWN = 0x00000001U, +} TIMER_CountMode; + +/** + * @brief TIMER division factor definition + */ +typedef enum { + TIMERPRESCALER_NO_DIV = 0x00000000U, + TIMERPRESCALER_DIV_16 = 0x00000001U, + TIMERPRESCALER_DIV_256 = 0x00000002U, +} TIMER_PrescalerFactor; + +/** + * @brief TIMER couter size definition + */ +typedef enum { + TIMER_SIZE_16BIT = 0x00000000U, + TIMER_SIZE_32BIT = 0x00000001U, +} TIMER_Size; + +/** + * @brief Typedef TIMER Paramter Config type + */ +typedef enum { + TIMER_CFG_LOAD = 0x00000001, + TIMER_CFG_BGLOAD = 0x00000002, + TIMER_CFG_MODE = 0x00000004, + TIMER_CFG_INTERRUPT = 0x00000008, + TIMER_CFG_PRESCALER = 0x00000010, + TIMER_CFG_SIZE = 0x00000020, + TIMER_CFG_DMA_REQ = 0x00000040, + TIMER_CFG_ADC_REQ = 0x00000080, +} TIMER_CFG_TYPE; + +/** + * @} + */ + +/** + * @defgroup TIMER_Reg_Def TIMER Register Definition + * @brief register mapping structure + * @{ + */ + +/** + * @brief TIMER control register structure + */ +typedef union { + unsigned int reg; + struct { + unsigned int oneshot : 1; /**< Counting mode is single counting mode or periodic counting mode. */ + unsigned int timersize : 1; /**< 16-bit/32-bit counter operation mode. */ + unsigned int timerpre : 2; /**< This field is used to set the prescale factor of the timer. */ + unsigned int dmaovintenable : 1; /**< DMA request overflow interrupt mask. */ + unsigned int timerintenable : 1; /**< Timing interrupt mask. */ + unsigned int timermode : 1; /**< Indicates the count mode of a timer. */ + unsigned int timeren : 1; /**< Timer enable. */ + unsigned int reserved : 24; + } BIT; +} volatile TIMER_CONTROL_Reg; + +/** + * @brief TIMER original interrupt register + */ +typedef struct { + unsigned int timerris : 1; /**< Raw interrupt status of the timing interrupt. */ + unsigned int dmaovris : 1; /**< Raw status of the DMA request overflow interrupt. */ + unsigned int reserved : 30; +} volatile TIMER_RIS_Reg; + +/** + * @brief TIMER interrupt register of shield + */ +typedef struct { + unsigned int timermis : 1; /**< Masked timing interrupt status. */ + unsigned int dmaovmis : 1; /**< Status of the masked DMA request overflow interrupt. */ + unsigned int reserved : 30; +} volatile TIMER_MIS_Reg; + +/** + * @brief TIMER ControlB + */ +typedef union { + unsigned int reg; + struct { + unsigned int dmabreqen : 1; /**< DMA burst request enable. */ + unsigned int dmasreqen : 1; /**< DMA single request enable bit. */ + unsigned int socen : 1; /**< Enable bit for triggering the ADC sampling signal (SOC signal). */ + unsigned int reserved : 29; + } BIT; +} volatile TIMER_CONTROLB_Reg; + +/** + * @brief TIMER DMAOV_INTCLR + */ +typedef union { + unsigned int reg; + struct { + unsigned int dmaov_intclr : 1; /**< DMA request overflow interrupt clear bit. */ + unsigned int reserved : 30; + } BIT; +} volatile DMAOV_INTCLR_Reg; +/** + * @brief TIMER register structure + */ +typedef struct { + unsigned int timer_load; /**< Initial count value register, offset address: 0x00000000U */ + unsigned int timer_value; /**< Current count value register, offset address: 0x00000004U */ + TIMER_CONTROL_Reg TIMERx_CONTROL; /**< Timer control register, offset address: 0x00000008U */ + unsigned int timer_intclr; /**< Timing interrupt clear register, offset address: 0x0000000CU */ + TIMER_RIS_Reg TIMERx_RIS; /**< Raw interrupt register, offset address: 0x00000010U */ + TIMER_MIS_Reg TIMERx_MIS; /**< Masked interrupt register, offset address: 0x00000014U */ + unsigned int timerbgload; /**< Count value register in periodic mode, offset address: 0x00000018U */ + TIMER_CONTROLB_Reg TIMERx_CONTROLB; /**< Timerx control register B, offset address: 0x0000001CU */ + DMAOV_INTCLR_Reg DMAOV_INTCLR; /**< DMA request overflow INT clear register, offset address: 0x00000020U */ +} volatile TIMER_RegStruct; +/** + * @} + */ + +/* Parameter Check -----------------------------------------------------------*/ +/** + * @brief Verify Timer mode configuration + * @param mode Timer Mode, @ref TIMER_Mode + * @retval true + * @retval false + */ +static inline bool IsTimerMode(TIMER_Mode mode) +{ + return (((mode) == TIMER_MODE_RUN_FREE) || + ((mode) == TIMER_MODE_RUN_PERIODIC) || + ((mode) == TIMER_MODE_RUN_ONTSHOT)); +} + +/** + * @brief Verify Timer Interrupt Type + * @param mode Timer Interrupt Type, @ref TIMER_InterruptType + * @retval true + * @retval false + */ +static inline bool IsTimerInterruptType(TIMER_InterruptType interruptType) +{ + return (((interruptType) == TIMER_PERIOD_FIN) || + ((interruptType) == TIMER_OVER_FLOW)); +} + +/** + * @brief Verify Timer counter size configuration + * @param size Timer Size, @ref TIMER_Size + * @retval true + * @retval false + */ +static inline bool IsTimerSize(TIMER_Size size) +{ + return (((size) == TIMER_SIZE_16BIT) || + ((size) == TIMER_SIZE_32BIT)); +} + +/** + * @brief Verify Timer period configuration + * @param period + * @retval true + * @retval false + */ +static inline bool IsTimerPeriod(unsigned int period) +{ + return ((period) >= PERIOD_MIN_VALUE); +} + +/** + * @brief Verify Timer div configuration + * @param div @see TIMER_PrescalerFactor + * @retval true + * @retval false + */ +static inline bool IsTimerDiv(TIMER_PrescalerFactor div) +{ + return (((div) == TIMERPRESCALER_NO_DIV) || + ((div) == TIMERPRESCALER_DIV_16) || + ((div) == TIMERPRESCALER_DIV_256)); +} + +/** + * @brief Verify Timer interrupt configuration + * @param interruptEn + * @retval true + * @retval false + */ +static inline bool IsTimerInterrupt(unsigned int interruptEn) +{ + return (((interruptEn) == BASE_CFG_SET) || ((interruptEn) == BASE_CFG_UNSET)); +} + + +/* Direct configuration layer ------------------------------------------------*/ + +/** + * @brief Enable the timer, start to run + * @param timerx Timer register baseAddr + * @retval None + */ +static inline void DCL_TIMER_Enable(TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + timerx->TIMERx_CONTROL.BIT.timeren = BASE_CFG_SET; +} + +/** + * @brief Stop the timer + * @param timerx Timer register baseAddr + * @retval None + */ +static inline void DCL_TIMER_Disable(TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + timerx->TIMERx_CONTROL.BIT.timeren = BASE_CFG_UNSET; +} + +/** + * @brief Get the timer enable flag + * @param timerx Timer register baseAddr + * @retval None + */ +static inline bool DCL_TIMER_GetTimerEn(const TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + return timerx->TIMERx_CONTROL.BIT.timeren; +} + +/** + * @brief Get current counter in timer + * @param timerx Timer register baseAddr + * @retval None + */ +static inline unsigned int DCL_TIMER_GetValue(const TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + return timerx->timer_value; +} + +/** + * @brief Set the counter with load,which change timer value immediately + * @param timerx Timer register baseAddr + * @param period the init value of the counter + * @retval None + */ +static inline void DCL_TIMER_SetLoad(TIMER_RegStruct *timerx, unsigned int period) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + TIMER_PARAM_CHECK_NO_RET(IsTimerPeriod(period)); + timerx->timer_load = period; +} + +/** + * @brief Get the period of counter + * @param timerx Timer register baseAddr + * @retval None + */ +static inline unsigned int DCL_TIMER_GetLoad(const TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + return timerx->timer_load; +} + +/** + * @brief Set the counter with period with bgload + * @param timerx Timer register baseAddr + * @param period the init value of the counter + * @retval None + */ +static inline void DCL_TIMER_SetBgLoad(TIMER_RegStruct *timerx, unsigned int period) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + TIMER_PARAM_CHECK_NO_RET(IsTimerPeriod(period)); + timerx->timerbgload = period; +} + +/** + * @brief Get the bgLoad of timer + * @param timerx Timer register baseAddr + * @retval None + */ +static inline unsigned int DCL_TIMER_GetBgLoad(const TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + return timerx->timerbgload; +} + +/** + * @brief Enable timer interrupt + * @param timerx Timer register baseAddr + * @retval None + */ +static inline void DCL_TIMER_InterruptEnable(TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + timerx->TIMERx_CONTROL.BIT.timerintenable = BASE_CFG_SET; +} + +/** + * @brief Disable timer interrupt + * @param timerx Timer register baseAddr + * @retval None + */ +static inline void DCL_TIMER_InterruptDisable(TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + timerx->TIMERx_CONTROL.BIT.timerintenable = BASE_CFG_UNSET; +} + +/** + * @brief Get timer interrupt enable flag + * @param timerx Timer register baseAddr + * @retval None + */ +static inline bool DCL_TIMER_GetInterruptEnableFlag(const TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + return timerx->TIMERx_CONTROL.BIT.timerintenable; +} + +/** + * @brief Set timer size + * @param timerx Timer register baseAddr + * @param size the size of counter, see @ref TIMER_Size + * @retval None + */ +static inline void DCL_TIMER_SetTimerSize(TIMER_RegStruct *timerx, TIMER_Size size) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + TIMER_PARAM_CHECK_NO_RET(IsTimerSize(size)); + timerx->TIMERx_CONTROL.BIT.timersize = (size == TIMER_SIZE_16BIT) ? BASE_CFG_UNSET : BASE_CFG_SET; +} + +/** + * @brief Set timer size + * @param timerx Timer register baseAddr + * @retval None + */ +static inline TIMER_Size DCL_TIMER_GetTimerSize(const TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + return timerx->TIMERx_CONTROL.BIT.timersize; +} + +/** + * @brief Set the counting mode is single counting or periodic counting mode + * @param timerx Timer register baseAddr + * @param mode counter mode, see @ref TIMER_Mode + * @retval None + */ +static inline void DCL_TIMER_SetTimerMode(TIMER_RegStruct *timerx, TIMER_Mode mode) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + TIMER_PARAM_CHECK_NO_RET(IsTimerMode(mode)); + if (mode == TIMER_MODE_RUN_ONTSHOT) { + timerx->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_SET; + } else { + timerx->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_UNSET; + timerx->TIMERx_CONTROL.BIT.timermode = (mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + } +} + +/** + * @brief Get the counting mode is single counting or periodic counting mode + * @param timerx Timer register baseAddr + * @retval TIMER_Mode + */ +static inline TIMER_Mode DCL_TIMER_GetTimerMode(const TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + if (timerx->TIMERx_CONTROL.BIT.oneshot == BASE_CFG_SET) { + return TIMER_MODE_RUN_ONTSHOT; + } else { + return (timerx->TIMERx_CONTROL.BIT.timermode == BASE_CFG_SET) ? TIMER_MODE_RUN_PERIODIC : TIMER_MODE_RUN_FREE; + } +} + +/** + * @brief Set the prescaler factor of the timer + * @param timerx Timer register baseAddr + * @param factor prescaler factor, see @ref TIMER_PrescalerFactor + * @retval None + */ +static inline void DCL_TIMER_SetTimerPre(TIMER_RegStruct *timerx, TIMER_PrescalerFactor factor) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + TIMER_PARAM_CHECK_NO_RET(IsTimerDiv(factor)); + timerx->TIMERx_CONTROL.BIT.timerpre = factor; +} + +/** + * @brief Get the prescaler factor of the timer + * @param timerx Timer register baseAddr + * @retval TIMER_PrescalerFactor + */ +static inline TIMER_PrescalerFactor DCL_TIMER_GetTimerPre(const TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + return timerx->TIMERx_CONTROL.BIT.timerpre; +} + +/** + * @brief Clear the time irq falg + * @param timerx Timer register baseAddr + * @retval None + */ +static inline void DCL_TIMER_IrqClear(TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + timerx->timer_intclr = BASE_CFG_SET; +} + +/** + * @brief Get Original interrupt state + * @param timerx Timer register baseAddr + * @retval bool + */ +static inline bool DCL_TIMER_GetTimerOriginalInterruptState(const TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + return timerx->TIMERx_RIS.timerris; +} + +/** + * @brief Get the interrupt status of Timer after shielding + * @param timerx Timer register baseAddr + * @retval bool + */ +static inline bool DCL_TIMER_GetTimerShieldlInterruptState(const TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + return timerx->TIMERx_MIS.timermis; +} + +/** + * @brief Get Timer Trigger ADC sample enable + * @param timerx Timer register baseAddr + * @retval bool + */ +static inline bool DCL_TIMER_GetTimerTriggerAdcRequest(const TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + return timerx->TIMERx_CONTROLB.BIT.socen; +} + +/** + * @brief Set Timer Trigger ADC sample enable + * @param timerx Timer register baseAddr + * @retval None + */ +static inline void DCL_TIMER_SetTimerTriggerAdcRequest(TIMER_RegStruct *timerx, bool enable) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + timerx->TIMERx_CONTROLB.BIT.socen = enable; +} + +/** + * @brief Get DMA single request enable status + * @param timerx Timer register baseAddr + * @retval bool + */ +static inline bool DCL_TIMER_GetTimerDmaSingleRequest(const TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + return timerx->TIMERx_CONTROLB.BIT.dmasreqen; +} + +/** + * @brief Set DMA single request + * @param timerx Timer register baseAddr + * @param enable DMA/ADC single trigger enable + * @retval None + */ +static inline void DCL_TIMER_SetTimerDmaSingleRequest(TIMER_RegStruct *timerx, bool enable) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + timerx->TIMERx_CONTROLB.BIT.dmasreqen = (unsigned int)enable; +} + +/** + * @brief Get DMA burst request enable status + * @param timerx Timer register baseAddr + * @retval bool + */ +static inline bool DCL_TIMER_GetTimerDmaBurstRequest(const TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + return timerx->TIMERx_CONTROLB.BIT.dmabreqen; +} + +/** + * @brief Set DMA burst request + * @param timerx Timer register baseAddr + * @param enable DMA burst trigger enable + * @retval None + */ +static inline void DCL_TIMER_SetTimerDmaBurstRequest(TIMER_RegStruct *timerx, bool enable) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + timerx->TIMERx_CONTROLB.BIT.dmabreqen = (unsigned int)enable; +} + +/** + * @brief DMA request overflow interrupt enable + * @param timerx DMA Timer register baseAddr + * @retval None + */ +static inline void DCL_TIMER_DMAInterruptEnable(TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + timerx->TIMERx_CONTROL.BIT.dmaovintenable = BASE_CFG_SET; +} + +/** + * @brief Disabling the DMA overflow interrupt status + * @param timerx DMA Timer register baseAddr + * @retval None + */ +static inline void DCL_TIMER_DMAInterruptDisable(TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + timerx->TIMERx_CONTROL.BIT.dmaovintenable = BASE_CFG_UNSET; +} + +/** + * @brief DMA raw interrupt overflow flag + * @param timerx DMA Timer register baseAddr + * @retval bool + */ +static inline bool DCL_TIMER_GetDMAOriginalInterruptState(const TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + return timerx->TIMERx_RIS.dmaovris; +} + +/** + * @brief Interrupt flag after DMA masking + * @param timerx Timer register baseAddr + * @retval bool + */ +static inline bool DCL_TIMER_GetTimerDMAShieldlInterruptState(const TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + return timerx->TIMERx_MIS.dmaovmis; +} + +/** + * @brief Clears the DMA overflow interrupt flag. + * @param timerx Timer register baseAddr + * @retval None + */ +static inline void DCL_TIMER_DMAIrqClear(TIMER_RegStruct *timerx) +{ + TIMER_ASSERT_PARAM(IsTIMERInstance(timerx)); + timerx->DMAOV_INTCLR.BIT.dmaov_intclr = BASE_CFG_SET; +} + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_TIMER_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/timer/src/timer.c b/vendor/others/demo/5-tim_adc/demo/drivers/timer/src/timer.c new file mode 100644 index 000000000..2c74e91bb --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/timer/src/timer.c @@ -0,0 +1,290 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file timer.c + * @author MCU Driver Team + * @brief TIMER module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the TIMER. + * + Initialization and de-initialization functions + * + config the register of timer + */ + +/* Includes ------------------------------------------------------------------*/ +#include "timer.h" +#include "timer_ex.h" +#include "interrupt.h" + +/** + * @brief Init the timer + * @param handle Timer Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR parameter check fail + */ +BASE_StatusType HAL_TIMER_Init(TIMER_Handle *handle) +{ + TIMER_ASSERT_PARAM(handle != NULL); + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->load), BASE_STATUS_ERROR); + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->bgLoad), BASE_STATUS_ERROR); + TIMER_PARAM_CHECK_WITH_RET(IsTimerMode(handle->mode), BASE_STATUS_ERROR); + TIMER_PARAM_CHECK_WITH_RET(IsTimerSize(handle->size), BASE_STATUS_ERROR); + TIMER_PARAM_CHECK_WITH_RET(IsTimerDiv(handle->prescaler), BASE_STATUS_ERROR); + + /* Initialize the configuration parameters of the timer */ + handle->baseAddress->timer_intclr = BASE_CFG_SET; /* Writing to this register clears interrupt output of timer */ + handle->baseAddress->timer_load = handle->load; + handle->baseAddress->timerbgload = handle->bgLoad; + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_DISABLE; + handle->baseAddress->TIMERx_CONTROL.BIT.timerintenable = handle->interruptEn; + + /* Sets the frequency divider and size of the timer module. */ + handle->baseAddress->TIMERx_CONTROL.BIT.timerpre = handle->prescaler; + handle->baseAddress->TIMERx_CONTROL.BIT.timersize = handle->size; + + /* Sets the running mode of the timer. */ + if (handle->mode == TIMER_MODE_RUN_ONTSHOT) { + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_SET; + } else { + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_UNSET; + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + } + + /* Request for setting the DMA and ADC. */ + handle->baseAddress->TIMERx_CONTROLB.BIT.dmasreqen = handle->dmaReqEnable; + handle->baseAddress->TIMERx_CONTROLB.BIT.dmabreqen = handle->dmaReqEnable; + handle->baseAddress->TIMERx_CONTROLB.BIT.socen = handle->adcSocReqEnable; + return BASE_STATUS_OK; +} + +/** + * @brief DeInit the timer + * @param handle Timer Handle + * @retval None + */ +void HAL_TIMER_DeInit(TIMER_Handle *handle) +{ + TIMER_ASSERT_PARAM(handle != NULL); + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + + /* Clears interrupts and masks interrupts. */ + handle->baseAddress->timer_intclr = BASE_CFG_SET; + handle->baseAddress->TIMERx_CONTROL.BIT.timerintenable = BASE_CFG_DISABLE; + handle->userCallBack.TimerPeriodFinCallBack = NULL; /* Clear all user call back function. */ + handle->userCallBack.TimerOverFlowCallBack = NULL; + /* The counter loading value is set to 0, and the timer is disabled. */ + handle->baseAddress->timer_load = 0; + handle->baseAddress->timerbgload = 0; + handle->baseAddress->TIMERx_CONTROL.reg = 0; + handle->baseAddress->TIMERx_CONTROLB.reg = 0; +} + +/** + * @brief Config Timer + * @param handle Timer Handle + * @param cfgType Timer configures, @ref TIMER_CFG_TYPE + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_TIMER_Config(TIMER_Handle *handle, TIMER_CFG_TYPE cfgType) +{ + TIMER_ASSERT_PARAM(handle != NULL); + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + + /* Configure related registers based on the configuration type. */ + switch (cfgType) { + /* Configure timer count. */ + case TIMER_CFG_LOAD: + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->load), BASE_STATUS_ERROR); + handle->baseAddress->timer_load = handle->load; + handle->bgLoad = handle->load; + break; + /* Configure timer reload count. */ + case TIMER_CFG_BGLOAD: + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->bgLoad), BASE_STATUS_ERROR); + handle->baseAddress->timerbgload = handle->bgLoad; + break; + /* Configure timer work mode. */ + case TIMER_CFG_MODE: + DCL_TIMER_SetTimerMode(handle->baseAddress, handle->mode); + break; + /* Configure timer interrupt. */ + case TIMER_CFG_INTERRUPT: + handle->baseAddress->TIMERx_CONTROL.BIT.timerintenable = handle->interruptEn; + break; + /* Configure timer prescaler. */ + case TIMER_CFG_PRESCALER: + TIMER_PARAM_CHECK_WITH_RET(IsTimerDiv(handle->prescaler), BASE_STATUS_ERROR); + handle->baseAddress->TIMERx_CONTROL.BIT.timerpre = handle->prescaler; + break; + /* Configure the size of the timer counter. */ + case TIMER_CFG_SIZE: + TIMER_PARAM_CHECK_WITH_RET(IsTimerSize(handle->size), BASE_STATUS_ERROR); + handle->baseAddress->TIMERx_CONTROL.BIT.timersize = handle->size; + break; + /* Configure the DMA request. */ + case TIMER_CFG_DMA_REQ: + handle->baseAddress->TIMERx_CONTROLB.BIT.dmasreqen = handle->dmaReqEnable; + break; + /* Configure the ADC request. */ + case TIMER_CFG_ADC_REQ: + handle->baseAddress->TIMERx_CONTROLB.BIT.socen = handle->adcSocReqEnable; + break; + default: + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief Get Timer Config + * @param handle Timer Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_TIMER_GetConfig(TIMER_Handle *handle) +{ + TIMER_ASSERT_PARAM(handle != NULL); + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + + /* Obtain the parameters in the timer handle. */ + handle->load = handle->baseAddress->timer_load; + handle->bgLoad = handle->baseAddress->timerbgload; + handle->mode = handle->baseAddress->TIMERx_CONTROL.BIT.timermode; + handle->size = handle->baseAddress->TIMERx_CONTROL.BIT.timersize; + handle->prescaler = handle->baseAddress->TIMERx_CONTROL.BIT.timerpre; + handle->interruptEn = handle->baseAddress->TIMERx_CONTROL.BIT.timerintenable; + handle->dmaReqEnable = handle->baseAddress->TIMERx_CONTROLB.BIT.dmasreqen || + handle->baseAddress->TIMERx_CONTROLB.BIT.dmabreqen; + handle->adcSocReqEnable = handle->baseAddress->TIMERx_CONTROLB.BIT.socen; + handle->mode = DCL_TIMER_GetTimerMode(handle->baseAddress); + + return BASE_STATUS_OK; +} + +/** + * @brief Start timer. + * @param handle Timer Handle + * @retval None + */ +void HAL_TIMER_Start(TIMER_Handle *handle) +{ + TIMER_ASSERT_PARAM(handle != NULL); + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + /* Enable timer */ + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_SET; +} + +/** + * @brief Stop timer. + * @param handle Timer Handle + * @retval None + * @note Timer in OneShot Mode also need stop + */ +void HAL_TIMER_Stop(TIMER_Handle *handle) +{ + TIMER_ASSERT_PARAM(handle != NULL); + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + /* Disables the timer. */ + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_UNSET; + handle->baseAddress->timer_intclr = BASE_CFG_SET; +} + +/** + * @brief GPT Interrupt service processing function. + * @param handle TIMER Handle + * @retval None + */ +void HAL_TIMER_IrqHandler(void *handle) +{ + TIMER_ASSERT_PARAM(handle != NULL); + TIMER_Handle *timerHandle = (TIMER_Handle *)handle; + TIMER_ASSERT_PARAM(IsTIMERInstance(timerHandle->baseAddress)); + /* Check interrupt type */ + if (timerHandle->baseAddress->TIMERx_MIS.dmaovmis == BASE_CFG_ENABLE) { + /* DMA overflow interrupt */ + timerHandle->baseAddress->DMAOV_INTCLR.BIT.dmaov_intclr = BASE_CFG_ENABLE; + /* Call the timer DMA request overflow callback function of the user. */ + if (timerHandle->userCallBack.TimerOverFlowCallBack != NULL) { + timerHandle->userCallBack.TimerOverFlowCallBack(timerHandle); + } + } + if (timerHandle->baseAddress->TIMERx_MIS.timermis == BASE_CFG_ENABLE) { + /* TIMER Interrupt */ + timerHandle->baseAddress->timer_intclr = BASE_CFG_ENABLE; + /* Call the period finish callback function of the user. */ + if (timerHandle->userCallBack.TimerPeriodFinCallBack != NULL) { + timerHandle->userCallBack.TimerPeriodFinCallBack(timerHandle); + } + } + return; +} + +/** + * @brief Register the callback function of TIMER handle. + * @param handle Timer Handle + * @param typeID CallBack function type of user, @ref TIMER_InterruptType + * @param callBackFunc CallBack function of user, @ref TIMER_CallBackFunc + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_TIMER_RegisterCallback(TIMER_Handle *handle, TIMER_InterruptType typeID, + TIMER_CallBackFunc callBackFunc) +{ + TIMER_ASSERT_PARAM(handle != NULL); + TIMER_ASSERT_PARAM(callBackFunc != NULL); + TIMER_ASSERT_PARAM(IsTimerInterruptType(typeID)); + + /* Registers the user callback function. */ + switch (typeID) { + case TIMER_OVER_FLOW: + handle->userCallBack.TimerOverFlowCallBack = callBackFunc; /* User DMA request overflow function */ + break; + case TIMER_PERIOD_FIN: + handle->userCallBack.TimerPeriodFinCallBack = callBackFunc; /* User timer period finish call back. */ + break; + default: + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief Unregister the callback function of TIMER handle. + * @param handle Timer Handle + * @param typeID CallBack function of user, @ref TIMER_InterruptType + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_TIMER_UnRegisterCallback(TIMER_Handle *handle, TIMER_InterruptType typeID) +{ + TIMER_ASSERT_PARAM(handle != NULL); + /* Determine the callback function type. */ + switch (typeID) { + case TIMER_PERIOD_FIN: + handle->userCallBack.TimerPeriodFinCallBack = NULL; /* Periodic callback for timer period finish. */ + break; + case TIMER_OVER_FLOW: + handle->userCallBack.TimerOverFlowCallBack = NULL; /* Periodic callback for timer DMA over flow. */ + break; + default: + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/timer/src/timer_ex.c b/vendor/others/demo/5-tim_adc/demo/drivers/timer/src/timer_ex.c new file mode 100644 index 000000000..b74d4bfe4 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/timer/src/timer_ex.c @@ -0,0 +1,57 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file timer_ex.c + * @author MCU Driver Team + * @brief TIMER module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the TIMER. + * + Implementation of extended functions of the timer module + */ + +#include "timer_ex.h" + +/** + * @brief Setting DMA request overflow interrupt. + * @param handle Timer Handle + * @param bool enable or disable interrupt of DMA request overflow. + * @retval None + */ +void HAL_TIMER_DMARequestOverFlowEx(TIMER_Handle *handle, bool overFlowSet) +{ + TIMER_ASSERT_PARAM(handle != NULL); + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + handle->baseAddress->TIMERx_CONTROL.BIT.dmaovintenable = overFlowSet; + return; +} + +/** + * @brief Timer Trigger ADC Set + * @param handle Timer Handle + * @param enable 0: disable 1: enable + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_TIMER_TriggerAdcEx(TIMER_Handle *handle, bool enable) +{ + TIMER_ASSERT_PARAM(handle != NULL); + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + + handle->baseAddress->TIMERx_CONTROLB.BIT.socen = enable; + + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/tsensor/common/inc/tsensor.h b/vendor/others/demo/5-tim_adc/demo/drivers/tsensor/common/inc/tsensor.h new file mode 100644 index 000000000..754e7791a --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/tsensor/common/inc/tsensor.h @@ -0,0 +1,53 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file tsensor.h + * @author MCU Driver Team + * @brief tsensor module driver + * @details This file provides API to manage tsensor. + */ + +/* Macro definitions */ +#ifndef McuMagicTag_TSENSOR_H +#define McuMagicTag_TSENSOR_H + +#include "tsensor_ip.h" + +/** + * @defgroup TSENSOR TSENSOR + * @brief TSENSOR module. + * @{ + */ + +/** + * @defgroup TSENSOR_Common TSENSOR Common + * @brief TSENSOR common external module. + * @{ + */ + +void HAL_TSENSOR_Init(void); +void HAL_TSENSOR_Deinit(void); +unsigned int HAL_TSENSOR_GetResult(void); +float HAL_TSENSOR_GetTemperature(void); +/** + * @} + */ + +/** + * @} + */ +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/tsensor/inc/tsensor_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/tsensor/inc/tsensor_ip.h new file mode 100644 index 000000000..2b6c7e49f --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/tsensor/inc/tsensor_ip.h @@ -0,0 +1,80 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file tsensor_ip.h + * @author MCU Driver Team + * @brief tsensor module driver + * @details This file provides dcl functions to manage tsensor and definition of + * specific parameters. + */ + +/* Macro definitions */ +#ifndef McuMagicTag_TSENSOR_IP_H +#define McuMagicTag_TSENSOR_IP_H + +#include "baseinc.h" + +/** + * @addtogroup TSENSOR + * @{ + */ + +/** + * @defgroup TSENSOR_IP TSENSOR_IP + * @brief TSENSOR_IP: tsensor_v1. + * @{ + */ + +/** + * @brief Define the union TSENSOR_CTRL_REG. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_tsensor_pd : 1; /* Enable switch bit */ + unsigned int reserved0 : 31; + } BIT; +} volatile TSENSOR_CTRL_REG; + +/** + * @brief Define the union TSENSOR_TRIM_REG. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cfg_tsensor_trim : 8; /* trim infomation */ + unsigned int reserved0 : 24; + } BIT; +} volatile TSENSOR_TRIM_REG; + +/** + * @brief Define the tsensor resistor struct. + */ +typedef struct { + TSENSOR_CTRL_REG TSENSOR_CTRL; /**< Offset address: 0x00000000U */ + unsigned char space0[12]; + TSENSOR_TRIM_REG TSENSOR_TRIM; /**< Offset address: 0x00000010U */ +} volatile TSENSOR_RegStruct; + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_TSENSOR_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/tsensor/src/tsensor.c b/vendor/others/demo/5-tim_adc/demo/drivers/tsensor/src/tsensor.c new file mode 100644 index 000000000..65966092d --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/tsensor/src/tsensor.c @@ -0,0 +1,152 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file tsensor.c + * @author MCU Driver Team + * @brief tsensor module driver + * @details This file provides functions to manage tsensor and definition of + * specific parameters. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "crg.h" +#include "adc.h" +#include "fotp_info_read.h" +#include "anatrim.h" +#include "tsensor.h" + +#define NUM 16 +#define TSENSOR_SOC_NUM ADC_SOC_NUM15 /* This parameter can be modified according to the actual situation */ + +/** + * @brief ADC for tsensor clock initialization. + * @param None. + * @retval None. + */ +static void ADC_ClkEnable(void) +{ + unsigned int status = BASE_CFG_UNSET; + HAL_CRG_IpEnableGet(ADC0_BASE, &status); /* Check whether the ADC clock is enabled */ + if (status != IP_CLK_ENABLE) { + HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); + HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_2); + } +} + +/** + * @brief ADC for tsensor sample configuration. + * @param None. + * @retval None. + */ +static void TSENSOR_SampleConfigure(void) +{ + ADC_Handle adcHandle = {0}; + adcHandle.baseAddress = ADC0; + adcHandle.socPriority = ADC_PRIMODE_ALL_ROUND; + HAL_ADC_Init(&adcHandle); /* ADC ADC initialization */ + + SOC_Param socParam = {0}; + socParam.adcInput = ADC_CH_ADCINA16; + socParam.sampleTotalTime = ADC_SOCSAMPLE_5CLK; + socParam.trigSource = ADC_TRIGSOC_SOFT; + socParam.continueMode = BASE_CFG_DISABLE; + socParam.finishMode = ADC_SOCFINISH_NONE; + unsigned int soc = TSENSOR_SOC_NUM; + HAL_ADC_ConfigureSoc(&adcHandle, soc, &socParam); /* ADC_CH_ADCINA16 Sampling Configuration */ + + TSENSOR_RegStruct *tsensor; + tsensor = TSENSOR; + tsensor->TSENSOR_CTRL.BIT.cfg_tsensor_pd = 0x0; + BASE_FUNC_DELAY_US(40); /* waite for 40us until stable */ +} + +/** + * @brief ADC Results Converted to Temperature. + * @param digital digital parameter of tsensor. + * @retval Temperature type: float, temperature of MCU, unit: ℃. + */ +static float TSENSOR_Conversion(unsigned int digital) +{ + float curV = ((float)digital / 4096.0f) * 3.3f; /* 4096.0 and 3.3 for voltage conversion */ + /* 1.228f and 25.0f are used as parameters to calculate result */ + float curTemp = (curV - 1.228f) / g_tsensorGain + 25.0f; + return curTemp; +} + +/** + * @brief Configuration of tsensor. + * @param None. + * @retval None. + */ +void HAL_TSENSOR_Init(void) +{ + ADC_ClkEnable(); + TSENSOR_SampleConfigure(); +} + +/** + * @brief Deinitialize of tsensor. + * @param None. + * @retval None. + */ +void HAL_TSENSOR_Deinit(void) +{ + TSENSOR_RegStruct *tsensor; + tsensor = TSENSOR; + tsensor->TSENSOR_CTRL.BIT.cfg_tsensor_pd = 0x1; +} + + +/** + * @brief Get the result from the tsensor. + * @param None. + * @retval result of tsensor. + */ +unsigned int HAL_TSENSOR_GetResult(void) +{ + unsigned int ret = 0; + unsigned int count = 0; + for (unsigned int i = 0; i < NUM; i++) { + unsigned int socRet; + DCL_ADC_SOCxSoftTrigger(ADC0, TSENSOR_SOC_NUM); + BASE_FUNC_DELAY_MS(1); /* waite for 1ms until conversion finish */ + DCL_ADC_GetConvState(ADC0, TSENSOR_SOC_NUM); + if (DCL_ADC_GetConvState(ADC0, TSENSOR_SOC_NUM) != BASE_CFG_UNSET) { + socRet = DCL_ADC_ReadSOCxResult(ADC0, TSENSOR_SOC_NUM); + ret += socRet; + count++; + DCL_ADC_ResetConvState(ADC0, TSENSOR_SOC_NUM); /* Set the sampling completion flag */ + } + } + if (count == 0) { + return 0xFFF; + } + return (ret / count); /* Average the results */ +} + +/** + * @brief Get the temperature from the tsensor. + * @param None. + * @retval Temperature type: float, temperature of MCU, unit: ℃. + */ +float HAL_TSENSOR_GetTemperature(void) +{ + unsigned int result = HAL_TSENSOR_GetResult(); + float temp = TSENSOR_Conversion(result); + return temp; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/uart/common/inc/uart.h b/vendor/others/demo/5-tim_adc/demo/drivers/uart/common/inc/uart.h new file mode 100644 index 000000000..a80401c9f --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/uart/common/inc/uart.h @@ -0,0 +1,134 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file uart.h + * @author MCU Driver Team + * @brief UART module driver. + * @details This file provides functions declaration of the UART, + * + Initialization and de-initialization functions + * + Peripheral querying the state functions. + * + Peripheral transmit and abort functions. + * + Peripheral interrupt service and callback registration functions. + * This file also provides the definition of the UART handle structure. + */ + +/* Includes ------------------------------------------------------------------*/ +#ifndef McuMagicTag_UART_H +#define McuMagicTag_UART_H + +#include "uart_ip.h" +#include "dma.h" + +/** + * @defgroup UART UART + * @brief UART module. + * @{ + */ + +/** + * @defgroup UART_Common UART Common + * @brief UART common external module. + * @{ + */ + +/** + * @defgroup UART_Handle_Definition UART Handle Definition + * @{ + */ + +/** + * @brief The definition of the UART handle structure. + */ +typedef struct _UART_Handle { + UART_RegStruct *baseAddress; /**< UART registers base address */ + unsigned int baudRate; /**< UART communication baud rate */ + UART_DataLength dataLength; /**< The length of UART frame */ + UART_StopBits stopBits; /**< The stop bit of UART frame */ + UART_Parity_Mode parity; /**< The parity bit of UART frame */ + UART_Transmit_Mode txMode; /**< Tx transmit mode setting */ + UART_Transmit_Mode rxMode; /**< tx transmit mode setting */ + volatile unsigned char *txbuff; /**< Start address of tx */ + volatile unsigned char *rxbuff; /**< Start address of rx */ + volatile unsigned int txBuffSize; /**< The length of tx buff */ + volatile unsigned int rxBuffSize; /**< The length of rx buff */ + bool fifoMode; /**< The FIFO mode */ + UART_FIFO_Threshold fifoTxThr; /**< Interrupt threshold of tx FIFO */ + UART_FIFO_Threshold fifoRxThr; /**< Interrupt threshold of rx FIFO */ + UART_HW_FlowCtr hwFlowCtr; /**< UART hardware flow control */ + DMA_Handle *dmaHandle; /**< UART_DMA control */ + unsigned int uartDmaTxChn; /**< UART_DMA tx channel */ + unsigned int uartDmaRxChn; /**< UART_DMA rx channel */ + volatile UART_State_Type txState; /**< The tx status of UART */ + volatile UART_State_Type rxState; /**< The rx status of UART */ + UART_Error_Type errorType; /**< The error of UART */ + + UART_UserCallBack userCallBack; /**< User callback function of UART. */ + UART_ExtendHandle handleEx; /**< UART extend handle. */ +} UART_Handle; + +typedef void (* UART_CallbackType)(void *handle); +/** + * @} + */ + +/** + * @defgroup UART_API_Declaration UART HAL API + * @{ + */ +/* Peripheral initialization and deinitialize functions */ +BASE_StatusType HAL_UART_Init(UART_Handle *uartHandle); +BASE_StatusType HAL_UART_DeInit(UART_Handle *uartHandle); + +/* Peripheral querying the state functions */ +UART_State_Type HAL_UART_GetState(UART_Handle *uartHandle); + +/* Peripheral transmit and abort functions */ +BASE_StatusType HAL_UART_WriteBlocking(UART_Handle *uartHandle, unsigned char *srcData, + unsigned int dataLength, unsigned int blockingTime); +BASE_StatusType HAL_UART_WriteIT(UART_Handle *uartHandle, unsigned char *srcData, unsigned int dataLength); +BASE_StatusType HAL_UART_WriteDMA(UART_Handle *uartHandle, unsigned char *srcData, + unsigned int dataLength); +BASE_StatusType HAL_UART_ReadBlocking(UART_Handle *uartHandle, unsigned char *saveData, + unsigned int dataLength, unsigned int blockingTime); +BASE_StatusType HAL_UART_ReadIT(UART_Handle *uartHandle, unsigned char *saveData, unsigned int dataLength); +BASE_StatusType HAL_UART_ReadDMA(UART_Handle *uartHandle, unsigned char *saveData, + unsigned int dataLength); +BASE_StatusType HAL_UART_StopRead(UART_Handle *uartHandle); +BASE_StatusType HAL_UART_StopWrite(UART_Handle *uartHandle); + +/* brief Peripheral interrupt service and callback registration functions */ +void HAL_UART_IrqHandler(void *handle); +BASE_StatusType HAL_UART_RegisterCallBack(UART_Handle *uartHandle, UART_CallbackFun_Type typeID, + UART_CallbackType pCallback); + +/* UART read using DMA cyclically stored function */ +BASE_StatusType HAL_UART_ReadDMAAndCyclicallyStored(UART_Handle *uartHandle, unsigned char *saveData, + DMA_LinkList *tempNode, unsigned int dataLength); +unsigned int HAL_UART_ReadDMAGetPos(UART_Handle *uartHandle); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_UART_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/uart/inc/uart_ex.h b/vendor/others/demo/5-tim_adc/demo/drivers/uart/inc/uart_ex.h new file mode 100644 index 000000000..12219f092 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/uart/inc/uart_ex.h @@ -0,0 +1,65 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file uart_ex.h + * @author MCU Driver Team + * @brief UART module driver. + * @details This file provides functions declaration of the UART, + * + Initialization and de-initialization functions + * + Peripheral querying the state functions. + * + Peripheral transmit and abort functions. + * + Peripheral interrupt service and callback registration functions. + * This file also provides the definition of the UART handle structure. + */ + +/* Includes ------------------------------------------------------------------*/ +#ifndef McuMagicTag_UART_EX_H +#define McuMagicTag_UART_EX_H + +#include "uart.h" + +/** + * @addtogroup UART_IP + * @{ + */ + +/** + * @defgroup UART_EX_API_Declaration UART HAL API EX + * @{ + */ +BASE_StatusType HAL_UART_OpenCharacterMatchEx(UART_Handle *uartHandle, unsigned char ch); + +BASE_StatusType HAL_UART_CloseCharacterMatchEx(UART_Handle *uartHandle); + +BASE_StatusType HAL_UART_EnableBaudDetectionEx(UART_Handle *uartHandle); + +BASE_StatusType HAL_UART_DisableBaudDetectionEx(UART_Handle *uartHandle); + +BASE_StatusType HAL_UART_SetRxWaiteTimeEx(UART_Handle *uartHandle, unsigned int cntOfBit); + +BASE_StatusType HAL_UART_SetOversampleMultipleEx(UART_Handle *uartHandle, UART_OversampleMultiple multiple); + +BASE_StatusType HAL_UART_SetDataSequenceModeEx(UART_Handle *uartHandle, UART_SequenceMode mode); + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_UART_EX_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/uart/inc/uart_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/uart/inc/uart_ip.h new file mode 100644 index 000000000..006cdaf3b --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/uart/inc/uart_ip.h @@ -0,0 +1,1118 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file uart_ip.h + * @author MCU Driver Team + * @brief UART module driver + * @details This file provides DCL functions to manage UART and Definition of + * specific parameters. + * + Definition of UART configuration parameters. + * + UART register mapping structure. + * + Parameters check functions. + * + Direct configuration layer interface. + */ + +/* Macro definitions */ +#ifndef McuMagicTag_UART_IP_H +#define McuMagicTag_UART_IP_H + +#include "baseinc.h" + +#ifdef UART_PARAM_CHECK +#define UART_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define UART_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define UART_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define UART_ASSERT_PARAM(para) ((void)0U) +#define UART_PARAM_CHECK_NO_RET(para) ((void)0U) +#define UART_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +#define UART_FIFOFULL_ONE_TWO 0x0000000FU +#define UART_FIFOFULL_ONE_EIGHT 0x00000008U + +/** + * @addtogroup UART + * @{ + */ + +/** + * @defgroup UART_IP UART_IP + * @brief UART_IP: uart_v1 + * @{ + */ + +/** + * @defgroup UART_Param_Def UART Parameters Definition + * @brief Definition of UART configuration parameters. + * @{ + */ + +/** + * @brief UART def of oversampling + */ +typedef enum { + UART_OVERSAMPLING_16X = 0x00000000U, + UART_OVERSAMPLING_15X = 0x00000001U, + UART_OVERSAMPLING_14X = 0x00000002U, + UART_OVERSAMPLING_13X = 0x00000003U, + UART_OVERSAMPLING_12X = 0x00000004U, +} UART_OversampleMultiple; + +/** + * @brief Extent handle definition of UART + */ +typedef struct { + UART_OversampleMultiple overSampleMultiple; /**< Oversampling multiplier */ + bool msbFirst; /**< Configures data transmission sequence */ +} UART_ExtendHandle; + +/** + * @brief Type ID of callback function registered by the user. + */ +typedef enum { + UART_WRITE_IT_FINISH = 0x00000000U, + UART_READ_IT_FINISH = 0x00000001U, + UART_WRITE_DMA_FINISH = 0x00000002U, + UART_READ_DMA_FINISH = 0x00000003U, + UART_TRNS_IT_ERROR = 0x00000004U, + UART_TRNS_DMA_ERROR = 0x00000005U, + UART_BAUD_DETECT_FINISH = 0x00000006U, + UART_BAUD_DETECT_ERROR = 0x00000007U, + UART_CHARACTER_MATCH = 0x00000008U +} UART_CallbackFun_Type; + +/** + * @brief User Callback Function Definition + */ +typedef struct { + void (* WriteItFinishCallBack)(void *handle); /**< UART tx interrupt complete callback + function for users */ + void (* ReadItFinishCallBack)(void *handle); /**< UART rx interrupt complete callback + function for users */ + void (* WriteDmaFinishCallBack)(void *handle); /**< UART tx DMA complete callback function + for users */ + void (* ReadDmaFinishCallBack)(void *handle); /**< UART rx DMA complete callback function + for users */ + void (* TransmitItErrorCallBack)(void *handle); /**< UART interrupt mode error callback + function for users */ + void (* TransmitDmaErrorCallBack)(void *handle); /**< UART interrupt mode error callback + function for users */ + void (* BaudDetectSuccessCallBack)(void *handle); /**< Callback function for successful + UART baud rate detection */ + void (* BaudDetectErrorCallBack)(void *handle); /**< UART baud rate detection failure + callback function */ + void (* CharacterMatchCallBack)(void *handle); /**< UART character matching callback + function. */ +}UART_UserCallBack; + +/** + * @brief Type of error callback functuions. + */ +typedef enum { + UART_ERROR_FRAME = 0x00000080U, + UART_ERROR_PARITY = 0x00000100U, + UART_ERROR_BREAK = 0x00000200U, + UART_ERROR_OVERFLOW = 0x00000400U +} UART_Error_Type; + +/** + * @brief The number of data bits transmitted or received in a frame. + */ +typedef enum { + UART_DATALENGTH_5BIT = 0x00000000U, + UART_DATALENGTH_6BIT = 0x00000001U, + UART_DATALENGTH_7BIT = 0x00000002U, + UART_DATALENGTH_8BIT = 0x00000003U +} UART_DataLength; + +/** + * @brief UART parity mode. + * @details parity mode: + * + UART_PARITY_ODD -- odd check + * + UART_PARITY_EVEN -- even check + * + UART_PARITY_NONE -- none odd or even check + * + UART_PARITY_MARK -- mark check + * + UART_PARITY_SPACE -- space check + */ +typedef enum { + UART_PARITY_ODD = 0x00000000U, + UART_PARITY_EVEN = 0x00000001U, + UART_PARITY_MARK = 0x00000002U, + UART_PARITY_SPACE = 0x00000003U, + UART_PARITY_NONE = 0x00000004U +} UART_Parity_Mode; + +/** + * @brief Stop bit setting. + * @details Stop bit type: + * + UART_STOPBITS_ONE -- frame with one stop bit + * + UART_STOPBITS_TWO -- frame with two stop bits + */ +typedef enum { + UART_STOPBITS_ONE = 0x00000000U, + UART_STOPBITS_TWO = 0x00000001U +} UART_StopBits; + +/** + * @brief Three transmit mode: blocking, DMA, interrupt. + */ +typedef enum { + UART_MODE_BLOCKING = 0x00000000U, + UART_MODE_INTERRUPT = 0x00000001U, + UART_MODE_DMA = 0x00000002U, + UART_MODE_DISABLE = 0x00000003U +} UART_Transmit_Mode; + +/** + * @brief Hardware flow control mode disable/enable. + */ +typedef enum { + UART_HW_FLOWCTR_DISABLE = 0x00000000U, + UART_HW_FLOWCTR_ENABLE = 0x00000001U +} UART_HW_FlowCtr; + +/** + * @brief UART running status: deinit, ready, busy, busy(TX), busy(RX). + */ +typedef enum { + UART_STATE_NONE_INIT = 0x00000000U, + UART_STATE_READY = 0x00000001U, + UART_STATE_BUSY = 0x00000002U, + UART_STATE_BUSY_TX = 0x00000003U, + UART_STATE_BUSY_RX = 0x00000004U, +} UART_State_Type; + +/** + * @brief UART RX/TX FIFO line interrupt threshold. An interrupt is triggered when the received or discovered data + * crosses the FIFO threshold. + * @details Description: + * + UART_FIFODEPTH_SIZE0 -- rxFIFO >= 0 Bytes, txFIFO <= 0 Bytes + * + UART_FIFODEPTH_SIZE1 -- rxFIFO >= 1 Bytes, txFIFO <= 1 Bytes + * + UART_FIFODEPTH_SIZE2 -- rxFIFO >= 2 Bytes, txFIFO <= 2 Bytes + * + UART_FIFODEPTH_SIZE3 -- rxFIFO >= 3 Bytes, txFIFO <= 3 Bytes + * + UART_FIFODEPTH_SIZE4 -- rxFIFO >= 4 Bytes, txFIFO <= 4 Bytes + * + UART_FIFODEPTH_SIZE5 -- rxFIFO >= 5 Bytes, txFIFO <= 5 Bytes + * + UART_FIFODEPTH_SIZE6 -- txFIFO <= 6 Bytes, txFIFO <= 6 Bytes + * + UART_FIFODEPTH_SIZE7 -- txFIFO <= 7 Bytes, txFIFO <= 7 Bytes + * + UART_FIFODEPTH_SIZE8 -- txFIFO <= 8 Bytes, txFIFO <= 8 Bytes + * + UART_FIFODEPTH_SIZE9 -- txFIFO <= 9 Bytes, txFIFO <= 9 Bytes + * + UART_FIFODEPTH_SIZE10 -- txFIFO <= 10 Bytes, txFIFO <= 10 Bytes + * + UART_FIFODEPTH_SIZE11 -- txFIFO <= 11 Bytes, txFIFO <= 11 Bytes + * + UART_FIFODEPTH_SIZE12 -- txFIFO <= 12 Bytes, txFIFO <= 12 Bytes + * + UART_FIFODEPTH_SIZE13 -- txFIFO <= 13 Bytes, txFIFO <= 13 Bytes + * + UART_FIFODEPTH_SIZE14 -- txFIFO <= 14 Bytes, txFIFO <= 14 Bytes + * + UART_FIFODEPTH_SIZE15 -- txFIFO <= 15 Bytes, txFIFO <= 15 Bytes + */ +typedef enum { + UART_FIFODEPTH_SIZE0 = 0x00000000U, + UART_FIFODEPTH_SIZE1 = 0x00000001U, + UART_FIFODEPTH_SIZE2 = 0x00000002U, + UART_FIFODEPTH_SIZE3 = 0x00000003U, + UART_FIFODEPTH_SIZE4 = 0x00000004U, + UART_FIFODEPTH_SIZE5 = 0x00000005U, + UART_FIFODEPTH_SIZE6 = 0x00000006U, + UART_FIFODEPTH_SIZE7 = 0x00000007U, + UART_FIFODEPTH_SIZE8 = 0x00000008U, + UART_FIFODEPTH_SIZE9 = 0x00000009U, + UART_FIFODEPTH_SIZE10 = 0x0000000AU, + UART_FIFODEPTH_SIZE11 = 0x0000000BU, + UART_FIFODEPTH_SIZE12 = 0x0000000CU, + UART_FIFODEPTH_SIZE13 = 0x0000000DU, + UART_FIFODEPTH_SIZE14 = 0x0000000EU, + UART_FIFODEPTH_SIZE15 = 0x0000000FU +} UART_FIFO_Threshold; + +/** + * @brief UART data transfer sequence. + */ +typedef enum { + UART_SEQUENCE_START_LSB = 0x00000000U, + UART_SEQUENCE_START_MSB = 0x00000001U, +} UART_SequenceMode; + +/** + * @} + */ + +/** + * @defgroup UART_Reg_Def UART Register Definition + * @brief register mapping structure + * @{ + */ + +/** + * @brief UART data register, which stores the RX data and TX data and reads the RX status from this register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int data : 8; /**< Receives data and transmits data. */ + unsigned int fe : 1; /**< Frame error. */ + unsigned int pe : 1; /**< Verification error. */ + unsigned int be : 1; /**< Break error. */ + unsigned int oe : 1; /**< Overflow error. */ + unsigned int reserved0 : 20; + } BIT; +} volatile UART_DR_REG; + +/** + * @brief Receive status register/error clear register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int fe : 1; /**< Frame error. */ + unsigned int pe : 1; /**< Verification error. */ + unsigned int be : 1; /**< Break error. */ + unsigned int oe : 1; /**< Overflow error. */ + unsigned int reserved0 : 28; + } BIT; +} volatile UART_RSR_REG; + +/** + * @brief UART flag register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int cts : 1; /**< Hardware flow control status. */ + unsigned int reserved0 : 2; + unsigned int busy : 1; /**< UART busy/idle status bit. */ + unsigned int rxfe : 1; /**< RX FIFO empty flag. */ + unsigned int txff : 1; /**< TX FIFO full flag. */ + unsigned int rxff : 1; /**< RX FIFO full flag. */ + unsigned int txfe : 1; /**< TX FIFO empty flag. */ + unsigned int reserved1 : 24; + } BIT; +} volatile UART_FR_REG; + +/** + * @brief Integer baud rate register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int bauddivint : 16; /**< Integer baud rate divider value. */ + unsigned int reserved0 : 16; + } BIT; +} volatile UART_IBRD_REG; + +/** + * @brief Fractional baud rate register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int bauddivfrac : 6; /**< Fractional baud rate divider. */ + unsigned int reserved0 : 26; + } BIT; +} volatile UART_FBRD_REG; + +/** + * @brief Line control register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int brk : 1; /**< Send a break. */ + unsigned int pen : 1; /**< Check select bit. */ + unsigned int eps : 1; /**< Parity check selection during transmission and reception. */ + unsigned int stp2 : 1; /**< TX frame tail stop bit select. */ + unsigned int fen : 1; /**< TX and RX FIFO enable control. */ + unsigned int wlen : 2; /**< Indicates the number of transmitted and received data bits in a frame. */ + unsigned int sps : 1; /**< Select stick parity. */ + unsigned int reserved0 : 24; + } BIT; +} volatile UART_LCR_H_REG; + +/** + * @brief UART_CR is a UART control register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int uarten : 1; /**< UART enable. */ + unsigned int reserved0 : 6; + unsigned int lbe : 1; /**< Indicates whether to enable loopback. */ + unsigned int txe : 1; /**< UART TX enable. */ + unsigned int rxe : 1; /**< UART RX enable. */ + unsigned int dtr : 1; /**< UART time run. */ + unsigned int rts : 1; /**< Request to send. */ + unsigned int reserved1 : 2; + unsigned int rtsen : 1; /**< RTS hardware flow control enable. */ + unsigned int ctsen : 1; /**< CTS hardware flow control enable. */ + unsigned int reserved2 : 16; + } BIT; +} volatile UART_CR_REG; + +/** + * @brief Interrupt FIFO threshold select register. + * It is used to set the FIFO interrupt trigger threshold (UART_TXinTR or UART_RXinTR). + */ +typedef union { + unsigned int reg; + struct { + unsigned int txiflsel : 4; /**< Configure the threshold of the TX FIFO. */ + unsigned int reserved0 : 4; + unsigned int rxiflsel : 4; /**< RX FIFO threshold. */ + unsigned int reserved1 : 20; + } BIT; +} volatile UART_IFLS_REG; + +/** + * @brief Interrupt mask register, which is used to mask interrupts. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 1; + unsigned int ctsmim : 1; /**< Mask status of the CTS interrupt. */ + unsigned int reserved1 : 2; + unsigned int rxim : 1; /**< Mask status of the RX interrupt. */ + unsigned int txim : 1; /**< Mask status of the TX interrupt. */ + unsigned int rtim : 1; /**< Mask status of the RX timeout interrupt. */ + unsigned int feim : 1; /**< Mask status of the frame error interrupt. */ + unsigned int peim : 1; /**< Mask status of the parity interrupt. */ + unsigned int beim : 1; /**< Mask status of the break error interrupt. */ + unsigned int oeim : 1; /**< Mask status of the overflow error interrupt. */ + unsigned int reserved2 : 1; + unsigned int txfeim : 1; /**< Mask status of the TX FIFO empty interrupt. */ + unsigned int txfneim : 1; /**< Mask status of the TX FIFO non-empt interrupt. */ + unsigned int txtcim : 1; /**< Mask status of the TX completion interrupt. */ + unsigned int reserved3 : 1; + unsigned int rxfeim : 1; /**< Mask status of the RX FIFO empty interrupt. */ + unsigned int rxfneim : 1; /**< Mask status of the RX FIFO non-empt interrupt. */ + unsigned int rxffim : 1; /**< Mask status of the RX FIFO full interrupt. */ + unsigned int abdcim : 1; /**< Mask status of the auto-baud check completion interrupt. */ + unsigned int abdeim : 1; /**< Mask status of auto-baud detection error interrupts. */ + unsigned int cmim : 1; /**< Mask status of the character match success interrupt. */ + unsigned int reserved4 : 10; + } BIT; +} volatile UART_IMSC_REG; + +/** + * @brief Raw interrupt status register. The content of this register is not affected by interrupt mask register. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 1; + unsigned int ctsmis : 1; /**< Raw CTS interrupt status. */ + unsigned int reserved1 : 2; + unsigned int rxris : 1; /**< Raw RX threshold interrupt status. */ + unsigned int txris : 1; /**< Original TX threshold interrupt status. */ + unsigned int rtris : 1; /**< Raw RX timeout interrupt status. */ + unsigned int feris : 1; /**< Raw frame error interrupt status. */ + unsigned int peris : 1; /**< Raw parity interrupt status. */ + unsigned int beris : 1; /**< Raw break error interrupt status. */ + unsigned int oeris : 1; /**< Raw overflow error interrupt status. */ + unsigned int reserved2 : 1; + unsigned int txferis : 1; /**< Original TX FIFO empty interrupt status. */ + unsigned int txfneris : 1; /**< Raw TX FIFO non-empty interrupt status. */ + unsigned int txtcris : 1; /**< Raw TX completion interrupt status. */ + unsigned int reserved3 : 1; + unsigned int rxferis : 1; /**< Raw RX FIFO empty interrupt status. */ + unsigned int rxfneris : 1; /**< Raw RX FIFO non-empty interrupt status. */ + unsigned int rxffris : 1; /**< Status of the raw RX FIFO full interrupt. */ + unsigned int abdcris : 1; /**< Raw auto-baud detection completion interrupt status. */ + unsigned int abderis : 1; /**< Raw auto-baud detection error interrupt status. */ + unsigned int cmris : 1; /**< Status of the original character matching success interrupt. */ + unsigned int reserved4 : 10; + } BIT; +} volatile UART_RIS_REG; + +/** + * @brief Masked interrupt status register. + * It is result of AND operation between raw interrupt status and interrupt mask. + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 1; + unsigned int ctsmmis : 1; /**< Masked CTS interrupt status. */ + unsigned int reserved1 : 2; + unsigned int rxmis : 1; /**< Masked RX interrupt status. */ + unsigned int txmis : 1; /**< Masked TX interrupt status. */ + unsigned int rtmis : 1; /**< Masked RX timeout interrupt status. */ + unsigned int femis : 1; /**< Status of masked frame error interrupts. */ + unsigned int pemis : 1; /**< Masked parity interrupt status. */ + unsigned int bemis : 1; /**< Status of masked break error interrupts. */ + unsigned int oemis : 1; /**< Masked overflow error interrupt status. */ + unsigned int reserved2 : 1; + unsigned int txfeis : 1; /**< Masked TX FIFO empty interrupt status. */ + unsigned int txfneis : 1; /**< Status of the masked TX FIFO non-empty interrupt. */ + unsigned int txtcis : 1; /**< Masked TX completion interrupt status. */ + unsigned int reserved3 : 1; + unsigned int rxfeis : 1; /**< Masked RX FIFO empty interrupt status. */ + unsigned int rxfneis : 1; /**< Status of the masked RX FIFO non-empt interrupt. */ + unsigned int rxffis : 1; /**< Status of the masked RX FIFO full interrupt. */ + unsigned int abdcis : 1; /**< Status of the masked auto-baud check completion interrupt. */ + unsigned int abdeis : 1; /**< Status of masked auto-baud detection error interrupts. */ + unsigned int cmis : 1; /**< Masked character matching success interrupt status. */ + unsigned int reserved4 : 10; + } BIT; +} volatile UART_MIS_REG; + +/** + * @brief Interrupt clear register + */ +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 1; + unsigned int ctsmic : 1; /**< Clears the CTS interrupt. */ + unsigned int reserved1 : 2; + unsigned int rxic : 1; /**< Clears the RX interrupt. */ + unsigned int txic : 1; /**< Clears the TX interrupt. */ + unsigned int rtic : 1; /**< Receive timeout interrupt clear. */ + unsigned int feic : 1; /**< Frame error interrupt clear. */ + unsigned int peic : 1; /**< Clears the parity interrupt. */ + unsigned int beic : 1; /**< Clears the break error interrupt. */ + unsigned int oeic : 1; /**< Clears the overflow error interrupt. */ + unsigned int reserved2 : 1; + unsigned int txfeic : 1; /**< Clears the TX FIFO empty interrupt status. */ + unsigned int txfneic : 1; /**< TX FIFO non-empty interrupt clear status. */ + unsigned int txtcic : 1; /**< Transmit completion interrupt clear status. */ + unsigned int reserved3 : 1; + unsigned int rxfeic : 1; /**< RX FIFO empty interrupt clear status. */ + unsigned int rxfneic : 1; /**< RX FIFO non-empty interrupt clear status. */ + unsigned int rxffic : 1; /**< RX FIFO full interrupt clear status. */ + unsigned int abdcic : 1; /**< Auto-baud detection completion interrupt clear status. */ + unsigned int abdeic : 1; /**< Auto-baud detection error interrupt clear status. */ + unsigned int cmic : 1; /**< Clears the character matching success interrupt. */ + unsigned int reserved4 : 10; + } BIT; +} volatile UART_ICR_REG; + +/** + * @brief DMA control register, which is used to enable DMA of TX FIFO and RX FIFO. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rxdmae : 1; /** DMA enable control for the RX FIFO. */ + unsigned int txdmae : 1; /** DMA enable control for the TX FIFO. */ + unsigned int dmaonerr : 1; /** DMA enable control for RX channel when UART error interrupt occurs. */ + unsigned int rxlastsreq_en : 1; /** REQ enable for the last data stream supported by the UART RX DMA. */ + unsigned int reserved0 : 28; + } BIT; +} volatile UART_DMACR_REG; + +/** + * @brief Data transfer sequence configuration register. It is used to configure data transfer sequence. + */ +typedef union { + unsigned int reg; + struct { + unsigned int msbfirst : 1; /**< Most significant bit before enable. */ + unsigned int reserved0 : 31; + } BIT; +} volatile UART_DS_REG; + +/** + * @brief RX timeout duration configuration register, which is used to configure conditions for determining RX timeout. + */ +typedef union { + unsigned int reg; + struct { + unsigned int rtcfg : 24; /**< Indicates the receive timeout interval, in bits. */ + unsigned int reserved0 : 8; + } BIT; +} volatile UART_RTCFG_REG; + +/** + * @brief Oversampling configuration register. It is used to configure the oversampling multiple. + */ +typedef union { + unsigned int reg; + struct { + unsigned int spcfg : 4; /**< Configure the oversampling multiplier. */ + unsigned int reserved0 : 28; + } BIT; +} volatile UART_SPCFG_REG; + +/** + * @brief Auto-baud detection enable register. It is used to enable auto-baud detection function. + */ +typedef union { + unsigned int reg; + struct { + unsigned int abden : 1; /**< Auto-baud detection enable. */ + unsigned int reserved0 : 3; + unsigned int abdbusy : 1; /**< Auto-baud detection busy flag. */ + unsigned int abdenvld : 1; /**< The abden sign is already valid. */ + unsigned int reserved1 : 26; + } BIT; +} volatile UART_ABDEN_REG; + +/** + * @brief Character match configuration register, which is used to configure characters to be matched. + */ +typedef union { + unsigned int reg; + struct { + unsigned int chamat : 8; /**< Binary character to be matched. */ + unsigned int reserved0 : 23; + unsigned int cmen : 1; /**< Character match detection enable. */ + } BIT; +} volatile UART_CHARMATCH_REG; + +/** + * @brief Register mapping structure. + */ +typedef struct { + UART_DR_REG UART_DR; /**< Data register, offset address: 0x00000000U */ + UART_RSR_REG UART_RSR; /**< Receiving status/error clearing register, offset address: 0x00000004U */ + unsigned char space0[16]; + UART_FR_REG UART_FR; /**< Flag register, offset address: 0x00000018U */ + unsigned char space1[8]; + UART_IBRD_REG UART_IBRD; /**< Integer baud rate register, offset address: 0x00000024U */ + UART_FBRD_REG UART_FBRD; /**< Fractional baud rate register, offset address: 0x00000028U */ + UART_LCR_H_REG UART_LCR_H; /**< Wire control register, offset address: 0x0000002CU */ + UART_CR_REG UART_CR; /**< Control register, offset address: 0x00000030U */ + UART_IFLS_REG UART_IFLS; /**< Interrupt FIFO threshold register, offset address: 0x00000034U */ + UART_IMSC_REG UART_IMSC; /**< Interrupt mask status register, offset address: 0x00000038U */ + UART_RIS_REG UART_RIS; /**< Raw interrupt status register, offset address: 0x0000003CU */ + UART_MIS_REG UART_MIS; /**< Masked interrupt status register, offset address: 0x00000040U */ + UART_ICR_REG UART_ICR; /**< Interrupt clear register, offset address: 0x00000044U */ + UART_DMACR_REG UART_DMACR; /**< DMA control register register, offset address: 0x00000048U */ + unsigned char space2[4]; + UART_DS_REG UART_DS; /**< Data transfer sequence set register, offset address: 0x00000050U */ + UART_RTCFG_REG UART_RTCFG; /**< RX timeout duration configuration register, offset address: 0x00000054U */ + UART_SPCFG_REG UART_SPCFG; /**< Oversampling configuration register, offset address: 0x00000058U */ + UART_ABDEN_REG UART_ABDEN; /**< Auto-baud detection enable register, offset address: 0x0000005CU */ + UART_CHARMATCH_REG UART_CHARMATCH; /**< Character match configuration register, offset address: 0x00000060U */ +} volatile UART_RegStruct; +/** + * @} + */ + +/** + * @brief Check UART datalength parameter. + * @param datalength The number of data bits in a frame, @ref UART_DataLength + * @retval bool + */ +static inline bool IsUartDatalength(UART_DataLength datalength) +{ + return (datalength >= UART_DATALENGTH_5BIT) && (datalength <= UART_DATALENGTH_8BIT); +} + +/** + * @brief Check UART stopbits parameter. + * @param stopbits The number of stop bits in a frame, @ref UART_StopBits + * @retval bool + */ +static inline bool IsUartStopbits(UART_StopBits stopbits) +{ + return (stopbits == UART_STOPBITS_ONE) || (stopbits == UART_STOPBITS_TWO); +} + +/** + * @brief Check UART paritymode parameter. + * @param paritymode UART parity check mode, @ref UART_Parity_Mode + * @retval bool + */ +static inline bool IsUartParitymode(UART_Parity_Mode paritymode) +{ + if ((paritymode >= UART_PARITY_ODD) && (paritymode <= UART_PARITY_NONE)) { + return true; + } + return false; +} + +/** + * @brief Check UART transmode parameter. + * @param transmode Transmit mode, @ref UART_Transmit_Mode + * @retval bool + */ +static inline bool IsUartTransmode(UART_Transmit_Mode transmode) +{ + if ((transmode == UART_MODE_BLOCKING) || + (transmode == UART_MODE_INTERRUPT) || + (transmode == UART_MODE_DMA) || + (transmode == UART_MODE_DISABLE)) { + return true; + } + return false; +} + +/** + * @brief Check UART fifoThreshold parameter. + * @param fifoThreshold UART TX/RX FIFO line interrupt threshold, @ref UART_FIFO_Threshold + * @retval bool + */ +static inline bool IsUartFIFOThreshold(UART_FIFO_Threshold fifoThreshold) +{ + return (fifoThreshold >= UART_FIFODEPTH_SIZE0) && (fifoThreshold <= UART_FIFODEPTH_SIZE15); +} + + +/** + * @brief Check UART Oversampling multiple. + * @param multiple Oversampling multiple, @ref UART_OversampleMultiple + * @retval bool + */ +static inline bool IsUartOversampleMultiple(UART_OversampleMultiple multiple) +{ + return (multiple >= UART_OVERSAMPLING_16X) && (multiple <= UART_OVERSAMPLING_12X); +} + +/** + * @brief Check UART data transfer sequential mode. + * @param mode UART TX/RX sequential mode, @ref UART_SequenceMode + * @retval bool + */ +static inline bool IsUartSequenceMode(UART_SequenceMode mode) +{ + return (mode == UART_SEQUENCE_START_LSB) || (mode == UART_SEQUENCE_START_MSB); +} + +/* Direct configuration layer */ +/** + * @brief Send a character by UART + * @param uartx UART register base address. + * @param data Character to be sent. + * @retval None. + */ +static inline void DCL_UART_WriteData(UART_RegStruct * const uartx, unsigned char data) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_DR.BIT.data = data; +} + +/** + * @brief Receive a character from UART. + * @param uartx UART register base address. + * @retval Data, read the received data from the UART data register. + */ +static inline unsigned char DCL_UART_ReadData(const UART_RegStruct *uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + return uartx->UART_DR.BIT.data; +} + +/** + * @brief UART TX enable. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_WriteEnable(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_CR.BIT.txe = BASE_CFG_ENABLE; +} + +/** + * @brief UART TX disable. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_WriteDisable(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_CR.BIT.txe = BASE_CFG_DISABLE; +} + +/** + * @brief UART RX enable. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_ReadEnable(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_CR.BIT.rxe = BASE_CFG_ENABLE; +} + +/** + * @brief UART RX disable. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_ReadDisable(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_CR.BIT.rxe = BASE_CFG_DISABLE; +} + +/** + * @brief UART TX use DMA . + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_DMA_WriteEnable(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_DMACR.BIT.txdmae = BASE_CFG_ENABLE; +} + +/** + * @brief UART TX cannot use DMA . + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_DMA_WriteDisable(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_DMACR.BIT.txdmae = BASE_CFG_DISABLE; +} + +/** + * @brief UART RX use DMA . + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_DMA_ReadEnable(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_DMACR.BIT.rxdmae = BASE_CFG_ENABLE; +} + +/** + * @brief UART RX cannot use DMA . + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_DMA_ReadDisable(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_DMACR.BIT.rxdmae = BASE_CFG_DISABLE; +} + +/** + * @brief UART word length setting. + * @param uartx UART register base address. + * @param dataLength Word length of sending and receiving, @ref UART_DataLength + * @retval None. + */ +static inline void DCL_UART_SetDataLength(UART_RegStruct * const uartx, UART_DataLength dataLength) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + UART_PARAM_CHECK_NO_RET(IsUartDatalength(dataLength)); + uartx->UART_LCR_H.BIT.wlen = dataLength; +} + +/** + * @brief Gettintg UART word length. + * @param uartx UART register base address. + * @retval Word length. + */ +static inline unsigned int DCL_UART_GetDataLength(const UART_RegStruct * uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + return uartx->UART_LCR_H.BIT.wlen; +} + +/** + * @brief Setting UART odd parity check. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_SetParityOdd(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_LCR_H.BIT.eps = BASE_CFG_DISABLE; + uartx->UART_LCR_H.BIT.pen = BASE_CFG_ENABLE; +} + +/** + * @brief Setting UART even parity check. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_SetParityEven(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_LCR_H.BIT.eps = BASE_CFG_ENABLE; + uartx->UART_LCR_H.BIT.pen = BASE_CFG_ENABLE; +} + +/** + * @brief UART does not use parity check. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_SetParityNone(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_LCR_H.BIT.pen = BASE_CFG_DISABLE; +} + +/** + * @brief Getting UART odd/even parity check. + * @param uartx UART register base address. + * @retval Odd/even parity check, 0: odd, 1: even, 2: None. + */ +static inline unsigned int DCL_UART_GetParityCheck(const UART_RegStruct * uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + unsigned int eps = uartx->UART_LCR_H.BIT.eps; + unsigned int pen = uartx->UART_LCR_H.BIT.pen; + if (eps == 0) { + return UART_PARITY_NONE; + } else if (pen == 0) { + return UART_PARITY_ODD; + } else { + return UART_PARITY_EVEN; + } +} + +/** + * @brief Setting the stop bit. + * @param uartx UART register base address. + * @param bit One or two stop bit, @ref UART_StopBits + * @retval None. + */ +static inline void DCL_UART_SetStopBits(UART_RegStruct * const uartx, UART_StopBits bit) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + UART_PARAM_CHECK_NO_RET(IsUartStopbits(bit)); + uartx->UART_LCR_H.BIT.stp2 = bit; +} + +/** + * @brief Getting the stop bit. + * @param uartx UART register base address. + * @retval Stop bit of UART. + */ +static inline unsigned int DCL_UART_GetStopBits(const UART_RegStruct *uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + return uartx->UART_LCR_H.BIT.stp2; +} + +/** + * @brief UART uses hardware flow control. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_Enable_HwFlowCtr(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_CR.BIT.ctsen = BASE_CFG_ENABLE; + uartx->UART_CR.BIT.rtsen = BASE_CFG_ENABLE; +} + +/** + * @brief UART uses hardware flow control. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_Disable_HwFlowCtr(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_CR.BIT.ctsen = BASE_CFG_DISABLE; + uartx->UART_CR.BIT.rtsen = BASE_CFG_DISABLE; +} + +/** + * @brief UART Disable function of stick parity. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_DisableStickParity(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_LCR_H.BIT.sps = BASE_CFG_DISABLE; +} + +/** + * @brief UART enable function of stick parity 0-bit check. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_EnableStickParity_Zero(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_LCR_H.BIT.pen = BASE_CFG_ENABLE; + uartx->UART_LCR_H.BIT.eps = BASE_CFG_ENABLE; + uartx->UART_LCR_H.BIT.sps = BASE_CFG_ENABLE; +} + +/** + * @brief UART enable function of stick parity 1-bit check. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_EnableStickParity_One(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_LCR_H.BIT.pen = BASE_CFG_ENABLE; + uartx->UART_LCR_H.BIT.eps = BASE_CFG_DISABLE; + uartx->UART_LCR_H.BIT.sps = BASE_CFG_ENABLE; +} + +/** + * @brief UART enable interrupt of CTS. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_EnableCTSInt(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_LCR_H.BIT.pen = BASE_CFG_ENABLE; +} + +/** + * @brief UART clear interrupt of CTS. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_ClearCTSInt(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_ICR.BIT.ctsmic = BASE_CFG_ENABLE; + uartx->UART_IMSC.BIT.ctsmim = BASE_CFG_DISABLE; +} + +/** + * @brief UART get interrupt status of CTS. + * @param uartx UART register base address. + * @retval status, 1: Interrupt generation, 0: interrupt is not generated. + */ +static inline unsigned int DCL_UART_GetCTSIntStatus(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + return uartx->UART_MIS.BIT.ctsmmis; +} + +/** + * @brief Set the data bits. The first bit to be transmitted and received is the LSB. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_SetDataLSB(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_DS.BIT.msbfirst = 0; +} + +/** + * @brief Set the data bits. The first bit to be transmitted and received is the MSB. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_SetDataMSB(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_DS.BIT.msbfirst = 1; +} + +/** + * @brief Setting data sequences of UART. + * @param uartx UART register base address. + * @param bool 1: enable MSB 0: enable LSB. + * @retval None. + */ +static inline void DCL_UART_SetDataSequences(UART_RegStruct * const uartx, bool dataSequence) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_DS.BIT.msbfirst = dataSequence; +} + + +/** + * @brief Configuring the upper limit of receiving timeout. + * @param uartx UART register base address. + * @param timeOfBits timeout, time required to transmit a certain bit. + * @retval None. + */ +static inline void DCL_UART_SetRxTimeOut(UART_RegStruct * const uartx, unsigned int timeOfBits) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + UART_PARAM_CHECK_NO_RET(timeOfBits <= 0xFFFFFF); + uartx->UART_RTCFG.reg = timeOfBits; +} + +/** + * @brief Enable automatic baud rate detection. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_EnableBaudRateDetection(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_ABDEN.BIT.abden = BASE_CFG_ENABLE; +} + +/** + * @brief Disable automatic baud rate detection. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_DisableBaudRateDetection(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_ABDEN.BIT.abden = BASE_CFG_DISABLE; +} + +/** + * @brief Enable character adaptation. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_EnableMatchCharater(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_CHARMATCH.BIT.cmen = BASE_CFG_ENABLE; +} + +/** + * @brief Disable character adaptation. + * @param uartx UART register base address. + * @retval None. + */ +static inline void DCL_UART_DisableMatchCharater(UART_RegStruct * const uartx) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + uartx->UART_CHARMATCH.BIT.cmen = BASE_CFG_DISABLE; +} + +/** + * @brief Sets the character to be matched. + * @param uartx UART register base address. + * @param ascii ascii of character. + * @retval None. + */ +static inline void DCL_UART_SetMatchCharater(UART_RegStruct * const uartx, unsigned int ascii) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + UART_PARAM_CHECK_NO_RET(ascii <= 0xFF); + uartx->UART_CHARMATCH.BIT.chamat = ascii; +} + +/** + * @brief Sets UART oversampling multiple. + * @param uartx UART register base address. + * @param multiple Oversampling multiple, @ref UART_OversampleMultiple + * @retval None. + */ +static inline void DCL_UART_OversampleMultiple(UART_RegStruct * const uartx, UART_OversampleMultiple multiple) +{ + UART_ASSERT_PARAM(IsUARTInstance(uartx)); + UART_PARAM_CHECK_NO_RET(IsUartOversampleMultiple(multiple)); + uartx->UART_SPCFG.BIT.spcfg = multiple; +} +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_UART_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/uart/src/uart.c b/vendor/others/demo/5-tim_adc/demo/drivers/uart/src/uart.c new file mode 100644 index 000000000..f52b870c3 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/uart/src/uart.c @@ -0,0 +1,884 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file uart.c + * @author MCU Driver Team + * @brief UART module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the UART. + * + Initialization and de-initialization functions. + * + Peripheral send and receive functions in blocking mode. + * + Peripheral send and receive functions in interrupt mode. + * + Peripheral send and receive functions in DMA mode. + * + Peripheral stop sending and receiving functions in interrupt/DMA mode. + * + Interrupt callback function and user registration function. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "interrupt.h" +#include "systick.h" +#include "uart.h" +/* Macro definitions ---------------------------------------------------------*/ + +#define OVERSAMPLING_PARAM 16 +#define SYSTICK_MS_DIV 1000 +#define PARITY_ODD 0x2 +#define PARITY_EVEN 0x6 +#define PARITY_MARK 0x82 +#define PARITY_SPACE 0x86 + +static unsigned int DivClosest(unsigned int x, unsigned int divisor) +{ + unsigned int ret; + if (divisor == 0) { + return 0; + } + ret = (((x) + ((divisor) / 2)) / (divisor)); /* Round up the result, add 1/2 */ + return ret; +} + +static void WriteDMAFinishFun(void *handle); +static void ReadDMAFinishFun(void *handle); +static void TransmitDMAErrorFun(void *handle); + +static void ReadITCallBack(UART_Handle *uartHandle); +static void WriteITCallBack(UART_Handle *uartHandle); +static void ErrorServiceCallback(UART_Handle *uartHandle); + +static void CharterMatchCallBack(UART_Handle *uartHandle); +static void BaudDetectCallBack(UART_Handle *uartHandle); + +static void UART_SetParityBit(UART_Handle *uartHandle); + + +/** + * @brief Baud rate detection interrupt callback function. + * @param uartHandle UART handle. + * @retval None. + */ +static void BaudDetectCallBack(UART_Handle *uartHandle) +{ + if (uartHandle->baseAddress->UART_MIS.BIT.abdcis == 0x01) { + uartHandle->baseAddress->UART_ABDEN.BIT.abden = BASE_CFG_DISABLE; + uartHandle->baseAddress->UART_IMSC.BIT.abdeim = BASE_CFG_DISABLE; + uartHandle->baseAddress->UART_IMSC.BIT.abdcim = BASE_CFG_DISABLE; + uartHandle->baseAddress->UART_ICR.BIT.abdcic = BASE_CFG_ENABLE; + /* After the baud rate automatic detection function is configured, enable UART. */ + uartHandle->baseAddress->UART_CR.BIT.txe = BASE_CFG_ENABLE; + uartHandle->baseAddress->UART_CR.BIT.rxe = BASE_CFG_ENABLE; + /* Call back user detect success function. */ + if (uartHandle->userCallBack.BaudDetectSuccessCallBack != NULL) { + uartHandle->userCallBack.BaudDetectSuccessCallBack(uartHandle); + } + } else { + /* Wait until UART is idle. */ + while (uartHandle->baseAddress->UART_ABDEN.BIT.abdbusy == 0x01) { + ; + } + uartHandle->baseAddress->UART_ICR.BIT.abdeic = BASE_CFG_ENABLE; + /* Call back user baud detect error function. */ + if (uartHandle->userCallBack.BaudDetectErrorCallBack != NULL) { + uartHandle->userCallBack.BaudDetectErrorCallBack(uartHandle); + } + } + return; +} + +/** + * @brief Character detection interrupt callback function. + * @param uartHandle UART handle. + * @retval None. + */ +static void CharterMatchCallBack(UART_Handle *uartHandle) +{ + uartHandle->baseAddress->UART_IMSC.BIT.cmim = BASE_CFG_DISABLE; + uartHandle->baseAddress->UART_ICR.BIT.cmic = BASE_CFG_ENABLE; + if (uartHandle->userCallBack.CharacterMatchCallBack != NULL) { + uartHandle->userCallBack.CharacterMatchCallBack(uartHandle); + } +} + +/** + * @brief Sets the parity bit of the UART. + * @param uartHandle UART handle. + * @retval None. + */ +static void UART_SetParityBit(UART_Handle *uartHandle) +{ + /* Sets the UART check mode. */ + switch (uartHandle->parity) { + case UART_PARITY_ODD: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_ODD; /* Odd parity. */ + break; + case UART_PARITY_EVEN: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_EVEN; /* Even parity. */ + break; + case UART_PARITY_MARK: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_MARK; /* Marking parity */ + break; + case UART_PARITY_SPACE: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_SPACE; /* space parity */ + break; + case UART_PARITY_NONE: + uartHandle->baseAddress->UART_LCR_H.BIT.pen = BASE_CFG_DISABLE; /* No parity */ + break; + default: + return; + } +} + +/** + * @brief Initialize the UART hardware configuration and configure parameters based on the specified handle. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_Init(UART_Handle *uartHandle) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + UART_PARAM_CHECK_WITH_RET(uartHandle->txState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(uartHandle->rxState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + unsigned int uartClock, quot; + UART_PARAM_CHECK_WITH_RET(IsUartDatalength(uartHandle->dataLength), BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(IsUartStopbits(uartHandle->stopBits), BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(IsUartParitymode(uartHandle->parity), BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->txMode), BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->rxMode), BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoTxThr), BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoRxThr), BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(IsUartOversampleMultiple(uartHandle->handleEx.overSampleMultiple), BASE_STATUS_ERROR); + + uartHandle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; + while (uartHandle->baseAddress->UART_FR.BIT.busy == 0x01) { + ; + } + + uartClock = HAL_CRG_GetIpFreq((void *)uartHandle->baseAddress); + + /* DCL OverSample Multiple check */ + uartHandle->baseAddress->UART_SPCFG.BIT.spcfg = uartHandle->handleEx.overSampleMultiple; + + /* DCL sequences setting */ + uartHandle->baseAddress->UART_DS.BIT.msbfirst = uartHandle->handleEx.msbFirst; + + /* The baud rate divider(BRD) based on the baud rate and clock frequency, calculation formula */ + unsigned int oversample = uartHandle->baseAddress->UART_SPCFG.reg; + if (uartHandle->baudRate > (uartClock / (OVERSAMPLING_PARAM - oversample))) { + return BASE_STATUS_ERROR; + } else { + unsigned int tmpClock = uartClock / (OVERSAMPLING_PARAM - oversample) * 64; /* 64 is for decimal parts */ + quot = DivClosest(tmpClock, uartHandle->baudRate); + } + /* Clear the baud rate divider register */ + uartHandle->baseAddress->UART_FBRD.reg = 0; + uartHandle->baseAddress->UART_IBRD.reg = 0; + /* The fractional baud rate divider value is stored to the lower 6 bits of the FBRD */ + uartHandle->baseAddress->UART_FBRD.reg = (quot & 0x3F); + /* Right shift 6 bits is the integer baud rate divider value, is stored to IBRD */ + uartHandle->baseAddress->UART_IBRD.reg = (quot >> 6); + uartHandle->baseAddress->UART_LCR_H.reg = 0; + uartHandle->baseAddress->UART_LCR_H.BIT.wlen = uartHandle->dataLength; /* Frame length seting */ + uartHandle->baseAddress->UART_LCR_H.BIT.stp2 = uartHandle->stopBits; /* Stop bit seting */ + UART_SetParityBit(uartHandle); + if (uartHandle->fifoMode == true) { /* FIFO threshold setting */ + uartHandle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_ENABLE; + uartHandle->baseAddress->UART_IFLS.BIT.rxiflsel = uartHandle->fifoRxThr; + uartHandle->baseAddress->UART_IFLS.BIT.txiflsel = uartHandle->fifoTxThr; + } + if (uartHandle->hwFlowCtr == UART_HW_FLOWCTR_ENABLE) { /* Hardwarer flow control setting */ + uartHandle->baseAddress->UART_CR.reg |= 0xC000; + } + uartHandle->baseAddress->UART_CR.reg |= 0x301; /* Enable bit use 0x301 is to set txe/rxe/uarten */ + uartHandle->txState = UART_STATE_READY; + uartHandle->rxState = UART_STATE_READY; + return BASE_STATUS_OK; +} + +/** + * @brief DeInitialize the UART and restoring default parameters based on the specified handle. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_UART_DeInit(UART_Handle *uartHandle) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + uartHandle->baseAddress->UART_CR.reg = BASE_CFG_DISABLE; + uartHandle->baseAddress->UART_ICR.reg |= 0xFFFF; /* Clear all interruptions. */ + uartHandle->baseAddress->UART_IMSC.reg = BASE_CFG_DISABLE; + uartHandle->baseAddress->UART_DMACR.reg = BASE_CFG_DISABLE; + uartHandle->baseAddress->UART_LCR_H.BIT.brk = BASE_CFG_DISABLE; + uartHandle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_DISABLE; + uartHandle->baseAddress->UART_SPCFG.BIT.spcfg = BASE_CFG_DISABLE; /* Clear Oversampling Configuration */ + uartHandle->baseAddress->UART_DS.BIT.msbfirst = BASE_CFG_DISABLE; /* Clears the data receiving sequence. */ + uartHandle->userCallBack.WriteItFinishCallBack = NULL; /* Clear all user call back function. */ + uartHandle->userCallBack.ReadItFinishCallBack = NULL; + uartHandle->userCallBack.WriteDmaFinishCallBack = NULL; /* Clear user DMA call back function. */ + uartHandle->userCallBack.ReadDmaFinishCallBack = NULL; + uartHandle->userCallBack.TransmitDmaErrorCallBack = NULL; + uartHandle->userCallBack.TransmitItErrorCallBack = NULL; + uartHandle->userCallBack.BaudDetectErrorCallBack = NULL; /* Clear user baud detection callback function */ + uartHandle->userCallBack.BaudDetectSuccessCallBack = NULL; + uartHandle->userCallBack.CharacterMatchCallBack = NULL; /* Clear user character matching callback function */ + uartHandle->rxState = UART_STATE_NONE_INIT; /* Resets the UART status to uninitialized. */ + uartHandle->txState = UART_STATE_NONE_INIT; + return BASE_STATUS_OK; +} + +/** + * @brief Return the specified UART state. + * @param uartHandle UART handle. + * @retval UART state: UART_STATE_NONE_INIT(can not use), UART_STATE_READY, UART_STATE_BUSY + * @retval UART_STATE_BUSY_TX, UART_STATE_BUSY_RX. + */ +UART_State_Type HAL_UART_GetState(UART_Handle *uartHandle) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + if (uartHandle->txState == UART_STATE_NONE_INIT) { + return UART_STATE_NONE_INIT; /* Uart Rx and Tx are not initialized */ + } + if (uartHandle->txState == UART_STATE_READY && uartHandle->rxState == UART_STATE_READY) { + return UART_STATE_READY; /* Uart Rx and Tx are ready */ + } + if (uartHandle->txState == UART_STATE_READY) { + return UART_STATE_BUSY_RX; /* Uart Rx is busy */ + } + if (uartHandle->rxState == UART_STATE_READY) { + return UART_STATE_BUSY_TX; /* Uart Tx is busy */ + } + return UART_STATE_BUSY; /* Uart Rx and Tx are busy */ +} + +/** + * @brief Send data in blocking mode. + * @param uartHandle UART handle. + * @param srcData Address of the data buff to be sent. + * @param dataLength number of the data to be sent. + * @param blockingTime Blocking time, unit: milliseconds. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_UART_WriteBlocking(UART_Handle *uartHandle, unsigned char *srcData, + unsigned int dataLength, unsigned int blockingTime) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + UART_ASSERT_PARAM(srcData != NULL); + UART_PARAM_CHECK_WITH_RET(uartHandle->txMode == UART_MODE_BLOCKING, BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(dataLength > 0, BASE_STATUS_ERROR); + unsigned long long setTick = HAL_CRG_GetIpFreq(SYSTICK_BASE) / SYSTICK_MS_DIV * blockingTime; + UART_PARAM_CHECK_WITH_RET(setTick < SYSTICK_MAX_VALUE, BASE_STATUS_ERROR); + if (uartHandle->txState == UART_STATE_READY) { + uartHandle->txState = UART_STATE_BUSY_TX; + unsigned int txCount = dataLength; + unsigned char *src = srcData; + uartHandle->baseAddress->UART_IMSC.BIT.txim = BASE_CFG_DISABLE; /* Disable TX interrupt bit */ + uartHandle->baseAddress->UART_CR.BIT.txe = BASE_CFG_ENABLE; + unsigned long long deltaTick; + unsigned int preTick = DCL_SYSTICK_GetTick(); + unsigned int curTick = preTick; + while (txCount > 0x00) { + curTick = DCL_SYSTICK_GetTick(); + deltaTick = (curTick > preTick) ? (curTick - preTick) : (SYSTICK_MAX_VALUE - preTick + curTick); + if (deltaTick >= setTick) { + uartHandle->txState = UART_STATE_READY; + return BASE_STATUS_TIMEOUT; + } + if (uartHandle->baseAddress->UART_FR.BIT.txff == 0x01) { /* True when the TX FIFO is full */ + continue; + } + /* Blocking write to DR when register is empty */ + uartHandle->baseAddress->UART_DR.BIT.data = *(src); + src++; + txCount--; + } + } else { + return BASE_STATUS_BUSY; + } + uartHandle->txState = UART_STATE_READY; + return BASE_STATUS_OK; +} + +/** + * @brief Send data in interrupt mode. + * @param uartHandle UART handle. + * @param srcData Address of the data buff to be sent. + * @param dataLength Number of the data to be sent. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_UART_WriteIT(UART_Handle *uartHandle, unsigned char *srcData, unsigned int dataLength) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + UART_PARAM_CHECK_WITH_RET(uartHandle->txMode == UART_MODE_INTERRUPT, BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(srcData != NULL, BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(dataLength > 0, BASE_STATUS_ERROR); + + if (uartHandle->txState == UART_STATE_READY) { + uartHandle->txState = UART_STATE_BUSY_TX; + uartHandle->txbuff = srcData; + uartHandle->txBuffSize = dataLength; + uartHandle->baseAddress->UART_ICR.BIT.txic = BASE_CFG_ENABLE; + if (uartHandle->fifoMode == true) { + uartHandle->baseAddress->UART_IMSC.BIT.txim = BASE_CFG_ENABLE; + } else { + uartHandle->baseAddress->UART_IMSC.BIT.txfeim = BASE_CFG_ENABLE; + } + } else { + return BASE_STATUS_BUSY; + } + return BASE_STATUS_OK; +} + +/** + * @brief Interrupt sending callback function. + * The hanler function is called when Tx interruption occurs. + * @param uartHandle UART handle. + * @retval None. + */ +static void WriteITCallBack(UART_Handle *uartHandle) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + UART_ASSERT_PARAM(uartHandle->txbuff != NULL); + if (uartHandle->txState == UART_STATE_BUSY_TX) { + while (uartHandle->txBuffSize > 0) { + if (uartHandle->baseAddress->UART_FR.BIT.txff == 1) { /* True when the TX FIFO is full */ + break; + } + uartHandle->baseAddress->UART_DR.BIT.data = *(uartHandle->txbuff); + (uartHandle->txbuff)++; + uartHandle->txBuffSize -= 1; + } + if (uartHandle->txBuffSize == 0) { + uartHandle->baseAddress->UART_IMSC.reg &= 0xFFFFEFDF; /* Disable txim and txfeim */ + uartHandle->baseAddress->UART_ICR.reg |= 0x1020; /* Clear txic and txfeic */ + uartHandle->txState = UART_STATE_READY; + /* Call user call back function */ + if (uartHandle->userCallBack.WriteItFinishCallBack != NULL) { + uartHandle->userCallBack.WriteItFinishCallBack(uartHandle); + } + } + } + return; +} + +/** + * @brief Send data in DMA mode. + * @param uartHandle UART handle. + * @param srcData Address of the data buff to be sent. + * @param dataLength Number of the data to be sent. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_UART_WriteDMA(UART_Handle *uartHandle, unsigned char *srcData, + unsigned int dataLength) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + UART_PARAM_CHECK_WITH_RET(uartHandle->txMode == UART_MODE_DMA, BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(srcData != NULL, BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(dataLength > 0, BASE_STATUS_ERROR); + unsigned int channel = uartHandle->uartDmaTxChn; + UART_PARAM_CHECK_WITH_RET(IsDmaChannelNum(channel) == true, BASE_STATUS_ERROR); + UART_ASSERT_PARAM(uartHandle->dmaHandle != NULL); + if (uartHandle->txState == UART_STATE_READY) { + uartHandle->txState = UART_STATE_BUSY_TX; + uartHandle->baseAddress->UART_IMSC.BIT.txim = BASE_CFG_DISABLE; /* Disable TX interrupt bit */ + uartHandle->dmaHandle->userCallBack.DMA_CallbackFuns[channel].ChannelFinishCallBack = WriteDMAFinishFun; + uartHandle->dmaHandle->userCallBack.DMA_CallbackFuns[channel].ChannelErrorCallBack = TransmitDMAErrorFun; + uartHandle->txbuff = srcData; + uartHandle->txBuffSize = dataLength; + if (HAL_DMA_StartIT(uartHandle->dmaHandle, (uintptr_t)(void *)uartHandle->txbuff, + (uintptr_t)(void *)&(uartHandle->baseAddress->UART_DR), \ + dataLength, channel) != BASE_STATUS_OK) { + uartHandle->txState = UART_STATE_READY; + return BASE_STATUS_ERROR; + } + uartHandle->baseAddress->UART_DMACR.BIT.txdmae = BASE_CFG_ENABLE; /* Enable TX DMA bit */ + } else { + return BASE_STATUS_BUSY; + } + return BASE_STATUS_OK; +} + +/** + * @brief Receive data in blocking mode. + * @param uartHandle UART handle. + * @param saveData Address of the data buff to be saved. + * @param dataLength Length of the data int the storage buffer. + * @param blockingTime Blocking time, unit: milliseconds. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_UART_ReadBlocking(UART_Handle *uartHandle, unsigned char *saveData, + unsigned int dataLength, unsigned int blockingTime) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(saveData != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + UART_PARAM_CHECK_WITH_RET(uartHandle->rxMode == UART_MODE_BLOCKING, BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(dataLength > 0, BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(blockingTime > 0, BASE_STATUS_ERROR); + unsigned long long setTick = HAL_CRG_GetIpFreq(SYSTICK_BASE) / SYSTICK_MS_DIV * blockingTime; + UART_PARAM_CHECK_WITH_RET(setTick < SYSTICK_MAX_VALUE, BASE_STATUS_ERROR); + if (uartHandle->rxState == UART_STATE_READY) { + uartHandle->rxState = UART_STATE_BUSY_RX; + unsigned int rxCount = dataLength; + unsigned char *save = saveData; + uartHandle->baseAddress->UART_IMSC.BIT.rxim = BASE_CFG_DISABLE; /* Disable RX interrupt bit */ + uartHandle->baseAddress->UART_ICR.reg = 0XFF; /* Clear interrupt flag */ + unsigned int tmp; + unsigned long long deltaTick; + unsigned int preTick = DCL_SYSTICK_GetTick(); + unsigned int curTick = preTick; + while (rxCount > 0) { + curTick = DCL_SYSTICK_GetTick(); + deltaTick = (curTick > preTick) ? (curTick - preTick) : (SYSTICK_MAX_VALUE - preTick + curTick); + if (deltaTick >= setTick) { + uartHandle->rxState = UART_STATE_READY; + return BASE_STATUS_TIMEOUT; + } + if (uartHandle->baseAddress->UART_FR.BIT.rxfe == 0x01) { + continue; + } + tmp = uartHandle->baseAddress->UART_DR.reg; + if (tmp & 0xF00) { /* True when receiving generated error */ + uartHandle->rxState = UART_STATE_READY; + return BASE_STATUS_ERROR; + } + *(save) = (tmp & 0xFF); /* The lower eight bits are the register data bits */ + save++; + rxCount--; + } + } else { + return BASE_STATUS_BUSY; + } + uartHandle->rxState = UART_STATE_READY; + return BASE_STATUS_OK; +} + +/** + * @brief Receive data in interrupt mode. + * @param uartHandle UART handle. + * @param saveData Address of the data buff to be saved. + * @param dataLength length of the data int the storage buffer. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_UART_ReadIT(UART_Handle *uartHandle, unsigned char *saveData, unsigned int dataLength) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + UART_ASSERT_PARAM(saveData != NULL); + UART_PARAM_CHECK_WITH_RET(uartHandle->rxMode == UART_MODE_INTERRUPT, BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(dataLength > 0, BASE_STATUS_ERROR); + if (uartHandle->rxState == UART_STATE_READY) { + uartHandle->rxState = UART_STATE_BUSY_RX; + uartHandle->rxbuff = saveData; + uartHandle->rxBuffSize = dataLength; + if (uartHandle->fifoMode == true) { + uartHandle->baseAddress->UART_IMSC.reg |= 0x7D0; /* Enable rx interrupt and rx timeout interrupt */ + } else { + uartHandle->baseAddress->UART_IMSC.reg |= 0x20780; /* Enable rx not empty interrupt */ + } + } else { + return BASE_STATUS_BUSY; + } + return BASE_STATUS_OK; +} + +/** + * @brief Interrupt receiving callback function. + * The hanler function is called when Rx interruption occurs. + * @param uartHandle UART handle. + * @retval None. + */ +static void ReadITCallBack(UART_Handle *uartHandle) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(uartHandle->rxbuff != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + if (uartHandle->rxState == UART_STATE_BUSY_RX) { + unsigned int tmp; + while (uartHandle->rxBuffSize > 0) { + if (uartHandle->baseAddress->UART_FR.BIT.rxfe == 0x01) { /* True when the RX FIFO is empty */ + break; + } + tmp = uartHandle->baseAddress->UART_DR.reg; + *(uartHandle->rxbuff) = (tmp & 0xFF); /* Read from DR when holding register/FIFO is not empty */ + uartHandle->rxbuff++; + uartHandle->rxBuffSize -= 1; + } + if (uartHandle->rxBuffSize == 0) { + uartHandle->baseAddress->UART_IMSC.reg &= 0xFFFDFFAF; /* Disable rxim ,rtim and rxfneim */ + uartHandle->rxState = UART_STATE_READY; + } + uartHandle->baseAddress->UART_ICR.reg |= 0x20050; /* Clear rxic, rtic and rxfneic */ + if (uartHandle->userCallBack.ReadItFinishCallBack != NULL && uartHandle->rxBuffSize == 0) { + uartHandle->userCallBack.ReadItFinishCallBack(uartHandle); + } + } + return; +} + +/** + * @brief Callback function of finishing receiving in DMA mode. + * The hanler function is called when Rx DMA Finish interruption occurs. + * @param handle DMA handle. + * @retval None. + */ +static void ReadDMAFinishFun(void *handle) +{ + UART_ASSERT_PARAM(handle != NULL); + UART_Handle *uartHandle = (UART_Handle *)(handle); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + uartHandle->rxState = UART_STATE_READY; + uartHandle->baseAddress->UART_DMACR.BIT.rxdmae = BASE_CFG_DISABLE; + uartHandle->rxBuffSize = 0; + if (uartHandle->userCallBack.ReadDmaFinishCallBack != NULL) { + uartHandle->userCallBack.ReadDmaFinishCallBack(uartHandle); /* User callback function */ + } + return; +} + +/** + * @brief Callback function of finishing sending in DMA mode. + * The hanler function is called when Tx DMA Finish interruption occurs. + * @param handle DMA handle. + * @retval None. + */ +static void WriteDMAFinishFun(void *handle) +{ + UART_ASSERT_PARAM(handle != NULL); + UART_Handle *uartHandle = (UART_Handle *)(handle); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + uartHandle->txState = UART_STATE_READY; + uartHandle->baseAddress->UART_DMACR.BIT.txdmae = BASE_CFG_DISABLE; + uartHandle->txBuffSize = 0; + if (uartHandle->userCallBack.WriteDmaFinishCallBack != NULL) { + uartHandle->userCallBack.WriteDmaFinishCallBack(uartHandle); /* User callback function */ + } + return; +} + +/** + * @brief Callback function of Tx/Rx error interrupt in DMA mode. + * The hanler function is called when Tx/Rx transmission error interruption occurs. + * @param handle DMA handle. + * @retval None. + */ +static void TransmitDMAErrorFun(void *handle) +{ + UART_ASSERT_PARAM(handle != NULL); + UART_Handle *uartHandle = (UART_Handle *)(handle); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + if (uartHandle->rxState == UART_STATE_BUSY_RX) { + uartHandle->baseAddress->UART_DMACR.BIT.rxdmae = BASE_CFG_DISABLE; + } + if (uartHandle->txState == UART_STATE_BUSY_TX) { + uartHandle->baseAddress->UART_DMACR.BIT.txdmae = BASE_CFG_DISABLE; + } + if (uartHandle->userCallBack.TransmitDmaErrorCallBack != NULL) { + uartHandle->userCallBack.TransmitDmaErrorCallBack(uartHandle); + } + uartHandle->txState = UART_STATE_READY; + uartHandle->rxState = UART_STATE_READY; + return; +} + +/** + * @brief Receive data in DMA mode. + * @param uartHandle UART handle. + * @param saveData Address of the data buff to be sent. + * @param dataLength number of the data to be sent. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_UART_ReadDMA(UART_Handle *uartHandle, unsigned char *saveData, + unsigned int dataLength) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + UART_ASSERT_PARAM(saveData != NULL); + UART_PARAM_CHECK_WITH_RET(uartHandle->rxMode == UART_MODE_DMA, BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(dataLength > 0, BASE_STATUS_ERROR); + unsigned int channel = uartHandle->uartDmaRxChn; + UART_PARAM_CHECK_WITH_RET(IsDmaChannelNum(channel) == true, BASE_STATUS_ERROR); + UART_ASSERT_PARAM(uartHandle->dmaHandle != NULL); + if (uartHandle->rxState == UART_STATE_READY) { + uartHandle->rxState = UART_STATE_BUSY_RX; + uartHandle->baseAddress->UART_IMSC.BIT.rxim = BASE_CFG_DISABLE; /* Disable RX interrupt bit */ + uartHandle->dmaHandle->userCallBack.DMA_CallbackFuns[channel].ChannelFinishCallBack = ReadDMAFinishFun; + uartHandle->dmaHandle->userCallBack.DMA_CallbackFuns[channel].ChannelErrorCallBack = TransmitDMAErrorFun; + uartHandle->rxbuff = saveData; + uartHandle->rxBuffSize = dataLength; + /* Can not masking overflow error, break error, check error, frame error interrupt */ + if (HAL_DMA_StartIT(uartHandle->dmaHandle, (uintptr_t)(void *)&(uartHandle->baseAddress->UART_DR), + (uintptr_t)(void *)uartHandle->rxbuff, dataLength, channel) != BASE_STATUS_OK) { + uartHandle->rxState = UART_STATE_READY; + return BASE_STATUS_ERROR; + } + uartHandle->baseAddress->UART_DMACR.BIT.rxdmae = BASE_CFG_ENABLE; /* Enable RX_DMA bit */ + } else { + return BASE_STATUS_BUSY; + } + return BASE_STATUS_OK; +} + +/** + * @brief Stop the process of sending data in interrupt or DMA mode. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_UART_StopWrite(UART_Handle *uartHandle) /* Only support UART_MODE_INTERRUPT and UART_MODE_DMA */ +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + UART_ASSERT_PARAM(uartHandle->dmaHandle != NULL); + UART_PARAM_CHECK_WITH_RET(IsDmaChannelNum(uartHandle->uartDmaTxChn) == true, BASE_STATUS_ERROR); + /* Blocking send interrupt and jugdement the status of txmode. */ + uartHandle->baseAddress->UART_IMSC.BIT.txim = BASE_CFG_DISABLE; + if (uartHandle->txMode == UART_MODE_DMA) { + uartHandle->baseAddress->UART_DMACR.BIT.txdmae = BASE_CFG_DISABLE; /* Close FIFO of DMA and Stop DMA channel. */ + if (HAL_DMA_StopChannel(uartHandle->dmaHandle, uartHandle->uartDmaTxChn) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + } + uartHandle->txState = UART_STATE_READY; + return BASE_STATUS_OK; +} + +/** + * @brief Stop the process of receiving data in interrupt or DMA mode. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_UART_StopRead(UART_Handle *uartHandle) /* Only support UART_MODE_INTERRUPT and UART_MODE_DMA */ +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + UART_ASSERT_PARAM(uartHandle->dmaHandle != NULL); + UART_PARAM_CHECK_WITH_RET(IsDmaChannelNum(uartHandle->uartDmaRxChn) == true, BASE_STATUS_ERROR); + unsigned int val = uartHandle->baseAddress->UART_IMSC.reg; + val &= 0xFFFDF82F; /* Disable bits: rxim, rtim, feim, peim, beim, oeim, rxfneim */ + uartHandle->baseAddress->UART_IMSC.reg = val; + if (uartHandle->rxMode == UART_MODE_DMA) { + uartHandle->baseAddress->UART_DMACR.BIT.rxdmae = BASE_CFG_DISABLE; + if (HAL_DMA_StopChannel(uartHandle->dmaHandle, uartHandle->uartDmaRxChn) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + } + uartHandle->rxState = UART_STATE_READY; + return BASE_STATUS_OK; +} + +/** + * @brief Error handler function of receiving. + * @param uartHandle UART handle. + * @retval None. + */ +static void ErrorServiceCallback(UART_Handle *uartHandle) +{ + unsigned int error = 0x00; + if (uartHandle->baseAddress->UART_MIS.BIT.oemis == BASE_CFG_ENABLE) { /* Overflow error interrupt */ + error |= uartHandle->baseAddress->UART_MIS.BIT.oemis; + uartHandle->baseAddress->UART_ICR.BIT.oeic = BASE_CFG_ENABLE; + } else if (uartHandle->baseAddress->UART_MIS.BIT.bemis == BASE_CFG_ENABLE) { /* Break error interrupt */ + error |= uartHandle->baseAddress->UART_MIS.BIT.bemis; + uartHandle->baseAddress->UART_ICR.BIT.beic = BASE_CFG_ENABLE; + } else if (uartHandle->baseAddress->UART_MIS.BIT.pemis == BASE_CFG_ENABLE) { /* Check error interrupt */ + error |= uartHandle->baseAddress->UART_MIS.BIT.pemis; + uartHandle->baseAddress->UART_ICR.BIT.peic = BASE_CFG_ENABLE; + } else if (uartHandle->baseAddress->UART_MIS.BIT.femis == BASE_CFG_ENABLE) { /* Frame error interrupt */ + error |= uartHandle->baseAddress->UART_MIS.BIT.femis; + uartHandle->baseAddress->UART_ICR.BIT.feic = BASE_CFG_ENABLE; + } + if (error != 0x00) { + uartHandle->errorType = error; + if (uartHandle->rxMode == UART_MODE_INTERRUPT && uartHandle->userCallBack.TransmitItErrorCallBack != NULL) { + uartHandle->userCallBack.TransmitItErrorCallBack(uartHandle); + } + } + return; +} + +/** + * @brief UART Interrupt service processing function. + * @param handle UART handle. + * @retval None. + */ +void HAL_UART_IrqHandler(void *handle) +{ + UART_ASSERT_PARAM(handle != NULL); + UART_Handle *uartHandle = (UART_Handle *)handle; + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + /* when tx interrupt is generated */ + if ((uartHandle->baseAddress->UART_MIS.BIT.txmis == 0x01) || + (uartHandle->baseAddress->UART_MIS.BIT.txfeis == 0x01)) { + WriteITCallBack(uartHandle); + } + /* when rx interrupt is generated */ + if ((uartHandle->baseAddress->UART_MIS.BIT.rxmis == 0x01 || uartHandle->baseAddress->UART_MIS.BIT.rtmis == 0x01) || + (uartHandle->baseAddress->UART_MIS.BIT.rxfneis == 0x1)) { + ReadITCallBack(uartHandle); + } + /* when charter match interrupt is generated */ + if (uartHandle->baseAddress->UART_MIS.BIT.cmis == 0x01) { + CharterMatchCallBack(uartHandle); + } + /* when baud detect interrupt is generated */ + if (uartHandle->baseAddress->UART_MIS.BIT.abdcis == 0x01 || uartHandle->baseAddress->UART_MIS.BIT.abdeis == 0x01) { + BaudDetectCallBack(uartHandle); + } + /* when error interrupt is generated */ + if ((uartHandle->baseAddress->UART_MIS.reg & 0x780) != 0) { + ErrorServiceCallback(uartHandle); + } + return; +} + +/** + * @brief User callback function registration interface. + * @param uartHandle UART handle. + * @param typeID Id of callback function type, @ref UART_CallbackFun_Type + * @param pCallback pointer of the specified callbcak function, @ref UART_CallbackType + * @retval BASE_StatusType: OK, ERROR. + */ +BASE_StatusType HAL_UART_RegisterCallBack(UART_Handle *uartHandle, UART_CallbackFun_Type typeID, + UART_CallbackType pCallback) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + switch (typeID) { + case UART_WRITE_IT_FINISH: + uartHandle->userCallBack.WriteItFinishCallBack = pCallback; /* Write INT finish callback register */ + break; + case UART_READ_IT_FINISH: + uartHandle->userCallBack.ReadItFinishCallBack = pCallback; /* Read INT finish callback register */ + break; + case UART_WRITE_DMA_FINISH: + uartHandle->userCallBack.WriteDmaFinishCallBack = pCallback; /* DMA write finish callback register */ + break; + case UART_READ_DMA_FINISH: + uartHandle->userCallBack.ReadDmaFinishCallBack = pCallback; /* DMA read finish callback register */ + break; + case UART_TRNS_IT_ERROR: + uartHandle->userCallBack.TransmitItErrorCallBack = pCallback; /* INT Trans error callback register */ + break; + case UART_TRNS_DMA_ERROR: + uartHandle->userCallBack.TransmitDmaErrorCallBack = pCallback; /* DMA Trans error callback register */ + break; + case UART_BAUD_DETECT_FINISH: + uartHandle->userCallBack.BaudDetectSuccessCallBack = pCallback; /* Baud detect finish callback register */ + break; + case UART_BAUD_DETECT_ERROR: + uartHandle->userCallBack.BaudDetectErrorCallBack = pCallback; /* Baud detect error callback register */ + break; + case UART_CHARACTER_MATCH: + uartHandle->userCallBack.CharacterMatchCallBack = pCallback; /* character match callback register */ + break; + default: + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief UART DAM(rx to memory), cyclically stores data to specified memory(saveData). + * @param uartHandle UART handle. + * @param saveData Address of the data buff to be sent. + * @param tempNode DMA Link List, @ref DMA_LinkList + * @param dataLength number of the data to be sent. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +BASE_StatusType HAL_UART_ReadDMAAndCyclicallyStored(UART_Handle *uartHandle, unsigned char *saveData, + DMA_LinkList *tempNode, unsigned int dataLength) +{ + /* Param check */ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(tempNode != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + UART_ASSERT_PARAM(saveData != NULL); + UART_PARAM_CHECK_WITH_RET(dataLength > 0, BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(uartHandle->rxMode == UART_MODE_DMA, BASE_STATUS_ERROR); + UART_PARAM_CHECK_WITH_RET(IsDmaChannelNum(uartHandle->uartDmaRxChn) == true, BASE_STATUS_ERROR); + UART_ASSERT_PARAM(uartHandle->dmaHandle != NULL); + + unsigned int channel = uartHandle->uartDmaRxChn; + if (uartHandle->rxState == UART_STATE_READY) { + uartHandle->rxState = UART_STATE_BUSY_RX; + uartHandle->baseAddress->UART_IMSC.BIT.rxim = BASE_CFG_DISABLE; /* Disable RX interrupt bit */ + uartHandle->rxbuff = saveData; + uartHandle->rxBuffSize = dataLength; + + /* Init DAM Channel Params */ + DMA_ChannelParam dmaParams; + dmaParams.direction = uartHandle->dmaHandle->DMA_Channels[channel].direction; + dmaParams.srcAddrInc = uartHandle->dmaHandle->DMA_Channels[channel].srcAddrInc; + dmaParams.destAddrInc = uartHandle->dmaHandle->DMA_Channels[channel].destAddrInc; + dmaParams.srcPeriph = uartHandle->dmaHandle->DMA_Channels[channel].srcPeriph; + dmaParams.destPeriph = uartHandle->dmaHandle->DMA_Channels[channel].destPeriph; + dmaParams.srcWidth = uartHandle->dmaHandle->DMA_Channels[channel].srcWidth; + dmaParams.destWidth = uartHandle->dmaHandle->DMA_Channels[channel].destWidth; + dmaParams.srcBurst = uartHandle->dmaHandle->DMA_Channels[channel].srcBurst; + dmaParams.destBurst = uartHandle->dmaHandle->DMA_Channels[channel].destBurst; + + /* Initialize List Node */ + if (HAL_DMA_InitNewNode(tempNode, &dmaParams, (uintptr_t)(void *)&(uartHandle->baseAddress->UART_DR), \ + (uintptr_t)(void *)uartHandle->rxbuff, dataLength) != BASE_STATUS_OK) { + uartHandle->rxState = UART_STATE_READY; + return BASE_STATUS_ERROR; + } + if (HAL_DMA_ListAddNode(tempNode, tempNode) != BASE_STATUS_OK) { + uartHandle->rxState = UART_STATE_READY; + return BASE_STATUS_ERROR; + } + + /* Can not masking overflow error, break error, check error, frame error interrupt */ + if (HAL_DMA_StartListTransfer(uartHandle->dmaHandle, tempNode, channel) != BASE_STATUS_OK) { + uartHandle->rxState = UART_STATE_READY; + return BASE_STATUS_ERROR; + } + uartHandle->baseAddress->UART_DMACR.BIT.rxdmae = BASE_CFG_ENABLE; /* Enable RX_DMA bit */ + } else { + /* Rx not ready */ + return BASE_STATUS_BUSY; + } + /* All done */ + return BASE_STATUS_OK; +} + +/** + * @brief Obtains offset address of DMA transfer address relative to specified memory (rxbuff). + * @param uartHandle UART handle. + * @retval offset address of DMA transfer address relative to specified memory (rxbuff). + */ +unsigned int HAL_UART_ReadDMAGetPos(UART_Handle *uartHandle) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(uartHandle->dmaHandle != NULL); + UART_ASSERT_PARAM(uartHandle->rxbuff != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + UART_PARAM_CHECK_WITH_RET(IsDmaChannelNum(uartHandle->uartDmaRxChn) == true, BASE_STATUS_ERROR); + UART_ASSERT_PARAM(uartHandle->dmaHandle->DMA_Channels[uartHandle->uartDmaRxChn].channelAddr != NULL); + unsigned int writePos = 0; + /* Obtain the read destination address */ + unsigned int readAddress = uartHandle->dmaHandle->\ + DMA_Channels[uartHandle->uartDmaRxChn].channelAddr->DMA_Cn_DEST_ADDR.reg; + if (readAddress > (uintptr_t)uartHandle->rxbuff) { + writePos = readAddress - (uintptr_t)uartHandle->rxbuff; /* Number of characters currently transferred */ + } else { + writePos = 0; + } + return writePos; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/uart/src/uart_ex.c b/vendor/others/demo/5-tim_adc/demo/drivers/uart/src/uart_ex.c new file mode 100644 index 000000000..dd93b7c29 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/uart/src/uart_ex.c @@ -0,0 +1,142 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file uart_ex.c + * @author MCU Driver Team + * @brief UART module driver. + * @details This file provides firmware functions to manage the following + * functionalities of the UART. + * + Initialization and de-initialization functions. + * + Peripheral send and receive functions in blocking mode. + * + Peripheral send and receive functions in interrupt mode. + * + Peripheral send and receive functions in DMA mode. + * + Peripheral stop sending and receiving functions in interrupt/DMA mode. + * + Interrupt callback function and user registration function. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "uart_ex.h" +/* Macro definitions ---------------------------------------------------------*/ + +/** + * @brief Open the character matching function of the UART RX and set the matching character. + * @param uartHandle UART handle. + * @param ch Characters to be matched. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_OpenCharacterMatchEx(UART_Handle *uartHandle, unsigned char ch) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + uartHandle->baseAddress->UART_IMSC.BIT.cmim = BASE_CFG_ENABLE; + uartHandle->baseAddress->UART_CHARMATCH.BIT.chamat = (unsigned int)ch; /* Sets the matching character. */ + uartHandle->baseAddress->UART_CHARMATCH.BIT.cmen = BASE_CFG_ENABLE; + return BASE_STATUS_OK; +} + +/** + * @brief Close the character matching function of the UART RX. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_CloseCharacterMatchEx(UART_Handle *uartHandle) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + uartHandle->baseAddress->UART_CHARMATCH.BIT.cmen = BASE_CFG_DISABLE; + uartHandle->baseAddress->UART_IMSC.BIT.cmim = BASE_CFG_DISABLE; /* Turn off character matching */ + return BASE_STATUS_OK; +} + +/** + * @brief Enable the UART to automatically identify the baud rate and enable the corresponding interrupt. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_EnableBaudDetectionEx(UART_Handle *uartHandle) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + uartHandle->baseAddress->UART_CR.BIT.txe = BASE_CFG_DISABLE; + uartHandle->baseAddress->UART_CR.BIT.rxe = BASE_CFG_DISABLE; /* Disable TX and RX first */ + uartHandle->baseAddress->UART_IMSC.BIT.abdeim = BASE_CFG_ENABLE; + uartHandle->baseAddress->UART_IMSC.BIT.abdcim = BASE_CFG_ENABLE; + uartHandle->baseAddress->UART_ABDEN.BIT.abden = BASE_CFG_ENABLE; + return BASE_STATUS_OK; +} + +/** + * @brief Disable the UART to automatically identify the baud rate. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_DisableBaudDetectionEx(UART_Handle *uartHandle) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + uartHandle->baseAddress->UART_ABDEN.BIT.abden = BASE_CFG_DISABLE; + uartHandle->baseAddress->UART_IMSC.BIT.abdeim = BASE_CFG_DISABLE; + uartHandle->baseAddress->UART_IMSC.BIT.abdcim = BASE_CFG_DISABLE; + uartHandle->baseAddress->UART_CR.BIT.txe = BASE_CFG_ENABLE; /* Enable TX */ + uartHandle->baseAddress->UART_CR.BIT.rxe = BASE_CFG_ENABLE; /* Enable RX */ + return BASE_STATUS_OK; +} + +/** + * @brief Configuring the upper limit of Rx timeout. + * @param uartHandle UART handle. + * @param cntOfBit timeout is defined as the time spent in transmitting N bits, numer of N is cntOfBit. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_SetRxWaiteTimeEx(UART_Handle *uartHandle, unsigned int cntOfBit) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + UART_PARAM_CHECK_WITH_RET(cntOfBit <= 0xFFFFFF, BASE_STATUS_ERROR); + uartHandle->baseAddress->UART_RTCFG.reg = cntOfBit; /* Set wait time */ + return BASE_STATUS_OK; +} + +/** + * @brief Sets UART oversampling multiple. + * @param uartHandle UART handle. + * @param multiple Oversampling multiple, @ref UART_OversampleMultiple + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_SetOversampleMultipleEx(UART_Handle *uartHandle, UART_OversampleMultiple multiple) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + UART_PARAM_CHECK_WITH_RET(IsUartOversampleMultiple(multiple), BASE_STATUS_ERROR); + uartHandle->baseAddress->UART_SPCFG.BIT.spcfg = multiple; /* Oversample setting */ + return BASE_STATUS_OK; +} + +/** + * @brief Sets the first bit of the character transmitted in the UART transmission. + * @param uartHandle UART handle. + * @param mode Sequence mode : LSB/MSB, @ref UART_SequenceMode + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_SetDataSequenceModeEx(UART_Handle *uartHandle, UART_SequenceMode mode) +{ + UART_ASSERT_PARAM(uartHandle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + UART_PARAM_CHECK_WITH_RET(IsUartSequenceMode(mode), BASE_STATUS_ERROR); + uartHandle->baseAddress->UART_DS.BIT.msbfirst = mode; /* Data sequence setting */ + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/wwdg/common/inc/wwdg.h b/vendor/others/demo/5-tim_adc/demo/drivers/wwdg/common/inc/wwdg.h new file mode 100644 index 000000000..ecef61125 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/wwdg/common/inc/wwdg.h @@ -0,0 +1,99 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file wwdg.h + * @author MCU Driver Team + * @brief WWDG module driver + * @details The header file contains the following declaration: + * + WWDG handle structure definition. + * + Initialization functions. + * + WWDG Set And Get Functions. + * + Interrupt Handler Functions. + */ + +#ifndef McuMagicTag_WWDG_H +#define McuMagicTag_WWDG_H + +/* Includes ------------------------------------------------------------------*/ +#include "wwdg_ip.h" +/** + * @defgroup WWDG WWDG + * @brief WWDG module. + * @{ + */ + +/** + * @defgroup WWDG_Common WWDG Common + * @brief WWDG common external module. + * @{ + */ + +/** + * @defgroup WWDG_Handle_Definition WWDG Handle Definition + * @{ + */ + +/* Typedef definitions -------------------------------------------------------*/ +typedef void (* WWDG_CallbackType)(void *handle); + +/** + * @brief WWDG handle structure definition. + */ +typedef struct _WWDG_Handle { + WWDG_RegStruct *baseAddress; /**< WWDG Registers address. */ + unsigned int timeValue; /**< WWDG time value. */ + unsigned int windowValue; /**< WWDG window value. */ + unsigned int freqDivValue; /**< WWDG freq div value. */ + WWDG_TimeType timeType; /**< WWDG time type. */ + bool enableIT; /**< true:enable false:disable interrupt. */ + WWDG_UserCallBack userCallBack; /**< User callback */ + WWDG_ExtendHandle handleEx; /**< WWDG extend parameter */ +} WWDG_Handle; + +/** + * @} + */ + +/** + * @defgroup WWDG_API_Declaration WWDG HAL API + * @{ + */ + +BASE_StatusType HAL_WWDG_Init(WWDG_Handle *handle); +void HAL_WWDG_SetTimeValue(WWDG_Handle *handle, unsigned int timeValue, WWDG_TimeType timeType); +unsigned int HAL_WWDG_GetLoadValue(WWDG_Handle *handle); +unsigned int HAL_WWDG_GetWindowValue(WWDG_Handle *handle); +unsigned int HAL_WWDG_GetCounterValue(WWDG_Handle *handle); +void HAL_WWDG_Refresh(WWDG_Handle *handle); +void HAL_WWDG_Start(WWDG_Handle *handle); +void HAL_WWDG_Stop(WWDG_Handle *handle); +void HAL_WWDG_RegisterCallback(WWDG_Handle *handle, WWDG_CallbackType callBackFunc); +void HAL_WWDG_IrqHandler(void *handle); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_WWDG_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/wwdg/inc/wwdg_ex.h b/vendor/others/demo/5-tim_adc/demo/drivers/wwdg/inc/wwdg_ex.h new file mode 100644 index 000000000..6f520c3bd --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/wwdg/inc/wwdg_ex.h @@ -0,0 +1,49 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file wwdg_ex.h + * @author MCU Driver Team + * @brief WWDG module driver + * @details The header file contains the following declaration: + * + WWDG Set And Get Functions. + */ + +#ifndef McuMagicTag_WWDG_EX_H +#define McuMagicTag_WWDG_EX_H + +/* Includes ------------------------------------------------------------------*/ +#include "wwdg.h" +/** + * @addtogroup WWDG_IP + * @{ + */ + +/** + * @defgroup WWDG_API_EX_Declaration WWDG HAL API EX + * @{ + */ +void HAL_WWDG_EnableWindowModeEx(WWDG_Handle *handle); +void HAL_WWDG_DisableWindowModeEx(WWDG_Handle *handle); + +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_WWDG_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/wwdg/inc/wwdg_ip.h b/vendor/others/demo/5-tim_adc/demo/drivers/wwdg/inc/wwdg_ip.h new file mode 100644 index 000000000..35bf7ac5b --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/wwdg/inc/wwdg_ip.h @@ -0,0 +1,516 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file wwdg_ip.h + * @author MCU Driver Team + * @brief WWDG module driver + * @details The header file contains the following declaration: + * + WWDG configuration enums. + * + WWDG register structures. + * + WWDG DCL Functions. + * + Parameters check functions. + */ + +#ifndef McuMagicTag_WWDG_IP_H +#define McuMagicTag_WWDG_IP_H + +/* Includes ------------------------------------------------------------------*/ +#include "baseinc.h" + +/* Macro definition */ + +#ifdef WWDG_PARAM_CHECK + #define WWDG_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM + #define WWDG_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET + #define WWDG_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else + #define WWDG_ASSERT_PARAM(para) ((void)0U) + #define WWDG_PARAM_CHECK_NO_RET(para) ((void)0U) + #define WWDG_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +/** + * @addtogroup WWDG + * @{ + */ + +/** + * @defgroup WWDG_IP WWDG_IP + * @brief WWDG_IP: wwdg_v1. + * @{ + */ + +/** + * @defgroup WWDG_Param_Def WWDG Parameters Definition + * @brief Description of WWDG configuration parameters. + * @{ + */ +/* MACRO definitions -------------------------------------------------------*/ +#define FREQ_CONVERT_MS_UNIT 1000 +#define FREQ_CONVERT_US_UNIT 1000000 +#define WWDG_UNLOCK_REG_CMD 0x55 /* 0x55 CMD: key equal 0x55 will unlock all reg write function */ +#define WWDG_LOCK_REG_CMD 0xFF /* 0xFF CMD: key not equal 0x55 will lock reg write function except key reg */ + +/* Typedef definitions -------------------------------------------------------*/ +typedef enum { + WWDG_TIME_UNIT_TICK = 0x00000000U, + WWDG_TIME_UNIT_S = 0x00000001U, + WWDG_TIME_UNIT_MS = 0x00000002U, + WWDG_TIME_UNIT_US = 0x00000003U +} WWDG_TimeType; + +typedef enum { + WWDG_FREQ_DIV_NONE = 0x00000000U, + WWDG_FREQ_DIV_2 = 0x00000001U, + WWDG_FREQ_DIV_4 = 0x00000002U, + WWDG_FREQ_DIV_8 = 0x00000003U, + WWDG_FREQ_DIV_16 = 0x00000004U, + WWDG_FREQ_DIV_32 = 0x00000005U, + WWDG_FREQ_DIV_64 = 0x00000006U, + WWDG_FREQ_DIV_128 = 0x00000007U, + WWDG_FREQ_DIV_256 = 0x00000008U, + WWDG_FREQ_DIV_512 = 0x00000009U, + WWDG_FREQ_DIV_1024 = 0x0000000AU, + WWDG_FREQ_DIV_2048 = 0x0000000BU, + WWDG_FREQ_DIV_4096 = 0x0000000CU, + WWDG_FREQ_DIV_8192 = 0x0000000DU, + WWDG_FREQ_DIV_MAX +} WWDG_FreqDivType; + +/** + * @brief WWDG extend handle. + */ +typedef struct _WWDG_ExtendHandle { +} WWDG_ExtendHandle; + +/** + * @brief WWDG user callback. + */ +typedef struct { + void (* CallbackFunc)(void *handle); /**< WWDG callback Function */ +} WWDG_UserCallBack; +/** + * @} + */ + +/** + * @defgroup WWDG_Reg_Def WWDG Register Definition + * @brief Description WWDG register mapping structure. + * @{ + */ +/** + * @brief WWDG load init value. + */ +typedef union { + unsigned int reg; + struct { + unsigned int wwdg_load : 16; /**< init value. */ + unsigned int reserved0 : 16; + } BIT; +} volatile WWDG_LOAD_REG; + +/** + * @brief WWDG get current value. + */ +typedef union { + unsigned int reg; + struct { + unsigned int wwdg_value : 16; /**< current value. */ + unsigned int reserved0 : 16; + } BIT; +} volatile WWDG_VALUE_REG; + +/** + * @brief WWDG set window value. + */ +typedef union { + unsigned int reg; + struct { + unsigned int wwdg_window : 16; /**< window value. */ + unsigned int reserved0 : 16; + } BIT; +} volatile WWDG_WINDOW_REG; + +/** + * @brief WWDG cmd function value. + */ +typedef union { + unsigned int reg; + struct { + unsigned int wwdg_key : 8; /**< cmd function value. */ + unsigned int reserved0 : 24; + } BIT; +} volatile WWDG_KEY_REG; + +/** + * @brief WWDG clk pre div value. + */ +typedef union { + unsigned int reg; + struct { + unsigned int wwdg_pre_div : 4; /**< clk pre div value. */ + unsigned int reserved0 : 28; + } BIT; +} volatile WWDG_PRE_DIV_REG; + +/** + * @brief WWDG enable interrupt and reset. + */ +typedef union { + unsigned int reg; + struct { + unsigned int inten : 1; /**< enable interrupt. */ + unsigned int resen : 1; /**< enable reset. */ + unsigned int window_mode_en : 1; /**< enable window mode. */ + unsigned int reserved0 : 29; + } BIT; +} volatile WWDG_CONTROL_REG; + +/** + * @brief WWDG orignal interrupt signal. + */ +typedef union { + unsigned int reg; + struct { + unsigned int wwdogris : 1; /**< original interrupt status. */ + unsigned int reserve : 31; + } BIT; +} volatile WWDG_RIS_REG; + +/** + * @brief mask interrupt signal. + */ +typedef union { + unsigned int reg; + struct { + unsigned int wwdogmis : 1; /**< maske interrupt status. */ + unsigned int reserve : 31; + } BIT; +} volatile WWDG_MIS_REG; + +/** + * @brief WWDG Register Structure definition. + */ +typedef struct { + WWDG_LOAD_REG WWDOG_LOAD; /**< WWDG load value register. */ + WWDG_VALUE_REG WWDOG_VALUE; /**< WWDG current value register. */ + WWDG_WINDOW_REG WWDOG_WINDOW; /**< WWDG Window value register. */ + WWDG_KEY_REG WWDOG_KEY; /**< WWDG instruction word register. */ + WWDG_PRE_DIV_REG WWDOG_PRE_DIV; /**< WWDG prescale register. */ + WWDG_CONTROL_REG WWDOG_CONTROL; /**< WWDG interrupt, reset and window enable register. */ + WWDG_RIS_REG WWDOG_RIS; /**< WWDG orignal interrupt register. */ + WWDG_MIS_REG WWDOG_MIS; /**< WWDG mask interrupt register. */ +} volatile WWDG_RegStruct; + +/** + * @} + */ + +/** + * @brief Setting the load value of the WWDG counter. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @param loadValue Load value of the WWDG counter. + * @retval None. + */ +static inline void DCL_WWDG_SetLoadValue(WWDG_RegStruct *wwdgx, unsigned short loadValue) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_UNLOCK_REG_CMD; + wwdgx->WWDOG_LOAD.BIT.wwdg_load = loadValue; + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_LOCK_REG_CMD; +} + +/** + * @brief Getting the load value of the WWDG load register. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @retval unsigned short WWDG load value. + */ +static inline unsigned short DCL_WWDG_GetLoadValue(const WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + return wwdgx->WWDOG_LOAD.BIT.wwdg_load; +} + +/** + * @brief Getting the value of the WWDG counter register. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @retval unsigned short WWDG counter value. + */ +static inline unsigned short DCL_WWDG_GetCounterValue(const WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + return wwdgx->WWDOG_VALUE.BIT.wwdg_value; +} + +/** + * @brief Setting window value. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @param windowValue window value of the WWDG counter. + * @retval None. + */ +static inline void DCL_WWDG_SetWindowValue(WWDG_RegStruct *wwdgx, unsigned short windowValue) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_UNLOCK_REG_CMD; + wwdgx->WWDOG_WINDOW.BIT.wwdg_window = windowValue; + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_LOCK_REG_CMD; +} + +/** + * @brief Getting window value, windowValue need bigger than 4. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @param windowValue window value of the WWDG counter. + * @retval unsigned short wwdg window value. + */ +static inline unsigned short DCL_WWDG_GetWindowValue(WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + return wwdgx->WWDOG_WINDOW.BIT.wwdg_window; +} + +/** + * @brief Start wwdg function. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @retval None. + */ +static inline void DCL_WWDG_Start(WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + wwdgx->WWDOG_KEY.BIT.wwdg_key = 0xCC; /* 0xCC CMD: start wwdg function */ +} + +/** + * @brief Stop wwdg function. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @retval None. + */ +static inline void DCL_WWDG_Stop(WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + wwdgx->WWDOG_KEY.BIT.wwdg_key = 0xDD; /* 0xDD CMD: stop wwdg function */ +} + +/** + * @brief Clear interrupt and reload watchdog counter value. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @retval None. + */ +static inline void DCL_WWDG_Refresh(WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + wwdgx->WWDOG_KEY.BIT.wwdg_key = 0xAA; /* 0xAA CMD: clear interrupt and reload value */ +} + +/** + * @brief Disable write and read WWDG registers except WWDG_LOCK. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @retval None. + */ +static inline void DCL_WWDG_LockReg(WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + wwdgx->WWDOG_KEY.BIT.wwdg_key = 0xFF; /* 0xFF CMD: key not equal 0x55 will lock reg write function except key reg */ +} + +/** + * @brief Enable write and read WWDG registers. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @retval None. + */ +static inline void DCL_WWDG_UnlockReg(WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + wwdgx->WWDOG_KEY.BIT.wwdg_key = 0x55; /* 0x55 CMD: key equal 0x55 will unlock all reg write function */ +} + +/** + * @brief Setting freq div value, value need litter than 13. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @param freqDiv freqDiv value of the WWDG counter. + * @retval None. + */ +static inline void DCL_WWDG_SetFreqDivValue(WWDG_RegStruct *wwdgx, WWDG_FreqDivType freqDiv) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + WWDG_PARAM_CHECK_NO_RET(freqDiv < WWDG_FREQ_DIV_MAX); + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_UNLOCK_REG_CMD; + wwdgx->WWDOG_PRE_DIV.BIT.wwdg_pre_div = freqDiv; /* freqDiv parameters set */ + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_UNLOCK_REG_CMD; +} + +/** + * @brief Getting freq div value, value need litter than 13. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @param freqDiv freqDiv value of the WWDG counter. + * @retval None. + */ +static inline unsigned char DCL_WWDG_GetFreqDivValue(WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + return wwdgx->WWDOG_PRE_DIV.BIT.wwdg_pre_div; +} + +/** + * @brief Enable reset signal. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @retval None. + */ +static inline void DCL_WWDG_EnableReset(WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_UNLOCK_REG_CMD; + wwdgx->WWDOG_CONTROL.BIT.resen = BASE_CFG_SET; + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_LOCK_REG_CMD; +} + +/** + * @brief Disable reset signal. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @retval None. + */ +static inline void DCL_WWDG_DisableReset(WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_UNLOCK_REG_CMD; + wwdgx->WWDOG_CONTROL.BIT.resen = BASE_CFG_UNSET; + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_LOCK_REG_CMD; +} + +/** + * @brief Start watchdog and enable interrupt signal. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @retval None. + */ +static inline void DCL_WWDG_EnableInterrupt(WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_UNLOCK_REG_CMD; + wwdgx->WWDOG_CONTROL.BIT.inten = BASE_CFG_SET; + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_LOCK_REG_CMD; +} + +/** + * @brief Disable interrupt signal. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @retval None. + */ +static inline void DCL_WWDG_DisableInterrupt(WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_UNLOCK_REG_CMD; + wwdgx->WWDOG_CONTROL.BIT.inten = BASE_CFG_UNSET; + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_LOCK_REG_CMD; +} + +/** + * @brief Ensable Windows mode. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @retval None. + */ +static inline void DCL_WWDG_EnableWindowsMode(WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_UNLOCK_REG_CMD; + wwdgx->WWDOG_CONTROL.BIT.window_mode_en = BASE_CFG_SET; + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_LOCK_REG_CMD; +} + +/** + * @brief Disable Windows mode. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @retval None. + */ +static inline void DCL_WWDG_DisableWindowsMode(WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_UNLOCK_REG_CMD; + wwdgx->WWDOG_CONTROL.BIT.window_mode_en = BASE_CFG_UNSET; + wwdgx->WWDOG_KEY.BIT.wwdg_key = WWDG_LOCK_REG_CMD; +} + +/** + * @brief Get Windows mode. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @retval bool is enable or disable. + */ +static inline bool DCL_WWDG_GetWindowsMode(WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + return wwdgx->WWDOG_CONTROL.BIT.window_mode_en; +} + +/** + * @brief Getting value of WWDG RIS register. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @retval unsigned int Value of WWDG RIS register. + */ +static inline unsigned int DCL_WWDG_GetRIS(WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + return wwdgx->WWDOG_RIS.BIT.wwdogris; +} + +/** + * @brief Getting value of WWDG MIS register. + * @param wwdgx Value of @ref WWDG_RegStruct. + * @retval unsigned int Value of WWDG MIS register. + */ +static inline unsigned int DCL_WWDG_GetMIS(WWDG_RegStruct *wwdgx) +{ + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgx)); + return wwdgx->WWDOG_MIS.BIT.wwdogmis; +} + +/** + * @brief check wwdg time type parameter. + * @param timeType Value of @ref WWDG_TimeType. + * @retval Bool. + */ +static inline bool IsWwdgTimeType(WWDG_TimeType timeType) +{ + return (timeType == WWDG_TIME_UNIT_TICK || + timeType == WWDG_TIME_UNIT_S || + timeType == WWDG_TIME_UNIT_MS || + timeType == WWDG_TIME_UNIT_US); +} + +/** + * @brief check wdg time value parameter. + * @param baseAddress Value of @ref WDG_RegStruct + * @param timeValue time value + * @param timeType Value of @ref WDG_TimeType. + * @retval Bool. + */ +static inline bool IsWwdgTimeValue(WWDG_RegStruct *baseAddress, float timeValue, WWDG_TimeType timeType) +{ + float clockFreq = (float)HAL_CRG_GetIpFreq((void *)baseAddress); + float maxSecond = (float)(0xFFFFFFFF / clockFreq); /* 0xFFFFFFFF max input value */ + return ((timeType == WWDG_TIME_UNIT_TICK && timeValue <= 0xFFFFFFFF) || + (timeType == WWDG_TIME_UNIT_S && maxSecond >= timeValue) || + (timeType == WWDG_TIME_UNIT_MS && maxSecond >= timeValue / FREQ_CONVERT_MS_UNIT) || + (timeType == WWDG_TIME_UNIT_US && maxSecond >= timeValue / FREQ_CONVERT_US_UNIT)); +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_WWDG_IP_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/wwdg/src/wwdg.c b/vendor/others/demo/5-tim_adc/demo/drivers/wwdg/src/wwdg.c new file mode 100644 index 000000000..aa00350df --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/wwdg/src/wwdg.c @@ -0,0 +1,256 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file wwdg.c + * @author MCU Driver Team + * @brief WWDG module driver + * @details This file provides firmware functions to manage the following functionalities of the WWDG. + * + Initialization functions. + * + WWDG Set And Get Functions. + * + Interrupt Handler Functions. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "interrupt.h" +#include "wwdg.h" + +/* Macro definitions ---------------------------------------------------------*/ +#define WWDG_LOAD_VALUE_LIMIT 65535 +#define WWDG_WINDOW_VALUE_LIMIT 65535 +static unsigned int WWDG_CalculateRegTimeout(WWDG_RegStruct *baseAddress, float timeValue, WWDG_TimeType timeType); + +/** + * @brief Initializing WWDG values + * @param handle Value of @ref WWDG_handle. + * @retval BASE_StatusType: OK, ERROR + */ +BASE_StatusType HAL_WWDG_Init(WWDG_Handle *handle) +{ + WWDG_ASSERT_PARAM(handle != NULL); + WWDG_ASSERT_PARAM(IsWWDGInstance(handle->baseAddress)); + WWDG_PARAM_CHECK_WITH_RET(IsWwdgTimeType(handle->timeType), BASE_STATUS_ERROR); + WWDG_PARAM_CHECK_WITH_RET(IsWwdgTimeValue(handle->baseAddress, handle->timeValue, handle->timeType), + BASE_STATUS_ERROR); + /* The frequency divide value cannot exceed 8192. */ + unsigned int freqDivVal = (handle->freqDivValue > WWDG_FREQ_DIV_MAX) ? WWDG_FREQ_DIV_8192 : handle->freqDivValue; + DCL_WWDG_SetFreqDivValue(handle->baseAddress, freqDivVal); + HAL_WWDG_SetTimeValue(handle, handle->timeValue, handle->timeType); + /* Window mode enable */ + if (handle->baseAddress->WWDOG_CONTROL.BIT.window_mode_en == BASE_CFG_ENABLE) { + unsigned int value = + WWDG_CalculateRegTimeout(handle->baseAddress, handle->windowValue, handle->timeType); + unsigned int freqDiv = DCL_WWDG_GetFreqDivValue(handle->baseAddress); + value = (value / (1 << freqDiv)); + /* The upper limit of the window value is determined. */ + value = (value <= WWDG_WINDOW_VALUE_LIMIT) ? value : WWDG_WINDOW_VALUE_LIMIT; + /* window value only could be set litter than load value */ + value = (value < handle->baseAddress->WWDOG_LOAD.BIT.wwdg_load) ? value : + handle->baseAddress->WWDOG_LOAD.BIT.wwdg_load; + DCL_WWDG_SetWindowValue(handle->baseAddress, value); + } + DCL_WWDG_EnableInterrupt(handle->baseAddress); /* enable interrupt */ + DCL_WWDG_EnableReset(handle->baseAddress); /* enable reset */ + return BASE_STATUS_OK; +} + +/** + * @brief Calculate Reg Timeout. + * @param timeValue Value to be load to wwdg. + * @param timeType Value of @ref WWDG_TimeType. + * @retval unsigned int timeout Value. + */ +static unsigned int WWDG_CalculateRegTimeout(WWDG_RegStruct *baseAddress, float timeValue, WWDG_TimeType timeType) +{ + float clockFreq = (float)HAL_CRG_GetIpFreq((void *)baseAddress); + unsigned int timeoutValue = 0x00000000U; + switch (timeType) { + case WWDG_TIME_UNIT_TICK: /* If the time type is tick, calculate the timeout value. */ + timeoutValue = (unsigned int)timeValue; + break; + case WWDG_TIME_UNIT_S: /* If the time type is s, calculate the timeout value. */ + timeoutValue = (unsigned int)(timeValue * clockFreq); + break; + case WWDG_TIME_UNIT_MS: /* If the time type is ms, calculate the timeout value. */ + timeoutValue = (unsigned int)(timeValue * clockFreq / FREQ_CONVERT_MS_UNIT); + break; + case WWDG_TIME_UNIT_US: /* If the time type is us, calculate the timeout value. */ + timeoutValue = (unsigned int)(timeValue * clockFreq / FREQ_CONVERT_US_UNIT); + break; + default: + break; + } + return timeoutValue; +} + +/** + * @brief Setting the load value of the WWDG counter. + * @param handle Value of @ref WWDG_handle. + * @param timeValue time value of the WWDG counter. + * @param timeType WWDG time type. + * @retval None. + */ +void HAL_WWDG_SetTimeValue(WWDG_Handle *handle, unsigned int timeValue, WWDG_TimeType timeType) +{ + WWDG_ASSERT_PARAM(handle != NULL); + WWDG_ASSERT_PARAM(IsWWDGInstance(handle->baseAddress)); + WWDG_PARAM_CHECK_NO_RET(IsWwdgTimeType(timeType)); + WWDG_PARAM_CHECK_NO_RET(IsWwdgTimeValue(handle->baseAddress, timeValue, timeType)); + /* handle->baseAddress only could be configed WWDG */ + unsigned int value = WWDG_CalculateRegTimeout(handle->baseAddress, timeValue, timeType); + unsigned int freqDiv = DCL_WWDG_GetFreqDivValue(handle->baseAddress); + value = (value / (1 << freqDiv)); + /* The upper limit of the loaded value is determined. */ + value = (value <= WWDG_LOAD_VALUE_LIMIT) ? value : WWDG_LOAD_VALUE_LIMIT; + DCL_WWDG_SetLoadValue(handle->baseAddress, value); +} + +/** + * @brief refresh the WWDG counter. + * @param handle Value of @ref WWDG_handle. + * @retval None. + */ +void HAL_WWDG_Refresh(WWDG_Handle *handle) +{ + WWDG_ASSERT_PARAM(handle != NULL); + WWDG_ASSERT_PARAM(IsWWDGInstance(handle->baseAddress)); + DCL_WWDG_Refresh(handle->baseAddress); +} + +/** + * @brief obtain the load value. + * @param handle Value of @ref WWDG_handle. + * @retval unsigned int time value. + */ +unsigned int HAL_WWDG_GetLoadValue(WWDG_Handle *handle) +{ + WWDG_ASSERT_PARAM(handle != NULL); + WWDG_ASSERT_PARAM(IsWWDGInstance(handle->baseAddress)); + return DCL_WWDG_GetLoadValue(handle->baseAddress); +} + +/** + * @brief Getting the window value of the WWDG counter. + * @param handle Value of @ref WWDG_handle. + * @retval unsigned int the value of window reg value. + */ +unsigned int HAL_WWDG_GetWindowValue(WWDG_Handle *handle) +{ + WWDG_ASSERT_PARAM(handle != NULL); + WWDG_ASSERT_PARAM(IsWWDGInstance(handle->baseAddress)); + /* handle->baseAddress only could be configed WWDG */ + return DCL_WWDG_GetWindowValue(handle->baseAddress); +} + +/** + * @brief Refresh the WWDG counter value. + * @param handle Value of @ref WWDG_handle. + * @retval unsigned int Counter value. + */ +unsigned int HAL_WWDG_GetCounterValue(WWDG_Handle *handle) +{ + WWDG_ASSERT_PARAM(handle != NULL); + WWDG_ASSERT_PARAM(IsWWDGInstance(handle->baseAddress)); + + float res = (float)handle->baseAddress->WWDOG_VALUE.BIT.wwdg_value; + if (res >= 65535) { /* 65535 is WWDG maximum current count */ + return handle->timeValue; + } + unsigned int freq = HAL_CRG_GetIpFreq((void *)handle->baseAddress); + /* check clockFreq not equal zero */ + if (freq == 0) { + return 0; + } + unsigned int freqDiv = DCL_WWDG_GetFreqDivValue(handle->baseAddress); + switch (handle->timeType) { + case WWDG_TIME_UNIT_TICK: + /* Number of tick currently calculated */ + res = res * (1 << freqDiv); + break; + case WWDG_TIME_UNIT_S: + /* Number of seconds currently calculated */ + res = res * (1 << freqDiv) / freq; + break; + case WWDG_TIME_UNIT_MS: + res = res * (1 << freqDiv) * FREQ_CONVERT_MS_UNIT / freq; + break; + case WWDG_TIME_UNIT_US: + /* Number of microseconds currently calculated */ + res = res * (1 << freqDiv) * FREQ_CONVERT_US_UNIT / freq; + break; + default: + break; + } + return (unsigned int)res; +} + +/** + * @brief Start the WWDG count. + * @param handle Value of @ref WWDG_handle. + * @retval None. + */ +void HAL_WWDG_Start(WWDG_Handle *handle) +{ + WWDG_ASSERT_PARAM(handle != NULL); + WWDG_ASSERT_PARAM(IsWWDGInstance(handle->baseAddress)); + DCL_WWDG_Start(handle->baseAddress); +} + +/** + * @brief Stop the WWDG count. + * @param handle Value of @ref WWDG_handle. + * @retval None. + */ +void HAL_WWDG_Stop(WWDG_Handle *handle) +{ + WWDG_ASSERT_PARAM(handle != NULL); + WWDG_ASSERT_PARAM(IsWWDGInstance(handle->baseAddress)); + DCL_WWDG_Stop(handle->baseAddress); +} + +/** + * @brief Register WWDG interrupt callback. + * @param handle Value of @ref WWDG_handle. + * @param callBackFunc Value of @ref WWDG_CallbackType. + * @retval None + */ +void HAL_WWDG_RegisterCallback(WWDG_Handle *handle, WWDG_CallbackType callBackFunc) +{ + WWDG_ASSERT_PARAM(handle != NULL); + WWDG_ASSERT_PARAM(IsWWDGInstance(handle->baseAddress)); + if (callBackFunc != NULL) { + /* Invoke the callback function. */ + handle->userCallBack.CallbackFunc = callBackFunc; + } +} + +/** + * @brief Interrupt handler processing function. + * @param handle WWDG_Handle. + * @retval None. + */ +void HAL_WWDG_IrqHandler(void *handle) +{ + WWDG_Handle *wwdgHandle = (WWDG_Handle *)handle; + WWDG_ASSERT_PARAM(wwdgHandle != NULL); + WWDG_ASSERT_PARAM(IsWWDGInstance(wwdgHandle->baseAddress)); + + if (wwdgHandle->baseAddress->WWDOG_MIS.BIT.wwdogmis == 0x01) { /* Interrupt flag is set, fed dog in callback */ + if (wwdgHandle->userCallBack.CallbackFunc) { + wwdgHandle->userCallBack.CallbackFunc(wwdgHandle); + } + } +} diff --git a/vendor/others/demo/5-tim_adc/demo/drivers/wwdg/src/wwdg_ex.c b/vendor/others/demo/5-tim_adc/demo/drivers/wwdg/src/wwdg_ex.c new file mode 100644 index 000000000..36a32b1cc --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/drivers/wwdg/src/wwdg_ex.c @@ -0,0 +1,52 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file wwdg_ex.c + * @author MCU Driver Team + * @brief WWDG module driver + * @details This file provides firmware functions to manage the following functionalities of the WWDG. + * + WWDG Set And Get Functions. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "interrupt.h" +#include "wwdg_ex.h" + +/* Macro definitions ---------------------------------------------------------*/ +/** + * @brief Enable window mode. + * @param handle Value of @ref WWDG_handle. + * @retval None. + */ +void HAL_WWDG_EnableWindowModeEx(WWDG_Handle *handle) +{ + WWDG_ASSERT_PARAM(handle != NULL); + WWDG_ASSERT_PARAM(IsWWDGInstance(handle->baseAddress)); + DCL_WWDG_EnableWindowsMode(handle->baseAddress); +} + +/** + * @brief Disable window mode. + * @param handle Value of @ref WWDG_handle. + * @retval None. + */ +void HAL_WWDG_DisableWindowModeEx(WWDG_Handle *handle) +{ + WWDG_ASSERT_PARAM(handle != NULL); + WWDG_ASSERT_PARAM(IsWWDGInstance(handle->baseAddress)); + DCL_WWDG_DisableWindowsMode(handle->baseAddress); +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/adc_calibra/mcs_adcCalibr.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/adc_calibra/mcs_adcCalibr.c new file mode 100644 index 000000000..a4fdeb63c --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/adc_calibra/mcs_adcCalibr.c @@ -0,0 +1,98 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_adcCalibr.c + * @author MCU Algorithm Team + * @brief This file provides adc bias calibration function. 0722-7 + */ +#include "mcs_adcCalibr.h" +#include "mcs_assert.h" + + +/** + * @brief Get ADC result when ADC conversion completes. + * @param adcCalibr ADC calibration value. + * @param soc ID of SOC. + * @retval None. + */ +static unsigned int ADCCALIBR_GetSocResult(ADC_Handle *adcHandle, unsigned int soc) +{ + MCS_ASSERT_PARAM(adcHandle != NULL); + /* wait for ADC conversion complete */ + while (1) { + /* Check ADC conversion if completes. */ + if (HAL_ADC_CheckSocFinish(adcHandle, soc) == BASE_STATUS_OK) { + break; + } + } + return DCL_ADC_ReadSOCxResult(adcHandle->baseAddress, soc); +} + +/** + * @brief ADC calibration initialization. + * @param adcCalibr ADC calibration value. + * @retval None. + */ +void ADCCALIBR_Init(ADC_CALIBR_Handle *adcCalibr) +{ + MCS_ASSERT_PARAM(adcCalibr != NULL); + adcCalibr->adcShiftAccu = 0; + adcCalibr->cnt = 0; + adcCalibr->state = ADC_CALIBR_NOT_FINISH; +} + +/** + * @brief Compute current sampling adc offset. + * @param adcCalibr ADC calibration handle. + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval offset val. + */ +unsigned int ADCCALIBR_Exec(ADC_CALIBR_Handle *adcCalibr, ADC_Handle *adcHandle, unsigned int soc) +{ + MCS_ASSERT_PARAM(adcCalibr != NULL); + MCS_ASSERT_PARAM(adcHandle != NULL); + MCS_ASSERT_PARAM(adcCalibr->adcShiftAccu <= 4096 * ADC_CNT_POINTS); /* 4096: 12-bit adc precision. */ + adcCalibr->cnt++; + /* sum of 50 points value */ + if (adcCalibr->cnt > ADC_CNT_POINTS) { + adcCalibr->cnt = ADC_CNT_POINTS; + adcCalibr->state = ADC_CALIBR_FINISH; + return (unsigned int)((float)(adcCalibr->adcShiftAccu) / (float)ADC_CNT_POINTS); + } else { + adcCalibr->adcShiftAccu += ADCCALIBR_GetSocResult(adcHandle, soc); + adcCalibr->state = ADC_CALIBR_NOT_FINISH; + return 0; + } + /* Returns the offset sampling average */ + return 0; +} + +/** + * @brief Returns the motor control status based on whether the calibration is complete or not. + * @param adcCalibr ADC calibration handle. + * @retval bool. + */ +bool ADCCALIBR_IsFinish(ADC_CALIBR_Handle *adcCalibr) +{ + MCS_ASSERT_PARAM(adcCalibr != NULL); + if (adcCalibr->state == ADC_CALIBR_FINISH) { + return true; + } + + return false; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/adc_calibra/mcs_adcCalibr.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/adc_calibra/mcs_adcCalibr.h new file mode 100644 index 000000000..87a21c007 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/adc_calibra/mcs_adcCalibr.h @@ -0,0 +1,55 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_adcCalibr.h + * @author MCU Algorithm Team + * @brief This file provides functions declaration for adc bias calibration function. + */ +#ifndef McuMagicTag_MCS_ADCCALIB_H +#define McuMagicTag_MCS_ADCCALIB_H + +#include "adc.h" +#include "typedefs.h" + +/* Macro definitions --------------------------------------------------------------------------- */ +#define ADC_CNT_POINTS 50 /* the number of continuous adc results for calibration */ + +/** + * @brief ADC temperature calibration state. + */ +typedef enum { + ADC_CALIBR_NOT_FINISH = 0, + ADC_CALIBR_FINISH +} ADC_CALIBR_State; + +/** + * @brief Adc temperature shift calibration structure. + */ +typedef struct { + unsigned int adcShiftAccu; + unsigned int cnt; + ADC_CALIBR_State state; +} ADC_CALIBR_Handle; + + +void ADCCALIBR_Init(ADC_CALIBR_Handle *adcCalibr); + +unsigned int ADCCALIBR_Exec(ADC_CALIBR_Handle *adcCalibr, ADC_Handle *adcHandle, unsigned int soc); + +bool ADCCALIBR_IsFinish(ADC_CALIBR_Handle *adcCalibr); + +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/brake/mcs_brake.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/brake/mcs_brake.c new file mode 100644 index 000000000..357cce8d2 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/brake/mcs_brake.c @@ -0,0 +1,105 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_brake.c + * @author MCU Algorithm Team + * @brief This file provides functions of brake module. + */ +#include "mcs_brake.h" +#include "mcs_math.h" +#include "mcs_assert.h" + + +/** + * @brief Initialize brake handle. + * @param brake: Pointer of Brake Handle. + * @param brkParam: Brake parameters. + * @retval None. + */ +void BRAKE_Init(BRAKE_Handle *brake, BRAKE_Param *brkParam) +{ + MCS_ASSERT_PARAM(brake != NULL); + MCS_ASSERT_PARAM(brkParam != NULL); + MCS_ASSERT_PARAM(brkParam->ts > 0.0f); + /* Set brake parameter. */ + brake->brkParam = brkParam; + brake->sampleShiftDuty = brkParam->sampleWinTime / brkParam->ts; + /* Brake count. */ + brake->tickNum = (unsigned int)(brkParam->brkTime / brkParam->ts); +} + +/** + * @brief Clear historical values of brake handle. + * @param brake: Pointer of Brake Handle. + * @retval None. + */ +void BRAKE_Clear(BRAKE_Handle *brake) +{ + MCS_ASSERT_PARAM(brake != NULL); + brake->brkDuty = 0.0f; /* brake duty */ + /* counter for calculating brake time */ + brake->tickCnt = 0; + /* brake status */ + brake->brkFlg = 0; + + brake->brkFlg = BRAKE_WAIT; +} + +/** + * @brief Brake execution. + * @param brake: Pointer of Brake Handle. + * @param brkCurr: Sampling result of current during brake condition (A). + * @retval None. + */ +void BRAKE_Exec(BRAKE_Handle *brake, float brkCurr) +{ + MCS_ASSERT_PARAM(brake != NULL); + MCS_ASSERT_PARAM(brkCurr > 0.0f); + float dutyMax = 1.0f; + float curr = Abs(brkCurr); + float maxCurr = brake->brkParam->maxBrkCurr; + float sampleShiftDuty = brake->sampleShiftDuty; + unsigned int tickNum = brake->tickNum; + + if (brake->brkFlg == BRAKE_FINISHED) { + return; + } + + /* Collect statistics on the total braking duration */ + brake->tickCnt++; + if (brake->tickCnt >= tickNum) { + /* Time to push out the brakes */ + brake->brkFlg = BRAKE_FINISHED; + } + + if (curr < (maxCurr * brake->brkParam->fastBrkCurrCoeff)) { + brake->brkDuty += brake->brkParam->maxBrkDutyStep; + } else if (curr < maxCurr) { + brake->brkDuty += brake->brkParam->minBrkDutyStep; + } else { + brake->brkDuty -= brake->brkParam->maxBrkDutyStep; + } + + /* Reserved sampling window */ + brake->brkDuty = Clamp(brake->brkDuty, dutyMax - 2.0f * sampleShiftDuty, 0.0f); + if (curr <= (maxCurr * brake->brkParam->openLoopBrkCurrCoeff) && + brake->brkDuty >= dutyMax - 3.0f * sampleShiftDuty) { + /* Because the duty cycle is too large to collect the current, the brake open loop control */ + brake->brkDuty += brake->brkParam->openLoopBrkDutyStep; + brake->brkDuty = Clamp(brake->brkDuty, dutyMax, 0.0f); + } +} diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/brake/mcs_brake.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/brake/mcs_brake.h new file mode 100644 index 000000000..26a867ae2 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/brake/mcs_brake.h @@ -0,0 +1,61 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_brake.c + * @author MCU Algorithm Team + * @brief This file provides functions of brake module. + */ + +#ifndef McuMagicTag_MCS_BRAKE_H +#define McuMagicTag_MCS_BRAKE_H + +/* Typedef definitions ------------------------------------------------------------------------- */ +/** + * @brief Brake Struct. + */ +typedef struct { + float ts; /**< control period (s). */ + float brkTime; /**< brake time (s). */ + float sampleWinTime; /**< sample shift. */ + float maxBrkCurr; /**< maximum brake current (A). */ + float minBrkDutyStep; /**< small brake duty step, recommend value: 0.001f. */ + float maxBrkDutyStep; /**< large brake duty step, recommend value: 0.005f. */ + float fastBrkCurrCoeff; /**< current threshold coefficient for fast braking, recommend value: 0.5f. */ + float openLoopBrkDutyStep; /**< open-loop brake duty step, recommend value: 0.0001f. */ + float openLoopBrkCurrCoeff; /**< current threshold coefficient for open-loop braking, recommend value: 0.2f. */ +} BRAKE_Param; + + +typedef struct { + float brkDuty; /**< pwm duty ratio of lower switch during brake condition (0~1). */ + float sampleShiftDuty; /**< phase shift duty of sample point for brake current (0~1). */ + unsigned int tickCnt; /**< counter for calculating brake time. */ + unsigned int tickNum; /**< count number corresponding to brake time. */ + unsigned char brkFlg; /**< brake status. */ + BRAKE_Param *brkParam; +} BRAKE_Handle; + +typedef enum { + BRAKE_WAIT = 0, + BRAKE_FINISHED +} BRAKE_Status; + +void BRAKE_Init(BRAKE_Handle *brake, BRAKE_Param *brkParam); +void BRAKE_Clear(BRAKE_Handle *brake); +void BRAKE_Exec(BRAKE_Handle *brake, float brkCurr); + +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_filter.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_filter.c new file mode 100644 index 000000000..1aadd97a0 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_filter.c @@ -0,0 +1,94 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_filter.c + * @author MCU Algorithm Team + * @brief This file provides functions of first-order filter. + */ + +#include "mcs_filter.h" +#include "mcs_math_const.h" +#include "mcs_assert.h" + +/** + * @brief Initialzer of first-order low-pass filter handle. + * @param lpfHandle First-order filter handle. + * @param ts Control period (s). + * @param fc Cut-off frequency (Hz). + * @retval None. + */ +void FOLPF_Init(FOFLT_Handle *lpfHandle, float ts, float fc) +{ + MCS_ASSERT_PARAM(lpfHandle != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + MCS_ASSERT_PARAM(fc > 0.0f); + lpfHandle->ts = ts; + lpfHandle->fc = fc; + + FOLPF_Clear(lpfHandle); + + /* y(k) = (1/(1+wcTs)) * y(k-1) + (wcTs/(1+wcTs)) * u(k) */ + float wcTs = DOUBLE_PI * fc * ts; + lpfHandle->a1 = 1.0f / (1.0f + wcTs); /* wcTs > 0 */ + lpfHandle->b1 = 1.0f - lpfHandle->a1; +} + +/** + * @brief Clear historical values of first-order filter handle. + * @param FOFLT_Handle First-order filter handle. + * @retval None. + */ +void FOLPF_Clear(FOFLT_Handle *lpfHandle) +{ + MCS_ASSERT_PARAM(lpfHandle != NULL); + lpfHandle->uLast = 0.0f; + lpfHandle->yLast = 0.0f; +} + +/**lpfBkwd + * @brief Calculation method of first-order filter. + * @param lpfHandle First-order filter handle. + * @param u The signal that wants to be filtered. + * @retval The signal that is filtered. + */ +float FOLPF_Exec(FOFLT_Handle *lpfHandle, float u) +{ + MCS_ASSERT_PARAM(lpfHandle != NULL); + float out; + /* Transfer Func: G(s) = kw/(s+w), k = 1. */ + /* y(k) = (1/(1+wcTs)) * y(k-1) + (wcTs/(1+wcTs)) * u(k) */ + out = lpfHandle->a1 * lpfHandle->yLast + lpfHandle->b1 * u; + lpfHandle->yLast = out; + return out; +} + +/** + * @brief Set ts of first-order filter. + * @param lpfHandle First-order filter handle. + * @param ts Control period (s). + * @retval None. + */ +void FOLPF_SetTs(FOFLT_Handle *lpfHandle, float ts) +{ + MCS_ASSERT_PARAM(lpfHandle != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + lpfHandle->ts = ts; + + float wcTs = DOUBLE_PI * lpfHandle->fc * ts; + lpfHandle->a1 = 1.0f / (1.0f + wcTs); /* wcTs > 0 */ + lpfHandle->b1 = 1.0f - lpfHandle->a1; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_filter.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_filter.h new file mode 100644 index 000000000..7fee90fc9 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_filter.h @@ -0,0 +1,61 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_filter.h + * @author MCU Algorithm Team + * @brief filter library. + * This file provides functions declaration of the filter module. + */ + +/* Define to prevent recursive inclusion ------------------------------------------------------- */ +#ifndef McuMagicTag_MCS_FILTER_H +#define McuMagicTag_MCS_FILTER_H + +/* Typedef definitions ------------------------------------------------------------------------- */ + +/** + * @brief 1st-order Filter struct members and parameters. + * LPF(low-pass filter): y(k)=a1*y(k-1)+b1*u(k) + * HPF(high-pass filter): y(k)=a1*y(k-1)+b1*u(k)+b2*u(k-1) + */ +typedef struct { + float yLast; /**< Last output of 1st-order filter. */ + float uLast; /**< Last input variable. */ + float fc; /**< 1st-order filter cut-off frequency (Hz). */ + float ts; /**< 1st-order filter running period. */ + float a1; /**< Coefficient of 1st-order filter. */ + float b1; /**< Coefficient of 1st-order filter. */ + float b2; /**< Coefficient of 1st-order filter. */ +} FOFLT_Handle; + + +/** + * @defgroup FILTER_API FILTER API + * @brief Filter function API declaration. + * Transfer Func: G(s) = kw/(s+w), k = 1. + */ +void FOLPF_Init(FOFLT_Handle *lpfHandle, float ts, float fc); +void FOLPF_Clear(FOFLT_Handle *lpfHandle); +float FOLPF_Exec(FOFLT_Handle *lpfHandle, float u); +void FOLPF_SetTs(FOFLT_Handle *lpfHandle, float ts); + + +/** + * @} + */ + +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_lpfRk4.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_lpfRk4.c new file mode 100644 index 000000000..47f495aab --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_lpfRk4.c @@ -0,0 +1,82 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_LpfRk4.c + * @author MCU Algorithm Team + * @brief This file provides function of 4-order low-pass filter. + */ + +#include "mcs_lpfRk4.h" +#include "mcs_math_const.h" +#include "mcs_assert.h" +#include "mcs_math.h" + +#define RK4_GAIN (0.5f) +#define RK4_COEFF (0.1666667f) +#define LARGE_NUM (100000000.0f) +#define SMALL_NUM (-100000000.0f) + +/** + * @brief Clear historical values of 4-order low-pass filter handle. + * @param LPF_RK4_Handle 4-order low-pass filter handle. + * @retval None. + */ +void LPFRK4_Clear(LPF_RK4_Handle *lpf) +{ + MCS_ASSERT_PARAM(lpf != NULL); + lpf->y1 = 0.0f; +} + +/** + * @brief Calculation method of 4-order low-pass filter. + * @param LPF_RK4_Handle filter handle. + * @param u The signal that wants to be filtered. + * @param freq Cut-off frequency (Hz). + * @param ts Control period (s). + * @retval The signal that is filered. + */ +float LPFRK4_Exec(LPF_RK4_Handle *lpf, float u, float freq, float ts) +{ + MCS_ASSERT_PARAM(lpf != NULL); + MCS_ASSERT_PARAM(freq > 0.0f); + MCS_ASSERT_PARAM(ts > 0.0f); + float wc = freq * DOUBLE_PI; + float y1 = lpf->y1; + float k1, k2, k3, k4, temp; + + /* Calculate K1. */ + float diff = wc * (u - y1); + k1 = diff * ts; + temp = y1 + k1 * RK4_GAIN; + /* Calculate K2. */ + diff = wc * (u - temp); + k2 = diff * ts; + temp = y1 + k2 * RK4_GAIN; + /* Calculate K3. */ + diff = wc * (u - temp); + k3 = diff * ts; + temp = y1 + k3; + /* Calculate K4. */ + diff = wc * (u - temp); + k4 = diff * ts; + /* Calculate the final result. */ + y1 += (k1 + 2.0f * k2 + 2.0f * k3 + k4) * RK4_COEFF; + y1 = Clamp(y1, LARGE_NUM, SMALL_NUM); + lpf->y1 = y1; + + return y1; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_lpfRk4.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_lpfRk4.h new file mode 100644 index 000000000..3cf8b2a76 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_lpfRk4.h @@ -0,0 +1,39 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_LpfRk4.h + * @author MCU Algorithm Team + * @brief This file provides functions declaration of 4-order low-pass filter. + */ +/* Define to prevent recursive inclusion ------------------------------------------------------- */ +#ifndef McuMagicTag_MCS_LPFRK4_H +#define McuMagicTag_MCS_LPFRK4_H + + +/** + * @brief First Order Low-pass-filter by RK4. + */ +typedef struct { + float y1; +} LPF_RK4_Handle; + + +void LPFRK4_Clear(LPF_RK4_Handle *lpf); + +float LPFRK4_Exec(LPF_RK4_Handle *lpf, float u, float freq, float ts); + +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_pll.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_pll.c new file mode 100644 index 000000000..8eba6cca0 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_pll.c @@ -0,0 +1,142 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_pll.c + * @author MCU Algorithm Team + * @brief This file provides function of phase-locked loop (PLL) module. + */ + +#include "mcs_pll.h" +#include "mcs_math.h" +#include "mcs_math_const.h" +#include "mcs_assert.h" + +/** + * @brief Initialzer of Pll struct handle. + * @param pllHandle pll struct handle. + * @param ts control period (s). + * @param bdw bandwidth (Hz). + * @retval None. + */ +void PLL_Init(PLL_Handle *pllHandle, float ts, float bdw) +{ + MCS_ASSERT_PARAM(pllHandle != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + MCS_ASSERT_PARAM(bdw > 0.0f); + /* Reset PLL PID. */ + PID_Reset(&pllHandle->pi); + /* Initializing PLL Parameters. */ + pllHandle->ts = ts; + pllHandle->pi.upperLimit = LARGE_FLOAT; /* The upper limit value of the pid comp output. */ + pllHandle->pi.lowerLimit = -pllHandle->pi.upperLimit; + pllHandle->minAmp = 0.1f; /* Minimum value of the input value in case of the divergence of the PLL. */ + pllHandle->freq = 0.0f; + pllHandle->angle = 0.0f; + pllHandle->ratio = DOUBLE_PI * ts; + pllHandle->pllBdw = bdw; + pllHandle->pi.ts = pllHandle->ts; + PLL_ParamUpdate(pllHandle, pllHandle->pllBdw); +} + +/** + * @brief Updating PLL PI Parameters. + * @param pllHandle pll struct handle. + * @param bdw bandwidth (Hz). + * @retval None. + */ +void PLL_ParamUpdate(PLL_Handle *pllHandle, float bdw) +{ + MCS_ASSERT_PARAM(pllHandle != NULL); + MCS_ASSERT_PARAM(bdw > 0.0f); + float we = bdw * DOUBLE_PI; /* PLL bandwidth (unit: Hz) */ + pllHandle->pi.kp = 2.0f * we; /* 2.0f * we */ + pllHandle->pi.ki = we * we; +} + +/** + * @brief Reset the PLL handle, fill all parameters with zero. + * @param pllHandle PLL struct handle. + * @retval None. + */ +void PLL_Reset(PLL_Handle *pllHandle) +{ + MCS_ASSERT_PARAM(pllHandle != NULL); + /* Reset PLL PID parameters */ + PID_Reset(&(pllHandle->pi)); + pllHandle->minAmp = 0.0f; + pllHandle->ts = 0.0f; + pllHandle->ratio = 0.0f; + pllHandle->freq = 0.0f; + pllHandle->angle = 0; +} + +/** + * @brief Clear historical values of PLL controller. + * @param pllHandle PLL struct handle. + * @retval None. + */ +void PLL_Clear(PLL_Handle *pllHandle) +{ + MCS_ASSERT_PARAM(pllHandle != NULL); + PID_Clear(&pllHandle->pi); +} + +/** + * @brief Calculation method of PLL controller. + * @param pllHandle PLL struct handle. + * @param sinVal Input sin value. + * @param cosVal Input cos value. + * @retval None. + */ +void PLL_Exec(PLL_Handle *pllHandle, float sinVal, float cosVal) +{ + MCS_ASSERT_PARAM(pllHandle != NULL); + + float amplitude = Sqrt(sinVal * sinVal + cosVal * cosVal); + amplitude = (amplitude < pllHandle->minAmp) ? pllHandle->minAmp : amplitude; /* amplitude > minAmp > 0 */ + + TrigVal localTrigVal; + pllHandle->angle += pllHandle->freq * pllHandle->ratio; + pllHandle->angle = Mod(pllHandle->angle, DOUBLE_PI); + if (pllHandle->angle > ONE_PI) { + pllHandle->angle -= DOUBLE_PI; + } + if (pllHandle->angle < -ONE_PI) { + pllHandle->angle += DOUBLE_PI; + } + TrigCalc(&localTrigVal, pllHandle->angle); + + float err = sinVal * localTrigVal.cos - cosVal * localTrigVal.sin; + pllHandle->pi.error = err / amplitude; /* amplitude != 0 */ + pllHandle->freq = PI_Exec(&pllHandle->pi); +} + +/** + * @brief Set ts of PLL controller. + * @param pllHandle PLL struct handle. + * @param ts control period (s). + * @retval None. + */ +void PLL_SetTs(PLL_Handle *pllHandle, float ts) +{ + MCS_ASSERT_PARAM(pllHandle != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + /* It is need to modify the pid sample time, pll ratio when set PLL ts. */ + pllHandle->ts = ts; + PID_SetTs(&pllHandle->pi, ts); + pllHandle->ratio = DOUBLE_PI * ts; +} diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_pll.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_pll.h new file mode 100644 index 000000000..7a0228b86 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/filter/mcs_pll.h @@ -0,0 +1,72 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_pll.h + * @author MCU Algorithm Team + * @brief This file provides functions declaration of Phase-locked loop (PLL) module. + */ + +/* Define to prevent recursive inclusion ------------------------------------------------------- */ +#ifndef McuMagicTag_MCS_PLL_H +#define McuMagicTag_MCS_PLL_H + +/* Includes ------------------------------------------------------------------------------------ */ +#include "mcs_pid_ctrl.h" + +/** + * @defgroup PLL_MODULE PLL MODULE + * @brief The PLL module. + * @{ + */ + +/** + * @defgroup PLL_STRUCT PLL STRUCT + * @brief The PLL module data structure. + * @{ + */ +/* Typedef definitions ------------------------------------------------------------------------- */ +/** + * @brief PLL struct. + */ +typedef struct { + PID_Handle pi; /**< PI controller for the PLL. */ + float minAmp; /**< Minimum value of the input value in case of the divergence of the PLL. */ + float ts; /**< Control period of the PLL. */ + float ratio; /**< Conversion factor, ts * 65535 / TWO_PI. */ + float freq; /**< Output estimated frequency (Hz). */ + float angle; /**< Output estimated phasse angle. */ + float pllBdw; /**< pll bandWidth. */ +} PLL_Handle; + + +/** + * @defgroup PLL_API PLL API + * @brief The PLL module API definitions. + */ +void PLL_Init(PLL_Handle *pllHandle, float ts, float bdw); + +void PLL_Reset(PLL_Handle *pllHandle); + +void PLL_Clear(PLL_Handle *pllHandle); + +void PLL_Exec(PLL_Handle *pllHandle, float sinVal, float cosVal); + +void PLL_SetTs(PLL_Handle *pllHandle, float ts); + +void PLL_ParamUpdate(PLL_Handle *pllHandle, float bdw); + +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.c new file mode 100644 index 000000000..17ecb6ee6 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.c @@ -0,0 +1,148 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_curr_ctrl.c + * @author MCU Algorithm Team + * @brief This file provides function of motor current control. + */ + +#include "typedefs.h" +#include "mcs_curr_ctrl.h" +#include "mcs_math_const.h" +#include "mcs_assert.h" +#include "mcs_curr_ff.h" + + +/** + * @brief Initialzer of Current controller. + * @param currHandle Current control handle. + * @param pidTable Motor control handle. + * @param mtrParam Motor parameters. + * @param idqRef idqRef. + * @param idqFbk idqFbk. + * @param busVolt Bus voltage. + * @param ts control period. + * @retval None. + */ +void CURRCTRL_Init(CURRCTRL_Handle *currHandle, MOTOR_Param *mtrParam, DqAxis *idqRef, DqAxis *idqFbk, + const PI_Param dAxisPi, const PI_Param qAxisPi, float ts) +{ + MCS_ASSERT_PARAM(currHandle != NULL); + MCS_ASSERT_PARAM(mtrParam != NULL); + MCS_ASSERT_PARAM(idqRef != NULL); + MCS_ASSERT_PARAM(idqFbk != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + /* Clear the control parameter. */ + CURRCTRL_Reset(currHandle); + /* Current Pointer. */ + currHandle->idqRef = idqRef; + currHandle->idqFbk = idqFbk; + currHandle->mtrParam = mtrParam; + /* The feedforward value is set to 0 by default. */ + currHandle->idqFf.d = 0.0f; + currHandle->idqFf.q = 0.0f; + + /* Parameter initialization. */ + currHandle->ts = ts; + currHandle->dAxisPi.ts = ts; + currHandle->qAxisPi.ts = ts; + + currHandle->dAxisPi.kp = dAxisPi.kp; + currHandle->dAxisPi.ki = dAxisPi.ki; + currHandle->qAxisPi.kp = qAxisPi.kp; + currHandle->qAxisPi.ki = qAxisPi.ki; + /* output voltage limit. */ + currHandle->outLimit = qAxisPi.upperLim; + currHandle->dAxisPi.upperLimit = dAxisPi.upperLim; + currHandle->dAxisPi.lowerLimit = dAxisPi.lowerLim; + currHandle->qAxisPi.upperLimit = qAxisPi.upperLim; + currHandle->qAxisPi.lowerLimit = qAxisPi.lowerLim; +} + +/** + * @brief Reset the current control handle, fill with zero, NULL. + * @param currHandle The current control handle. + * @retval None. + */ +void CURRCTRL_Reset(CURRCTRL_Handle *currHandle) +{ + MCS_ASSERT_PARAM(currHandle != NULL); + /* Reset the current control handle, fill with zero, NULL. */ + currHandle->idqRef = NULL; + currHandle->idqFbk = NULL; + currHandle->idqFf.d = 0.0f; + currHandle->idqFf.q = 0.0f; + currHandle->mtrParam = NULL; + currHandle->outLimit = 0.0f; + currHandle->ts = 0.0f; + /* Reset Dq axis PID current control */ + PID_Reset(&currHandle->dAxisPi); + PID_Reset(&currHandle->qAxisPi); +} + +/** + * @brief Clear historical values of current controller. + * @param currHandle Current controller struct handle. + * @retval None. + */ +void CURRCTRL_Clear(CURRCTRL_Handle *currHandle) +{ + MCS_ASSERT_PARAM(currHandle != NULL); + PID_Clear(&currHandle->dAxisPi); + PID_Clear(&currHandle->qAxisPi); +} + + +/** + * @brief Simplified current controller PI calculation. + * @param currHandle Current controller struct handle. + * @param voltRef Dq-axis voltage reference which is the output of current controller. + * @param spd speed (Hz). + * @param ffEnable Feedforward compensation enable. + * @retval None. + */ +void CURRCTRL_Exec(CURRCTRL_Handle *currHandle, DqAxis *vdqRef, float spd, int ffEnable) +{ + MCS_ASSERT_PARAM(currHandle != NULL); + MCS_ASSERT_PARAM(vdqRef != NULL); + DqAxis vdqFf; + + /* Calculate the current error of the dq axis. */ + currHandle->dAxisPi.error = currHandle->idqRef->d - currHandle->idqFbk->d; + currHandle->qAxisPi.error = currHandle->idqRef->q - currHandle->idqFbk->q; + CURRFF_Exec(&vdqFf, *currHandle->idqFbk, currHandle->mtrParam, spd, ffEnable); + currHandle->dAxisPi.feedforward = vdqFf.d; + currHandle->qAxisPi.feedforward = vdqFf.q; + /* Calculation of the PI of the Dq axis current. */ + vdqRef->d = PI_Exec(&currHandle->dAxisPi); + vdqRef->q = PI_Exec(&currHandle->qAxisPi); +} + +/** + * @brief Set ts of current controller. + * @param currHandle Current controller struct handle. + * @retval None. + */ +void CURRCTRL_SetTs(CURRCTRL_Handle *currHandle, float ts) +{ + MCS_ASSERT_PARAM(currHandle != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + currHandle->ts = ts; + /* Set d and q axes pid sample time. */ + PID_SetTs(&currHandle->dAxisPi, ts); + PID_SetTs(&currHandle->qAxisPi, ts); +} diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.h new file mode 100644 index 000000000..0fe6b555a --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.h @@ -0,0 +1,87 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_curr_ctrl.h + * @author MCU Algorithm Team + * @brief Current controller for motor control. + * This file provides functions declaration of the current controller module. + */ + +/* Define to prevent recursive inclusion ------------------------------------------------------- */ +#ifndef McuMagicTag_MCS_CURR_CTRL_H +#define McuMagicTag_MCS_CURR_CTRL_H + +/* Includes ------------------------------------------------------------------------------------ */ +#include "mcs_typedef.h" +#include "mcs_pid_ctrl.h" +#include "mcs_mtr_param.h" + +/** + * @defgroup CURRENT_CONTROLLER CURRENT CONTROLLER MODULE + * @brief The current controller function. + * @{ + */ + +/** + * @defgroup CURRENT_CONTROLLER_STRUCT CURRENT CONTROLLER STRUCT + * @brief The current controller's data structure definition. + * @{ + */ + +/* Typedef definitions ------------------------------------------------------------------------- */ +/** + * @brief Current controller struct members and parameters. + */ +typedef struct { + DqAxis *idqRef; /**< Current reference in the d-q coordinate (A). */ + DqAxis *idqFbk; /**< Current feedback in the d-q coordinate (A). */ + DqAxis idqFf; /**< Current feedforward value (V). */ + PID_Handle dAxisPi; /**< d-axis current PI controller. */ + PID_Handle qAxisPi; /**< q-axis current PI controller. */ + MOTOR_Param *mtrParam; /**< Motor parameters. */ + float outLimit; /**< Current controller output voltage limitation (V). */ + float ts; /**< Current controller control period (s). */ +} CURRCTRL_Handle; +/** + * @} + */ + +/** + * @defgroup CURRENT_CONTROLLER_API CURRENT CONTROLLER API + * @brief The current controller's API declaration. + * @{ + */ +void CURRCTRL_Init(CURRCTRL_Handle *currHandle, MOTOR_Param *mtrParam, DqAxis *idqRef, DqAxis *idqFbk, + const PI_Param dAxisPi, const PI_Param qAxisPi, float ts); + +void CURRCTRL_Reset(CURRCTRL_Handle *currHandle); + +void CURRCTRL_Clear(CURRCTRL_Handle *currHandle); + +void CURRCTRL_Exec(CURRCTRL_Handle *currHandle, DqAxis *vdqRef, float spd, int ffEnable); + +void CURRCTRL_SetTs(CURRCTRL_Handle *currHandle, float ts); + +/** + * @} + */ + +/** + * @} + */ + +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.c new file mode 100644 index 000000000..84ae28547 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.c @@ -0,0 +1,50 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_curr_ff.c + * @author MCU Algorithm Team + * @brief This file provides current loop feedforward compensation declaration for motor control. + */ + +#include "mcs_curr_ff.h" +#include "mcs_math_const.h" +#include "mcs_assert.h" + +/** + * @brief Current loop feedforward compensation execution function. + * @param vdqFf DQ axis volt feedforward compensation value. + * @param idqFbk DQ axis feedback current value. + * @param param Motor parameters. + * @param spd Speed (Hz). + * @param enable Whether to enable feedforward compensation. + * @retval None. + */ +void CURRFF_Exec(DqAxis *vdqFf, DqAxis idqFbk, MOTOR_Param *param, float spd, int enable) +{ + MCS_ASSERT_PARAM(vdqFf != NULL); + MCS_ASSERT_PARAM(param != NULL); + /* The unit is converted from Hz to rad. */ + float we = spd * DOUBLE_PI; + if (enable) { + /* Calculate the feedforward compensation value. */ + vdqFf->d = -param->mtrLq * we * idqFbk.q; + vdqFf->q = we * (param->mtrLd * idqFbk.d + param->mtrPsif); + } else { + vdqFf->d = 0.0f; + vdqFf->q = 0.0f; + } +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.h new file mode 100644 index 000000000..ba15e15b3 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.h @@ -0,0 +1,31 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_curr_ff.h + * @author MCU Algorithm Team + * @brief This file provides functions declaration of current loop feedforward compensation. + */ + +#ifndef McuMagicTag_MCS_CURR_FF_H +#define McuMagicTag_MCS_CURR_FF_H + +#include "mcs_typedef.h" +#include "mcs_mtr_param.h" + +void CURRFF_Exec(DqAxis *vdqRef, DqAxis idqFbk, MOTOR_Param *param, float spd, int enable); + +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.c new file mode 100644 index 000000000..3100ef65c --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.c @@ -0,0 +1,130 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_fw_ctrl.c + * @author MCU Algorithm Team + * @brief This file provides Flux-Weakening control for motor control. + */ +#include "mcs_fw_ctrl.h" +#include "mcs_math.h" +#include "mcs_math_const.h" +#include "mcs_assert.h" + +/** + * @brief Clear historical values of Flux-Weakening handle. + * @param fw Flux-Weakening struct handle. + * @retval None. + */ +static void FW_Clear(FW_Handle *fw) +{ + MCS_ASSERT_PARAM(fw != NULL); + fw->idRef = 0.0f; +} + +/** + * @brief Flux-Weakening control Handle Initialization. + * @param fw Flux-Weakening struct handle. + * @param ts Control period (s). + * @param enable Enable flux-weakening. + * @param currMax Maximum phase current (A). + * @param idDemag Demagnetizing d-axis current (A). + * @param thr . + * @retval None. + */ +void FW_Init(FW_Handle *fw, float ts, bool enable, float currMax, float idDemag, float thr, float slope) +{ + MCS_ASSERT_PARAM(fw != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + /* Indicates whether to enable the Flux-Weakening field function. */ + fw->enable = enable; + fw->ts = ts; + fw->udcThreshPer = thr * ONE_DIV_SQRT3; + /* id control slope */ + fw->idSlope = slope; + fw->idMaxAmp = (currMax < idDemag) ? currMax : idDemag; + fw->currMaxSquare = currMax * currMax; + FW_Clear(fw); +} + +/** + * @brief Flux-Weakening calculation execution function. + * @param fw Flux-Weakening struct handle. + * @param udqRef dq axis voltage reference. + * @param udc bus voltage. + * @param idqRefRaw Command value of the d and q axis current. + * @retval None. + */ +void FW_Exec(FW_Handle *fw, DqAxis udqRef, float udc, DqAxis *idqRefRaw) +{ + MCS_ASSERT_PARAM(fw != NULL); + MCS_ASSERT_PARAM(udc > 0.0f); + MCS_ASSERT_PARAM(idqRefRaw != NULL); + float udcLimit = udc * fw->udcThreshPer; + float voltRefAmp = Sqrt(udqRef.d * udqRef.d + udqRef.q * udqRef.q); + float voltErr = udcLimit - voltRefAmp; + float idRefRaw = idqRefRaw->d; + float iqRefRaw = idqRefRaw->q; + float iqRef; + float dir = (idqRefRaw->q > 0.0f) ? 1.0f : -1.0f; + + /* Check whether the Flux-Weakening field function is enabled. */ + if (!fw->enable) { + fw->idRef = idRefRaw; + /* if fw is disabled, just return without any change. */ + return; + } + float idStep = fw->idSlope * fw->ts; + /* Adjust the injection d-axis current based on the output voltage error. */ + /* When voltage error is positive, adjust id to idRefRaw, no need to fw. */ + if (voltErr >= 0.0f) { + fw->idRef += idStep; + if (fw->idRef > idRefRaw) { + fw->idRef = idRefRaw; + } + } else { + /* When voltage error is negative. Add negtive id to the motor, need to fw. */ + fw->idRef -= idStep; + if (fw->idRef < -fw->idMaxAmp) { + fw->idRef = -fw->idMaxAmp; + } + } + + /* Limit q-axis current output. */ + float idRefSquare = fw->idRef * fw->idRef; + if (idRefSquare + iqRefRaw * iqRefRaw > fw->currMaxSquare) { + iqRef = dir * Sqrt(fw->currMaxSquare - idRefSquare); + } else { + iqRef = iqRefRaw; + } + + idqRefRaw->d = fw->idRef; + idqRefRaw->q = iqRef; + + return; +} + +/** + * @brief Set ts of Flux-Weakening. + * @param fw Flux-Weakening struct handle. + * @param ts Control period (s). + * @retval None. + */ +void FW_SetTs(FW_Handle *fw, float ts) +{ + MCS_ASSERT_PARAM(fw != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + fw->ts = ts; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.h new file mode 100644 index 000000000..78ca11853 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.h @@ -0,0 +1,45 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_fw_ctrl.h + * @author MCU Algorithm Team + * @brief This file provides functions declaration of Flux-Weakening control. + */ +#ifndef McuMagicTag_MCS_FW_CTRL_H +#define McuMagicTag_MCS_FW_CTRL_H + +#include "typedefs.h" +#include "mcs_typedef.h" + +typedef struct { + bool enable; + float udcThreshPer; + float ts; + float idSlope; + float idRef; /* reference instruction value. */ + float idMaxAmp; /* Maximum id ingested */ + + float currMax; /* maximum phase current (A) */ + float currMaxSquare; /* square of maximum current. */ + float idDemag; /* demagnetizing d-axis current (A) */ +} FW_Handle; + +void FW_Init(FW_Handle *fw, float ts, bool enable, float currMax, float idDemag, float thr, float slope); + +void FW_Exec(FW_Handle *fw, DqAxis udqRef, float udc, DqAxis *idqRefRaw); + +void FW_SetTs(FW_Handle *fw, float ts); +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.c new file mode 100644 index 000000000..7db97eb03 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.c @@ -0,0 +1,115 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_if_ctrl.c + * @author MCU Algorithm Team + * @brief This file provides function of I/F control. + */ + +#include "mcs_if_ctrl.h" +#include "mcs_assert.h" +#include "mcs_math_const.h" + +/** + * @brief Initialzer of I/F control struct handle. + * @param ifHandle I/F handle. + * @param targetAmp Target value of the I/F current (A). + * @param currSlope Current slope. + * @param stepAmpPeriod Step control period, using systick---spd_loop_ctrl_period (s). + * @param anglePeriod Calculation period of the I/F angle---curr_loop_ctrl_period (s). + * @retval None. + */ +void IF_Init(IF_Handle *ifHandle, float targetAmp, float currSlope, float stepAmpPeriod, float anglePeriod) +{ + MCS_ASSERT_PARAM(ifHandle != NULL); + MCS_ASSERT_PARAM(targetAmp > 0.0f); + MCS_ASSERT_PARAM(currSlope > 0.0f); + MCS_ASSERT_PARAM(anglePeriod > 0.0f); + MCS_ASSERT_PARAM(stepAmpPeriod > 0.0f); + /* Initialize IF parameters. */ + ifHandle->targetAmp = targetAmp; + ifHandle->stepAmp = currSlope * stepAmpPeriod; /* current step increment */ + ifHandle->curAmp = 0.0f; + /* Angle period. */ + ifHandle->anglePeriod = anglePeriod; + ifHandle->angle = 0.0f; +} + +/** + * @brief Clear historical values of first-order filter handle. + * @param ifHandle I/F control handle. + * @retval None. + */ +void IF_Clear(IF_Handle *ifHandle) +{ + MCS_ASSERT_PARAM(ifHandle != NULL); + ifHandle->curAmp = 0.0f; + ifHandle->angle = 0; +} + +/** + * @brief I/F current amplitude calculation. + * @param ifHandle I/F control handle. + * @retval I/F current amplitude (A). + */ +float IF_CurrAmpCalc(IF_Handle *ifHandle) +{ + MCS_ASSERT_PARAM(ifHandle != NULL); + /* Calculation of IF Current Amplitude */ + if (ifHandle->curAmp < ifHandle->targetAmp) { + ifHandle->curAmp += ifHandle->stepAmp; + } else { + ifHandle->curAmp = ifHandle->targetAmp; + } + + return ifHandle->curAmp; +} + +/** + * @brief I/F current angle calculation. + * @param ifHandle I/F control handle. + * @param spdRef Frequency of current vector. + * @retval I/F output angle. + */ +float IF_CurrAngleCalc(IF_Handle *ifHandle, float spdRef) +{ + MCS_ASSERT_PARAM(ifHandle != NULL); + /* Calculate IF angle. */ + ifHandle->angle += spdRef * DOUBLE_PI * ifHandle->anglePeriod; + /* Limit the angle: [-pi, pi]. */ + if (ifHandle->angle > ONE_PI) { + ifHandle->angle -= DOUBLE_PI; + } + if (ifHandle->angle < -ONE_PI) { + ifHandle->angle += DOUBLE_PI; + } + + return ifHandle->angle; +} + +/** + * @brief Set ts of I/F. + * @param ifHandle I/F control handle. + * @param ts Control period (s). + * @retval None. + */ +void IF_SetAngleTs(IF_Handle *ifHandle, float ts) +{ + MCS_ASSERT_PARAM(ifHandle != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + ifHandle->anglePeriod = ts; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.h new file mode 100644 index 000000000..cd32b5c78 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.h @@ -0,0 +1,76 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_if_ctrl.h + * @author MCU Algorithm Team + * @brief Current controller for motor I/F control. + * This file provides functions declaration of I/F control. + */ + +/* Define to prevent recursive inclusion ------------------------------------------------------- */ +#ifndef McuMagicTag_MCS_IF_CTRL_H +#define McuMagicTag_MCS_IF_CTRL_H + +/** + * @defgroup IF_MODULE I/F MODULE + * @brief The I/F motor control method module. + * @{ + */ + +/** + * @defgroup IF_STRUCT I/F STRUCT + * @brief The I/F motor control method data struct definition. + * @{ + */ +/* Typedef definitions ------------------------------------------------------------------------- */ +/** + * @brief General IF controller struct members and parameters. + */ +typedef struct { + float anglePeriod; /**< Calculation period of the I/F angle (s). */ + float curAmpPeriod; /**< Calculation period of the I/F current amplitude (s). */ + + float targetAmp; /**< Target value of the I/F current (A). */ + float curAmp; /**< Current value of the I/F current (A). */ + float stepAmp; /**< Increment of the I/F current (A). */ + float angle; /**< I/F output angle. */ +} IF_Handle; + +/** + * @defgroup IF_API I/F API + * @brief The I/F motor control method API declaration. + * @{ + */ +void IF_Init(IF_Handle *ifHandle, float targetAmp, float currSlope, float stepAmpPeriod, float anglePeriod); + +void IF_Clear(IF_Handle *ifHandle); + +float IF_CurrAmpCalc(IF_Handle *ifHandle); + +float IF_CurrAngleCalc(IF_Handle *ifHandle, float spdRef); + +void IF_SetAngleTs(IF_Handle *ifHandle, float ts); + +/** + * @} + */ + +/** + * @} + */ + +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.c new file mode 100644 index 000000000..1e8922633 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.c @@ -0,0 +1,218 @@ +/** + * Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_posctrl.c + * @author MCU Algorithm Team + * @brief This file provides function of motor position control. + */ + +#include "typedefs.h" +#include "mcs_math_const.h" +#include "mcs_math.h" +#include "mcs_pos_ctrl.h" + +/** + * @brief Reset the position controller, fill with zero, NULL. + * @param posHandle position controller struct handle. + * @retval None. + */ +void POSCTRL_Clear(POSCTRL_Handle *posHandle) +{ + /* PID controller history values clear */ + posHandle->posPi.error = 0.0f; + posHandle->posPi.feedforward = 0.0f; + posHandle->posPi.differ = 0.0f; + posHandle->posPi.integral = 0.0f; + posHandle->posPi.saturation = 0.0f; + + posHandle->posTarget = 0.0f; + posHandle->posErr = 0.0f; +} + +/** + * @brief Position control initialization function. + * @param posHandle position controller struct handle. + * @param ts Control period. + */ +void POSCTRL_Init(POSCTRL_Handle *posHandle, const PID_Param *piCtrlTable, float ts) +{ + POSCTRL_Clear(posHandle); + posHandle->ts = ts; + + /* position PID controller initialization */ + posHandle->posPi.ts = posHandle->ts; + posHandle->posPi.kp = piCtrlTable->kp; + posHandle->posPi.ki = piCtrlTable->ki; + posHandle->posPi.kd = piCtrlTable->kd; + posHandle->posPi.ns = piCtrlTable->ns; + posHandle->posPi.ka = 1.0f / posHandle->posPi.kp; + posHandle->posPi.upperLimit = piCtrlTable->upperLim; + posHandle->posPi.lowerLimit = piCtrlTable->lowerLim; + + /* continuous mode: ramp controller initialization */ + RMG_Init(&posHandle->posRmg, posHandle->ts, posHandle->posRmg.slope * DOUBLE_PI); + posHandle->posRmg.ts = posHandle->ts; + + /* position feedback history values clear */ + posHandle->angFbkLoop = 0; + posHandle->angFbkPrev = 0.0f; + + /* position control mode configuration */ + posHandle->mode = POSCTRL_MODE_CONTINUOUS; +} + +/** + * @brief Position control mode settings. + * @param posHandle position controller struct handle. + * @param mode control mode. + */ +void POSCTRL_ModeSelect(POSCTRL_Handle *posHandle, POSCTRL_Mode mode) +{ + posHandle->mode = mode; +} + +/** + * @brief Set position change rate. + * @param posHandle Position controller struct handle. + * @param slope position change rate (Hz). + * @retval None. + */ +void POSCTRL_SetSlope(POSCTRL_Handle *posHandle, float slope) +{ + posHandle->posRmg.slope = slope; + posHandle->posRmg.delta = posHandle->posRmg.ts * posHandle->posRmg.slope * DOUBLE_PI; +} + +/** + * @brief Position ring target position setting. + * @param posHandle Position controller struct handle. + * @param posTarget Target location. + */ +void POSCTRL_SetTarget(POSCTRL_Handle *posHandle, float posTarget) +{ + posHandle->posTarget = posTarget; + posHandle->posTargetShadow = posTarget; +} + +/** + * @brief Absolute position calculation. + * @param posHandle Position controller struct handle. + * @param angFbk Angle feedback. + * @return float, Position feedback. + */ +float POSCTRL_AngleExpand(POSCTRL_Handle *posHandle, float angFbk) +{ + float angFbkPrevFloat = posHandle->angFbkPrev; + int loopPrev = posHandle->angFbkLoop; + int loop; + + /* unify feedback angle to ±2*pi */ + angFbk = Mod(angFbk, DOUBLE_PI); + /* unify feedback angle to 0 ~ 2*pi */ + if (angFbk < 0.0f) { + angFbk += DOUBLE_PI; + } + + /* check if angle rotates one cycle */ + if (angFbkPrevFloat > THREE_PI_DIV_TWO && angFbkPrevFloat <= DOUBLE_PI && angFbk < HALF_PI) { + loop = loopPrev + 1; + } else if (angFbk > THREE_PI_DIV_TWO && THREE_PI_DIV_TWO <= DOUBLE_PI && angFbkPrevFloat < HALF_PI) { + loop = loopPrev - 1; + } else { + loop = loopPrev; + } + + /* update prev value */ + posHandle->angFbkLoop = loop; + posHandle->angFbkPrev = angFbk; + + /* update output value */ + posHandle->posFbk = angFbk + loop * DOUBLE_PI; + + return posHandle->posFbk; +} + +/** + * @brief Position ring PID execution function. + * @param posHandle Position controller struct handle. + * @param posErr position error. + * @return float + */ +float POSCTRL_PidExec(POSCTRL_Handle *posHandle, float posErr) +{ + float spdRef; + posHandle->posPi.error = posErr; + spdRef = PID_Exec(&posHandle->posPi); + return spdRef; +} + +/** + * @brief position loop execution function. + * @param posHandle Position controller struct handle. + * @param posFbk Position feedback. + * @return float, Speed reference value. + */ +float POSCTRL_Exec(POSCTRL_Handle *posHandle, float posTarget, float posFbk) +{ + float posRef, spdRef; + posRef = RMG_Exec(&posHandle->posRmg, posTarget); + posHandle->posRef = posRef; + spdRef = POSCTRL_PidExec(posHandle, posRef - posFbk); + spdRef *= ONE_DIV_DOUBLE_PI; /* transfer spdRef from rad/s to Hz */ + posHandle->spdRef = spdRef; + return spdRef; +} + +/** + * @brief Set position loop kp parameter function. + * @param posHandle Position controller struct handle. + * @param kp PID-kp paramter. + */ +void POSCTRL_SetKp(POSCTRL_Handle *posHandle, float kp) +{ + posHandle->posPi.kp = kp; +} + +/** + * @brief Set position loop ki parameter function. + * @param posHandle Position controller struct handle. + * @param ki PID-ki paramter. + */ +void POSCTRL_SetKi(POSCTRL_Handle *posHandle, float ki) +{ + posHandle->posPi.ki = ki; +} + +/** + * @brief Set position loop kd parameter function. + * @param posHandle Position controller struct handle. + * @param kd PID-kd paramter. + */ +void POSCTRL_SetKd(POSCTRL_Handle *posHandle, float kd) +{ + posHandle->posPi.kd = kd; +} + +/** + * @brief Set position loop Ns parameter function. + * @param posHandle Position controller struct handle. + * @param ns ns paramter. + */ +void POSCTRL_SetNs(POSCTRL_Handle *posHandle, float ns) +{ + posHandle->posPi.ns = ns; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.h new file mode 100644 index 000000000..999dd359d --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.h @@ -0,0 +1,97 @@ +/** + * Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_pos_ctrl.h + * @author MCU Algorithm Team + * @brief This file provides functions declaration of position control . + */ +/* Define to prevent recursive inclusion ------------------------------------------------------- */ +#ifndef McuMagicTag_MCS_MCS_POS_CTRL_H +#define McuMagicTag_MCS_MCS_POS_CTRL_H + +/* Includes ------------------------------------------------------------------------------------ */ +#include "mcs_typedef.h" +#include "mcs_pid_ctrl.h" +#include "mcs_ramp_mgmt.h" +#include "mcs_mtr_param.h" + + +/* Macro definitions --------------------------------------------------------------------------- */ + +/* Typedef definitions ------------------------------------------------------------------------- */ +/** + * @brief Position control mode. + */ +typedef enum { + POSCTRL_MODE_CONTINUOUS = 0, + POSCTRL_MODE_TRAJ +} POSCTRL_Mode; + +/** + * @brief Position controller struct members and parameters. + */ +typedef struct { + PID_Handle posPi; /**< PI controller struct in the position controller. */ + float posTarget; /**< position controller input target value (rad) */ + float posTargetBk; + RMG_Handle posRmg; /**< position reference ramp management . */ + float ts; /**< position controller control period (s). */ + int angFbkLoop; /**< feedback position loop count. */ + float angFbkPrev; /**< feedback position in last cycle (rad). */ + float posFbk; /**< feedback position absolutely (rad). */ + float posIncRef; /**< position controller reference (rad) */ + float posIncRefPrev; /**< position controller reference in last cycle (rad) */ + float spdRef; /**< position controller outpur speed reference (Hz) */ + float posRef; /**< position controller reference (rad) */ + float posFbkPrev; + float posErr; + + /* trajectory planning */ + /* position controller work mode. 0: continuous mode; 1: trajectory control mode. */ + /* trajectory mode can only be enabled when input mode is set absolute position. */ + POSCTRL_Mode mode; + float posTargetShadow; + float runTime; /**< single trajectory control last time time (s). */ + float timeTick; /**< trajectory control inner timer (s) */ + float deltaTime; + float accMax; + float jerk; + int targetUpdateBlockFlag; /**< whether the position target can be update or not. 0: can be updated; 1: block */ + float deltaTimeSq; + float deltaTimeCu; + float timeStg[7]; +} POSCTRL_Handle; + +/** + * @defgroup POSITION_CONTROLLER_API POSITION CONTROLLER API + * @brief The position controller API declaration. + * @retval Speed Reference. + */ +void POSCTRL_Clear(POSCTRL_Handle *posHandle); +void POSCTRL_Init(POSCTRL_Handle *posHandle, const PID_Param *piCtrlTable, float ts); +float POSCTRL_PidExec(POSCTRL_Handle *posHandle, float posErr); +void POSCTRL_ModeSelect(POSCTRL_Handle *posHandle, POSCTRL_Mode mode); +void POSCTRL_SetSlope(POSCTRL_Handle *posHandle, float slope); +void POSCTRL_SetTarget(POSCTRL_Handle *posHandle, float posTarget); +float POSCTRL_Exec(POSCTRL_Handle *posHandle, float posTarget, float posFbk); +float POSCTRL_AngleExpand(POSCTRL_Handle *posHandle, float angFbk); +void POSCTRL_SetKp(POSCTRL_Handle *posHandle, float kp); +void POSCTRL_SetKi(POSCTRL_Handle *posHandle, float ki); +void POSCTRL_SetKd(POSCTRL_Handle *posHandle, float kd); +void POSCTRL_SetNs(POSCTRL_Handle *posHandle, float ns); + +#endif /* McuMagicTag_MCS_POS_CTRL_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.c new file mode 100644 index 000000000..5f88e833e --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.c @@ -0,0 +1,96 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_spd_ctrl.c + * @author MCU Algorithm Team + * @brief This file provides function of motor speed control. + */ + +#include "typedefs.h" +#include "mcs_spd_ctrl.h" +#include "mcs_assert.h" + +/** + * @brief Initialzer of speed control struct handle. + * @param spdHandle Speed control struct handle. + * @param PID_Param PI controller parameter table. + * @param ts Speed control period. + * @retval None. + */ +void SPDCTRL_Init(SPDCTRL_Handle *spdHandle, MOTOR_Param *mtrParam, const PI_Param piParam, float ts) +{ + MCS_ASSERT_PARAM(spdHandle != NULL); + MCS_ASSERT_PARAM(mtrParam != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + /* reset speed loop PI */ + PID_Reset(&spdHandle->spdPi); + /* Parameter Initialization. */ + spdHandle->mtrParam = mtrParam; + spdHandle->ts = ts; + spdHandle->spdPi.ts = ts; + spdHandle->spdPi.kp = piParam.kp; + spdHandle->spdPi.ki = piParam.ki; + spdHandle->outLimit = piParam.upperLim; + spdHandle->spdPi.upperLimit = piParam.upperLim; + spdHandle->spdPi.lowerLimit = piParam.lowerLim; +} + + +/** + * @brief Simplified speed controller PI calculation. + * @param spdHandle Speed controller struct handle. + * @param spdTarget The target speed value (Hz). + * @param spdFbk Motor electrical speed (Hz). + * @retval None. + */ +float SPDCTRL_Exec(SPDCTRL_Handle *spdHandle, float spdTarget, float spdFbk) +{ + MCS_ASSERT_PARAM(spdHandle != NULL); + float iqRef; + /* Speed error calculation */ + spdHandle->spdPi.error = spdTarget - spdFbk; + /* speed controller pid calculation */ + iqRef = PI_Exec(&spdHandle->spdPi); + return iqRef; +} + +/** + * @brief Clear historical values of speed controller. + * @param spdHandle Speed controller struct handle. + * @retval None. + */ +void SPDCTRL_Clear(SPDCTRL_Handle *spdHandle) +{ + MCS_ASSERT_PARAM(spdHandle != NULL); + PID_Clear(&spdHandle->spdPi); +} + +/** + * @brief Reset the speed controller, fill with zero, NULL. + * @param spdHandle Speed controller struct handle. + * @retval None. + */ +void SPDCTRL_Reset(SPDCTRL_Handle *spdHandle) +{ + MCS_ASSERT_PARAM(spdHandle != NULL); + /* Reset speed ring PI */ + PID_Reset(&spdHandle->spdPi); + /* Reset the speed controller, fill with zero, NULL. */ + spdHandle->outLimit = 0.0f; + spdHandle->mtrParam = NULL; + spdHandle->ts = 0.0f; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.h new file mode 100644 index 000000000..5767f3a29 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.h @@ -0,0 +1,49 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_spd_ctrl.h + * @author MCU Algorithm Team + * @brief Speed controller for motor control. + * This file provides functions declaration of the speed controller module. + */ + +#ifndef McuMagicTag_MCS_SPD_CTRL_H +#define McuMagicTag_MCS_SPD_CTRL_H + +#include "mcs_typedef.h" +#include "mcs_pid_ctrl.h" +#include "mcs_mtr_param.h" + +/** + * @brief Speed controller struct members and parameters. + */ +typedef struct { + PID_Handle spdPi; /**< PI controller struct in the speed controller. */ + float outLimit; /**< Maximum of the speed controller output. */ + MOTOR_Param *mtrParam; /**< Motor parameters. */ + float ts; /**< Speed controller control period (s). */ +} SPDCTRL_Handle; + +void SPDCTRL_Init(SPDCTRL_Handle *spdHandle, MOTOR_Param *mtrParam, const PI_Param piParam, float ts); + +void SPDCTRL_Reset(SPDCTRL_Handle *spdHandle); + +void SPDCTRL_Clear(SPDCTRL_Handle *spdHandle); + +float SPDCTRL_Exec(SPDCTRL_Handle *spdHandle, float spdTarget, float spdFbk); + +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_startup.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_startup.c new file mode 100644 index 000000000..3bc2138dd --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_startup.c @@ -0,0 +1,75 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_startup.c + * @author MCU Algorithm Team + * @brief This file provides transition method from startup stage to run stage。 + */ + +#include "mcs_startup.h" +#include "mcs_math.h" +#include "mcs_assert.h" + +/** + * @brief Init the startup control handle. + * @param startHandle The startup coontrol handle. + * @param spdBegin The begin speed for transition process. + * @param spdEnd The end speed for transition process. + * @retval None. + */ +void STARTUP_Init(STARTUP_Handle *startHandle, float spdBegin, float spdEnd) +{ + MCS_ASSERT_PARAM(startHandle != NULL); + MCS_ASSERT_PARAM(spdBegin > 0.0f); + MCS_ASSERT_PARAM(spdEnd > 0.0f); + MCS_ASSERT_PARAM(spdBegin < spdEnd); + startHandle->stage = STARTUP_STAGE_CURR; + startHandle->spdBegin = spdBegin; + startHandle->spdEnd = spdEnd; + /* current AMP = slope * control period */ + startHandle->regionInv = 1.0f / (startHandle->spdEnd - startHandle->spdBegin); +} + +/** + * @brief Clear hisitory value, assign the stage to current change. + * @param startHandle The startup control handle. + * @retval None. + */ +void STARTUP_Clear(STARTUP_Handle *startHandle) +{ + MCS_ASSERT_PARAM(startHandle != NULL); + startHandle->stage = STARTUP_STAGE_CURR; +} + +/** + * @brief Calculate the reference current in the startup stage. + * @param startHandle The startup control handle. + * @param refHz The speed reference in the startup stage. + * @return The current AMP. + */ +float STARTUP_CurrCal(const STARTUP_Handle *startHandle, float refHz) +{ + MCS_ASSERT_PARAM(startHandle != NULL); + float out; + float tmp; + /* Calculate the reference current in the startup stage */ + tmp = startHandle->spdEnd - Abs(refHz); + tmp = tmp * startHandle->regionInv; + out = tmp * startHandle->initCurr; + + return out; +} diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_startup.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_startup.h new file mode 100644 index 000000000..725cdd998 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/foc_loop_ctrl/mcs_startup.h @@ -0,0 +1,63 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_startup.h + * @author MCU Algorithm Team + * @brief Motor transition process from one speed and angle to another speed and angle. + */ + + +#ifndef McuMagicTag_MCS_STARTUP_H +#define McuMagicTag_MCS_STARTUP_H + +/** + * @brief Startup process enum. + * @details Speed transition stages: + * + STARTUP_STAGE_CURR -- Stage of current AMP is changing + * + STARTUP_STAGE_SPD -- Stage of speed is changing + * + STARTUP_STAGE_SWITCH -- Stage of switch + * + STARTUP_STAGE_DETECT -- Stage of detect switch open loop + */ +typedef enum { + STARTUP_STAGE_CURR = 1, + STARTUP_STAGE_SPD, + STARTUP_STAGE_SWITCH, + STARTUP_STAGE_DETECT, +} STARTUP_Stage; + +/** + * @brief Startup handover method struct members and parameters. + */ +typedef struct { + STARTUP_Stage stage; /**< Startup switching status. */ + float spdBegin; /**< Startup switching start speed (Hz). */ + float spdEnd; /**< Startup switching end speed (Hz). */ + float regionInv; /**< Inverse of the speed region. */ + float initCurr; /**< The initial current (A). */ +} STARTUP_Handle; + + +/** + * @defgroup STARTUP_API STARTUP API + * @brief The startup management API declaration. + * @{ + */ +void STARTUP_Init(STARTUP_Handle *startHandle, float spdBegin, float spdEnd); +void STARTUP_Clear(STARTUP_Handle *startHandle); +float STARTUP_CurrCal(const STARTUP_Handle *startHandle, float refHz); + +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/math/mcs_math.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/math/mcs_math.c new file mode 100644 index 000000000..d1e932f00 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/math/mcs_math.c @@ -0,0 +1,557 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_math.c + * @author MCU Algorithm Team + * @brief This file provides common math functions including trigonometric, coordinate transformation, + * square root math calculation. + */ + +#include "mcs_math.h" +#include "mcs_math_const.h" +#include "mcs_assert.h" + +/* Macro definitions --------------------------------------------------------------------------- */ +#define SIN_TABLE \ + { \ + 0, 51, 101, 151, 202, 252, 302, 352, 403, 453, 503, 553, 604, 654, 704, 754, 805, 855, 905, 955, 1006, 1056, \ + 1106, 1156, 1207, 1257, 1307, 1357, 1407, 1458, 1508, 1558, 1608, 1659, 1709, 1759, 1809, 1859, 1909, \ + 1960, 2010, 2060, 2110, 2160, 2210, 2261, 2311, 2361, 2411, 2461, 2511, 2561, 2611, 2662, 2712, 2762, \ + 2812, 2862, 2912, 2962, 3012, 3062, 3112, 3162, 3212, 3262, 3312, 3362, 3412, 3462, 3512, 3562, 3612, \ + 3662, 3712, 3762, 3812, 3862, 3912, 3962, 4012, 4061, 4111, 4161, 4211, 4261, 4311, 4360, 4410, 4460, \ + 4510, 4560, 4609, 4659, 4709, 4759, 4808, 4858, 4908, 4958, 5007, 5057, 5107, 5156, 5206, 5255, 5305, \ + 5355, 5404, 5454, 5503, 5553, 5602, 5652, 5701, 5751, 5800, 5850, 5899, 5949, 5998, 6048, 6097, 6146, \ + 6196, 6245, 6294, 6344, 6393, 6442, 6492, 6541, 6590, 6639, 6689, 6738, 6787, 6836, 6885, 6934, 6983, \ + 7033, 7082, 7131, 7180, 7229, 7278, 7327, 7376, 7425, 7474, 7523, 7572, 7620, 7669, 7718, 7767, 7816, \ + 7865, 7913, 7962, 8011, 8060, 8108, 8157, 8206, 8254, 8303, 8352, 8400, 8449, 8497, 8546, 8594, 8643, \ + 8691, 8740, 8788, 8837, 8885, 8933, 8982, 9030, 9078, 9127, 9175, 9223, 9271, 9320, 9368, 9416, 9464, \ + 9512, 9560, 9608, 9656, 9704, 9752, 9800, 9848, 9896, 9944, 9992, 10040, 10088, 10136, 10183, 10231, \ + 10279, 10327, 10374, 10422, 10470, 10517, 10565, 10612, 10660, 10707, 10755, 10802, 10850, 10897, 10945, \ + 10992, 11039, 11087, 11134, 11181, 11228, 11276, 11323, 11370, 11417, 11464, 11511, 11558, 11605, 11652, \ + 11699, 11746, 11793, 11840, 11887, 11934, 11981, 12027, 12074, 12121, 12167, 12214, 12261, 12307, 12354, \ + 12400, 12447, 12493, 12540, 12586, 12633, 12679, 12725, 12772, 12818, 12864, 12910, 12957, 13003, 13049, \ + 13095, 13141, 13187, 13233, 13279, 13325, 13371, 13417, 13463, 13508, 13554, 13600, 13646, 13691, 13737, \ + 13783, 13828, 13874, 13919, 13965, 14010, 14056, 14101, 14146, 14192, 14237, 14282, 14327, 14373, 14418, \ + 14463, 14508, 14553, 14598, 14643, 14688, 14733, 14778, 14823, 14867, 14912, 14957, 15002, 15046, 15091, \ + 15136, 15180, 15225, 15269, 15314, 15358, 15402, 15447, 15491, 15535, 15580, 15624, 15668, 15712, 15756, \ + 15800, 15844, 15888, 15932, 15976, 16020, 16064, 16108, 16151, 16195, 16239, 16282, 16326, 16369, 16413, \ + 16456, 16500, 16543, 16587, 16630, 16673, 16717, 16760, 16803, 16846, 16889, 16932, 16975, 17018, 17061, \ + 17104, 17147, 17190, 17233, 17275, 17318, 17361, 17403, 17446, 17488, 17531, 17573, 17616, 17658, 17700, \ + 17743, 17785, 17827, 17869, 17911, 17953, 17995, 18037, 18079, 18121, 18163, 18205, 18247, 18288, 18330, \ + 18372, 18413, 18455, 18496, 18538, 18579, 18621, 18662, 18703, 18745, 18786, 18827, 18868, 18909, 18950, \ + 18991, 19032, 19073, 19114, 19155, 19195, 19236, 19277, 19317, 19358, 19398, 19439, 19479, 19520, 19560, \ + 19600, 19641, 19681, 19721, 19761, 19801, 19841, 19881, 19921, 19961, 20001, 20041, 20080, 20120, 20160, \ + 20199, 20239, 20278, 20318, 20357, 20397, 20436, 20475, 20514, 20554, 20593, 20632, 20671, 20710, 20749, \ + 20788, 20826, 20865, 20904, 20943, 20981, 21020, 21058, 21097, 21135, 21174, 21212, 21250, 21289, 21327, \ + 21365, 21403, 21441, 21479, 21517, 21555, 21593, 21630, 21668, 21706, 21744, 21781, 21819, 21856, 21894, \ + 21931, 21968, 22005, 22043, 22080, 22117, 22154, 22191, 22228, 22265, 22302, 22339, 22375, 22412, 22449, \ + 22485, 22522, 22558, 22595, 22631, 22667, 22704, 22740, 22776, 22812, 22848, 22884, 22920, 22956, 22992, \ + 23028, 23063, 23099, 23135, 23170, 23206, 23241, 23277, 23312, 23347, 23383, 23418, 23453, 23488, 23523, \ + 23558, 23593, 23628, 23662, 23697, 23732, 23767, 23801, 23836, 23870, 23904, 23939, 23973, 24007, 24042, \ + 24076, 24110, 24144, 24178, 24212, 24245, 24279, 24313, 24347, 24380, 24414, 24447, 24481, 24514, 24547, \ + 24581, 24614, 24647, 24680, 24713, 24746, 24779, 24812, 24845, 24878, 24910, 24943, 24975, 25008, 25040, \ + 25073, 25105, 25137, 25170, 25202, 25234, 25266, 25298, 25330, 25362, 25393, 25425, 25457, 25488, 25520, \ + 25551, 25583, 25614, 25646, 25677, 25708, 25739, 25770, 25801, 25832, 25863, 25894, 25925, 25955, 25986, \ + 26017, 26047, 26078, 26108, 26138, 26169, 26199, 26229, 26259, 26289, 26319, 26349, 26379, 26409, 26438, \ + 26468, 26498, 26527, 26557, 26586, 26616, 26645, 26674, 26703, 26732, 26761, 26790, 26819, 26848, 26877, \ + 26906, 26934, 26963, 26991, 27020, 27048, 27077, 27105, 27133, 27161, 27189, 27217, 27245, 27273, 27301, \ + 27329, 27356, 27384, 27412, 27439, 27467, 27494, 27521, 27549, 27576, 27603, 27630, 27657, 27684, 27711, \ + 27737, 27764, 27791, 27817, 27844, 27870, 27897, 27923, 27949, 27976, 28002, 28028, 28054, 28080, 28106, \ + 28132, 28157, 28183, 28209, 28234, 28260, 28285, 28310, 28336, 28361, 28386, 28411, 28436, 28461, 28486, \ + 28511, 28535, 28560, 28585, 28609, 28634, 28658, 28682, 28707, 28731, 28755, 28779, 28803, 28827, 28851, \ + 28875, 28898, 28922, 28946, 28969, 28993, 29016, 29039, 29063, 29086, 29109, 29132, 29155, 29178, 29201, \ + 29223, 29246, 29269, 29291, 29314, 29336, 29359, 29381, 29403, 29425, 29447, 29469, 29491, 29513, 29535, \ + 29557, 29578, 29600, 29622, 29643, 29664, 29686, 29707, 29728, 29749, 29770, 29791, 29812, 29833, 29854, \ + 29874, 29895, 29916, 29936, 29956, 29977, 29997, 30017, 30037, 30057, 30077, 30097, 30117, 30137, 30157, \ + 30176, 30196, 30215, 30235, 30254, 30273, 30292, 30312, 30331, 30350, 30369, 30387, 30406, 30425, 30443, \ + 30462, 30481, 30499, 30517, 30536, 30554, 30572, 30590, 30608, 30626, 30644, 30661, 30679, 30697, 30714, \ + 30732, 30749, 30767, 30784, 30801, 30818, 30835, 30852, 30869, 30886, 30903, 30919, 30936, 30952, 30969, \ + 30985, 31002, 31018, 31034, 31050, 31066, 31082, 31098, 31114, 31129, 31145, 31161, 31176, 31192, 31207, \ + 31222, 31237, 31253, 31268, 31283, 31298, 31312, 31327, 31342, 31357, 31371, 31386, 31400, 31414, 31429, \ + 31443, 31457, 31471, 31485, 31499, 31513, 31526, 31540, 31554, 31567, 31581, 31594, 31607, 31620, 31634, \ + 31647, 31660, 31673, 31685, 31698, 31711, 31724, 31736, 31749, 31761, 31773, 31786, 31798, 31810, 31822, \ + 31834, 31846, 31857, 31869, 31881, 31892, 31904, 31915, 31927, 31938, 31949, 31960, 31971, 31982, 31993, \ + 32004, 32015, 32025, 32036, 32047, 32057, 32067, 32078, 32088, 32098, 32108, 32118, 32128, 32138, 32148, \ + 32157, 32167, 32177, 32186, 32195, 32205, 32214, 32223, 32232, 32241, 32250, 32259, 32268, 32276, 32285, \ + 32294, 32302, 32311, 32319, 32327, 32335, 32343, 32351, 32359, 32367, 32375, 32383, 32390, 32398, 32405, \ + 32413, 32420, 32427, 32435, 32442, 32449, 32456, 32463, 32469, 32476, 32483, 32489, 32496, 32502, 32509, \ + 32515, 32521, 32527, 32533, 32539, 32545, 32551, 32557, 32562, 32568, 32573, 32579, 32584, 32589, 32595, \ + 32600, 32605, 32610, 32615, 32619, 32624, 32629, 32633, 32638, 32642, 32647, 32651, 32655, 32659, 32663, \ + 32667, 32671, 32675, 32679, 32682, 32686, 32689, 32693, 32696, 32700, 32703, 32706, 32709, 32712, 32715, \ + 32718, 32720, 32723, 32726, 32728, 32730, 32733, 32735, 32737, 32739, 32741, 32743, 32745, 32747, 32749, \ + 32751, 32752, 32754, 32755, 32756, 32758, 32759, 32760, 32761, 32762, 32763, 32764, 32764, 32765, 32766, \ + 32766, 32767, 32767, 32767, 32767, 32767 \ + } + +const float atanInBottom[50] = { 0.0f, 0.102040816326531f, 0.204081632653061f, 0.306122448979592f, \ + 0.408163265306122f, 0.510204081632653f, 0.612244897959184f, 0.714285714285714f, \ + 0.816326530612245f, 0.918367346938776f, 1.02040816326531f, 1.12244897959184f, \ + 1.22448979591837f, 1.32653061224490f, 1.42857142857143f, 1.53061224489796f, \ + 1.63265306122449f, 1.73469387755102f, 1.83673469387755f, 1.93877551020408f, \ + 2.04081632653061f, 2.14285714285714f, 2.24489795918367f, 2.34693877551020f, \ + 2.44897959183673f, 2.55102040816327f, 2.65306122448980f, 2.75510204081633f, \ + 2.85714285714286f, 2.95918367346939f, 3.06122448979592f, 3.16326530612245f, \ + 3.26530612244898f, 3.36734693877551f, 3.46938775510204f, 3.57142857142857f, \ + 3.67346938775510f, 3.77551020408163f, 3.87755102040816f, 3.97959183673469f, \ + 4.08163265306123f, 4.18367346938776f, 4.28571428571429f, 4.38775510204082f, \ + 4.48979591836735f, 4.59183673469388f, 4.69387755102041f, 4.79591836734694f, \ + 4.89795918367347f, 5.0f}; +const float atanValBottom[50] = { 0.0f, 0.101688851763077f, 0.201317108374641f, 0.297064212341043f, \ + 0.387523805780279f, 0.471777511180750f, 0.549374484771551f, 0.620249485982822f, \ + 0.684617164312781f, 0.742870628777664f, 0.795498829982770f, 0.843026590874922f, \ + 0.885975080852296f, 0.924838220488786f, 0.960070362405688f, 0.992081381881698f, \ + 1.02123631326852f, 1.04785756322372f, 1.07222842115668f, 1.09459707572452f, \ + 1.11518067358367f, 1.13416916698136f, 1.15172882709508f, 1.16800537775525f, \ + 1.18312674842090f, 1.19720546875916f, 1.21034073815249f, 1.22262020713844f, \ + 1.23412150740817f, 1.24491356451280f, 1.25505772401419f, 1.26460871813527f, \ + 1.27361549637858f, 1.28212194027307f, 1.29016747945525f, 1.29778762370819f, \ + 1.30501442335451f, 1.31187686849742f, 1.31840123598843f, 1.32461139163550f, \ + 1.33052905401396f, 1.33617402527335f, 1.34156439351790f, 1.34671671065198f, \ + 1.35164614900430f, 1.35636663955779f, 1.36089099420126f, 1.36523101407236f, \ + 1.36939758576738f, 1.37340076694502f}; +const float atanInMid[25] = { 5.0f, 5.625f, 6.25f, 6.875f, 7.5f, \ + 8.125f, 8.75f, 9.375f, 10.0f, 10.625f, \ + 11.25f, 11.875f, 12.5f, 13.125f, 13.75f, \ + 14.375f, 15.0f, 15.625f, 16.25f, 16.875f, \ + 17.5f, 18.125f, 18.75f, 19.375f, 20.0f}; +const float atanValMid[25] = { 1.373400766945016f, 1.394856701342369f, 1.41214106460850f, 1.42635474842025f, \ + 1.43824479449822f, 1.44833526937756f, 1.45700431965119f, 1.46453146390382f, \ + 1.47112767430373f, 1.47695511416556f, 1.48214044492746f, 1.48678401498740f, \ + 1.49096634108266f, 1.49475276751578f, 1.49819687306440f, 1.50134300079957f, \ + 1.50422816301907f, 1.50688349400616f, 1.50933537091213f, 1.51160628786678f, \ + 1.51371554438863f, 1.51567979250081f, 1.51751347523520f, 1.51922918085206f, \ + 1.52083793107295f}; +const float atanInTop[10] = { 20.0f, 128.888888888889f, 237.777777777778f, 346.666666666667f, \ + 455.555555555556f, 564.444444444445f, 673.333333333333f, 782.222222222222f, \ + 891.111111111111f, 1000.0f}; +const float atanValTop[10] = { 1.52083793107295f, 1.56303786177943f, 1.56659074411305f, 1.56791171941121f, \ + 1.56860120836944f, 1.56902467510518f, 1.56931117937196f, 1.56951791840043f, \ + 1.56967413275225f, 1.56979632712823f}; + +#define SIN_MASK 0x0C00 +#define U0_90 0x0800 +#define U90_180 0x0C00 +#define U180_270 0x0000 +#define U270_360 0x0400 +#define SIN_TAB_LEN 0x03FF +#define Q15_BASE 32768 +#define ANGLE_TO_INDEX_SHIFT 4 + +#define ATAN_INPUTVALUE_MIN 5.0f +#define ATAN_INPUTVALUE_MID 20.0f +#define ATAN_INPUTVALUE_MAX 1000.0f + +#define MATH_FACTORIAL3INVERSE 0.16666667f /**< 1 / 6 */ +#define MATH_FACTORIAL5INVERSE 0.008333333f /**< 1 / 120 */ +#define MATH_FACTORIAL7INVERSE 0.0001984127f /**< 1 / 5040 */ + +/* Private variables --------------------------------------------------------- */ +const short g_sinTable[SIN_TAB_LEN + 1] = SIN_TABLE; + + +/** + * @brief Using Taylor Expansion to Calculate Sin Values in rad. + * @param angle Angle value to be calculated. + * @retval float Calculated sin value. + */ +static float TaylorCalSinIn90(float angle) +{ + float radian = angle; + float radian3 = radian * radian * radian; /* power(3) */ + float radian5 = radian3 * radian * radian; + float radian7 = radian5 * radian * radian; /* power(7) */ + /* Using Taylor Expansion to Calculate Sin Values in 90 Degrees. */ + return (radian - radian3 * MATH_FACTORIAL3INVERSE + \ + radian5 * MATH_FACTORIAL5INVERSE - radian7 * MATH_FACTORIAL7INVERSE); +} + +/** + * @brief Using Taylor Expansion to Calculate Sin Values for Any Angle. + * @param angle Angle value to be calculated. + * @retval float Calculated sin value. + */ +float GetSin(float angle) +{ + /* limit the data scope to (0 - 2PI) */ + float angleIn2pi = Mod(angle, DOUBLE_PI); + if (angleIn2pi < 0) { + angleIn2pi = angleIn2pi + DOUBLE_PI; + } + if (angleIn2pi < HALF_PI) { /* 0 ~ 90° */ + return TaylorCalSinIn90(angleIn2pi); + } + if (angleIn2pi < ONE_PI) { /* 90 ~ 180° */ + return TaylorCalSinIn90(ONE_PI - angleIn2pi); + } + if (angleIn2pi < THREE_PI_DIV_TWO) { /* 180 ~ 270° */ + return -TaylorCalSinIn90(angleIn2pi - ONE_PI); + } + return -TaylorCalSinIn90(DOUBLE_PI - angleIn2pi); /* 270 ~ 360° */ +} + +/** + * @brief Using Taylor Expansion to Calculate Sin Values for Any Angle. + * @param angle Angle value to be calculated. + * @retval float Calculated sin value. + */ +float GetCos(float angle) +{ + /* limit the data scope to (0 - 2PI) */ + float angleIn2pi = Mod(angle, DOUBLE_PI); + if (angleIn2pi < 0) { + angleIn2pi = angleIn2pi + DOUBLE_PI; + } + if (angleIn2pi < HALF_PI) { /* 0 ~ 90° */ + return TaylorCalSinIn90(HALF_PI - angleIn2pi); + } + if (angleIn2pi < ONE_PI) { /* 90 ~ 180° */ + return -TaylorCalSinIn90(angleIn2pi - HALF_PI); + } + if (angleIn2pi < THREE_PI_DIV_TWO) { /* 180 ~ 270° */ + return -TaylorCalSinIn90(THREE_PI_DIV_TWO - angleIn2pi); + } + return TaylorCalSinIn90(angleIn2pi - THREE_PI_DIV_TWO); /* 270 ~ 360° */ +} + + +/** + * @brief Calculate sine and cosine function of the input angle. + * @param val: Output result, which contain the calculated sin, cos value. + * @param angle: The input parameter angle (rad). + * @retval None. + */ +void TrigCalc(TrigVal *val, float angle) +{ + MCS_ASSERT_PARAM(val != NULL); + val->sin = GetSin(angle); + val->cos = GetCos(angle); +} + +/** + * @brief Park transformation: transforms stator values alpha and beta, which + * belong to a stationary albe reference frame, to a rotor flux + * synchronous reference dq frame. + * @param albe: Input alpha beta axis value. + * @param angle: Input the theta angle (rad). + * @param dq: Output DQ axis value. + * @retval None + */ +void ParkCalc(const AlbeAxis *albe, float angle, DqAxis *dq) +{ + MCS_ASSERT_PARAM(albe != NULL); + MCS_ASSERT_PARAM(dq != NULL); + float alpha = albe->alpha; + float beta = albe->beta; + TrigVal localTrigVal; + /* The projection of ia, ib, and ic currents on alpha and beta axes is equivalent to that on d, q axes. */ + TrigCalc(&localTrigVal, angle); + dq->d = alpha * localTrigVal.cos + beta * localTrigVal.sin; + dq->q = -alpha * localTrigVal.sin + beta * localTrigVal.cos; +} + +/** + * @brief Inverse Park transformation: transforms stator values d and q, which + * belong to a rotor flux synchronous reference dq frame, to a stationary + * albe reference frame. + * @param dq: Input DQ axis value. + * @param angle: Input the theta angle (rad). + * @param albe: Output alpha beta axis value. + * @retval None + */ +void InvParkCalc(const DqAxis *dq, float angle, AlbeAxis *albe) +{ + MCS_ASSERT_PARAM(dq != NULL); + MCS_ASSERT_PARAM(albe != NULL); + float d = dq->d; + float q = dq->q; + TrigVal localTrigVal; + /* Inversely transform the d, q-axis current to alpha ,beta. */ + TrigCalc(&localTrigVal, angle); + albe->alpha = d * localTrigVal.cos - q * localTrigVal.sin; + albe->beta = d * localTrigVal.sin + q * localTrigVal.cos; +} + +/** + * @brief Clarke transformation: transforms stationary three-phase quantites to + * stationary albe quantites. + * @param uvw: Clarke struct handle. + * @param albe: AlbeAxis struct handle used to store the Clarke transform output. + * @retval None. + */ +void ClarkeCalc(const UvwAxis *uvw, AlbeAxis *albe) +{ + MCS_ASSERT_PARAM(uvw != NULL); + MCS_ASSERT_PARAM(albe != NULL); + albe->alpha = uvw->u; + albe->beta = ONE_DIV_SQRT3 * (uvw->u + 2.0f * uvw->v); +} + +/** + * @brief This function returns the absolute value of the input value. + * @param val: The quantity that wants to execute absolute operation. + * @retval The absolute value of the input value. + */ +float Abs(float val) +{ + return (val >= 0.0f) ? val : (-val); +} + +/** + * @brief Clamp operation. + * @param val Value that needs to be clamped. + * @param upperLimit The upper limitation. + * @param lowerLimit The lower limitation. + * @retval Clamped value. + */ +float Clamp(float val, float upperLimit, float lowerLimit) +{ + MCS_ASSERT_PARAM(upperLimit > lowerLimit); + float result; + /* Clamping Calculation. */ + if (val >= upperLimit) { + result = upperLimit; + } else if (val <= lowerLimit) { + result = lowerLimit; + } else { + result = val; + } + return result; +} + +/** + * @brief Get bigger value. + * @param val1 The value to be compared. + * @param val2 The value to be compared. + * @retval The greater value. + */ +float Max(float val1, float val2) +{ + return ((val1 >= val2) ? val1 : val2); +} + +/** + * @brief Get smaller value. + * @param val1 The value to be compared. + * @param val2 The value to be compared. + * @retval The smaller value. + */ +float Min(float val1, float val2) +{ + return ((val1 <= val2) ? val1 : val2); +} + +/** + * @brief Fast sqrt calculation using ASM. + * @param val Float val. + * @retval Sqrt result. + */ +float Sqrt(float val) +{ + MCS_ASSERT_PARAM(val >= 0.0f); + float rd = val; + + __asm volatile("fsqrt.s %0, %1" : "=f"(rd) : "f"(val)); + + return rd; +} + + +/** + * @brief Angle difference calculation. + * @param angle1 Angle to be substracted. + * @param angle2 Angle to substract. + * @retval Angle difference. + */ +float AngleSub(float angle1, float angle2) +{ + /* Calculate the error of the two angle. */ + float err = angle1 - angle2; + + /* If error between -pi to pi, return error without changes. */ + err = Mod(err, DOUBLE_PI); + if (err > ONE_PI) { + err -= DOUBLE_PI; + } else if (err < -ONE_PI) { + err += DOUBLE_PI; + } + + return err; +} + + +/** + * @brief Dichotomy to find the position of the target value in the array. + * @param u: Target Value. + * @param table: Pointer of Array. + * @param startIndex: Start Index + * @param maxIndex: Max Index. + * @retval Target index. + */ + +static unsigned short BinSearch(float u, const float *table, + unsigned short startIndex, + unsigned short maxIndex) +{ + MCS_ASSERT_PARAM(table != NULL); + /* The dot to the left of the dichotomy */ + unsigned short iLeft; + /* The dot to the right of the dichotomy */ + unsigned short iRight; + /* The point in the middle of the dichotomy */ + unsigned short iMid; + + /* Binary Search */ + iMid = startIndex; + iLeft = 0U; + iRight = maxIndex; + while ((unsigned short)(iRight - iLeft) > 1U) { + if (u < table[iMid]) { + /* The target value is a bit smaller than the current value on the left */ + iRight = iMid; + } else { + /* TThe target value is greater than the current value on the right */ + iLeft = iMid; + } + /* Get the next intermediate point */ + iMid = ((unsigned short)(iRight + iLeft)) >> 1; + } + return iLeft; +} + +/** + * @brief Dichotomy to find the position of the target value in the array. + * @param u: Target Value. + * @param table: Pointer of Array. + * @param fraction: Poniter ratio value addr. + * @param maxIndex: Max Index. + * @retval Target index. + */ +static unsigned short PreLookBinSearch(float u, const float *table, + unsigned short maxIndex, + float *fraction) +{ + MCS_ASSERT_PARAM(table != NULL); + MCS_ASSERT_PARAM(fraction != NULL); + /* Dichotomy to find the position of the target value in the array */ + unsigned short index; + if (u <= table[0U]) { + /* Less than the minimum value in the table */ + index = 0U; + *fraction = 0.0f; + } else if (u < table[maxIndex]) { + index = BinSearch(u, table, maxIndex >> 1U, maxIndex); + *fraction = (u - table[index]) / (table[index + 1U] - table[index]); + } else { + /* Greater than the minimum value in the table */ + index = maxIndex; + *fraction = 0.0f; + } + return index; +} + +/** + * @brief calculating arc tangent. + * @param u: Target Value. + * @retval Arctangent value of U. + */ +static float ATan(float u) +{ + float tmp = Abs(u); + float frac = 0.0f; + unsigned short index = 0; + float y = 0.0f; + if (tmp >= 0.0f && tmp < ATAN_INPUTVALUE_MIN) { + index = PreLookBinSearch(tmp, atanInBottom, 49U, &frac); /* atanInBottom Max Index is 49 */ + y = atanValBottom[index] + frac * (atanValBottom[index + 1] - atanValBottom[index]); + } else if (tmp >= ATAN_INPUTVALUE_MIN && tmp < ATAN_INPUTVALUE_MID) { + index = PreLookBinSearch(tmp, atanInMid, 24U, &frac); /* atanInMid Max Index is 24 */ + y = atanValMid[index] + frac * (atanValMid[index + 1] - atanValMid[index]); + } else if (tmp >= ATAN_INPUTVALUE_MID && tmp < ATAN_INPUTVALUE_MAX) { + index = PreLookBinSearch(tmp, atanInTop, 9U, &frac); /* atanInTop Max Index is 9 */ + y = atanValTop[index] + frac * (atanValTop[index + 1] - atanValTop[index]); + } else { + y = HALF_PI; /* The input parameter is greater than the maximum radian, The value is PI/2. */ + } + return (u > 0.0f)? y : (- y); +} + + +/** + * @brief modulo operation. + * @param val1 The value to be modulo. + * @param val2 The value to modulo. + * @retval modulo result. + */ +float Mod(float val1, float val2) +{ + MCS_ASSERT_PARAM(val2 > 0.0f); + + int temp = (int)(val1 / val2); + float res = val1 - (float)temp * val2; + return res; +} + + +/** + * @brief Atan2 arctangent calculation. + * @param x Floating-point value representing the X-axis coordinate. + * @param y Floating-point value representing the Y-axis coordinate. + * @retval The atan2 function returns the azimuth from the origin to the point (x, y), that is, + the angle from the x axis. It can also be understood as the argument of the complex number x+yi. + The unit of the returned value is radian. The value range is -pi ~ pi. + */ +float Atan2(float x, float y) +{ + float fZero = 0.0f; + if (x > fZero) { + return ATan(y / x); + } + if (x < fZero && y >= fZero) { + return ATan(y / x) + ONE_PI; + } + if (x < fZero && y < fZero) { + return ATan(y / x) - ONE_PI; + } + /* boundary condition */ + if ((Abs(x) < 0.0001f) && y > fZero) { + return (HALF_PI); + } + if (Abs(x) < 0.0001f && y < fZero) { + return -(HALF_PI); + } + /* default return */ + return fZero; +} + +/** + * @brief Saturation function for dead voltage computing. + * @param u The current amp of zero crossing point. + * @param delta Saturated output point. + * @return Saturation value ([-1.0f, 1.0f]). + */ +float Sat(float u, float delta) +{ + BASE_FUNC_ASSERT_PARAM(delta > 0.0f); + /* less than -0.1, return -1 */ + if (u < -delta) { + return -1.0f; + } else if (u > delta) { /* large than 0.1, return 1 */ + return 1.0f; + } else { + return (u / delta); /* all other values */ + } +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/math/mcs_math.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/math/mcs_math.h new file mode 100644 index 000000000..0992dc10a --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/math/mcs_math.h @@ -0,0 +1,63 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_math.h + * @author MCU Algorithm Team + * @brief Math library. + * This file provides math functions declaration of motor math module. + */ + +/* Define to prevent recursive inclusion ------------------------------------------------------- */ +#ifndef McuMagicTag_MCS_MATH_H +#define McuMagicTag_MCS_MATH_H + +/* Includes ------------------------------------------------------------------------------------ */ +#include "mcs_typedef.h" +#include "base_math.h" + + +/** + * @brief sin cos define + */ +typedef struct { + float sin; /**< The sine value of input angle. */ + float cos; /**< The cosine value of input angle. */ +} TrigVal; + + +/** + * @defgroup MATH_API MATH API + * @brief The common math API definition. + * @{ + */ +float GetSin(float angle); +float GetCos(float angle); +void TrigCalc(TrigVal *val, float angle); +void ParkCalc(const AlbeAxis *albe, float angle, DqAxis *dq); +void InvParkCalc(const DqAxis *dq, float angle, AlbeAxis *albe); +void ClarkeCalc(const UvwAxis *uvw, AlbeAxis *albe); +float Abs(float val); +float Clamp(float val, float upperLimit, float lowerLimit); +float Max(float val1, float val2); +float Min(float val1, float val2); +float Sqrt(float val); +float AngleSub(float angle1, float angle2); +float Mod(float val1, float val2); +float Sat(float u, float delta); +float Atan2(float x, float y); + +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/math/mcs_math_const.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/math/mcs_math_const.h new file mode 100644 index 000000000..6a605bd9e --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/math/mcs_math_const.h @@ -0,0 +1,72 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_math_const.h + * @author MCU Algorithm Team + * @brief This file provides math constant macro definition functionality for + * managing math calculation number definitions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_MCS_MATH_CONST_H +#define McuMagicTag_MCS_MATH_CONST_H + +/** + * @addtogroup MATH + * @brief Math const definition. + * @{ + */ + +/** + * @defgroup MATH_CONST MATH CONST + * @brief The common math const definition for motor control. + * @{ + */ +/* Macro definitions ---------------------------------------------------------*/ +#define ONE_DIV_THREE (0.3333333f) /**< 1/3 */ +#define TWO_DIV_THREE (0.6666667f) /**< 2/3 */ +#define ONE_PI_DIV_SIX (0.5235988f) /**< PI/6 */ +#define ONE_PI_DIV_THREE (1.047197f) /**< PI/3 */ +#define ONE_PI (3.141593f) /**< PI */ +#define DOUBLE_PI_DIV_THREE (2.094395f) /**< 2PI/3 */ +#define DOUBLE_PI (6.283185f) /**< 2*PI */ +#define SQRT3_DIV_TWO (0.8660254f) /**< Sqrt(3)/2 */ +#define ONE_DIV_SQRT3 (0.5773503f) /**< 1/sqrt(3) */ +#define ONE_DIV_DOUBLE_PI (0.1591549f) /**< 1/(2*PI) */ +#define RAD_TO_DEG (57.29578f) /**< 1/pi*180 */ +#define RAD_TO_DIGITAL (10430.06f) /**< 1/pi*32767 */ +#define DIGITAL_TO_RAD (0.00009587673f) /**< pi/32767 */ +#define HALF_PI (1.5707963f) /**< 0.5*pi */ +#define THREE_PI_DIV_TWO (4.7123890f) /**< 1.5*pi */ +#define ONE_DIV_SIX (0.16666667f) /**< 1/6 */ +#define SEVEN_DIV_SIX (1.16666667f) /**< 7/6 */ +#define SIXTY_FIVE_DIV_SIX (10.8333333f) /**< 65/6 */ +#define SEVENTY_ONE_DIV_SIX (11.8333333f) /**< 71/6 */ +#define ONE_DIV_NINE (0.11111111f) /**< 1/9 */ +#define ONE_DIV_TWELVE (0.08333333f) /**< 1/12 */ +#define SQRT2 (1.41421356f) /**< sqrt(2) */ +#define SMALL_FLOAT (0.00000001f) +#define LARGE_FLOAT (10000.0f) +/** + * @} + */ + + /** + * @} + */ + +#endif /* McuMagicTag_MCS_MATH_CONST_H */ diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/modulation/mcs_r1_svpwm.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/modulation/mcs_r1_svpwm.c new file mode 100644 index 000000000..911f6702d --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/modulation/mcs_r1_svpwm.c @@ -0,0 +1,234 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_r1_svpwm.c + * @author MCU Algorithm Team + * @brief This file provides function of Space-vector pulse-width-modulation calculations + * in case of single shunt current sample and current reconstruction. + */ + + +#include "mcs_r1_svpwm.h" +#include "mcs_assert.h" + + +/** + * @brief R1SVPWM handlel init. + * @param r1svHandle The R1SVPWM handle. + * @param voltPu Voltage per unit value. + */ +void R1SVPWM_Init(R1SVPWM_Handle *r1svHandle, float voltPu, float samplePointShift, float sampleWindow) +{ + MCS_ASSERT_PARAM(r1svHandle != NULL); + MCS_ASSERT_PARAM(voltPu > 0.0f); + MCS_ASSERT_PARAM(sampleWindow >= 0.0f && sampleWindow < 1.0f); + MCS_ASSERT_PARAM(samplePointShift > -1.0f && samplePointShift < 1.0f); + /* Initialize the phase-shift sampling window size and sampling point offset. */ + r1svHandle->samplePointShift = samplePointShift; + r1svHandle->sampleWindow = sampleWindow; + /* Initialize the Voltage per unit value */ + r1svHandle->voltPu = voltPu; + r1svHandle->oneDivVoltPu = 1.0f / voltPu; +} + +/** + * @brief R1SVPWM clear. + * @param r1svHandle The R1SVPWM handle. + * @retval None. + */ +void R1SVPWM_Clear(R1SVPWM_Handle *r1svHandle) +{ + MCS_ASSERT_PARAM(r1svHandle != NULL); + /* Clear the historical values calculated by the R1 SVPWM. */ + r1svHandle->voltIndex = 0; + r1svHandle->voltIndexLast = 0; + r1svHandle->samplePoint[SOCA] = 0.0f; + r1svHandle->samplePoint[SOCB] = 0.0f; +} + +/** + * @brief Phase shift calculation for single resistance sampling. + * @param r1SvCalc R1 svpwm calculation handle. + * @param sampleWindow sample window. + * @retval None. + */ +void R1SVPWM_PhaseShift(R1SVPWM_CALC_Handle *r1SvCalc, float sampleWindow) +{ + MCS_ASSERT_PARAM(r1SvCalc != NULL); + MCS_ASSERT_PARAM(sampleWindow >= 0.0f && sampleWindow < 1.0f); + /* Pointer to the array of left and right comparison values. */ + float *compRight = r1SvCalc->compRight; + float *compLeft = r1SvCalc->compLeft; + /* Comparison of three levels. */ + float compMax = r1SvCalc->svCalc.comp[SVPWM_COMP_VAL_MAX]; + float compMid = r1SvCalc->svCalc.comp[SVPWM_COMP_VAL_MID]; + float compMin = r1SvCalc->svCalc.comp[SVPWM_COMP_VAL_MIN]; + /* action time of two vectors */ + float t1 = r1SvCalc->svCalc.t1; + float t2 = r1SvCalc->svCalc.t2; + /** + * PWM phase shift: + * When the action time t1 of the first vector is less than the minimum sampling window, + * the phase with the smallest comparison value(with the largest duty) shifts to the right. + */ + if (t1 < sampleWindow) { + compRight[SVPWM_COMP_VAL_MIN] = compMid - sampleWindow; + compLeft[SVPWM_COMP_VAL_MIN] = compMin + sampleWindow - t1; + } else { + compRight[SVPWM_COMP_VAL_MIN] = compMin; + compLeft[SVPWM_COMP_VAL_MIN] = compMin; + } + + /** + * When the action time t2 of the second vector is less than the minimum sampling window, + * the phase with the largest comparison value (minimum duty) shifts to the left. + */ + if (t2 < sampleWindow) { + compRight[SVPWM_COMP_VAL_MAX] = compMid + sampleWindow; + compLeft[SVPWM_COMP_VAL_MAX] = compMax - sampleWindow + t2; + } else { + compRight[SVPWM_COMP_VAL_MAX] = compMax; + compLeft[SVPWM_COMP_VAL_MAX] = compMax; + } + /* intermediate large unshifted phase */ + compRight[SVPWM_COMP_VAL_MID] = compMid; + compLeft[SVPWM_COMP_VAL_MID] = compMid; +} + +/** + * @brief The duty cycles of PWM wave of three-phase upper switches are + * calculated in the two-phase stationary coordinate system (albe). + * @param r1svHandle R1SVPWM struct handle. + * @param uAlbe Input voltage vector. + * @param dutyUvwLeft Three-phase left duty cycle. + * @param dutyUvwRight Three-phase right duty cycle. + * @retval None. + */ +void R1SVPWM_Exec(R1SVPWM_Handle *r1svHandle, const AlbeAxis *uAlbe, UvwAxis *dutyUvwLeft, UvwAxis *dutyUvwRight) +{ + MCS_ASSERT_PARAM(r1svHandle != NULL); + MCS_ASSERT_PARAM(uAlbe != NULL); + MCS_ASSERT_PARAM(dutyUvwLeft != NULL); + MCS_ASSERT_PARAM(dutyUvwRight != NULL); + R1SVPWM_CALC_Handle r1SvCalc; + float *samplePoint = r1svHandle->samplePoint; + r1SvCalc.svCalc.vAlpha = uAlbe->alpha * r1svHandle->oneDivVoltPu; + r1SvCalc.svCalc.vBeta = uAlbe->beta * r1svHandle->oneDivVoltPu; + + /* Sector Calculation */ + SVPWM_SectorCalc(&r1SvCalc.svCalc); + /** + * In control tick k, record the sector number of the voltage vector calculated in the k–1 tick. + * For the next tick(k+1), it is the voltage vector to be applied. + * Calculate the sector number of the voltage vector that actually acts on the (k+1)th tick. + */ + r1svHandle->voltIndexLast = r1svHandle->voltIndex; + r1svHandle->voltIndex = r1SvCalc.svCalc.sectorIndex; + + if (r1SvCalc.svCalc.sectorIndex < SVPWM_SECTOR_INDEX_MIN || r1SvCalc.svCalc.sectorIndex > SVPWM_SECTOR_INDEX_MAX) { + dutyUvwLeft->u = 0.5f; + dutyUvwLeft->v = 0.5f; + dutyUvwLeft->w = 0.5f; + dutyUvwRight->u = 0.5f; + dutyUvwRight->v = 0.5f; + dutyUvwRight->w = 0.5f; + samplePoint[SOCA] = 0.5f; + samplePoint[SOCB] = 0.5f; + return; + } + /* Calculate three comparison values: max, medium, and min. */ + SVPWM_CompareValCalc(&r1SvCalc.svCalc); + /* phase shift */ + R1SVPWM_PhaseShift(&r1SvCalc, r1svHandle->sampleWindow); + + /* Set sample point SOCA */ + samplePoint[SOCA] = r1SvCalc.compRight[SVPWM_COMP_VAL_MIN] + r1svHandle->samplePointShift; + /* Set sample point SOCB */ + samplePoint[SOCB] = r1SvCalc.compRight[SVPWM_COMP_VAL_MID] + r1svHandle->samplePointShift; + /* Three-phase duty cycle data index based on sector convert */ + SVPWM_IndexConvert(&r1SvCalc.svCalc); + + dutyUvwLeft->u = r1SvCalc.compLeft[r1SvCalc.svCalc.indexU]; + dutyUvwLeft->v = r1SvCalc.compLeft[r1SvCalc.svCalc.indexV]; + dutyUvwLeft->w = r1SvCalc.compLeft[r1SvCalc.svCalc.indexW]; + dutyUvwRight->u = r1SvCalc.compRight[r1SvCalc.svCalc.indexU]; + dutyUvwRight->v = r1SvCalc.compRight[r1SvCalc.svCalc.indexV]; + dutyUvwRight->w = r1SvCalc.compRight[r1SvCalc.svCalc.indexW]; +} + +/** + * @brief The stator current uvw is reconstructed from bus current according to the sector index + * of the output voltage vector. + * @param sectorIndex Sector index of the output voltage vector. + * @param currSocA Bus current at the sample point A. + * @param currSocB Bus current at the sample point B. + * @param curr The reconstructed stator current uvw. + * @retval None. + */ +void R1CurrReconstruct(unsigned int sectorIndex, float currSocA, float currSocB, UvwAxis *curr) +{ + MCS_ASSERT_PARAM(curr != NULL); + /* Reconstructed uvw three-phase current */ + float u; + float v; + float w; + + /* + * The stator current uvw is reconstructed from bus current according to the sector index + * of the output voltage vector. + */ + switch (sectorIndex) { + case SVPWM_ANGLE_0_TO_60_DEG: /* 0 ~ 60° Voltage vector sector */ + u = currSocA; + w = -currSocB; + v = -u - w; + break; + case SVPWM_ANGLE_60_TO_120_DEG: /* 60 ~ 120° Voltage vector sector */ + v = currSocA; + w = -currSocB; + u = -v - w; + break; + case SVPWM_ANGLE_120_TO_180_DEG: /* 120 ~ 180° Voltage vector sector */ + v = currSocA; + u = -currSocB; + w = -u - v; + break; + case SVPWM_ANGLE_180_TO_240_DEG: /* 180 ~ 240° Voltage vector sector */ + w = currSocA; + u = -currSocB; + v = -u - w; + break; + case SVPWM_ANGLE_240_TO_300_DEG: /* 240 ~ 300° Voltage vector sector */ + w = currSocA; + v = -currSocB; + u = -v - w; + break; + case SVPWM_ANGLE_300_TO_360_DEG: /* 300 ~ 360° Voltage vector sector */ + u = currSocA; + v = -currSocB; + w = -u - v; + break; + default: + u = 0.0f; + v = 0.0f; + w = 0.0f; + break; + } + curr->u = u; + curr->v = v; + curr->w = w; +} diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/modulation/mcs_r1_svpwm.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/modulation/mcs_r1_svpwm.h new file mode 100644 index 000000000..3bc199018 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/modulation/mcs_r1_svpwm.h @@ -0,0 +1,90 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_r1_svpwm.h + * @author MCU Algorithm Team + * @brief This file provides functions declaration of Space-vector pulse-width-modulation calculations. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_MCS_R1_SVPWM_H +#define McuMagicTag_MCS_R1_SVPWM_H + +/* Includes ------------------------------------------------------------------*/ +#include "mcs_typedef.h" +#include "mcs_svpwm.h" + +/** The ADC sampling twice for one resistor motor control application, SOCA + SOCB */ +#define SOCA 0 +#define SOCB 1 +#define R1_ADC_SAMPLE_NUMS 2 + +/** + * @brief Structure of temporary variables for R1SVPWM calculation. + */ +typedef struct { + SVPWM_CALC_Handle svCalc; + float compLeft[SVPWM_COMP_VAL_TOTAL]; + float compRight[SVPWM_COMP_VAL_TOTAL]; +} R1SVPWM_CALC_Handle; +/** + * @defgroup R1_SVPWM_MODULE R1 SVPWM MODULE + * @brief The SVPWM module for R1(One Resistor) application. + * @{ + */ + +/** + * @defgroup R1_SVPWM_STRUCT R1 SVPWM STRUCT + * @brief The SVPWM module's struct definition for R1(One Resistor) application. + * @{ + */ +/* Typedef definitions -------------------------------------------------------*/ +/** + * @brief R1SVPWM struct members and parameters. + */ +typedef struct { + float voltPu; /**< Voltage per unit value. */ + float oneDivVoltPu; /**< Reciprocal of voltage unit value. */ + float sampleWindow; /**< Sampling Window */ + float samplePointShift; /**< Sampling point phase shift */ + unsigned int voltIndex; /**< Index of voltage sector. */ + unsigned int voltIndexLast; /**< Index of last voltage sector. */ + float samplePoint[R1_ADC_SAMPLE_NUMS]; /**< Sample point of twice sample. */ +} R1SVPWM_Handle; +/** + * @} + */ + +/** + * @defgroup R1_SVPWM_API R1 SVPWM API + * @brief The SVPWM module's API declaration for R1(One Resistor) application. + * @{ + */ +void R1SVPWM_Init(R1SVPWM_Handle *r1svHandle, float voltPu, float samplePointShift, float sampleWindow); +void R1SVPWM_Clear(R1SVPWM_Handle *r1svHandle); +void R1SVPWM_Exec(R1SVPWM_Handle *r1svHandle, const AlbeAxis *uAlbe, UvwAxis *dutyUvwLeft, UvwAxis *dutyUvwRight); +void R1SVPWM_PhaseShift(R1SVPWM_CALC_Handle *r1SvCalc, float sampleWindow); +void R1CurrReconstruct(unsigned int sectorIndex, float currSocA, float currSocB, UvwAxis *curr); +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_MCS_SVPWM_H */ diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/modulation/mcs_svpwm.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/modulation/mcs_svpwm.c new file mode 100644 index 000000000..71b595ecc --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/modulation/mcs_svpwm.c @@ -0,0 +1,217 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_svpwm.c + * @author MCU Algorithm Team + * @brief This file provides function of Space-Vector Pulse-Width-Modulation(SVPWM) calculations. + */ + +#include "mcs_svpwm.h" +#include "mcs_math_const.h" +#include "mcs_assert.h" +#include "mcs_math.h" + +/* Macro definitions ---------------------------------------------------------*/ +/** + * @brief Initialzer of SVPWM handle. + * @param svHandle The SVPWM handle. + * @param voltPu The per-unit voltage value. + * @retval None. + */ +void SVPWM_Init(SVPWM_Handle *svHandle, float voltPu) +{ + MCS_ASSERT_PARAM(svHandle != NULL); + MCS_ASSERT_PARAM(voltPu > 0.0f); + svHandle->voltPu = voltPu; + svHandle->oneDivVoltPu = 1.0f / voltPu; +} + +/** + * @brief Calculate svpwm sector. + * @param svCalc The svpwm calc struct. + * @retval None. + */ +void SVPWM_SectorCalc(SVPWM_CALC_Handle *svCalc) +{ + MCS_ASSERT_PARAM(svCalc != NULL); + /* The initial sector is 0. */ + svCalc->sectorIndex = 0; + /* Three-level voltage calculation */ + svCalc->volt[SVPWM_VOLT_0] = svCalc->vBeta; + svCalc->volt[SVPWM_VOLT_1] = SQRT3_DIV_TWO * svCalc->vAlpha - 0.5f * svCalc->vBeta; + svCalc->volt[SVPWM_VOLT_2] = -SQRT3_DIV_TWO * svCalc->vAlpha - 0.5f * svCalc->vBeta; + + /* sector index calculate && calculate abs values (V) */ + if (svCalc->volt[SVPWM_VOLT_0] > 0.0f) { + svCalc->sectorIndex += SVPWM_SECTOR_ADD_1; + } else { + svCalc->volt[SVPWM_VOLT_0] = -svCalc->volt[SVPWM_VOLT_0]; + } + if (svCalc->volt[SVPWM_VOLT_1] > 0.0f) { + svCalc->sectorIndex += SVPWM_SECTOR_ADD_2; + } else { + svCalc->volt[SVPWM_VOLT_1] = -svCalc->volt[SVPWM_VOLT_1]; + } + if (svCalc->volt[SVPWM_VOLT_2] > 0.0f) { + svCalc->sectorIndex += SVPWM_SECTOR_ADD_4; + } else { + svCalc->volt[SVPWM_VOLT_2] = -svCalc->volt[SVPWM_VOLT_2]; + } +} + +/** + * @brief Calculate three comparison values: max, medium, and min.. + * @param svCalc The svpwm calc struct. + * @retval None. + */ +void SVPWM_CompareValCalc(SVPWM_CALC_Handle *svCalc) +{ + MCS_ASSERT_PARAM(svCalc != NULL); + /* Calculate the action time of the two vectors based on the sector. */ + switch (svCalc->sectorIndex) { + case SVPWM_ANGLE_0_TO_60_DEG: /* 0 ~ 60° Voltage vector sector */ + svCalc->t1 = svCalc->volt[SVPWM_VOLT_1]; + svCalc->t2 = svCalc->volt[SVPWM_VOLT_0]; + break; + case SVPWM_ANGLE_60_TO_120_DEG: /* 60 ~ 120° Voltage vector sector */ + svCalc->t1 = svCalc->volt[SVPWM_VOLT_1]; + svCalc->t2 = svCalc->volt[SVPWM_VOLT_2]; + break; + case SVPWM_ANGLE_120_TO_180_DEG: /* 120 ~ 180° Voltage vector sector */ + svCalc->t1 = svCalc->volt[SVPWM_VOLT_0]; + svCalc->t2 = svCalc->volt[SVPWM_VOLT_2]; + break; + case SVPWM_ANGLE_180_TO_240_DEG: /* 180 ~ 240° Voltage vector sector */ + svCalc->t1 = svCalc->volt[SVPWM_VOLT_0]; + svCalc->t2 = svCalc->volt[SVPWM_VOLT_1]; + break; + case SVPWM_ANGLE_240_TO_300_DEG: /* 240 ~ 300° Voltage vector sector */ + svCalc->t1 = svCalc->volt[SVPWM_VOLT_2]; + svCalc->t2 = svCalc->volt[SVPWM_VOLT_1]; + break; + case SVPWM_ANGLE_300_TO_360_DEG: /* 300 ~ 360° Voltage vector sector */ + svCalc->t1 = svCalc->volt[SVPWM_VOLT_2]; + svCalc->t2 = svCalc->volt[SVPWM_VOLT_0]; + break; + default: + break; + } + + /* The action time of two vectors is converted to three comparison values. */ + svCalc->comp[SVPWM_COMP_VAL_MIN] = (1.0f - svCalc->t1 - svCalc->t2) * 0.5f; + svCalc->comp[SVPWM_COMP_VAL_MID] = svCalc->comp[SVPWM_COMP_VAL_MIN] + svCalc->t1; + svCalc->comp[SVPWM_COMP_VAL_MAX] = svCalc->comp[SVPWM_COMP_VAL_MID] + svCalc->t2; +} + +/** + * @brief Three-phase duty cycle data index based on sector convert. + * @param svCalc The svpwm calc struct. + * @retval None. + */ +void SVPWM_IndexConvert(SVPWM_CALC_Handle *svCalc) +{ + MCS_ASSERT_PARAM(svCalc != NULL); + /* Three-phase duty cycle data index based on sector convert */ + switch (svCalc->sectorIndex) { + case SVPWM_ANGLE_0_TO_60_DEG: /* 0 ~ 60° Voltage vector sector */ + svCalc->indexU = SVPWM_COMP_VAL_MIN; + svCalc->indexV = SVPWM_COMP_VAL_MID; + svCalc->indexW = SVPWM_COMP_VAL_MAX; + break; + case SVPWM_ANGLE_60_TO_120_DEG: /* 60 ~ 120° Voltage vector sector */ + svCalc->indexU = SVPWM_COMP_VAL_MID; + svCalc->indexV = SVPWM_COMP_VAL_MIN; + svCalc->indexW = SVPWM_COMP_VAL_MAX; + break; + case SVPWM_ANGLE_120_TO_180_DEG: /* 120 ~ 180° Voltage vector sector */ + svCalc->indexU = SVPWM_COMP_VAL_MAX; + svCalc->indexV = SVPWM_COMP_VAL_MIN; + svCalc->indexW = SVPWM_COMP_VAL_MID; + break; + case SVPWM_ANGLE_180_TO_240_DEG: /* 180 ~ 240° Voltage vector sector */ + svCalc->indexU = SVPWM_COMP_VAL_MAX; + svCalc->indexV = SVPWM_COMP_VAL_MID; + svCalc->indexW = SVPWM_COMP_VAL_MIN; + break; + case SVPWM_ANGLE_240_TO_300_DEG: /* 240 ~ 300° Voltage vector sector */ + svCalc->indexU = SVPWM_COMP_VAL_MID; + svCalc->indexV = SVPWM_COMP_VAL_MAX; + svCalc->indexW = SVPWM_COMP_VAL_MIN; + break; + case SVPWM_ANGLE_300_TO_360_DEG: /* 300 ~ 360° Voltage vector sector */ + svCalc->indexU = SVPWM_COMP_VAL_MIN; + svCalc->indexV = SVPWM_COMP_VAL_MAX; + svCalc->indexW = SVPWM_COMP_VAL_MID; + break; + default: + break; + } +} + +/** + * @brief The duty cycles of PWM wave of three-phase upper switches are + * calculated in the two-phase stationary coordinate system (albe). + * @param svHandle The SVPWM struct handle. + * @param uAlbe Input voltage vector. + * @param dutyUvw Three-phase A compare value. + * @retval None. + */ +void SVPWM_Exec(const SVPWM_Handle *svHandle, const AlbeAxis *uAlbe, UvwAxis *dutyUvw) +{ + MCS_ASSERT_PARAM(svHandle != NULL); + MCS_ASSERT_PARAM(uAlbe != NULL); + MCS_ASSERT_PARAM(dutyUvw != NULL); + SVPWM_CALC_Handle svCalc; + + /* Amplitude limited */ + float voltMax = 1.0f / svHandle->oneDivVoltPu; + float amp = Sqrt(uAlbe->alpha * uAlbe->alpha + uAlbe->beta * uAlbe->beta); /* Voltage amplitude. */ + AlbeAxis uAlbeLimited; + float coeff; + if (amp < 0.001f) { + coeff = 1.0f; + } else { + coeff = voltMax / amp; /* Amplitude limit coefficient. */ + } + if (amp > voltMax) { + uAlbeLimited.alpha = uAlbe->alpha * coeff; + uAlbeLimited.beta = uAlbe->beta * coeff; + } else { + uAlbeLimited.alpha = uAlbe->alpha; + uAlbeLimited.beta = uAlbe->beta; + } + svCalc.vAlpha = uAlbeLimited.alpha * svHandle->oneDivVoltPu; + svCalc.vBeta = uAlbeLimited.beta * svHandle->oneDivVoltPu; + + /* Voltage vector sector calculation */ + SVPWM_SectorCalc(&svCalc); + /* Check whether the current sector is abnormal. */ + if (svCalc.sectorIndex < SVPWM_SECTOR_INDEX_MIN || svCalc.sectorIndex > SVPWM_SECTOR_INDEX_MAX) { + dutyUvw->u = 0.5f; + dutyUvw->v = 0.5f; + dutyUvw->w = 0.5f; + return; + } + /* Calculate three comparison values: max, medium, and min. */ + SVPWM_CompareValCalc(&svCalc); + /* Three-phase duty cycle data index based on sector convert */ + SVPWM_IndexConvert(&svCalc); + /* Output UVW three-phase duty cycle */ + dutyUvw->u = svCalc.comp[svCalc.indexU]; + dutyUvw->v = svCalc.comp[svCalc.indexV]; + dutyUvw->w = svCalc.comp[svCalc.indexW]; +} diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/modulation/mcs_svpwm.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/modulation/mcs_svpwm.h new file mode 100644 index 000000000..fe636fa5f --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/modulation/mcs_svpwm.h @@ -0,0 +1,117 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_svpwm.h + * @author MCU Algorithm Team + * @brief This file provides functions declaration of Space-Vector Pulse-Width-Modulation(SVPWM) calculations. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_MCS_SVPWM_H +#define McuMagicTag_MCS_SVPWM_H + +/* Includes ------------------------------------------------------------------*/ +#include "mcs_typedef.h" + +/** Voltage vector sector */ +#define SVPWM_ANGLE_0_TO_60_DEG 3 +#define SVPWM_ANGLE_60_TO_120_DEG 1 +#define SVPWM_ANGLE_120_TO_180_DEG 5 +#define SVPWM_ANGLE_180_TO_240_DEG 4 +#define SVPWM_ANGLE_240_TO_300_DEG 6 +#define SVPWM_ANGLE_300_TO_360_DEG 2 + +/** The U-V-W phase compare value's index of APT timers. */ +#define SVPWM_COMP_VAL_MAX 2 +#define SVPWM_COMP_VAL_MID 1 +#define SVPWM_COMP_VAL_MIN 0 +#define SVPWM_COMP_VAL_TOTAL 3 + +/** The three voltage level to compare, for sector index decision. */ +#define SVPWM_VOLT_0 0 +#define SVPWM_VOLT_1 1 +#define SVPWM_VOLT_2 2 +#define SVPWM_VOLT_TOTAL 3 + +/** Sector index calculate: N = A + 2B + 4C */ +#define SVPWM_SECTOR_ADD_1 1 +#define SVPWM_SECTOR_ADD_2 2 +#define SVPWM_SECTOR_ADD_4 4 + +#define SVPWM_SECTOR_INDEX_MIN 1 +#define SVPWM_SECTOR_INDEX_MAX 6 + +/** + * @defgroup SVPWM_MODULE SVPWM MODULE + * @brief The Space-Vector Pulse-Width-Modulation(SVPWM) module. + * @{ + */ + +/** + * @defgroup SVPWM_STRUCT SVPWM STRUCT + * @brief The SVPWM module's data struct definition. + * @{ + */ + +/* Typedef definitions -------------------------------------------------------*/ +/** + * @brief SVPWM struct members and parameters. + */ +typedef struct { + float voltPu; /**< Voltage per unit value. */ + float oneDivVoltPu; /**< Reciprocal of voltage unit value. */ +} SVPWM_Handle; + +/** + * @brief Structure of temporary variables for SVPWM calculation. + */ +typedef struct { + float vAlpha; /**< Voltage vector. */ + float vBeta; /**< Voltage vector. */ + float t1; /**< T1 are the action times of the sequential action vectors. */ + float t2; /**< T2 are the action times of the sequential action vectors. */ + unsigned short indexU; /**< U-phase duty cycle conversion index */ + unsigned short indexV; /**< V-phase duty cycle conversion index */ + unsigned short indexW; /**< W-phase duty cycle conversion index */ + unsigned int sectorIndex; /**< Sector index */ + float volt[SVPWM_VOLT_TOTAL]; /**< temporary voltage to calculate sector index */ + float comp[SVPWM_COMP_VAL_TOTAL]; /**< Duty cycle corresponding to the comparison value */ +} SVPWM_CALC_Handle; + +/** + * @} + */ + +/** + * @defgroup SVPWM_API SVPWM API + * @brief The SVPWM module's API declaration. + * @{ + */ +void SVPWM_Init(SVPWM_Handle *svHandle, float voltPu); +void SVPWM_SectorCalc(SVPWM_CALC_Handle *svCalc); +void SVPWM_CompareValCalc(SVPWM_CALC_Handle *svCalc); +void SVPWM_IndexConvert(SVPWM_CALC_Handle *svCalc); +void SVPWM_Exec(const SVPWM_Handle *svHandle, const AlbeAxis *uAlbe, UvwAxis *dutyUvw); +/** + * @} + */ + +/** + * @} + */ + +#endif /* McuMagicTag_MCS_SVPWM_H */ diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/observer/mcs_fosmo.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/observer/mcs_fosmo.c new file mode 100644 index 000000000..690bbb951 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/observer/mcs_fosmo.c @@ -0,0 +1,199 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_fosmo.c + * @author MCU Algorithm Team + * @brief This file provides functions of position sliding mode observer (SMO) module. + */ + +#include "mcs_fosmo.h" +#include "mcs_math_const.h" +#include "mcs_math.h" +#include "mcs_assert.h" + + +void FOSMO_Init(FOSMO_Handle *fosmo, const FOSMO_Param foSmoParam, const MOTOR_Param mtrParam, float ts) +{ + MCS_ASSERT_PARAM(fosmo != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + /* time sample, unit: s */ + fosmo->ts = ts; + /* filter coefficient */ + fosmo->a1 = 1.0f - (fosmo->ts * mtrParam.mtrRs / mtrParam.mtrLd); + fosmo->a2 = fosmo->ts / mtrParam.mtrLd; + + fosmo->kSmo = foSmoParam.gain; + fosmo->lambda = foSmoParam.lambda; /* SMO coefficient of cut-off frequency = lambda * we, unit: rad/2. */ + /* smo angle filcompAngle */ + fosmo->filCompAngle = Atan2(1.0f, 1.0f / fosmo->lambda); + fosmo->pllBdw = foSmoParam.pllBdw; + fosmo->fcLpf = foSmoParam.fcLpf; + + FOSMO_Clear(fosmo); + + fosmo->emfLpfMinFreq = foSmoParam.fcEmf; /* The minimum cutoff frequency of the back EMF filter is 2.0. */ + + PLL_Init(&fosmo->pll, fosmo->ts, fosmo->pllBdw); // bdw + + /* low pass filter cutoff freqency for speed estimation is 40Hz */ + FOLPF_Init(&fosmo->spdFilter, fosmo->ts, fosmo->fcLpf); +} + +/** + * @brief Set parameters for fosmo. + * @param fosmo The SMO handle. + * @param gain The smo gain. + * @param pllBdw The PLL bandwidth (Hz). + * @param fc The first-order low pass filter cut-off frequency. + * @retval None. + */ +void FOSMO_ParamUpdate(FOSMO_Handle *fosmo, float gain, float pllBdw, float fc) +{ + MCS_ASSERT_PARAM(fosmo != NULL); + MCS_ASSERT_PARAM(pllBdw > 0.0f); + MCS_ASSERT_PARAM(fc > 0.0f); + + fosmo->kSmo = gain; + fosmo->fcLpf = fc; + fosmo->pllBdw = pllBdw; + + /* Set PI parameters with given bandwidth */ + float we = DOUBLE_PI * pllBdw; + fosmo->pll.pi.kp = 2.0f * we; + fosmo->pll.pi.ki = we * we; + + /* Set LPF parameters with given fc */ + fosmo->spdFilter.fc = fc; + float wcTs = DOUBLE_PI * fc * fosmo->spdFilter.ts; + fosmo->spdFilter.a1 = 1.0f / (1.0f + wcTs); /* wcTs > 0 */ + fosmo->spdFilter.b1 = 1.0f - fosmo->spdFilter.a1; +} + + +/** + * @brief Clear historical values of SMO handle. + * @param fosmo SMO struct handle. + * @retval None. + */ +void FOSMO_Clear(FOSMO_Handle *fosmo) +{ + MCS_ASSERT_PARAM(fosmo != NULL); + /* Clear historical values of SMO handle */ + fosmo->ialbeEst.alpha = 0.0f; + fosmo->ialbeEst.beta = 0.0f; + fosmo->ialbeEstLast.alpha = 0.0f; + fosmo->ialbeEstLast.beta = 0.0f; + fosmo->emfEstUnFil.alpha = 0.0f; + fosmo->emfEstUnFil.beta = 0.0f; + fosmo->emfEstFil.alpha = 0.0f; + fosmo->emfEstFil.beta = 0.0f; + /* Clear historical values of PLL controller */ + PLL_Clear(&fosmo->pll); + /* Clear historical values of first-order fosmo speed filter */ + FOLPF_Clear(&fosmo->spdFilter); +} + +/** + * @brief Calculation method of first-order SMO. + * @param fosmo SMO struct handle. + * @param ialbeFbk Feedback currents in the alpha-beta coordinate (A). + * @param valbeRef FOC output voltages in alpha-beta coordinate (V). + * @param refHz The reference frequency (Hz). + * @retval None. + */ +void FOSMO_Exec(FOSMO_Handle *fosmo, const AlbeAxis *ialbeFbk, const AlbeAxis *valbeRef, float refHz) +{ + MCS_ASSERT_PARAM(fosmo != NULL); + MCS_ASSERT_PARAM(ialbeFbk != NULL); + MCS_ASSERT_PARAM(valbeRef != NULL); + float err; + float wcTs; + float fcAbs = Abs(refHz); + float filCompAngle; /* Compensation angle (rad) */ + float currAlpha = fosmo->ialbeEstLast.alpha; + float currBeta = fosmo->ialbeEstLast.beta; + float emfUnAlpha = fosmo->emfEstUnFil.alpha; + float emfUnBeta = fosmo->emfEstUnFil.beta; + /* Alpha beta current observation value */ + fosmo->ialbeEst.alpha = + (fosmo->a1 * currAlpha) + (fosmo->a2 * (valbeRef->alpha - emfUnAlpha)); + fosmo->ialbeEst.beta = + (fosmo->a1 * currBeta) + (fosmo->a2 * (valbeRef->beta - emfUnBeta)); + + fosmo->ialbeEstLast.alpha = fosmo->ialbeEst.alpha; + fosmo->ialbeEstLast.beta = fosmo->ialbeEst.beta; + + /* Estmated back EMF by sign function. */ + err = fosmo->ialbeEst.alpha - ialbeFbk->alpha; + fosmo->emfEstUnFil.alpha = fosmo->kSmo * ((err > 0.0f) ? 1.0f : -1.0f); + err = fosmo->ialbeEst.beta - ialbeFbk->beta; + fosmo->emfEstUnFil.beta = fosmo->kSmo * ((err > 0.0f) ? 1.0f : -1.0f); + + /* Estmated back EMF is filtered by first-order LPF. */ + if (fcAbs <= fosmo->emfLpfMinFreq) { + wcTs = fosmo->emfLpfMinFreq * DOUBLE_PI * fosmo->ts * fosmo->lambda; + } else { + wcTs = fcAbs * DOUBLE_PI * fosmo->ts * fosmo->lambda; + } + fosmo->emfEstFil.alpha = (fosmo->emfEstFil.alpha + wcTs * fosmo->emfEstUnFil.alpha) / (wcTs + 1.0f); + fosmo->emfEstFil.beta = (fosmo->emfEstFil.beta + wcTs * fosmo->emfEstUnFil.beta) / (wcTs + 1.0f); + + /* Get phase angle and frequency from BEMF by PLL. */ + PLL_Exec(&fosmo->pll, -fosmo->emfEstFil.alpha, fosmo->emfEstFil.beta); + + /* Compensation phase lag caused by the LPF. */ + filCompAngle = (refHz > 0.0f) ? (fosmo->filCompAngle) : AngleSub(ONE_PI, fosmo->filCompAngle); + fosmo->elecAngle = Mod(fosmo->pll.angle + filCompAngle, DOUBLE_PI); + if (fosmo->elecAngle > ONE_PI) { + fosmo->elecAngle -= DOUBLE_PI; + } + if (fosmo->elecAngle < -ONE_PI) { + fosmo->elecAngle += DOUBLE_PI; + } + /* Estmated speed is filtered by first-order LPF. */ + fosmo->spdEst = FOLPF_Exec(&fosmo->spdFilter, fosmo->pll.freq); +} + +/** + * @brief Set ts for first-order SMO. + * @param fosmo SMO struct handle. + * @param ts Control period (s). + * @retval None. + */ +void FOSMO_SetTs(FOSMO_Handle *fosmo, float ts) +{ + MCS_ASSERT_PARAM(fosmo != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + fosmo->ts = ts; + /* Set PLL ts and filter ts. */ + PLL_SetTs(&fosmo->pll, ts); + FOLPF_SetTs(&fosmo->spdFilter, ts); +} + +/** + * @brief Set coefficient of cut-off frequency(lambda * we rad/2) for first-order SMO. + * @param fosmo SMO struct handle. + * @param lambda SMO filter coefficient. + * @retval None. + */ +void FOSMO_SetLambda(FOSMO_Handle *fosmo, float lambda) +{ + MCS_ASSERT_PARAM(fosmo != NULL); + MCS_ASSERT_PARAM(lambda > 0.0f); + fosmo->lambda = lambda; + fosmo->filCompAngle = Atan2(1.0f, 1.0f / fosmo->lambda); +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/observer/mcs_fosmo.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/observer/mcs_fosmo.h new file mode 100644 index 000000000..350842e23 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/observer/mcs_fosmo.h @@ -0,0 +1,106 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_fosmo.h + * @author MCU Algorithm Team + * @brief Sliding-mode observer (SMO) for motor position acquisition. + * This file provides position SMO and Phase-locked loop (PLL) declaration for motor control. + */ + +/* Define to prevent recursive inclusion ------------------------------------------------------- */ +#ifndef McuMagicTag_MCS_FOSMO_H +#define McuMagicTag_MCS_FOSMO_H + +/* Includes ------------------------------------------------------------------------------------ */ +#include "mcs_mtr_param.h" +#include "mcs_typedef.h" +#include "mcs_pll.h" +#include "mcs_filter.h" + +/** + * @defgroup FOSMO_MODULE FOSMO MODULE + * @brief The First Order Sliding Mode Observer module. + * @{ + */ + +/** + * @defgroup FOSMO_STRUCT FOSMO STRUCT + * @brief The First Order Sliding Mode Observer's data struct definition. + * @{ + */ +/* Typedef definitions ------------------------------------------------------------------------- */ +/** + * @brief Position SMO struct members and parameters. + */ +typedef struct { + float ts; /**< SMO control period (s). */ + float a1; /**< Coefficient of differential equation. */ + float a2; /**< Coefficient of differential equation. */ + float kSmo; /**< SMO gain. */ + float lambda; /**< SMO coefficient of cut-off frequency, its value = lambda * we. */ + float emfLpfMinFreq; /**< The minimum cut-off frequency of back-EMF filter. */ + float pllBdw; /**< The PLL bandwidth. */ + float fcLpf; /**< The cut-off frequency of First-order LPF for speed (Hz). */ + float filCompAngle; /**< Compensation angle (atan(1/lambda)) for the back-EMF filter. */ + float elecAngle; /**< SMO estimated electronic angle (rad). */ + float spdEst; /**< SMO estimated electronic speed (Hz). */ + AlbeAxis emfEstUnFil; /**< Estimated back-EMF in the alpha-beta coordinate by differential equation. */ + AlbeAxis ialbeEst; /**< SMO estimated currents in the alpha-beta coordinate. */ + AlbeAxis ialbeEstLast; /**< SMO history values of estimated currents in the alpha-beta coordinate. */ + AlbeAxis emfEstFil; /**< SMO estimated back-EMF in the alpha-beta coordinate. */ + PLL_Handle pll; /**< PLL handle. */ + FOFLT_Handle spdFilter; /**< First-order LPF for speed. */ +} FOSMO_Handle; + +/** + * @} + */ +typedef struct { + float gain; + float lambda; + float fcEmf; + float pllBdw; + float fcLpf; +} FOSMO_Param; + + +/** + * @defgroup FOSMO_API FOSMO API + * @brief The First Order Sliding Mode Observer's API declaration. + * @{ + */ + +void FOSMO_Init(FOSMO_Handle *fosmo, const FOSMO_Param foSmoParam, const MOTOR_Param mtrParam, float ts); + +void FOSMO_Exec(FOSMO_Handle *fosmo, const AlbeAxis *ialbeFbk, const AlbeAxis *valbeRef, float refHz); + +void FOSMO_ParamUpdate(FOSMO_Handle *fosmo, float gain, float pllBdw, float fc); + +void FOSMO_Clear(FOSMO_Handle *fosmo); + +void FOSMO_SetTs(FOSMO_Handle *fosmo, float ts); + +void FOSMO_SetLambda(FOSMO_Handle *fosmo, float lambda); +/** + * @} + */ + +/** + * @} + */ + +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pfc/pfc_curr_ctrl.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pfc/pfc_curr_ctrl.c new file mode 100644 index 000000000..3eda2abd1 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pfc/pfc_curr_ctrl.c @@ -0,0 +1,50 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file pfc_curr_ctrl.c + * @author MCU Algorithm Team + * @brief This file provides function of power factor correction(PFC) current control + */ +#include "pfc_curr_ctrl.h" +#include "mcs_assert.h" + + +/** + * @brief Clear historical values of power factor correction(PFC) current controller. + * @param currCtrl PFC current control structure + * @retval None. + */ +void PFC_CurrCtrlClear(PFC_CURRCTRL_Handle *currCtrl) +{ + MCS_ASSERT_PARAM(currCtrl != NULL); + currCtrl->currPiCtrl.differ = 0.0f; + currCtrl->currPiCtrl.integral = 0.0f; +} + +/** + * @brief Simplified power factor correction(PFC) current controller PI calculation. + * @param currCtrl PFC current control structure + * @retval None. + */ +void PFC_CurrCtrlExec(PFC_CURRCTRL_Handle *currCtrl) +{ + MCS_ASSERT_PARAM(currCtrl != NULL); + /* Calculate the current error of power factor correction(PFC). */ + currCtrl->currPiCtrl.error = currCtrl->currRef - currCtrl->unitCurrFdbk; + /* Calculation the output pwm duty of power factor correction(PFC) current. */ + currCtrl->pwmDuty = PI_Exec(&currCtrl->currPiCtrl); +} diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pfc/pfc_curr_ctrl.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pfc/pfc_curr_ctrl.h new file mode 100644 index 000000000..d7ed3d9fd --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pfc/pfc_curr_ctrl.h @@ -0,0 +1,79 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file pfc_curr_ctrl.h + * @author MCU Algorithm Team + * @brief Current loop control. This file provides function of power factor correction(PFC) current control + */ +/* Define to prevent recursive inclusion ------------------------------------------------------- */ +#ifndef McuMagicTag_PFC_CURR_CTRL_H +#define McuMagicTag_PFC_CURR_CTRL_H + +/* Includes ------------------------------------------------------------------------------------ */ +#include "mcs_pid_ctrl.h" + +/** + * @defgroup PFC_CURRENT_CONTROLLER PFC_CURRENT CONTROLLER MODULE + * @brief The current controller function. + * @{ + */ + +/** + * @defgroup PFC_CURRENT_CONTROLLER_STRUCT PFC_CURRENT CONTROLLER STRUCT + * @brief The current controller's data structure definition. + * @{ + */ + +/* Typedef definitions ------------------------------------------------------------------------- */ +/** + * @brief current Controller Struct members and parameters. + */ +typedef struct { + float currRef; /* < current loop control reference current(A) */ + float currFdbk; /* < current loop control feedback current(A) */ + float unitCurrFdbk; /* < current loop control feedback unitary current */ + float maxCurrFdbk; /* < current loop control max feedback current(A) */ + float startCurrFdbk; /* < current loop control start feedback current(A) */ + float stopCurrFdbk; /* < current loop control stop feedback current(A) */ + float pwmDuty; /* < current loop control pulse width modulation(PWM) duty */ + float pwmOut; /* < current loop control PWM final output (output = cmpst + duty) */ + float rectVoltFdbk; /* < current loop control rectified feedback voltage(V) */ + float unitRectVoltFdbk; /* < current loop control rectified feedback unitary voltage */ + float compensation; + PID_Handle currPiCtrl; /* < current loop controller define */ +} PFC_CURRCTRL_Handle; +/** + * @} + */ + +/** + * @defgroup PFC_CURRENT_CONTROLLER_API PFC_CURRENT CONTROLLER API + * @brief The current controller's API declaration. + * @{ + */ + +void PFC_CurrCtrlClear(PFC_CURRCTRL_Handle *currCtrl); + +void PFC_CurrCtrlExec(PFC_CURRCTRL_Handle *currCtrl); +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_PFC_CURR_CTRL_H */ diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pfc/pfc_volt_ctrl.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pfc/pfc_volt_ctrl.c new file mode 100644 index 000000000..1fdf5dfd3 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pfc/pfc_volt_ctrl.c @@ -0,0 +1,51 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file pfc_volt_ctrl.c + * @author MCU Algorithm Team + * @brief This file provides function of power factor correction(PFC) voltage control + */ +#include "pfc_volt_ctrl.h" +#include "mcs_math.h" +#include "mcs_assert.h" + + +/** + * @brief Clear historical values of power factor correction(PFC) voltage controller. + * @param voltCtrl PFC voltage control structure + * @retval None. + */ +void PFC_VoltCtrlClear(PFC_VOLTCTRL_Handle *voltCtrl) +{ + MCS_ASSERT_PARAM(voltCtrl != NULL); + voltCtrl->voltPiCtrl.differ = 0.0f; + voltCtrl->voltPiCtrl.integral = 0.0f; +} + +/** + * @brief Simplified power factor correction(PFC) voltage controller PI calculation. + * @param voltCtrl PFC voltage control structure + * @retval None. + */ +void PFC_VoltCtrlExec(PFC_VOLTCTRL_Handle *voltCtrl) +{ + MCS_ASSERT_PARAM(voltCtrl != NULL); + /* Calculate the voltage error of power factor correction(PFC). */ + voltCtrl->voltPiCtrl.error = voltCtrl->uniVoltRef - voltCtrl->unitVoltFdbk; + /* Calculation the voltage loop control output of power factor correction(PFC). */ + voltCtrl->voltOut = PI_Exec(&voltCtrl->voltPiCtrl); +} diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pfc/pfc_volt_ctrl.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pfc/pfc_volt_ctrl.h new file mode 100644 index 000000000..b1f6e94d7 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pfc/pfc_volt_ctrl.h @@ -0,0 +1,72 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file pfc_volt_ctrl.h + * @author MCU Algorithm Team + * @brief Voltage loop control. This file provides function of power factor correction(PFC) voltage control + */ +/* Define to prevent recursive inclusion ------------------------------------------------------- */ +#ifndef McuMagicTag_PFC_VOLT_CTRL_H +#define McuMagicTag_PFC_VOLT_CTRL_H + +/* Includes ------------------------------------------------------------------------------------ */ +#include "mcs_pid_ctrl.h" + +/** + * @defgroup VOLTAGE_CONTROLLER VOLTAGE CONTROLLER MODULE + * @brief The voltage controller function. + * @{ + */ + +/** + * @defgroup VOLTAGE_CONTROLLER_STRUCT VOLTAGE CONTROLLER STRUCT + * @brief The voltage controller's data structure definition. + * @{ + */ + +/* Typedef definitions ------------------------------------------------------------------------- */ +/** + * @brief Voltage controller struct. + */ +typedef struct { + float uniVoltRef; /* < voltage loop control unitary reference voltage(V) */ + float voltFdbk; /* < voltage loop control feedback voltage(V) */ + float unitVoltFdbk; /* < voltage loop control feedback unitary voltage */ + float startVolt; /* < voltage loop control start voltage(V) */ + float voltOut; /* < voltage loop control output */ + PID_Handle voltPiCtrl; /* < voltage loop controller define */ +} PFC_VOLTCTRL_Handle; +/** + * @} + */ + +/** + * @defgroup VOLTAGE_CONTROLLER_API VOLTAGE CONTROLLER API + * @brief The voltage controller's API declaration. + * @{ + */ +void PFC_VoltCtrlClear(PFC_VOLTCTRL_Handle *voltCtrl); + +void PFC_VoltCtrlExec(PFC_VOLTCTRL_Handle *voltCtrl); +/** + * @} + */ + +/** + * @} + */ +#endif /* McuMagicTag_PFC_VOLT_CTRL_H */ diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pid_controller/mcs_pid_ctrl.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pid_controller/mcs_pid_ctrl.c new file mode 100644 index 000000000..f780fd62e --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pid_controller/mcs_pid_ctrl.c @@ -0,0 +1,199 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_pid_ctrl.c + * @author MCU Algorithm Team + * @brief This file provides functions of general PID controller + */ + +#include "mcs_pid_ctrl.h" +#include "mcs_math.h" +#include "mcs_assert.h" + +/** + * @brief Reset all member variables of PID controller to zero. + * @param piHandle PID controller struct handle. + * @retval None. + */ +void PID_Reset(PID_Handle *pidHandle) +{ + MCS_ASSERT_PARAM(pidHandle != NULL); + /* Reset the PID parameter. */ + pidHandle->kp = 0.0f; + pidHandle->ki = 0.0f; + pidHandle->kd = 0.0f; + pidHandle->ns = 0.0f; + pidHandle->ka = 0.0f; + pidHandle->ts = 0.0f; + /* Reset the Limiting Value. */ + pidHandle->upperLimit = 0.0f; + pidHandle->lowerLimit = 0.0f; + + PID_Clear(pidHandle); +} + +/** + * @brief Clear historical values of PID controller. + * @param pidHandle PID controller struct handle. + * @retval None. + */ +void PID_Clear(PID_Handle *pidHandle) +{ + MCS_ASSERT_PARAM(pidHandle != NULL); + /* Clear historical values of PID controller. */ + pidHandle->differ = 0.0f; + pidHandle->integral = 0.0f; + pidHandle->saturation = 0.0f; + pidHandle->feedforward = 0.0f; + pidHandle->error = 0.0f; + pidHandle->errorLast = 0.0f; +} + +/** + * @brief Execute simplified PI controller calculation, static clamping, no feedforward. + * @param pidHandle PI controller struct handle. + * @retval PI control output. + */ +float PI_Exec(PID_Handle *pidHandle) +{ + MCS_ASSERT_PARAM(pidHandle != NULL); + /* Proportional Item */ + float p = pidHandle->kp * pidHandle->error; + + /* Integral Item */ + float i = pidHandle->ki * pidHandle->ts * pidHandle->error + pidHandle->integral; + i = Clamp(i, pidHandle->upperLimit, pidHandle->lowerLimit); + pidHandle->integral = i; + + /* static clamping and output calculaiton */ + float val = p + i + pidHandle->feedforward; + float out = Clamp(val, pidHandle->upperLimit, pidHandle->lowerLimit); + + return out; +} + +/** + * @brief Execute PID controller calculation. dynamic clamping, feedforward compensataion + * @param pidHandle PID controller struct handle. + * @retval PID control output. + */ +float PID_Exec(PID_Handle *pidHandle) +{ + MCS_ASSERT_PARAM(pidHandle != NULL); + /* Proportional Item */ + float error = pidHandle->error; + float errorLast = pidHandle->errorLast; + float ts = pidHandle->ts; + + float p = pidHandle->kp * error; + + /* Integral Item */ + float i = pidHandle->ki * ts * (error - pidHandle->ka * pidHandle->saturation) + pidHandle->integral; + i = Clamp(i, Max(0.0f, pidHandle->upperLimit), Min(0.0f, pidHandle->lowerLimit)); + pidHandle->integral = i; + + /* Differential Item */ + float kd = pidHandle->kd; + float ns = pidHandle->ns; + float d = 1.0f / (1.0f + ts * ns) * (kd * ns * error - kd * ns * errorLast + pidHandle->differ); + + pidHandle->errorLast = pidHandle->error; + pidHandle->differ = d; + + /* Output value update and saturation value calculation */ + float val = p + i + d + pidHandle->feedforward; + float out = Clamp(val, pidHandle->upperLimit, pidHandle->lowerLimit); + pidHandle->saturation = val - out; + + return out; +} + +/** + * @brief Set the proportional parameter kp of PID controller. + * @param pidHandle PID controller struct handle. + * @param kp The proportional parameter. + * @retval None. + */ +void PID_SetKp(PID_Handle *pidHandle, float kp) +{ + MCS_ASSERT_PARAM(pidHandle != NULL); + pidHandle->kp = kp; +} + +/** + * @brief Set the integral parameter ki of PID controller. + * @param pidHandle PID controller struct handle. + * @param ki The integral parameter. + * @retval None. + */ +void PID_SetKi(PID_Handle *pidHandle, float ki) +{ + MCS_ASSERT_PARAM(pidHandle != NULL); + pidHandle->ki = ki; +} + +/** + * @brief Set the derivative parameter kd of PID controller. + * @param pidHandle PID controller struct handle. + * @param kd The derivative parameter. + * @retval None. + */ +void PID_SetKd(PID_Handle *pidHandle, float kd) +{ + MCS_ASSERT_PARAM(pidHandle != NULL); + pidHandle->kd = kd; +} + +/** + * @brief Set the filter parameter of the differential item parameter ns of PID controller. + * @param pidHandle PID controller struct handle. + * @param ns Filter parameter of the differential item. + * @retval None. + */ +void PID_SetNs(PID_Handle *pidHandle, float ns) +{ + MCS_ASSERT_PARAM(pidHandle != NULL); + MCS_ASSERT_PARAM(ns >= 0.0f); + pidHandle->ns = ns; +} + +/** + * @brief Set the ts of PID controller. + * @param pidHandle PID controller struct handle. + * @param ts Control period (s). + * @retval None. + */ +void PID_SetTs(PID_Handle *pidHandle, float ts) +{ + MCS_ASSERT_PARAM(pidHandle != NULL); + MCS_ASSERT_PARAM(ts >= 0.0f); + pidHandle->ts = ts; +} + +/** + * @brief Set the derivative parameter upper and lower limit of PID controller. + * @param pidHandle PID controller struct handle. + * @param kd The derivative parameter. + * @retval None. + */ +void PID_SetLimit(PID_Handle *pidHandle, float limit) +{ + MCS_ASSERT_PARAM(pidHandle != NULL); + MCS_ASSERT_PARAM(limit >= 0.0f); + pidHandle->upperLimit = limit; + pidHandle->lowerLimit = -limit; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pid_controller/mcs_pid_ctrl.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pid_controller/mcs_pid_ctrl.h new file mode 100644 index 000000000..651850972 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/pid_controller/mcs_pid_ctrl.h @@ -0,0 +1,105 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_pid_ctrl.h + * @author MCU Algorithm Team + * @brief General PI controller. + * This file provides functions declaration of the PI controller module. + */ + +/* Define to prevent recursive inclusion ------------------------------------------------------- */ +#ifndef McuMagicTag_MCS_PID_CTRL_H +#define McuMagicTag_MCS_PID_CTRL_H + +/** + * @defgroup PID PID + * @brief The PID module. + * @{ + */ + +/** + * @defgroup PID_STRUCT PID STRUCT + * @brief The PID control structure definition. + * @{ + */ +/* Typedef definitions ------------------------------------------------------------------------- */ +/** + * @brief General PID Controller struct members and parameters. + */ +typedef struct { + float error; /**< Error feedback. */ + float errorLast; /**< Error feedback history values. */ + float feedforward; /**< Feedforward item. */ + float integral; /**< Integral item. */ + float saturation; /**< Saturation value of the integral item. */ + float differ; /**< Differential item. */ + float kp; /**< Gained of the proportional item. */ + float ki; /**< Gained of the integral item, not multiplied by control period. */ + float kd; /**< Gained of the differential item. */ + float ns; /**< Filter parameter of the differential item. */ + float ka; /**< Gained of the saturation item. */ + float ts; /**< Control period (s) */ + float upperLimit; /**< The upper limit value of the pid comp output. */ + float lowerLimit; /**< The lower limit value of the pid output. */ +} PID_Handle; + +typedef struct { + float kp; + float ki; + float upperLim; + float lowerLim; +} PI_Param; + +typedef struct { + float kp; + float ki; + float kd; + float ns; /**< Filter parameter of the differential item. */ + float ka; /**< Gained of the saturation item. */ + float saturation; + float upperLim; + float lowerLim; +} PID_Param; +/** + * @} + */ + +/** + * @defgroup PID_API PID API + * @brief The PID control API definitions. + * @{ + */ +void PID_Reset(PID_Handle *pidHandle); +void PID_Clear(PID_Handle *pidHandle); +float PI_Exec(PID_Handle *pidHandle); +float PID_Exec(PID_Handle *pidHandle); + +void PID_SetKp(PID_Handle *pidHandle, float kp); +void PID_SetKi(PID_Handle *pidHandle, float ki); +void PID_SetKd(PID_Handle *pidHandle, float kd); +void PID_SetNs(PID_Handle *pidHandle, float ns); +void PID_SetTs(PID_Handle *pidHandle, float ts); +void PID_SetLimit(PID_Handle *pidHandle, float limit); +/** + * @} + */ + +/** + * @} + */ + +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/power/mcs_power_mgmt.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/power/mcs_power_mgmt.c new file mode 100644 index 000000000..a15b3f660 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/power/mcs_power_mgmt.c @@ -0,0 +1,71 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_power_mgmt.c + * @author MCU Algorithm Team + * @brief This file provides functions of motor average power management. + */ + + +#include "mcs_power_mgmt.h" +#include "mcs_math.h" +#include "mcs_assert.h" + +/** + * @brief Init motor power management. + * @param avgPower Pointer of motor power handle. + * @param vdqRef Pointer of vdqRef handle. + * @param idqFbk Pointer of idqFbk handle. + * @retval None. + */ +void MotorPowerInit(POWER_Handle *avgPower, DqAxis *vdqRef, DqAxis *idqFbk) +{ + MCS_ASSERT_PARAM(avgPower != NULL); + MCS_ASSERT_PARAM(vdqRef != NULL); + MCS_ASSERT_PARAM(idqFbk != NULL); + /* Initialization. */ + avgPower->avgPower = 0.0f; + /* Initialization. */ + avgPower->vdqRef = vdqRef; + avgPower->idqFbk = idqFbk; +} + +/** + * @brief Power result value. + * @param avgPower Pointer of motor power handle. + * @retval Motor power value (w). + */ +float MotorPowerCalc(POWER_Handle *avgPower) +{ + MCS_ASSERT_PARAM(avgPower != NULL); + /* Calculate average power. */ + float activePower = 1.5f * (avgPower->idqFbk->d * avgPower->vdqRef->d + avgPower->idqFbk->q * avgPower->vdqRef->q); + avgPower->avgPower = activePower; + return activePower; +} + +/** + * @brief Clear motor power history value. + * @param avgPower Pointer of motor power handle. + * @retval None. + */ +void MotorPowerClear(POWER_Handle *avgPower) +{ + MCS_ASSERT_PARAM(avgPower != NULL); + /* Clear history value. */ + avgPower->avgPower = 0.0f; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/power/mcs_power_mgmt.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/power/mcs_power_mgmt.h new file mode 100644 index 000000000..1133c06b2 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/power/mcs_power_mgmt.h @@ -0,0 +1,44 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_power_mgmt.h + * @author MCU Algorithm Team + * @brief This file provides functions of motor average power management. + */ + +/* Define to prevent recursive inclusion ------------------------------------------------------- */ +#ifndef McuMagicTag_MCS_POWER_MGMT_H +#define McuMagicTag_MCS_POWER_MGMT_H + +#include "mcs_typedef.h" + +/* Typedef definitions ------------------------------------------------------------------------- */ + +typedef struct { + float avgPower; /**< Average power. */ + DqAxis *idqFbk; /**< Current value of d, q axis. */ + DqAxis *vdqRef; /**< Voltage value of d, q axis. */ +} POWER_Handle; + + +void MotorPowerInit(POWER_Handle *avgPower, DqAxis *vdqRef, DqAxis *idqFbk); + +float MotorPowerCalc(POWER_Handle *avgPower); + +void MotorPowerClear(POWER_Handle *avgPower); + +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_openphs_det.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_openphs_det.c new file mode 100644 index 000000000..2c195ebac --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_openphs_det.c @@ -0,0 +1,87 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_openphs_det.c + * @author MCU Algorithm Team + * @brief This file contains self-check open phase fault detection function data struct and api declaration. + */ + + +#include "mcs_openphs_det.h" +#include "mcs_assert.h" + + +/** + * @brief Open phase detection initialization. + * @param opp Open phase detection handle. + * @param minOpenPhsCurr Minimum current for open-phase detection (A). + * @retval None. + */ +void OPD_Init(OPD_Handle *opd, float minOpenPhsCurr) +{ + MCS_ASSERT_PARAM(opd != NULL); + MCS_ASSERT_PARAM(minOpenPhsCurr > 0.0f); + /* Minimum current for open-phase detection (A). */ + opd->minOpenPhsCurr = minOpenPhsCurr; + /* No phase open. */ + opd->isOpenPhsU = 0; + opd->isOpenPhsV = 0; + opd->isOpenPhsW = 0; +} + + +/** + * @brief Open phase detection execution. + * @param opd Open phase detection handle. + * @param iuvw Phase current feedback values (A). + * @retval Whether the motor is open phase, ture: open phase, 0: no open phase. + */ +bool OPD_Exec(OPD_Handle *opd, const float *iuvw) +{ + MCS_ASSERT_PARAM(opd != NULL); + MCS_ASSERT_PARAM(iuvw != NULL); + float minCurr = opd->minOpenPhsCurr; + /* Open phase detection for phase U */ + if (iuvw[OPD_V_U] <= minCurr && iuvw[OPD_W_U] <= minCurr) { /* 4th step curr */ + opd->isOpenPhsU = true; + } + /* Open phase detection for phase V */ + if (iuvw[OPD_U_V] <= minCurr && iuvw[OPD_W_V] <= minCurr) { /* 2th step curr */ + opd->isOpenPhsV = true; + } + + /* Open phase detection for phase W */ + if (iuvw[OPD_V_W] <= minCurr && iuvw[OPD_U_W] <= minCurr) { /* 2th ,4th step curr */ + opd->isOpenPhsW = true; + } + + return (opd->isOpenPhsU || opd->isOpenPhsV || opd->isOpenPhsW); +} + + +/** + * @brief Clear Open phase history value. + * @param opd Open phase detection handle. + * @retval None. + */ +void OPD_Clear(OPD_Handle *opd) +{ + MCS_ASSERT_PARAM(opd != NULL); + opd->isOpenPhsU = 0; + opd->isOpenPhsV = 0; + opd->isOpenPhsW = 0; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_openphs_det.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_openphs_det.h new file mode 100644 index 000000000..771953d86 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_openphs_det.h @@ -0,0 +1,51 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_openphs_det.h + * @author MCU Algorithm Team + * @brief This file contains self-check open phase fault detection function data struct and api declaration. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_MCS_OPENPHS_DET_H +#define McuMagicTag_MCS_OPENPHS_DET_H + +#include "typedefs.h" + +typedef enum { + OPD_U_V = 0, + OPD_V_U, + OPD_V_W, + OPD_W_V, + OPD_W_U, + OPD_U_W, + OPD_END +} OPD_Index; + +typedef struct { + float minOpenPhsCurr; /* Minimum current for open-phase detection (A). */ + bool isOpenPhsU; + bool isOpenPhsV; + bool isOpenPhsW; +} OPD_Handle; + +void OPD_Init(OPD_Handle *opd, float minOpenPhsCurr); + +bool OPD_Exec(OPD_Handle *opd, const float *iuvw); + +void OPD_Clear(OPD_Handle *opd); +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_stall_det.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_stall_det.c new file mode 100644 index 000000000..be54fab4c --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_stall_det.c @@ -0,0 +1,90 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_stall_det.c + * @author MCU Algorithm Team + * @brief This file contains motor stalling protection data struct and api declaration. + */ + +#include "mcs_stall_det.h" +#include "mcs_assert.h" +#include "mcs_math.h" + + +/** + * @brief Initilization motor stalling protection function. + * @param stall Motor stalling handle. + * @param ts Ctrl period (s). + * @param currLimit The current amplitude that triggers fault. (A). + * @param spdLimit The speed amplitude that triggers fault. (Hz). + * @param timeLimit The threshold time that current amplitude over the limit (s). + * @retval None. + */ +void STD_Init(STD_Handle *stall, float currLimit, float spdLimit, float timeLimit, float ts) +{ + MCS_ASSERT_PARAM(stall != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + MCS_ASSERT_PARAM(currLimit > 0.0f); + MCS_ASSERT_PARAM(spdLimit > 0.0f); + MCS_ASSERT_PARAM(timeLimit > 0.0f); + /* Configuring parameters for stalling detection. */ + stall->ts = ts; + /* Current threshold and speed threshold for stalling fault. */ + stall->currAmpLimit = currLimit; + stall->spdLimit = spdLimit; + stall->timeLimit = timeLimit; + stall->timer = 0.0f; +} + + +/** + * @brief Motor stalling detection. + * @param stall Motor stalling handle. + * @param motorErrStatus Motor error status. + * @param spd Speed feedback (Hz). + * @param idq Dq-axis current feedback (A). + * @retval Whether the motor is stalled, 1: motor stall, 0: no stall. + */ +bool STD_Exec_ByCurrSpd(STD_Handle *stall, float spdFbk, float currAmp) +{ + MCS_ASSERT_PARAM(stall != NULL); + /* Calculate current amplitude. */ + float currAbs = Abs(currAmp); + float spdAbs = Abs(spdFbk); + /* Check if value goes over threshold for continuous cycles. */ + if (spdAbs > stall->spdLimit || currAbs < stall->currAmpLimit) { + stall->timer = 0.0f; + return false; + } + /* Time accumulation. */ + if (stall->timer < stall->timeLimit) { + stall->timer += stall->ts; + return false; + } + return true; +} + +/** + * @brief Clear stall history value. + * @param stall Motor stalling handle. + * @retval None. + */ +void STD_Clear(STD_Handle *stall) +{ + MCS_ASSERT_PARAM(stall != NULL); + stall->timer = 0.0f; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_stall_det.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_stall_det.h new file mode 100644 index 000000000..670554987 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_stall_det.h @@ -0,0 +1,44 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_stall_det.h + * @author MCU Algorithm Team + * @brief This file contains motor stalling protection data struct and api declaration. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_MCS_STALL_DET_H +#define McuMagicTag_MCS_STALL_DET_H + +#include "typedefs.h" + + +typedef struct { + float currAmpLimit; /**< Feedback current higher than this value triggers fault. (A). */ + float spdLimit; /**< Feedback speed lower than this value triggers fault (Hz). */ + float timeLimit; /**< The threshold time that current and speed feedback over ranges (s). */ + float timer; /**< Timer to get speed and current over range time. */ + float ts; /**< Ctrl period (s). */ +} STD_Handle; + +void STD_Init(STD_Handle *stall, float currLimit, float spdLimit, float timeLimit, float ts); + +bool STD_Exec_ByCurrSpd(STD_Handle *stall, float spdFbk, float currAmp); + +void STD_Clear(STD_Handle *stall); + +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_unbalance_det.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_unbalance_det.c new file mode 100644 index 000000000..b7f24d89d --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_unbalance_det.c @@ -0,0 +1,225 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_unbalance_det.c + * @author MCU Algorithm Team + * @brief This file provides motor application for Three-phase imbalance detection. + */ + + +#include "mcs_unbalance_det.h" +#include "mcs_math.h" +#include "mcs_math_const.h" +#include "mcs_assert.h" + + +#define START_UNBAL_DET_TIME_S 5 + +/** + * @brief Initilization three-phase unbalance protection function. + * @param unbal Three-phase unbalance detect handle. + * @param currDelta Threshold for determining the zero-crossing point of the phase current. + * @param timeThr Time thredhold of duration , unit: s. + * @param unbalDegreeLim Threshold of the imbalance degree. + * @param ts Ctrl period (s). + * @retval None. + */ +void UNBAL_Init(UNBAL_Handle *unbal, float currDelta, float timeThr, float unbalDegreeLim, float ts) +{ + MCS_ASSERT_PARAM(unbal != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + unbal->detCntLimit = (unsigned int)(timeThr / ts); + unbal->unbalDegreeLimit = unbalDegreeLim; + /* Configuring Limit Times */ + unbal->delta = currDelta; + /* Restore the initial state. */ + unbal->startFlagLast = false; + unbal->startFlag = false; + unbal->ts = ts; + unbal->startupCnt = (unsigned int)(START_UNBAL_DET_TIME_S / ts); + unbal->detCnt = 0; + UNBAL_Clear(unbal); +} + + +/** + * @brief Get three-phase current rms. + * @param unbal Three-phase unbalance detect handle. + * @param iUvw Three-phase current (A). + * @retval None. + */ +static void UNBAL_RmsCurrCalc(UNBAL_Handle *unbal, UvwAxis iUvw) +{ + MCS_ASSERT_PARAM(unbal != NULL); + if (unbal->calFlag) { + /* rms integral */ + unbal->ia += (iUvw.u * iUvw.u * unbal->ts); + unbal->ib += (iUvw.v * iUvw.v * unbal->ts); + unbal->ic += (iUvw.w * iUvw.w * unbal->ts); + unbal->ia = Clamp(unbal->ia, LARGE_FLOAT, -LARGE_FLOAT); + unbal->ib = Clamp(unbal->ib, LARGE_FLOAT, -LARGE_FLOAT); + unbal->ic = Clamp(unbal->ic, LARGE_FLOAT, -LARGE_FLOAT); + + unbal->timeCnt++; + /* Filter out the incomplete period data before the calculation starts. */ + if (unbal->timeCnt < unbal->startupCnt) { + unbal->unbalDegree = 0.0f; + } else if (unbal->timeCnt > unbal->startupCnt + unbal->startupCnt) { + /* Current accumulation is abnormal. */ + unbal->calFlag = false; + unbal->unbalDegree = 0.0f; + unbal->timeCnt = 0; + } else { + if (unbal->startFlagLast != unbal->startFlag) { + unbal->timeCnt = unbal->startupCnt; + } + } + } +} + + +/** + * @brief Get three-phase current rms. + * @param unbal Three-phase unbalance detect handle. + * @param iuvwFbk Three-phase current (A). + * @retval None. + */ +static void UNBAL_RmsCurrGet(UNBAL_Handle *unbal, UvwAxis *iuvwFbk) +{ + UvwAxis iUvw; + float delta = unbal->delta; + + iUvw.u = iuvwFbk->u; + iUvw.v = iuvwFbk->v; + iUvw.w = iuvwFbk->w; + /* Current zero-crossing detection */ + if (iUvw.u < -delta && unbal->startFlag == false) { + unbal->zeroFlag = true; + } + /* Current cycle start judgment */ + if (iUvw.u > delta && unbal->startFlag == false && unbal->zeroFlag) { + unbal->startFlag = true; + unbal->zeroFlag = false; + } + + if (unbal->startFlag) { + /* Accumulated number of integral */ + unbal->integralCnt++; + /* Periodic zero crossing detection */ + if (iUvw.u < -delta) { + unbal->zeroFlag = true; + } + if (iUvw.u > delta && unbal->zeroFlag) { + unbal->zeroFlag = false; + unbal->startFlag = false; + } + } + UNBAL_RmsCurrCalc(unbal, iUvw); +} + + +/** + * @brief Three-phase unbalance calculation. + * @param unbal Three-phase unbalance detect handle. + * @param iuvwFbk Three-phase current (A). + * @param unbalFltCoeff Average filter coefficient for calculating current unbalance degree. + * @retval None. + */ +static void UNBAL_Calc(UNBAL_Handle *unbal, UvwAxis *iuvwFbk, float unbalFltCoeff) +{ + /* Get rms current */ + UNBAL_RmsCurrGet(unbal, iuvwFbk); + /* Current cycle sampling completed */ + if (unbal->startFlagLast != unbal->startFlag) { + unbal->calFlag = true; + if (Abs(unbal->ia) <= 1e-6) { /* Whether there is current */ + unbal->unbalDegree = 0.0f; + return; + } + /* Calculate the three-phase current rms value. */ + float time = (float)unbal->integralCnt * unbal->ts; + float ia = Sqrt(unbal->ia / time); + float ib = Sqrt(unbal->ib / time); + float ic = Sqrt(unbal->ic / time); + unbal->integralCnt = 0; + + /* Based on the symmetrical component method, + three groups of symmetrical components and three-phase currents are + decomposed under the condition of three-phase phase symmetry. + The relationship between amplitudes is as follows: */ + float ia1 = ONE_DIV_THREE * (ia + ib + ic); /* Ia1 = 1/3 * (ia + ib + ic) */ + float tmp = (ia - 0.5f * ib - 0.5f * ic) * (ia - 0.5f * ib - 0.5f * ic); + float tmp2 = 0.75f * (ib - ic) * (ib - ic); /* Ia2 = 1/3 * sqrt((ia - 0.5 * ib)^2 + 3/4 * (ib -ic)^2) */ + float tmp3 = 0.75f * (ic - ib) * (ic - ib); /* Ia0 = 1/3 * sqrt((ia - 0.5 * ib)^2 + 3/4 * (ic -ib)^2) */ + float ia2 = ONE_DIV_THREE * Sqrt(tmp + tmp2); + float ia0 = ONE_DIV_THREE * Sqrt(tmp + tmp3); + float ig = Sqrt(ia0 * ia0 + ia2 * ia2); /* Total unbalanced current */ + float igPer = ig / ia1; /* Current unbalance factor */ + unbal->unbalDegree = unbal->unbalDegree * (1.0f - unbalFltCoeff) + igPer * unbalFltCoeff; + /* Clear current history value */ + unbal->ia = 0.0f; + unbal->ib = 0.0f; + unbal->ic = 0.0f; + } + unbal->startFlagLast = unbal->startFlag; +} + + +/** + * @brief Three-phase unbalance protection detection. + * @param unbal Three-phase unbalance detect handle. + * @param iuvwFbk Three-phase current. + * @retval None. + */ +bool UNBAL_Det(UNBAL_Handle *unbal, UvwAxis *iuvwFbk, float unbalFltCoeff) +{ + MCS_ASSERT_PARAM(unbal != NULL); + MCS_ASSERT_PARAM(iuvwFbk != NULL); + + UNBAL_Calc(unbal, iuvwFbk, unbalFltCoeff); + /* The three-phase imbalance exceeds the limit value. */ + if (unbal->unbalDegree > unbal->unbalDegreeLimit) { + unbal->detCnt++; + /* Current out of balance fault is detected, */ + /* when the protection hysteresis count is greater than the threshold. */ + if (unbal->detCnt > unbal->detCntLimit) { + unbal->detCnt = 0; + return false; + } + } else { + unbal->detCnt = 0; + } + return true; +} + +/** + * @brief Clear historical status of three-phase unbalance detection. + * @param unbal Three-phase unbalance detect handle. + * @retval None. + */ +void UNBAL_Clear(UNBAL_Handle *unbal) +{ + MCS_ASSERT_PARAM(unbal != NULL); + /* Clear historical status */ + unbal->ia = 0.0f; + unbal->ib = 0.0f; + unbal->ic = 0.0f; + unbal->unbalDegree = 0.0f; + unbal->calFlag = false; + /* Detection time count. */ + unbal->timeCnt = 0; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_unbalance_det.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_unbalance_det.h new file mode 100644 index 000000000..ac94519e4 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/protection/mcs_unbalance_det.h @@ -0,0 +1,55 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_unbalance_det.h + * @author MCU Algorithm Team + * @brief This file contains three-phase imbalance protection data struct and api declaration. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_MCS_UNBALANCE_DET_H +#define McuMagicTag_MCS_UNBALANCE_DET_H + +#include "typedefs.h" +#include "mcs_typedef.h" + +typedef struct { + unsigned int detCnt; + unsigned int detCntLimit; + unsigned int integralCnt; + unsigned int timeCnt; + unsigned int startupCnt; + bool startFlag; + bool startFlagLast; + bool zeroFlag; + bool calFlag; + float unbalDegree; + float unbalDegreeLimit; + float delta; + float ts; + float ia; + float ib; + float ic; +} UNBAL_Handle; + + +void UNBAL_Init(UNBAL_Handle *unbal, float currDelta, float timeThr, float unbalDegreeLim, float ts); + +bool UNBAL_Det(UNBAL_Handle *unbal, UvwAxis *iuvwFbk, float unbalFltCoeff); + +void UNBAL_Clear(UNBAL_Handle *unbal); +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/ramp/mcs_ramp_mgmt.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/ramp/mcs_ramp_mgmt.c new file mode 100644 index 000000000..eaf9a3015 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/ramp/mcs_ramp_mgmt.c @@ -0,0 +1,96 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_ramp_mgmt.c + * @author MCU Algorithm Team + * @brief This file provides function of ramp function. + */ + +#include "mcs_ramp_mgmt.h" +#include "mcs_assert.h" + +/** + * @brief Initializer of RMG handle. + * @param rmg: Pointer of RMG handle. + * @param ts: Control period of the RMG module. + * @param slope: Target value divide time of variation. + * @retval None. + */ +void RMG_Init(RMG_Handle *rmg, float ts, float slope) +{ + MCS_ASSERT_PARAM(rmg != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + /* Initializer of RMG handle. */ + rmg->slope = slope; + rmg->yLast = 0.0f; + rmg->ts = ts; + rmg->delta = rmg->slope * rmg->ts; +} + +/** + * @brief Clear historical values of RMG handle. + * @param rmg: Pointer of RMG handle. + * @retval None. + */ +void RMG_Clear(RMG_Handle *rmg) +{ + MCS_ASSERT_PARAM(rmg != NULL); + rmg->yLast = 0.0f; +} + +/** + * @brief Ramp generation and management. + * @param rmg: Pointer of RMG handle. + */ +float RMG_Exec(RMG_Handle *rmg, float targetVal) +{ + MCS_ASSERT_PARAM(rmg != NULL); + float out; + /* Calculate the current output value based on the target value and slope. */ + if (rmg->yLast <= (targetVal - rmg->delta)) { + out = rmg->yLast + rmg->delta; + } else if (rmg->yLast >= (targetVal + rmg->delta)) { + out = rmg->yLast - rmg->delta; + } else { + out = rmg->yLast = targetVal; + } + /* Recording and outputting slope calculation results. */ + rmg->yLast = out; + return out; +} + +/** + * @brief Set ts for ramp. + * @param rmg Pointer of RMG handle. + * @retval The reference value which is ramped. + */ +void RMG_SetTs(RMG_Handle *rmg, float ts) +{ + MCS_ASSERT_PARAM(rmg != NULL); + /* Set ts. */ + rmg->ts = ts; + rmg->delta = rmg->slope * rmg->ts; +} + +void RMG_SetSlope(RMG_Handle *rmg, float slope) +{ + MCS_ASSERT_PARAM(rmg != NULL); + MCS_ASSERT_PARAM(slope > 0.0f); + /* Set slope. */ + rmg->slope = slope; + rmg->delta = rmg->slope * rmg->ts; +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/ramp/mcs_ramp_mgmt.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/ramp/mcs_ramp_mgmt.h new file mode 100644 index 000000000..fecbbe486 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/ramp/mcs_ramp_mgmt.h @@ -0,0 +1,49 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_ramp_mgmt.h + * @author MCU Algorithm Team + * @brief Ramp generation and management for motor control. + * This file provides functions declaration of ramp generation and management module. + */ + +#ifndef McuMagicTag_MCS_RAMP_MGMT_H +#define McuMagicTag_MCS_RAMP_MGMT_H + + +/** + * @brief Ramp mgmt Struct. + */ +typedef struct { + float delta; /**< Step value per calculate period. */ + float yLast; /**< History value of output value. */ + float ts; /**< Control period of the RMG module. */ + float slope; /**< Slope, target value divide time of variation. */ +} RMG_Handle; + + +/** + * @defgroup RAMP_API RAMP API + * @brief The RAMP API definitions. + * @{ + */ +void RMG_Init(RMG_Handle *rmg, float ts, float slope); +void RMG_Clear(RMG_Handle *rmg); +float RMG_Exec(RMG_Handle *rmg, float targetVal); +void RMG_SetTs(RMG_Handle *rmg, float ts); +void RMG_SetSlope(RMG_Handle *rmg, float slope); +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_assert.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_assert.h new file mode 100644 index 000000000..c61b1275c --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_assert.h @@ -0,0 +1,57 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_assert.h + * @author MCU Algorithm Team + * @brief This file provides functions declaration of the assert. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_MCS_ASSERT_H +#define McuMagicTag_MCS_ASSERT_H + +/* Includes ------------------------------------------------------------------ */ +#include "baseinc.h" + +/** + * @defgroup MCS_ASSERT MCS_ASSERT + * @brief MCS ASSERT module. + * @{ + */ + +/** + * @defgroup ASSERT_Macro ASSERT Macro Function Definition + * @{ + */ +#ifdef MCS_PARAM_CHECK +#define MCS_ASSERT_PARAM BASE_FUNC_ASSERT_PARAM +#define MCS_PARAM_CHECK_NO_RET BASE_FUNC_PARAMCHECK_NO_RET +#define MCS_PARAM_CHECK_WITH_RET BASE_FUNC_PARAMCHECK_WITH_RET +#else +#define MCS_ASSERT_PARAM(para) ((void)0U) +#define MCS_PARAM_CHECK_NO_RET(para) ((void)0U) +#define MCS_PARAM_CHECK_WITH_RET(para, ret) ((void)0U) +#endif + +/** + * @} + */ + +/** + * @} + */ +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_mtr_param.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_mtr_param.c new file mode 100644 index 000000000..29eaffbf2 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_mtr_param.c @@ -0,0 +1,47 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_mtr_param.c + * @author MCU Algorithm Team + * @brief This file provides data structure define of motor parameters. + */ + +#include "mcs_mtr_param.h" + + +/** + * @brief Initialzer of motor parameters. + * @param handle Motor parameters handle. + * @param motorTable Motor parameters table. + * @retval None. + */ + void MtrParamInit(MOTOR_Param *handle, const MOTOR_Param motorTable) +{ + MCS_ASSERT_PARAM(handle != NULL); + /* Initialzer of motor parameters */ + handle->mtrRs = motorTable.mtrRs; /* resistor of stator */ + handle->mtrLd = motorTable.mtrLd; /* inductance of D-axis */ + handle->mtrLq = motorTable.mtrLq; /* inductance of Q-axis */ + /* Average inductance, mtrLs = (mtrLd + mtrLq) * 0.5f */ + handle->mtrLs = (motorTable.mtrLd + motorTable.mtrLq) * 0.5f; + handle->mtrPsif = motorTable.mtrPsif; /* permanent magnet flux */ + handle->mtrNp = motorTable.mtrNp; /* numbers of pole pairs */ + handle->mtrJ = motorTable.mtrJ; /* rotor inertia */ + handle->maxElecSpd = motorTable.maxElecSpd; /* max elec speed */ + handle->maxCurr = motorTable.maxCurr; /* max current */ + handle->maxTrq = motorTable.maxTrq; /* max torque */ +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_mtr_param.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_mtr_param.h new file mode 100644 index 000000000..678d58a30 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_mtr_param.h @@ -0,0 +1,59 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_mtr_param.h + * @author MCU Algorithm Team + * @brief This file provides data structure define of motor parameters. + */ + +/* Define to prevent recursive inclusion ------------------------------------------------------- */ +#ifndef McuMagicTag_MCS_MTR_PARAM_H +#define McuMagicTag_MCS_MTR_PARAM_H + +/* Typedef definitions ------------------------------------------------------------------------- */ +#include "mcs_assert.h" +/** + * @defgroup MOTOR_PARAMETER MOTOR PARAMETER + * @brief The motor parameter definitions. + * @{ + */ +/** + * @brief motor parameters data structure + */ +typedef struct { + unsigned short mtrNp; /**< Numbers of pole pairs. */ + float mtrRs; /**< Resistor of stator, Ohm. */ + float mtrLd; /**< Inductance of D-axis, H. */ + float mtrLq; /**< Inductance of Q-axis, H. */ + float mtrLs; /**< Average inductance, H. */ + float mtrPsif; /**< Permanent magnet flux, Wb. */ + float mtrJ; /**< Rotor inertia, Kg*m2. */ + float maxElecSpd; /**< Max elec speed, Hz. */ + float maxCurr; /**< Max current, A. */ + float maxTrq; /**< Max torque, Nm. */ + /* Encoder parameters */ + unsigned int mtrPPMR; /**< pulse per mechanical round */ + unsigned int zShift; /**< pulse Z shift */ +} MOTOR_Param; + + +void MtrParamInit(MOTOR_Param *handle, const MOTOR_Param motorTable); +/** + * @} + */ + +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_sys_status.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_sys_status.h new file mode 100644 index 000000000..c26301fc8 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_sys_status.h @@ -0,0 +1,188 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_sys_status.h + * @author MCU Algorithm Team + * @brief This file provides functions declaration of system status. + */ + +/* Define to prevent recursive inclusion ------------------------------------------------------- */ +#ifndef McuMagicTag_MCS_SYS_STATUS_H +#define McuMagicTag_MCS_SYS_STATUS_H + +/* Includes ------------------------------------------------------------------------------------ */ +#include "typedefs.h" +#include "mcs_assert.h" + +/* Typedef definitions ------------------------------------------------------------------------- */ +/** + * @brief System status define + */ +typedef union { + unsigned short all; + struct { + unsigned short cmdStart : 1; /**< Indicates that a start system command has been received. */ + unsigned short cmdStop : 1; /**< Indicates that a stop system command has been received. */ + unsigned short isRunning : 1; /**< Indicates that the system is running (enable signal) */ + unsigned short sysError : 1; /**< Indicates that the system reports an error. */ + unsigned short poweron : 1; /**< Indicates that the power-on initialization phase is complete. */ + unsigned short capcharge : 1; /**< Indicates that the bootstrap capacitor charging phase is complete. */ + unsigned short adczero : 1; /**< The current sampling point is reset to zero after power-on. */ + } Bit; +} SysStatusReg; + +/** + * @brief Get status of Bit cmdStart. + * @param sysStatus System status register handle. + * @retval Status of Bit cmdStart. + */ +static inline bool SysGetCmdStart(SysStatusReg *sysStatus) +{ + MCS_ASSERT_PARAM(sysStatus != NULL); + bool ret; + ret = (sysStatus->Bit.cmdStart == 1) ? true : false; + return ret; +} + +/** + * @brief Set Bit cmdStart. + * @param sysStatus System status register handle. + * @retval None. + */ +static inline void SysCmdStartSet(SysStatusReg *sysStatus) +{ + MCS_ASSERT_PARAM(sysStatus != NULL); + sysStatus->Bit.cmdStart = 1; +} + +/** + * @brief Clear Bit cmdStart. + * @param handle System status register handle. + * @retval None. + */ +static inline void SysCmdStartClr(SysStatusReg *sysStatus) +{ + MCS_ASSERT_PARAM(sysStatus != NULL); + sysStatus->Bit.cmdStart = 0; +} + +/** + * @brief Get status of Bit cmdStop. + * @param sysStatus System status register handle. + * @retval Status of Bit cmdStart. + */ +static inline bool SysGetCmdStop(SysStatusReg *sysStatus) +{ + MCS_ASSERT_PARAM(sysStatus != NULL); + bool ret; + ret = (sysStatus->Bit.cmdStop == 1) ? true : false; + return ret; +} + +/** + * @brief Set Bit cmdStop. + * @param sysStatus System status register handle. + * @retval None. + */ +static inline void SysCmdStopSet(SysStatusReg *sysStatus) +{ + MCS_ASSERT_PARAM(sysStatus != NULL); + sysStatus->Bit.cmdStop = 1; +} + +/** + * @brief Clear Bit cmdStop. + * @param sysStatus System status register handle. + * @retval None. + */ +static inline void SysCmdStopClr(SysStatusReg *sysStatus) +{ + MCS_ASSERT_PARAM(sysStatus != NULL); + sysStatus->Bit.cmdStop = 0; +} + +/** + * @brief Get status of Bit isRunning. + * @param sysStatus System status register handle. + * @retval Status of Bit isRunning. + */ +static inline bool SysIsRunning(SysStatusReg *sysStatus) +{ + MCS_ASSERT_PARAM(sysStatus != NULL); + bool ret; + ret = (sysStatus->Bit.isRunning == 1) ? true : false; + return ret; +} + +/** + * @brief Set Bit isRuning. + * @param sysStatus System status register handle. + * @retval None. + */ +static inline void SysRunningSet(SysStatusReg *sysStatus) +{ + MCS_ASSERT_PARAM(sysStatus != NULL); + sysStatus->Bit.isRunning = 1; +} + +/** + * @brief Clear Bit isRuning. + * @param sysStatus System status register handle. + * @retval None. + */ +static inline void SysRunningClr(SysStatusReg *sysStatus) +{ + MCS_ASSERT_PARAM(sysStatus != NULL); + sysStatus->Bit.isRunning = 0; +} + +/** + * @brief Get status of Bit sysError. + * @param sysStatus System status register handle. + * @retval Status of Bit sysError. + */ +static inline bool SysIsError(SysStatusReg *sysStatus) +{ + MCS_ASSERT_PARAM(sysStatus != NULL); + bool ret; + ret = (sysStatus->Bit.sysError == 1) ? true : false; + return ret; +} + +/** + * @brief Set Bit sysError. + * @param sysStatus System status register handle. + * @retval None. + */ +static inline void SysErrorSet(SysStatusReg *sysStatus) +{ + MCS_ASSERT_PARAM(sysStatus != NULL); + sysStatus->Bit.sysError = 1; +} + +/** + * @brief Clear Bit sysError. + * @param sysStatus System status register handle. + * @retval None. + */ +static inline void SysErrorClr(SysStatusReg *sysStatus) +{ + MCS_ASSERT_PARAM(sysStatus != NULL); + sysStatus->Bit.sysError = 0; +} + +#endif diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_typedef.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_typedef.h new file mode 100644 index 000000000..9a9fb890a --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/utilities/mcs_typedef.h @@ -0,0 +1,59 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_typedef.h + * @author MCU Algorithm Team + * @brief This file provides the definition of the motor basic data structure. + */ + +#ifndef McuMagicTag_MCS_TYPEDEF_H +#define McuMagicTag_MCS_TYPEDEF_H + + +/** + * @defgroup MCS COORDINATE + * @brief Motor Basic coordinate data structures. + * @{ + */ + +/** + * @brief Rotor synchronous rotation coordinate frame Variables. + */ +typedef struct { + float d; /**< Component d of the rotor synchronous rotation coordinate variable. */ + float q; /**< Component q of the rotor synchronous rotation coordinate variable. */ +} DqAxis; + +/** + * @brief Two-phase stationary coordinate frame variable. + */ +typedef struct { + float alpha; /**< Component alpha of the two-phase stationary coordinate variable. */ + float beta; /**< Component beta of the two-phase stationary coordinate variable. */ +} AlbeAxis; + +/** + * @brief Three-phase static coordinate frame variable. + */ +typedef struct { + float u; /**< Component u of the three-phase static coordinate frame variable. */ + float v; /**< Component v of the three-phase static coordinate frame variable. */ + float w; /**< Component w of the three-phase static coordinate frame variable. */ +} UvwAxis; + + +#endif /* McuMagicTag_MCS_TYPEDEF_H */ diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/vf/mcs_vf_ctrl.c b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/vf/mcs_vf_ctrl.c new file mode 100644 index 000000000..ea2457a17 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/vf/mcs_vf_ctrl.c @@ -0,0 +1,155 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_vf_ctrl.c + * @author MCU Algorithm Team + * @brief This file provides functions declaration of v/f control. + */ + +#include "mcs_vf_ctrl.h" +#include "mcs_math.h" +#include "mcs_assert.h" +#include "mcs_math_const.h" + +/** + * @brief Init the vf control handle. + * @param vf The vf control handle. + * @param spdThr Minimum (spdThr[0]) and maximum(spdThr[1]) speed thresholds for ramp command. + * @param voltThr Minimum (voltThr[0]) and maximum(voltThr[1]) voltage for thresholds ramp command. + * @param ts Control period. + * @param spdCmd Motor target speed frequency (Hz). + * @param spdSlope Slope of motor speed reference. + * @retval None. + */ +void VF_Init(VF_Handle *vf, const float *spdThr, const float *voltThr, float ts, float spdCmd, float spdSlope) +{ + MCS_ASSERT_PARAM(vf != NULL); + MCS_ASSERT_PARAM(spdThr != NULL); + MCS_ASSERT_PARAM(voltThr != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + VF_Clear(vf); + RMG_Init(&vf->rmg, ts, spdSlope); + vf->spdCmd = spdCmd; + vf->ts = ts; + /* Set voltage-speed curve. */ + vf->spdThr[0] = spdThr[0]; /* The minimum vf speed. */ + vf->spdThr[1] = spdThr[1]; /* The maximum vf speed. */ + vf->voltThr[0] = voltThr[0]; /* The minimum voltage. */ + vf->voltThr[1] = voltThr[1]; /* The maximum vf voltage. */ + /* Calculate vf slope. */ + vf->slope = (voltThr[1] - voltThr[0]) / (spdThr[1] - spdThr[0]); + vf->ratio.d = 1.0f; + vf->ratio.q = 0.0f; +} + +/** + * @brief Vf control Execution. + * @param vf The vf control handle. + * @param vdqRef Dq axis voltage reference vf control. + * @retval None. + */ +void VF_Exec(VF_Handle *vf, DqAxis *vdqRef) +{ + MCS_ASSERT_PARAM(vf != NULL); + MCS_ASSERT_PARAM(vdqRef != NULL); + /* Vf speed generation. */ + vf->spdRef = RMG_Exec(&vf->rmg, vf->spdCmd); + float vs = 0.0f; + float lowSpdHz = vf->spdThr[0]; + float highSpdHz = vf->spdThr[1]; + float voltMin = vf->voltThr[0]; + float voltMax = vf->voltThr[1]; + /* When the vf reference speed is less than the minimum speed threshold, */ + /* the voltage is set to the minimum voltage threshold. */ + /* When the vf reference speed is greater than the maximum speed threshold, */ + /* the voltage is set to the maximum voltage threshold. */ + if (vf->spdRef < lowSpdHz) { + vs = voltMin; + } else if (vf->spdRef > highSpdHz) { + vs = voltMax; + } else { + vs = voltMin + vf->slope * (vf->spdRef - lowSpdHz); + } + /* Sets dq voltage based on the dq axis proportion */ + vf->vdqRef.d = vs * vf->ratio.d; + vf->vdqRef.q = vs * vf->ratio.q; + vf->vfAngle += DOUBLE_PI * vf->spdRef * vf->ts; + vf->vfAngle = Mod(vf->vfAngle, DOUBLE_PI); + if (vf->vfAngle > ONE_PI) { + vf->vfAngle -= DOUBLE_PI; + } + if (vf->vfAngle < -ONE_PI) { + vf->vfAngle += DOUBLE_PI; + } + vdqRef->d = vf->vdqRef.d; + vdqRef->q = vf->vdqRef.q; +} + +/** + * @brief Clear the vf control history value. + * @param vf The vf control handle. + * @retval None. + */ +void VF_Clear(VF_Handle *vf) +{ + MCS_ASSERT_PARAM(vf != NULL); + /* Clear history value. */ + vf->vfAngle = 0.0f; + vf->spdRef = 0.0f; + vf->vdqRef.d = 0.0f; + vf->vdqRef.q = 0.0f; +} + +/** + * @brief Set vf control period. + * @param vf The vf control handle. + * @param ts The updated vf control period. + * @retval None. + */ +void VF_SetTs(VF_Handle *vf, float ts) +{ + MCS_ASSERT_PARAM(vf != NULL); + MCS_ASSERT_PARAM(ts > 0.0f); + RMG_SetTs(&vf->rmg, ts); + vf->ts = ts; +} + +/** + * @brief Set the slope for the motor to accelerate to the target speed. + * @param vf The vf control handle. + * @param spdSlope The slope. + * @retval None. + */ +void VF_SetSpdSlope(VF_Handle *vf, float spdSlope) +{ + MCS_ASSERT_PARAM(vf != NULL); + RMG_SetSlope(&vf->rmg, spdSlope); +} + +/** + * @brief Set the voltage reference ratio of d, q axis. + * @param vf The vf control handle. + * @param dRatio D axis reference voltage ratio. + * @retval None. + */ +void VF_SetDRatio(VF_Handle *vf, float dRatio) +{ + MCS_ASSERT_PARAM(vf != NULL); + MCS_ASSERT_PARAM(dRatio >= 0.0f && dRatio <= 1.0f); + vf->ratio.d = dRatio; + vf->ratio.q = Sqrt(1.0f - dRatio * dRatio); +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/control_library/vf/mcs_vf_ctrl.h b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/vf/mcs_vf_ctrl.h new file mode 100644 index 000000000..5de22b3a0 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/control_library/vf/mcs_vf_ctrl.h @@ -0,0 +1,53 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_vf_ctrl.h + * @author MCU Algorithm Team + * @brief This file provides functions declaration of v/f control. + * + */ + +#ifndef McuMagicTag_MCS_VF_CTRL_H +#define McuMagicTag_MCS_VF_CTRL_H + + +#include "mcs_typedef.h" +#include "mcs_ramp_mgmt.h" + + +typedef struct { + float spdCmd; /**< Motor target speed frequency (Hz). */ + float spdRef; /**< Motor reference speed frequency (Hz). */ + float vfAngle; /**< Vf control angle. */ + float ts; /**< Control period. */ + float spdThr[2]; /**< Minimum (spdThr[0]) and maximum(spdThr[1]) speed thresholds for ramp command. */ + float voltThr[2]; /**< Minimum (voltThr[0]) and maximum(voltThr[1]) voltage for thresholds ramp command. */ + float slope; /**< Slope of the voltage-speed curve. */ + DqAxis ratio; /**< Proportion of dq-axis reference voltage. */ + DqAxis vdqRef; /**< Dq-axis reference voltage. */ + RMG_Handle rmg; /**< Ramp management structure */ +} VF_Handle; + + +void VF_Init(VF_Handle *vf, const float *spdThr, const float *voltThr, float ts, float spdCmd, float spdSlope); +void VF_Exec(VF_Handle *vf, DqAxis *vdqRef); +void VF_Clear(VF_Handle *vf); +void VF_SetTs(VF_Handle *vf, float ts); +void VF_SetSpdSlope(VF_Handle *vf, float spdSlope); +void VF_SetDRatio(VF_Handle *vf, float dRatio); + +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/LICENSE b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/LICENSE new file mode 100644 index 000000000..42f2a8367 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/LICENSE @@ -0,0 +1,124 @@ +木兰宽松许可证, 第2版 + +2020年1月 http://license.coscl.org.cn/MulanPSL2 + +您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: + +0. 定义 + +“软件” 是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 + +“贡献” 是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 + +“贡献者” 是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 + +“法人实体” 是指提交贡献的机构及其“关联实体”。 + +“关联实体” 是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 + +1. 授予版权许可 + +每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 + +2. 授予专利许可 + +每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 + +3. 无商标许可 + +“本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 + +4. 分发限制 + +您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 + +5. 免责声明与责任限制 + +“软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 + +6. 语言 + +“本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 + +条款结束 + +如何将木兰宽松许可证,第2版,应用到您的软件 + +如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: + +1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; + +2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; + +3, 请将如下声明文本放入每个源文件的头部注释中。 + +Copyright (c) [Year] [name of copyright holder] +[Software Name] is licensed under Mulan PSL v2. +You can use this software according to the terms and conditions of the Mulan PSL v2. +You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +See the Mulan PSL v2 for more details. +Mulan Permissive Software License,Version 2 +Mulan Permissive Software License,Version 2 (Mulan PSL v2) + +January 2020 http://license.coscl.org.cn/MulanPSL2 + +Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: + +0. Definition + +Software means the program and related documents which are licensed under this License and comprise all Contribution(s). + +Contribution means the copyrightable work licensed by a particular Contributor under this License. + +Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. + +Legal Entity means the entity making a Contribution and all its Affiliates. + +Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, 'control' means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. + +1. Grant of Copyright License + +Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. + +2. Grant of Patent License + +Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. + +3. No Trademark License + +No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in section 4. + +4. Distribution Restriction + +You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. + +5. Disclaimer of Warranty and Limitation of Liability + +THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT'S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +6. Language + +THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. + +END OF THE TERMS AND CONDITIONS + +How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software + +To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps: + +Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; +Create a file named "LICENSE" which contains the whole context of this License in the first directory of your software package; +Attach the statement to the appropriate annotated syntax at the beginning of each source file. +Copyright (c) [Year] [name of copyright holder] +[Software Name] is licensed under Mulan PSL v2. +You can use this software according to the terms and conditions of the Mulan PSL v2. +You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +See the Mulan PSL v2 for more details. \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/Makefile b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/Makefile new file mode 100644 index 000000000..bdeee0855 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/Makefile @@ -0,0 +1,44 @@ +PROJECT=libboundscheck.so + +CC?=gcc + +OPTION = -fPIC +OPTION += -fstack-protector-all +OPTION += -D_FORTIFY_SOURCE=2 -O2 +OPTION += -Wformat=2 -Wfloat-equal -Wshadow +OPTION += -Wconversion +OPTION += -Wformat-security +OPTION += -Wextra +OPTION += --param ssp-buffer-size=4 +OPTION += -Warray-bounds +OPTION += -Wpointer-arith +OPTION += -Wcast-qual +OPTION += -Wstrict-prototypes +OPTION += -Wmissing-prototypes +OPTION += -Wstrict-overflow=1 +OPTION += -Wstrict-aliasing=2 +OPTION += -Wswitch -Wswitch-default + +CFLAG = -Wall -DNDEBUG -O2 $(OPTION) + +SOURCES=$(wildcard src/*.c) + +OBJECTS=$(patsubst %.c,%.o,$(SOURCES)) + +.PHONY:clean + +CFLAG += -Iinclude +LD_FLAG = -fPIC -s -Wl,-z,relro,-z,now,-z,noexecstack -fstack-protector-all + +$(PROJECT): $(OBJECTS) + mkdir -p lib + $(CC) -shared -o lib/$@ $(patsubst %.o,obj/%.o,$(notdir $(OBJECTS))) $(LD_FLAG) + @echo "finish $(PROJECT)" + +.c.o: + @mkdir -p obj + $(CC) -c $< $(CFLAG) -o obj/$(patsubst %.c,%.o,$(notdir $<)) + +clean: + -rm -rf obj lib + @echo "clean up" diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/README.en.md b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/README.en.md new file mode 100644 index 000000000..60c477fe8 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/README.en.md @@ -0,0 +1,59 @@ +# libboundscheck + +#### Description + +- following the standard of C11 Annex K (bound-checking interfaces), functions of the common memory/string operation classes, such as memcpy_s, strcpy_s, are selected and implemented. + +- other standard functions in C11 Annex K will be analyzed in the future and implemented in this organization if necessary. + +- handles the release, update, and maintenance of bounds_checking_function. + +#### Function List + +- memcpy_s +- wmemcpy_s +- memmove_s +- wmemmove_s +- memset_s +- strcpy_s +- wcscpy_s +- strncpy_s +- wcsncpy_s +- strcat_s +- wcscat_s +- strncat_s +- wcsncat_s +- strtok_s +- wcstok_s +- sprintf_s +- swprintf_s +- vsprintf_s +- vswprintf_s +- snprintf_s +- vsnprintf_s +- scanf_s +- wscanf_s +- vscanf_s +- vwscanf_s +- fscanf_s +- fwscanf_s +- vfscanf_s +- vfwscanf_s +- sscanf_s +- swscanf_s +- vsscanf_s +- vswscanf_s +- gets_s + + +#### Build + +``` +CC=gcc make +``` +The generated Dynamic library libboundscheck.so is stored in the newly created directory lib. + +#### How to use +1. Copy the libboundscheck.so to the library file directory, for example: "/usr/local/lib/". + +2. To use the libboundscheck, add the “-lboundscheck” parameters to the compiler, for example: “gcc -g -o test test.c -lboundscheck”. \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/README.md b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/README.md new file mode 100644 index 000000000..c16cbb176 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/README.md @@ -0,0 +1,56 @@ +# libboundscheck + +#### 介绍 +- 遵循C11 Annex K (Bounds-checking interfaces)的标准,选取并实现了常见的内存/字符串操作类的函数,如memcpy_s、strcpy_s等函数。 +- 未来将分析C11 Annex K中的其他标准函数,如果有必要,将在该组织中实现。 +- 处理边界检查函数的版本发布、更新以及维护。 + +#### 函数清单 + +- memcpy_s +- wmemcpy_s +- memmove_s +- wmemmove_s +- memset_s +- strcpy_s +- wcscpy_s +- strncpy_s +- wcsncpy_s +- strcat_s +- wcscat_s +- strncat_s +- wcsncat_s +- strtok_s +- wcstok_s +- sprintf_s +- swprintf_s +- vsprintf_s +- vswprintf_s +- snprintf_s +- vsnprintf_s +- scanf_s +- wscanf_s +- vscanf_s +- vwscanf_s +- fscanf_s +- fwscanf_s +- vfscanf_s +- vfwscanf_s +- sscanf_s +- swscanf_s +- vsscanf_s +- vswscanf_s +- gets_s + +#### 构建方法 + +运行命令 +``` +make CC=gcc +``` +生成的动态库libboundscheck.so存放在新创建的lib目录下。 + +#### 使用方法 +1. 将构建生成的动态库libboundscheck.so放到库文件目录下,例如:"/usr/local/lib/"。 + +2. 为使用libboundscheck,编译程序时需增加编译参数"-lboundscheck",例如:"gcc -g -o test test.c -lboundscheck"。 \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/include/securec.h b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/include/securec.h new file mode 100644 index 000000000..b1dea967d --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/include/securec.h @@ -0,0 +1,637 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: The user of this secure c library should include this header file in you source code. + * This header file declare all supported API prototype of the library, + * such as memcpy_s, strcpy_s, wcscpy_s,strcat_s, strncat_s, sprintf_s, scanf_s, and so on. + * Create: 2014-02-25 + * Notes: Do not modify this file by yourself. + */ + +#ifndef SECUREC_H_5D13A042_DC3F_4ED9_A8D1_882811274C27 +#define SECUREC_H_5D13A042_DC3F_4ED9_A8D1_882811274C27 + +#include "securectype.h" +#ifndef SECUREC_HAVE_STDARG_H +#define SECUREC_HAVE_STDARG_H 1 +#endif + +#if SECUREC_HAVE_STDARG_H +#include +#endif + +#ifndef SECUREC_HAVE_ERRNO_H +#define SECUREC_HAVE_ERRNO_H 1 +#endif + +/* EINVAL ERANGE may defined in errno.h */ +#if SECUREC_HAVE_ERRNO_H +#if SECUREC_IN_KERNEL +#include +#else +#include +#endif +#endif + +/* Define error code */ +#if defined(SECUREC_NEED_ERRNO_TYPE) || !defined(__STDC_WANT_LIB_EXT1__) || \ + (defined(__STDC_WANT_LIB_EXT1__) && (!__STDC_WANT_LIB_EXT1__)) +#ifndef SECUREC_DEFINED_ERRNO_TYPE +#define SECUREC_DEFINED_ERRNO_TYPE +/* Just check whether macrodefinition exists. */ +#ifndef errno_t +typedef int errno_t; +#endif +#endif +#endif + +/* Success */ +#ifndef EOK +#define EOK 0 +#endif + +#ifndef EINVAL +/* The src buffer is not correct and destination buffer can not be reset */ +#define EINVAL 22 +#endif + +#ifndef EINVAL_AND_RESET +/* Once the error is detected, the dest buffer must be reset! Value is 22 or 128 */ +#define EINVAL_AND_RESET 150 +#endif + +#ifndef ERANGE +/* The destination buffer is not long enough and destination buffer can not be reset */ +#define ERANGE 34 +#endif + +#ifndef ERANGE_AND_RESET +/* Once the error is detected, the dest buffer must be reset! Value is 34 or 128 */ +#define ERANGE_AND_RESET 162 +#endif + +#ifndef EOVERLAP_AND_RESET +/* Once the buffer overlap is detected, the dest buffer must be reset! Value is 54 or 128 */ +#define EOVERLAP_AND_RESET 182 +#endif + +/* If you need export the function of this library in Win32 dll, use __declspec(dllexport) */ +#ifndef SECUREC_API +#if defined(SECUREC_DLL_EXPORT) +#if defined(_MSC_VER) +#define SECUREC_API __declspec(dllexport) +#else /* build for linux */ +#define SECUREC_API __attribute__((visibility("default"))) +#endif /* end of _MSC_VER and SECUREC_DLL_EXPORT */ +#elif defined(SECUREC_DLL_IMPORT) +#if defined(_MSC_VER) +#define SECUREC_API __declspec(dllimport) +#else +#define SECUREC_API +#endif /* end of _MSC_VER and SECUREC_DLL_IMPORT */ +#else +/* + * Standardized function declaration. If a security function is declared in the your code, + * it may cause a compilation alarm,Please delete the security function you declared. + * Adding extern under windows will cause the system to have inline functions to expand, + * so do not add the extern in default + */ +#if defined(_MSC_VER) +#define SECUREC_API +#else +#define SECUREC_API extern +#endif +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif +/* + * Description: The GetHwSecureCVersion function get SecureC Version string and version number. + * Parameter: verNumber - to store version number (for example value is 0x500 | 0xa) + * Return: version string + */ +SECUREC_API const char *GetHwSecureCVersion(unsigned short *verNumber); + +#if SECUREC_ENABLE_MEMSET +/* + * Description: The memset_s function copies the value of c (converted to an unsigned char) into each of + * the first count characters of the object pointed to by dest. + * Parameter: dest - destination address + * Parameter: destMax - The maximum length of destination buffer + * Parameter: c - the value to be copied + * Parameter: count - copies count bytes of value to dest + * Return: EOK if there was no runtime-constraint violation + */ +SECUREC_API errno_t memset_s(void *dest, size_t destMax, int c, size_t count); +#endif + +#ifndef SECUREC_ONLY_DECLARE_MEMSET +#define SECUREC_ONLY_DECLARE_MEMSET 0 +#endif + +#if !SECUREC_ONLY_DECLARE_MEMSET + +#if SECUREC_ENABLE_MEMMOVE +/* + * Description: The memmove_s function copies n characters from the object pointed to by src + * into the object pointed to by dest. + * Parameter: dest - destination address + * Parameter: destMax - The maximum length of destination buffer + * Parameter: src - source address + * Parameter: count - copies count bytes from the src + * Return: EOK if there was no runtime-constraint violation + */ +SECUREC_API errno_t memmove_s(void *dest, size_t destMax, const void *src, size_t count); +#endif + +#if SECUREC_ENABLE_MEMCPY +/* + * Description: The memcpy_s function copies n characters from the object pointed to + * by src into the object pointed to by dest. + * Parameter: dest - destination address + * Parameter: destMax - The maximum length of destination buffer + * Parameter: src - source address + * Parameter: count - copies count bytes from the src + * Return: EOK if there was no runtime-constraint violation + */ +SECUREC_API errno_t memcpy_s(void *dest, size_t destMax, const void *src, size_t count); +#endif + +#if SECUREC_ENABLE_STRCPY +/* + * Description: The strcpy_s function copies the string pointed to by strSrc (including + * the terminating null character) into the array pointed to by strDest + * Parameter: strDest - destination address + * Parameter: destMax - The maximum length of destination buffer(including the terminating null character) + * Parameter: strSrc - source address + * Return: EOK if there was no runtime-constraint violation + */ +SECUREC_API errno_t strcpy_s(char *strDest, size_t destMax, const char *strSrc); +#endif + +#if SECUREC_ENABLE_STRNCPY +/* + * Description: The strncpy_s function copies not more than n successive characters (not including + * the terminating null character) from the array pointed to by strSrc to the array pointed to by strDest. + * Parameter: strDest - destination address + * Parameter: destMax - The maximum length of destination buffer(including the terminating null character) + * Parameter: strSrc - source address + * Parameter: count - copies count characters from the src + * Return: EOK if there was no runtime-constraint violation + */ +SECUREC_API errno_t strncpy_s(char *strDest, size_t destMax, const char *strSrc, size_t count); +#endif + +#if SECUREC_ENABLE_STRCAT +/* + * Description: The strcat_s function appends a copy of the string pointed to by strSrc (including + * the terminating null character) to the end of the string pointed to by strDest. + * Parameter: strDest - destination address + * Parameter: destMax - The maximum length of destination buffer(including the terminating null wide character) + * Parameter: strSrc - source address + * Return: EOK if there was no runtime-constraint violation + */ +SECUREC_API errno_t strcat_s(char *strDest, size_t destMax, const char *strSrc); +#endif + +#if SECUREC_ENABLE_STRNCAT +/* + * Description: The strncat_s function appends not more than n successive characters (not including + * the terminating null character) + * from the array pointed to by strSrc to the end of the string pointed to by strDest. + * Parameter: strDest - destination address + * Parameter: destMax - The maximum length of destination buffer(including the terminating null character) + * Parameter: strSrc - source address + * Parameter: count - copies count characters from the src + * Return: EOK if there was no runtime-constraint violation + */ +SECUREC_API errno_t strncat_s(char *strDest, size_t destMax, const char *strSrc, size_t count); +#endif + +#if SECUREC_ENABLE_VSPRINTF +/* + * Description: The vsprintf_s function is equivalent to the vsprintf function except for the parameter destMax + * and the explicit runtime-constraints violation + * Parameter: strDest - produce output according to a format,write to the character string strDest. + * Parameter: destMax - The maximum length of destination buffer(including the terminating null wide character) + * Parameter: format - format string + * Parameter: argList - instead of a variable number of arguments + * Return: the number of characters printed(not including the terminating null byte '\0'), + * If an error occurred Return: -1. + */ +SECUREC_API int vsprintf_s(char *strDest, size_t destMax, const char *format, + va_list argList) SECUREC_ATTRIBUTE(3, 0); +#endif + +#if SECUREC_ENABLE_SPRINTF +/* + * Description: The sprintf_s function is equivalent to the sprintf function except for the parameter destMax + * and the explicit runtime-constraints violation + * Parameter: strDest - produce output according to a format ,write to the character string strDest. + * Parameter: destMax - The maximum length of destination buffer(including the terminating null byte '\0') + * Parameter: format - format string + * Return: the number of characters printed(not including the terminating null byte '\0'), + * If an error occurred Return: -1. +*/ +SECUREC_API int sprintf_s(char *strDest, size_t destMax, const char *format, ...) SECUREC_ATTRIBUTE(3, 4); +#endif + +#if SECUREC_ENABLE_VSNPRINTF +/* + * Description: The vsnprintf_s function is equivalent to the vsnprintf function except for + * the parameter destMax/count and the explicit runtime-constraints violation + * Parameter: strDest - produce output according to a format ,write to the character string strDest. + * Parameter: destMax - The maximum length of destination buffer(including the terminating null byte '\0') + * Parameter: count - do not write more than count bytes to strDest(not including the terminating null byte '\0') + * Parameter: format - format string + * Parameter: argList - instead of a variable number of arguments + * Return: the number of characters printed(not including the terminating null byte '\0'), + * If an error occurred Return: -1.Pay special attention to returning -1 when truncation occurs. + */ +SECUREC_API int vsnprintf_s(char *strDest, size_t destMax, size_t count, const char *format, + va_list argList) SECUREC_ATTRIBUTE(4, 0); +#endif + +#if SECUREC_ENABLE_SNPRINTF +/* + * Description: The snprintf_s function is equivalent to the snprintf function except for + * the parameter destMax/count and the explicit runtime-constraints violation + * Parameter: strDest - produce output according to a format ,write to the character string strDest. + * Parameter: destMax - The maximum length of destination buffer(including the terminating null byte '\0') + * Parameter: count - do not write more than count bytes to strDest(not including the terminating null byte '\0') + * Parameter: format - format string + * Return: the number of characters printed(not including the terminating null byte '\0'), + * If an error occurred Return: -1.Pay special attention to returning -1 when truncation occurs. + */ +SECUREC_API int snprintf_s(char *strDest, size_t destMax, size_t count, const char *format, + ...) SECUREC_ATTRIBUTE(4, 5); +#endif + +#if SECUREC_SNPRINTF_TRUNCATED +/* + * Description: The vsnprintf_truncated_s function is equivalent to the vsnprintf_s function except + * no count parameter and return value + * Parameter: strDest - produce output according to a format ,write to the character string strDest + * Parameter: destMax - The maximum length of destination buffer(including the terminating null byte '\0') + * Parameter: format - format string + * Parameter: argList - instead of a variable number of arguments + * Return: the number of characters printed(not including the terminating null byte '\0'), + * If an error occurred Return: -1.Pay special attention to returning destMax - 1 when truncation occurs +*/ +SECUREC_API int vsnprintf_truncated_s(char *strDest, size_t destMax, const char *format, + va_list argList) SECUREC_ATTRIBUTE(3, 0); + +/* + * Description: The snprintf_truncated_s function is equivalent to the snprintf_s function except + * no count parameter and return value + * Parameter: strDest - produce output according to a format,write to the character string strDest. + * Parameter: destMax - The maximum length of destination buffer(including the terminating null byte '\0') + * Parameter: format - format string + * Return: the number of characters printed(not including the terminating null byte '\0'), + * If an error occurred Return: -1.Pay special attention to returning destMax - 1 when truncation occurs. + */ +SECUREC_API int snprintf_truncated_s(char *strDest, size_t destMax, + const char *format, ...) SECUREC_ATTRIBUTE(3, 4); +#endif + +#if SECUREC_ENABLE_SCANF +/* + * Description: The scanf_s function is equivalent to fscanf_s with the argument stdin + * interposed before the arguments to scanf_s + * Parameter: format - format string + * Return: the number of input items assigned, If an error occurred Return: -1. + */ +SECUREC_API int scanf_s(const char *format, ...); +#endif + +#if SECUREC_ENABLE_VSCANF +/* + * Description: The vscanf_s function is equivalent to scanf_s, with the variable argument list replaced by argList + * Parameter: format - format string + * Parameter: argList - instead of a variable number of arguments + * Return: the number of input items assigned, If an error occurred Return: -1. + */ +SECUREC_API int vscanf_s(const char *format, va_list argList); +#endif + +#if SECUREC_ENABLE_SSCANF +/* + * Description: The sscanf_s function is equivalent to fscanf_s, except that input is obtained from a + * string (specified by the argument buffer) rather than from a stream + * Parameter: buffer - read character from buffer + * Parameter: format - format string + * Return: the number of input items assigned, If an error occurred Return: -1. + */ +SECUREC_API int sscanf_s(const char *buffer, const char *format, ...); +#endif + +#if SECUREC_ENABLE_VSSCANF +/* + * Description: The vsscanf_s function is equivalent to sscanf_s, with the variable argument list + * replaced by argList + * Parameter: buffer - read character from buffer + * Parameter: format - format string + * Parameter: argList - instead of a variable number of arguments + * Return: the number of input items assigned, If an error occurred Return: -1. + */ +SECUREC_API int vsscanf_s(const char *buffer, const char *format, va_list argList); +#endif + +#if SECUREC_ENABLE_FSCANF +/* + * Description: The fscanf_s function is equivalent to fscanf except that the c, s, and [ conversion specifiers + * apply to a pair of arguments (unless assignment suppression is indicated by a *) + * Parameter: stream - stdio file stream + * Parameter: format - format string + * Return: the number of input items assigned, If an error occurred Return: -1. + */ +SECUREC_API int fscanf_s(FILE *stream, const char *format, ...); +#endif + +#if SECUREC_ENABLE_VFSCANF +/* + * Description: The vfscanf_s function is equivalent to fscanf_s, with the variable argument list + * replaced by argList + * Parameter: stream - stdio file stream + * Parameter: format - format string + * Parameter: argList - instead of a variable number of arguments + * Return: the number of input items assigned, If an error occurred Return: -1. + */ +SECUREC_API int vfscanf_s(FILE *stream, const char *format, va_list argList); +#endif + +#if SECUREC_ENABLE_STRTOK +/* + * Description: The strtok_s function parses a string into a sequence of strToken, + * replace all characters in strToken string that match to strDelimit set with 0. + * On the first call to strtok_s the string to be parsed should be specified in strToken. + * In each subsequent call that should parse the same string, strToken should be NULL + * Parameter: strToken - the string to be delimited + * Parameter: strDelimit - specifies a set of characters that delimit the tokens in the parsed string + * Parameter: context - is a pointer to a char * variable that is used internally by strtok_s function + * Return: On the first call returns the address of the first non \0 character, otherwise NULL is returned. + * In subsequent calls, the strtoken is set to NULL, and the context set is the same as the previous call, + * return NULL if the *context string length is equal 0, otherwise return *context. + */ +SECUREC_API char *strtok_s(char *strToken, const char *strDelimit, char **context); +#endif + +#if SECUREC_ENABLE_GETS && !SECUREC_IN_KERNEL +/* + * Description: The gets_s function reads at most one less than the number of characters specified + * by destMax from the stream pointed to by stdin, into the array pointed to by buffer + * Parameter: buffer - destination address + * Parameter: destMax - The maximum length of destination buffer(including the terminating null character) + * Return: buffer if there was no runtime-constraint violation,If an error occurred Return: NULL. + */ +SECUREC_API char *gets_s(char *buffer, size_t destMax); +#endif + +#if SECUREC_ENABLE_WCHAR_FUNC +#if SECUREC_ENABLE_MEMCPY +/* + * Description: The wmemcpy_s function copies n successive wide characters from the object pointed to + * by src into the object pointed to by dest. + * Parameter: dest - destination address + * Parameter: destMax - The maximum length of destination buffer + * Parameter: src - source address + * Parameter: count - copies count wide characters from the src + * Return: EOK if there was no runtime-constraint violation + */ +SECUREC_API errno_t wmemcpy_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count); +#endif + +#if SECUREC_ENABLE_MEMMOVE +/* + * Description: The wmemmove_s function copies n successive wide characters from the object + * pointed to by src into the object pointed to by dest. + * Parameter: dest - destination address + * Parameter: destMax - The maximum length of destination buffer + * Parameter: src - source address + * Parameter: count - copies count wide characters from the src + * Return: EOK if there was no runtime-constraint violation + */ +SECUREC_API errno_t wmemmove_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count); +#endif + +#if SECUREC_ENABLE_STRCPY +/* + * Description: The wcscpy_s function copies the wide string pointed to by strSrc(including the terminating + * null wide character) into the array pointed to by strDest + * Parameter: strDest - destination address + * Parameter: destMax - The maximum length of destination buffer + * Parameter: strSrc - source address + * Return: EOK if there was no runtime-constraint violation + */ +SECUREC_API errno_t wcscpy_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc); +#endif + +#if SECUREC_ENABLE_STRNCPY +/* + * Description: The wcsncpy_s function copies not more than n successive wide characters (not including the + * terminating null wide character) from the array pointed to by strSrc to the array pointed to by strDest + * Parameter: strDest - destination address + * Parameter: destMax - The maximum length of destination buffer(including the terminating wide character) + * Parameter: strSrc - source address + * Parameter: count - copies count wide characters from the src + * Return: EOK if there was no runtime-constraint violation + */ +SECUREC_API errno_t wcsncpy_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count); +#endif + +#if SECUREC_ENABLE_STRCAT +/* + * Description: The wcscat_s function appends a copy of the wide string pointed to by strSrc (including the + * terminating null wide character) to the end of the wide string pointed to by strDest + * Parameter: strDest - destination address + * Parameter: destMax - The maximum length of destination buffer(including the terminating wide character) + * Parameter: strSrc - source address + * Return: EOK if there was no runtime-constraint violation + */ +SECUREC_API errno_t wcscat_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc); +#endif + +#if SECUREC_ENABLE_STRNCAT +/* + * Description: The wcsncat_s function appends not more than n successive wide characters (not including the + * terminating null wide character) from the array pointed to by strSrc to the end of the wide string pointed to + * by strDest. + * Parameter: strDest - destination address + * Parameter: destMax - The maximum length of destination buffer(including the terminating wide character) + * Parameter: strSrc - source address + * Parameter: count - copies count wide characters from the src + * Return: EOK if there was no runtime-constraint violation + */ +SECUREC_API errno_t wcsncat_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count); +#endif + +#if SECUREC_ENABLE_STRTOK +/* + * Description: The wcstok_s function is the wide-character equivalent of the strtok_s function + * Parameter: strToken - the string to be delimited + * Parameter: strDelimit - specifies a set of characters that delimit the tokens in the parsed string + * Parameter: context - is a pointer to a char * variable that is used internally by strtok_s function + * Return: a pointer to the first character of a token, or a null pointer if there is no token + * or there is a runtime-constraint violation. + */ +SECUREC_API wchar_t *wcstok_s(wchar_t *strToken, const wchar_t *strDelimit, wchar_t **context); +#endif + +#if SECUREC_ENABLE_VSPRINTF +/* + * Description: The vswprintf_s function is the wide-character equivalent of the vsprintf_s function + * Parameter: strDest - produce output according to a format,write to the character string strDest + * Parameter: destMax - The maximum length of destination buffer(including the terminating null) + * Parameter: format - format string + * Parameter: argList - instead of a variable number of arguments + * Return: the number of characters printed(not including the terminating null wide character), + * If an error occurred Return: -1. + */ +SECUREC_API int vswprintf_s(wchar_t *strDest, size_t destMax, const wchar_t *format, va_list argList); +#endif + +#if SECUREC_ENABLE_SPRINTF +/* + * Description: The swprintf_s function is the wide-character equivalent of the sprintf_s function + * Parameter: strDest - produce output according to a format,write to the character string strDest + * Parameter: destMax - The maximum length of destination buffer(including the terminating null) + * Parameter: format - format string + * Return: the number of characters printed(not including the terminating null wide character), + * If an error occurred Return: -1. + */ +SECUREC_API int swprintf_s(wchar_t *strDest, size_t destMax, const wchar_t *format, ...); +#endif + +#if SECUREC_ENABLE_FSCANF +/* + * Description: The fwscanf_s function is the wide-character equivalent of the fscanf_s function + * Parameter: stream - stdio file stream + * Parameter: format - format string + * Return: the number of input items assigned, If an error occurred Return: -1. + */ +SECUREC_API int fwscanf_s(FILE *stream, const wchar_t *format, ...); +#endif + +#if SECUREC_ENABLE_VFSCANF +/* + * Description: The vfwscanf_s function is the wide-character equivalent of the vfscanf_s function + * Parameter: stream - stdio file stream + * Parameter: format - format string + * Parameter: argList - instead of a variable number of arguments + * Return: the number of input items assigned, If an error occurred Return: -1. + */ +SECUREC_API int vfwscanf_s(FILE *stream, const wchar_t *format, va_list argList); +#endif + +#if SECUREC_ENABLE_SCANF +/* + * Description: The wscanf_s function is the wide-character equivalent of the scanf_s function + * Parameter: format - format string + * Return: the number of input items assigned, If an error occurred Return: -1. + */ +SECUREC_API int wscanf_s(const wchar_t *format, ...); +#endif + +#if SECUREC_ENABLE_VSCANF +/* + * Description: The vwscanf_s function is the wide-character equivalent of the vscanf_s function + * Parameter: format - format string + * Parameter: argList - instead of a variable number of arguments + * Return: the number of input items assigned, If an error occurred Return: -1. + */ +SECUREC_API int vwscanf_s(const wchar_t *format, va_list argList); +#endif + +#if SECUREC_ENABLE_SSCANF +/* + * Description: The swscanf_s function is the wide-character equivalent of the sscanf_s function + * Parameter: buffer - read character from buffer + * Parameter: format - format string + * Return: the number of input items assigned, If an error occurred Return: -1. + */ +SECUREC_API int swscanf_s(const wchar_t *buffer, const wchar_t *format, ...); +#endif + +#if SECUREC_ENABLE_VSSCANF +/* + * Description: The vswscanf_s function is the wide-character equivalent of the vsscanf_s function + * Parameter: buffer - read character from buffer + * Parameter: format - format string + * Parameter: argList - instead of a variable number of arguments + * Return: the number of input items assigned, If an error occurred Return: -1. + */ +SECUREC_API int vswscanf_s(const wchar_t *buffer, const wchar_t *format, va_list argList); +#endif +#endif /* SECUREC_ENABLE_WCHAR_FUNC */ +#endif + +/* Those functions are used by macro,must declare hare, also for without function declaration warning */ +extern errno_t strncpy_error(char *strDest, size_t destMax, const char *strSrc, size_t count); +extern errno_t strcpy_error(char *strDest, size_t destMax, const char *strSrc); + +#if SECUREC_WITH_PERFORMANCE_ADDONS +/* Those functions are used by macro */ +extern errno_t memset_sOptAsm(void *dest, size_t destMax, int c, size_t count); +extern errno_t memset_sOptTc(void *dest, size_t destMax, int c, size_t count); +extern errno_t memcpy_sOptAsm(void *dest, size_t destMax, const void *src, size_t count); +extern errno_t memcpy_sOptTc(void *dest, size_t destMax, const void *src, size_t count); + +/* The strcpy_sp is a macro, not a function in performance optimization mode. */ +#define strcpy_sp(dest, destMax, src) ((__builtin_constant_p((destMax)) && \ + __builtin_constant_p((src))) ? \ + SECUREC_STRCPY_SM((dest), (destMax), (src)) : \ + strcpy_s((dest), (destMax), (src))) + +/* The strncpy_sp is a macro, not a function in performance optimization mode. */ +#define strncpy_sp(dest, destMax, src, count) ((__builtin_constant_p((count)) && \ + __builtin_constant_p((destMax)) && \ + __builtin_constant_p((src))) ? \ + SECUREC_STRNCPY_SM((dest), (destMax), (src), (count)) : \ + strncpy_s((dest), (destMax), (src), (count))) + +/* The strcat_sp is a macro, not a function in performance optimization mode. */ +#define strcat_sp(dest, destMax, src) ((__builtin_constant_p((destMax)) && \ + __builtin_constant_p((src))) ? \ + SECUREC_STRCAT_SM((dest), (destMax), (src)) : \ + strcat_s((dest), (destMax), (src))) + +/* The strncat_sp is a macro, not a function in performance optimization mode. */ +#define strncat_sp(dest, destMax, src, count) ((__builtin_constant_p((count)) && \ + __builtin_constant_p((destMax)) && \ + __builtin_constant_p((src))) ? \ + SECUREC_STRNCAT_SM((dest), (destMax), (src), (count)) : \ + strncat_s((dest), (destMax), (src), (count))) + +/* The memcpy_sp is a macro, not a function in performance optimization mode. */ +#define memcpy_sp(dest, destMax, src, count) (__builtin_constant_p((count)) ? \ + (SECUREC_MEMCPY_SM((dest), (destMax), (src), (count))) : \ + (__builtin_constant_p((destMax)) ? \ + (((size_t)(destMax) > 0 && \ + (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_MEM_MAX_LEN)) ? \ + memcpy_sOptTc((dest), (destMax), (src), (count)) : ERANGE) : \ + memcpy_sOptAsm((dest), (destMax), (src), (count)))) + +/* The memset_sp is a macro, not a function in performance optimization mode. */ +#define memset_sp(dest, destMax, c, count) (__builtin_constant_p((count)) ? \ + (SECUREC_MEMSET_SM((dest), (destMax), (c), (count))) : \ + (__builtin_constant_p((destMax)) ? \ + (((((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_MEM_MAX_LEN)) ? \ + memset_sOptTc((dest), (destMax), (c), (count)) : ERANGE) : \ + memset_sOptAsm((dest), (destMax), (c), (count)))) + +#endif + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/include/securectype.h b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/include/securectype.h new file mode 100644 index 000000000..69e79c2f9 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/include/securectype.h @@ -0,0 +1,585 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: Define internal used macro and data type. The marco of SECUREC_ON_64BITS + * will be determined in this header file, which is a switch for part + * of code. Some macro are used to suppress warning by MS compiler. + * Create: 2014-02-25 + * Notes: User can change the value of SECUREC_STRING_MAX_LEN and SECUREC_MEM_MAX_LEN + * macro to meet their special need, but The maximum value should not exceed 2G. + */ +/* + * [Standardize-exceptions]: Performance-sensitive + * [reason]: Strict parameter verification has been done before use + */ + +#ifndef SECURECTYPE_H_A7BBB686_AADA_451B_B9F9_44DACDAE18A7 +#define SECURECTYPE_H_A7BBB686_AADA_451B_B9F9_44DACDAE18A7 + +#ifndef SECUREC_USING_STD_SECURE_LIB +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#if defined(__STDC_WANT_SECURE_LIB__) && (!__STDC_WANT_SECURE_LIB__) +/* Security functions have been provided since vs2005, default use of system library functions */ +#define SECUREC_USING_STD_SECURE_LIB 0 +#else +#define SECUREC_USING_STD_SECURE_LIB 1 +#endif +#else +#define SECUREC_USING_STD_SECURE_LIB 0 +#endif +#endif + +/* Compatibility with older Secure C versions, shielding VC symbol redefinition warning */ +#if defined(_MSC_VER) && (_MSC_VER >= 1400) && (!SECUREC_USING_STD_SECURE_LIB) +#ifndef SECUREC_DISABLE_CRT_FUNC +#define SECUREC_DISABLE_CRT_FUNC 1 +#endif +#ifndef SECUREC_DISABLE_CRT_IMP +#define SECUREC_DISABLE_CRT_IMP 1 +#endif +#else /* MSC VER */ +#ifndef SECUREC_DISABLE_CRT_FUNC +#define SECUREC_DISABLE_CRT_FUNC 0 +#endif +#ifndef SECUREC_DISABLE_CRT_IMP +#define SECUREC_DISABLE_CRT_IMP 0 +#endif +#endif + +#if SECUREC_DISABLE_CRT_FUNC +#ifdef __STDC_WANT_SECURE_LIB__ +#undef __STDC_WANT_SECURE_LIB__ +#endif +#define __STDC_WANT_SECURE_LIB__ 0 +#endif + +#if SECUREC_DISABLE_CRT_IMP +#ifdef _CRTIMP_ALTERNATIVE +#undef _CRTIMP_ALTERNATIVE +#endif +#define _CRTIMP_ALTERNATIVE /* Comment Microsoft *_s function */ +#endif + +/* Compile in kernel under macro control */ +#ifndef SECUREC_IN_KERNEL +#ifdef __KERNEL__ +#define SECUREC_IN_KERNEL 1 +#else +#define SECUREC_IN_KERNEL 0 +#endif +#endif + +/* make kernel symbols of functions available to loadable modules */ +#ifndef SECUREC_EXPORT_KERNEL_SYMBOL +#if SECUREC_IN_KERNEL +#define SECUREC_EXPORT_KERNEL_SYMBOL 1 +#else +#define SECUREC_EXPORT_KERNEL_SYMBOL 0 +#endif +#endif + +#if SECUREC_IN_KERNEL +#ifndef SECUREC_ENABLE_SCANF_FILE +#define SECUREC_ENABLE_SCANF_FILE 0 +#endif +#ifndef SECUREC_ENABLE_WCHAR_FUNC +#define SECUREC_ENABLE_WCHAR_FUNC 0 +#endif +#else /* SECUREC_IN_KERNEL */ +#ifndef SECUREC_ENABLE_SCANF_FILE +#define SECUREC_ENABLE_SCANF_FILE 1 +#endif +#ifndef SECUREC_ENABLE_WCHAR_FUNC +#define SECUREC_ENABLE_WCHAR_FUNC 1 +#endif +#endif + +/* Default secure function declaration, default declarations for non-standard functions */ +#ifndef SECUREC_SNPRINTF_TRUNCATED +#define SECUREC_SNPRINTF_TRUNCATED 1 +#endif + +#if SECUREC_USING_STD_SECURE_LIB +#if defined(_MSC_VER) && _MSC_VER >= 1400 +/* Declare secure functions that are not available in the VS compiler */ +#ifndef SECUREC_ENABLE_MEMSET +#define SECUREC_ENABLE_MEMSET 1 +#endif +/* VS 2005 have vsnprintf_s function */ +#ifndef SECUREC_ENABLE_VSNPRINTF +#define SECUREC_ENABLE_VSNPRINTF 0 +#endif +#ifndef SECUREC_ENABLE_SNPRINTF +/* VS 2005 have vsnprintf_s function Adapt the snprintf_s of the security function */ +#define snprintf_s _snprintf_s +#define SECUREC_ENABLE_SNPRINTF 0 +#endif +/* Before VS 2010 do not have v functions */ +#if _MSC_VER <= 1600 || defined(SECUREC_FOR_V_SCANFS) +#ifndef SECUREC_ENABLE_VFSCANF +#define SECUREC_ENABLE_VFSCANF 1 +#endif +#ifndef SECUREC_ENABLE_VSCANF +#define SECUREC_ENABLE_VSCANF 1 +#endif +#ifndef SECUREC_ENABLE_VSSCANF +#define SECUREC_ENABLE_VSSCANF 1 +#endif +#endif + +#else /* MSC VER */ +#ifndef SECUREC_ENABLE_MEMSET +#define SECUREC_ENABLE_MEMSET 0 +#endif +#ifndef SECUREC_ENABLE_SNPRINTF +#define SECUREC_ENABLE_SNPRINTF 0 +#endif +#ifndef SECUREC_ENABLE_VSNPRINTF +#define SECUREC_ENABLE_VSNPRINTF 0 +#endif +#endif + +#ifndef SECUREC_ENABLE_MEMMOVE +#define SECUREC_ENABLE_MEMMOVE 0 +#endif +#ifndef SECUREC_ENABLE_MEMCPY +#define SECUREC_ENABLE_MEMCPY 0 +#endif +#ifndef SECUREC_ENABLE_STRCPY +#define SECUREC_ENABLE_STRCPY 0 +#endif +#ifndef SECUREC_ENABLE_STRNCPY +#define SECUREC_ENABLE_STRNCPY 0 +#endif +#ifndef SECUREC_ENABLE_STRCAT +#define SECUREC_ENABLE_STRCAT 0 +#endif +#ifndef SECUREC_ENABLE_STRNCAT +#define SECUREC_ENABLE_STRNCAT 0 +#endif +#ifndef SECUREC_ENABLE_SPRINTF +#define SECUREC_ENABLE_SPRINTF 0 +#endif +#ifndef SECUREC_ENABLE_VSPRINTF +#define SECUREC_ENABLE_VSPRINTF 0 +#endif +#ifndef SECUREC_ENABLE_SSCANF +#define SECUREC_ENABLE_SSCANF 0 +#endif +#ifndef SECUREC_ENABLE_VSSCANF +#define SECUREC_ENABLE_VSSCANF 0 +#endif +#ifndef SECUREC_ENABLE_SCANF +#define SECUREC_ENABLE_SCANF 0 +#endif +#ifndef SECUREC_ENABLE_VSCANF +#define SECUREC_ENABLE_VSCANF 0 +#endif + +#ifndef SECUREC_ENABLE_FSCANF +#define SECUREC_ENABLE_FSCANF 0 +#endif +#ifndef SECUREC_ENABLE_VFSCANF +#define SECUREC_ENABLE_VFSCANF 0 +#endif +#ifndef SECUREC_ENABLE_STRTOK +#define SECUREC_ENABLE_STRTOK 0 +#endif +#ifndef SECUREC_ENABLE_GETS +#define SECUREC_ENABLE_GETS 0 +#endif + +#else /* SECUREC USE STD SECURE LIB */ + +#ifndef SECUREC_ENABLE_MEMSET +#define SECUREC_ENABLE_MEMSET 1 +#endif +#ifndef SECUREC_ENABLE_MEMMOVE +#define SECUREC_ENABLE_MEMMOVE 1 +#endif +#ifndef SECUREC_ENABLE_MEMCPY +#define SECUREC_ENABLE_MEMCPY 1 +#endif +#ifndef SECUREC_ENABLE_STRCPY +#define SECUREC_ENABLE_STRCPY 1 +#endif +#ifndef SECUREC_ENABLE_STRNCPY +#define SECUREC_ENABLE_STRNCPY 1 +#endif +#ifndef SECUREC_ENABLE_STRCAT +#define SECUREC_ENABLE_STRCAT 1 +#endif +#ifndef SECUREC_ENABLE_STRNCAT +#define SECUREC_ENABLE_STRNCAT 1 +#endif +#ifndef SECUREC_ENABLE_SPRINTF +#define SECUREC_ENABLE_SPRINTF 1 +#endif +#ifndef SECUREC_ENABLE_VSPRINTF +#define SECUREC_ENABLE_VSPRINTF 1 +#endif +#ifndef SECUREC_ENABLE_SNPRINTF +#define SECUREC_ENABLE_SNPRINTF 1 +#endif +#ifndef SECUREC_ENABLE_VSNPRINTF +#define SECUREC_ENABLE_VSNPRINTF 1 +#endif +#ifndef SECUREC_ENABLE_SSCANF +#define SECUREC_ENABLE_SSCANF 1 +#endif +#ifndef SECUREC_ENABLE_VSSCANF +#define SECUREC_ENABLE_VSSCANF 1 +#endif +#ifndef SECUREC_ENABLE_SCANF +#if SECUREC_ENABLE_SCANF_FILE +#define SECUREC_ENABLE_SCANF 1 +#else +#define SECUREC_ENABLE_SCANF 0 +#endif +#endif +#ifndef SECUREC_ENABLE_VSCANF +#if SECUREC_ENABLE_SCANF_FILE +#define SECUREC_ENABLE_VSCANF 1 +#else +#define SECUREC_ENABLE_VSCANF 0 +#endif +#endif + +#ifndef SECUREC_ENABLE_FSCANF +#if SECUREC_ENABLE_SCANF_FILE +#define SECUREC_ENABLE_FSCANF 1 +#else +#define SECUREC_ENABLE_FSCANF 0 +#endif +#endif +#ifndef SECUREC_ENABLE_VFSCANF +#if SECUREC_ENABLE_SCANF_FILE +#define SECUREC_ENABLE_VFSCANF 1 +#else +#define SECUREC_ENABLE_VFSCANF 0 +#endif +#endif + +#ifndef SECUREC_ENABLE_STRTOK +#define SECUREC_ENABLE_STRTOK 1 +#endif +#ifndef SECUREC_ENABLE_GETS +#define SECUREC_ENABLE_GETS 1 +#endif +#endif /* SECUREC_USE_STD_SECURE_LIB */ + +#if !SECUREC_ENABLE_SCANF_FILE +#if SECUREC_ENABLE_FSCANF +#undef SECUREC_ENABLE_FSCANF +#define SECUREC_ENABLE_FSCANF 0 +#endif +#if SECUREC_ENABLE_VFSCANF +#undef SECUREC_ENABLE_VFSCANF +#define SECUREC_ENABLE_VFSCANF 0 +#endif +#if SECUREC_ENABLE_SCANF +#undef SECUREC_ENABLE_SCANF +#define SECUREC_ENABLE_SCANF 0 +#endif +#if SECUREC_ENABLE_FSCANF +#undef SECUREC_ENABLE_FSCANF +#define SECUREC_ENABLE_FSCANF 0 +#endif + +#endif + +#if SECUREC_IN_KERNEL +#include +#include +#else +#ifndef SECUREC_HAVE_STDIO_H +#define SECUREC_HAVE_STDIO_H 1 +#endif +#ifndef SECUREC_HAVE_STRING_H +#define SECUREC_HAVE_STRING_H 1 +#endif +#ifndef SECUREC_HAVE_STDLIB_H +#define SECUREC_HAVE_STDLIB_H 1 +#endif +#if SECUREC_HAVE_STDIO_H +#include +#endif +#if SECUREC_HAVE_STRING_H +#include +#endif +#if SECUREC_HAVE_STDLIB_H +#include +#endif +#endif + +/* + * If you need high performance, enable the SECUREC_WITH_PERFORMANCE_ADDONS macro, default is enable. + * The macro is automatically closed on the windows platform and linux kernel + */ +#ifndef SECUREC_WITH_PERFORMANCE_ADDONS +#if SECUREC_IN_KERNEL +#define SECUREC_WITH_PERFORMANCE_ADDONS 0 +#else +#define SECUREC_WITH_PERFORMANCE_ADDONS 1 +#endif +#endif + +/* If enable SECUREC_COMPATIBLE_WIN_FORMAT, the output format will be compatible to Windows. */ +#if (defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER)) && !defined(SECUREC_COMPATIBLE_LINUX_FORMAT) +#ifndef SECUREC_COMPATIBLE_WIN_FORMAT +#define SECUREC_COMPATIBLE_WIN_FORMAT +#endif +#endif + +#if defined(SECUREC_COMPATIBLE_WIN_FORMAT) +/* On windows platform, can't use optimized function for there is no __builtin_constant_p like function */ +/* If need optimized macro, can define this: define __builtin_constant_p(x) 0 */ +#ifdef SECUREC_WITH_PERFORMANCE_ADDONS +#undef SECUREC_WITH_PERFORMANCE_ADDONS +#define SECUREC_WITH_PERFORMANCE_ADDONS 0 +#endif +#endif + +#if defined(__VXWORKS__) || defined(__vxworks) || defined(__VXWORKS) || defined(_VXWORKS_PLATFORM_) || \ + defined(SECUREC_VXWORKS_VERSION_5_4) +#ifndef SECUREC_VXWORKS_PLATFORM +#define SECUREC_VXWORKS_PLATFORM +#endif +#endif + +/* If enable SECUREC_COMPATIBLE_LINUX_FORMAT, the output format will be compatible to Linux. */ +#if !defined(SECUREC_COMPATIBLE_WIN_FORMAT) && !defined(SECUREC_VXWORKS_PLATFORM) +#ifndef SECUREC_COMPATIBLE_LINUX_FORMAT +#define SECUREC_COMPATIBLE_LINUX_FORMAT +#endif +#endif + +#ifdef SECUREC_COMPATIBLE_LINUX_FORMAT +#ifndef SECUREC_HAVE_STDDEF_H +#define SECUREC_HAVE_STDDEF_H 1 +#endif +/* Some system may no stddef.h */ +#if SECUREC_HAVE_STDDEF_H +#if !SECUREC_IN_KERNEL +#include +#endif +#endif +#endif + +/* + * Add the -DSECUREC_SUPPORT_FORMAT_WARNING=1 compiler option to supoort -Wformat=2. + * Default does not check the format is that the same data type in the actual code. + * In the product is different in the original data type definition of VxWorks and Linux. + */ +#ifndef SECUREC_SUPPORT_FORMAT_WARNING +#define SECUREC_SUPPORT_FORMAT_WARNING 0 +#endif + +#if SECUREC_SUPPORT_FORMAT_WARNING +#define SECUREC_ATTRIBUTE(x, y) __attribute__((format(printf, (x), (y)))) +#else +#define SECUREC_ATTRIBUTE(x, y) +#endif + +/* + * Add the -DSECUREC_SUPPORT_BUILTIN_EXPECT=0 compiler option, if compiler can not support __builtin_expect. + */ +#ifndef SECUREC_SUPPORT_BUILTIN_EXPECT +#define SECUREC_SUPPORT_BUILTIN_EXPECT 1 +#endif + +#if SECUREC_SUPPORT_BUILTIN_EXPECT && defined(__GNUC__) && ((__GNUC__ > 3) || \ + (defined(__GNUC_MINOR__) && (__GNUC__ == 3 && __GNUC_MINOR__ > 3))) +/* + * This is a built-in function that can be used without a declaration, if warning for declaration not found occurred, + * you can add -DSECUREC_NEED_BUILTIN_EXPECT_DECLARE to compiler options + */ +#ifdef SECUREC_NEED_BUILTIN_EXPECT_DECLARE +long __builtin_expect(long exp, long c); +#endif + +#define SECUREC_LIKELY(x) __builtin_expect(!!(x), 1) +#define SECUREC_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define SECUREC_LIKELY(x) (x) +#define SECUREC_UNLIKELY(x) (x) +#endif + +/* Define the max length of the string */ +#ifndef SECUREC_STRING_MAX_LEN +#define SECUREC_STRING_MAX_LEN 0x7fffffffUL +#endif +#define SECUREC_WCHAR_STRING_MAX_LEN (SECUREC_STRING_MAX_LEN / sizeof(wchar_t)) + +/* Add SECUREC_MEM_MAX_LEN for memcpy and memmove */ +#ifndef SECUREC_MEM_MAX_LEN +#define SECUREC_MEM_MAX_LEN 0x7fffffffUL +#endif +#define SECUREC_WCHAR_MEM_MAX_LEN (SECUREC_MEM_MAX_LEN / sizeof(wchar_t)) + +#if SECUREC_STRING_MAX_LEN > 0x7fffffffUL +#error "max string is 2G" +#endif + +#if (defined(__GNUC__) && defined(__SIZEOF_POINTER__)) +#if (__SIZEOF_POINTER__ != 4) && (__SIZEOF_POINTER__ != 8) +#error "unsupported system" +#endif +#endif + +#if defined(_WIN64) || defined(WIN64) || defined(__LP64__) || defined(_LP64) +#define SECUREC_ON_64BITS +#endif + +#if (!defined(SECUREC_ON_64BITS) && defined(__GNUC__) && defined(__SIZEOF_POINTER__)) +#if __SIZEOF_POINTER__ == 8 +#define SECUREC_ON_64BITS +#endif +#endif + +#if defined(__SVR4) || defined(__svr4__) +#define SECUREC_ON_SOLARIS +#endif + +#if (defined(__hpux) || defined(_AIX) || defined(SECUREC_ON_SOLARIS)) +#define SECUREC_ON_UNIX +#endif + +/* + * Codes should run under the macro SECUREC_COMPATIBLE_LINUX_FORMAT in unknown system on default, + * and strtold. + * The function strtold is referenced first at ISO9899:1999(C99), and some old compilers can + * not support these functions. Here provides a macro to open these functions: + * SECUREC_SUPPORT_STRTOLD -- If defined, strtold will be used + */ +#ifndef SECUREC_SUPPORT_STRTOLD +#define SECUREC_SUPPORT_STRTOLD 0 +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT)) +#if defined(__USE_ISOC99) || \ + (defined(_AIX) && defined(_ISOC99_SOURCE)) || \ + (defined(__hpux) && defined(__ia64)) || \ + (defined(SECUREC_ON_SOLARIS) && (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \ + defined(_STDC_C99) || defined(__EXTENSIONS__)) +#undef SECUREC_SUPPORT_STRTOLD +#define SECUREC_SUPPORT_STRTOLD 1 +#endif +#endif +#if ((defined(SECUREC_WRLINUX_BELOW4) || defined(_WRLINUX_BELOW4_))) +#undef SECUREC_SUPPORT_STRTOLD +#define SECUREC_SUPPORT_STRTOLD 0 +#endif +#endif + +#if SECUREC_WITH_PERFORMANCE_ADDONS + +#ifndef SECUREC_TWO_MIN +#define SECUREC_TWO_MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + +/* For strncpy_s performance optimization */ +#define SECUREC_STRNCPY_SM(dest, destMax, src, count) \ + (((void *)(dest) != NULL && (const void *)(src) != NULL && (size_t)(destMax) > 0 && \ + (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN) && \ + (SECUREC_TWO_MIN((size_t)(count), strlen(src)) + 1) <= (size_t)(destMax)) ? \ + (((size_t)(count) < strlen(src)) ? (memcpy((dest), (src), (count)), *((char *)(dest) + (count)) = '\0', EOK) : \ + (memcpy((dest), (src), strlen(src) + 1), EOK)) : (strncpy_error((dest), (destMax), (src), (count)))) + +#define SECUREC_STRCPY_SM(dest, destMax, src) \ + (((void *)(dest) != NULL && (const void *)(src) != NULL && (size_t)(destMax) > 0 && \ + (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN) && \ + (strlen(src) + 1) <= (size_t)(destMax)) ? (memcpy((dest), (src), strlen(src) + 1), EOK) : \ + (strcpy_error((dest), (destMax), (src)))) + +/* For strcat_s performance optimization */ +#if defined(__GNUC__) +#define SECUREC_STRCAT_SM(dest, destMax, src) ({ \ + int catRet_ = EOK; \ + if ((void *)(dest) != NULL && (const void *)(src) != NULL && (size_t)(destMax) > 0 && \ + (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN)) { \ + char *catTmpDst_ = (char *)(dest); \ + size_t catRestSize_ = (destMax); \ + while (catRestSize_ > 0 && *catTmpDst_ != '\0') { \ + ++catTmpDst_; \ + --catRestSize_; \ + } \ + if (catRestSize_ == 0) { \ + catRet_ = EINVAL; \ + } else if ((strlen(src) + 1) <= catRestSize_) { \ + memcpy(catTmpDst_, (src), strlen(src) + 1); \ + catRet_ = EOK; \ + } else { \ + catRet_ = ERANGE; \ + } \ + if (catRet_ != EOK) { \ + catRet_ = strcat_s((dest), (destMax), (src)); \ + } \ + } else { \ + catRet_ = strcat_s((dest), (destMax), (src)); \ + } \ + catRet_; \ +}) +#else +#define SECUREC_STRCAT_SM(dest, destMax, src) strcat_s((dest), (destMax), (src)) +#endif + +/* For strncat_s performance optimization */ +#if defined(__GNUC__) +#define SECUREC_STRNCAT_SM(dest, destMax, src, count) ({ \ + int ncatRet_ = EOK; \ + if ((void *)(dest) != NULL && (const void *)(src) != NULL && (size_t)(destMax) > 0 && \ + (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN) && \ + (((unsigned long long)(count) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN)) { \ + char *ncatTmpDest_ = (char *)(dest); \ + size_t ncatRestSize_ = (size_t)(destMax); \ + while (ncatRestSize_ > 0 && *ncatTmpDest_ != '\0') { \ + ++ncatTmpDest_; \ + --ncatRestSize_; \ + } \ + if (ncatRestSize_ == 0) { \ + ncatRet_ = EINVAL; \ + } else if ((SECUREC_TWO_MIN((count), strlen(src)) + 1) <= ncatRestSize_) { \ + if ((size_t)(count) < strlen(src)) { \ + memcpy(ncatTmpDest_, (src), (count)); \ + *(ncatTmpDest_ + (count)) = '\0'; \ + } else { \ + memcpy(ncatTmpDest_, (src), strlen(src) + 1); \ + } \ + } else { \ + ncatRet_ = ERANGE; \ + } \ + if (ncatRet_ != EOK) { \ + ncatRet_ = strncat_s((dest), (destMax), (src), (count)); \ + } \ + } else { \ + ncatRet_ = strncat_s((dest), (destMax), (src), (count)); \ + } \ + ncatRet_; \ +}) +#else +#define SECUREC_STRNCAT_SM(dest, destMax, src, count) strncat_s((dest), (destMax), (src), (count)) +#endif + +/* This macro do not check buffer overlap by default */ +#define SECUREC_MEMCPY_SM(dest, destMax, src, count) \ + (!(((size_t)(destMax) == 0) || \ + (((unsigned long long)(destMax) & (unsigned long long)(-2)) > SECUREC_MEM_MAX_LEN) || \ + ((size_t)(count) > (size_t)(destMax)) || ((void *)(dest)) == NULL || ((const void *)(src) == NULL)) ? \ + (memcpy((dest), (src), (count)), EOK) : \ + (memcpy_s((dest), (destMax), (src), (count)))) + +#define SECUREC_MEMSET_SM(dest, destMax, c, count) \ + (!((((unsigned long long)(destMax) & (unsigned long long)(-2)) > SECUREC_MEM_MAX_LEN) || \ + ((void *)(dest) == NULL) || ((size_t)(count) > (size_t)(destMax))) ? \ + (memset((dest), (c), (count)), EOK) : \ + (memset_s((dest), (destMax), (c), (count)))) + +#endif +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.c new file mode 100644 index 000000000..d3c7f06c1 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: fscanf_s function + * Create: 2014-02-25 + */ + +#include "securec.h" + +/* + * + * The fscanf_s function is equivalent to fscanf except that the c, s, + * and [ conversion specifiers apply to a pair of arguments (unless assignment suppression is indicated by a*) + * The fscanf function reads data from the current position of stream into + * the locations given by argument (if any). Each argument must be a pointer + * to a variable of a type that corresponds to a type specifier in format. + * format controls the interpretation of the input fields and has the same + * form and function as the format argument for scanf. + * + * + * stream Pointer to FILE structure. + * format Format control string, see Format Specifications. + * ... Optional arguments. + * + * + * ... The converted value stored in user assigned address + * + * + * Each of these functions returns the number of fields successfully converted + * and assigned; the return value does not include fields that were read but + * not assigned. A return value of 0 indicates that no fields were assigned. + * return -1 if an error occurs. + */ +int fscanf_s(FILE *stream, const char *format, ...) +{ + int ret; /* If initialization causes e838 */ + va_list argList; + + va_start(argList, format); + ret = vfscanf_s(stream, format, argList); + va_end(argList); + (void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */ + + return ret; +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.c new file mode 100644 index 000000000..bd0f12a96 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: fwscanf_s function + * Create: 2014-02-25 + */ + +#include "securec.h" + +/* + * + * The fwscanf_s function is the wide-character equivalent of the fscanf_s function + * The fwscanf_s function reads data from the current position of stream into + * the locations given by argument (if any). Each argument must be a pointer + * to a variable of a type that corresponds to a type specifier in format. + * format controls the interpretation of the input fields and has the same + * form and function as the format argument for scanf. + * + * + * stream Pointer to FILE structure. + * format Format control string, see Format Specifications. + * ... Optional arguments. + * + * + * ... The converted value stored in user assigned address + * + * + * Each of these functions returns the number of fields successfully converted + * and assigned; the return value does not include fields that were read but + * not assigned. A return value of 0 indicates that no fields were assigned. + * return -1 if an error occurs. + */ +int fwscanf_s(FILE *stream, const wchar_t *format, ...) +{ + int ret; /* If initialization causes e838 */ + va_list argList; + + va_start(argList, format); + ret = vfwscanf_s(stream, format, argList); + va_end(argList); + (void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */ + + return ret; +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.c new file mode 100644 index 000000000..d12495aa0 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.c @@ -0,0 +1,71 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: gets_s function + * Create: 2014-02-25 + */ + +#include "securecutil.h" + +/* + * The parameter size is buffer size in byte + */ +SECUREC_INLINE void SecTrimCRLF(char *buffer, size_t size) +{ + size_t len = strlen(buffer); + --len; /* Unsigned integer wrapping is accepted and is checked afterwards */ + while (len < size && (buffer[len] == '\r' || buffer[len] == '\n')) { + buffer[len] = '\0'; + --len; /* Unsigned integer wrapping is accepted and is checked next loop */ + } +} + +/* + * + * The gets_s function reads at most one less than the number of characters + * specified by destMax from the std input stream, into the array pointed to by buffer + * The line consists of all characters up to and including + * the first newline character ('\n'). gets_s then replaces the newline + * character with a null character ('\0') before returning the line. + * If the first character read is the end-of-file character, a null character + * is stored at the beginning of buffer and NULL is returned. + * + * + * buffer Storage location for input string. + * destMax The size of the buffer. + * + * + * buffer is updated + * + * + * buffer Successful operation + * NULL Improper parameter or read fail + */ +char *gets_s(char *buffer, size_t destMax) +{ +#ifdef SECUREC_COMPATIBLE_WIN_FORMAT + size_t bufferSize = ((destMax == (size_t)(-1)) ? SECUREC_STRING_MAX_LEN : destMax); +#else + size_t bufferSize = destMax; +#endif + + if (buffer == NULL || bufferSize == 0 || bufferSize > SECUREC_STRING_MAX_LEN) { + SECUREC_ERROR_INVALID_PARAMTER("gets_s"); + return NULL; + } + + if (fgets(buffer, (int)bufferSize, SECUREC_STREAM_STDIN) != NULL) { + SecTrimCRLF(buffer, bufferSize); + return buffer; + } + + return NULL; +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/input.inl b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/input.inl new file mode 100644 index 000000000..41d401cfd --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/input.inl @@ -0,0 +1,2229 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: Used by secureinput_a.c and secureinput_w.c to include. + * This file provides a template function for ANSI and UNICODE compiling by + * different type definition. The functions of SecInputS or + * SecInputSW provides internal implementation for scanf family API, such as sscanf_s, fscanf_s. + * Create: 2014-02-25 + * Notes: The formatted input processing results of integers on different platforms are different. + */ +/* + * [Standardize-exceptions] Use unsafe function: Performance-sensitive + * [reason] Always used in the performance critical path, + * and sufficient input validation is performed before calling + */ +#ifndef INPUT_INL_5D13A042_DC3F_4ED9_A8D1_882811274C27 +#define INPUT_INL_5D13A042_DC3F_4ED9_A8D1_882811274C27 + +#if SECUREC_IN_KERNEL +#if !defined(SECUREC_CTYPE_MACRO_ADAPT) +#include +#endif +#else +#if !defined(SECUREC_SYSAPI4VXWORKS) && !defined(SECUREC_CTYPE_MACRO_ADAPT) +#include +#ifdef SECUREC_FOR_WCHAR +#include /* For iswspace */ +#endif +#endif +#endif + +#ifndef EOF +#define EOF (-1) +#endif + +#define SECUREC_NUM_WIDTH_SHORT 0 +#define SECUREC_NUM_WIDTH_INT 1 +#define SECUREC_NUM_WIDTH_LONG 2 +#define SECUREC_NUM_WIDTH_LONG_LONG 3 /* Also long double */ + +#define SECUREC_BUFFERED_BLOK_SIZE 1024U + +#if defined(SECUREC_VXWORKS_PLATFORM) && !defined(va_copy) && !defined(__va_copy) +/* The name is the same as system macro. */ +#define __va_copy(dest, src) do { \ + size_t destSize_ = (size_t)sizeof(dest); \ + size_t srcSize_ = (size_t)sizeof(src); \ + if (destSize_ != srcSize_) { \ + SECUREC_MEMCPY_WARP_OPT((dest), (src), sizeof(va_list)); \ + } else { \ + SECUREC_MEMCPY_WARP_OPT(&(dest), &(src), sizeof(va_list)); \ + } \ +} SECUREC_WHILE_ZERO +#endif + +#define SECUREC_MULTI_BYTE_MAX_LEN 6 + +/* Compatibility macro name cannot be modifie */ +#ifndef UNALIGNED +#if !(defined(_M_IA64)) && !(defined(_M_AMD64)) +#define UNALIGNED +#else +#define UNALIGNED __unaligned +#endif +#endif + +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && !(defined(SECUREC_ON_UNIX))) +/* Max 64bit value is 0xffffffffffffffff */ +#define SECUREC_MAX_64BITS_VALUE 18446744073709551615ULL +#define SECUREC_MAX_64BITS_VALUE_DIV_TEN 1844674407370955161ULL +#define SECUREC_MAX_64BITS_VALUE_CUT_LAST_DIGIT 18446744073709551610ULL +#define SECUREC_MIN_64BITS_NEG_VALUE 9223372036854775808ULL +#define SECUREC_MAX_64BITS_POS_VALUE 9223372036854775807ULL +#define SECUREC_MIN_32BITS_NEG_VALUE 2147483648UL +#define SECUREC_MAX_32BITS_POS_VALUE 2147483647UL +#define SECUREC_MAX_32BITS_VALUE 4294967295UL +#define SECUREC_MAX_32BITS_VALUE_INC 4294967296UL +#define SECUREC_MAX_32BITS_VALUE_DIV_TEN 429496729UL +#define SECUREC_LONG_BIT_NUM ((unsigned int)(sizeof(long) << 3U)) +/* Use ULL to clean up cl6x compilation alerts */ +#define SECUREC_MAX_LONG_POS_VALUE ((unsigned long)(1ULL << (SECUREC_LONG_BIT_NUM - 1)) - 1) +#define SECUREC_MIN_LONG_NEG_VALUE ((unsigned long)(1ULL << (SECUREC_LONG_BIT_NUM - 1))) + +/* Covert to long long to clean up cl6x compilation alerts */ +#define SECUREC_LONG_HEX_BEYOND_MAX(number) (((unsigned long long)(number) >> (SECUREC_LONG_BIT_NUM - 4U)) > 0) +#define SECUREC_LONG_OCTAL_BEYOND_MAX(number) (((unsigned long long)(number) >> (SECUREC_LONG_BIT_NUM - 3U)) > 0) + +#define SECUREC_QWORD_HEX_BEYOND_MAX(number) (((number) >> (64U - 4U)) > 0) +#define SECUREC_QWORD_OCTAL_BEYOND_MAX(number) (((number) >> (64U - 3U)) > 0) + +#define SECUREC_LP64_BIT_WIDTH 64 +#define SECUREC_LP32_BIT_WIDTH 32 + +#define SECUREC_CONVERT_IS_SIGNED(conv) ((conv) == 'd' || (conv) == 'i') +#endif + +#define SECUREC_BRACE '{' /* [ to { */ +#define SECUREC_FILED_WIDTH_ENOUGH(spec) ((spec)->widthSet == 0 || (spec)->width > 0) +#define SECUREC_FILED_WIDTH_DEC(spec) do { \ + if ((spec)->widthSet != 0) { \ + --(spec)->width; \ + } \ +} SECUREC_WHILE_ZERO + +#ifdef SECUREC_FOR_WCHAR +/* Bits for all wchar, size is 65536/8, only supports wide characters with a maximum length of two bytes */ +#define SECUREC_BRACKET_TABLE_SIZE 8192 +#define SECUREC_EOF WEOF +#define SECUREC_MB_LEN 16 /* Max. # bytes in multibyte char ,see MB_LEN_MAX */ +#else +/* Bits for all char, size is 256/8 */ +#define SECUREC_BRACKET_TABLE_SIZE 32 +#define SECUREC_EOF EOF +#endif + +#if SECUREC_HAVE_WCHART +#define SECUREC_ARRAY_WIDTH_IS_WRONG(spec) ((spec).arrayWidth == 0 || \ + ((spec).isWCharOrLong <= 0 && (spec).arrayWidth > SECUREC_STRING_MAX_LEN) || \ + ((spec).isWCharOrLong > 0 && (spec).arrayWidth > SECUREC_WCHAR_STRING_MAX_LEN)) +#else +#define SECUREC_ARRAY_WIDTH_IS_WRONG(spec) ((spec).arrayWidth == 0 || (spec).arrayWidth > SECUREC_STRING_MAX_LEN) +#endif + +#ifdef SECUREC_ON_64BITS +/* Use 0xffffffffUL mask to pass integer as array length */ +#define SECUREC_GET_ARRAYWIDTH(argList) (((size_t)va_arg((argList), size_t)) & 0xffffffffUL) +#else /* !SECUREC_ON_64BITS */ +#define SECUREC_GET_ARRAYWIDTH(argList) ((size_t)va_arg((argList), size_t)) +#endif + +typedef struct { +#ifdef SECUREC_FOR_WCHAR + unsigned char *table; /* Default NULL */ +#else + unsigned char table[SECUREC_BRACKET_TABLE_SIZE]; /* Array length is large enough in application scenarios */ +#endif + unsigned char mask; /* Default 0 */ +} SecBracketTable; + +#ifdef SECUREC_FOR_WCHAR +#define SECUREC_INIT_BRACKET_TABLE { NULL, 0 } +#else +#define SECUREC_INIT_BRACKET_TABLE { {0}, 0 } +#endif + +#if SECUREC_ENABLE_SCANF_FLOAT +typedef struct { + size_t floatStrTotalLen; /* Initialization must be length of buffer in charater */ + size_t floatStrUsedLen; /* Store float string len */ + SecChar *floatStr; /* Initialization must point to buffer */ + SecChar *allocatedFloatStr; /* Initialization must be NULL to store alloced point */ + SecChar buffer[SECUREC_FLOAT_BUFSIZE + 1]; +} SecFloatSpec; +#endif + +#define SECUREC_NUMBER_STATE_DEFAULT 0U +#define SECUREC_NUMBER_STATE_STARTED 1U + +typedef struct { + SecInt ch; /* Char read from input */ + int charCount; /* Number of characters processed */ + void *argPtr; /* Variable parameter pointer, point to the end of the string */ + size_t arrayWidth; /* Length of pointer Variable parameter, in charaters */ + SecUnsignedInt64 number64; /* Store input number64 value */ + unsigned long number; /* Store input number32 value */ + int numberWidth; /* 0 = SHORT, 1 = int, > 1 long or L_DOUBLE */ + int numberArgType; /* 1 for 64-bit integer, 0 otherwise. use it as decode function index */ + unsigned int negative; /* 0 is positive */ +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && !(defined(SECUREC_ON_UNIX))) + unsigned int beyondMax; /* Non-zero means beyond */ +#endif + unsigned int numberState; /* Identifies whether to start processing numbers, 1 is can input number */ + int width; /* Width number in format */ + int widthSet; /* 0 is not set width in format */ + int convChr; /* Lowercase format conversion characters */ + int oriConvChr; /* Store original format conversion, convChr may change when parsing integers */ + signed char isWCharOrLong; /* -1/0 not wchar or long, 1 for wchar or long */ + unsigned char suppress; /* 0 is not have %* in format */ +} SecScanSpec; + +#ifdef SECUREC_FOR_WCHAR +#define SECUREC_GETC fgetwc +#define SECUREC_UN_GETC ungetwc +/* Only supports wide characters with a maximum length of two bytes in format string */ +#define SECUREC_BRACKET_CHAR_MASK 0xffffU +#else +#define SECUREC_GETC fgetc +#define SECUREC_UN_GETC ungetc +#define SECUREC_BRACKET_CHAR_MASK 0xffU +#endif + +#define SECUREC_CHAR_SIZE ((unsigned int)(sizeof(SecChar))) +/* To avoid 648, mask high bit: 0x00ffffff 0x0000ffff or 0x00000000 */ +#define SECUREC_CHAR_MASK_HIGH (((((((((unsigned int)(-1) >> SECUREC_CHAR_SIZE) >> SECUREC_CHAR_SIZE) >> \ + SECUREC_CHAR_SIZE) >> SECUREC_CHAR_SIZE) >> \ + SECUREC_CHAR_SIZE) >> SECUREC_CHAR_SIZE) >> \ + SECUREC_CHAR_SIZE) >> SECUREC_CHAR_SIZE) + +/* For char is 0xff, wcahr_t is 0xffff or 0xffffffff. */ +#define SECUREC_CHAR_MASK (~((((((((((unsigned int)(-1) & SECUREC_CHAR_MASK_HIGH) << \ + SECUREC_CHAR_SIZE) << SECUREC_CHAR_SIZE) << \ + SECUREC_CHAR_SIZE) << SECUREC_CHAR_SIZE) << \ + SECUREC_CHAR_SIZE) << SECUREC_CHAR_SIZE) << \ + SECUREC_CHAR_SIZE) << SECUREC_CHAR_SIZE)) + +/* According wchar_t has multiple bytes, so use sizeof */ +#define SECUREC_GET_CHAR(stream, outCh) do { \ + if ((stream)->count >= sizeof(SecChar)) { \ + *(outCh) = (SecInt)(SECUREC_CHAR_MASK & \ + (unsigned int)(int)(*((const SecChar *)(const void *)(stream)->cur))); \ + (stream)->cur += sizeof(SecChar); \ + (stream)->count -= sizeof(SecChar); \ + } else { \ + *(outCh) = SECUREC_EOF; \ + } \ +} SECUREC_WHILE_ZERO + +#define SECUREC_UN_GET_CHAR(stream) do { \ + if ((stream)->cur > (stream)->base) { \ + (stream)->cur -= sizeof(SecChar); \ + (stream)->count += sizeof(SecChar); \ + } \ +} SECUREC_WHILE_ZERO + +/* Convert wchar_t to int and then to unsigned int to keep data clearing warning */ +#define SECUREC_TO_LOWERCASE(chr) ((int)((unsigned int)(int)(chr) | (unsigned int)('a' - 'A'))) + +/* Record a flag for each bit */ +#define SECUREC_BRACKET_INDEX(x) ((unsigned int)(x) >> 3U) +#define SECUREC_BRACKET_VALUE(x) ((unsigned char)(1U << ((unsigned int)(x) & 7U))) +#if SECUREC_IN_KERNEL +#define SECUREC_CONVERT_IS_UNSIGNED(conv) ((conv) == 'x' || (conv) == 'o' || (conv) == 'u') +#endif + +/* + * Set char in %[xxx] into table, only supports wide characters with a maximum length of two bytes + */ +SECUREC_INLINE void SecBracketSetBit(unsigned char *table, SecUnsignedChar ch) +{ + unsigned int tableIndex = SECUREC_BRACKET_INDEX(((unsigned int)(int)ch & SECUREC_BRACKET_CHAR_MASK)); + unsigned int tableValue = SECUREC_BRACKET_VALUE(((unsigned int)(int)ch & SECUREC_BRACKET_CHAR_MASK)); + /* Do not use |= optimize this code, it will cause compiling warning */ + table[tableIndex] = (unsigned char)(table[tableIndex] | tableValue); +} + +SECUREC_INLINE void SecBracketSetBitRange(unsigned char *table, SecUnsignedChar startCh, SecUnsignedChar endCh) +{ + SecUnsignedChar expCh; + /* %[a-z] %[a-a] Format %[a-\xff] end is 0xFF, condition (expCh <= endChar) cause dead loop */ + for (expCh = startCh; expCh < endCh; ++expCh) { + SecBracketSetBit(table, expCh); + } + SecBracketSetBit(table, endCh); +} +/* + * Determine whether the expression can be satisfied + */ +SECUREC_INLINE int SecCanInputForBracket(int convChr, SecInt ch, const SecBracketTable *bracketTable) +{ + unsigned int tableIndex = SECUREC_BRACKET_INDEX(((unsigned int)(int)ch & SECUREC_BRACKET_CHAR_MASK)); + unsigned int tableValue = SECUREC_BRACKET_VALUE(((unsigned int)(int)ch & SECUREC_BRACKET_CHAR_MASK)); +#ifdef SECUREC_FOR_WCHAR + if (((unsigned int)(int)ch & (~(SECUREC_BRACKET_CHAR_MASK))) != 0) { + /* The value of the wide character exceeds the size of two bytes */ + return 0; + } + return (int)(convChr == SECUREC_BRACE && + (((unsigned int)bracketTable->table[tableIndex] ^ (unsigned int)bracketTable->mask) & tableValue) != 0); +#else + return (int)(convChr == SECUREC_BRACE && + (((unsigned int)bracketTable->table[tableIndex] ^ (unsigned int)bracketTable->mask) & tableValue) != 0); +#endif +} + +/* + * String input ends when blank character is encountered + */ +SECUREC_INLINE int SecCanInputString(int convChr, SecInt ch) +{ + return (int)(convChr == 's' && + (!(ch >= SECUREC_CHAR('\t') && ch <= SECUREC_CHAR('\r')) && ch != SECUREC_CHAR(' '))); +} + +/* + * Can input a character when format is %c + */ +SECUREC_INLINE int SecCanInputCharacter(int convChr) +{ + return (int)(convChr == 'c'); +} + +/* + * Determine if it is a 64-bit pointer function + * Return 0 is not ,1 is 64bit pointer + */ +SECUREC_INLINE int SecNumberArgType(size_t sizeOfVoidStar) +{ + /* Point size is 4 or 8 , Under the 64 bit system, the value not 0 */ + /* To clear e778 */ + if ((sizeOfVoidStar & sizeof(SecInt64)) != 0) { + return 1; + } + return 0; +} +SECUREC_INLINE int SecIsDigit(SecInt ch); +SECUREC_INLINE int SecIsXdigit(SecInt ch); +SECUREC_INLINE int SecIsSpace(SecInt ch); +SECUREC_INLINE SecInt SecSkipSpaceChar(SecFileStream *stream, int *counter); +SECUREC_INLINE SecInt SecGetChar(SecFileStream *stream, int *counter); +SECUREC_INLINE void SecUnGetChar(SecInt ch, SecFileStream *stream, int *counter); + +#if SECUREC_ENABLE_SCANF_FLOAT + +/* + * Convert a floating point string to a floating point number + */ +SECUREC_INLINE int SecAssignNarrowFloat(const char *floatStr, const SecScanSpec *spec) +{ + char *endPtr = NULL; + double d; +#if SECUREC_SUPPORT_STRTOLD + if (spec->numberWidth == SECUREC_NUM_WIDTH_LONG_LONG) { + long double d2 = strtold(floatStr, &endPtr); + if (endPtr == floatStr) { + return -1; + } + *(long double UNALIGNED *)(spec->argPtr) = d2; + return 0; + } +#endif + d = strtod(floatStr, &endPtr); + /* cannot detect if endPtr points to the end of floatStr,because strtod handles only two characters for 1.E */ + if (endPtr == floatStr) { + return -1; + } + if (spec->numberWidth > SECUREC_NUM_WIDTH_INT) { + *(double UNALIGNED *)(spec->argPtr) = (double)d; + } else { + *(float UNALIGNED *)(spec->argPtr) = (float)d; + } + return 0; +} + +#ifdef SECUREC_FOR_WCHAR +/* + * Convert a floating point wchar string to a floating point number + * Success ret 0 + */ +SECUREC_INLINE int SecAssignWideFloat(const SecFloatSpec *floatSpec, const SecScanSpec *spec) +{ + int retVal; + /* Convert float string */ + size_t mbsLen; + size_t tempFloatStrLen = (size_t)(floatSpec->floatStrUsedLen + 1) * sizeof(wchar_t); + char *tempFloatStr = (char *)SECUREC_MALLOC(tempFloatStrLen); + if (tempFloatStr == NULL) { + return -1; + } + tempFloatStr[0] = '\0'; + SECUREC_MASK_MSVC_CRT_WARNING + mbsLen = wcstombs(tempFloatStr, floatSpec->floatStr, tempFloatStrLen - 1); + SECUREC_END_MASK_MSVC_CRT_WARNING + /* This condition must satisfy mbsLen is not -1 */ + if (mbsLen >= tempFloatStrLen) { + SECUREC_FREE(tempFloatStr); + return -1; + } + tempFloatStr[mbsLen] = '\0'; + retVal = SecAssignNarrowFloat(tempFloatStr, spec); + SECUREC_FREE(tempFloatStr); + return retVal; +} +#endif + +SECUREC_INLINE int SecAssignFloat(const SecFloatSpec *floatSpec, const SecScanSpec *spec) +{ +#ifdef SECUREC_FOR_WCHAR + return SecAssignWideFloat(floatSpec, spec); +#else + return SecAssignNarrowFloat(floatSpec->floatStr, spec); +#endif +} + +/* + * Init SecFloatSpec before parse format + */ +SECUREC_INLINE void SecInitFloatSpec(SecFloatSpec *floatSpec) +{ + floatSpec->floatStr = floatSpec->buffer; + floatSpec->allocatedFloatStr = NULL; + floatSpec->floatStrTotalLen = sizeof(floatSpec->buffer) / sizeof(floatSpec->buffer[0]); + floatSpec->floatStrUsedLen = 0; +} + +SECUREC_INLINE void SecFreeFloatSpec(SecFloatSpec *floatSpec, int *doneCount) +{ + /* 2014.3.6 add, clear the stack data */ + if (memset_s(floatSpec->buffer, sizeof(floatSpec->buffer), 0, sizeof(floatSpec->buffer)) != EOK) { + *doneCount = 0; /* This code just to meet the coding requirements */ + } + /* The pFloatStr can be alloced in SecExtendFloatLen function, clear and free it */ + if (floatSpec->allocatedFloatStr != NULL) { + size_t bufferSize = floatSpec->floatStrTotalLen * sizeof(SecChar); + if (memset_s(floatSpec->allocatedFloatStr, bufferSize, 0, bufferSize) != EOK) { + *doneCount = 0; /* This code just to meet the coding requirements */ + } + SECUREC_FREE(floatSpec->allocatedFloatStr); + floatSpec->allocatedFloatStr = NULL; + floatSpec->floatStr = NULL; + } +} + +/* + * Splice floating point string + * Return 0 OK + */ +SECUREC_INLINE int SecExtendFloatLen(SecFloatSpec *floatSpec) +{ + if (floatSpec->floatStrUsedLen >= floatSpec->floatStrTotalLen) { + /* Buffer size is len x sizeof(SecChar) */ + size_t oriSize = floatSpec->floatStrTotalLen * sizeof(SecChar); + /* Add one character to clear tool warning */ + size_t nextSize = (oriSize * 2) + sizeof(SecChar); /* Multiply 2 to extend buffer size */ + + /* Prevents integer overflow, the maximum length of SECUREC_MAX_WIDTH_LEN is enough */ + if (nextSize <= (size_t)SECUREC_MAX_WIDTH_LEN) { + void *nextBuffer = (void *)SECUREC_MALLOC(nextSize); + if (nextBuffer == NULL) { + return -1; + } + if (memcpy_s(nextBuffer, nextSize, floatSpec->floatStr, oriSize) != EOK) { + SECUREC_FREE(nextBuffer); /* This is a dead code, just to meet the coding requirements */ + return -1; + } + /* Clear old buffer memory */ + if (memset_s(floatSpec->floatStr, oriSize, 0, oriSize) != EOK) { + SECUREC_FREE(nextBuffer); /* This is a dead code, just to meet the coding requirements */ + return -1; + } + /* Free old allocated buffer */ + if (floatSpec->allocatedFloatStr != NULL) { + SECUREC_FREE(floatSpec->allocatedFloatStr); + } + floatSpec->allocatedFloatStr = (SecChar *)(nextBuffer); /* Use to clear free on stack warning */ + floatSpec->floatStr = (SecChar *)(nextBuffer); + floatSpec->floatStrTotalLen = nextSize / sizeof(SecChar); /* Get buffer total len in character */ + return 0; + } + return -1; /* Next size is beyond max */ + } + return 0; +} + +/* Do not use localeconv()->decimal_pointif only support '.' */ +SECUREC_INLINE int SecIsFloatDecimal(SecChar ch) +{ + return (int)(ch == SECUREC_CHAR('.')); +} + +SECUREC_INLINE int SecInputFloatSign(SecFileStream *stream, SecScanSpec *spec, SecFloatSpec *floatSpec) +{ + if (!SECUREC_FILED_WIDTH_ENOUGH(spec)) { + return 0; + } + spec->ch = SecGetChar(stream, &(spec->charCount)); + if (spec->ch == SECUREC_CHAR('+') || spec->ch == SECUREC_CHAR('-')) { + SECUREC_FILED_WIDTH_DEC(spec); /* Make sure the count after un get char is correct */ + if (spec->ch == SECUREC_CHAR('-')) { + floatSpec->floatStr[floatSpec->floatStrUsedLen] = SECUREC_CHAR('-'); + ++floatSpec->floatStrUsedLen; + if (SecExtendFloatLen(floatSpec) != 0) { + return -1; + } + } + } else { + SecUnGetChar(spec->ch, stream, &(spec->charCount)); + } + return 0; +} + +SECUREC_INLINE int SecInputFloatDigit(SecFileStream *stream, SecScanSpec *spec, SecFloatSpec *floatSpec) +{ + /* Now get integral part */ + while (SECUREC_FILED_WIDTH_ENOUGH(spec)) { + spec->ch = SecGetChar(stream, &(spec->charCount)); + if (SecIsDigit(spec->ch) == 0) { + SecUnGetChar(spec->ch, stream, &(spec->charCount)); + return 0; + } + SECUREC_FILED_WIDTH_DEC(spec); /* Must be behind un get char, otherwise the logic is incorrect */ + spec->numberState = SECUREC_NUMBER_STATE_STARTED; + floatSpec->floatStr[floatSpec->floatStrUsedLen] = (SecChar)spec->ch; + ++floatSpec->floatStrUsedLen; + if (SecExtendFloatLen(floatSpec) != 0) { + return -1; + } + } + return 0; +} + +/* +* Scan value of exponent. +* Return 0 OK +*/ +SECUREC_INLINE int SecInputFloatE(SecFileStream *stream, SecScanSpec *spec, SecFloatSpec *floatSpec) +{ + if (SecInputFloatSign(stream, spec, floatSpec) == -1) { + return -1; + } + if (SecInputFloatDigit(stream, spec, floatSpec) != 0) { + return -1; + } + return 0; +} + +SECUREC_INLINE int SecInputFloatFractional(SecFileStream *stream, SecScanSpec *spec, SecFloatSpec *floatSpec) +{ + if (SECUREC_FILED_WIDTH_ENOUGH(spec)) { + spec->ch = SecGetChar(stream, &(spec->charCount)); + if (SecIsFloatDecimal((SecChar)spec->ch) == 0) { + SecUnGetChar(spec->ch, stream, &(spec->charCount)); + return 0; + } + SECUREC_FILED_WIDTH_DEC(spec); /* Must be behind un get char, otherwise the logic is incorrect */ + /* Now check for decimal */ + floatSpec->floatStr[floatSpec->floatStrUsedLen] = (SecChar)spec->ch; + ++floatSpec->floatStrUsedLen; + if (SecExtendFloatLen(floatSpec) != 0) { + return -1; + } + if (SecInputFloatDigit(stream, spec, floatSpec) != 0) { + return -1; + } + } + return 0; +} + +SECUREC_INLINE int SecInputFloatExponent(SecFileStream *stream, SecScanSpec *spec, SecFloatSpec *floatSpec) +{ + /* Now get exponent part */ + if (spec->numberState == SECUREC_NUMBER_STATE_STARTED && SECUREC_FILED_WIDTH_ENOUGH(spec)) { + spec->ch = SecGetChar(stream, &(spec->charCount)); + if (spec->ch != SECUREC_CHAR('e') && spec->ch != SECUREC_CHAR('E')) { + SecUnGetChar(spec->ch, stream, &(spec->charCount)); + return 0; + } + SECUREC_FILED_WIDTH_DEC(spec); /* Must be behind un get char, otherwise the logic is incorrect */ + floatSpec->floatStr[floatSpec->floatStrUsedLen] = SECUREC_CHAR('e'); + ++floatSpec->floatStrUsedLen; + if (SecExtendFloatLen(floatSpec) != 0) { + return -1; + } + if (SecInputFloatE(stream, spec, floatSpec) != 0) { + return -1; + } + } + return 0; +} + +/* +* Scan %f. +* Return 0 OK +*/ +SECUREC_INLINE int SecInputFloat(SecFileStream *stream, SecScanSpec *spec, SecFloatSpec *floatSpec) +{ + floatSpec->floatStrUsedLen = 0; + + /* The following code sequence is strict */ + if (SecInputFloatSign(stream, spec, floatSpec) != 0) { + return -1; + } + if (SecInputFloatDigit(stream, spec, floatSpec) != 0) { + return -1; + } + if (SecInputFloatFractional(stream, spec, floatSpec) != 0) { + return -1; + } + if (SecInputFloatExponent(stream, spec, floatSpec) != 0) { + return -1; + } + + /* Make sure have a string terminator, buffer is large enough */ + floatSpec->floatStr[floatSpec->floatStrUsedLen] = SECUREC_CHAR('\0'); + if (spec->numberState == SECUREC_NUMBER_STATE_STARTED) { + return 0; + } + return -1; +} +#endif + +#if (!defined(SECUREC_FOR_WCHAR) && SECUREC_HAVE_WCHART && SECUREC_HAVE_MBTOWC) || \ + (!defined(SECUREC_FOR_WCHAR) && defined(SECUREC_COMPATIBLE_VERSION)) +/* only multi-bytes string need isleadbyte() function */ +SECUREC_INLINE int SecIsLeadByte(SecInt ch) +{ + unsigned int c = (unsigned int)ch; +#if !(defined(_MSC_VER) || defined(_INC_WCTYPE)) + return (int)(c & 0x80U); /* Use bitwise operation to check if the most significant bit is 1 */ +#else + return (int)isleadbyte((int)(c & 0xffU)); /* Use bitwise operations to limit character values to valid ranges */ +#endif +} +#endif + +/* + * Parsing whether it is a wide character + */ +SECUREC_INLINE void SecUpdateWcharFlagByType(SecUnsignedChar ch, SecScanSpec *spec) +{ + if (spec->isWCharOrLong != 0) { + /* Wide character identifiers have been explicitly set by l or h flag */ + return; + } + + /* Set default flag */ +#if defined(SECUREC_FOR_WCHAR) && defined(SECUREC_COMPATIBLE_WIN_FORMAT) + spec->isWCharOrLong = 1; /* On windows wide char version %c %s %[ is wide char */ +#else + spec->isWCharOrLong = -1; /* On linux all version %c %s %[ is multi char */ +#endif + + if (ch == SECUREC_CHAR('C') || ch == SECUREC_CHAR('S')) { +#if defined(SECUREC_FOR_WCHAR) && defined(SECUREC_COMPATIBLE_WIN_FORMAT) + spec->isWCharOrLong = -1; /* On windows wide char version %C %S is multi char */ +#else + spec->isWCharOrLong = 1; /* On linux all version %C %S is wide char */ +#endif + } + + return; +} +/* + * Decode %l %ll + */ +SECUREC_INLINE void SecDecodeScanQualifierL(const SecUnsignedChar **format, SecScanSpec *spec) +{ + const SecUnsignedChar *fmt = *format; + if (*(fmt + 1) == SECUREC_CHAR('l')) { + spec->numberArgType = 1; + spec->numberWidth = SECUREC_NUM_WIDTH_LONG_LONG; + ++fmt; + } else { + spec->numberWidth = SECUREC_NUM_WIDTH_LONG; +#if defined(SECUREC_ON_64BITS) && !(defined(SECUREC_COMPATIBLE_WIN_FORMAT)) + /* On window 64 system sizeof long is 32bit */ + spec->numberArgType = 1; +#endif + spec->isWCharOrLong = 1; + } + *format = fmt; +} + +/* + * Decode %I %I43 %I64 %Id %Ii %Io ... + * Set finishFlag to 1 finish Flag + */ +SECUREC_INLINE void SecDecodeScanQualifierI(const SecUnsignedChar **format, SecScanSpec *spec, int *finishFlag) +{ + const SecUnsignedChar *fmt = *format; + if ((*(fmt + 1) == SECUREC_CHAR('6')) && + (*(fmt + 2) == SECUREC_CHAR('4'))) { /* Offset 2 for I64 */ + spec->numberArgType = 1; + *format = *format + 2; /* Add 2 to skip I64 point to '4' next loop will inc */ + } else if ((*(fmt + 1) == SECUREC_CHAR('3')) && + (*(fmt + 2) == SECUREC_CHAR('2'))) { /* Offset 2 for I32 */ + *format = *format + 2; /* Add 2 to skip I32 point to '2' next loop will inc */ + } else if ((*(fmt + 1) == SECUREC_CHAR('d')) || + (*(fmt + 1) == SECUREC_CHAR('i')) || + (*(fmt + 1) == SECUREC_CHAR('o')) || + (*(fmt + 1) == SECUREC_CHAR('x')) || + (*(fmt + 1) == SECUREC_CHAR('X'))) { + spec->numberArgType = SecNumberArgType(sizeof(void *)); + } else { + /* For %I */ + spec->numberArgType = SecNumberArgType(sizeof(void *)); + *finishFlag = 1; + } +} + +SECUREC_INLINE int SecDecodeScanWidth(const SecUnsignedChar **format, SecScanSpec *spec) +{ + const SecUnsignedChar *fmt = *format; + while (SecIsDigit((SecInt)(int)(*fmt)) != 0) { + spec->widthSet = 1; + if (SECUREC_MUL_TEN_ADD_BEYOND_MAX(spec->width)) { + return -1; + } + spec->width = (int)SECUREC_MUL_TEN((unsigned int)spec->width) + (unsigned char)(*fmt - SECUREC_CHAR('0')); + ++fmt; + } + *format = fmt; + return 0; +} + +/* + * Init default flags for each format. do not init ch this variable is context-dependent + */ +SECUREC_INLINE void SecSetDefaultScanSpec(SecScanSpec *spec) +{ + /* The ch and charCount member variables cannot be initialized here */ + spec->argPtr = NULL; + spec->arrayWidth = 0; + spec->number64 = 0; + spec->number = 0; + spec->numberWidth = SECUREC_NUM_WIDTH_INT; /* 0 = SHORT, 1 = int, > 1 long or L_DOUBLE */ + spec->numberArgType = 0; /* 1 for 64-bit integer, 0 otherwise */ + spec->width = 0; + spec->widthSet = 0; + spec->convChr = 0; + spec->oriConvChr = 0; + spec->isWCharOrLong = 0; + spec->suppress = 0; +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && !(defined(SECUREC_ON_UNIX))) + spec->beyondMax = 0; +#endif + spec->negative = 0; + spec->numberState = SECUREC_NUMBER_STATE_DEFAULT; +} + +/* + * Decode qualifier %I %L %h ... + * Set finishFlag to 1 finish Flag + */ +SECUREC_INLINE void SecDecodeScanQualifier(const SecUnsignedChar **format, SecScanSpec *spec, int *finishFlag) +{ + switch (**format) { + case SECUREC_CHAR('F'): /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('N'): + break; + case SECUREC_CHAR('h'): + --spec->numberWidth; /* The h for SHORT , hh for CHAR */ + spec->isWCharOrLong = -1; + break; +#ifdef SECUREC_COMPATIBLE_LINUX_FORMAT + case SECUREC_CHAR('j'): + spec->numberWidth = SECUREC_NUM_WIDTH_LONG_LONG; /* For intmax_t or uintmax_t */ + spec->numberArgType = 1; + break; + case SECUREC_CHAR('t'): /* fall-through */ /* FALLTHRU */ +#endif +#if SECUREC_IN_KERNEL + case SECUREC_CHAR('Z'): /* fall-through */ /* FALLTHRU */ +#endif + case SECUREC_CHAR('z'): +#ifdef SECUREC_ON_64BITS + spec->numberWidth = SECUREC_NUM_WIDTH_LONG_LONG; + spec->numberArgType = 1; +#else + spec->numberWidth = SECUREC_NUM_WIDTH_LONG; +#endif + break; + case SECUREC_CHAR('L'): /* For long double */ /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('q'): + spec->numberWidth = SECUREC_NUM_WIDTH_LONG_LONG; + spec->numberArgType = 1; + break; + case SECUREC_CHAR('l'): + SecDecodeScanQualifierL(format, spec); + break; + case SECUREC_CHAR('w'): + spec->isWCharOrLong = 1; + break; + case SECUREC_CHAR('*'): + spec->suppress = 1; + break; + case SECUREC_CHAR('I'): + SecDecodeScanQualifierI(format, spec, finishFlag); + break; + default: + *finishFlag = 1; + break; + } +} +/* + * Decode width and qualifier in format + */ +SECUREC_INLINE int SecDecodeScanFlag(const SecUnsignedChar **format, SecScanSpec *spec) +{ + const SecUnsignedChar *fmt = *format; + int finishFlag = 0; + + do { + ++fmt; /* First skip % , next seek fmt */ + /* May %*6d , so put it inside the loop */ + if (SecDecodeScanWidth(&fmt, spec) != 0) { + return -1; + } + SecDecodeScanQualifier(&fmt, spec, &finishFlag); + } while (finishFlag == 0); + *format = fmt; + return 0; +} + +/* + * Judging whether a zeroing buffer is needed according to different formats + */ +SECUREC_INLINE int SecDecodeClearFormat(const SecUnsignedChar *format, int *convChr) +{ + const SecUnsignedChar *fmt = format; + /* To lowercase */ + int ch = SECUREC_TO_LOWERCASE(*fmt); + if (!(ch == 'c' || ch == 's' || ch == SECUREC_BRACE)) { + return -1; /* First argument is not a string type */ + } + if (ch == SECUREC_BRACE) { +#if !(defined(SECUREC_COMPATIBLE_WIN_FORMAT)) + if (*fmt == SECUREC_CHAR('{')) { + return -1; + } +#endif + ++fmt; + if (*fmt == SECUREC_CHAR('^')) { + ++fmt; + } + if (*fmt == SECUREC_CHAR(']')) { + ++fmt; + } + while (*fmt != SECUREC_CHAR('\0') && *fmt != SECUREC_CHAR(']')) { + ++fmt; + } + if (*fmt == SECUREC_CHAR('\0')) { + return -1; /* Trunc'd format string */ + } + } + *convChr = ch; + return 0; +} + +/* + * Add L'\0' for wchar string , add '\0' for char string + */ +SECUREC_INLINE void SecAddEndingZero(void *ptr, const SecScanSpec *spec) +{ + if (spec->suppress == 0) { + *(char *)ptr = '\0'; +#if SECUREC_HAVE_WCHART + if (spec->isWCharOrLong > 0) { + *(wchar_t UNALIGNED *)ptr = L'\0'; + } +#endif + } +} + +SECUREC_INLINE void SecDecodeClearArg(SecScanSpec *spec, va_list argList) +{ + va_list argListSave; /* Backup for argList value, this variable don't need initialized */ + (void)SECUREC_MEMSET_FUNC_OPT(&argListSave, 0, sizeof(va_list)); /* To clear e530 argListSave not initialized */ +#if defined(va_copy) + va_copy(argListSave, argList); +#elif defined(__va_copy) /* For vxworks */ + __va_copy(argListSave, argList); +#else + argListSave = argList; +#endif + spec->argPtr = (void *)va_arg(argListSave, void *); + /* Get the next argument, size of the array in characters */ + /* Use 0xffffffffUL mask to Support pass integer as array length */ + spec->arrayWidth = ((size_t)(va_arg(argListSave, size_t))) & 0xffffffffUL; + va_end(argListSave); + /* To clear e438 last value assigned not used , the compiler will optimize this code */ + (void)argListSave; +} + +#ifdef SECUREC_FOR_WCHAR +/* + * Clean up the first %s %c buffer to zero for wchar version + */ +void SecClearDestBufW(const wchar_t *buffer, const wchar_t *format, va_list argList) +#else +/* + * Clean up the first %s %c buffer to zero for char version + */ +void SecClearDestBuf(const char *buffer, const char *format, va_list argList) +#endif +{ + SecScanSpec spec; + int convChr = 0; + const SecUnsignedChar *fmt = (const SecUnsignedChar *)format; + + /* Find first % */ + while (*fmt != SECUREC_CHAR('\0') && *fmt != SECUREC_CHAR('%')) { + ++fmt; + } + if (*fmt == SECUREC_CHAR('\0')) { + return; + } + + SecSetDefaultScanSpec(&spec); + if (SecDecodeScanFlag(&fmt, &spec) != 0) { + return; + } + + /* Update wchar flag for %S %C */ + SecUpdateWcharFlagByType(*fmt, &spec); + if (spec.suppress != 0) { + return; + } + + if (SecDecodeClearFormat(fmt, &convChr) != 0) { + return; + } + + if (*buffer != SECUREC_CHAR('\0') && convChr != 's') { + /* + * When buffer not empty just clear %s. + * Example call sscanf by argment of (" \n", "%s", s, sizeof(s)) + */ + return; + } + + SecDecodeClearArg(&spec, argList); + /* There is no need to judge the upper limit */ + if (spec.arrayWidth == 0 || spec.argPtr == NULL) { + return; + } + /* Clear one char */ + SecAddEndingZero(spec.argPtr, &spec); + return; +} + +/* + * Assign number to output buffer + */ +SECUREC_INLINE void SecAssignNumber(const SecScanSpec *spec) +{ + void *argPtr = spec->argPtr; + if (spec->numberArgType != 0) { +#if defined(SECUREC_VXWORKS_PLATFORM) +#if defined(SECUREC_VXWORKS_PLATFORM_COMP) + *(SecInt64 UNALIGNED *)argPtr = (SecInt64)(spec->number64); +#else + /* Take number64 as unsigned number unsigned to int clear Compile warning */ + *(SecInt64 UNALIGNED *)argPtr = *(SecUnsignedInt64 *)(&(spec->number64)); +#endif +#else + /* Take number64 as unsigned number */ + *(SecInt64 UNALIGNED *)argPtr = (SecInt64)(spec->number64); +#endif + return; + } + if (spec->numberWidth > SECUREC_NUM_WIDTH_INT) { + /* Take number as unsigned number */ + *(long UNALIGNED *)argPtr = (long)(spec->number); + } else if (spec->numberWidth == SECUREC_NUM_WIDTH_INT) { + *(int UNALIGNED *)argPtr = (int)(spec->number); + } else if (spec->numberWidth == SECUREC_NUM_WIDTH_SHORT) { + /* Take number as unsigned number */ + *(short UNALIGNED *)argPtr = (short)(spec->number); + } else { /* < 0 for hh format modifier */ + /* Take number as unsigned number */ + *(char UNALIGNED *)argPtr = (char)(spec->number); + } +} + +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && !(defined(SECUREC_ON_UNIX))) +/* + * Judge the long bit width + */ +SECUREC_INLINE int SecIsLongBitEqual(int bitNum) +{ + return (int)((unsigned int)bitNum == SECUREC_LONG_BIT_NUM); +} +#endif + +/* + * Convert hexadecimal characters to decimal value + */ +SECUREC_INLINE int SecHexValueOfChar(SecInt ch) +{ + /* Use isdigit Causing tool false alarms */ + return (int)((ch >= '0' && ch <= '9') ? ((unsigned char)ch - '0') : + ((((unsigned char)ch | (unsigned char)('a' - 'A')) - ('a')) + 10)); /* Adding 10 is to hex value */ +} + +/* + * Parse decimal character to integer for 32bit . + */ +static void SecDecodeNumberDecimal(SecScanSpec *spec) +{ +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && !(defined(SECUREC_ON_UNIX))) + unsigned long decimalEdge = SECUREC_MAX_32BITS_VALUE_DIV_TEN; +#ifdef SECUREC_ON_64BITS + if (SecIsLongBitEqual(SECUREC_LP64_BIT_WIDTH) != 0) { + decimalEdge = (unsigned long)SECUREC_MAX_64BITS_VALUE_DIV_TEN; + } +#endif + if (spec->number > decimalEdge) { + spec->beyondMax = 1; + } +#endif + spec->number = SECUREC_MUL_TEN(spec->number); +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && !(defined(SECUREC_ON_UNIX))) + if (spec->number == SECUREC_MUL_TEN(decimalEdge)) { + /* This code is specially converted to unsigned long type for compatibility */ + SecUnsignedInt64 number64As = (unsigned long)SECUREC_MAX_64BITS_VALUE - spec->number; + if (number64As < (SecUnsignedInt64)(SecUnsignedInt)spec->ch - (SecUnsignedInt)SECUREC_CHAR('0')) { + spec->beyondMax = 1; + } + } +#endif + spec->number += ((unsigned long)(SecUnsignedInt)spec->ch - (SecUnsignedInt)SECUREC_CHAR('0')); +} + +/* + * Parse Hex character to integer for 32bit . + */ +static void SecDecodeNumberHex(SecScanSpec *spec) +{ +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && !(defined(SECUREC_ON_UNIX))) + if (SECUREC_LONG_HEX_BEYOND_MAX(spec->number)) { + spec->beyondMax = 1; + } +#endif + spec->number = SECUREC_MUL_SIXTEEN(spec->number); + spec->number += (unsigned long)(unsigned int)SecHexValueOfChar(spec->ch); +} + +/* + * Parse Octal character to integer for 32bit . + */ +static void SecDecodeNumberOctal(SecScanSpec *spec) +{ +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && !(defined(SECUREC_ON_UNIX))) + if (SECUREC_LONG_OCTAL_BEYOND_MAX(spec->number)) { + spec->beyondMax = 1; + } +#endif + spec->number = SECUREC_MUL_EIGHT(spec->number); + spec->number += ((unsigned long)(SecUnsignedInt)spec->ch - (SecUnsignedInt)SECUREC_CHAR('0')); +} + +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && !(defined(SECUREC_ON_UNIX))) +/* Compatible with integer negative values other than int */ +SECUREC_INLINE void SecFinishNumberNegativeOther(SecScanSpec *spec) +{ + if (SECUREC_CONVERT_IS_SIGNED(spec->oriConvChr)) { + if (spec->number > SECUREC_MIN_LONG_NEG_VALUE) { + spec->number = SECUREC_MIN_LONG_NEG_VALUE; + } else { + spec->number = (unsigned long)(0U - spec->number); /* Wrap with unsigned long numbers */ + } + if (spec->beyondMax != 0) { + if (spec->numberWidth < SECUREC_NUM_WIDTH_INT) { + spec->number = 0; + } + if (spec->numberWidth == SECUREC_NUM_WIDTH_LONG) { + spec->number = SECUREC_MIN_LONG_NEG_VALUE; + } + } + } else { /* For o, u, x, X, p */ + spec->number = (unsigned long)(0U - spec->number); /* Wrap with unsigned long numbers */ + if (spec->beyondMax != 0) { + spec->number = (unsigned long)SECUREC_MAX_64BITS_VALUE; + } + } +} +/* Compatible processing of integer negative numbers */ +SECUREC_INLINE void SecFinishNumberNegativeInt(SecScanSpec *spec) +{ + if (SECUREC_CONVERT_IS_SIGNED(spec->oriConvChr)) { +#ifdef SECUREC_ON_64BITS + if (SecIsLongBitEqual(SECUREC_LP64_BIT_WIDTH) != 0) { + if ((spec->number > SECUREC_MIN_64BITS_NEG_VALUE)) { + spec->number = 0; + } else { + spec->number = (unsigned int)(0U - (unsigned int)spec->number); /* Wrap with unsigned int numbers */ + } + } +#else + if (SecIsLongBitEqual(SECUREC_LP32_BIT_WIDTH) != 0) { + if ((spec->number > SECUREC_MIN_32BITS_NEG_VALUE)) { + spec->number = SECUREC_MIN_32BITS_NEG_VALUE; + } else { + spec->number = (unsigned int)(0U - (unsigned int)spec->number); /* Wrap with unsigned int numbers */ + } + } +#endif + if (spec->beyondMax != 0) { +#ifdef SECUREC_ON_64BITS + if (SecIsLongBitEqual(SECUREC_LP64_BIT_WIDTH) != 0) { + spec->number = 0; + } +#else + if (SecIsLongBitEqual(SECUREC_LP32_BIT_WIDTH) != 0) { + spec->number = SECUREC_MIN_32BITS_NEG_VALUE; + } +#endif + } + } else { /* For o, u, x, X ,p */ +#ifdef SECUREC_ON_64BITS + if (spec->number > SECUREC_MAX_32BITS_VALUE_INC) { + spec->number = SECUREC_MAX_32BITS_VALUE; + } else { + spec->number = (unsigned int)(0U - (unsigned int)spec->number); /* Wrap with unsigned int numbers */ + } +#else + spec->number = (unsigned int)(0U - (unsigned int)spec->number); /* Wrap with unsigned int numbers */ +#endif + if (spec->beyondMax != 0) { + spec->number = (unsigned long)SECUREC_MAX_64BITS_VALUE; + } + } +} + +/* Compatible with integer positive values other than int */ +SECUREC_INLINE void SecFinishNumberPositiveOther(SecScanSpec *spec) +{ + if (SECUREC_CONVERT_IS_SIGNED(spec->oriConvChr)) { + if (spec->number > SECUREC_MAX_LONG_POS_VALUE) { + spec->number = SECUREC_MAX_LONG_POS_VALUE; + } + if ((spec->beyondMax != 0 && spec->numberWidth < SECUREC_NUM_WIDTH_INT)) { + spec->number = (unsigned long)SECUREC_MAX_64BITS_VALUE; + } + if (spec->beyondMax != 0 && spec->numberWidth == SECUREC_NUM_WIDTH_LONG) { + spec->number = SECUREC_MAX_LONG_POS_VALUE; + } + } else { + if (spec->beyondMax != 0) { + spec->number = (unsigned long)SECUREC_MAX_64BITS_VALUE; + } + } +} + +/* Compatible processing of integer positive numbers */ +SECUREC_INLINE void SecFinishNumberPositiveInt(SecScanSpec *spec) +{ + if (SECUREC_CONVERT_IS_SIGNED(spec->oriConvChr)) { +#ifdef SECUREC_ON_64BITS + if (SecIsLongBitEqual(SECUREC_LP64_BIT_WIDTH) != 0) { + if (spec->number > SECUREC_MAX_64BITS_POS_VALUE) { + spec->number = (unsigned long)SECUREC_MAX_64BITS_VALUE; + } + } + if (spec->beyondMax != 0 && SecIsLongBitEqual(SECUREC_LP64_BIT_WIDTH) != 0) { + spec->number = (unsigned long)SECUREC_MAX_64BITS_VALUE; + } +#else + if (SecIsLongBitEqual(SECUREC_LP32_BIT_WIDTH) != 0) { + if (spec->number > SECUREC_MAX_32BITS_POS_VALUE) { + spec->number = SECUREC_MAX_32BITS_POS_VALUE; + } + } + if (spec->beyondMax != 0 && SecIsLongBitEqual(SECUREC_LP32_BIT_WIDTH) != 0) { + spec->number = SECUREC_MAX_32BITS_POS_VALUE; + } +#endif + } else { /* For o,u,x,X,p */ + if (spec->beyondMax != 0) { + spec->number = SECUREC_MAX_32BITS_VALUE; + } + } +} + +#endif + +/* + * Parse decimal character to integer for 64bit . + */ +static void SecDecodeNumber64Decimal(SecScanSpec *spec) +{ +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && !(defined(SECUREC_ON_UNIX))) + if (spec->number64 > SECUREC_MAX_64BITS_VALUE_DIV_TEN) { + spec->beyondMax = 1; + } +#endif + spec->number64 = SECUREC_MUL_TEN(spec->number64); +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && !(defined(SECUREC_ON_UNIX))) + if (spec->number64 == SECUREC_MAX_64BITS_VALUE_CUT_LAST_DIGIT) { + SecUnsignedInt64 number64As = (SecUnsignedInt64)SECUREC_MAX_64BITS_VALUE - spec->number64; + if (number64As < (SecUnsignedInt64)(SecUnsignedInt)spec->ch - (SecUnsignedInt)SECUREC_CHAR('0')) { + spec->beyondMax = 1; + } + } +#endif + spec->number64 += ((SecUnsignedInt64)(SecUnsignedInt)spec->ch - (SecUnsignedInt)SECUREC_CHAR('0')); +} + +/* + * Parse Hex character to integer for 64bit . + */ +static void SecDecodeNumber64Hex(SecScanSpec *spec) +{ +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && !(defined(SECUREC_ON_UNIX))) + if (SECUREC_QWORD_HEX_BEYOND_MAX(spec->number64)) { + spec->beyondMax = 1; + } +#endif + spec->number64 = SECUREC_MUL_SIXTEEN(spec->number64); + spec->number64 += (SecUnsignedInt64)(unsigned int)SecHexValueOfChar(spec->ch); +} + +/* + * Parse Octal character to integer for 64bit . + */ +static void SecDecodeNumber64Octal(SecScanSpec *spec) +{ +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && !(defined(SECUREC_ON_UNIX))) + if (SECUREC_QWORD_OCTAL_BEYOND_MAX(spec->number64)) { + spec->beyondMax = 1; + } +#endif + spec->number64 = SECUREC_MUL_EIGHT(spec->number64); + spec->number64 += ((SecUnsignedInt64)(SecUnsignedInt)spec->ch - (SecUnsignedInt)SECUREC_CHAR('0')); +} + +#define SECUREC_DECODE_NUMBER_FUNC_NUM 2 + +/* + * Parse 64-bit integer formatted input, return 0 when ch is a number. + */ +SECUREC_INLINE int SecDecodeNumber(SecScanSpec *spec) +{ + /* Function name cannot add address symbol, causing 546 alarm */ + static void (* const secDecodeNumberHex[SECUREC_DECODE_NUMBER_FUNC_NUM])(SecScanSpec *spec) = { + SecDecodeNumberHex, SecDecodeNumber64Hex + }; + static void (* const secDecodeNumberOctal[SECUREC_DECODE_NUMBER_FUNC_NUM])(SecScanSpec *spec) = { + SecDecodeNumberOctal, SecDecodeNumber64Octal + }; + static void (* const secDecodeNumberDecimal[SECUREC_DECODE_NUMBER_FUNC_NUM])(SecScanSpec *spec) = { + SecDecodeNumberDecimal, SecDecodeNumber64Decimal + }; + if (spec->convChr == 'x' || spec->convChr == 'p') { + if (SecIsXdigit(spec->ch) != 0) { + (*secDecodeNumberHex[spec->numberArgType])(spec); + } else { + return -1; + } + return 0; + } + if (SecIsDigit(spec->ch) == 0) { + return -1; + } + if (spec->convChr == 'o') { + if (spec->ch < SECUREC_CHAR('8')) { /* Octal maximum limit '8' */ + (*secDecodeNumberOctal[spec->numberArgType])(spec); + } else { + return -1; + } + } else { /* The convChr is 'd' */ + (*secDecodeNumberDecimal[spec->numberArgType])(spec); + } + return 0; +} + +/* + * Complete the final 32-bit integer formatted input + */ +static void SecFinishNumber(SecScanSpec *spec) +{ +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && !(defined(SECUREC_ON_UNIX))) + if (spec->negative != 0) { + if (spec->numberWidth == SECUREC_NUM_WIDTH_INT) { + SecFinishNumberNegativeInt(spec); + } else { + SecFinishNumberNegativeOther(spec); + } + } else { + if (spec->numberWidth == SECUREC_NUM_WIDTH_INT) { + SecFinishNumberPositiveInt(spec); + } else { + SecFinishNumberPositiveOther(spec); + } + } +#else + if (spec->negative != 0) { +#if defined(__hpux) + if (spec->oriConvChr != 'p') { + spec->number = (unsigned long)(0U - spec->number); /* Wrap with unsigned long numbers */ + } +#else + spec->number = (unsigned long)(0U - spec->number); /* Wrap with unsigned long numbers */ +#endif + } +#endif + return; +} + +/* + * Complete the final 64-bit integer formatted input + */ +static void SecFinishNumber64(SecScanSpec *spec) +{ +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && !(defined(SECUREC_ON_UNIX))) + if (spec->negative != 0) { + if (SECUREC_CONVERT_IS_SIGNED(spec->oriConvChr)) { + if (spec->number64 > SECUREC_MIN_64BITS_NEG_VALUE) { + spec->number64 = SECUREC_MIN_64BITS_NEG_VALUE; + } else { + spec->number64 = (SecUnsignedInt64)(0U - spec->number64); /* Wrap with unsigned int64 numbers */ + } + if (spec->beyondMax != 0) { + spec->number64 = SECUREC_MIN_64BITS_NEG_VALUE; + } + } else { /* For o, u, x, X, p */ + spec->number64 = (SecUnsignedInt64)(0U - spec->number64); /* Wrap with unsigned int64 numbers */ + if (spec->beyondMax != 0) { + spec->number64 = SECUREC_MAX_64BITS_VALUE; + } + } + } else { + if (SECUREC_CONVERT_IS_SIGNED(spec->oriConvChr)) { + if (spec->number64 > SECUREC_MAX_64BITS_POS_VALUE) { + spec->number64 = SECUREC_MAX_64BITS_POS_VALUE; + } + if (spec->beyondMax != 0) { + spec->number64 = SECUREC_MAX_64BITS_POS_VALUE; + } + } else { + if (spec->beyondMax != 0) { + spec->number64 = SECUREC_MAX_64BITS_VALUE; + } + } + } +#else + if (spec->negative != 0) { +#if defined(__hpux) + if (spec->oriConvChr != 'p') { + spec->number64 = (SecUnsignedInt64)(0U - spec->number64); /* Wrap with unsigned int64 numbers */ + } +#else + spec->number64 = (SecUnsignedInt64)(0U - spec->number64); /* Wrap with unsigned int64 numbers */ +#endif + } +#endif + return; +} + +#if SECUREC_ENABLE_SCANF_FILE + +/* + * Adjust the pointer position of the file stream + */ +SECUREC_INLINE void SecSeekStream(SecFileStream *stream) +{ + if (stream->count == 0) { + if (feof(stream->pf) != 0) { + /* File pointer at the end of file, don't need to seek back */ + stream->base[0] = '\0'; + return; + } + } + /* Seek to original position, for file read, but nothing to input */ + if (fseek(stream->pf, stream->oriFilePos, SEEK_SET) != 0) { + /* Seek failed, ignore it */ + stream->oriFilePos = 0; + return; + } + + if (stream->fileRealRead > 0) { /* Do not seek without input data */ +#if defined(SECUREC_COMPATIBLE_WIN_FORMAT) + size_t residue = stream->fileRealRead % SECUREC_BUFFERED_BLOK_SIZE; + size_t loops; + for (loops = 0; loops < (stream->fileRealRead / SECUREC_BUFFERED_BLOK_SIZE); ++loops) { + if (fread(stream->base, (size_t)SECUREC_BUFFERED_BLOK_SIZE, (size_t)1, stream->pf) != (size_t)1) { + break; + } + } + if (residue != 0) { + long curFilePos; + if (fread(stream->base, residue, (size_t)1, stream->pf) != (size_t)1) { + return; + } + curFilePos = ftell(stream->pf); + if (curFilePos < stream->oriFilePos || + (size_t)(unsigned long)(curFilePos - stream->oriFilePos) < stream->fileRealRead) { + /* Try to remedy the problem */ + long adjustNum = (long)(stream->fileRealRead - (size_t)(unsigned long)(curFilePos - stream->oriFilePos)); + (void)fseek(stream->pf, adjustNum, SEEK_CUR); + } + } +#else + /* Seek from oriFilePos. Regardless of the integer sign problem, call scanf will not read very large data */ + if (fseek(stream->pf, (long)stream->fileRealRead, SEEK_CUR) != 0) { + /* Seek failed, ignore it */ + stream->oriFilePos = 0; + return; + } +#endif + } + return; +} + +/* + * Adjust the pointer position of the file stream and free memory + */ +SECUREC_INLINE void SecAdjustStream(SecFileStream *stream) +{ + if ((stream->flag & SECUREC_FILE_STREAM_FLAG) != 0 && stream->base != NULL) { + SecSeekStream(stream); + SECUREC_FREE(stream->base); + stream->base = NULL; + } + return; +} +#endif + +SECUREC_INLINE void SecSkipSpaceFormat(const SecUnsignedChar **format) +{ + const SecUnsignedChar *fmt = *format; + while (SecIsSpace((SecInt)(int)(*fmt)) != 0) { + ++fmt; + } + *format = fmt; +} + +#if !defined(SECUREC_FOR_WCHAR) && defined(SECUREC_COMPATIBLE_VERSION) +/* + * Handling multi-character characters + */ +SECUREC_INLINE int SecDecodeLeadByte(SecScanSpec *spec, const SecUnsignedChar **format, SecFileStream *stream) +{ +#if SECUREC_HAVE_MBTOWC + const SecUnsignedChar *fmt = *format; + int ch1 = (int)spec->ch; + int ch2 = SecGetChar(stream, &(spec->charCount)); + spec->ch = (SecInt)ch2; + if (*fmt == SECUREC_CHAR('\0') || (int)(*fmt) != ch2) { + /* in console mode, ungetc twice may cause problem */ + SecUnGetChar(ch2, stream, &(spec->charCount)); + SecUnGetChar(ch1, stream, &(spec->charCount)); + return -1; + } + ++fmt; + if ((unsigned int)MB_CUR_MAX >= SECUREC_UTF8_BOM_HEADER_SIZE && + (((unsigned char)ch1 & SECUREC_UTF8_LEAD_1ST) == SECUREC_UTF8_LEAD_1ST) && + (((unsigned char)ch2 & SECUREC_UTF8_LEAD_2ND) == SECUREC_UTF8_LEAD_2ND)) { + /* This char is very likely to be a UTF-8 char */ + wchar_t tempWChar; + char temp[SECUREC_MULTI_BYTE_MAX_LEN]; + int ch3 = (int)SecGetChar(stream, &(spec->charCount)); + spec->ch = (SecInt)ch3; + if (*fmt == SECUREC_CHAR('\0') || (int)(*fmt) != ch3) { + SecUnGetChar(ch3, stream, &(spec->charCount)); + return -1; + } + temp[0] = (char)ch1; + temp[1] = (char)ch2; /* 1 index of second character */ + temp[2] = (char)ch3; /* 2 index of third character */ + temp[3] = '\0'; /* 3 of string terminator position */ + if (mbtowc(&tempWChar, temp, sizeof(temp)) > 0) { + /* Succeed */ + ++fmt; + --spec->charCount; + } else { + SecUnGetChar(ch3, stream, &(spec->charCount)); + } + } + --spec->charCount; /* Only count as one character read */ + *format = fmt; + return 0; +#else + SecUnGetChar(spec->ch, stream, &(spec->charCount)); + (void)format; /* To clear e438 last value assigned not used , the compiler will optimize this code */ + return -1; +#endif +} + +SECUREC_INLINE int SecFilterWcharInFormat(SecScanSpec *spec, const SecUnsignedChar **format, SecFileStream *stream) +{ + if (SecIsLeadByte(spec->ch) != 0) { + if (SecDecodeLeadByte(spec, format, stream) != 0) { + return -1; + } + } + return 0; +} +#endif + +/* + * Resolving sequence of characters from %[ format, format wile point to ']' + */ +SECUREC_INLINE int SecSetupBracketTable(const SecUnsignedChar **format, SecBracketTable *bracketTable) +{ + const SecUnsignedChar *fmt = *format; + SecUnsignedChar prevChar = 0; +#if !(defined(SECUREC_COMPATIBLE_WIN_FORMAT)) + if (*fmt == SECUREC_CHAR('{')) { + return -1; + } +#endif + /* For building "table" data */ + ++fmt; /* Skip [ */ + bracketTable->mask = 0; /* Set all bits to 0 */ + if (*fmt == SECUREC_CHAR('^')) { + ++fmt; + bracketTable->mask = (unsigned char)0xffU; /* Use 0xffU to set all bits to 1 */ + } + if (*fmt == SECUREC_CHAR(']')) { + prevChar = SECUREC_CHAR(']'); + ++fmt; + SecBracketSetBit(bracketTable->table, SECUREC_CHAR(']')); + } + while (*fmt != SECUREC_CHAR('\0') && *fmt != SECUREC_CHAR(']')) { + SecUnsignedChar expCh = *fmt; + ++fmt; + if (expCh != SECUREC_CHAR('-') || prevChar == 0 || *fmt == SECUREC_CHAR(']')) { + /* Normal character */ + prevChar = expCh; + SecBracketSetBit(bracketTable->table, expCh); + } else { + /* For %[a-z] */ + expCh = *fmt; /* Get end of range */ + ++fmt; + if (prevChar <= expCh) { /* %[a-z] %[a-a] */ + SecBracketSetBitRange(bracketTable->table, prevChar, expCh); + } else { + /* For %[z-a] */ +#if defined(SECUREC_COMPATIBLE_WIN_FORMAT) + /* Swap start and end characters */ + SecBracketSetBitRange(bracketTable->table, expCh, prevChar); +#else + SecBracketSetBit(bracketTable->table, SECUREC_CHAR('-')); + SecBracketSetBit(bracketTable->table, expCh); +#endif + } + prevChar = 0; + } + } + *format = fmt; + return 0; +} + +#ifdef SECUREC_FOR_WCHAR +SECUREC_INLINE int SecInputForWchar(SecScanSpec *spec) +{ + void *endPtr = spec->argPtr; + if (spec->isWCharOrLong > 0) { + *(wchar_t UNALIGNED *)endPtr = (wchar_t)spec->ch; + endPtr = (wchar_t *)endPtr + 1; + --spec->arrayWidth; + } else { +#if SECUREC_HAVE_WCTOMB + int temp; + char tmpBuf[SECUREC_MB_LEN + 1]; + SECUREC_MASK_MSVC_CRT_WARNING temp = wctomb(tmpBuf, (wchar_t)spec->ch); + SECUREC_END_MASK_MSVC_CRT_WARNING + if (temp <= 0 || (size_t)(unsigned int)temp > sizeof(tmpBuf)) { + /* If wctomb error, then ignore character */ + return 0; + } + if (((size_t)(unsigned int)temp) > spec->arrayWidth) { + return -1; + } + if (memcpy_s(endPtr, spec->arrayWidth, tmpBuf, (size_t)(unsigned int)temp) != EOK) { + return -1; + } + endPtr = (char *)endPtr + temp; + spec->arrayWidth -= (size_t)(unsigned int)temp; +#else + return -1; +#endif + } + spec->argPtr = endPtr; + return 0; +} +#endif + +#ifndef SECUREC_FOR_WCHAR +#if SECUREC_HAVE_WCHART +SECUREC_INLINE wchar_t SecConvertInputCharToWchar(SecScanSpec *spec, SecFileStream *stream) +{ + wchar_t tempWChar = L'?'; /* Set default char is ? */ +#if SECUREC_HAVE_MBTOWC + char temp[SECUREC_MULTI_BYTE_MAX_LEN + 1]; + temp[0] = (char)spec->ch; + temp[1] = '\0'; +#if defined(SECUREC_COMPATIBLE_WIN_FORMAT) + if (SecIsLeadByte(spec->ch) != 0) { + spec->ch = SecGetChar(stream, &(spec->charCount)); + temp[1] = (char)spec->ch; + temp[2] = '\0'; /* 2 of string terminator position */ + } + if (mbtowc(&tempWChar, temp, sizeof(temp)) <= 0) { + /* No string termination error for tool */ + tempWChar = L'?'; + } +#else + if (SecIsLeadByte(spec->ch) != 0) { + int convRes = 0; + int di = 1; + /* On Linux like system, the string is encoded in UTF-8 */ + while (convRes <= 0 && di < (int)MB_CUR_MAX && di < SECUREC_MULTI_BYTE_MAX_LEN) { + spec->ch = SecGetChar(stream, &(spec->charCount)); + temp[di] = (char)spec->ch; + ++di; + temp[di] = '\0'; + convRes = mbtowc(&tempWChar, temp, sizeof(temp)); + } + if (convRes <= 0) { + tempWChar = L'?'; + } + } else { + if (mbtowc(&tempWChar, temp, sizeof(temp)) <= 0) { + tempWChar = L'?'; + } + } +#endif +#else + (void)spec; /* To clear e438 last value assigned not used , the compiler will optimize this code */ + (void)stream; /* To clear e438 last value assigned not used , the compiler will optimize this code */ +#endif /* SECUREC_HAVE_MBTOWC */ + + return tempWChar; +} +#endif /* SECUREC_HAVE_WCHART */ + +SECUREC_INLINE int SecInputForChar(SecScanSpec *spec, SecFileStream *stream) +{ + void *endPtr = spec->argPtr; + if (spec->isWCharOrLong > 0) { +#if SECUREC_HAVE_WCHART + *(wchar_t UNALIGNED *)endPtr = SecConvertInputCharToWchar(spec, stream); + endPtr = (wchar_t *)endPtr + 1; + --spec->arrayWidth; +#else + (void)stream; /* To clear e438 last value assigned not used , the compiler will optimize this code */ + return -1; +#endif + } else { + *(char *)endPtr = (char)spec->ch; + endPtr = (char *)endPtr + 1; + --spec->arrayWidth; + } + spec->argPtr = endPtr; + return 0; +} +#endif + +/* + * Scan digital part of %d %i %o %u %x %p. + * Return 0 OK + */ +SECUREC_INLINE int SecInputNumberDigital(SecFileStream *stream, SecScanSpec *spec) +{ + static void (* const secFinishNumber[SECUREC_DECODE_NUMBER_FUNC_NUM])(SecScanSpec *spec) = { + SecFinishNumber, SecFinishNumber64 + }; + while (SECUREC_FILED_WIDTH_ENOUGH(spec)) { + spec->ch = SecGetChar(stream, &(spec->charCount)); + /* Decode ch to number */ + if (SecDecodeNumber(spec) != 0) { + SecUnGetChar(spec->ch, stream, &(spec->charCount)); + break; + } + SECUREC_FILED_WIDTH_DEC(spec); /* Must be behind un get char, otherwise the logic is incorrect */ + spec->numberState = SECUREC_NUMBER_STATE_STARTED; + } + /* Handling integer negative numbers and beyond max */ + (*secFinishNumber[spec->numberArgType])(spec); + if (spec->numberState == SECUREC_NUMBER_STATE_STARTED) { + return 0; + } + return -1; +} + +/* + * Scan %d %i %o %u %x %p. + * Return 0 OK + */ +SECUREC_INLINE int SecInputNumber(SecFileStream *stream, SecScanSpec *spec) +{ + /* Character already read */ + if (spec->ch == SECUREC_CHAR('+') || spec->ch == SECUREC_CHAR('-')) { + if (spec->ch == SECUREC_CHAR('-')) { + spec->negative = 1; +#if SECUREC_IN_KERNEL + /* In kernel Refuse to enter negative number */ + if (SECUREC_CONVERT_IS_UNSIGNED(spec->oriConvChr)) { + return -1; + } +#endif + } + SECUREC_FILED_WIDTH_DEC(spec); /* Do not need to check width here, must be greater than 0 */ + spec->ch = SecGetChar(stream, &(spec->charCount)); /* Eat + or - */ + spec->ch = SecGetChar(stream, &(spec->charCount)); /* Get next character, used for the '0' judgments */ + SecUnGetChar(spec->ch, stream, &(spec->charCount)); /* Not sure if it was actually read, so push back */ + } + + if (spec->oriConvChr == 'i') { + spec->convChr = 'd'; /* The i could be d, o, or x, use d as default */ + } + + if (spec->ch == SECUREC_CHAR('0') && (spec->oriConvChr == 'x' || spec->oriConvChr == 'i') && + SECUREC_FILED_WIDTH_ENOUGH(spec)) { + /* Input string begin with 0, may be 0x123 0X123 0123 0x 01 0yy 09 0 0ab 00 */ + SECUREC_FILED_WIDTH_DEC(spec); + spec->ch = SecGetChar(stream, &(spec->charCount)); /* ch is '0' */ + + /* Read only '0' due to width limitation */ + if (!SECUREC_FILED_WIDTH_ENOUGH(spec)) { + /* The number or number64 in spec has been set 0 */ + return 0; + } + + spec->ch = SecGetChar(stream, &(spec->charCount)); /* Get next char to check x or X, do not dec width */ + if ((SecChar)spec->ch == SECUREC_CHAR('x') || (SecChar)spec->ch == SECUREC_CHAR('X')) { + spec->convChr = 'x'; + SECUREC_FILED_WIDTH_DEC(spec); /* Make incorrect width for x or X */ + } else { + if (spec->oriConvChr == 'i') { + spec->convChr = 'o'; + } + /* For "0y" "08" "01" "0a" ... ,push the 'y' '8' '1' 'a' back */ + SecUnGetChar(spec->ch, stream, &(spec->charCount)); + /* Since 0 has been read, it indicates that a valid character has been read */ + spec->numberState = SECUREC_NUMBER_STATE_STARTED; + } + } + return SecInputNumberDigital(stream, spec); +} + +/* + * Scan %c %s %[ + * Return 0 OK + */ +SECUREC_INLINE int SecInputString(SecFileStream *stream, SecScanSpec *spec, + const SecBracketTable *bracketTable, int *doneCount) +{ + void *startPtr = spec->argPtr; + int suppressed = 0; + int errNoMem = 0; + + while (SECUREC_FILED_WIDTH_ENOUGH(spec)) { + SECUREC_FILED_WIDTH_DEC(spec); + spec->ch = SecGetChar(stream, &(spec->charCount)); + /* + * The char condition or string condition and bracket condition. + * Only supports wide characters with a maximum length of two bytes + */ + if (spec->ch != SECUREC_EOF && (SecCanInputCharacter(spec->convChr) != 0 || + SecCanInputString(spec->convChr, spec->ch) != 0 || + SecCanInputForBracket(spec->convChr, spec->ch, bracketTable) != 0)) { + if (spec->suppress != 0) { + /* Used to identify processed data for %*, use argPtr to identify will cause 613, so use suppressed */ + suppressed = 1; + continue; + } + /* Now suppress is not set */ + if (spec->arrayWidth == 0) { + errNoMem = 1; /* We have exhausted the user's buffer */ + break; + } +#ifdef SECUREC_FOR_WCHAR + errNoMem = SecInputForWchar(spec); +#else + errNoMem = SecInputForChar(spec, stream); +#endif + if (errNoMem != 0) { + break; + } + } else { + SecUnGetChar(spec->ch, stream, &(spec->charCount)); + break; + } + } + + if (errNoMem != 0) { + /* In case of error, blank out the input buffer */ + SecAddEndingZero(startPtr, spec); + return -1; + } + if ((spec->suppress != 0 && suppressed == 0) || + (spec->suppress == 0 && startPtr == spec->argPtr)) { + /* No input was scanned */ + return -1; + } + if (spec->convChr != 'c') { + /* Add null-terminate for strings */ + SecAddEndingZero(spec->argPtr, spec); + } + if (spec->suppress == 0) { + *doneCount = *doneCount + 1; + } + return 0; +} + +#ifdef SECUREC_FOR_WCHAR +/* + * Allocate buffer for wchar version of %[. + * Return 0 OK + */ +SECUREC_INLINE int SecAllocBracketTable(SecBracketTable *bracketTable) +{ + if (bracketTable->table == NULL) { + /* Table should be freed after use */ + bracketTable->table = (unsigned char *)SECUREC_MALLOC(SECUREC_BRACKET_TABLE_SIZE); + if (bracketTable->table == NULL) { + return -1; + } + } + return 0; +} + +/* + * Free buffer for wchar version of %[ + */ +SECUREC_INLINE void SecFreeBracketTable(SecBracketTable *bracketTable) +{ + if (bracketTable->table != NULL) { + SECUREC_FREE(bracketTable->table); + bracketTable->table = NULL; + } +} +#endif + +#ifdef SECUREC_FOR_WCHAR +/* + * Formatting input core functions for wchar version.Called by a function such as vswscanf_s + */ +int SecInputSW(SecFileStream *stream, const wchar_t *cFormat, va_list argList) +#else +/* + * Formatting input core functions for char version.Called by a function such as vsscanf_s + */ +int SecInputS(SecFileStream *stream, const char *cFormat, va_list argList) +#endif +{ + const SecUnsignedChar *format = (const SecUnsignedChar *)cFormat; + SecBracketTable bracketTable = SECUREC_INIT_BRACKET_TABLE; + SecScanSpec spec; + int doneCount = 0; + int formatError = 0; + int paraIsNull = 0; + int match = 0; /* When % is found , inc this value */ + int errRet = 0; +#if SECUREC_ENABLE_SCANF_FLOAT + SecFloatSpec floatSpec; + SecInitFloatSpec(&floatSpec); +#endif + spec.ch = 0; /* Need to initialize to 0 */ + spec.charCount = 0; /* Need to initialize to 0 */ + + /* Format must not NULL, use err < 1 to clear 845 */ + while (errRet < 1 && *format != SECUREC_CHAR('\0')) { + /* Skip space in format and space in input */ + if (SecIsSpace((SecInt)(int)(*format)) != 0) { + /* Read first no space char */ + spec.ch = SecSkipSpaceChar(stream, &(spec.charCount)); + /* Read the EOF cannot be returned directly here, because the case of " %n" needs to be handled */ + /* Put fist no space char backup. put EOF back is also OK, and to modify the character count */ + SecUnGetChar(spec.ch, stream, &(spec.charCount)); + SecSkipSpaceFormat(&format); + continue; + } + + if (*format != SECUREC_CHAR('%')) { + spec.ch = SecGetChar(stream, &(spec.charCount)); + if ((int)(*format) != (int)(spec.ch)) { + SecUnGetChar(spec.ch, stream, &(spec.charCount)); + break; + } + ++format; +#if !defined(SECUREC_FOR_WCHAR) && defined(SECUREC_COMPATIBLE_VERSION) + if (SecFilterWcharInFormat(&spec, &format, stream) != 0) { + break; + } +#endif + continue; + } + + /* Now *format is % */ + /* Set default value for each % */ + SecSetDefaultScanSpec(&spec); + if (SecDecodeScanFlag(&format, &spec) != 0) { + formatError = 1; + ++errRet; + continue; + } + if (!SECUREC_FILED_WIDTH_ENOUGH(&spec)) { + /* 0 width in format */ + ++errRet; + continue; + } + + /* Update wchar flag for %S %C */ + SecUpdateWcharFlagByType(*format, &spec); + + spec.convChr = SECUREC_TO_LOWERCASE(*format); + spec.oriConvChr = spec.convChr; /* convChr may be modified to handle integer logic */ + if (spec.convChr != 'n') { + if (spec.convChr != 'c' && spec.convChr != SECUREC_BRACE) { + spec.ch = SecSkipSpaceChar(stream, &(spec.charCount)); + } else { + spec.ch = SecGetChar(stream, &(spec.charCount)); + } + if (spec.ch == SECUREC_EOF) { + ++errRet; + continue; + } + } + + /* Now no 0 width in format and get one char from input */ + switch (spec.oriConvChr) { + case 'c': /* Also 'C' */ + if (spec.widthSet == 0) { + spec.widthSet = 1; + spec.width = 1; + } + /* fall-through */ /* FALLTHRU */ + case 's': /* Also 'S': */ + /* fall-through */ /* FALLTHRU */ + case SECUREC_BRACE: + /* Unset last char to stream */ + SecUnGetChar(spec.ch, stream, &(spec.charCount)); + /* Check dest buffer and size */ + if (spec.suppress == 0) { + spec.argPtr = (void *)va_arg(argList, void *); + if (spec.argPtr == NULL) { + paraIsNull = 1; + ++errRet; + continue; + } + /* Get the next argument, size of the array in characters */ + spec.arrayWidth = SECUREC_GET_ARRAYWIDTH(argList); + if (SECUREC_ARRAY_WIDTH_IS_WRONG(spec)) { + /* Do not clear buffer just go error */ + ++errRet; + continue; + } + /* One element is needed for '\0' for %s and %[ */ + if (spec.convChr != 'c') { + --spec.arrayWidth; + } + } else { + /* Set argPtr to NULL is necessary, in suppress mode we don't use argPtr to store data */ + spec.argPtr = NULL; + } + + if (spec.convChr == SECUREC_BRACE) { + /* Malloc when first %[ is meet for wchar version */ +#ifdef SECUREC_FOR_WCHAR + if (SecAllocBracketTable(&bracketTable) != 0) { + ++errRet; + continue; + } +#endif + (void)SECUREC_MEMSET_FUNC_OPT(bracketTable.table, 0, (size_t)SECUREC_BRACKET_TABLE_SIZE); + if (SecSetupBracketTable(&format, &bracketTable) != 0) { + ++errRet; + continue; + } + + if (*format == SECUREC_CHAR('\0')) { + /* Default add string terminator */ + SecAddEndingZero(spec.argPtr, &spec); + ++errRet; + /* Truncated format */ + continue; + } + } + + /* Set completed. Now read string or character */ + if (SecInputString(stream, &spec, &bracketTable, &doneCount) != 0) { + ++errRet; + continue; + } + break; + case 'p': + /* Make %hp same as %p */ + spec.numberWidth = SECUREC_NUM_WIDTH_INT; +#ifdef SECUREC_ON_64BITS + spec.numberArgType = 1; +#endif + /* fall-through */ /* FALLTHRU */ + case 'o': /* fall-through */ /* FALLTHRU */ + case 'u': /* fall-through */ /* FALLTHRU */ + case 'd': /* fall-through */ /* FALLTHRU */ + case 'i': /* fall-through */ /* FALLTHRU */ + case 'x': + /* Unset last char to stream */ + SecUnGetChar(spec.ch, stream, &(spec.charCount)); + if (SecInputNumber(stream, &spec) != 0) { + ++errRet; + continue; + } + if (spec.suppress == 0) { + spec.argPtr = (void *)va_arg(argList, void *); + if (spec.argPtr == NULL) { + paraIsNull = 1; + ++errRet; + continue; + } + SecAssignNumber(&spec); + ++doneCount; + } + break; + case 'n': /* Char count */ + if (spec.suppress == 0) { + spec.argPtr = (void *)va_arg(argList, void *); + if (spec.argPtr == NULL) { + paraIsNull = 1; + ++errRet; + continue; + } + spec.number = (unsigned long)(unsigned int)(spec.charCount); + spec.numberArgType = 0; + SecAssignNumber(&spec); + } + break; + case 'e': /* fall-through */ /* FALLTHRU */ + case 'f': /* fall-through */ /* FALLTHRU */ + case 'g': /* Scan a float */ + /* Unset last char to stream */ + SecUnGetChar(spec.ch, stream, &(spec.charCount)); +#if SECUREC_ENABLE_SCANF_FLOAT + if (SecInputFloat(stream, &spec, &floatSpec) != 0) { + ++errRet; + continue; + } + if (spec.suppress == 0) { + spec.argPtr = (void *)va_arg(argList, void *); + if (spec.argPtr == NULL) { + ++errRet; + paraIsNull = 1; + continue; + } + if (SecAssignFloat(&floatSpec, &spec) != 0) { + ++errRet; + continue; + } + ++doneCount; + } + break; +#else /* SECUREC_ENABLE_SCANF_FLOAT */ + ++errRet; + continue; +#endif + default: + if ((int)(*format) != (int)spec.ch) { + SecUnGetChar(spec.ch, stream, &(spec.charCount)); + formatError = 1; + ++errRet; + continue; + } else { + --match; /* Compensate for the self-increment of the following code */ + } + break; + } + ++match; + ++format; + } + +#ifdef SECUREC_FOR_WCHAR + SecFreeBracketTable(&bracketTable); +#endif + +#if SECUREC_ENABLE_SCANF_FLOAT + SecFreeFloatSpec(&floatSpec, &doneCount); +#endif + +#if SECUREC_ENABLE_SCANF_FILE + SecAdjustStream(stream); +#endif + + if (spec.ch == SECUREC_EOF) { + return ((doneCount != 0 || match != 0) ? doneCount : SECUREC_SCANF_EINVAL); + } + if (formatError != 0 || paraIsNull != 0) { + /* Invalid Input Format or parameter, but not meet EOF */ + return SECUREC_SCANF_ERROR_PARA; + } + return doneCount; +} + +#if SECUREC_ENABLE_SCANF_FILE +/* + * Get char from stream use std function + */ +SECUREC_INLINE SecInt SecGetCharFromStream(const SecFileStream *stream) +{ + SecInt ch; + ch = SECUREC_GETC(stream->pf); + return ch; +} + +/* + * Try to read the BOM header, when meet a BOM head, discard it, then data is Aligned to base + */ +SECUREC_INLINE void SecReadAndSkipBomHeader(SecFileStream *stream) +{ + /* Use size_t type conversion to clean e747 */ + stream->count = fread(stream->base, (size_t)1, (size_t)SECUREC_BOM_HEADER_SIZE, stream->pf); + if (stream->count > SECUREC_BOM_HEADER_SIZE) { + stream->count = 0; + } + if (SECUREC_BEGIN_WITH_BOM(stream->base, stream->count)) { + /* It's BOM header, discard it */ + stream->count = 0; + } +} + +/* + * Get char from file stream or buffer + */ +SECUREC_INLINE SecInt SecGetCharFromFile(SecFileStream *stream) +{ + SecInt ch; + if (stream->count < sizeof(SecChar)) { + /* Load file to buffer */ + size_t len; + if (stream->base != NULL) { + /* Put the last unread data in the buffer head */ + for (len = 0; len < stream->count; ++len) { + stream->base[len] = stream->cur[len]; + } + } else { + stream->oriFilePos = ftell(stream->pf); /* Save original file read position */ + if (stream->oriFilePos == -1) { + /* It may be a pipe stream */ + stream->flag = SECUREC_PIPE_STREAM_FLAG; + return SecGetCharFromStream(stream); + } + /* Reserve the length of BOM head */ + stream->base = (char *)SECUREC_MALLOC(SECUREC_BUFFERED_BLOK_SIZE + + SECUREC_BOM_HEADER_SIZE + sizeof(SecChar)); /* To store '\0' and aligned to wide char */ + if (stream->base == NULL) { + return SECUREC_EOF; + } + /* First read file */ + if (stream->oriFilePos == 0) { + /* Make sure the data is aligned to base */ + SecReadAndSkipBomHeader(stream); + } + } + + /* Skip existing data and read data */ + len = fread(stream->base + stream->count, (size_t)1, (size_t)SECUREC_BUFFERED_BLOK_SIZE, stream->pf); + if (len > SECUREC_BUFFERED_BLOK_SIZE) { /* It won't happen, */ + len = 0; + } + stream->count += len; + stream->cur = stream->base; + stream->flag |= SECUREC_LOAD_FILE_TO_MEM_FLAG; + stream->base[stream->count] = '\0'; /* For tool Warning string null */ + } + + SECUREC_GET_CHAR(stream, &ch); + if (ch != SECUREC_EOF) { + stream->fileRealRead += sizeof(SecChar); + } + return ch; +} +#endif + +/* + * Get char for wchar version + */ +SECUREC_INLINE SecInt SecGetChar(SecFileStream *stream, int *counter) +{ + *counter = *counter + 1; /* Always plus 1 */ + /* The main scenario is scanf str */ + if ((stream->flag & SECUREC_MEM_STR_FLAG) != 0) { + SecInt ch; + SECUREC_GET_CHAR(stream, &ch); + return ch; + } +#if SECUREC_ENABLE_SCANF_FILE + if ((stream->flag & SECUREC_FILE_STREAM_FLAG) != 0) { + return SecGetCharFromFile(stream); + } + if ((stream->flag & SECUREC_PIPE_STREAM_FLAG) != 0) { + return SecGetCharFromStream(stream); + } +#endif + return SECUREC_EOF; +} + +/* + * Unget Public realization char for wchar and char version + */ +SECUREC_INLINE void SecUnGetCharImpl(SecInt ch, SecFileStream *stream) +{ + if ((stream->flag & SECUREC_MEM_STR_FLAG) != 0) { + SECUREC_UN_GET_CHAR(stream); + return; + } +#if SECUREC_ENABLE_SCANF_FILE + if ((stream->flag & SECUREC_LOAD_FILE_TO_MEM_FLAG) != 0) { + SECUREC_UN_GET_CHAR(stream); + if (stream->fileRealRead > 0) { + stream->fileRealRead -= sizeof(SecChar); + } + return; + } + if ((stream->flag & SECUREC_PIPE_STREAM_FLAG) != 0) { + (void)SECUREC_UN_GETC(ch, stream->pf); + return; + } +#else + (void)ch; /* To clear e438 last value assigned not used , the compiler will optimize this code */ +#endif +} + +/* + * Unget char for char version + */ +SECUREC_INLINE void SecUnGetChar(SecInt ch, SecFileStream *stream, int *counter) +{ + *counter = *counter - 1; /* Always minus 1 */ + if (ch != SECUREC_EOF) { + SecUnGetCharImpl(ch, stream); + } +} + +/* + * Skip space char by isspace + */ +SECUREC_INLINE SecInt SecSkipSpaceChar(SecFileStream *stream, int *counter) +{ + SecInt ch; + do { + ch = SecGetChar(stream, counter); + if (ch == SECUREC_EOF) { + break; + } + } while (SecIsSpace(ch) != 0); + return ch; +} +#endif /* INPUT_INL_5D13A042_DC3F_4ED9_A8D1_882811274C27 */ + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.c new file mode 100644 index 000000000..a7fd48748 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.c @@ -0,0 +1,555 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: memcpy_s function + * Create: 2014-02-25 + */ +/* + * [Standardize-exceptions] Use unsafe function: Portability + * [reason] Use unsafe function to implement security function to maintain platform compatibility. + * And sufficient input validation is performed before calling + */ + +#include "securecutil.h" + +#if SECUREC_WITH_PERFORMANCE_ADDONS +#ifndef SECUREC_MEMCOPY_THRESHOLD_SIZE +#define SECUREC_MEMCOPY_THRESHOLD_SIZE 64UL +#endif + +#define SECUREC_SMALL_MEM_COPY(dest, src, count) do { \ + if (SECUREC_ADDR_ALIGNED_8(dest) && SECUREC_ADDR_ALIGNED_8(src)) { \ + /* Use struct assignment */ \ + switch (count) { \ + case 1: \ + *(unsigned char *)(dest) = *(const unsigned char *)(src); \ + break; \ + case 2: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 2); \ + break; \ + case 3: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 3); \ + break; \ + case 4: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 4); \ + break; \ + case 5: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 5); \ + break; \ + case 6: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 6); \ + break; \ + case 7: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 7); \ + break; \ + case 8: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 8); \ + break; \ + case 9: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 9); \ + break; \ + case 10: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 10); \ + break; \ + case 11: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 11); \ + break; \ + case 12: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 12); \ + break; \ + case 13: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 13); \ + break; \ + case 14: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 14); \ + break; \ + case 15: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 15); \ + break; \ + case 16: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 16); \ + break; \ + case 17: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 17); \ + break; \ + case 18: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 18); \ + break; \ + case 19: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 19); \ + break; \ + case 20: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 20); \ + break; \ + case 21: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 21); \ + break; \ + case 22: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 22); \ + break; \ + case 23: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 23); \ + break; \ + case 24: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 24); \ + break; \ + case 25: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 25); \ + break; \ + case 26: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 26); \ + break; \ + case 27: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 27); \ + break; \ + case 28: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 28); \ + break; \ + case 29: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 29); \ + break; \ + case 30: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 30); \ + break; \ + case 31: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 31); \ + break; \ + case 32: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 32); \ + break; \ + case 33: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 33); \ + break; \ + case 34: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 34); \ + break; \ + case 35: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 35); \ + break; \ + case 36: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 36); \ + break; \ + case 37: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 37); \ + break; \ + case 38: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 38); \ + break; \ + case 39: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 39); \ + break; \ + case 40: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 40); \ + break; \ + case 41: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 41); \ + break; \ + case 42: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 42); \ + break; \ + case 43: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 43); \ + break; \ + case 44: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 44); \ + break; \ + case 45: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 45); \ + break; \ + case 46: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 46); \ + break; \ + case 47: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 47); \ + break; \ + case 48: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 48); \ + break; \ + case 49: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 49); \ + break; \ + case 50: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 50); \ + break; \ + case 51: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 51); \ + break; \ + case 52: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 52); \ + break; \ + case 53: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 53); \ + break; \ + case 54: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 54); \ + break; \ + case 55: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 55); \ + break; \ + case 56: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 56); \ + break; \ + case 57: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 57); \ + break; \ + case 58: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 58); \ + break; \ + case 59: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 59); \ + break; \ + case 60: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 60); \ + break; \ + case 61: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 61); \ + break; \ + case 62: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 62); \ + break; \ + case 63: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 63); \ + break; \ + case 64: \ + SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 64); \ + break; \ + default: \ + /* Do nothing */ \ + break; \ + } /* END switch */ \ + } else { \ + unsigned char *tmpDest_ = (unsigned char *)(dest); \ + const unsigned char *tmpSrc_ = (const unsigned char *)(src); \ + switch (count) { \ + case 64: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 63: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 62: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 61: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 60: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 59: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 58: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 57: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 56: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 55: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 54: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 53: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 52: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 51: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 50: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 49: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 48: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 47: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 46: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 45: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 44: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 43: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 42: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 41: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 40: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 39: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 38: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 37: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 36: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 35: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 34: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 33: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 32: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 31: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 30: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 29: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 28: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 27: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 26: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 25: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 24: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 23: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 22: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 21: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 20: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 19: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 18: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 17: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 16: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 15: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 14: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 13: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 12: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 11: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 10: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 9: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 8: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 7: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 6: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 5: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 4: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 3: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 2: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 1: \ + *(tmpDest_++) = *(tmpSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + default: \ + /* Do nothing */ \ + break; \ + } \ + } \ +} SECUREC_WHILE_ZERO + +/* + * Performance optimization + */ +#define SECUREC_MEMCPY_OPT(dest, src, count) do { \ + if ((count) > SECUREC_MEMCOPY_THRESHOLD_SIZE) { \ + SECUREC_MEMCPY_WARP_OPT((dest), (src), (count)); \ + } else { \ + SECUREC_SMALL_MEM_COPY((dest), (src), (count)); \ + } \ +} SECUREC_WHILE_ZERO +#endif + +/* + * Handling errors + */ +SECUREC_INLINE errno_t SecMemcpyError(void *dest, size_t destMax, const void *src, size_t count) +{ + if (destMax == 0 || destMax > SECUREC_MEM_MAX_LEN) { + SECUREC_ERROR_INVALID_RANGE("memcpy_s"); + return ERANGE; + } + if (dest == NULL || src == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("memcpy_s"); + if (dest != NULL) { + (void)SECUREC_MEMSET_FUNC_OPT(dest, 0, destMax); + return EINVAL_AND_RESET; + } + return EINVAL; + } + if (count > destMax) { + (void)SECUREC_MEMSET_FUNC_OPT(dest, 0, destMax); + SECUREC_ERROR_INVALID_RANGE("memcpy_s"); + return ERANGE_AND_RESET; + } + if (SECUREC_MEMORY_IS_OVERLAP(dest, src, count)) { + (void)SECUREC_MEMSET_FUNC_OPT(dest, 0, destMax); + SECUREC_ERROR_BUFFER_OVERLAP("memcpy_s"); + return EOVERLAP_AND_RESET; + } + /* Count is 0 or dest equal src also ret EOK */ + return EOK; +} + +#if defined(SECUREC_COMPATIBLE_WIN_FORMAT) + /* + * The fread API in windows will call memcpy_s and pass 0xffffffff to destMax. + * To avoid the failure of fread, we don't check desMax limit. + */ +#define SECUREC_MEMCPY_PARAM_OK(dest, destMax, src, count) (SECUREC_LIKELY((count) <= (destMax) && \ + (dest) != NULL && (src) != NULL && \ + (count) > 0 && SECUREC_MEMORY_NO_OVERLAP((dest), (src), (count)))) +#else +#define SECUREC_MEMCPY_PARAM_OK(dest, destMax, src, count) (SECUREC_LIKELY((count) <= (destMax) && \ + (dest) != NULL && (src) != NULL && (destMax) <= SECUREC_MEM_MAX_LEN && \ + (count) > 0 && SECUREC_MEMORY_NO_OVERLAP((dest), (src), (count)))) +#endif + +/* + * + * The memcpy_s function copies n characters from the object pointed to by src into the object pointed to by dest + * + * + * dest Destination buffer. + * destMax Size of the destination buffer. + * src Buffer to copy from. + * count Number of characters to copy + * + * + * dest buffer is updated. + * + * + * EOK Success + * EINVAL dest is NULL and destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN + * EINVAL_AND_RESET dest != NULL and src is NULL and destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN + * ERANGE destMax > SECUREC_MEM_MAX_LEN or destMax is 0 + * ERANGE_AND_RESET count > destMax and destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN + * and dest != NULL and src != NULL + * EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and + * count <= destMax destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN and dest != NULL + * and src != NULL and dest != src + * + * if an error occurred, dest will be filled with 0. + * If the source and destination overlap, the behavior of memcpy_s is undefined. + * Use memmove_s to handle overlapping regions. + */ +errno_t memcpy_s(void *dest, size_t destMax, const void *src, size_t count) +{ + if (SECUREC_MEMCPY_PARAM_OK(dest, destMax, src, count)) { + SECUREC_MEMCPY_WARP_OPT(dest, src, count); + return EOK; + } + /* Meet some runtime violation, return error code */ + return SecMemcpyError(dest, destMax, src, count); +} + +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(memcpy_s); +#endif + +#if SECUREC_WITH_PERFORMANCE_ADDONS +/* + * Performance optimization + */ +errno_t memcpy_sOptAsm(void *dest, size_t destMax, const void *src, size_t count) +{ + if (SECUREC_MEMCPY_PARAM_OK(dest, destMax, src, count)) { + SECUREC_MEMCPY_OPT(dest, src, count); + return EOK; + } + /* Meet some runtime violation, return error code */ + return SecMemcpyError(dest, destMax, src, count); +} + +/* Trim judgement on "destMax <= SECUREC_MEM_MAX_LEN" */ +errno_t memcpy_sOptTc(void *dest, size_t destMax, const void *src, size_t count) +{ + if (SECUREC_LIKELY(count <= destMax && dest != NULL && src != NULL && \ + count > 0 && SECUREC_MEMORY_NO_OVERLAP((dest), (src), (count)))) { + SECUREC_MEMCPY_OPT(dest, src, count); + return EOK; + } + /* Meet some runtime violation, return error code */ + return SecMemcpyError(dest, destMax, src, count); +} +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.c new file mode 100644 index 000000000..f231f05da --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.c @@ -0,0 +1,123 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: memmove_s function + * Create: 2014-02-25 + */ +/* + * [Standardize-exceptions] Use unsafe function: Portability + * [reason] Use unsafe function to implement security function to maintain platform compatibility. + * And sufficient input validation is performed before calling + */ + +#include "securecutil.h" + +#ifdef SECUREC_NOT_CALL_LIBC_CORE_API +/* + * Implementing memory data movement + */ +SECUREC_INLINE void SecUtilMemmove(void *dst, const void *src, size_t count) +{ + unsigned char *pDest = (unsigned char *)dst; + const unsigned char *pSrc = (const unsigned char *)src; + size_t maxCount = count; + + if (dst <= src || pDest >= (pSrc + maxCount)) { + /* + * Non-Overlapping Buffers + * Copy from lower addresses to higher addresses + */ + while (maxCount > 0) { + --maxCount; + *pDest = *pSrc; + ++pDest; + ++pSrc; + } + } else { + /* + * Overlapping Buffers + * Copy from higher addresses to lower addresses + */ + pDest = pDest + maxCount - 1; + pSrc = pSrc + maxCount - 1; + while (maxCount > 0) { + --maxCount; + *pDest = *pSrc; + --pDest; + --pSrc; + } + } +} +#endif + +/* + * + * The memmove_s function copies count bytes of characters from src to dest. + * This function can be assigned correctly when memory overlaps. + * + * dest Destination object. + * destMax Size of the destination buffer. + * src Source object. + * count Number of characters to copy. + * + * + * dest buffer is updated. + * + * + * EOK Success + * EINVAL dest is NULL and destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN + * EINVAL_AND_RESET dest != NULL and src is NULL and destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN + * ERANGE destMax > SECUREC_MEM_MAX_LEN or destMax is 0 + * ERANGE_AND_RESET count > destMax and dest != NULL and src != NULL and destMax != 0 + * and destMax <= SECUREC_MEM_MAX_LEN + * + * If an error occurred, dest will be filled with 0 when dest and destMax valid. + * If some regions of the source area and the destination overlap, memmove_s + * ensures that the original source bytes in the overlapping region are copied + * before being overwritten. + */ +errno_t memmove_s(void *dest, size_t destMax, const void *src, size_t count) +{ + if (destMax == 0 || destMax > SECUREC_MEM_MAX_LEN) { + SECUREC_ERROR_INVALID_RANGE("memmove_s"); + return ERANGE; + } + if (dest == NULL || src == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("memmove_s"); + if (dest != NULL) { + (void)SECUREC_MEMSET_FUNC_OPT(dest, 0, destMax); + return EINVAL_AND_RESET; + } + return EINVAL; + } + if (count > destMax) { + (void)SECUREC_MEMSET_FUNC_OPT(dest, 0, destMax); + SECUREC_ERROR_INVALID_RANGE("memmove_s"); + return ERANGE_AND_RESET; + } + if (dest == src) { + return EOK; + } + + if (count > 0) { +#ifdef SECUREC_NOT_CALL_LIBC_CORE_API + SecUtilMemmove(dest, src, count); +#else + /* Use underlying memmove for performance consideration */ + (void)memmove(dest, src, count); +#endif + } + return EOK; +} + +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(memmove_s); +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.c new file mode 100644 index 000000000..d9a657fd3 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.c @@ -0,0 +1,510 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: memset_s function + * Create: 2014-02-25 + */ +/* + * [Standardize-exceptions] Use unsafe function: Portability + * [reason] Use unsafe function to implement security function to maintain platform compatibility. + * And sufficient input validation is performed before calling + */ + +#include "securecutil.h" + +#define SECUREC_MEMSET_PARAM_OK(dest, destMax, count) (SECUREC_LIKELY((destMax) <= SECUREC_MEM_MAX_LEN && \ + (dest) != NULL && (count) <= (destMax))) + +#if SECUREC_WITH_PERFORMANCE_ADDONS + +/* Use union to clear strict-aliasing warning */ +typedef union { + SecStrBuf32 buf32; + SecStrBuf31 buf31; + SecStrBuf30 buf30; + SecStrBuf29 buf29; + SecStrBuf28 buf28; + SecStrBuf27 buf27; + SecStrBuf26 buf26; + SecStrBuf25 buf25; + SecStrBuf24 buf24; + SecStrBuf23 buf23; + SecStrBuf22 buf22; + SecStrBuf21 buf21; + SecStrBuf20 buf20; + SecStrBuf19 buf19; + SecStrBuf18 buf18; + SecStrBuf17 buf17; + SecStrBuf16 buf16; + SecStrBuf15 buf15; + SecStrBuf14 buf14; + SecStrBuf13 buf13; + SecStrBuf12 buf12; + SecStrBuf11 buf11; + SecStrBuf10 buf10; + SecStrBuf9 buf9; + SecStrBuf8 buf8; + SecStrBuf7 buf7; + SecStrBuf6 buf6; + SecStrBuf5 buf5; + SecStrBuf4 buf4; + SecStrBuf3 buf3; + SecStrBuf2 buf2; +} SecStrBuf32Union; +/* C standard initializes the first member of the consortium. */ +static const SecStrBuf32 g_allZero = {{ + 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, + 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, + 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, + 0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U +}}; +static const SecStrBuf32 g_allFF = {{ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}}; + +/* Clear conversion warning strict aliasing" */ +SECUREC_INLINE const SecStrBuf32Union *SecStrictAliasingCast(const SecStrBuf32 *buf) +{ + return (const SecStrBuf32Union *)buf; +} + +#ifndef SECUREC_MEMSET_THRESHOLD_SIZE +#define SECUREC_MEMSET_THRESHOLD_SIZE 32UL +#endif + +#define SECUREC_UNALIGNED_SET(dest, c, count) do { \ + unsigned char *pDest_ = (unsigned char *)(dest); \ + switch (count) { \ + case 32: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 31: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 30: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 29: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 28: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 27: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 26: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 25: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 24: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 23: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 22: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 21: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 20: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 19: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 18: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 17: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 16: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 15: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 14: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 13: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 12: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 11: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 10: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 9: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 8: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 7: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 6: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 5: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 4: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 3: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 2: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + case 1: \ + *(pDest_++) = (unsigned char)(c); \ + /* fall-through */ /* FALLTHRU */ \ + default: \ + /* Do nothing */ \ + break; \ + } \ +} SECUREC_WHILE_ZERO + +#define SECUREC_SET_VALUE_BY_STRUCT(dest, dataName, n) do { \ + *(SecStrBuf##n *)(dest) = *(const SecStrBuf##n *)(&((SecStrictAliasingCast(&(dataName)))->buf##n)); \ +} SECUREC_WHILE_ZERO + +#define SECUREC_ALIGNED_SET_OPT_ZERO_FF(dest, c, count) do { \ + switch (c) { \ + case 0: \ + switch (count) { \ + case 1: \ + *(unsigned char *)(dest) = (unsigned char)0; \ + break; \ + case 2: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 2); \ + break; \ + case 3: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 3); \ + break; \ + case 4: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 4); \ + break; \ + case 5: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 5); \ + break; \ + case 6: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 6); \ + break; \ + case 7: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 7); \ + break; \ + case 8: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 8); \ + break; \ + case 9: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 9); \ + break; \ + case 10: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 10); \ + break; \ + case 11: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 11); \ + break; \ + case 12: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 12); \ + break; \ + case 13: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 13); \ + break; \ + case 14: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 14); \ + break; \ + case 15: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 15); \ + break; \ + case 16: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 16); \ + break; \ + case 17: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 17); \ + break; \ + case 18: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 18); \ + break; \ + case 19: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 19); \ + break; \ + case 20: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 20); \ + break; \ + case 21: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 21); \ + break; \ + case 22: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 22); \ + break; \ + case 23: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 23); \ + break; \ + case 24: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 24); \ + break; \ + case 25: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 25); \ + break; \ + case 26: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 26); \ + break; \ + case 27: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 27); \ + break; \ + case 28: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 28); \ + break; \ + case 29: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 29); \ + break; \ + case 30: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 30); \ + break; \ + case 31: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 31); \ + break; \ + case 32: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 32); \ + break; \ + default: \ + /* Do nothing */ \ + break; \ + } \ + break; \ + case 0xFF: \ + switch (count) { \ + case 1: \ + *(unsigned char *)(dest) = (unsigned char)0xffU; \ + break; \ + case 2: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 2); \ + break; \ + case 3: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 3); \ + break; \ + case 4: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 4); \ + break; \ + case 5: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 5); \ + break; \ + case 6: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 6); \ + break; \ + case 7: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 7); \ + break; \ + case 8: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 8); \ + break; \ + case 9: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 9); \ + break; \ + case 10: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 10); \ + break; \ + case 11: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 11); \ + break; \ + case 12: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 12); \ + break; \ + case 13: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 13); \ + break; \ + case 14: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 14); \ + break; \ + case 15: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 15); \ + break; \ + case 16: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 16); \ + break; \ + case 17: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 17); \ + break; \ + case 18: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 18); \ + break; \ + case 19: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 19); \ + break; \ + case 20: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 20); \ + break; \ + case 21: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 21); \ + break; \ + case 22: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 22); \ + break; \ + case 23: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 23); \ + break; \ + case 24: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 24); \ + break; \ + case 25: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 25); \ + break; \ + case 26: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 26); \ + break; \ + case 27: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 27); \ + break; \ + case 28: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 28); \ + break; \ + case 29: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 29); \ + break; \ + case 30: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 30); \ + break; \ + case 31: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 31); \ + break; \ + case 32: \ + SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 32); \ + break; \ + default: \ + /* Do nothing */ \ + break; \ + } \ + break; \ + default: \ + SECUREC_UNALIGNED_SET((dest), (c), (count)); \ + break; \ + } /* END switch */ \ +} SECUREC_WHILE_ZERO + +#define SECUREC_SMALL_MEM_SET(dest, c, count) do { \ + if (SECUREC_ADDR_ALIGNED_8((dest))) { \ + SECUREC_ALIGNED_SET_OPT_ZERO_FF((dest), (c), (count)); \ + } else { \ + SECUREC_UNALIGNED_SET((dest), (c), (count)); \ + } \ +} SECUREC_WHILE_ZERO + +/* + * Performance optimization + */ +#define SECUREC_MEMSET_OPT(dest, c, count) do { \ + if ((count) > SECUREC_MEMSET_THRESHOLD_SIZE) { \ + SECUREC_MEMSET_PREVENT_DSE((dest), (c), (count)); \ + } else { \ + SECUREC_SMALL_MEM_SET((dest), (c), (count)); \ + } \ +} SECUREC_WHILE_ZERO +#endif + +/* + * Handling errors + */ +SECUREC_INLINE errno_t SecMemsetError(void *dest, size_t destMax, int c) +{ + /* Check destMax is 0 compatible with _sp macro */ + if (destMax == 0 || destMax > SECUREC_MEM_MAX_LEN) { + SECUREC_ERROR_INVALID_RANGE("memset_s"); + return ERANGE; + } + if (dest == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("memset_s"); + return EINVAL; + } + SECUREC_MEMSET_PREVENT_DSE(dest, c, destMax); /* Set entire buffer to value c */ + SECUREC_ERROR_INVALID_RANGE("memset_s"); + return ERANGE_AND_RESET; +} + +/* + * + * The memset_s function copies the value of c (converted to an unsigned char) + * into each of the first count characters of the object pointed to by dest. + * + * + * dest Pointer to destination. + * destMax The size of the buffer. + * c Character to set. + * count Number of characters. + * + * + * dest buffer is updated. + * + * + * EOK Success + * EINVAL dest == NULL and destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN + * ERANGE destMax > SECUREC_MEM_MAX_LEN or (destMax is 0 and count > destMax) + * ERANGE_AND_RESET count > destMax and destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN and dest != NULL + * + * if return ERANGE_AND_RESET then fill dest to c ,fill length is destMax + */ +errno_t memset_s(void *dest, size_t destMax, int c, size_t count) +{ + if (SECUREC_MEMSET_PARAM_OK(dest, destMax, count)) { + SECUREC_MEMSET_PREVENT_DSE(dest, c, count); + return EOK; + } + /* Meet some runtime violation, return error code */ + return SecMemsetError(dest, destMax, c); +} + +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(memset_s); +#endif + +#if SECUREC_WITH_PERFORMANCE_ADDONS +/* + * Performance optimization + */ +errno_t memset_sOptAsm(void *dest, size_t destMax, int c, size_t count) +{ + if (SECUREC_MEMSET_PARAM_OK(dest, destMax, count)) { + SECUREC_MEMSET_OPT(dest, c, count); + return EOK; + } + /* Meet some runtime violation, return error code */ + return SecMemsetError(dest, destMax, c); +} + +/* + * Performance optimization, trim judgement on "destMax <= SECUREC_MEM_MAX_LEN" + */ +errno_t memset_sOptTc(void *dest, size_t destMax, int c, size_t count) +{ + if (SECUREC_LIKELY(count <= destMax && dest != NULL)) { + SECUREC_MEMSET_OPT(dest, c, count); + return EOK; + } + /* Meet some runtime violation, return error code */ + return SecMemsetError(dest, destMax, c); +} +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/output.inl b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/output.inl new file mode 100644 index 000000000..9392efaaf --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/output.inl @@ -0,0 +1,1720 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: Used by secureprintoutput_a.c and secureprintoutput_w.c to include. + * This file provides a template function for ANSI and UNICODE compiling + * by different type definition. The functions of SecOutputS or + * SecOutputSW provides internal implementation for printf family API, such as sprintf, swprintf_s. + * Create: 2014-02-25 + * Notes: see www.cplusplus.com/reference/cstdio/printf/ + */ +/* + * [Standardize-exceptions] Use unsafe function: Portability + * [reason] Use unsafe function to implement security function to maintain platform compatibility. + * And sufficient input validation is performed before calling + */ +#ifndef OUTPUT_INL_2B263E9C_43D8_44BB_B17A_6D2033DECEE5 +#define OUTPUT_INL_2B263E9C_43D8_44BB_B17A_6D2033DECEE5 + +#ifndef SECUREC_ENABLE_SPRINTF_LONG_DOUBLE +/* Some compilers do not support long double */ +#define SECUREC_ENABLE_SPRINTF_LONG_DOUBLE 1 +#endif + +#define SECUREC_NULL_STRING_SIZE 8 +#define SECUREC_STATE_TABLE_SIZE 337 + +#if defined(SECUREC_VXWORKS_VERSION_5_4) && !defined(SECUREC_ON_64BITS) +#define SECUREC_DIV_QUOTIENT_OCTAL(val64) ((val64) >> 3ULL) +#define SECUREC_DIV_RESIDUE_OCTAL(val64) ((val64) & 7ULL) + +#define SECUREC_DIV_QUOTIENT_HEX(val64) ((val64) >> 4ULL) +#define SECUREC_DIV_RESIDUE_HEX(val64) ((val64) & 0xfULL) +#endif + +#define SECUREC_RADIX_OCTAL 8U +#define SECUREC_RADIX_DECIMAL 10U +#define SECUREC_RADIX_HEX 16U +#define SECUREC_PREFIX_LEN 2 +/* Size include '+' and '\0' */ +#define SECUREC_FLOAT_BUF_EXT 2 + +/* Sign extend or Zero-extend */ +#define SECUREC_GET_LONG_FROM_ARG(attr) ((((attr).flags & SECUREC_FLAG_SIGNED) != 0) ? \ + (SecInt64)(long)va_arg(argList, long) : \ + (SecInt64)(unsigned long)va_arg(argList, long)) + +/* Sign extend or Zero-extend */ +#define SECUREC_GET_CHAR_FROM_ARG(attr) ((((attr).flags & SECUREC_FLAG_SIGNED) != 0) ? \ + SecUpdateNegativeChar(&(attr), ((char)va_arg(argList, int))) : \ + (SecInt64)(unsigned char)va_arg(argList, int)) + +/* Sign extend or Zero-extend */ +#define SECUREC_GET_SHORT_FROM_ARG(attr) ((((attr).flags & SECUREC_FLAG_SIGNED) != 0) ? \ + (SecInt64)(short)va_arg(argList, int) : \ + (SecInt64)(unsigned short)va_arg(argList, int)) + +/* Sign extend or Zero-extend */ +#define SECUREC_GET_INT_FROM_ARG(attr) ((((attr).flags & SECUREC_FLAG_SIGNED) != 0) ? \ + (SecInt64)(int)va_arg(argList, int) : \ + (SecInt64)(unsigned int)va_arg(argList, int)) + +#ifdef SECUREC_COMPATIBLE_LINUX_FORMAT +/* Sign extend or Zero-extend. No suitable macros were found to handle the branch */ +#define SECUREC_GET_SIZE_FROM_ARG(attr) ((((attr).flags & SECUREC_FLAG_SIGNED) != 0) ? \ + ((SecIsSameSize(sizeof(size_t), sizeof(long)) != 0) ? (SecInt64)(long)va_arg(argList, long) : \ + ((SecIsSameSize(sizeof(size_t), sizeof(long long)) != 0) ? (SecInt64)(long long)va_arg(argList, long long) : \ + (SecInt64)(int)va_arg(argList, int))) : \ + (SecInt64)(size_t)va_arg(argList, size_t)) +#endif + +/* Format output buffer pointer and available size */ +typedef struct { + int count; + SecChar *cur; +} SecPrintfStream; + +typedef union { + /* Integer formatting refers to the end of the buffer, plus 1 to prevent tool alarms */ + char str[SECUREC_BUFFER_SIZE + 1]; +#if SECUREC_HAVE_WCHART + wchar_t wStr[SECUREC_WCHAR_BUFFER_SIZE]; /* Just for %lc */ +#endif +} SecBuffer; + +typedef union { + char *str; /* Not a null terminated string */ +#if SECUREC_HAVE_WCHART + wchar_t *wStr; +#endif +} SecFormatBuf; + +typedef struct { + const char *digits; /* Point to the hexadecimal subset */ + SecFormatBuf text; /* Point to formatted string */ + int textLen; /* Length of the text */ + int textIsWide; /* Flag for text is wide chars ; 0 is not wide char */ + unsigned int radix; /* Use for output number , default set to 10 */ + unsigned int flags; + int fldWidth; + int precision; + int dynWidth; /* %* 1 width from variable parameter ;0 not */ + int dynPrecision; /* %.* 1 precision from variable parameter ;0 not */ + int padding; /* Padding len */ + int prefixLen; /* Length of prefix, 0 or 1 or 2 */ + SecChar prefix[SECUREC_PREFIX_LEN]; /* Prefix is 0 or 0x */ + SecBuffer buffer; +} SecFormatAttr; + +#if SECUREC_ENABLE_SPRINTF_FLOAT +#ifdef SECUREC_STACK_SIZE_LESS_THAN_1K +#define SECUREC_FMT_STR_LEN 8 +#else +#define SECUREC_FMT_STR_LEN 16 +#endif +typedef struct { + char buffer[SECUREC_FMT_STR_LEN]; + char *fmtStr; /* Initialization must point to buffer */ + char *allocatedFmtStr; /* Initialization must be NULL to store allocated point */ + char *floatBuffer; /* Use heap memory if the SecFormatAttr.buffer is not enough */ + int bufferSize; /* The size of floatBuffer */ +} SecFloatAdapt; +#endif + +/* Use 20 to Align the data */ +#define SECUREC_DIGITS_BUF_SIZE 20 +/* The serial number of 'x' or 'X' is 16 */ +#define SECUREC_NUMBER_OF_X 16 +/* Some systems can not use pointers to point to string literals, but can use string arrays. */ +/* For example, when handling code under uboot, there is a problem with the pointer */ +static const char g_itoaUpperDigits[SECUREC_DIGITS_BUF_SIZE] = "0123456789ABCDEFX"; +static const char g_itoaLowerDigits[SECUREC_DIGITS_BUF_SIZE] = "0123456789abcdefx"; + +#if SECUREC_ENABLE_SPRINTF_FLOAT +/* Call system sprintf to format float value */ +SECUREC_INLINE int SecFormatFloat(char *strDest, const char *format, ...) +{ + int ret; /* If initialization causes e838 */ + va_list argList; + + va_start(argList, format); + SECUREC_MASK_VSPRINTF_WARNING + ret = vsprintf(strDest, format, argList); + SECUREC_END_MASK_VSPRINTF_WARNING + va_end(argList); + (void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */ + + return ret; +} + +#if defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && SECUREC_ENABLE_SPRINTF_LONG_DOUBLE +/* Out put long double value to dest */ +SECUREC_INLINE void SecFormatLongDouble(SecFormatAttr *attr, const SecFloatAdapt *floatAdapt, long double ldValue) +{ + int fldWidth = (((attr->flags & SECUREC_FLAG_LEFT) != 0) ? (-attr->fldWidth) : attr->fldWidth); + if (attr->dynWidth != 0 && attr->dynPrecision != 0) { + attr->textLen = SecFormatFloat(attr->text.str, floatAdapt->fmtStr, fldWidth, attr->precision, ldValue); + } else if (attr->dynWidth != 0) { + attr->textLen = SecFormatFloat(attr->text.str, floatAdapt->fmtStr, fldWidth, ldValue); + } else if (attr->dynPrecision != 0) { + attr->textLen = SecFormatFloat(attr->text.str, floatAdapt->fmtStr, attr->precision, ldValue); + } else { + attr->textLen = SecFormatFloat(attr->text.str, floatAdapt->fmtStr, ldValue); + } + if (attr->textLen < 0 || attr->textLen >= floatAdapt->bufferSize) { + attr->textLen = 0; + } +} +#endif + +/* Out put double value to dest */ +SECUREC_INLINE void SecFormatDouble(SecFormatAttr *attr, const SecFloatAdapt *floatAdapt, double dValue) +{ + int fldWidth = (((attr->flags & SECUREC_FLAG_LEFT) != 0) ? (-attr->fldWidth) : attr->fldWidth); + if (attr->dynWidth != 0 && attr->dynPrecision != 0) { + attr->textLen = SecFormatFloat(attr->text.str, floatAdapt->fmtStr, fldWidth, attr->precision, dValue); + } else if (attr->dynWidth != 0) { + attr->textLen = SecFormatFloat(attr->text.str, floatAdapt->fmtStr, fldWidth, dValue); + } else if (attr->dynPrecision != 0) { + attr->textLen = SecFormatFloat(attr->text.str, floatAdapt->fmtStr, attr->precision, dValue); + } else { + attr->textLen = SecFormatFloat(attr->text.str, floatAdapt->fmtStr, dValue); + } + if (attr->textLen < 0 || attr->textLen >= floatAdapt->bufferSize) { + attr->textLen = 0; + } +} +#endif + +#ifdef SECUREC_COMPATIBLE_LINUX_FORMAT +/* To clear e506 warning */ +SECUREC_INLINE int SecIsSameSize(size_t sizeA, size_t sizeB) +{ + return (int)(sizeA == sizeB); +} +#endif + +#ifndef SECUREC_ON_64BITS +/* + * Compiler Optimized Division 8. + * The text.str point to buffer end, must be Large enough + */ +SECUREC_INLINE void SecNumber32ToOctalString(SecUnsignedInt32 number, SecFormatAttr *attr) +{ + SecUnsignedInt32 val32 = number; + do { + --attr->text.str; + /* Just use lowerDigits for 0 - 9 */ + *(attr->text.str) = g_itoaLowerDigits[val32 % SECUREC_RADIX_OCTAL]; + val32 /= SECUREC_RADIX_OCTAL; + } while (val32 != 0); +} + +#ifdef _AIX +/* + * Compiler Optimized Division 10. + * The text.str point to buffer end, must be Large enough + */ +SECUREC_INLINE void SecNumber32ToDecString(SecUnsignedInt32 number, SecFormatAttr *attr) +{ + SecUnsignedInt32 val32 = number; + do { + --attr->text.str; + /* Just use lowerDigits for 0 - 9 */ + *(attr->text.str) = g_itoaLowerDigits[val32 % SECUREC_RADIX_DECIMAL]; + val32 /= SECUREC_RADIX_DECIMAL; + } while (val32 != 0); +} +#endif +/* + * Compiler Optimized Division 16. + * The text.str point to buffer end, must be Large enough + */ +SECUREC_INLINE void SecNumber32ToHexString(SecUnsignedInt32 number, SecFormatAttr *attr) +{ + SecUnsignedInt32 val32 = number; + do { + --attr->text.str; + *(attr->text.str) = attr->digits[val32 % SECUREC_RADIX_HEX]; + val32 /= SECUREC_RADIX_HEX; + } while (val32 != 0); +} + +#ifndef _AIX +/* Use fast div 10 */ +SECUREC_INLINE void SecNumber32ToDecStringFast(SecUnsignedInt32 number, SecFormatAttr *attr) +{ + SecUnsignedInt32 val32 = number; + do { + SecUnsignedInt32 quotient; + SecUnsignedInt32 remain; + --attr->text.str; + *(attr->text.str) = g_itoaLowerDigits[val32 % SECUREC_RADIX_DECIMAL]; + quotient = (val32 >> 1U) + (val32 >> 2U); /* Fast div magic 2 */ + quotient = quotient + (quotient >> 4U); /* Fast div magic 4 */ + quotient = quotient + (quotient >> 8U); /* Fast div magic 8 */ + quotient = quotient + (quotient >> 16U); /* Fast div magic 16 */ + quotient = quotient >> 3U; /* Fast div magic 3 */ + remain = val32 - SECUREC_MUL_TEN(quotient); + val32 = (remain > 9U) ? (quotient + 1U) : quotient; /* Fast div magic 9 */ + } while (val32 != 0); +} +#endif + +SECUREC_INLINE void SecNumber32ToString(SecUnsignedInt32 number, SecFormatAttr *attr) +{ + switch (attr->radix) { + case SECUREC_RADIX_HEX: + SecNumber32ToHexString(number, attr); + break; + case SECUREC_RADIX_OCTAL: + SecNumber32ToOctalString(number, attr); + break; + case SECUREC_RADIX_DECIMAL: +#ifdef _AIX + /* The compiler will optimize div 10 */ + SecNumber32ToDecString(number, attr); +#else + SecNumber32ToDecStringFast(number, attr); +#endif + break; + default: + /* Do nothing */ + break; + } +} +#endif + +#if defined(SECUREC_USE_SPECIAL_DIV64) || (defined(SECUREC_VXWORKS_VERSION_5_4) && !defined(SECUREC_ON_64BITS)) +/* + * This function just to clear warning, on sume vxworks compiler shift 32 bit make warnings + */ +SECUREC_INLINE SecUnsignedInt64 SecU64Shr32(SecUnsignedInt64 number) +{ + return (((number) >> 16U) >> 16U); /* Two shifts of 16 bits to realize shifts of 32 bits */ +} +/* + * Fast divide by 10 algorithm. + * Calculation divisor multiply 0xcccccccccccccccdULL, resultHi64 >> 3 as quotient + */ +SECUREC_INLINE void SecU64Div10(SecUnsignedInt64 divisor, SecUnsignedInt64 *quotient, SecUnsignedInt32 *residue) +{ + SecUnsignedInt64 mask = 0xffffffffULL; /* Use 0xffffffffULL as 32 bit mask */ + SecUnsignedInt64 magicHi = 0xccccccccULL; /* Fast divide 10 magic numbers high 32bit 0xccccccccULL */ + SecUnsignedInt64 magicLow = 0xcccccccdULL; /* Fast divide 10 magic numbers low 32bit 0xcccccccdULL */ + SecUnsignedInt64 divisorHi = (SecUnsignedInt64)(SecU64Shr32(divisor)); /* High 32 bit use */ + SecUnsignedInt64 divisorLow = (SecUnsignedInt64)(divisor & mask); /* Low 32 bit mask */ + SecUnsignedInt64 factorHi = divisorHi * magicHi; + SecUnsignedInt64 factorLow1 = divisorHi * magicLow; + SecUnsignedInt64 factorLow2 = divisorLow * magicHi; + SecUnsignedInt64 factorLow3 = divisorLow * magicLow; + SecUnsignedInt64 carry = (factorLow1 & mask) + (factorLow2 & mask) + SecU64Shr32(factorLow3); + SecUnsignedInt64 resultHi64 = factorHi + SecU64Shr32(factorLow1) + SecU64Shr32(factorLow2) + SecU64Shr32(carry); + + *quotient = resultHi64 >> 3U; /* Fast divide 10 magic numbers 3 */ + *residue = (SecUnsignedInt32)(divisor - ((*quotient) * 10)); /* Quotient mul 10 */ + return; +} +#if defined(SECUREC_VXWORKS_VERSION_5_4) && !defined(SECUREC_ON_64BITS) +/* + * Divide function for VXWORKS + */ +SECUREC_INLINE int SecU64Div32(SecUnsignedInt64 divisor, SecUnsignedInt32 radix, + SecUnsignedInt64 *quotient, SecUnsignedInt32 *residue) +{ + switch (radix) { + case SECUREC_RADIX_DECIMAL: + SecU64Div10(divisor, quotient, residue); + break; + case SECUREC_RADIX_HEX: + *quotient = SECUREC_DIV_QUOTIENT_HEX(divisor); + *residue = (SecUnsignedInt32)SECUREC_DIV_RESIDUE_HEX(divisor); + break; + case SECUREC_RADIX_OCTAL: + *quotient = SECUREC_DIV_QUOTIENT_OCTAL(divisor); + *residue = (SecUnsignedInt32)SECUREC_DIV_RESIDUE_OCTAL(divisor); + break; + default: + return -1; /* This does not happen in the current file */ + } + return 0; +} +SECUREC_INLINE void SecNumber64ToStringSpecial(SecUnsignedInt64 number, SecFormatAttr *attr) +{ + SecUnsignedInt64 val64 = number; + do { + SecUnsignedInt32 digit = 0; /* Ascii value of digit */ + SecUnsignedInt64 quotient = 0; + if (SecU64Div32(val64, (SecUnsignedInt32)attr->radix, "ient, &digit) != 0) { + /* Just break, when enter this function, no error is returned */ + break; + } + --attr->text.str; + *(attr->text.str) = attr->digits[digit]; + val64 = quotient; + } while (val64 != 0); +} +#endif +#endif + +#if defined(SECUREC_ON_64BITS) || !defined(SECUREC_VXWORKS_VERSION_5_4) +#if defined(SECUREC_USE_SPECIAL_DIV64) +/* The compiler does not provide 64 bit division problems */ +SECUREC_INLINE void SecNumber64ToDecString(SecUnsignedInt64 number, SecFormatAttr *attr) +{ + SecUnsignedInt64 val64 = number; + do { + SecUnsignedInt64 quotient = 0; + SecUnsignedInt32 digit = 0; + SecU64Div10(val64, "ient, &digit); + --attr->text.str; + /* Just use lowerDigits for 0 - 9 */ + *(attr->text.str) = g_itoaLowerDigits[digit]; + val64 = quotient; + } while (val64 != 0); +} +#else +/* + * Compiler Optimized Division 10. + * The text.str point to buffer end, must be Large enough + */ +SECUREC_INLINE void SecNumber64ToDecString(SecUnsignedInt64 number, SecFormatAttr *attr) +{ + SecUnsignedInt64 val64 = number; + do { + --attr->text.str; + /* Just use lowerDigits for 0 - 9 */ + *(attr->text.str) = g_itoaLowerDigits[val64 % SECUREC_RADIX_DECIMAL]; + val64 /= SECUREC_RADIX_DECIMAL; + } while (val64 != 0); +} +#endif + +/* + * Compiler Optimized Division 8. + * The text.str point to buffer end, must be Large enough + */ +SECUREC_INLINE void SecNumber64ToOctalString(SecUnsignedInt64 number, SecFormatAttr *attr) +{ + SecUnsignedInt64 val64 = number; + do { + --attr->text.str; + /* Just use lowerDigits for 0 - 9 */ + *(attr->text.str) = g_itoaLowerDigits[val64 % SECUREC_RADIX_OCTAL]; + val64 /= SECUREC_RADIX_OCTAL; + } while (val64 != 0); +} +/* + * Compiler Optimized Division 16. + * The text.str point to buffer end, must be Large enough + */ +SECUREC_INLINE void SecNumber64ToHexString(SecUnsignedInt64 number, SecFormatAttr *attr) +{ + SecUnsignedInt64 val64 = number; + do { + --attr->text.str; + *(attr->text.str) = attr->digits[val64 % SECUREC_RADIX_HEX]; + val64 /= SECUREC_RADIX_HEX; + } while (val64 != 0); +} + +SECUREC_INLINE void SecNumber64ToString(SecUnsignedInt64 number, SecFormatAttr *attr) +{ + switch (attr->radix) { + /* The compiler will optimize div 10 */ + case SECUREC_RADIX_DECIMAL: + SecNumber64ToDecString(number, attr); + break; + case SECUREC_RADIX_OCTAL: + SecNumber64ToOctalString(number, attr); + break; + case SECUREC_RADIX_HEX: + SecNumber64ToHexString(number, attr); + break; + default: + /* Do nothing */ + break; + } +} +#endif + +/* + * Converting integers to string + */ +SECUREC_INLINE void SecNumberToString(SecUnsignedInt64 number, SecFormatAttr *attr) +{ +#ifdef SECUREC_ON_64BITS + SecNumber64ToString(number, attr); +#else /* For 32 bits system */ + if (number <= 0xffffffffUL) { /* Use 0xffffffffUL to check if the value is in the 32-bit range */ + /* In most case, the value to be converted is small value */ + SecUnsignedInt32 n32Tmp = (SecUnsignedInt32)number; + SecNumber32ToString(n32Tmp, attr); + } else { + /* The value to be converted is greater than 4G */ +#if defined(SECUREC_VXWORKS_VERSION_5_4) + SecNumber64ToStringSpecial(number, attr); +#else + SecNumber64ToString(number, attr); +#endif + } +#endif +} + +SECUREC_INLINE int SecIsNumberNeedTo32Bit(const SecFormatAttr *attr) +{ + return (int)(((attr->flags & SECUREC_FLAG_I64) == 0) && +#ifdef SECUREC_COMPATIBLE_LINUX_FORMAT + ((attr->flags & SECUREC_FLAG_INTMAX) == 0) && +#endif +#ifdef SECUREC_ON_64BITS + ((attr->flags & SECUREC_FLAG_PTRDIFF) == 0) && + ((attr->flags & SECUREC_FLAG_SIZE) == 0) && +#if !defined(SECUREC_COMPATIBLE_WIN_FORMAT) /* on window 64 system sizeof long is 32bit */ + ((attr->flags & SECUREC_FLAG_LONG) == 0) && +#endif +#endif + ((attr->flags & SECUREC_FLAG_LONGLONG) == 0)); +} + +SECUREC_INLINE void SecNumberToBuffer(SecFormatAttr *attr, SecInt64 num64) +{ + SecUnsignedInt64 number; + /* Check for negative; copy into number */ + if ((attr->flags & SECUREC_FLAG_SIGNED) != 0 && num64 < 0) { + number = (SecUnsignedInt64)(0 - (SecUnsignedInt64)num64); /* Wrap with unsigned int64 numbers */ + attr->flags |= SECUREC_FLAG_NEGATIVE; + } else { + number = (SecUnsignedInt64)num64; + } + if (SecIsNumberNeedTo32Bit(attr) != 0) { + number = (number & (SecUnsignedInt64)0xffffffffUL); /* Use 0xffffffff as 32 bit mask */ + } + + /* The text.str must be point to buffer.str, this pointer is used outside the function */ + attr->text.str = &attr->buffer.str[SECUREC_BUFFER_SIZE]; + + if (number == 0) { + /* Turn off hex prefix default, and textLen is zero */ + attr->prefixLen = 0; + attr->textLen = 0; + return; + } + + /* Convert integer to string. It must be invoked when number > 0, otherwise the following logic is incorrect */ + SecNumberToString(number, attr); + /* Compute length of number, text.str must be in buffer.str */ + attr->textLen = (int)(size_t)((char *)&attr->buffer.str[SECUREC_BUFFER_SIZE] - attr->text.str); +} + +/* + * Write one character to dest buffer + */ +SECUREC_INLINE void SecWriteChar(SecPrintfStream *stream, SecChar ch, int *charsOut) +{ + /* Count must be reduced first, In order to identify insufficient length */ + --stream->count; + if (stream->count >= 0) { + *(stream->cur) = ch; + ++stream->cur; + *charsOut = *charsOut + 1; + return; + } + /* No enough length */ + *charsOut = -1; +} + +/* +* Write multiple identical characters. +*/ +SECUREC_INLINE void SecWriteMultiChar(SecPrintfStream *stream, SecChar ch, int num, int *charsOut) +{ + int count; + for (count = num; count > 0; --count) { + --stream->count; /* count may be negative,indicating insufficient space */ + if (stream->count < 0) { + *charsOut = -1; + return; + } + *(stream->cur) = ch; + ++stream->cur; + } + *charsOut = *charsOut + num; +} + +/* +* Write string function, where this function is called, make sure that len is greater than 0 +*/ +SECUREC_INLINE void SecWriteString(SecPrintfStream *stream, const SecChar *str, int len, int *charsOut) +{ + const SecChar *tmp = str; + int count; + for (count = len; count > 0; --count) { + --stream->count; /* count may be negative,indicating insufficient space */ + if (stream->count < 0) { + *charsOut = -1; + return; + } + *(stream->cur) = *tmp; + ++stream->cur; + ++tmp; + } + *charsOut = *charsOut + len; +} + +/* Use loop copy char or wchar_t string */ +SECUREC_INLINE void SecWriteStringByLoop(SecPrintfStream *stream, const SecChar *str, int len) +{ + int i; + const SecChar *tmp = str; + for (i = 0; i < len; ++i) { + *stream->cur = *tmp; + ++stream->cur; + ++tmp; + } + stream->count -= len; +} + +SECUREC_INLINE void SecWriteStringOpt(SecPrintfStream *stream, const SecChar *str, int len) +{ + if (len < 12) { /* Performance optimization for mobile number length 12 */ + SecWriteStringByLoop(stream, str, len); + } else { + size_t count = (size_t)(unsigned int)len * sizeof(SecChar); + SECUREC_MEMCPY_WARP_OPT(stream->cur, str, count); + stream->cur += len; + stream->count -= len; + } +} + +/* + * Return if buffer length is enough + * The count variable can be reduced to 0, and the external function complements the \0 terminator. + */ +SECUREC_INLINE int SecIsStreamBufEnough(const SecPrintfStream *stream, int needLen) +{ + return (int)(stream->count >= needLen); +} + +/* Write text string */ +SECUREC_INLINE void SecWriteTextOpt(SecPrintfStream *stream, const SecChar *str, int len, int *charsOut) +{ + if (SecIsStreamBufEnough(stream, len) != 0) { + SecWriteStringOpt(stream, str, len); + *charsOut += len; + } else { + SecWriteString(stream, str, len, charsOut); + } +} + +/* Write left padding */ +SECUREC_INLINE void SecWriteLeftPadding(SecPrintfStream *stream, const SecFormatAttr *attr, int *charsOut) +{ + if ((attr->flags & (SECUREC_FLAG_LEFT | SECUREC_FLAG_LEADZERO)) == 0 && attr->padding > 0) { + /* Pad on left with blanks */ + SecWriteMultiChar(stream, SECUREC_CHAR(' '), attr->padding, charsOut); + } +} + +/* Write prefix */ +SECUREC_INLINE void SecWritePrefix(SecPrintfStream *stream, const SecFormatAttr *attr, int *charsOut) +{ + if (attr->prefixLen > 0) { + SecWriteString(stream, attr->prefix, attr->prefixLen, charsOut); + } +} + +/* Write leading zeros */ +SECUREC_INLINE void SecWriteLeadingZero(SecPrintfStream *stream, const SecFormatAttr *attr, int *charsOut) +{ + if ((attr->flags & SECUREC_FLAG_LEADZERO) != 0 && (attr->flags & SECUREC_FLAG_LEFT) == 0 && + attr->padding > 0) { + SecWriteMultiChar(stream, SECUREC_CHAR('0'), attr->padding, charsOut); + } +} + +/* Write right padding */ +SECUREC_INLINE void SecWriteRightPadding(SecPrintfStream *stream, const SecFormatAttr *attr, int *charsOut) +{ + if (*charsOut >= 0 && (attr->flags & SECUREC_FLAG_LEFT) != 0 && attr->padding > 0) { + /* Pad on right with blanks */ + SecWriteMultiChar(stream, SECUREC_CHAR(' '), attr->padding, charsOut); + } +} + +#ifdef SECUREC_FOR_WCHAR +#define SECUREC_TEXT_CHAR_PTR(text) ((text).wStr) +#define SECUREC_NEED_CONVERT_TEXT(attr) ((attr)->textIsWide == 0) +#if SECUREC_HAVE_MBTOWC +#define SECUREC_WRITE_TEXT_AFTER_CONVERT(stream, attr, charsOut) SecWriteTextAfterMbtowc((stream), (attr), (charsOut)) +#else +#define SECUREC_WRITE_TEXT_AFTER_CONVERT(stream, attr, charsOut) (*(charsOut) = -1) +#endif +#else +#define SECUREC_TEXT_CHAR_PTR(text) ((text).str) +#define SECUREC_NEED_CONVERT_TEXT(attr) ((attr)->textIsWide != 0) +#if SECUREC_HAVE_WCTOMB +#define SECUREC_WRITE_TEXT_AFTER_CONVERT(stream, attr, charsOut) SecWriteTextAfterWctomb((stream), (attr), (charsOut)) +#else +#define SECUREC_WRITE_TEXT_AFTER_CONVERT(stream, attr, charsOut) (*(charsOut) = -1) +#endif +#endif + +#ifdef SECUREC_FOR_WCHAR +#if SECUREC_HAVE_MBTOWC +SECUREC_INLINE void SecWriteTextAfterMbtowc(SecPrintfStream *stream, const SecFormatAttr *attr, int *charsOut) +{ + const char *p = attr->text.str; + int count = attr->textLen; + while (count > 0) { + wchar_t wChar = L'\0'; + int retVal = mbtowc(&wChar, p, (size_t)MB_CUR_MAX); + if (retVal <= 0) { + *charsOut = -1; + break; + } + SecWriteChar(stream, wChar, charsOut); + if (*charsOut == -1) { + break; + } + p += retVal; + count -= retVal; + } +} +#endif +#else /* Not SECUREC_FOR_WCHAR */ +#if SECUREC_HAVE_WCTOMB +SECUREC_INLINE void SecWriteTextAfterWctomb(SecPrintfStream *stream, const SecFormatAttr *attr, int *charsOut) +{ + const wchar_t *p = attr->text.wStr; + int count = attr->textLen; + while (count > 0) { + char tmpBuf[SECUREC_MB_LEN + 1]; + SECUREC_MASK_MSVC_CRT_WARNING + int retVal = wctomb(tmpBuf, *p); + SECUREC_END_MASK_MSVC_CRT_WARNING + if (retVal <= 0) { + *charsOut = -1; + break; + } + SecWriteString(stream, tmpBuf, retVal, charsOut); + if (*charsOut == -1) { + break; + } + --count; + ++p; + } +} +#endif +#endif + +#if SECUREC_ENABLE_SPRINTF_FLOAT +/* + * Write text of float + * Using independent functions to optimize the expansion of inline functions by the compiler + */ +SECUREC_INLINE void SecWriteFloatText(SecPrintfStream *stream, const SecFormatAttr *attr, int *charsOut) +{ +#ifdef SECUREC_FOR_WCHAR +#if SECUREC_HAVE_MBTOWC + SecWriteTextAfterMbtowc(stream, attr, charsOut); +#else + *charsOut = -1; + (void)stream; /* To clear e438 last value assigned not used , the compiler will optimize this code */ + (void)attr; /* To clear e438 last value assigned not used , the compiler will optimize this code */ +#endif +#else /* Not SECUREC_FOR_WCHAR */ + SecWriteString(stream, attr->text.str, attr->textLen, charsOut); +#endif +} +#endif + +/* Write text of integer or string ... */ +SECUREC_INLINE void SecWriteText(SecPrintfStream *stream, const SecFormatAttr *attr, int *charsOut) +{ + if (SECUREC_NEED_CONVERT_TEXT(attr)) { + SECUREC_WRITE_TEXT_AFTER_CONVERT(stream, attr, charsOut); + } else { + SecWriteTextOpt(stream, SECUREC_TEXT_CHAR_PTR(attr->text), attr->textLen, charsOut); + } +} + +#define SECUREC_FMT_STATE_OFFSET 256 + +SECUREC_INLINE SecFmtState SecDecodeState(SecChar ch, SecFmtState lastState) +{ + static const unsigned char stateTable[SECUREC_STATE_TABLE_SIZE] = { + /* + * Type + * 0: nospecial meaning; + * 1: '%' + * 2: '.' + * 3: '*' + * 4: '0' + * 5: '1' ... '9' + * 6: ' ', '+', '-', '#' + * 7: 'h', 'l', 'L', 'w' , 'N', 'z', 'q', 't', 'j' + * 8: 'd', 'o', 'u', 'i', 'x', 'X', 'e', 'f', 'g', 'E', 'F', 'G', 's', 'c', '[', 'p' + */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x00, 0x06, 0x02, 0x00, + 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x08, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x08, 0x07, 0x00, 0x07, 0x00, 0x00, 0x08, + 0x08, 0x07, 0x00, 0x08, 0x07, 0x08, 0x00, 0x07, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + /* Fill zero for normal char 128 byte for 0x80 - 0xff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* + * State + * 0: normal + * 1: percent + * 2: flag + * 3: width + * 4: dot + * 5: precis + * 6: size + * 7: type + * 8: invalid + */ + 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x01, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x01, 0x00, 0x00, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x03, 0x03, 0x08, 0x05, + 0x08, 0x08, 0x00, 0x00, 0x00, 0x02, 0x02, 0x03, 0x05, 0x05, 0x08, 0x00, 0x00, 0x00, 0x03, 0x03, + 0x03, 0x05, 0x05, 0x08, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, + 0x00 + }; + +#ifdef SECUREC_FOR_WCHAR + /* Convert to unsigned char to clear gcc 4.3.4 warning */ + unsigned char fmtType = (unsigned char)((((unsigned int)(int)(ch)) <= (unsigned int)(int)(L'~')) ? \ + (stateTable[(unsigned char)(ch)]) : 0); + return (SecFmtState)(stateTable[fmtType * ((unsigned char)STAT_INVALID + 1) + + (unsigned char)(lastState) + SECUREC_FMT_STATE_OFFSET]); +#else + unsigned char fmtType = stateTable[(unsigned char)(ch)]; + return (SecFmtState)(stateTable[fmtType * ((unsigned char)STAT_INVALID + 1) + + (unsigned char)(lastState) + SECUREC_FMT_STATE_OFFSET]); +#endif +} + +SECUREC_INLINE void SecDecodeFlags(SecChar ch, SecFormatAttr *attr) +{ + switch (ch) { + case SECUREC_CHAR(' '): + attr->flags |= SECUREC_FLAG_SIGN_SPACE; + break; + case SECUREC_CHAR('+'): + attr->flags |= SECUREC_FLAG_SIGN; + break; + case SECUREC_CHAR('-'): + attr->flags |= SECUREC_FLAG_LEFT; + break; + case SECUREC_CHAR('0'): + attr->flags |= SECUREC_FLAG_LEADZERO; /* Add zero th the front */ + break; + case SECUREC_CHAR('#'): + attr->flags |= SECUREC_FLAG_ALTERNATE; /* Output %x with 0x */ + break; + default: + /* Do nothing */ + break; + } + return; +} + +/* + * Decoded size identifier in format string to Reduce the number of lines of function code + */ +SECUREC_INLINE int SecDecodeSizeI(SecFormatAttr *attr, const SecChar **format) +{ +#ifdef SECUREC_ON_64BITS + attr->flags |= SECUREC_FLAG_I64; /* %I to INT64 */ +#endif + if ((**format == SECUREC_CHAR('6')) && (*((*format) + 1) == SECUREC_CHAR('4'))) { + (*format) += 2; /* Add 2 to skip I64 */ + attr->flags |= SECUREC_FLAG_I64; /* %I64 to INT64 */ + } else if ((**format == SECUREC_CHAR('3')) && (*((*format) + 1) == SECUREC_CHAR('2'))) { + (*format) += 2; /* Add 2 to skip I32 */ + attr->flags &= ~SECUREC_FLAG_I64; /* %I64 to INT32 */ + } else if ((**format == SECUREC_CHAR('d')) || (**format == SECUREC_CHAR('i')) || + (**format == SECUREC_CHAR('o')) || (**format == SECUREC_CHAR('u')) || + (**format == SECUREC_CHAR('x')) || (**format == SECUREC_CHAR('X'))) { + /* Do nothing */ + } else { + /* Compatibility code for "%I" just print I */ + return -1; + } + return 0; +} + +/* + * Decoded size identifier in format string, and skip format to next charater + */ +SECUREC_INLINE int SecDecodeSize(SecChar ch, SecFormatAttr *attr, const SecChar **format) +{ + switch (ch) { + case SECUREC_CHAR('l'): + if (**format == SECUREC_CHAR('l')) { + *format = *format + 1; + attr->flags |= SECUREC_FLAG_LONGLONG; /* For long long */ + } else { + attr->flags |= SECUREC_FLAG_LONG; /* For long int or wchar_t */ + } + break; +#ifdef SECUREC_COMPATIBLE_LINUX_FORMAT + case SECUREC_CHAR('z'): /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('Z'): + attr->flags |= SECUREC_FLAG_SIZE; + break; + case SECUREC_CHAR('j'): + attr->flags |= SECUREC_FLAG_INTMAX; + break; +#endif + case SECUREC_CHAR('t'): + attr->flags |= SECUREC_FLAG_PTRDIFF; + break; + case SECUREC_CHAR('q'): /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('L'): + attr->flags |= (SECUREC_FLAG_LONGLONG | SECUREC_FLAG_LONG_DOUBLE); + break; + case SECUREC_CHAR('I'): + if (SecDecodeSizeI(attr, format) != 0) { + /* Compatibility code for "%I" just print I */ + return -1; + } + break; + case SECUREC_CHAR('h'): + if (**format == SECUREC_CHAR('h')) { + *format = *format + 1; + attr->flags |= SECUREC_FLAG_CHAR; /* For char */ + } else { + attr->flags |= SECUREC_FLAG_SHORT; /* For short int */ + } + break; + case SECUREC_CHAR('w'): + attr->flags |= SECUREC_FLAG_WIDECHAR; /* For wide char */ + break; + default: + /* Do nothing */ + break; + } + return 0; +} + +/* + * Decoded char type identifier + */ +SECUREC_INLINE void SecDecodeTypeC(SecFormatAttr *attr, unsigned int c) +{ + attr->textLen = 1; /* Only 1 wide character */ + +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT)) && !(defined(__hpux)) && !(defined(SECUREC_ON_SOLARIS)) + attr->flags &= ~SECUREC_FLAG_LEADZERO; +#endif + +#ifdef SECUREC_FOR_WCHAR + if ((attr->flags & SECUREC_FLAG_SHORT) != 0) { + /* Get multibyte character from argument */ + attr->buffer.str[0] = (char)c; + attr->text.str = attr->buffer.str; + attr->textIsWide = 0; + } else { + attr->buffer.wStr[0] = (wchar_t)c; + attr->text.wStr = attr->buffer.wStr; + attr->textIsWide = 1; + } +#else /* Not SECUREC_FOR_WCHAR */ + if ((attr->flags & (SECUREC_FLAG_LONG | SECUREC_FLAG_WIDECHAR)) != 0) { +#if SECUREC_HAVE_WCHART + attr->buffer.wStr[0] = (wchar_t)c; + attr->text.wStr = attr->buffer.wStr; + attr->textIsWide = 1; +#else + attr->textLen = 0; /* Ignore unsupported characters */ + attr->fldWidth = 0; /* No paddings */ +#endif + } else { + /* Get multibyte character from argument */ + attr->buffer.str[0] = (char)c; + attr->text.str = attr->buffer.str; + attr->textIsWide = 0; + } +#endif +} + +#ifdef SECUREC_FOR_WCHAR +#define SECUREC_IS_NARROW_STRING(attr) (((attr)->flags & SECUREC_FLAG_SHORT) != 0) +#else +#define SECUREC_IS_NARROW_STRING(attr) (((attr)->flags & (SECUREC_FLAG_LONG | SECUREC_FLAG_WIDECHAR)) == 0) +#endif + +SECUREC_INLINE void SecDecodeTypeSchar(SecFormatAttr *attr) +{ + size_t textLen; + if (attr->text.str == NULL) { + /* + * Literal string to print null ptr, define it as array rather than const text area + * To avoid gcc warning with pointing const text with variable + */ + static char strNullString[SECUREC_NULL_STRING_SIZE] = "(null)"; + attr->text.str = strNullString; + } + if (attr->precision == -1) { + /* Precision NOT assigned */ + /* The strlen performance is high when the string length is greater than 32 */ + textLen = strlen(attr->text.str); + if (textLen > SECUREC_STRING_MAX_LEN) { + textLen = 0; + } + } else { + /* Precision assigned */ + SECUREC_CALC_STR_LEN(attr->text.str, (size_t)(unsigned int)attr->precision, &textLen); + } + attr->textLen = (int)textLen; +} + +SECUREC_INLINE void SecDecodeTypeSwchar(SecFormatAttr *attr) +{ +#if SECUREC_HAVE_WCHART + size_t textLen; + attr->textIsWide = 1; + if (attr->text.wStr == NULL) { + /* + * Literal string to print null ptr, define it as array rather than const text area + * To avoid gcc warning with pointing const text with variable + */ + static wchar_t wStrNullString[SECUREC_NULL_STRING_SIZE] = { L'(', L'n', L'u', L'l', L'l', L')', L'\0', L'\0' }; + attr->text.wStr = wStrNullString; + } + /* The textLen in wchar_t,when precision is -1, it is unlimited */ + SECUREC_CALC_WSTR_LEN(attr->text.wStr, (size_t)(unsigned int)attr->precision, &textLen); + if (textLen > SECUREC_WCHAR_STRING_MAX_LEN) { + textLen = 0; + } + attr->textLen = (int)textLen; +#else + attr->textLen = 0; +#endif +} + +/* + * Decoded string identifier + */ +SECUREC_INLINE void SecDecodeTypeS(SecFormatAttr *attr, char *argPtr) +{ +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT)) +#if (!defined(SECUREC_ON_UNIX)) + attr->flags &= ~SECUREC_FLAG_LEADZERO; +#endif +#if (defined(SECUREC_FOR_WCHAR)) + if ((attr->flags & SECUREC_FLAG_LONG) == 0) { + attr->flags |= SECUREC_FLAG_SHORT; + } +#endif +#endif + attr->text.str = argPtr; + if (SECUREC_IS_NARROW_STRING(attr)) { + /* The textLen now contains length in multibyte chars */ + SecDecodeTypeSchar(attr); + } else { + /* The textLen now contains length in wide chars */ + SecDecodeTypeSwchar(attr); + } +} + +/* + * Check precision in format + */ +SECUREC_INLINE int SecDecodePrecision(SecChar ch, SecFormatAttr *attr) +{ + if (attr->dynPrecision == 0) { + /* Add digit to current precision */ + if (SECUREC_MUL_TEN_ADD_BEYOND_MAX(attr->precision)) { + return -1; + } + attr->precision = (int)SECUREC_MUL_TEN((unsigned int)attr->precision) + + (unsigned char)(ch - SECUREC_CHAR('0')); + } else { + if (attr->precision < 0) { + attr->precision = -1; + } + if (attr->precision > SECUREC_MAX_WIDTH_LEN) { + return -1; + } + } + return 0; +} + +/* + * Check width in format + */ +SECUREC_INLINE int SecDecodeWidth(SecChar ch, SecFormatAttr *attr, SecFmtState lastState) +{ + if (attr->dynWidth == 0) { + if (lastState != STAT_WIDTH) { + attr->fldWidth = 0; + } + if (SECUREC_MUL_TEN_ADD_BEYOND_MAX(attr->fldWidth)) { + return -1; + } + attr->fldWidth = (int)SECUREC_MUL_TEN((unsigned int)attr->fldWidth) + + (unsigned char)(ch - SECUREC_CHAR('0')); + } else { + if (attr->fldWidth < 0) { + attr->flags |= SECUREC_FLAG_LEFT; + attr->fldWidth = (-attr->fldWidth); + } + if (attr->fldWidth > SECUREC_MAX_WIDTH_LEN) { + return -1; + } + } + return 0; +} + +/* + * The sprintf_s function processes the wide character as a parameter for %C + * The swprintf_s function processes the multiple character as a parameter for %C + */ +SECUREC_INLINE void SecUpdateWcharFlags(SecFormatAttr *attr) +{ + if ((attr->flags & (SECUREC_FLAG_SHORT | SECUREC_FLAG_LONG | SECUREC_FLAG_WIDECHAR)) == 0) { +#ifdef SECUREC_FOR_WCHAR + attr->flags |= SECUREC_FLAG_SHORT; +#else + attr->flags |= SECUREC_FLAG_WIDECHAR; +#endif + } +} +/* + * When encountering %S, current just same as %C + */ +SECUREC_INLINE void SecUpdateWstringFlags(SecFormatAttr *attr) +{ + SecUpdateWcharFlags(attr); +} + +#if SECUREC_IN_KERNEL +SECUREC_INLINE void SecUpdatePointFlagsForKernel(SecFormatAttr *attr) +{ + /* Width is not set */ + if (attr->fldWidth <= 0) { + attr->flags |= SECUREC_FLAG_LEADZERO; + attr->fldWidth = 2 * sizeof(void *); /* 2 x byte number is the length of hex */ + } + if ((attr->flags & SECUREC_FLAG_ALTERNATE) != 0) { + /* Alternate form means '0x' prefix */ + attr->prefix[0] = SECUREC_CHAR('0'); + attr->prefix[1] = SECUREC_CHAR('x'); + attr->prefixLen = SECUREC_PREFIX_LEN; + } + attr->flags |= SECUREC_FLAG_LONG; /* Converting a long */ +} +#endif + +SECUREC_INLINE void SecUpdatePointFlags(SecFormatAttr *attr) +{ + attr->flags |= SECUREC_FLAG_POINTER; +#if SECUREC_IN_KERNEL + SecUpdatePointFlagsForKernel(attr); +#else +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) || defined(SECUREC_VXWORKS_PLATFORM)) && (!defined(SECUREC_ON_UNIX)) +#if defined(SECUREC_VXWORKS_PLATFORM) + attr->precision = 1; +#else + attr->precision = 0; +#endif + attr->flags |= SECUREC_FLAG_ALTERNATE; /* "0x" is not default prefix in UNIX */ + attr->digits = g_itoaLowerDigits; +#else /* On unix or win */ +#if defined(_AIX) || defined(SECUREC_ON_SOLARIS) + attr->precision = 1; +#else + attr->precision = 2 * sizeof(void *); /* 2 x byte number is the length of hex */ +#endif +#if defined(SECUREC_ON_UNIX) + attr->digits = g_itoaLowerDigits; +#else + attr->digits = g_itoaUpperDigits; +#endif +#endif + +#if defined(SECUREC_COMPATIBLE_WIN_FORMAT) + attr->flags &= ~SECUREC_FLAG_LEADZERO; +#endif + +#ifdef SECUREC_ON_64BITS + attr->flags |= SECUREC_FLAG_I64; /* Converting an int64 */ +#else + attr->flags |= SECUREC_FLAG_LONG; /* Converting a long */ +#endif + /* Set up for %#p on different system */ + if ((attr->flags & SECUREC_FLAG_ALTERNATE) != 0) { + /* Alternate form means '0x' prefix */ + attr->prefix[0] = SECUREC_CHAR('0'); +#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT) || defined(SECUREC_VXWORKS_PLATFORM)) + attr->prefix[1] = SECUREC_CHAR('x'); +#else + attr->prefix[1] = (SecChar)(attr->digits[SECUREC_NUMBER_OF_X]); +#endif +#if defined(_AIX) || defined(SECUREC_ON_SOLARIS) + attr->prefixLen = 0; +#else + attr->prefixLen = SECUREC_PREFIX_LEN; +#endif + } +#endif +} + +SECUREC_INLINE void SecUpdateXpxFlags(SecFormatAttr *attr, SecChar ch) +{ + /* Use unsigned lower hex output for 'x' */ + attr->digits = g_itoaLowerDigits; + attr->radix = SECUREC_RADIX_HEX; + switch (ch) { + case SECUREC_CHAR('p'): + /* Print a pointer */ + SecUpdatePointFlags(attr); + break; + case SECUREC_CHAR('X'): /* fall-through */ /* FALLTHRU */ + /* Unsigned upper hex output */ + attr->digits = g_itoaUpperDigits; + /* fall-through */ /* FALLTHRU */ + default: + /* For %#x or %#X */ + if ((attr->flags & SECUREC_FLAG_ALTERNATE) != 0) { + /* Alternate form means '0x' prefix */ + attr->prefix[0] = SECUREC_CHAR('0'); + attr->prefix[1] = (SecChar)(attr->digits[SECUREC_NUMBER_OF_X]); + attr->prefixLen = SECUREC_PREFIX_LEN; + } + break; + } +} + +SECUREC_INLINE void SecUpdateOudiFlags(SecFormatAttr *attr, SecChar ch) +{ + /* Do not set digits here */ + switch (ch) { + case SECUREC_CHAR('i'): /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('d'): /* fall-through */ /* FALLTHRU */ + /* For signed decimal output */ + attr->flags |= SECUREC_FLAG_SIGNED; + /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('u'): + attr->radix = SECUREC_RADIX_DECIMAL; + attr->digits = g_itoaLowerDigits; + break; + case SECUREC_CHAR('o'): + /* For unsigned octal output */ + attr->radix = SECUREC_RADIX_OCTAL; + attr->digits = g_itoaLowerDigits; + if ((attr->flags & SECUREC_FLAG_ALTERNATE) != 0) { + /* Alternate form means force a leading 0 */ + attr->flags |= SECUREC_FLAG_FORCE_OCTAL; + } + break; + default: + /* Do nothing */ + break; + } +} + +#if SECUREC_ENABLE_SPRINTF_FLOAT +SECUREC_INLINE void SecFreeFloatBuffer(SecFloatAdapt *floatAdapt) +{ + if (floatAdapt->floatBuffer != NULL) { + SECUREC_FREE(floatAdapt->floatBuffer); + } + if (floatAdapt->allocatedFmtStr != NULL) { + SECUREC_FREE(floatAdapt->allocatedFmtStr); + } + floatAdapt->floatBuffer = NULL; + floatAdapt->allocatedFmtStr = NULL; + floatAdapt->fmtStr = NULL; + floatAdapt->bufferSize = 0; +} + +SECUREC_INLINE void SecSeekToFrontPercent(const SecChar **format) +{ + const SecChar *fmt = *format; + while (*fmt != SECUREC_CHAR('%')) { /* Must meet '%' */ + --fmt; + } + *format = fmt; +} + +/* Init float format, return 0 is OK */ +SECUREC_INLINE int SecInitFloatFmt(SecFloatAdapt *floatFmt, const SecChar *format) +{ + const SecChar *fmt = format - 2; /* Sub 2 to the position before 'f' or 'g' */ + int fmtStrLen; + int i; + + SecSeekToFrontPercent(&fmt); + /* Now fmt point to '%' */ + fmtStrLen = (int)(size_t)(format - fmt) + 1; /* With ending terminator */ + if (fmtStrLen > (int)sizeof(floatFmt->buffer)) { + /* When buffer is NOT enough, alloc a new buffer */ + floatFmt->allocatedFmtStr = (char *)SECUREC_MALLOC((size_t)((unsigned int)fmtStrLen)); + if (floatFmt->allocatedFmtStr == NULL) { + return -1; + } + floatFmt->fmtStr = floatFmt->allocatedFmtStr; + } else { + floatFmt->fmtStr = floatFmt->buffer; + floatFmt->allocatedFmtStr = NULL; /* Must set to NULL, later code free memory based on this identity */ + } + + for (i = 0; i < fmtStrLen - 1; ++i) { + /* Convert wchar to char */ + floatFmt->fmtStr[i] = (char)(fmt[i]); /* Copy the format string */ + } + floatFmt->fmtStr[fmtStrLen - 1] = '\0'; + + return 0; +} + +/* Init float buffer and format, return 0 is OK */ +SECUREC_INLINE int SecInitFloatBuffer(SecFloatAdapt *floatAdapt, const SecChar *format, SecFormatAttr *attr) +{ + floatAdapt->allocatedFmtStr = NULL; + floatAdapt->fmtStr = NULL; + floatAdapt->floatBuffer = NULL; + /* Compute the precision value */ + if (attr->precision < 0) { + attr->precision = SECUREC_FLOAT_DEFAULT_PRECISION; + } + /* + * Calc buffer size to store double value + * The maximum length of SECUREC_MAX_WIDTH_LEN is enough + */ + if ((attr->flags & SECUREC_FLAG_LONG_DOUBLE) != 0) { + if (attr->precision > (SECUREC_MAX_WIDTH_LEN - SECUREC_FLOAT_BUFSIZE_LB)) { + return -1; + } + /* Long double needs to meet the basic print length */ + floatAdapt->bufferSize = SECUREC_FLOAT_BUFSIZE_LB + attr->precision + SECUREC_FLOAT_BUF_EXT; + } else { + if (attr->precision > (SECUREC_MAX_WIDTH_LEN - SECUREC_FLOAT_BUFSIZE)) { + return -1; + } + /* Double needs to meet the basic print length */ + floatAdapt->bufferSize = SECUREC_FLOAT_BUFSIZE + attr->precision + SECUREC_FLOAT_BUF_EXT; + } + if (attr->fldWidth > floatAdapt->bufferSize) { + floatAdapt->bufferSize = attr->fldWidth + SECUREC_FLOAT_BUF_EXT; + } + + if (floatAdapt->bufferSize > SECUREC_BUFFER_SIZE) { + /* The current value of SECUREC_BUFFER_SIZE could not store the formatted float string */ + floatAdapt->floatBuffer = (char *)SECUREC_MALLOC(((size_t)(unsigned int)floatAdapt->bufferSize)); + if (floatAdapt->floatBuffer == NULL) { + return -1; + } + attr->text.str = floatAdapt->floatBuffer; + } else { + attr->text.str = attr->buffer.str; /* Output buffer for float string with default size */ + } + + if (SecInitFloatFmt(floatAdapt, format) != 0) { + if (floatAdapt->floatBuffer != NULL) { + SECUREC_FREE(floatAdapt->floatBuffer); + floatAdapt->floatBuffer = NULL; + } + return -1; + } + return 0; +} +#endif + +SECUREC_INLINE SecInt64 SecUpdateNegativeChar(SecFormatAttr *attr, char ch) +{ + SecInt64 num64 = ch; /* Sign extend */ + if (num64 >= 128) { /* 128 on some platform, char is always unsigned */ + unsigned char tmp = (unsigned char)(~((unsigned char)ch)); + num64 = tmp + 1; + attr->flags |= SECUREC_FLAG_NEGATIVE; + } + return num64; +} + +/* + * If the precision is not satisfied, zero is added before the string + */ +SECUREC_INLINE void SecNumberSatisfyPrecision(SecFormatAttr *attr) +{ + int precision; + if (attr->precision < 0) { + precision = 1; /* Default precision 1 */ + } else { +#if defined(SECUREC_COMPATIBLE_WIN_FORMAT) + attr->flags &= ~SECUREC_FLAG_LEADZERO; +#else + if ((attr->flags & SECUREC_FLAG_POINTER) == 0) { + attr->flags &= ~SECUREC_FLAG_LEADZERO; + } +#endif + if (attr->precision > SECUREC_MAX_PRECISION) { + attr->precision = SECUREC_MAX_PRECISION; + } + precision = attr->precision; + } + while (attr->textLen < precision) { + --attr->text.str; + *(attr->text.str) = '0'; + ++attr->textLen; + } +} + +/* + * Add leading zero for %#o + */ +SECUREC_INLINE void SecNumberForceOctal(SecFormatAttr *attr) +{ + /* Force a leading zero if FORCEOCTAL flag set */ + if ((attr->flags & SECUREC_FLAG_FORCE_OCTAL) != 0 && + (attr->textLen == 0 || attr->text.str[0] != '0')) { + --attr->text.str; + *(attr->text.str) = '0'; + ++attr->textLen; + } +} + +SECUREC_INLINE void SecUpdateSignedNumberPrefix(SecFormatAttr *attr) +{ + if ((attr->flags & SECUREC_FLAG_SIGNED) == 0) { + return; + } + if ((attr->flags & SECUREC_FLAG_NEGATIVE) != 0) { + /* Prefix is '-' */ + attr->prefix[0] = SECUREC_CHAR('-'); + attr->prefixLen = 1; + return; + } + if ((attr->flags & SECUREC_FLAG_SIGN) != 0) { + /* Prefix is '+' */ + attr->prefix[0] = SECUREC_CHAR('+'); + attr->prefixLen = 1; + return; + } + if ((attr->flags & SECUREC_FLAG_SIGN_SPACE) != 0) { + /* Prefix is ' ' */ + attr->prefix[0] = SECUREC_CHAR(' '); + attr->prefixLen = 1; + return; + } + return; +} + +SECUREC_INLINE void SecNumberCompatZero(SecFormatAttr *attr) +{ +#if SECUREC_IN_KERNEL + if ((attr->flags & SECUREC_FLAG_POINTER) != 0) { + static char strNullPointer[SECUREC_NULL_STRING_SIZE] = "(null)"; + attr->text.str = strNullPointer; + attr->textLen = 6; /* Length of (null) is 6 */ + attr->flags &= ~SECUREC_FLAG_LEADZERO; + attr->prefixLen = 0; + if (attr->precision >= 0 && attr->precision < attr->textLen) { + attr->textLen = attr->precision; + } + } + if ((attr->flags & SECUREC_FLAG_POINTER) == 0 && attr->radix == SECUREC_RADIX_HEX && + (attr->flags & SECUREC_FLAG_ALTERNATE) != 0) { + /* Add 0x prefix for %x or %X, the prefix string has been set before */ + attr->prefixLen = SECUREC_PREFIX_LEN; + } +#elif defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && (!defined(SECUREC_ON_UNIX)) + if ((attr->flags & SECUREC_FLAG_POINTER) != 0) { + static char strNullPointer[SECUREC_NULL_STRING_SIZE] = "(nil)"; + attr->text.str = strNullPointer; + attr->textLen = 5; /* Length of (nil) is 5 */ + attr->flags &= ~SECUREC_FLAG_LEADZERO; + } +#elif defined(SECUREC_VXWORKS_PLATFORM) || defined(__hpux) + if ((attr->flags & SECUREC_FLAG_POINTER) != 0 && (attr->flags & SECUREC_FLAG_ALTERNATE) != 0) { + /* Add 0x prefix for %p, the prefix string has been set before */ + attr->prefixLen = SECUREC_PREFIX_LEN; + } +#endif + (void)attr; /* To clear e438 last value assigned not used , the compiler will optimize this code */ +} + +/* + * Formatting output core function + */ +SECUREC_INLINE int SecOutput(SecPrintfStream *stream, const SecChar *cFormat, va_list argList) +{ + const SecChar *format = cFormat; + int charsOut; /* Characters written */ + int noOutput = 0; /* Must be initialized or compiler alerts */ + SecFmtState state; + SecFormatAttr formatAttr; + + formatAttr.flags = 0; + formatAttr.textIsWide = 0; /* Flag for buffer contains wide chars */ + formatAttr.fldWidth = 0; + formatAttr.precision = 0; + formatAttr.dynWidth = 0; + formatAttr.dynPrecision = 0; + formatAttr.digits = g_itoaUpperDigits; + formatAttr.radix = SECUREC_RADIX_DECIMAL; + formatAttr.padding = 0; + formatAttr.textLen = 0; + formatAttr.text.str = NULL; + formatAttr.prefixLen = 0; + formatAttr.prefix[0] = SECUREC_CHAR('\0'); + formatAttr.prefix[1] = SECUREC_CHAR('\0'); + charsOut = 0; + state = STAT_NORMAL; /* Starting state */ + + /* Loop each format character */ + while (*format != SECUREC_CHAR('\0') && charsOut >= 0) { + SecFmtState lastState = state; + SecChar ch = *format; /* Currently read character */ + ++format; + state = SecDecodeState(ch, lastState); + switch (state) { + case STAT_NORMAL: + SecWriteChar(stream, ch, &charsOut); + continue; + case STAT_PERCENT: + /* Set default values */ + noOutput = 0; + formatAttr.prefixLen = 0; + formatAttr.textLen = 0; + formatAttr.flags = 0; + formatAttr.fldWidth = 0; + formatAttr.precision = -1; + formatAttr.textIsWide = 0; + formatAttr.dynWidth = 0; + formatAttr.dynPrecision = 0; + break; + case STAT_FLAG: + /* Set flag based on which flag character */ + SecDecodeFlags(ch, &formatAttr); + break; + case STAT_WIDTH: + /* Update width value */ + if (ch == SECUREC_CHAR('*')) { + /* get width from arg list */ + formatAttr.fldWidth = (int)va_arg(argList, int); + formatAttr.dynWidth = 1; + } + if (SecDecodeWidth(ch, &formatAttr, lastState) != 0) { + return -1; + } + break; + case STAT_DOT: + formatAttr.precision = 0; + break; + case STAT_PRECIS: + /* Update precision value */ + if (ch == SECUREC_CHAR('*')) { + /* Get precision from arg list */ + formatAttr.precision = (int)va_arg(argList, int); + formatAttr.dynPrecision = 1; + } + if (SecDecodePrecision(ch, &formatAttr) != 0) { + return -1; + } + break; + case STAT_SIZE: + /* Read a size specifier, set the formatAttr.flags based on it, and skip format to next character */ + if (SecDecodeSize(ch, &formatAttr, &format) != 0) { + /* Compatibility code for "%I" just print I */ + SecWriteChar(stream, ch, &charsOut); + state = STAT_NORMAL; + continue; + } + break; + case STAT_TYPE: + switch (ch) { + case SECUREC_CHAR('C'): /* Wide char */ + SecUpdateWcharFlags(&formatAttr); + /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('c'): { + unsigned int cValue = (unsigned int)va_arg(argList, int); + SecDecodeTypeC(&formatAttr, cValue); + break; + } + case SECUREC_CHAR('S'): /* Wide char string */ + SecUpdateWstringFlags(&formatAttr); + /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('s'): { + char *argPtr = (char *)va_arg(argList, char *); + SecDecodeTypeS(&formatAttr, argPtr); + break; + } + case SECUREC_CHAR('G'): /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('g'): /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('E'): /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('F'): /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('e'): /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('f'): { +#if SECUREC_ENABLE_SPRINTF_FLOAT + /* Add following code to call system sprintf API for float number */ + SecFloatAdapt floatAdapt; + noOutput = 1; /* It's no more data needs to be written */ + + /* Now format is pointer to the next character of 'f' */ + if (SecInitFloatBuffer(&floatAdapt, format, &formatAttr) != 0) { + break; + } + + if ((formatAttr.flags & SECUREC_FLAG_LONG_DOUBLE) != 0) { +#if defined(SECUREC_COMPATIBLE_LINUX_FORMAT) && SECUREC_ENABLE_SPRINTF_LONG_DOUBLE + long double tmp = (long double)va_arg(argList, long double); + SecFormatLongDouble(&formatAttr, &floatAdapt, tmp); +#else + double tmp = (double)va_arg(argList, double); + SecFormatDouble(&formatAttr, &floatAdapt, tmp); +#endif + } else { + double tmp = (double)va_arg(argList, double); + SecFormatDouble(&formatAttr, &floatAdapt, tmp); + } + + /* Only need write formatted float string */ + SecWriteFloatText(stream, &formatAttr, &charsOut); + SecFreeFloatBuffer(&floatAdapt); + break; +#else + return -1; +#endif + } + case SECUREC_CHAR('X'): /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('p'): /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('x'): /* fall-through */ /* FALLTHRU */ + SecUpdateXpxFlags(&formatAttr, ch); + /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('i'): /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('d'): /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('u'): /* fall-through */ /* FALLTHRU */ + case SECUREC_CHAR('o'): { + SecInt64 num64; + SecUpdateOudiFlags(&formatAttr, ch); + /* Read argument into variable num64. Be careful, depend on the order of judgment */ + if ((formatAttr.flags & SECUREC_FLAG_I64) != 0 || + (formatAttr.flags & SECUREC_FLAG_LONGLONG) != 0) { + num64 = (SecInt64)va_arg(argList, SecInt64); /* Maximum Bit Width sign bit unchanged */ + } else if ((formatAttr.flags & SECUREC_FLAG_LONG) != 0) { + num64 = SECUREC_GET_LONG_FROM_ARG(formatAttr); + } else if ((formatAttr.flags & SECUREC_FLAG_CHAR) != 0) { + num64 = SECUREC_GET_CHAR_FROM_ARG(formatAttr); + } else if ((formatAttr.flags & SECUREC_FLAG_SHORT) != 0) { + num64 = SECUREC_GET_SHORT_FROM_ARG(formatAttr); +#ifdef SECUREC_COMPATIBLE_LINUX_FORMAT + } else if ((formatAttr.flags & SECUREC_FLAG_PTRDIFF) != 0) { + num64 = (ptrdiff_t)va_arg(argList, ptrdiff_t); /* Sign extend */ + } else if ((formatAttr.flags & SECUREC_FLAG_SIZE) != 0) { + num64 = SECUREC_GET_SIZE_FROM_ARG(formatAttr); + } else if ((formatAttr.flags & SECUREC_FLAG_INTMAX) != 0) { + num64 = (SecInt64)va_arg(argList, SecInt64); +#endif + } else { + num64 = SECUREC_GET_INT_FROM_ARG(formatAttr); + } + + /* The order of the following calls must be correct */ + SecNumberToBuffer(&formatAttr, num64); + SecNumberSatisfyPrecision(&formatAttr); + SecNumberForceOctal(&formatAttr); + SecUpdateSignedNumberPrefix(&formatAttr); + if (num64 == 0) { + SecNumberCompatZero(&formatAttr); + } + break; + } + default: + /* Do nothing */ + break; + } + + if (noOutput == 0) { + /* Calculate amount of padding */ + formatAttr.padding = (formatAttr.fldWidth - formatAttr.textLen) - formatAttr.prefixLen; + + /* Put out the padding, prefix, and text, in the correct order */ + SecWriteLeftPadding(stream, &formatAttr, &charsOut); + SecWritePrefix(stream, &formatAttr, &charsOut); + SecWriteLeadingZero(stream, &formatAttr, &charsOut); + SecWriteText(stream, &formatAttr, &charsOut); + SecWriteRightPadding(stream, &formatAttr, &charsOut); + } + break; + case STAT_INVALID: /* fall-through */ /* FALLTHRU */ + default: + return -1; /* Input format is wrong(STAT_INVALID), directly return */ + } + } + + if (state != STAT_NORMAL && state != STAT_TYPE) { + return -1; + } + + return charsOut; /* The number of characters written */ +} + +/* + * Output one zero character zero into the SecPrintfStream structure + * If there is not enough space, make sure f->count is less than 0 + */ +SECUREC_INLINE int SecPutZeroChar(SecPrintfStream *stream) +{ + --stream->count; + if (stream->count >= 0) { + *(stream->cur) = SECUREC_CHAR('\0'); + ++stream->cur; + return 0; + } + return -1; +} + +/* + * Multi character formatted output implementation + */ +#ifdef SECUREC_FOR_WCHAR +int SecVswprintfImpl(wchar_t *string, size_t count, const wchar_t *format, va_list argList) +#else +int SecVsnprintfImpl(char *string, size_t count, const char *format, va_list argList) +#endif +{ + SecPrintfStream stream; + int retVal; + + stream.count = (int)count; /* The count include \0 character, must be greater than zero */ + stream.cur = string; + + retVal = SecOutput(&stream, format, argList); + if (retVal >= 0) { + if (SecPutZeroChar(&stream) == 0) { + return retVal; + } + } + if (stream.count < 0) { + /* The buffer was too small, then truncate */ + string[count - 1] = SECUREC_CHAR('\0'); + return SECUREC_PRINTF_TRUNCATE; + } + string[0] = SECUREC_CHAR('\0'); /* Empty the dest string */ + return -1; +} +#endif /* OUTPUT_INL_2B263E9C_43D8_44BB_B17A_6D2033DECEE5 */ + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.c new file mode 100644 index 000000000..fa5470b85 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: scanf_s function + * Create: 2014-02-25 + */ + +#include "securec.h" + +/* + * + * The scanf_s function is equivalent to fscanf_s with the argument stdin interposed before the arguments to scanf_s + * The scanf_s function reads data from the standard input stream stdin and + * writes the data into the location that's given by argument. Each argument + * must be a pointer to a variable of a type that corresponds to a type specifier + * in format. If copying occurs between strings that overlap, the behavior is + * undefined. + * + * + * format Format control string. + * ... Optional arguments. + * + * + * ... The converted value stored in user assigned address + * + * + * Returns the number of fields successfully converted and assigned; + * the return value does not include fields that were read but not assigned. + * A return value of 0 indicates that no fields were assigned. + * return -1 if an error occurs. + */ +int scanf_s(const char *format, ...) +{ + int ret; /* If initialization causes e838 */ + va_list argList; + + va_start(argList, format); + ret = vscanf_s(format, argList); + va_end(argList); + (void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */ + + return ret; +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secinput.h b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secinput.h new file mode 100644 index 000000000..176ee05d9 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secinput.h @@ -0,0 +1,181 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: Define macro, data struct, and declare function prototype, + * which is used by input.inl, secureinput_a.c and secureinput_w.c. + * Create: 2014-02-25 + */ + +#ifndef SEC_INPUT_H_E950DA2C_902F_4B15_BECD_948E99090D9C +#define SEC_INPUT_H_E950DA2C_902F_4B15_BECD_948E99090D9C +#include "securecutil.h" + +#define SECUREC_SCANF_EINVAL (-1) +#define SECUREC_SCANF_ERROR_PARA (-2) + +/* For internal stream flag */ +#define SECUREC_MEM_STR_FLAG 0x01U +#define SECUREC_FILE_STREAM_FLAG 0x02U +#define SECUREC_PIPE_STREAM_FLAG 0x04U +#define SECUREC_LOAD_FILE_TO_MEM_FLAG 0x08U + +#define SECUREC_UCS_BOM_HEADER_SIZE 2U +#define SECUREC_UCS_BOM_HEADER_BE_1ST 0xfeU +#define SECUREC_UCS_BOM_HEADER_BE_2ST 0xffU +#define SECUREC_UCS_BOM_HEADER_LE_1ST 0xffU +#define SECUREC_UCS_BOM_HEADER_LE_2ST 0xfeU +#define SECUREC_UTF8_BOM_HEADER_SIZE 3U +#define SECUREC_UTF8_BOM_HEADER_1ST 0xefU +#define SECUREC_UTF8_BOM_HEADER_2ND 0xbbU +#define SECUREC_UTF8_BOM_HEADER_3RD 0xbfU +#define SECUREC_UTF8_LEAD_1ST 0xe0U +#define SECUREC_UTF8_LEAD_2ND 0x80U + +#define SECUREC_BEGIN_WITH_UCS_BOM(s, len) ((len) == SECUREC_UCS_BOM_HEADER_SIZE && \ + (((unsigned char)((s)[0]) == SECUREC_UCS_BOM_HEADER_LE_1ST && \ + (unsigned char)((s)[1]) == SECUREC_UCS_BOM_HEADER_LE_2ST) || \ + ((unsigned char)((s)[0]) == SECUREC_UCS_BOM_HEADER_BE_1ST && \ + (unsigned char)((s)[1]) == SECUREC_UCS_BOM_HEADER_BE_2ST))) + +#define SECUREC_BEGIN_WITH_UTF8_BOM(s, len) ((len) == SECUREC_UTF8_BOM_HEADER_SIZE && \ + (unsigned char)((s)[0]) == SECUREC_UTF8_BOM_HEADER_1ST && \ + (unsigned char)((s)[1]) == SECUREC_UTF8_BOM_HEADER_2ND && \ + (unsigned char)((s)[2]) == SECUREC_UTF8_BOM_HEADER_3RD) + +#ifdef SECUREC_FOR_WCHAR +#define SECUREC_BOM_HEADER_SIZE SECUREC_UCS_BOM_HEADER_SIZE +#define SECUREC_BEGIN_WITH_BOM(s, len) SECUREC_BEGIN_WITH_UCS_BOM((s), (len)) +#else +#define SECUREC_BOM_HEADER_SIZE SECUREC_UTF8_BOM_HEADER_SIZE +#define SECUREC_BEGIN_WITH_BOM(s, len) SECUREC_BEGIN_WITH_UTF8_BOM((s), (len)) +#endif + +typedef struct { + unsigned int flag; /* Mark the properties of input stream */ + char *base; /* The pointer to the header of buffered string */ + const char *cur; /* The pointer to next read position */ + size_t count; /* The size of buffered string in bytes */ +#if SECUREC_ENABLE_SCANF_FILE + FILE *pf; /* The file pointer */ + size_t fileRealRead; + long oriFilePos; /* The original position of file offset when fscanf is called */ +#endif +} SecFileStream; + +#if SECUREC_ENABLE_SCANF_FILE +#define SECUREC_FILE_STREAM_INIT_FILE(stream, fp) do { \ + (stream)->pf = (fp); \ + (stream)->fileRealRead = 0; \ + (stream)->oriFilePos = 0; \ +} SECUREC_WHILE_ZERO +#else +/* Disable file */ +#define SECUREC_FILE_STREAM_INIT_FILE(stream, fp) +#endif + +/* This initialization for eliminating redundant initialization. */ +#define SECUREC_FILE_STREAM_FROM_STRING(stream, buf, cnt) do { \ + (stream)->flag = SECUREC_MEM_STR_FLAG; \ + (stream)->base = NULL; \ + (stream)->cur = (buf); \ + (stream)->count = (cnt); \ + SECUREC_FILE_STREAM_INIT_FILE((stream), NULL); \ +} SECUREC_WHILE_ZERO + +/* This initialization for eliminating redundant initialization. */ +#define SECUREC_FILE_STREAM_FROM_FILE(stream, fp) do { \ + (stream)->flag = SECUREC_FILE_STREAM_FLAG; \ + (stream)->base = NULL; \ + (stream)->cur = NULL; \ + (stream)->count = 0; \ + SECUREC_FILE_STREAM_INIT_FILE((stream), (fp)); \ +} SECUREC_WHILE_ZERO + +/* This initialization for eliminating redundant initialization. */ +#define SECUREC_FILE_STREAM_FROM_STDIN(stream) do { \ + (stream)->flag = SECUREC_PIPE_STREAM_FLAG; \ + (stream)->base = NULL; \ + (stream)->cur = NULL; \ + (stream)->count = 0; \ + SECUREC_FILE_STREAM_INIT_FILE((stream), SECUREC_STREAM_STDIN); \ +} SECUREC_WHILE_ZERO + +#ifdef __cplusplus +extern "C" { +#endif +int SecInputS(SecFileStream *stream, const char *cFormat, va_list argList); +void SecClearDestBuf(const char *buffer, const char *format, va_list argList); +#ifdef SECUREC_FOR_WCHAR +int SecInputSW(SecFileStream *stream, const wchar_t *cFormat, va_list argList); +void SecClearDestBufW(const wchar_t *buffer, const wchar_t *format, va_list argList); +#endif + +/* 20150105 For software and hardware decoupling,such as UMG */ +#ifdef SECUREC_SYSAPI4VXWORKS +#ifdef feof +#undef feof +#endif +extern int feof(FILE *stream); +#endif + +#if defined(SECUREC_SYSAPI4VXWORKS) || defined(SECUREC_CTYPE_MACRO_ADAPT) +#ifndef isspace +#define isspace(c) (((c) == ' ') || ((c) == '\t') || ((c) == '\r') || ((c) == '\n')) +#endif +#ifndef iswspace +#define iswspace(c) (((c) == L' ') || ((c) == L'\t') || ((c) == L'\r') || ((c) == L'\n')) +#endif +#ifndef isascii +#define isascii(c) (((unsigned char)(c)) <= 0x7f) +#endif +#ifndef isupper +#define isupper(c) ((c) >= 'A' && (c) <= 'Z') +#endif +#ifndef islower +#define islower(c) ((c) >= 'a' && (c) <= 'z') +#endif +#ifndef isalpha +#define isalpha(c) (isupper(c) || (islower(c))) +#endif +#ifndef isdigit +#define isdigit(c) ((c) >= '0' && (c) <= '9') +#endif +#ifndef isxupper +#define isxupper(c) ((c) >= 'A' && (c) <= 'F') +#endif +#ifndef isxlower +#define isxlower(c) ((c) >= 'a' && (c) <= 'f') +#endif +#ifndef isxdigit +#define isxdigit(c) (isdigit(c) || isxupper(c) || isxlower(c)) +#endif +#endif + +#ifdef __cplusplus +} +#endif +/* Reserved file operation macro interface, s is FILE *, i is fileno zero. */ +#ifndef SECUREC_LOCK_FILE +#define SECUREC_LOCK_FILE(s) +#endif + +#ifndef SECUREC_UNLOCK_FILE +#define SECUREC_UNLOCK_FILE(s) +#endif + +#ifndef SECUREC_LOCK_STDIN +#define SECUREC_LOCK_STDIN(i, s) +#endif + +#ifndef SECUREC_UNLOCK_STDIN +#define SECUREC_UNLOCK_STDIN(i, s) +#endif +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.c new file mode 100644 index 000000000..0053a72cf --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.c @@ -0,0 +1,81 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: Provides internal functions used by this library, such as memory + * copy and memory move. Besides, include some helper function for + * printf family API, such as SecVsnprintfImpl + * Create: 2014-02-25 + */ + +/* Avoid duplicate header files,not include securecutil.h */ +#include "securecutil.h" + +#if defined(ANDROID) && !defined(SECUREC_CLOSE_ANDROID_HANDLE) && (SECUREC_HAVE_WCTOMB || SECUREC_HAVE_MBTOWC) +#include +#if SECUREC_HAVE_WCTOMB +/* + * Convert wide characters to narrow multi-bytes + */ +int wctomb(char *s, wchar_t wc) +{ + return (int)wcrtomb(s, wc, NULL); +} +#endif + +#if SECUREC_HAVE_MBTOWC +/* + * Converting narrow multi-byte characters to wide characters + * mbrtowc returns -1 or -2 upon failure, unlike mbtowc, which only returns -1 + * When the return value is less than zero, we treat it as a failure + */ +int mbtowc(wchar_t *pwc, const char *s, size_t n) +{ + return (int)mbrtowc(pwc, s, n, NULL); +} +#endif +#endif + +/* The V100R001C01 version num is 0x5 (High 8 bits) */ +#define SECUREC_C_VERSION 0x500U +#define SECUREC_SPC_VERSION 0x10U +#define SECUREC_VERSION_STR "1.1.16" + +/* + * Get version string and version number. + * The rules for version number are as follows: + * 1) SPC verNumber<->verStr like: + * 0x201<->C01 + * 0x202<->C01SPC001 Redefine numbers after this version + * 0x502<->C01SPC002 + * 0x503<->C01SPC003 + * ... + * 0X50a<->SPC010 + * 0X50b<->SPC011 + * ... + * 0x700<->C02 + * 0x701<->C01SPC001 + * 0x702<->C02SPC002 + * ... + * 2) CP verNumber<->verStr like: + * 0X601<->CP0001 + * 0X602<->CP0002 + * ... + */ +const char *GetHwSecureCVersion(unsigned short *verNumber) +{ + if (verNumber != NULL) { + *verNumber = (unsigned short)(SECUREC_C_VERSION | SECUREC_SPC_VERSION); + } + return SECUREC_VERSION_STR; +} +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(GetHwSecureCVersion); +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.h b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.h new file mode 100644 index 000000000..7e3bd691f --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.h @@ -0,0 +1,574 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: Define macro, data struct, and declare internal used function prototype, + * which is used by secure functions. + * Create: 2014-02-25 + */ + +#ifndef SECURECUTIL_H_46C86578_F8FF_4E49_8E64_9B175241761F +#define SECURECUTIL_H_46C86578_F8FF_4E49_8E64_9B175241761F +#include "securec.h" + +#if (defined(_MSC_VER)) && (_MSC_VER >= 1400) +/* Shield compilation alerts using discarded functions and Constant expression to maximize code compatibility */ +#define SECUREC_MASK_MSVC_CRT_WARNING __pragma(warning(push)) \ + __pragma(warning(disable : 4996 4127)) +#define SECUREC_END_MASK_MSVC_CRT_WARNING __pragma(warning(pop)) +#else +#define SECUREC_MASK_MSVC_CRT_WARNING +#define SECUREC_END_MASK_MSVC_CRT_WARNING +#endif +#define SECUREC_WHILE_ZERO SECUREC_MASK_MSVC_CRT_WARNING while (0) SECUREC_END_MASK_MSVC_CRT_WARNING + +/* Automatically identify the platform that supports strnlen function, and use this function to improve performance */ +#ifndef SECUREC_HAVE_STRNLEN +#if (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 700) || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200809L) +#if SECUREC_IN_KERNEL +#define SECUREC_HAVE_STRNLEN 0 +#else +#if defined(__GLIBC__) && __GLIBC__ >= 2 && defined(__GLIBC_MINOR__) && __GLIBC_MINOR__ >= 10 +#define SECUREC_HAVE_STRNLEN 1 +#else +#define SECUREC_HAVE_STRNLEN 0 +#endif +#endif +#else +#define SECUREC_HAVE_STRNLEN 0 +#endif +#endif + +#if SECUREC_IN_KERNEL +/* In kernel disable functions */ +#ifndef SECUREC_ENABLE_SCANF_FILE +#define SECUREC_ENABLE_SCANF_FILE 0 +#endif +#ifndef SECUREC_ENABLE_SCANF_FLOAT +#define SECUREC_ENABLE_SCANF_FLOAT 0 +#endif +#ifndef SECUREC_ENABLE_SPRINTF_FLOAT +#define SECUREC_ENABLE_SPRINTF_FLOAT 0 +#endif +#ifndef SECUREC_HAVE_MBTOWC +#define SECUREC_HAVE_MBTOWC 0 +#endif +#ifndef SECUREC_HAVE_WCTOMB +#define SECUREC_HAVE_WCTOMB 0 +#endif +#ifndef SECUREC_HAVE_WCHART +#define SECUREC_HAVE_WCHART 0 +#endif +#else /* Not in kernel */ +/* Systems that do not support file, can define this macro to 0. */ +#ifndef SECUREC_ENABLE_SCANF_FILE +#define SECUREC_ENABLE_SCANF_FILE 1 +#endif +#ifndef SECUREC_ENABLE_SCANF_FLOAT +#define SECUREC_ENABLE_SCANF_FLOAT 1 +#endif +/* Systems that do not support float, can define this macro to 0. */ +#ifndef SECUREC_ENABLE_SPRINTF_FLOAT +#define SECUREC_ENABLE_SPRINTF_FLOAT 1 +#endif +#ifndef SECUREC_HAVE_MBTOWC +#define SECUREC_HAVE_MBTOWC 1 +#endif +#ifndef SECUREC_HAVE_WCTOMB +#define SECUREC_HAVE_WCTOMB 1 +#endif +#ifndef SECUREC_HAVE_WCHART +#define SECUREC_HAVE_WCHART 1 +#endif +#endif + +#ifndef SECUREC_ENABLE_INLINE +#define SECUREC_ENABLE_INLINE 0 +#endif + +#ifndef SECUREC_INLINE +#if SECUREC_ENABLE_INLINE +#define SECUREC_INLINE static inline +#else +#define SECUREC_INLINE static +#endif +#endif + +#ifndef SECUREC_WARP_OUTPUT +#if SECUREC_IN_KERNEL +#define SECUREC_WARP_OUTPUT 1 +#else +#define SECUREC_WARP_OUTPUT 0 +#endif +#endif + +#ifndef SECUREC_STREAM_STDIN +#define SECUREC_STREAM_STDIN stdin +#endif + +#define SECUREC_MUL_SIXTEEN(x) ((x) << 4U) +#define SECUREC_MUL_EIGHT(x) ((x) << 3U) +#define SECUREC_MUL_TEN(x) ((((x) << 2U) + (x)) << 1U) +/* Limited format input and output width, use signed integer */ +#define SECUREC_MAX_WIDTH_LEN_DIV_TEN 21474836 +#define SECUREC_MAX_WIDTH_LEN (SECUREC_MAX_WIDTH_LEN_DIV_TEN * 10) +/* Is the x multiplied by 10 greater than */ +#define SECUREC_MUL_TEN_ADD_BEYOND_MAX(x) (((x) > SECUREC_MAX_WIDTH_LEN_DIV_TEN)) + +#define SECUREC_FLOAT_BUFSIZE (309 + 40) /* Max length of double value */ +#define SECUREC_FLOAT_BUFSIZE_LB (4932 + 40) /* Max length of long double value */ +#define SECUREC_FLOAT_DEFAULT_PRECISION 6 + +/* This macro does not handle pointer equality or integer overflow */ +#define SECUREC_MEMORY_NO_OVERLAP(dest, src, count) \ + (((src) < (dest) && ((const char *)(src) + (count)) <= (char *)(dest)) || \ + ((dest) < (src) && ((char *)(dest) + (count)) <= (const char *)(src))) + +#define SECUREC_MEMORY_IS_OVERLAP(dest, src, count) \ + (((src) < (dest) && ((const char *)(src) + (count)) > (char *)(dest)) || \ + ((dest) < (src) && ((char *)(dest) + (count)) > (const char *)(src))) + +/* + * Check whether the strings overlap, len is the length of the string not include terminator + * Length is related to data type char or wchar , do not force conversion of types + */ +#define SECUREC_STRING_NO_OVERLAP(dest, src, len) \ + (((src) < (dest) && ((src) + (len)) < (dest)) || \ + ((dest) < (src) && ((dest) + (len)) < (src))) + +/* + * Check whether the strings overlap for strcpy wcscpy function, dest len and src Len are not include terminator + * Length is related to data type char or wchar , do not force conversion of types + */ +#define SECUREC_STRING_IS_OVERLAP(dest, src, len) \ + (((src) < (dest) && ((src) + (len)) >= (dest)) || \ + ((dest) < (src) && ((dest) + (len)) >= (src))) + +/* + * Check whether the strings overlap for strcat wcscat function, dest len and src Len are not include terminator + * Length is related to data type char or wchar , do not force conversion of types + */ +#define SECUREC_CAT_STRING_IS_OVERLAP(dest, destLen, src, srcLen) \ + (((dest) < (src) && ((dest) + (destLen) + (srcLen)) >= (src)) || \ + ((src) < (dest) && ((src) + (srcLen)) >= (dest))) + +#if SECUREC_HAVE_STRNLEN +#define SECUREC_CALC_STR_LEN(str, maxLen, outLen) do { \ + *(outLen) = strnlen((str), (maxLen)); \ +} SECUREC_WHILE_ZERO +#define SECUREC_CALC_STR_LEN_OPT(str, maxLen, outLen) do { \ + if ((maxLen) > 8) { \ + /* Optimization or len less then 8 */ \ + if (*((str) + 0) == '\0') { \ + *(outLen) = 0; \ + } else if (*((str) + 1) == '\0') { \ + *(outLen) = 1; \ + } else if (*((str) + 2) == '\0') { \ + *(outLen) = 2; \ + } else if (*((str) + 3) == '\0') { \ + *(outLen) = 3; \ + } else if (*((str) + 4) == '\0') { \ + *(outLen) = 4; \ + } else if (*((str) + 5) == '\0') { \ + *(outLen) = 5; \ + } else if (*((str) + 6) == '\0') { \ + *(outLen) = 6; \ + } else if (*((str) + 7) == '\0') { \ + *(outLen) = 7; \ + } else if (*((str) + 8) == '\0') { \ + /* Optimization with a length of 8 */ \ + *(outLen) = 8; \ + } else { \ + /* The offset is 8 because the performance of 8 byte alignment is high */ \ + *(outLen) = 8 + strnlen((str) + 8, (maxLen) - 8); \ + } \ + } else { \ + SECUREC_CALC_STR_LEN((str), (maxLen), (outLen)); \ + } \ +} SECUREC_WHILE_ZERO +#else +#define SECUREC_CALC_STR_LEN(str, maxLen, outLen) do { \ + const char *strEnd_ = (const char *)(str); \ + size_t availableSize_ = (size_t)(maxLen); \ + while (availableSize_ > 0 && *strEnd_ != '\0') { \ + --availableSize_; \ + ++strEnd_; \ + } \ + *(outLen) = (size_t)(strEnd_ - (str)); \ +} SECUREC_WHILE_ZERO +#define SECUREC_CALC_STR_LEN_OPT SECUREC_CALC_STR_LEN +#endif + +#define SECUREC_CALC_WSTR_LEN(str, maxLen, outLen) do { \ + const wchar_t *strEnd_ = (const wchar_t *)(str); \ + size_t len_ = 0; \ + while (len_ < (maxLen) && *strEnd_ != L'\0') { \ + ++len_; \ + ++strEnd_; \ + } \ + *(outLen) = len_; \ +} SECUREC_WHILE_ZERO + +/* + * Performance optimization, product may disable inline function. + * Using function pointer for MEMSET to prevent compiler optimization when cleaning up memory. + */ +#ifdef SECUREC_USE_ASM +#define SECUREC_MEMSET_FUNC_OPT memset_opt +#define SECUREC_MEMCPY_FUNC_OPT memcpy_opt +#else +#define SECUREC_MEMSET_FUNC_OPT memset +#define SECUREC_MEMCPY_FUNC_OPT memcpy +#endif + +#define SECUREC_MEMCPY_WARP_OPT(dest, src, count) (void)SECUREC_MEMCPY_FUNC_OPT((dest), (src), (count)) + +#ifndef SECUREC_MEMSET_BARRIER +#if defined(__GNUC__) +/* Can be turned off for scenarios that do not use memory barrier */ +#define SECUREC_MEMSET_BARRIER 1 +#else +#define SECUREC_MEMSET_BARRIER 0 +#endif +#endif + +#ifndef SECUREC_MEMSET_INDIRECT_USE +/* Can be turned off for scenarios that do not allow pointer calls */ +#define SECUREC_MEMSET_INDIRECT_USE 1 +#endif + +#if SECUREC_MEMSET_BARRIER +#define SECUREC_MEMORY_BARRIER(dest) __asm__ __volatile__("": : "r"(dest) : "memory") +#else +#define SECUREC_MEMORY_BARRIER(dest) +#endif + +#if SECUREC_MEMSET_BARRIER +#define SECUREC_MEMSET_PREVENT_DSE(dest, value, count) do { \ + (void)SECUREC_MEMSET_FUNC_OPT(dest, value, count); \ + SECUREC_MEMORY_BARRIER(dest); \ +} SECUREC_WHILE_ZERO +#elif SECUREC_MEMSET_INDIRECT_USE +#define SECUREC_MEMSET_PREVENT_DSE(dest, value, count) do { \ + void *(* const volatile fn_)(void *s_, int c_, size_t n_) = SECUREC_MEMSET_FUNC_OPT; \ + (void)(*fn_)((dest), (value), (count)); \ +} SECUREC_WHILE_ZERO +#else +#define SECUREC_MEMSET_PREVENT_DSE(dest, value, count) (void)SECUREC_MEMSET_FUNC_OPT((dest), (value), (count)) +#endif + +#ifdef SECUREC_FORMAT_OUTPUT_INPUT +#if defined(SECUREC_COMPATIBLE_WIN_FORMAT) || defined(__ARMCC_VERSION) +typedef __int64 SecInt64; +typedef unsigned __int64 SecUnsignedInt64; +#if defined(__ARMCC_VERSION) +typedef unsigned int SecUnsignedInt32; +#else +typedef unsigned __int32 SecUnsignedInt32; +#endif +#else +typedef unsigned int SecUnsignedInt32; +typedef long long SecInt64; +typedef unsigned long long SecUnsignedInt64; +#endif + +#ifdef SECUREC_FOR_WCHAR +#if defined(SECUREC_VXWORKS_PLATFORM) && !defined(__WINT_TYPE__) +typedef wchar_t wint_t; +#endif +#ifndef WEOF +#define WEOF ((wchar_t)(-1)) +#endif +#define SECUREC_CHAR(x) L ## x +typedef wchar_t SecChar; +typedef wchar_t SecUnsignedChar; +typedef wint_t SecInt; +typedef wint_t SecUnsignedInt; +#else /* no SECUREC_FOR_WCHAR */ +#define SECUREC_CHAR(x) (x) +typedef char SecChar; +typedef unsigned char SecUnsignedChar; +typedef int SecInt; +typedef unsigned int SecUnsignedInt; +#endif +#endif + +/* + * Determine whether the address is 8-byte aligned + * Some systems do not have uintptr_t type, so use NULL to clear tool alarm 507 + */ +#define SECUREC_ADDR_ALIGNED_8(addr) ((((size_t)(addr)) & 7U) == 0) /* Use 7 to check aligned 8 */ + +/* + * If you define the memory allocation function, you need to define the function prototype. + * You can define this macro as a header file. + */ +#if defined(SECUREC_MALLOC_PROTOTYPE) +SECUREC_MALLOC_PROTOTYPE +#endif + +#ifndef SECUREC_MALLOC +#define SECUREC_MALLOC(x) malloc((size_t)(x)) +#endif + +#ifndef SECUREC_FREE +#define SECUREC_FREE(x) free((void *)(x)) +#endif + +/* Improve performance with struct assignment, buf1 is not defined to avoid tool false positive */ +#define SECUREC_COPY_VALUE_BY_STRUCT(dest, src, n) do { \ + *(SecStrBuf##n *)(void *)(dest) = *(const SecStrBuf##n *)(const void *)(src); \ +} SECUREC_WHILE_ZERO + +typedef struct { + unsigned char buf[2]; /* Performance optimization code structure assignment length 2 bytes */ +} SecStrBuf2; +typedef struct { + unsigned char buf[3]; /* Performance optimization code structure assignment length 3 bytes */ +} SecStrBuf3; +typedef struct { + unsigned char buf[4]; /* Performance optimization code structure assignment length 4 bytes */ +} SecStrBuf4; +typedef struct { + unsigned char buf[5]; /* Performance optimization code structure assignment length 5 bytes */ +} SecStrBuf5; +typedef struct { + unsigned char buf[6]; /* Performance optimization code structure assignment length 6 bytes */ +} SecStrBuf6; +typedef struct { + unsigned char buf[7]; /* Performance optimization code structure assignment length 7 bytes */ +} SecStrBuf7; +typedef struct { + unsigned char buf[8]; /* Performance optimization code structure assignment length 8 bytes */ +} SecStrBuf8; +typedef struct { + unsigned char buf[9]; /* Performance optimization code structure assignment length 9 bytes */ +} SecStrBuf9; +typedef struct { + unsigned char buf[10]; /* Performance optimization code structure assignment length 10 bytes */ +} SecStrBuf10; +typedef struct { + unsigned char buf[11]; /* Performance optimization code structure assignment length 11 bytes */ +} SecStrBuf11; +typedef struct { + unsigned char buf[12]; /* Performance optimization code structure assignment length 12 bytes */ +} SecStrBuf12; +typedef struct { + unsigned char buf[13]; /* Performance optimization code structure assignment length 13 bytes */ +} SecStrBuf13; +typedef struct { + unsigned char buf[14]; /* Performance optimization code structure assignment length 14 bytes */ +} SecStrBuf14; +typedef struct { + unsigned char buf[15]; /* Performance optimization code structure assignment length 15 bytes */ +} SecStrBuf15; +typedef struct { + unsigned char buf[16]; /* Performance optimization code structure assignment length 16 bytes */ +} SecStrBuf16; +typedef struct { + unsigned char buf[17]; /* Performance optimization code structure assignment length 17 bytes */ +} SecStrBuf17; +typedef struct { + unsigned char buf[18]; /* Performance optimization code structure assignment length 18 bytes */ +} SecStrBuf18; +typedef struct { + unsigned char buf[19]; /* Performance optimization code structure assignment length 19 bytes */ +} SecStrBuf19; +typedef struct { + unsigned char buf[20]; /* Performance optimization code structure assignment length 20 bytes */ +} SecStrBuf20; +typedef struct { + unsigned char buf[21]; /* Performance optimization code structure assignment length 21 bytes */ +} SecStrBuf21; +typedef struct { + unsigned char buf[22]; /* Performance optimization code structure assignment length 22 bytes */ +} SecStrBuf22; +typedef struct { + unsigned char buf[23]; /* Performance optimization code structure assignment length 23 bytes */ +} SecStrBuf23; +typedef struct { + unsigned char buf[24]; /* Performance optimization code structure assignment length 24 bytes */ +} SecStrBuf24; +typedef struct { + unsigned char buf[25]; /* Performance optimization code structure assignment length 25 bytes */ +} SecStrBuf25; +typedef struct { + unsigned char buf[26]; /* Performance optimization code structure assignment length 26 bytes */ +} SecStrBuf26; +typedef struct { + unsigned char buf[27]; /* Performance optimization code structure assignment length 27 bytes */ +} SecStrBuf27; +typedef struct { + unsigned char buf[28]; /* Performance optimization code structure assignment length 28 bytes */ +} SecStrBuf28; +typedef struct { + unsigned char buf[29]; /* Performance optimization code structure assignment length 29 bytes */ +} SecStrBuf29; +typedef struct { + unsigned char buf[30]; /* Performance optimization code structure assignment length 30 bytes */ +} SecStrBuf30; +typedef struct { + unsigned char buf[31]; /* Performance optimization code structure assignment length 31 bytes */ +} SecStrBuf31; +typedef struct { + unsigned char buf[32]; /* Performance optimization code structure assignment length 32 bytes */ +} SecStrBuf32; +typedef struct { + unsigned char buf[33]; /* Performance optimization code structure assignment length 33 bytes */ +} SecStrBuf33; +typedef struct { + unsigned char buf[34]; /* Performance optimization code structure assignment length 34 bytes */ +} SecStrBuf34; +typedef struct { + unsigned char buf[35]; /* Performance optimization code structure assignment length 35 bytes */ +} SecStrBuf35; +typedef struct { + unsigned char buf[36]; /* Performance optimization code structure assignment length 36 bytes */ +} SecStrBuf36; +typedef struct { + unsigned char buf[37]; /* Performance optimization code structure assignment length 37 bytes */ +} SecStrBuf37; +typedef struct { + unsigned char buf[38]; /* Performance optimization code structure assignment length 38 bytes */ +} SecStrBuf38; +typedef struct { + unsigned char buf[39]; /* Performance optimization code structure assignment length 39 bytes */ +} SecStrBuf39; +typedef struct { + unsigned char buf[40]; /* Performance optimization code structure assignment length 40 bytes */ +} SecStrBuf40; +typedef struct { + unsigned char buf[41]; /* Performance optimization code structure assignment length 41 bytes */ +} SecStrBuf41; +typedef struct { + unsigned char buf[42]; /* Performance optimization code structure assignment length 42 bytes */ +} SecStrBuf42; +typedef struct { + unsigned char buf[43]; /* Performance optimization code structure assignment length 43 bytes */ +} SecStrBuf43; +typedef struct { + unsigned char buf[44]; /* Performance optimization code structure assignment length 44 bytes */ +} SecStrBuf44; +typedef struct { + unsigned char buf[45]; /* Performance optimization code structure assignment length 45 bytes */ +} SecStrBuf45; +typedef struct { + unsigned char buf[46]; /* Performance optimization code structure assignment length 46 bytes */ +} SecStrBuf46; +typedef struct { + unsigned char buf[47]; /* Performance optimization code structure assignment length 47 bytes */ +} SecStrBuf47; +typedef struct { + unsigned char buf[48]; /* Performance optimization code structure assignment length 48 bytes */ +} SecStrBuf48; +typedef struct { + unsigned char buf[49]; /* Performance optimization code structure assignment length 49 bytes */ +} SecStrBuf49; +typedef struct { + unsigned char buf[50]; /* Performance optimization code structure assignment length 50 bytes */ +} SecStrBuf50; +typedef struct { + unsigned char buf[51]; /* Performance optimization code structure assignment length 51 bytes */ +} SecStrBuf51; +typedef struct { + unsigned char buf[52]; /* Performance optimization code structure assignment length 52 bytes */ +} SecStrBuf52; +typedef struct { + unsigned char buf[53]; /* Performance optimization code structure assignment length 53 bytes */ +} SecStrBuf53; +typedef struct { + unsigned char buf[54]; /* Performance optimization code structure assignment length 54 bytes */ +} SecStrBuf54; +typedef struct { + unsigned char buf[55]; /* Performance optimization code structure assignment length 55 bytes */ +} SecStrBuf55; +typedef struct { + unsigned char buf[56]; /* Performance optimization code structure assignment length 56 bytes */ +} SecStrBuf56; +typedef struct { + unsigned char buf[57]; /* Performance optimization code structure assignment length 57 bytes */ +} SecStrBuf57; +typedef struct { + unsigned char buf[58]; /* Performance optimization code structure assignment length 58 bytes */ +} SecStrBuf58; +typedef struct { + unsigned char buf[59]; /* Performance optimization code structure assignment length 59 bytes */ +} SecStrBuf59; +typedef struct { + unsigned char buf[60]; /* Performance optimization code structure assignment length 60 bytes */ +} SecStrBuf60; +typedef struct { + unsigned char buf[61]; /* Performance optimization code structure assignment length 61 bytes */ +} SecStrBuf61; +typedef struct { + unsigned char buf[62]; /* Performance optimization code structure assignment length 62 bytes */ +} SecStrBuf62; +typedef struct { + unsigned char buf[63]; /* Performance optimization code structure assignment length 63 bytes */ +} SecStrBuf63; +typedef struct { + unsigned char buf[64]; /* Performance optimization code structure assignment length 64 bytes */ +} SecStrBuf64; + +/* + * User can change the error handler by modify the following definition, + * such as logging the detail error in file. + */ +#if defined(_DEBUG) || defined(DEBUG) +#if defined(SECUREC_ERROR_HANDLER_BY_ASSERT) +#define SECUREC_ERROR_INVALID_PARAMTER(msg) assert(msg "invalid argument" == NULL) +#define SECUREC_ERROR_INVALID_RANGE(msg) assert(msg "invalid dest buffer size" == NULL) +#define SECUREC_ERROR_BUFFER_OVERLAP(msg) assert(msg "buffer overlap" == NULL) +#elif defined(SECUREC_ERROR_HANDLER_BY_PRINTF) +#if SECUREC_IN_KERNEL +#define SECUREC_ERROR_INVALID_PARAMTER(msg) printk("%s invalid argument\n", msg) +#define SECUREC_ERROR_INVALID_RANGE(msg) printk("%s invalid dest buffer size\n", msg) +#define SECUREC_ERROR_BUFFER_OVERLAP(msg) printk("%s buffer overlap\n", msg) +#else +#define SECUREC_ERROR_INVALID_PARAMTER(msg) printf("%s invalid argument\n", msg) +#define SECUREC_ERROR_INVALID_RANGE(msg) printf("%s invalid dest buffer size\n", msg) +#define SECUREC_ERROR_BUFFER_OVERLAP(msg) printf("%s buffer overlap\n", msg) +#endif +#elif defined(SECUREC_ERROR_HANDLER_BY_FILE_LOG) +#define SECUREC_ERROR_INVALID_PARAMTER(msg) LogSecureCRuntimeError(msg " EINVAL\n") +#define SECUREC_ERROR_INVALID_RANGE(msg) LogSecureCRuntimeError(msg " ERANGE\n") +#define SECUREC_ERROR_BUFFER_OVERLAP(msg) LogSecureCRuntimeError(msg " EOVERLAP\n") +#endif +#endif + +/* Default handler is none */ +#ifndef SECUREC_ERROR_INVALID_PARAMTER +#define SECUREC_ERROR_INVALID_PARAMTER(msg) +#endif +#ifndef SECUREC_ERROR_INVALID_RANGE +#define SECUREC_ERROR_INVALID_RANGE(msg) +#endif +#ifndef SECUREC_ERROR_BUFFER_OVERLAP +#define SECUREC_ERROR_BUFFER_OVERLAP(msg) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Assembly language memory copy and memory set for X86 or MIPS ... */ +#ifdef SECUREC_USE_ASM +void *memcpy_opt(void *dest, const void *src, size_t n); +void *memset_opt(void *s, int c, size_t n); +#endif + +#if defined(SECUREC_ERROR_HANDLER_BY_FILE_LOG) +void LogSecureCRuntimeError(const char *errDetail); +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.c new file mode 100644 index 000000000..e79868f45 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.c @@ -0,0 +1,38 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: By defining data type for ANSI string and including "input.inl", + * this file generates real underlying function used by scanf family API. + * Create: 2014-02-25 + */ + +#define SECUREC_FORMAT_OUTPUT_INPUT 1 +#ifdef SECUREC_FOR_WCHAR +#undef SECUREC_FOR_WCHAR +#endif + +#include "secinput.h" + +#include "input.inl" + +SECUREC_INLINE int SecIsDigit(SecInt ch) +{ + /* SecInt to unsigned char clear 571, use bit mask to clear negative return of ch */ + return isdigit((int)((unsigned int)(unsigned char)(ch) & 0xffU)); +} +SECUREC_INLINE int SecIsXdigit(SecInt ch) +{ + return isxdigit((int)((unsigned int)(unsigned char)(ch) & 0xffU)); +} +SECUREC_INLINE int SecIsSpace(SecInt ch) +{ + return isspace((int)((unsigned int)(unsigned char)(ch) & 0xffU)); +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.c new file mode 100644 index 000000000..12c9ef813 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.c @@ -0,0 +1,75 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: By defining data type for UNICODE string and including "input.inl", + * this file generates real underlying function used by scanf family API. + * Create: 2014-02-25 + */ + +/* If some platforms don't have wchar.h, don't include it */ +#if !(defined(SECUREC_VXWORKS_PLATFORM)) +/* If there is no macro below, it will cause vs2010 compiling alarm */ +#if defined(_MSC_VER) && (_MSC_VER >= 1400) +#ifndef __STDC_WANT_SECURE_LIB__ +/* The order of adjustment is to eliminate alarm of Duplicate Block */ +#define __STDC_WANT_SECURE_LIB__ 0 +#endif +#ifndef _CRTIMP_ALTERNATIVE +#define _CRTIMP_ALTERNATIVE /* Comment microsoft *_s function */ +#endif +#endif +#include +#endif + +/* Disable wchar func to clear vs warning */ +#define SECUREC_ENABLE_WCHAR_FUNC 0 +#define SECUREC_FORMAT_OUTPUT_INPUT 1 + +#ifndef SECUREC_FOR_WCHAR +#define SECUREC_FOR_WCHAR +#endif + +#include "secinput.h" + +#include "input.inl" + +SECUREC_INLINE unsigned int SecWcharHighBits(SecInt ch) +{ + /* Convert int to unsigned int clear 571 */ + return ((unsigned int)(int)ch & (~0xffU)); +} + +SECUREC_INLINE unsigned char SecWcharLowByte(SecInt ch) +{ + /* Convert int to unsigned int clear 571 */ + return (unsigned char)((unsigned int)(int)ch & 0xffU); +} + +SECUREC_INLINE int SecIsDigit(SecInt ch) +{ + if (SecWcharHighBits(ch) != 0) { + return 0; /* Same as isdigit */ + } + return isdigit((int)SecWcharLowByte(ch)); +} + +SECUREC_INLINE int SecIsXdigit(SecInt ch) +{ + if (SecWcharHighBits(ch) != 0) { + return 0; /* Same as isxdigit */ + } + return isxdigit((int)SecWcharLowByte(ch)); +} + +SECUREC_INLINE int SecIsSpace(SecInt ch) +{ + return iswspace((wint_t)(int)(ch)); +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput.h b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput.h new file mode 100644 index 000000000..dc483f58c --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput.h @@ -0,0 +1,153 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: Define macro, enum, data struct, and declare internal used function + * prototype, which is used by output.inl, secureprintoutput_w.c and + * secureprintoutput_a.c. + * Create: 2014-02-25 + */ + +#ifndef SECUREPRINTOUTPUT_H_E950DA2C_902F_4B15_BECD_948E99090D9C +#define SECUREPRINTOUTPUT_H_E950DA2C_902F_4B15_BECD_948E99090D9C +#include "securecutil.h" + +/* Shield compilation alerts about using sprintf without format attribute to format float value. */ +#ifndef SECUREC_HANDLE_WFORMAT +#define SECUREC_HANDLE_WFORMAT 1 +#endif + +#if defined(__clang__) +#if SECUREC_HANDLE_WFORMAT && defined(__GNUC__) && ((__GNUC__ >= 5) || \ + (defined(__GNUC_MINOR__) && (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))) +#define SECUREC_MASK_WFORMAT_WARNING _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wformat-nonliteral\"") +#define SECUREC_END_MASK_WFORMAT_WARNING _Pragma("GCC diagnostic pop") +#else +#define SECUREC_MASK_WFORMAT_WARNING +#define SECUREC_END_MASK_WFORMAT_WARNING +#endif +#else +#if SECUREC_HANDLE_WFORMAT && defined(__GNUC__) && ((__GNUC__ >= 5 ) || \ + (defined(__GNUC_MINOR__) && (__GNUC__ == 4 && __GNUC_MINOR__ > 7))) +#define SECUREC_MASK_WFORMAT_WARNING _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wformat-nonliteral\"") \ + _Pragma("GCC diagnostic ignored \"-Wmissing-format-attribute\"") \ + _Pragma("GCC diagnostic ignored \"-Wsuggest-attribute=format\"") +#define SECUREC_END_MASK_WFORMAT_WARNING _Pragma("GCC diagnostic pop") +#else +#define SECUREC_MASK_WFORMAT_WARNING +#define SECUREC_END_MASK_WFORMAT_WARNING +#endif +#endif + +#define SECUREC_MASK_VSPRINTF_WARNING SECUREC_MASK_WFORMAT_WARNING \ + SECUREC_MASK_MSVC_CRT_WARNING + +#define SECUREC_END_MASK_VSPRINTF_WARNING SECUREC_END_MASK_WFORMAT_WARNING \ + SECUREC_END_MASK_MSVC_CRT_WARNING + +/* + * Flag definitions. + * Using macros instead of enumerations is because some of the enumerated types under the compiler are 16bit. + */ +#define SECUREC_FLAG_SIGN 0x00001U +#define SECUREC_FLAG_SIGN_SPACE 0x00002U +#define SECUREC_FLAG_LEFT 0x00004U +#define SECUREC_FLAG_LEADZERO 0x00008U +#define SECUREC_FLAG_LONG 0x00010U +#define SECUREC_FLAG_SHORT 0x00020U +#define SECUREC_FLAG_SIGNED 0x00040U +#define SECUREC_FLAG_ALTERNATE 0x00080U +#define SECUREC_FLAG_NEGATIVE 0x00100U +#define SECUREC_FLAG_FORCE_OCTAL 0x00200U +#define SECUREC_FLAG_LONG_DOUBLE 0x00400U +#define SECUREC_FLAG_WIDECHAR 0x00800U +#define SECUREC_FLAG_LONGLONG 0x01000U +#define SECUREC_FLAG_CHAR 0x02000U +#define SECUREC_FLAG_POINTER 0x04000U +#define SECUREC_FLAG_I64 0x08000U +#define SECUREC_FLAG_PTRDIFF 0x10000U +#define SECUREC_FLAG_SIZE 0x20000U +#ifdef SECUREC_COMPATIBLE_LINUX_FORMAT +#define SECUREC_FLAG_INTMAX 0x40000U +#endif + +/* State definitions. Identify the status of the current format */ +typedef enum { + STAT_NORMAL, + STAT_PERCENT, + STAT_FLAG, + STAT_WIDTH, + STAT_DOT, + STAT_PRECIS, + STAT_SIZE, + STAT_TYPE, + STAT_INVALID +} SecFmtState; + +#ifndef SECUREC_BUFFER_SIZE +#if SECUREC_IN_KERNEL +#define SECUREC_BUFFER_SIZE 32 +#elif defined(SECUREC_STACK_SIZE_LESS_THAN_1K) +/* + * SECUREC BUFFER SIZE Can not be less than 23 + * The length of the octal representation of 64-bit integers with zero lead + */ +#define SECUREC_BUFFER_SIZE 256 +#else +#define SECUREC_BUFFER_SIZE 512 +#endif +#endif +#if SECUREC_BUFFER_SIZE < 23 +#error SECUREC_BUFFER_SIZE Can not be less than 23 +#endif +/* Buffer size for wchar, use 4 to make the compiler aligns as 8 bytes as possible */ +#define SECUREC_WCHAR_BUFFER_SIZE 4 + +#define SECUREC_MAX_PRECISION SECUREC_BUFFER_SIZE +/* Max. # bytes in multibyte char,see MB_LEN_MAX */ +#define SECUREC_MB_LEN 16 +/* The return value of the internal function, which is returned when truncated */ +#define SECUREC_PRINTF_TRUNCATE (-2) + +#define SECUREC_VSPRINTF_PARAM_ERROR(format, strDest, destMax, maxLimit) \ + ((format) == NULL || (strDest) == NULL || (destMax) == 0 || (destMax) > (maxLimit)) + +#define SECUREC_VSPRINTF_CLEAR_DEST(strDest, destMax, maxLimit) do { \ + if ((strDest) != NULL && (destMax) > 0 && (destMax) <= (maxLimit)) { \ + *(strDest) = '\0'; \ + } \ +} SECUREC_WHILE_ZERO + +#ifdef SECUREC_COMPATIBLE_WIN_FORMAT +#define SECUREC_VSNPRINTF_PARAM_ERROR(format, strDest, destMax, count, maxLimit) \ + (((format) == NULL || (strDest) == NULL || (destMax) == 0 || (destMax) > (maxLimit)) || \ + ((count) > (SECUREC_STRING_MAX_LEN - 1) && (count) != (size_t)(-1))) + +#else +#define SECUREC_VSNPRINTF_PARAM_ERROR(format, strDest, destMax, count, maxLimit) \ + (((format) == NULL || (strDest) == NULL || (destMax) == 0 || (destMax) > (maxLimit)) || \ + ((count) > (SECUREC_STRING_MAX_LEN - 1))) +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#ifdef SECUREC_FOR_WCHAR +int SecVswprintfImpl(wchar_t *string, size_t count, const wchar_t *format, va_list argList); +#else +int SecVsnprintfImpl(char *string, size_t count, const char *format, va_list argList); +#endif +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.c new file mode 100644 index 000000000..b2b4b6a65 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.c @@ -0,0 +1,112 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: By defining corresponding macro for ANSI string and including "output.inl", + * this file generates real underlying function used by printf family API. + * Create: 2014-02-25 + */ + +#define SECUREC_FORMAT_OUTPUT_INPUT 1 + +#ifdef SECUREC_FOR_WCHAR +#undef SECUREC_FOR_WCHAR +#endif + +#include "secureprintoutput.h" +#if SECUREC_WARP_OUTPUT +#define SECUREC_FORMAT_FLAG_TABLE_SIZE 128 +SECUREC_INLINE const char *SecSkipKnownFlags(const char *format) +{ + static const unsigned char flagTable[SECUREC_FORMAT_FLAG_TABLE_SIZE] = { + /* + * Known flag is "0123456789 +-#hlLwZzjqt*I$" + */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + const char *fmt = format; + while (*fmt != '\0') { + char fmtChar = *fmt; + if ((unsigned char)fmtChar > 0x7f) { /* 0x7f is upper limit of format char value */ + break; + } + if (flagTable[(unsigned char)fmtChar] == 0) { + break; + } + ++fmt; + } + return fmt; +} + +SECUREC_INLINE int SecFormatContainN(const char *format) +{ + const char *fmt = format; + while (*fmt != '\0') { + ++fmt; + /* Skip normal char */ + if (*(fmt - 1) != '%') { + continue; + } + /* Meet %% */ + if (*fmt == '%') { + ++fmt; /* Point to the character after the %. Correct handling %%xx */ + continue; + } + /* Now parse %..., fmt point to the character after the % */ + fmt = SecSkipKnownFlags(fmt); + if (*fmt == 'n') { + return 1; + } + } + return 0; +} +/* + * Multi character formatted output implementation, the count include \0 character, must be greater than zero + */ +int SecVsnprintfImpl(char *string, size_t count, const char *format, va_list argList) +{ + int retVal; + if (SecFormatContainN(format) != 0) { + string[0] = '\0'; + return -1; + } + SECUREC_MASK_VSPRINTF_WARNING + retVal = vsnprintf(string, count, format, argList); + SECUREC_END_MASK_VSPRINTF_WARNING + if (retVal >= (int)count) { /* The size_t to int is ok, count max is SECUREC_STRING_MAX_LEN */ + /* The buffer was too small; we return truncation */ + string[count - 1] = '\0'; + return SECUREC_PRINTF_TRUNCATE; + } + if (retVal < 0) { + string[0] = '\0'; /* Empty the dest strDest */ + return -1; + } + return retVal; +} +#else +#if SECUREC_IN_KERNEL +#include +#endif + +#ifndef EOF +#define EOF (-1) +#endif + +#include "output.inl" + +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.c new file mode 100644 index 000000000..672c0184c --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.c @@ -0,0 +1,41 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: By defining corresponding macro for UNICODE string and including "output.inl", + * this file generates real underlying function used by printf family API. + * Create: 2014-02-25 + */ + +/* If some platforms don't have wchar.h, don't include it */ +#if !(defined(SECUREC_VXWORKS_PLATFORM)) +/* If there is no macro above, it will cause compiling alarm */ +#if defined(_MSC_VER) && (_MSC_VER >= 1400) +#ifndef _CRTIMP_ALTERNATIVE +#define _CRTIMP_ALTERNATIVE /* Comment microsoft *_s function */ +#endif +#ifndef __STDC_WANT_SECURE_LIB__ +#define __STDC_WANT_SECURE_LIB__ 0 +#endif +#endif +#include +#endif + +/* Disable wchar func to clear vs warning */ +#define SECUREC_ENABLE_WCHAR_FUNC 0 +#define SECUREC_FORMAT_OUTPUT_INPUT 1 + +#ifndef SECUREC_FOR_WCHAR +#define SECUREC_FOR_WCHAR +#endif + +#include "secureprintoutput.h" + +#include "output.inl" + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.c new file mode 100644 index 000000000..e9b94f372 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.c @@ -0,0 +1,110 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: snprintf_s function + * Create: 2014-02-25 + */ + +#include "securec.h" + +#if SECUREC_ENABLE_SNPRINTF +/* + * + * The snprintf_s function is equivalent to the snprintf function + * except for the parameter destMax/count and the explicit runtime-constraints violation + * The snprintf_s function formats and stores count or fewer characters in + * strDest and appends a terminating null. Each argument (if any) is converted + * and output according to the corresponding format specification in format. + * The formatting is consistent with the printf family of functions; If copying + * occurs between strings that overlap, the behavior is undefined. + * + * + * strDest Storage location for the output. + * destMax The size of the storage location for output. Size + * in bytes for snprintf_s or size in words for snwprintf_s. + * count Maximum number of character to store. + * format Format-control string. + * ... Optional arguments. + * + * + * strDest is updated + * + * + * return the number of characters written, not including the terminating null + * return -1 if an error occurs. + * return -1 if count < destMax and the output string has been truncated + * + * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid + * + */ +int snprintf_s(char *strDest, size_t destMax, size_t count, const char *format, ...) +{ + int ret; /* If initialization causes e838 */ + va_list argList; + + va_start(argList, format); + ret = vsnprintf_s(strDest, destMax, count, format, argList); + va_end(argList); + (void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */ + + return ret; +} +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(snprintf_s); +#endif +#endif + +#if SECUREC_SNPRINTF_TRUNCATED +/* + * + * The snprintf_truncated_s function is equivalent to the snprintf function + * except for the parameter destMax/count and the explicit runtime-constraints violation + * The snprintf_truncated_s function formats and stores count or fewer characters in + * strDest and appends a terminating null. Each argument (if any) is converted + * and output according to the corresponding format specification in format. + * The formatting is consistent with the printf family of functions; If copying + * occurs between strings that overlap, the behavior is undefined. + * + * + * strDest Storage location for the output. + * destMax The size of the storage location for output. Size + * in bytes for snprintf_truncated_s or size in words for snwprintf_s. + * format Format-control string. + * ... Optional arguments. + * + * + * strDest is updated + * + * + * return the number of characters written, not including the terminating null + * return -1 if an error occurs. + * return destMax-1 if output string has been truncated + * + * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid + * + */ +int snprintf_truncated_s(char *strDest, size_t destMax, const char *format, ...) +{ + int ret; /* If initialization causes e838 */ + va_list argList; + + va_start(argList, format); + ret = vsnprintf_truncated_s(strDest, destMax, format, argList); + va_end(argList); + (void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */ + + return ret; +} +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(snprintf_truncated_s); +#endif + +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.c new file mode 100644 index 000000000..0cf3fca90 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.c @@ -0,0 +1,58 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: sprintf_s function + * Create: 2014-02-25 + */ + +#include "securec.h" + +/* + * + * The sprintf_s function is equivalent to the sprintf function + * except for the parameter destMax and the explicit runtime-constraints violation + * The sprintf_s function formats and stores a series of characters and values + * in strDest. Each argument (if any) is converted and output according to + * the corresponding format specification in format. The format consists of + * ordinary characters and has the same form and function as the format argument + * for printf. A null character is appended after the last character written. + * If copying occurs between strings that overlap, the behavior is undefined. + * + * + * strDest Storage location for output. + * destMax Maximum number of characters to store. + * format Format-control string. + * ... Optional arguments + * + * + * strDest is updated + * + * + * return the number of bytes stored in strDest, not counting the terminating null character. + * return -1 if an error occurred. + * + * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid + */ +int sprintf_s(char *strDest, size_t destMax, const char *format, ...) +{ + int ret; /* If initialization causes e838 */ + va_list argList; + + va_start(argList, format); + ret = vsprintf_s(strDest, destMax, format, argList); + va_end(argList); + (void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */ + + return ret; +} +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(sprintf_s); +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.c new file mode 100644 index 000000000..b441329e1 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.c @@ -0,0 +1,58 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: sscanf_s function + * Create: 2014-02-25 + */ + +#include "securec.h" + +/* + * + * The sscanf_s function is equivalent to fscanf_s, + * except that input is obtained from a string (specified by the argument buffer) rather than from a stream + * The sscanf function reads data from buffer into the location given by each + * argument. Every argument must be a pointer to a variable with a type that + * corresponds to a type specifier in format. The format argument controls the + * interpretation of the input fields and has the same form and function as + * the format argument for the scanf function. + * If copying takes place between strings that overlap, the behavior is undefined. + * + * + * buffer Stored data. + * format Format control string, see Format Specifications. + * ... Optional arguments. + * + * + * ... The converted value stored in user assigned address + * + * + * Each of these functions returns the number of fields successfully converted + * and assigned; the return value does not include fields that were read but + * not assigned. + * A return value of 0 indicates that no fields were assigned. + * return -1 if an error occurs. + */ +int sscanf_s(const char *buffer, const char *format, ...) +{ + int ret; /* If initialization causes e838 */ + va_list argList; + + va_start(argList, format); + ret = vsscanf_s(buffer, format, argList); + va_end(argList); + (void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */ + + return ret; +} +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(sscanf_s); +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.c new file mode 100644 index 000000000..f835e7bc9 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.c @@ -0,0 +1,101 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: strcat_s function + * Create: 2014-02-25 + */ + +#include "securecutil.h" + +/* + * Befor this function, the basic parameter checking has been done + */ +SECUREC_INLINE errno_t SecDoCat(char *strDest, size_t destMax, const char *strSrc) +{ + size_t destLen; + size_t srcLen; + size_t maxSrcLen; + SECUREC_CALC_STR_LEN(strDest, destMax, &destLen); + /* Only optimize strSrc, do not apply this function to strDest */ + maxSrcLen = destMax - destLen; + SECUREC_CALC_STR_LEN_OPT(strSrc, maxSrcLen, &srcLen); + + if (SECUREC_CAT_STRING_IS_OVERLAP(strDest, destLen, strSrc, srcLen)) { + strDest[0] = '\0'; + if (strDest + destLen <= strSrc && destLen == destMax) { + SECUREC_ERROR_INVALID_PARAMTER("strcat_s"); + return EINVAL_AND_RESET; + } + SECUREC_ERROR_BUFFER_OVERLAP("strcat_s"); + return EOVERLAP_AND_RESET; + } + if (srcLen + destLen >= destMax || strDest == strSrc) { + strDest[0] = '\0'; + if (destLen == destMax) { + SECUREC_ERROR_INVALID_PARAMTER("strcat_s"); + return EINVAL_AND_RESET; + } + SECUREC_ERROR_INVALID_RANGE("strcat_s"); + return ERANGE_AND_RESET; + } + SECUREC_MEMCPY_WARP_OPT(strDest + destLen, strSrc, srcLen + 1); /* Single character length include \0 */ + return EOK; +} + +/* + * + * The strcat_s function appends a copy of the string pointed to by strSrc (including the terminating null character) + * to the end of the string pointed to by strDest. + * The initial character of strSrc overwrites the terminating null character of strDest. + * strcat_s will return EOVERLAP_AND_RESET if the source and destination strings overlap. + * + * Note that the second parameter is the total size of the buffer, not the + * remaining size. + * + * + * strDest Null-terminated destination string buffer. + * destMax Size of the destination string buffer. + * strSrc Null-terminated source string buffer. + * + * + * strDest is updated + * + * + * EOK Success + * EINVAL strDest is NULL and destMax != 0 and destMax <= SECUREC_STRING_MAX_LEN + * EINVAL_AND_RESET (strDest unterminated and all other parameters are valid) or + * (strDest != NULL and strSrc is NULL and destMax != 0 and destMax <= SECUREC_STRING_MAX_LEN) + * ERANGE destMax is 0 and destMax > SECUREC_STRING_MAX_LEN + * ERANGE_AND_RESET strDest have not enough space and all other parameters are valid and not overlap + * EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and all parameters are valid + * + * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid + */ +errno_t strcat_s(char *strDest, size_t destMax, const char *strSrc) +{ + if (destMax == 0 || destMax > SECUREC_STRING_MAX_LEN) { + SECUREC_ERROR_INVALID_RANGE("strcat_s"); + return ERANGE; + } + if (strDest == NULL || strSrc == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("strcat_s"); + if (strDest != NULL) { + strDest[0] = '\0'; + return EINVAL_AND_RESET; + } + return EINVAL; + } + return SecDoCat(strDest, destMax, strSrc); +} + +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(strcat_s); +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.c new file mode 100644 index 000000000..ca1b2ddb1 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.c @@ -0,0 +1,353 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: strcpy_s function + * Create: 2014-02-25 + */ +/* + * [Standardize-exceptions] Use unsafe function: Performance-sensitive + * [reason] Always used in the performance critical path, + * and sufficient input validation is performed before calling + */ + +#include "securecutil.h" + +#ifndef SECUREC_STRCPY_WITH_PERFORMANCE +#define SECUREC_STRCPY_WITH_PERFORMANCE 1 +#endif + +#define SECUREC_STRCPY_PARAM_OK(strDest, destMax, strSrc) ((destMax) > 0 && \ + (destMax) <= SECUREC_STRING_MAX_LEN && (strDest) != NULL && (strSrc) != NULL && (strDest) != (strSrc)) + +#if (!SECUREC_IN_KERNEL) && SECUREC_STRCPY_WITH_PERFORMANCE +#ifndef SECUREC_STRCOPY_THRESHOLD_SIZE +#define SECUREC_STRCOPY_THRESHOLD_SIZE 32UL +#endif +/* The purpose of converting to void is to clean up the alarm */ +#define SECUREC_SMALL_STR_COPY(strDest, strSrc, lenWithTerm) do { \ + if (SECUREC_ADDR_ALIGNED_8(strDest) && SECUREC_ADDR_ALIGNED_8(strSrc)) { \ + /* Use struct assignment */ \ + switch (lenWithTerm) { \ + case 1: \ + *(strDest) = *(strSrc); \ + break; \ + case 2: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 2); \ + break; \ + case 3: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 3); \ + break; \ + case 4: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 4); \ + break; \ + case 5: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 5); \ + break; \ + case 6: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 6); \ + break; \ + case 7: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 7); \ + break; \ + case 8: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 8); \ + break; \ + case 9: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 9); \ + break; \ + case 10: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 10); \ + break; \ + case 11: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 11); \ + break; \ + case 12: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 12); \ + break; \ + case 13: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 13); \ + break; \ + case 14: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 14); \ + break; \ + case 15: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 15); \ + break; \ + case 16: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 16); \ + break; \ + case 17: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 17); \ + break; \ + case 18: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 18); \ + break; \ + case 19: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 19); \ + break; \ + case 20: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 20); \ + break; \ + case 21: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 21); \ + break; \ + case 22: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 22); \ + break; \ + case 23: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 23); \ + break; \ + case 24: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 24); \ + break; \ + case 25: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 25); \ + break; \ + case 26: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 26); \ + break; \ + case 27: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 27); \ + break; \ + case 28: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 28); \ + break; \ + case 29: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 29); \ + break; \ + case 30: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 30); \ + break; \ + case 31: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 31); \ + break; \ + case 32: \ + SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 32); \ + break; \ + default: \ + /* Do nothing */ \ + break; \ + } /* END switch */ \ + } else { \ + char *tmpStrDest_ = (char *)(strDest); \ + const char *tmpStrSrc_ = (const char *)(strSrc); \ + switch (lenWithTerm) { \ + case 32: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 31: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 30: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 29: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 28: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 27: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 26: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 25: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 24: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 23: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 22: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 21: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 20: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 19: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 18: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 17: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 16: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 15: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 14: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 13: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 12: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 11: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 10: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 9: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 8: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 7: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 6: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 5: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 4: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 3: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 2: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + case 1: \ + *(tmpStrDest_++) = *(tmpStrSrc_++); \ + /* fall-through */ /* FALLTHRU */ \ + default: \ + /* Do nothing */ \ + break; \ + } \ + } \ +} SECUREC_WHILE_ZERO +#endif + +#if SECUREC_IN_KERNEL || (!SECUREC_STRCPY_WITH_PERFORMANCE) +#define SECUREC_STRCPY_OPT(dest, src, lenWithTerm) SECUREC_MEMCPY_WARP_OPT((dest), (src), (lenWithTerm)) +#else +/* + * Performance optimization. lenWithTerm include '\0' + */ +#define SECUREC_STRCPY_OPT(dest, src, lenWithTerm) do { \ + if ((lenWithTerm) > SECUREC_STRCOPY_THRESHOLD_SIZE) { \ + SECUREC_MEMCPY_WARP_OPT((dest), (src), (lenWithTerm)); \ + } else { \ + SECUREC_SMALL_STR_COPY((dest), (src), (lenWithTerm)); \ + } \ +} SECUREC_WHILE_ZERO +#endif + +/* + * Check Src Range + */ +SECUREC_INLINE errno_t CheckSrcRange(char *strDest, size_t destMax, const char *strSrc) +{ + size_t tmpDestMax = destMax; + const char *tmpSrc = strSrc; + /* Use destMax as boundary checker and destMax must be greater than zero */ + while (*tmpSrc != '\0' && tmpDestMax > 0) { + ++tmpSrc; + --tmpDestMax; + } + if (tmpDestMax == 0) { + strDest[0] = '\0'; + SECUREC_ERROR_INVALID_RANGE("strcpy_s"); + return ERANGE_AND_RESET; + } + return EOK; +} + +/* + * Handling errors + */ +errno_t strcpy_error(char *strDest, size_t destMax, const char *strSrc) +{ + if (destMax == 0 || destMax > SECUREC_STRING_MAX_LEN) { + SECUREC_ERROR_INVALID_RANGE("strcpy_s"); + return ERANGE; + } + if (strDest == NULL || strSrc == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("strcpy_s"); + if (strDest != NULL) { + strDest[0] = '\0'; + return EINVAL_AND_RESET; + } + return EINVAL; + } + return CheckSrcRange(strDest, destMax, strSrc); +} + +/* + * + * The strcpy_s function copies the string pointed to strSrc + * (including the terminating null character) into the array pointed to by strDest + * The destination string must be large enough to hold the source string, + * including the terminating null character. strcpy_s will return EOVERLAP_AND_RESET + * if the source and destination strings overlap. + * + * + * strDest Location of destination string buffer + * destMax Size of the destination string buffer. + * strSrc Null-terminated source string buffer. + * + * + * strDest is updated. + * + * + * EOK Success + * EINVAL strDest is NULL and destMax != 0 and destMax <= SECUREC_STRING_MAX_LEN + * EINVAL_AND_RESET strDest != NULL and strSrc is NULL and destMax != 0 and destMax <= SECUREC_STRING_MAX_LEN + * ERANGE destMax is 0 and destMax > SECUREC_STRING_MAX_LEN + * ERANGE_AND_RESET strDest have not enough space and all other parameters are valid and not overlap + * EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and all parameters are valid + * + * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid + */ +errno_t strcpy_s(char *strDest, size_t destMax, const char *strSrc) +{ + if (SECUREC_STRCPY_PARAM_OK(strDest, destMax, strSrc)) { + size_t srcStrLen; + SECUREC_CALC_STR_LEN(strSrc, destMax, &srcStrLen); + ++srcStrLen; /* The length include '\0' */ + + if (srcStrLen <= destMax) { + /* Use mem overlap check include '\0' */ + if (SECUREC_MEMORY_NO_OVERLAP(strDest, strSrc, srcStrLen)) { + /* Performance optimization srcStrLen include '\0' */ + SECUREC_STRCPY_OPT(strDest, strSrc, srcStrLen); + return EOK; + } else { + strDest[0] = '\0'; + SECUREC_ERROR_BUFFER_OVERLAP("strcpy_s"); + return EOVERLAP_AND_RESET; + } + } + } + return strcpy_error(strDest, destMax, strSrc); +} + +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(strcpy_s); +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.c new file mode 100644 index 000000000..6686d2994 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.c @@ -0,0 +1,119 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: strncat_s function + * Create: 2014-02-25 + */ + +#include "securecutil.h" + +/* + * Befor this function, the basic parameter checking has been done + */ +SECUREC_INLINE errno_t SecDoCatLimit(char *strDest, size_t destMax, const char *strSrc, size_t count) +{ + size_t destLen; + size_t srcLen; + SECUREC_CALC_STR_LEN(strDest, destMax, &destLen); + /* + * The strSrc is no longer optimized. The reason is that when count is small, + * the efficiency of strnlen is higher than that of self realization. + */ + SECUREC_CALC_STR_LEN(strSrc, count, &srcLen); + + if (SECUREC_CAT_STRING_IS_OVERLAP(strDest, destLen, strSrc, srcLen)) { + strDest[0] = '\0'; + if (strDest + destLen <= strSrc && destLen == destMax) { + SECUREC_ERROR_INVALID_PARAMTER("strncat_s"); + return EINVAL_AND_RESET; + } + SECUREC_ERROR_BUFFER_OVERLAP("strncat_s"); + return EOVERLAP_AND_RESET; + } + if (srcLen + destLen >= destMax || strDest == strSrc) { + strDest[0] = '\0'; + if (destLen == destMax) { + SECUREC_ERROR_INVALID_PARAMTER("strncat_s"); + return EINVAL_AND_RESET; + } + SECUREC_ERROR_INVALID_RANGE("strncat_s"); + return ERANGE_AND_RESET; + } + SECUREC_MEMCPY_WARP_OPT(strDest + destLen, strSrc, srcLen); /* No terminator */ + *(strDest + destLen + srcLen) = '\0'; + return EOK; +} + +/* + * + * The strncat_s function appends not more than n successive characters + * (not including the terminating null character) + * from the array pointed to by strSrc to the end of the string pointed to by strDest + * The strncat_s function try to append the first D characters of strSrc to + * the end of strDest, where D is the lesser of count and the length of strSrc. + * If appending those D characters will fit within strDest (whose size is given + * as destMax) and still leave room for a null terminator, then those characters + * are appended, starting at the original terminating null of strDest, and a + * new terminating null is appended; otherwise, strDest[0] is set to the null + * character. + * + * + * strDest Null-terminated destination string. + * destMax Size of the destination buffer. + * strSrc Null-terminated source string. + * count Number of character to append, or truncate. + * + * + * strDest is updated + * + * + * EOK Success + * EINVAL strDest is NULL and destMax != 0 and destMax <= SECUREC_STRING_MAX_LEN + * EINVAL_AND_RESET (strDest unterminated and all other parameters are valid)or + * (strDest != NULL and strSrc is NULL and destMax != 0 and destMax <= SECUREC_STRING_MAX_LEN) + * ERANGE destMax is 0 and destMax > SECUREC_STRING_MAX_LEN + * ERANGE_AND_RESET strDest have not enough space and all other parameters are valid and not overlap + * EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and all parameters are valid + * + * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid + */ +errno_t strncat_s(char *strDest, size_t destMax, const char *strSrc, size_t count) +{ + if (destMax == 0 || destMax > SECUREC_STRING_MAX_LEN) { + SECUREC_ERROR_INVALID_RANGE("strncat_s"); + return ERANGE; + } + + if (strDest == NULL || strSrc == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("strncat_s"); + if (strDest != NULL) { + strDest[0] = '\0'; + return EINVAL_AND_RESET; + } + return EINVAL; + } + if (count > SECUREC_STRING_MAX_LEN) { +#ifdef SECUREC_COMPATIBLE_WIN_FORMAT + if (count == (size_t)(-1)) { + /* Windows internal functions may pass in -1 when calling this function */ + return SecDoCatLimit(strDest, destMax, strSrc, destMax); + } +#endif + strDest[0] = '\0'; + SECUREC_ERROR_INVALID_RANGE("strncat_s"); + return ERANGE_AND_RESET; + } + return SecDoCatLimit(strDest, destMax, strSrc, count); +} + +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(strncat_s); +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.c new file mode 100644 index 000000000..5f4c5b709 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.c @@ -0,0 +1,145 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: strncpy_s function + * Create: 2014-02-25 + */ +/* + * [Standardize-exceptions] Use unsafe function: Performance-sensitive + * [reason] Always used in the performance critical path, + * and sufficient input validation is performed before calling + */ + +#include "securecutil.h" + +#if defined(SECUREC_COMPATIBLE_WIN_FORMAT) +#define SECUREC_STRNCPY_PARAM_OK(strDest, destMax, strSrc, count) \ + (((destMax) > 0 && (destMax) <= SECUREC_STRING_MAX_LEN && (strDest) != NULL && (strSrc) != NULL && \ + ((count) <= SECUREC_STRING_MAX_LEN || (count) == ((size_t)(-1))) && (count) > 0)) +#else +#define SECUREC_STRNCPY_PARAM_OK(strDest, destMax, strSrc, count) \ + (((destMax) > 0 && (destMax) <= SECUREC_STRING_MAX_LEN && (strDest) != NULL && (strSrc) != NULL && \ + (count) <= SECUREC_STRING_MAX_LEN && (count) > 0)) +#endif + +/* + * Check Src Count Range + */ +SECUREC_INLINE errno_t CheckSrcCountRange(char *strDest, size_t destMax, const char *strSrc, size_t count) +{ + size_t tmpDestMax = destMax; + size_t tmpCount = count; + const char *endPos = strSrc; + + /* Use destMax and count as boundary checker and destMax must be greater than zero */ + while (*(endPos) != '\0' && tmpDestMax > 0 && tmpCount > 0) { + ++endPos; + --tmpCount; + --tmpDestMax; + } + if (tmpDestMax == 0) { + strDest[0] = '\0'; + SECUREC_ERROR_INVALID_RANGE("strncpy_s"); + return ERANGE_AND_RESET; + } + return EOK; +} + +/* + * Handling errors, when dest equal src return EOK + */ +errno_t strncpy_error(char *strDest, size_t destMax, const char *strSrc, size_t count) +{ + if (destMax == 0 || destMax > SECUREC_STRING_MAX_LEN) { + SECUREC_ERROR_INVALID_RANGE("strncpy_s"); + return ERANGE; + } + if (strDest == NULL || strSrc == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("strncpy_s"); + if (strDest != NULL) { + strDest[0] = '\0'; + return EINVAL_AND_RESET; + } + return EINVAL; + } + if (count > SECUREC_STRING_MAX_LEN) { + strDest[0] = '\0'; /* Clear dest string */ + SECUREC_ERROR_INVALID_RANGE("strncpy_s"); + return ERANGE_AND_RESET; + } + if (count == 0) { + strDest[0] = '\0'; + return EOK; + } + return CheckSrcCountRange(strDest, destMax, strSrc, count); +} + +/* + * + * The strncpy_s function copies not more than n successive characters (not including the terminating null character) + * from the array pointed to by strSrc to the array pointed to by strDest. + * + * + * strDest Destination string. + * destMax The size of the destination string, in characters. + * strSrc Source string. + * count Number of characters to be copied. + * + * + * strDest is updated + * + * + * EOK Success + * EINVAL strDest is NULL and destMax != 0 and destMax <= SECUREC_STRING_MAX_LEN + * EINVAL_AND_RESET strDest != NULL and strSrc is NULL and destMax != 0 and destMax <= SECUREC_STRING_MAX_LEN + * ERANGE destMax is 0 and destMax > SECUREC_STRING_MAX_LEN + * ERANGE_AND_RESET strDest have not enough space and all other parameters are valid and not overlap + * EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and all parameters are valid + * + * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid + */ +errno_t strncpy_s(char *strDest, size_t destMax, const char *strSrc, size_t count) +{ + if (SECUREC_STRNCPY_PARAM_OK(strDest, destMax, strSrc, count)) { + size_t minCpLen; /* Use it to store the maxi length limit */ + if (count < destMax) { + SECUREC_CALC_STR_LEN(strSrc, count, &minCpLen); /* No ending terminator */ + } else { + size_t tmpCount = destMax; +#ifdef SECUREC_COMPATIBLE_WIN_FORMAT + if (count == ((size_t)(-1))) { + tmpCount = destMax - 1; + } +#endif + SECUREC_CALC_STR_LEN(strSrc, tmpCount, &minCpLen); /* No ending terminator */ + if (minCpLen == destMax) { + strDest[0] = '\0'; + SECUREC_ERROR_INVALID_RANGE("strncpy_s"); + return ERANGE_AND_RESET; + } + } + if (SECUREC_STRING_NO_OVERLAP(strDest, strSrc, minCpLen) || strDest == strSrc) { + /* Not overlap */ + SECUREC_MEMCPY_WARP_OPT(strDest, strSrc, minCpLen); /* Copy string without terminator */ + strDest[minCpLen] = '\0'; + return EOK; + } else { + strDest[0] = '\0'; + SECUREC_ERROR_BUFFER_OVERLAP("strncpy_s"); + return EOVERLAP_AND_RESET; + } + } + return strncpy_error(strDest, destMax, strSrc, count); +} + +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(strncpy_s); +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.c new file mode 100644 index 000000000..cd5dcd2cd --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.c @@ -0,0 +1,116 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: strtok_s function + * Create: 2014-02-25 + */ + +#include "securecutil.h" + +SECUREC_INLINE int SecIsInDelimit(char ch, const char *strDelimit) +{ + const char *ctl = strDelimit; + while (*ctl != '\0' && *ctl != ch) { + ++ctl; + } + return (int)(*ctl != '\0'); +} + +/* + * Find beginning of token (skip over leading delimiters). + * Note that there is no token if this loop sets string to point to the terminal null. + */ +SECUREC_INLINE char *SecFindBegin(char *strToken, const char *strDelimit) +{ + char *token = strToken; + while (*token != '\0') { + if (SecIsInDelimit(*token, strDelimit) != 0) { + ++token; + continue; + } + /* Don't find any delimiter in string header, break the loop */ + break; + } + return token; +} + +/* + * Find rest of token + */ +SECUREC_INLINE char *SecFindRest(char *strToken, const char *strDelimit) +{ + /* Find the rest of the token. If it is not the end of the string, put a null there */ + char *token = strToken; + while (*token != '\0') { + if (SecIsInDelimit(*token, strDelimit) != 0) { + /* Find a delimiter, set string terminator */ + *token = '\0'; + ++token; + break; + } + ++token; + } + return token; +} + +/* + * Find the final position pointer + */ +SECUREC_INLINE char *SecUpdateToken(char *strToken, const char *strDelimit, char **context) +{ + /* Point to updated position. Record string position for next search in the context */ + *context = SecFindRest(strToken, strDelimit); + /* Determine if a token has been found. */ + if (*context == strToken) { + return NULL; + } + return strToken; +} + +/* + * + * The strtok_s function parses a string into a sequence of strToken, + * replace all characters in strToken string that match to strDelimit set with 0. + * On the first call to strtok_s the string to be parsed should be specified in strToken. + * In each subsequent call that should parse the same string, strToken should be NULL + * + * strToken String containing token or tokens. + * strDelimit Set of delimiter characters. + * context Used to store position information between calls + * to strtok_s + * + * context is updated + * + * On the first call returns the address of the first non \0 character, otherwise NULL is returned. + * In subsequent calls, the strtoken is set to NULL, and the context set is the same as the previous call, + * return NULL if the *context string length is equal 0, otherwise return *context. + */ +char *strtok_s(char *strToken, const char *strDelimit, char **context) +{ + char *orgToken = strToken; + /* Validate delimiter and string context */ + if (context == NULL || strDelimit == NULL) { + return NULL; + } + /* Valid input string and string pointer from where to search */ + if (orgToken == NULL && *context == NULL) { + return NULL; + } + /* If string is null, continue searching from previous string position stored in context */ + if (orgToken == NULL) { + orgToken = *context; + } + orgToken = SecFindBegin(orgToken, strDelimit); + return SecUpdateToken(orgToken, strDelimit, context); +} +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(strtok_s); +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.c new file mode 100644 index 000000000..09d77a2fc --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.c @@ -0,0 +1,48 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: swprintf_s function + * Create: 2014-02-25 + */ + +#include "securec.h" + +/* + * + * The swprintf_s function is the wide-character equivalent of the sprintf_s function + * + * + * strDest Storage location for the output. + * destMax Maximum number of characters to store. + * format Format-control string. + * ... Optional arguments + * + * + * strDest is updated + * + * + * return the number of wide characters stored in strDest, not counting the terminating null wide character. + * return -1 if an error occurred. + * + * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid + */ +int swprintf_s(wchar_t *strDest, size_t destMax, const wchar_t *format, ...) +{ + int ret; /* If initialization causes e838 */ + va_list argList; + + va_start(argList, format); + ret = vswprintf_s(strDest, destMax, format, argList); + va_end(argList); + (void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */ + + return ret; +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.c new file mode 100644 index 000000000..e5b8bbfc7 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: swscanf_s function + * Create: 2014-02-25 + */ + +#include "securec.h" + +/* + * + * The swscanf_s function is the wide-character equivalent of the sscanf_s function + * The swscanf_s function reads data from buffer into the location given by + * each argument. Every argument must be a pointer to a variable with a type + * that corresponds to a type specifier in format. The format argument controls + * the interpretation of the input fields and has the same form and function + * as the format argument for the scanf function. If copying takes place between + * strings that overlap, the behavior is undefined. + * + * + * buffer Stored data. + * format Format control string, see Format Specifications. + * ... Optional arguments. + * + * + * ... the converted value stored in user assigned address + * + * + * Each of these functions returns the number of fields successfully converted + * and assigned; The return value does not include fields that were read but not + * assigned. + * A return value of 0 indicates that no fields were assigned. + * return -1 if an error occurs. + */ +int swscanf_s(const wchar_t *buffer, const wchar_t *format, ...) +{ + int ret; /* If initialization causes e838 */ + va_list argList; + + va_start(argList, format); + ret = vswscanf_s(buffer, format, argList); + va_end(argList); + (void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */ + + return ret; +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.c new file mode 100644 index 000000000..214ee6a21 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: vfscanf_s function + * Create: 2014-02-25 + */ + +#include "secinput.h" + +/* + * + * The vfscanf_s function is equivalent to fscanf_s, with the variable argument list replaced by argList + * The vfscanf_s function reads data from the current position of stream into + * the locations given by argument (if any). Each argument must be a pointer + * to a variable of a type that corresponds to a type specifier in format. + * format controls the interpretation of the input fields and has the same + * form and function as the format argument for scanf. + * + * + * stream Pointer to FILE structure. + * format Format control string, see Format Specifications. + * argList pointer to list of arguments + * + * + * argList the converted value stored in user assigned address + * + * + * Each of these functions returns the number of fields successfully converted + * and assigned; the return value does not include fields that were read but + * not assigned. A return value of 0 indicates that no fields were assigned. + * return -1 if an error occurs. + */ +int vfscanf_s(FILE *stream, const char *format, va_list argList) +{ + int retVal; /* If initialization causes e838 */ + SecFileStream fStr; + + if (stream == NULL || format == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("vfscanf_s"); + return SECUREC_SCANF_EINVAL; + } + if (stream == SECUREC_STREAM_STDIN) { + return vscanf_s(format, argList); + } + + SECUREC_LOCK_FILE(stream); + SECUREC_FILE_STREAM_FROM_FILE(&fStr, stream); + retVal = SecInputS(&fStr, format, argList); + SECUREC_UNLOCK_FILE(stream); + if (retVal < 0) { + SECUREC_ERROR_INVALID_PARAMTER("vfscanf_s"); + return SECUREC_SCANF_EINVAL; + } + + return retVal; +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.c new file mode 100644 index 000000000..1ab9c3cb5 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.c @@ -0,0 +1,67 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: vfwscanf_s function + * Create: 2014-02-25 + */ + +#ifndef SECUREC_FOR_WCHAR +#define SECUREC_FOR_WCHAR +#endif + +#include "secinput.h" + +/* + * + * The vfwscanf_s function is the wide-character equivalent of the vfscanf_s function + * The vfwscanf_s function reads data from the current position of stream into + * the locations given by argument (if any). Each argument must be a pointer + * to a variable of a type that corresponds to a type specifier in format. + * format controls the interpretation of the input fields and has the same form + * and function as the format argument for scanf. + * + * + * stream Pointer to FILE structure. + * format Format control string, see Format Specifications. + * argList pointer to list of arguments + * + * + * argList the converted value stored in user assigned address + * + * + * Each of these functions returns the number of fields successfully converted + * and assigned; the return value does not include fields that were read but + * not assigned. A return value of 0 indicates that no fields were assigned. + * return -1 if an error occurs. + */ +int vfwscanf_s(FILE *stream, const wchar_t *format, va_list argList) +{ + int retVal; /* If initialization causes e838 */ + SecFileStream fStr; + + if (stream == NULL || format == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("vfwscanf_s"); + return SECUREC_SCANF_EINVAL; + } + if (stream == SECUREC_STREAM_STDIN) { + return vwscanf_s(format, argList); + } + + SECUREC_LOCK_FILE(stream); + SECUREC_FILE_STREAM_FROM_FILE(&fStr, stream); + retVal = SecInputSW(&fStr, format, argList); + SECUREC_UNLOCK_FILE(stream); + if (retVal < 0) { + SECUREC_ERROR_INVALID_PARAMTER("vfwscanf_s"); + return SECUREC_SCANF_EINVAL; + } + return retVal; +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.c new file mode 100644 index 000000000..61480a697 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: vscanf_s function + * Create: 2014-02-25 + */ + +#include "secinput.h" + +/* + * + * The vscanf_s function is equivalent to scanf_s, with the variable argument list replaced by argList, + * The vscanf_s function reads data from the standard input stream stdin and + * writes the data into the location that's given by argument. Each argument + * must be a pointer to a variable of a type that corresponds to a type specifier + * in format. If copying occurs between strings that overlap, the behavior is + * undefined. + * + * + * format Format control string. + * argList pointer to list of arguments + * + * + * argList the converted value stored in user assigned address + * + * + * Returns the number of fields successfully converted and assigned; + * the return value does not include fields that were read but not assigned. + * A return value of 0 indicates that no fields were assigned. + * return -1 if an error occurs. + */ +int vscanf_s(const char *format, va_list argList) +{ + int retVal; /* If initialization causes e838 */ + SecFileStream fStr; + SECUREC_FILE_STREAM_FROM_STDIN(&fStr); + /* + * The "va_list" has different definition on different platform, so we can't use argList == NULL + * To determine it's invalid. If you has fixed platform, you can check some fields to validate it, + * such as "argList == NULL" or argList.xxx != NULL or *(size_t *)&argList != 0. + */ + if (format == NULL || fStr.pf == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("vscanf_s"); + return SECUREC_SCANF_EINVAL; + } + + SECUREC_LOCK_STDIN(0, fStr.pf); + retVal = SecInputS(&fStr, format, argList); + SECUREC_UNLOCK_STDIN(0, fStr.pf); + if (retVal < 0) { + SECUREC_ERROR_INVALID_PARAMTER("vscanf_s"); + return SECUREC_SCANF_EINVAL; + } + return retVal; +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.c new file mode 100644 index 000000000..35caaa220 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.c @@ -0,0 +1,138 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: vsnprintf_s function + * Create: 2014-02-25 + */ + +#include "secureprintoutput.h" + +#if SECUREC_ENABLE_VSNPRINTF +/* + * + * The vsnprintf_s function is equivalent to the vsnprintf function + * except for the parameter destMax/count and the explicit runtime-constraints violation + * The vsnprintf_s function takes a pointer to an argument list, then formats + * and writes up to count characters of the given data to the memory pointed + * to by strDest and appends a terminating null. + * + * + * strDest Storage location for the output. + * destMax The size of the strDest for output. + * count Maximum number of character to write(not including + * the terminating NULL) + * format Format-control string. + * argList pointer to list of arguments. + * + * + * strDest is updated + * + * + * return the number of characters written, not including the terminating null + * return -1 if an error occurs. + * return -1 if count < destMax and the output string has been truncated + * + * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid + */ +int vsnprintf_s(char *strDest, size_t destMax, size_t count, const char *format, va_list argList) +{ + int retVal; + + if (SECUREC_VSNPRINTF_PARAM_ERROR(format, strDest, destMax, count, SECUREC_STRING_MAX_LEN)) { + SECUREC_VSPRINTF_CLEAR_DEST(strDest, destMax, SECUREC_STRING_MAX_LEN); + SECUREC_ERROR_INVALID_PARAMTER("vsnprintf_s"); + return -1; + } + + if (destMax > count) { + retVal = SecVsnprintfImpl(strDest, count + 1, format, argList); + if (retVal == SECUREC_PRINTF_TRUNCATE) { /* To keep dest buffer not destroyed 2014.2.18 */ + /* The string has been truncated, return -1 */ + return -1; /* To skip error handler, return strlen(strDest) or -1 */ + } + } else { + retVal = SecVsnprintfImpl(strDest, destMax, format, argList); +#ifdef SECUREC_COMPATIBLE_WIN_FORMAT + if (retVal == SECUREC_PRINTF_TRUNCATE && count == (size_t)(-1)) { + return -1; + } +#endif + } + + if (retVal < 0) { + strDest[0] = '\0'; /* Empty the dest strDest */ + if (retVal == SECUREC_PRINTF_TRUNCATE) { + /* Buffer too small */ + SECUREC_ERROR_INVALID_RANGE("vsnprintf_s"); + } + SECUREC_ERROR_INVALID_PARAMTER("vsnprintf_s"); + return -1; + } + + return retVal; +} +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(vsnprintf_s); +#endif +#endif + +#if SECUREC_SNPRINTF_TRUNCATED +/* + * + * The vsnprintf_truncated_s function is equivalent to the vsnprintf function + * except for the parameter destMax/count and the explicit runtime-constraints violation + * The vsnprintf_truncated_s function takes a pointer to an argument list, then formats + * and writes up to count characters of the given data to the memory pointed + * to by strDest and appends a terminating null. + * + * + * strDest Storage location for the output. + * destMax The size of the strDest for output. + * the terminating NULL) + * format Format-control string. + * argList pointer to list of arguments. + * + * + * strDest is updated + * + * + * return the number of characters written, not including the terminating null + * return -1 if an error occurs. + * return destMax-1 if output string has been truncated + * + * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid + */ +int vsnprintf_truncated_s(char *strDest, size_t destMax, const char *format, va_list argList) +{ + int retVal; + + if (SECUREC_VSPRINTF_PARAM_ERROR(format, strDest, destMax, SECUREC_STRING_MAX_LEN)) { + SECUREC_VSPRINTF_CLEAR_DEST(strDest, destMax, SECUREC_STRING_MAX_LEN); + SECUREC_ERROR_INVALID_PARAMTER("vsnprintf_truncated_s"); + return -1; + } + + retVal = SecVsnprintfImpl(strDest, destMax, format, argList); + if (retVal < 0) { + if (retVal == SECUREC_PRINTF_TRUNCATE) { + return (int)(destMax - 1); /* To skip error handler, return strlen(strDest) */ + } + strDest[0] = '\0'; /* Empty the dest strDest */ + SECUREC_ERROR_INVALID_PARAMTER("vsnprintf_truncated_s"); + return -1; + } + + return retVal; +} +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(vsnprintf_truncated_s); +#endif +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.c new file mode 100644 index 000000000..f50fa4a98 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.c @@ -0,0 +1,67 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: vsprintf_s function + * Create: 2014-02-25 + */ + +#include "secureprintoutput.h" + +/* + * + * The vsprintf_s function is equivalent to the vsprintf function + * except for the parameter destMax and the explicit runtime-constraints violation + * The vsprintf_s function takes a pointer to an argument list, and then formats + * and writes the given data to the memory pointed to by strDest. + * The function differ from the non-secure versions only in that the secure + * versions support positional parameters. + * + * + * strDest Storage location for the output. + * destMax Size of strDest + * format Format specification. + * argList pointer to list of arguments + * + * + * strDest is updated + * + * + * return the number of characters written, not including the terminating null character, + * return -1 if an error occurs. + * + * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid + */ +int vsprintf_s(char *strDest, size_t destMax, const char *format, va_list argList) +{ + int retVal; /* If initialization causes e838 */ + + if (SECUREC_VSPRINTF_PARAM_ERROR(format, strDest, destMax, SECUREC_STRING_MAX_LEN)) { + SECUREC_VSPRINTF_CLEAR_DEST(strDest, destMax, SECUREC_STRING_MAX_LEN); + SECUREC_ERROR_INVALID_PARAMTER("vsprintf_s"); + return -1; + } + + retVal = SecVsnprintfImpl(strDest, destMax, format, argList); + if (retVal < 0) { + strDest[0] = '\0'; + if (retVal == SECUREC_PRINTF_TRUNCATE) { + /* Buffer is too small */ + SECUREC_ERROR_INVALID_RANGE("vsprintf_s"); + } + SECUREC_ERROR_INVALID_PARAMTER("vsprintf_s"); + return -1; + } + + return retVal; +} +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(vsprintf_s); +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.c new file mode 100644 index 000000000..a19abe2b9 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.c @@ -0,0 +1,87 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: vsscanf_s function + * Create: 2014-02-25 + */ + +#include "secinput.h" +#if defined(SECUREC_VXWORKS_PLATFORM) && !SECUREC_IN_KERNEL && \ + (!defined(SECUREC_SYSAPI4VXWORKS) && !defined(SECUREC_CTYPE_MACRO_ADAPT)) +#include +#endif + +/* + * + * vsscanf_s + * + * + * + * The vsscanf_s function is equivalent to sscanf_s, with the variable argument list replaced by argList + * The vsscanf_s function reads data from buffer into the location given by + * each argument. Every argument must be a pointer to a variable with a type + * that corresponds to a type specifier in format. The format argument controls + * the interpretation of the input fields and has the same form and function + * as the format argument for the scanf function. + * If copying takes place between strings that overlap, the behavior is undefined. + * + * + * buffer Stored data + * format Format control string, see Format Specifications. + * argList pointer to list of arguments + * + * + * argList the converted value stored in user assigned address + * + * + * Each of these functions returns the number of fields successfully converted + * and assigned; the return value does not include fields that were read but + * not assigned. A return value of 0 indicates that no fields were assigned. + * return -1 if an error occurs. + */ +int vsscanf_s(const char *buffer, const char *format, va_list argList) +{ + size_t count; /* If initialization causes e838 */ + int retVal; + SecFileStream fStr; + + /* Validation section */ + if (buffer == NULL || format == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("vsscanf_s"); + return SECUREC_SCANF_EINVAL; + } + count = strlen(buffer); + if (count == 0 || count > SECUREC_STRING_MAX_LEN) { + SecClearDestBuf(buffer, format, argList); + SECUREC_ERROR_INVALID_PARAMTER("vsscanf_s"); + return SECUREC_SCANF_EINVAL; + } +#if defined(SECUREC_VXWORKS_PLATFORM) && !SECUREC_IN_KERNEL + /* + * On vxworks platform when buffer is white string, will set first %s argument to zero.Like following usage: + * " \v\f\t\r\n", "%s", str, strSize + * Do not check all character, just first and last character then consider it is white string + */ + if (isspace((int)(unsigned char)buffer[0]) != 0 && isspace((int)(unsigned char)buffer[count - 1]) != 0) { + SecClearDestBuf(buffer, format, argList); + } +#endif + SECUREC_FILE_STREAM_FROM_STRING(&fStr, buffer, count); + retVal = SecInputS(&fStr, format, argList); + if (retVal < 0) { + SECUREC_ERROR_INVALID_PARAMTER("vsscanf_s"); + return SECUREC_SCANF_EINVAL; + } + return retVal; +} +#if SECUREC_EXPORT_KERNEL_SYMBOL +EXPORT_SYMBOL(vsscanf_s); +#endif + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.c new file mode 100644 index 000000000..29715fc62 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: vswprintf_s function + * Create: 2014-02-25 + */ + +#ifndef SECUREC_FOR_WCHAR +#define SECUREC_FOR_WCHAR +#endif + +#include "secureprintoutput.h" + +/* + * + * The vswprintf_s function is the wide-character equivalent of the vsprintf_s function + * + * + * strDest Storage location for the output. + * destMax Maximum number of characters to store + * format Format specification. + * argList pointer to list of arguments + * + * + * strDest is updated + * + * + * return the number of wide characters stored in strDest, not counting the terminating null wide character. + * return -1 if an error occurred. + * + * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid + */ +int vswprintf_s(wchar_t *strDest, size_t destMax, const wchar_t *format, va_list argList) +{ + int retVal; /* If initialization causes e838 */ + if (SECUREC_VSPRINTF_PARAM_ERROR(format, strDest, destMax, SECUREC_WCHAR_STRING_MAX_LEN)) { + SECUREC_VSPRINTF_CLEAR_DEST(strDest, destMax, SECUREC_WCHAR_STRING_MAX_LEN); + SECUREC_ERROR_INVALID_PARAMTER("vswprintf_s"); + return -1; + } + + retVal = SecVswprintfImpl(strDest, destMax, format, argList); + if (retVal < 0) { + strDest[0] = L'\0'; + if (retVal == SECUREC_PRINTF_TRUNCATE) { + /* Buffer too small */ + SECUREC_ERROR_INVALID_RANGE("vswprintf_s"); + } + SECUREC_ERROR_INVALID_PARAMTER("vswprintf_s"); + return -1; + } + + return retVal; +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.c new file mode 100644 index 000000000..bab53a3e1 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.c @@ -0,0 +1,79 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: vswscanf_s function + * Create: 2014-02-25 + */ + +#ifndef SECUREC_FOR_WCHAR +#define SECUREC_FOR_WCHAR +#endif + +#include "secinput.h" + +SECUREC_INLINE size_t SecWcslen(const wchar_t *s) +{ + const wchar_t *end = s; + while (*end != L'\0') { + ++end; + } + return ((size_t)((end - s))); +} + +/* + * + * The vswscanf_s function is the wide-character equivalent of the vsscanf_s function + * The vsscanf_s function reads data from buffer into the location given by + * each argument. Every argument must be a pointer to a variable with a type + * that corresponds to a type specifier in format. + * The format argument controls the interpretation of the input fields and + * has the same form and function as the format argument for the scanf function. + * If copying takes place between strings that overlap, the behavior is undefined. + * + * + * buffer Stored data + * format Format control string, see Format Specifications. + * argList pointer to list of arguments + * + * + * argList the converted value stored in user assigned address + * + * + * Each of these functions returns the number of fields successfully converted + * and assigned; the return value does not include fields that were read but + * not assigned. A return value of 0 indicates that no fields were assigned. + * return -1 if an error occurs. + */ +int vswscanf_s(const wchar_t *buffer, const wchar_t *format, va_list argList) +{ + size_t count; /* If initialization causes e838 */ + SecFileStream fStr; + int retVal; + + /* Validation section */ + if (buffer == NULL || format == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("vswscanf_s"); + return SECUREC_SCANF_EINVAL; + } + count = SecWcslen(buffer); + if (count == 0 || count > SECUREC_WCHAR_STRING_MAX_LEN) { + SecClearDestBufW(buffer, format, argList); + SECUREC_ERROR_INVALID_PARAMTER("vswscanf_s"); + return SECUREC_SCANF_EINVAL; + } + SECUREC_FILE_STREAM_FROM_STRING(&fStr, (const char *)buffer, count * sizeof(wchar_t)); + retVal = SecInputSW(&fStr, format, argList); + if (retVal < 0) { + SECUREC_ERROR_INVALID_PARAMTER("vswscanf_s"); + return SECUREC_SCANF_EINVAL; + } + return retVal; +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.c new file mode 100644 index 000000000..b39f9bc74 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: vwscanf_s function + * Create: 2014-02-25 + */ + +#ifndef SECUREC_FOR_WCHAR +#define SECUREC_FOR_WCHAR +#endif + +#include "secinput.h" + +/* + * + * The vwscanf_s function is the wide-character equivalent of the vscanf_s function + * The vwscanf_s function is the wide-character version of vscanf_s. The + * function reads data from the standard input stream stdin and writes the + * data into the location that's given by argument. Each argument must be a + * pointer to a variable of a type that corresponds to a type specifier in + * format. If copying occurs between strings that overlap, the behavior is + * undefined. + * + * + * format Format control string. + * argList pointer to list of arguments + * + * + * argList the converted value stored in user assigned address + * + * + * Returns the number of fields successfully converted and assigned; + * the return value does not include fields that were read but not assigned. + * A return value of 0 indicates that no fields were assigned. + * return -1 if an error occurs. + */ +int vwscanf_s(const wchar_t *format, va_list argList) +{ + int retVal; /* If initialization causes e838 */ + SecFileStream fStr; + SECUREC_FILE_STREAM_FROM_STDIN(&fStr); + if (format == NULL || fStr.pf == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("vwscanf_s"); + return SECUREC_SCANF_EINVAL; + } + + SECUREC_LOCK_STDIN(0, fStr.pf); + retVal = SecInputSW(&fStr, format, argList); + SECUREC_UNLOCK_STDIN(0, fStr.pf); + if (retVal < 0) { + SECUREC_ERROR_INVALID_PARAMTER("vwscanf_s"); + return SECUREC_SCANF_EINVAL; + } + + return retVal; +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.c new file mode 100644 index 000000000..fa7d847c2 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: wcscat_s function + * Create: 2014-02-25 + */ + +#include "securecutil.h" + +/* + * Befor this function, the basic parameter checking has been done + */ +SECUREC_INLINE errno_t SecDoCatW(wchar_t *strDest, size_t destMax, const wchar_t *strSrc) +{ + size_t destLen; + size_t srcLen; + size_t maxCount; /* Store the maximum available count */ + + /* To calculate the length of a wide character, the parameter must be a wide character */ + SECUREC_CALC_WSTR_LEN(strDest, destMax, &destLen); + maxCount = destMax - destLen; + SECUREC_CALC_WSTR_LEN(strSrc, maxCount, &srcLen); + + if (SECUREC_CAT_STRING_IS_OVERLAP(strDest, destLen, strSrc, srcLen)) { + strDest[0] = L'\0'; + if (strDest + destLen <= strSrc && destLen == destMax) { + SECUREC_ERROR_INVALID_PARAMTER("wcscat_s"); + return EINVAL_AND_RESET; + } + SECUREC_ERROR_BUFFER_OVERLAP("wcscat_s"); + return EOVERLAP_AND_RESET; + } + if (srcLen + destLen >= destMax || strDest == strSrc) { + strDest[0] = L'\0'; + if (destLen == destMax) { + SECUREC_ERROR_INVALID_PARAMTER("wcscat_s"); + return EINVAL_AND_RESET; + } + SECUREC_ERROR_INVALID_RANGE("wcscat_s"); + return ERANGE_AND_RESET; + } + /* Copy single character length include \0 */ + SECUREC_MEMCPY_WARP_OPT(strDest + destLen, strSrc, (srcLen + 1) * sizeof(wchar_t)); + return EOK; +} + +/* + * + * The wcscat_s function appends a copy of the wide string pointed to by strSrc +* (including the terminating null wide character) + * to the end of the wide string pointed to by strDest. + * The arguments and return value of wcscat_s are wide-character strings. + * + * The wcscat_s function appends strSrc to strDest and terminates the resulting + * string with a null character. The initial character of strSrc overwrites the + * terminating null character of strDest. wcscat_s will return EOVERLAP_AND_RESET if the + * source and destination strings overlap. + * + * Note that the second parameter is the total size of the buffer, not the + * remaining size. + * + * + * strDest Null-terminated destination string buffer. + * destMax Size of the destination string buffer. + * strSrc Null-terminated source string buffer. + * + * + * strDest is updated + * + * + * EOK Success + * EINVAL strDest is NULL and destMax != 0 and destMax <= SECUREC_WCHAR_STRING_MAX_LEN + * EINVAL_AND_RESET (strDest unterminated and all other parameters are valid) or + * (strDest != NULL and strSrc is NULL and destMax != 0 + * and destMax <= SECUREC_WCHAR_STRING_MAX_LEN) + * ERANGE destMax > SECUREC_WCHAR_STRING_MAX_LEN or destMax is 0 + * ERANGE_AND_RESET strDest have not enough space and all other parameters are valid and not overlap + * EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and all parameters are valid + * + * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid + */ +errno_t wcscat_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc) +{ + if (destMax == 0 || destMax > SECUREC_WCHAR_STRING_MAX_LEN) { + SECUREC_ERROR_INVALID_RANGE("wcscat_s"); + return ERANGE; + } + + if (strDest == NULL || strSrc == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("wcscat_s"); + if (strDest != NULL) { + strDest[0] = L'\0'; + return EINVAL_AND_RESET; + } + return EINVAL; + } + + return SecDoCatW(strDest, destMax, strSrc); +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.c new file mode 100644 index 000000000..8c4a4af8b --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.c @@ -0,0 +1,86 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: wcscpy_s function + * Create: 2014-02-25 + */ + +#include "securecutil.h" + +SECUREC_INLINE errno_t SecDoCpyW(wchar_t *strDest, size_t destMax, const wchar_t *strSrc) +{ + size_t srcStrLen; + SECUREC_CALC_WSTR_LEN(strSrc, destMax, &srcStrLen); + + if (srcStrLen == destMax) { + strDest[0] = L'\0'; + SECUREC_ERROR_INVALID_RANGE("wcscpy_s"); + return ERANGE_AND_RESET; + } + if (strDest == strSrc) { + return EOK; + } + + if (SECUREC_STRING_NO_OVERLAP(strDest, strSrc, srcStrLen)) { + /* Performance optimization, srcStrLen is single character length include '\0' */ + SECUREC_MEMCPY_WARP_OPT(strDest, strSrc, (srcStrLen + 1) * sizeof(wchar_t)); + return EOK; + } else { + strDest[0] = L'\0'; + SECUREC_ERROR_BUFFER_OVERLAP("wcscpy_s"); + return EOVERLAP_AND_RESET; + } +} + +/* + * + * The wcscpy_s function copies the wide string pointed to by strSrc + * (including the terminating null wide character) into the array pointed to by strDest + + * + * strDest Destination string buffer + * destMax Size of the destination string buffer. + * strSrc Null-terminated source string buffer. + * + * + * strDest is updated. + * + * + * EOK Success + * EINVAL strDest is NULL and destMax != 0 and destMax <= SECUREC_WCHAR_STRING_MAX_LEN + * EINVAL_AND_RESET strDest != NULL and strSrc is NULL and destMax != 0 + * and destMax <= SECUREC_WCHAR_STRING_MAX_LEN + * ERANGE destMax > SECUREC_WCHAR_STRING_MAX_LEN or destMax is 0 + * ERANGE_AND_RESET destMax <= length of strSrc and strDest != strSrc + * and strDest != NULL and strSrc != NULL and destMax != 0 + * and destMax <= SECUREC_WCHAR_STRING_MAX_LEN and not overlap + * EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and destMax != 0 + * and destMax <= SECUREC_WCHAR_STRING_MAX_LEN + * and strDest != NULL and strSrc !=NULL and strDest != strSrc + * + * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid + */ +errno_t wcscpy_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc) +{ + if (destMax == 0 || destMax > SECUREC_WCHAR_STRING_MAX_LEN) { + SECUREC_ERROR_INVALID_RANGE("wcscpy_s"); + return ERANGE; + } + if (strDest == NULL || strSrc == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("wcscpy_s"); + if (strDest != NULL) { + strDest[0] = L'\0'; + return EINVAL_AND_RESET; + } + return EINVAL; + } + return SecDoCpyW(strDest, destMax, strSrc); +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.c new file mode 100644 index 000000000..33e53a324 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.c @@ -0,0 +1,113 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: wcsncat_s function + * Create: 2014-02-25 + */ + +#include "securecutil.h" + +/* + * Befor this function, the basic parameter checking has been done + */ +SECUREC_INLINE errno_t SecDoCatLimitW(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count) +{ + /* To calculate the length of a wide character, the parameter must be a wide character */ + size_t destLen; + size_t srcLen; + SECUREC_CALC_WSTR_LEN(strDest, destMax, &destLen); + SECUREC_CALC_WSTR_LEN(strSrc, count, &srcLen); + + if (SECUREC_CAT_STRING_IS_OVERLAP(strDest, destLen, strSrc, srcLen)) { + strDest[0] = L'\0'; + if (strDest + destLen <= strSrc && destLen == destMax) { + SECUREC_ERROR_INVALID_PARAMTER("wcsncat_s"); + return EINVAL_AND_RESET; + } + SECUREC_ERROR_BUFFER_OVERLAP("wcsncat_s"); + return EOVERLAP_AND_RESET; + } + if (srcLen + destLen >= destMax || strDest == strSrc) { + strDest[0] = L'\0'; + if (destLen == destMax) { + SECUREC_ERROR_INVALID_PARAMTER("wcsncat_s"); + return EINVAL_AND_RESET; + } + SECUREC_ERROR_INVALID_RANGE("wcsncat_s"); + return ERANGE_AND_RESET; + } + SECUREC_MEMCPY_WARP_OPT(strDest + destLen, strSrc, srcLen * sizeof(wchar_t)); /* no terminator */ + *(strDest + destLen + srcLen) = L'\0'; + return EOK; +} + +/* + * + * The wcsncat_s function appends not more than n successive wide characters + * (not including the terminating null wide character) + * from the array pointed to by strSrc to the end of the wide string pointed to by strDest. + * + * The wcsncat_s function try to append the first D characters of strSrc to + * the end of strDest, where D is the lesser of count and the length of strSrc. + * If appending those D characters will fit within strDest (whose size is + * given as destMax) and still leave room for a null terminator, then those + * characters are appended, starting at the original terminating null of + * strDest, and a new terminating null is appended; otherwise, strDest[0] is + * set to the null character. + * + * + * strDest Null-terminated destination string. + * destMax Size of the destination buffer. + * strSrc Null-terminated source string. + * count Number of character to append, or truncate. + * + * + * strDest is updated + * + * + * EOK Success + * EINVAL strDest is NULL and destMax != 0 and destMax <= SECUREC_WCHAR_STRING_MAX_LEN + * EINVAL_AND_RESET (strDest unterminated and all other parameters are valid) or + * (strDest != NULL and strSrc is NULL and destMax != 0 and + * destMax <= SECUREC_WCHAR_STRING_MAX_LEN) + * ERANGE destMax > SECUREC_WCHAR_STRING_MAX_LEN or destMax is 0 + * ERANGE_AND_RESET strDest have not enough space and all other parameters are valid and not overlap + * EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and all parameters are valid + * + * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid + */ +errno_t wcsncat_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count) +{ + if (destMax == 0 || destMax > SECUREC_WCHAR_STRING_MAX_LEN) { + SECUREC_ERROR_INVALID_RANGE("wcsncat_s"); + return ERANGE; + } + if (strDest == NULL || strSrc == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("wcsncat_s"); + if (strDest != NULL) { + strDest[0] = L'\0'; + return EINVAL_AND_RESET; + } + return EINVAL; + } + if (count > SECUREC_WCHAR_STRING_MAX_LEN) { +#ifdef SECUREC_COMPATIBLE_WIN_FORMAT + if (count == ((size_t)(-1))) { + /* Windows internal functions may pass in -1 when calling this function */ + return SecDoCatLimitW(strDest, destMax, strSrc, destMax); + } +#endif + strDest[0] = L'\0'; + SECUREC_ERROR_INVALID_RANGE("wcsncat_s"); + return ERANGE_AND_RESET; + } + return SecDoCatLimitW(strDest, destMax, strSrc, count); +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.c new file mode 100644 index 000000000..463f90e16 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: wcsncpy_s function + * Create: 2014-02-25 + */ + +#include "securecutil.h" + +SECUREC_INLINE errno_t SecDoCpyLimitW(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count) +{ + size_t srcStrLen; + if (count < destMax) { + SECUREC_CALC_WSTR_LEN(strSrc, count, &srcStrLen); + } else { + SECUREC_CALC_WSTR_LEN(strSrc, destMax, &srcStrLen); + } + if (srcStrLen == destMax) { + strDest[0] = L'\0'; + SECUREC_ERROR_INVALID_RANGE("wcsncpy_s"); + return ERANGE_AND_RESET; + } + if (strDest == strSrc) { + return EOK; + } + if (SECUREC_STRING_NO_OVERLAP(strDest, strSrc, srcStrLen)) { + /* Performance optimization srcStrLen not include '\0' */ + SECUREC_MEMCPY_WARP_OPT(strDest, strSrc, srcStrLen * sizeof(wchar_t)); + *(strDest + srcStrLen) = L'\0'; + return EOK; + } else { + strDest[0] = L'\0'; + SECUREC_ERROR_BUFFER_OVERLAP("wcsncpy_s"); + return EOVERLAP_AND_RESET; + } +} + +/* + * + * The wcsncpy_s function copies not more than n successive wide characters + * (not including the terminating null wide character) + * from the array pointed to by strSrc to the array pointed to by strDest + * + * + * strDest Destination string. + * destMax The size of the destination string, in characters. + * strSrc Source string. + * count Number of characters to be copied. + * + * + * strDest is updated + * + * + * EOK Success + * EINVAL strDest is NULL and destMax != 0 and destMax <= SECUREC_WCHAR_STRING_MAX_LEN + * EINVAL_AND_RESET strDest != NULL and strSrc is NULL and destMax != 0 + * and destMax <= SECUREC_WCHAR_STRING_MAX_LEN + * ERANGE destMax > SECUREC_WCHAR_STRING_MAX_LEN or destMax is 0 + * ERANGE_AND_RESET count > SECUREC_WCHAR_STRING_MAX_LEN or + * (destMax <= length of strSrc and destMax <= count and strDest != strSrc + * and strDest != NULL and strSrc != NULL and destMax != 0 and + * destMax <= SECUREC_WCHAR_STRING_MAX_LEN and not overlap) + * EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and all parameters are valid + * + * + * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid + */ +errno_t wcsncpy_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count) +{ + if (destMax == 0 || destMax > SECUREC_WCHAR_STRING_MAX_LEN) { + SECUREC_ERROR_INVALID_RANGE("wcsncpy_s"); + return ERANGE; + } + if (strDest == NULL || strSrc == NULL) { + SECUREC_ERROR_INVALID_PARAMTER("wcsncpy_s"); + if (strDest != NULL) { + strDest[0] = L'\0'; + return EINVAL_AND_RESET; + } + return EINVAL; + } + if (count > SECUREC_WCHAR_STRING_MAX_LEN) { +#ifdef SECUREC_COMPATIBLE_WIN_FORMAT + if (count == (size_t)(-1)) { + return SecDoCpyLimitW(strDest, destMax, strSrc, destMax - 1); + } +#endif + strDest[0] = L'\0'; /* Clear dest string */ + SECUREC_ERROR_INVALID_RANGE("wcsncpy_s"); + return ERANGE_AND_RESET; + } + + if (count == 0) { + strDest[0] = L'\0'; + return EOK; + } + + return SecDoCpyLimitW(strDest, destMax, strSrc, count); +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.c new file mode 100644 index 000000000..063ca6917 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.c @@ -0,0 +1,112 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: wcstok_s function + * Create: 2014-02-25 + */ + +#include "securecutil.h" + +SECUREC_INLINE int SecIsInDelimitW(wchar_t ch, const wchar_t *strDelimit) +{ + const wchar_t *ctl = strDelimit; + while (*ctl != L'\0' && *ctl != ch) { + ++ctl; + } + return (int)(*ctl != L'\0'); +} + +/* + * Find beginning of token (skip over leading delimiters). + * Note that there is no token if this loop sets string to point to the terminal null. + */ +SECUREC_INLINE wchar_t *SecFindBeginW(wchar_t *strToken, const wchar_t *strDelimit) +{ + wchar_t *token = strToken; + while (*token != L'\0') { + if (SecIsInDelimitW(*token, strDelimit) != 0) { + ++token; + continue; + } + /* Don't find any delimiter in string header, break the loop */ + break; + } + return token; +} + +/* + * Find the end of the token. If it is not the end of the string, put a null there. + */ +SECUREC_INLINE wchar_t *SecFindRestW(wchar_t *strToken, const wchar_t *strDelimit) +{ + wchar_t *token = strToken; + while (*token != L'\0') { + if (SecIsInDelimitW(*token, strDelimit) != 0) { + /* Find a delimiter, set string terminator */ + *token = L'\0'; + ++token; + break; + } + ++token; + } + return token; +} + +/* + * Update Token wide character function + */ +SECUREC_INLINE wchar_t *SecUpdateTokenW(wchar_t *strToken, const wchar_t *strDelimit, wchar_t **context) +{ + /* Point to updated position. Record string position for next search in the context */ + *context = SecFindRestW(strToken, strDelimit); + /* Determine if a token has been found */ + if (*context == strToken) { + return NULL; + } + return strToken; +} + +/* + * + * wcstok_s + * + * + * + * The wcstok_s function is the wide-character equivalent of the strtok_s function + * + * + * strToken String containing token or tokens. + * strDelimit Set of delimiter characters. + * context Used to store position information between calls to + * wcstok_s. + * + * + * context is updated + * + * The wcstok_s function is the wide-character equivalent of the strtok_s function + */ +wchar_t *wcstok_s(wchar_t *strToken, const wchar_t *strDelimit, wchar_t **context) +{ + wchar_t *orgToken = strToken; + /* Validation section */ + if (context == NULL || strDelimit == NULL) { + return NULL; + } + if (orgToken == NULL && *context == NULL) { + return NULL; + } + /* If string==NULL, continue with previous string */ + if (orgToken == NULL) { + orgToken = *context; + } + orgToken = SecFindBeginW(orgToken, strDelimit); + return SecUpdateTokenW(orgToken, strDelimit, context); +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.c new file mode 100644 index 000000000..2f2b4a33c --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.c @@ -0,0 +1,71 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: wmemcpy_s function + * Create: 2014-02-25 + */ +/* + * [Standardize-exceptions] Use unsafe function: Portability + * [reason] Use unsafe function to implement security function to maintain platform compatibility. + * And sufficient input validation is performed before calling + */ + +#include "securecutil.h" + +/* + * + * The wmemcpy_s function copies n successive wide characters + * from the object pointed to by src into the object pointed to by dest.t. + * + * + * dest Destination buffer. + * destMax Size of the destination buffer. + * src Buffer to copy from. + * count Number of characters to copy. + * + * + * dest buffer is updated. + * + * + * EOK Success + * EINVAL dest is NULL and destMax != 0 and count <= destMax + * and destMax <= SECUREC_WCHAR_MEM_MAX_LEN + * EINVAL_AND_RESET dest != NULL and src is NULL and destMax != 0 + * and destMax <= SECUREC_WCHAR_MEM_MAX_LEN and count <= destMax + * ERANGE destMax > SECUREC_WCHAR_MEM_MAX_LEN or destMax is 0 or + * (count > destMax and dest is NULL and destMax != 0 + * and destMax <= SECUREC_WCHAR_MEM_MAX_LEN) + * ERANGE_AND_RESET count > destMax and dest != NULL and destMax != 0 + * and destMax <= SECUREC_WCHAR_MEM_MAX_LEN + * EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and + * count <= destMax destMax != 0 and destMax <= SECUREC_WCHAR_MEM_MAX_LEN + * and dest != NULL and src != NULL and dest != src + * + * if an error occurred, dest will be filled with 0 when dest and destMax valid . + * If the source and destination overlap, the behavior of wmemcpy_s is undefined. + * Use wmemmove_s to handle overlapping regions. + */ +errno_t wmemcpy_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count) +{ + if (destMax == 0 || destMax > SECUREC_WCHAR_MEM_MAX_LEN) { + SECUREC_ERROR_INVALID_PARAMTER("wmemcpy_s"); + return ERANGE; + } + if (count > destMax) { + SECUREC_ERROR_INVALID_PARAMTER("wmemcpy_s"); + if (dest != NULL) { + (void)SECUREC_MEMSET_FUNC_OPT(dest, 0, destMax * sizeof(wchar_t)); + return ERANGE_AND_RESET; + } + return ERANGE; + } + return memcpy_s(dest, destMax * sizeof(wchar_t), src, count * sizeof(wchar_t)); +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.c new file mode 100644 index 000000000..88bb97b90 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: wmemmove_s function + * Create: 2014-02-25 + */ +/* + * [Standardize-exceptions] Use unsafe function: Portability + * [reason] Use unsafe function to implement security function to maintain platform compatibility. + * And sufficient input validation is performed before calling + */ + +#include "securecutil.h" + +/* + * + * The wmemmove_s function copies n successive wide characters from the object pointed + * to by src into the object pointed to by dest. + * + * + * dest Destination buffer. + * destMax Size of the destination buffer. + * src Source object. + * count Number of bytes or character to copy. + * + * + * dest is updated. + * + * + * EOK Success + * EINVAL dest is NULL and destMax != 0 and count <= destMax + * and destMax <= SECUREC_WCHAR_MEM_MAX_LEN + * EINVAL_AND_RESET dest != NULL and src is NULL and destMax != 0 + * and destMax <= SECUREC_WCHAR_MEM_MAX_LEN and count <= destMax + * ERANGE destMax > SECUREC_WCHAR_MEM_MAX_LEN or destMax is 0 or + * (count > destMax and dest is NULL and destMax != 0 + * and destMax <= SECUREC_WCHAR_MEM_MAX_LEN) + * ERANGE_AND_RESET count > destMax and dest != NULL and destMax != 0 + * and destMax <= SECUREC_WCHAR_MEM_MAX_LEN + * + * + * If an error occurred, dest will be filled with 0 when dest and destMax valid. + * If some regions of the source area and the destination overlap, wmemmove_s + * ensures that the original source bytes in the overlapping region are copied + * before being overwritten + */ +errno_t wmemmove_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count) +{ + if (destMax == 0 || destMax > SECUREC_WCHAR_MEM_MAX_LEN) { + SECUREC_ERROR_INVALID_PARAMTER("wmemmove_s"); + return ERANGE; + } + if (count > destMax) { + SECUREC_ERROR_INVALID_PARAMTER("wmemmove_s"); + if (dest != NULL) { + (void)SECUREC_MEMSET_FUNC_OPT(dest, 0, destMax * sizeof(wchar_t)); + return ERANGE_AND_RESET; + } + return ERANGE; + } + return memmove_s(dest, destMax * sizeof(wchar_t), src, count * sizeof(wchar_t)); +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.c b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.c new file mode 100644 index 000000000..badb04efa --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved. + * Licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * Description: wscanf_s function + * Create: 2014-02-25 + */ + +#include "securec.h" + +/* + * + * + * The wscanf_s function is the wide-character equivalent of the scanf_s function + * The wscanf_s function reads data from the standard input stream stdin and + * writes the data into the location that's given by argument. Each argument + * must be a pointer to a variable of a type that corresponds to a type specifier + * in format. If copying occurs between strings that overlap, the behavior is + * undefined. + * + * + * format Format control string. + * ... Optional arguments. + * + * + * ... the converted value stored in user assigned address + * + * + * Returns the number of fields successfully converted and assigned; + * the return value does not include fields that were read but not assigned. + * A return value of 0 indicates that no fields were assigned. + * return -1 if an error occurs. + */ +int wscanf_s(const wchar_t *format, ...) +{ + int ret; /* If initialization causes e838 */ + va_list argList; + + va_start(argList, format); + ret = vwscanf_s(format, argList); + va_end(argList); + (void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */ + + return ret; +} + diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/thirdparty/sysroot/include/mcs_smo_4th.h b/vendor/others/demo/5-tim_adc/demo/middleware/thirdparty/sysroot/include/mcs_smo_4th.h new file mode 100644 index 000000000..5fb9a5073 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/thirdparty/sysroot/include/mcs_smo_4th.h @@ -0,0 +1,71 @@ +/** + * @ Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file mcs_smo_4th.h + * @author MCU Algorithm Team + * @brief This file provides functions declaration of 4th order smo module. + */ +#ifndef McuMagicTag_MCS_SMO_4TH_H +#define McuMagicTag_MCS_SMO_4TH_H + +#include "mcs_typedef.h" +#include "mcs_pll.h" +#include "mcs_filter.h" +#include "mcs_mtr_param.h" + + +typedef struct { + /* Model parameters */ + float ld; + float lq; + float rs; + float ts; + float kd; + float kq; + float pllBdw; + float fcLpf; /**< The cut-off frequency of First-order LPF for speed (Hz). */ + float elecAngle; + float spdEst; + /* Internal variable */ + AlbeAxis ialbeEst; + AlbeAxis ealbeEst; + PLL_Handle pll; + FOFLT_Handle spdFilter; +} SMO4TH_Handle; + +/** + * @brief SMO4TH_Param + */ +typedef struct { + float kd; + float kq; + float pllBdw; + float fcLpf; +} SMO4TH_Param; + + +void SMO4TH_Init(SMO4TH_Handle *smo4th, const SMO4TH_Param smo4thParam, const MOTOR_Param mtrParam, float ts); + +void SMO4TH_Exec(SMO4TH_Handle *smo4th, const AlbeAxis *ialbeFbk, const AlbeAxis *valbeRef); + +void SMO4TH_ParamUpdate(SMO4TH_Handle *smo4th, float kd, float kq, float pllBdw, float fc); + +void SMO4TH_Clear(SMO4TH_Handle *smo4th); + +void SMO4TH_SetTs(SMO4TH_Handle *smo4th, float ts); + +#endif \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/thirdparty/sysroot/include/nos_task.h b/vendor/others/demo/5-tim_adc/demo/middleware/thirdparty/sysroot/include/nos_task.h new file mode 100644 index 000000000..78ff81278 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/middleware/thirdparty/sysroot/include/nos_task.h @@ -0,0 +1,84 @@ +/** + * @copyright Copyright (c) 2023, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file nos_task.h + */ + +#ifndef NOS_TASK_H +#define NOS_TASK_H + +#define NOS_TASK_PRIORITY_LOWEST 4 + +typedef void (*NOS_TaskEntryFunc)(void* param); +typedef void (*NOS_TimerCallBack)(void* param); +typedef struct { + const char *name; + NOS_TaskEntryFunc taskEntry; + void* param; + unsigned int priority; /* scope:[0-NOS_TASK_PRIORITY_LOWEST] */ + unsigned int stackAddr; /* notice: addr must 16Bytes align && not zero */ + unsigned int stackSize; + unsigned int privateData; +} NOS_TaskInitParam; + +typedef struct { + const char *name; + unsigned int timeout; // us + NOS_TimerCallBack callback; + void *callbackParam; + unsigned int priority; /* scope:[0-NOS_TASK_PRIORITY_LOWEST] */ + unsigned int stackSize; + unsigned int stackAddr; +}NOS_TimerTaskInitParam; + +typedef struct { + unsigned int cyclePerUs; + unsigned int usecPerTick; + unsigned long long (*getTickFunc)(void); +}NOS_SysConfig; + +int NOS_TaskInit(NOS_SysConfig *config); + +int NOS_StartScheduler(void); + +int NOS_TaskCreateOnly(NOS_TaskInitParam *initParam, unsigned int *taskId); + +int NOS_TaskCreate(NOS_TaskInitParam *initParam, unsigned int *taskId); + +int NOS_TaskDelete(unsigned int taskId); + +int NOS_TaskSuspend(unsigned int taskId); + +int NOS_TaskResume(unsigned int taskId); + +int NOS_TaskDelay(unsigned int timeout); + +int NOS_TaskPrioritySet(unsigned int taskId, unsigned short priority); + +int NOS_TaskPriorityGet(unsigned int taskId, unsigned short *priority); + +/* **********************timer task********************* */ + +int NOS_CreateTimerTask(unsigned int *timerTaskId, NOS_TimerTaskInitParam *timerParam); + +/* 接口约束 必须systick启动后. taskId 必须是 NOS_CreateTimerTask 创建的 */ +int NOS_StartTimerTask(unsigned int taskId); + +/* 接口约束 必须systick启动后. taskId 必须是 NOS_CreateTimerTask 创建的 */ +int NOS_StopTimerTask(unsigned int taskId); + +#endif // NOS_TASK_H diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/thirdparty/sysroot/lib/libmcs_smo_4th.a b/vendor/others/demo/5-tim_adc/demo/middleware/thirdparty/sysroot/lib/libmcs_smo_4th.a new file mode 100644 index 0000000000000000000000000000000000000000..2852d63db2444ccc666bce64872c3e6db1d23d31 GIT binary patch literal 3834 zcma)9T}&KR6u$dAQ$k=^Xp69kvw*P0GVTu++SJ;*g|6+IZX8UA!NBaYEi`N)yUVgQ zjcytUFFt5eqb7Z*)oLH~p)sb9)}R=psm5(nW7-F5OG6VPwG?>p@0^)A?CfBpCpq_i z=R0T4+59mJ^wtG-Jtlx<8#9?QhQvNuw~# zM~%$y^X+JdQ3ZGS12nSNyCU5div635u|#~c$D zdlu#FiqPV{#urvr1mfk1Ste&^1%4s2(7C|1bZr`2m|2<66;`g-7FMtGE!(g0Ez(2& zRNk9!oosA!SR0!`y`ZfQYqev__71%5Zl1Af$0RT2x55C9!YI6X_mS|O)=BqV-;ut# zzL@*Y8O6PDL+M*MlW;HINc1hzbLAu9L3nmOPeii~xhz!;-#f1~%s1awNA2mda_@7D z6Q`_al-9{wC8E?MIIqJp-PmQ}8oy?R`yQb%vBd9eh`+^YGd;(#Y4I!T4W+QU#NYJ( z`5R{9fGtd1;^mbsLO8~G_S?#Hh1CxA3GPEqTRZ3vWS0iuIYG{T#C}+H=4xVcwwZ_3 zft8zwRe}r;@7Br_T-Bj$c%bm$S3zE#6GGV;zA$l1kW(oky8O**Di`|wmUw8qH~QVG zCl?z3fXz%i=$(0ZQRJ81Ycu1Y36ZraFTX51C&j|lX)&DnR17ckxr<(YEu4GLTX38g z!)tsF*Gk@eUZnM#Zn5)2Cvo-NOT>kj0)yuU_gR|q>WaZUH(ipQY^kty zWn)g0-)ZvmCO>cTmzn%{*%Zab%1!?Aq7#sfRhaBb<|<(-*;cTNqpoD`5`P8rl=v%H zGuXvZR9 ziXGG$>|ItndquY;)poLDx{Vz^oiW*Y-Ht%-vhwT=lmBg#eO9-R!5m!HGWLnd|GCM& zY_ex{I{>}QTFwe4|4ox!QV`;-DaWKp$cK#|n*cUJY}%pmcR+*MiH6Fc?`hB-RA(Mp zpQ4dSzgDTb4@aWiI@U{=TD34j1zNy{N``*5q-lN?hDMa+7`Xh0AXk7ub~=MfX116;Qm8W6<9p9Ea5 z^N5MR2e|DqXh7CL+v-%v{z9ztb~tZ@x8T{sasYyu^0XrF)p*3jurVApnJ8AD7w zlhP-W86^gNCZ+X5gffX-hDq>iQ(;mpon}%hF``JwO8@eMbfZ^0@f&&daBrm5Grf`4 zj~3BPlKNemK!Rt zChdApomB@O=rN8eyEzVhD7d|_?)_IB{y;Im_aJa2^j`d|cz5m99hYIC1Ay_|Bad1R zdKlE0?=`TomXT0Ce1|cg2)|c-z+paI1Il+4urVLjs|Y9w<%rdBs{tLitVrVa)d~F__zBhp|=DV<|IA6>|0&*eiHFs`3-W8Rvm9 zDA?-`{TtJ`;<-@W_dlX$i!-Ie5G1yVuKfeqI AQ2+n{ literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/middleware/thirdparty/sysroot/lib/libnostask.a b/vendor/others/demo/5-tim_adc/demo/middleware/thirdparty/sysroot/lib/libnostask.a new file mode 100644 index 0000000000000000000000000000000000000000..2dd6fe666747eb1f9fcf764a7fa5b2c5130cdde3 GIT binary patch literal 54870 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/bin/target.elf b/vendor/others/demo/5-tim_adc/demo/out/bin/target.elf new file mode 100644 index 0000000000000000000000000000000000000000..0f44dce03e0d29fd204ca2259a99bee1baef5bd3 GIT binary patch literal 384968 zcmeFa4SZC^)jxjk-c1&egoOYBi#23Pg2+pFGok`P0;^Rk7Ok~n6~c?O%3A_=%N4ctJ`1p-rUJt7V|^(!gfr>$?Qo9oRq*x37nL` zNeP^kz)1<5l)y;|oRq*x37nL`NeTS_Tmnzuearnbt(r?`TE$~$TKRY^JT+sG$CHo8 z!c$X#Jf3_!7M_~X$m7Y!W8tYeA9+0acq}|MqmajwkH^AOlaD-}e0s7`hNmVAWq9)O zSa@oBA&(~?kA>kAXa70Jf3_!7M_|e$m7Y!W8takj69xvJQkjsH01H*5EVkx)j7Ka{z`AL`XJ zDU>}hDb#yZQmD^mNuj$Ns%Nw#$$qsDJnrD1gZrzjT9^5-51 z-tj-6YTJiH*=sHEY!zkgyycUuz0VW{-+Lz1ce6!&hx*gs;1KZaE6U0kQk`X4mE}pr zMO8_;D-nc3+Ag}I%a9@~BR7MXoY&swnBYsk?!b2AAOCgo(?{+!+&{W*Pl`g8gY^yl;+<?doQBG;^62}2ArTuNcGhmdzbU=we zkWuTe$gqBNYnp12QwwdCqPJ+=V zH+0xC?@4R$yyvX6;ydD%Prd3 za7(psc4y~)U#GOfG_;@8$+`c0Nw1sKsruPHO_d85K9uLo?wsa08KI2v*2<2SU0E_} zYx-=XVIth6G>2OL(l&jLK0+PX=;(0V)%;MvG&fAzv(uyUal3HTl-(0)P(vkP=9|q%F~?Ew3QC>rQ6pXXt=LI+WOW> z-S&>Cvmvv!2O9qNvDBTvF1?W2Ij5?+-yUc<{iEtmBn#hTMR)klt@hY7HB9~f8DZ&SsJ?XTpO=5XG+?&bs5tR%^8&N>hbc6u*#*_pQW z@BB#xNfQ?q+Z{9iWCcUn>zfE>d}I2~YDBLq9^7&I>o+xas}5NHoT^5jZOvimn`bA# zmHCF%tuo+m8nI}_7<nCo;fIwKE2kEwH(JO?B3Bl6ZnR3m z9jnU2Bg!8imwEXZ&^>MTqCc&BxtRDy>(|iwqcidX!EWFpQd=7NRpsHv4(E-oJbbuA zWn-Y>&E@B9*R^Xswd;~c%}+}{+~MGI6DHdF+2p)r`-=r#rM?vW5%!Y%LfN09$Nnb5 zR&w9Ez=#U!|J%!TdC7gx#+21X_LY|0_pYb38XP-l_t|#z>o&Ee+ZL54XjRUw7R;x9 z5Ipg|uQaW(u|suWT(?y(N&5oOjBgz-_O#BV)@6|mr6bDQ4$TW>kj#%&Ha4DK2|jBV z_81STpAM<-eRFw_*Ynb)zP7YE2=x5(5sThN&lh9~7j>T}>Up>%LC^c>p4WYzxaZ*# z5AQC#|5zd#6^Ur{)inIa64R*g(s1Dm64Ka_h(>=+qo5fYJG?Yp__BmF0t*w!Dx-0s z$hWK+8i9o#SpgopIXYs|JJ3zrGnH3XwFAW#IAR&z%iD+bN8U@YJ*x{w&!j~na5hzWdo8Fp6Su->Or5@b?-nI_sPc6uT zFPv#zmp7_o^7EN>R-2p8+f-4xBi$;w@7@o~$K)kh-7f4+e>1vG&%oa<8Qm_-cx^}t z*KFube>1w3(_hqV$mm#QTaV{w7L2kN7Hf>uI@oP<2Kmn(<7=n#sHXJj%KCJx$M))Q z2dlC?&?_yexc!p~ifdjsYJ7`(M={ULsJil+*^8cES6AF7)PMca>HubtUY{O=ANf3# z@oAF--&7th?AmBmCKZo3V@&tnm4UKjn4L1JLbmn0{Op2>)a&5h({7%f`IglUIF5z- zK0)mxz=QT>P1Skl`6??K#}xjf-jZ}+thX*OcFRqTzLEn`Xp~&ph*j>VO+7cpmX>2z zK$z>AR)h-=)mtmV;_1sGRJLlnZ4KgiNzZV^6Y-N2E-bG1;rIP|t8KWjq~4cRRb8>b zuB-@@5r)&Ms&~9dxwD1tfsEpu5N6Y1RcoiAbSIVC7BFFU)^ndpqdG9VGr>4nb&<>R zLcP{AkLA;zT3PyF;I2^Sr%g21ZYy`P%9>srPG0}%+sW&f<`gsyzr9lcUbz9Y7T~A^ zI=0MQ{&8{|(m}h@?7F7%X}?<;s;a-s#;i>_;o!B>a;8@v-k;Qnp6EWv`lC8vF_risr)?4M_ftyNUqiaSJPph{hzmD>GJN7iC1u7nb6f;0G zQc_ zVttX4OmqGO^t`MIGHz^KURfUq_E7oiWNT-nYh)RXL5yq-#Uq>SPIDRgT<2DoE(O-gz)^U1@efgrv44@Vk|(wo@uPewK#!N9vCeH>3yf zVw2RVCCQlNt8K&>-N0T_MJvm+ia-Wg+vf0=io?FAR<0TCKvIRLQQxU_aG=pga2Puo zPpv#-qnCDNV5bk%j}jFbuU<>4tPa~H_h}8s)&-7J7ly}euHBW*wkvswxLzGD{5x3% zSr=JEJRX9oowg+p>)-^n)W^zdFL$!44`qu#fOfkTp3-QQPpd4?S;TTIuQ)&DOuLFO zV^ukYJa(vW%*}@vN-Scs}Y0JXvLtT3Cb3Ju6-!N)Nga`+A;6whh$GptJrBqCeA9{d{J~#n%y%o=55>@~b|Dt`kMH^M zsq5V!*-fa|6FirgI=^z6rv6S}?s?OD!@ND8=0d#IcNmX8=(;cIx-6<|jP&}xdIxEY zay5rz>|#eL{%#5UT^;#5u^h~T@$)QMCwbpkE7`F^bGx>e=xO*s&F$h3oveaLTQ@Hj zyUT6Sz3&S4X{E4h2XpH~BSXE`lLu}RP6{HC+i90b-1Qh8SyJ*V@ty^d7sG{J;EmAc zkzvi*b0Tg7m73e>eT3UlXL-4u;^u|hbhpKZ%%K}Kr(=ePSbKgNY0#p~Mw(li10qWv zNS;l*-qUGj=&`*uT&CZpxqP#?aQT6|;uNlOT!~!Rxoyc-bMDrhK9nK0niRuno(nO%pKGgK6WD53ZL5eZ zPiu+pj(arS)mcI}D~9ea7otnnF!-iAUa?|KWN11q`QDp0Y8tPEL<=j<(Y7L5sBj@_ z0RbAy_m)M{R_0hl6Jv^PgJyVh&ON^8o%V#Lyg^a^;A}7Dn_P(1A^0CPe$E&ct78Xa zsmJIQw4Z3!0-YGYKkZ3PUC%k2W2w6k`+D|ssm~sfnEJu_k*c;NCM>l1-~dvrlYC`;(n+?OIj42hv=f8(c8+; zDPJ&{(o_%zSaxQVW`naf3`S!GSn^1ci&zRw7ncN-NY-*!SANBCLS_a=)oDb8G`+glw##ot9Nw%&Syt+L(2Uu6+|T zL#US@bCAF3D)`nqUS$)Nr&j)NNRQ`^;ld^LKKxE?v{EQ-l~;A)vhK74^)DvQBfN5M zda9fxICJ0dxUvKF7(X#^%RlZO2iM_{>`$XB{HMeFU#~wbZA-?mCXY(4oO7=pk=$a= z9r#RgOF7r!Gjj(JYu$ik3mliKCGrYJulTSwAIar~b4&oowK z$81{Gb9v&(M7A<-WGIvN2LCz|_p z6E|63+l`3#jJTQ438I=OP41uEa=S}LlFp9TE?(|s*c%s*plC`SB2H<6K(E4O^%f#4 zrS;Ys8=b7WrprdQ<-aRNo`L;HUDI>JZQQ$$mm{6I5dCcnajNo+mZ(V)Uecddv4f$O zVQk$+9^X?!o^0VgL}f}|JPm(Szm2gi^762I4LrDf)%Mt$(7J%-l}BYDBe1`r{#YX3 zqF%m?$3kwhSYk!^?Q^jfK)}fS4((0ZNo}h+8&j*8QZj9ZK-YM zHkQ`7NtgFTd@>q6&{~u+tK(ayy^*wQM?UAVr05PF{II5XcG9vvbQZ1p>Y8ScoM*H- zZT7l971LSV(NM1^j$$Q1Uiav}^wYwHg^hh^-AC;!D=IFexXHqbPjZU4hWdO8sDjT! zz3Fe+(ItU{w+|1Kj4O9Ee&OW!KR>eEtb^o_iU$0jLj&9j@p_D;ghhF!DH&x+q3JjW#uch{t!gt_F_{BuAb*)Ch^Qo-)EHy9}<2Vk{$!YX3nP z|GkyY9&BqqpJ-e)d(m6#-YBNX{%6?T(+c6p(o&-4U@Y7lE_|=P56YSho4!cfw6#@R zCE&>tkHp$^-BEC5)Hyk2N5rP|6Q(>#*m zcqE%vV~j8k+WHW9%qKa*^8B=OBuk9vkuVx{29JbMjWNP_{??x0aU98!Y&jyMB_3k| z*))%&I3CHS)fgj;-`jc(Ebuy#qxf|hE%7`OMx)N)kua(;Mi?h;y&I!s7ReD9%Xp?p z)awGWX&y;&JjTpPbGBkVl3jMBG^_5218-eEge?4bkC$+RwN-<6e zuq$z4W{)fnKlCtRrd@272Wp%PbuXa0Fw`DE-D||`E0eBsp-KQXY(3*bRH&y1YL*Mt zFRwiO9%4~-kv*4=D36RV_vFPcR7XI)$WUv>Bbw*IRpmk*8D1Wqji?xK0cx`c>M<8; z3ZU*~s5PMYni0c?R$QnH0adc8IvqFhD#8sZ)6xR<$$WB(I1Sl7d1VI{7ur;Rfs<7i z!QSj=a`t-0rVA0F0uMM%j-E)AFFC>|5>&G$tYhhQI30d^NiAw7Z09y%w*^xAu3V2D z-0C8uRamv+nmw0#Ywo1jJnq;{V4v3Gq9ecR@sh-Z_FU?o{&#O|YKt4P#CeV4yc{b& zhenay6*%a^c5S3pC8P?xj^>b0iw_@maI@@~oYXUy%3n)ec&Y)~t* z-y0^iq`mHl%;*zNXwQXtZCH6YiE)Uwo;#a)yOi!-)HSUh z*pp*Qnj5|IBb}B$7`~A7>p%|C(VU@ndf`hS5$cFL%E@qTR;br{k`7|2PxD#vzJ7fw zXgqJ(RnJi!s#_DL`QlI(#dm1MkGS6__15aJLvSkkLv73`lXw@GC#-@9I?B_mG%c@p zu=^Z3GL%iY%bNDUx`-M$Q`Gc4RN#7N;;A*XYC3CLkBlJcm+_qrx_2NeuL8sZC=!HU z_g)Qd(irz@x_Iu@bl;f7@vuaL}s`+^3JiCfy<3L|gnN+#;FQPt+@83l4 z?KrUZ7yD|dl+=?H?uPHBI5^_5KW_9#_b-9*vVWnzl09T`tcI*ZYyRz?AxJ!_>cyd< zjP*_PaO&$I4o4PN&{W=+>SzZ=G*;9{c@W8K%QO2J>iYz(>Uk{Gbl3enV@RTY?sV%v z8bmQB%)a5m)J9M%i>$!x(%{yAFsMAdfnpPpeSL^0qQ9EFM$_)mcdOekYiXo3y`f@i zVP9n+-=}VKgjeq`4`&^xzBG%^W1AMPY;Js;{o2_>_iJgtME%<9)-Ogqah;Ocdan1h z!1bPR>$tAT)LhTQ4UKrK+v(QNrW+jK`pJyebG_!G7G!-N}G;T5Ig$KLA`${-45=#k&>U}a5f#uGP5%*~qdiW_y$FS;6qpHmS)bF`tS zn4w3M+uFW(#WS!^s29daR++?G8)iPM=NGzFwE=wAv5(cOT*eZXSp{br&zaB*$Wgp#Z5cHbyE9$j;&+zzH#x-7K zFc_x{`ozJ!xu591RU&-)_LG z5gEt+h00pSfLIgY*G6fpQwwj)WPYnb-&P_H$liAjaqS)FcIHUf>(+c=)F_T3zs?zf z8QptAFY_M!?(MbkrUgxF@8gq3f{Sd;!L9x9mX*7#X9KkrZ!f3cO1_IvkfWw8NT0X7 zcK)H|h+O=b)E@4=Lc%>4uQsU74&dCF1%R2JU7yt=D2Xc1NjDu zL?oKyv?j)#r8V&gc1NZru5)WjaGyojw5$p0J8KEj$LP#2zkN$y1IHaSA2atZuQNS> zIWOIjr}_B+dniqnSEX(Z?Vof_%lwdKJcKoU0p3q(Ubn}WCe6#oZ|~LWSJg_x*;)#( z4UhJfXNqCE=0>BYWhn^v$Ja}9I>|Uk(_B5&%T2CZGt{VQo|`?R^=MrUFI&*WcPrJ% z8+FqHM7^k9*>K@p1v7vh>>_qwa$ z#C^bQ9l?6wREovO4QR`zJ?`+02ln3jJ53!jjY!l(A|AYNrM)Dg9t7vM{et}5goL+} zv`5Jwp?ls_^-r&I#|L~067vm?uou{eyXk4TlaG}O;+u2|t6P=gCi@D$Z{4yk zW{uPwU4{Lb#z49#c59yGb3>B#wY&7%fnc$VE5St~g2*oc!`Enkvk zkI_q)tfR=lt8~MQtUb1tB2J0#erYM!8Q=|XESTGrajxBK(vEy&4t*f zX&Y#kwi{K@b5?V{(JIgs`x$tdqFZBw7wDaKhAAvr#G@e%xBj`aQ`R-lk%M*2**UWE zS6EJGivo}IZigBlUFZf2Nvc-e++&P8DlRM!5Cr8yzo@@pG3hdL_W}H>_IMwvUbW;K zhq_(Kt2z})H!^n)PCE?Y? zlW`9z5-$AMILDy3!Gy!ezAtoirG%py^ft1RuCWL4?gQwS_jFLeUGa3e#3==J~@5zb2(*i*3RnF@afZzL(9Yc;IHcm`!$1gth5$w?q)26p_Z}E z1IMQBhp9V9IkV*fERDr0$_<+^$`pWvM)vpqNi-|v_N2+~&Wn)GT&YvY6s8P2X zj+F-Wb?fk&SkZhuh%2_2BC((MCl;9|{k?snLhG{&1rT zvTu4QOuKQ|F6wR4hALtBEPvCyp{!%|&O#b)|6VaH${ooLC%1z`eb>Q0vR$T7JCXcNdUAZVsayZs` z`wVj#IUh*W-r^AC4-iyin!b0Nx{c$kQHoWFgBD<@3&q%0wcw(b$mIO(>h} z8eWMs0oxAYb}w2TldB5-!M7A}pN_^PES>v&tUJ!L z$SXPEpJ-y`{jQfli*97Y>uj}^0gcmR# z>`?#Ccq>t~VU88NOY2*aPPbUv(uv+N2h=J9<9reeuRA8Q+iST*1^tG+o@4ECn&hQg zSWaQ5MnC1HhQIz$-kr}6&`Zo?VZ4p^ci14$KUo|fj2!fg2a3RGe0zPE5907$Gn`_j zgpVvat)hZ)ns%IjA=@$Ep(%h|0vL5S4>89AMLVTmX@Rl`-4?&`EVDk^2MxFXuE57g z0~`4vdOuyCcZIUo!*-s4Ex_B~v|xF4;MUIS^tz3#ZFWpJh&Vj8cA#sD>gdy%mT^?6 zTk<<5Or%&o+G9s}ly1R3=GHvT@A;T#-?U57`@kOCPn=ptisrZ*dg^{nJElgeJ8@ois@v>4Cfv+#bb_Ml`Chl?vXGqmdpUW4 zsQs;V)W)e(&m9wzVyIo`)^tBJ5w%T3?HQ9=bgYvtDE|^k+ZC|sDjK4tjiRx7hB{@_wg}xb9={+*1CL^dvHC;cgghHF}g!2#d!VZZ$Y)@ z#*~i5%I&l-%W3q!4fT*CDL$pUNnPYU9e(d5w{u|!nw{z>myTQ;HX;0jsXpey?8__<-$?UK6W>AbKYU0vw zsqL8bWS{cz)9V-)DBf(mH649VZO5e5fLhB?bmOMhgR8;iD+y33f(!4b?dE-vyjApr zi+Dc9-rE7!-7Z~4r%jMfk1%<+9t^o^G?l$Ephvh|-tLURGjPotVS)Z#g+%LmgqJQ^ zlKcuqi@5%-i*&tsGs3Va`H)+`DvYx|!~$KK^fiMWNwlM39&kT}@vI3u#NBAJ7T(7K z&o9YGeXc19kDm^haH*y+LG^@iNjcrKF-zYVNzhA@KjLy4$=Z|8thsf&Igb$zvZ@+A zKTT3Ms=lOE?R4>6B{#D~;`M>kQ=H!&Yrnj$gp>9U|S01MJ zbI`}D}}(Y5jojEckg^mg!;U59;igStGtc+)7% zcV)a+cVL+`Hh#&`AHuO`wA}EzVqhpkc)^}*)itE>mUd8Qc?5F2SSyK4-G^68dTc7PP*UqEVSJAG(d+Le4IEFp`v87>p&!sY8 zITR&DR2RGZ#bJtB;1@d%ipcEaSg-mD+0IuVm7BN2uo1e(8CJf( zR?>GdzMy7xJFxR_cguIz4(z;-&k1nX>2k!;yU81&l!HDg+U`#)4_|)Zv1=PSDnxNQ zir0Y;ib>!$3nDtgA(ew;|EKf|e~LH)zJ^&oCW>RE@y#v0_5fc)b30GzL%#=h{mL==o6&WTwguKo=No$q?eN8UILUA|aPe&1ybff@`!3MP#VKx2!WTz-627=& zc$Ml2$~S55k$yOuP6~$>)$3br7xxUW`m3hdGrZePqlF8Dbh3sCEt52C;o?Wm!Ma9$ z`)uaUSNH3_R0rDIY2`aYwHYJ@NsqzT{M%^8GG(nGnWN^?s|59F3AoniE$VfjkDUvMX$rFd?e+3?#k-KQ>j ztA{Tbw&Glp1NsIVIPkKhc})B(&bpOc^r)lQz5!Fy0pHnU&uM<0_WJSkb=n-ho0yR| z&2lPo0@Ghda{}KdV2gu}9anBB$(UUr$cji#G|a zv^VG5^rh@Pe=%Z_U91J2v4iQ56rT5s$~O+%g;(KC-YbXT6esEI`F=aRVq=#NuByu{ zzp*dQmR^0(dL+Dfd0OBKd&`xdT7x_P9q-lOarWS(2lL;4rZRBF7hBRlwd{gJ)%|Mn z@Qt~N%NbK1WPz{ebqdV)zqvduso~ZOW}$btCWRv=N8SV%frbuU##Y{QrB(RXWGg99iSKe3Chh8q@3I`DTOpKRT3Xn3msJAKly70I zB^QI+L(B2E7&CB(NY@_)4lQp=dVBdR%ey~Yl+o21Umj>!SX}tsy=^vJS$IifDt*=O z=F#sg8|>`Q$BE;grui#x>;1x(^sYATM7P}2)gC;4s`bvYEz@4N?C_CS(^jTimGf`1 z?6FIqT|BnXx4Zq)v4yAXZkIH+uzMTSG+G_UAYJ-^)iF@{{c5}N`L0&^5<5J6!A!m%dsVXt>oLTe#{oD-T~D zoVP6Ptgcq4e_xstw^(pIj(`;ZJux`5IdlD>e_xstw^($?7mPf06-)5U}*DCsiB z8RYUBE|+v2mtWVJ{?ss@S%Sw;Z6#em=?qCD!o=q<=x_d`aIy>2Z?2i_*dT&h)3o!4Lj@2ma-9 zN!L*tK8k*=Q|PBy=rVkjlry}f{glp-bQ?3mKXb2@|5cThU0(~PJai-TeC?R!E2Wc~XOm^^3t{3&ya227k>IAHpWLi&5{^jZC{ zkF6`3!*%@&sVVw25>G++iYxN*cg)nO+4=vv?D~8I-=v8}QwC6@=`-d|nKNhJths2~ zCS*B3#PcwoCOqSMSJiT%(XFi@6@SNHkby0o`=S*XM z@i&fNsw2|)tNE3GpOj=keJ6>KER*pB@T?hRIS=63hKJIBQGY)RTh62lPV6}wu*(#D z<_Wg(;8$&bZ_uQAqtDZ47Tzem=2Tq2rJjXOkkWUf{oLs{PMO0}<5XOGsi*dwlJ?uK zu$(vW{1cD$eaq>J$G|yn;+(lGY)Vjz@6Wtp?!;+R&dHjZ!q!IiF?jI!e9QLv9Q@~3 z|0Tuzm)ydCfv@;qoB!kgU}n}`Q!VEU{731N|DBY;NeP^kz)1<5l)y;|oRq+SQUYTR zy)}&J{rDWL!O!L;F_WKruI2piuxOt4X)VFXHp{Y_(00&ptf5Cp`zOw`oLr>u8EHAZ z-vF+@`BB_N@L?lQYx0(8(VCrLP8}7+Lp-lLKbjvk6hL#P7ZuL8>@$%}nlpd!py`8V z4ZQZoL9=qNojPdNplb^$^|R@PMRSnAKN8ihU3m29b255Qnm7H1$r;!W4a^>)*=NrHoPbI#@q^o=V z_4pGLb3EN|t|a9IB(bJWHX$%h~{ z4^fKokX~-%A!DhuX+~o48q_6%fqrEy_<3|VYK+9<*RA3?i7nA1D;9&6UX*S;PF)g( zkum$#%7w#Ne&S_*VkLyf>`Nel-U-IkvgV&S(dk%znkzpsu41*&Tr16aloO_lK49f? zB^D-*RoBc~CMGgW0paNKhLh80OrLAUi80TjVs$z9=2=rFPnlYTm^9XrZoC&gP>oSR3q!21=-0Wu6DbV+!!#4~i#)pR_t9c3 zfW=sjZTb8Jmu%UXhICzfsvAtI6Q!lHdTE-n+qT262-RmyFVvdK@e2sxc^%js>l9iR zCRiq(m}p($7~xh^#D+Ge&YU~TD`HazbBm_TD4NNUU$c1Dw22f9_R3z%G=b=e2xKjS zpFd~HR1v(wF41H})PYvgh^%XD*UO1bt2A^mX(2<)+-}F;M$i+`qB>qs0t zeo3Rrj@343;g6{=){$t3EufAtoJ(4hAubrc&06lozZv{X+PB+w0 zgiCU{7K8!c--WT;5+0{*CYMLy?Y06>ZJSFw3Z`|f7@N`4H`=48IOhf#>Z-%@mtGx- ziOVk;v0468?qpjwYZiSi4KS;OhtctNKdyTq8zxiHt|Dr)rX{*oO$MXEG5RrlQ~^v4 zBdYL*nT0<=lJ}EIzU&nA>vS*6GCAvC(Va*SX_3h!pmnTAThR$P9o+#vbX}H>!D;w9 z4Ms(UGjF_c<_sBX3X}BB@N7osD5(#%#No-Ha~<5bsmB-y+R~9shEnlI%D?2V;WL5R zCs@Q|!e5q=tk0&=BGNR?Mtq`_AT3f}#!@bCg_Nh>FtOR{ zypvj?k)oT6=1wpCiPniRcrBw!WUmTjppv-DI-o;6iEj~~*a!ON3h@Dg=o?jqYdbVg zIM(8pIo0!?9&U+7Wz>Q!0>5_pjHxrPoik*HRHjOsYA~ayV=Ap7$qU2 zYf9YCt;(iIuV&hAOE#qyC~2_xoUTImuvT zJ?UtUXbMDA9?3f8M;XYX%ug6p((Q#Gss2*!DZ@yhCg?ZlXfBj-#g_P$Ns^Uot{q?# zRvgGiu%QbUiIEJHV6}wANJuKYj9LxBJJxqwHiYT3u7%UIEctt_xLi@Nx9ECwfwj4@ zBcy#8q*C&5K38R%x)5`jz;}XcJZ+_uZ&1rFX5PKpK? zwKS#^vt}aS-!KtOMp0s5qGr^17T+M@dQiYYh8PIOOoip2o`#VGG)6p@-yr6$0Fg!^ zE&tH|dJ8KD8b0kiLEy`Sq-)VQeqGz|O_jfFrm}!4*Edsn9aTQsOy$q1@>yM}ZC4v3 zTOgaZ9v5Vl&@al8)d+Dp+(@Wi)~L`4(~~_PGcgzFx};322% zG=MiUxZ%vB;JO#6j3SV6<1UebW*woqv!fbXx={;gL@_3sjLtywNGs9AbF+rfywFNC z@!Xu+1!(rS5{=m%GDRoC2x3=I@oOq$|LCrRmJtWC#iS`%FEpVHq-j3qbu#2%M}WV? zUX9YsCx=Vqvjb;#8k@jL}VuuIdO|O5wKR@VFX`Jt0TIBgMYS?1B@kC+swhz zG}88$!^R_U5LGwBnRj-uAFyTC1SH)bc?0O=- zR%js{vI_h$f4$w>a6$-=ho(n&bhnPtwA9_>*{G@DUlPhUzA{P-1hE+oL9qN5CDDlX zT1}j^^r(uHpRsEbDPobAZinxozt5&<`g5>iwrb03lxtwE!*5!GYJ z2}b+^nZS!NFjejjA}TG9fw=xj8~HW*@iO(}k4y^ue7TN*chwQ2J(A>dLbD97bHZ#kgarnNp$VMW zU;`1Ed1W}!zAu&SXATWTq=C_y%V}9E>L>yY$Y#>qS#Ga+;i))Ht-8hj;(rs^;_F|| z3Pf_6cvN3XqAX*>W;dM%`R!*?hHE-8`Dr52F%BZqH*bIXej7yo{WTH+tFfMMq3>%N zG)hpW>BS0-2l`!_AU4quvuf6f)3b~cvFbQpYoC z@KD5_<|JnMY0a_+)Ie;MGhTDRD<%zSv&3kr-2r#Gx$;=n-u#+bW8$$y-v3V!Y5Y$R zxy@omk32 zSFiAt^1R~os?DhLsM@ru1l~{-8LwJX498Wr2fr3Ig+mi4_sMUhYbL8^`o!5b%}ZMS zoY;p*eU47)@sjMcqq^qC1llyy`MoF9`FKrhZJJ#((}tuk#b9!*!91kmk1lm+mJbjp z5Nk~=Dw@J?G^u#;qqKtPN%uUkzK}iKA5i63H#CFNI4v>av@U_zGCqlq9-;uXgjx9@ zUPoLJiltC$9r5x$3tASA_>J9Gf>lGwY9P_ghuzfpOsb{Dr4G&0iIc>>%`zR9r=2hd zb6i$%tcqsT=dp;GOD(1n4K-WQcO9>XIE*YS(XEw0 zxi_q?tn4uL?r*$Kh47#q*&ZNm=(lSIfNHr~RM?x-=&&K?9}>{ZsBqlF7p-d&I8Fsw zU$@XkAE~Io{n5xaYx{9Rw2vtmpddzr&sed8m1GECLItE0efNme6npuC?AZA?S0wc2 zXb^QI#wd=4O};?m&J4r@-Y{^+eJ^B~xccm#=+7Te9iWb)>l}uKgjpUI6(*xj`XNd% zcT1=Sb5brnqg|UGOj0Yq(OP|I9$TKI@I?12G(egEe}F+=L2Cv@Ocb<0Dv>8Vft7l^ zR6Vnvu^%?XIW-gVT8bqlACwtp_*1G_$!kqAJswl6pG8zr#TC+H8j7(Nu%3W^qk*&q zM$HNh5;faR&3@0#NJBmz{&w4OoTfeVH<4zSVsvmF-cxqo0TW3a)Dd&=waxg3$a}j) z#^{j0GY0#j-e716ukc`X+GJvEnj;9h4zfj(%n4A*Fg1~8?B3b6$6xE^qsL;*x%TT# zCmht_Y7U(QINNyA9npMi>B@xn@cnH!fBpyKXu!PZ;gJ<;*CF|8RZ6}rw8GZ#|PaZawI zcm}95`WSTPIW(3(g>&cJfHPxS{^(0kaEM4JI*5)v+Q&IGL0-=<_QR8Yk3{f3^ui}* za1C@9MxUGgj4DZKQt6AiV7Q*D_qSEf9*W>;!ZU18ND)a)(MWlYj(O@cbg`3=9ni=? z(W|O|QT6A|R=4Sc>WX%XmAKZusJhavW^ZKB&Zp{4sFsTkdVxk4yu?9Z`0JB!@(0qL zB&6VD(6J<%)lq1moKGmLHN~$en{|Y2yGABl8ML-h^mmTX?kp9x}#N9Z9_4gD2L zc#Yg@JhHNuQzX6MkkyrIrNT4#gqw4J<)leUWL0jAdUP=vGb-7N-Zl|79`Bk%1tZrF zdNF3gW3K1i@a{vrbBUd}^rXh3l**RkGnzP{lbw{9sSuT_JyJ9T1t$+dl>~bymeNx% zU4BE0W`B(toXOuD!;=bqpstw^$D3bHG>RdEd;%7wwiy^O>WLzL+-gReLF{3~gfY{G zR1HS{Jpg0!w&oZA5F;B)%$Q`G({(%o^{9YNgB_SEe#sYVYeoqiwC;a#F37F{S-D*4 zxzGr^r^|@q{>6F9(2)``e{$GSbe#tR-R9$<)8P}^$mpH1qy?!LT`{41{shobWAn-} z?*`CuaRed+BBRSmI9ecHl3fRZWPQte07bTXbz+{RBrQZl_VO#eqhG(;nb9Ps8KD)Z z4#N|$K`=>n zz|0^m4$x~>y!_viaQUy@5Th24)U4|RWA66e7(yu4t*N8rq>Nfmnrn?=_UFNn*h|b< zt0e|fUxQTM{V$XXtLy03!I-N`Lm^*5UCh{>Clm@-Mhs(6HerxO@@uxE+lIi7HZf!W zM|M>EUnmt;*RJLnlfh~XM{e*Q8b}Po*w1^$wNdWX>hTsm3WG7-s*<0Q$6#}bKdtFN zb+HW6eKbL1!~;DHO0C$uFe_>KmCotYSf8U)Q75JuNpyhJF@~k{hr;w8VU{rAYk9;w z{itKd^q-8t9L*;3PK3T~MKh7OadQ z<-dSsj-)F@`r;Q&fnFwPX|79<)?HK^4E#~Gu?y}#c_8x{$na)PHv@C5Y`5P(5u}G3Y2oLrE8knMYT<^erXlkFA!0XNx4l zqs0K*vZoHFOb$V$;WF(?M#{k)N_z1xr5WBB$n=3H=iOGz${bX3uTgda+CPCeLm~7< zDd*5vlSH$>5AN{mAytoasSJe(5_Y! zv_i@ed!p%7p9@VT@P7eZpW2HPjB1f|XJc7Qzxo6pFrrZ~^B5s$VtQhaGW!sMTiM_0 z_qM5#rrJP_mU3uL8VOZus#mc@PXhP0?NV_p0vWWN2YdI3{04^z{>vy92@Yq^?AlCGH?5Ts8{fsz()F0I6k2;U+c zw=EQL{F_aFk28z!=|9GT-CuBUPDqMLwEXK+-x`qvUlFZzOtdTIva>Ktgo;^WN|Mq# zcqbT4_&%uBlel1rr)%n>>;iP|S?(N3m90|!YMY2xY}86*4C+Zw*aV&!nX|L!vRlYR zk%~?wvN_YUvS1MWt;3^V3wL|rTI#PaBy;00}Bt}H? z(*B{%cYy2|km(yQiOoP{r*}Z22;q!S>LEkMpkvdL7J_2UU@T#6He;X}%;DJX4J1=1 z-C&lN9GmgtcgtUua=&G7zOn9pz@7@DHwR3RL|=H2W-@Kz)*XHOUZy6xgQvcPk4ps6 z+XddMcbK#QHFL()>2!4fb<)QDs?@BDAbNQtN)*LLge0v;M7R)yt9G909%e6tNlx1w zk_7Hfd+zM?1Y!TZc1jvNid~n0M3f$Fm$YRty}A>omw7Sh?QA7IS{WPXs(QwKrzNTh zd;BPI@L?-Ci0g4Wu|RCrC>X^C zjY6d8_J=Eft1ESXgtOM*e@dfBguhN#8u$|%FthWj1~+l>1&bvl{h{Q0#M6k66;I>( zZPdE{Obk1E(ert>z2gYpG_n&Ica{1S*Be_$p? z<-SmuxLTHmu><3H!e;(gB^s*aiyZ4d032^4>iz>V=8WwAt1)I_qG?(H&D|xJxKlOf zu-C*?ZG3Nr=4$$PYcMrqqNcYW#$F1Op=G=b)USA<4G4cu2oJJaVP&K&x)CQUH42_d zA?>B$q)^@5RX?EGNT?!T3#vB=)nZnb*gk&UNxy+A>HW{IO9pHjbqNkdJ+`aP6;Vdg zP^Kp-H94S)mq)1cOcx#}z&0wbQZFUm{OY7-lqf<533l1p;~=nXaspWDY9^s#wWiV~ z@cBs6V3m}LouZ67?5X`GuZVe_t4u`EU;d^WdXj<3#o=EaUV;ln|7kJLqXIDKBGNSJ zCaGw*EbnCpC+P%}n;T2ff{E(WC{dykJ4j?3%IndV20%(d#wyrj6=pf7#X`I@ZmbiJ zH@ns{#jF{f@|vwMb$l4Jb8+crF@HIn;@%A>A1kD_dU}c{Y?L4wosqtj=Hj%)D7AWg zFgj%xDJd}oV0gVs@1#+4bJ{Q37Vke}jCe$68p=7}*DyUe4tiSAX5XZup} zG*l;ejlMNe-)KG4jF&<=MzSXB@kS_Y*;hf-H175B19=6BHAwVNFMOlrMzD~F;rrvk z;AhMr!bh5scsD9@r*fmDSGX7rEz3N`td5VHkqLb|M6;eg0hQfB0!LM;S2G$tOih`O z7?ub*LE2D+sNi4ev<5od%o-?hIN}5&?hJOEwr&#R)*Xgn5AZZsZCCl10F z(#pwLQqkx7_`7{LeP96oSRXB|cop!z*Hatz`LoNR{&)GtOU#mlt>Yf5{+F(XLRzzq ziZ!)o3E5$d3|bU(h#CUNKbY>{3AB{&hyX|%g0f1NQJ6sUC^D`9ib{<_s2Lm4^QijQ z39H?^&tLaGDFiRlBNZZ_7vnJVAuHQ2yxUG z|5~MUck>=q8%wKvsmGncS(1Z8Ktto=65itL67(Sk=09GdLk`BA2}#lAf0_~G)K$W| zj`1;L@7-5gEt)G+J)mgS={+IJ`mr1s=LGwZ;xVlPw-W+O7bo7EPXEYz|Z-9ZM|n)XBsQ0!W_VN-;r8 zwX#%98d#exfzprHeNz->+UTZWFn)qk8RWw(^M7@OKKPi1@_60z0mrfF>2AC@7k$J1Sg_d3m@-Q5)lb;#d z;Fsq;@X|q32*xY(v0W=o5RZtL>6h53TSkrZpOv<2{NqlWp7h zq=m_OtWy5gN~M7PuQo6ZQM8}}lWk90MA4$p`Mi}~i)Y89t3=)Q+M7og&DjIL4yYgl ztf^+S880Yv(8cQUUf%yCoHs;v2D%oza(f73WpC*H(?Xc)M@G6B=!iR6fkp#xq=vZmV)rC^DUxC6aD&I+1OBLW}n@ z_>C+|O@`w;7&rK1_5DkZ5d2>;AJ1@eB`tR3aov#?RNfqc`0_Z(8rsxGX0R12*`1o9 z1kIS3QI6yZ8V55)Eu+p<;?`=gGea?$qvJ}&xJ_6kuGn@7I%v9+*v=kqzOymRxS{n# z(^!nZH#P8|NgGsRySM=_tGLovrvXvPVpprr47{CaP4}Dij6mY`ZU)wP9!{hL2M;Z)*7y>x2Rhcz@O!*F5A<*4s4MmJ@I}a$E;&#HKfw)rcW6&Q)Wz=GjZ;e!kLq&@ITVyUctC=;`AAb zZeX}a3g!iW`PY5a8G@j|)lYSxfapBamvRVPU*fAL)vyv}FWN$+97dw;1y%xnrMNw( zaT6#d;gwwhN_7p4k3(8zV28=TPNS)b;?g<_E$1x~$Cl`{q|IM~(O(&(D7QYP!LbG# zsu|0skLq3bLr@wRr6G9b5QKguo~|z>3O5oZkEJSiJoGPMVo$K213I1y#O?8s*=I!l zWu_C2x9cw$N|au%Xv(k9Z~0e$l|(p|egMD0(c!B>_}w_dLQ)PAj!#A)j}HUF2FYh9 zfFxbSG~YAUuMR{JX`Kt#(QAG*R2uy?-wM+N&@(|n zH{cv=Uh5{NI8Ua>bfT+x|INP3<9Xl(t|h;b;8x%_GAFg(WxPeI=1=#Lf#~D0vsm9U z4D^KuJ}%>x(Jl1P`jT6qbuNJD7>;b8KT9Mw(1&ecLLwU&FnP*+d=Prx>KH~ogml%F%bsBr$^LD$|mujqzrr_Q?ers*>VV1mQ{GiObi zp}`XaUdvdn#f^ml(+Ud*+%SC-{VAF`b#A|@v#kF!2EaR}vK!{nvSrFo=T4b1xoGO- zse|PGM8zFu2MDcb`iyBeOp)~Dne!&;^bIpnjt4bL)!Tjq{b5bPpGm-XP{rAkF2#l4 z!X}*_Tv@`}Cz;niSD&;N(_Bq!nLB6RjKaxNi@u_E27VxMRaa!@bb%0)`}%_Z#8JQu@Q3I|8qAgN`Mhk7)p zIvK=iqyuT&J=%geMAEN#R$Z&qhk*GR%b;A+=}$ zPcRCXz8vdZ{Kjo+zk=INFqfz)V)FDk%}qAgHO!egbMAn7MRQ!Y{a?VtfJxKm7X4Su zVP8QQUu_~sYnspHoyP&JT#9SZ|5WjRCLGM$b0<%qDbx0pIdf*Hi1Gn$Zv4Et)%V2A5%9DvO#y0KmY} znL_?_^x|)15Pc<`eHERY9KB!L5*RwvE71Si(Q6npt%TKx!g5!SC?wqxg|r$`NEssv zBOp4WFoHZI3Zo}(L>YtVdd%h=+S@h}%cVM;X6OSEhvq$**;0{`)lDj00>|A#UT-X* zYJx%?=0(h6nLq{J@SmU2(o)wSpiypF-S8CPv5Q|AiF&Iu(tf-C+m_XSO}12{g#UXP zu_m8Cu>XE)o`e9F<^S`yke--@>ZE|5{x~y!jNjzmggbc#f=qVu=eQK^OI`|$PV#-H z5)Gf7yb?hvpD*xZsTg;4l+bOeg;6Bw{wLqYd;-zBU+@?yQ##Cr8V0Vcdoh+@5NJxZ+< zLgC*9jo1?j3|O!4iQcyRAz_{F#rk6t>(qRJ3D#**tUo!*SP6yy1tjeo2n<+@ZX&Ex z3F}-h)_Eq@+4s0u=R~p2ABR#ag;4kx&>rn30t41tUcujXa|r9LUaZ9?)}Q|iV8ZKy zDAtk(P->+R3jZEhuf34KfOT;QHrwtN!n(wZ^>!0$#rXgethYt6{^A&8B^3VD{y?#m zz<~9xn+fX@!g{wC>pdpcJ6E|_E2CIfeh;Nq3Zd}tAQYEc zE1~co>H`#y5*V;P`9Fj;D+fit^J1+wv2OXLi}i^p*56-_QY(c}`0cJh@&5=6SZiLx z-*$rtYpoaSvnJMU4FD5fpNV4Kz6qsP3Zd|CBNTN62COgTBmwJ4Dtg(A^%WEAi(>&M zSpP`n;s^d@q0~wt6#oA3<@T!t2CQ!_z~6Qk6V_c>0Ev2+-JDh4<&8A}6RdAixnOrju>R`|aNcezVf~1}qr861S%vkV7XVDKen{nl^?(nhRtll;m%$wD1_A@t#_0iI z-3JG5f5vF+)2(*rQ1*yqziqX9oQBO&$)0Al`#xnqmuwHK-J!n79+T|1tadq+jY#%X ztKBP@6YM6*cDLG%qwE)w?PjH3L(appC7*7k9;FW3D&N&geFHVNPvyHbc*5D;dPLyLh! z6yUN&L+T)e!HXnDH5sQOG05ML6!6^D|IDxB~9{vbnSmI zzuKKuJy zqlkf-P9%woBu~t=CvSbRss}TV6El}c-eu;yl2^=x?e74yNag~r5oRv6|HRA?-Cz|l zGmas_%$4?&#LWA|%nuYXFmo^)`Ku&P%)CKvL zfcZalZzc*CDq>*fp9EAYd17WM`I$0R4`zN&tG;r{yUZ+-ykh27o7Pq$nPRRHW-4qS z%B>Wl8@z_-+{Tb#X1VX5O?n5i>X7$9_u@12bafbAGn+|rjVgbtm0Czkl+RSYyOsL00mvUwc`Ob0(~A12%A@l?>Vy2}Dvzb% zUZQ_Y<*_vEPQr_*JeG!+5d9{V$I|dEqW^`;LwFmBzU7mpB-UROp&Q#)dA&6BNgk+a zJ$Ar;0Fn`5HZUd;rsMlDL8Oq}f(yv&_gKN5b4jez3hlrje(3khk?YP^Tbo z$2EdH)mIG+Rtn(>?x#+6U`QbE>KlP3seMT^>4FTacUehxll6(K)`)Q~C2{7@?|Q$v!+TuEX%-S@PMJi|cV%Qu^m6Q1CD zz}i_13FLi!X9I8QSaOp61ewcuf5|%_){$&tfaLwKi6P{{b5$NXrY)^KP~{=kmuQ(g zNb*W&eSALzB@yeHTq9x~?E4clM|=ctpiT~9NHBMdaM=M-|z`<-XTkVpkZ%e(0Nraw~=K2A`r% zU(JvpHp$l>hMam9?V}0>8Df1RsmYS3ra*q3uRkEACld|iQ+)3-a>5gAOXGbiLjw7Y zzMBbo9j#$!2r}vkTk}lGJJ9jFIjEl{d1XL9@%_prc7s7|wr?cL5dtD&@ApExISdJ6 zH~X@oK0*F7K}I@0NQ3u(R318>MfsnrJapWVwk8Wy9y-n=9p55(SI4(Xo^*T>)Mgi} zyh!FI-vyv7lKCmuh>lBq4>PmGS8yAW_CkgPvx|L|#Oz;4$4dkmNoGFj_;!`oI{t;^ zm5wWXPrAfzGl(tqU4?Qhh42Q8NTSOa62$KIH4w4UWS#d2GFQhdC9iZ`>Fb2qPI_{e zfqa$kc}7lnf`1@eSTph2IJn1-z)&ciRUg`MPzFS>l_Zh_2 z`$8zUQV4JGCX&zwh6J&PeeDoS5FI}v$VkWU!AskZsyuXjkh=d{m4}WU(&=L=4;@!f zezW9V9X~F4((x~7*4v`;qT@}zzMw3U`3={Ij-T+|!ORk0!OqmlCm9mVZuQ+n%zj8c zcv_H=WLA=nx2e3=@iUTFI)2Kx+9mb}gIJAkILZ+MCSsq{`k|H~LF@(J8$|3Hng?GL zWUh|?D0!vh=Y5A=5gAk01MGh6M80eWM_;)Kh3>^oAgFb^NB}NyiQ3 zbKjD@((!A)LbMdI{n;S4%NIbol|p!fb7-Nwn;}8$Z@!O-7(0o*f{b*WMdNOt%0tJu zkrlqH^3ZVybkE+e^3d^bfW-d0~r7miP+UNTO1Q)u8t#;S2{l8`-_YGsDZr6w~Ub!p5OwK=obtLG(O+*li`RbnJJ+XenY#;u;ZKJLf|tMtFlir+NJph6J%r z&O#zK0QGj7LI&jLQ@*nYdC*z!BJXG*@8bLbi z<s-&f^foowCxB(D~9+0HVTnH;VWG4^*l5kv~n4R)vTJ%Ay>%vsJ66sAs~ zDJ@SS2QwBeTh3N_Ff)}Fbi-60%sfZq^cS+NH8KVU0y?RGqoH!SLJnrGCgNA9JeawI4CnhQ z4`v=E=C4$FFteZ?@;^{{Y^O%iBz~33V>>mJhR_dHp0-ougsxV3ED*miT)&&$9C!vO@xIi zj{)^hYCl=!J0MT(r>K0YGQ+8or#(9~f0^_D(e~b9QdC>lc-5&>JvH4k(_PckZIg$L z2#A7$fG}hbR8SBDDgp)s6cn=vTu~7dC@3mQFk;3CMpQ(_teEwhbH0Xa_FL=h(_KCF zyuaW3{qylW^z=Sw*IN7Rb1L-is?|Ase36;o$Mi_DkMuU0WHYasIlO2(%6KB#$9j|M zk?dX^{45KOWS`B$`fO_>+1o(i9%pSN`zQu;ytR?+7Cf}fu{M(ZJ1A7}a+}k+qTR z@vJ*9u{M%@MmN|?t&L<~K)j2sjbv}&1;HiOMzSyAWG}Nel6^dP^X1k?vfFd=FSRz3 z%`dXt%dCxL@4(4fVQnOP8YlO1Ya`jM$ajUck?he-!j;xWvXA0que3Ij{VDOUvUV}q zSBq_veXjQ%GAGGiYFY}EBo)XHj;e-lXsW3k?j3B8FyP7$^Mn6!h5WZWS`AzntQE{WPiY9 z-)C(kdl>mPSR2VUXRnQ7V;%Caah*3BK}&M4H$9Tv`#q-(lgm72Ug6>D0pp3}KIXBI zUGwj*Xnfp)Be^?r@SClTbp0GBOdnSX~Vr?XM2|=HWnYZ6x;+ChG-jBe{dQvR||| zl6$=e`z325xtfdPWosk3Z*y{9v34=J+r+lX-Q=x9rX;zKnjT5+s~)fSooePW^Dyvf_K2F*oY{X{a2}K4?!ISjB=;#M>wRl8xjbQgU~MFKB`^6uv^J89f+w!B zt&QY9%M;AU)<$wG$oGl0k=zbD!v56SNbYj-eP(SW_d}jgKeslL+m9#6FRYE^KF-6~ zm)1sdf8*}?m9>%F^-SK^)<$xFWU{}pHj+D?N%_{=#pHe`woUHaUIH^J$$iK4NOHgT z?#ISXHS?JHlY8h7#uLf?)jJHE)Lg)s{!PGGrTY(e^WQBQk~Nvh{KMKvmf3Co6dQXW zcbi|lGfU+EH9bQ9m$x0-ooe!AP9o0V#uMbeW?i%92QFK4Cm8Mo!OR+Px#vvV`lF}c zFM(^`GiJY55A-qvPMpkQ&Pb*41b9X_!wl9uLB`N*q618$0k0Js#}-Cjqj!g=q%BYGh)j3aYv1-9#EJQ3V3`eFumH!nAL6|mALw_ajv zkRQm)!QNuyVFw9rH?gs>N!~->T_W#kdW5`>9)WhJnmn1wK5+UPPmmANY3wC650iYb zfR)IHh)wdTBp)hviF}yYmb^jl1SA>xK+_}S!}Sw}oIIHmNIt@Nf_!g%KFOaV`4|B! zk&hLdg5*z|t8M`+ zksl&9_9CYBK%K&oMn-l}8Tg_45d%(~Ot%2wlZ+?8kJLwClbV@4G8`pf+z<0S9Zj<~ zR(A`I{AjVg;)0wmHo8cDxL#BuKf?6L$Y$u~Xm_f~lX;1I%}nD7@;RDE#+uKutGOpw zvf@GDM6vBb;5hwB3H6Y3C)0*Usxyrzz!z(t&}&ZRiQ_y0t1VuyoiDb%UR$JBmB7y} z1HVA;i+0=sM)1A4pIvA?0lr+nMevyfzf{1&;!*!HvF%a+68&chd|4Uz3VnwGCr;)} ztZMgi;|cK9x)&}|YbFtVjeupabj=ZFt+gdBSL*}dDQQ_%27ZmMM!Qo@oXm|pm0fE* z0e-VyM)32P^IHTgjq{lSzg27;?wIp+`rZ=wO=aM>>7xxeaWZ#R0_S$)3GjRM4+I~< z$nT4RZ)gO5x6a~nNg}_e41A-0(tr~uvl4Ub-fuhs{;1vyo79}n1LtD`hVMZn^2f!- z*@TflqGy%BHUT}nB z+Y62=Kh?cBlIk+DTK{%KM%+wC?mt=M39_dC+1R9JdJ>Jz1kA$~^o2YmHy2yuiuh-K zd}v|&k;dm!uv?1lV$ODAu&u0(D_)a{da>>5EBH5-f@@-WBonRu=4eO#3$K~Ccm{1_ zJQ3XX{=PdQxKFt=b++Kh#B$m@SR0w>&)~aQ8^Qm{!%tVSRq z6wwDW{oSn{;OqQq*gIKU<8}h>5<6R4rnRGg0wR+&)5-M6V0!o)&0rXJrh=#Op2ib{ z>FeLY!Cb&h_7kwu74Pn1+mqdH{>vrsK4swj{j<^TR1+uDooD0$#uMPf{OX+n{tHg< z?r;Gs9Rx;*ZKq*~zau;)@}XtmBmIvIIB_yx6MPTj3GlK0VuDX&<32I)eZ}V0PhXsD z+;L);u71XgjTz(Ku(y9piF}Odk+kjSH=y0ACQqiW1~?OpC&&-+D|&#u0Y@nJPys8A zY?9a{AIoCFVPcoaCyQ;#C;Hn1Nk)FK=@IfN{zHbGJek8eh^fXC{1;0Qqv>km-*`rIe9YcdC*y5JVCz7KN*|UyhrlY z0#+hlBR0v`kbJG!CGu;;w&Yj&SCq)FHa$Xqt=|pp`22_0%!A#4bDi-7`7Qp>B>$1* zw+dK^{5G*kehwwQukl>yz7qwX!p8a?D@C921d_1JmiP+m;YZFz3UEQ&-?zK@a|W4 zCQ{;l;Jf`Dr=jj4rt(AoLU_-rTg;x1{182Ja+A2`KK6OHB%UL9or~ZT|3+Ba&80aj zpZdGt(mQZ-J`abV`H#V>a&u#d__@C~{$$)-f$QK4{~cI$Zte$u%J|ZsmcroO+@lQf zE1zGRHFt9#GqYd&XM(8S%`NBv>l;6VLq|I|w}IPz>t6+{lbbu6+kNME#`^B!=4Noa z@BRB=b$4?+bGsk>A!+2m&8_1}{y+XpuzF(*A*>($LomvIZf+?D`;*_AX>fD%aCPMV z?B5KRNp5Zh`+o6vLf=$3_e&PmfBm2qnNYb~+rj$PKOB};x%+7S=0652P`Opy?stD6 zwyRRPAzV&>_=jTidX;;UasKH)2&PX8a))6$T$R`}kEm5{7A-GvKdh-LH;vAhTd(P=!eF7 zo!gPywKIL~bZ#*AW4C=`Bl;S2u7dkmhs3ViJI)ZD%hT$ZxC_<@o$JNzI+-zy*10WY z*gla#dM4@IE3`T%E`T*v=LXPohs10|c9hQ5^2)7C;!E_+*SXd7?3!4BzJ)rsn5(W^ zVmNkm$IqQYYsbX3u(Y2$idOf8i;Mff&rP7UQ{oUc!U1;@46uKf4 zey%Aq-!pLntb(6Q(%L2QGOXr)?)L!Ju8AFy$a+8bC9PhG^I^5~b8pe=o%jM)CqK89 z)^3Sm_|VeD&)rX}PvRO_-Tj==f9h*yrKg{Jglnl^BGVli^m9`=_T5e25I^@KQs?$h z+={+2er^W)1|*hZ?Bo30x17y}#Hl;MO61ycWerTc4r~8JZVo*MCDy=mVj|ao#o!K3 z^u&dt4st0R$lM``^{|2lLL3q})wTFrf#vLk7>0SCIwf}NqTNR9or-pa*aM4p z2eHQ%Z7ud;MY~e$*+sjL*b9obFZR-+-BRo|MSFnQ>x=d@C$k-AY)pbD=)8Ot;9ijE zGQe>X^Q$qG#M3qCPrQa#mG}s+UgCSa>cn4o^%F@PWfF<)@LG{*hu0vn6J9G5Q*l^L zCXT~vD)A;}x+<{@@2eAQ@miC(1Fvb^=g-~k>cm5cW;+*0JHPEbFcuy_3RRCPJX_xY z(_MKaf@v}mD_`w$JsQ-~8BWs+u|8EtoSHqnflsshcsNK^GW*4U?#fNrvUwd3DXGdW zc(0aDY`z``ZkQaQTDpIW?GJ%jZMGwDOU>N0;)c#8dt#i<>sXogS^j6ZuFz3$89E~V z|Mgk^Q}%~lH}k=aL>j}M zP7%`EMB3ikK>C_?=LpG6`l6h$AKF(~`wxdyR5~yp#_ijCV4!+aV?5>5UB)&Ip{6ecFzQ0M3P5cluMw|E%CQOs~?(Sx6Es5W$Eb$`^zmq0*zBd!U zhw((>_eSXup?$|ejFC`E=^86G(>0S5vya%NbnPoPK)FYZcc&5QcOvZvy0VP`j?h-&7h*ez(S`I~p^caZ>ya!S61;X(z>lpTCpz3g-@w0z^2wuw6KJJ{Yao z`SGg%L(U#_183iSB{+Gq^ZOYXp8R<(^mi8%oIF+f{lyHN6wgxr05OGgH0ZTRh z1h%&emNHfQQ@WxdSjqPX+=llZA#wS0J`T54r)h&kgvSx&fgi`bsvCIxf6~ z%pR}Rs&u0F7PtxOZl&ZTcAt+{Crt?bJuVj${pnUwml*7!P!uTSI5Fe|`k3S-h6ZTX z!H^DUANCB|Gfw(7{HZ(wE(P?Nfu|h3fukHwkP65??Sa3kUHKVpgb5KvOcP?6>{Au) z^k%8bgebC4X5j7~ZPDta31MZQ=myk%R^xAK5K;GSj5^Mkb=VB3V;+HgHK^=bz zTAef@tn3rrfO;@1WU0ooPZFzK30u^Ia^MwIbLlInllY{+lO}|feWDvsj~b1?sm8KT zf_ij$tVc{Qp&rS0L7mp3$^sJ!LMX5jpeXm!$ru(D5d1M0GC@i*02_DN79*(ac0{5aes)=MJP%jTlh zNfW}#KG6-RtA5Ad)TJ0hB>N<&YsxclRTF%^71XOE)U~e|R6#m3^WcQ17`Oe^c!{0<|RjB&d<>6Ebku6L6DQ?~YJ6 z%tNb_CWMuJq8m^*{fWP+#`dE3a4>wB}Q6Gs=AAi-L62i(p(G952?1R6l# z8p%E()~9EeP`5^?&+mX%Crt<|`$RXOzIG%2rW(sW32G$!1k`O$!c8(@WS?X&cyj?- zoirh=>=WI9`oZ7$n`$ikB&Z*iXW+dSI5!CD`%$bP^9f)lO$aOdL^q&*Jq~|Ujb)z% zHIjWotY02qLN&5a66<%o+1^PL!pc6;4XFQJ76P@g>{F_->{F_->{F_->{F_->{F_- z>{F_->{F_->{A$%eF|f;PvJJ?rA+oIjLANQG1;duCi@h|WS_#A>{DpIfC}VlkO@Nm ze!d$Cky$aaPdO|5#1lLU0O-tH*(W+?DEri^78jl|*{3ij`xM4xpTd~zlZ0X`2mp4n zlzkcq{A$%eF{%tFav}f zcbZEu4UK}?&HcO-jMN7tn1L?k1e`Q^^H%nWo(N{7yDu&V!kFw+7?XVpW3o@-oeUGxo!^ou=_FzC^OY$Om`{=3w`1Fgj`S=B?}#JrT^|?o7N1W3o?SO!g^^$v%bO zGMGsANiuVEqiLGrUQ`N3KAB4})7>oEoius#R`!XW2vQJ@5_9=|XK861< z82dT5v}R6j6wGY5Ili=#X*#ZKnoe=~jiHk!Z{Es2(G$TeaL>V;@clLbw;y0}H+dM7 zeF|f;Phm{q^1QFAL@zw=3G6G{-0XJ4$ENW8PH2o|pTd~zQy7zd z3S+WQ5=@!w6L#%&?ie6TW^O7AX1%-31Vi5ZWeny{K$gsGDGTN~_gfPTdGl8GiJl1NRrgf}6O(-kW3o?SO!g^^ z$v#OiZ#BxyEAD?w!E7rF=56;hv^#0?=B?}#JrT@D?qqyF6~<(r!kFw+7?XVpW3o>Y zOquKxGV_7E5Xh3556go2!VS>wq{*ANvQP9xFh98b@+XYRK7~ziL@JYg3S+WQ;b*+0 zh-9C_nCw#+lYI(fvQJ@5_9=|XK81&L27V;_6vkwq!kFw+7?XVpW3o?SO!g@}4CyG7 zeUfCB$vz>O-?=X#Gm=b^eUd|yr38*(ZQks&4QU zaFKly@EY|Ypqw;u@*m+M6tYkB1bALeBX}3iOeFgx;AOH;0IyT$mB2;zNx++^0cdy9 z#K~LPCwc{A$%eF|f;Pv*;;a@i*Y*IAtfCJ9btpCq^*ih2P~nsMZ<>=Qi^ zTwk?`!Np{sB)Br!CxGv!J}iNY?2~}^SC^vQNfRe;WuNE?@L_6ZOMsgX9+B)*7?XVp zW3o?SO!g^^$v(-*BiW}Ak2^GyeL}E9)J0&HOo;501iP2|(FDu5@>ceVo(Oh7^%jGT z$v%ZK*(VuHnd}qD#;HF`WFq?{WCyC%Xm`@Y&0EV+z17?XVx@G{vafKO5f zz*9ydvQGkjxTxJxLu8W(ihg zpCs4?>U9$=W)Nyx5Md!gM)6E|;VpXdp)ThuPN5Et-B_9=|XK7}#ar!Xe_6vkwq zWR4@*r!X%2gkWz{6TmE)5!ojR_HOln36^o?>v-jLkMTsX5302cHYWQN#$=ylFlDk& zAiG~}E|H1slaOsvN1+`hV3JwcCwhYHDfJKDgfZDC0WXt%0{9lyx@~bJBKsuZ&!|@o zIC1h;_KBVVe?`r}n=mH(B;b+kQy7=Qjf_MU3e zt~ke$>{A$%eF_)($aN(96vkwq!kFxn%yA_96vkzr5bV3EFPLSHMfOR8{Yl&@fM>iH z;3?pt2}8hh-kE53(!|MI*(Z7eyoHxU5haYtK811FCxAEey1-Mwo0oytd!{s;CQjbU zKG754oxIBk-jdhF+e=#Ty>Zx$c4uq1#Jz&FBiW~LFWOyfe{-AGu440w2*GslHkN|v zXnJI%-Mrn=?xe|^x3W+4L@>L0?eH~17?XVp9h}Wg!SwUCnqbJAx3W+4L@-0W^$aE^`xM4xpTd~zQy7zdl3?~|6wF}n zl~OQ6%7Pi?O+dSoCU5>+q!F@D^h7ZGdM&p{FfrMuFedvH#$=zunCw$HHwn;4_9=|X zK7}#ar!Xe_6vkwq!kFw+7?XVpW3o?SO!g^^$v%ZK*{3ij`xM4xpTd~zlO+2HNjAR% z!ZIA|@j)V)`F+ZgeWdrXNjCGEx3W+4M6!?d&cpH!d!epaCi@h|WS_!qASjc43S+WQ zVNCWZjLANQG1;duCi@h|WS_#A>{A$%eF|f;Phm{Oz?*By}TnCw#+lYI(j!@ErO zDdaa%WwKA<_)6H3>{A$%eF|f;Phm{=TlGuGbVNH%a#5vShFF9!9d9H1nFbvQP9xvTyLlcSW*evQJ@5 z_9=|XK7}#ar!Xe_6vkwq!kFw+7?XVpW3o?SO!g^^$v%ZK*{3ij`xM4xpTe`TXP3!7 zg)!NuFedvX$t{z8LUOP3PC}+6x!0E^_kM2&q|!+{A$%eUjvs$vz>un>;>mEy)$xC%H6u)mwyAI%(!HZ)Kn8iR8ZPrMn}!G1;f^Y`B-n zK7}#ar!Xe_6vkwq!kFw+7?XVpW3o?S2VQzavQOc19(F!6>x1_%gdehs7Rf$^G1;du zCi@h|WS_#A>{A$%eF|f;Pm{A$%eF|f;PeNWM`vme|yxU6TBKsude|dw@?xe|+x3W+41i7!jz?(28`y}9H zvQGf_bZV#K$h1*q5b!|r&U`0LoIG!{gX|MM0iMyr@FtAOJ_&f4>=VFi^id^nk$n>I ztZt5WCrzBZm3^Woz?=VG7=qKPQb0V@&0^U-ef_5iOoV=BNq9?#R z=!TsE&U=vDNcKsYT$$_>$b0DbO5`H@B;Lr$Lj2_zq3JVCy< z=JWAkO!i60BiW}gCi^7hWwK8o-&4O?A{W^wAs?q_qTNZ8CvRn+=n3+Px~?b4W3o>| zUMBkl@B=k(pOuk`?2~{Ws=qYg#K~LPCwc<>NWGNcG1;dupT+Pa*{3ij`y}LLvQHpC zT;Ek97uhEvpP`4N-AR)tZ)Kn83GzAmTf7NlvQGkDCi?{N<1}ymm63_;lYpP3Hyd!` zZ@C9F)?2~|($vy%665SD= z0xq&o0=`1OZNQ0>x3W+41o&z_ncy+mCjl>$eFFH^dSMA%WS<258r>W1`2G*Cc`N%w zPk`U7AHkb2Ci^7dWwK8IU#CBSr$jEYPXd0MUXFGrO`N=yeWEA8@72wF0X!!AB;aMT zPXNDL_lKu|i|mttZ`A)W;Ka#W*(Z7e{84=h!B6LbGm?E0@G{vafIp(IEP;#clYnp5 zd!yY+6DMzFpXdqjXZ34%6V4)dB>N=bWwK8I->QFwr$jEYPXhjez6I^L=^3wiEBi!G zfWNML^al7;f=9AX0$wKj1n^h&cz6o9$UX`9Te=eMPMSD*EBi!GfPbi$;7u5leG>4G z<)~YSO#%MCz7w7TF0xMo{)s*U?M|9Fc`N%wPk?`;zrmX@Ci^7dWwK8I|4OHKD}syc zlYoD(A2;B{$y?bcdIJ1cy$9Ze4NOZU`y}9HvQGg2Mb9XKi|mtt|Do&Aj$6R-nxCHo z&Y#8;;GTa2!Fv)sl6?~JGTA49yZ+N9a8u571U%u-HQ>a_TiGXi0=&kr>jUtZ>{A$% zeG;-V*(Z=y`MY9EnFEo160%zVEkj1!yp?^TC&-%m>q!=qeF|f;Phm{3U_9=|XKFQTjnd}qD_x4{0l8}q+laTM{ zPe;3xCQshVKG758hxj}14)U1nlaNo61;*>XnCz2~PnLcU&>)}aj{}mBi|mt-Pw_uD zdU?KZNPmo{icNhTjnCz2~ zN3u_0O!i60%VeKGzQi8^BpJELJ_-3{{yT=8Jb5eoL{E^f@~i; zxOpr4M9=Mv>{G`Pcr??>J{^O57@b-x`?MK`uC=mHO{?$-TCJ6Rngye(_ER6Zf7Rat zBU5W-pZG(bb+v!9=XL)$7=>CZ`}7oy=CxM#sU@bZzShb<&4JOb*2+F@h0&?j%0AWO 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
+ +03000700 : + +dead_loop: + j dead_loop + 3000700: 0000006f j 3000700 + +Disassembly of section .text: + +03000704 : + * @brief Chip Init Fail Process, deadloop if Chip Init fail + * @param None + * @retval None + */ +static inline void Chip_InitFail(void) +{ + 3000704: 1141 addi sp,sp,-16 + 3000706: c622 sw s0,12(sp) + 3000708: 0800 addi s0,sp,16 + while (1) { + 300070a: a001 j 300070a + +0300070c : + * @brief Chip Init + * @param None + * @retval None + */ +void Chip_Init(void) +{ + 300070c: 1101 addi sp,sp,-32 + 300070e: ce06 sw ra,28(sp) + 3000710: cc22 sw s0,24(sp) + 3000712: 1000 addi s0,sp,32 + CRG_CoreClkSelect coreClkSelect; + /* Config CRG */ + if (CRG_Config(&coreClkSelect) != BASE_STATUS_OK) { + 3000714: fec40793 addi a5,s0,-20 + 3000718: 853e mv a0,a5 + 300071a: 614050ef jal ra,3005d2e + 300071e: 87aa mv a5,a0 + 3000720: c391 beqz a5,3000724 + Chip_InitFail(); + 3000722: 37cd jal ra,3000704 + } + + /* Config FLASH Clock */ + FLASH_ClockConfig(coreClkSelect); + 3000724: fec42783 lw a5,-20(s0) + 3000728: 853e mv a0,a5 + 300072a: 796000ef jal ra,3000ec0 + SYSTICK_Init(); + 300072e: 057000ef jal ra,3000f84 + /* Set CoreClock Select after FLASH Config Done */ + CRG_SetCoreClockSelect(coreClkSelect); + 3000732: fec42783 lw a5,-20(s0) + 3000736: 853e mv a0,a5 + 3000738: 25b1 jal ra,3000d84 + + IRQ_Init(); + 300073a: 459010ef jal ra,3002392 + ANAVREF_Init(); + 300073e: 23e5 jal ra,3000d26 + ANATRIM_Entry(); + 3000740: 2b51 jal ra,3000cd4 + /* User Add Code Here */ + 3000742: 0001 nop + 3000744: 40f2 lw ra,28(sp) + 3000746: 4462 lw s0,24(sp) + 3000748: 6105 addi sp,sp,32 + 300074a: 8082 ret + +0300074c : + * @brief Calculate the conversion gain of the tsensor. + * @param data, original data. + * @retval None + */ +static void CalculateGain(unsigned int data) +{ + 300074c: 1101 addi sp,sp,-32 + 300074e: ce22 sw s0,28(sp) + 3000750: 1000 addi s0,sp,32 + 3000752: fea42623 sw a0,-20(s0) + g_tsensorGain = ((float)(data) / 10000000.0f); + 3000756: fec42783 lw a5,-20(s0) + 300075a: d017f753 fcvt.s.wu fa4,a5 + 300075e: 030067b7 lui a5,0x3006 + 3000762: 5887a787 flw fa5,1416(a5) # 3006588 <__rodata_start> + 3000766: 18f777d3 fdiv.s fa5,fa4,fa5 + 300076a: 040007b7 lui a5,0x4000 + 300076e: 02f7a027 fsw fa5,32(a5) # 4000020 +} + 3000772: 0001 nop + 3000774: 4472 lw s0,28(sp) + 3000776: 6105 addi sp,sp,32 + 3000778: 8082 ret + +0300077a : + * @brief Obtains the chip ID. + * @param None + * @retval None + */ +static bool CHIP_GetInfo(void) +{ + 300077a: 7179 addi sp,sp,-48 + 300077c: d606 sw ra,44(sp) + 300077e: d422 sw s0,40(sp) + 3000780: 1800 addi s0,sp,48 + FOTP_INFO_RGN0_NUMBER_4 emptyData; + FOTP_INFO_RGN0_NUMBER_2 idData; + FOTP_InfoGet(FOTP_INFO_RNG0, 4U, (void *)&emptyData.comData); /* 4 is the number of fotp_empty_flag in otp */ + 3000782: fe040793 addi a5,s0,-32 + 3000786: 863e mv a2,a5 + 3000788: 4591 li a1,4 + 300078a: 4501 li a0,0 + 300078c: 2391 jal ra,3000cd0 + FOTP_InfoGet(FOTP_INFO_RNG0, 2U, (void *)&idData.comData); /* 2 is the number of idData in otp */ + 300078e: fd040793 addi a5,s0,-48 + 3000792: 863e mv a2,a5 + 3000794: 4589 li a1,2 + 3000796: 4501 li a0,0 + 3000798: 2b25 jal ra,3000cd0 + if (emptyData.REG.fotp_empty_flag != 0x5AA59669 || idData.REG.chip_id == 0xFFFFFFFF) { + 300079a: fe042703 lw a4,-32(s0) + 300079e: 5aa597b7 lui a5,0x5aa59 + 30007a2: 66978793 addi a5,a5,1641 # 5aa59669 + 30007a6: 00f71763 bne a4,a5,30007b4 + 30007aa: fd042703 lw a4,-48(s0) + 30007ae: 57fd li a5,-1 + 30007b0: 00f71463 bne a4,a5,30007b8 + return false; + 30007b4: 4781 li a5,0 + 30007b6: a011 j 30007ba + } + return true; + 30007b8: 4785 li a5,1 +} + 30007ba: 853e mv a0,a5 + 30007bc: 50b2 lw ra,44(sp) + 30007be: 5422 lw s0,40(sp) + 30007c0: 6145 addi sp,sp,48 + 30007c2: 8082 ret + +030007c4 : + * @brief Analog module trim. + * @param None + * @retval None + */ +static void CHIP_AnalogTrim(void) +{ + 30007c4: 711d addi sp,sp,-96 + 30007c6: ce86 sw ra,92(sp) + 30007c8: cca2 sw s0,88(sp) + 30007ca: 1080 addi s0,sp,96 + FOTP_INFO_RGN0_NUMBER_20 trimData20; + FOTP_InfoGet(FOTP_INFO_RNG0, 20U, (void *)&trimData20.comData); /* 20 is the number of trim data in otp */ + 30007cc: fdc40793 addi a5,s0,-36 + 30007d0: 863e mv a2,a5 + 30007d2: 45d1 li a1,20 + 30007d4: 4501 li a0,0 + 30007d6: 29ed jal ra,3000cd0 + /* VREF */ + VREF->VREF_TRIM0.BIT.da_iref_trim = trimData20.REG.data0.da_iref_trim; + 30007d8: 18100737 lui a4,0x18100 + 30007dc: fdc42783 lw a5,-36(s0) + 30007e0: 83c1 srli a5,a5,0x10 + 30007e2: 9bfd andi a5,a5,-1 + 30007e4: 0ff7f693 andi a3,a5,255 + 30007e8: 433c lw a5,64(a4) + 30007ea: 0ff6f693 andi a3,a3,255 + 30007ee: f007f793 andi a5,a5,-256 + 30007f2: 8fd5 or a5,a5,a3 + 30007f4: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vref_trim = trimData20.REG.data0.da_ref_vref_trim; + 30007f6: 18100737 lui a4,0x18100 + 30007fa: fdc42783 lw a5,-36(s0) + 30007fe: 83a1 srli a5,a5,0x8 + 3000800: 9bfd andi a5,a5,-1 + 3000802: 0ff7f693 andi a3,a5,255 + 3000806: 433c lw a5,64(a4) + 3000808: 0ff6f693 andi a3,a3,255 + 300080c: 06a2 slli a3,a3,0x8 + 300080e: 7641 lui a2,0xffff0 + 3000810: 0ff60613 addi a2,a2,255 # ffff00ff + 3000814: 8ff1 and a5,a5,a2 + 3000816: 8fd5 or a5,a5,a3 + 3000818: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vbg_trim = trimData20.REG.data0.da_ref_vbg_trim; + 300081a: 18100737 lui a4,0x18100 + 300081e: fdc42783 lw a5,-36(s0) + 3000822: 0ff7f693 andi a3,a5,255 + 3000826: 433c lw a5,64(a4) + 3000828: 0ff6f693 andi a3,a3,255 + 300082c: 06c2 slli a3,a3,0x10 + 300082e: ff010637 lui a2,0xff010 + 3000832: 167d addi a2,a2,-1 # ff00ffff + 3000834: 8ff1 and a5,a5,a2 + 3000836: 8fd5 or a5,a5,a3 + 3000838: c33c sw a5,64(a4) + unsigned int value = trimData20.REG.data1.da_ref_temp_trim3; + 300083a: fe042783 lw a5,-32(s0) + 300083e: 83c1 srli a5,a5,0x10 + 3000840: 9bfd andi a5,a5,-1 + 3000842: 9f81 uxtb a5 + 3000844: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim2 << 8U); /* Shift left by 8 bits */ + 3000848: fe042783 lw a5,-32(s0) + 300084c: 83a1 srli a5,a5,0x8 + 300084e: 9bfd andi a5,a5,-1 + 3000850: 9f81 uxtb a5 + 3000852: 07a2 slli a5,a5,0x8 + 3000854: 873e mv a4,a5 + 3000856: fec42783 lw a5,-20(s0) + 300085a: 8fd9 or a5,a5,a4 + 300085c: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim1 << 16U); /* Shift left by 16 bits */ + 3000860: fe042783 lw a5,-32(s0) + 3000864: 9f81 uxtb a5 + 3000866: 07c2 slli a5,a5,0x10 + 3000868: 873e mv a4,a5 + 300086a: fec42783 lw a5,-20(s0) + 300086e: 8fd9 or a5,a5,a4 + 3000870: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data0.da_ref_temp_trim0 << 24U); /* Shift left by 24 bits */ + 3000874: fdc42783 lw a5,-36(s0) + 3000878: 83e1 srli a5,a5,0x18 + 300087a: 9f81 uxtb a5 + 300087c: 07e2 slli a5,a5,0x18 + 300087e: 873e mv a4,a5 + 3000880: fec42783 lw a5,-20(s0) + 3000884: 8fd9 or a5,a5,a4 + 3000886: fef42623 sw a5,-20(s0) + VREF->VREF_TRIM1.reg = value; + 300088a: 181007b7 lui a5,0x18100 + 300088e: fec42703 lw a4,-20(s0) + 3000892: c3f8 sw a4,68(a5) + + FOTP_INFO_RGN0_NUMBER_21 trimData21; + FOTP_InfoGet(FOTP_INFO_RNG0, 21U, (void *)&trimData21.comData); /* 21 is the number of trim data in otp */ + 3000894: fcc40793 addi a5,s0,-52 + 3000898: 863e mv a2,a5 + 300089a: 45d5 li a1,21 + 300089c: 4501 li a0,0 + 300089e: 290d jal ra,3000cd0 + /* ADC */ + ADC0->ADC_OEGE_TRIM.BIT.cfg_gain_cali_trim = trimData21.REG.data1.saradc_gain; + 30008a0: 18000737 lui a4,0x18000 + 30008a4: fd042783 lw a5,-48(s0) + 30008a8: 86be mv a3,a5 + 30008aa: 6789 lui a5,0x2 + 30008ac: 17fd addi a5,a5,-1 # 1fff + 30008ae: 8ff5 and a5,a5,a3 + 30008b0: 01079613 slli a2,a5,0x10 + 30008b4: 8241 srli a2,a2,0x10 + 30008b6: 6785 lui a5,0x1 + 30008b8: 973e add a4,a4,a5 + 30008ba: 80872783 lw a5,-2040(a4) # 17fff808 + 30008be: 6689 lui a3,0x2 + 30008c0: 16fd addi a3,a3,-1 # 1fff + 30008c2: 8ef1 and a3,a3,a2 + 30008c4: 06c2 slli a3,a3,0x10 + 30008c6: e0010637 lui a2,0xe0010 + 30008ca: 167d addi a2,a2,-1 # e000ffff + 30008cc: 8ff1 and a5,a5,a2 + 30008ce: 8fd5 or a5,a5,a3 + 30008d0: 80f72423 sw a5,-2040(a4) + ADC0->ADC_OEGE_TRIM.BIT.cfg_ofst_cali_trim = trimData21.REG.data1.saradc_offset; + 30008d4: 18000737 lui a4,0x18000 + 30008d8: fd042783 lw a5,-48(s0) + 30008dc: 83c1 srli a5,a5,0x10 + 30008de: 86be mv a3,a5 + 30008e0: 6785 lui a5,0x1 + 30008e2: 17fd addi a5,a5,-1 # fff + 30008e4: 8ff5 and a5,a5,a3 + 30008e6: 01079613 slli a2,a5,0x10 + 30008ea: 8241 srli a2,a2,0x10 + 30008ec: 6785 lui a5,0x1 + 30008ee: 973e add a4,a4,a5 + 30008f0: 80872783 lw a5,-2040(a4) # 17fff808 + 30008f4: 6685 lui a3,0x1 + 30008f6: 16fd addi a3,a3,-1 # fff + 30008f8: 8ef1 and a3,a3,a2 + 30008fa: 767d lui a2,0xfffff + 30008fc: 8ff1 and a5,a5,a2 + 30008fe: 8fd5 or a5,a5,a3 + 3000900: 80f72423 sw a5,-2040(a4) + + /* TSENSOR */ + TSENSOR->TSENSOR_TRIM.reg = trimData20.REG.data1.da_ref_vptat_trim; + 3000904: fe042783 lw a5,-32(s0) + 3000908: 83e1 srli a5,a5,0x18 + 300090a: 0ff7f713 andi a4,a5,255 + 300090e: 185007b7 lui a5,0x18500 + 3000912: cb98 sw a4,16(a5) + ADC0->ADC_TSENSOR_TRIM.BIT.cfg_tsensor_ofst_trim = trimData21.REG.data2.ts_offset; + 3000914: 18000737 lui a4,0x18000 + 3000918: fd442783 lw a5,-44(s0) + 300091c: 86be mv a3,a5 + 300091e: 6785 lui a5,0x1 + 3000920: 17fd addi a5,a5,-1 # fff + 3000922: 8ff5 and a5,a5,a3 + 3000924: 01079613 slli a2,a5,0x10 + 3000928: 8241 srli a2,a2,0x10 + 300092a: 6785 lui a5,0x1 + 300092c: 973e add a4,a4,a5 + 300092e: 80472783 lw a5,-2044(a4) # 17fff804 + 3000932: 6685 lui a3,0x1 + 3000934: 16fd addi a3,a3,-1 # fff + 3000936: 8ef1 and a3,a3,a2 + 3000938: 767d lui a2,0xfffff + 300093a: 8ff1 and a5,a5,a2 + 300093c: 8fd5 or a5,a5,a3 + 300093e: 80f72223 sw a5,-2044(a4) + CalculateGain(trimData21.REG.data3.ts_gain); + 3000942: fd842783 lw a5,-40(s0) + 3000946: 83a5 srli a5,a5,0x9 + 3000948: 853e mv a0,a5 + 300094a: 3509 jal ra,300074c + + /* PGA */ + PGA0->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga0_vos_trim; + 300094c: 18200737 lui a4,0x18200 + 3000950: fcc42783 lw a5,-52(s0) + 3000954: 1ff7f793 andi a5,a5,511 + 3000958: 01079693 slli a3,a5,0x10 + 300095c: 82c1 srli a3,a3,0x10 + 300095e: 531c lw a5,32(a4) + 3000960: 1ff6f693 andi a3,a3,511 + 3000964: e007f793 andi a5,a5,-512 + 3000968: 8fd5 or a5,a5,a3 + 300096a: d31c sw a5,32(a4) + PGA1->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga1_vos_trim; + 300096c: 18201737 lui a4,0x18201 + 3000970: fcc42783 lw a5,-52(s0) + 3000974: 83c1 srli a5,a5,0x10 + 3000976: 1ff7f793 andi a5,a5,511 + 300097a: 01079693 slli a3,a5,0x10 + 300097e: 82c1 srli a3,a3,0x10 + 3000980: 531c lw a5,32(a4) + 3000982: 1ff6f693 andi a3,a3,511 + 3000986: e007f793 andi a5,a5,-512 + 300098a: 8fd5 or a5,a5,a3 + 300098c: d31c sw a5,32(a4) + + FOTP_INFO_RGN0_NUMBER_22 trimData22; + FOTP_InfoGet(FOTP_INFO_RNG0, 22U, (void *)&trimData22.comData); /* 22 is the number of trim data in otp */ + 300098e: fbc40793 addi a5,s0,-68 + 3000992: 863e mv a2,a5 + 3000994: 45d9 li a1,22 + 3000996: 4501 li a0,0 + 3000998: 257d jal ra,3001046 + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_gain_trim2 = trimData22.REG.data0.pga0_gain2; + 300099a: 18000737 lui a4,0x18000 + 300099e: fbc42783 lw a5,-68(s0) + 30009a2: 86be mv a3,a5 + 30009a4: 6789 lui a5,0x2 + 30009a6: 17fd addi a5,a5,-1 # 1fff + 30009a8: 8ff5 and a5,a5,a3 + 30009aa: 01079613 slli a2,a5,0x10 + 30009ae: 8241 srli a2,a2,0x10 + 30009b0: 6785 lui a5,0x1 + 30009b2: 973e add a4,a4,a5 + 30009b4: 81472783 lw a5,-2028(a4) # 17fff814 + 30009b8: 6689 lui a3,0x2 + 30009ba: 16fd addi a3,a3,-1 # 1fff + 30009bc: 8ef1 and a3,a3,a2 + 30009be: 06c2 slli a3,a3,0x10 + 30009c0: e0010637 lui a2,0xe0010 + 30009c4: 167d addi a2,a2,-1 # e000ffff + 30009c6: 8ff1 and a5,a5,a2 + 30009c8: 8fd5 or a5,a5,a3 + 30009ca: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_ofst_trim2 = trimData22.REG.data0.pga0_offset2; + 30009ce: 18000737 lui a4,0x18000 + 30009d2: fbc42783 lw a5,-68(s0) + 30009d6: 83c1 srli a5,a5,0x10 + 30009d8: 86be mv a3,a5 + 30009da: 6785 lui a5,0x1 + 30009dc: 17fd addi a5,a5,-1 # fff + 30009de: 8ff5 and a5,a5,a3 + 30009e0: 01079613 slli a2,a5,0x10 + 30009e4: 8241 srli a2,a2,0x10 + 30009e6: 6785 lui a5,0x1 + 30009e8: 973e add a4,a4,a5 + 30009ea: 81472783 lw a5,-2028(a4) # 17fff814 + 30009ee: 6685 lui a3,0x1 + 30009f0: 16fd addi a3,a3,-1 # fff + 30009f2: 8ef1 and a3,a3,a2 + 30009f4: 767d lui a2,0xfffff + 30009f6: 8ff1 and a5,a5,a2 + 30009f8: 8fd5 or a5,a5,a3 + 30009fa: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_gain_trim4 = trimData22.REG.data1.pga0_gain4; + 30009fe: 18000737 lui a4,0x18000 + 3000a02: fc042783 lw a5,-64(s0) + 3000a06: 86be mv a3,a5 + 3000a08: 6789 lui a5,0x2 + 3000a0a: 17fd addi a5,a5,-1 # 1fff + 3000a0c: 8ff5 and a5,a5,a3 + 3000a0e: 01079613 slli a2,a5,0x10 + 3000a12: 8241 srli a2,a2,0x10 + 3000a14: 6785 lui a5,0x1 + 3000a16: 973e add a4,a4,a5 + 3000a18: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a1c: 6689 lui a3,0x2 + 3000a1e: 16fd addi a3,a3,-1 # 1fff + 3000a20: 8ef1 and a3,a3,a2 + 3000a22: 06c2 slli a3,a3,0x10 + 3000a24: e0010637 lui a2,0xe0010 + 3000a28: 167d addi a2,a2,-1 # e000ffff + 3000a2a: 8ff1 and a5,a5,a2 + 3000a2c: 8fd5 or a5,a5,a3 + 3000a2e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_ofst_trim4 = trimData22.REG.data1.pga0_offset4; + 3000a32: 18000737 lui a4,0x18000 + 3000a36: fc042783 lw a5,-64(s0) + 3000a3a: 83c1 srli a5,a5,0x10 + 3000a3c: 86be mv a3,a5 + 3000a3e: 6785 lui a5,0x1 + 3000a40: 17fd addi a5,a5,-1 # fff + 3000a42: 8ff5 and a5,a5,a3 + 3000a44: 01079613 slli a2,a5,0x10 + 3000a48: 8241 srli a2,a2,0x10 + 3000a4a: 6785 lui a5,0x1 + 3000a4c: 973e add a4,a4,a5 + 3000a4e: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a52: 6685 lui a3,0x1 + 3000a54: 16fd addi a3,a3,-1 # fff + 3000a56: 8ef1 and a3,a3,a2 + 3000a58: 767d lui a2,0xfffff + 3000a5a: 8ff1 and a5,a5,a2 + 3000a5c: 8fd5 or a5,a5,a3 + 3000a5e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_gain_trim8 = trimData22.REG.data2.pga0_gain8; + 3000a62: 18000737 lui a4,0x18000 + 3000a66: fc442783 lw a5,-60(s0) + 3000a6a: 86be mv a3,a5 + 3000a6c: 6789 lui a5,0x2 + 3000a6e: 17fd addi a5,a5,-1 # 1fff + 3000a70: 8ff5 and a5,a5,a3 + 3000a72: 01079613 slli a2,a5,0x10 + 3000a76: 8241 srli a2,a2,0x10 + 3000a78: 6785 lui a5,0x1 + 3000a7a: 973e add a4,a4,a5 + 3000a7c: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000a80: 6689 lui a3,0x2 + 3000a82: 16fd addi a3,a3,-1 # 1fff + 3000a84: 8ef1 and a3,a3,a2 + 3000a86: 06c2 slli a3,a3,0x10 + 3000a88: e0010637 lui a2,0xe0010 + 3000a8c: 167d addi a2,a2,-1 # e000ffff + 3000a8e: 8ff1 and a5,a5,a2 + 3000a90: 8fd5 or a5,a5,a3 + 3000a92: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_ofst_trim8 = trimData22.REG.data2.pga0_offset8; + 3000a96: 18000737 lui a4,0x18000 + 3000a9a: fc442783 lw a5,-60(s0) + 3000a9e: 83c1 srli a5,a5,0x10 + 3000aa0: 86be mv a3,a5 + 3000aa2: 6785 lui a5,0x1 + 3000aa4: 17fd addi a5,a5,-1 # fff + 3000aa6: 8ff5 and a5,a5,a3 + 3000aa8: 01079613 slli a2,a5,0x10 + 3000aac: 8241 srli a2,a2,0x10 + 3000aae: 6785 lui a5,0x1 + 3000ab0: 973e add a4,a4,a5 + 3000ab2: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000ab6: 6685 lui a3,0x1 + 3000ab8: 16fd addi a3,a3,-1 # fff + 3000aba: 8ef1 and a3,a3,a2 + 3000abc: 767d lui a2,0xfffff + 3000abe: 8ff1 and a5,a5,a2 + 3000ac0: 8fd5 or a5,a5,a3 + 3000ac2: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_gain_trim16 = trimData22.REG.data3.pga0_gain16; + 3000ac6: 18000737 lui a4,0x18000 + 3000aca: fc842783 lw a5,-56(s0) + 3000ace: 86be mv a3,a5 + 3000ad0: 6789 lui a5,0x2 + 3000ad2: 17fd addi a5,a5,-1 # 1fff + 3000ad4: 8ff5 and a5,a5,a3 + 3000ad6: 01079613 slli a2,a5,0x10 + 3000ada: 8241 srli a2,a2,0x10 + 3000adc: 6785 lui a5,0x1 + 3000ade: 973e add a4,a4,a5 + 3000ae0: 82072783 lw a5,-2016(a4) # 17fff820 + 3000ae4: 6689 lui a3,0x2 + 3000ae6: 16fd addi a3,a3,-1 # 1fff + 3000ae8: 8ef1 and a3,a3,a2 + 3000aea: 06c2 slli a3,a3,0x10 + 3000aec: e0010637 lui a2,0xe0010 + 3000af0: 167d addi a2,a2,-1 # e000ffff + 3000af2: 8ff1 and a5,a5,a2 + 3000af4: 8fd5 or a5,a5,a3 + 3000af6: 82f72023 sw a5,-2016(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_ofst_trim16 = trimData22.REG.data3.pga0_offset16; + 3000afa: 18000737 lui a4,0x18000 + 3000afe: fc842783 lw a5,-56(s0) + 3000b02: 83c1 srli a5,a5,0x10 + 3000b04: 86be mv a3,a5 + 3000b06: 6785 lui a5,0x1 + 3000b08: 17fd addi a5,a5,-1 # fff + 3000b0a: 8ff5 and a5,a5,a3 + 3000b0c: 01079613 slli a2,a5,0x10 + 3000b10: 8241 srli a2,a2,0x10 + 3000b12: 6785 lui a5,0x1 + 3000b14: 973e add a4,a4,a5 + 3000b16: 82072783 lw a5,-2016(a4) # 17fff820 + 3000b1a: 6685 lui a3,0x1 + 3000b1c: 16fd addi a3,a3,-1 # fff + 3000b1e: 8ef1 and a3,a3,a2 + 3000b20: 767d lui a2,0xfffff + 3000b22: 8ff1 and a5,a5,a2 + 3000b24: 8fd5 or a5,a5,a3 + 3000b26: 82f72023 sw a5,-2016(a4) + + FOTP_INFO_RGN0_NUMBER_23 trimData23; + FOTP_InfoGet(FOTP_INFO_RNG0, 23U, (void *)&trimData23.comData); /* 23 is the number of trim data in otp */ + 3000b2a: fac40793 addi a5,s0,-84 + 3000b2e: 863e mv a2,a5 + 3000b30: 45dd li a1,23 + 3000b32: 4501 li a0,0 + 3000b34: 2b09 jal ra,3001046 + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_gain_trim2 = trimData23.REG.data0.pga1_gain2; + 3000b36: 18000737 lui a4,0x18000 + 3000b3a: fac42783 lw a5,-84(s0) + 3000b3e: 86be mv a3,a5 + 3000b40: 6789 lui a5,0x2 + 3000b42: 17fd addi a5,a5,-1 # 1fff + 3000b44: 8ff5 and a5,a5,a3 + 3000b46: 01079613 slli a2,a5,0x10 + 3000b4a: 8241 srli a2,a2,0x10 + 3000b4c: 6785 lui a5,0x1 + 3000b4e: 973e add a4,a4,a5 + 3000b50: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b54: 6689 lui a3,0x2 + 3000b56: 16fd addi a3,a3,-1 # 1fff + 3000b58: 8ef1 and a3,a3,a2 + 3000b5a: 06c2 slli a3,a3,0x10 + 3000b5c: e0010637 lui a2,0xe0010 + 3000b60: 167d addi a2,a2,-1 # e000ffff + 3000b62: 8ff1 and a5,a5,a2 + 3000b64: 8fd5 or a5,a5,a3 + 3000b66: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_ofst_trim2 = trimData23.REG.data0.pga1_offset2; + 3000b6a: 18000737 lui a4,0x18000 + 3000b6e: fac42783 lw a5,-84(s0) + 3000b72: 83c1 srli a5,a5,0x10 + 3000b74: 86be mv a3,a5 + 3000b76: 6785 lui a5,0x1 + 3000b78: 17fd addi a5,a5,-1 # fff + 3000b7a: 8ff5 and a5,a5,a3 + 3000b7c: 01079613 slli a2,a5,0x10 + 3000b80: 8241 srli a2,a2,0x10 + 3000b82: 6785 lui a5,0x1 + 3000b84: 973e add a4,a4,a5 + 3000b86: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b8a: 6685 lui a3,0x1 + 3000b8c: 16fd addi a3,a3,-1 # fff + 3000b8e: 8ef1 and a3,a3,a2 + 3000b90: 767d lui a2,0xfffff + 3000b92: 8ff1 and a5,a5,a2 + 3000b94: 8fd5 or a5,a5,a3 + 3000b96: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_gain_trim4 = trimData23.REG.data1.pga1_gain4; + 3000b9a: 18000737 lui a4,0x18000 + 3000b9e: fb042783 lw a5,-80(s0) + 3000ba2: 86be mv a3,a5 + 3000ba4: 6789 lui a5,0x2 + 3000ba6: 17fd addi a5,a5,-1 # 1fff + 3000ba8: 8ff5 and a5,a5,a3 + 3000baa: 01079613 slli a2,a5,0x10 + 3000bae: 8241 srli a2,a2,0x10 + 3000bb0: 6785 lui a5,0x1 + 3000bb2: 973e add a4,a4,a5 + 3000bb4: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bb8: 6689 lui a3,0x2 + 3000bba: 16fd addi a3,a3,-1 # 1fff + 3000bbc: 8ef1 and a3,a3,a2 + 3000bbe: 06c2 slli a3,a3,0x10 + 3000bc0: e0010637 lui a2,0xe0010 + 3000bc4: 167d addi a2,a2,-1 # e000ffff + 3000bc6: 8ff1 and a5,a5,a2 + 3000bc8: 8fd5 or a5,a5,a3 + 3000bca: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_ofst_trim4 = trimData23.REG.data1.pga1_offset4; + 3000bce: 18000737 lui a4,0x18000 + 3000bd2: fb042783 lw a5,-80(s0) + 3000bd6: 83c1 srli a5,a5,0x10 + 3000bd8: 86be mv a3,a5 + 3000bda: 6785 lui a5,0x1 + 3000bdc: 17fd addi a5,a5,-1 # fff + 3000bde: 8ff5 and a5,a5,a3 + 3000be0: 01079613 slli a2,a5,0x10 + 3000be4: 8241 srli a2,a2,0x10 + 3000be6: 6785 lui a5,0x1 + 3000be8: 973e add a4,a4,a5 + 3000bea: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bee: 6685 lui a3,0x1 + 3000bf0: 16fd addi a3,a3,-1 # fff + 3000bf2: 8ef1 and a3,a3,a2 + 3000bf4: 767d lui a2,0xfffff + 3000bf6: 8ff1 and a5,a5,a2 + 3000bf8: 8fd5 or a5,a5,a3 + 3000bfa: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_gain_trim8 = trimData23.REG.data2.pga1_gain8; + 3000bfe: 18000737 lui a4,0x18000 + 3000c02: fb442783 lw a5,-76(s0) + 3000c06: 86be mv a3,a5 + 3000c08: 6789 lui a5,0x2 + 3000c0a: 17fd addi a5,a5,-1 # 1fff + 3000c0c: 8ff5 and a5,a5,a3 + 3000c0e: 01079613 slli a2,a5,0x10 + 3000c12: 8241 srli a2,a2,0x10 + 3000c14: 6785 lui a5,0x1 + 3000c16: 973e add a4,a4,a5 + 3000c18: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c1c: 6689 lui a3,0x2 + 3000c1e: 16fd addi a3,a3,-1 # 1fff + 3000c20: 8ef1 and a3,a3,a2 + 3000c22: 06c2 slli a3,a3,0x10 + 3000c24: e0010637 lui a2,0xe0010 + 3000c28: 167d addi a2,a2,-1 # e000ffff + 3000c2a: 8ff1 and a5,a5,a2 + 3000c2c: 8fd5 or a5,a5,a3 + 3000c2e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_ofst_trim8 = trimData23.REG.data2.pga1_offset8; + 3000c32: 18000737 lui a4,0x18000 + 3000c36: fb442783 lw a5,-76(s0) + 3000c3a: 83c1 srli a5,a5,0x10 + 3000c3c: 86be mv a3,a5 + 3000c3e: 6785 lui a5,0x1 + 3000c40: 17fd addi a5,a5,-1 # fff + 3000c42: 8ff5 and a5,a5,a3 + 3000c44: 01079613 slli a2,a5,0x10 + 3000c48: 8241 srli a2,a2,0x10 + 3000c4a: 6785 lui a5,0x1 + 3000c4c: 973e add a4,a4,a5 + 3000c4e: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c52: 6685 lui a3,0x1 + 3000c54: 16fd addi a3,a3,-1 # fff + 3000c56: 8ef1 and a3,a3,a2 + 3000c58: 767d lui a2,0xfffff + 3000c5a: 8ff1 and a5,a5,a2 + 3000c5c: 8fd5 or a5,a5,a3 + 3000c5e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_gain_trim16 = trimData23.REG.data3.pga1_gain16; + 3000c62: 18000737 lui a4,0x18000 + 3000c66: fb842783 lw a5,-72(s0) + 3000c6a: 86be mv a3,a5 + 3000c6c: 6789 lui a5,0x2 + 3000c6e: 17fd addi a5,a5,-1 # 1fff + 3000c70: 8ff5 and a5,a5,a3 + 3000c72: 01079613 slli a2,a5,0x10 + 3000c76: 8241 srli a2,a2,0x10 + 3000c78: 6785 lui a5,0x1 + 3000c7a: 973e add a4,a4,a5 + 3000c7c: 83072783 lw a5,-2000(a4) # 17fff830 + 3000c80: 6689 lui a3,0x2 + 3000c82: 16fd addi a3,a3,-1 # 1fff + 3000c84: 8ef1 and a3,a3,a2 + 3000c86: 06c2 slli a3,a3,0x10 + 3000c88: e0010637 lui a2,0xe0010 + 3000c8c: 167d addi a2,a2,-1 # e000ffff + 3000c8e: 8ff1 and a5,a5,a2 + 3000c90: 8fd5 or a5,a5,a3 + 3000c92: 82f72823 sw a5,-2000(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_ofst_trim16 = trimData23.REG.data3.pga1_offset16; + 3000c96: 18000737 lui a4,0x18000 + 3000c9a: fb842783 lw a5,-72(s0) + 3000c9e: 83c1 srli a5,a5,0x10 + 3000ca0: 86be mv a3,a5 + 3000ca2: 6785 lui a5,0x1 + 3000ca4: 17fd addi a5,a5,-1 # fff + 3000ca6: 8ff5 and a5,a5,a3 + 3000ca8: 01079613 slli a2,a5,0x10 + 3000cac: 8241 srli a2,a2,0x10 + 3000cae: 6785 lui a5,0x1 + 3000cb0: 973e add a4,a4,a5 + 3000cb2: 83072783 lw a5,-2000(a4) # 17fff830 + 3000cb6: 6685 lui a3,0x1 + 3000cb8: 16fd addi a3,a3,-1 # fff + 3000cba: 8ef1 and a3,a3,a2 + 3000cbc: 767d lui a2,0xfffff + 3000cbe: 8ff1 and a5,a5,a2 + 3000cc0: 8fd5 or a5,a5,a3 + 3000cc2: 82f72823 sw a5,-2000(a4) +} + 3000cc6: 0001 nop + 3000cc8: 40f6 lw ra,92(sp) + 3000cca: 4466 lw s0,88(sp) + 3000ccc: 6125 addi sp,sp,96 + 3000cce: 8082 ret + +03000cd0 : + 3000cd0: 3760006f j 3001046 + +03000cd4 : + * @brief Parameter calibration entry of the analog module. + * @param None + * @retval None + */ +void ANATRIM_Entry(void) +{ + 3000cd4: 1141 addi sp,sp,-16 + 3000cd6: c606 sw ra,12(sp) + 3000cd8: c422 sw s0,8(sp) + 3000cda: 0800 addi s0,sp,16 + if (CHIP_GetInfo() == false) { /* If the chip information is incorrect, calibration is not performed */ + 3000cdc: 3c79 jal ra,300077a + 3000cde: 87aa mv a5,a0 + 3000ce0: 0017c793 xori a5,a5,1 + 3000ce4: 9f81 uxtb a5 + 3000ce6: eb9d bnez a5,3000d1c + return; + } + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_ENABLE); /* Enable the clock for calibration */ + 3000ce8: 4585 li a1,1 + 3000cea: 18000537 lui a0,0x18000 + 3000cee: 2849 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_ENABLE); + 3000cf0: 4585 li a1,1 + 3000cf2: 18200537 lui a0,0x18200 + 3000cf6: 2069 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_ENABLE); + 3000cf8: 4585 li a1,1 + 3000cfa: 18201537 lui a0,0x18201 + 3000cfe: 2049 jal ra,3000d80 + CHIP_AnalogTrim(); + 3000d00: 34d1 jal ra,30007c4 + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_DISABLE); /* The clock is disabled after calibration */ + 3000d02: 4581 li a1,0 + 3000d04: 18000537 lui a0,0x18000 + 3000d08: 28a5 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_DISABLE); + 3000d0a: 4581 li a1,0 + 3000d0c: 18200537 lui a0,0x18200 + 3000d10: 2885 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_DISABLE); + 3000d12: 4581 li a1,0 + 3000d14: 18201537 lui a0,0x18201 + 3000d18: 20a5 jal ra,3000d80 + 3000d1a: a011 j 3000d1e + return; + 3000d1c: 0001 nop + 3000d1e: 40b2 lw ra,12(sp) + 3000d20: 4422 lw s0,8(sp) + 3000d22: 0141 addi sp,sp,16 + 3000d24: 8082 ret + +03000d26 : + * @brief Set Crg Core clock select + * @param None + * @retval None + */ +void ANAVREF_Init(void) +{ + 3000d26: 1141 addi sp,sp,-16 + 3000d28: c606 sw ra,12(sp) + 3000d2a: c422 sw s0,8(sp) + 3000d2c: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(VREF_BASE, IP_CLK_ENABLE); + 3000d2e: 4585 li a1,1 + 3000d30: 18100537 lui a0,0x18100 + 3000d34: 20b1 jal ra,3000d80 + VREF->VREF_CTRL1.BIT.da_ref_temp_trim_enh = 0x1; + 3000d36: 18100737 lui a4,0x18100 + 3000d3a: 531c lw a5,32(a4) + 3000d3c: 66c1 lui a3,0x10 + 3000d3e: 8fd5 or a5,a5,a3 + 3000d40: d31c sw a5,32(a4) + VREF->VREF_CTRL0.BIT.da_ref_enh = BASE_CFG_ENABLE; + 3000d42: 18100737 lui a4,0x18100 + 3000d46: 431c lw a5,0(a4) + 3000d48: 0017e793 ori a5,a5,1 + 3000d4c: c31c sw a5,0(a4) + BASE_FUNC_DELAY_US(200); /* delay 200us */ + 3000d4e: 000f47b7 lui a5,0xf4 + 3000d52: 24078593 addi a1,a5,576 # f4240 + 3000d56: 0c800513 li a0,200 + 3000d5a: 20b5 jal ra,3000dc6 + VREF->VREF_CTRL1.BIT.da_ref_chop_enh = BASE_CFG_ENABLE; + 3000d5c: 18100737 lui a4,0x18100 + 3000d60: 531c lw a5,32(a4) + 3000d62: 0017e793 ori a5,a5,1 + 3000d66: d31c sw a5,32(a4) + BASE_FUNC_DELAY_US(40); /* delay 40us */ + 3000d68: 000f47b7 lui a5,0xf4 + 3000d6c: 24078593 addi a1,a5,576 # f4240 + 3000d70: 02800513 li a0,40 + 3000d74: 2889 jal ra,3000dc6 + 3000d76: 0001 nop + 3000d78: 40b2 lw ra,12(sp) + 3000d7a: 4422 lw s0,8(sp) + 3000d7c: 0141 addi sp,sp,16 + 3000d7e: 8082 ret + +03000d80 : + 3000d80: 0b30206f j 3003632 + +03000d84 : + * @brief Set Crg Core clock select + * @param coreClkSelect Input core clock select value + * @retval None + */ +void CRG_SetCoreClockSelect(CRG_CoreClkSelect coreClkSelect) +{ + 3000d84: 715d addi sp,sp,-80 + 3000d86: c686 sw ra,76(sp) + 3000d88: c4a2 sw s0,72(sp) + 3000d8a: 0880 addi s0,sp,80 + 3000d8c: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3000d90: 100007b7 lui a5,0x10000 + 3000d94: fcf42423 sw a5,-56(s0) + crg.coreClkSelect = coreClkSelect; + 3000d98: fbc42783 lw a5,-68(s0) + 3000d9c: fef42023 sw a5,-32(s0) + if (crg.coreClkSelect == CRG_CORE_CLK_SELECT_TCXO) { /* If an external crystal oscillator is selected. */ + 3000da0: fe042703 lw a4,-32(s0) + 3000da4: 4785 li a5,1 + 3000da6: 00f71663 bne a4,a5,3000db2 + BASE_FUNC_DELAY_MS(10); /* 10: delay 10ms, wait clokc stable. */ + 3000daa: 3e800593 li a1,1000 + 3000dae: 4529 li a0,10 + 3000db0: 2819 jal ra,3000dc6 + } + HAL_CRG_SetCoreClockSelect(&crg); + 3000db2: fc840793 addi a5,s0,-56 + 3000db6: 853e mv a0,a5 + 3000db8: 572020ef jal ra,300332a + 3000dbc: 0001 nop + 3000dbe: 40b6 lw ra,76(sp) + 3000dc0: 4426 lw s0,72(sp) + 3000dc2: 6161 addi sp,sp,80 + 3000dc4: 8082 ret + +03000dc6 : + 3000dc6: 5160106f j 30022dc + +03000dca : + * @param frequence frequnce + * @param div Output Divison + * @retval None + */ +static void SetFlashDiv(unsigned int frequency, unsigned int *nreadDiv) +{ + 3000dca: 7179 addi sp,sp,-48 + 3000dcc: d622 sw s0,44(sp) + 3000dce: 1800 addi s0,sp,48 + 3000dd0: fca42e23 sw a0,-36(s0) + 3000dd4: fcb42c23 sw a1,-40(s0) + unsigned int div; + unsigned int freq = frequency; + 3000dd8: fdc42783 lw a5,-36(s0) + 3000ddc: fef42423 sw a5,-24(s0) + /* Get frequency divider of flash. */ + if (freq < FLASH_BASE_FREQ) { + 3000de0: fe842703 lw a4,-24(s0) + 3000de4: 023c37b7 lui a5,0x23c3 + 3000de8: 45f78793 addi a5,a5,1119 # 23c345f + 3000dec: 00e7e863 bltu a5,a4,3000dfc + freq = FLASH_BASE_FREQ; + 3000df0: 023c37b7 lui a5,0x23c3 + 3000df4: 46078793 addi a5,a5,1120 # 23c3460 + 3000df8: fef42423 sw a5,-24(s0) + } + /* Get the flash frequency division based on the frequency. */ + if ((freq % FLASH_BASE_FREQ) == 0) { + 3000dfc: fe842703 lw a4,-24(s0) + 3000e00: 023c37b7 lui a5,0x23c3 + 3000e04: 46078793 addi a5,a5,1120 # 23c3460 + 3000e08: 02f777b3 remu a5,a4,a5 + 3000e0c: ef81 bnez a5,3000e24 + div = freq / FLASH_BASE_FREQ; + 3000e0e: fe842703 lw a4,-24(s0) + 3000e12: 023c37b7 lui a5,0x23c3 + 3000e16: 46078793 addi a5,a5,1120 # 23c3460 + 3000e1a: 02f757b3 divu a5,a4,a5 + 3000e1e: fef42623 sw a5,-20(s0) + 3000e22: a821 j 3000e3a + } else { + div = (freq / FLASH_BASE_FREQ) + 1; + 3000e24: fe842703 lw a4,-24(s0) + 3000e28: 023c37b7 lui a5,0x23c3 + 3000e2c: 46078793 addi a5,a5,1120 # 23c3460 + 3000e30: 02f757b3 divu a5,a4,a5 + 3000e34: 0785 addi a5,a5,1 + 3000e36: fef42623 sw a5,-20(s0) + } + /* Ensure the flash frequency division is valid. */ + if (div > FLASH_MAX_DIV) { + 3000e3a: fec42703 lw a4,-20(s0) + 3000e3e: 4791 li a5,4 + 3000e40: 00e7f563 bgeu a5,a4,3000e4a + div = FLASH_MAX_DIV; + 3000e44: 4791 li a5,4 + 3000e46: fef42623 sw a5,-20(s0) + } + *nreadDiv = div; + 3000e4a: fd842783 lw a5,-40(s0) + 3000e4e: fec42703 lw a4,-20(s0) + 3000e52: c398 sw a4,0(a5) +} + 3000e54: 0001 nop + 3000e56: 5432 lw s0,44(sp) + 3000e58: 6145 addi sp,sp,48 + 3000e5a: 8082 ret + +03000e5c : + * @brief Get the Rounding up value + * @param coreClkSelect Core Clock select + * @retval Frequency of Flash + */ +static unsigned int GetFlashFreq(CRG_CoreClkSelect coreClkSelect) +{ + 3000e5c: 7179 addi sp,sp,-48 + 3000e5e: d606 sw ra,44(sp) + 3000e60: d422 sw s0,40(sp) + 3000e62: 1800 addi s0,sp,48 + 3000e64: fca42e23 sw a0,-36(s0) + unsigned int hclk; + /* Get frequency of flash. */ + switch (coreClkSelect) { + 3000e68: fdc42783 lw a5,-36(s0) + 3000e6c: 4705 li a4,1 + 3000e6e: 02e78063 beq a5,a4,3000e8e + 3000e72: 4705 li a4,1 + 3000e74: 00e7e663 bltu a5,a4,3000e80 + 3000e78: 4709 li a4,2 + 3000e7a: 02e78163 beq a5,a4,3000e9c + 3000e7e: a025 j 3000ea6 + case CRG_CORE_CLK_SELECT_HOSC: + hclk = HOSC_FREQ; + 3000e80: 017d87b7 lui a5,0x17d8 + 3000e84: 84078793 addi a5,a5,-1984 # 17d7840 + 3000e88: fef42623 sw a5,-20(s0) + break; + 3000e8c: a01d j 3000eb2 + case CRG_CORE_CLK_SELECT_TCXO: + hclk = XTRAIL_FREQ; + 3000e8e: 01c9c7b7 lui a5,0x1c9c + 3000e92: 38078793 addi a5,a5,896 # 1c9c380 + 3000e96: fef42623 sw a5,-20(s0) + break; + 3000e9a: a821 j 3000eb2 + case CRG_CORE_CLK_SELECT_PLL: + hclk = HAL_CRG_GetPllFreq(); + 3000e9c: 5b0020ef jal ra,300344c + 3000ea0: fea42623 sw a0,-20(s0) + break; + 3000ea4: a039 j 3000eb2 + default: + hclk = LOSC_FREQ; + 3000ea6: 67a1 lui a5,0x8 + 3000ea8: d0078793 addi a5,a5,-768 # 7d00 + 3000eac: fef42623 sw a5,-20(s0) + break; + 3000eb0: 0001 nop + } + return hclk; + 3000eb2: fec42783 lw a5,-20(s0) +} + 3000eb6: 853e mv a0,a5 + 3000eb8: 50b2 lw ra,44(sp) + 3000eba: 5422 lw s0,40(sp) + 3000ebc: 6145 addi sp,sp,48 + 3000ebe: 8082 ret + +03000ec0 : + * @brief Set flash clock frequence base on hclk + * @param coreClkSelect core clock select + * @retval None + */ +void FLASH_ClockConfig(CRG_CoreClkSelect coreClkSelect) +{ + 3000ec0: 7179 addi sp,sp,-48 + 3000ec2: d606 sw ra,44(sp) + 3000ec4: d422 sw s0,40(sp) + 3000ec6: 1800 addi s0,sp,48 + 3000ec8: fca42e23 sw a0,-36(s0) + EFC_RegStruct *efc = EFC; + 3000ecc: 147107b7 lui a5,0x14710 + 3000ed0: fef42623 sw a5,-20(s0) + EFLASH_CLK_CFG_REG cfg; + unsigned int hclk; + unsigned int nreadDiv; + + /* Step 1: Set nread_div */ + hclk = GetFlashFreq(coreClkSelect); + 3000ed4: fdc42503 lw a0,-36(s0) + 3000ed8: 3751 jal ra,3000e5c + 3000eda: fea42423 sw a0,-24(s0) + cfg.reg = efc->EFLASH_CLK_CFG.reg; + 3000ede: fec42703 lw a4,-20(s0) + 3000ee2: 6785 lui a5,0x1 + 3000ee4: 97ba add a5,a5,a4 + 3000ee6: 9407a783 lw a5,-1728(a5) # 940 + 3000eea: fef42223 sw a5,-28(s0) + SetFlashDiv(hclk, &nreadDiv); + 3000eee: fe040793 addi a5,s0,-32 + 3000ef2: 85be mv a1,a5 + 3000ef4: fe842503 lw a0,-24(s0) + 3000ef8: 3dc9 jal ra,3000dca + cfg.BIT.nread_div = nreadDiv; + 3000efa: fe042783 lw a5,-32(s0) + 3000efe: 8bbd andi a5,a5,15 + 3000f00: 0ff7f713 andi a4,a5,255 + 3000f04: fe442783 lw a5,-28(s0) + 3000f08: 8b3d andi a4,a4,15 + 3000f0a: 0712 slli a4,a4,0x4 + 3000f0c: f0f7f793 andi a5,a5,-241 + 3000f10: 8fd9 or a5,a5,a4 + 3000f12: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f16: fe442783 lw a5,-28(s0) + 3000f1a: 00100737 lui a4,0x100 + 3000f1e: 8fd9 or a5,a5,a4 + 3000f20: fef42223 sw a5,-28(s0) + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f24: fe442783 lw a5,-28(s0) + 3000f28: 00400737 lui a4,0x400 + 3000f2c: 8fd9 or a5,a5,a4 + 3000f2e: fef42223 sw a5,-28(s0) + + /* Step 2: Wait Busclk_sw_req */ + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f32: fe442783 lw a5,-28(s0) + 3000f36: 00400737 lui a4,0x400 + 3000f3a: 8fd9 or a5,a5,a4 + 3000f3c: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f40: fe442783 lw a5,-28(s0) + 3000f44: 00100737 lui a4,0x100 + 3000f48: 8fd9 or a5,a5,a4 + 3000f4a: fef42223 sw a5,-28(s0) + efc->EFLASH_CLK_CFG.reg = cfg.reg; + 3000f4e: fe442703 lw a4,-28(s0) + 3000f52: fec42683 lw a3,-20(s0) + 3000f56: 6785 lui a5,0x1 + 3000f58: 97b6 add a5,a5,a3 + 3000f5a: 94e7a023 sw a4,-1728(a5) # 940 + while (efc->EFLASH_CLK_CFG.BIT.busclk_sw_req == BASE_CFG_SET) { + 3000f5e: 0001 nop + 3000f60: fec42703 lw a4,-20(s0) + 3000f64: 6785 lui a5,0x1 + 3000f66: 97ba add a5,a5,a4 + 3000f68: 9407a783 lw a5,-1728(a5) # 940 + 3000f6c: 83d1 srli a5,a5,0x14 + 3000f6e: 8b85 andi a5,a5,1 + 3000f70: 0ff7f713 andi a4,a5,255 + 3000f74: 4785 li a5,1 + 3000f76: fef705e3 beq a4,a5,3000f60 + ; + } + 3000f7a: 0001 nop + 3000f7c: 50b2 lw ra,44(sp) + 3000f7e: 5422 lw s0,40(sp) + 3000f80: 6145 addi sp,sp,48 + 3000f82: 8082 ret + +03000f84 : + * @brief Init the systick + * @param None + * @retval None + */ +void SYSTICK_Init(void) +{ + 3000f84: 1141 addi sp,sp,-16 + 3000f86: c622 sw s0,12(sp) + 3000f88: 0800 addi s0,sp,16 + SYSTICK->TIMER_CTRL.reg = 0; + 3000f8a: 143807b7 lui a5,0x14380 + 3000f8e: 0007a023 sw zero,0(a5) # 14380000 + SYSTICK->TIMER_CTRL.BIT.enable = 1; + 3000f92: 14380737 lui a4,0x14380 + 3000f96: 431c lw a5,0(a4) + 3000f98: 0017e793 ori a5,a5,1 + 3000f9c: c31c sw a5,0(a4) +} + 3000f9e: 0001 nop + 3000fa0: 4432 lw s0,12(sp) + 3000fa2: 0141 addi sp,sp,16 + 3000fa4: 8082 ret + +03000fa6 : + * @brief Get the Systick frep(Hz) + * @param None + * @retval Clock frep of systick(Hz) + */ +unsigned int SYSTICK_GetCRGHZ(void) +{ + 3000fa6: 1141 addi sp,sp,-16 + 3000fa8: c606 sw ra,12(sp) + 3000faa: c422 sw s0,8(sp) + 3000fac: 0800 addi s0,sp,16 + /* Get the Systick IP */ + return HAL_CRG_GetIpFreq(SYSTICK_BASE); + 3000fae: 14380537 lui a0,0x14380 + 3000fb2: 59c020ef jal ra,300354e + 3000fb6: 87aa mv a5,a0 + 3000fb8: 853e mv a0,a5 + 3000fba: 40b2 lw ra,12(sp) + 3000fbc: 4422 lw s0,8(sp) + 3000fbe: 0141 addi sp,sp,16 + 3000fc0: 8082 ret + +03000fc2 : + * @param efc Flash control register base address + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +static unsigned int FOTP_CheckReadStatus(EFC_RegStruct *efc) +{ + 3000fc2: 1101 addi sp,sp,-32 + 3000fc4: ce22 sw s0,28(sp) + 3000fc6: 1000 addi s0,sp,32 + 3000fc8: fea42623 sw a0,-20(s0) + /* Check for errors in the flash reading process. */ + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fcc: fec42783 lw a5,-20(s0) + 3000fd0: 1007a783 lw a5,256(a5) + 3000fd4: 83c1 srli a5,a5,0x10 + 3000fd6: 8b85 andi a5,a5,1 + 3000fd8: 9f81 uxtb a5 + 3000fda: e38d bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000fdc: fec42783 lw a5,-20(s0) + 3000fe0: 1007a783 lw a5,256(a5) + 3000fe4: 83cd srli a5,a5,0x13 + 3000fe6: 8b85 andi a5,a5,1 + 3000fe8: 9f81 uxtb a5 + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fea: eb89 bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_chk) { + 3000fec: fec42783 lw a5,-20(s0) + 3000ff0: 1007a783 lw a5,256(a5) + 3000ff4: 83d1 srli a5,a5,0x14 + 3000ff6: 8b85 andi a5,a5,1 + 3000ff8: 9f81 uxtb a5 + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000ffa: c3a9 beqz a5,300103c + efc->INT_CLEAR.BIT.int_clr_err_ecc_corr = BASE_CFG_SET; + 3000ffc: fec42703 lw a4,-20(s0) + 3001000: 10c72783 lw a5,268(a4) # 1438010c + 3001004: 000806b7 lui a3,0x80 + 3001008: 8fd5 or a5,a5,a3 + 300100a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_illegal = BASE_CFG_SET; + 300100e: fec42703 lw a4,-20(s0) + 3001012: 10c72783 lw a5,268(a4) + 3001016: 66c1 lui a3,0x10 + 3001018: 8fd5 or a5,a5,a3 + 300101a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_ecc_chk = BASE_CFG_SET; + 300101e: fec42703 lw a4,-20(s0) + 3001022: 10c72783 lw a5,268(a4) + 3001026: 001006b7 lui a3,0x100 + 300102a: 8fd5 or a5,a5,a3 + 300102c: 10f72623 sw a5,268(a4) + efc->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001030: fec42783 lw a5,-20(s0) + 3001034: 2007a023 sw zero,512(a5) + return BASE_STATUS_ERROR; + 3001038: 4785 li a5,1 + 300103a: a011 j 300103e + } + return BASE_STATUS_OK; + 300103c: 4781 li a5,0 +} + 300103e: 853e mv a0,a5 + 3001040: 4472 lw s0,28(sp) + 3001042: 6105 addi sp,sp,32 + 3001044: 8082 ret + +03001046 : + * @param buf Buffer of read data + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +unsigned int FOTP_InfoGet(FOTP_InfoRngType type, unsigned int index, FOTP_CommonData *buf) +{ + 3001046: 7179 addi sp,sp,-48 + 3001048: d606 sw ra,44(sp) + 300104a: d422 sw s0,40(sp) + 300104c: 1800 addi s0,sp,48 + 300104e: fca42e23 sw a0,-36(s0) + 3001052: fcb42c23 sw a1,-40(s0) + 3001056: fcc42a23 sw a2,-44(s0) + EFC_RegStruct *p = EFC; + 300105a: 147107b7 lui a5,0x14710 + 300105e: fef42423 sw a5,-24(s0) + unsigned int addr; + + if (buf == NULL) { + 3001062: fd442783 lw a5,-44(s0) + 3001066: e399 bnez a5,300106c + return BASE_STATUS_ERROR; + 3001068: 4785 li a5,1 + 300106a: aa15 j 300119e + } + + if ((type >= FOTP_INFO_MAXTYPE) || (index > FOTP_INFO_REG_MAX_ID)) { + 300106c: fdc42703 lw a4,-36(s0) + 3001070: 4785 li a5,1 + 3001072: 00e7e763 bltu a5,a4,3001080 + 3001076: fd842703 lw a4,-40(s0) + 300107a: 47e5 li a5,25 + 300107c: 00e7f463 bgeu a5,a4,3001084 + return BASE_STATUS_ERROR; + 3001080: 4785 li a5,1 + 3001082: aa31 j 300119e + } + + /* If there is a read command, return */ + if (p->EFLASH_CMD.BIT.cmd_start) { + 3001084: fe842783 lw a5,-24(s0) + 3001088: 439c lw a5,0(a5) + 300108a: 8b85 andi a5,a5,1 + 300108c: 9f81 uxtb a5 + 300108e: c399 beqz a5,3001094 + return BASE_STATUS_ERROR; + 3001090: 4785 li a5,1 + 3001092: a231 j 300119e + } + + p->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; + 3001094: fe842783 lw a5,-24(s0) + 3001098: fedcc737 lui a4,0xfedcc + 300109c: a9870713 addi a4,a4,-1384 # fedcba98 + 30010a0: 20e7a023 sw a4,512(a5) # 14710200 + + /* Configure the read command parameters and start the read command */ + addr = (type == FOTP_INFO_RNG0) ? FOTP_INFO_RNG0_BASEADDR : FOTP_INFO_RNG1_BASEADDR; + 30010a4: fdc42783 lw a5,-36(s0) + 30010a8: e781 bnez a5,30010b0 + 30010aa: 008007b7 lui a5,0x800 + 30010ae: a019 j 30010b4 + 30010b0: 008017b7 lui a5,0x801 + 30010b4: fef42223 sw a5,-28(s0) + addr += index * REG_WORDS_NUM; + 30010b8: fd842783 lw a5,-40(s0) + 30010bc: 0792 slli a5,a5,0x4 + 30010be: fe442703 lw a4,-28(s0) + 30010c2: 97ba add a5,a5,a4 + 30010c4: fef42223 sw a5,-28(s0) + p->EFLASH_ADDR.BIT.cmd_addr = addr >> 2; /* Right shift 2 bit change to word */ + 30010c8: fe442783 lw a5,-28(s0) + 30010cc: 0027d713 srli a4,a5,0x2 + 30010d0: 004007b7 lui a5,0x400 + 30010d4: 17fd addi a5,a5,-1 # 3fffff + 30010d6: 00f77633 and a2,a4,a5 + 30010da: fe842703 lw a4,-24(s0) + 30010de: 435c lw a5,4(a4) + 30010e0: 004006b7 lui a3,0x400 + 30010e4: 16fd addi a3,a3,-1 # 3fffff + 30010e6: 8ef1 and a3,a3,a2 + 30010e8: 068a slli a3,a3,0x2 + 30010ea: ff000637 lui a2,0xff000 + 30010ee: 060d addi a2,a2,3 # ff000003 + 30010f0: 8ff1 and a5,a5,a2 + 30010f2: 8fd5 or a5,a5,a3 + 30010f4: c35c sw a5,4(a4) + p->EFLASH_CMD.BIT.cmd_code = FLASH_OPERATION_READ; + 30010f6: fe842703 lw a4,-24(s0) + 30010fa: 431c lw a5,0(a4) + 30010fc: 8ff7f793 andi a5,a5,-1793 + 3001100: 1007e793 ori a5,a5,256 + 3001104: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_read_size = FLASH_READ_128BIT; + 3001106: fe842703 lw a4,-24(s0) + 300110a: 431c lw a5,0(a4) + 300110c: d00006b7 lui a3,0xd0000 + 3001110: 16fd addi a3,a3,-1 # cfffffff + 3001112: 8efd and a3,a3,a5 + 3001114: 100007b7 lui a5,0x10000 + 3001118: 8fd5 or a5,a5,a3 + 300111a: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_start = BASE_CFG_SET; + 300111c: fe842703 lw a4,-24(s0) + 3001120: 431c lw a5,0(a4) + 3001122: 0017e793 ori a5,a5,1 + 3001126: c31c sw a5,0(a4) + + while (p->EFLASH_CMD.BIT.cmd_start) { + 3001128: 0001 nop + 300112a: fe842783 lw a5,-24(s0) + 300112e: 439c lw a5,0(a5) + 3001130: 8b85 andi a5,a5,1 + 3001132: 9f81 uxtb a5 + 3001134: fbfd bnez a5,300112a + ; + } + while (p->EFLASH_CMD.BIT.exec_state) { + 3001136: 0001 nop + 3001138: fe842783 lw a5,-24(s0) + 300113c: 439c lw a5,0(a5) + 300113e: 8399 srli a5,a5,0x6 + 3001140: 8b8d andi a5,a5,3 + 3001142: 9f81 uxtb a5 + 3001144: fbf5 bnez a5,3001138 + ; + } + /* read error, clear interrupt and return */ + if (FOTP_CheckReadStatus(p) != BASE_STATUS_OK) { + 3001146: fe842503 lw a0,-24(s0) + 300114a: 3da5 jal ra,3000fc2 + 300114c: 87aa mv a5,a0 + 300114e: c399 beqz a5,3001154 + return BASE_STATUS_ERROR; + 3001150: 4785 li a5,1 + 3001152: a0b1 j 300119e + } + /* Read data from FIFO to buffer */ + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001154: fe042623 sw zero,-20(s0) + 3001158: a00d j 300117a + buf->data[i] = p->FLASH_RDATA; + 300115a: fe842783 lw a5,-24(s0) + 300115e: 6007a703 lw a4,1536(a5) # 10000600 + 3001162: fd442683 lw a3,-44(s0) + 3001166: fec42783 lw a5,-20(s0) + 300116a: 078a slli a5,a5,0x2 + 300116c: 97b6 add a5,a5,a3 + 300116e: c398 sw a4,0(a5) + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001170: fec42783 lw a5,-20(s0) + 3001174: 0785 addi a5,a5,1 + 3001176: fef42623 sw a5,-20(s0) + 300117a: fec42703 lw a4,-20(s0) + 300117e: 478d li a5,3 + 3001180: fce7fde3 bgeu a5,a4,300115a + } + p->INT_CLEAR.BIT.int_clr_finish = BASE_CFG_SET; + 3001184: fe842703 lw a4,-24(s0) + 3001188: 10c72783 lw a5,268(a4) + 300118c: 0107e793 ori a5,a5,16 + 3001190: 10f72623 sw a5,268(a4) + p->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001194: fe842783 lw a5,-24(s0) + 3001198: 2007a023 sw zero,512(a5) + return BASE_STATUS_OK; + 300119c: 4781 li a5,0 + 300119e: 853e mv a0,a5 + 30011a0: 50b2 lw ra,44(sp) + 30011a2: 5422 lw s0,40(sp) + 30011a4: 6145 addi sp,sp,48 + 30011a6: 8082 ret + +030011a8 : + * @param baseAddr The ip base address + * @retval The Address(offset) in g_crgIpMatch if match success + * @retval 0 if match fail + */ +CHIP_CrgIpMatchInfo *GetCrgIpMatchInfo(const void *baseAddr) +{ + 30011a8: 7179 addi sp,sp,-48 + 30011aa: d622 sw s0,44(sp) + 30011ac: 1800 addi s0,sp,48 + 30011ae: fca42e23 sw a0,-36(s0) + unsigned int i; + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011b2: fe042623 sw zero,-20(s0) + 30011b6: a081 j 30011f6 + if (baseAddr == g_crgIpMatch[i].ipBaseAddr) { + 30011b8: 030067b7 lui a5,0x3006 + 30011bc: 58c78713 addi a4,a5,1420 # 300658c + 30011c0: fec42683 lw a3,-20(s0) + 30011c4: 47b1 li a5,12 + 30011c6: 02f687b3 mul a5,a3,a5 + 30011ca: 97ba add a5,a5,a4 + 30011cc: 439c lw a5,0(a5) + 30011ce: fdc42703 lw a4,-36(s0) + 30011d2: 00f71d63 bne a4,a5,30011ec + return (CHIP_CrgIpMatchInfo *)&g_crgIpMatch[i]; + 30011d6: fec42703 lw a4,-20(s0) + 30011da: 47b1 li a5,12 + 30011dc: 02f70733 mul a4,a4,a5 + 30011e0: 030067b7 lui a5,0x3006 + 30011e4: 58c78793 addi a5,a5,1420 # 300658c + 30011e8: 97ba add a5,a5,a4 + 30011ea: a829 j 3001204 + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011ec: fec42783 lw a5,-20(s0) + 30011f0: 0785 addi a5,a5,1 + 30011f2: fef42623 sw a5,-20(s0) + 30011f6: fec42703 lw a4,-20(s0) + 30011fa: 02d00793 li a5,45 + 30011fe: fae7fde3 bgeu a5,a4,30011b8 + } + } + return (CHIP_CrgIpMatchInfo *)0; /* The base address does not match, return 0. */ + 3001202: 4781 li a5,0 +} + 3001204: 853e mv a0,a5 + 3001206: 5432 lw s0,44(sp) + 3001208: 6145 addi sp,sp,48 + 300120a: 8082 ret + +0300120c : + * @brief Check ADC sample input. + * @param input Number of input. + * @retval bool + */ +static inline bool IsADCSampleChannel(ADC_Input input) +{ + 300120c: 1101 addi sp,sp,-32 + 300120e: ce22 sw s0,28(sp) + 3001210: 1000 addi s0,sp,32 + 3001212: fea42623 sw a0,-20(s0) + return (input >= ADC_CH_ADCINA0) && (input <= ADC_CH_ADCINA19); + 3001216: fec42783 lw a5,-20(s0) + 300121a: 0147b793 sltiu a5,a5,20 + 300121e: 9f81 uxtb a5 +} + 3001220: 853e mv a0,a5 + 3001222: 4472 lw s0,28(sp) + 3001224: 6105 addi sp,sp,32 + 3001226: 8082 ret + +03001228 : + * are configured through the SOC. + * @param soc Number of SOC. + * @retval bool + */ +static inline bool IsADCSOCx(ADC_SOCNumber soc) +{ + 3001228: 1101 addi sp,sp,-32 + 300122a: ce22 sw s0,28(sp) + 300122c: 1000 addi s0,sp,32 + 300122e: fea42623 sw a0,-20(s0) + return (soc >= ADC_SOC_NUM0) && (soc <= ADC_SOC_NUM15); + 3001232: fec42783 lw a5,-20(s0) + 3001236: 0107b793 sltiu a5,a5,16 + 300123a: 9f81 uxtb a5 +} + 300123c: 853e mv a0,a5 + 300123e: 4472 lw s0,28(sp) + 3001240: 6105 addi sp,sp,32 + 3001242: 8082 ret + +03001244 : + * @brief Check ADC interrupt parameter. + * @param intx Number of interrupt. + * @retval bool + */ +static inline bool IsADCIntx(ADC_IntNumber intx) +{ + 3001244: 1101 addi sp,sp,-32 + 3001246: ce22 sw s0,28(sp) + 3001248: 1000 addi s0,sp,32 + 300124a: fea42623 sw a0,-20(s0) + return (intx >= ADC_INT_NUMBER0) && (intx <= ADC_INT_NUMBER3); + 300124e: fec42783 lw a5,-20(s0) + 3001252: 0047b793 sltiu a5,a5,4 + 3001256: 9f81 uxtb a5 +} + 3001258: 853e mv a0,a5 + 300125a: 4472 lw s0,28(sp) + 300125c: 6105 addi sp,sp,32 + 300125e: 8082 ret + +03001260 : + * @brief Check SOC trigger source. + * @param trig Type of trigger source. + * @retval bool + */ +static inline bool IsADCTrigSource(ADC_TrigSource trig) +{ + 3001260: 1101 addi sp,sp,-32 + 3001262: ce22 sw s0,28(sp) + 3001264: 1000 addi s0,sp,32 + 3001266: fea42623 sw a0,-20(s0) + return (trig >= ADC_TRIGSOC_SOFT) && (trig <= ADC_TRIGSOC_GPIOPF1); + 300126a: fec42783 lw a5,-20(s0) + 300126e: 0157b793 sltiu a5,a5,21 + 3001272: 9f81 uxtb a5 +} + 3001274: 853e mv a0,a5 + 3001276: 4472 lw s0,28(sp) + 3001278: 6105 addi sp,sp,32 + 300127a: 8082 ret + +0300127c : + * @brief Check mode of completion of SOC sample + * @param mode Type of completion. + * @retval bool + */ +static inline bool IsADCFinishMode(ADC_SOCFinishMode mode) +{ + 300127c: 1101 addi sp,sp,-32 + 300127e: ce22 sw s0,28(sp) + 3001280: 1000 addi s0,sp,32 + 3001282: fea42623 sw a0,-20(s0) + return (mode >= ADC_SOCFINISH_NONE) && (mode <= ADC_SOCFINISH_INT3); + 3001286: fec42783 lw a5,-20(s0) + 300128a: cb81 beqz a5,300129a + 300128c: fec42703 lw a4,-20(s0) + 3001290: 4799 li a5,6 + 3001292: 00e7e463 bltu a5,a4,300129a + 3001296: 4785 li a5,1 + 3001298: a011 j 300129c + 300129a: 4781 li a5,0 + 300129c: 8b85 andi a5,a5,1 + 300129e: 9f81 uxtb a5 +} + 30012a0: 853e mv a0,a5 + 30012a2: 4472 lw s0,28(sp) + 30012a4: 6105 addi sp,sp,32 + 30012a6: 8082 ret + +030012a8 : + * @brief Check ADC sample priority parameter. + * @param mode Priority mode of SOC. + * @retval bool + */ +static inline bool IsADCPriorityMode(ADC_PriorityMode mode) +{ + 30012a8: 1101 addi sp,sp,-32 + 30012aa: ce22 sw s0,28(sp) + 30012ac: 1000 addi s0,sp,32 + 30012ae: fea42623 sw a0,-20(s0) + return (mode >= ADC_PRIMODE_ALL_ROUND) && (mode <= ADC_PRIMODE_ALL_PRIORITY); + 30012b2: fec42703 lw a4,-20(s0) + 30012b6: 67c1 lui a5,0x10 + 30012b8: 00f737b3 sltu a5,a4,a5 + 30012bc: 9f81 uxtb a5 +} + 30012be: 853e mv a0,a5 + 30012c0: 4472 lw s0,28(sp) + 30012c2: 6105 addi sp,sp,32 + 30012c4: 8082 ret + +030012c6 : + * @brief Check time of total ADC sampling time. + * @param acqps Time of total ADC sampling time. + * @retval bool + */ +static inline bool IsADCTotalTime(unsigned int acqps) +{ + 30012c6: 1101 addi sp,sp,-32 + 30012c8: ce22 sw s0,28(sp) + 30012ca: 1000 addi s0,sp,32 + 30012cc: fea42623 sw a0,-20(s0) + return (acqps <= ADC_SOCSAMPLE_500CLK); + 30012d0: fec42783 lw a5,-20(s0) + 30012d4: 0107b793 sltiu a5,a5,16 + 30012d8: 9f81 uxtb a5 +} + 30012da: 853e mv a0,a5 + 30012dc: 4472 lw s0,28(sp) + 30012de: 6105 addi sp,sp,32 + 30012e0: 8082 ret + +030012e2 : + * @brief Enable AVDD/3 Channal. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_EnableAvddChannel(ADC_RegStruct * const adcx) +{ + 30012e2: 1101 addi sp,sp,-32 + 30012e4: ce06 sw ra,28(sp) + 30012e6: cc22 sw s0,24(sp) + 30012e8: 1000 addi s0,sp,32 + 30012ea: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30012ee: fec42703 lw a4,-20(s0) + 30012f2: 180007b7 lui a5,0x18000 + 30012f6: 00f70b63 beq a4,a5,300130c + 30012fa: 6785 lui a5,0x1 + 30012fc: 86278593 addi a1,a5,-1950 # 862 + 3001300: 030067b7 lui a5,0x3006 + 3001304: 7b478513 addi a0,a5,1972 # 30067b4 + 3001308: 2dad jal ra,3001982 + 300130a: a001 j 300130a + adcx->ADC_AVDD_EN.BIT.cfg_avdd_en = true; + 300130c: fec42703 lw a4,-20(s0) + 3001310: 65872783 lw a5,1624(a4) + 3001314: 0017e793 ori a5,a5,1 + 3001318: 64f72c23 sw a5,1624(a4) +} + 300131c: 0001 nop + 300131e: 40f2 lw ra,28(sp) + 3001320: 4462 lw s0,24(sp) + 3001322: 6105 addi sp,sp,32 + 3001324: 8082 ret + +03001326 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt0(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001326: 7179 addi sp,sp,-48 + 3001328: d606 sw ra,44(sp) + 300132a: d422 sw s0,40(sp) + 300132c: 1800 addi s0,sp,48 + 300132e: fca42e23 sw a0,-36(s0) + 3001332: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001336: fdc42703 lw a4,-36(s0) + 300133a: 180007b7 lui a5,0x18000 + 300133e: 00f70b63 beq a4,a5,3001354 + 3001342: 6785 lui a5,0x1 + 3001344: 87978593 addi a1,a5,-1927 # 879 + 3001348: 030067b7 lui a5,0x3006 + 300134c: 7b478513 addi a0,a5,1972 # 30067b4 + 3001350: 2d0d jal ra,3001982 + 3001352: a001 j 3001352 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 3001354: fd842503 lw a0,-40(s0) + 3001358: 3dc1 jal ra,3001228 + 300135a: 87aa mv a5,a0 + 300135c: 0017c793 xori a5,a5,1 + 3001360: 9f81 uxtb a5 + 3001362: cb91 beqz a5,3001376 + 3001364: 6785 lui a5,0x1 + 3001366: 87a78593 addi a1,a5,-1926 # 87a + 300136a: 030067b7 lui a5,0x3006 + 300136e: 7b478513 addi a0,a5,1972 # 30067b4 + 3001372: 2d01 jal ra,3001982 + 3001374: a01d j 300139a + unsigned int shiftBit = (unsigned int)socx; + 3001376: fd842783 lw a5,-40(s0) + 300137a: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 300137e: fdc42783 lw a5,-36(s0) + 3001382: 2b07a703 lw a4,688(a5) + 3001386: 4685 li a3,1 + 3001388: fec42783 lw a5,-20(s0) + 300138c: 00f697b3 sll a5,a3,a5 + 3001390: 8f5d or a4,a4,a5 + 3001392: fdc42783 lw a5,-36(s0) + 3001396: 2ae7a823 sw a4,688(a5) +} + 300139a: 50b2 lw ra,44(sp) + 300139c: 5422 lw s0,40(sp) + 300139e: 6145 addi sp,sp,48 + 30013a0: 8082 ret + +030013a2 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt1(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30013a2: 7179 addi sp,sp,-48 + 30013a4: d606 sw ra,44(sp) + 30013a6: d422 sw s0,40(sp) + 30013a8: 1800 addi s0,sp,48 + 30013aa: fca42e23 sw a0,-36(s0) + 30013ae: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30013b2: fdc42703 lw a4,-36(s0) + 30013b6: 180007b7 lui a5,0x18000 + 30013ba: 00f70b63 beq a4,a5,30013d0 + 30013be: 6785 lui a5,0x1 + 30013c0: 89478593 addi a1,a5,-1900 # 894 + 30013c4: 030067b7 lui a5,0x3006 + 30013c8: 7b478513 addi a0,a5,1972 # 30067b4 + 30013cc: 2b5d jal ra,3001982 + 30013ce: a001 j 30013ce + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30013d0: fd842503 lw a0,-40(s0) + 30013d4: 3d91 jal ra,3001228 + 30013d6: 87aa mv a5,a0 + 30013d8: 0017c793 xori a5,a5,1 + 30013dc: 9f81 uxtb a5 + 30013de: cb91 beqz a5,30013f2 + 30013e0: 6785 lui a5,0x1 + 30013e2: 89578593 addi a1,a5,-1899 # 895 + 30013e6: 030067b7 lui a5,0x3006 + 30013ea: 7b478513 addi a0,a5,1972 # 30067b4 + 30013ee: 2b51 jal ra,3001982 + 30013f0: a025 j 3001418 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30013f2: fd842783 lw a5,-40(s0) + 30013f6: 07c1 addi a5,a5,16 + 30013f8: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 30013fc: fdc42783 lw a5,-36(s0) + 3001400: 2b07a703 lw a4,688(a5) + 3001404: 4685 li a3,1 + 3001406: fec42783 lw a5,-20(s0) + 300140a: 00f697b3 sll a5,a3,a5 + 300140e: 8f5d or a4,a4,a5 + 3001410: fdc42783 lw a5,-36(s0) + 3001414: 2ae7a823 sw a4,688(a5) +} + 3001418: 50b2 lw ra,44(sp) + 300141a: 5422 lw s0,40(sp) + 300141c: 6145 addi sp,sp,48 + 300141e: 8082 ret + +03001420 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt2(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001420: 7179 addi sp,sp,-48 + 3001422: d606 sw ra,44(sp) + 3001424: d422 sw s0,40(sp) + 3001426: 1800 addi s0,sp,48 + 3001428: fca42e23 sw a0,-36(s0) + 300142c: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001430: fdc42703 lw a4,-36(s0) + 3001434: 180007b7 lui a5,0x18000 + 3001438: 00f70b63 beq a4,a5,300144e + 300143c: 6785 lui a5,0x1 + 300143e: 8af78593 addi a1,a5,-1873 # 8af + 3001442: 030067b7 lui a5,0x3006 + 3001446: 7b478513 addi a0,a5,1972 # 30067b4 + 300144a: 2b25 jal ra,3001982 + 300144c: a001 j 300144c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300144e: fd842503 lw a0,-40(s0) + 3001452: 3bd9 jal ra,3001228 + 3001454: 87aa mv a5,a0 + 3001456: 0017c793 xori a5,a5,1 + 300145a: 9f81 uxtb a5 + 300145c: cb91 beqz a5,3001470 + 300145e: 6785 lui a5,0x1 + 3001460: 8b078593 addi a1,a5,-1872 # 8b0 + 3001464: 030067b7 lui a5,0x3006 + 3001468: 7b478513 addi a0,a5,1972 # 30067b4 + 300146c: 2b19 jal ra,3001982 + 300146e: a01d j 3001494 + unsigned int shiftBit = (unsigned int)socx; + 3001470: fd842783 lw a5,-40(s0) + 3001474: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 3001478: fdc42783 lw a5,-36(s0) + 300147c: 2b47a703 lw a4,692(a5) + 3001480: 4685 li a3,1 + 3001482: fec42783 lw a5,-20(s0) + 3001486: 00f697b3 sll a5,a3,a5 + 300148a: 8f5d or a4,a4,a5 + 300148c: fdc42783 lw a5,-36(s0) + 3001490: 2ae7aa23 sw a4,692(a5) +} + 3001494: 50b2 lw ra,44(sp) + 3001496: 5422 lw s0,40(sp) + 3001498: 6145 addi sp,sp,48 + 300149a: 8082 ret + +0300149c : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt3(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300149c: 7179 addi sp,sp,-48 + 300149e: d606 sw ra,44(sp) + 30014a0: d422 sw s0,40(sp) + 30014a2: 1800 addi s0,sp,48 + 30014a4: fca42e23 sw a0,-36(s0) + 30014a8: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30014ac: fdc42703 lw a4,-36(s0) + 30014b0: 180007b7 lui a5,0x18000 + 30014b4: 00f70b63 beq a4,a5,30014ca + 30014b8: 6785 lui a5,0x1 + 30014ba: 8ca78593 addi a1,a5,-1846 # 8ca + 30014be: 030067b7 lui a5,0x3006 + 30014c2: 7b478513 addi a0,a5,1972 # 30067b4 + 30014c6: 2975 jal ra,3001982 + 30014c8: a001 j 30014c8 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30014ca: fd842503 lw a0,-40(s0) + 30014ce: 3ba9 jal ra,3001228 + 30014d0: 87aa mv a5,a0 + 30014d2: 0017c793 xori a5,a5,1 + 30014d6: 9f81 uxtb a5 + 30014d8: cb91 beqz a5,30014ec + 30014da: 6785 lui a5,0x1 + 30014dc: 8cb78593 addi a1,a5,-1845 # 8cb + 30014e0: 030067b7 lui a5,0x3006 + 30014e4: 7b478513 addi a0,a5,1972 # 30067b4 + 30014e8: 2969 jal ra,3001982 + 30014ea: a025 j 3001512 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30014ec: fd842783 lw a5,-40(s0) + 30014f0: 07c1 addi a5,a5,16 + 30014f2: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 30014f6: fdc42783 lw a5,-36(s0) + 30014fa: 2b47a703 lw a4,692(a5) + 30014fe: 4685 li a3,1 + 3001500: fec42783 lw a5,-20(s0) + 3001504: 00f697b3 sll a5,a3,a5 + 3001508: 8f5d or a4,a4,a5 + 300150a: fdc42783 lw a5,-36(s0) + 300150e: 2ae7aa23 sw a4,692(a5) +} + 3001512: 50b2 lw ra,44(sp) + 3001514: 5422 lw s0,40(sp) + 3001516: 6145 addi sp,sp,48 + 3001518: 8082 ret + +0300151a : + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + 300151a: 1101 addi sp,sp,-32 + 300151c: ce06 sw ra,28(sp) + 300151e: cc22 sw s0,24(sp) + 3001520: 1000 addi s0,sp,32 + 3001522: fea42623 sw a0,-20(s0) + 3001526: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300152a: fec42703 lw a4,-20(s0) + 300152e: 180007b7 lui a5,0x18000 + 3001532: 00f70b63 beq a4,a5,3001548 + 3001536: 6785 lui a5,0x1 + 3001538: 8e578593 addi a1,a5,-1819 # 8e5 + 300153c: 030067b7 lui a5,0x3006 + 3001540: 7b478513 addi a0,a5,1972 # 30067b4 + 3001544: 293d jal ra,3001982 + 3001546: a001 j 3001546 + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + 3001548: fe842503 lw a0,-24(s0) + 300154c: 39e5 jal ra,3001244 + 300154e: 87aa mv a5,a0 + 3001550: 0017c793 xori a5,a5,1 + 3001554: 9f81 uxtb a5 + 3001556: cb91 beqz a5,300156a + 3001558: 6785 lui a5,0x1 + 300155a: 8e678593 addi a1,a5,-1818 # 8e6 + 300155e: 030067b7 lui a5,0x3006 + 3001562: 7b478513 addi a0,a5,1972 # 30067b4 + 3001566: 2931 jal ra,3001982 + 3001568: a839 j 3001586 + adcx->ADC_DATA_FLAG_MASK.reg |= (1U << (unsigned int)intx); + 300156a: fec42783 lw a5,-20(s0) + 300156e: 2c07a703 lw a4,704(a5) + 3001572: 4685 li a3,1 + 3001574: fe842783 lw a5,-24(s0) + 3001578: 00f697b3 sll a5,a3,a5 + 300157c: 8f5d or a4,a4,a5 + 300157e: fec42783 lw a5,-20(s0) + 3001582: 2ce7a023 sw a4,704(a5) +} + 3001586: 40f2 lw ra,28(sp) + 3001588: 4462 lw s0,24(sp) + 300158a: 6105 addi sp,sp,32 + 300158c: 8082 ret + +0300158e : + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_ClearIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + 300158e: 1101 addi sp,sp,-32 + 3001590: ce06 sw ra,28(sp) + 3001592: cc22 sw s0,24(sp) + 3001594: 1000 addi s0,sp,32 + 3001596: fea42623 sw a0,-20(s0) + 300159a: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300159e: fec42703 lw a4,-20(s0) + 30015a2: 180007b7 lui a5,0x18000 + 30015a6: 00f70b63 beq a4,a5,30015bc + 30015aa: 6785 lui a5,0x1 + 30015ac: 8ff78593 addi a1,a5,-1793 # 8ff + 30015b0: 030067b7 lui a5,0x3006 + 30015b4: 7b478513 addi a0,a5,1972 # 30067b4 + 30015b8: 26e9 jal ra,3001982 + 30015ba: a001 j 30015ba + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + 30015bc: fe842503 lw a0,-24(s0) + 30015c0: 3151 jal ra,3001244 + 30015c2: 87aa mv a5,a0 + 30015c4: 0017c793 xori a5,a5,1 + 30015c8: 9f81 uxtb a5 + 30015ca: cb91 beqz a5,30015de + 30015cc: 6785 lui a5,0x1 + 30015ce: 90078593 addi a1,a5,-1792 # 900 + 30015d2: 030067b7 lui a5,0x3006 + 30015d6: 7b478513 addi a0,a5,1972 # 30067b4 + 30015da: 2665 jal ra,3001982 + 30015dc: a811 j 30015f0 + adcx->ADC_INT_DATA_FLAG.reg = (1U << (unsigned int)intx); + 30015de: 4705 li a4,1 + 30015e0: fe842783 lw a5,-24(s0) + 30015e4: 00f71733 sll a4,a4,a5 + 30015e8: fec42783 lw a5,-20(s0) + 30015ec: 2ae7ac23 sw a4,696(a5) +} + 30015f0: 40f2 lw ra,28(sp) + 30015f2: 4462 lw s0,24(sp) + 30015f4: 6105 addi sp,sp,32 + 30015f6: 8082 ret + +030015f8 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval addr, the base address of the SOC registers. + */ +static unsigned int ADC_GetCTRLAddr(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30015f8: 7179 addi sp,sp,-48 + 30015fa: d622 sw s0,44(sp) + 30015fc: 1800 addi s0,sp,48 + 30015fe: fca42e23 sw a0,-36(s0) + 3001602: fcb42c23 sw a1,-40(s0) + unsigned int addr; + addr = (uintptr_t)(void *)&(adcx->ADC_SOC0_CFG); + 3001606: fdc42783 lw a5,-36(s0) + 300160a: 10078793 addi a5,a5,256 + 300160e: fef42623 sw a5,-20(s0) + addr += ((unsigned int)socx * 4); /* Register base address difference 4 */ + 3001612: fd842783 lw a5,-40(s0) + 3001616: 078a slli a5,a5,0x2 + 3001618: fec42703 lw a4,-20(s0) + 300161c: 97ba add a5,a5,a4 + 300161e: fef42623 sw a5,-20(s0) + return addr; + 3001622: fec42783 lw a5,-20(s0) +} + 3001626: 853e mv a0,a5 + 3001628: 5432 lw s0,44(sp) + 300162a: 6145 addi sp,sp,48 + 300162c: 8082 ret + +0300162e : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param input ADC input, @ref ADC_Input. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelectChannel(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_Input input) +{ + 300162e: 7179 addi sp,sp,-48 + 3001630: d606 sw ra,44(sp) + 3001632: d422 sw s0,40(sp) + 3001634: 1800 addi s0,sp,48 + 3001636: fca42e23 sw a0,-36(s0) + 300163a: fcb42c23 sw a1,-40(s0) + 300163e: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001642: fdc42703 lw a4,-36(s0) + 3001646: 180007b7 lui a5,0x18000 + 300164a: 00f70b63 beq a4,a5,3001660 + 300164e: 6785 lui a5,0x1 + 3001650: 91c78593 addi a1,a5,-1764 # 91c + 3001654: 030067b7 lui a5,0x3006 + 3001658: 7b478513 addi a0,a5,1972 # 30067b4 + 300165c: 261d jal ra,3001982 + 300165e: a001 j 300165e + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCSampleChannel(input)); + 3001660: fd842503 lw a0,-40(s0) + 3001664: 36d1 jal ra,3001228 + 3001666: 87aa mv a5,a0 + 3001668: 0017c793 xori a5,a5,1 + 300166c: 9f81 uxtb a5 + 300166e: eb89 bnez a5,3001680 + 3001670: fd442503 lw a0,-44(s0) + 3001674: 3e61 jal ra,300120c + 3001676: 87aa mv a5,a0 + 3001678: 0017c793 xori a5,a5,1 + 300167c: 9f81 uxtb a5 + 300167e: cb91 beqz a5,3001692 + 3001680: 6785 lui a5,0x1 + 3001682: 91d78593 addi a1,a5,-1763 # 91d + 3001686: 030067b7 lui a5,0x3006 + 300168a: 7b478513 addi a0,a5,1972 # 30067b4 + 300168e: 2cd5 jal ra,3001982 + 3001690: a091 j 30016d4 + ADC_SOC0_CFG_REG *soc = NULL; + 3001692: fe042623 sw zero,-20(s0) + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Get the Address After Translation */ + 3001696: fd842583 lw a1,-40(s0) + 300169a: fdc42503 lw a0,-36(s0) + 300169e: 3fa9 jal ra,30015f8 + 30016a0: fea42423 sw a0,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30016a4: fe842783 lw a5,-24(s0) + 30016a8: fef42623 sw a5,-20(s0) + soc->BIT.cfg_soc0_ch_sel = (unsigned int)input; + 30016ac: fd442783 lw a5,-44(s0) + 30016b0: 8bfd andi a5,a5,31 + 30016b2: 0ff7f693 andi a3,a5,255 + 30016b6: fec42703 lw a4,-20(s0) + 30016ba: 431c lw a5,0(a4) + 30016bc: 8afd andi a3,a3,31 + 30016be: 9b81 andi a5,a5,-32 + 30016c0: 8fd5 or a5,a5,a3 + 30016c2: c31c sw a5,0(a4) + if (input == ADC_CH_ADCINA18) { + 30016c4: fd442703 lw a4,-44(s0) + 30016c8: 47c9 li a5,18 + 30016ca: 00f71563 bne a4,a5,30016d4 + DCL_ADC_EnableAvddChannel(adcx); + 30016ce: fdc42503 lw a0,-36(s0) + 30016d2: 3901 jal ra,30012e2 + } +} + 30016d4: 50b2 lw ra,44(sp) + 30016d6: 5422 lw s0,40(sp) + 30016d8: 6145 addi sp,sp,48 + 30016da: 8082 ret + +030016dc : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param trig Source of trigger, @ref ADC_TrigSource. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelcetTrigSource(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_TrigSource trig) +{ + 30016dc: 7179 addi sp,sp,-48 + 30016de: d606 sw ra,44(sp) + 30016e0: d422 sw s0,40(sp) + 30016e2: 1800 addi s0,sp,48 + 30016e4: fca42e23 sw a0,-36(s0) + 30016e8: fcb42c23 sw a1,-40(s0) + 30016ec: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30016f0: fdc42703 lw a4,-36(s0) + 30016f4: 180007b7 lui a5,0x18000 + 30016f8: 00f70b63 beq a4,a5,300170e + 30016fc: 6785 lui a5,0x1 + 30016fe: 93078593 addi a1,a5,-1744 # 930 + 3001702: 030067b7 lui a5,0x3006 + 3001706: 7b478513 addi a0,a5,1972 # 30067b4 + 300170a: 2ca5 jal ra,3001982 + 300170c: a001 j 300170c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCTrigSource(trig)); + 300170e: fd842503 lw a0,-40(s0) + 3001712: 3e19 jal ra,3001228 + 3001714: 87aa mv a5,a0 + 3001716: 0017c793 xori a5,a5,1 + 300171a: 9f81 uxtb a5 + 300171c: eb89 bnez a5,300172e + 300171e: fd442503 lw a0,-44(s0) + 3001722: 3e3d jal ra,3001260 + 3001724: 87aa mv a5,a0 + 3001726: 0017c793 xori a5,a5,1 + 300172a: 9f81 uxtb a5 + 300172c: cb91 beqz a5,3001740 + 300172e: 6785 lui a5,0x1 + 3001730: 93178593 addi a1,a5,-1743 # 931 + 3001734: 030067b7 lui a5,0x3006 + 3001738: 7b478513 addi a0,a5,1972 # 30067b4 + 300173c: 2499 jal ra,3001982 + 300173e: a835 j 300177a + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtaining the Address for Configuring the SOC */ + 3001740: fd842583 lw a1,-40(s0) + 3001744: fdc42503 lw a0,-36(s0) + 3001748: 3d45 jal ra,30015f8 + 300174a: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 300174e: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 3001752: fec42783 lw a5,-20(s0) + 3001756: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_trig_sel = (unsigned int)trig; + 300175a: fd442783 lw a5,-44(s0) + 300175e: 8bfd andi a5,a5,31 + 3001760: 0ff7f693 andi a3,a5,255 + 3001764: fe842703 lw a4,-24(s0) + 3001768: 431c lw a5,0(a4) + 300176a: 8afd andi a3,a3,31 + 300176c: 06a6 slli a3,a3,0x9 + 300176e: 7671 lui a2,0xffffc + 3001770: 1ff60613 addi a2,a2,511 # ffffc1ff + 3001774: 8ff1 and a5,a5,a2 + 3001776: 8fd5 or a5,a5,a3 + 3001778: c31c sw a5,0(a4) +} + 300177a: 50b2 lw ra,44(sp) + 300177c: 5422 lw s0,40(sp) + 300177e: 6145 addi sp,sp,48 + 3001780: 8082 ret + +03001782 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param acqps Capacitor charging time. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetAcqps(ADC_RegStruct * const adcx, ADC_SOCNumber socx, unsigned int acqps) +{ + 3001782: 7179 addi sp,sp,-48 + 3001784: d606 sw ra,44(sp) + 3001786: d422 sw s0,40(sp) + 3001788: 1800 addi s0,sp,48 + 300178a: fca42e23 sw a0,-36(s0) + 300178e: fcb42c23 sw a1,-40(s0) + 3001792: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001796: fdc42703 lw a4,-36(s0) + 300179a: 180007b7 lui a5,0x18000 + 300179e: 00f70b63 beq a4,a5,30017b4 + 30017a2: 6785 lui a5,0x1 + 30017a4: 94178593 addi a1,a5,-1727 # 941 + 30017a8: 030067b7 lui a5,0x3006 + 30017ac: 7b478513 addi a0,a5,1972 # 30067b4 + 30017b0: 2ac9 jal ra,3001982 + 30017b2: a001 j 30017b2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30017b4: fd842503 lw a0,-40(s0) + 30017b8: 3c85 jal ra,3001228 + 30017ba: 87aa mv a5,a0 + 30017bc: 0017c793 xori a5,a5,1 + 30017c0: 9f81 uxtb a5 + 30017c2: cb91 beqz a5,30017d6 + 30017c4: 6785 lui a5,0x1 + 30017c6: 94278593 addi a1,a5,-1726 # 942 + 30017ca: 030067b7 lui a5,0x3006 + 30017ce: 7b478513 addi a0,a5,1972 # 30067b4 + 30017d2: 2a45 jal ra,3001982 + 30017d4: a891 j 3001828 + ADC_PARAM_CHECK_NO_RET(acqps <= 15); /* The value of acqps ranges from 0 to 15 */ + 30017d6: fd442703 lw a4,-44(s0) + 30017da: 47bd li a5,15 + 30017dc: 00e7fb63 bgeu a5,a4,30017f2 + 30017e0: 6785 lui a5,0x1 + 30017e2: 94378593 addi a1,a5,-1725 # 943 + 30017e6: 030067b7 lui a5,0x3006 + 30017ea: 7b478513 addi a0,a5,1972 # 30067b4 + 30017ee: 2a51 jal ra,3001982 + 30017f0: a825 j 3001828 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); + 30017f2: fd842583 lw a1,-40(s0) + 30017f6: fdc42503 lw a0,-36(s0) + 30017fa: 3bfd jal ra,30015f8 + 30017fc: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 3001800: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 3001804: fec42783 lw a5,-20(s0) + 3001808: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_samptime_sel = acqps; + 300180c: fd442783 lw a5,-44(s0) + 3001810: 8bbd andi a5,a5,15 + 3001812: 0ff7f693 andi a3,a5,255 + 3001816: fe842703 lw a4,-24(s0) + 300181a: 431c lw a5,0(a4) + 300181c: 8abd andi a3,a3,15 + 300181e: 0696 slli a3,a3,0x5 + 3001820: e1f7f793 andi a5,a5,-481 + 3001824: 8fd5 or a5,a5,a3 + 3001826: c31c sw a5,0(a4) +} + 3001828: 50b2 lw ra,44(sp) + 300182a: 5422 lw s0,40(sp) + 300182c: 6145 addi sp,sp,48 + 300182e: 8082 ret + +03001830 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SOCxSoftTrigger(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001830: 1101 addi sp,sp,-32 + 3001832: ce06 sw ra,28(sp) + 3001834: cc22 sw s0,24(sp) + 3001836: 1000 addi s0,sp,32 + 3001838: fea42623 sw a0,-20(s0) + 300183c: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001840: fec42703 lw a4,-20(s0) + 3001844: 180007b7 lui a5,0x18000 + 3001848: 00f70b63 beq a4,a5,300185e + 300184c: 6785 lui a5,0x1 + 300184e: 95278593 addi a1,a5,-1710 # 952 + 3001852: 030067b7 lui a5,0x3006 + 3001856: 7b478513 addi a0,a5,1972 # 30067b4 + 300185a: 2225 jal ra,3001982 + 300185c: a001 j 300185c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300185e: fe842503 lw a0,-24(s0) + 3001862: 32d9 jal ra,3001228 + 3001864: 87aa mv a5,a0 + 3001866: 0017c793 xori a5,a5,1 + 300186a: 9f81 uxtb a5 + 300186c: cb91 beqz a5,3001880 + 300186e: 6785 lui a5,0x1 + 3001870: 95378593 addi a1,a5,-1709 # 953 + 3001874: 030067b7 lui a5,0x3006 + 3001878: 7b478513 addi a0,a5,1972 # 30067b4 + 300187c: 2219 jal ra,3001982 + 300187e: a839 j 300189c + adcx->ADC_SOFT_TRIG.reg |= (1U << (unsigned int)socx); + 3001880: fec42783 lw a5,-20(s0) + 3001884: 1607a703 lw a4,352(a5) + 3001888: 4685 li a3,1 + 300188a: fe842783 lw a5,-24(s0) + 300188e: 00f697b3 sll a5,a3,a5 + 3001892: 8f5d or a4,a4,a5 + 3001894: fec42783 lw a5,-20(s0) + 3001898: 16e7a023 sw a4,352(a5) +} + 300189c: 40f2 lw ra,28(sp) + 300189e: 4462 lw s0,24(sp) + 30018a0: 6105 addi sp,sp,32 + 30018a2: 8082 ret + +030018a4 : + * @param adcx ADC register base address. + * @param priorityMode Mode of SOC priority, @ref ADC_PriorityMode. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetPriority(ADC_RegStruct * const adcx, ADC_PriorityMode priorityMode) +{ + 30018a4: 1101 addi sp,sp,-32 + 30018a6: ce06 sw ra,28(sp) + 30018a8: cc22 sw s0,24(sp) + 30018aa: 1000 addi s0,sp,32 + 30018ac: fea42623 sw a0,-20(s0) + 30018b0: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30018b4: fec42703 lw a4,-20(s0) + 30018b8: 180007b7 lui a5,0x18000 + 30018bc: 00f70b63 beq a4,a5,30018d2 + 30018c0: 6785 lui a5,0x1 + 30018c2: 96c78593 addi a1,a5,-1684 # 96c + 30018c6: 030067b7 lui a5,0x3006 + 30018ca: 7b478513 addi a0,a5,1972 # 30067b4 + 30018ce: 2855 jal ra,3001982 + 30018d0: a001 j 30018d0 + ADC_PARAM_CHECK_NO_RET(IsADCPriorityMode(priorityMode)); + 30018d2: fe842503 lw a0,-24(s0) + 30018d6: 3ac9 jal ra,30012a8 + 30018d8: 87aa mv a5,a0 + 30018da: 0017c793 xori a5,a5,1 + 30018de: 9f81 uxtb a5 + 30018e0: cb91 beqz a5,30018f4 + 30018e2: 6785 lui a5,0x1 + 30018e4: 96d78593 addi a1,a5,-1683 # 96d + 30018e8: 030067b7 lui a5,0x3006 + 30018ec: 7b478513 addi a0,a5,1972 # 30067b4 + 30018f0: 2849 jal ra,3001982 + 30018f2: a039 j 3001900 + adcx->ADC_ARBT0.reg = priorityMode; + 30018f4: fec42783 lw a5,-20(s0) + 30018f8: fe842703 lw a4,-24(s0) + 30018fc: 20e7a023 sw a4,512(a5) +} + 3001900: 40f2 lw ra,28(sp) + 3001902: 4462 lw s0,24(sp) + 3001904: 6105 addi sp,sp,32 + 3001906: 8082 ret + +03001908 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval unsigned int, result. + */ +static inline unsigned int DCL_ADC_ReadSOCxResult(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001908: 7179 addi sp,sp,-48 + 300190a: d606 sw ra,44(sp) + 300190c: d422 sw s0,40(sp) + 300190e: 1800 addi s0,sp,48 + 3001910: fca42e23 sw a0,-36(s0) + 3001914: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001918: fdc42703 lw a4,-36(s0) + 300191c: 180007b7 lui a5,0x18000 + 3001920: 00f70b63 beq a4,a5,3001936 + 3001924: 6785 lui a5,0x1 + 3001926: a8778593 addi a1,a5,-1401 # a87 + 300192a: 030067b7 lui a5,0x3006 + 300192e: 7b478513 addi a0,a5,1972 # 30067b4 + 3001932: 2881 jal ra,3001982 + 3001934: a001 j 3001934 + ADC_ASSERT_PARAM(IsADCSOCx(socx)); + 3001936: fd842503 lw a0,-40(s0) + 300193a: 30fd jal ra,3001228 + 300193c: 87aa mv a5,a0 + 300193e: 0017c793 xori a5,a5,1 + 3001942: 9f81 uxtb a5 + 3001944: cb91 beqz a5,3001958 + 3001946: 6785 lui a5,0x1 + 3001948: a8878593 addi a1,a5,-1400 # a88 + 300194c: 030067b7 lui a5,0x3006 + 3001950: 7b478513 addi a0,a5,1972 # 30067b4 + 3001954: 203d jal ra,3001982 + 3001956: a001 j 3001956 + ADC_RESULT0_REG *result; + uintptr_t addr = (uintptr_t)(void *)adcx; + 3001958: fdc42783 lw a5,-36(s0) + 300195c: fef42623 sw a5,-20(s0) + /* The address interval of the result register is 4 */ + result = (ADC_RESULT0_REG *)(void *)(addr + 4 * (unsigned int)socx); + 3001960: fd842783 lw a5,-40(s0) + 3001964: 00279713 slli a4,a5,0x2 + 3001968: fec42783 lw a5,-20(s0) + 300196c: 97ba add a5,a5,a4 + 300196e: fef42423 sw a5,-24(s0) + return result->reg; + 3001972: fe842783 lw a5,-24(s0) + 3001976: 439c lw a5,0(a5) +} + 3001978: 853e mv a0,a5 + 300197a: 50b2 lw ra,44(sp) + 300197c: 5422 lw s0,40(sp) + 300197e: 6145 addi sp,sp,48 + 3001980: 8082 ret + +03001982 : + 3001982: 0650006f j 30021e6 + +03001986 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001986: 7179 addi sp,sp,-48 + 3001988: d606 sw ra,44(sp) + 300198a: d422 sw s0,40(sp) + 300198c: 1800 addi s0,sp,48 + 300198e: fca42e23 sw a0,-36(s0) + 3001992: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001996: fdc42703 lw a4,-36(s0) + 300199a: 180007b7 lui a5,0x18000 + 300199e: 00f70b63 beq a4,a5,30019b4 + 30019a2: 6785 lui a5,0x1 + 30019a4: b4678593 addi a1,a5,-1210 # b46 + 30019a8: 030067b7 lui a5,0x3006 + 30019ac: 7b478513 addi a0,a5,1972 # 30067b4 + 30019b0: 3fc9 jal ra,3001982 + 30019b2: a001 j 30019b2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30019b4: fd842503 lw a0,-40(s0) + 30019b8: 3885 jal ra,3001228 + 30019ba: 87aa mv a5,a0 + 30019bc: 0017c793 xori a5,a5,1 + 30019c0: 9f81 uxtb a5 + 30019c2: cb91 beqz a5,30019d6 + 30019c4: 6785 lui a5,0x1 + 30019c6: b4778593 addi a1,a5,-1209 # b47 + 30019ca: 030067b7 lui a5,0x3006 + 30019ce: 7b478513 addi a0,a5,1972 # 30067b4 + 30019d2: 3f45 jal ra,3001982 + 30019d4: a025 j 30019fc + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 30019d6: fd842583 lw a1,-40(s0) + 30019da: fdc42503 lw a0,-36(s0) + 30019de: 3929 jal ra,30015f8 + 30019e0: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 30019e4: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30019e8: fec42783 lw a5,-20(s0) + 30019ec: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_ENABLE; + 30019f0: fe842703 lw a4,-24(s0) + 30019f4: 431c lw a5,0(a4) + 30019f6: 6691 lui a3,0x4 + 30019f8: 8fd5 or a5,a5,a3 + 30019fa: c31c sw a5,0(a4) +} + 30019fc: 50b2 lw ra,44(sp) + 30019fe: 5422 lw s0,40(sp) + 3001a00: 6145 addi sp,sp,48 + 3001a02: 8082 ret + +03001a04 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_DisableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001a04: 7179 addi sp,sp,-48 + 3001a06: d606 sw ra,44(sp) + 3001a08: d422 sw s0,40(sp) + 3001a0a: 1800 addi s0,sp,48 + 3001a0c: fca42e23 sw a0,-36(s0) + 3001a10: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001a14: fdc42703 lw a4,-36(s0) + 3001a18: 180007b7 lui a5,0x18000 + 3001a1c: 00f70b63 beq a4,a5,3001a32 + 3001a20: 6785 lui a5,0x1 + 3001a22: b5678593 addi a1,a5,-1194 # b56 + 3001a26: 030067b7 lui a5,0x3006 + 3001a2a: 7b478513 addi a0,a5,1972 # 30067b4 + 3001a2e: 3f91 jal ra,3001982 + 3001a30: a001 j 3001a30 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 3001a32: fd842503 lw a0,-40(s0) + 3001a36: ff2ff0ef jal ra,3001228 + 3001a3a: 87aa mv a5,a0 + 3001a3c: 0017c793 xori a5,a5,1 + 3001a40: 9f81 uxtb a5 + 3001a42: cb91 beqz a5,3001a56 + 3001a44: 6785 lui a5,0x1 + 3001a46: b5778593 addi a1,a5,-1193 # b57 + 3001a4a: 030067b7 lui a5,0x3006 + 3001a4e: 7b478513 addi a0,a5,1972 # 30067b4 + 3001a52: 3f05 jal ra,3001982 + 3001a54: a02d j 3001a7e + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 3001a56: fd842583 lw a1,-40(s0) + 3001a5a: fdc42503 lw a0,-36(s0) + 3001a5e: 3e69 jal ra,30015f8 + 3001a60: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 3001a64: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 3001a68: fec42783 lw a5,-20(s0) + 3001a6c: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_DISABLE; + 3001a70: fe842703 lw a4,-24(s0) + 3001a74: 431c lw a5,0(a4) + 3001a76: 76f1 lui a3,0xffffc + 3001a78: 16fd addi a3,a3,-1 # ffffbfff + 3001a7a: 8ff5 and a5,a5,a3 + 3001a7c: c31c sw a5,0(a4) +} + 3001a7e: 50b2 lw ra,44(sp) + 3001a80: 5422 lw s0,40(sp) + 3001a82: 6145 addi sp,sp,48 + 3001a84: 8082 ret + +03001a86 : + * triggered at least 100 us later. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_Init(ADC_Handle *adcHandle) +{ + 3001a86: 1101 addi sp,sp,-32 + 3001a88: ce06 sw ra,28(sp) + 3001a8a: cc22 sw s0,24(sp) + 3001a8c: 1000 addi s0,sp,32 + 3001a8e: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001a92: fec42783 lw a5,-20(s0) + 3001a96: eb89 bnez a5,3001aa8 + 3001a98: 02c00593 li a1,44 + 3001a9c: 030067b7 lui a5,0x3006 + 3001aa0: 7d078513 addi a0,a5,2000 # 30067d0 + 3001aa4: 3df9 jal ra,3001982 + 3001aa6: a001 j 3001aa6 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001aa8: fec42783 lw a5,-20(s0) + 3001aac: 4398 lw a4,0(a5) + 3001aae: 180007b7 lui a5,0x18000 + 3001ab2: 00f70a63 beq a4,a5,3001ac6 + 3001ab6: 02d00593 li a1,45 + 3001aba: 030067b7 lui a5,0x3006 + 3001abe: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ac2: 35c1 jal ra,3001982 + 3001ac4: a001 j 3001ac4 + ADC_PARAM_CHECK_WITH_RET(IsADCPriorityMode(adcHandle->socPriority) == true, BASE_STATUS_ERROR); + 3001ac6: fec42783 lw a5,-20(s0) + 3001aca: 43dc lw a5,4(a5) + 3001acc: 853e mv a0,a5 + 3001ace: fdaff0ef jal ra,30012a8 + 3001ad2: 87aa mv a5,a0 + 3001ad4: 0017c793 xori a5,a5,1 + 3001ad8: 9f81 uxtb a5 + 3001ada: cb99 beqz a5,3001af0 + 3001adc: 02e00593 li a1,46 + 3001ae0: 030067b7 lui a5,0x3006 + 3001ae4: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ae8: 6fe000ef jal ra,30021e6 + 3001aec: 4785 li a5,1 + 3001aee: a091 j 3001b32 + DCL_ADC_SOCxSetPriority(adcHandle->baseAddress, adcHandle->socPriority); + 3001af0: fec42783 lw a5,-20(s0) + 3001af4: 4398 lw a4,0(a5) + 3001af6: fec42783 lw a5,-20(s0) + 3001afa: 43dc lw a5,4(a5) + 3001afc: 85be mv a1,a5 + 3001afe: 853a mv a0,a4 + 3001b00: 3355 jal ra,30018a4 + adcHandle->baseAddress->ADC_ANA_CTRL0.BIT.cfg_sar_samp_cap_sel = 0x4; /* Set the Number of Sampling Capacitors */ + 3001b02: fec42783 lw a5,-20(s0) + 3001b06: 4398 lw a4,0(a5) + 3001b08: 65472783 lw a5,1620(a4) + 3001b0c: 100006b7 lui a3,0x10000 + 3001b10: 16fd addi a3,a3,-1 # fffffff + 3001b12: 8efd and a3,a3,a5 + 3001b14: 400007b7 lui a5,0x40000 + 3001b18: 8fd5 or a5,a5,a3 + 3001b1a: 64f72a23 sw a5,1620(a4) + adcHandle->baseAddress->ADC_EN.reg = BASE_CFG_ENABLE; /* Enable ADC Controller */ + 3001b1e: fec42783 lw a5,-20(s0) + 3001b22: 439c lw a5,0(a5) + 3001b24: 4705 li a4,1 + 3001b26: 30e7a023 sw a4,768(a5) # 40000300 + BASE_FUNC_DelayUs(100); /* Wait for 100 us until the ADC controller is stable */ + 3001b2a: 06400513 li a0,100 + 3001b2e: 25cd jal ra,3002210 + return BASE_STATUS_OK; + 3001b30: 4781 li a5,0 +} + 3001b32: 853e mv a0,a5 + 3001b34: 40f2 lw ra,28(sp) + 3001b36: 4462 lw s0,24(sp) + 3001b38: 6105 addi sp,sp,32 + 3001b3a: 8082 ret + +03001b3c : + * @param soc ID of SOC(start of conversion), managing the specific sample inputs. + * @param socParam Param struct of SOC. This is related to the peripheral circuit design, @ref SOC_Param. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_ConfigureSoc(ADC_Handle *adcHandle, ADC_SOCNumber soc, SOC_Param *socParam) +{ + 3001b3c: 1101 addi sp,sp,-32 + 3001b3e: ce06 sw ra,28(sp) + 3001b40: cc22 sw s0,24(sp) + 3001b42: 1000 addi s0,sp,32 + 3001b44: fea42623 sw a0,-20(s0) + 3001b48: feb42423 sw a1,-24(s0) + 3001b4c: fec42223 sw a2,-28(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001b50: fec42783 lw a5,-20(s0) + 3001b54: eb89 bnez a5,3001b66 + 3001b56: 04c00593 li a1,76 + 3001b5a: 030067b7 lui a5,0x3006 + 3001b5e: 7d078513 addi a0,a5,2000 # 30067d0 + 3001b62: 2551 jal ra,30021e6 + 3001b64: a001 j 3001b64 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001b66: fec42783 lw a5,-20(s0) + 3001b6a: 4398 lw a4,0(a5) + 3001b6c: 180007b7 lui a5,0x18000 + 3001b70: 00f70a63 beq a4,a5,3001b84 + 3001b74: 04d00593 li a1,77 + 3001b78: 030067b7 lui a5,0x3006 + 3001b7c: 7d078513 addi a0,a5,2000 # 30067d0 + 3001b80: 259d jal ra,30021e6 + 3001b82: a001 j 3001b82 + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001b84: fe842503 lw a0,-24(s0) + 3001b88: ea0ff0ef jal ra,3001228 + 3001b8c: 87aa mv a5,a0 + 3001b8e: 0017c793 xori a5,a5,1 + 3001b92: 9f81 uxtb a5 + 3001b94: cb91 beqz a5,3001ba8 + 3001b96: 04e00593 li a1,78 + 3001b9a: 030067b7 lui a5,0x3006 + 3001b9e: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ba2: 2591 jal ra,30021e6 + 3001ba4: 4785 li a5,1 + 3001ba6: aa3d j 3001ce4 + ADC_ASSERT_PARAM(socParam != NULL); + 3001ba8: fe442783 lw a5,-28(s0) + 3001bac: eb89 bnez a5,3001bbe + 3001bae: 04f00593 li a1,79 + 3001bb2: 030067b7 lui a5,0x3006 + 3001bb6: 7d078513 addi a0,a5,2000 # 30067d0 + 3001bba: 2535 jal ra,30021e6 + 3001bbc: a001 j 3001bbc + ADC_PARAM_CHECK_WITH_RET(IsADCSampleChannel(socParam->adcInput) == true, BASE_STATUS_ERROR); + 3001bbe: fe442783 lw a5,-28(s0) + 3001bc2: 439c lw a5,0(a5) + 3001bc4: 853e mv a0,a5 + 3001bc6: e46ff0ef jal ra,300120c + 3001bca: 87aa mv a5,a0 + 3001bcc: 0017c793 xori a5,a5,1 + 3001bd0: 9f81 uxtb a5 + 3001bd2: cb91 beqz a5,3001be6 + 3001bd4: 05000593 li a1,80 + 3001bd8: 030067b7 lui a5,0x3006 + 3001bdc: 7d078513 addi a0,a5,2000 # 30067d0 + 3001be0: 2519 jal ra,30021e6 + 3001be2: 4785 li a5,1 + 3001be4: a201 j 3001ce4 + ADC_PARAM_CHECK_WITH_RET(IsADCTotalTime(socParam->sampleTotalTime) == true, BASE_STATUS_ERROR); + 3001be6: fe442783 lw a5,-28(s0) + 3001bea: 43dc lw a5,4(a5) + 3001bec: 853e mv a0,a5 + 3001bee: ed8ff0ef jal ra,30012c6 + 3001bf2: 87aa mv a5,a0 + 3001bf4: 0017c793 xori a5,a5,1 + 3001bf8: 9f81 uxtb a5 + 3001bfa: cb91 beqz a5,3001c0e + 3001bfc: 05100593 li a1,81 + 3001c00: 030067b7 lui a5,0x3006 + 3001c04: 7d078513 addi a0,a5,2000 # 30067d0 + 3001c08: 2bf9 jal ra,30021e6 + 3001c0a: 4785 li a5,1 + 3001c0c: a8e1 j 3001ce4 + ADC_PARAM_CHECK_WITH_RET(IsADCTrigSource(socParam->trigSource) == true, BASE_STATUS_ERROR); + 3001c0e: fe442783 lw a5,-28(s0) + 3001c12: 479c lw a5,8(a5) + 3001c14: 853e mv a0,a5 + 3001c16: e4aff0ef jal ra,3001260 + 3001c1a: 87aa mv a5,a0 + 3001c1c: 0017c793 xori a5,a5,1 + 3001c20: 9f81 uxtb a5 + 3001c22: cb91 beqz a5,3001c36 + 3001c24: 05200593 li a1,82 + 3001c28: 030067b7 lui a5,0x3006 + 3001c2c: 7d078513 addi a0,a5,2000 # 30067d0 + 3001c30: 2b5d jal ra,30021e6 + 3001c32: 4785 li a5,1 + 3001c34: a845 j 3001ce4 + ADC_PARAM_CHECK_WITH_RET(IsADCFinishMode(socParam->finishMode) == true, BASE_STATUS_ERROR); + 3001c36: fe442783 lw a5,-28(s0) + 3001c3a: 4b9c lw a5,16(a5) + 3001c3c: 853e mv a0,a5 + 3001c3e: e3eff0ef jal ra,300127c + 3001c42: 87aa mv a5,a0 + 3001c44: 0017c793 xori a5,a5,1 + 3001c48: 9f81 uxtb a5 + 3001c4a: cb91 beqz a5,3001c5e + 3001c4c: 05300593 li a1,83 + 3001c50: 030067b7 lui a5,0x3006 + 3001c54: 7d078513 addi a0,a5,2000 # 30067d0 + 3001c58: 2379 jal ra,30021e6 + 3001c5a: 4785 li a5,1 + 3001c5c: a061 j 3001ce4 + DCL_ADC_SOCxSelectChannel(adcHandle->baseAddress, soc, socParam->adcInput); /* Set channel */ + 3001c5e: fec42783 lw a5,-20(s0) + 3001c62: 4398 lw a4,0(a5) + 3001c64: fe442783 lw a5,-28(s0) + 3001c68: 439c lw a5,0(a5) + 3001c6a: 863e mv a2,a5 + 3001c6c: fe842583 lw a1,-24(s0) + 3001c70: 853a mv a0,a4 + 3001c72: 3a75 jal ra,300162e + DCL_ADC_SOCxSetAcqps(adcHandle->baseAddress, soc, socParam->sampleTotalTime); /* Set sampling time */ + 3001c74: fec42783 lw a5,-20(s0) + 3001c78: 4398 lw a4,0(a5) + 3001c7a: fe442783 lw a5,-28(s0) + 3001c7e: 43dc lw a5,4(a5) + 3001c80: 863e mv a2,a5 + 3001c82: fe842583 lw a1,-24(s0) + 3001c86: 853a mv a0,a4 + 3001c88: 3ced jal ra,3001782 + DCL_ADC_SOCxSelcetTrigSource(adcHandle->baseAddress, soc, socParam->trigSource); /* Set trigger source */ + 3001c8a: fec42783 lw a5,-20(s0) + 3001c8e: 4398 lw a4,0(a5) + 3001c90: fe442783 lw a5,-28(s0) + 3001c94: 479c lw a5,8(a5) + 3001c96: 863e mv a2,a5 + 3001c98: fe842583 lw a1,-24(s0) + 3001c9c: 853a mv a0,a4 + 3001c9e: 3c3d jal ra,30016dc + if (socParam->continueMode == true) { /* Continuous Mode Judgment */ + 3001ca0: fe442783 lw a5,-28(s0) + 3001ca4: 27dc lbu a5,12(a5) + 3001ca6: cb89 beqz a5,3001cb8 + DCL_ADC_EnableSOCxContinue(adcHandle->baseAddress, soc); + 3001ca8: fec42783 lw a5,-20(s0) + 3001cac: 439c lw a5,0(a5) + 3001cae: fe842583 lw a1,-24(s0) + 3001cb2: 853e mv a0,a5 + 3001cb4: 39c9 jal ra,3001986 + 3001cb6: a801 j 3001cc6 + } else { + DCL_ADC_DisableSOCxContinue(adcHandle->baseAddress, soc); + 3001cb8: fec42783 lw a5,-20(s0) + 3001cbc: 439c lw a5,0(a5) + 3001cbe: fe842583 lw a1,-24(s0) + 3001cc2: 853e mv a0,a5 + 3001cc4: 3381 jal ra,3001a04 + } + adcHandle->ADC_SOCxParam[soc].finishMode = socParam->finishMode; + 3001cc6: fe442783 lw a5,-28(s0) + 3001cca: 4b9c lw a5,16(a5) + 3001ccc: 01079713 slli a4,a5,0x10 + 3001cd0: 8341 srli a4,a4,0x10 + 3001cd2: fec42683 lw a3,-20(s0) + 3001cd6: fe842783 lw a5,-24(s0) + 3001cda: 07a1 addi a5,a5,8 + 3001cdc: 0786 slli a5,a5,0x1 + 3001cde: 97b6 add a5,a5,a3 + 3001ce0: a3da sh a4,4(a5) + return BASE_STATUS_OK; + 3001ce2: 4781 li a5,0 +} + 3001ce4: 853e mv a0,a5 + 3001ce6: 40f2 lw ra,28(sp) + 3001ce8: 4462 lw s0,24(sp) + 3001cea: 6105 addi sp,sp,32 + 3001cec: 8082 ret + +03001cee : + * interrupt is reported. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_StartIt(ADC_Handle *adcHandle) +{ + 3001cee: 7179 addi sp,sp,-48 + 3001cf0: d606 sw ra,44(sp) + 3001cf2: d422 sw s0,40(sp) + 3001cf4: 1800 addi s0,sp,48 + 3001cf6: fca42e23 sw a0,-36(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001cfa: fdc42783 lw a5,-36(s0) + 3001cfe: eb89 bnez a5,3001d10 + 3001d00: 0af00593 li a1,175 + 3001d04: 030067b7 lui a5,0x3006 + 3001d08: 7d078513 addi a0,a5,2000 # 30067d0 + 3001d0c: 29e9 jal ra,30021e6 + 3001d0e: a001 j 3001d0e + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001d10: fdc42783 lw a5,-36(s0) + 3001d14: 4398 lw a4,0(a5) + 3001d16: 180007b7 lui a5,0x18000 + 3001d1a: 00f70a63 beq a4,a5,3001d2e + 3001d1e: 0b000593 li a1,176 + 3001d22: 030067b7 lui a5,0x3006 + 3001d26: 7d078513 addi a0,a5,2000 # 30067d0 + 3001d2a: 2975 jal ra,30021e6 + 3001d2c: a001 j 3001d2c + unsigned int intVal = 0; + 3001d2e: fe042423 sw zero,-24(s0) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001d32: fe042623 sw zero,-20(s0) + 3001d36: a859 j 3001dcc + intVal = adcHandle->ADC_SOCxParam[i].finishMode; + 3001d38: fdc42703 lw a4,-36(s0) + 3001d3c: fec42783 lw a5,-20(s0) + 3001d40: 07a1 addi a5,a5,8 + 3001d42: 0786 slli a5,a5,0x1 + 3001d44: 97ba add a5,a5,a4 + 3001d46: 23de lhu a5,4(a5) + 3001d48: fef42423 sw a5,-24(s0) + switch (intVal) { + 3001d4c: fe842783 lw a5,-24(s0) + 3001d50: 4711 li a4,4 + 3001d52: 02e78a63 beq a5,a4,3001d86 + 3001d56: 4711 li a4,4 + 3001d58: 00f76663 bltu a4,a5,3001d64 + 3001d5c: 470d li a4,3 + 3001d5e: 00e78a63 beq a5,a4,3001d72 + break; + case ADC_SOCFINISH_INT3: + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + break; + default: + break; + 3001d62: a085 j 3001dc2 + switch (intVal) { + 3001d64: 4715 li a4,5 + 3001d66: 02e78a63 beq a5,a4,3001d9a + 3001d6a: 4719 li a4,6 + 3001d6c: 04e78163 beq a5,a4,3001dae + break; + 3001d70: a889 j 3001dc2 + DCL_ADC_SetSOCxBlindInt0(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 0 */ + 3001d72: fdc42783 lw a5,-36(s0) + 3001d76: 439c lw a5,0(a5) + 3001d78: fec42703 lw a4,-20(s0) + 3001d7c: 85ba mv a1,a4 + 3001d7e: 853e mv a0,a5 + 3001d80: da6ff0ef jal ra,3001326 + break; + 3001d84: a83d j 3001dc2 + DCL_ADC_SetSOCxBlindInt1(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 1 */ + 3001d86: fdc42783 lw a5,-36(s0) + 3001d8a: 439c lw a5,0(a5) + 3001d8c: fec42703 lw a4,-20(s0) + 3001d90: 85ba mv a1,a4 + 3001d92: 853e mv a0,a5 + 3001d94: e0eff0ef jal ra,30013a2 + break; + 3001d98: a02d j 3001dc2 + DCL_ADC_SetSOCxBlindInt2(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 2 */ + 3001d9a: fdc42783 lw a5,-36(s0) + 3001d9e: 439c lw a5,0(a5) + 3001da0: fec42703 lw a4,-20(s0) + 3001da4: 85ba mv a1,a4 + 3001da6: 853e mv a0,a5 + 3001da8: e78ff0ef jal ra,3001420 + break; + 3001dac: a819 j 3001dc2 + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + 3001dae: fdc42783 lw a5,-36(s0) + 3001db2: 439c lw a5,0(a5) + 3001db4: fec42703 lw a4,-20(s0) + 3001db8: 85ba mv a1,a4 + 3001dba: 853e mv a0,a5 + 3001dbc: ee0ff0ef jal ra,300149c + break; + 3001dc0: 0001 nop + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001dc2: fec42783 lw a5,-20(s0) + 3001dc6: 0785 addi a5,a5,1 + 3001dc8: fef42623 sw a5,-20(s0) + 3001dcc: fec42703 lw a4,-20(s0) + 3001dd0: 47bd li a5,15 + 3001dd2: f6e7d3e3 bge a5,a4,3001d38 + } + } /* Enable ADC Interrupt */ + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER0); + 3001dd6: fdc42783 lw a5,-36(s0) + 3001dda: 439c lw a5,0(a5) + 3001ddc: 4581 li a1,0 + 3001dde: 853e mv a0,a5 + 3001de0: f3aff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER1); + 3001de4: fdc42783 lw a5,-36(s0) + 3001de8: 439c lw a5,0(a5) + 3001dea: 4585 li a1,1 + 3001dec: 853e mv a0,a5 + 3001dee: f2cff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + 3001df2: fdc42783 lw a5,-36(s0) + 3001df6: 439c lw a5,0(a5) + 3001df8: 4589 li a1,2 + 3001dfa: 853e mv a0,a5 + 3001dfc: f1eff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER3); + 3001e00: fdc42783 lw a5,-36(s0) + 3001e04: 439c lw a5,0(a5) + 3001e06: 458d li a1,3 + 3001e08: 853e mv a0,a5 + 3001e0a: f10ff0ef jal ra,300151a + return BASE_STATUS_OK; + 3001e0e: 4781 li a5,0 +} + 3001e10: 853e mv a0,a5 + 3001e12: 50b2 lw ra,44(sp) + 3001e14: 5422 lw s0,40(sp) + 3001e16: 6145 addi sp,sp,48 + 3001e18: 8082 ret + +03001e1a : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_SoftTrigSample(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001e1a: 1101 addi sp,sp,-32 + 3001e1c: ce06 sw ra,28(sp) + 3001e1e: cc22 sw s0,24(sp) + 3001e20: 1000 addi s0,sp,32 + 3001e22: fea42623 sw a0,-20(s0) + 3001e26: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001e2a: fec42783 lw a5,-20(s0) + 3001e2e: eb89 bnez a5,3001e40 + 3001e30: 0e500593 li a1,229 + 3001e34: 030067b7 lui a5,0x3006 + 3001e38: 7d078513 addi a0,a5,2000 # 30067d0 + 3001e3c: 266d jal ra,30021e6 + 3001e3e: a001 j 3001e3e + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001e40: fec42783 lw a5,-20(s0) + 3001e44: 4398 lw a4,0(a5) + 3001e46: 180007b7 lui a5,0x18000 + 3001e4a: 00f70a63 beq a4,a5,3001e5e + 3001e4e: 0e600593 li a1,230 + 3001e52: 030067b7 lui a5,0x3006 + 3001e56: 7d078513 addi a0,a5,2000 # 30067d0 + 3001e5a: 2671 jal ra,30021e6 + 3001e5c: a001 j 3001e5c + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001e5e: fe842503 lw a0,-24(s0) + 3001e62: bc6ff0ef jal ra,3001228 + 3001e66: 87aa mv a5,a0 + 3001e68: 0017c793 xori a5,a5,1 + 3001e6c: 9f81 uxtb a5 + 3001e6e: cb91 beqz a5,3001e82 + 3001e70: 0e700593 li a1,231 + 3001e74: 030067b7 lui a5,0x3006 + 3001e78: 7d078513 addi a0,a5,2000 # 30067d0 + 3001e7c: 26ad jal ra,30021e6 + 3001e7e: 4785 li a5,1 + 3001e80: a809 j 3001e92 + DCL_ADC_SOCxSoftTrigger(adcHandle->baseAddress, soc); /* Software triggers a single SOC */ + 3001e82: fec42783 lw a5,-20(s0) + 3001e86: 439c lw a5,0(a5) + 3001e88: fe842583 lw a1,-24(s0) + 3001e8c: 853e mv a0,a5 + 3001e8e: 324d jal ra,3001830 + return BASE_STATUS_OK; + 3001e90: 4781 li a5,0 +} + 3001e92: 853e mv a0,a5 + 3001e94: 40f2 lw ra,28(sp) + 3001e96: 4462 lw s0,24(sp) + 3001e98: 6105 addi sp,sp,32 + 3001e9a: 8082 ret + +03001e9c : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval unsigned int value of ADC convert result. + */ +unsigned int HAL_ADC_GetConvResult(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001e9c: 1101 addi sp,sp,-32 + 3001e9e: ce06 sw ra,28(sp) + 3001ea0: cc22 sw s0,24(sp) + 3001ea2: 1000 addi s0,sp,32 + 3001ea4: fea42623 sw a0,-20(s0) + 3001ea8: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001eac: fec42783 lw a5,-20(s0) + 3001eb0: eb89 bnez a5,3001ec2 + 3001eb2: 0f400593 li a1,244 + 3001eb6: 030067b7 lui a5,0x3006 + 3001eba: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ebe: 2625 jal ra,30021e6 + 3001ec0: a001 j 3001ec0 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001ec2: fec42783 lw a5,-20(s0) + 3001ec6: 4398 lw a4,0(a5) + 3001ec8: 180007b7 lui a5,0x18000 + 3001ecc: 00f70a63 beq a4,a5,3001ee0 + 3001ed0: 0f500593 li a1,245 + 3001ed4: 030067b7 lui a5,0x3006 + 3001ed8: 7d078513 addi a0,a5,2000 # 30067d0 + 3001edc: 2629 jal ra,30021e6 + 3001ede: a001 j 3001ede + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001ee0: fe842503 lw a0,-24(s0) + 3001ee4: b44ff0ef jal ra,3001228 + 3001ee8: 87aa mv a5,a0 + 3001eea: 0017c793 xori a5,a5,1 + 3001eee: 9f81 uxtb a5 + 3001ef0: cb91 beqz a5,3001f04 + 3001ef2: 0f600593 li a1,246 + 3001ef6: 030067b7 lui a5,0x3006 + 3001efa: 7d078513 addi a0,a5,2000 # 30067d0 + 3001efe: 24e5 jal ra,30021e6 + 3001f00: 4785 li a5,1 + 3001f02: a809 j 3001f14 + return DCL_ADC_ReadSOCxResult(adcHandle->baseAddress, soc); + 3001f04: fec42783 lw a5,-20(s0) + 3001f08: 439c lw a5,0(a5) + 3001f0a: fe842583 lw a1,-24(s0) + 3001f0e: 853e mv a0,a5 + 3001f10: 3ae5 jal ra,3001908 + 3001f12: 87aa mv a5,a0 +} + 3001f14: 853e mv a0,a5 + 3001f16: 40f2 lw ra,28(sp) + 3001f18: 4462 lw s0,24(sp) + 3001f1a: 6105 addi sp,sp,32 + 3001f1c: 8082 ret + +03001f1e : + * @param adcHandle ADC handle. + * @param intx ADC interrupt type number @ref ADC_IntNumber. + * @retval None. + */ +static void ADC_IntxClearEoc(ADC_Handle *adcHandle, unsigned int intx) +{ + 3001f1e: 7139 addi sp,sp,-64 + 3001f20: de22 sw s0,60(sp) + 3001f22: 0080 addi s0,sp,64 + 3001f24: fca42623 sw a0,-52(s0) + 3001f28: fcb42423 sw a1,-56(s0) + unsigned int eocFlag = adcHandle->baseAddress->ADC_EOC_FLAG.reg; + 3001f2c: fcc42783 lw a5,-52(s0) + 3001f30: 439c lw a5,0(a5) + 3001f32: 5bbc lw a5,112(a5) + 3001f34: fef42223 sw a5,-28(s0) + ADC_INT_DATA_0_REG intData0; + ADC_INT_DATA_1_REG intData1; + unsigned int eocMask = 0; + 3001f38: fe042623 sw zero,-20(s0) + switch (intx) { + 3001f3c: fc842783 lw a5,-56(s0) + 3001f40: 4705 li a4,1 + 3001f42: 02e78963 beq a5,a4,3001f74 + 3001f46: 4705 li a4,1 + 3001f48: 00e7e963 bltu a5,a4,3001f5a + 3001f4c: 4709 li a4,2 + 3001f4e: 04e78163 beq a5,a4,3001f90 + 3001f52: 470d li a4,3 + 3001f54: 04e78b63 beq a5,a4,3001faa + case ADC_INT_NUMBER3: /* Read Interrupt Configuration */ + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + eocMask = intData1.BIT.cfg_intr_data_sel3; + break; + default: + break; + 3001f58: a0bd j 3001fc6 + intData0.reg = adcHandle->baseAddress->ADC_INT_DATA_0.reg; + 3001f5a: fcc42783 lw a5,-52(s0) + 3001f5e: 439c lw a5,0(a5) + 3001f60: 2b07a783 lw a5,688(a5) + 3001f64: fcf42c23 sw a5,-40(s0) + eocMask = intData0.BIT.cfg_intr_data_sel0; + 3001f68: fd842783 lw a5,-40(s0) + 3001f6c: 9fa1 uxth a5 + 3001f6e: fef42623 sw a5,-20(s0) + break; + 3001f72: a891 j 3001fc6 + intData0.reg = adcHandle->baseAddress->ADC_INT_DATA_0.reg; + 3001f74: fcc42783 lw a5,-52(s0) + 3001f78: 439c lw a5,0(a5) + 3001f7a: 2b07a783 lw a5,688(a5) + 3001f7e: fcf42c23 sw a5,-40(s0) + eocMask = intData0.BIT.cfg_intr_data_sel1; + 3001f82: fd842783 lw a5,-40(s0) + 3001f86: 83c1 srli a5,a5,0x10 + 3001f88: 9fa1 uxth a5 + 3001f8a: fef42623 sw a5,-20(s0) + break; + 3001f8e: a825 j 3001fc6 + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + 3001f90: fcc42783 lw a5,-52(s0) + 3001f94: 439c lw a5,0(a5) + 3001f96: 2b47a783 lw a5,692(a5) + 3001f9a: fcf42a23 sw a5,-44(s0) + eocMask = intData1.BIT.cfg_intr_data_sel2; + 3001f9e: fd442783 lw a5,-44(s0) + 3001fa2: 9fa1 uxth a5 + 3001fa4: fef42623 sw a5,-20(s0) + break; + 3001fa8: a839 j 3001fc6 + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + 3001faa: fcc42783 lw a5,-52(s0) + 3001fae: 439c lw a5,0(a5) + 3001fb0: 2b47a783 lw a5,692(a5) + 3001fb4: fcf42a23 sw a5,-44(s0) + eocMask = intData1.BIT.cfg_intr_data_sel3; + 3001fb8: fd442783 lw a5,-44(s0) + 3001fbc: 83c1 srli a5,a5,0x10 + 3001fbe: 9fa1 uxth a5 + 3001fc0: fef42623 sw a5,-20(s0) + break; + 3001fc4: 0001 nop + } + unsigned int eoc = eocFlag & eocMask; + 3001fc6: fe442703 lw a4,-28(s0) + 3001fca: fec42783 lw a5,-20(s0) + 3001fce: 8ff9 and a5,a5,a4 + 3001fd0: fef42023 sw a5,-32(s0) + adcHandle->ADC_IntxParam[intx].socxFinish = eoc; + 3001fd4: fe042783 lw a5,-32(s0) + 3001fd8: 01079713 slli a4,a5,0x10 + 3001fdc: 8341 srli a4,a4,0x10 + 3001fde: fcc42683 lw a3,-52(s0) + 3001fe2: fc842783 lw a5,-56(s0) + 3001fe6: 07e1 addi a5,a5,24 + 3001fe8: 0786 slli a5,a5,0x1 + 3001fea: 97b6 add a5,a5,a3 + 3001fec: a3da sh a4,4(a5) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001fee: fe042423 sw zero,-24(s0) + 3001ff2: a80d j 3002024 + unsigned int val = (1 << i); + 3001ff4: 4705 li a4,1 + 3001ff6: fe842783 lw a5,-24(s0) + 3001ffa: 00f717b3 sll a5,a4,a5 + 3001ffe: fcf42e23 sw a5,-36(s0) + if (eoc & val) { + 3002002: fe042703 lw a4,-32(s0) + 3002006: fdc42783 lw a5,-36(s0) + 300200a: 8ff9 and a5,a5,a4 + 300200c: c799 beqz a5,300201a + adcHandle->baseAddress->ADC_EOC_FLAG.reg = val; /* Clear the EOC flag */ + 300200e: fcc42783 lw a5,-52(s0) + 3002012: 439c lw a5,0(a5) + 3002014: fdc42703 lw a4,-36(s0) + 3002018: dbb8 sw a4,112(a5) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 300201a: fe842783 lw a5,-24(s0) + 300201e: 0785 addi a5,a5,1 + 3002020: fef42423 sw a5,-24(s0) + 3002024: fe842703 lw a4,-24(s0) + 3002028: 47bd li a5,15 + 300202a: fce7d5e3 bge a5,a4,3001ff4 + } + } +} + 300202e: 0001 nop + 3002030: 5472 lw s0,60(sp) + 3002032: 6121 addi sp,sp,64 + 3002034: 8082 ret + +03002036 : + * @brief ADC Interrupt2 service processing function. + * @param handle ADC handle. + * @retval None. + */ +void HAL_ADC_IrqHandlerInt2(void *handle) +{ + 3002036: 7179 addi sp,sp,-48 + 3002038: d606 sw ra,44(sp) + 300203a: d422 sw s0,40(sp) + 300203c: 1800 addi s0,sp,48 + 300203e: fca42e23 sw a0,-36(s0) + ADC_ASSERT_PARAM(handle != NULL); + 3002042: fdc42783 lw a5,-36(s0) + 3002046: eb89 bnez a5,3002058 + 3002048: 17900593 li a1,377 + 300204c: 030067b7 lui a5,0x3006 + 3002050: 7d078513 addi a0,a5,2000 # 30067d0 + 3002054: 2a49 jal ra,30021e6 + 3002056: a001 j 3002056 + ADC_Handle *adcHandle = (ADC_Handle *)handle; + 3002058: fdc42783 lw a5,-36(s0) + 300205c: fef42623 sw a5,-20(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3002060: fec42783 lw a5,-20(s0) + 3002064: 4398 lw a4,0(a5) + 3002066: 180007b7 lui a5,0x18000 + 300206a: 00f70a63 beq a4,a5,300207e + 300206e: 17b00593 li a1,379 + 3002072: 030067b7 lui a5,0x3006 + 3002076: 7d078513 addi a0,a5,2000 # 30067d0 + 300207a: 22b5 jal ra,30021e6 + 300207c: a001 j 300207c + ADC_IntxClearEoc(adcHandle, ADC_INT_NUMBER2); /* Clear conversion completion flag */ + 300207e: 4589 li a1,2 + 3002080: fec42503 lw a0,-20(s0) + 3002084: 3d69 jal ra,3001f1e + DCL_ADC_ClearIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + 3002086: fec42783 lw a5,-20(s0) + 300208a: 439c lw a5,0(a5) + 300208c: 4589 li a1,2 + 300208e: 853e mv a0,a5 + 3002090: cfeff0ef jal ra,300158e + if (adcHandle->userCallBack.Int2FinishCallBack != NULL) { + 3002094: fec42783 lw a5,-20(s0) + 3002098: 43fc lw a5,68(a5) + 300209a: c799 beqz a5,30020a8 + adcHandle->userCallBack.Int2FinishCallBack(handle); + 300209c: fec42783 lw a5,-20(s0) + 30020a0: 43fc lw a5,68(a5) + 30020a2: fdc42503 lw a0,-36(s0) + 30020a6: 9782 jalr a5 + } +} + 30020a8: 0001 nop + 30020aa: 50b2 lw ra,44(sp) + 30020ac: 5422 lw s0,40(sp) + 30020ae: 6145 addi sp,sp,48 + 30020b0: 8082 ret + +030020b2 : + * @param typeID Id of callback function type. + * @param pCallback Pointer of the specified callbcak function. + * @retval None. + */ +static void ADC_RegieterEventCallBack(ADC_Handle *adcHandle, ADC_CallbackFunType typeID, ADC_CallbackType pCallback) +{ + 30020b2: 7179 addi sp,sp,-48 + 30020b4: d622 sw s0,44(sp) + 30020b6: 1800 addi s0,sp,48 + 30020b8: fca42e23 sw a0,-36(s0) + 30020bc: fcb42c23 sw a1,-40(s0) + 30020c0: fcc42a23 sw a2,-44(s0) + if (typeID > ADC_CALLBACK_EVENT_PPB3_ERROR || typeID < ADC_CALLBACK_EVENT_PPB0_ZERO) { + 30020c4: fd842703 lw a4,-40(s0) + 30020c8: 47fd li a5,31 + 30020ca: 02e7e763 bltu a5,a4,30020f8 + 30020ce: fd842703 lw a4,-40(s0) + 30020d2: 47bd li a5,15 + 30020d4: 02e7f263 bgeu a5,a4,30020f8 + return; + } + unsigned int index = ((unsigned int)typeID & 0xF); + 30020d8: fd842783 lw a5,-40(s0) + 30020dc: 8bbd andi a5,a5,15 + 30020de: fef42623 sw a5,-20(s0) + adcHandle->userCallBack.PPBEventCallBack[index] = pCallback; + 30020e2: fdc42703 lw a4,-36(s0) + 30020e6: fec42783 lw a5,-20(s0) + 30020ea: 07d1 addi a5,a5,20 + 30020ec: 078a slli a5,a5,0x2 + 30020ee: 97ba add a5,a5,a4 + 30020f0: fd442703 lw a4,-44(s0) + 30020f4: cb98 sw a4,16(a5) + 30020f6: a011 j 30020fa + return; + 30020f8: 0001 nop +} + 30020fa: 5432 lw s0,44(sp) + 30020fc: 6145 addi sp,sp,48 + 30020fe: 8082 ret + +03002100 : + * @param typeID Id of callback function type. + * @param pCallback Pointer of the specified callbcak function. + * @retval None. + */ +void HAL_ADC_RegisterCallBack(ADC_Handle *adcHandle, ADC_CallbackFunType typeID, ADC_CallbackType pCallback) +{ + 3002100: 1101 addi sp,sp,-32 + 3002102: ce06 sw ra,28(sp) + 3002104: cc22 sw s0,24(sp) + 3002106: 1000 addi s0,sp,32 + 3002108: fea42623 sw a0,-20(s0) + 300210c: feb42423 sw a1,-24(s0) + 3002110: fec42223 sw a2,-28(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3002114: fec42783 lw a5,-20(s0) + 3002118: eb89 bnez a5,300212a + 300211a: 1d900593 li a1,473 + 300211e: 030067b7 lui a5,0x3006 + 3002122: 7d078513 addi a0,a5,2000 # 30067d0 + 3002126: 20c1 jal ra,30021e6 + 3002128: a001 j 3002128 + ADC_ASSERT_PARAM(pCallback != NULL); + 300212a: fe442783 lw a5,-28(s0) + 300212e: eb89 bnez a5,3002140 + 3002130: 1da00593 li a1,474 + 3002134: 030067b7 lui a5,0x3006 + 3002138: 7d078513 addi a0,a5,2000 # 30067d0 + 300213c: 206d jal ra,30021e6 + 300213e: a001 j 300213e + switch (typeID) { /* Register the callback function based on the interrupt type */ + 3002140: fe842703 lw a4,-24(s0) + 3002144: 47a1 li a5,8 + 3002146: 08e7e363 bltu a5,a4,30021cc + 300214a: fe842783 lw a5,-24(s0) + 300214e: 00279713 slli a4,a5,0x2 + 3002152: 030077b7 lui a5,0x3007 + 3002156: 80478793 addi a5,a5,-2044 # 3006804 + 300215a: 97ba add a5,a5,a4 + 300215c: 439c lw a5,0(a5) + 300215e: 8782 jr a5 + case ADC_CALLBACK_INT0: + adcHandle->userCallBack.Int0FinishCallBack = pCallback; /* Sampling finsish interrupt 0 callback function */ + 3002160: fec42783 lw a5,-20(s0) + 3002164: fe442703 lw a4,-28(s0) + 3002168: dfd8 sw a4,60(a5) + break; + 300216a: a88d j 30021dc + case ADC_CALLBACK_INT1: + adcHandle->userCallBack.Int1FinishCallBack = pCallback; /* Sampling finsish interrupt 1 callback function */ + 300216c: fec42783 lw a5,-20(s0) + 3002170: fe442703 lw a4,-28(s0) + 3002174: c3b8 sw a4,64(a5) + break; + 3002176: a09d j 30021dc + case ADC_CALLBACK_INT2: + adcHandle->userCallBack.Int2FinishCallBack = pCallback; /* Sampling finsish interrupt 2 callback function */ + 3002178: fec42783 lw a5,-20(s0) + 300217c: fe442703 lw a4,-28(s0) + 3002180: c3f8 sw a4,68(a5) + break; + 3002182: a8a9 j 30021dc + case ADC_CALLBACK_INT3: + adcHandle->userCallBack.Int3FinishCallBack = pCallback; /* Sampling finsish interrupt 3 callback function */ + 3002184: fec42783 lw a5,-20(s0) + 3002188: fe442703 lw a4,-28(s0) + 300218c: c7b8 sw a4,72(a5) + break; + 300218e: a0b9 j 30021dc + case ADC_CALLBACK_DMA: + adcHandle->userCallBack.DmaFinishCallBack = pCallback; /* Dma transfer finish callback function */ + 3002190: fec42783 lw a5,-20(s0) + 3002194: fe442703 lw a4,-28(s0) + 3002198: c7f8 sw a4,76(a5) + break; + 300219a: a089 j 30021dc + case ADC_CALLBACK_DMAERROR: + adcHandle->userCallBack.DmaErrorCallBack = pCallback; /* Dma transfer error callback function */ + 300219c: fec42783 lw a5,-20(s0) + 30021a0: fe442703 lw a4,-28(s0) + 30021a4: cbf8 sw a4,84(a5) + break; + 30021a6: a81d j 30021dc + case ADC_CALLBACK_DMAOVER: + adcHandle->userCallBack.DmaOverCallBack = pCallback; /* Dma request over callback function */ + 30021a8: fec42783 lw a5,-20(s0) + 30021ac: fe442703 lw a4,-28(s0) + 30021b0: cfb8 sw a4,88(a5) + break; + 30021b2: a02d j 30021dc + case ADC_CALLBACK_TRIGOVER: + adcHandle->userCallBack.TrigOverCallBack = pCallback; /* trigger over callback function */ + 30021b4: fec42783 lw a5,-20(s0) + 30021b8: fe442703 lw a4,-28(s0) + 30021bc: cff8 sw a4,92(a5) + break; + 30021be: a839 j 30021dc + case ADC_CALLBACK_EVENT_OVERSAMPLING: /* Oversampling callback function */ + adcHandle->userCallBack.OverSamplingFinishCallBack = pCallback; + 30021c0: fec42783 lw a5,-20(s0) + 30021c4: fe442703 lw a4,-28(s0) + 30021c8: cbb8 sw a4,80(a5) + break; + 30021ca: a809 j 30021dc + default: + ADC_RegieterEventCallBack(adcHandle, typeID, pCallback); /* PPB Function Callback Function */ + 30021cc: fe442603 lw a2,-28(s0) + 30021d0: fe842583 lw a1,-24(s0) + 30021d4: fec42503 lw a0,-20(s0) + 30021d8: 3de9 jal ra,30020b2 + break; + 30021da: 0001 nop + } +} + 30021dc: 0001 nop + 30021de: 40f2 lw ra,28(sp) + 30021e0: 4462 lw s0,24(sp) + 30021e2: 6105 addi sp,sp,32 + 30021e4: 8082 ret + +030021e6 : + * @param file Pointer to the name of the file where the error occurs. + * @param line Number of the line where the error occurs. + * @retval None. + */ +__weak void AssertErrorLog(char *file, unsigned int line) +{ + 30021e6: 1101 addi sp,sp,-32 + 30021e8: ce22 sw s0,28(sp) + 30021ea: 1000 addi s0,sp,32 + 30021ec: fea42623 sw a0,-20(s0) + 30021f0: feb42423 sw a1,-24(s0) + /* Use only if the user apllication is not defined. */ + BASE_FUNC_UNUSED(file); + BASE_FUNC_UNUSED(line); + 30021f4: 0001 nop + 30021f6: 4472 lw s0,28(sp) + 30021f8: 6105 addi sp,sp,32 + 30021fa: 8082 ret + +030021fc : + * @brief Get the systick + * @param None + * @retval The SysTick Value + */ +static inline unsigned int DCL_SYSTICK_GetTick(void) +{ + 30021fc: 1141 addi sp,sp,-16 + 30021fe: c622 sw s0,12(sp) + 3002200: 0800 addi s0,sp,16 + return SYSTICK->MTIME; /* Systick value(Lower 32bit register) */ + 3002202: 143807b7 lui a5,0x14380 + 3002206: 479c lw a5,8(a5) +} + 3002208: 853e mv a0,a5 + 300220a: 4432 lw s0,12(sp) + 300220c: 0141 addi sp,sp,16 + 300220e: 8082 ret + +03002210 : + * @brief Delay number of us. + * @param us The number of us to delay. + * @retval None. + */ +void BASE_FUNC_DelayUs(unsigned int us) +{ + 3002210: 7179 addi sp,sp,-48 + 3002212: d606 sw ra,44(sp) + 3002214: d422 sw s0,40(sp) + 3002216: 1800 addi s0,sp,48 + 3002218: fca42e23 sw a0,-36(s0) + unsigned int preTick = DCL_SYSTICK_GetTick(); + 300221c: 37c5 jal ra,30021fc + 300221e: fea42623 sw a0,-20(s0) + unsigned int tickInUs = (SYSTICK_GetCRGHZ() / CRG_FREQ_1MHz) * us; + 3002222: d85fe0ef jal ra,3000fa6 + 3002226: 872a mv a4,a0 + 3002228: 000f47b7 lui a5,0xf4 + 300222c: 24078793 addi a5,a5,576 # f4240 + 3002230: 02f757b3 divu a5,a4,a5 + 3002234: fdc42703 lw a4,-36(s0) + 3002238: 02f707b3 mul a5,a4,a5 + 300223c: fef42423 sw a5,-24(s0) + unsigned int curTick; + unsigned int delta; + + /* Wait until the delta is greater than tickInUs */ + do { + curTick = DCL_SYSTICK_GetTick(); + 3002240: 3f75 jal ra,30021fc + 3002242: fea42223 sw a0,-28(s0) + delta = (curTick >= preTick) ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick + 1; + 3002246: fe442703 lw a4,-28(s0) + 300224a: fec42783 lw a5,-20(s0) + 300224e: 40f707b3 sub a5,a4,a5 + 3002252: fef42023 sw a5,-32(s0) + } while (delta < tickInUs); + 3002256: fe042703 lw a4,-32(s0) + 300225a: fe842783 lw a5,-24(s0) + 300225e: fef761e3 bltu a4,a5,3002240 +} + 3002262: 0001 nop + 3002264: 50b2 lw ra,44(sp) + 3002266: 5422 lw s0,40(sp) + 3002268: 6145 addi sp,sp,48 + 300226a: 8082 ret + +0300226c : + * @brief Delay number of ms. + * @param ms The number of ms to delay. + * @retval None. + */ +void BASE_FUNC_DelayMs(unsigned int ms) +{ + 300226c: 7179 addi sp,sp,-48 + 300226e: d606 sw ra,44(sp) + 3002270: d422 sw s0,40(sp) + 3002272: 1800 addi s0,sp,48 + 3002274: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < ms; ++i) { + 3002278: fe042623 sw zero,-20(s0) + 300227c: a809 j 300228e + BASE_FUNC_DelayUs(BASE_DEFINE_DELAY_US_IN_MS); + 300227e: 3e800513 li a0,1000 + 3002282: 3779 jal ra,3002210 + for (unsigned int i = 0; i < ms; ++i) { + 3002284: fec42783 lw a5,-20(s0) + 3002288: 0785 addi a5,a5,1 + 300228a: fef42623 sw a5,-20(s0) + 300228e: fec42703 lw a4,-20(s0) + 3002292: fdc42783 lw a5,-36(s0) + 3002296: fef764e3 bltu a4,a5,300227e + } +} + 300229a: 0001 nop + 300229c: 50b2 lw ra,44(sp) + 300229e: 5422 lw s0,40(sp) + 30022a0: 6145 addi sp,sp,48 + 30022a2: 8082 ret + +030022a4 : + * @brief Delay number of seconds. + * @param seconds The number of seconds to delay. + * @retval None. + */ +void BASE_FUNC_DelaySeconds(unsigned int seconds) +{ + 30022a4: 7179 addi sp,sp,-48 + 30022a6: d606 sw ra,44(sp) + 30022a8: d422 sw s0,40(sp) + 30022aa: 1800 addi s0,sp,48 + 30022ac: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < seconds; ++i) { + 30022b0: fe042623 sw zero,-20(s0) + 30022b4: a809 j 30022c6 + BASE_FUNC_DelayMs(BASE_DEFINE_DELAY_MS_IN_SEC); + 30022b6: 3e800513 li a0,1000 + 30022ba: 3f4d jal ra,300226c + for (unsigned int i = 0; i < seconds; ++i) { + 30022bc: fec42783 lw a5,-20(s0) + 30022c0: 0785 addi a5,a5,1 + 30022c2: fef42623 sw a5,-20(s0) + 30022c6: fec42703 lw a4,-20(s0) + 30022ca: fdc42783 lw a5,-36(s0) + 30022ce: fef764e3 bltu a4,a5,30022b6 + } +} + 30022d2: 0001 nop + 30022d4: 50b2 lw ra,44(sp) + 30022d6: 5422 lw s0,40(sp) + 30022d8: 6145 addi sp,sp,48 + 30022da: 8082 ret + +030022dc : + * @param delay The number of 'units' to delay. + * @param units Specifies the delay unit. + * @retval None. + */ +void BASE_FUNC_Delay(unsigned int delay, BASE_DelayUnit units) +{ + 30022dc: 1101 addi sp,sp,-32 + 30022de: ce06 sw ra,28(sp) + 30022e0: cc22 sw s0,24(sp) + 30022e2: 1000 addi s0,sp,32 + 30022e4: fea42623 sw a0,-20(s0) + 30022e8: feb42423 sw a1,-24(s0) + switch (units) { + 30022ec: fe842783 lw a5,-24(s0) + 30022f0: 3e800713 li a4,1000 + 30022f4: 02e78063 beq a5,a4,3002314 + 30022f8: 000f4737 lui a4,0xf4 + 30022fc: 24070713 addi a4,a4,576 # f4240 + 3002300: 00e78e63 beq a5,a4,300231c + 3002304: 4705 li a4,1 + 3002306: 00e78363 beq a5,a4,300230c + break; + case BASE_DEFINE_DELAY_MICROSECS: + BASE_FUNC_DelayUs(delay); + break; + default: + break; + 300230a: a829 j 3002324 + BASE_FUNC_DelaySeconds(delay); + 300230c: fec42503 lw a0,-20(s0) + 3002310: 3f51 jal ra,30022a4 + break; + 3002312: a809 j 3002324 + BASE_FUNC_DelayMs(delay); + 3002314: fec42503 lw a0,-20(s0) + 3002318: 3f91 jal ra,300226c + break; + 300231a: a029 j 3002324 + BASE_FUNC_DelayUs(delay); + 300231c: fec42503 lw a0,-20(s0) + 3002320: 3dc5 jal ra,3002210 + break; + 3002322: 0001 nop + } + return; + 3002324: 0001 nop + 3002326: 40f2 lw ra,28(sp) + 3002328: 4462 lw s0,24(sp) + 300232a: 6105 addi sp,sp,32 + 300232c: 8082 ret + +0300232e : + * @brief Clear external interrupt + * @param irqNum external interrupt number + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_NOT_CREATED + */ +static inline void IRQ_ClearN(unsigned int irqNum) +{ + 300232e: 1101 addi sp,sp,-32 + 3002330: ce22 sw s0,28(sp) + 3002332: 1000 addi s0,sp,32 + 3002334: fea42623 sw a0,-20(s0) + asm volatile("fence"); + 3002338: 0ff0000f fence + WRITE_CUSTOM_CSR_VAL(LOCIPCLR, irqNum); + 300233c: fec42783 lw a5,-20(s0) + 3002340: 82be mv t0,a5 + 3002342: bf029073 csrw 0xbf0,t0 +} + 3002346: 0001 nop + 3002348: 4472 lw s0,28(sp) + 300234a: 6105 addi sp,sp,32 + 300234c: 8082 ret + +0300234e : + * @brief Exception/Interrupt Handler Entry. + * @param irqNum external interrupt number. + * @retval None + */ +void InterruptEntry(unsigned int irqNum) +{ + 300234e: 1101 addi sp,sp,-32 + 3002350: ce06 sw ra,28(sp) + 3002352: cc22 sw s0,24(sp) + 3002354: 1000 addi s0,sp,32 + 3002356: fea42623 sw a0,-20(s0) + g_irqCallbackFunc[irqNum].pfnHandler(g_irqCallbackFunc[irqNum].param); + 300235a: 040007b7 lui a5,0x4000 + 300235e: 0fc78713 addi a4,a5,252 # 40000fc + 3002362: fec42783 lw a5,-20(s0) + 3002366: 078e slli a5,a5,0x3 + 3002368: 97ba add a5,a5,a4 + 300236a: 4394 lw a3,0(a5) + 300236c: 040007b7 lui a5,0x4000 + 3002370: 0fc78713 addi a4,a5,252 # 40000fc + 3002374: fec42783 lw a5,-20(s0) + 3002378: 078e slli a5,a5,0x3 + 300237a: 97ba add a5,a5,a4 + 300237c: 43dc lw a5,4(a5) + 300237e: 853e mv a0,a5 + 3002380: 9682 jalr a3 + IRQ_ClearN(irqNum); + 3002382: fec42503 lw a0,-20(s0) + 3002386: 3765 jal ra,300232e +} + 3002388: 0001 nop + 300238a: 40f2 lw ra,28(sp) + 300238c: 4462 lw s0,24(sp) + 300238e: 6105 addi sp,sp,32 + 3002390: 8082 ret + +03002392 : + * @brief Irq initialization. + * @param none. + * @retval None + */ +void IRQ_Init(void) +{ + 3002392: 1101 addi sp,sp,-32 + 3002394: ce22 sw s0,28(sp) + 3002396: 1000 addi s0,sp,32 + unsigned int index; + + for (index = 0; index < IRQ_MAX; index++) { + 3002398: fe042623 sw zero,-20(s0) + 300239c: a82d j 30023d6 + g_irqCallbackFunc[index].pfnHandler = IRQ_DummyHandler; + 300239e: 040007b7 lui a5,0x4000 + 30023a2: 0fc78713 addi a4,a5,252 # 40000fc + 30023a6: fec42783 lw a5,-20(s0) + 30023aa: 078e slli a5,a5,0x3 + 30023ac: 97ba add a5,a5,a4 + 30023ae: 03003737 lui a4,0x3003 + 30023b2: c3270713 addi a4,a4,-974 # 3002c32 + 30023b6: c398 sw a4,0(a5) + g_irqCallbackFunc[index].param = NULL; + 30023b8: 040007b7 lui a5,0x4000 + 30023bc: 0fc78713 addi a4,a5,252 # 40000fc + 30023c0: fec42783 lw a5,-20(s0) + 30023c4: 078e slli a5,a5,0x3 + 30023c6: 97ba add a5,a5,a4 + 30023c8: 0007a223 sw zero,4(a5) + for (index = 0; index < IRQ_MAX; index++) { + 30023cc: fec42783 lw a5,-20(s0) + 30023d0: 0785 addi a5,a5,1 + 30023d2: fef42623 sw a5,-20(s0) + 30023d6: fec42703 lw a4,-20(s0) + 30023da: 07200793 li a5,114 + 30023de: fce7f0e3 bgeu a5,a4,300239e + } +} + 30023e2: 0001 nop + 30023e4: 4472 lw s0,28(sp) + 30023e6: 6105 addi sp,sp,32 + 30023e8: 8082 ret + +030023ea : + * @note In the corresponding interrupt handler, manually clear the interrupt source and the corresponding interrupt + * flag bit (call the IRQ_ClearN function to clear the interrupt), otherwise the interrupt will always be + * triggered. + */ +unsigned int IRQ_Register(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 30023ea: 1101 addi sp,sp,-32 + 30023ec: ce06 sw ra,28(sp) + 30023ee: cc22 sw s0,24(sp) + 30023f0: 1000 addi s0,sp,32 + 30023f2: fea42623 sw a0,-20(s0) + 30023f6: feb42423 sw a1,-24(s0) + 30023fa: fec42223 sw a2,-28(s0) + INTERRUPT_ASSERT_PARAM(func != NULL); + 30023fe: fe842783 lw a5,-24(s0) + 3002402: eb89 bnez a5,3002414 + 3002404: 06300593 li a1,99 + 3002408: 030077b7 lui a5,0x3007 + 300240c: 82878513 addi a0,a5,-2008 # 3006828 + 3002410: 3bd9 jal ra,30021e6 + 3002412: a001 j 3002412 + INTERRUPT_PARAM_CHECK_WITH_RET(irqNum < IRQ_MAX, IRQ_ERRNO_NUM_INVALID); + 3002414: fec42703 lw a4,-20(s0) + 3002418: 07200793 li a5,114 + 300241c: 00e7fb63 bgeu a5,a4,3002432 + 3002420: 06400593 li a1,100 + 3002424: 030077b7 lui a5,0x3007 + 3002428: 82878513 addi a0,a5,-2008 # 3006828 + 300242c: 3b6d jal ra,30021e6 + 300242e: 4789 li a5,2 + 3002430: a81d j 3002466 + + if (g_irqCallbackFunc[irqNum].pfnHandler != IRQ_DummyHandler) { + 3002432: 040007b7 lui a5,0x4000 + 3002436: 0fc78713 addi a4,a5,252 # 40000fc + 300243a: fec42783 lw a5,-20(s0) + 300243e: 078e slli a5,a5,0x3 + 3002440: 97ba add a5,a5,a4 + 3002442: 4398 lw a4,0(a5) + 3002444: 030037b7 lui a5,0x3003 + 3002448: c3278793 addi a5,a5,-974 # 3002c32 + 300244c: 00f70463 beq a4,a5,3002454 + return IRQ_ERRNO_ALREADY_CREATED; + 3002450: 478d li a5,3 + 3002452: a811 j 3002466 + } + IRQ_SetCallBack(irqNum, func, arg); + 3002454: fe442603 lw a2,-28(s0) + 3002458: fe842583 lw a1,-24(s0) + 300245c: fec42503 lw a0,-20(s0) + 3002460: 7e4000ef jal ra,3002c44 + return BASE_STATUS_OK; + 3002464: 4781 li a5,0 +} + 3002466: 853e mv a0,a5 + 3002468: 40f2 lw ra,28(sp) + 300246a: 4462 lw s0,24(sp) + 300246c: 6105 addi sp,sp,32 + 300246e: 8082 ret + +03002470 : + * @brief Enable the specified interrupt. + * @param irqNum External interrupt number. + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID. + */ +unsigned int IRQ_EnableN(unsigned int irqNum) +{ + 3002470: 7139 addi sp,sp,-64 + 3002472: de06 sw ra,60(sp) + 3002474: dc22 sw s0,56(sp) + 3002476: 0080 addi s0,sp,64 + 3002478: fca42623 sw a0,-52(s0) + unsigned int locienVal; +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 300247c: fcc42703 lw a4,-52(s0) + 3002480: 47e5 li a5,25 + 3002482: 00e7f863 bgeu a5,a4,3002492 + 3002486: fcc42703 lw a4,-52(s0) + 300248a: 07200793 li a5,114 + 300248e: 00e7fb63 bgeu a5,a4,30024a4 + 3002492: 0c300593 li a1,195 + 3002496: 030077b7 lui a5,0x3007 + 300249a: 82878513 addi a0,a5,-2008 # 3006828 + 300249e: 33a1 jal ra,30021e6 + 30024a0: 4789 li a5,2 + 30024a2: a8cd j 3002594 + /* The interrupt enable bits that can be controlled in the mie register (32 bits), up to 32 + can be controlled, and each bit corresponds to an interrupt enable */ + + RISCV_PRIV_MODE_SWITCH(priv); + + if (irqNum < IRQ_MIE_TOTAL_CNT) { + 30024a4: fcc42703 lw a4,-52(s0) + 30024a8: 47fd li a5,31 + 30024aa: 02e7e063 bltu a5,a4,30024ca + irqOrder = 1U << irqNum; + 30024ae: 4705 li a4,1 + 30024b0: fcc42783 lw a5,-52(s0) + 30024b4: 00f717b3 sll a5,a4,a5 + 30024b8: fef42623 sw a5,-20(s0) + SET_CSR(mie, irqOrder); + 30024bc: fec42783 lw a5,-20(s0) + 30024c0: 3047a7f3 csrrs a5,mie,a5 + 30024c4: fcf42c23 sw a5,-40(s0) + 30024c8: a0e9 j 3002592 + } else if (irqNum < IRQ_LOCIEN1_OFFSET) { + 30024ca: fcc42703 lw a4,-52(s0) + 30024ce: 03f00793 li a5,63 + 30024d2: 02e7ef63 bltu a5,a4,3002510 + irqOrder = irqNum - IRQ_MIE_TOTAL_CNT; + 30024d6: fcc42783 lw a5,-52(s0) + 30024da: 1781 addi a5,a5,-32 + 30024dc: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN0); + 30024e0: be0027f3 csrr a5,0xbe0 + 30024e4: fcf42e23 sw a5,-36(s0) + 30024e8: fdc42783 lw a5,-36(s0) + 30024ec: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 30024f0: 4705 li a4,1 + 30024f2: fec42783 lw a5,-20(s0) + 30024f6: 00f717b3 sll a5,a4,a5 + 30024fa: fe442703 lw a4,-28(s0) + 30024fe: 8fd9 or a5,a5,a4 + 3002500: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN0, locienVal); + 3002504: fe442783 lw a5,-28(s0) + 3002508: 82be mv t0,a5 + 300250a: be029073 csrw 0xbe0,t0 + 300250e: a051 j 3002592 + } else if (irqNum < IRQ_LOCIEN2_OFFSET) { + 3002510: fcc42703 lw a4,-52(s0) + 3002514: 05f00793 li a5,95 + 3002518: 04e7e063 bltu a5,a4,3002558 + irqOrder = irqNum - IRQ_LOCIEN1_OFFSET; + 300251c: fcc42783 lw a5,-52(s0) + 3002520: fc078793 addi a5,a5,-64 + 3002524: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN1); + 3002528: be1027f3 csrr a5,0xbe1 + 300252c: fef42023 sw a5,-32(s0) + 3002530: fe042783 lw a5,-32(s0) + 3002534: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 3002538: 4705 li a4,1 + 300253a: fec42783 lw a5,-20(s0) + 300253e: 00f717b3 sll a5,a4,a5 + 3002542: fe442703 lw a4,-28(s0) + 3002546: 8fd9 or a5,a5,a4 + 3002548: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN1, locienVal); + 300254c: fe442783 lw a5,-28(s0) + 3002550: 82be mv t0,a5 + 3002552: be129073 csrw 0xbe1,t0 + 3002556: a835 j 3002592 + } else { + irqOrder = irqNum - IRQ_LOCIEN2_OFFSET; + 3002558: fcc42783 lw a5,-52(s0) + 300255c: fa078793 addi a5,a5,-96 + 3002560: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN2); + 3002564: be2027f3 csrr a5,0xbe2 + 3002568: fef42423 sw a5,-24(s0) + 300256c: fe842783 lw a5,-24(s0) + 3002570: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 3002574: 4705 li a4,1 + 3002576: fec42783 lw a5,-20(s0) + 300257a: 00f717b3 sll a5,a4,a5 + 300257e: fe442703 lw a4,-28(s0) + 3002582: 8fd9 or a5,a5,a4 + 3002584: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN2, locienVal); + 3002588: fe442783 lw a5,-28(s0) + 300258c: 82be mv t0,a5 + 300258e: be229073 csrw 0xbe2,t0 + } + + RISCV_PRIV_MODE_SWITCH(priv); + + return BASE_STATUS_OK; + 3002592: 4781 li a5,0 +} + 3002594: 853e mv a0,a5 + 3002596: 50f2 lw ra,60(sp) + 3002598: 5462 lw s0,56(sp) + 300259a: 6121 addi sp,sp,64 + 300259c: 8082 ret + +0300259e : + * @param context. + * @note The actual code is generated by IDE + * @retval None. + */ +__weak void SysErrPrint(const SyserrContext *context) +{ + 300259e: 1101 addi sp,sp,-32 + 30025a0: ce22 sw s0,28(sp) + 30025a2: 1000 addi s0,sp,32 + 30025a4: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(context); +} + 30025a8: 0001 nop + 30025aa: 4472 lw s0,28(sp) + 30025ac: 6105 addi sp,sp,32 + 30025ae: 8082 ret + +030025b0 : + * @brief System error completion processing + * @param None. + * @retval None. + */ +static void SysErrFinish(void) +{ + 30025b0: 1141 addi sp,sp,-16 + 30025b2: c622 sw s0,12(sp) + 30025b4: 0800 addi s0,sp,16 +} + 30025b6: 0001 nop + 30025b8: 4432 lw s0,12(sp) + 30025ba: 0141 addi sp,sp,16 + 30025bc: 8082 ret + +030025be : + * @brief Exception Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrExcEntry(const SyserrContext *context) +{ + 30025be: 1101 addi sp,sp,-32 + 30025c0: ce06 sw ra,28(sp) + 30025c2: cc22 sw s0,24(sp) + 30025c4: 1000 addi s0,sp,32 + 30025c6: fea42623 sw a0,-20(s0) + SysErrPrint(context); + 30025ca: fec42503 lw a0,-20(s0) + 30025ce: 3fc1 jal ra,300259e + SysErrFinish(); + 30025d0: 37c5 jal ra,30025b0 +} + 30025d2: 0001 nop + 30025d4: 40f2 lw ra,28(sp) + 30025d6: 4462 lw s0,24(sp) + 30025d8: 6105 addi sp,sp,32 + 30025da: 8082 ret + +030025dc : + * @brief NMI Interrupt Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrNmiEntry(const SyserrContext *context) +{ + 30025dc: 1101 addi sp,sp,-32 + 30025de: ce06 sw ra,28(sp) + 30025e0: cc22 sw s0,24(sp) + 30025e2: 1000 addi s0,sp,32 + 30025e4: fea42623 sw a0,-20(s0) + INTERRUPT_ASSERT_PARAM(context != NULL); + 30025e8: fec42783 lw a5,-20(s0) + 30025ec: eb89 bnez a5,30025fe + 30025ee: 12d00593 li a1,301 + 30025f2: 030077b7 lui a5,0x3007 + 30025f6: 82878513 addi a0,a5,-2008 # 3006828 + 30025fa: 36f5 jal ra,30021e6 + 30025fc: a001 j 30025fc + SysErrPrint(context); + 30025fe: fec42503 lw a0,-20(s0) + 3002602: 3f71 jal ra,300259e + SysErrFinish(); + 3002604: 3775 jal ra,30025b0 +} + 3002606: 0001 nop + 3002608: 40f2 lw ra,28(sp) + 300260a: 4462 lw s0,24(sp) + 300260c: 6105 addi sp,sp,32 + 300260e: 8082 ret + +03002610 : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior local int prioroty. + * @retval None + */ +static void SetLocalIntNumPri(unsigned int intNum, unsigned int interPriNum, unsigned int prior) +{ + 3002610: 711d addi sp,sp,-96 + 3002612: cea2 sw s0,92(sp) + 3002614: 1080 addi s0,sp,96 + 3002616: faa42623 sw a0,-84(s0) + 300261a: fab42423 sw a1,-88(s0) + 300261e: fac42223 sw a2,-92(s0) + switch (intNum) { + 3002622: fac42783 lw a5,-84(s0) + 3002626: 17e1 addi a5,a5,-8 + 3002628: 471d li a4,7 + 300262a: 2af76363 bltu a4,a5,30028d0 + 300262e: 00279713 slli a4,a5,0x2 + 3002632: 030077b7 lui a5,0x3007 + 3002636: 84878793 addi a5,a5,-1976 # 3006848 + 300263a: 97ba add a5,a5,a4 + 300263c: 439c lw a5,0(a5) + 300263e: 8782 jr a5 + case 8: /* GROUP8 */ + SET_LOCAL_INTER_NUM_PRI(8, interPriNum, prior); + 3002640: bc8027f3 csrr a5,0xbc8 + 3002644: faf42a23 sw a5,-76(s0) + 3002648: fb442783 lw a5,-76(s0) + 300264c: faf42823 sw a5,-80(s0) + 3002650: fa842783 lw a5,-88(s0) + 3002654: 078a slli a5,a5,0x2 + 3002656: 8bf1 andi a5,a5,28 + 3002658: 473d li a4,15 + 300265a: 00f717b3 sll a5,a4,a5 + 300265e: fff7c793 not a5,a5 + 3002662: fb042703 lw a4,-80(s0) + 3002666: 8ff9 and a5,a5,a4 + 3002668: faf42823 sw a5,-80(s0) + 300266c: fa842783 lw a5,-88(s0) + 3002670: 078a slli a5,a5,0x2 + 3002672: 8bf1 andi a5,a5,28 + 3002674: fa442703 lw a4,-92(s0) + 3002678: 00f717b3 sll a5,a4,a5 + 300267c: fb042703 lw a4,-80(s0) + 3002680: 8fd9 or a5,a5,a4 + 3002682: faf42823 sw a5,-80(s0) + 3002686: fb042783 lw a5,-80(s0) + 300268a: 82be mv t0,a5 + 300268c: bc829073 csrw 0xbc8,t0 + break; + 3002690: a489 j 30028d2 + case 9: /* GROUP9 */ + SET_LOCAL_INTER_NUM_PRI(9, interPriNum, prior); + 3002692: bc9027f3 csrr a5,0xbc9 + 3002696: faf42e23 sw a5,-68(s0) + 300269a: fbc42783 lw a5,-68(s0) + 300269e: faf42c23 sw a5,-72(s0) + 30026a2: fa842783 lw a5,-88(s0) + 30026a6: 078a slli a5,a5,0x2 + 30026a8: 8bf1 andi a5,a5,28 + 30026aa: 473d li a4,15 + 30026ac: 00f717b3 sll a5,a4,a5 + 30026b0: fff7c793 not a5,a5 + 30026b4: fb842703 lw a4,-72(s0) + 30026b8: 8ff9 and a5,a5,a4 + 30026ba: faf42c23 sw a5,-72(s0) + 30026be: fa842783 lw a5,-88(s0) + 30026c2: 078a slli a5,a5,0x2 + 30026c4: 8bf1 andi a5,a5,28 + 30026c6: fa442703 lw a4,-92(s0) + 30026ca: 00f717b3 sll a5,a4,a5 + 30026ce: fb842703 lw a4,-72(s0) + 30026d2: 8fd9 or a5,a5,a4 + 30026d4: faf42c23 sw a5,-72(s0) + 30026d8: fb842783 lw a5,-72(s0) + 30026dc: 82be mv t0,a5 + 30026de: bc929073 csrw 0xbc9,t0 + break; + 30026e2: aac5 j 30028d2 + case 10: /* GROUP10 */ + SET_LOCAL_INTER_NUM_PRI(10, interPriNum, prior); + 30026e4: bca027f3 csrr a5,0xbca + 30026e8: fcf42223 sw a5,-60(s0) + 30026ec: fc442783 lw a5,-60(s0) + 30026f0: fcf42023 sw a5,-64(s0) + 30026f4: fa842783 lw a5,-88(s0) + 30026f8: 078a slli a5,a5,0x2 + 30026fa: 8bf1 andi a5,a5,28 + 30026fc: 473d li a4,15 + 30026fe: 00f717b3 sll a5,a4,a5 + 3002702: fff7c793 not a5,a5 + 3002706: fc042703 lw a4,-64(s0) + 300270a: 8ff9 and a5,a5,a4 + 300270c: fcf42023 sw a5,-64(s0) + 3002710: fa842783 lw a5,-88(s0) + 3002714: 078a slli a5,a5,0x2 + 3002716: 8bf1 andi a5,a5,28 + 3002718: fa442703 lw a4,-92(s0) + 300271c: 00f717b3 sll a5,a4,a5 + 3002720: fc042703 lw a4,-64(s0) + 3002724: 8fd9 or a5,a5,a4 + 3002726: fcf42023 sw a5,-64(s0) + 300272a: fc042783 lw a5,-64(s0) + 300272e: 82be mv t0,a5 + 3002730: bca29073 csrw 0xbca,t0 + break; + 3002734: aa79 j 30028d2 + case 11: /* GROUP11 */ + SET_LOCAL_INTER_NUM_PRI(11, interPriNum, prior); + 3002736: bcb027f3 csrr a5,0xbcb + 300273a: fcf42623 sw a5,-52(s0) + 300273e: fcc42783 lw a5,-52(s0) + 3002742: fcf42423 sw a5,-56(s0) + 3002746: fa842783 lw a5,-88(s0) + 300274a: 078a slli a5,a5,0x2 + 300274c: 8bf1 andi a5,a5,28 + 300274e: 473d li a4,15 + 3002750: 00f717b3 sll a5,a4,a5 + 3002754: fff7c793 not a5,a5 + 3002758: fc842703 lw a4,-56(s0) + 300275c: 8ff9 and a5,a5,a4 + 300275e: fcf42423 sw a5,-56(s0) + 3002762: fa842783 lw a5,-88(s0) + 3002766: 078a slli a5,a5,0x2 + 3002768: 8bf1 andi a5,a5,28 + 300276a: fa442703 lw a4,-92(s0) + 300276e: 00f717b3 sll a5,a4,a5 + 3002772: fc842703 lw a4,-56(s0) + 3002776: 8fd9 or a5,a5,a4 + 3002778: fcf42423 sw a5,-56(s0) + 300277c: fc842783 lw a5,-56(s0) + 3002780: 82be mv t0,a5 + 3002782: bcb29073 csrw 0xbcb,t0 + break; + 3002786: a2b1 j 30028d2 + case 12: /* GROUP12 */ + SET_LOCAL_INTER_NUM_PRI(12, interPriNum, prior); + 3002788: bcc027f3 csrr a5,0xbcc + 300278c: fcf42a23 sw a5,-44(s0) + 3002790: fd442783 lw a5,-44(s0) + 3002794: fcf42823 sw a5,-48(s0) + 3002798: fa842783 lw a5,-88(s0) + 300279c: 078a slli a5,a5,0x2 + 300279e: 8bf1 andi a5,a5,28 + 30027a0: 473d li a4,15 + 30027a2: 00f717b3 sll a5,a4,a5 + 30027a6: fff7c793 not a5,a5 + 30027aa: fd042703 lw a4,-48(s0) + 30027ae: 8ff9 and a5,a5,a4 + 30027b0: fcf42823 sw a5,-48(s0) + 30027b4: fa842783 lw a5,-88(s0) + 30027b8: 078a slli a5,a5,0x2 + 30027ba: 8bf1 andi a5,a5,28 + 30027bc: fa442703 lw a4,-92(s0) + 30027c0: 00f717b3 sll a5,a4,a5 + 30027c4: fd042703 lw a4,-48(s0) + 30027c8: 8fd9 or a5,a5,a4 + 30027ca: fcf42823 sw a5,-48(s0) + 30027ce: fd042783 lw a5,-48(s0) + 30027d2: 82be mv t0,a5 + 30027d4: bcc29073 csrw 0xbcc,t0 + break; + 30027d8: a8ed j 30028d2 + case 13: /* GROUP13 */ + SET_LOCAL_INTER_NUM_PRI(13, interPriNum, prior); + 30027da: bcd027f3 csrr a5,0xbcd + 30027de: fcf42e23 sw a5,-36(s0) + 30027e2: fdc42783 lw a5,-36(s0) + 30027e6: fcf42c23 sw a5,-40(s0) + 30027ea: fa842783 lw a5,-88(s0) + 30027ee: 078a slli a5,a5,0x2 + 30027f0: 8bf1 andi a5,a5,28 + 30027f2: 473d li a4,15 + 30027f4: 00f717b3 sll a5,a4,a5 + 30027f8: fff7c793 not a5,a5 + 30027fc: fd842703 lw a4,-40(s0) + 3002800: 8ff9 and a5,a5,a4 + 3002802: fcf42c23 sw a5,-40(s0) + 3002806: fa842783 lw a5,-88(s0) + 300280a: 078a slli a5,a5,0x2 + 300280c: 8bf1 andi a5,a5,28 + 300280e: fa442703 lw a4,-92(s0) + 3002812: 00f717b3 sll a5,a4,a5 + 3002816: fd842703 lw a4,-40(s0) + 300281a: 8fd9 or a5,a5,a4 + 300281c: fcf42c23 sw a5,-40(s0) + 3002820: fd842783 lw a5,-40(s0) + 3002824: 82be mv t0,a5 + 3002826: bcd29073 csrw 0xbcd,t0 + break; + 300282a: a065 j 30028d2 + case 14: /* GROUP14 */ + SET_LOCAL_INTER_NUM_PRI(14, interPriNum, prior); + 300282c: bce027f3 csrr a5,0xbce + 3002830: fef42223 sw a5,-28(s0) + 3002834: fe442783 lw a5,-28(s0) + 3002838: fef42023 sw a5,-32(s0) + 300283c: fa842783 lw a5,-88(s0) + 3002840: 078a slli a5,a5,0x2 + 3002842: 8bf1 andi a5,a5,28 + 3002844: 473d li a4,15 + 3002846: 00f717b3 sll a5,a4,a5 + 300284a: fff7c793 not a5,a5 + 300284e: fe042703 lw a4,-32(s0) + 3002852: 8ff9 and a5,a5,a4 + 3002854: fef42023 sw a5,-32(s0) + 3002858: fa842783 lw a5,-88(s0) + 300285c: 078a slli a5,a5,0x2 + 300285e: 8bf1 andi a5,a5,28 + 3002860: fa442703 lw a4,-92(s0) + 3002864: 00f717b3 sll a5,a4,a5 + 3002868: fe042703 lw a4,-32(s0) + 300286c: 8fd9 or a5,a5,a4 + 300286e: fef42023 sw a5,-32(s0) + 3002872: fe042783 lw a5,-32(s0) + 3002876: 82be mv t0,a5 + 3002878: bce29073 csrw 0xbce,t0 + break; + 300287c: a899 j 30028d2 + case 15: /* GROUP15 */ + SET_LOCAL_INTER_NUM_PRI(15, interPriNum, prior); + 300287e: bcf027f3 csrr a5,0xbcf + 3002882: fef42623 sw a5,-20(s0) + 3002886: fec42783 lw a5,-20(s0) + 300288a: fef42423 sw a5,-24(s0) + 300288e: fa842783 lw a5,-88(s0) + 3002892: 078a slli a5,a5,0x2 + 3002894: 8bf1 andi a5,a5,28 + 3002896: 473d li a4,15 + 3002898: 00f717b3 sll a5,a4,a5 + 300289c: fff7c793 not a5,a5 + 30028a0: fe842703 lw a4,-24(s0) + 30028a4: 8ff9 and a5,a5,a4 + 30028a6: fef42423 sw a5,-24(s0) + 30028aa: fa842783 lw a5,-88(s0) + 30028ae: 078a slli a5,a5,0x2 + 30028b0: 8bf1 andi a5,a5,28 + 30028b2: fa442703 lw a4,-92(s0) + 30028b6: 00f717b3 sll a5,a4,a5 + 30028ba: fe842703 lw a4,-24(s0) + 30028be: 8fd9 or a5,a5,a4 + 30028c0: fef42423 sw a5,-24(s0) + 30028c4: fe842783 lw a5,-24(s0) + 30028c8: 82be mv t0,a5 + 30028ca: bcf29073 csrw 0xbcf,t0 + break; + 30028ce: a011 j 30028d2 + default: + break; + 30028d0: 0001 nop + } +} + 30028d2: 0001 nop + 30028d4: 4476 lw s0,92(sp) + 30028d6: 6125 addi sp,sp,96 + 30028d8: 8082 ret + +030028da : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior Priority of this local interrupt to be set. + * @retval None. + */ +static void IRQ_SetLocalPriority(unsigned int interPriNum, unsigned int prior) +{ + 30028da: 7159 addi sp,sp,-112 + 30028dc: d686 sw ra,108(sp) + 30028de: d4a2 sw s0,104(sp) + 30028e0: 1880 addi s0,sp,112 + 30028e2: f8a42e23 sw a0,-100(s0) + 30028e6: f8b42c23 sw a1,-104(s0) +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + RISCV_PRIV_MODE_SWITCH(priv); + unsigned int intNum = GET_LOCAL_INTER_CONFIGREG_NUM(interPriNum); + 30028ea: f9c42783 lw a5,-100(s0) + 30028ee: 838d srli a5,a5,0x3 + 30028f0: fef42623 sw a5,-20(s0) + switch (intNum) { + 30028f4: fec42703 lw a4,-20(s0) + 30028f8: 479d li a5,7 + 30028fa: 2ae7e563 bltu a5,a4,3002ba4 + 30028fe: fec42783 lw a5,-20(s0) + 3002902: 00279713 slli a4,a5,0x2 + 3002906: 030077b7 lui a5,0x3007 + 300290a: 86878793 addi a5,a5,-1944 # 3006868 + 300290e: 97ba add a5,a5,a4 + 3002910: 439c lw a5,0(a5) + 3002912: 8782 jr a5 + case 0: /* GROUP0 */ + SET_LOCAL_INTER_NUM_PRI(0, interPriNum, prior); + 3002914: bc0027f3 csrr a5,0xbc0 + 3002918: faf42823 sw a5,-80(s0) + 300291c: fb042783 lw a5,-80(s0) + 3002920: faf42623 sw a5,-84(s0) + 3002924: f9c42783 lw a5,-100(s0) + 3002928: 078a slli a5,a5,0x2 + 300292a: 8bf1 andi a5,a5,28 + 300292c: 473d li a4,15 + 300292e: 00f717b3 sll a5,a4,a5 + 3002932: fff7c793 not a5,a5 + 3002936: fac42703 lw a4,-84(s0) + 300293a: 8ff9 and a5,a5,a4 + 300293c: faf42623 sw a5,-84(s0) + 3002940: f9c42783 lw a5,-100(s0) + 3002944: 078a slli a5,a5,0x2 + 3002946: 8bf1 andi a5,a5,28 + 3002948: f9842703 lw a4,-104(s0) + 300294c: 00f717b3 sll a5,a4,a5 + 3002950: fac42703 lw a4,-84(s0) + 3002954: 8fd9 or a5,a5,a4 + 3002956: faf42623 sw a5,-84(s0) + 300295a: fac42783 lw a5,-84(s0) + 300295e: 82be mv t0,a5 + 3002960: bc029073 csrw 0xbc0,t0 + break; + 3002964: ac81 j 3002bb4 + case 1: /* GROUP1 */ + SET_LOCAL_INTER_NUM_PRI(1, interPriNum, prior); + 3002966: bc1027f3 csrr a5,0xbc1 + 300296a: faf42c23 sw a5,-72(s0) + 300296e: fb842783 lw a5,-72(s0) + 3002972: faf42a23 sw a5,-76(s0) + 3002976: f9c42783 lw a5,-100(s0) + 300297a: 078a slli a5,a5,0x2 + 300297c: 8bf1 andi a5,a5,28 + 300297e: 473d li a4,15 + 3002980: 00f717b3 sll a5,a4,a5 + 3002984: fff7c793 not a5,a5 + 3002988: fb442703 lw a4,-76(s0) + 300298c: 8ff9 and a5,a5,a4 + 300298e: faf42a23 sw a5,-76(s0) + 3002992: f9c42783 lw a5,-100(s0) + 3002996: 078a slli a5,a5,0x2 + 3002998: 8bf1 andi a5,a5,28 + 300299a: f9842703 lw a4,-104(s0) + 300299e: 00f717b3 sll a5,a4,a5 + 30029a2: fb442703 lw a4,-76(s0) + 30029a6: 8fd9 or a5,a5,a4 + 30029a8: faf42a23 sw a5,-76(s0) + 30029ac: fb442783 lw a5,-76(s0) + 30029b0: 82be mv t0,a5 + 30029b2: bc129073 csrw 0xbc1,t0 + break; + 30029b6: aafd j 3002bb4 + case 2: /* GROUP2 */ + SET_LOCAL_INTER_NUM_PRI(2, interPriNum, prior); + 30029b8: bc2027f3 csrr a5,0xbc2 + 30029bc: fcf42023 sw a5,-64(s0) + 30029c0: fc042783 lw a5,-64(s0) + 30029c4: faf42e23 sw a5,-68(s0) + 30029c8: f9c42783 lw a5,-100(s0) + 30029cc: 078a slli a5,a5,0x2 + 30029ce: 8bf1 andi a5,a5,28 + 30029d0: 473d li a4,15 + 30029d2: 00f717b3 sll a5,a4,a5 + 30029d6: fff7c793 not a5,a5 + 30029da: fbc42703 lw a4,-68(s0) + 30029de: 8ff9 and a5,a5,a4 + 30029e0: faf42e23 sw a5,-68(s0) + 30029e4: f9c42783 lw a5,-100(s0) + 30029e8: 078a slli a5,a5,0x2 + 30029ea: 8bf1 andi a5,a5,28 + 30029ec: f9842703 lw a4,-104(s0) + 30029f0: 00f717b3 sll a5,a4,a5 + 30029f4: fbc42703 lw a4,-68(s0) + 30029f8: 8fd9 or a5,a5,a4 + 30029fa: faf42e23 sw a5,-68(s0) + 30029fe: fbc42783 lw a5,-68(s0) + 3002a02: 82be mv t0,a5 + 3002a04: bc229073 csrw 0xbc2,t0 + break; + 3002a08: a275 j 3002bb4 + case 3: /* GROUP3 */ + SET_LOCAL_INTER_NUM_PRI(3, interPriNum, prior); + 3002a0a: bc3027f3 csrr a5,0xbc3 + 3002a0e: fcf42423 sw a5,-56(s0) + 3002a12: fc842783 lw a5,-56(s0) + 3002a16: fcf42223 sw a5,-60(s0) + 3002a1a: f9c42783 lw a5,-100(s0) + 3002a1e: 078a slli a5,a5,0x2 + 3002a20: 8bf1 andi a5,a5,28 + 3002a22: 473d li a4,15 + 3002a24: 00f717b3 sll a5,a4,a5 + 3002a28: fff7c793 not a5,a5 + 3002a2c: fc442703 lw a4,-60(s0) + 3002a30: 8ff9 and a5,a5,a4 + 3002a32: fcf42223 sw a5,-60(s0) + 3002a36: f9c42783 lw a5,-100(s0) + 3002a3a: 078a slli a5,a5,0x2 + 3002a3c: 8bf1 andi a5,a5,28 + 3002a3e: f9842703 lw a4,-104(s0) + 3002a42: 00f717b3 sll a5,a4,a5 + 3002a46: fc442703 lw a4,-60(s0) + 3002a4a: 8fd9 or a5,a5,a4 + 3002a4c: fcf42223 sw a5,-60(s0) + 3002a50: fc442783 lw a5,-60(s0) + 3002a54: 82be mv t0,a5 + 3002a56: bc329073 csrw 0xbc3,t0 + break; + 3002a5a: aaa9 j 3002bb4 + case 4: /* GROUP4 */ + SET_LOCAL_INTER_NUM_PRI(4, interPriNum, prior); + 3002a5c: bc4027f3 csrr a5,0xbc4 + 3002a60: fcf42823 sw a5,-48(s0) + 3002a64: fd042783 lw a5,-48(s0) + 3002a68: fcf42623 sw a5,-52(s0) + 3002a6c: f9c42783 lw a5,-100(s0) + 3002a70: 078a slli a5,a5,0x2 + 3002a72: 8bf1 andi a5,a5,28 + 3002a74: 473d li a4,15 + 3002a76: 00f717b3 sll a5,a4,a5 + 3002a7a: fff7c793 not a5,a5 + 3002a7e: fcc42703 lw a4,-52(s0) + 3002a82: 8ff9 and a5,a5,a4 + 3002a84: fcf42623 sw a5,-52(s0) + 3002a88: f9c42783 lw a5,-100(s0) + 3002a8c: 078a slli a5,a5,0x2 + 3002a8e: 8bf1 andi a5,a5,28 + 3002a90: f9842703 lw a4,-104(s0) + 3002a94: 00f717b3 sll a5,a4,a5 + 3002a98: fcc42703 lw a4,-52(s0) + 3002a9c: 8fd9 or a5,a5,a4 + 3002a9e: fcf42623 sw a5,-52(s0) + 3002aa2: fcc42783 lw a5,-52(s0) + 3002aa6: 82be mv t0,a5 + 3002aa8: bc429073 csrw 0xbc4,t0 + break; + 3002aac: a221 j 3002bb4 + case 5: /* GROUP5 */ + SET_LOCAL_INTER_NUM_PRI(5, interPriNum, prior); + 3002aae: bc5027f3 csrr a5,0xbc5 + 3002ab2: fcf42c23 sw a5,-40(s0) + 3002ab6: fd842783 lw a5,-40(s0) + 3002aba: fcf42a23 sw a5,-44(s0) + 3002abe: f9c42783 lw a5,-100(s0) + 3002ac2: 078a slli a5,a5,0x2 + 3002ac4: 8bf1 andi a5,a5,28 + 3002ac6: 473d li a4,15 + 3002ac8: 00f717b3 sll a5,a4,a5 + 3002acc: fff7c793 not a5,a5 + 3002ad0: fd442703 lw a4,-44(s0) + 3002ad4: 8ff9 and a5,a5,a4 + 3002ad6: fcf42a23 sw a5,-44(s0) + 3002ada: f9c42783 lw a5,-100(s0) + 3002ade: 078a slli a5,a5,0x2 + 3002ae0: 8bf1 andi a5,a5,28 + 3002ae2: f9842703 lw a4,-104(s0) + 3002ae6: 00f717b3 sll a5,a4,a5 + 3002aea: fd442703 lw a4,-44(s0) + 3002aee: 8fd9 or a5,a5,a4 + 3002af0: fcf42a23 sw a5,-44(s0) + 3002af4: fd442783 lw a5,-44(s0) + 3002af8: 82be mv t0,a5 + 3002afa: bc529073 csrw 0xbc5,t0 + break; + 3002afe: a85d j 3002bb4 + case 6: /* GROUP6 */ + SET_LOCAL_INTER_NUM_PRI(6, interPriNum, prior); + 3002b00: bc6027f3 csrr a5,0xbc6 + 3002b04: fef42023 sw a5,-32(s0) + 3002b08: fe042783 lw a5,-32(s0) + 3002b0c: fcf42e23 sw a5,-36(s0) + 3002b10: f9c42783 lw a5,-100(s0) + 3002b14: 078a slli a5,a5,0x2 + 3002b16: 8bf1 andi a5,a5,28 + 3002b18: 473d li a4,15 + 3002b1a: 00f717b3 sll a5,a4,a5 + 3002b1e: fff7c793 not a5,a5 + 3002b22: fdc42703 lw a4,-36(s0) + 3002b26: 8ff9 and a5,a5,a4 + 3002b28: fcf42e23 sw a5,-36(s0) + 3002b2c: f9c42783 lw a5,-100(s0) + 3002b30: 078a slli a5,a5,0x2 + 3002b32: 8bf1 andi a5,a5,28 + 3002b34: f9842703 lw a4,-104(s0) + 3002b38: 00f717b3 sll a5,a4,a5 + 3002b3c: fdc42703 lw a4,-36(s0) + 3002b40: 8fd9 or a5,a5,a4 + 3002b42: fcf42e23 sw a5,-36(s0) + 3002b46: fdc42783 lw a5,-36(s0) + 3002b4a: 82be mv t0,a5 + 3002b4c: bc629073 csrw 0xbc6,t0 + break; + 3002b50: a095 j 3002bb4 + case 7: /* GROUP7 */ + SET_LOCAL_INTER_NUM_PRI(7, interPriNum, prior); + 3002b52: bc7027f3 csrr a5,0xbc7 + 3002b56: fef42423 sw a5,-24(s0) + 3002b5a: fe842783 lw a5,-24(s0) + 3002b5e: fef42223 sw a5,-28(s0) + 3002b62: f9c42783 lw a5,-100(s0) + 3002b66: 078a slli a5,a5,0x2 + 3002b68: 8bf1 andi a5,a5,28 + 3002b6a: 473d li a4,15 + 3002b6c: 00f717b3 sll a5,a4,a5 + 3002b70: fff7c793 not a5,a5 + 3002b74: fe442703 lw a4,-28(s0) + 3002b78: 8ff9 and a5,a5,a4 + 3002b7a: fef42223 sw a5,-28(s0) + 3002b7e: f9c42783 lw a5,-100(s0) + 3002b82: 078a slli a5,a5,0x2 + 3002b84: 8bf1 andi a5,a5,28 + 3002b86: f9842703 lw a4,-104(s0) + 3002b8a: 00f717b3 sll a5,a4,a5 + 3002b8e: fe442703 lw a4,-28(s0) + 3002b92: 8fd9 or a5,a5,a4 + 3002b94: fef42223 sw a5,-28(s0) + 3002b98: fe442783 lw a5,-28(s0) + 3002b9c: 82be mv t0,a5 + 3002b9e: bc729073 csrw 0xbc7,t0 + break; + 3002ba2: a809 j 3002bb4 + default: + SetLocalIntNumPri(intNum, interPriNum, prior); + 3002ba4: f9842603 lw a2,-104(s0) + 3002ba8: f9c42583 lw a1,-100(s0) + 3002bac: fec42503 lw a0,-20(s0) + 3002bb0: 3485 jal ra,3002610 + break; + 3002bb2: 0001 nop + } + RISCV_PRIV_MODE_SWITCH(priv); +} + 3002bb4: 0001 nop + 3002bb6: 50b6 lw ra,108(sp) + 3002bb8: 5426 lw s0,104(sp) + 3002bba: 6165 addi sp,sp,112 + 3002bbc: 8082 ret + +03002bbe : + * @param irqNum External interrupt number. + * @param priority. + * @retval IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_PRIORITY_INVALID or BASE_STATUS_OK. + */ +unsigned int IRQ_SetPriority(unsigned int irqNum, unsigned int priority) +{ + 3002bbe: 1101 addi sp,sp,-32 + 3002bc0: ce06 sw ra,28(sp) + 3002bc2: cc22 sw s0,24(sp) + 3002bc4: 1000 addi s0,sp,32 + 3002bc6: fea42623 sw a0,-20(s0) + 3002bca: feb42423 sw a1,-24(s0) + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 3002bce: fec42703 lw a4,-20(s0) + 3002bd2: 47e5 li a5,25 + 3002bd4: 00e7f863 bgeu a5,a4,3002be4 + 3002bd8: fec42703 lw a4,-20(s0) + 3002bdc: 07200793 li a5,114 + 3002be0: 00e7fb63 bgeu a5,a4,3002bf6 + 3002be4: 18c00593 li a1,396 + 3002be8: 030077b7 lui a5,0x3007 + 3002bec: 82878513 addi a0,a5,-2008 # 3006828 + 3002bf0: 21bd jal ra,300305e + 3002bf2: 4789 li a5,2 + 3002bf4: a815 j 3002c28 + INTERRUPT_PARAM_CHECK_WITH_RET((priority >= IRQ_PRIO_LOWEST && priority <= IRQ_PRIO_HIGHEST), \ + 3002bf6: fe842783 lw a5,-24(s0) + 3002bfa: c791 beqz a5,3002c06 + 3002bfc: fe842703 lw a4,-24(s0) + 3002c00: 47bd li a5,15 + 3002c02: 00e7fb63 bgeu a5,a4,3002c18 + 3002c06: 18d00593 li a1,397 + 3002c0a: 030077b7 lui a5,0x3007 + 3002c0e: 82878513 addi a0,a5,-2008 # 3006828 + 3002c12: 21b1 jal ra,300305e + 3002c14: 4795 li a5,5 + 3002c16: a809 j 3002c28 + IRQ_ERRNO_PRIORITY_INVALID); + + /* The locipri register is specifically used to configure the priority of the + external non-standard interrupts of the CPU, so the number of internal + standard interrupts should be subtracted */ + IRQ_SetLocalPriority(irqNum - IRQ_VECTOR_CNT, priority); + 3002c18: fec42783 lw a5,-20(s0) + 3002c1c: 1799 addi a5,a5,-26 + 3002c1e: fe842583 lw a1,-24(s0) + 3002c22: 853e mv a0,a5 + 3002c24: 395d jal ra,30028da + + return BASE_STATUS_OK; + 3002c26: 4781 li a5,0 +} + 3002c28: 853e mv a0,a5 + 3002c2a: 40f2 lw ra,28(sp) + 3002c2c: 4462 lw s0,24(sp) + 3002c2e: 6105 addi sp,sp,32 + 3002c30: 8082 ret + +03002c32 : + * @brief Interrupt dummy handler + * @param arg Not used + * @retval None. + */ +static void IRQ_DummyHandler(void *arg) +{ + 3002c32: 1101 addi sp,sp,-32 + 3002c34: ce22 sw s0,28(sp) + 3002c36: 1000 addi s0,sp,32 + 3002c38: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(arg); +} + 3002c3c: 0001 nop + 3002c3e: 4472 lw s0,28(sp) + 3002c40: 6105 addi sp,sp,32 + 3002c42: 8082 ret + +03002c44 : + * @param func callback function + * @param arg callback arg + * @retval None. + */ +static inline void IRQ_SetCallBack(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 3002c44: 1101 addi sp,sp,-32 + 3002c46: ce22 sw s0,28(sp) + 3002c48: 1000 addi s0,sp,32 + 3002c4a: fea42623 sw a0,-20(s0) + 3002c4e: feb42423 sw a1,-24(s0) + 3002c52: fec42223 sw a2,-28(s0) + g_irqCallbackFunc[irqNum].param = arg; + 3002c56: 040007b7 lui a5,0x4000 + 3002c5a: 0fc78713 addi a4,a5,252 # 40000fc + 3002c5e: fec42783 lw a5,-20(s0) + 3002c62: 078e slli a5,a5,0x3 + 3002c64: 97ba add a5,a5,a4 + 3002c66: fe442703 lw a4,-28(s0) + 3002c6a: c3d8 sw a4,4(a5) + g_irqCallbackFunc[irqNum].pfnHandler = func; + 3002c6c: 040007b7 lui a5,0x4000 + 3002c70: 0fc78713 addi a4,a5,252 # 40000fc + 3002c74: fec42783 lw a5,-20(s0) + 3002c78: 078e slli a5,a5,0x3 + 3002c7a: 97ba add a5,a5,a4 + 3002c7c: fe842703 lw a4,-24(s0) + 3002c80: c398 sw a4,0(a5) +} + 3002c82: 0001 nop + 3002c84: 4472 lw s0,28(sp) + 3002c86: 6105 addi sp,sp,32 + 3002c88: 8082 ret + +03002c8a : + * @brief Set the write protection for CRG-related registers disable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionDisable(void) +{ + 3002c8a: 1141 addi sp,sp,-16 + 3002c8c: c622 sw s0,12(sp) + 3002c8e: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = (SYSCTRL0->SC_LOCKEN.reg & SC_LOCKEN_CRG_DISABLE_MASK) + SC_LOCKEN_VALID_HIGH_BIT; + 3002c90: 101007b7 lui a5,0x10100 + 3002c94: 43f8 lw a4,68(a5) + 3002c96: 67c1 lui a5,0x10 + 3002c98: 17f9 addi a5,a5,-2 # fffe + 3002c9a: 00f776b3 and a3,a4,a5 + 3002c9e: 101007b7 lui a5,0x10100 + 3002ca2: ea510737 lui a4,0xea510 + 3002ca6: 9736 add a4,a4,a3 + 3002ca8: c3f8 sw a4,68(a5) +} + 3002caa: 0001 nop + 3002cac: 4432 lw s0,12(sp) + 3002cae: 0141 addi sp,sp,16 + 3002cb0: 8082 ret + +03002cb2 : + * @brief Set the Set the write protection for CRG-related registers enable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionEnable(void) +{ + 3002cb2: 1141 addi sp,sp,-16 + 3002cb4: c622 sw s0,12(sp) + 3002cb6: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = ((SYSCTRL0->SC_LOCKEN.reg & SC_LOW_BIT_MASK) | SC_LOCKEN_CRG_ENABLE_MASK) + + 3002cb8: 101007b7 lui a5,0x10100 + 3002cbc: 43f8 lw a4,68(a5) + 3002cbe: 67c1 lui a5,0x10 + 3002cc0: 17fd addi a5,a5,-1 # ffff + 3002cc2: 8ff9 and a5,a5,a4 + 3002cc4: 0017e693 ori a3,a5,1 + 3002cc8: 101007b7 lui a5,0x10100 + 3002ccc: ea510737 lui a4,0xea510 + 3002cd0: 9736 add a4,a4,a3 + 3002cd2: c3f8 sw a4,68(a5) + SC_LOCKEN_VALID_HIGH_BIT; +} + 3002cd4: 0001 nop + 3002cd6: 4432 lw s0,12(sp) + 3002cd8: 0141 addi sp,sp,16 + 3002cda: 8082 ret + +03002cdc : + * @param clkSelect pll_ref_cksel + * @retval true + * @retval false + */ +static inline bool IsCrgPllRefClkSelect(CRG_PllRefClkSelect clkSelect) +{ + 3002cdc: 1101 addi sp,sp,-32 + 3002cde: ce22 sw s0,28(sp) + 3002ce0: 1000 addi s0,sp,32 + 3002ce2: fea42623 sw a0,-20(s0) + return ((clkSelect == CRG_PLL_REF_CLK_SELECT_HOSC) || + 3002ce6: fec42783 lw a5,-20(s0) + 3002cea: c791 beqz a5,3002cf6 + 3002cec: fec42703 lw a4,-20(s0) + 3002cf0: 4785 li a5,1 + 3002cf2: 00f71463 bne a4,a5,3002cfa + 3002cf6: 4785 li a5,1 + 3002cf8: a011 j 3002cfc + 3002cfa: 4781 li a5,0 + 3002cfc: 8b85 andi a5,a5,1 + 3002cfe: 9f81 uxtb a5 + (clkSelect == CRG_PLL_REF_CLK_SELECT_XTAL)); +} + 3002d00: 853e mv a0,a5 + 3002d02: 4472 lw s0,28(sp) + 3002d04: 6105 addi sp,sp,32 + 3002d06: 8082 ret + +03002d08 : + * @param preDiv pll prediv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPreDiv(CRG_PllPreDiv preDiv) +{ + 3002d08: 1101 addi sp,sp,-32 + 3002d0a: ce22 sw s0,28(sp) + 3002d0c: 1000 addi s0,sp,32 + 3002d0e: fea42623 sw a0,-20(s0) + return ((preDiv >= CRG_PLL_PREDIV_1) && + 3002d12: fec42783 lw a5,-20(s0) + 3002d16: 0087b793 sltiu a5,a5,8 + 3002d1a: 9f81 uxtb a5 + (preDiv <= CRG_PLL_PREDIV_8)); +} + 3002d1c: 853e mv a0,a5 + 3002d1e: 4472 lw s0,28(sp) + 3002d20: 6105 addi sp,sp,32 + 3002d22: 8082 ret + +03002d24 : + * @param postDiv pll_postdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv(CRG_PllPostDiv postDiv) +{ + 3002d24: 1101 addi sp,sp,-32 + 3002d26: ce22 sw s0,28(sp) + 3002d28: 1000 addi s0,sp,32 + 3002d2a: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV_1) && + 3002d2e: fec42783 lw a5,-20(s0) + 3002d32: 0087b793 sltiu a5,a5,8 + 3002d36: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV_8)); +} + 3002d38: 853e mv a0,a5 + 3002d3a: 4472 lw s0,28(sp) + 3002d3c: 6105 addi sp,sp,32 + 3002d3e: 8082 ret + +03002d40 : + * @param postDiv pll_postdiv2 value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv2(CRG_PllPostDiv2 postDiv) +{ + 3002d40: 1101 addi sp,sp,-32 + 3002d42: ce22 sw s0,28(sp) + 3002d44: 1000 addi s0,sp,32 + 3002d46: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV2_1) && + 3002d4a: fec42783 lw a5,-20(s0) + 3002d4e: 0087b793 sltiu a5,a5,8 + 3002d52: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV2_8_MAX)); +} + 3002d54: 853e mv a0,a5 + 3002d56: 4472 lw s0,28(sp) + 3002d58: 6105 addi sp,sp,32 + 3002d5a: 8082 ret + +03002d5c : + * @param fbDiv pll fbdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllFbDiv(unsigned int fbDiv) +{ + 3002d5c: 1101 addi sp,sp,-32 + 3002d5e: ce22 sw s0,28(sp) + 3002d60: 1000 addi s0,sp,32 + 3002d62: fea42623 sw a0,-20(s0) + return (fbDiv <= CRG_PLL_FBDIV_MAX); + 3002d66: fec42783 lw a5,-20(s0) + 3002d6a: 0807b793 sltiu a5,a5,128 + 3002d6e: 9f81 uxtb a5 +} + 3002d70: 853e mv a0,a5 + 3002d72: 4472 lw s0,28(sp) + 3002d74: 6105 addi sp,sp,32 + 3002d76: 8082 ret + +03002d78 : + * @param select core_cksel value + * @retval true + * @retval false + */ +static inline bool IsCrgCoreCkSel(CRG_CoreClkSelect select) +{ + 3002d78: 1101 addi sp,sp,-32 + 3002d7a: ce22 sw s0,28(sp) + 3002d7c: 1000 addi s0,sp,32 + 3002d7e: fea42623 sw a0,-20(s0) + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002d82: fec42783 lw a5,-20(s0) + 3002d86: cb99 beqz a5,3002d9c + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + 3002d88: fec42703 lw a4,-20(s0) + 3002d8c: 4785 li a5,1 + 3002d8e: 00f70763 beq a4,a5,3002d9c + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002d92: fec42703 lw a4,-20(s0) + 3002d96: 4789 li a5,2 + 3002d98: 00f71463 bne a4,a5,3002da0 + 3002d9c: 4785 li a5,1 + 3002d9e: a011 j 3002da2 + 3002da0: 4781 li a5,0 + 3002da2: 8b85 andi a5,a5,1 + 3002da4: 9f81 uxtb a5 + (select == CRG_CORE_CLK_SELECT_PLL)); +} + 3002da6: 853e mv a0,a5 + 3002da8: 4472 lw s0,28(sp) + 3002daa: 6105 addi sp,sp,32 + 3002dac: 8082 ret + +03002dae : + * @param select 1M clock selection + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkSel(CRG_1MClkSelect select) +{ + 3002dae: 1101 addi sp,sp,-32 + 3002db0: ce22 sw s0,28(sp) + 3002db2: 1000 addi s0,sp,32 + 3002db4: fea42623 sw a0,-20(s0) + return ((select == CRG_1M_CLK_SELECT_HOSC) || + 3002db8: fec42783 lw a5,-20(s0) + 3002dbc: c791 beqz a5,3002dc8 + 3002dbe: fec42703 lw a4,-20(s0) + 3002dc2: 4785 li a5,1 + 3002dc4: 00f71463 bne a4,a5,3002dcc + 3002dc8: 4785 li a5,1 + 3002dca: a011 j 3002dce + 3002dcc: 4781 li a5,0 + 3002dce: 8b85 andi a5,a5,1 + 3002dd0: 9f81 uxtb a5 + (select == CRG_1M_CLK_SELECT_TCXO)); +} + 3002dd2: 853e mv a0,a5 + 3002dd4: 4472 lw s0,28(sp) + 3002dd6: 6105 addi sp,sp,32 + 3002dd8: 8082 ret + +03002dda : + * @param div 1M clock ratio + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkDiv(unsigned int div) +{ + 3002dda: 1101 addi sp,sp,-32 + 3002ddc: ce22 sw s0,28(sp) + 3002dde: 1000 addi s0,sp,32 + 3002de0: fea42623 sw a0,-20(s0) + return (div <= CRG_1MHZ_CLK_MAX_DIV); + 3002de4: fec42783 lw a5,-20(s0) + 3002de8: 0407b793 sltiu a5,a5,64 + 3002dec: 9f81 uxtb a5 +} + 3002dee: 853e mv a0,a5 + 3002df0: 4472 lw s0,28(sp) + 3002df2: 6105 addi sp,sp,32 + 3002df4: 8082 ret + +03002df6 : + * @param preDiv PLL Previous Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPreDiv(unsigned int pllRefFreq, unsigned int preDiv) +{ + 3002df6: 7179 addi sp,sp,-48 + 3002df8: d622 sw s0,44(sp) + 3002dfa: 1800 addi s0,sp,48 + 3002dfc: fca42e23 sw a0,-36(s0) + 3002e00: fcb42c23 sw a1,-40(s0) + unsigned int freq = pllRefFreq; + 3002e04: fdc42783 lw a5,-36(s0) + 3002e08: fef42623 sw a5,-20(s0) + if (preDiv != 0) { + 3002e0c: fd842783 lw a5,-40(s0) + 3002e10: cb89 beqz a5,3002e22 + freq /= preDiv; + 3002e12: fec42703 lw a4,-20(s0) + 3002e16: fd842783 lw a5,-40(s0) + 3002e1a: 02f757b3 divu a5,a4,a5 + 3002e1e: fef42623 sw a5,-20(s0) + } + return (freq >= CRG_CLK_PFD_MIN_FREQ) && (freq <= CRG_CLK_PFD_MAX_FREQ); + 3002e22: fec42703 lw a4,-20(s0) + 3002e26: 003d17b7 lui a5,0x3d1 + 3002e2a: 8ff78793 addi a5,a5,-1793 # 3d08ff + 3002e2e: 00e7fc63 bgeu a5,a4,3002e46 + 3002e32: fec42703 lw a4,-20(s0) + 3002e36: 007277b7 lui a5,0x727 + 3002e3a: 0e078793 addi a5,a5,224 # 7270e0 + 3002e3e: 00e7e463 bltu a5,a4,3002e46 + 3002e42: 4785 li a5,1 + 3002e44: a011 j 3002e48 + 3002e46: 4781 li a5,0 + 3002e48: 8b85 andi a5,a5,1 + 3002e4a: 9f81 uxtb a5 +} + 3002e4c: 853e mv a0,a5 + 3002e4e: 5432 lw s0,44(sp) + 3002e50: 6145 addi sp,sp,48 + 3002e52: 8082 ret + +03002e54 : + * @param fdDiv PLL FD Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidFdDiv(unsigned int clkPfdFreq, unsigned int fdDiv) +{ + 3002e54: 7179 addi sp,sp,-48 + 3002e56: d622 sw s0,44(sp) + 3002e58: 1800 addi s0,sp,48 + 3002e5a: fca42e23 sw a0,-36(s0) + 3002e5e: fcb42c23 sw a1,-40(s0) + if (clkPfdFreq > 30000000U) { /* The maximum speed of the external clock source is 30000000U. */ + 3002e62: fdc42703 lw a4,-36(s0) + 3002e66: 01c9c7b7 lui a5,0x1c9c + 3002e6a: 38078793 addi a5,a5,896 # 1c9c380 + 3002e6e: 00e7f463 bgeu a5,a4,3002e76 + return false; + 3002e72: 4781 li a5,0 + 3002e74: a08d j 3002ed6 + } else if (fdDiv > CRG_PLL_FBDIV_MAX) { + 3002e76: fd842703 lw a4,-40(s0) + 3002e7a: 07f00793 li a5,127 + 3002e7e: 00e7f463 bgeu a5,a4,3002e86 + return false; + 3002e82: 4781 li a5,0 + 3002e84: a889 j 3002ed6 + } + + unsigned int freq = (fdDiv > 0x6) ? (clkPfdFreq * fdDiv) : (clkPfdFreq * 0x6); /* 0x0-0x6: divided by 0x6 */ + 3002e86: fd842703 lw a4,-40(s0) + 3002e8a: 4799 li a5,6 + 3002e8c: 00e7f963 bgeu a5,a4,3002e9e + 3002e90: fdc42703 lw a4,-36(s0) + 3002e94: fd842783 lw a5,-40(s0) + 3002e98: 02f707b3 mul a5,a4,a5 + 3002e9c: a031 j 3002ea8 + 3002e9e: fdc42703 lw a4,-36(s0) + 3002ea2: 4799 li a5,6 + 3002ea4: 02f707b3 mul a5,a4,a5 + 3002ea8: fef42623 sw a5,-20(s0) + return (freq >= CRG_CLK_VCO_MIN_FREQ) && (freq <= CRG_CLK_VCO_MAX_FREQ); + 3002eac: fec42703 lw a4,-20(s0) + 3002eb0: 05f5e7b7 lui a5,0x5f5e + 3002eb4: 0ff78793 addi a5,a5,255 # 5f5e0ff + 3002eb8: 00e7fc63 bgeu a5,a4,3002ed0 + 3002ebc: fec42703 lw a4,-20(s0) + 3002ec0: 11e1a7b7 lui a5,0x11e1a + 3002ec4: 30078793 addi a5,a5,768 # 11e1a300 + 3002ec8: 00e7e463 bltu a5,a4,3002ed0 + 3002ecc: 4785 li a5,1 + 3002ece: a011 j 3002ed2 + 3002ed0: 4781 li a5,0 + 3002ed2: 8b85 andi a5,a5,1 + 3002ed4: 9f81 uxtb a5 +} + 3002ed6: 853e mv a0,a5 + 3002ed8: 5432 lw s0,44(sp) + 3002eda: 6145 addi sp,sp,48 + 3002edc: 8082 ret + +03002ede : + * @param postDiv PLL Post Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv(unsigned int clkVcoFreq, unsigned int postDiv) +{ + 3002ede: 7179 addi sp,sp,-48 + 3002ee0: d622 sw s0,44(sp) + 3002ee2: 1800 addi s0,sp,48 + 3002ee4: fca42e23 sw a0,-36(s0) + 3002ee8: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002eec: fdc42783 lw a5,-36(s0) + 3002ef0: fef42623 sw a5,-20(s0) + if (postDiv != 0) { + 3002ef4: fd842783 lw a5,-40(s0) + 3002ef8: cb91 beqz a5,3002f0c + freq /= (postDiv + 1); + 3002efa: fd842783 lw a5,-40(s0) + 3002efe: 0785 addi a5,a5,1 + 3002f00: fec42703 lw a4,-20(s0) + 3002f04: 02f757b3 divu a5,a4,a5 + 3002f08: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_TARGET_MAX_FREQ); + 3002f0c: fec42703 lw a4,-20(s0) + 3002f10: 08f0d7b7 lui a5,0x8f0d + 3002f14: 18178793 addi a5,a5,385 # 8f0d181 + 3002f18: 00f737b3 sltu a5,a4,a5 + 3002f1c: 9f81 uxtb a5 +} + 3002f1e: 853e mv a0,a5 + 3002f20: 5432 lw s0,44(sp) + 3002f22: 6145 addi sp,sp,48 + 3002f24: 8082 ret + +03002f26 : + * @param postDiv2 PLL Post Divsion2 + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv2(unsigned int clkVcoFreq, unsigned int postDiv2) +{ + 3002f26: 7179 addi sp,sp,-48 + 3002f28: d622 sw s0,44(sp) + 3002f2a: 1800 addi s0,sp,48 + 3002f2c: fca42e23 sw a0,-36(s0) + 3002f30: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002f34: fdc42783 lw a5,-36(s0) + 3002f38: fef42623 sw a5,-20(s0) + if (postDiv2 != 0) { + 3002f3c: fd842783 lw a5,-40(s0) + 3002f40: cb91 beqz a5,3002f54 + freq /= (postDiv2 + 1); + 3002f42: fd842783 lw a5,-40(s0) + 3002f46: 0785 addi a5,a5,1 + 3002f48: fec42703 lw a4,-20(s0) + 3002f4c: 02f757b3 divu a5,a4,a5 + 3002f50: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_PST2_MAX_FREQ); + 3002f54: fec42703 lw a4,-20(s0) + 3002f58: 05f5e7b7 lui a5,0x5f5e + 3002f5c: 10178793 addi a5,a5,257 # 5f5e101 + 3002f60: 00f737b3 sltu a5,a4,a5 + 3002f64: 9f81 uxtb a5 +} + 3002f66: 853e mv a0,a5 + 3002f68: 5432 lw s0,44(sp) + 3002f6a: 6145 addi sp,sp,48 + 3002f6c: 8082 ret + +03002f6e : + * @param adcClkSelect the value of adc clock select + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkModeSelect(CRG_AdcClkSelect adcClkSelect) +{ + 3002f6e: 1101 addi sp,sp,-32 + 3002f70: ce22 sw s0,28(sp) + 3002f72: 1000 addi s0,sp,32 + 3002f74: fea42623 sw a0,-20(s0) + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002f78: fec42783 lw a5,-20(s0) + 3002f7c: c385 beqz a5,3002f9c + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + 3002f7e: fec42703 lw a4,-20(s0) + 3002f82: 4785 li a5,1 + 3002f84: 00f70c63 beq a4,a5,3002f9c + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + 3002f88: fec42703 lw a4,-20(s0) + 3002f8c: 4789 li a5,2 + 3002f8e: 00f70763 beq a4,a5,3002f9c + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002f92: fec42703 lw a4,-20(s0) + 3002f96: 478d li a5,3 + 3002f98: 00f71463 bne a4,a5,3002fa0 + 3002f9c: 4785 li a5,1 + 3002f9e: a011 j 3002fa2 + 3002fa0: 4781 li a5,0 + 3002fa2: 8b85 andi a5,a5,1 + 3002fa4: 9f81 uxtb a5 + adcClkSelect == CRG_ADC_CLK_SYN_CORE); +} + 3002fa6: 853e mv a0,a5 + 3002fa8: 4472 lw s0,28(sp) + 3002faa: 6105 addi sp,sp,32 + 3002fac: 8082 ret + +03002fae : + * @param div the value of adc clock div + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkDiv(CRG_AdcDiv div) +{ + 3002fae: 1101 addi sp,sp,-32 + 3002fb0: ce22 sw s0,28(sp) + 3002fb2: 1000 addi s0,sp,32 + 3002fb4: fea42623 sw a0,-20(s0) + return (div == CRG_ADC_DIV_1 || \ + div == CRG_ADC_DIV_2 || \ + div == CRG_ADC_DIV_3 || \ + 3002fb8: fec42783 lw a5,-20(s0) + 3002fbc: c385 beqz a5,3002fdc + return (div == CRG_ADC_DIV_1 || \ + 3002fbe: fec42703 lw a4,-20(s0) + 3002fc2: 4785 li a5,1 + 3002fc4: 00f70c63 beq a4,a5,3002fdc + div == CRG_ADC_DIV_2 || \ + 3002fc8: fec42703 lw a4,-20(s0) + 3002fcc: 4789 li a5,2 + 3002fce: 00f70763 beq a4,a5,3002fdc + div == CRG_ADC_DIV_3 || \ + 3002fd2: fec42703 lw a4,-20(s0) + 3002fd6: 478d li a5,3 + 3002fd8: 00f71463 bne a4,a5,3002fe0 + 3002fdc: 4785 li a5,1 + 3002fde: a011 j 3002fe2 + 3002fe0: 4781 li a5,0 + 3002fe2: 8b85 andi a5,a5,1 + 3002fe4: 9f81 uxtb a5 + div == CRG_ADC_DIV_4); +} + 3002fe6: 853e mv a0,a5 + 3002fe8: 4472 lw s0,28(sp) + 3002fea: 6105 addi sp,sp,32 + 3002fec: 8082 ret + +03002fee : + * @param clk Clock register base address + * @param select Core clock selection + * @retval None + */ +static inline void DCL_CRG_SetCoreClkSel(CRG_RegStruct *clk, CRG_CoreClkSelect select) +{ + 3002fee: 1101 addi sp,sp,-32 + 3002ff0: ce06 sw ra,28(sp) + 3002ff2: cc22 sw s0,24(sp) + 3002ff4: 1000 addi s0,sp,32 + 3002ff6: fea42623 sw a0,-20(s0) + 3002ffa: feb42423 sw a1,-24(s0) + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + 3002ffe: fec42703 lw a4,-20(s0) + 3003002: 100007b7 lui a5,0x10000 + 3003006: 00f70a63 beq a4,a5,300301a + 300300a: 64b00593 li a1,1611 + 300300e: 030077b7 lui a5,0x3007 + 3003012: 88878513 addi a0,a5,-1912 # 3006888 + 3003016: 20a1 jal ra,300305e + 3003018: a001 j 3003018 + CRG_PARAM_CHECK_NO_RET(IsCrgCoreCkSel(select)); + 300301a: fe842503 lw a0,-24(s0) + 300301e: 3ba9 jal ra,3002d78 + 3003020: 87aa mv a5,a0 + 3003022: 0017c793 xori a5,a5,1 + 3003026: 9f81 uxtb a5 + 3003028: cb89 beqz a5,300303a + 300302a: 64c00593 li a1,1612 + 300302e: 030077b7 lui a5,0x3007 + 3003032: 88878513 addi a0,a5,-1912 # 3006888 + 3003036: 2025 jal ra,300305e + 3003038: a839 j 3003056 + clk->PERI_CRG64.BIT.clk_pst1_sw_sel = select; + 300303a: fe842783 lw a5,-24(s0) + 300303e: 8b8d andi a5,a5,3 + 3003040: 0ff7f693 andi a3,a5,255 + 3003044: fec42703 lw a4,-20(s0) + 3003048: 10072783 lw a5,256(a4) # ea510100 + 300304c: 8a8d andi a3,a3,3 + 300304e: 9bf1 andi a5,a5,-4 + 3003050: 8fd5 or a5,a5,a3 + 3003052: 10f72023 sw a5,256(a4) +} + 3003056: 40f2 lw ra,28(sp) + 3003058: 4462 lw s0,24(sp) + 300305a: 6105 addi sp,sp,32 + 300305c: 8082 ret + +0300305e : + 300305e: 988ff06f j 30021e6 + +03003062 : + * @param handle CRG Handle + * @retval BASE_STATUS_ERROR Parameter Check fail + * @retval BASE_STATUS_OK Success + */ +BASE_StatusType HAL_CRG_Init(const CRG_Handle *handle) +{ + 3003062: 7179 addi sp,sp,-48 + 3003064: d606 sw ra,44(sp) + 3003066: d422 sw s0,40(sp) + 3003068: 1800 addi s0,sp,48 + 300306a: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != NULL); + 300306e: fdc42783 lw a5,-36(s0) + 3003072: eb89 bnez a5,3003084 + 3003074: 07100593 li a1,113 + 3003078: 030077b7 lui a5,0x3007 + 300307c: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003080: 3ff9 jal ra,300305e + 3003082: a001 j 3003082 + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3003084: fdc42783 lw a5,-36(s0) + 3003088: 4398 lw a4,0(a5) + 300308a: 100007b7 lui a5,0x10000 + 300308e: 00f70a63 beq a4,a5,30030a2 + 3003092: 07200593 li a1,114 + 3003096: 030077b7 lui a5,0x3007 + 300309a: 8a478513 addi a0,a5,-1884 # 30068a4 + 300309e: 37c1 jal ra,300305e + 30030a0: a001 j 30030a0 + /* Check the validity of PLL-related parameters. */ + CRG_PARAM_CHECK_WITH_RET(IsCrgPllRefClkSelect(handle->pllRefClkSelect), BASE_STATUS_ERROR); + 30030a2: fdc42783 lw a5,-36(s0) + 30030a6: 43dc lw a5,4(a5) + 30030a8: 853e mv a0,a5 + 30030aa: 390d jal ra,3002cdc + 30030ac: 87aa mv a5,a0 + 30030ae: 0017c793 xori a5,a5,1 + 30030b2: 9f81 uxtb a5 + 30030b4: cb91 beqz a5,30030c8 + 30030b6: 07400593 li a1,116 + 30030ba: 030077b7 lui a5,0x3007 + 30030be: 8a478513 addi a0,a5,-1884 # 30068a4 + 30030c2: 3f71 jal ra,300305e + 30030c4: 4785 li a5,1 + 30030c6: aca9 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPreDiv(handle->pllPreDiv), BASE_STATUS_ERROR); + 30030c8: fdc42783 lw a5,-36(s0) + 30030cc: 479c lw a5,8(a5) + 30030ce: 853e mv a0,a5 + 30030d0: 3925 jal ra,3002d08 + 30030d2: 87aa mv a5,a0 + 30030d4: 0017c793 xori a5,a5,1 + 30030d8: 9f81 uxtb a5 + 30030da: cb91 beqz a5,30030ee + 30030dc: 07500593 li a1,117 + 30030e0: 030077b7 lui a5,0x3007 + 30030e4: 8a478513 addi a0,a5,-1884 # 30068a4 + 30030e8: 3f9d jal ra,300305e + 30030ea: 4785 li a5,1 + 30030ec: ac15 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllFbDiv(handle->pllFbDiv), BASE_STATUS_ERROR); + 30030ee: fdc42783 lw a5,-36(s0) + 30030f2: 47dc lw a5,12(a5) + 30030f4: 853e mv a0,a5 + 30030f6: 319d jal ra,3002d5c + 30030f8: 87aa mv a5,a0 + 30030fa: 0017c793 xori a5,a5,1 + 30030fe: 9f81 uxtb a5 + 3003100: cb91 beqz a5,3003114 + 3003102: 07600593 li a1,118 + 3003106: 030077b7 lui a5,0x3007 + 300310a: 8a478513 addi a0,a5,-1884 # 30068a4 + 300310e: 3f81 jal ra,300305e + 3003110: 4785 li a5,1 + 3003112: a439 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv(handle->pllPostDiv), BASE_STATUS_ERROR); + 3003114: fdc42783 lw a5,-36(s0) + 3003118: 4b9c lw a5,16(a5) + 300311a: 853e mv a0,a5 + 300311c: 3121 jal ra,3002d24 + 300311e: 87aa mv a5,a0 + 3003120: 0017c793 xori a5,a5,1 + 3003124: 9f81 uxtb a5 + 3003126: cb91 beqz a5,300313a + 3003128: 07700593 li a1,119 + 300312c: 030077b7 lui a5,0x3007 + 3003130: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003134: 372d jal ra,300305e + 3003136: 4785 li a5,1 + 3003138: a2e5 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv2(handle->handleEx.pllPostDiv2), BASE_STATUS_ERROR); + 300313a: fdc42783 lw a5,-36(s0) + 300313e: 4fdc lw a5,28(a5) + 3003140: 853e mv a0,a5 + 3003142: 3efd jal ra,3002d40 + 3003144: 87aa mv a5,a0 + 3003146: 0017c793 xori a5,a5,1 + 300314a: 9f81 uxtb a5 + 300314c: cb91 beqz a5,3003160 + 300314e: 07800593 li a1,120 + 3003152: 030077b7 lui a5,0x3007 + 3003156: 8a478513 addi a0,a5,-1884 # 30068a4 + 300315a: 3711 jal ra,300305e + 300315c: 4785 li a5,1 + 300315e: a2c9 j 3003320 + /* Check the Clock Source and Frequency Divider of the 1 MHz Clock. */ + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkSel(handle->handleEx.clk1MSelect), BASE_STATUS_ERROR); + 3003160: fdc42783 lw a5,-36(s0) + 3003164: 539c lw a5,32(a5) + 3003166: 853e mv a0,a5 + 3003168: 3199 jal ra,3002dae + 300316a: 87aa mv a5,a0 + 300316c: 0017c793 xori a5,a5,1 + 3003170: 9f81 uxtb a5 + 3003172: cb91 beqz a5,3003186 + 3003174: 07a00593 li a1,122 + 3003178: 030077b7 lui a5,0x3007 + 300317c: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003180: 3df9 jal ra,300305e + 3003182: 4785 li a5,1 + 3003184: aa71 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkDiv(handle->handleEx.clk1MDiv), BASE_STATUS_ERROR); + 3003186: fdc42783 lw a5,-36(s0) + 300318a: 53dc lw a5,36(a5) + 300318c: 853e mv a0,a5 + 300318e: 31b1 jal ra,3002dda + 3003190: 87aa mv a5,a0 + 3003192: 0017c793 xori a5,a5,1 + 3003196: 9f81 uxtb a5 + 3003198: cb91 beqz a5,30031ac + 300319a: 07b00593 li a1,123 + 300319e: 030077b7 lui a5,0x3007 + 30031a2: 8a478513 addi a0,a5,-1884 # 30068a4 + 30031a6: 3d65 jal ra,300305e + 30031a8: 4785 li a5,1 + 30031aa: aa9d j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 30031ac: fdc42783 lw a5,-36(s0) + 30031b0: 4f9c lw a5,24(a5) + 30031b2: 853e mv a0,a5 + 30031b4: 36d1 jal ra,3002d78 + 30031b6: 87aa mv a5,a0 + 30031b8: 0017c793 xori a5,a5,1 + 30031bc: 9f81 uxtb a5 + 30031be: cb91 beqz a5,30031d2 + 30031c0: 07c00593 li a1,124 + 30031c4: 030077b7 lui a5,0x3007 + 30031c8: 8a478513 addi a0,a5,-1884 # 30068a4 + 30031cc: 3d49 jal ra,300305e + 30031ce: 4785 li a5,1 + 30031d0: aa81 j 3003320 + + *(unsigned int *)CRG_HOSC_CTRL2_ADDR = 0x306E; /* Optimized HOSC temperature drift performance parameter. */ + 30031d2: 100017b7 lui a5,0x10001 + 30031d6: f0478793 addi a5,a5,-252 # 10000f04 + 30031da: 670d lui a4,0x3 + 30031dc: 06e70713 addi a4,a4,110 # 306e + 30031e0: c398 sw a4,0(a5) + + CRG_RegStruct *reg = handle->baseAddress; + 30031e2: fdc42783 lw a5,-36(s0) + 30031e6: 439c lw a5,0(a5) + 30031e8: fef42623 sw a5,-20(s0) + g_crgBaseAddr = (void *)reg; + 30031ec: 040007b7 lui a5,0x4000 + 30031f0: fec42703 lw a4,-20(s0) + 30031f4: 48e7aa23 sw a4,1172(a5) # 4000494 + /* Check the validity of the PLL parameter configuration. */ + if (CRG_IsValidPllConfig(handle) != BASE_STATUS_OK) { + 30031f8: fdc42503 lw a0,-36(s0) + 30031fc: 7a4000ef jal ra,30039a0 + 3003200: 87aa mv a5,a0 + 3003202: c399 beqz a5,3003208 + return BASE_STATUS_ERROR; + 3003204: 4785 li a5,1 + 3003206: aa29 j 3003320 + } + /* Disable the write protection function of the CRG register. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3003208: 3449 jal ra,3002c8a + + reg->PERI_CRG0.BIT.pll_ref_cksel = handle->pllRefClkSelect; + 300320a: fdc42783 lw a5,-36(s0) + 300320e: 43dc lw a5,4(a5) + 3003210: 8b85 andi a5,a5,1 + 3003212: 0ff7f693 andi a3,a5,255 + 3003216: fec42703 lw a4,-20(s0) + 300321a: 431c lw a5,0(a4) + 300321c: 8a85 andi a3,a3,1 + 300321e: 9bf9 andi a5,a5,-2 + 3003220: 8fd5 or a5,a5,a3 + 3003222: c31c sw a5,0(a4) + reg->PERI_CRG1.BIT.pll_prediv = handle->pllPreDiv; + 3003224: fdc42783 lw a5,-36(s0) + 3003228: 479c lw a5,8(a5) + 300322a: 8bbd andi a5,a5,15 + 300322c: 0ff7f693 andi a3,a5,255 + 3003230: fec42703 lw a4,-20(s0) + 3003234: 435c lw a5,4(a4) + 3003236: 8abd andi a3,a3,15 + 3003238: 9bc1 andi a5,a5,-16 + 300323a: 8fd5 or a5,a5,a3 + 300323c: c35c sw a5,4(a4) + reg->PERI_CRG2.BIT.pll_fbdiv = handle->pllFbDiv; + 300323e: fdc42783 lw a5,-36(s0) + 3003242: 47dc lw a5,12(a5) + 3003244: 0ff7f693 andi a3,a5,255 + 3003248: fec42703 lw a4,-20(s0) + 300324c: 471c lw a5,8(a4) + 300324e: 0ff6f693 andi a3,a3,255 + 3003252: f007f793 andi a5,a5,-256 + 3003256: 8fd5 or a5,a5,a3 + 3003258: c71c sw a5,8(a4) + reg->PERI_CRG3.BIT.pll_postdiv1 = handle->pllPostDiv; + 300325a: fdc42783 lw a5,-36(s0) + 300325e: 4b9c lw a5,16(a5) + 3003260: 8bbd andi a5,a5,15 + 3003262: 0ff7f693 andi a3,a5,255 + 3003266: fec42703 lw a4,-20(s0) + 300326a: 475c lw a5,12(a4) + 300326c: 8abd andi a3,a3,15 + 300326e: 9bc1 andi a5,a5,-16 + 3003270: 8fd5 or a5,a5,a3 + 3003272: c75c sw a5,12(a4) + reg->PERI_CRG3.BIT.pll_postdiv2 = handle->handleEx.pllPostDiv2; + 3003274: fdc42783 lw a5,-36(s0) + 3003278: 4fdc lw a5,28(a5) + 300327a: 8bbd andi a5,a5,15 + 300327c: 0ff7f693 andi a3,a5,255 + 3003280: fec42703 lw a4,-20(s0) + 3003284: 475c lw a5,12(a4) + 3003286: 8abd andi a3,a3,15 + 3003288: 0692 slli a3,a3,0x4 + 300328a: f0f7f793 andi a5,a5,-241 + 300328e: 8fd5 or a5,a5,a3 + 3003290: c75c sw a5,12(a4) + reg->PERI_CRG4.BIT.pll_pd = BASE_CFG_UNSET; + 3003292: fec42703 lw a4,-20(s0) + 3003296: 4b1c lw a5,16(a4) + 3003298: 9bf9 andi a5,a5,-2 + 300329a: cb1c sw a5,16(a4) + + while (reg->PERI_CRG7.BIT.pll_lock != BASE_CFG_SET) { + 300329c: 0001 nop + 300329e: fec42783 lw a5,-20(s0) + 30032a2: 4fdc lw a5,28(a5) + 30032a4: 8b85 andi a5,a5,1 + 30032a6: 0ff7f713 andi a4,a5,255 + 30032aa: 4785 li a5,1 + 30032ac: fef719e3 bne a4,a5,300329e + ; /* Wait for PLL to lock */ + } + + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 30032b0: 3409 jal ra,3002cb2 + /* Check the 1MHz clock parameter configuration. */ + if (CRG_IsValid1MHzConfig(handle) != BASE_STATUS_OK) { + 30032b2: fdc42503 lw a0,-36(s0) + 30032b6: 7ac000ef jal ra,3003a62 + 30032ba: 87aa mv a5,a0 + 30032bc: c399 beqz a5,30032c2 + return BASE_STATUS_ERROR; + 30032be: 4785 li a5,1 + 30032c0: a085 j 3003320 + } + while (reg->HOSC_LOCK.BIT.hosc_lock != BASE_CFG_SET) { + 30032c2: 0001 nop + 30032c4: fec42703 lw a4,-20(s0) + 30032c8: 6785 lui a5,0x1 + 30032ca: 97ba add a5,a5,a4 + 30032cc: f107a783 lw a5,-240(a5) # f10 + 30032d0: 8b85 andi a5,a5,1 + 30032d2: 0ff7f713 andi a4,a5,255 + 30032d6: 4785 li a5,1 + 30032d8: fef716e3 bne a4,a5,30032c4 + ; /* Wait for HOSC to lock */ + } + /* Set the Clock Source and Frequency Divider of the 1 MHz Clock. */ + reg->PERI_CRG67.BIT.clk_1m_div = handle->handleEx.clk1MDiv; + 30032dc: fdc42783 lw a5,-36(s0) + 30032e0: 53dc lw a5,36(a5) + 30032e2: 03f7f793 andi a5,a5,63 + 30032e6: 0ff7f693 andi a3,a5,255 + 30032ea: fec42703 lw a4,-20(s0) + 30032ee: 10c72783 lw a5,268(a4) + 30032f2: 03f6f693 andi a3,a3,63 + 30032f6: fc07f793 andi a5,a5,-64 + 30032fa: 8fd5 or a5,a5,a3 + 30032fc: 10f72623 sw a5,268(a4) + reg->PERI_CRG66.BIT.clk_1m_ini_cksel = handle->handleEx.clk1MSelect; + 3003300: fdc42783 lw a5,-36(s0) + 3003304: 539c lw a5,32(a5) + 3003306: 8b85 andi a5,a5,1 + 3003308: 0ff7f693 andi a3,a5,255 + 300330c: fec42703 lw a4,-20(s0) + 3003310: 10872783 lw a5,264(a4) + 3003314: 8a85 andi a3,a3,1 + 3003316: 9bf9 andi a5,a5,-2 + 3003318: 8fd5 or a5,a5,a3 + 300331a: 10f72423 sw a5,264(a4) + return BASE_STATUS_OK; + 300331e: 4781 li a5,0 +} + 3003320: 853e mv a0,a5 + 3003322: 50b2 lw ra,44(sp) + 3003324: 5422 lw s0,40(sp) + 3003326: 6145 addi sp,sp,48 + 3003328: 8082 ret + +0300332a : + * @param handle CRG Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Paramter check fail + */ +BASE_StatusType HAL_CRG_SetCoreClockSelect(CRG_Handle *handle) +{ + 300332a: 7179 addi sp,sp,-48 + 300332c: d606 sw ra,44(sp) + 300332e: d422 sw s0,40(sp) + 3003330: 1800 addi s0,sp,48 + 3003332: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != 0); + 3003336: fdc42783 lw a5,-36(s0) + 300333a: eb89 bnez a5,300334c + 300333c: 10a00593 li a1,266 + 3003340: 030077b7 lui a5,0x3007 + 3003344: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003348: 3b19 jal ra,300305e + 300334a: a001 j 300334a + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 300334c: fdc42783 lw a5,-36(s0) + 3003350: 4398 lw a4,0(a5) + 3003352: 100007b7 lui a5,0x10000 + 3003356: 00f70a63 beq a4,a5,300336a + 300335a: 10b00593 li a1,267 + 300335e: 030077b7 lui a5,0x3007 + 3003362: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003366: 39e5 jal ra,300305e + 3003368: a001 j 3003368 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 300336a: fdc42783 lw a5,-36(s0) + 300336e: 4f9c lw a5,24(a5) + 3003370: 853e mv a0,a5 + 3003372: 3419 jal ra,3002d78 + 3003374: 87aa mv a5,a0 + 3003376: 0017c793 xori a5,a5,1 + 300337a: 9f81 uxtb a5 + 300337c: cb91 beqz a5,3003390 + 300337e: 10c00593 li a1,268 + 3003382: 030077b7 lui a5,0x3007 + 3003386: 8a478513 addi a0,a5,-1884 # 30068a4 + 300338a: 39d1 jal ra,300305e + 300338c: 4785 li a5,1 + 300338e: a005 j 30033ae + + CRG_RegStruct *reg = handle->baseAddress; + 3003390: fdc42783 lw a5,-36(s0) + 3003394: 439c lw a5,0(a5) + 3003396: fef42623 sw a5,-20(s0) + /* The write protection of the CRG register needs to be disabled. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 300339a: 38c5 jal ra,3002c8a + DCL_CRG_SetCoreClkSel(reg, handle->coreClkSelect); + 300339c: fdc42783 lw a5,-36(s0) + 30033a0: 4f9c lw a5,24(a5) + 30033a2: 85be mv a1,a5 + 30033a4: fec42503 lw a0,-20(s0) + 30033a8: 3199 jal ra,3002fee + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 30033aa: 3221 jal ra,3002cb2 + + return BASE_STATUS_OK; + 30033ac: 4781 li a5,0 +} + 30033ae: 853e mv a0,a5 + 30033b0: 50b2 lw ra,44(sp) + 30033b2: 5422 lw s0,40(sp) + 30033b4: 6145 addi sp,sp,48 + 30033b6: 8082 ret + +030033b8 : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +static inline unsigned int CRG_GetVcoFreq(void) +{ + 30033b8: 1101 addi sp,sp,-32 + 30033ba: ce06 sw ra,28(sp) + 30033bc: cc22 sw s0,24(sp) + 30033be: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int regFbdiv; + CRG_RegStruct *crg = g_crgBaseAddr; + 30033c0: 040007b7 lui a5,0x4000 + 30033c4: 4947a783 lw a5,1172(a5) # 4000494 + 30033c8: fef42623 sw a5,-20(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 30033cc: fec42703 lw a4,-20(s0) + 30033d0: 100007b7 lui a5,0x10000 + 30033d4: 00f70a63 beq a4,a5,30033e8 + 30033d8: 12200593 li a1,290 + 30033dc: 030077b7 lui a5,0x3007 + 30033e0: 8a478513 addi a0,a5,-1884 # 30068a4 + 30033e4: 39ad jal ra,300305e + 30033e6: a001 j 30033e6 + CRG_ASSERT_PARAM((XTRAIL_FREQ <= 30000000U)); /* The maximum of the external clock source is 30000000U. */ + + freq = CRG_GetPllRefIni(crg->PERI_CRG0.BIT.pll_ref_cksel); + 30033e8: fec42783 lw a5,-20(s0) + 30033ec: 439c lw a5,0(a5) + 30033ee: 8b85 andi a5,a5,1 + 30033f0: 9f81 uxtb a5 + 30033f2: 853e mv a0,a5 + 30033f4: 25c1 jal ra,3003ab4 + 30033f6: fea42423 sw a0,-24(s0) + freq /= CRG_GetPreDivValue(crg->PERI_CRG1.BIT.pll_prediv); + 30033fa: fec42783 lw a5,-20(s0) + 30033fe: 43dc lw a5,4(a5) + 3003400: 8bbd andi a5,a5,15 + 3003402: 9f81 uxtb a5 + 3003404: 853e mv a0,a5 + 3003406: 2de1 jal ra,3003ade + 3003408: 872a mv a4,a0 + 300340a: fe842783 lw a5,-24(s0) + 300340e: 02e7d7b3 divu a5,a5,a4 + 3003412: fef42423 sw a5,-24(s0) + regFbdiv = CRG_GetPllFbDivValue(crg->PERI_CRG2.BIT.pll_fbdiv); /* Get the value of the fbdiv register. */ + 3003416: fec42783 lw a5,-20(s0) + 300341a: 479c lw a5,8(a5) + 300341c: 9f81 uxtb a5 + 300341e: 853e mv a0,a5 + 3003420: 25f5 jal ra,3003b0c + 3003422: fea42223 sw a0,-28(s0) + freq *= (regFbdiv >= 0x06) ? regFbdiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 3003426: fe442783 lw a5,-28(s0) + 300342a: 4719 li a4,6 + 300342c: 00e7f363 bgeu a5,a4,3003432 + 3003430: 4799 li a5,6 + 3003432: fe842703 lw a4,-24(s0) + 3003436: 02f707b3 mul a5,a4,a5 + 300343a: fef42423 sw a5,-24(s0) + return freq; + 300343e: fe842783 lw a5,-24(s0) +} + 3003442: 853e mv a0,a5 + 3003444: 40f2 lw ra,28(sp) + 3003446: 4462 lw s0,24(sp) + 3003448: 6105 addi sp,sp,32 + 300344a: 8082 ret + +0300344c : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +unsigned int HAL_CRG_GetPllFreq(void) +{ + 300344c: 1101 addi sp,sp,-32 + 300344e: ce06 sw ra,28(sp) + 3003450: cc22 sw s0,24(sp) + 3003452: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int pllPostDivValue; + CRG_RegStruct *crg = g_crgBaseAddr; + 3003454: 040007b7 lui a5,0x4000 + 3003458: 4947a783 lw a5,1172(a5) # 4000494 + 300345c: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003460: fe842703 lw a4,-24(s0) + 3003464: 100007b7 lui a5,0x10000 + 3003468: 00f70a63 beq a4,a5,300347c + 300346c: 13700593 li a1,311 + 3003470: 030077b7 lui a5,0x3007 + 3003474: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003478: 36dd jal ra,300305e + 300347a: a001 j 300347a + freq = CRG_GetVcoFreq(); + 300347c: 3f35 jal ra,30033b8 + 300347e: fea42623 sw a0,-20(s0) + pllPostDivValue = CRG_GetPllPostDivValue((CRG_PllPostDiv)crg->PERI_CRG3.BIT.pll_postdiv1); + 3003482: fe842783 lw a5,-24(s0) + 3003486: 47dc lw a5,12(a5) + 3003488: 8bbd andi a5,a5,15 + 300348a: 9f81 uxtb a5 + 300348c: 853e mv a0,a5 + 300348e: 25c1 jal ra,3003b4e + 3003490: fea42223 sw a0,-28(s0) + /* Calculate the PLL output clock frequency based on the VCO clock frequency and post-division coefficient. */ + if (pllPostDivValue != 0) { + 3003494: fe442783 lw a5,-28(s0) + 3003498: cb89 beqz a5,30034aa + freq /= pllPostDivValue; + 300349a: fec42703 lw a4,-20(s0) + 300349e: fe442783 lw a5,-28(s0) + 30034a2: 02f757b3 divu a5,a4,a5 + 30034a6: fef42623 sw a5,-20(s0) + } + return freq; + 30034aa: fec42783 lw a5,-20(s0) +} + 30034ae: 853e mv a0,a5 + 30034b0: 40f2 lw ra,28(sp) + 30034b2: 4462 lw s0,24(sp) + 30034b4: 6105 addi sp,sp,32 + 30034b6: 8082 ret + +030034b8 : + * @brief Get Core Clock Frequence + * @param None + * @retval unsigned int Core clock frequency + */ +unsigned int HAL_CRG_GetCoreClkFreq(void) +{ + 30034b8: 1101 addi sp,sp,-32 + 30034ba: ce06 sw ra,28(sp) + 30034bc: cc22 sw s0,24(sp) + 30034be: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int coreClkSelect; + CRG_RegStruct *crg = g_crgBaseAddr; + 30034c0: 040007b7 lui a5,0x4000 + 30034c4: 4947a783 lw a5,1172(a5) # 4000494 + 30034c8: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 30034cc: fe842703 lw a4,-24(s0) + 30034d0: 100007b7 lui a5,0x10000 + 30034d4: 00f70a63 beq a4,a5,30034e8 + 30034d8: 14c00593 li a1,332 + 30034dc: 030077b7 lui a5,0x3007 + 30034e0: 8a478513 addi a0,a5,-1884 # 30068a4 + 30034e4: 3ead jal ra,300305e + 30034e6: a001 j 30034e6 + coreClkSelect = crg->PERI_CRG64.BIT.clk_pst1_sw_sel; + 30034e8: fe842783 lw a5,-24(s0) + 30034ec: 1007a783 lw a5,256(a5) + 30034f0: 8b8d andi a5,a5,3 + 30034f2: 9f81 uxtb a5 + 30034f4: fef42223 sw a5,-28(s0) + switch (coreClkSelect) { + 30034f8: fe442783 lw a5,-28(s0) + 30034fc: 4705 li a4,1 + 30034fe: 02e78063 beq a5,a4,300351e + 3003502: 4705 li a4,1 + 3003504: 00e7e663 bltu a5,a4,3003510 + 3003508: 4709 li a4,2 + 300350a: 02e78163 beq a5,a4,300352c + 300350e: a01d j 3003534 + case CRG_CORE_CLK_SELECT_HOSC: /* The clock source is an internal high-speed clock. */ + freq = HOSC_FREQ; + 3003510: 017d87b7 lui a5,0x17d8 + 3003514: 84078793 addi a5,a5,-1984 # 17d7840 + 3003518: fef42623 sw a5,-20(s0) + break; + 300351c: a015 j 3003540 + + case CRG_CORE_CLK_SELECT_TCXO: /* The clock source is the external crystal oscillator clock. */ + freq = XTRAIL_FREQ; + 300351e: 01c9c7b7 lui a5,0x1c9c + 3003522: 38078793 addi a5,a5,896 # 1c9c380 + 3003526: fef42623 sw a5,-20(s0) + break; + 300352a: a819 j 3003540 + + case CRG_CORE_CLK_SELECT_PLL: /* The clock source is the PLL. */ + freq = HAL_CRG_GetPllFreq(); + 300352c: 3705 jal ra,300344c + 300352e: fea42623 sw a0,-20(s0) + break; + 3003532: a039 j 3003540 + + default: + freq = LOSC_FREQ; + 3003534: 67a1 lui a5,0x8 + 3003536: d0078793 addi a5,a5,-768 # 7d00 + 300353a: fef42623 sw a5,-20(s0) + break; + 300353e: 0001 nop + } + return freq; + 3003540: fec42783 lw a5,-20(s0) +} + 3003544: 853e mv a0,a5 + 3003546: 40f2 lw ra,28(sp) + 3003548: 4462 lw s0,24(sp) + 300354a: 6105 addi sp,sp,32 + 300354c: 8082 ret + +0300354e : + * @brief Get Clock Frequence + * @param handle CRG Handle + * @retval Frequece of IP + */ +unsigned int HAL_CRG_GetIpFreq(const void *baseAddress) +{ + 300354e: 7179 addi sp,sp,-48 + 3003550: d606 sw ra,44(sp) + 3003552: d422 sw s0,40(sp) + 3003554: 1800 addi s0,sp,48 + 3003556: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 300355a: fdc42783 lw a5,-36(s0) + 300355e: eb89 bnez a5,3003570 + 3003560: 16900593 li a1,361 + 3003564: 030077b7 lui a5,0x3007 + 3003568: 8a478513 addi a0,a5,-1884 # 30068a4 + 300356c: 3ccd jal ra,300305e + 300356e: a001 j 300356e + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003570: 040007b7 lui a5,0x4000 + 3003574: 4947a703 lw a4,1172(a5) # 4000494 + 3003578: 100007b7 lui a5,0x10000 + 300357c: 00f70a63 beq a4,a5,3003590 + 3003580: 16a00593 li a1,362 + 3003584: 030077b7 lui a5,0x3007 + 3003588: 8a478513 addi a0,a5,-1884 # 30068a4 + 300358c: 3cc9 jal ra,300305e + 300358e: a001 j 300358e +#ifdef FPGA + /* Use this function to obtain the clock frequency during the FPGA phase. */ + return CHIP_GetIpFreqHz(baseAddress); +#else + unsigned int hclk = HAL_CRG_GetCoreClkFreq(); + 3003590: 3725 jal ra,30034b8 + 3003592: fea42423 sw a0,-24(s0) + unsigned int freq = LOSC_FREQ; + 3003596: 67a1 lui a5,0x8 + 3003598: d0078793 addi a5,a5,-768 # 7d00 + 300359c: fef42623 sw a5,-20(s0) + unsigned int coreClkFreq; + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 30035a0: fdc42503 lw a0,-36(s0) + 30035a4: 2cc9 jal ra,3003876 + 30035a6: fea42223 sw a0,-28(s0) + if (p == NULL) { + 30035aa: fe442783 lw a5,-28(s0) + 30035ae: e781 bnez a5,30035b6 + return freq; + 30035b0: fec42783 lw a5,-20(s0) + 30035b4: a895 j 3003628 + } + switch (p->type) { + 30035b6: fe442783 lw a5,-28(s0) + 30035ba: 43dc lw a5,4(a5) + 30035bc: 4715 li a4,5 + 30035be: 04f76a63 bltu a4,a5,3003612 + 30035c2: 00279713 slli a4,a5,0x2 + 30035c6: 030077b7 lui a5,0x3007 + 30035ca: 8e078793 addi a5,a5,-1824 # 30068e0 + 30035ce: 97ba add a5,a5,a4 + 30035d0: 439c lw a5,0(a5) + 30035d2: 8782 jr a5 + case CRG_IP_NONE_CLK_SEL: + case CRG_IP_EFC: + case CRG_IP_ANA: + freq = hclk; /* Returns the internal high speed clock frequency. */ + 30035d4: fe842783 lw a5,-24(s0) + 30035d8: fef42623 sw a5,-20(s0) + break; + 30035dc: a825 j 3003614 + + case CRG_IP_CAN: + freq = CRG_GetPllRefIni(g_crgBaseAddr->PERI_CRG0.BIT.pll_ref_cksel); + 30035de: 040007b7 lui a5,0x4000 + 30035e2: 4947a783 lw a5,1172(a5) # 4000494 + 30035e6: 439c lw a5,0(a5) + 30035e8: 8b85 andi a5,a5,1 + 30035ea: 9f81 uxtb a5 + 30035ec: 853e mv a0,a5 + 30035ee: 21d9 jal ra,3003ab4 + 30035f0: fea42623 sw a0,-20(s0) + break; + 30035f4: a005 j 3003614 + + case CRG_IP_ADC: + /* Get core clock frequence for calculating the ADC clock frequency. */ + coreClkFreq = HAL_CRG_GetCoreClkFreq(); + 30035f6: 35c9 jal ra,30034b8 + 30035f8: fea42023 sw a0,-32(s0) + freq = CRG_GetAdcIpFreq(p, CRG_GetVcoFreq(), coreClkFreq); + 30035fc: 3b75 jal ra,30033b8 + 30035fe: 87aa mv a5,a0 + 3003600: fe042603 lw a2,-32(s0) + 3003604: 85be mv a1,a5 + 3003606: fe442503 lw a0,-28(s0) + 300360a: 2c85 jal ra,300387a + 300360c: fea42623 sw a0,-20(s0) + break; + 3003610: a011 j 3003614 + + case CRG_IP_IWDG: /* The IWDG clock frequency is an internal low-speed clock. */ + default: + break; + 3003612: 0001 nop + } + if (freq == 0) { + 3003614: fec42783 lw a5,-20(s0) + 3003618: e791 bnez a5,3003624 + freq = LOSC_FREQ; + 300361a: 67a1 lui a5,0x8 + 300361c: d0078793 addi a5,a5,-768 # 7d00 + 3003620: fef42623 sw a5,-20(s0) + } + return freq; + 3003624: fec42783 lw a5,-20(s0) +#endif +} + 3003628: 853e mv a0,a5 + 300362a: 50b2 lw ra,44(sp) + 300362c: 5422 lw s0,40(sp) + 300362e: 6145 addi sp,sp,48 + 3003630: 8082 ret + +03003632 : + * @param enable enable mask + * @retval BASE_STATUS_ERROR Can't find the Match or operation is not support + * @retval BASE_STATUS_OK Operation Success + */ +BASE_StatusType HAL_CRG_IpEnableSet(const void *baseAddress, unsigned int enable) +{ + 3003632: 7179 addi sp,sp,-48 + 3003634: d606 sw ra,44(sp) + 3003636: d422 sw s0,40(sp) + 3003638: 1800 addi s0,sp,48 + 300363a: fca42e23 sw a0,-36(s0) + 300363e: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3003642: fdc42783 lw a5,-36(s0) + 3003646: eb89 bnez a5,3003658 + 3003648: 19c00593 li a1,412 + 300364c: 030077b7 lui a5,0x3007 + 3003650: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003654: 3429 jal ra,300305e + 3003656: a001 j 3003656 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003658: 040007b7 lui a5,0x4000 + 300365c: 4947a703 lw a4,1172(a5) # 4000494 + 3003660: 100007b7 lui a5,0x10000 + 3003664: 00f70a63 beq a4,a5,3003678 + 3003668: 19d00593 li a1,413 + 300366c: 030077b7 lui a5,0x3007 + 3003670: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003674: 32ed jal ra,300305e + 3003676: a001 j 3003676 + /* Check the validity of the input parameters. */ + CRG_PARAM_CHECK_WITH_RET((enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE), BASE_STATUS_ERROR); + 3003678: fd842703 lw a4,-40(s0) + 300367c: 4785 li a5,1 + 300367e: 00f70e63 beq a4,a5,300369a + 3003682: fd842783 lw a5,-40(s0) + 3003686: cb91 beqz a5,300369a + 3003688: 19f00593 li a1,415 + 300368c: 030077b7 lui a5,0x3007 + 3003690: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003694: 32e9 jal ra,300305e + 3003696: 4785 li a5,1 + 3003698: a0a5 j 3003700 + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 300369a: fdc42503 lw a0,-36(s0) + 300369e: 2ae1 jal ra,3003876 + 30036a0: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 30036a4: fec42783 lw a5,-20(s0) + 30036a8: c799 beqz a5,30036b6 + 30036aa: fec42783 lw a5,-20(s0) + 30036ae: 43d8 lw a4,4(a5) + 30036b0: 4795 li a5,5 + 30036b2: 00e7f463 bgeu a5,a4,30036ba + return BASE_STATUS_ERROR; + 30036b6: 4785 li a5,1 + 30036b8: a0a1 j 3003700 + } + if (g_ipClkProc[p->type].enableSet == NULL) { + 30036ba: fec42783 lw a5,-20(s0) + 30036be: 43d4 lw a3,4(a5) + 30036c0: 040007b7 lui a5,0x4000 + 30036c4: 02478713 addi a4,a5,36 # 4000024 + 30036c8: 02400793 li a5,36 + 30036cc: 02f687b3 mul a5,a3,a5 + 30036d0: 97ba add a5,a5,a4 + 30036d2: 479c lw a5,8(a5) + 30036d4: e399 bnez a5,30036da + return BASE_STATUS_ERROR; + 30036d6: 4785 li a5,1 + 30036d8: a025 j 3003700 + } + g_ipClkProc[p->type].enableSet(p, enable); + 30036da: fec42783 lw a5,-20(s0) + 30036de: 43d4 lw a3,4(a5) + 30036e0: 040007b7 lui a5,0x4000 + 30036e4: 02478713 addi a4,a5,36 # 4000024 + 30036e8: 02400793 li a5,36 + 30036ec: 02f687b3 mul a5,a3,a5 + 30036f0: 97ba add a5,a5,a4 + 30036f2: 479c lw a5,8(a5) + 30036f4: fd842583 lw a1,-40(s0) + 30036f8: fec42503 lw a0,-20(s0) + 30036fc: 9782 jalr a5 + return BASE_STATUS_OK; + 30036fe: 4781 li a5,0 +} + 3003700: 853e mv a0,a5 + 3003702: 50b2 lw ra,44(sp) + 3003704: 5422 lw s0,40(sp) + 3003706: 6145 addi sp,sp,48 + 3003708: 8082 ret + +0300370a : + * @param select clock select, @see CRG_APBLsClkSelect for ip in apb_ls_subsys or CRG_AdcClkSelect for adc + * @retval BASE_STATUS_OK success + * @retval BASE_STATUS_ERROR fail + */ +BASE_StatusType HAL_CRG_IpClkSelectSet(const void *baseAddress, unsigned int select) +{ + 300370a: 7179 addi sp,sp,-48 + 300370c: d606 sw ra,44(sp) + 300370e: d422 sw s0,40(sp) + 3003710: 1800 addi s0,sp,48 + 3003712: fca42e23 sw a0,-36(s0) + 3003716: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 300371a: fdc42783 lw a5,-36(s0) + 300371e: eb89 bnez a5,3003730 + 3003720: 1cd00593 li a1,461 + 3003724: 030077b7 lui a5,0x3007 + 3003728: 8a478513 addi a0,a5,-1884 # 30068a4 + 300372c: 2d8d jal ra,3003d9e + 300372e: a001 j 300372e + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003730: 040007b7 lui a5,0x4000 + 3003734: 4947a703 lw a4,1172(a5) # 4000494 + 3003738: 100007b7 lui a5,0x10000 + 300373c: 00f70a63 beq a4,a5,3003750 + 3003740: 1ce00593 li a1,462 + 3003744: 030077b7 lui a5,0x3007 + 3003748: 8a478513 addi a0,a5,-1884 # 30068a4 + 300374c: 2d89 jal ra,3003d9e + 300374e: a001 j 300374e + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003750: fdc42503 lw a0,-36(s0) + 3003754: 220d jal ra,3003876 + 3003756: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 300375a: fec42783 lw a5,-20(s0) + 300375e: c799 beqz a5,300376c + 3003760: fec42783 lw a5,-20(s0) + 3003764: 43d8 lw a4,4(a5) + 3003766: 4795 li a5,5 + 3003768: 00e7f463 bgeu a5,a4,3003770 + return BASE_STATUS_ERROR; + 300376c: 4785 li a5,1 + 300376e: a0a1 j 30037b6 + } + if (g_ipClkProc[p->type].clkSelSet == NULL) { + 3003770: fec42783 lw a5,-20(s0) + 3003774: 43d4 lw a3,4(a5) + 3003776: 040007b7 lui a5,0x4000 + 300377a: 02478713 addi a4,a5,36 # 4000024 + 300377e: 02400793 li a5,36 + 3003782: 02f687b3 mul a5,a3,a5 + 3003786: 97ba add a5,a5,a4 + 3003788: 47dc lw a5,12(a5) + 300378a: e399 bnez a5,3003790 + return BASE_STATUS_ERROR; + 300378c: 4785 li a5,1 + 300378e: a025 j 30037b6 + } + g_ipClkProc[p->type].clkSelSet(p, select); /* Clock selection of the configuration module. */ + 3003790: fec42783 lw a5,-20(s0) + 3003794: 43d4 lw a3,4(a5) + 3003796: 040007b7 lui a5,0x4000 + 300379a: 02478713 addi a4,a5,36 # 4000024 + 300379e: 02400793 li a5,36 + 30037a2: 02f687b3 mul a5,a3,a5 + 30037a6: 97ba add a5,a5,a4 + 30037a8: 47dc lw a5,12(a5) + 30037aa: fd842583 lw a1,-40(s0) + 30037ae: fec42503 lw a0,-20(s0) + 30037b2: 9782 jalr a5 + return BASE_STATUS_OK; + 30037b4: 4781 li a5,0 +} + 30037b6: 853e mv a0,a5 + 30037b8: 50b2 lw ra,44(sp) + 30037ba: 5422 lw s0,40(sp) + 30037bc: 6145 addi sp,sp,48 + 30037be: 8082 ret + +030037c0 : + * @param div set div value + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Match Fail or Not support + */ +BASE_StatusType HAL_CRG_IpClkDivSet(const void *baseAddress, unsigned int div) +{ + 30037c0: 7179 addi sp,sp,-48 + 30037c2: d606 sw ra,44(sp) + 30037c4: d422 sw s0,40(sp) + 30037c6: 1800 addi s0,sp,48 + 30037c8: fca42e23 sw a0,-36(s0) + 30037cc: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 30037d0: fdc42783 lw a5,-36(s0) + 30037d4: eb89 bnez a5,30037e6 + 30037d6: 22c00593 li a1,556 + 30037da: 030077b7 lui a5,0x3007 + 30037de: 8a478513 addi a0,a5,-1884 # 30068a4 + 30037e2: 2b75 jal ra,3003d9e + 30037e4: a001 j 30037e4 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30037e6: 040007b7 lui a5,0x4000 + 30037ea: 4947a703 lw a4,1172(a5) # 4000494 + 30037ee: 100007b7 lui a5,0x10000 + 30037f2: 00f70a63 beq a4,a5,3003806 + 30037f6: 22d00593 li a1,557 + 30037fa: 030077b7 lui a5,0x3007 + 30037fe: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003802: 2b71 jal ra,3003d9e + 3003804: a001 j 3003804 + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003806: fdc42503 lw a0,-36(s0) + 300380a: 20b5 jal ra,3003876 + 300380c: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 3003810: fec42783 lw a5,-20(s0) + 3003814: c799 beqz a5,3003822 + 3003816: fec42783 lw a5,-20(s0) + 300381a: 43d8 lw a4,4(a5) + 300381c: 4795 li a5,5 + 300381e: 00e7f463 bgeu a5,a4,3003826 + return BASE_STATUS_ERROR; + 3003822: 4785 li a5,1 + 3003824: a0a1 j 300386c + } + if (g_ipClkProc[p->type].clkDivSet == NULL) { + 3003826: fec42783 lw a5,-20(s0) + 300382a: 43d4 lw a3,4(a5) + 300382c: 040007b7 lui a5,0x4000 + 3003830: 02478713 addi a4,a5,36 # 4000024 + 3003834: 02400793 li a5,36 + 3003838: 02f687b3 mul a5,a3,a5 + 300383c: 97ba add a5,a5,a4 + 300383e: 4b9c lw a5,16(a5) + 3003840: e399 bnez a5,3003846 + return BASE_STATUS_ERROR; + 3003842: 4785 li a5,1 + 3003844: a025 j 300386c + } + g_ipClkProc[p->type].clkDivSet(p, div); /* Configure the clock frequency divider of the module. */ + 3003846: fec42783 lw a5,-20(s0) + 300384a: 43d4 lw a3,4(a5) + 300384c: 040007b7 lui a5,0x4000 + 3003850: 02478713 addi a4,a5,36 # 4000024 + 3003854: 02400793 li a5,36 + 3003858: 02f687b3 mul a5,a3,a5 + 300385c: 97ba add a5,a5,a4 + 300385e: 4b9c lw a5,16(a5) + 3003860: fd842583 lw a1,-40(s0) + 3003864: fec42503 lw a0,-20(s0) + 3003868: 9782 jalr a5 + return BASE_STATUS_OK; + 300386a: 4781 li a5,0 +} + 300386c: 853e mv a0,a5 + 300386e: 50b2 lw ra,44(sp) + 3003870: 5422 lw s0,40(sp) + 3003872: 6145 addi sp,sp,48 + 3003874: 8082 ret + +03003876 : + 3003876: 933fd06f j 30011a8 + +0300387a : + * @param coreClkFreq core clock rate + * @retval Ip Frequence + */ +static unsigned int CRG_GetAdcIpFreq(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int baseClkRate, + unsigned int coreClkFreq) +{ + 300387a: 7139 addi sp,sp,-64 + 300387c: de06 sw ra,60(sp) + 300387e: dc22 sw s0,56(sp) + 3003880: 0080 addi s0,sp,64 + 3003882: fca42623 sw a0,-52(s0) + 3003886: fcb42423 sw a1,-56(s0) + 300388a: fcc42223 sw a2,-60(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300388e: fcc42783 lw a5,-52(s0) + 3003892: eb89 bnez a5,30038a4 + 3003894: 2af00593 li a1,687 + 3003898: 030077b7 lui a5,0x3007 + 300389c: 8a478513 addi a0,a5,-1884 # 30068a4 + 30038a0: 29fd jal ra,3003d9e + 30038a2: a001 j 30038a2 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30038a4: 040007b7 lui a5,0x4000 + 30038a8: 4947a783 lw a5,1172(a5) # 4000494 + 30038ac: eb89 bnez a5,30038be + 30038ae: 2b000593 li a1,688 + 30038b2: 030077b7 lui a5,0x3007 + 30038b6: 8a478513 addi a0,a5,-1884 # 30068a4 + 30038ba: 21d5 jal ra,3003d9e + 30038bc: a001 j 30038bc + + unsigned int clkSel; + unsigned int clkDiv; + unsigned int pst2Div; + unsigned int freq = 0; + 30038be: fe042623 sw zero,-20(s0) + + /* Obtains the clock source selection of the ADC. */ + const CRG_IpProc *proc = &g_ipClkProc[matchInfo->type]; + 30038c2: fcc42783 lw a5,-52(s0) + 30038c6: 43d8 lw a4,4(a5) + 30038c8: 02400793 li a5,36 + 30038cc: 02f70733 mul a4,a4,a5 + 30038d0: 040007b7 lui a5,0x4000 + 30038d4: 02478793 addi a5,a5,36 # 4000024 + 30038d8: 97ba add a5,a5,a4 + 30038da: fef42423 sw a5,-24(s0) + if (proc->clkSelGet == NULL) { + 30038de: fe842783 lw a5,-24(s0) + 30038e2: 4fdc lw a5,28(a5) + 30038e4: e399 bnez a5,30038ea + return 0; + 30038e6: 4781 li a5,0 + 30038e8: a07d j 3003996 + } + clkSel = proc->clkSelGet(matchInfo); + 30038ea: fe842783 lw a5,-24(s0) + 30038ee: 4fdc lw a5,28(a5) + 30038f0: fcc42503 lw a0,-52(s0) + 30038f4: 9782 jalr a5 + 30038f6: fea42223 sw a0,-28(s0) + /* Calculate the frequency from the ADC's clock source. */ + if (clkSel == CRG_ADC_CLK_SYN_CORE) { + 30038fa: fe442703 lw a4,-28(s0) + 30038fe: 478d li a5,3 + 3003900: 00f71763 bne a4,a5,300390e + freq = coreClkFreq; + 3003904: fc442783 lw a5,-60(s0) + 3003908: fef42623 sw a5,-20(s0) + 300390c: a085 j 300396c + } else if (clkSel == CRG_ADC_CLK_ASYN_HOSC) { + 300390e: fe442783 lw a5,-28(s0) + 3003912: eb81 bnez a5,3003922 + freq = HOSC_FREQ; + 3003914: 017d87b7 lui a5,0x17d8 + 3003918: 84078793 addi a5,a5,-1984 # 17d7840 + 300391c: fef42623 sw a5,-20(s0) + 3003920: a0b1 j 300396c + } else if (clkSel == CRG_ADC_CLK_ASYN_TCXO) { + 3003922: fe442703 lw a4,-28(s0) + 3003926: 4785 li a5,1 + 3003928: 00f71963 bne a4,a5,300393a + /* The maximum speed of the external clock source is 30000000U. */ + freq = (XTRAIL_FREQ > 30000000U) ? 0 : XTRAIL_FREQ; + 300392c: 01c9c7b7 lui a5,0x1c9c + 3003930: 38078793 addi a5,a5,896 # 1c9c380 + 3003934: fef42623 sw a5,-20(s0) + 3003938: a815 j 300396c + } else if (clkSel == CRG_ADC_CLK_ASYN_PLL_DIV) { + 300393a: fe442703 lw a4,-28(s0) + 300393e: 4789 li a5,2 + 3003940: 02f71663 bne a4,a5,300396c + pst2Div = CRG_GetPllPostDivValue((CRG_PllPostDiv)g_crgBaseAddr->PERI_CRG3.BIT.pll_postdiv2); + 3003944: 040007b7 lui a5,0x4000 + 3003948: 4947a783 lw a5,1172(a5) # 4000494 + 300394c: 47dc lw a5,12(a5) + 300394e: 8391 srli a5,a5,0x4 + 3003950: 8bbd andi a5,a5,15 + 3003952: 9f81 uxtb a5 + 3003954: 853e mv a0,a5 + 3003956: 2ae5 jal ra,3003b4e + 3003958: fea42023 sw a0,-32(s0) + freq = baseClkRate / pst2Div; + 300395c: fc842703 lw a4,-56(s0) + 3003960: fe042783 lw a5,-32(s0) + 3003964: 02f757b3 divu a5,a4,a5 + 3003968: fef42623 sw a5,-20(s0) + } + + /* Obtain the frequency divider based on the ADC clock source. */ + if (proc->clkDivGet == NULL) { + 300396c: fe842783 lw a5,-24(s0) + 3003970: 539c lw a5,32(a5) + 3003972: e399 bnez a5,3003978 + return 0; + 3003974: 4781 li a5,0 + 3003976: a005 j 3003996 + } + clkDiv = proc->clkDivGet(matchInfo); + 3003978: fe842783 lw a5,-24(s0) + 300397c: 539c lw a5,32(a5) + 300397e: fcc42503 lw a0,-52(s0) + 3003982: 9782 jalr a5 + 3003984: fca42e23 sw a0,-36(s0) + /* Calculate the clock frequency of the ADC. */ + return (freq / (clkDiv + 1)); + 3003988: fdc42783 lw a5,-36(s0) + 300398c: 0785 addi a5,a5,1 + 300398e: fec42703 lw a4,-20(s0) + 3003992: 02f757b3 divu a5,a4,a5 +} + 3003996: 853e mv a0,a5 + 3003998: 50f2 lw ra,60(sp) + 300399a: 5462 lw s0,56(sp) + 300399c: 6121 addi sp,sp,64 + 300399e: 8082 ret + +030039a0 : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValidPllConfig(const CRG_Handle *handle) +{ + 30039a0: 7179 addi sp,sp,-48 + 30039a2: d606 sw ra,44(sp) + 30039a4: d422 sw s0,40(sp) + 30039a6: 1800 addi s0,sp,48 + 30039a8: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + unsigned int freq; + + freq = CRG_GetPllRefIni(handle->pllRefClkSelect); + 30039ac: fdc42783 lw a5,-36(s0) + 30039b0: 43dc lw a5,4(a5) + 30039b2: 853e mv a0,a5 + 30039b4: 2201 jal ra,3003ab4 + 30039b6: fea42623 sw a0,-20(s0) + preDiv = CRG_GetPreDivValue(handle->pllPreDiv); + 30039ba: fdc42783 lw a5,-36(s0) + 30039be: 479c lw a5,8(a5) + 30039c0: 853e mv a0,a5 + 30039c2: 2a31 jal ra,3003ade + 30039c4: fea42423 sw a0,-24(s0) + /* Check the validity of the prescaled clock frequency. */ + if (!IsCrgValidPreDiv(freq, preDiv)) { + 30039c8: fe842583 lw a1,-24(s0) + 30039cc: fec42503 lw a0,-20(s0) + 30039d0: c26ff0ef jal ra,3002df6 + 30039d4: 87aa mv a5,a0 + 30039d6: 0017c793 xori a5,a5,1 + 30039da: 9f81 uxtb a5 + 30039dc: c399 beqz a5,30039e2 + return BASE_STATUS_ERROR; + 30039de: 4785 li a5,1 + 30039e0: a8a5 j 3003a58 + } + freq /= preDiv; + 30039e2: fec42703 lw a4,-20(s0) + 30039e6: fe842783 lw a5,-24(s0) + 30039ea: 02f757b3 divu a5,a4,a5 + 30039ee: fef42623 sw a5,-20(s0) + /* Check the validity of the clock frequency after frequency multiplication. */ + if (!IsCrgValidFdDiv(freq, handle->pllFbDiv)) { + 30039f2: fdc42783 lw a5,-36(s0) + 30039f6: 47dc lw a5,12(a5) + 30039f8: 85be mv a1,a5 + 30039fa: fec42503 lw a0,-20(s0) + 30039fe: c56ff0ef jal ra,3002e54 + 3003a02: 87aa mv a5,a0 + 3003a04: 0017c793 xori a5,a5,1 + 3003a08: 9f81 uxtb a5 + 3003a0a: c399 beqz a5,3003a10 + return BASE_STATUS_ERROR; + 3003a0c: 4785 li a5,1 + 3003a0e: a0a9 j 3003a58 + } + freq *= (handle->pllFbDiv > 0x06) ? handle->pllFbDiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 3003a10: fdc42783 lw a5,-36(s0) + 3003a14: 47dc lw a5,12(a5) + 3003a16: 4719 li a4,6 + 3003a18: 00e7f363 bgeu a5,a4,3003a1e + 3003a1c: 4799 li a5,6 + 3003a1e: fec42703 lw a4,-20(s0) + 3003a22: 02f707b3 mul a5,a4,a5 + 3003a26: fef42623 sw a5,-20(s0) + /* Check whether the PLL output frequency is valid. */ + if (IsCrgValidPostDiv(freq, handle->pllPostDiv) && IsCrgValidPostDiv2(freq, handle->handleEx.pllPostDiv2)) { + 3003a2a: fdc42783 lw a5,-36(s0) + 3003a2e: 4b9c lw a5,16(a5) + 3003a30: 85be mv a1,a5 + 3003a32: fec42503 lw a0,-20(s0) + 3003a36: ca8ff0ef jal ra,3002ede + 3003a3a: 87aa mv a5,a0 + 3003a3c: cf89 beqz a5,3003a56 + 3003a3e: fdc42783 lw a5,-36(s0) + 3003a42: 4fdc lw a5,28(a5) + 3003a44: 85be mv a1,a5 + 3003a46: fec42503 lw a0,-20(s0) + 3003a4a: cdcff0ef jal ra,3002f26 + 3003a4e: 87aa mv a5,a0 + 3003a50: c399 beqz a5,3003a56 + return BASE_STATUS_OK; + 3003a52: 4781 li a5,0 + 3003a54: a011 j 3003a58 + } + return BASE_STATUS_ERROR; + 3003a56: 4785 li a5,1 +} + 3003a58: 853e mv a0,a5 + 3003a5a: 50b2 lw ra,44(sp) + 3003a5c: 5422 lw s0,40(sp) + 3003a5e: 6145 addi sp,sp,48 + 3003a60: 8082 ret + +03003a62 : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValid1MHzConfig(const CRG_Handle *handle) +{ + 3003a62: 7179 addi sp,sp,-48 + 3003a64: d622 sw s0,44(sp) + 3003a66: 1800 addi s0,sp,48 + 3003a68: fca42e23 sw a0,-36(s0) + unsigned int freq; + /* Get the ref frequency of the 1 MHz clock. */ + freq = (handle->handleEx.clk1MSelect == CRG_1M_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003a6c: fdc42783 lw a5,-36(s0) + 3003a70: 539c lw a5,32(a5) + 3003a72: e791 bnez a5,3003a7e + 3003a74: 017d87b7 lui a5,0x17d8 + 3003a78: 84078793 addi a5,a5,-1984 # 17d7840 + 3003a7c: a029 j 3003a86 + 3003a7e: 01c9c7b7 lui a5,0x1c9c + 3003a82: 38078793 addi a5,a5,896 # 1c9c380 + 3003a86: fef42623 sw a5,-20(s0) + /* Check whether the 1MHz output frequency is valid. */ + if ((freq / (handle->handleEx.clk1MDiv + 1)) == CRG_FREQ_1MHz) { + 3003a8a: fdc42783 lw a5,-36(s0) + 3003a8e: 53dc lw a5,36(a5) + 3003a90: 0785 addi a5,a5,1 + 3003a92: fec42703 lw a4,-20(s0) + 3003a96: 02f75733 divu a4,a4,a5 + 3003a9a: 000f47b7 lui a5,0xf4 + 3003a9e: 24078793 addi a5,a5,576 # f4240 + 3003aa2: 00f71463 bne a4,a5,3003aaa + return BASE_STATUS_OK; + 3003aa6: 4781 li a5,0 + 3003aa8: a011 j 3003aac + } + return BASE_STATUS_ERROR; + 3003aaa: 4785 li a5,1 +} + 3003aac: 853e mv a0,a5 + 3003aae: 5432 lw s0,44(sp) + 3003ab0: 6145 addi sp,sp,48 + 3003ab2: 8082 ret + +03003ab4 : + * @brief Get clock frequence + * @param crg CRG_RegStruct + * @retval The frequence fo clock + */ +static inline unsigned int CRG_GetPllRefIni(CRG_PllRefClkSelect pllRefClkSelect) +{ + 3003ab4: 1101 addi sp,sp,-32 + 3003ab6: ce22 sw s0,28(sp) + 3003ab8: 1000 addi s0,sp,32 + 3003aba: fea42623 sw a0,-20(s0) + /* The maximum speed of the external clock source is 30000000U. */ + if (pllRefClkSelect == CRG_PLL_REF_CLK_SELECT_XTAL && XTRAIL_FREQ > 30000000U) { + return 0; + } + return (pllRefClkSelect == (unsigned int)CRG_PLL_REF_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003abe: fec42783 lw a5,-20(s0) + 3003ac2: e791 bnez a5,3003ace + 3003ac4: 017d87b7 lui a5,0x17d8 + 3003ac8: 84078793 addi a5,a5,-1984 # 17d7840 + 3003acc: a029 j 3003ad6 + 3003ace: 01c9c7b7 lui a5,0x1c9c + 3003ad2: 38078793 addi a5,a5,896 # 1c9c380 +} + 3003ad6: 853e mv a0,a5 + 3003ad8: 4472 lw s0,28(sp) + 3003ada: 6105 addi sp,sp,32 + 3003adc: 8082 ret + +03003ade : + * @brief Get previous division Value before PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPreDivValue(CRG_PllPreDiv pllPredDiv) +{ + 3003ade: 7179 addi sp,sp,-48 + 3003ae0: d622 sw s0,44(sp) + 3003ae2: 1800 addi s0,sp,48 + 3003ae4: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + if (pllPredDiv <= CRG_PLL_PREDIV_1) { /* 0 or 1 returns PLL_PREDIV_OUT_1. */ + 3003ae8: fdc42783 lw a5,-36(s0) + 3003aec: e789 bnez a5,3003af6 + preDiv = PLL_PREDIV_OUT_1; + 3003aee: 4785 li a5,1 + 3003af0: fef42623 sw a5,-20(s0) + 3003af4: a031 j 3003b00 + } else { + preDiv = pllPredDiv + 1; + 3003af6: fdc42783 lw a5,-36(s0) + 3003afa: 0785 addi a5,a5,1 + 3003afc: fef42623 sw a5,-20(s0) + } + return preDiv; + 3003b00: fec42783 lw a5,-20(s0) +} + 3003b04: 853e mv a0,a5 + 3003b06: 5432 lw s0,44(sp) + 3003b08: 6145 addi sp,sp,48 + 3003b0a: 8082 ret + +03003b0c : + * @brief Get PLL loop divider ratio + * @param crg CRG_RegStruct + * @retval PLL loop divider ratio + */ +static inline unsigned int CRG_GetPllFbDivValue(unsigned int pllFbDiv) +{ + 3003b0c: 7179 addi sp,sp,-48 + 3003b0e: d622 sw s0,44(sp) + 3003b10: 1800 addi s0,sp,48 + 3003b12: fca42e23 sw a0,-36(s0) + unsigned int div = pllFbDiv; + 3003b16: fdc42783 lw a5,-36(s0) + 3003b1a: fef42623 sw a5,-20(s0) + /* Check the validity of the minimum frequency multiplication parameter. */ + if (div < CRG_PLL_FBDIV_MIN) { + 3003b1e: fec42703 lw a4,-20(s0) + 3003b22: 4795 li a5,5 + 3003b24: 00e7e563 bltu a5,a4,3003b2e + div = CRG_PLL_FBDIV_MIN; + 3003b28: 4799 li a5,6 + 3003b2a: fef42623 sw a5,-20(s0) + } + /* Check the validity of the maximum frequency multiplication parameter. */ + if (div > CRG_PLL_FBDIV_MAX) { + 3003b2e: fec42703 lw a4,-20(s0) + 3003b32: 07f00793 li a5,127 + 3003b36: 00e7f663 bgeu a5,a4,3003b42 + div = CRG_PLL_FBDIV_MAX; + 3003b3a: 07f00793 li a5,127 + 3003b3e: fef42623 sw a5,-20(s0) + } + return div; + 3003b42: fec42783 lw a5,-20(s0) +} + 3003b46: 853e mv a0,a5 + 3003b48: 5432 lw s0,44(sp) + 3003b4a: 6145 addi sp,sp,48 + 3003b4c: 8082 ret + +03003b4e : + * @brief Get post division Value after PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPllPostDivValue(unsigned int pllPostDiv) +{ + 3003b4e: 7179 addi sp,sp,-48 + 3003b50: d622 sw s0,44(sp) + 3003b52: 1800 addi s0,sp,48 + 3003b54: fca42e23 sw a0,-36(s0) + unsigned int div = pllPostDiv; + 3003b58: fdc42783 lw a5,-36(s0) + 3003b5c: fef42623 sw a5,-20(s0) + if (div > CRG_PLL_POSTDIV_8) { + 3003b60: fec42703 lw a4,-20(s0) + 3003b64: 479d li a5,7 + 3003b66: 00e7f663 bgeu a5,a4,3003b72 + div = (CRG_PLL_POSTDIV_8 + 1); /* If the postdiv is greater than 8, set this postdiv to 8. */ + 3003b6a: 47a1 li a5,8 + 3003b6c: fef42623 sw a5,-20(s0) + 3003b70: a031 j 3003b7c + } else { + div += 1; + 3003b72: fec42783 lw a5,-20(s0) + 3003b76: 0785 addi a5,a5,1 + 3003b78: fef42623 sw a5,-20(s0) + } + return div; + 3003b7c: fec42783 lw a5,-20(s0) +} + 3003b80: 853e mv a0,a5 + 3003b82: 5432 lw s0,44(sp) + 3003b84: 6145 addi sp,sp,48 + 3003b86: 8082 ret + +03003b88 : + * @param matchInfo IP without Clock select match info + * @param enable BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003b88: 7179 addi sp,sp,-48 + 3003b8a: d606 sw ra,44(sp) + 3003b8c: d422 sw s0,40(sp) + 3003b8e: 1800 addi s0,sp,48 + 3003b90: fca42e23 sw a0,-36(s0) + 3003b94: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003b98: fdc42783 lw a5,-36(s0) + 3003b9c: eb89 bnez a5,3003bae + 3003b9e: 34d00593 li a1,845 + 3003ba2: 030077b7 lui a5,0x3007 + 3003ba6: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003baa: 2ad5 jal ra,3003d9e + 3003bac: a001 j 3003bac + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003bae: 040007b7 lui a5,0x4000 + 3003bb2: 4947a783 lw a5,1172(a5) # 4000494 + 3003bb6: eb89 bnez a5,3003bc8 + 3003bb8: 34e00593 li a1,846 + 3003bbc: 030077b7 lui a5,0x3007 + 3003bc0: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003bc4: 2ae9 jal ra,3003d9e + 3003bc6: a001 j 3003bc6 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003bc8: 040007b7 lui a5,0x4000 + 3003bcc: 4947a783 lw a5,1172(a5) # 4000494 + 3003bd0: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003bd4: fdc42783 lw a5,-36(s0) + 3003bd8: 279e lhu a5,8(a5) + 3003bda: 873e mv a4,a5 + 3003bdc: fec42783 lw a5,-20(s0) + 3003be0: 97ba add a5,a5,a4 + 3003be2: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003be6: fe842783 lw a5,-24(s0) + 3003bea: 439c lw a5,0(a5) + 3003bec: fef42223 sw a5,-28(s0) + if (enable & IP_CLK_ENABLE) { /* Set enable of target ip. */ + 3003bf0: fd842783 lw a5,-40(s0) + 3003bf4: 8b85 andi a5,a5,1 + 3003bf6: c7c1 beqz a5,3003c7e + cfg.BIT.clkEnMask |= 1 << matchInfo->bitOffset; + 3003bf8: fe442783 lw a5,-28(s0) + 3003bfc: 9fa1 uxth a5 + 3003bfe: 01079713 slli a4,a5,0x10 + 3003c02: 8741 srai a4,a4,0x10 + 3003c04: fdc42783 lw a5,-36(s0) + 3003c08: 27bc lbu a5,10(a5) + 3003c0a: 86be mv a3,a5 + 3003c0c: 4785 li a5,1 + 3003c0e: 00d797b3 sll a5,a5,a3 + 3003c12: 07c2 slli a5,a5,0x10 + 3003c14: 87c1 srai a5,a5,0x10 + 3003c16: 8fd9 or a5,a5,a4 + 3003c18: 07c2 slli a5,a5,0x10 + 3003c1a: 87c1 srai a5,a5,0x10 + 3003c1c: 01079693 slli a3,a5,0x10 + 3003c20: 82c1 srli a3,a3,0x10 + 3003c22: fe442783 lw a5,-28(s0) + 3003c26: 6741 lui a4,0x10 + 3003c28: 177d addi a4,a4,-1 # ffff + 3003c2a: 8f75 and a4,a4,a3 + 3003c2c: 76c1 lui a3,0xffff0 + 3003c2e: 8ff5 and a5,a5,a3 + 3003c30: 8fd9 or a5,a5,a4 + 3003c32: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); + 3003c36: fe442783 lw a5,-28(s0) + 3003c3a: 83c1 srli a5,a5,0x10 + 3003c3c: 9fa1 uxth a5 + 3003c3e: 01079713 slli a4,a5,0x10 + 3003c42: 8741 srai a4,a4,0x10 + 3003c44: fdc42783 lw a5,-36(s0) + 3003c48: 27bc lbu a5,10(a5) + 3003c4a: 86be mv a3,a5 + 3003c4c: 4785 li a5,1 + 3003c4e: 00d797b3 sll a5,a5,a3 + 3003c52: 07c2 slli a5,a5,0x10 + 3003c54: 87c1 srai a5,a5,0x10 + 3003c56: fff7c793 not a5,a5 + 3003c5a: 07c2 slli a5,a5,0x10 + 3003c5c: 87c1 srai a5,a5,0x10 + 3003c5e: 8ff9 and a5,a5,a4 + 3003c60: 07c2 slli a5,a5,0x10 + 3003c62: 87c1 srai a5,a5,0x10 + 3003c64: 01079713 slli a4,a5,0x10 + 3003c68: 8341 srli a4,a4,0x10 + 3003c6a: fe442783 lw a5,-28(s0) + 3003c6e: 0742 slli a4,a4,0x10 + 3003c70: 66c1 lui a3,0x10 + 3003c72: 16fd addi a3,a3,-1 # ffff + 3003c74: 8ff5 and a5,a5,a3 + 3003c76: 8fd9 or a5,a5,a4 + 3003c78: fef42223 sw a5,-28(s0) + 3003c7c: a059 j 3003d02 + } else { + cfg.BIT.clkEnMask &= ~(1 << matchInfo->bitOffset); /* Disable of target ip. */ + 3003c7e: fe442783 lw a5,-28(s0) + 3003c82: 9fa1 uxth a5 + 3003c84: 01079713 slli a4,a5,0x10 + 3003c88: 8741 srai a4,a4,0x10 + 3003c8a: fdc42783 lw a5,-36(s0) + 3003c8e: 27bc lbu a5,10(a5) + 3003c90: 86be mv a3,a5 + 3003c92: 4785 li a5,1 + 3003c94: 00d797b3 sll a5,a5,a3 + 3003c98: 07c2 slli a5,a5,0x10 + 3003c9a: 87c1 srai a5,a5,0x10 + 3003c9c: fff7c793 not a5,a5 + 3003ca0: 07c2 slli a5,a5,0x10 + 3003ca2: 87c1 srai a5,a5,0x10 + 3003ca4: 8ff9 and a5,a5,a4 + 3003ca6: 07c2 slli a5,a5,0x10 + 3003ca8: 87c1 srai a5,a5,0x10 + 3003caa: 01079693 slli a3,a5,0x10 + 3003cae: 82c1 srli a3,a3,0x10 + 3003cb0: fe442783 lw a5,-28(s0) + 3003cb4: 6741 lui a4,0x10 + 3003cb6: 177d addi a4,a4,-1 # ffff + 3003cb8: 8f75 and a4,a4,a3 + 3003cba: 76c1 lui a3,0xffff0 + 3003cbc: 8ff5 and a5,a5,a3 + 3003cbe: 8fd9 or a5,a5,a4 + 3003cc0: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq |= (1 << matchInfo->bitOffset); + 3003cc4: fe442783 lw a5,-28(s0) + 3003cc8: 83c1 srli a5,a5,0x10 + 3003cca: 9fa1 uxth a5 + 3003ccc: 01079713 slli a4,a5,0x10 + 3003cd0: 8741 srai a4,a4,0x10 + 3003cd2: fdc42783 lw a5,-36(s0) + 3003cd6: 27bc lbu a5,10(a5) + 3003cd8: 86be mv a3,a5 + 3003cda: 4785 li a5,1 + 3003cdc: 00d797b3 sll a5,a5,a3 + 3003ce0: 07c2 slli a5,a5,0x10 + 3003ce2: 87c1 srai a5,a5,0x10 + 3003ce4: 8fd9 or a5,a5,a4 + 3003ce6: 07c2 slli a5,a5,0x10 + 3003ce8: 87c1 srai a5,a5,0x10 + 3003cea: 01079713 slli a4,a5,0x10 + 3003cee: 8341 srli a4,a4,0x10 + 3003cf0: fe442783 lw a5,-28(s0) + 3003cf4: 0742 slli a4,a4,0x10 + 3003cf6: 66c1 lui a3,0x10 + 3003cf8: 16fd addi a3,a3,-1 # ffff + 3003cfa: 8ff5 and a5,a5,a3 + 3003cfc: 8fd9 or a5,a5,a4 + 3003cfe: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3003d02: fe442703 lw a4,-28(s0) + 3003d06: fe842783 lw a5,-24(s0) + 3003d0a: c398 sw a4,0(a5) +} + 3003d0c: 0001 nop + 3003d0e: 50b2 lw ra,44(sp) + 3003d10: 5422 lw s0,40(sp) + 3003d12: 6145 addi sp,sp,48 + 3003d14: 8082 ret + +03003d16 : + * @brief Get Enable status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock Enable status + */ +static unsigned int CRG_IpWoClkSelEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003d16: 7179 addi sp,sp,-48 + 3003d18: d606 sw ra,44(sp) + 3003d1a: d422 sw s0,40(sp) + 3003d1c: 1800 addi s0,sp,48 + 3003d1e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003d22: fdc42783 lw a5,-36(s0) + 3003d26: eb89 bnez a5,3003d38 + 3003d28: 36500593 li a1,869 + 3003d2c: 030077b7 lui a5,0x3007 + 3003d30: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003d34: 20ad jal ra,3003d9e + 3003d36: a001 j 3003d36 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003d38: 040007b7 lui a5,0x4000 + 3003d3c: 4947a783 lw a5,1172(a5) # 4000494 + 3003d40: eb89 bnez a5,3003d52 + 3003d42: 36600593 li a1,870 + 3003d46: 030077b7 lui a5,0x3007 + 3003d4a: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003d4e: 2881 jal ra,3003d9e + 3003d50: a001 j 3003d50 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003d52: 040007b7 lui a5,0x4000 + 3003d56: 4947a783 lw a5,1172(a5) # 4000494 + 3003d5a: fef42623 sw a5,-20(s0) + /* Get enable status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003d5e: fdc42783 lw a5,-36(s0) + 3003d62: 279e lhu a5,8(a5) + 3003d64: 873e mv a4,a5 + 3003d66: fec42783 lw a5,-20(s0) + 3003d6a: 97ba add a5,a5,a4 + 3003d6c: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + + cfg.value = p->value; + 3003d70: fe842783 lw a5,-24(s0) + 3003d74: 439c lw a5,0(a5) + 3003d76: fef42223 sw a5,-28(s0) + return (cfg.BIT.clkEnMask & (1 << matchInfo->bitOffset)) == 0 ? false : true; + 3003d7a: fe442783 lw a5,-28(s0) + 3003d7e: 9fa1 uxth a5 + 3003d80: 873e mv a4,a5 + 3003d82: fdc42783 lw a5,-36(s0) + 3003d86: 27bc lbu a5,10(a5) + 3003d88: 40f757b3 sra a5,a4,a5 + 3003d8c: 8b85 andi a5,a5,1 + 3003d8e: 00f037b3 snez a5,a5 + 3003d92: 9f81 uxtb a5 +} + 3003d94: 853e mv a0,a5 + 3003d96: 50b2 lw ra,44(sp) + 3003d98: 5422 lw s0,40(sp) + 3003d9a: 6145 addi sp,sp,48 + 3003d9c: 8082 ret + +03003d9e : + 3003d9e: c48fe06f j 30021e6 + +03003da2 : + * @param matchInfo IP without Clock select match info + * @param reset BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelResetSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int reset) +{ + 3003da2: 7179 addi sp,sp,-48 + 3003da4: d606 sw ra,44(sp) + 3003da6: d422 sw s0,40(sp) + 3003da8: 1800 addi s0,sp,48 + 3003daa: fca42e23 sw a0,-36(s0) + 3003dae: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003db2: fdc42783 lw a5,-36(s0) + 3003db6: eb89 bnez a5,3003dc8 + 3003db8: 37900593 li a1,889 + 3003dbc: 030077b7 lui a5,0x3007 + 3003dc0: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003dc4: 3fe9 jal ra,3003d9e + 3003dc6: a001 j 3003dc6 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003dc8: 040007b7 lui a5,0x4000 + 3003dcc: 4947a783 lw a5,1172(a5) # 4000494 + 3003dd0: eb89 bnez a5,3003de2 + 3003dd2: 37a00593 li a1,890 + 3003dd6: 030077b7 lui a5,0x3007 + 3003dda: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003dde: 37c1 jal ra,3003d9e + 3003de0: a001 j 3003de0 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003de2: 040007b7 lui a5,0x4000 + 3003de6: 4947a783 lw a5,1172(a5) # 4000494 + 3003dea: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003dee: fdc42783 lw a5,-36(s0) + 3003df2: 279e lhu a5,8(a5) + 3003df4: 873e mv a4,a5 + 3003df6: fec42783 lw a5,-20(s0) + 3003dfa: 97ba add a5,a5,a4 + 3003dfc: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003e00: fe842783 lw a5,-24(s0) + 3003e04: 439c lw a5,0(a5) + 3003e06: fef42223 sw a5,-28(s0) + if (reset & BASE_CFG_SET) { + 3003e0a: fd842783 lw a5,-40(s0) + 3003e0e: 8b85 andi a5,a5,1 + 3003e10: c3a9 beqz a5,3003e52 + cfg.BIT.softResetReq |= 1 << matchInfo->bitOffset; /* reset of target ip. */ + 3003e12: fe442783 lw a5,-28(s0) + 3003e16: 83c1 srli a5,a5,0x10 + 3003e18: 9fa1 uxth a5 + 3003e1a: 01079713 slli a4,a5,0x10 + 3003e1e: 8741 srai a4,a4,0x10 + 3003e20: fdc42783 lw a5,-36(s0) + 3003e24: 27bc lbu a5,10(a5) + 3003e26: 86be mv a3,a5 + 3003e28: 4785 li a5,1 + 3003e2a: 00d797b3 sll a5,a5,a3 + 3003e2e: 07c2 slli a5,a5,0x10 + 3003e30: 87c1 srai a5,a5,0x10 + 3003e32: 8fd9 or a5,a5,a4 + 3003e34: 07c2 slli a5,a5,0x10 + 3003e36: 87c1 srai a5,a5,0x10 + 3003e38: 01079713 slli a4,a5,0x10 + 3003e3c: 8341 srli a4,a4,0x10 + 3003e3e: fe442783 lw a5,-28(s0) + 3003e42: 0742 slli a4,a4,0x10 + 3003e44: 66c1 lui a3,0x10 + 3003e46: 16fd addi a3,a3,-1 # ffff + 3003e48: 8ff5 and a5,a5,a3 + 3003e4a: 8fd9 or a5,a5,a4 + 3003e4c: fef42223 sw a5,-28(s0) + 3003e50: a0a1 j 3003e98 + } else { + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); /* Undo reset of target ip. */ + 3003e52: fe442783 lw a5,-28(s0) + 3003e56: 83c1 srli a5,a5,0x10 + 3003e58: 9fa1 uxth a5 + 3003e5a: 01079713 slli a4,a5,0x10 + 3003e5e: 8741 srai a4,a4,0x10 + 3003e60: fdc42783 lw a5,-36(s0) + 3003e64: 27bc lbu a5,10(a5) + 3003e66: 86be mv a3,a5 + 3003e68: 4785 li a5,1 + 3003e6a: 00d797b3 sll a5,a5,a3 + 3003e6e: 07c2 slli a5,a5,0x10 + 3003e70: 87c1 srai a5,a5,0x10 + 3003e72: fff7c793 not a5,a5 + 3003e76: 07c2 slli a5,a5,0x10 + 3003e78: 87c1 srai a5,a5,0x10 + 3003e7a: 8ff9 and a5,a5,a4 + 3003e7c: 07c2 slli a5,a5,0x10 + 3003e7e: 87c1 srai a5,a5,0x10 + 3003e80: 01079713 slli a4,a5,0x10 + 3003e84: 8341 srli a4,a4,0x10 + 3003e86: fe442783 lw a5,-28(s0) + 3003e8a: 0742 slli a4,a4,0x10 + 3003e8c: 66c1 lui a3,0x10 + 3003e8e: 16fd addi a3,a3,-1 # ffff + 3003e90: 8ff5 and a5,a5,a3 + 3003e92: 8fd9 or a5,a5,a4 + 3003e94: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3003e98: fe442703 lw a4,-28(s0) + 3003e9c: fe842783 lw a5,-24(s0) + 3003ea0: c398 sw a4,0(a5) +} + 3003ea2: 0001 nop + 3003ea4: 50b2 lw ra,44(sp) + 3003ea6: 5422 lw s0,40(sp) + 3003ea8: 6145 addi sp,sp,48 + 3003eaa: 8082 ret + +03003eac : + * @brief Get Reset status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock select reset status + */ +static unsigned int CRG_IpWoClkSelResetGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003eac: 7179 addi sp,sp,-48 + 3003eae: d606 sw ra,44(sp) + 3003eb0: d422 sw s0,40(sp) + 3003eb2: 1800 addi s0,sp,48 + 3003eb4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003eb8: fdc42783 lw a5,-36(s0) + 3003ebc: eb89 bnez a5,3003ece + 3003ebe: 38f00593 li a1,911 + 3003ec2: 030077b7 lui a5,0x3007 + 3003ec6: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003eca: 3dd1 jal ra,3003d9e + 3003ecc: a001 j 3003ecc + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003ece: 040007b7 lui a5,0x4000 + 3003ed2: 4947a783 lw a5,1172(a5) # 4000494 + 3003ed6: eb89 bnez a5,3003ee8 + 3003ed8: 39000593 li a1,912 + 3003edc: 030077b7 lui a5,0x3007 + 3003ee0: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003ee4: 3d6d jal ra,3003d9e + 3003ee6: a001 j 3003ee6 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003ee8: 040007b7 lui a5,0x4000 + 3003eec: 4947a783 lw a5,1172(a5) # 4000494 + 3003ef0: fef42623 sw a5,-20(s0) + /* Get the reset status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003ef4: fdc42783 lw a5,-36(s0) + 3003ef8: 279e lhu a5,8(a5) + 3003efa: 873e mv a4,a5 + 3003efc: fec42783 lw a5,-20(s0) + 3003f00: 97ba add a5,a5,a4 + 3003f02: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003f06: fe842783 lw a5,-24(s0) + 3003f0a: 439c lw a5,0(a5) + 3003f0c: fef42223 sw a5,-28(s0) + return (cfg.BIT.softResetReq & (1 << matchInfo->bitOffset)) ? BASE_CFG_SET : BASE_CFG_UNSET; + 3003f10: fe442783 lw a5,-28(s0) + 3003f14: 83c1 srli a5,a5,0x10 + 3003f16: 9fa1 uxth a5 + 3003f18: 873e mv a4,a5 + 3003f1a: fdc42783 lw a5,-36(s0) + 3003f1e: 27bc lbu a5,10(a5) + 3003f20: 40f757b3 sra a5,a4,a5 + 3003f24: 8b85 andi a5,a5,1 + 3003f26: 00f037b3 snez a5,a5 + 3003f2a: 9f81 uxtb a5 +} + 3003f2c: 853e mv a0,a5 + 3003f2e: 50b2 lw ra,44(sp) + 3003f30: 5422 lw s0,40(sp) + 3003f32: 6145 addi sp,sp,48 + 3003f34: 8082 ret + +03003f36 : + * @param matchInfo ADC match info + * @param enable IP_CLK_ENABLE + * @retval None + */ +static void CRG_AdcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003f36: 7179 addi sp,sp,-48 + 3003f38: d606 sw ra,44(sp) + 3003f3a: d422 sw s0,40(sp) + 3003f3c: 1800 addi s0,sp,48 + 3003f3e: fca42e23 sw a0,-36(s0) + 3003f42: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003f46: fdc42783 lw a5,-36(s0) + 3003f4a: eb89 bnez a5,3003f5c + 3003f4c: 3a200593 li a1,930 + 3003f50: 030077b7 lui a5,0x3007 + 3003f54: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003f58: 3599 jal ra,3003d9e + 3003f5a: a001 j 3003f5a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003f5c: 040007b7 lui a5,0x4000 + 3003f60: 4947a783 lw a5,1172(a5) # 4000494 + 3003f64: eb89 bnez a5,3003f76 + 3003f66: 3a300593 li a1,931 + 3003f6a: 030077b7 lui a5,0x3007 + 3003f6e: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003f72: 3535 jal ra,3003d9e + 3003f74: a001 j 3003f74 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003f76: 040007b7 lui a5,0x4000 + 3003f7a: 4947a783 lw a5,1172(a5) # 4000494 + 3003f7e: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003f82: fdc42783 lw a5,-36(s0) + 3003f86: 279e lhu a5,8(a5) + 3003f88: 873e mv a4,a5 + 3003f8a: fec42783 lw a5,-20(s0) + 3003f8e: 97ba add a5,a5,a4 + 3003f90: fef42423 sw a5,-24(s0) + CRG_AdcIpCfg cfg; + cfg.value[1] = p->value[1]; + 3003f94: fe842783 lw a5,-24(s0) + 3003f98: 43dc lw a5,4(a5) + 3003f9a: fef42223 sw a5,-28(s0) + if (enable) { /* Enables and Deassert reset the ADC clock. */ + 3003f9e: fd842783 lw a5,-40(s0) + 3003fa2: cf99 beqz a5,3003fc0 + cfg.BIT.clk_adc_cken = BASE_CFG_SET; + 3003fa4: fe442783 lw a5,-28(s0) + 3003fa8: 0017e793 ori a5,a5,1 + 3003fac: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003fb0: fe442783 lw a5,-28(s0) + 3003fb4: 7741 lui a4,0xffff0 + 3003fb6: 177d addi a4,a4,-1 # fffeffff + 3003fb8: 8ff9 and a5,a5,a4 + 3003fba: fef42223 sw a5,-28(s0) + 3003fbe: a829 j 3003fd8 + } else { /* Disable and reset the ADC clock. */ + cfg.BIT.clk_adc_cken = BASE_CFG_UNSET; + 3003fc0: fe442783 lw a5,-28(s0) + 3003fc4: 9bf9 andi a5,a5,-2 + 3003fc6: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003fca: fe442783 lw a5,-28(s0) + 3003fce: 7741 lui a4,0xffff0 + 3003fd0: 177d addi a4,a4,-1 # fffeffff + 3003fd2: 8ff9 and a5,a5,a4 + 3003fd4: fef42223 sw a5,-28(s0) + } + p->value[1] = cfg.value[1]; + 3003fd8: fe442703 lw a4,-28(s0) + 3003fdc: fe842783 lw a5,-24(s0) + 3003fe0: c3d8 sw a4,4(a5) +} + 3003fe2: 0001 nop + 3003fe4: 50b2 lw ra,44(sp) + 3003fe6: 5422 lw s0,40(sp) + 3003fe8: 6145 addi sp,sp,48 + 3003fea: 8082 ret + +03003fec : + * @brief Get Enable status of ADC + * @param matchInfo ADC match info + * @retval Cken of ADC + */ +static unsigned int CRG_AdcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003fec: 7179 addi sp,sp,-48 + 3003fee: d606 sw ra,44(sp) + 3003ff0: d422 sw s0,40(sp) + 3003ff2: 1800 addi s0,sp,48 + 3003ff4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003ff8: fdc42783 lw a5,-36(s0) + 3003ffc: eb89 bnez a5,300400e + 3003ffe: 3ba00593 li a1,954 + 3004002: 030077b7 lui a5,0x3007 + 3004006: 8a478513 addi a0,a5,-1884 # 30068a4 + 300400a: 3b51 jal ra,3003d9e + 300400c: a001 j 300400c + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300400e: 040007b7 lui a5,0x4000 + 3004012: 4947a783 lw a5,1172(a5) # 4000494 + 3004016: eb89 bnez a5,3004028 + 3004018: 3bb00593 li a1,955 + 300401c: 030077b7 lui a5,0x3007 + 3004020: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004024: 3bad jal ra,3003d9e + 3004026: a001 j 3004026 + unsigned int enable; + /* Get the enable status of the ADC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3004028: 040007b7 lui a5,0x4000 + 300402c: 4947a783 lw a5,1172(a5) # 4000494 + 3004030: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004034: fdc42783 lw a5,-36(s0) + 3004038: 279e lhu a5,8(a5) + 300403a: 873e mv a4,a5 + 300403c: fec42783 lw a5,-20(s0) + 3004040: 97ba add a5,a5,a4 + 3004042: fef42423 sw a5,-24(s0) + enable = ((p->BIT.clk_adc_cken != 0)) ? IP_CLK_ENABLE : IP_CLK_DISABLE; + 3004046: fe842783 lw a5,-24(s0) + 300404a: 43dc lw a5,4(a5) + 300404c: 8b85 andi a5,a5,1 + 300404e: 9f81 uxtb a5 + 3004050: c399 beqz a5,3004056 + 3004052: 4785 li a5,1 + 3004054: a011 j 3004058 + 3004056: 4781 li a5,0 + 3004058: fef42223 sw a5,-28(s0) + return enable; + 300405c: fe442783 lw a5,-28(s0) +} + 3004060: 853e mv a0,a5 + 3004062: 50b2 lw ra,44(sp) + 3004064: 5422 lw s0,40(sp) + 3004066: 6145 addi sp,sp,48 + 3004068: 8082 ret + +0300406a : + * @param matchInfo ADC match info + * @param clkSelect @see CRG_AdcClkSelect + * @retval None + */ +static void CRG_AdcClkSelectSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int clkSelect) +{ + 300406a: 7179 addi sp,sp,-48 + 300406c: d606 sw ra,44(sp) + 300406e: d422 sw s0,40(sp) + 3004070: 1800 addi s0,sp,48 + 3004072: fca42e23 sw a0,-36(s0) + 3004076: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300407a: fdc42783 lw a5,-36(s0) + 300407e: eb89 bnez a5,3004090 + 3004080: 3cc00593 li a1,972 + 3004084: 030077b7 lui a5,0x3007 + 3004088: 8a478513 addi a0,a5,-1884 # 30068a4 + 300408c: 3b09 jal ra,3003d9e + 300408e: a001 j 300408e + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004090: 040007b7 lui a5,0x4000 + 3004094: 4947a783 lw a5,1172(a5) # 4000494 + 3004098: eb89 bnez a5,30040aa + 300409a: 3cd00593 li a1,973 + 300409e: 030077b7 lui a5,0x3007 + 30040a2: 8a478513 addi a0,a5,-1884 # 30068a4 + 30040a6: 39e5 jal ra,3003d9e + 30040a8: a001 j 30040a8 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30040aa: 040007b7 lui a5,0x4000 + 30040ae: 4947a703 lw a4,1172(a5) # 4000494 + 30040b2: 100007b7 lui a5,0x10000 + 30040b6: 00f70a63 beq a4,a5,30040ca + 30040ba: 3ce00593 li a1,974 + 30040be: 030077b7 lui a5,0x3007 + 30040c2: 8a478513 addi a0,a5,-1884 # 30068a4 + 30040c6: 39e1 jal ra,3003d9e + 30040c8: a001 j 30040c8 + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkModeSelect(clkSelect)); + 30040ca: fd842503 lw a0,-40(s0) + 30040ce: ea1fe0ef jal ra,3002f6e + 30040d2: 87aa mv a5,a0 + 30040d4: 0017c793 xori a5,a5,1 + 30040d8: 9f81 uxtb a5 + 30040da: cb89 beqz a5,30040ec + 30040dc: 3cf00593 li a1,975 + 30040e0: 030077b7 lui a5,0x3007 + 30040e4: 8a478513 addi a0,a5,-1884 # 30068a4 + 30040e8: 395d jal ra,3003d9e + 30040ea: a89d j 3004160 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30040ec: 040007b7 lui a5,0x4000 + 30040f0: 4947a783 lw a5,1172(a5) # 4000494 + 30040f4: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 30040f8: fdc42783 lw a5,-36(s0) + 30040fc: 279e lhu a5,8(a5) + 30040fe: 873e mv a4,a5 + 3004100: fec42783 lw a5,-20(s0) + 3004104: 97ba add a5,a5,a4 + 3004106: fef42423 sw a5,-24(s0) + if (clkSelect == CRG_ADC_CLK_SYN_CORE) { + 300410a: fd842703 lw a4,-40(s0) + 300410e: 478d li a5,3 + 3004110: 00f71a63 bne a4,a5,3004124 + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_SET; /* use sync clock */ + 3004114: fe842703 lw a4,-24(s0) + 3004118: 435c lw a5,4(a4) + 300411a: 010006b7 lui a3,0x1000 + 300411e: 8fd5 or a5,a5,a3 + 3004120: c35c sw a5,4(a4) + 3004122: a83d j 3004160 + } else { + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3004124: b67fe0ef jal ra,3002c8a + g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel = clkSelect; /* write clock selection */ + 3004128: 040007b7 lui a5,0x4000 + 300412c: 4947a703 lw a4,1172(a5) # 4000494 + 3004130: fd842783 lw a5,-40(s0) + 3004134: 8b8d andi a5,a5,3 + 3004136: 0ff7f693 andi a3,a5,255 + 300413a: 10072783 lw a5,256(a4) + 300413e: 8a8d andi a3,a3,3 + 3004140: 0692 slli a3,a3,0x4 + 3004142: fcf7f793 andi a5,a5,-49 + 3004146: 8fd5 or a5,a5,a3 + 3004148: 10f72023 sw a5,256(a4) + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 300414c: b67fe0ef jal ra,3002cb2 + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_UNSET; + 3004150: fe842703 lw a4,-24(s0) + 3004154: 435c lw a5,4(a4) + 3004156: ff0006b7 lui a3,0xff000 + 300415a: 16fd addi a3,a3,-1 # feffffff + 300415c: 8ff5 and a5,a5,a3 + 300415e: c35c sw a5,4(a4) + } +} + 3004160: 50b2 lw ra,44(sp) + 3004162: 5422 lw s0,40(sp) + 3004164: 6145 addi sp,sp,48 + 3004166: 8082 ret + +03004168 : + * @brief Get ADC Clock Select + * @param matchInfo ADC match info + * @retval Adc Clock select @see CRG_AdcClkSelect + */ +static unsigned int CRG_AdcClkSelectGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3004168: 7179 addi sp,sp,-48 + 300416a: d606 sw ra,44(sp) + 300416c: d422 sw s0,40(sp) + 300416e: 1800 addi s0,sp,48 + 3004170: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004174: fdc42783 lw a5,-36(s0) + 3004178: eb89 bnez a5,300418a + 300417a: 3e400593 li a1,996 + 300417e: 030077b7 lui a5,0x3007 + 3004182: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004186: 3921 jal ra,3003d9e + 3004188: a001 j 3004188 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300418a: 040007b7 lui a5,0x4000 + 300418e: 4947a783 lw a5,1172(a5) # 4000494 + 3004192: eb89 bnez a5,30041a4 + 3004194: 3e500593 li a1,997 + 3004198: 030077b7 lui a5,0x3007 + 300419c: 8a478513 addi a0,a5,-1884 # 30068a4 + 30041a0: 3efd jal ra,3003d9e + 30041a2: a001 j 30041a2 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30041a4: 040007b7 lui a5,0x4000 + 30041a8: 4947a783 lw a5,1172(a5) # 4000494 + 30041ac: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 30041b0: fdc42783 lw a5,-36(s0) + 30041b4: 279e lhu a5,8(a5) + 30041b6: 873e mv a4,a5 + 30041b8: fec42783 lw a5,-20(s0) + 30041bc: 97ba add a5,a5,a4 + 30041be: fef42423 sw a5,-24(s0) + if (p->BIT.cfg_adc_ckmode_sel == BASE_CFG_SET) { + 30041c2: fe842783 lw a5,-24(s0) + 30041c6: 43dc lw a5,4(a5) + 30041c8: 83e1 srli a5,a5,0x18 + 30041ca: 8b85 andi a5,a5,1 + 30041cc: 0ff7f713 andi a4,a5,255 + 30041d0: 4785 li a5,1 + 30041d2: 00f71463 bne a4,a5,30041da + return CRG_ADC_CLK_SYN_CORE; /* Synchronous clock signal */ + 30041d6: 478d li a5,3 + 30041d8: a811 j 30041ec + } + return g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel; /* asynchronous clock signal */ + 30041da: 040007b7 lui a5,0x4000 + 30041de: 4947a783 lw a5,1172(a5) # 4000494 + 30041e2: 1007a783 lw a5,256(a5) + 30041e6: 8391 srli a5,a5,0x4 + 30041e8: 8b8d andi a5,a5,3 + 30041ea: 9f81 uxtb a5 +} + 30041ec: 853e mv a0,a5 + 30041ee: 50b2 lw ra,44(sp) + 30041f0: 5422 lw s0,40(sp) + 30041f2: 6145 addi sp,sp,48 + 30041f4: 8082 ret + +030041f6 : + * @param matchInfo ADC match info + * @param div Adc clock division + * @retval None + */ +static void CRG_AdcDivSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int div) +{ + 30041f6: 7179 addi sp,sp,-48 + 30041f8: d606 sw ra,44(sp) + 30041fa: d422 sw s0,40(sp) + 30041fc: 1800 addi s0,sp,48 + 30041fe: fca42e23 sw a0,-36(s0) + 3004202: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004206: fdc42783 lw a5,-36(s0) + 300420a: eb89 bnez a5,300421c + 300420c: 3f700593 li a1,1015 + 3004210: 030077b7 lui a5,0x3007 + 3004214: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004218: 3659 jal ra,3003d9e + 300421a: a001 j 300421a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300421c: 040007b7 lui a5,0x4000 + 3004220: 4947a783 lw a5,1172(a5) # 4000494 + 3004224: eb89 bnez a5,3004236 + 3004226: 3f800593 li a1,1016 + 300422a: 030077b7 lui a5,0x3007 + 300422e: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004232: 36b5 jal ra,3003d9e + 3004234: a001 j 3004234 + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkDiv(div)); + 3004236: fd842503 lw a0,-40(s0) + 300423a: d75fe0ef jal ra,3002fae + 300423e: 87aa mv a5,a0 + 3004240: 0017c793 xori a5,a5,1 + 3004244: 9f81 uxtb a5 + 3004246: cb89 beqz a5,3004258 + 3004248: 3f900593 li a1,1017 + 300424c: 030077b7 lui a5,0x3007 + 3004250: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004254: 36a9 jal ra,3003d9e + 3004256: a885 j 30042c6 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3004258: 040007b7 lui a5,0x4000 + 300425c: 4947a783 lw a5,1172(a5) # 4000494 + 3004260: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004264: fdc42783 lw a5,-36(s0) + 3004268: 279e lhu a5,8(a5) + 300426a: 873e mv a4,a5 + 300426c: fec42783 lw a5,-20(s0) + 3004270: 97ba add a5,a5,a4 + 3004272: fef42423 sw a5,-24(s0) + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3004276: fe842783 lw a5,-24(s0) + 300427a: 43dc lw a5,4(a5) + 300427c: 83e1 srli a5,a5,0x18 + 300427e: 8b85 andi a5,a5,1 + 3004280: 9f81 uxtb a5 + 3004282: fef42223 sw a5,-28(s0) + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3004286: fe442703 lw a4,-28(s0) + 300428a: 4785 li a5,1 + 300428c: 02f71163 bne a4,a5,30042ae + p->BIT.clk_adc_div1 = div; /* write div to I1 */ + 3004290: fd842783 lw a5,-40(s0) + 3004294: 8b8d andi a5,a5,3 + 3004296: 0ff7f693 andi a3,a5,255 + 300429a: fe842703 lw a4,-24(s0) + 300429e: 431c lw a5,0(a4) + 30042a0: 8a8d andi a3,a3,3 + 30042a2: 06a2 slli a3,a3,0x8 + 30042a4: cff7f793 andi a5,a5,-769 + 30042a8: 8fd5 or a5,a5,a3 + 30042aa: c31c sw a5,0(a4) + 30042ac: a829 j 30042c6 + } else { + p->BIT.clk_adc_div0 = div; /* write div to I0 */ + 30042ae: fd842783 lw a5,-40(s0) + 30042b2: 8b8d andi a5,a5,3 + 30042b4: 0ff7f693 andi a3,a5,255 + 30042b8: fe842703 lw a4,-24(s0) + 30042bc: 431c lw a5,0(a4) + 30042be: 8a8d andi a3,a3,3 + 30042c0: 9bf1 andi a5,a5,-4 + 30042c2: 8fd5 or a5,a5,a3 + 30042c4: c31c sw a5,0(a4) + } +} + 30042c6: 50b2 lw ra,44(sp) + 30042c8: 5422 lw s0,40(sp) + 30042ca: 6145 addi sp,sp,48 + 30042cc: 8082 ret + +030042ce : + * @brief Get ADC clock division + * @param matchInfo ADC match info + * @retval Adc clock division + */ +static unsigned int CRG_AdcDivGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30042ce: 7179 addi sp,sp,-48 + 30042d0: d606 sw ra,44(sp) + 30042d2: d422 sw s0,40(sp) + 30042d4: 1800 addi s0,sp,48 + 30042d6: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30042da: fdc42783 lw a5,-36(s0) + 30042de: eb89 bnez a5,30042f0 + 30042e0: 40c00593 li a1,1036 + 30042e4: 030077b7 lui a5,0x3007 + 30042e8: 8a478513 addi a0,a5,-1884 # 30068a4 + 30042ec: 3c4d jal ra,3003d9e + 30042ee: a001 j 30042ee + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30042f0: 040007b7 lui a5,0x4000 + 30042f4: 4947a783 lw a5,1172(a5) # 4000494 + 30042f8: eb89 bnez a5,300430a + 30042fa: 40d00593 li a1,1037 + 30042fe: 030077b7 lui a5,0x3007 + 3004302: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004306: 3c61 jal ra,3003d9e + 3004308: a001 j 3004308 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300430a: 040007b7 lui a5,0x4000 + 300430e: 4947a783 lw a5,1172(a5) # 4000494 + 3004312: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004316: fdc42783 lw a5,-36(s0) + 300431a: 279e lhu a5,8(a5) + 300431c: 873e mv a4,a5 + 300431e: fec42783 lw a5,-20(s0) + 3004322: 97ba add a5,a5,a4 + 3004324: fef42423 sw a5,-24(s0) + + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3004328: fe842783 lw a5,-24(s0) + 300432c: 43dc lw a5,4(a5) + 300432e: 83e1 srli a5,a5,0x18 + 3004330: 8b85 andi a5,a5,1 + 3004332: 9f81 uxtb a5 + 3004334: fef42223 sw a5,-28(s0) + + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3004338: fe442703 lw a4,-28(s0) + 300433c: 4785 li a5,1 + 300433e: 00f71963 bne a4,a5,3004350 + return p->BIT.clk_adc_div1; /* return div value I1 */ + 3004342: fe842783 lw a5,-24(s0) + 3004346: 439c lw a5,0(a5) + 3004348: 83a1 srli a5,a5,0x8 + 300434a: 8b8d andi a5,a5,3 + 300434c: 9f81 uxtb a5 + 300434e: a031 j 300435a + } + return p->BIT.clk_adc_div0; /* return div valye I0 */ + 3004350: fe842783 lw a5,-24(s0) + 3004354: 439c lw a5,0(a5) + 3004356: 8b8d andi a5,a5,3 + 3004358: 9f81 uxtb a5 +} + 300435a: 853e mv a0,a5 + 300435c: 50b2 lw ra,44(sp) + 300435e: 5422 lw s0,40(sp) + 3004360: 6145 addi sp,sp,48 + 3004362: 8082 ret + +03004364 : + * @brief Enable Clock of EFC + * @param matchInfo EFC match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_EfcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3004364: 7179 addi sp,sp,-48 + 3004366: d606 sw ra,44(sp) + 3004368: d422 sw s0,40(sp) + 300436a: 1800 addi s0,sp,48 + 300436c: fca42e23 sw a0,-36(s0) + 3004370: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004374: fdc42783 lw a5,-36(s0) + 3004378: eb89 bnez a5,300438a + 300437a: 42100593 li a1,1057 + 300437e: 030077b7 lui a5,0x3007 + 3004382: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004386: 3c21 jal ra,3003d9e + 3004388: a001 j 3004388 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300438a: 040007b7 lui a5,0x4000 + 300438e: 4947a783 lw a5,1172(a5) # 4000494 + 3004392: eb89 bnez a5,30043a4 + 3004394: 42200593 li a1,1058 + 3004398: 030077b7 lui a5,0x3007 + 300439c: 8a478513 addi a0,a5,-1884 # 30068a4 + 30043a0: 3afd jal ra,3003d9e + 30043a2: a001 j 30043a2 + /* Enables or disables EFC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30043a4: 040007b7 lui a5,0x4000 + 30043a8: 4947a783 lw a5,1172(a5) # 4000494 + 30043ac: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 30043b0: fdc42783 lw a5,-36(s0) + 30043b4: 279e lhu a5,8(a5) + 30043b6: 873e mv a4,a5 + 30043b8: fec42783 lw a5,-20(s0) + 30043bc: 97ba add a5,a5,a4 + 30043be: fef42423 sw a5,-24(s0) + p->BIT.eflash_cken = (enable & IP_CLK_ENABLE) ? BASE_CFG_SET : BASE_CFG_UNSET; + 30043c2: fd842783 lw a5,-40(s0) + 30043c6: 8b85 andi a5,a5,1 + 30043c8: 0ff7f693 andi a3,a5,255 + 30043cc: fe842703 lw a4,-24(s0) + 30043d0: 431c lw a5,0(a4) + 30043d2: 8a85 andi a3,a3,1 + 30043d4: 9bf9 andi a5,a5,-2 + 30043d6: 8fd5 or a5,a5,a3 + 30043d8: c31c sw a5,0(a4) +} + 30043da: 0001 nop + 30043dc: 50b2 lw ra,44(sp) + 30043de: 5422 lw s0,40(sp) + 30043e0: 6145 addi sp,sp,48 + 30043e2: 8082 ret + +030043e4 : + * @brief Disable Clock of EFC + * @param matchInfo EFC match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_EfcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30043e4: 7179 addi sp,sp,-48 + 30043e6: d606 sw ra,44(sp) + 30043e8: d422 sw s0,40(sp) + 30043ea: 1800 addi s0,sp,48 + 30043ec: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30043f0: fdc42783 lw a5,-36(s0) + 30043f4: eb89 bnez a5,3004406 + 30043f6: 43000593 li a1,1072 + 30043fa: 030077b7 lui a5,0x3007 + 30043fe: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004402: 3a71 jal ra,3003d9e + 3004404: a001 j 3004404 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004406: 040007b7 lui a5,0x4000 + 300440a: 4947a783 lw a5,1172(a5) # 4000494 + 300440e: eb89 bnez a5,3004420 + 3004410: 43100593 li a1,1073 + 3004414: 030077b7 lui a5,0x3007 + 3004418: 8a478513 addi a0,a5,-1884 # 30068a4 + 300441c: 3249 jal ra,3003d9e + 300441e: a001 j 300441e + /* Get the value of the EFC register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3004420: 040007b7 lui a5,0x4000 + 3004424: 4947a783 lw a5,1172(a5) # 4000494 + 3004428: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 300442c: fdc42783 lw a5,-36(s0) + 3004430: 279e lhu a5,8(a5) + 3004432: 873e mv a4,a5 + 3004434: fec42783 lw a5,-20(s0) + 3004438: 97ba add a5,a5,a4 + 300443a: fef42423 sw a5,-24(s0) + return p->BIT.eflash_cken; + 300443e: fe842783 lw a5,-24(s0) + 3004442: 439c lw a5,0(a5) + 3004444: 8b85 andi a5,a5,1 + 3004446: 9f81 uxtb a5 +} + 3004448: 853e mv a0,a5 + 300444a: 50b2 lw ra,44(sp) + 300444c: 5422 lw s0,40(sp) + 300444e: 6145 addi sp,sp,48 + 3004450: 8082 ret + +03004452 : + * @brief Enable Clock of ANA + * @param matchInfo ANA match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_AnaEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3004452: 7179 addi sp,sp,-48 + 3004454: d606 sw ra,44(sp) + 3004456: d422 sw s0,40(sp) + 3004458: 1800 addi s0,sp,48 + 300445a: fca42e23 sw a0,-36(s0) + 300445e: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004462: fdc42783 lw a5,-36(s0) + 3004466: eb89 bnez a5,3004478 + 3004468: 44000593 li a1,1088 + 300446c: 030077b7 lui a5,0x3007 + 3004470: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004474: 322d jal ra,3003d9e + 3004476: a001 j 3004476 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004478: 040007b7 lui a5,0x4000 + 300447c: 4947a783 lw a5,1172(a5) # 4000494 + 3004480: eb89 bnez a5,3004492 + 3004482: 44100593 li a1,1089 + 3004486: 030077b7 lui a5,0x3007 + 300448a: 8a478513 addi a0,a5,-1884 # 30068a4 + 300448e: 3a01 jal ra,3003d9e + 3004490: a001 j 3004490 + CRG_PARAM_CHECK_NO_RET(enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE); + 3004492: fd842703 lw a4,-40(s0) + 3004496: 4785 li a5,1 + 3004498: 00f70d63 beq a4,a5,30044b2 + 300449c: fd842783 lw a5,-40(s0) + 30044a0: cb89 beqz a5,30044b2 + 30044a2: 44200593 li a1,1090 + 30044a6: 030077b7 lui a5,0x3007 + 30044aa: 8a478513 addi a0,a5,-1884 # 30068a4 + 30044ae: 38c5 jal ra,3003d9e + 30044b0: a20d j 30045d2 + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30044b2: 040007b7 lui a5,0x4000 + 30044b6: 4947a783 lw a5,1172(a5) # 4000494 + 30044ba: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 30044be: fdc42783 lw a5,-36(s0) + 30044c2: 279e lhu a5,8(a5) + 30044c4: 873e mv a4,a5 + 30044c6: fec42783 lw a5,-20(s0) + 30044ca: 97ba add a5,a5,a4 + 30044cc: fdc42703 lw a4,-36(s0) + 30044d0: 2738 lbu a4,10(a4) + 30044d2: 97ba add a5,a5,a4 + 30044d4: fef42423 sw a5,-24(s0) + + if ((enable == IP_CLK_ENABLE) && (p->BIT.ip_srst_req == BASE_CFG_SET)) { + 30044d8: fd842703 lw a4,-40(s0) + 30044dc: 4785 li a5,1 + 30044de: 02f71f63 bne a4,a5,300451c + 30044e2: fe842783 lw a5,-24(s0) + 30044e6: 439c lw a5,0(a5) + 30044e8: 83c1 srli a5,a5,0x10 + 30044ea: 8b85 andi a5,a5,1 + 30044ec: 0ff7f713 andi a4,a5,255 + 30044f0: 4785 li a5,1 + 30044f2: 02f71563 bne a4,a5,300451c + p->BIT.ip_srst_req = BASE_CFG_UNSET; + 30044f6: fe842703 lw a4,-24(s0) + 30044fa: 431c lw a5,0(a4) + 30044fc: 76c1 lui a3,0xffff0 + 30044fe: 16fd addi a3,a3,-1 # fffeffff + 3004500: 8ff5 and a5,a5,a3 + 3004502: c31c sw a5,0(a4) + g_anaEnableFlag++; /* count enable analog IP number */ + 3004504: 040007b7 lui a5,0x4000 + 3004508: 4987c783 lbu a5,1176(a5) # 4000498 + 300450c: 0785 addi a5,a5,1 + 300450e: 0ff7f713 andi a4,a5,255 + 3004512: 040007b7 lui a5,0x4000 + 3004516: 48e78c23 sb a4,1176(a5) # 4000498 + 300451a: a089 j 300455c + } else if ((enable == IP_CLK_DISABLE) && (p->BIT.ip_srst_req == BASE_CFG_UNSET)) { + 300451c: fd842783 lw a5,-40(s0) + 3004520: ef95 bnez a5,300455c + 3004522: fe842783 lw a5,-24(s0) + 3004526: 439c lw a5,0(a5) + 3004528: 83c1 srli a5,a5,0x10 + 300452a: 8b85 andi a5,a5,1 + 300452c: 9f81 uxtb a5 + 300452e: e79d bnez a5,300455c + p->BIT.ip_srst_req = BASE_CFG_SET; + 3004530: fe842703 lw a4,-24(s0) + 3004534: 431c lw a5,0(a4) + 3004536: 66c1 lui a3,0x10 + 3004538: 8fd5 or a5,a5,a3 + 300453a: c31c sw a5,0(a4) + if (g_anaEnableFlag > 0) { + 300453c: 040007b7 lui a5,0x4000 + 3004540: 4987c783 lbu a5,1176(a5) # 4000498 + 3004544: cf81 beqz a5,300455c + g_anaEnableFlag--; /* Decreasing the count to enable the analog IP number. */ + 3004546: 040007b7 lui a5,0x4000 + 300454a: 4987c783 lbu a5,1176(a5) # 4000498 + 300454e: 17fd addi a5,a5,-1 + 3004550: 0ff7f713 andi a4,a5,255 + 3004554: 040007b7 lui a5,0x4000 + 3004558: 48e78c23 sb a4,1176(a5) # 4000498 + } + } + + if ((g_anaEnableFlag == 0) && (enable == IP_CLK_DISABLE)) { /* all analog clock disable */ + 300455c: 040007b7 lui a5,0x4000 + 3004560: 4987c783 lbu a5,1176(a5) # 4000498 + 3004564: eb85 bnez a5,3004594 + 3004566: fd842783 lw a5,-40(s0) + 300456a: e78d bnez a5,3004594 + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_UNSET; + 300456c: 10000737 lui a4,0x10000 + 3004570: 6785 lui a5,0x1 + 3004572: 973e add a4,a4,a5 + 3004574: a5072783 lw a5,-1456(a4) # ffffa50 + 3004578: 9bf9 andi a5,a5,-2 + 300457a: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_SET; + 300457e: 10000737 lui a4,0x10000 + 3004582: 6785 lui a5,0x1 + 3004584: 973e add a4,a4,a5 + 3004586: a5072783 lw a5,-1456(a4) # ffffa50 + 300458a: 66c1 lui a3,0x10 + 300458c: 8fd5 or a5,a5,a3 + 300458e: a4f72823 sw a5,-1456(a4) + 3004592: a081 j 30045d2 + } else if ((g_anaEnableFlag > 0) && (enable == IP_CLK_ENABLE)) { /* all analog clock enable */ + 3004594: 040007b7 lui a5,0x4000 + 3004598: 4987c783 lbu a5,1176(a5) # 4000498 + 300459c: cb9d beqz a5,30045d2 + 300459e: fd842703 lw a4,-40(s0) + 30045a2: 4785 li a5,1 + 30045a4: 02f71763 bne a4,a5,30045d2 + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_UNSET; + 30045a8: 10000737 lui a4,0x10000 + 30045ac: 6785 lui a5,0x1 + 30045ae: 973e add a4,a4,a5 + 30045b0: a5072783 lw a5,-1456(a4) # ffffa50 + 30045b4: 76c1 lui a3,0xffff0 + 30045b6: 16fd addi a3,a3,-1 # fffeffff + 30045b8: 8ff5 and a5,a5,a3 + 30045ba: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_SET; + 30045be: 10000737 lui a4,0x10000 + 30045c2: 6785 lui a5,0x1 + 30045c4: 973e add a4,a4,a5 + 30045c6: a5072783 lw a5,-1456(a4) # ffffa50 + 30045ca: 0017e793 ori a5,a5,1 + 30045ce: a4f72823 sw a5,-1456(a4) + } +} + 30045d2: 50b2 lw ra,44(sp) + 30045d4: 5422 lw s0,40(sp) + 30045d6: 6145 addi sp,sp,48 + 30045d8: 8082 ret + +030045da : + * @brief Get Clock of ANA + * @param matchInfo ANA match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_AnaEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30045da: 7179 addi sp,sp,-48 + 30045dc: d606 sw ra,44(sp) + 30045de: d422 sw s0,40(sp) + 30045e0: 1800 addi s0,sp,48 + 30045e2: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30045e6: fdc42783 lw a5,-36(s0) + 30045ea: eb91 bnez a5,30045fe + 30045ec: 46200593 li a1,1122 + 30045f0: 030077b7 lui a5,0x3007 + 30045f4: 8a478513 addi a0,a5,-1884 # 30068a4 + 30045f8: beffd0ef jal ra,30021e6 + 30045fc: a001 j 30045fc + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30045fe: 040007b7 lui a5,0x4000 + 3004602: 4947a783 lw a5,1172(a5) # 4000494 + 3004606: eb91 bnez a5,300461a + 3004608: 46300593 li a1,1123 + 300460c: 030077b7 lui a5,0x3007 + 3004610: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004614: bd3fd0ef jal ra,30021e6 + 3004618: a001 j 3004618 + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300461a: 040007b7 lui a5,0x4000 + 300461e: 4947a783 lw a5,1172(a5) # 4000494 + 3004622: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 3004626: fdc42783 lw a5,-36(s0) + 300462a: 279e lhu a5,8(a5) + 300462c: 873e mv a4,a5 + 300462e: fec42783 lw a5,-20(s0) + 3004632: 97ba add a5,a5,a4 + 3004634: fdc42703 lw a4,-36(s0) + 3004638: 2738 lbu a4,10(a4) + 300463a: 97ba add a5,a5,a4 + 300463c: fef42423 sw a5,-24(s0) + /* The clock is enabled based on the IP reset status. */ + return (p->BIT.ip_srst_req) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3004640: fe842783 lw a5,-24(s0) + 3004644: 439c lw a5,0(a5) + 3004646: 83c1 srli a5,a5,0x10 + 3004648: 8b85 andi a5,a5,1 + 300464a: 9f81 uxtb a5 + 300464c: 0017c793 xori a5,a5,1 + 3004650: 9f81 uxtb a5 +} + 3004652: 853e mv a0,a5 + 3004654: 50b2 lw ra,44(sp) + 3004656: 5422 lw s0,40(sp) + 3004658: 6145 addi sp,sp,48 + 300465a: 8082 ret + +0300465c : + * @brief Write a character to the UART port. + * @param ch The int promotion of the character to be written. + * @retval None. + */ +static void DBG_PrintCh(unsigned int ch) +{ + 300465c: 1101 addi sp,sp,-32 + 300465e: ce22 sw s0,28(sp) + 3004660: 1000 addi s0,sp,32 + 3004662: fea42623 sw a0,-20(s0) + while (DBG_PRINTF_UART_PORT->UART_FR.BIT.txff == 1) { + 3004666: 0001 nop + 3004668: 140007b7 lui a5,0x14000 + 300466c: 4f9c lw a5,24(a5) + 300466e: 8395 srli a5,a5,0x5 + 3004670: 8b85 andi a5,a5,1 + 3004672: 0ff7f713 andi a4,a5,255 + 3004676: 4785 li a5,1 + 3004678: fef708e3 beq a4,a5,3004668 + ; + } + DBG_PRINTF_UART_PORT->UART_DR.BIT.data = (unsigned char)ch; + 300467c: 14000737 lui a4,0x14000 + 3004680: fec42783 lw a5,-20(s0) + 3004684: 0ff7f693 andi a3,a5,255 + 3004688: 431c lw a5,0(a4) + 300468a: 0ff6f693 andi a3,a3,255 + 300468e: f007f793 andi a5,a5,-256 + 3004692: 8fd5 or a5,a5,a3 + 3004694: c31c sw a5,0(a4) +} + 3004696: 0001 nop + 3004698: 4472 lw s0,28(sp) + 300469a: 6105 addi sp,sp,32 + 300469c: 8082 ret + +0300469e : + * @param str The string to be printed. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, a BASE_STATUS_ERROR is returned. + */ +static int DBG_PrintStr(const char *str) +{ + 300469e: 7179 addi sp,sp,-48 + 30046a0: d606 sw ra,44(sp) + 30046a2: d422 sw s0,40(sp) + 30046a4: 1800 addi s0,sp,48 + 30046a6: fca42e23 sw a0,-36(s0) + DEBUG_ASSERT_PARAM(str != NULL); + int cnt = 0; + 30046aa: fe042623 sw zero,-20(s0) + while (*str != '\0') { + 30046ae: a00d j 30046d0 + DBG_PrintCh(*str); + 30046b0: fdc42783 lw a5,-36(s0) + 30046b4: 00078783 lb a5,0(a5) # 14000000 + 30046b8: 853e mv a0,a5 + 30046ba: 374d jal ra,300465c + str++; + 30046bc: fdc42783 lw a5,-36(s0) + 30046c0: 0785 addi a5,a5,1 + 30046c2: fcf42e23 sw a5,-36(s0) + cnt++; + 30046c6: fec42783 lw a5,-20(s0) + 30046ca: 0785 addi a5,a5,1 + 30046cc: fef42623 sw a5,-20(s0) + while (*str != '\0') { + 30046d0: fdc42783 lw a5,-36(s0) + 30046d4: 00078783 lb a5,0(a5) + 30046d8: ffe1 bnez a5,30046b0 + } + return cnt; + 30046da: fec42783 lw a5,-20(s0) +} + 30046de: 853e mv a0,a5 + 30046e0: 50b2 lw ra,44(sp) + 30046e2: 5422 lw s0,40(sp) + 30046e4: 6145 addi sp,sp,48 + 30046e6: 8082 ret + +030046e8 : + * @param base Base value. + * @param exponent Exponent value. + * @retval unsigned long The result of raising base to the power exponent. + */ +static unsigned long DBG_Pow(unsigned int base, unsigned int exponent) +{ + 30046e8: 7179 addi sp,sp,-48 + 30046ea: d622 sw s0,44(sp) + 30046ec: 1800 addi s0,sp,48 + 30046ee: fca42e23 sw a0,-36(s0) + 30046f2: fcb42c23 sw a1,-40(s0) + unsigned long ret = 1; + 30046f6: 4785 li a5,1 + 30046f8: fef42623 sw a5,-20(s0) + while (exponent--) { + 30046fc: a809 j 300470e + ret *= base; + 30046fe: fec42703 lw a4,-20(s0) + 3004702: fdc42783 lw a5,-36(s0) + 3004706: 02f707b3 mul a5,a4,a5 + 300470a: fef42623 sw a5,-20(s0) + while (exponent--) { + 300470e: fd842783 lw a5,-40(s0) + 3004712: fff78713 addi a4,a5,-1 + 3004716: fce42c23 sw a4,-40(s0) + 300471a: f3f5 bnez a5,30046fe + } + return ret; /* ret = base ^ exponent */ + 300471c: fec42783 lw a5,-20(s0) +} + 3004720: 853e mv a0,a5 + 3004722: 5432 lw s0,44(sp) + 3004724: 6145 addi sp,sp,48 + 3004726: 8082 ret + +03004728 : + * @param num The number to be counted. + * @param base The number base of num. + * @retval unsigned int The number of digits. + */ +static unsigned int DBG_CountDigits(int num, NumBase base) +{ + 3004728: 7179 addi sp,sp,-48 + 300472a: d622 sw s0,44(sp) + 300472c: 1800 addi s0,sp,48 + 300472e: fca42e23 sw a0,-36(s0) + 3004732: fcb42c23 sw a1,-40(s0) + unsigned int cnt = 0; + 3004736: fe042623 sw zero,-20(s0) + if (base == 0) { + 300473a: fd842783 lw a5,-40(s0) + 300473e: e78d bnez a5,3004768 + return 0; + 3004740: 4781 li a5,0 + 3004742: a099 j 3004788 + } + while (num != 0) { + cnt++; + 3004744: fec42783 lw a5,-20(s0) + 3004748: 0785 addi a5,a5,1 + 300474a: fef42623 sw a5,-20(s0) + if (cnt > MAX_DIV_TIMES) { + 300474e: fec42703 lw a4,-20(s0) + 3004752: 47fd li a5,31 + 3004754: 00e7ee63 bltu a5,a4,3004770 + break; + } + num /= base; + 3004758: fdc42703 lw a4,-36(s0) + 300475c: fd842783 lw a5,-40(s0) + 3004760: 02f757b3 divu a5,a4,a5 + 3004764: fcf42e23 sw a5,-36(s0) + while (num != 0) { + 3004768: fdc42783 lw a5,-36(s0) + 300476c: ffe1 bnez a5,3004744 + 300476e: a011 j 3004772 + break; + 3004770: 0001 nop + } + cnt = (cnt == 0) ? 1 : cnt; + 3004772: fec42783 lw a5,-20(s0) + 3004776: c781 beqz a5,300477e + 3004778: fec42783 lw a5,-20(s0) + 300477c: a011 j 3004780 + 300477e: 4785 li a5,1 + 3004780: fef42623 sw a5,-20(s0) + return cnt; + 3004784: fec42783 lw a5,-20(s0) +} + 3004788: 853e mv a0,a5 + 300478a: 5432 lw s0,44(sp) + 300478c: 6145 addi sp,sp,48 + 300478e: 8082 ret + +03004790 : + * @param num The unsigned number to be printed. + * @param base The number base of num. + * @param digits The digits of num. + */ +static void DBG_PutUnsignedNum(unsigned int num, NumBase base, unsigned int digits) +{ + 3004790: 7179 addi sp,sp,-48 + 3004792: d606 sw ra,44(sp) + 3004794: d422 sw s0,40(sp) + 3004796: 1800 addi s0,sp,48 + 3004798: fca42e23 sw a0,-36(s0) + 300479c: fcb42c23 sw a1,-40(s0) + 30047a0: fcc42a23 sw a2,-44(s0) + unsigned char ch; + while (digits != 0) { + 30047a4: a069 j 300482e + ch = num / DBG_Pow(base, digits - 1); + 30047a6: fd442783 lw a5,-44(s0) + 30047aa: 17fd addi a5,a5,-1 + 30047ac: 85be mv a1,a5 + 30047ae: fd842503 lw a0,-40(s0) + 30047b2: 3f1d jal ra,30046e8 + 30047b4: 872a mv a4,a0 + 30047b6: fdc42783 lw a5,-36(s0) + 30047ba: 02e7d7b3 divu a5,a5,a4 + 30047be: fef407a3 sb a5,-17(s0) + num %= DBG_Pow(base, digits - 1); + 30047c2: fd442783 lw a5,-44(s0) + 30047c6: 17fd addi a5,a5,-1 + 30047c8: 85be mv a1,a5 + 30047ca: fd842503 lw a0,-40(s0) + 30047ce: 3f29 jal ra,30046e8 + 30047d0: 872a mv a4,a0 + 30047d2: fdc42783 lw a5,-36(s0) + 30047d6: 02e7f7b3 remu a5,a5,a4 + 30047da: fcf42e23 sw a5,-36(s0) + if (base == DECIMAL) { + 30047de: fd842703 lw a4,-40(s0) + 30047e2: 47a9 li a5,10 + 30047e4: 00f71963 bne a4,a5,30047f6 + DBG_PrintCh(ch + '0'); + 30047e8: fef44783 lbu a5,-17(s0) + 30047ec: 03078793 addi a5,a5,48 + 30047f0: 853e mv a0,a5 + 30047f2: 35ad jal ra,300465c + 30047f4: a805 j 3004824 + } else if (base == HEXADECIMAL) { + 30047f6: fd842703 lw a4,-40(s0) + 30047fa: 47c1 li a5,16 + 30047fc: 02f71d63 bne a4,a5,3004836 + if (ch < DECIMAL_BASE) { + 3004800: fef44703 lbu a4,-17(s0) + 3004804: 47a5 li a5,9 + 3004806: 00e7e963 bltu a5,a4,3004818 + DBG_PrintCh(ch + '0'); + 300480a: fef44783 lbu a5,-17(s0) + 300480e: 03078793 addi a5,a5,48 + 3004812: 853e mv a0,a5 + 3004814: 35a1 jal ra,300465c + 3004816: a039 j 3004824 + } else { + DBG_PrintCh(ch - DECIMAL_BASE + 'A'); + 3004818: fef44783 lbu a5,-17(s0) + 300481c: 03778793 addi a5,a5,55 + 3004820: 853e mv a0,a5 + 3004822: 3d2d jal ra,300465c + } + } else { + break; + } + digits--; + 3004824: fd442783 lw a5,-44(s0) + 3004828: 17fd addi a5,a5,-1 + 300482a: fcf42a23 sw a5,-44(s0) + while (digits != 0) { + 300482e: fd442783 lw a5,-44(s0) + 3004832: fbb5 bnez a5,30047a6 + } +} + 3004834: a011 j 3004838 + break; + 3004836: 0001 nop +} + 3004838: 0001 nop + 300483a: 50b2 lw ra,44(sp) + 300483c: 5422 lw s0,40(sp) + 300483e: 6145 addi sp,sp,48 + 3004840: 8082 ret + +03004842 : + * @brief Print decimal number through UART port. + * @param intNum The decimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintInt(int intNum) +{ + 3004842: 7179 addi sp,sp,-48 + 3004844: d606 sw ra,44(sp) + 3004846: d422 sw s0,40(sp) + 3004848: 1800 addi s0,sp,48 + 300484a: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (intNum == 0) { + 300484e: fdc42783 lw a5,-36(s0) + 3004852: e791 bnez a5,300485e + DBG_PrintCh('0'); + 3004854: 03000513 li a0,48 + 3004858: 3511 jal ra,300465c + return 1; + 300485a: 4785 li a5,1 + 300485c: a82d j 3004896 + } + if (intNum < 0) { + 300485e: fdc42783 lw a5,-36(s0) + 3004862: 0007db63 bgez a5,3004878 + DBG_PrintCh('-'); + 3004866: 02d00513 li a0,45 + 300486a: 3bcd jal ra,300465c + intNum = -intNum; + 300486c: fdc42783 lw a5,-36(s0) + 3004870: 40f007b3 neg a5,a5 + 3004874: fcf42e23 sw a5,-36(s0) + } + cnt = DBG_CountDigits(intNum, DECIMAL); + 3004878: 45a9 li a1,10 + 300487a: fdc42503 lw a0,-36(s0) + 300487e: 356d jal ra,3004728 + 3004880: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(intNum, DECIMAL, cnt); + 3004884: fdc42783 lw a5,-36(s0) + 3004888: fec42603 lw a2,-20(s0) + 300488c: 45a9 li a1,10 + 300488e: 853e mv a0,a5 + 3004890: 3701 jal ra,3004790 + return cnt; + 3004892: fec42783 lw a5,-20(s0) +} + 3004896: 853e mv a0,a5 + 3004898: 50b2 lw ra,44(sp) + 300489a: 5422 lw s0,40(sp) + 300489c: 6145 addi sp,sp,48 + 300489e: 8082 ret + +030048a0 : + * @brief Print hexadecimal number through UART port. + * @param hexNum The hexadecimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintHex(unsigned int hexNum) +{ + 30048a0: 7179 addi sp,sp,-48 + 30048a2: d606 sw ra,44(sp) + 30048a4: d422 sw s0,40(sp) + 30048a6: 1800 addi s0,sp,48 + 30048a8: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (hexNum == 0) { + 30048ac: fdc42783 lw a5,-36(s0) + 30048b0: e791 bnez a5,30048bc + DBG_PrintCh('0'); + 30048b2: 03000513 li a0,48 + 30048b6: 335d jal ra,300465c + return 1; + 30048b8: 4785 li a5,1 + 30048ba: a005 j 30048da + } + cnt = DBG_CountDigits(hexNum, HEXADECIMAL); + 30048bc: fdc42783 lw a5,-36(s0) + 30048c0: 45c1 li a1,16 + 30048c2: 853e mv a0,a5 + 30048c4: 3595 jal ra,3004728 + 30048c6: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(hexNum, HEXADECIMAL, cnt); + 30048ca: fec42603 lw a2,-20(s0) + 30048ce: 45c1 li a1,16 + 30048d0: fdc42503 lw a0,-36(s0) + 30048d4: 3d75 jal ra,3004790 + return cnt; + 30048d6: fec42783 lw a5,-20(s0) +} + 30048da: 853e mv a0,a5 + 30048dc: 50b2 lw ra,44(sp) + 30048de: 5422 lw s0,40(sp) + 30048e0: 6145 addi sp,sp,48 + 30048e2: 8082 ret + +030048e4 : + * @brief Print floating-point number through UART port. + * @param fltNum The floating-point number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintFlt(float fltNum, unsigned int precision) +{ + 30048e4: 7139 addi sp,sp,-64 + 30048e6: de06 sw ra,60(sp) + 30048e8: dc22 sw s0,56(sp) + 30048ea: 0080 addi s0,sp,64 + 30048ec: fca42627 fsw fa0,-52(s0) + 30048f0: fca42423 sw a0,-56(s0) + unsigned int cnt = 0; + 30048f4: fe042623 sw zero,-20(s0) + unsigned int floatScale; + + if (fltNum < 0) { + 30048f8: fcc42787 flw fa5,-52(s0) + 30048fc: f0000753 fmv.w.x fa4,zero + 3004900: a0e797d3 flt.s a5,fa5,fa4 + 3004904: cf99 beqz a5,3004922 + DBG_PrintCh('-'); + 3004906: 02d00513 li a0,45 + 300490a: 3b89 jal ra,300465c + cnt += 1; + 300490c: fec42783 lw a5,-20(s0) + 3004910: 0785 addi a5,a5,1 + 3004912: fef42623 sw a5,-20(s0) + fltNum = -fltNum; + 3004916: fcc42787 flw fa5,-52(s0) + 300491a: 20f797d3 fneg.s fa5,fa5 + 300491e: fcf42627 fsw fa5,-52(s0) + } + int integerVal = (int)fltNum; + 3004922: fcc42787 flw fa5,-52(s0) + 3004926: c00797d3 fcvt.w.s a5,fa5,rtz + 300492a: fef42023 sw a5,-32(s0) + floatScale = DBG_Pow(10, (precision + 1)); /* 10: decimal */ + 300492e: fc842783 lw a5,-56(s0) + 3004932: 0785 addi a5,a5,1 + 3004934: 85be mv a1,a5 + 3004936: 4529 li a0,10 + 3004938: 3b45 jal ra,30046e8 + 300493a: fca42e23 sw a0,-36(s0) + int floatVal = (long)(floatScale * (fltNum - integerVal)); + 300493e: fdc42783 lw a5,-36(s0) + 3004942: d017f753 fcvt.s.wu fa4,a5 + 3004946: fe042783 lw a5,-32(s0) + 300494a: d007f7d3 fcvt.s.w fa5,a5 + 300494e: fcc42687 flw fa3,-52(s0) + 3004952: 08f6f7d3 fsub.s fa5,fa3,fa5 + 3004956: 10f777d3 fmul.s fa5,fa4,fa5 + 300495a: c00797d3 fcvt.w.s a5,fa5,rtz + 300495e: fef42423 sw a5,-24(s0) + /* Half-adjust: round up or round down */ + if (floatVal % DECIMAL_BASE >= HALF_ADJUST_BOUNDARY) { + 3004962: fe842703 lw a4,-24(s0) + 3004966: 47a9 li a5,10 + 3004968: 02f77733 remu a4,a4,a5 + 300496c: 4791 li a5,4 + 300496e: 00e7fb63 bgeu a5,a4,3004984 + floatVal = floatVal / DECIMAL_BASE + 1; + 3004972: fe842703 lw a4,-24(s0) + 3004976: 47a9 li a5,10 + 3004978: 02f757b3 divu a5,a4,a5 + 300497c: 0785 addi a5,a5,1 + 300497e: fef42423 sw a5,-24(s0) + 3004982: a801 j 3004992 + } else { + floatVal = floatVal / DECIMAL_BASE; + 3004984: fe842703 lw a4,-24(s0) + 3004988: 47a9 li a5,10 + 300498a: 02f757b3 divu a5,a4,a5 + 300498e: fef42423 sw a5,-24(s0) + } + cnt += DBG_PrintInt(integerVal); + 3004992: fe042503 lw a0,-32(s0) + 3004996: 3575 jal ra,3004842 + 3004998: 872a mv a4,a0 + 300499a: fec42783 lw a5,-20(s0) + 300499e: 97ba add a5,a5,a4 + 30049a0: fef42623 sw a5,-20(s0) + DBG_PrintCh('.'); + 30049a4: 02e00513 li a0,46 + 30049a8: 3955 jal ra,300465c + cnt += 1; + 30049aa: fec42783 lw a5,-20(s0) + 30049ae: 0785 addi a5,a5,1 + 30049b0: fef42623 sw a5,-20(s0) + /* Pad 0 in float part */ + unsigned int fltCnt = DBG_CountDigits(floatVal, DECIMAL); + 30049b4: 45a9 li a1,10 + 30049b6: fe842503 lw a0,-24(s0) + 30049ba: 33bd jal ra,3004728 + 30049bc: fca42c23 sw a0,-40(s0) + if (precision > fltCnt) { + 30049c0: fc842703 lw a4,-56(s0) + 30049c4: fd842783 lw a5,-40(s0) + 30049c8: 02e7f763 bgeu a5,a4,30049f6 + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 30049cc: fe042223 sw zero,-28(s0) + 30049d0: a809 j 30049e2 + DBG_PrintCh('0'); /* add '0' */ + 30049d2: 03000513 li a0,48 + 30049d6: 3159 jal ra,300465c + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 30049d8: fe442783 lw a5,-28(s0) + 30049dc: 0785 addi a5,a5,1 + 30049de: fef42223 sw a5,-28(s0) + 30049e2: fc842703 lw a4,-56(s0) + 30049e6: fd842783 lw a5,-40(s0) + 30049ea: 40f707b3 sub a5,a4,a5 + 30049ee: fe442703 lw a4,-28(s0) + 30049f2: fef760e3 bltu a4,a5,30049d2 + } + } + DBG_PutUnsignedNum(floatVal, DECIMAL, fltCnt); /* print unsigned number */ + 30049f6: fe842783 lw a5,-24(s0) + 30049fa: fd842603 lw a2,-40(s0) + 30049fe: 45a9 li a1,10 + 3004a00: 853e mv a0,a5 + 3004a02: 3379 jal ra,3004790 + cnt += precision; + 3004a04: fec42703 lw a4,-20(s0) + 3004a08: fc842783 lw a5,-56(s0) + 3004a0c: 97ba add a5,a5,a4 + 3004a0e: fef42623 sw a5,-20(s0) + return cnt; + 3004a12: fec42783 lw a5,-20(s0) +} + 3004a16: 853e mv a0,a5 + 3004a18: 50f2 lw ra,60(sp) + 3004a1a: 5462 lw s0,56(sp) + 3004a1c: 6121 addi sp,sp,64 + 3004a1e: 8082 ret + +03004a20 : + * @param ch The format specifier. + * @param paramList The pointer of the variable parameter list. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int ParseSpecifier(const char ch, va_list *paramList) +{ + 3004a20: 7139 addi sp,sp,-64 + 3004a22: de06 sw ra,60(sp) + 3004a24: dc22 sw s0,56(sp) + 3004a26: 0080 addi s0,sp,64 + 3004a28: 87aa mv a5,a0 + 3004a2a: fcb42423 sw a1,-56(s0) + 3004a2e: fcf407a3 sb a5,-49(s0) + unsigned int cnt = 0; + 3004a32: fe042623 sw zero,-20(s0) + unsigned int tmpCnt; + char chVal = 0; + 3004a36: fe0405a3 sb zero,-21(s0) + const char *strVal = NULL; + 3004a3a: fe042223 sw zero,-28(s0) + int intVal = 0; + 3004a3e: fe042023 sw zero,-32(s0) + unsigned int unsignedVal = 0; + 3004a42: fc042e23 sw zero,-36(s0) + unsigned int hexVal = 0; + 3004a46: fc042c23 sw zero,-40(s0) + float fltVal = 0; + 3004a4a: fc042a23 sw zero,-44(s0) + switch (ch) { + 3004a4e: fcf40783 lb a5,-49(s0) + 3004a52: fa878793 addi a5,a5,-88 + 3004a56: 02000713 li a4,32 + 3004a5a: 14f76063 bltu a4,a5,3004b9a + 3004a5e: 00279713 slli a4,a5,0x2 + 3004a62: 030077b7 lui a5,0x3007 + 3004a66: 8f878793 addi a5,a5,-1800 # 30068f8 + 3004a6a: 97ba add a5,a5,a4 + 3004a6c: 439c lw a5,0(a5) + 3004a6e: 8782 jr a5 + case 'c': /* Character format data. */ + chVal = VA_ARG(*paramList, int); /* Use type int because of byte alignment */ + 3004a70: fc842783 lw a5,-56(s0) + 3004a74: 439c lw a5,0(a5) + 3004a76: 00478693 addi a3,a5,4 + 3004a7a: fc842703 lw a4,-56(s0) + 3004a7e: c314 sw a3,0(a4) + 3004a80: 439c lw a5,0(a5) + 3004a82: fef405a3 sb a5,-21(s0) + DBG_PrintCh(chVal); + 3004a86: feb40783 lb a5,-21(s0) + 3004a8a: 853e mv a0,a5 + 3004a8c: 3ec1 jal ra,300465c + cnt += 1; + 3004a8e: fec42783 lw a5,-20(s0) + 3004a92: 0785 addi a5,a5,1 + 3004a94: fef42623 sw a5,-20(s0) + break; + 3004a98: aa19 j 3004bae + case 's': /* String format data. */ + strVal = VA_ARG(*paramList, const char *); + 3004a9a: fc842783 lw a5,-56(s0) + 3004a9e: 439c lw a5,0(a5) + 3004aa0: 00478693 addi a3,a5,4 + 3004aa4: fc842703 lw a4,-56(s0) + 3004aa8: c314 sw a3,0(a4) + 3004aaa: 439c lw a5,0(a5) + 3004aac: fef42223 sw a5,-28(s0) + cnt += DBG_PrintStr(strVal); + 3004ab0: fe442503 lw a0,-28(s0) + 3004ab4: 36ed jal ra,300469e + 3004ab6: 87aa mv a5,a0 + 3004ab8: 873e mv a4,a5 + 3004aba: fec42783 lw a5,-20(s0) + 3004abe: 97ba add a5,a5,a4 + 3004ac0: fef42623 sw a5,-20(s0) + break; + 3004ac4: a0ed j 3004bae + case 'd': /* Integer decimal data. */ + intVal = VA_ARG(*paramList, int); + 3004ac6: fc842783 lw a5,-56(s0) + 3004aca: 439c lw a5,0(a5) + 3004acc: 00478693 addi a3,a5,4 + 3004ad0: fc842703 lw a4,-56(s0) + 3004ad4: c314 sw a3,0(a4) + 3004ad6: 439c lw a5,0(a5) + 3004ad8: fef42023 sw a5,-32(s0) + cnt += DBG_PrintInt(intVal); + 3004adc: fe042503 lw a0,-32(s0) + 3004ae0: 338d jal ra,3004842 + 3004ae2: 872a mv a4,a0 + 3004ae4: fec42783 lw a5,-20(s0) + 3004ae8: 97ba add a5,a5,a4 + 3004aea: fef42623 sw a5,-20(s0) + break; + 3004aee: a0c1 j 3004bae + case 'u': /* Unsigned decimal data. */ + unsignedVal = VA_ARG(*paramList, unsigned int); + 3004af0: fc842783 lw a5,-56(s0) + 3004af4: 439c lw a5,0(a5) + 3004af6: 00478693 addi a3,a5,4 + 3004afa: fc842703 lw a4,-56(s0) + 3004afe: c314 sw a3,0(a4) + 3004b00: 439c lw a5,0(a5) + 3004b02: fcf42e23 sw a5,-36(s0) + tmpCnt = DBG_CountDigits(unsignedVal, DECIMAL); + 3004b06: fdc42783 lw a5,-36(s0) + 3004b0a: 45a9 li a1,10 + 3004b0c: 853e mv a0,a5 + 3004b0e: 3929 jal ra,3004728 + 3004b10: fca42823 sw a0,-48(s0) + DBG_PutUnsignedNum(unsignedVal, DECIMAL, tmpCnt); + 3004b14: fd042603 lw a2,-48(s0) + 3004b18: 45a9 li a1,10 + 3004b1a: fdc42503 lw a0,-36(s0) + 3004b1e: 398d jal ra,3004790 + cnt += tmpCnt; + 3004b20: fec42703 lw a4,-20(s0) + 3004b24: fd042783 lw a5,-48(s0) + 3004b28: 97ba add a5,a5,a4 + 3004b2a: fef42623 sw a5,-20(s0) + break; + 3004b2e: a041 j 3004bae + case 'x': /* Hexadecimal data. */ + case 'X': + case 'p': /* Address data. */ + hexVal = VA_ARG(*paramList, unsigned int); + 3004b30: fc842783 lw a5,-56(s0) + 3004b34: 439c lw a5,0(a5) + 3004b36: 00478693 addi a3,a5,4 + 3004b3a: fc842703 lw a4,-56(s0) + 3004b3e: c314 sw a3,0(a4) + 3004b40: 439c lw a5,0(a5) + 3004b42: fcf42c23 sw a5,-40(s0) + cnt += DBG_PrintHex(hexVal); + 3004b46: fd842503 lw a0,-40(s0) + 3004b4a: 3b99 jal ra,30048a0 + 3004b4c: 872a mv a4,a0 + 3004b4e: fec42783 lw a5,-20(s0) + 3004b52: 97ba add a5,a5,a4 + 3004b54: fef42623 sw a5,-20(s0) + break; + 3004b58: a899 j 3004bae + case 'f': /* Floating-point data. */ + fltVal = VA_ARG(*paramList, double); + 3004b5a: fc842783 lw a5,-56(s0) + 3004b5e: 439c lw a5,0(a5) + 3004b60: 079d addi a5,a5,7 + 3004b62: 9be1 andi a5,a5,-8 + 3004b64: 00878693 addi a3,a5,8 + 3004b68: fc842703 lw a4,-56(s0) + 3004b6c: c314 sw a3,0(a4) + 3004b6e: 0047a803 lw a6,4(a5) + 3004b72: 439c lw a5,0(a5) + 3004b74: 853e mv a0,a5 + 3004b76: 85c2 mv a1,a6 + 3004b78: 7b0010ef jal ra,3006328 <__truncdfsf2> + 3004b7c: 20a507d3 fmv.s fa5,fa0 + 3004b80: fcf42a27 fsw fa5,-44(s0) + cnt += DBG_PrintFlt(fltVal, 5); /* default precision: 5 */ + 3004b84: 4515 li a0,5 + 3004b86: fd442507 flw fa0,-44(s0) + 3004b8a: 3ba9 jal ra,30048e4 + 3004b8c: 872a mv a4,a0 + 3004b8e: fec42783 lw a5,-20(s0) + 3004b92: 97ba add a5,a5,a4 + 3004b94: fef42623 sw a5,-20(s0) + break; + 3004b98: a819 j 3004bae + default: + DBG_PrintCh(ch); + 3004b9a: fcf40783 lb a5,-49(s0) + 3004b9e: 853e mv a0,a5 + 3004ba0: 3c75 jal ra,300465c + cnt += 1; + 3004ba2: fec42783 lw a5,-20(s0) + 3004ba6: 0785 addi a5,a5,1 + 3004ba8: fef42623 sw a5,-20(s0) + break; + 3004bac: 0001 nop + } + return cnt; + 3004bae: fec42783 lw a5,-20(s0) +} + 3004bb2: 853e mv a0,a5 + 3004bb4: 50f2 lw ra,60(sp) + 3004bb6: 5462 lw s0,56(sp) + 3004bb8: 6121 addi sp,sp,64 + 3004bba: 8082 ret + +03004bbc : + * @param intNum The decimal number to be printed. + * @param fieldWidth Field width. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintIntWithField(int intNum, int fieldWidth) +{ + 3004bbc: 7139 addi sp,sp,-64 + 3004bbe: de06 sw ra,60(sp) + 3004bc0: dc22 sw s0,56(sp) + 3004bc2: 0080 addi s0,sp,64 + 3004bc4: fca42623 sw a0,-52(s0) + 3004bc8: fcb42423 sw a1,-56(s0) + int zeroCnt = 0; + 3004bcc: fc042e23 sw zero,-36(s0) + int digitsCnt = 0; + 3004bd0: fe042623 sw zero,-20(s0) + unsigned int cnt = 0; + 3004bd4: fe042423 sw zero,-24(s0) + + if (intNum == 0) { + 3004bd8: fcc42783 lw a5,-52(s0) + 3004bdc: e791 bnez a5,3004be8 + DBG_PrintCh('0'); + 3004bde: 03000513 li a0,48 + 3004be2: 3cad jal ra,300465c + return 1; + 3004be4: 4785 li a5,1 + 3004be6: a0dd j 3004ccc + } + if (intNum < 0) { + 3004be8: fcc42783 lw a5,-52(s0) + 3004bec: 0607dd63 bgez a5,3004c66 + DBG_PrintCh('-'); /* add symbol */ + 3004bf0: 02d00513 li a0,45 + 3004bf4: 34a5 jal ra,300465c + cnt++; + 3004bf6: fe842783 lw a5,-24(s0) + 3004bfa: 0785 addi a5,a5,1 + 3004bfc: fef42423 sw a5,-24(s0) + intNum = -intNum; + 3004c00: fcc42783 lw a5,-52(s0) + 3004c04: 40f007b3 neg a5,a5 + 3004c08: fcf42623 sw a5,-52(s0) + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 3004c0c: 45a9 li a1,10 + 3004c0e: fcc42503 lw a0,-52(s0) + 3004c12: 3e19 jal ra,3004728 + 3004c14: 87aa mv a5,a0 + 3004c16: fef42623 sw a5,-20(s0) + zeroCnt = fieldWidth - digitsCnt; + 3004c1a: fc842703 lw a4,-56(s0) + 3004c1e: fec42783 lw a5,-20(s0) + 3004c22: 40f707b3 sub a5,a4,a5 + 3004c26: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004c2a: fe042223 sw zero,-28(s0) + 3004c2e: a831 j 3004c4a + DBG_PrintCh('0'); /* add '0' */ + 3004c30: 03000513 li a0,48 + 3004c34: 3425 jal ra,300465c + cnt++; + 3004c36: fe842783 lw a5,-24(s0) + 3004c3a: 0785 addi a5,a5,1 + 3004c3c: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004c40: fe442783 lw a5,-28(s0) + 3004c44: 0785 addi a5,a5,1 + 3004c46: fef42223 sw a5,-28(s0) + 3004c4a: fe442703 lw a4,-28(s0) + 3004c4e: fdc42783 lw a5,-36(s0) + 3004c52: fcf74fe3 blt a4,a5,3004c30 + } + cnt += digitsCnt; + 3004c56: fec42783 lw a5,-20(s0) + 3004c5a: fe842703 lw a4,-24(s0) + 3004c5e: 97ba add a5,a5,a4 + 3004c60: fef42423 sw a5,-24(s0) + 3004c64: a891 j 3004cb8 + } else { + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 3004c66: 45a9 li a1,10 + 3004c68: fcc42503 lw a0,-52(s0) + 3004c6c: 3c75 jal ra,3004728 + 3004c6e: 87aa mv a5,a0 + 3004c70: fef42623 sw a5,-20(s0) + cnt = digitsCnt; + 3004c74: fec42783 lw a5,-20(s0) + 3004c78: fef42423 sw a5,-24(s0) + zeroCnt = fieldWidth - digitsCnt; + 3004c7c: fc842703 lw a4,-56(s0) + 3004c80: fec42783 lw a5,-20(s0) + 3004c84: 40f707b3 sub a5,a4,a5 + 3004c88: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004c8c: fe042023 sw zero,-32(s0) + 3004c90: a831 j 3004cac + DBG_PrintCh('0'); /* add '0' */ + 3004c92: 03000513 li a0,48 + 3004c96: 32d9 jal ra,300465c + cnt++; + 3004c98: fe842783 lw a5,-24(s0) + 3004c9c: 0785 addi a5,a5,1 + 3004c9e: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004ca2: fe042783 lw a5,-32(s0) + 3004ca6: 0785 addi a5,a5,1 + 3004ca8: fef42023 sw a5,-32(s0) + 3004cac: fe042703 lw a4,-32(s0) + 3004cb0: fdc42783 lw a5,-36(s0) + 3004cb4: fcf74fe3 blt a4,a5,3004c92 + } + } + DBG_PutUnsignedNum(intNum, DECIMAL, digitsCnt); + 3004cb8: fcc42783 lw a5,-52(s0) + 3004cbc: fec42703 lw a4,-20(s0) + 3004cc0: 863a mv a2,a4 + 3004cc2: 45a9 li a1,10 + 3004cc4: 853e mv a0,a5 + 3004cc6: 34e9 jal ra,3004790 + return cnt; + 3004cc8: fe842783 lw a5,-24(s0) +} + 3004ccc: 853e mv a0,a5 + 3004cce: 50f2 lw ra,60(sp) + 3004cd0: 5462 lw s0,56(sp) + 3004cd2: 6121 addi sp,sp,64 + 3004cd4: 8082 ret + +03004cd6 : + +static int DBG_Atoi(const char **s) +{ + 3004cd6: 7179 addi sp,sp,-48 + 3004cd8: d622 sw s0,44(sp) + 3004cda: 1800 addi s0,sp,48 + 3004cdc: fca42e23 sw a0,-36(s0) + int i, c; + + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 3004ce0: fe042623 sw zero,-20(s0) + 3004ce4: a02d j 3004d0e + i = i * 10 + c - '0'; /* 10: decimal */ + 3004ce6: fec42703 lw a4,-20(s0) + 3004cea: 47a9 li a5,10 + 3004cec: 02f70733 mul a4,a4,a5 + 3004cf0: fe842783 lw a5,-24(s0) + 3004cf4: 97ba add a5,a5,a4 + 3004cf6: fd078793 addi a5,a5,-48 + 3004cfa: fef42623 sw a5,-20(s0) + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 3004cfe: fdc42783 lw a5,-36(s0) + 3004d02: 439c lw a5,0(a5) + 3004d04: 00178713 addi a4,a5,1 + 3004d08: fdc42783 lw a5,-36(s0) + 3004d0c: c398 sw a4,0(a5) + 3004d0e: fdc42783 lw a5,-36(s0) + 3004d12: 439c lw a5,0(a5) + 3004d14: 00078783 lb a5,0(a5) + 3004d18: fef42423 sw a5,-24(s0) + 3004d1c: fe842703 lw a4,-24(s0) + 3004d20: 02f00793 li a5,47 + 3004d24: 00e7d863 bge a5,a4,3004d34 + 3004d28: fe842703 lw a4,-24(s0) + 3004d2c: 03900793 li a5,57 + 3004d30: fae7dbe3 bge a5,a4,3004ce6 + } + return i; + 3004d34: fec42783 lw a5,-20(s0) +} + 3004d38: 853e mv a0,a5 + 3004d3a: 5432 lw s0,44(sp) + 3004d3c: 6145 addi sp,sp,48 + 3004d3e: 8082 ret + +03004d40 : + * @param ... Variable parameter list. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, return BASE_STATUS_ERROR. + */ +int DBG_UartPrintf(const char *format, ...) +{ + 3004d40: 711d addi sp,sp,-96 + 3004d42: de06 sw ra,60(sp) + 3004d44: dc22 sw s0,56(sp) + 3004d46: 0080 addi s0,sp,64 + 3004d48: fca42623 sw a0,-52(s0) + 3004d4c: c04c sw a1,4(s0) + 3004d4e: c410 sw a2,8(s0) + 3004d50: c454 sw a3,12(s0) + 3004d52: c818 sw a4,16(s0) + 3004d54: c85c sw a5,20(s0) + 3004d56: 01042c23 sw a6,24(s0) + 3004d5a: 01142e23 sw a7,28(s0) + DEBUG_ASSERT_PARAM(format != NULL); + int cnt = 0; + 3004d5e: fe042623 sw zero,-20(s0) + int fieldWidth = 0; + 3004d62: fe042423 sw zero,-24(s0) + int floatPrecision = 0; + 3004d66: fe042223 sw zero,-28(s0) + float fltVal = 0; + 3004d6a: fe042023 sw zero,-32(s0) + int intVal = 0; + 3004d6e: fc042e23 sw zero,-36(s0) + va_list paramList; + VA_START(paramList, format); + 3004d72: 02040793 addi a5,s0,32 + 3004d76: 1791 addi a5,a5,-28 + 3004d78: fcf42c23 sw a5,-40(s0) + + while (*format != '\0') { + 3004d7c: aa09 j 3004e8e + if (*format != '%') { + 3004d7e: fcc42783 lw a5,-52(s0) + 3004d82: 00078703 lb a4,0(a5) + 3004d86: 02500793 li a5,37 + 3004d8a: 00f70e63 beq a4,a5,3004da6 + DBG_PrintCh(*format); + 3004d8e: fcc42783 lw a5,-52(s0) + 3004d92: 00078783 lb a5,0(a5) + 3004d96: 853e mv a0,a5 + 3004d98: 30d1 jal ra,300465c + cnt += 1; + 3004d9a: fec42783 lw a5,-20(s0) + 3004d9e: 0785 addi a5,a5,1 + 3004da0: fef42623 sw a5,-20(s0) + 3004da4: a0c5 j 3004e84 + } else { + format++; + 3004da6: fcc42783 lw a5,-52(s0) + 3004daa: 0785 addi a5,a5,1 + 3004dac: fcf42623 sw a5,-52(s0) + if (*format == '0') { + 3004db0: fcc42783 lw a5,-52(s0) + 3004db4: 00078703 lb a4,0(a5) + 3004db8: 03000793 li a5,48 + 3004dbc: 04f71263 bne a4,a5,3004e00 + format++; + 3004dc0: fcc42783 lw a5,-52(s0) + 3004dc4: 0785 addi a5,a5,1 + 3004dc6: fcf42623 sw a5,-52(s0) + fieldWidth = DBG_Atoi(&format); + 3004dca: fcc40793 addi a5,s0,-52 + 3004dce: 853e mv a0,a5 + 3004dd0: 3719 jal ra,3004cd6 + 3004dd2: fea42423 sw a0,-24(s0) + intVal = VA_ARG(paramList, int); + 3004dd6: fd842783 lw a5,-40(s0) + 3004dda: 00478713 addi a4,a5,4 + 3004dde: fce42c23 sw a4,-40(s0) + 3004de2: 439c lw a5,0(a5) + 3004de4: fcf42e23 sw a5,-36(s0) + cnt += DBG_PrintIntWithField(intVal, fieldWidth); + 3004de8: fe842583 lw a1,-24(s0) + 3004dec: fdc42503 lw a0,-36(s0) + 3004df0: 33f1 jal ra,3004bbc + 3004df2: 872a mv a4,a0 + 3004df4: fec42783 lw a5,-20(s0) + 3004df8: 97ba add a5,a5,a4 + 3004dfa: fef42623 sw a5,-20(s0) + 3004dfe: a059 j 3004e84 + } else if (*format == '.') { + 3004e00: fcc42783 lw a5,-52(s0) + 3004e04: 00078703 lb a4,0(a5) + 3004e08: 02e00793 li a5,46 + 3004e0c: 04f71d63 bne a4,a5,3004e66 + format++; + 3004e10: fcc42783 lw a5,-52(s0) + 3004e14: 0785 addi a5,a5,1 + 3004e16: fcf42623 sw a5,-52(s0) + floatPrecision = DBG_Atoi(&format); + 3004e1a: fcc40793 addi a5,s0,-52 + 3004e1e: 853e mv a0,a5 + 3004e20: 3d5d jal ra,3004cd6 + 3004e22: fea42223 sw a0,-28(s0) + fltVal = VA_ARG(paramList, double); + 3004e26: fd842783 lw a5,-40(s0) + 3004e2a: 079d addi a5,a5,7 + 3004e2c: 9be1 andi a5,a5,-8 + 3004e2e: 00878713 addi a4,a5,8 + 3004e32: fce42c23 sw a4,-40(s0) + 3004e36: 0047a803 lw a6,4(a5) + 3004e3a: 439c lw a5,0(a5) + 3004e3c: 853e mv a0,a5 + 3004e3e: 85c2 mv a1,a6 + 3004e40: 4e8010ef jal ra,3006328 <__truncdfsf2> + 3004e44: 20a507d3 fmv.s fa5,fa0 + 3004e48: fef42027 fsw fa5,-32(s0) + cnt += DBG_PrintFlt(fltVal, floatPrecision); + 3004e4c: fe442783 lw a5,-28(s0) + 3004e50: 853e mv a0,a5 + 3004e52: fe042507 flw fa0,-32(s0) + 3004e56: 3479 jal ra,30048e4 + 3004e58: 872a mv a4,a0 + 3004e5a: fec42783 lw a5,-20(s0) + 3004e5e: 97ba add a5,a5,a4 + 3004e60: fef42623 sw a5,-20(s0) + 3004e64: a005 j 3004e84 + } else { + cnt += ParseSpecifier(*format, ¶mList); + 3004e66: fcc42783 lw a5,-52(s0) + 3004e6a: 00078783 lb a5,0(a5) + 3004e6e: fd840713 addi a4,s0,-40 + 3004e72: 85ba mv a1,a4 + 3004e74: 853e mv a0,a5 + 3004e76: 366d jal ra,3004a20 + 3004e78: 872a mv a4,a0 + 3004e7a: fec42783 lw a5,-20(s0) + 3004e7e: 97ba add a5,a5,a4 + 3004e80: fef42623 sw a5,-20(s0) + } + } + format++; + 3004e84: fcc42783 lw a5,-52(s0) + 3004e88: 0785 addi a5,a5,1 + 3004e8a: fcf42623 sw a5,-52(s0) + while (*format != '\0') { + 3004e8e: fcc42783 lw a5,-52(s0) + 3004e92: 00078783 lb a5,0(a5) + 3004e96: ee0794e3 bnez a5,3004d7e + } + VA_END(paramList); + return cnt; + 3004e9a: fec42783 lw a5,-20(s0) +} + 3004e9e: 853e mv a0,a5 + 3004ea0: 50f2 lw ra,60(sp) + 3004ea2: 5462 lw s0,56(sp) + 3004ea4: 6125 addi sp,sp,96 + 3004ea6: 8082 ret + +03004ea8 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param regValue value of @ref IOCMG_REG. + * @retval None. + */ +static inline void DCL_IOCMG_SetRegValue(IOCMG_REG *iocmgRegx, unsigned int regValue) +{ + 3004ea8: 1101 addi sp,sp,-32 + 3004eaa: ce06 sw ra,28(sp) + 3004eac: cc22 sw s0,24(sp) + 3004eae: 1000 addi s0,sp,32 + 3004eb0: fea42623 sw a0,-20(s0) + 3004eb4: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004eb8: fec42703 lw a4,-20(s0) + 3004ebc: 77c1 lui a5,0xffff0 + 3004ebe: 8f7d and a4,a4,a5 + 3004ec0: 147f07b7 lui a5,0x147f0 + 3004ec4: 00f70a63 beq a4,a5,3004ed8 + 3004ec8: 08b00593 li a1,139 + 3004ecc: 030077b7 lui a5,0x3007 + 3004ed0: 97c78513 addi a0,a5,-1668 # 300697c + 3004ed4: 2df1 jal ra,30055b0 + 3004ed6: a001 j 3004ed6 + iocmgRegx->reg = regValue; + 3004ed8: fec42783 lw a5,-20(s0) + 3004edc: fe842703 lw a4,-24(s0) + 3004ee0: c398 sw a4,0(a5) +} + 3004ee2: 0001 nop + 3004ee4: 40f2 lw ra,28(sp) + 3004ee6: 4462 lw s0,24(sp) + 3004ee8: 6105 addi sp,sp,32 + 3004eea: 8082 ret + +03004eec : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param driveRate value of @ref IOCMG_DriveRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetDriveRate(IOCMG_REG *iocmgRegx, IOCMG_DriveRate driveRate) +{ + 3004eec: 1101 addi sp,sp,-32 + 3004eee: ce06 sw ra,28(sp) + 3004ef0: cc22 sw s0,24(sp) + 3004ef2: 1000 addi s0,sp,32 + 3004ef4: fea42623 sw a0,-20(s0) + 3004ef8: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004efc: fec42703 lw a4,-20(s0) + 3004f00: 77c1 lui a5,0xffff0 + 3004f02: 8f7d and a4,a4,a5 + 3004f04: 147f07b7 lui a5,0x147f0 + 3004f08: 00f70a63 beq a4,a5,3004f1c + 3004f0c: 0ba00593 li a1,186 + 3004f10: 030077b7 lui a5,0x3007 + 3004f14: 97c78513 addi a0,a5,-1668 # 300697c + 3004f18: 2d61 jal ra,30055b0 + 3004f1a: a001 j 3004f1a + IOCMG_PARAM_CHECK_NO_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4); + 3004f1c: fe842703 lw a4,-24(s0) + 3004f20: 478d li a5,3 + 3004f22: 00e7fa63 bgeu a5,a4,3004f36 + 3004f26: 0bb00593 li a1,187 + 3004f2a: 030077b7 lui a5,0x3007 + 3004f2e: 97c78513 addi a0,a5,-1668 # 300697c + 3004f32: 2dbd jal ra,30055b0 + 3004f34: a839 j 3004f52 + iocmgRegx->BIT.ds = driveRate; + 3004f36: fe842783 lw a5,-24(s0) + 3004f3a: 8b8d andi a5,a5,3 + 3004f3c: 0ff7f693 andi a3,a5,255 + 3004f40: fec42703 lw a4,-20(s0) + 3004f44: 431c lw a5,0(a4) + 3004f46: 8a8d andi a3,a3,3 + 3004f48: 0692 slli a3,a3,0x4 + 3004f4a: fcf7f793 andi a5,a5,-49 + 3004f4e: 8fd5 or a5,a5,a3 + 3004f50: c31c sw a5,0(a4) +} + 3004f52: 40f2 lw ra,28(sp) + 3004f54: 4462 lw s0,24(sp) + 3004f56: 6105 addi sp,sp,32 + 3004f58: 8082 ret + +03004f5a : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param pullMode value of @ref IOCMG_PullMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetPullMode(IOCMG_REG *iocmgRegx, IOCMG_PullMode pullMode) +{ + 3004f5a: 1101 addi sp,sp,-32 + 3004f5c: ce06 sw ra,28(sp) + 3004f5e: cc22 sw s0,24(sp) + 3004f60: 1000 addi s0,sp,32 + 3004f62: fea42623 sw a0,-20(s0) + 3004f66: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004f6a: fec42703 lw a4,-20(s0) + 3004f6e: 77c1 lui a5,0xffff0 + 3004f70: 8f7d and a4,a4,a5 + 3004f72: 147f07b7 lui a5,0x147f0 + 3004f76: 00f70a63 beq a4,a5,3004f8a + 3004f7a: 0d200593 li a1,210 + 3004f7e: 030077b7 lui a5,0x3007 + 3004f82: 97c78513 addi a0,a5,-1668 # 300697c + 3004f86: 252d jal ra,30055b0 + 3004f88: a001 j 3004f88 + IOCMG_PARAM_CHECK_NO_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE); + 3004f8a: fe842703 lw a4,-24(s0) + 3004f8e: 478d li a5,3 + 3004f90: 00e7fa63 bgeu a5,a4,3004fa4 + 3004f94: 0d300593 li a1,211 + 3004f98: 030077b7 lui a5,0x3007 + 3004f9c: 97c78513 addi a0,a5,-1668 # 300697c + 3004fa0: 2d01 jal ra,30055b0 + 3004fa2: a835 j 3004fde + iocmgRegx->BIT.pu = (pullMode & 0x02) >> 1; /* 10b: pull up mode */ + 3004fa4: fe842783 lw a5,-24(s0) + 3004fa8: 8385 srli a5,a5,0x1 + 3004faa: 8b85 andi a5,a5,1 + 3004fac: 0ff7f693 andi a3,a5,255 + 3004fb0: fec42703 lw a4,-20(s0) + 3004fb4: 431c lw a5,0(a4) + 3004fb6: 8a85 andi a3,a3,1 + 3004fb8: 06a2 slli a3,a3,0x8 + 3004fba: eff7f793 andi a5,a5,-257 + 3004fbe: 8fd5 or a5,a5,a3 + 3004fc0: c31c sw a5,0(a4) + iocmgRegx->BIT.pd = pullMode & 0x01; /* 01b: pull down mode */ + 3004fc2: fe842783 lw a5,-24(s0) + 3004fc6: 8b85 andi a5,a5,1 + 3004fc8: 0ff7f693 andi a3,a5,255 + 3004fcc: fec42703 lw a4,-20(s0) + 3004fd0: 431c lw a5,0(a4) + 3004fd2: 8a85 andi a3,a3,1 + 3004fd4: 069e slli a3,a3,0x7 + 3004fd6: f7f7f793 andi a5,a5,-129 + 3004fda: 8fd5 or a5,a5,a3 + 3004fdc: c31c sw a5,0(a4) +} + 3004fde: 40f2 lw ra,28(sp) + 3004fe0: 4462 lw s0,24(sp) + 3004fe2: 6105 addi sp,sp,32 + 3004fe4: 8082 ret + +03004fe6 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param levelShiftRate value of @ref IOCMG_LevelShiftRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetLevelShiftRate(IOCMG_REG *iocmgRegx, IOCMG_LevelShiftRate levelShiftRate) +{ + 3004fe6: 1101 addi sp,sp,-32 + 3004fe8: ce06 sw ra,28(sp) + 3004fea: cc22 sw s0,24(sp) + 3004fec: 1000 addi s0,sp,32 + 3004fee: fea42623 sw a0,-20(s0) + 3004ff2: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004ff6: fec42703 lw a4,-20(s0) + 3004ffa: 77c1 lui a5,0xffff0 + 3004ffc: 8f7d and a4,a4,a5 + 3004ffe: 147f07b7 lui a5,0x147f0 + 3005002: 00f70a63 beq a4,a5,3005016 + 3005006: 0ed00593 li a1,237 + 300500a: 030077b7 lui a5,0x3007 + 300500e: 97c78513 addi a0,a5,-1668 # 300697c + 3005012: 2b79 jal ra,30055b0 + 3005014: a001 j 3005014 + IOCMG_PARAM_CHECK_NO_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX && levelShiftRate >= LEVEL_SHIFT_RATE_FAST); + 3005016: fe842703 lw a4,-24(s0) + 300501a: 4785 li a5,1 + 300501c: 00e7fa63 bgeu a5,a4,3005030 + 3005020: 0ee00593 li a1,238 + 3005024: 030077b7 lui a5,0x3007 + 3005028: 97c78513 addi a0,a5,-1668 # 300697c + 300502c: 2351 jal ra,30055b0 + 300502e: a839 j 300504c + iocmgRegx->BIT.sr = levelShiftRate; + 3005030: fe842783 lw a5,-24(s0) + 3005034: 8b85 andi a5,a5,1 + 3005036: 0ff7f693 andi a3,a5,255 + 300503a: fec42703 lw a4,-20(s0) + 300503e: 431c lw a5,0(a4) + 3005040: 8a85 andi a3,a3,1 + 3005042: 06a6 slli a3,a3,0x9 + 3005044: dff7f793 andi a5,a5,-513 + 3005048: 8fd5 or a5,a5,a3 + 300504a: c31c sw a5,0(a4) +} + 300504c: 40f2 lw ra,28(sp) + 300504e: 4462 lw s0,24(sp) + 3005050: 6105 addi sp,sp,32 + 3005052: 8082 ret + +03005054 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param schmidtMode value of @ref IOCMG_SchmidtMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetSchmidtMode(IOCMG_REG *iocmgRegx, IOCMG_SchmidtMode schmidtMode) +{ + 3005054: 1101 addi sp,sp,-32 + 3005056: ce06 sw ra,28(sp) + 3005058: cc22 sw s0,24(sp) + 300505a: 1000 addi s0,sp,32 + 300505c: fea42623 sw a0,-20(s0) + 3005060: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3005064: fec42703 lw a4,-20(s0) + 3005068: 77c1 lui a5,0xffff0 + 300506a: 8f7d and a4,a4,a5 + 300506c: 147f07b7 lui a5,0x147f0 + 3005070: 00f70a63 beq a4,a5,3005084 + 3005074: 10500593 li a1,261 + 3005078: 030077b7 lui a5,0x3007 + 300507c: 97c78513 addi a0,a5,-1668 # 300697c + 3005080: 2b05 jal ra,30055b0 + 3005082: a001 j 3005082 + IOCMG_PARAM_CHECK_NO_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE); + 3005084: fe842703 lw a4,-24(s0) + 3005088: 4785 li a5,1 + 300508a: 00e7fa63 bgeu a5,a4,300509e + 300508e: 10600593 li a1,262 + 3005092: 030077b7 lui a5,0x3007 + 3005096: 97c78513 addi a0,a5,-1668 # 300697c + 300509a: 2b19 jal ra,30055b0 + 300509c: a839 j 30050ba + iocmgRegx->BIT.se = schmidtMode; + 300509e: fe842783 lw a5,-24(s0) + 30050a2: 8b85 andi a5,a5,1 + 30050a4: 0ff7f693 andi a3,a5,255 + 30050a8: fec42703 lw a4,-20(s0) + 30050ac: 431c lw a5,0(a4) + 30050ae: 8a85 andi a3,a3,1 + 30050b0: 06aa slli a3,a3,0xa + 30050b2: bff7f793 andi a5,a5,-1025 + 30050b6: 8fd5 or a5,a5,a3 + 30050b8: c31c sw a5,0(a4) +} + 30050ba: 40f2 lw ra,28(sp) + 30050bc: 4462 lw s0,24(sp) + 30050be: 6105 addi sp,sp,32 + 30050c0: 8082 ret + +030050c2 : + * @brief Get pins iocmg reg address + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_REG iocmg reg address. + */ +static IOCMG_REG* IOCMG_GetRegAddr(unsigned int pinTypedef) +{ + 30050c2: 7179 addi sp,sp,-48 + 30050c4: d622 sw s0,44(sp) + 30050c6: 1800 addi s0,sp,48 + 30050c8: fca42e23 sw a0,-36(s0) + /* decode pin's iocmg reg offset address in base address, and conver value to point address */ + unsigned int iocmgBaseAddrValue = (uintptr_t)IOCMG_BASE; + 30050cc: 147f07b7 lui a5,0x147f0 + 30050d0: fef42623 sw a5,-20(s0) + unsigned int iocmgRegOffsetAddrValue = (pinTypedef >> 16) & 0x00000FFF; /* 16 : shift 16 bit */ + 30050d4: fdc42783 lw a5,-36(s0) + 30050d8: 0107d713 srli a4,a5,0x10 + 30050dc: 6785 lui a5,0x1 + 30050de: 17fd addi a5,a5,-1 # fff + 30050e0: 8ff9 and a5,a5,a4 + 30050e2: fef42423 sw a5,-24(s0) + IOCMG_REG* iocmgRegxAddr = (IOCMG_REG*)(void*)(iocmgBaseAddrValue + iocmgRegOffsetAddrValue); + 30050e6: fec42703 lw a4,-20(s0) + 30050ea: fe842783 lw a5,-24(s0) + 30050ee: 97ba add a5,a5,a4 + 30050f0: fef42223 sw a5,-28(s0) + if (!IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegxAddr & IOCMG_BASE_ADDR_MASK))) { + 30050f4: fe442703 lw a4,-28(s0) + 30050f8: 77c1 lui a5,0xffff0 + 30050fa: 8f7d and a4,a4,a5 + 30050fc: 147f07b7 lui a5,0x147f0 + 3005100: 00f70463 beq a4,a5,3005108 + return NULL; + 3005104: 4781 li a5,0 + 3005106: a019 j 300510c + } + return iocmgRegxAddr; + 3005108: fe442783 lw a5,-28(s0) +} + 300510c: 853e mv a0,a5 + 300510e: 5432 lw s0,44(sp) + 3005110: 6145 addi sp,sp,48 + 3005112: 8082 ret + +03005114 : + * @brief Set pins as function mode + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinAltFuncMode(unsigned int pinTypedef) +{ + 3005114: 7179 addi sp,sp,-48 + 3005116: d606 sw ra,44(sp) + 3005118: d422 sw s0,40(sp) + 300511a: 1800 addi s0,sp,48 + 300511c: fca42e23 sw a0,-36(s0) + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3005120: fdc42503 lw a0,-36(s0) + 3005124: 3f79 jal ra,30050c2 + 3005126: fea42623 sw a0,-20(s0) + /* get iocmg reg default value */ + unsigned int regValue = pinTypedef & IOCMG_REG_VALUE_MASK; + 300512a: fdc42703 lw a4,-36(s0) + 300512e: 67c1 lui a5,0x10 + 3005130: 17fd addi a5,a5,-1 # ffff + 3005132: 8ff9 and a5,a5,a4 + 3005134: fef42423 sw a5,-24(s0) + DCL_IOCMG_SetRegValue(iocmgRegx, regValue); + 3005138: fe842583 lw a1,-24(s0) + 300513c: fec42503 lw a0,-20(s0) + 3005140: 33a5 jal ra,3004ea8 + return IOCMG_STATUS_OK; + 3005142: 4781 li a5,0 +} + 3005144: 853e mv a0,a5 + 3005146: 50b2 lw ra,44(sp) + 3005148: 5422 lw s0,40(sp) + 300514a: 6145 addi sp,sp,48 + 300514c: 8082 ret + +0300514e : + * @param pinTypedef the pin type defined in iomap.h + * @param pullMode function define as @ref IOCMG_PullMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinPullMode(unsigned int pinTypedef, IOCMG_PullMode pullMode) +{ + 300514e: 7179 addi sp,sp,-48 + 3005150: d606 sw ra,44(sp) + 3005152: d422 sw s0,40(sp) + 3005154: 1800 addi s0,sp,48 + 3005156: fca42e23 sw a0,-36(s0) + 300515a: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE, IOCMG_PARAM_ERROR); + 300515e: fd842703 lw a4,-40(s0) + 3005162: 478d li a5,3 + 3005164: 00e7fb63 bgeu a5,a4,300517a + 3005168: 07800593 li a1,120 + 300516c: 030077b7 lui a5,0x3007 + 3005170: 99c78513 addi a0,a5,-1636 # 300699c + 3005174: 2935 jal ra,30055b0 + 3005176: 4791 li a5,4 + 3005178: a821 j 3005190 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 300517a: fdc42503 lw a0,-36(s0) + 300517e: 3791 jal ra,30050c2 + 3005180: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetPullMode(iocmgRegx, pullMode); + 3005184: fd842583 lw a1,-40(s0) + 3005188: fec42503 lw a0,-20(s0) + 300518c: 33f9 jal ra,3004f5a + return IOCMG_STATUS_OK; + 300518e: 4781 li a5,0 +} + 3005190: 853e mv a0,a5 + 3005192: 50b2 lw ra,44(sp) + 3005194: 5422 lw s0,40(sp) + 3005196: 6145 addi sp,sp,48 + 3005198: 8082 ret + +0300519a : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinSchmidtMode(unsigned int pinTypedef, IOCMG_SchmidtMode schmidtMode) +{ + 300519a: 7179 addi sp,sp,-48 + 300519c: d606 sw ra,44(sp) + 300519e: d422 sw s0,40(sp) + 30051a0: 1800 addi s0,sp,48 + 30051a2: fca42e23 sw a0,-36(s0) + 30051a6: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE, IOCMG_PARAM_ERROR); + 30051aa: fd842703 lw a4,-40(s0) + 30051ae: 4785 li a5,1 + 30051b0: 00e7fb63 bgeu a5,a4,30051c6 + 30051b4: 09300593 li a1,147 + 30051b8: 030077b7 lui a5,0x3007 + 30051bc: 99c78513 addi a0,a5,-1636 # 300699c + 30051c0: 2ec5 jal ra,30055b0 + 30051c2: 4791 li a5,4 + 30051c4: a821 j 30051dc + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 30051c6: fdc42503 lw a0,-36(s0) + 30051ca: 3de5 jal ra,30050c2 + 30051cc: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetSchmidtMode(iocmgRegx, schmidtMode); + 30051d0: fd842583 lw a1,-40(s0) + 30051d4: fec42503 lw a0,-20(s0) + 30051d8: 3db5 jal ra,3005054 + return IOCMG_STATUS_OK; + 30051da: 4781 li a5,0 +} + 30051dc: 853e mv a0,a5 + 30051de: 50b2 lw ra,44(sp) + 30051e0: 5422 lw s0,40(sp) + 30051e2: 6145 addi sp,sp,48 + 30051e4: 8082 ret + +030051e6 : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinLevelShiftRate(unsigned int pinTypedef, IOCMG_LevelShiftRate levelShiftRate) +{ + 30051e6: 7179 addi sp,sp,-48 + 30051e8: d606 sw ra,44(sp) + 30051ea: d422 sw s0,40(sp) + 30051ec: 1800 addi s0,sp,48 + 30051ee: fca42e23 sw a0,-36(s0) + 30051f2: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX, IOCMG_PARAM_ERROR); + 30051f6: fd842703 lw a4,-40(s0) + 30051fa: 4785 li a5,1 + 30051fc: 00e7fb63 bgeu a5,a4,3005212 + 3005200: 0ae00593 li a1,174 + 3005204: 030077b7 lui a5,0x3007 + 3005208: 99c78513 addi a0,a5,-1636 # 300699c + 300520c: 2655 jal ra,30055b0 + 300520e: 4791 li a5,4 + 3005210: a821 j 3005228 + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate >= LEVEL_SHIFT_RATE_FAST, IOCMG_PARAM_ERROR); + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3005212: fdc42503 lw a0,-36(s0) + 3005216: 3575 jal ra,30050c2 + 3005218: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetLevelShiftRate(iocmgRegx, levelShiftRate); + 300521c: fd842583 lw a1,-40(s0) + 3005220: fec42503 lw a0,-20(s0) + 3005224: 33c9 jal ra,3004fe6 + return IOCMG_STATUS_OK; + 3005226: 4781 li a5,0 +} + 3005228: 853e mv a0,a5 + 300522a: 50b2 lw ra,44(sp) + 300522c: 5422 lw s0,40(sp) + 300522e: 6145 addi sp,sp,48 + 3005230: 8082 ret + +03005232 : + * @param pinTypedef the pin type defined in iomap.h + * @param driveRate function define as @ref IOCMG_DriveRate + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinDriveRate(unsigned int pinTypedef, IOCMG_DriveRate driveRate) +{ + 3005232: 7179 addi sp,sp,-48 + 3005234: d606 sw ra,44(sp) + 3005236: d422 sw s0,40(sp) + 3005238: 1800 addi s0,sp,48 + 300523a: fca42e23 sw a0,-36(s0) + 300523e: fcb42c23 sw a1,-40(s0) + /* get iocmg reg address */ + IOCMG_PARAM_CHECK_WITH_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4, IOCMG_PARAM_ERROR); + 3005242: fd842703 lw a4,-40(s0) + 3005246: 478d li a5,3 + 3005248: 00e7fb63 bgeu a5,a4,300525e + 300524c: 0cb00593 li a1,203 + 3005250: 030077b7 lui a5,0x3007 + 3005254: 99c78513 addi a0,a5,-1636 # 300699c + 3005258: 2ea1 jal ra,30055b0 + 300525a: 4791 li a5,4 + 300525c: a821 j 3005274 + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 300525e: fdc42503 lw a0,-36(s0) + 3005262: 3585 jal ra,30050c2 + 3005264: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetDriveRate(iocmgRegx, driveRate); + 3005268: fd842583 lw a1,-40(s0) + 300526c: fec42503 lw a0,-20(s0) + 3005270: 39b5 jal ra,3004eec + return IOCMG_STATUS_OK; + 3005272: 4781 li a5,0 +} + 3005274: 853e mv a0,a5 + 3005276: 50b2 lw ra,44(sp) + 3005278: 5422 lw s0,40(sp) + 300527a: 6145 addi sp,sp,48 + 300527c: 8082 ret + +0300527e : + * @param mode Timer Mode, @ref TIMER_Mode + * @retval true + * @retval false + */ +static inline bool IsTimerMode(TIMER_Mode mode) +{ + 300527e: 1101 addi sp,sp,-32 + 3005280: ce22 sw s0,28(sp) + 3005282: 1000 addi s0,sp,32 + 3005284: fea42623 sw a0,-20(s0) + return (((mode) == TIMER_MODE_RUN_FREE) || + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3005288: fec42783 lw a5,-20(s0) + 300528c: cb99 beqz a5,30052a2 + return (((mode) == TIMER_MODE_RUN_FREE) || + 300528e: fec42703 lw a4,-20(s0) + 3005292: 4785 li a5,1 + 3005294: 00f70763 beq a4,a5,30052a2 + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3005298: fec42703 lw a4,-20(s0) + 300529c: 4789 li a5,2 + 300529e: 00f71463 bne a4,a5,30052a6 + 30052a2: 4785 li a5,1 + 30052a4: a011 j 30052a8 + 30052a6: 4781 li a5,0 + 30052a8: 8b85 andi a5,a5,1 + 30052aa: 9f81 uxtb a5 + ((mode) == TIMER_MODE_RUN_ONTSHOT)); +} + 30052ac: 853e mv a0,a5 + 30052ae: 4472 lw s0,28(sp) + 30052b0: 6105 addi sp,sp,32 + 30052b2: 8082 ret + +030052b4 : + * @param mode Timer Interrupt Type, @ref TIMER_InterruptType + * @retval true + * @retval false + */ +static inline bool IsTimerInterruptType(TIMER_InterruptType interruptType) +{ + 30052b4: 1101 addi sp,sp,-32 + 30052b6: ce22 sw s0,28(sp) + 30052b8: 1000 addi s0,sp,32 + 30052ba: fea42623 sw a0,-20(s0) + return (((interruptType) == TIMER_PERIOD_FIN) || + 30052be: fec42783 lw a5,-20(s0) + 30052c2: c791 beqz a5,30052ce + 30052c4: fec42703 lw a4,-20(s0) + 30052c8: 4785 li a5,1 + 30052ca: 00f71463 bne a4,a5,30052d2 + 30052ce: 4785 li a5,1 + 30052d0: a011 j 30052d4 + 30052d2: 4781 li a5,0 + 30052d4: 8b85 andi a5,a5,1 + 30052d6: 9f81 uxtb a5 + ((interruptType) == TIMER_OVER_FLOW)); +} + 30052d8: 853e mv a0,a5 + 30052da: 4472 lw s0,28(sp) + 30052dc: 6105 addi sp,sp,32 + 30052de: 8082 ret + +030052e0 : + * @param size Timer Size, @ref TIMER_Size + * @retval true + * @retval false + */ +static inline bool IsTimerSize(TIMER_Size size) +{ + 30052e0: 1101 addi sp,sp,-32 + 30052e2: ce22 sw s0,28(sp) + 30052e4: 1000 addi s0,sp,32 + 30052e6: fea42623 sw a0,-20(s0) + return (((size) == TIMER_SIZE_16BIT) || + 30052ea: fec42783 lw a5,-20(s0) + 30052ee: c791 beqz a5,30052fa + 30052f0: fec42703 lw a4,-20(s0) + 30052f4: 4785 li a5,1 + 30052f6: 00f71463 bne a4,a5,30052fe + 30052fa: 4785 li a5,1 + 30052fc: a011 j 3005300 + 30052fe: 4781 li a5,0 + 3005300: 8b85 andi a5,a5,1 + 3005302: 9f81 uxtb a5 + ((size) == TIMER_SIZE_32BIT)); +} + 3005304: 853e mv a0,a5 + 3005306: 4472 lw s0,28(sp) + 3005308: 6105 addi sp,sp,32 + 300530a: 8082 ret + +0300530c : + * @param period + * @retval true + * @retval false + */ +static inline bool IsTimerPeriod(unsigned int period) +{ + 300530c: 1101 addi sp,sp,-32 + 300530e: ce22 sw s0,28(sp) + 3005310: 1000 addi s0,sp,32 + 3005312: fea42623 sw a0,-20(s0) + return ((period) >= PERIOD_MIN_VALUE); + 3005316: fec42783 lw a5,-20(s0) + 300531a: 00f037b3 snez a5,a5 + 300531e: 9f81 uxtb a5 +} + 3005320: 853e mv a0,a5 + 3005322: 4472 lw s0,28(sp) + 3005324: 6105 addi sp,sp,32 + 3005326: 8082 ret + +03005328 : + * @param div @see TIMER_PrescalerFactor + * @retval true + * @retval false + */ +static inline bool IsTimerDiv(TIMER_PrescalerFactor div) +{ + 3005328: 1101 addi sp,sp,-32 + 300532a: ce22 sw s0,28(sp) + 300532c: 1000 addi s0,sp,32 + 300532e: fea42623 sw a0,-20(s0) + return (((div) == TIMERPRESCALER_NO_DIV) || + ((div) == TIMERPRESCALER_DIV_16) || + 3005332: fec42783 lw a5,-20(s0) + 3005336: cb99 beqz a5,300534c + return (((div) == TIMERPRESCALER_NO_DIV) || + 3005338: fec42703 lw a4,-20(s0) + 300533c: 4785 li a5,1 + 300533e: 00f70763 beq a4,a5,300534c + ((div) == TIMERPRESCALER_DIV_16) || + 3005342: fec42703 lw a4,-20(s0) + 3005346: 4789 li a5,2 + 3005348: 00f71463 bne a4,a5,3005350 + 300534c: 4785 li a5,1 + 300534e: a011 j 3005352 + 3005350: 4781 li a5,0 + 3005352: 8b85 andi a5,a5,1 + 3005354: 9f81 uxtb a5 + ((div) == TIMERPRESCALER_DIV_256)); +} + 3005356: 853e mv a0,a5 + 3005358: 4472 lw s0,28(sp) + 300535a: 6105 addi sp,sp,32 + 300535c: 8082 ret + +0300535e : + * @param handle Timer Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR parameter check fail + */ +BASE_StatusType HAL_TIMER_Init(TIMER_Handle *handle) +{ + 300535e: 1101 addi sp,sp,-32 + 3005360: ce06 sw ra,28(sp) + 3005362: cc22 sw s0,24(sp) + 3005364: 1000 addi s0,sp,32 + 3005366: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 300536a: fec42783 lw a5,-20(s0) + 300536e: eb89 bnez a5,3005380 + 3005370: 02800593 li a1,40 + 3005374: 030077b7 lui a5,0x3007 + 3005378: 9dc78513 addi a0,a5,-1572 # 30069dc + 300537c: 2c15 jal ra,30055b0 + 300537e: a001 j 300537e + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 3005380: fec42783 lw a5,-20(s0) + 3005384: 4398 lw a4,0(a5) + 3005386: 143007b7 lui a5,0x14300 + 300538a: 02f70f63 beq a4,a5,30053c8 + 300538e: fec42783 lw a5,-20(s0) + 3005392: 4398 lw a4,0(a5) + 3005394: 143017b7 lui a5,0x14301 + 3005398: 02f70863 beq a4,a5,30053c8 + 300539c: fec42783 lw a5,-20(s0) + 30053a0: 4398 lw a4,0(a5) + 30053a2: 143027b7 lui a5,0x14302 + 30053a6: 02f70163 beq a4,a5,30053c8 + 30053aa: fec42783 lw a5,-20(s0) + 30053ae: 4398 lw a4,0(a5) + 30053b0: 143037b7 lui a5,0x14303 + 30053b4: 00f70a63 beq a4,a5,30053c8 + 30053b8: 02900593 li a1,41 + 30053bc: 030077b7 lui a5,0x3007 + 30053c0: 9dc78513 addi a0,a5,-1572 # 30069dc + 30053c4: 22f5 jal ra,30055b0 + 30053c6: a001 j 30053c6 + + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->load), BASE_STATUS_ERROR); + 30053c8: fec42783 lw a5,-20(s0) + 30053cc: 4bdc lw a5,20(a5) + 30053ce: 853e mv a0,a5 + 30053d0: 3f35 jal ra,300530c + 30053d2: 87aa mv a5,a0 + 30053d4: 0017c793 xori a5,a5,1 + 30053d8: 9f81 uxtb a5 + 30053da: cb91 beqz a5,30053ee + 30053dc: 02b00593 li a1,43 + 30053e0: 030077b7 lui a5,0x3007 + 30053e4: 9dc78513 addi a0,a5,-1572 # 30069dc + 30053e8: 22e1 jal ra,30055b0 + 30053ea: 4785 li a5,1 + 30053ec: aa6d j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->bgLoad), BASE_STATUS_ERROR); + 30053ee: fec42783 lw a5,-20(s0) + 30053f2: 4f9c lw a5,24(a5) + 30053f4: 853e mv a0,a5 + 30053f6: 3f19 jal ra,300530c + 30053f8: 87aa mv a5,a0 + 30053fa: 0017c793 xori a5,a5,1 + 30053fe: 9f81 uxtb a5 + 3005400: cb91 beqz a5,3005414 + 3005402: 02c00593 li a1,44 + 3005406: 030077b7 lui a5,0x3007 + 300540a: 9dc78513 addi a0,a5,-1572 # 30069dc + 300540e: 224d jal ra,30055b0 + 3005410: 4785 li a5,1 + 3005412: aa51 j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerMode(handle->mode), BASE_STATUS_ERROR); + 3005414: fec42783 lw a5,-20(s0) + 3005418: 479c lw a5,8(a5) + 300541a: 853e mv a0,a5 + 300541c: 358d jal ra,300527e + 300541e: 87aa mv a5,a0 + 3005420: 0017c793 xori a5,a5,1 + 3005424: 9f81 uxtb a5 + 3005426: cb91 beqz a5,300543a + 3005428: 02d00593 li a1,45 + 300542c: 030077b7 lui a5,0x3007 + 3005430: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005434: 2ab5 jal ra,30055b0 + 3005436: 4785 li a5,1 + 3005438: a2bd j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerSize(handle->size), BASE_STATUS_ERROR); + 300543a: fec42783 lw a5,-20(s0) + 300543e: 4b9c lw a5,16(a5) + 3005440: 853e mv a0,a5 + 3005442: 3d79 jal ra,30052e0 + 3005444: 87aa mv a5,a0 + 3005446: 0017c793 xori a5,a5,1 + 300544a: 9f81 uxtb a5 + 300544c: cb91 beqz a5,3005460 + 300544e: 02e00593 li a1,46 + 3005452: 030077b7 lui a5,0x3007 + 3005456: 9dc78513 addi a0,a5,-1572 # 30069dc + 300545a: 2a99 jal ra,30055b0 + 300545c: 4785 li a5,1 + 300545e: a2a1 j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerDiv(handle->prescaler), BASE_STATUS_ERROR); + 3005460: fec42783 lw a5,-20(s0) + 3005464: 47dc lw a5,12(a5) + 3005466: 853e mv a0,a5 + 3005468: 35c1 jal ra,3005328 + 300546a: 87aa mv a5,a0 + 300546c: 0017c793 xori a5,a5,1 + 3005470: 9f81 uxtb a5 + 3005472: cb91 beqz a5,3005486 + 3005474: 02f00593 li a1,47 + 3005478: 030077b7 lui a5,0x3007 + 300547c: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005480: 2a05 jal ra,30055b0 + 3005482: 4785 li a5,1 + 3005484: a20d j 30055a6 + + /* Initialize the configuration parameters of the timer */ + handle->baseAddress->timer_intclr = BASE_CFG_SET; /* Writing to this register clears interrupt output of timer */ + 3005486: fec42783 lw a5,-20(s0) + 300548a: 439c lw a5,0(a5) + 300548c: 4705 li a4,1 + 300548e: c7d8 sw a4,12(a5) + handle->baseAddress->timer_load = handle->load; + 3005490: fec42783 lw a5,-20(s0) + 3005494: 439c lw a5,0(a5) + 3005496: fec42703 lw a4,-20(s0) + 300549a: 4b58 lw a4,20(a4) + 300549c: c398 sw a4,0(a5) + handle->baseAddress->timerbgload = handle->bgLoad; + 300549e: fec42783 lw a5,-20(s0) + 30054a2: 439c lw a5,0(a5) + 30054a4: fec42703 lw a4,-20(s0) + 30054a8: 4f18 lw a4,24(a4) + 30054aa: cf98 sw a4,24(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_DISABLE; + 30054ac: fec42783 lw a5,-20(s0) + 30054b0: 4398 lw a4,0(a5) + 30054b2: 471c lw a5,8(a4) + 30054b4: f7f7f793 andi a5,a5,-129 + 30054b8: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timerintenable = handle->interruptEn; + 30054ba: fec42783 lw a5,-20(s0) + 30054be: 4398 lw a4,0(a5) + 30054c0: fec42783 lw a5,-20(s0) + 30054c4: 2fd4 lbu a3,28(a5) + 30054c6: 471c lw a5,8(a4) + 30054c8: 8a85 andi a3,a3,1 + 30054ca: 0696 slli a3,a3,0x5 + 30054cc: fdf7f793 andi a5,a5,-33 + 30054d0: 8fd5 or a5,a5,a3 + 30054d2: c71c sw a5,8(a4) + + /* Sets the frequency divider and size of the timer module. */ + handle->baseAddress->TIMERx_CONTROL.BIT.timerpre = handle->prescaler; + 30054d4: fec42783 lw a5,-20(s0) + 30054d8: 47d4 lw a3,12(a5) + 30054da: fec42783 lw a5,-20(s0) + 30054de: 4398 lw a4,0(a5) + 30054e0: 87b6 mv a5,a3 + 30054e2: 8b8d andi a5,a5,3 + 30054e4: 0ff7f693 andi a3,a5,255 + 30054e8: 471c lw a5,8(a4) + 30054ea: 8a8d andi a3,a3,3 + 30054ec: 068a slli a3,a3,0x2 + 30054ee: 9bcd andi a5,a5,-13 + 30054f0: 8fd5 or a5,a5,a3 + 30054f2: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timersize = handle->size; + 30054f4: fec42783 lw a5,-20(s0) + 30054f8: 4b94 lw a3,16(a5) + 30054fa: fec42783 lw a5,-20(s0) + 30054fe: 4398 lw a4,0(a5) + 3005500: 87b6 mv a5,a3 + 3005502: 8b85 andi a5,a5,1 + 3005504: 0ff7f693 andi a3,a5,255 + 3005508: 471c lw a5,8(a4) + 300550a: 8a85 andi a3,a3,1 + 300550c: 0686 slli a3,a3,0x1 + 300550e: 9bf5 andi a5,a5,-3 + 3005510: 8fd5 or a5,a5,a3 + 3005512: c71c sw a5,8(a4) + + /* Sets the running mode of the timer. */ + if (handle->mode == TIMER_MODE_RUN_ONTSHOT) { + 3005514: fec42783 lw a5,-20(s0) + 3005518: 4798 lw a4,8(a5) + 300551a: 4789 li a5,2 + 300551c: 00f71a63 bne a4,a5,3005530 + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_SET; + 3005520: fec42783 lw a5,-20(s0) + 3005524: 4398 lw a4,0(a5) + 3005526: 471c lw a5,8(a4) + 3005528: 0017e793 ori a5,a5,1 + 300552c: c71c sw a5,8(a4) + 300552e: a805 j 300555e + } else { + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_UNSET; + 3005530: fec42783 lw a5,-20(s0) + 3005534: 4398 lw a4,0(a5) + 3005536: 471c lw a5,8(a4) + 3005538: 9bf9 andi a5,a5,-2 + 300553a: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 300553c: fec42783 lw a5,-20(s0) + 3005540: 479c lw a5,8(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005542: fec42703 lw a4,-20(s0) + 3005546: 4318 lw a4,0(a4) + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005548: 00f037b3 snez a5,a5 + 300554c: 0ff7f693 andi a3,a5,255 + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005550: 471c lw a5,8(a4) + 3005552: 8a85 andi a3,a3,1 + 3005554: 069a slli a3,a3,0x6 + 3005556: fbf7f793 andi a5,a5,-65 + 300555a: 8fd5 or a5,a5,a3 + 300555c: c71c sw a5,8(a4) + } + + /* Request for setting the DMA and ADC. */ + handle->baseAddress->TIMERx_CONTROLB.BIT.dmasreqen = handle->dmaReqEnable; + 300555e: fec42783 lw a5,-20(s0) + 3005562: 4398 lw a4,0(a5) + 3005564: fec42783 lw a5,-20(s0) + 3005568: 2ff4 lbu a3,30(a5) + 300556a: 4f5c lw a5,28(a4) + 300556c: 8a85 andi a3,a3,1 + 300556e: 0686 slli a3,a3,0x1 + 3005570: 9bf5 andi a5,a5,-3 + 3005572: 8fd5 or a5,a5,a3 + 3005574: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.dmabreqen = handle->dmaReqEnable; + 3005576: fec42783 lw a5,-20(s0) + 300557a: 4398 lw a4,0(a5) + 300557c: fec42783 lw a5,-20(s0) + 3005580: 2ff4 lbu a3,30(a5) + 3005582: 4f5c lw a5,28(a4) + 3005584: 8a85 andi a3,a3,1 + 3005586: 9bf9 andi a5,a5,-2 + 3005588: 8fd5 or a5,a5,a3 + 300558a: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.socen = handle->adcSocReqEnable; + 300558c: fec42783 lw a5,-20(s0) + 3005590: 4398 lw a4,0(a5) + 3005592: fec42783 lw a5,-20(s0) + 3005596: 3fd4 lbu a3,29(a5) + 3005598: 4f5c lw a5,28(a4) + 300559a: 8a85 andi a3,a3,1 + 300559c: 068a slli a3,a3,0x2 + 300559e: 9bed andi a5,a5,-5 + 30055a0: 8fd5 or a5,a5,a3 + 30055a2: cf5c sw a5,28(a4) + return BASE_STATUS_OK; + 30055a4: 4781 li a5,0 +} + 30055a6: 853e mv a0,a5 + 30055a8: 40f2 lw ra,28(sp) + 30055aa: 4462 lw s0,24(sp) + 30055ac: 6105 addi sp,sp,32 + 30055ae: 8082 ret + +030055b0 : + 30055b0: c37fc06f j 30021e6 + +030055b4 : + * @brief Start timer. + * @param handle Timer Handle + * @retval None + */ +void HAL_TIMER_Start(TIMER_Handle *handle) +{ + 30055b4: 1101 addi sp,sp,-32 + 30055b6: ce06 sw ra,28(sp) + 30055b8: cc22 sw s0,24(sp) + 30055ba: 1000 addi s0,sp,32 + 30055bc: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 30055c0: fec42783 lw a5,-20(s0) + 30055c4: eb89 bnez a5,30055d6 + 30055c6: 0bc00593 li a1,188 + 30055ca: 030077b7 lui a5,0x3007 + 30055ce: 9dc78513 addi a0,a5,-1572 # 30069dc + 30055d2: 3ff9 jal ra,30055b0 + 30055d4: a001 j 30055d4 + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 30055d6: fec42783 lw a5,-20(s0) + 30055da: 4398 lw a4,0(a5) + 30055dc: 143007b7 lui a5,0x14300 + 30055e0: 02f70f63 beq a4,a5,300561e + 30055e4: fec42783 lw a5,-20(s0) + 30055e8: 4398 lw a4,0(a5) + 30055ea: 143017b7 lui a5,0x14301 + 30055ee: 02f70863 beq a4,a5,300561e + 30055f2: fec42783 lw a5,-20(s0) + 30055f6: 4398 lw a4,0(a5) + 30055f8: 143027b7 lui a5,0x14302 + 30055fc: 02f70163 beq a4,a5,300561e + 3005600: fec42783 lw a5,-20(s0) + 3005604: 4398 lw a4,0(a5) + 3005606: 143037b7 lui a5,0x14303 + 300560a: 00f70a63 beq a4,a5,300561e + 300560e: 0bd00593 li a1,189 + 3005612: 030077b7 lui a5,0x3007 + 3005616: 9dc78513 addi a0,a5,-1572 # 30069dc + 300561a: 3f59 jal ra,30055b0 + 300561c: a001 j 300561c + /* Enable timer */ + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_SET; + 300561e: fec42783 lw a5,-20(s0) + 3005622: 4398 lw a4,0(a5) + 3005624: 471c lw a5,8(a4) + 3005626: 0807e793 ori a5,a5,128 + 300562a: c71c sw a5,8(a4) +} + 300562c: 0001 nop + 300562e: 40f2 lw ra,28(sp) + 3005630: 4462 lw s0,24(sp) + 3005632: 6105 addi sp,sp,32 + 3005634: 8082 ret + +03005636 : + * @brief GPT Interrupt service processing function. + * @param handle TIMER Handle + * @retval None + */ +void HAL_TIMER_IrqHandler(void *handle) +{ + 3005636: 7179 addi sp,sp,-48 + 3005638: d606 sw ra,44(sp) + 300563a: d422 sw s0,40(sp) + 300563c: 1800 addi s0,sp,48 + 300563e: fca42e23 sw a0,-36(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005642: fdc42783 lw a5,-36(s0) + 3005646: eb89 bnez a5,3005658 + 3005648: 0d800593 li a1,216 + 300564c: 030077b7 lui a5,0x3007 + 3005650: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005654: 3fb1 jal ra,30055b0 + 3005656: a001 j 3005656 + TIMER_Handle *timerHandle = (TIMER_Handle *)handle; + 3005658: fdc42783 lw a5,-36(s0) + 300565c: fef42623 sw a5,-20(s0) + TIMER_ASSERT_PARAM(IsTIMERInstance(timerHandle->baseAddress)); + 3005660: fec42783 lw a5,-20(s0) + 3005664: 4398 lw a4,0(a5) + 3005666: 143007b7 lui a5,0x14300 + 300566a: 02f70f63 beq a4,a5,30056a8 + 300566e: fec42783 lw a5,-20(s0) + 3005672: 4398 lw a4,0(a5) + 3005674: 143017b7 lui a5,0x14301 + 3005678: 02f70863 beq a4,a5,30056a8 + 300567c: fec42783 lw a5,-20(s0) + 3005680: 4398 lw a4,0(a5) + 3005682: 143027b7 lui a5,0x14302 + 3005686: 02f70163 beq a4,a5,30056a8 + 300568a: fec42783 lw a5,-20(s0) + 300568e: 4398 lw a4,0(a5) + 3005690: 143037b7 lui a5,0x14303 + 3005694: 00f70a63 beq a4,a5,30056a8 + 3005698: 0da00593 li a1,218 + 300569c: 030077b7 lui a5,0x3007 + 30056a0: 9dc78513 addi a0,a5,-1572 # 30069dc + 30056a4: 3731 jal ra,30055b0 + 30056a6: a001 j 30056a6 + /* Check interrupt type */ + if (timerHandle->baseAddress->TIMERx_MIS.dmaovmis == BASE_CFG_ENABLE) { + 30056a8: fec42783 lw a5,-20(s0) + 30056ac: 439c lw a5,0(a5) + 30056ae: 4bdc lw a5,20(a5) + 30056b0: 8385 srli a5,a5,0x1 + 30056b2: 8b85 andi a5,a5,1 + 30056b4: 0ff7f713 andi a4,a5,255 + 30056b8: 4785 li a5,1 + 30056ba: 02f71363 bne a4,a5,30056e0 + /* DMA overflow interrupt */ + timerHandle->baseAddress->DMAOV_INTCLR.BIT.dmaov_intclr = BASE_CFG_ENABLE; + 30056be: fec42783 lw a5,-20(s0) + 30056c2: 4398 lw a4,0(a5) + 30056c4: 531c lw a5,32(a4) + 30056c6: 0017e793 ori a5,a5,1 + 30056ca: d31c sw a5,32(a4) + /* Call the timer DMA request overflow callback function of the user. */ + if (timerHandle->userCallBack.TimerOverFlowCallBack != NULL) { + 30056cc: fec42783 lw a5,-20(s0) + 30056d0: 53dc lw a5,36(a5) + 30056d2: c799 beqz a5,30056e0 + timerHandle->userCallBack.TimerOverFlowCallBack(timerHandle); + 30056d4: fec42783 lw a5,-20(s0) + 30056d8: 53dc lw a5,36(a5) + 30056da: fec42503 lw a0,-20(s0) + 30056de: 9782 jalr a5 + } + } + if (timerHandle->baseAddress->TIMERx_MIS.timermis == BASE_CFG_ENABLE) { + 30056e0: fec42783 lw a5,-20(s0) + 30056e4: 439c lw a5,0(a5) + 30056e6: 4bdc lw a5,20(a5) + 30056e8: 8b85 andi a5,a5,1 + 30056ea: 0ff7f713 andi a4,a5,255 + 30056ee: 4785 li a5,1 + 30056f0: 02f71263 bne a4,a5,3005714 + /* TIMER Interrupt */ + timerHandle->baseAddress->timer_intclr = BASE_CFG_ENABLE; + 30056f4: fec42783 lw a5,-20(s0) + 30056f8: 439c lw a5,0(a5) + 30056fa: 4705 li a4,1 + 30056fc: c7d8 sw a4,12(a5) + /* Call the period finish callback function of the user. */ + if (timerHandle->userCallBack.TimerPeriodFinCallBack != NULL) { + 30056fe: fec42783 lw a5,-20(s0) + 3005702: 539c lw a5,32(a5) + 3005704: cb81 beqz a5,3005714 + timerHandle->userCallBack.TimerPeriodFinCallBack(timerHandle); + 3005706: fec42783 lw a5,-20(s0) + 300570a: 539c lw a5,32(a5) + 300570c: fec42503 lw a0,-20(s0) + 3005710: 9782 jalr a5 + } + } + return; + 3005712: 0001 nop + 3005714: 0001 nop +} + 3005716: 50b2 lw ra,44(sp) + 3005718: 5422 lw s0,40(sp) + 300571a: 6145 addi sp,sp,48 + 300571c: 8082 ret + +0300571e : + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_TIMER_RegisterCallback(TIMER_Handle *handle, TIMER_InterruptType typeID, + TIMER_CallBackFunc callBackFunc) +{ + 300571e: 1101 addi sp,sp,-32 + 3005720: ce06 sw ra,28(sp) + 3005722: cc22 sw s0,24(sp) + 3005724: 1000 addi s0,sp,32 + 3005726: fea42623 sw a0,-20(s0) + 300572a: feb42423 sw a1,-24(s0) + 300572e: fec42223 sw a2,-28(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005732: fec42783 lw a5,-20(s0) + 3005736: eb89 bnez a5,3005748 + 3005738: 0fa00593 li a1,250 + 300573c: 030077b7 lui a5,0x3007 + 3005740: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005744: 35b5 jal ra,30055b0 + 3005746: a001 j 3005746 + TIMER_ASSERT_PARAM(callBackFunc != NULL); + 3005748: fe442783 lw a5,-28(s0) + 300574c: eb89 bnez a5,300575e + 300574e: 0fb00593 li a1,251 + 3005752: 030077b7 lui a5,0x3007 + 3005756: 9dc78513 addi a0,a5,-1572 # 30069dc + 300575a: 3d99 jal ra,30055b0 + 300575c: a001 j 300575c + TIMER_ASSERT_PARAM(IsTimerInterruptType(typeID)); + 300575e: fe842503 lw a0,-24(s0) + 3005762: 3e89 jal ra,30052b4 + 3005764: 87aa mv a5,a0 + 3005766: 0017c793 xori a5,a5,1 + 300576a: 9f81 uxtb a5 + 300576c: cb89 beqz a5,300577e + 300576e: 0fc00593 li a1,252 + 3005772: 030077b7 lui a5,0x3007 + 3005776: 9dc78513 addi a0,a5,-1572 # 30069dc + 300577a: 3d1d jal ra,30055b0 + 300577c: a001 j 300577c + + /* Registers the user callback function. */ + switch (typeID) { + 300577e: fe842783 lw a5,-24(s0) + 3005782: cb91 beqz a5,3005796 + 3005784: 4705 li a4,1 + 3005786: 00e79e63 bne a5,a4,30057a2 + case TIMER_OVER_FLOW: + handle->userCallBack.TimerOverFlowCallBack = callBackFunc; /* User DMA request overflow function */ + 300578a: fec42783 lw a5,-20(s0) + 300578e: fe442703 lw a4,-28(s0) + 3005792: d3d8 sw a4,36(a5) + break; + 3005794: a809 j 30057a6 + case TIMER_PERIOD_FIN: + handle->userCallBack.TimerPeriodFinCallBack = callBackFunc; /* User timer period finish call back. */ + 3005796: fec42783 lw a5,-20(s0) + 300579a: fe442703 lw a4,-28(s0) + 300579e: d398 sw a4,32(a5) + break; + 30057a0: a019 j 30057a6 + default: + return BASE_STATUS_ERROR; + 30057a2: 4785 li a5,1 + 30057a4: a011 j 30057a8 + } + return BASE_STATUS_OK; + 30057a6: 4781 li a5,0 +} + 30057a8: 853e mv a0,a5 + 30057aa: 40f2 lw ra,28(sp) + 30057ac: 4462 lw s0,24(sp) + 30057ae: 6105 addi sp,sp,32 + 30057b0: 8082 ret + +030057b2 : + * @brief Check UART datalength parameter. + * @param datalength The number of data bits in a frame, @ref UART_DataLength + * @retval bool + */ +static inline bool IsUartDatalength(UART_DataLength datalength) +{ + 30057b2: 1101 addi sp,sp,-32 + 30057b4: ce22 sw s0,28(sp) + 30057b6: 1000 addi s0,sp,32 + 30057b8: fea42623 sw a0,-20(s0) + return (datalength >= UART_DATALENGTH_5BIT) && (datalength <= UART_DATALENGTH_8BIT); + 30057bc: fec42783 lw a5,-20(s0) + 30057c0: 0047b793 sltiu a5,a5,4 + 30057c4: 9f81 uxtb a5 +} + 30057c6: 853e mv a0,a5 + 30057c8: 4472 lw s0,28(sp) + 30057ca: 6105 addi sp,sp,32 + 30057cc: 8082 ret + +030057ce : + * @brief Check UART stopbits parameter. + * @param stopbits The number of stop bits in a frame, @ref UART_StopBits + * @retval bool + */ +static inline bool IsUartStopbits(UART_StopBits stopbits) +{ + 30057ce: 1101 addi sp,sp,-32 + 30057d0: ce22 sw s0,28(sp) + 30057d2: 1000 addi s0,sp,32 + 30057d4: fea42623 sw a0,-20(s0) + return (stopbits == UART_STOPBITS_ONE) || (stopbits == UART_STOPBITS_TWO); + 30057d8: fec42783 lw a5,-20(s0) + 30057dc: c791 beqz a5,30057e8 + 30057de: fec42703 lw a4,-20(s0) + 30057e2: 4785 li a5,1 + 30057e4: 00f71463 bne a4,a5,30057ec + 30057e8: 4785 li a5,1 + 30057ea: a011 j 30057ee + 30057ec: 4781 li a5,0 + 30057ee: 8b85 andi a5,a5,1 + 30057f0: 9f81 uxtb a5 +} + 30057f2: 853e mv a0,a5 + 30057f4: 4472 lw s0,28(sp) + 30057f6: 6105 addi sp,sp,32 + 30057f8: 8082 ret + +030057fa : + * @brief Check UART paritymode parameter. + * @param paritymode UART parity check mode, @ref UART_Parity_Mode + * @retval bool + */ +static inline bool IsUartParitymode(UART_Parity_Mode paritymode) +{ + 30057fa: 1101 addi sp,sp,-32 + 30057fc: ce22 sw s0,28(sp) + 30057fe: 1000 addi s0,sp,32 + 3005800: fea42623 sw a0,-20(s0) + if ((paritymode >= UART_PARITY_ODD) && (paritymode <= UART_PARITY_NONE)) { + 3005804: fec42703 lw a4,-20(s0) + 3005808: 4791 li a5,4 + 300580a: 00e7e463 bltu a5,a4,3005812 + return true; + 300580e: 4785 li a5,1 + 3005810: a011 j 3005814 + } + return false; + 3005812: 4781 li a5,0 +} + 3005814: 853e mv a0,a5 + 3005816: 4472 lw s0,28(sp) + 3005818: 6105 addi sp,sp,32 + 300581a: 8082 ret + +0300581c : + * @brief Check UART transmode parameter. + * @param transmode Transmit mode, @ref UART_Transmit_Mode + * @retval bool + */ +static inline bool IsUartTransmode(UART_Transmit_Mode transmode) +{ + 300581c: 1101 addi sp,sp,-32 + 300581e: ce22 sw s0,28(sp) + 3005820: 1000 addi s0,sp,32 + 3005822: fea42623 sw a0,-20(s0) + if ((transmode == UART_MODE_BLOCKING) || + 3005826: fec42783 lw a5,-20(s0) + 300582a: c385 beqz a5,300584a + 300582c: fec42703 lw a4,-20(s0) + 3005830: 4785 li a5,1 + 3005832: 00f70c63 beq a4,a5,300584a + (transmode == UART_MODE_INTERRUPT) || + 3005836: fec42703 lw a4,-20(s0) + 300583a: 4789 li a5,2 + 300583c: 00f70763 beq a4,a5,300584a + (transmode == UART_MODE_DMA) || + 3005840: fec42703 lw a4,-20(s0) + 3005844: 478d li a5,3 + 3005846: 00f71463 bne a4,a5,300584e + (transmode == UART_MODE_DISABLE)) { + return true; + 300584a: 4785 li a5,1 + 300584c: a011 j 3005850 + } + return false; + 300584e: 4781 li a5,0 +} + 3005850: 853e mv a0,a5 + 3005852: 4472 lw s0,28(sp) + 3005854: 6105 addi sp,sp,32 + 3005856: 8082 ret + +03005858 : + * @brief Check UART fifoThreshold parameter. + * @param fifoThreshold UART TX/RX FIFO line interrupt threshold, @ref UART_FIFO_Threshold + * @retval bool + */ +static inline bool IsUartFIFOThreshold(UART_FIFO_Threshold fifoThreshold) +{ + 3005858: 1101 addi sp,sp,-32 + 300585a: ce22 sw s0,28(sp) + 300585c: 1000 addi s0,sp,32 + 300585e: fea42623 sw a0,-20(s0) + return (fifoThreshold >= UART_FIFODEPTH_SIZE0) && (fifoThreshold <= UART_FIFODEPTH_SIZE15); + 3005862: fec42783 lw a5,-20(s0) + 3005866: 0107b793 sltiu a5,a5,16 + 300586a: 9f81 uxtb a5 +} + 300586c: 853e mv a0,a5 + 300586e: 4472 lw s0,28(sp) + 3005870: 6105 addi sp,sp,32 + 3005872: 8082 ret + +03005874 : + * @brief Check UART Oversampling multiple. + * @param multiple Oversampling multiple, @ref UART_OversampleMultiple + * @retval bool + */ +static inline bool IsUartOversampleMultiple(UART_OversampleMultiple multiple) +{ + 3005874: 1101 addi sp,sp,-32 + 3005876: ce22 sw s0,28(sp) + 3005878: 1000 addi s0,sp,32 + 300587a: fea42623 sw a0,-20(s0) + return (multiple >= UART_OVERSAMPLING_16X) && (multiple <= UART_OVERSAMPLING_12X); + 300587e: fec42783 lw a5,-20(s0) + 3005882: 0057b793 sltiu a5,a5,5 + 3005886: 9f81 uxtb a5 +} + 3005888: 853e mv a0,a5 + 300588a: 4472 lw s0,28(sp) + 300588c: 6105 addi sp,sp,32 + 300588e: 8082 ret + +03005890 : +#define PARITY_EVEN 0x6 +#define PARITY_MARK 0x82 +#define PARITY_SPACE 0x86 + +static unsigned int DivClosest(unsigned int x, unsigned int divisor) +{ + 3005890: 7179 addi sp,sp,-48 + 3005892: d622 sw s0,44(sp) + 3005894: 1800 addi s0,sp,48 + 3005896: fca42e23 sw a0,-36(s0) + 300589a: fcb42c23 sw a1,-40(s0) + unsigned int ret; + if (divisor == 0) { + 300589e: fd842783 lw a5,-40(s0) + 30058a2: e399 bnez a5,30058a8 + return 0; + 30058a4: 4781 li a5,0 + 30058a6: a005 j 30058c6 + } + ret = (((x) + ((divisor) / 2)) / (divisor)); /* Round up the result, add 1/2 */ + 30058a8: fd842783 lw a5,-40(s0) + 30058ac: 0017d713 srli a4,a5,0x1 + 30058b0: fdc42783 lw a5,-36(s0) + 30058b4: 973e add a4,a4,a5 + 30058b6: fd842783 lw a5,-40(s0) + 30058ba: 02f757b3 divu a5,a4,a5 + 30058be: fef42623 sw a5,-20(s0) + return ret; + 30058c2: fec42783 lw a5,-20(s0) +} + 30058c6: 853e mv a0,a5 + 30058c8: 5432 lw s0,44(sp) + 30058ca: 6145 addi sp,sp,48 + 30058cc: 8082 ret + +030058ce : + * @brief Sets the parity bit of the UART. + * @param uartHandle UART handle. + * @retval None. + */ +static void UART_SetParityBit(UART_Handle *uartHandle) +{ + 30058ce: 1101 addi sp,sp,-32 + 30058d0: ce22 sw s0,28(sp) + 30058d2: 1000 addi s0,sp,32 + 30058d4: fea42623 sw a0,-20(s0) + /* Sets the UART check mode. */ + switch (uartHandle->parity) { + 30058d8: fec42783 lw a5,-20(s0) + 30058dc: 4b9c lw a5,16(a5) + 30058de: 4711 li a4,4 + 30058e0: 06f76e63 bltu a4,a5,300595c + 30058e4: 00279713 slli a4,a5,0x2 + 30058e8: 030077b7 lui a5,0x3007 + 30058ec: 9fc78793 addi a5,a5,-1540 # 30069fc + 30058f0: 97ba add a5,a5,a4 + 30058f2: 439c lw a5,0(a5) + 30058f4: 8782 jr a5 + case UART_PARITY_ODD: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_ODD; /* Odd parity. */ + 30058f6: fec42783 lw a5,-20(s0) + 30058fa: 439c lw a5,0(a5) + 30058fc: 57d8 lw a4,44(a5) + 30058fe: fec42783 lw a5,-20(s0) + 3005902: 439c lw a5,0(a5) + 3005904: 00276713 ori a4,a4,2 + 3005908: d7d8 sw a4,44(a5) + break; + 300590a: a891 j 300595e + case UART_PARITY_EVEN: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_EVEN; /* Even parity. */ + 300590c: fec42783 lw a5,-20(s0) + 3005910: 439c lw a5,0(a5) + 3005912: 57d8 lw a4,44(a5) + 3005914: fec42783 lw a5,-20(s0) + 3005918: 439c lw a5,0(a5) + 300591a: 00676713 ori a4,a4,6 + 300591e: d7d8 sw a4,44(a5) + break; + 3005920: a83d j 300595e + case UART_PARITY_MARK: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_MARK; /* Marking parity */ + 3005922: fec42783 lw a5,-20(s0) + 3005926: 439c lw a5,0(a5) + 3005928: 57d8 lw a4,44(a5) + 300592a: fec42783 lw a5,-20(s0) + 300592e: 439c lw a5,0(a5) + 3005930: 08276713 ori a4,a4,130 + 3005934: d7d8 sw a4,44(a5) + break; + 3005936: a025 j 300595e + case UART_PARITY_SPACE: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_SPACE; /* space parity */ + 3005938: fec42783 lw a5,-20(s0) + 300593c: 439c lw a5,0(a5) + 300593e: 57d8 lw a4,44(a5) + 3005940: fec42783 lw a5,-20(s0) + 3005944: 439c lw a5,0(a5) + 3005946: 08676713 ori a4,a4,134 + 300594a: d7d8 sw a4,44(a5) + break; + 300594c: a809 j 300595e + case UART_PARITY_NONE: + uartHandle->baseAddress->UART_LCR_H.BIT.pen = BASE_CFG_DISABLE; /* No parity */ + 300594e: fec42783 lw a5,-20(s0) + 3005952: 4398 lw a4,0(a5) + 3005954: 575c lw a5,44(a4) + 3005956: 9bf5 andi a5,a5,-3 + 3005958: d75c sw a5,44(a4) + break; + 300595a: a011 j 300595e + default: + return; + 300595c: 0001 nop + } +} + 300595e: 4472 lw s0,28(sp) + 3005960: 6105 addi sp,sp,32 + 3005962: 8082 ret + +03005964 : + * @brief Initialize the UART hardware configuration and configure parameters based on the specified handle. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_Init(UART_Handle *uartHandle) +{ + 3005964: 7179 addi sp,sp,-48 + 3005966: d606 sw ra,44(sp) + 3005968: d422 sw s0,40(sp) + 300596a: 1800 addi s0,sp,48 + 300596c: fca42e23 sw a0,-36(s0) + UART_ASSERT_PARAM(uartHandle != NULL); + 3005970: fdc42783 lw a5,-36(s0) + 3005974: eb89 bnez a5,3005986 + 3005976: 09700593 li a1,151 + 300597a: 030077b7 lui a5,0x3007 + 300597e: a1078513 addi a0,a5,-1520 # 3006a10 + 3005982: 313d jal ra,30055b0 + 3005984: a001 j 3005984 + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + 3005986: fdc42783 lw a5,-36(s0) + 300598a: 4398 lw a4,0(a5) + 300598c: 140007b7 lui a5,0x14000 + 3005990: 02f70f63 beq a4,a5,30059ce + 3005994: fdc42783 lw a5,-36(s0) + 3005998: 4398 lw a4,0(a5) + 300599a: 140017b7 lui a5,0x14001 + 300599e: 02f70863 beq a4,a5,30059ce + 30059a2: fdc42783 lw a5,-36(s0) + 30059a6: 4398 lw a4,0(a5) + 30059a8: 140027b7 lui a5,0x14002 + 30059ac: 02f70163 beq a4,a5,30059ce + 30059b0: fdc42783 lw a5,-36(s0) + 30059b4: 4398 lw a4,0(a5) + 30059b6: 140037b7 lui a5,0x14003 + 30059ba: 00f70a63 beq a4,a5,30059ce + 30059be: 09800593 li a1,152 + 30059c2: 030077b7 lui a5,0x3007 + 30059c6: a1078513 addi a0,a5,-1520 # 3006a10 + 30059ca: 36dd jal ra,30055b0 + 30059cc: a001 j 30059cc + UART_PARAM_CHECK_WITH_RET(uartHandle->txState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 30059ce: fdc42783 lw a5,-36(s0) + 30059d2: 47bc lw a5,72(a5) + 30059d4: cb91 beqz a5,30059e8 + 30059d6: 09900593 li a1,153 + 30059da: 030077b7 lui a5,0x3007 + 30059de: a1078513 addi a0,a5,-1520 # 3006a10 + 30059e2: 36f9 jal ra,30055b0 + 30059e4: 4785 li a5,1 + 30059e6: ae0d j 3005d18 + UART_PARAM_CHECK_WITH_RET(uartHandle->rxState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 30059e8: fdc42783 lw a5,-36(s0) + 30059ec: 47fc lw a5,76(a5) + 30059ee: cb91 beqz a5,3005a02 + 30059f0: 09a00593 li a1,154 + 30059f4: 030077b7 lui a5,0x3007 + 30059f8: a1078513 addi a0,a5,-1520 # 3006a10 + 30059fc: 3e55 jal ra,30055b0 + 30059fe: 4785 li a5,1 + 3005a00: ae21 j 3005d18 + unsigned int uartClock, quot; + UART_PARAM_CHECK_WITH_RET(IsUartDatalength(uartHandle->dataLength), BASE_STATUS_ERROR); + 3005a02: fdc42783 lw a5,-36(s0) + 3005a06: 479c lw a5,8(a5) + 3005a08: 853e mv a0,a5 + 3005a0a: 3365 jal ra,30057b2 + 3005a0c: 87aa mv a5,a0 + 3005a0e: 0017c793 xori a5,a5,1 + 3005a12: 9f81 uxtb a5 + 3005a14: cb91 beqz a5,3005a28 + 3005a16: 09c00593 li a1,156 + 3005a1a: 030077b7 lui a5,0x3007 + 3005a1e: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a22: 3679 jal ra,30055b0 + 3005a24: 4785 li a5,1 + 3005a26: accd j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartStopbits(uartHandle->stopBits), BASE_STATUS_ERROR); + 3005a28: fdc42783 lw a5,-36(s0) + 3005a2c: 47dc lw a5,12(a5) + 3005a2e: 853e mv a0,a5 + 3005a30: 3b79 jal ra,30057ce + 3005a32: 87aa mv a5,a0 + 3005a34: 0017c793 xori a5,a5,1 + 3005a38: 9f81 uxtb a5 + 3005a3a: cb91 beqz a5,3005a4e + 3005a3c: 09d00593 li a1,157 + 3005a40: 030077b7 lui a5,0x3007 + 3005a44: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a48: 36a5 jal ra,30055b0 + 3005a4a: 4785 li a5,1 + 3005a4c: a4f1 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartParitymode(uartHandle->parity), BASE_STATUS_ERROR); + 3005a4e: fdc42783 lw a5,-36(s0) + 3005a52: 4b9c lw a5,16(a5) + 3005a54: 853e mv a0,a5 + 3005a56: 3355 jal ra,30057fa + 3005a58: 87aa mv a5,a0 + 3005a5a: 0017c793 xori a5,a5,1 + 3005a5e: 9f81 uxtb a5 + 3005a60: cb91 beqz a5,3005a74 + 3005a62: 09e00593 li a1,158 + 3005a66: 030077b7 lui a5,0x3007 + 3005a6a: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a6e: 3689 jal ra,30055b0 + 3005a70: 4785 li a5,1 + 3005a72: a45d j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->txMode), BASE_STATUS_ERROR); + 3005a74: fdc42783 lw a5,-36(s0) + 3005a78: 4bdc lw a5,20(a5) + 3005a7a: 853e mv a0,a5 + 3005a7c: 3345 jal ra,300581c + 3005a7e: 87aa mv a5,a0 + 3005a80: 0017c793 xori a5,a5,1 + 3005a84: 9f81 uxtb a5 + 3005a86: cb91 beqz a5,3005a9a + 3005a88: 09f00593 li a1,159 + 3005a8c: 030077b7 lui a5,0x3007 + 3005a90: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a94: 3e31 jal ra,30055b0 + 3005a96: 4785 li a5,1 + 3005a98: a441 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->rxMode), BASE_STATUS_ERROR); + 3005a9a: fdc42783 lw a5,-36(s0) + 3005a9e: 4f9c lw a5,24(a5) + 3005aa0: 853e mv a0,a5 + 3005aa2: 3bad jal ra,300581c + 3005aa4: 87aa mv a5,a0 + 3005aa6: 0017c793 xori a5,a5,1 + 3005aaa: 9f81 uxtb a5 + 3005aac: cb91 beqz a5,3005ac0 + 3005aae: 0a000593 li a1,160 + 3005ab2: 030077b7 lui a5,0x3007 + 3005ab6: a1078513 addi a0,a5,-1520 # 3006a10 + 3005aba: 3cdd jal ra,30055b0 + 3005abc: 4785 li a5,1 + 3005abe: aca9 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoTxThr), BASE_STATUS_ERROR); + 3005ac0: fdc42783 lw a5,-36(s0) + 3005ac4: 5b9c lw a5,48(a5) + 3005ac6: 853e mv a0,a5 + 3005ac8: 3b41 jal ra,3005858 + 3005aca: 87aa mv a5,a0 + 3005acc: 0017c793 xori a5,a5,1 + 3005ad0: 9f81 uxtb a5 + 3005ad2: cb91 beqz a5,3005ae6 + 3005ad4: 0a100593 li a1,161 + 3005ad8: 030077b7 lui a5,0x3007 + 3005adc: a1078513 addi a0,a5,-1520 # 3006a10 + 3005ae0: 3cc1 jal ra,30055b0 + 3005ae2: 4785 li a5,1 + 3005ae4: ac15 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoRxThr), BASE_STATUS_ERROR); + 3005ae6: fdc42783 lw a5,-36(s0) + 3005aea: 5bdc lw a5,52(a5) + 3005aec: 853e mv a0,a5 + 3005aee: 33ad jal ra,3005858 + 3005af0: 87aa mv a5,a0 + 3005af2: 0017c793 xori a5,a5,1 + 3005af6: 9f81 uxtb a5 + 3005af8: cb91 beqz a5,3005b0c + 3005afa: 0a200593 li a1,162 + 3005afe: 030077b7 lui a5,0x3007 + 3005b02: a1078513 addi a0,a5,-1520 # 3006a10 + 3005b06: 346d jal ra,30055b0 + 3005b08: 4785 li a5,1 + 3005b0a: a439 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartOversampleMultiple(uartHandle->handleEx.overSampleMultiple), BASE_STATUS_ERROR); + 3005b0c: fdc42783 lw a5,-36(s0) + 3005b10: 5fbc lw a5,120(a5) + 3005b12: 853e mv a0,a5 + 3005b14: 3385 jal ra,3005874 + 3005b16: 87aa mv a5,a0 + 3005b18: 0017c793 xori a5,a5,1 + 3005b1c: 9f81 uxtb a5 + 3005b1e: cb91 beqz a5,3005b32 + 3005b20: 0a300593 li a1,163 + 3005b24: 030077b7 lui a5,0x3007 + 3005b28: a1078513 addi a0,a5,-1520 # 3006a10 + 3005b2c: 3451 jal ra,30055b0 + 3005b2e: 4785 li a5,1 + 3005b30: a2e5 j 3005d18 + + uartHandle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; + 3005b32: fdc42783 lw a5,-36(s0) + 3005b36: 4398 lw a4,0(a5) + 3005b38: 5b1c lw a5,48(a4) + 3005b3a: 9bf9 andi a5,a5,-2 + 3005b3c: db1c sw a5,48(a4) + while (uartHandle->baseAddress->UART_FR.BIT.busy == 0x01) { + 3005b3e: 0001 nop + 3005b40: fdc42783 lw a5,-36(s0) + 3005b44: 439c lw a5,0(a5) + 3005b46: 4f9c lw a5,24(a5) + 3005b48: 838d srli a5,a5,0x3 + 3005b4a: 8b85 andi a5,a5,1 + 3005b4c: 0ff7f713 andi a4,a5,255 + 3005b50: 4785 li a5,1 + 3005b52: fef707e3 beq a4,a5,3005b40 + ; + } + + uartClock = HAL_CRG_GetIpFreq((void *)uartHandle->baseAddress); + 3005b56: fdc42783 lw a5,-36(s0) + 3005b5a: 439c lw a5,0(a5) + 3005b5c: 853e mv a0,a5 + 3005b5e: 9f1fd0ef jal ra,300354e + 3005b62: fea42623 sw a0,-20(s0) + + /* DCL OverSample Multiple check */ + uartHandle->baseAddress->UART_SPCFG.BIT.spcfg = uartHandle->handleEx.overSampleMultiple; + 3005b66: fdc42783 lw a5,-36(s0) + 3005b6a: 5fb4 lw a3,120(a5) + 3005b6c: fdc42783 lw a5,-36(s0) + 3005b70: 4398 lw a4,0(a5) + 3005b72: 87b6 mv a5,a3 + 3005b74: 8bbd andi a5,a5,15 + 3005b76: 0ff7f693 andi a3,a5,255 + 3005b7a: 4f3c lw a5,88(a4) + 3005b7c: 8abd andi a3,a3,15 + 3005b7e: 9bc1 andi a5,a5,-16 + 3005b80: 8fd5 or a5,a5,a3 + 3005b82: cf3c sw a5,88(a4) + + /* DCL sequences setting */ + uartHandle->baseAddress->UART_DS.BIT.msbfirst = uartHandle->handleEx.msbFirst; + 3005b84: fdc42783 lw a5,-36(s0) + 3005b88: 4398 lw a4,0(a5) + 3005b8a: fdc42783 lw a5,-36(s0) + 3005b8e: 07c7c683 lbu a3,124(a5) + 3005b92: 4b3c lw a5,80(a4) + 3005b94: 8a85 andi a3,a3,1 + 3005b96: 9bf9 andi a5,a5,-2 + 3005b98: 8fd5 or a5,a5,a3 + 3005b9a: cb3c sw a5,80(a4) + + /* The baud rate divider(BRD) based on the baud rate and clock frequency, calculation formula */ + unsigned int oversample = uartHandle->baseAddress->UART_SPCFG.reg; + 3005b9c: fdc42783 lw a5,-36(s0) + 3005ba0: 439c lw a5,0(a5) + 3005ba2: 4fbc lw a5,88(a5) + 3005ba4: fef42423 sw a5,-24(s0) + if (uartHandle->baudRate > (uartClock / (OVERSAMPLING_PARAM - oversample))) { + 3005ba8: fdc42783 lw a5,-36(s0) + 3005bac: 43d8 lw a4,4(a5) + 3005bae: 46c1 li a3,16 + 3005bb0: fe842783 lw a5,-24(s0) + 3005bb4: 40f687b3 sub a5,a3,a5 + 3005bb8: fec42683 lw a3,-20(s0) + 3005bbc: 02f6d7b3 divu a5,a3,a5 + 3005bc0: 00e7f463 bgeu a5,a4,3005bc8 + return BASE_STATUS_ERROR; + 3005bc4: 4785 li a5,1 + 3005bc6: aa89 j 3005d18 + } else { + unsigned int tmpClock = uartClock / (OVERSAMPLING_PARAM - oversample) * 64; /* 64 is for decimal parts */ + 3005bc8: 4741 li a4,16 + 3005bca: fe842783 lw a5,-24(s0) + 3005bce: 40f707b3 sub a5,a4,a5 + 3005bd2: fec42703 lw a4,-20(s0) + 3005bd6: 02f757b3 divu a5,a4,a5 + 3005bda: 079a slli a5,a5,0x6 + 3005bdc: fef42223 sw a5,-28(s0) + quot = DivClosest(tmpClock, uartHandle->baudRate); + 3005be0: fdc42783 lw a5,-36(s0) + 3005be4: 43dc lw a5,4(a5) + 3005be6: 85be mv a1,a5 + 3005be8: fe442503 lw a0,-28(s0) + 3005bec: 3155 jal ra,3005890 + 3005bee: fea42023 sw a0,-32(s0) + } + /* Clear the baud rate divider register */ + uartHandle->baseAddress->UART_FBRD.reg = 0; + 3005bf2: fdc42783 lw a5,-36(s0) + 3005bf6: 439c lw a5,0(a5) + 3005bf8: 0207a423 sw zero,40(a5) + uartHandle->baseAddress->UART_IBRD.reg = 0; + 3005bfc: fdc42783 lw a5,-36(s0) + 3005c00: 439c lw a5,0(a5) + 3005c02: 0207a223 sw zero,36(a5) + /* The fractional baud rate divider value is stored to the lower 6 bits of the FBRD */ + uartHandle->baseAddress->UART_FBRD.reg = (quot & 0x3F); + 3005c06: fdc42783 lw a5,-36(s0) + 3005c0a: 439c lw a5,0(a5) + 3005c0c: fe042703 lw a4,-32(s0) + 3005c10: 03f77713 andi a4,a4,63 + 3005c14: d798 sw a4,40(a5) + /* Right shift 6 bits is the integer baud rate divider value, is stored to IBRD */ + uartHandle->baseAddress->UART_IBRD.reg = (quot >> 6); + 3005c16: fdc42783 lw a5,-36(s0) + 3005c1a: 439c lw a5,0(a5) + 3005c1c: fe042703 lw a4,-32(s0) + 3005c20: 8319 srli a4,a4,0x6 + 3005c22: d3d8 sw a4,36(a5) + uartHandle->baseAddress->UART_LCR_H.reg = 0; + 3005c24: fdc42783 lw a5,-36(s0) + 3005c28: 439c lw a5,0(a5) + 3005c2a: 0207a623 sw zero,44(a5) + uartHandle->baseAddress->UART_LCR_H.BIT.wlen = uartHandle->dataLength; /* Frame length seting */ + 3005c2e: fdc42783 lw a5,-36(s0) + 3005c32: 4794 lw a3,8(a5) + 3005c34: fdc42783 lw a5,-36(s0) + 3005c38: 4398 lw a4,0(a5) + 3005c3a: 87b6 mv a5,a3 + 3005c3c: 8b8d andi a5,a5,3 + 3005c3e: 0ff7f693 andi a3,a5,255 + 3005c42: 575c lw a5,44(a4) + 3005c44: 8a8d andi a3,a3,3 + 3005c46: 0696 slli a3,a3,0x5 + 3005c48: f9f7f793 andi a5,a5,-97 + 3005c4c: 8fd5 or a5,a5,a3 + 3005c4e: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_LCR_H.BIT.stp2 = uartHandle->stopBits; /* Stop bit seting */ + 3005c50: fdc42783 lw a5,-36(s0) + 3005c54: 47d4 lw a3,12(a5) + 3005c56: fdc42783 lw a5,-36(s0) + 3005c5a: 4398 lw a4,0(a5) + 3005c5c: 87b6 mv a5,a3 + 3005c5e: 8b85 andi a5,a5,1 + 3005c60: 0ff7f693 andi a3,a5,255 + 3005c64: 575c lw a5,44(a4) + 3005c66: 8a85 andi a3,a3,1 + 3005c68: 068e slli a3,a3,0x3 + 3005c6a: 9bdd andi a5,a5,-9 + 3005c6c: 8fd5 or a5,a5,a3 + 3005c6e: d75c sw a5,44(a4) + UART_SetParityBit(uartHandle); + 3005c70: fdc42503 lw a0,-36(s0) + 3005c74: 39a9 jal ra,30058ce + if (uartHandle->fifoMode == true) { /* FIFO threshold setting */ + 3005c76: fdc42783 lw a5,-36(s0) + 3005c7a: 02c7c783 lbu a5,44(a5) + 3005c7e: cbb1 beqz a5,3005cd2 + uartHandle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_ENABLE; + 3005c80: fdc42783 lw a5,-36(s0) + 3005c84: 4398 lw a4,0(a5) + 3005c86: 575c lw a5,44(a4) + 3005c88: 0107e793 ori a5,a5,16 + 3005c8c: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_IFLS.BIT.rxiflsel = uartHandle->fifoRxThr; + 3005c8e: fdc42783 lw a5,-36(s0) + 3005c92: 5bd4 lw a3,52(a5) + 3005c94: fdc42783 lw a5,-36(s0) + 3005c98: 4398 lw a4,0(a5) + 3005c9a: 87b6 mv a5,a3 + 3005c9c: 8bbd andi a5,a5,15 + 3005c9e: 0ff7f693 andi a3,a5,255 + 3005ca2: 5b5c lw a5,52(a4) + 3005ca4: 8abd andi a3,a3,15 + 3005ca6: 06a2 slli a3,a3,0x8 + 3005ca8: 767d lui a2,0xfffff + 3005caa: 0ff60613 addi a2,a2,255 # fffff0ff + 3005cae: 8ff1 and a5,a5,a2 + 3005cb0: 8fd5 or a5,a5,a3 + 3005cb2: db5c sw a5,52(a4) + uartHandle->baseAddress->UART_IFLS.BIT.txiflsel = uartHandle->fifoTxThr; + 3005cb4: fdc42783 lw a5,-36(s0) + 3005cb8: 5b94 lw a3,48(a5) + 3005cba: fdc42783 lw a5,-36(s0) + 3005cbe: 4398 lw a4,0(a5) + 3005cc0: 87b6 mv a5,a3 + 3005cc2: 8bbd andi a5,a5,15 + 3005cc4: 0ff7f693 andi a3,a5,255 + 3005cc8: 5b5c lw a5,52(a4) + 3005cca: 8abd andi a3,a3,15 + 3005ccc: 9bc1 andi a5,a5,-16 + 3005cce: 8fd5 or a5,a5,a3 + 3005cd0: db5c sw a5,52(a4) + } + if (uartHandle->hwFlowCtr == UART_HW_FLOWCTR_ENABLE) { /* Hardwarer flow control setting */ + 3005cd2: fdc42783 lw a5,-36(s0) + 3005cd6: 5f98 lw a4,56(a5) + 3005cd8: 4785 li a5,1 + 3005cda: 00f71c63 bne a4,a5,3005cf2 + uartHandle->baseAddress->UART_CR.reg |= 0xC000; + 3005cde: fdc42783 lw a5,-36(s0) + 3005ce2: 439c lw a5,0(a5) + 3005ce4: 5b94 lw a3,48(a5) + 3005ce6: fdc42783 lw a5,-36(s0) + 3005cea: 439c lw a5,0(a5) + 3005cec: 6731 lui a4,0xc + 3005cee: 8f55 or a4,a4,a3 + 3005cf0: db98 sw a4,48(a5) + } + uartHandle->baseAddress->UART_CR.reg |= 0x301; /* Enable bit use 0x301 is to set txe/rxe/uarten */ + 3005cf2: fdc42783 lw a5,-36(s0) + 3005cf6: 439c lw a5,0(a5) + 3005cf8: 5b98 lw a4,48(a5) + 3005cfa: fdc42783 lw a5,-36(s0) + 3005cfe: 439c lw a5,0(a5) + 3005d00: 30176713 ori a4,a4,769 + 3005d04: db98 sw a4,48(a5) + uartHandle->txState = UART_STATE_READY; + 3005d06: fdc42783 lw a5,-36(s0) + 3005d0a: 4705 li a4,1 + 3005d0c: c7b8 sw a4,72(a5) + uartHandle->rxState = UART_STATE_READY; + 3005d0e: fdc42783 lw a5,-36(s0) + 3005d12: 4705 li a4,1 + 3005d14: c7f8 sw a4,76(a5) + return BASE_STATUS_OK; + 3005d16: 4781 li a5,0 +} + 3005d18: 853e mv a0,a5 + 3005d1a: 50b2 lw ra,44(sp) + 3005d1c: 5422 lw s0,40(sp) + 3005d1e: 6145 addi sp,sp,48 + 3005d20: 8082 ret + +03005d22
: +/* USER CODE BEGIN 1 */ +/* 建议用户定义全局变量、结构体、宏定义或函数声明等 */ +/* USER CODE END 1 */ + +int main(void) +{ + 3005d22: 1141 addi sp,sp,-16 + 3005d24: c606 sw ra,12(sp) + 3005d26: c422 sw s0,8(sp) + 3005d28: 0800 addi s0,sp,16 + /* USER CODE BEGIN 2 */ + /* 建议用户放置初始化代码或启动代码等 */ + /* USER CODE END 2 */ + SystemInit(); + 3005d2a: 2ee5 jal ra,3006122 + /* USER CODE BEGIN 3 */ + /* 建议用户放置初始配置代码 */ + /* USER CODE END 3 */ + while (1) { + 3005d2c: a001 j 3005d2c + +03005d2e : +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + 3005d2e: 715d addi sp,sp,-80 + 3005d30: c686 sw ra,76(sp) + 3005d32: c4a2 sw s0,72(sp) + 3005d34: 0880 addi s0,sp,80 + 3005d36: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3005d3a: 100007b7 lui a5,0x10000 + 3005d3e: fcf42423 sw a5,-56(s0) + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + 3005d42: fc042623 sw zero,-52(s0) + crg.pllPreDiv = CRG_PLL_PREDIV_4; + 3005d46: 478d li a5,3 + 3005d48: fcf42823 sw a5,-48(s0) + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + 3005d4c: 03000793 li a5,48 + 3005d50: fcf42a23 sw a5,-44(s0) + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + 3005d54: 4785 li a5,1 + 3005d56: fcf42c23 sw a5,-40(s0) + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + 3005d5a: 4789 li a5,2 + 3005d5c: fef42023 sw a5,-32(s0) + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + 3005d60: 4789 li a5,2 + 3005d62: fef42223 sw a5,-28(s0) + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + 3005d66: fe042423 sw zero,-24(s0) + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + 3005d6a: 47e1 li a5,24 + 3005d6c: fef42623 sw a5,-20(s0) + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + 3005d70: fc840793 addi a5,s0,-56 + 3005d74: 853e mv a0,a5 + 3005d76: aecfd0ef jal ra,3003062 + 3005d7a: 87aa mv a5,a0 + 3005d7c: c399 beqz a5,3005d82 + return BASE_STATUS_ERROR; + 3005d7e: 4785 li a5,1 + 3005d80: a039 j 3005d8e + } + *coreClkSelect = crg.coreClkSelect; + 3005d82: fe042703 lw a4,-32(s0) + 3005d86: fbc42783 lw a5,-68(s0) + 3005d8a: c398 sw a4,0(a5) + return BASE_STATUS_OK; + 3005d8c: 4781 li a5,0 +} + 3005d8e: 853e mv a0,a5 + 3005d90: 40b6 lw ra,76(sp) + 3005d92: 4426 lw s0,72(sp) + 3005d94: 6161 addi sp,sp,80 + 3005d96: 8082 ret + +03005d98 : + +__weak void ADC0Interrupt2Callback(ADC_Handle *handle) +{ + 3005d98: 1101 addi sp,sp,-32 + 3005d9a: ce22 sw s0,28(sp) + 3005d9c: 1000 addi s0,sp,32 + 3005d9e: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ADC0_CALLBACK_INT2 */ + /* USER CODE END ADC0_CALLBACK_INT2 */ +} + 3005da2: 0001 nop + 3005da4: 4472 lw s0,28(sp) + 3005da6: 6105 addi sp,sp,32 + 3005da8: 8082 ret + +03005daa : + +static void ADC0_Init(void) +{ + 3005daa: 7179 addi sp,sp,-48 + 3005dac: d606 sw ra,44(sp) + 3005dae: d422 sw s0,40(sp) + 3005db0: 1800 addi s0,sp,48 + HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); + 3005db2: 4585 li a1,1 + 3005db4: 18000537 lui a0,0x18000 + 3005db8: 2c49 jal ra,300604a + HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); + 3005dba: 4589 li a1,2 + 3005dbc: 18000537 lui a0,0x18000 + 3005dc0: 94bfd0ef jal ra,300370a + HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_1); + 3005dc4: 4581 li a1,0 + 3005dc6: 18000537 lui a0,0x18000 + 3005dca: 9f7fd0ef jal ra,30037c0 + + g_adc0.baseAddress = ADC0; + 3005dce: 040007b7 lui a5,0x4000 + 3005dd2: 54478793 addi a5,a5,1348 # 4000544 + 3005dd6: 18000737 lui a4,0x18000 + 3005dda: c398 sw a4,0(a5) + g_adc0.socPriority = ADC_PRIMODE_ALL_ROUND; + 3005ddc: 040007b7 lui a5,0x4000 + 3005de0: 54478793 addi a5,a5,1348 # 4000544 + 3005de4: 0007a223 sw zero,4(a5) + + HAL_ADC_Init(&g_adc0); + 3005de8: 040007b7 lui a5,0x4000 + 3005dec: 54478513 addi a0,a5,1348 # 4000544 + 3005df0: c97fb0ef jal ra,3001a86 + + SOC_Param socParam = {0}; + 3005df4: fc042e23 sw zero,-36(s0) + 3005df8: fe042023 sw zero,-32(s0) + 3005dfc: fe042223 sw zero,-28(s0) + 3005e00: fe042423 sw zero,-24(s0) + 3005e04: fe042623 sw zero,-20(s0) + socParam.adcInput = ADC_CH_ADCINA6; /* PIN4(ADC AIN6) */ + 3005e08: 4799 li a5,6 + 3005e0a: fcf42e23 sw a5,-36(s0) + socParam.sampleTotalTime = ADC_SOCSAMPLE_10CLK; /* adc sample total time 10 adc_clk */ + 3005e0e: 4789 li a5,2 + 3005e10: fef42023 sw a5,-32(s0) + socParam.trigSource = ADC_TRIGSOC_SOFT; + 3005e14: fe042223 sw zero,-28(s0) + socParam.continueMode = BASE_CFG_ENABLE; + 3005e18: 4785 li a5,1 + 3005e1a: fef40423 sb a5,-24(s0) + socParam.finishMode = ADC_SOCFINISH_INT2; + 3005e1e: 4795 li a5,5 + 3005e20: fef42623 sw a5,-20(s0) + HAL_ADC_ConfigureSoc(&g_adc0, ADC_SOC_NUM1, &socParam); + 3005e24: fdc40793 addi a5,s0,-36 + 3005e28: 863e mv a2,a5 + 3005e2a: 4585 li a1,1 + 3005e2c: 040007b7 lui a5,0x4000 + 3005e30: 54478513 addi a0,a5,1348 # 4000544 + 3005e34: d09fb0ef jal ra,3001b3c + HAL_ADC_RegisterCallBack(&g_adc0, ADC_CALLBACK_INT2, (ADC_CallbackType)ADC0Interrupt2Callback); + 3005e38: 030067b7 lui a5,0x3006 + 3005e3c: d9878613 addi a2,a5,-616 # 3005d98 + 3005e40: 4589 li a1,2 + 3005e42: 040007b7 lui a5,0x4000 + 3005e46: 54478513 addi a0,a5,1348 # 4000544 + 3005e4a: ab6fc0ef jal ra,3002100 + IRQ_Register(IRQ_ADC0_INT2, HAL_ADC_IrqHandlerInt2, &g_adc0); + 3005e4e: 040007b7 lui a5,0x4000 + 3005e52: 54478613 addi a2,a5,1348 # 4000544 + 3005e56: 030027b7 lui a5,0x3002 + 3005e5a: 03678593 addi a1,a5,54 # 3002036 + 3005e5e: 05f00513 li a0,95 + 3005e62: d88fc0ef jal ra,30023ea + IRQ_SetPriority(IRQ_ADC0_INT2, 1); /* 1 is priority value */ + 3005e66: 4585 li a1,1 + 3005e68: 05f00513 li a0,95 + 3005e6c: d53fc0ef jal ra,3002bbe + IRQ_EnableN(IRQ_ADC0_INT2); + 3005e70: 05f00513 li a0,95 + 3005e74: dfcfc0ef jal ra,3002470 +} + 3005e78: 0001 nop + 3005e7a: 50b2 lw ra,44(sp) + 3005e7c: 5422 lw s0,40(sp) + 3005e7e: 6145 addi sp,sp,48 + 3005e80: 8082 ret + +03005e82 : + /* USER CODE BEGIN TIMER3_InterruptProcess */ + /* USER CODE END TIMER3_InterruptProcess */ +} + +static void TIMER3_Init(void) +{ + 3005e82: 1101 addi sp,sp,-32 + 3005e84: ce06 sw ra,28(sp) + 3005e86: cc22 sw s0,24(sp) + 3005e88: 1000 addi s0,sp,32 + HAL_CRG_IpEnableSet(TIMER3_BASE, IP_CLK_ENABLE); /* TIMER3 clock enable. */ + 3005e8a: 4585 li a1,1 + 3005e8c: 14303537 lui a0,0x14303 + 3005e90: 2a6d jal ra,300604a + unsigned int load = (HAL_CRG_GetIpFreq((void *)TIMER3) / (1u << (TIMERPRESCALER_NO_DIV * 4)) / 1000000u) * 10; + 3005e92: 14303537 lui a0,0x14303 + 3005e96: eb8fd0ef jal ra,300354e + 3005e9a: 872a mv a4,a0 + 3005e9c: 000f47b7 lui a5,0xf4 + 3005ea0: 24078793 addi a5,a5,576 # f4240 + 3005ea4: 02f75733 divu a4,a4,a5 + 3005ea8: 47a9 li a5,10 + 3005eaa: 02f707b3 mul a5,a4,a5 + 3005eae: fef42623 sw a5,-20(s0) + + g_timer3.baseAddress = TIMER3; + 3005eb2: 040007b7 lui a5,0x4000 + 3005eb6: 49c78793 addi a5,a5,1180 # 400049c + 3005eba: 14303737 lui a4,0x14303 + 3005ebe: c398 sw a4,0(a5) + g_timer3.load = load - 1; /* Set timer value immediately */ + 3005ec0: fec42783 lw a5,-20(s0) + 3005ec4: fff78713 addi a4,a5,-1 + 3005ec8: 040007b7 lui a5,0x4000 + 3005ecc: 49c78793 addi a5,a5,1180 # 400049c + 3005ed0: cbd8 sw a4,20(a5) + g_timer3.bgLoad = load - 1; /* Set timer value */ + 3005ed2: fec42783 lw a5,-20(s0) + 3005ed6: fff78713 addi a4,a5,-1 + 3005eda: 040007b7 lui a5,0x4000 + 3005ede: 49c78793 addi a5,a5,1180 # 400049c + 3005ee2: cf98 sw a4,24(a5) + g_timer3.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ + 3005ee4: 040007b7 lui a5,0x4000 + 3005ee8: 49c78793 addi a5,a5,1180 # 400049c + 3005eec: 4705 li a4,1 + 3005eee: c798 sw a4,8(a5) + g_timer3.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ + 3005ef0: 040007b7 lui a5,0x4000 + 3005ef4: 49c78793 addi a5,a5,1180 # 400049c + 3005ef8: 0007a623 sw zero,12(a5) + g_timer3.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ + 3005efc: 040007b7 lui a5,0x4000 + 3005f00: 49c78793 addi a5,a5,1180 # 400049c + 3005f04: 4705 li a4,1 + 3005f06: cb98 sw a4,16(a5) + g_timer3.interruptEn = BASE_CFG_ENABLE; + 3005f08: 040007b7 lui a5,0x4000 + 3005f0c: 49c78793 addi a5,a5,1180 # 400049c + 3005f10: 4705 li a4,1 + 3005f12: afd8 sb a4,28(a5) + g_timer3.adcSocReqEnable = BASE_CFG_DISABLE; + 3005f14: 040007b7 lui a5,0x4000 + 3005f18: 49c78793 addi a5,a5,1180 # 400049c + 3005f1c: 00078ea3 sb zero,29(a5) + g_timer3.dmaReqEnable = BASE_CFG_DISABLE; + 3005f20: 040007b7 lui a5,0x4000 + 3005f24: 49c78793 addi a5,a5,1180 # 400049c + 3005f28: 00078f23 sb zero,30(a5) + HAL_TIMER_Init(&g_timer3); + 3005f2c: 040007b7 lui a5,0x4000 + 3005f30: 49c78513 addi a0,a5,1180 # 400049c + 3005f34: c2aff0ef jal ra,300535e + IRQ_Register(IRQ_TIMER3, HAL_TIMER_IrqHandler, &g_timer3); + 3005f38: 040007b7 lui a5,0x4000 + 3005f3c: 49c78613 addi a2,a5,1180 # 400049c + 3005f40: 030057b7 lui a5,0x3005 + 3005f44: 63678593 addi a1,a5,1590 # 3005636 + 3005f48: 02300513 li a0,35 + 3005f4c: c9efc0ef jal ra,30023ea + + HAL_TIMER_RegisterCallback(&g_timer3, TIMER_PERIOD_FIN, TIMER3_InterruptProcess); + 3005f50: 030067b7 lui a5,0x3006 + 3005f54: 16278613 addi a2,a5,354 # 3006162 + 3005f58: 4581 li a1,0 + 3005f5a: 040007b7 lui a5,0x4000 + 3005f5e: 49c78513 addi a0,a5,1180 # 400049c + 3005f62: fbcff0ef jal ra,300571e + IRQ_SetPriority(IRQ_TIMER3, 1); /* 1 is priority value */ + 3005f66: 4585 li a1,1 + 3005f68: 02300513 li a0,35 + 3005f6c: c53fc0ef jal ra,3002bbe + IRQ_EnableN(IRQ_TIMER3); + 3005f70: 02300513 li a0,35 + 3005f74: cfcfc0ef jal ra,3002470 +} + 3005f78: 0001 nop + 3005f7a: 40f2 lw ra,28(sp) + 3005f7c: 4462 lw s0,24(sp) + 3005f7e: 6105 addi sp,sp,32 + 3005f80: 8082 ret + +03005f82 : + +static void UART0_Init(void) +{ + 3005f82: 1141 addi sp,sp,-16 + 3005f84: c606 sw ra,12(sp) + 3005f86: c422 sw s0,8(sp) + 3005f88: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + 3005f8a: 4585 li a1,1 + 3005f8c: 14000537 lui a0,0x14000 + 3005f90: 286d jal ra,300604a + g_uart0.baseAddress = UART0; + 3005f92: 040007b7 lui a5,0x4000 + 3005f96: 4c478793 addi a5,a5,1220 # 40004c4 + 3005f9a: 14000737 lui a4,0x14000 + 3005f9e: c398 sw a4,0(a5) + + g_uart0.baudRate = UART0_BAND_RATE; + 3005fa0: 040007b7 lui a5,0x4000 + 3005fa4: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fa8: 6771 lui a4,0x1c + 3005faa: 20070713 addi a4,a4,512 # 1c200 + 3005fae: c3d8 sw a4,4(a5) + g_uart0.dataLength = UART_DATALENGTH_8BIT; + 3005fb0: 040007b7 lui a5,0x4000 + 3005fb4: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fb8: 470d li a4,3 + 3005fba: c798 sw a4,8(a5) + g_uart0.stopBits = UART_STOPBITS_ONE; + 3005fbc: 040007b7 lui a5,0x4000 + 3005fc0: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fc4: 0007a623 sw zero,12(a5) + g_uart0.parity = UART_PARITY_NONE; + 3005fc8: 040007b7 lui a5,0x4000 + 3005fcc: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fd0: 4711 li a4,4 + 3005fd2: cb98 sw a4,16(a5) + g_uart0.txMode = UART_MODE_BLOCKING; + 3005fd4: 040007b7 lui a5,0x4000 + 3005fd8: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fdc: 0007aa23 sw zero,20(a5) + g_uart0.rxMode = UART_MODE_BLOCKING; + 3005fe0: 040007b7 lui a5,0x4000 + 3005fe4: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fe8: 0007ac23 sw zero,24(a5) + g_uart0.fifoMode = BASE_CFG_ENABLE; + 3005fec: 040007b7 lui a5,0x4000 + 3005ff0: 4c478793 addi a5,a5,1220 # 40004c4 + 3005ff4: 4705 li a4,1 + 3005ff6: 02e78623 sb a4,44(a5) + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + 3005ffa: 040007b7 lui a5,0x4000 + 3005ffe: 4c478793 addi a5,a5,1220 # 40004c4 + 3006002: 4721 li a4,8 + 3006004: db98 sw a4,48(a5) + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + 3006006: 040007b7 lui a5,0x4000 + 300600a: 4c478793 addi a5,a5,1220 # 40004c4 + 300600e: 4721 li a4,8 + 3006010: dbd8 sw a4,52(a5) + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + 3006012: 040007b7 lui a5,0x4000 + 3006016: 4c478793 addi a5,a5,1220 # 40004c4 + 300601a: 0207ac23 sw zero,56(a5) + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + 300601e: 040007b7 lui a5,0x4000 + 3006022: 4c478793 addi a5,a5,1220 # 40004c4 + 3006026: 0607ac23 sw zero,120(a5) + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + 300602a: 040007b7 lui a5,0x4000 + 300602e: 4c478793 addi a5,a5,1220 # 40004c4 + 3006032: 06078e23 sb zero,124(a5) + HAL_UART_Init(&g_uart0); + 3006036: 040007b7 lui a5,0x4000 + 300603a: 4c478513 addi a0,a5,1220 # 40004c4 + 300603e: 321d jal ra,3005964 +} + 3006040: 0001 nop + 3006042: 40b2 lw ra,12(sp) + 3006044: 4422 lw s0,8(sp) + 3006046: 0141 addi sp,sp,16 + 3006048: 8082 ret + +0300604a : + 300604a: de8fd06f j 3003632 + +0300604e : + +static void IOConfig(void) +{ + 300604e: 1141 addi sp,sp,-16 + 3006050: c606 sw ra,12(sp) + 3006052: c422 sw s0,8(sp) + 3006054: 0800 addi s0,sp,16 + /* Config PIN4 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_ADC_AIN6); /* Check function selection */ + 3006056: 010c07b7 lui a5,0x10c0 + 300605a: 23c78513 addi a0,a5,572 # 10c023c + 300605e: 20c1 jal ra,300611e + HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_ADC_AIN6, PULL_NONE); /* Pull-up and Pull-down */ + 3006060: 4581 li a1,0 + 3006062: 010c07b7 lui a5,0x10c0 + 3006066: 23c78513 addi a0,a5,572 # 10c023c + 300606a: 2845 jal ra,300611a + HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_ADC_AIN6, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 300606c: 4581 li a1,0 + 300606e: 010c07b7 lui a5,0x10c0 + 3006072: 23c78513 addi a0,a5,572 # 10c023c + 3006076: 2045 jal ra,3006116 + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_ADC_AIN6, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3006078: 4585 li a1,1 + 300607a: 010c07b7 lui a5,0x10c0 + 300607e: 23c78513 addi a0,a5,572 # 10c023c + 3006082: 2841 jal ra,3006112 + HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_ADC_AIN6, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3006084: 4589 li a1,2 + 3006086: 010c07b7 lui a5,0x10c0 + 300608a: 23c78513 addi a0,a5,572 # 10c023c + 300608e: 2041 jal ra,300610e + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + 3006090: 019007b7 lui a5,0x1900 + 3006094: 23378513 addi a0,a5,563 # 1900233 + 3006098: 2059 jal ra,300611e + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + 300609a: 4581 li a1,0 + 300609c: 019007b7 lui a5,0x1900 + 30060a0: 23378513 addi a0,a5,563 # 1900233 + 30060a4: 289d jal ra,300611a + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 30060a6: 4581 li a1,0 + 30060a8: 019007b7 lui a5,0x1900 + 30060ac: 23378513 addi a0,a5,563 # 1900233 + 30060b0: 209d jal ra,3006116 + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 30060b2: 4585 li a1,1 + 30060b4: 019007b7 lui a5,0x1900 + 30060b8: 23378513 addi a0,a5,563 # 1900233 + 30060bc: 2899 jal ra,3006112 + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 30060be: 4589 li a1,2 + 30060c0: 019007b7 lui a5,0x1900 + 30060c4: 23378513 addi a0,a5,563 # 1900233 + 30060c8: 2099 jal ra,300610e + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + 30060ca: 019407b7 lui a5,0x1940 + 30060ce: 23378513 addi a0,a5,563 # 1940233 + 30060d2: 20b1 jal ra,300611e + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + 30060d4: 4589 li a1,2 + 30060d6: 019407b7 lui a5,0x1940 + 30060da: 23378513 addi a0,a5,563 # 1940233 + 30060de: 2835 jal ra,300611a + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 30060e0: 4581 li a1,0 + 30060e2: 019407b7 lui a5,0x1940 + 30060e6: 23378513 addi a0,a5,563 # 1940233 + 30060ea: 2035 jal ra,3006116 + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 30060ec: 4585 li a1,1 + 30060ee: 019407b7 lui a5,0x1940 + 30060f2: 23378513 addi a0,a5,563 # 1940233 + 30060f6: 2831 jal ra,3006112 + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 30060f8: 4589 li a1,2 + 30060fa: 019407b7 lui a5,0x1940 + 30060fe: 23378513 addi a0,a5,563 # 1940233 + 3006102: 2031 jal ra,300610e +} + 3006104: 0001 nop + 3006106: 40b2 lw ra,12(sp) + 3006108: 4422 lw s0,8(sp) + 300610a: 0141 addi sp,sp,16 + 300610c: 8082 ret + +0300610e : + 300610e: 924ff06f j 3005232 + +03006112 : + 3006112: 8d4ff06f j 30051e6 + +03006116 : + 3006116: 884ff06f j 300519a + +0300611a : + 300611a: 834ff06f j 300514e + +0300611e : + 300611e: ff7fe06f j 3005114 + +03006122 : + +void SystemInit(void) +{ + 3006122: 1141 addi sp,sp,-16 + 3006124: c606 sw ra,12(sp) + 3006126: c422 sw s0,8(sp) + 3006128: 0800 addi s0,sp,16 + IOConfig(); + 300612a: 3715 jal ra,300604e + UART0_Init(); + 300612c: 3d99 jal ra,3005f82 + ADC0_Init(); + 300612e: 39b5 jal ra,3005daa + TIMER3_Init(); + 3006130: 3b89 jal ra,3005e82 + + /* USER CODE BEGIN system_init */ + HAL_TIMER_Start(&g_timer3); + 3006132: 040007b7 lui a5,0x4000 + 3006136: 49c78513 addi a0,a5,1180 # 400049c + 300613a: c7aff0ef jal ra,30055b4 + HAL_ADC_StartIt(&g_adc0); + 300613e: 040007b7 lui a5,0x4000 + 3006142: 54478513 addi a0,a5,1348 # 4000544 + 3006146: ba9fb0ef jal ra,3001cee + HAL_ADC_SoftTrigSample(&g_adc0, ADC_SOC_NUM1); + 300614a: 4585 li a1,1 + 300614c: 040007b7 lui a5,0x4000 + 3006150: 54478513 addi a0,a5,1348 # 4000544 + 3006154: cc7fb0ef jal ra,3001e1a + /* USER CODE END system_init */ + 3006158: 0001 nop + 300615a: 40b2 lw ra,12(sp) + 300615c: 4422 lw s0,8(sp) + 300615e: 0141 addi sp,sp,16 + 3006160: 8082 ret + +03006162 : +float adc_num[adc_shownum]={0}; +unsigned int i=0; + + +void TIMER3_InterruptProcess(void *handle) +{ + 3006162: 7179 addi sp,sp,-48 + 3006164: d606 sw ra,44(sp) + 3006166: d422 sw s0,40(sp) + 3006168: 1800 addi s0,sp,48 + 300616a: fca42e23 sw a0,-36(s0) + unsigned int ret = HAL_ADC_GetConvResult(&g_adc0, ADC_SOC_NUM1); + 300616e: 4585 li a1,1 + 3006170: 040007b7 lui a5,0x4000 + 3006174: 54478513 addi a0,a5,1348 # 4000544 + 3006178: d25fb0ef jal ra,3001e9c + 300617c: fea42623 sw a0,-20(s0) + + + adc_num[i] = (float)ret / (float)4096 * 3.3; + 3006180: fec42783 lw a5,-20(s0) + 3006184: d017f753 fcvt.s.wu fa4,a5 + 3006188: 030077b7 lui a5,0x3007 + 300618c: a3c7a787 flw fa5,-1476(a5) # 3006a3c + 3006190: 18f77753 fdiv.s fa4,fa4,fa5 + 3006194: 040027b7 lui a5,0x4002 + 3006198: 2047a783 lw a5,516(a5) # 4002204 + 300619c: 03007737 lui a4,0x3007 + 30061a0: a4072787 flw fa5,-1472(a4) # 3006a40 + 30061a4: 10f777d3 fmul.s fa5,fa4,fa5 + 30061a8: 04000737 lui a4,0x4000 + 30061ac: 5e470713 addi a4,a4,1508 # 40005e4 + 30061b0: 078a slli a5,a5,0x2 + 30061b2: 97ba add a5,a5,a4 + 30061b4: e39c fsw fa5,0(a5) + i++; + 30061b6: 040027b7 lui a5,0x4002 + 30061ba: 2047a783 lw a5,516(a5) # 4002204 + 30061be: 00178713 addi a4,a5,1 + 30061c2: 040027b7 lui a5,0x4002 + 30061c6: 20e7a223 sw a4,516(a5) # 4002204 + if(i>adc_shownum){ + 30061ca: 040027b7 lui a5,0x4002 + 30061ce: 2047a703 lw a4,516(a5) # 4002204 + 30061d2: 70800793 li a5,1800 + 30061d6: 06e7f563 bgeu a5,a4,3006240 + for(i=0;i + 30061e2: a099 j 3006228 + { + DBG_PRINTF("voltage: %.2f\r\n", adc_num[i]); + 30061e4: 040027b7 lui a5,0x4002 + 30061e8: 2047a783 lw a5,516(a5) # 4002204 + 30061ec: 04000737 lui a4,0x4000 + 30061f0: 5e470713 addi a4,a4,1508 # 40005e4 + 30061f4: 078a slli a5,a5,0x2 + 30061f6: 97ba add a5,a5,a4 + 30061f8: 639c flw fa5,0(a5) + 30061fa: 20f78553 fmv.s fa0,fa5 + 30061fe: 20b1 jal ra,300624a <__extendsfdf2> + 3006200: 87aa mv a5,a0 + 3006202: 882e mv a6,a1 + 3006204: 863e mv a2,a5 + 3006206: 86c2 mv a3,a6 + 3006208: 030077b7 lui a5,0x3007 + 300620c: a2c78513 addi a0,a5,-1492 # 3006a2c + 3006210: b31fe0ef jal ra,3004d40 + for(i=0;i + 300621c: 00178713 addi a4,a5,1 + 3006220: 040027b7 lui a5,0x4002 + 3006224: 20e7a223 sw a4,516(a5) # 4002204 + 3006228: 040027b7 lui a5,0x4002 + 300622c: 2047a703 lw a4,516(a5) # 4002204 + 3006230: 70700793 li a5,1799 + 3006234: fae7f8e3 bgeu a5,a4,30061e4 + } + i=0; + 3006238: 040027b7 lui a5,0x4002 + 300623c: 2007a223 sw zero,516(a5) # 4002204 + } + +} + 3006240: 0001 nop + 3006242: 50b2 lw ra,44(sp) + 3006244: 5422 lw s0,40(sp) + 3006246: 6145 addi sp,sp,48 + 3006248: 8082 ret + +0300624a <__extendsfdf2>: + 300624a: 1141 addi sp,sp,-16 + 300624c: c606 sw ra,12(sp) + 300624e: c422 sw s0,8(sp) + 3006250: c226 sw s1,4(sp) + 3006252: e00506d3 fmv.x.w a3,fa0 + 3006256: 002027f3 frrm a5 + 300625a: 0176d513 srli a0,a3,0x17 + 300625e: 0ff57513 andi a0,a0,255 + 3006262: 00800437 lui s0,0x800 + 3006266: 00150793 addi a5,a0,1 # 14000001 + 300626a: 147d addi s0,s0,-1 # 7fffff + 300626c: 0ff7f793 andi a5,a5,255 + 3006270: 4705 li a4,1 + 3006272: 8c75 and s0,s0,a3 + 3006274: 01f6d493 srli s1,a3,0x1f + 3006278: 00f75963 bge a4,a5,300628a <__extendsfdf2+0x40> + 300627c: 00345793 srli a5,s0,0x3 + 3006280: 38050513 addi a0,a0,896 + 3006284: 0476 slli s0,s0,0x1d + 3006286: 4701 li a4,0 + 3006288: a891 j 30062dc <__extendsfdf2+0x92> + 300628a: e915 bnez a0,30062be <__extendsfdf2+0x74> + 300628c: c459 beqz s0,300631a <__extendsfdf2+0xd0> + 300628e: 8522 mv a0,s0 + 3006290: 2c6d jal ra,300654a <__clzsi2> + 3006292: 47a9 li a5,10 + 3006294: 00a7cf63 blt a5,a0,30062b2 <__extendsfdf2+0x68> + 3006298: 47ad li a5,11 + 300629a: 8f89 sub a5,a5,a0 + 300629c: 01550713 addi a4,a0,21 + 30062a0: 00f457b3 srl a5,s0,a5 + 30062a4: 00e41433 sll s0,s0,a4 + 30062a8: 38900713 li a4,905 + 30062ac: 40a70533 sub a0,a4,a0 + 30062b0: bfd9 j 3006286 <__extendsfdf2+0x3c> + 30062b2: ff550793 addi a5,a0,-11 + 30062b6: 00f417b3 sll a5,s0,a5 + 30062ba: 4401 li s0,0 + 30062bc: b7f5 j 30062a8 <__extendsfdf2+0x5e> + 30062be: c02d beqz s0,3006320 <__extendsfdf2+0xd6> + 30062c0: 00400737 lui a4,0x400 + 30062c4: 8f61 and a4,a4,s0 + 30062c6: 00345793 srli a5,s0,0x3 + 30062ca: 00173713 seqz a4,a4 + 30062ce: 000806b7 lui a3,0x80 + 30062d2: 0712 slli a4,a4,0x4 + 30062d4: 0476 slli s0,s0,0x1d + 30062d6: 8fd5 or a5,a5,a3 + 30062d8: 7ff00513 li a0,2047 + 30062dc: 00100637 lui a2,0x100 + 30062e0: 167d addi a2,a2,-1 # fffff + 30062e2: 8ff1 and a5,a5,a2 + 30062e4: 80100637 lui a2,0x80100 + 30062e8: 167d addi a2,a2,-1 # 800fffff + 30062ea: 7ff57513 andi a0,a0,2047 + 30062ee: 0552 slli a0,a0,0x14 + 30062f0: 8ff1 and a5,a5,a2 + 30062f2: 80000637 lui a2,0x80000 + 30062f6: 8fc9 or a5,a5,a0 + 30062f8: fff64613 not a2,a2 + 30062fc: 01f49693 slli a3,s1,0x1f + 3006300: 8ff1 and a5,a5,a2 + 3006302: 00d7e633 or a2,a5,a3 + 3006306: 8522 mv a0,s0 + 3006308: 85b2 mv a1,a2 + 300630a: c319 beqz a4,3006310 <__extendsfdf2+0xc6> + 300630c: 00172073 csrs fflags,a4 + 3006310: 40b2 lw ra,12(sp) + 3006312: 4422 lw s0,8(sp) + 3006314: 4492 lw s1,4(sp) + 3006316: 0141 addi sp,sp,16 + 3006318: 8082 ret + 300631a: 4781 li a5,0 + 300631c: 4501 li a0,0 + 300631e: b7a5 j 3006286 <__extendsfdf2+0x3c> + 3006320: 4781 li a5,0 + 3006322: 7ff00513 li a0,2047 + 3006326: b785 j 3006286 <__extendsfdf2+0x3c> + +03006328 <__truncdfsf2>: + 3006328: 00202873 frrm a6 + 300632c: 001006b7 lui a3,0x100 + 3006330: 16fd addi a3,a3,-1 # fffff + 3006332: 8eed and a3,a3,a1 + 3006334: 0145d893 srli a7,a1,0x14 + 3006338: 00369793 slli a5,a3,0x3 + 300633c: 7ff8f893 andi a7,a7,2047 + 3006340: 01d55693 srli a3,a0,0x1d + 3006344: 8edd or a3,a3,a5 + 3006346: 00188793 addi a5,a7,1 + 300634a: 7ff7f793 andi a5,a5,2047 + 300634e: 4705 li a4,1 + 3006350: 81fd srli a1,a1,0x1f + 3006352: 00351613 slli a2,a0,0x3 + 3006356: 16f75b63 bge a4,a5,30064cc <__truncdfsf2+0x1a4> + 300635a: c8088713 addi a4,a7,-896 + 300635e: 0fe00793 li a5,254 + 3006362: 0ae7d063 bge a5,a4,3006402 <__truncdfsf2+0xda> + 3006366: 04080063 beqz a6,30063a6 <__truncdfsf2+0x7e> + 300636a: 478d li a5,3 + 300636c: 02f81963 bne a6,a5,300639e <__truncdfsf2+0x76> + 3006370: c99d beqz a1,30063a6 <__truncdfsf2+0x7e> + 3006372: 57fd li a5,-1 + 3006374: 0fe00713 li a4,254 + 3006378: 4681 li a3,0 + 300637a: 4615 li a2,5 + 300637c: 4509 li a0,2 + 300637e: 00166613 ori a2,a2,1 + 3006382: 1aa80063 beq a6,a0,3006522 <__truncdfsf2+0x1fa> + 3006386: 450d li a0,3 + 3006388: 18a80a63 beq a6,a0,300651c <__truncdfsf2+0x1f4> + 300638c: 12081763 bnez a6,30064ba <__truncdfsf2+0x192> + 3006390: 00f7f513 andi a0,a5,15 + 3006394: 4891 li a7,4 + 3006396: 13150263 beq a0,a7,30064ba <__truncdfsf2+0x192> + 300639a: 0791 addi a5,a5,4 + 300639c: aa39 j 30064ba <__truncdfsf2+0x192> + 300639e: 4789 li a5,2 + 30063a0: fcf819e3 bne a6,a5,3006372 <__truncdfsf2+0x4a> + 30063a4: d5f9 beqz a1,3006372 <__truncdfsf2+0x4a> + 30063a6: 4781 li a5,0 + 30063a8: 0ff00713 li a4,255 + 30063ac: 4615 li a2,5 + 30063ae: 00579693 slli a3,a5,0x5 + 30063b2: 0006db63 bgez a3,30063c8 <__truncdfsf2+0xa0> + 30063b6: 0705 addi a4,a4,1 # 400001 + 30063b8: 0ff00693 li a3,255 + 30063bc: 16d70563 beq a4,a3,3006526 <__truncdfsf2+0x1fe> + 30063c0: fc0006b7 lui a3,0xfc000 + 30063c4: 16fd addi a3,a3,-1 # fbffffff + 30063c6: 8ff5 and a5,a5,a3 + 30063c8: 0ff00693 li a3,255 + 30063cc: 838d srli a5,a5,0x3 + 30063ce: 00d71663 bne a4,a3,30063da <__truncdfsf2+0xb2> + 30063d2: c781 beqz a5,30063da <__truncdfsf2+0xb2> + 30063d4: 004007b7 lui a5,0x400 + 30063d8: 4581 li a1,0 + 30063da: 008006b7 lui a3,0x800 + 30063de: 16fd addi a3,a3,-1 # 7fffff + 30063e0: 8ff5 and a5,a5,a3 + 30063e2: 808006b7 lui a3,0x80800 + 30063e6: 0ff77713 andi a4,a4,255 + 30063ea: 16fd addi a3,a3,-1 # 807fffff + 30063ec: 075e slli a4,a4,0x17 + 30063ee: 8ff5 and a5,a5,a3 + 30063f0: 05fe slli a1,a1,0x1f + 30063f2: 8fd9 or a5,a5,a4 + 30063f4: 8fcd or a5,a5,a1 + 30063f6: c219 beqz a2,30063fc <__truncdfsf2+0xd4> + 30063f8: 00162073 csrs fflags,a2 + 30063fc: f0078553 fmv.w.x fa0,a5 + 3006400: 8082 ret + 3006402: 08e04e63 bgtz a4,300649e <__truncdfsf2+0x176> + 3006406: 57a5 li a5,-23 + 3006408: 0ef74d63 blt a4,a5,3006502 <__truncdfsf2+0x1da> + 300640c: 008007b7 lui a5,0x800 + 3006410: 4379 li t1,30 + 3006412: 8edd or a3,a3,a5 + 3006414: 40e30333 sub t1,t1,a4 + 3006418: 47fd li a5,31 + 300641a: 0467ce63 blt a5,t1,3006476 <__truncdfsf2+0x14e> + 300641e: c8288893 addi a7,a7,-894 + 3006422: 011617b3 sll a5,a2,a7 + 3006426: 00f037b3 snez a5,a5 + 300642a: 011696b3 sll a3,a3,a7 + 300642e: 00665333 srl t1,a2,t1 + 3006432: 8edd or a3,a3,a5 + 3006434: 00d367b3 or a5,t1,a3 + 3006438: 4701 li a4,0 + 300643a: cff9 beqz a5,3006518 <__truncdfsf2+0x1f0> + 300643c: 00179713 slli a4,a5,0x1 + 3006440: 00777693 andi a3,a4,7 + 3006444: 4601 li a2,0 + 3006446: c28d beqz a3,3006468 <__truncdfsf2+0x140> + 3006448: 4689 li a3,2 + 300644a: 0cd80263 beq a6,a3,300650e <__truncdfsf2+0x1e6> + 300644e: 468d li a3,3 + 3006450: 0ad80b63 beq a6,a3,3006506 <__truncdfsf2+0x1de> + 3006454: 4605 li a2,1 + 3006456: 00081963 bnez a6,3006468 <__truncdfsf2+0x140> + 300645a: 00f77693 andi a3,a4,15 + 300645e: 4511 li a0,4 + 3006460: 4605 li a2,1 + 3006462: 00a68363 beq a3,a0,3006468 <__truncdfsf2+0x140> + 3006466: 0711 addi a4,a4,4 + 3006468: 01b75693 srli a3,a4,0x1b + 300646c: 0016c693 xori a3,a3,1 + 3006470: 8a85 andi a3,a3,1 + 3006472: 4701 li a4,0 + 3006474: a83d j 30064b2 <__truncdfsf2+0x18a> + 3006476: 57f9 li a5,-2 + 3006478: 40e78733 sub a4,a5,a4 + 300647c: 02000793 li a5,32 + 3006480: 00e6d733 srl a4,a3,a4 + 3006484: 4501 li a0,0 + 3006486: 00f30663 beq t1,a5,3006492 <__truncdfsf2+0x16a> + 300648a: ca288893 addi a7,a7,-862 + 300648e: 01169533 sll a0,a3,a7 + 3006492: 00c567b3 or a5,a0,a2 + 3006496: 00f037b3 snez a5,a5 + 300649a: 8fd9 or a5,a5,a4 + 300649c: bf71 j 3006438 <__truncdfsf2+0x110> + 300649e: 051a slli a0,a0,0x6 + 30064a0: 00a037b3 snez a5,a0 + 30064a4: 068e slli a3,a3,0x3 + 30064a6: 8275 srli a2,a2,0x1d + 30064a8: 8edd or a3,a3,a5 + 30064aa: 00c6e7b3 or a5,a3,a2 + 30064ae: 4681 li a3,0 + 30064b0: 4601 li a2,0 + 30064b2: 0077f513 andi a0,a5,7 + 30064b6: ec0513e3 bnez a0,300637c <__truncdfsf2+0x54> + 30064ba: ee068ae3 beqz a3,30063ae <__truncdfsf2+0x86> + 30064be: 00167693 andi a3,a2,1 + 30064c2: ee0686e3 beqz a3,30063ae <__truncdfsf2+0x86> + 30064c6: 00266613 ori a2,a2,2 + 30064ca: b5d5 j 30063ae <__truncdfsf2+0x86> + 30064cc: 00c6e7b3 or a5,a3,a2 + 30064d0: 00089563 bnez a7,30064da <__truncdfsf2+0x1b2> + 30064d4: 00f037b3 snez a5,a5 + 30064d8: b785 j 3006438 <__truncdfsf2+0x110> + 30064da: cf8d beqz a5,3006514 <__truncdfsf2+0x1ec> + 30064dc: 7ff00793 li a5,2047 + 30064e0: 4601 li a2,0 + 30064e2: 00f89863 bne a7,a5,30064f2 <__truncdfsf2+0x1ca> + 30064e6: 00400637 lui a2,0x400 + 30064ea: 8e75 and a2,a2,a3 + 30064ec: 00163613 seqz a2,a2 + 30064f0: 0612 slli a2,a2,0x4 + 30064f2: 068e slli a3,a3,0x3 + 30064f4: 020007b7 lui a5,0x2000 + 30064f8: 8fd5 or a5,a5,a3 + 30064fa: 0ff00713 li a4,255 + 30064fe: 4681 li a3,0 + 3006500: bf4d j 30064b2 <__truncdfsf2+0x18a> + 3006502: 4785 li a5,1 + 3006504: bf25 j 300643c <__truncdfsf2+0x114> + 3006506: 4605 li a2,1 + 3006508: f1a5 bnez a1,3006468 <__truncdfsf2+0x140> + 300650a: 0721 addi a4,a4,8 + 300650c: bfb1 j 3006468 <__truncdfsf2+0x140> + 300650e: 4605 li a2,1 + 3006510: dda1 beqz a1,3006468 <__truncdfsf2+0x140> + 3006512: bfe5 j 300650a <__truncdfsf2+0x1e2> + 3006514: 0ff00713 li a4,255 + 3006518: 4601 li a2,0 + 300651a: bd51 j 30063ae <__truncdfsf2+0x86> + 300651c: fdd9 bnez a1,30064ba <__truncdfsf2+0x192> + 300651e: 07a1 addi a5,a5,8 # 2000008 + 3006520: bf69 j 30064ba <__truncdfsf2+0x192> + 3006522: ddc1 beqz a1,30064ba <__truncdfsf2+0x192> + 3006524: bfed j 300651e <__truncdfsf2+0x1f6> + 3006526: 4781 li a5,0 + 3006528: 00080e63 beqz a6,3006544 <__truncdfsf2+0x21c> + 300652c: 468d li a3,3 + 300652e: 00d81763 bne a6,a3,300653c <__truncdfsf2+0x214> + 3006532: c989 beqz a1,3006544 <__truncdfsf2+0x21c> + 3006534: 57fd li a5,-1 + 3006536: 0fe00713 li a4,254 + 300653a: a029 j 3006544 <__truncdfsf2+0x21c> + 300653c: 4689 li a3,2 + 300653e: fed81be3 bne a6,a3,3006534 <__truncdfsf2+0x20c> + 3006542: d9ed beqz a1,3006534 <__truncdfsf2+0x20c> + 3006544: 00566613 ori a2,a2,5 + 3006548: b541 j 30063c8 <__truncdfsf2+0xa0> + +0300654a <__clzsi2>: + 300654a: 67c1 lui a5,0x10 + 300654c: 02f57663 bgeu a0,a5,3006578 <__clzsi2+0x2e> + 3006550: 0ff00793 li a5,255 + 3006554: 00a7b7b3 sltu a5,a5,a0 + 3006558: 078e slli a5,a5,0x3 + 300655a: 02000713 li a4,32 + 300655e: 8f1d sub a4,a4,a5 + 3006560: 00f557b3 srl a5,a0,a5 + 3006564: 00000517 auipc a0,0x0 + 3006568: 5e452503 lw a0,1508(a0) # 3006b48 <_GLOBAL_OFFSET_TABLE_+0x4> + 300656c: 97aa add a5,a5,a0 + 300656e: 0007c503 lbu a0,0(a5) # 10000 + 3006572: 40a70533 sub a0,a4,a0 + 3006576: 8082 ret + 3006578: 01000737 lui a4,0x1000 + 300657c: 47c1 li a5,16 + 300657e: fce56ee3 bltu a0,a4,300655a <__clzsi2+0x10> + 3006582: 47e1 li a5,24 + 3006584: bfd9 j 300655a <__clzsi2+0x10> + ... + +03006588 <__rodata_start>: + 3006588: 9680 pop {ra,s0-s6},384 + 300658a: 4b18 lw a4,16(a4) + +0300658c : + 300658c: 0000 1400 0000 0000 0140 0000 1000 1400 ........@....... + 300659c: 0000 0000 0144 0000 2000 1400 0000 0000 ....D.... ...... + 30065ac: 0148 0000 3000 1400 0000 0000 014c 0000 H....0......L... + 30065bc: 0000 1430 0000 0000 0240 0000 1000 1430 ..0.....@.....0. + 30065cc: 0000 0000 0244 0000 2000 1430 0000 0000 ....D.... 0..... + 30065dc: 0248 0000 3000 1430 0000 0000 024c 0000 H....00.....L... + 30065ec: 0000 1438 0000 0000 0040 0000 0000 1420 ..8.....@..... . + 30065fc: 0000 0000 0180 0000 1000 1420 0000 0000 .......... ..... + 300660c: 0184 0000 0000 1410 0000 0000 01c0 0000 ................ + 300661c: 1000 1410 0000 0000 01c4 0000 0000 1460 ..............`. + 300662c: 0001 0000 02c0 0000 0000 1470 0000 0000 ..........p..... + 300663c: 0440 0000 1000 1470 0000 0000 0444 0000 @.....p.....D... + 300664c: 2000 1470 0000 0000 0448 0000 3000 1470 . p.....H....0p. + 300665c: 0000 0000 044c 0000 0000 1440 0000 0000 ....L.....@..... + 300666c: 0200 0000 0000 14b0 0000 0000 0280 0000 ................ + 300667c: 1000 14b0 0000 0000 0284 0000 2000 14b0 ............. .. + 300668c: 0000 0000 0288 0000 0000 1c00 0000 0000 ................ + 300669c: 0300 0000 0000 1450 0000 0000 0480 0000 ......P......... + 30066ac: 1000 1450 0000 0000 0484 0000 2000 1450 ..P.......... P. + 30066bc: 0000 0000 0488 0000 3000 1450 0000 0000 .........0P..... + 30066cc: 048c 0000 4000 1450 0000 0000 0490 0000 .....@P......... + 30066dc: 5000 1450 0000 0000 0494 0000 1000 1440 .PP...........@. + 30066ec: 0004 0000 03c0 0000 0000 14c0 0000 0000 ................ + 30066fc: 04c0 0000 1000 14c0 0000 0000 04c4 0000 ................ + 300670c: 0000 147d 0000 0000 0b00 0000 0000 1480 ..}............. + 300671c: 0000 0000 0380 0000 0000 14a0 0000 0000 ................ + 300672c: 0400 0000 1000 14a0 0000 0000 0404 0000 ................ + 300673c: 2000 14a0 0000 0000 0408 0000 3000 14a0 . ...........0.. + 300674c: 0000 0000 040c 0000 0000 1001 0000 0000 ................ + 300675c: 0340 0000 0000 1810 0005 0000 0a60 0000 @...........`... + 300676c: 0000 1830 0005 0000 0a70 0000 0000 1840 ..0.....p.....@. + 300677c: 0005 0000 0a80 0000 0000 1820 0005 0000 .......... ..... + 300678c: 0a90 0000 1000 1820 0005 0000 0a90 0004 ...... ......... + 300679c: 0000 1800 0002 0000 0a00 0000 0000 1471 ..............q. + 30067ac: 0003 0000 0500 0000 2e2e 642f 6972 6576 ........../drive + 30067bc: 7372 612f 6364 692f 636e 612f 6364 695f rs/adc/inc/adc_i + 30067cc: 2e70 0068 2e2e 642f 6972 6576 7372 612f p.h.../drivers/a + 30067dc: 6364 732f 6372 612f 6364 632e 0000 0000 dc/src/adc.c.... + 30067ec: 0000 3f80 0000 4480 5547 4055 0000 4580 ...?...DGUU@...E + 30067fc: 6666 4026 51ec 4068 2160 0300 216c 0300 ff&@.Qh@`!..l!.. + 300680c: 2178 0300 2184 0300 2190 0300 219c 0300 x!...!...!...!.. + 300681c: 21a8 0300 21b4 0300 21c0 0300 2e2e 642f .!...!...!..../d + 300682c: 6972 6576 7372 622f 7361 2f65 7273 2f63 rivers/base/src/ + 300683c: 6e69 6574 7272 7075 2e74 0063 2640 0300 interrupt.c.@&.. + 300684c: 2692 0300 26e4 0300 2736 0300 2788 0300 .&...&..6'...'.. + 300685c: 27da 0300 282c 0300 287e 0300 2914 0300 .'..,(..~(...).. + 300686c: 2966 0300 29b8 0300 2a0a 0300 2a5c 0300 f)...)...*..\*.. + 300687c: 2aae 0300 2b00 0300 2b52 0300 2e2e 642f .*...+..R+..../d + 300688c: 6972 6576 7372 632f 6772 692f 636e 632f rivers/crg/inc/c + 300689c: 6772 695f 2e70 0068 2e2e 642f 6972 6576 rg_ip.h.../drive + 30068ac: 7372 632f 6772 732f 6372 632f 6772 632e rs/crg/src/crg.c + ... + 30068c4: 0001 0000 0002 0000 0003 0000 0004 0000 ................ + 30068d4: 0005 0000 0006 0000 0007 0000 35d4 0300 .............5.. + 30068e4: 35de 0300 35f6 0300 35d4 0300 3612 0300 .5...5...5...6.. + 30068f4: 35d4 0300 4b30 0300 4b9a 0300 4b9a 0300 .5..0K...K...K.. + 3006904: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006914: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006924: 4a70 0300 4ac6 0300 4b9a 0300 4b5a 0300 pJ...J...K..ZK.. + 3006934: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006944: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006954: 4b9a 0300 4b30 0300 4b9a 0300 4b9a 0300 .K..0K...K...K.. + 3006964: 4a9a 0300 4b9a 0300 4af0 0300 4b9a 0300 .J...K...J...K.. + 3006974: 4b9a 0300 4b30 0300 2e2e 642f 6972 6576 .K..0K..../drive + 3006984: 7372 692f 636f 676d 692f 636e 692f 636f rs/iocmg/inc/ioc + 3006994: 676d 695f 2e70 0068 2e2e 642f 6972 6576 mg_ip.h.../drive + 30069a4: 7372 692f 636f 676d 732f 6372 692f 636f rs/iocmg/src/ioc + 30069b4: 676d 632e 0000 0000 2e2e 642f 6972 6576 mg.c....../drive + 30069c4: 7372 742f 6d69 7265 692f 636e 742f 6d69 rs/timer/inc/tim + 30069d4: 7265 695f 2e70 0068 2e2e 642f 6972 6576 er_ip.h.../drive + 30069e4: 7372 742f 6d69 7265 732f 6372 742f 6d69 rs/timer/src/tim + 30069f4: 7265 632e 0000 0000 58f6 0300 590c 0300 er.c.....X...Y.. + 3006a04: 5922 0300 5938 0300 594e 0300 2e2e 642f "Y..8Y..NY..../d + 3006a14: 6972 6576 7372 752f 7261 2f74 7273 2f63 rivers/uart/src/ + 3006a24: 6175 7472 632e 0000 6f76 746c 6761 3a65 uart.c..voltage: + 3006a34: 2520 322e 0d66 000a 0000 4580 3333 4053 %.2f......E33S@ + +03006a44 <__clz_tab>: + 3006a44: 0100 0202 0303 0303 0404 0404 0404 0404 ................ + 3006a54: 0505 0505 0505 0505 0505 0505 0505 0505 ................ + 3006a64: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 3006a74: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 3006a84: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006a94: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006aa4: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006ab4: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006ac4: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006ad4: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006ae4: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006af4: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b04: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b14: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b24: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b34: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + +03006b44 <_GLOBAL_OFFSET_TABLE_>: + 3006b44: 0000 0000 6a44 0300 ffff ffff 0000 0000 ....Dj.......... + +out/bin/target.elf: file format elf32-littleriscv + + +Disassembly of section .text.entry: + +03000004 <_start>: + + .section .text.entry + .global _start + .option norvc +_start: + j handle_reset + 3000004: 4fc0006f j 3000500 + +03000008 : +.endm + +/* The interrupt vector table must be aligned with 4 bytes */ +.align 2 +TrapHandler: + j TrapVector /* trap and INT 0 */ + 3000008: 4680006f j 3000470 + j TrapVector /* INT 1 */ + 300000c: 4640006f j 3000470 + j TrapVector /* INT 2 */ + 3000010: 4600006f j 3000470 + j TrapVector /* INT 3 */ + 3000014: 45c0006f j 3000470 + j TrapVector /* INT 4 */ + 3000018: 4580006f j 3000470 + j TrapVector /* INT 5 */ + 300001c: 4540006f j 3000470 + j TrapVector /* INT 6 */ + 3000020: 4500006f j 3000470 + j TrapVector /* INT 7 */ + 3000024: 44c0006f j 3000470 + j TrapVector /* INT 8 */ + 3000028: 4480006f j 3000470 + j TrapVector /* INT 9 */ + 300002c: 4440006f j 3000470 + j TrapVector /* INT 10 */ + 3000030: 4400006f j 3000470 + j TrapVector /* INT 11 */ + 3000034: 43c0006f j 3000470 + j TrapVector /* INT 12 */ + 3000038: 4380006f j 3000470 + j TrapVector /* INT 13 */ + 300003c: 4340006f j 3000470 + j TrapVector /* INT 14 */ + 3000040: 4300006f j 3000470 + j TrapVector /* INT 15 */ + 3000044: 42c0006f j 3000470 + j TrapVector /* INT 16 */ + 3000048: 4280006f j 3000470 + j TrapVector /* INT 17 */ + 300004c: 4240006f j 3000470 + j TrapVector /* INT 18 */ + 3000050: 4200006f j 3000470 + j TrapVector /* INT 19 */ + 3000054: 41c0006f j 3000470 + j TrapVector /* INT 20 */ + 3000058: 4180006f j 3000470 + j TrapVector /* INT 21 */ + 300005c: 4140006f j 3000470 + j TrapVector /* INT 22 */ + 3000060: 4100006f j 3000470 + j TrapVector /* INT 23 */ + 3000064: 40c0006f j 3000470 + j TrapVector /* INT 24 */ + 3000068: 4080006f j 3000470 + j TrapVector /* INT 25 */ + 300006c: 4040006f j 3000470 + + j IntHandler /* INT 26 */ + 3000070: 2640006f j 30002d4 + j IntHandler /* INT 27 */ + 3000074: 2600006f j 30002d4 + j IntHandler /* INT 28 */ + 3000078: 25c0006f j 30002d4 + j IntHandler /* INT 29 */ + 300007c: 2580006f j 30002d4 + j IntHandler /* INT 30 */ + 3000080: 2540006f j 30002d4 + j IntHandler /* INT 31 */ + 3000084: 2500006f j 30002d4 + j IntHandler /* INT 32 */ + 3000088: 24c0006f j 30002d4 + j IntHandler /* INT 33 */ + 300008c: 2480006f j 30002d4 + j IntHandler /* INT 34 */ + 3000090: 2440006f j 30002d4 + j IntHandler /* INT 35 */ + 3000094: 2400006f j 30002d4 + j IntHandler /* INT 36 */ + 3000098: 23c0006f j 30002d4 + j IntHandler /* INT 37 */ + 300009c: 2380006f j 30002d4 + j IntHandler /* INT 38 */ + 30000a0: 2340006f j 30002d4 + j IntHandler /* INT 39 */ + 30000a4: 2300006f j 30002d4 + j IntHandler /* INT 40 */ + 30000a8: 22c0006f j 30002d4 + j IntHandler /* INT 41 */ + 30000ac: 2280006f j 30002d4 + j IntHandler /* INT 42 */ + 30000b0: 2240006f j 30002d4 + j IntHandler /* INT 43 */ + 30000b4: 2200006f j 30002d4 + j IntHandler /* INT 44 */ + 30000b8: 21c0006f j 30002d4 + j IntHandler /* INT 45 */ + 30000bc: 2180006f j 30002d4 + j IntHandler /* INT 46 */ + 30000c0: 2140006f j 30002d4 + j IntHandler /* INT 47 */ + 30000c4: 2100006f j 30002d4 + j IntHandler /* INT 48 */ + 30000c8: 20c0006f j 30002d4 + j IntHandler /* INT 49 */ + 30000cc: 2080006f j 30002d4 + j IntHandler /* INT 50 */ + 30000d0: 2040006f j 30002d4 + j IntHandler /* INT 51 */ + 30000d4: 2000006f j 30002d4 + j IntHandler /* INT 52 */ + 30000d8: 1fc0006f j 30002d4 + j IntHandler /* INT 53 */ + 30000dc: 1f80006f j 30002d4 + j IntHandler /* INT 54 */ + 30000e0: 1f40006f j 30002d4 + j IntHandler /* INT 55 */ + 30000e4: 1f00006f j 30002d4 + j IntHandler /* INT 56 */ + 30000e8: 1ec0006f j 30002d4 + j IntHandler /* INT 57 */ + 30000ec: 1e80006f j 30002d4 + j IntHandler /* INT 58 */ + 30000f0: 1e40006f j 30002d4 + j IntHandler /* INT 59 */ + 30000f4: 1e00006f j 30002d4 + j IntHandler /* INT 60 */ + 30000f8: 1dc0006f j 30002d4 + j IntHandler /* INT 61 */ + 30000fc: 1d80006f j 30002d4 + j IntHandler /* INT 62 */ + 3000100: 1d40006f j 30002d4 + j IntHandler /* INT 63 */ + 3000104: 1d00006f j 30002d4 + j IntHandler /* INT 64 */ + 3000108: 1cc0006f j 30002d4 + j IntHandler /* INT 65 */ + 300010c: 1c80006f j 30002d4 + j IntHandler /* INT 66 */ + 3000110: 1c40006f j 30002d4 + j IntHandler /* INT 67 */ + 3000114: 1c00006f j 30002d4 + j IntHandler /* INT 68 */ + 3000118: 1bc0006f j 30002d4 + j IntHandler /* INT 69 */ + 300011c: 1b80006f j 30002d4 + j IntHandler /* INT 70 */ + 3000120: 1b40006f j 30002d4 + j IntHandler /* INT 71 */ + 3000124: 1b00006f j 30002d4 + j IntHandler /* INT 72 */ + 3000128: 1ac0006f j 30002d4 + j IntHandler /* INT 73 */ + 300012c: 1a80006f j 30002d4 + j IntHandler /* INT 74 */ + 3000130: 1a40006f j 30002d4 + j IntHandler /* INT 75 */ + 3000134: 1a00006f j 30002d4 + j IntHandler /* INT 76 */ + 3000138: 19c0006f j 30002d4 + j IntHandler /* INT 77 */ + 300013c: 1980006f j 30002d4 + j IntHandler /* INT 78 */ + 3000140: 1940006f j 30002d4 + j IntHandler /* INT 79 */ + 3000144: 1900006f j 30002d4 + j IntHandler /* INT 80 */ + 3000148: 18c0006f j 30002d4 + j IntHandler /* INT 81 */ + 300014c: 1880006f j 30002d4 + j IntHandler /* INT 82 */ + 3000150: 1840006f j 30002d4 + j IntHandler /* INT 83 */ + 3000154: 1800006f j 30002d4 + j IntHandler /* INT 84 */ + 3000158: 17c0006f j 30002d4 + j IntHandler /* INT 85 */ + 300015c: 1780006f j 30002d4 + j IntHandler /* INT 86 */ + 3000160: 1740006f j 30002d4 + j IntHandler /* INT 87 */ + 3000164: 1700006f j 30002d4 + j IntHandler /* INT 88 */ + 3000168: 16c0006f j 30002d4 + j IntHandler /* INT 89 */ + 300016c: 1680006f j 30002d4 + j IntHandler /* INT 90 */ + 3000170: 1640006f j 30002d4 + j IntHandler /* INT 91 */ + 3000174: 1600006f j 30002d4 + j IntHandler /* INT 92 */ + 3000178: 15c0006f j 30002d4 + j IntHandler /* INT 93 */ + 300017c: 1580006f j 30002d4 + j IntHandler /* INT 94 */ + 3000180: 1540006f j 30002d4 + j IntHandler /* INT 95 */ + 3000184: 1500006f j 30002d4 + j IntHandler /* INT 96 */ + 3000188: 14c0006f j 30002d4 + j IntHandler /* INT 97 */ + 300018c: 1480006f j 30002d4 + j IntHandler /* INT 98 */ + 3000190: 1440006f j 30002d4 + j IntHandler /* INT 99 */ + 3000194: 1400006f j 30002d4 + j IntHandler /* INT 100 */ + 3000198: 13c0006f j 30002d4 + j IntHandler /* INT 101 */ + 300019c: 1380006f j 30002d4 + j IntHandler /* INT 102 */ + 30001a0: 1340006f j 30002d4 + j IntHandler /* INT 103 */ + 30001a4: 1300006f j 30002d4 + j IntHandler /* INT 104 */ + 30001a8: 12c0006f j 30002d4 + j IntHandler /* INT 105 */ + 30001ac: 1280006f j 30002d4 + j IntHandler /* INT 106 */ + 30001b0: 1240006f j 30002d4 + j IntHandler /* INT 107 */ + 30001b4: 1200006f j 30002d4 + j IntHandler /* INT 108 */ + 30001b8: 11c0006f j 30002d4 + j IntHandler /* INT 109 */ + 30001bc: 1180006f j 30002d4 + j IntHandler /* INT 110 */ + 30001c0: 1140006f j 30002d4 + j IntHandler /* INT 111 */ + 30001c4: 1100006f j 30002d4 + j IntHandler /* INT 112 */ + 30001c8: 10c0006f j 30002d4 + j IntHandler /* INT 113 */ + 30001cc: 1080006f j 30002d4 + j IntHandler /* INT 114 */ + 30001d0: 1040006f j 30002d4 + j IntHandler /* INT 115 */ + 30001d4: 1000006f j 30002d4 + j IntHandler /* INT 116 */ + 30001d8: 0fc0006f j 30002d4 + j IntHandler /* INT 117 */ + 30001dc: 0f80006f j 30002d4 + j IntHandler /* INT 118 */ + 30001e0: 0f40006f j 30002d4 + j IntHandler /* INT 119 */ + 30001e4: 0f00006f j 30002d4 + j IntHandler /* INT 120 */ + 30001e8: 0ec0006f j 30002d4 + j IntHandler /* INT 121 */ + 30001ec: 0e80006f j 30002d4 + +030001f0 : + +.align 2 +NmiEntry: + SAVE_SYSERR_REGS + 30001f0: f9010113 addi sp,sp,-112 + 30001f4: 04812023 sw s0,64(sp) + 30001f8: 04912223 sw s1,68(sp) + 30001fc: 05212423 sw s2,72(sp) + 3000200: 05312623 sw s3,76(sp) + 3000204: 05412823 sw s4,80(sp) + 3000208: 05512a23 sw s5,84(sp) + 300020c: 05612c23 sw s6,88(sp) + 3000210: 05712e23 sw s7,92(sp) + 3000214: 07812023 sw s8,96(sp) + 3000218: 07912223 sw s9,100(sp) + 300021c: 07a12423 sw s10,104(sp) + 3000220: 07b12623 sw s11,108(sp) + 3000224: 11010593 addi a1,sp,272 + 3000228: 06b12823 sw a1,112(sp) + 300022c: 06312a23 sw gp,116(sp) + 3000230: 06412c23 sw tp,120(sp) + 3000234: 34102573 csrr a0,mepc + 3000238: 300025f3 csrr a1,mstatus + 300023c: 34302673 csrr a2,mtval + 3000240: 342026f3 csrr a3,mcause + 3000244: 06a12e23 sw a0,124(sp) + 3000248: 08b12023 sw a1,128(sp) + 300024c: 08c12223 sw a2,132(sp) + 3000250: 08d12423 sw a3,136(sp) + 3000254: 00010513 mv a0,sp + call SysErrNmiEntry + 3000258: 384020ef jal ra,30025dc + +0300025c : +deadLoop1: + tail deadLoop1 + 300025c: a001 j 300025c + nop + 300025e: 00000013 nop + +03000262 : + +.align 2 +TrapEntry: + SAVE_SYSERR_REGS + 3000262: f9010113 addi sp,sp,-112 + 3000266: 04812023 sw s0,64(sp) + 300026a: 04912223 sw s1,68(sp) + 300026e: 05212423 sw s2,72(sp) + 3000272: 05312623 sw s3,76(sp) + 3000276: 05412823 sw s4,80(sp) + 300027a: 05512a23 sw s5,84(sp) + 300027e: 05612c23 sw s6,88(sp) + 3000282: 05712e23 sw s7,92(sp) + 3000286: 07812023 sw s8,96(sp) + 300028a: 07912223 sw s9,100(sp) + 300028e: 07a12423 sw s10,104(sp) + 3000292: 07b12623 sw s11,108(sp) + 3000296: 11010593 addi a1,sp,272 + 300029a: 06b12823 sw a1,112(sp) + 300029e: 06312a23 sw gp,116(sp) + 30002a2: 06412c23 sw tp,120(sp) + 30002a6: 34102573 csrr a0,mepc + 30002aa: 300025f3 csrr a1,mstatus + 30002ae: 34302673 csrr a2,mtval + 30002b2: 342026f3 csrr a3,mcause + 30002b6: 06a12e23 sw a0,124(sp) + 30002ba: 08b12023 sw a1,128(sp) + 30002be: 08c12223 sw a2,132(sp) + 30002c2: 08d12423 sw a3,136(sp) + 30002c6: 00010513 mv a0,sp + /* Exception run with interrupts masked */ + csrc mstatus, MSTATUS_MIE + 30002ca: 30047073 csrci mstatus,8 + call SysErrExcEntry + 30002ce: 2f0020ef jal ra,30025be + +030002d2 : +deadLoop2: + tail deadLoop2 + 30002d2: a001 j 30002d2 + +030002d4 : + +.align 2 +IntHandler: + addi sp, sp, -(TOTAL_INT_SIZE_ON_STACK) + 30002d4: f6010113 addi sp,sp,-160 + + SREG a0, 3 * REGBYTES(sp) + 30002d8: 00a12623 sw a0,12(sp) + SREG a1, 4 * REGBYTES(sp) + 30002dc: 00b12823 sw a1,16(sp) +#endif + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + csrr a0, mcause +#else + csrr a0, cipri + 30002e0: 7ed02573 csrr a0,0x7ed + csrr a1, prithd + 30002e4: bfe025f3 csrr a1,0xbfe + csrw prithd, a0 /* read prithd */ + 30002e8: bfe51073 csrw 0xbfe,a0 + SREG a1, 6 * REGBYTES(sp) /* save prithd */ + 30002ec: 00b12c23 sw a1,24(sp) + csrr a1, mstatus /* read mstatus */ + 30002f0: 300025f3 csrr a1,mstatus + SREG a1, 7 * REGBYTES(sp) /* save mstatus */ + 30002f4: 00b12e23 sw a1,28(sp) + csrr a1, mepc /* read mepc */ + 30002f8: 341025f3 csrr a1,mepc + SREG a1, 8 * REGBYTES(sp) /* save mepc */ + 30002fc: 02b12023 sw a1,32(sp) + + csrr a0, mcause + 3000300: 34202573 csrr a0,mcause + + li a1, (3<<11) + 3000304: 000025b7 lui a1,0x2 + 3000308: 80058593 addi a1,a1,-2048 # 1800 + csrs mstatus, a1 + 300030c: 3005a073 csrs mstatus,a1 + la a1, custom_nested_irq_main_handler_entry + 3000310: 00000597 auipc a1,0x0 + 3000314: 01058593 addi a1,a1,16 # 3000320 + csrw mepc, a1 + 3000318: 34159073 csrw mepc,a1 + mret + 300031c: 30200073 mret + +03000320 : +#endif + +.align 2 +custom_nested_irq_main_handler_entry: + SREG t0, 0 * REGBYTES(sp) + 3000320: 00512023 sw t0,0(sp) + SREG t1, 1 * REGBYTES(sp) + 3000324: 00612223 sw t1,4(sp) + SREG t2, 2 * REGBYTES(sp) + 3000328: 00712423 sw t2,8(sp) + SREG a2, 5 * REGBYTES(sp) + 300032c: 00c12a23 sw a2,20(sp) + SREG ra, 9 * REGBYTES(sp) + 3000330: 02112223 sw ra,36(sp) + SREG a3, 10 * REGBYTES(sp) + 3000334: 02d12423 sw a3,40(sp) + SREG a4, 11 * REGBYTES(sp) + 3000338: 02e12623 sw a4,44(sp) + SREG a5, 12 * REGBYTES(sp) + 300033c: 02f12823 sw a5,48(sp) + SREG a6, 13 * REGBYTES(sp) + 3000340: 03012a23 sw a6,52(sp) + SREG a7, 14 * REGBYTES(sp) + 3000344: 03112c23 sw a7,56(sp) + SREG t3, 15 * REGBYTES(sp) + 3000348: 03c12e23 sw t3,60(sp) + SREG t4, 16 * REGBYTES(sp) + 300034c: 05d12023 sw t4,64(sp) + SREG t5, 17 * REGBYTES(sp) + 3000350: 05e12223 sw t5,68(sp) + SREG t6, 18 * REGBYTES(sp) + 3000354: 05f12423 sw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FSREG f0, 19 * REGBYTES(sp) + 3000358: 04012627 fsw ft0,76(sp) + FSREG f1, 20 * REGBYTES(sp) + 300035c: 04112827 fsw ft1,80(sp) + FSREG f2, 21 * REGBYTES(sp) + 3000360: 04212a27 fsw ft2,84(sp) + FSREG f3, 22 * REGBYTES(sp) + 3000364: 04312c27 fsw ft3,88(sp) + FSREG f4, 23 * REGBYTES(sp) + 3000368: 04412e27 fsw ft4,92(sp) + FSREG f5, 24 * REGBYTES(sp) + 300036c: 06512027 fsw ft5,96(sp) + FSREG f6, 25 * REGBYTES(sp) + 3000370: 06612227 fsw ft6,100(sp) + FSREG f7, 26 * REGBYTES(sp) + 3000374: 06712427 fsw ft7,104(sp) + FSREG f10, 27 * REGBYTES(sp) + 3000378: 06a12627 fsw fa0,108(sp) + FSREG f11, 28 * REGBYTES(sp) + 300037c: 06b12827 fsw fa1,112(sp) + FSREG f12, 29 * REGBYTES(sp) + 3000380: 06c12a27 fsw fa2,116(sp) + FSREG f13, 30 * REGBYTES(sp) + 3000384: 06d12c27 fsw fa3,120(sp) + FSREG f14, 31 * REGBYTES(sp) + 3000388: 06e12e27 fsw fa4,124(sp) + FSREG f15, 32 * REGBYTES(sp) + 300038c: 08f12027 fsw fa5,128(sp) + FSREG f16, 33 * REGBYTES(sp) + 3000390: 09012227 fsw fa6,132(sp) + FSREG f17, 34 * REGBYTES(sp) + 3000394: 09112427 fsw fa7,136(sp) + FSREG f28, 35 * REGBYTES(sp) + 3000398: 09c12627 fsw ft8,140(sp) + FSREG f29, 36 * REGBYTES(sp) + 300039c: 09d12827 fsw ft9,144(sp) + FSREG f30, 37 * REGBYTES(sp) + 30003a0: 09e12a27 fsw ft10,148(sp) + FSREG f31, 38 * REGBYTES(sp) + 30003a4: 09f12c27 fsw ft11,152(sp) +#endif + + andi a0, a0, MCAUSE_MASK_INT_NUM + 30003a8: 0ff57513 andi a0,a0,255 + call InterruptEntry + 30003ac: 7a3010ef jal ra,300234e + + LREG t1, 1 * REGBYTES(sp) + 30003b0: 00412303 lw t1,4(sp) + LREG t2, 2 * REGBYTES(sp) + 30003b4: 00812383 lw t2,8(sp) + LREG a2, 5 * REGBYTES(sp) + 30003b8: 01412603 lw a2,20(sp) + LREG ra, 9 * REGBYTES(sp) + 30003bc: 02412083 lw ra,36(sp) + LREG a3, 10 * REGBYTES(sp) + 30003c0: 02812683 lw a3,40(sp) + LREG a4, 11 * REGBYTES(sp) + 30003c4: 02c12703 lw a4,44(sp) + LREG a5, 12 * REGBYTES(sp) + 30003c8: 03012783 lw a5,48(sp) + LREG a6, 13 * REGBYTES(sp) + 30003cc: 03412803 lw a6,52(sp) + LREG a7, 14 * REGBYTES(sp) + 30003d0: 03812883 lw a7,56(sp) + LREG t3, 15 * REGBYTES(sp) + 30003d4: 03c12e03 lw t3,60(sp) + LREG t4, 16 * REGBYTES(sp) + 30003d8: 04012e83 lw t4,64(sp) + LREG t5, 17 * REGBYTES(sp) + 30003dc: 04412f03 lw t5,68(sp) + LREG t6, 18 * REGBYTES(sp) + 30003e0: 04812f83 lw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FLREG f0, 19 * REGBYTES(sp) + 30003e4: 04c12007 flw ft0,76(sp) + FLREG f1, 20 * REGBYTES(sp) + 30003e8: 05012087 flw ft1,80(sp) + FLREG f2, 21 * REGBYTES(sp) + 30003ec: 05412107 flw ft2,84(sp) + FLREG f3, 22 * REGBYTES(sp) + 30003f0: 05812187 flw ft3,88(sp) + FLREG f4, 23 * REGBYTES(sp) + 30003f4: 05c12207 flw ft4,92(sp) + FLREG f5, 24 * REGBYTES(sp) + 30003f8: 06012287 flw ft5,96(sp) + FLREG f6, 25 * REGBYTES(sp) + 30003fc: 06412307 flw ft6,100(sp) + FLREG f7, 26 * REGBYTES(sp) + 3000400: 06812387 flw ft7,104(sp) + FLREG f10, 27 * REGBYTES(sp) + 3000404: 06c12507 flw fa0,108(sp) + FLREG f11, 28 * REGBYTES(sp) + 3000408: 07012587 flw fa1,112(sp) + FLREG f12, 29 * REGBYTES(sp) + 300040c: 07412607 flw fa2,116(sp) + FLREG f13, 30 * REGBYTES(sp) + 3000410: 07812687 flw fa3,120(sp) + FLREG f14, 31 * REGBYTES(sp) + 3000414: 07c12707 flw fa4,124(sp) + FLREG f15, 32 * REGBYTES(sp) + 3000418: 08012787 flw fa5,128(sp) + FLREG f16, 33 * REGBYTES(sp) + 300041c: 08412807 flw fa6,132(sp) + FLREG f17, 34 * REGBYTES(sp) + 3000420: 08812887 flw fa7,136(sp) + FLREG f28, 35 * REGBYTES(sp) + 3000424: 08c12e07 flw ft8,140(sp) + FLREG f29, 36 * REGBYTES(sp) + 3000428: 09012e87 flw ft9,144(sp) + FLREG f30, 37 * REGBYTES(sp) + 300042c: 09412f07 flw ft10,148(sp) + FLREG f31, 38 * REGBYTES(sp) + 3000430: 09812f87 flw ft11,152(sp) + +03000434 : + */ + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + LREG t0, 0 * REGBYTES(sp) +#else + LREG a0, 7 * REGBYTES(sp) /* load mstatus */ + 3000434: 01c12503 lw a0,28(sp) + csrr t0, mstatus + 3000438: 300022f3 csrr t0,mstatus + LREG a1, 8 * REGBYTES(sp) /* load mepc */ + 300043c: 02012583 lw a1,32(sp) + andi t0, t0, MSTATUS_MIE + 3000440: 0082f293 andi t0,t0,8 + bnei t0, 0, restore_mstatus + 3000444: 0002923b bnei t0,0,300044c + andi a0, a0, ~(MSTATUS_MIE | MSTATUS_MPIE) + 3000448: f7757513 andi a0,a0,-137 + +0300044c : +restore_mstatus: + csrw mstatus, a0 + 300044c: 30051073 csrw mstatus,a0 + + LREG t0, 0 * REGBYTES(sp) + 3000450: 00012283 lw t0,0(sp) + csrw mepc, a1 + 3000454: 34159073 csrw mepc,a1 + LREG a0, 6 * REGBYTES(sp) /* load prithd */ + 3000458: 01812503 lw a0,24(sp) + csrw prithd, a0 + 300045c: bfe51073 csrw 0xbfe,a0 + lw a1, (a0) + addi a1, a1, -1 + sw a1, (a0) +#endif + + LREG a1, 4 * REGBYTES(sp) /* 2 consecutive csrw instructions will have a bubble */ + 3000460: 01012583 lw a1,16(sp) + + LREG a0, 3 * REGBYTES(sp) + 3000464: 00c12503 lw a0,12(sp) + + addi sp, sp, TOTAL_INT_SIZE_ON_STACK + 3000468: 0a010113 addi sp,sp,160 + + mret + 300046c: 30200073 mret + +03000470 : + +.align 2 +TrapVector: + push_reg + 3000470: f6010113 addi sp,sp,-160 + 3000474: fff11f8b stmia {ra,t0-t6,a0-a7},(sp) + 3000478: f6010113 addi sp,sp,-160 + csrr a0, mcause + 300047c: 34202573 csrr a0,mcause + li t1, MCAUSE_ECALL_FROM_MMODE + 3000480: 00b00313 li t1,11 +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + beq a0, t1, switch_to_umode +#else + beq a0, t1, switch_to_mmode + 3000484: 02650c63 beq a0,t1,30004bc +#endif + li t1, MCAUSE_ECALL_FROM_UMODE + 3000488: 00800313 li t1,8 + beq a0, t1, switch_to_mmode + 300048c: 02650863 beq a0,t1,30004bc + + li a1, MCAUSE_MASK_INT_BIT + 3000490: 800005b7 lui a1,0x80000 + li a2, MCAUSE_MASK_INT_NUM + 3000494: 0ff00613 li a2,255 + and a1, a0, a1 + 3000498: 00b575b3 and a1,a0,a1 + and a0, a0, a2 + 300049c: 00c57533 and a0,a0,a2 + + li a2, 0xc + 30004a0: 00c00613 li a2,12 + beq a0, a2, NmiEntry + 30004a4: d4c506e3 beq a0,a2,30001f0 + beqz a1, TrapEntry + 30004a8: da058de3 beqz a1,3000262 + pop_reg + 30004ac: 0a010113 addi sp,sp,160 + 30004b0: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004b4: 0a010113 addi sp,sp,160 + mret + 30004b8: 30200073 mret + +030004bc : + mret +#endif + +.align 2 +switch_to_mmode: + li t2, MSTATUS_MPP_MACHINE + 30004bc: 000023b7 lui t2,0x2 + 30004c0: 80038393 addi t2,t2,-2048 # 1800 + csrs mstatus, t2 + 30004c4: 3003a073 csrs mstatus,t2 + csrr t0, mepc + 30004c8: 341022f3 csrr t0,mepc + addi t0, t0, 4 + 30004cc: 00428293 addi t0,t0,4 + csrw mepc, t0 + 30004d0: 34129073 csrw mepc,t0 + pop_reg + 30004d4: 0a010113 addi sp,sp,160 + 30004d8: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004dc: 0a010113 addi sp,sp,160 + mret + 30004e0: 30200073 mret + +030004e4 : + +.align 2 +mem_cpy: + bge t0, t2, cpy_done + 30004e4: 0072dc63 bge t0,t2,30004fc + lw t3, (t1) + 30004e8: 00032e03 lw t3,0(t1) + sw t3, (t0) + 30004ec: 01c2a023 sw t3,0(t0) + addi t0, t0, 4 + 30004f0: 00428293 addi t0,t0,4 + addi t1, t1, 4 + 30004f4: 00430313 addi t1,t1,4 + j mem_cpy + 30004f8: fedff06f j 30004e4 + +030004fc : +cpy_done: + ret + 30004fc: 00008067 ret + +03000500 : + +.align 2 +handle_reset: + csrwi mstatus, 0 + 3000500: 30005073 csrwi mstatus,0 + csrwi mie, 0 + 3000504: 30405073 csrwi mie,0 + csrci mstatus, 0x08 + 3000508: 30047073 csrci mstatus,8 + la t0, TrapHandler + 300050c: 00000297 auipc t0,0x0 + 3000510: afc28293 addi t0,t0,-1284 # 3000008 + addi t0, t0, 1 + 3000514: 00128293 addi t0,t0,1 + csrw mtvec, t0 + 3000518: 30529073 csrw mtvec,t0 + csrwi 0x7EF, 0x1 /* lock mtvec */ + 300051c: 7ef0d073 csrwi 0x7ef,1 + +03000520 : + csrwi 0x7C8, 0x1 /* enable hardware nest interrupt support */ +#endif + +flash_init: +/* eflash prefetch enable */ + li t0, EFC_BASE_ADDR + 3000520: 147102b7 lui t0,0x14710 + lw t1, 0x120(t0) + 3000524: 1202a303 lw t1,288(t0) # 14710120 + ori t1, t1, 1 + 3000528: 00136313 ori t1,t1,1 + sw t1, 0x120(t0) + 300052c: 1262a023 sw t1,288(t0) + +/* eflash cache enable */ + lw t1, 0x124(t0) + 3000530: 1242a303 lw t1,292(t0) + ori t1, t1, 1 + 3000534: 00136313 ori t1,t1,1 + sw t1, 0x124(t0) + 3000538: 1262a223 sw t1,292(t0) + +/* enable flash cmd */ + li t0, EFC_MAGIC_NUMBER + 300053c: fedcc2b7 lui t0,0xfedcc + 3000540: a9828293 addi t0,t0,-1384 # fedcba98 + li t1, EFC_MAGIC_LOCK_RW + 3000544: 14710337 lui t1,0x14710 + 3000548: 20030313 addi t1,t1,512 # 14710200 + sw t0, (t1) + 300054c: 00532023 sw t0,0(t1) + +/* initialize global pointer */ + .option push + .option norelax + la gp, __global_pointer$ + 3000550: 01001197 auipc gp,0x1001 + 3000554: bc418193 addi gp,gp,-1084 # 4001114 <__global_pointer$> + .option pop + +/* initialize stack pointer */ + la sp, __stack_top + 3000558: 01007117 auipc sp,0x1007 + 300055c: 6a810113 addi sp,sp,1704 # 4007c00 <__INTERRUPT_STACK_BEGIN__> + +/* timer0 interrupt enable */ + li t0, TIMER0_CONTROL + 3000560: 143002b7 lui t0,0x14300 + 3000564: 00828293 addi t0,t0,8 # 14300008 + lw t1, (t0) + 3000568: 0002a303 lw t1,0(t0) + andi t1, t1, TIMER0_INTENABLE + 300056c: 02037313 andi t1,t1,32 + sw t1, (t0) + 3000570: 0062a023 sw t1,0(t0) + +/* uart0 deinit */ + li t0, 0x14000000 + 3000574: 140002b7 lui t0,0x14000 + li t1, 0 + 3000578: 00000313 li t1,0 + sw t1, IBRD_OFFSET(t0) + 300057c: 0262a223 sw t1,36(t0) # 14000024 + sw t1, FBRD_OFFSET(t0) + 3000580: 0262a423 sw t1,40(t0) + sw t1, LCR_H_OFFSET(t0) + 3000584: 0262a623 sw t1,44(t0) + sw t1, CR_OFFSET(t0) + 3000588: 0262a823 sw t1,48(t0) + sw t1, DMACR_OFFSET(t0) + 300058c: 0462a423 sw t1,72(t0) + +03000590 : + +/* perform the rest of initialization in C */ +clear_sram: + /* clear sysram parity error */ + li t0, SYSRAM_ERROR + 3000590: 101082b7 lui t0,0x10108 + 3000594: 30028293 addi t0,t0,768 # 10108300 + lw t1, (t0) + 3000598: 0002a303 lw t1,0(t0) + ori t1, t1, 1 + 300059c: 00136313 ori t1,t1,1 + sw t1, (t0) + 30005a0: 0062a023 sw t1,0(t0) + + la t0, SRAM_START + 30005a4: 01000297 auipc t0,0x1000 + 30005a8: a5c28293 addi t0,t0,-1444 # 4000000 + la t1, SRAM_END + 30005ac: 01008317 auipc t1,0x1008 + 30005b0: a5430313 addi t1,t1,-1452 # 4008000 + li t2, 0 + 30005b4: 00000393 li t2,0 + +030005b8 : + +clear_sram_loop: + sw t2, (t0) /* clear all sram */ + 30005b8: 0072a023 sw t2,0(t0) + addi t0, t0, 4 /* increment clear index pointer */ + 30005bc: 00428293 addi t0,t0,4 + blt t0, t1, clear_sram_loop /* are we at the end yet, if not , contiue till the end */ + 30005c0: fe62cce3 blt t0,t1,30005b8 + +030005c4 : + +start_coderom_code_copy: + la t0, __sram_code_start_addr /* SRAM addr */ + 30005c4: ff000297 auipc t0,0xff000 + 30005c8: a3c28293 addi t0,t0,-1476 # 2000000 + la t1, __sram_code_load_addr /* ROM addr */ + 30005cc: 00000317 auipc t1,0x0 + 30005d0: 13830313 addi t1,t1,312 # 3000704 + la t2, __sram_code_end_addr + 30005d4: ff000397 auipc t2,0xff000 + 30005d8: a2c38393 addi t2,t2,-1492 # 2000000 + jal mem_cpy + 30005dc: f09ff0ef jal ra,30004e4 + +030005e0 : + +start_reserved_data_copy: + la t0, __reserved_code_start_addr /* SRAM addr */ + 30005e0: 01000297 auipc t0,0x1000 + 30005e4: a2028293 addi t0,t0,-1504 # 4000000 + la t1, __reserved_code_load_addr /* ROM addr */ + 30005e8: 00000317 auipc t1,0x0 + 30005ec: 11c30313 addi t1,t1,284 # 3000704 + la t2, __reserved_code_end_addr + 30005f0: 01000397 auipc t2,0x1000 + 30005f4: a1038393 addi t2,t2,-1520 # 4000000 + jal mem_cpy + 30005f8: eedff0ef jal ra,30004e4 + +030005fc : + +start_coderom_data_copy: + la t0, __data_start /* SRAM addr */ + 30005fc: 01000297 auipc t0,0x1000 + 3000600: a2428293 addi t0,t0,-1500 # 4000020 + la t1, __data_load /* ROM addr */ + 3000604: 00006317 auipc t1,0x6 + 3000608: 54c30313 addi t1,t1,1356 # 3006b50 <__data_load> + la t2, __data_end + 300060c: 01000397 auipc t2,0x1000 + 3000610: af038393 addi t2,t2,-1296 # 40000fc + jal mem_cpy + 3000614: ed1ff0ef jal ra,30004e4 + +03000618 : + +pmp_init: + li t0, 0xB00 + 3000618: 000012b7 lui t0,0x1 + 300061c: b0028293 addi t0,t0,-1280 # b00 + csrw pmpaddr0, t0 + 3000620: 3b029073 csrw pmpaddr0,t0 + li t0, 0x400400 /* 0x2C00~0x1000FFF, BOOTROM, enable R+X */ + 3000624: 004002b7 lui t0,0x400 + 3000628: 40028293 addi t0,t0,1024 # 400400 + csrw pmpaddr1, t0 + 300062c: 3b129073 csrw pmpaddr1,t0 + li t0, 0x800000 /* 0x1001000~0x1FFFFFF, Reserved: diable R+X+W */ + 3000630: 008002b7 lui t0,0x800 + csrw pmpaddr2, t0 + 3000634: 3b229073 csrw pmpaddr2,t0 + li t0, 0x802000 /* 0x2000000~0x2007FFF, SYSRAM_ITCM */ + 3000638: 008022b7 lui t0,0x802 + csrw pmpaddr3, t0 + 300063c: 3b329073 csrw pmpaddr3,t0 + li t0, 0xC00000 /* 0x2008000 ~ 0x2FFFFFF, Reserved: disable R+X+W */ + 3000640: 00c002b7 lui t0,0xc00 + csrw pmpaddr4, t0 + 3000644: 3b429073 csrw pmpaddr4,t0 + li t0, 0x1000000 /* 0x3000000 ~ 0x03FFFFFF: EFLASH: enable R+X */ + 3000648: 010002b7 lui t0,0x1000 + csrw pmpaddr5, t0 + 300064c: 3b529073 csrw pmpaddr5,t0 + li t0, 0x1002000 /* 0x4000000 ~ 0x04007FFF: SYSTEM_DTCM enable R+W */ + 3000650: 010022b7 lui t0,0x1002 + csrw pmpaddr6, t0 + 3000654: 3b629073 csrw pmpaddr6,t0 + li t0,0x7000400 /* 0x4008000 ~ 0x01C000FFF: REGISTER R+W */ + 3000658: 070002b7 lui t0,0x7000 + 300065c: 40028293 addi t0,t0,1024 # 7000400 + csrw pmpaddr7, t0 + 3000660: 3b729073 csrw pmpaddr7,t0 + + li t0,0xf3333333 /* register TOR-R-W */ + 3000664: f33332b7 lui t0,0xf3333 + 3000668: 33328293 addi t0,t0,819 # f3333333 + csrw 0x7d8,t0 + 300066c: 7d829073 csrw 0x7d8,t0 + li t0,0x0d080d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + csrw pmpcfg0,t0 + li t0,0x0b0b0d08 + csrw pmpcfg1,t0 +#else + li t0,0x8d888d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + 3000670: 8d8892b7 lui t0,0x8d889 + 3000674: d8b28293 addi t0,t0,-629 # 8d888d8b + csrw pmpcfg0,t0 + 3000678: 3a029073 csrw pmpcfg0,t0 + li t0,0x8b8b8d88 + 300067c: 8b8b92b7 lui t0,0x8b8b9 + 3000680: d8828293 addi t0,t0,-632 # 8b8b8d88 + csrw pmpcfg1,t0 + 3000684: 3a129073 csrw pmpcfg1,t0 +#endif + +/* disable Icache */ + csrwi 0x7C0, 0x0 /* disable ICACHE */ + 3000688: 7c005073 csrwi 0x7c0,0 + fence + 300068c: 0ff0000f fence + +/* disable Dcache */ + csrwi 0x7C1, 0x0 /* disable DCACHE */ + 3000690: 7c105073 csrwi 0x7c1,0 + fence + 3000694: 0ff0000f fence + +/* support float and mie */ + li t0,0x2008 + 3000698: 000022b7 lui t0,0x2 + 300069c: 00828293 addi t0,t0,8 # 2008 + csrs mstatus,t0 + 30006a0: 3002a073 csrs mstatus,t0 + li t0,0x20 + 30006a4: 02000293 li t0,32 + csrs misa,t0 + 30006a8: 3012a073 csrs misa,t0 + +/* Interrupt set default priority = 1*/ + li t0, 0x11111111 + 30006ac: 111112b7 lui t0,0x11111 + 30006b0: 11128293 addi t0,t0,273 # 11111111 + csrw locipri0, t0 + 30006b4: bc029073 csrw 0xbc0,t0 + csrw locipri1, t0 + 30006b8: bc129073 csrw 0xbc1,t0 + csrw locipri2, t0 + 30006bc: bc229073 csrw 0xbc2,t0 + csrw locipri3, t0 + 30006c0: bc329073 csrw 0xbc3,t0 + csrw locipri4, t0 + 30006c4: bc429073 csrw 0xbc4,t0 + csrw locipri5, t0 + 30006c8: bc529073 csrw 0xbc5,t0 + csrw locipri6, t0 + 30006cc: bc629073 csrw 0xbc6,t0 + csrw locipri7, t0 + 30006d0: bc729073 csrw 0xbc7,t0 + csrw locipri8, t0 + 30006d4: bc829073 csrw 0xbc8,t0 + csrw locipri9, t0 + 30006d8: bc929073 csrw 0xbc9,t0 + csrw locipri10, t0 + 30006dc: bca29073 csrw 0xbca,t0 + csrw locipri11, t0 + 30006e0: bcb29073 csrw 0xbcb,t0 + csrw locipri12, t0 + 30006e4: bcc29073 csrw 0xbcc,t0 + csrw locipri13, t0 + 30006e8: bcd29073 csrw 0xbcd,t0 + csrw locipri14, t0 + 30006ec: bce29073 csrw 0xbce,t0 + csrw locipri15, t0 + 30006f0: bcf29073 csrw 0xbcf,t0 + + ecall + 30006f4: 00000073 ecall + jal Chip_Init + 30006f8: 014000ef jal ra,300070c + +/* jump to C func. */ + jal main + 30006fc: 626050ef jal ra,3005d22
+ +03000700 : + +dead_loop: + j dead_loop + 3000700: 0000006f j 3000700 + +Disassembly of section .text: + +03000704 : + * @brief Chip Init Fail Process, deadloop if Chip Init fail + * @param None + * @retval None + */ +static inline void Chip_InitFail(void) +{ + 3000704: 1141 addi sp,sp,-16 + 3000706: c622 sw s0,12(sp) + 3000708: 0800 addi s0,sp,16 + while (1) { + 300070a: a001 j 300070a + +0300070c : + * @brief Chip Init + * @param None + * @retval None + */ +void Chip_Init(void) +{ + 300070c: 1101 addi sp,sp,-32 + 300070e: ce06 sw ra,28(sp) + 3000710: cc22 sw s0,24(sp) + 3000712: 1000 addi s0,sp,32 + CRG_CoreClkSelect coreClkSelect; + /* Config CRG */ + if (CRG_Config(&coreClkSelect) != BASE_STATUS_OK) { + 3000714: fec40793 addi a5,s0,-20 + 3000718: 853e mv a0,a5 + 300071a: 614050ef jal ra,3005d2e + 300071e: 87aa mv a5,a0 + 3000720: c391 beqz a5,3000724 + Chip_InitFail(); + 3000722: 37cd jal ra,3000704 + } + + /* Config FLASH Clock */ + FLASH_ClockConfig(coreClkSelect); + 3000724: fec42783 lw a5,-20(s0) + 3000728: 853e mv a0,a5 + 300072a: 796000ef jal ra,3000ec0 + SYSTICK_Init(); + 300072e: 057000ef jal ra,3000f84 + /* Set CoreClock Select after FLASH Config Done */ + CRG_SetCoreClockSelect(coreClkSelect); + 3000732: fec42783 lw a5,-20(s0) + 3000736: 853e mv a0,a5 + 3000738: 25b1 jal ra,3000d84 + + IRQ_Init(); + 300073a: 459010ef jal ra,3002392 + ANAVREF_Init(); + 300073e: 23e5 jal ra,3000d26 + ANATRIM_Entry(); + 3000740: 2b51 jal ra,3000cd4 + /* User Add Code Here */ + 3000742: 0001 nop + 3000744: 40f2 lw ra,28(sp) + 3000746: 4462 lw s0,24(sp) + 3000748: 6105 addi sp,sp,32 + 300074a: 8082 ret + +0300074c : + * @brief Calculate the conversion gain of the tsensor. + * @param data, original data. + * @retval None + */ +static void CalculateGain(unsigned int data) +{ + 300074c: 1101 addi sp,sp,-32 + 300074e: ce22 sw s0,28(sp) + 3000750: 1000 addi s0,sp,32 + 3000752: fea42623 sw a0,-20(s0) + g_tsensorGain = ((float)(data) / 10000000.0f); + 3000756: fec42783 lw a5,-20(s0) + 300075a: d017f753 fcvt.s.wu fa4,a5 + 300075e: 030067b7 lui a5,0x3006 + 3000762: 5887a787 flw fa5,1416(a5) # 3006588 <__rodata_start> + 3000766: 18f777d3 fdiv.s fa5,fa4,fa5 + 300076a: 040007b7 lui a5,0x4000 + 300076e: 02f7a027 fsw fa5,32(a5) # 4000020 +} + 3000772: 0001 nop + 3000774: 4472 lw s0,28(sp) + 3000776: 6105 addi sp,sp,32 + 3000778: 8082 ret + +0300077a : + * @brief Obtains the chip ID. + * @param None + * @retval None + */ +static bool CHIP_GetInfo(void) +{ + 300077a: 7179 addi sp,sp,-48 + 300077c: d606 sw ra,44(sp) + 300077e: d422 sw s0,40(sp) + 3000780: 1800 addi s0,sp,48 + FOTP_INFO_RGN0_NUMBER_4 emptyData; + FOTP_INFO_RGN0_NUMBER_2 idData; + FOTP_InfoGet(FOTP_INFO_RNG0, 4U, (void *)&emptyData.comData); /* 4 is the number of fotp_empty_flag in otp */ + 3000782: fe040793 addi a5,s0,-32 + 3000786: 863e mv a2,a5 + 3000788: 4591 li a1,4 + 300078a: 4501 li a0,0 + 300078c: 2391 jal ra,3000cd0 + FOTP_InfoGet(FOTP_INFO_RNG0, 2U, (void *)&idData.comData); /* 2 is the number of idData in otp */ + 300078e: fd040793 addi a5,s0,-48 + 3000792: 863e mv a2,a5 + 3000794: 4589 li a1,2 + 3000796: 4501 li a0,0 + 3000798: 2b25 jal ra,3000cd0 + if (emptyData.REG.fotp_empty_flag != 0x5AA59669 || idData.REG.chip_id == 0xFFFFFFFF) { + 300079a: fe042703 lw a4,-32(s0) + 300079e: 5aa597b7 lui a5,0x5aa59 + 30007a2: 66978793 addi a5,a5,1641 # 5aa59669 + 30007a6: 00f71763 bne a4,a5,30007b4 + 30007aa: fd042703 lw a4,-48(s0) + 30007ae: 57fd li a5,-1 + 30007b0: 00f71463 bne a4,a5,30007b8 + return false; + 30007b4: 4781 li a5,0 + 30007b6: a011 j 30007ba + } + return true; + 30007b8: 4785 li a5,1 +} + 30007ba: 853e mv a0,a5 + 30007bc: 50b2 lw ra,44(sp) + 30007be: 5422 lw s0,40(sp) + 30007c0: 6145 addi sp,sp,48 + 30007c2: 8082 ret + +030007c4 : + * @brief Analog module trim. + * @param None + * @retval None + */ +static void CHIP_AnalogTrim(void) +{ + 30007c4: 711d addi sp,sp,-96 + 30007c6: ce86 sw ra,92(sp) + 30007c8: cca2 sw s0,88(sp) + 30007ca: 1080 addi s0,sp,96 + FOTP_INFO_RGN0_NUMBER_20 trimData20; + FOTP_InfoGet(FOTP_INFO_RNG0, 20U, (void *)&trimData20.comData); /* 20 is the number of trim data in otp */ + 30007cc: fdc40793 addi a5,s0,-36 + 30007d0: 863e mv a2,a5 + 30007d2: 45d1 li a1,20 + 30007d4: 4501 li a0,0 + 30007d6: 29ed jal ra,3000cd0 + /* VREF */ + VREF->VREF_TRIM0.BIT.da_iref_trim = trimData20.REG.data0.da_iref_trim; + 30007d8: 18100737 lui a4,0x18100 + 30007dc: fdc42783 lw a5,-36(s0) + 30007e0: 83c1 srli a5,a5,0x10 + 30007e2: 9bfd andi a5,a5,-1 + 30007e4: 0ff7f693 andi a3,a5,255 + 30007e8: 433c lw a5,64(a4) + 30007ea: 0ff6f693 andi a3,a3,255 + 30007ee: f007f793 andi a5,a5,-256 + 30007f2: 8fd5 or a5,a5,a3 + 30007f4: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vref_trim = trimData20.REG.data0.da_ref_vref_trim; + 30007f6: 18100737 lui a4,0x18100 + 30007fa: fdc42783 lw a5,-36(s0) + 30007fe: 83a1 srli a5,a5,0x8 + 3000800: 9bfd andi a5,a5,-1 + 3000802: 0ff7f693 andi a3,a5,255 + 3000806: 433c lw a5,64(a4) + 3000808: 0ff6f693 andi a3,a3,255 + 300080c: 06a2 slli a3,a3,0x8 + 300080e: 7641 lui a2,0xffff0 + 3000810: 0ff60613 addi a2,a2,255 # ffff00ff + 3000814: 8ff1 and a5,a5,a2 + 3000816: 8fd5 or a5,a5,a3 + 3000818: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vbg_trim = trimData20.REG.data0.da_ref_vbg_trim; + 300081a: 18100737 lui a4,0x18100 + 300081e: fdc42783 lw a5,-36(s0) + 3000822: 0ff7f693 andi a3,a5,255 + 3000826: 433c lw a5,64(a4) + 3000828: 0ff6f693 andi a3,a3,255 + 300082c: 06c2 slli a3,a3,0x10 + 300082e: ff010637 lui a2,0xff010 + 3000832: 167d addi a2,a2,-1 # ff00ffff + 3000834: 8ff1 and a5,a5,a2 + 3000836: 8fd5 or a5,a5,a3 + 3000838: c33c sw a5,64(a4) + unsigned int value = trimData20.REG.data1.da_ref_temp_trim3; + 300083a: fe042783 lw a5,-32(s0) + 300083e: 83c1 srli a5,a5,0x10 + 3000840: 9bfd andi a5,a5,-1 + 3000842: 9f81 uxtb a5 + 3000844: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim2 << 8U); /* Shift left by 8 bits */ + 3000848: fe042783 lw a5,-32(s0) + 300084c: 83a1 srli a5,a5,0x8 + 300084e: 9bfd andi a5,a5,-1 + 3000850: 9f81 uxtb a5 + 3000852: 07a2 slli a5,a5,0x8 + 3000854: 873e mv a4,a5 + 3000856: fec42783 lw a5,-20(s0) + 300085a: 8fd9 or a5,a5,a4 + 300085c: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim1 << 16U); /* Shift left by 16 bits */ + 3000860: fe042783 lw a5,-32(s0) + 3000864: 9f81 uxtb a5 + 3000866: 07c2 slli a5,a5,0x10 + 3000868: 873e mv a4,a5 + 300086a: fec42783 lw a5,-20(s0) + 300086e: 8fd9 or a5,a5,a4 + 3000870: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data0.da_ref_temp_trim0 << 24U); /* Shift left by 24 bits */ + 3000874: fdc42783 lw a5,-36(s0) + 3000878: 83e1 srli a5,a5,0x18 + 300087a: 9f81 uxtb a5 + 300087c: 07e2 slli a5,a5,0x18 + 300087e: 873e mv a4,a5 + 3000880: fec42783 lw a5,-20(s0) + 3000884: 8fd9 or a5,a5,a4 + 3000886: fef42623 sw a5,-20(s0) + VREF->VREF_TRIM1.reg = value; + 300088a: 181007b7 lui a5,0x18100 + 300088e: fec42703 lw a4,-20(s0) + 3000892: c3f8 sw a4,68(a5) + + FOTP_INFO_RGN0_NUMBER_21 trimData21; + FOTP_InfoGet(FOTP_INFO_RNG0, 21U, (void *)&trimData21.comData); /* 21 is the number of trim data in otp */ + 3000894: fcc40793 addi a5,s0,-52 + 3000898: 863e mv a2,a5 + 300089a: 45d5 li a1,21 + 300089c: 4501 li a0,0 + 300089e: 290d jal ra,3000cd0 + /* ADC */ + ADC0->ADC_OEGE_TRIM.BIT.cfg_gain_cali_trim = trimData21.REG.data1.saradc_gain; + 30008a0: 18000737 lui a4,0x18000 + 30008a4: fd042783 lw a5,-48(s0) + 30008a8: 86be mv a3,a5 + 30008aa: 6789 lui a5,0x2 + 30008ac: 17fd addi a5,a5,-1 # 1fff + 30008ae: 8ff5 and a5,a5,a3 + 30008b0: 01079613 slli a2,a5,0x10 + 30008b4: 8241 srli a2,a2,0x10 + 30008b6: 6785 lui a5,0x1 + 30008b8: 973e add a4,a4,a5 + 30008ba: 80872783 lw a5,-2040(a4) # 17fff808 + 30008be: 6689 lui a3,0x2 + 30008c0: 16fd addi a3,a3,-1 # 1fff + 30008c2: 8ef1 and a3,a3,a2 + 30008c4: 06c2 slli a3,a3,0x10 + 30008c6: e0010637 lui a2,0xe0010 + 30008ca: 167d addi a2,a2,-1 # e000ffff + 30008cc: 8ff1 and a5,a5,a2 + 30008ce: 8fd5 or a5,a5,a3 + 30008d0: 80f72423 sw a5,-2040(a4) + ADC0->ADC_OEGE_TRIM.BIT.cfg_ofst_cali_trim = trimData21.REG.data1.saradc_offset; + 30008d4: 18000737 lui a4,0x18000 + 30008d8: fd042783 lw a5,-48(s0) + 30008dc: 83c1 srli a5,a5,0x10 + 30008de: 86be mv a3,a5 + 30008e0: 6785 lui a5,0x1 + 30008e2: 17fd addi a5,a5,-1 # fff + 30008e4: 8ff5 and a5,a5,a3 + 30008e6: 01079613 slli a2,a5,0x10 + 30008ea: 8241 srli a2,a2,0x10 + 30008ec: 6785 lui a5,0x1 + 30008ee: 973e add a4,a4,a5 + 30008f0: 80872783 lw a5,-2040(a4) # 17fff808 + 30008f4: 6685 lui a3,0x1 + 30008f6: 16fd addi a3,a3,-1 # fff + 30008f8: 8ef1 and a3,a3,a2 + 30008fa: 767d lui a2,0xfffff + 30008fc: 8ff1 and a5,a5,a2 + 30008fe: 8fd5 or a5,a5,a3 + 3000900: 80f72423 sw a5,-2040(a4) + + /* TSENSOR */ + TSENSOR->TSENSOR_TRIM.reg = trimData20.REG.data1.da_ref_vptat_trim; + 3000904: fe042783 lw a5,-32(s0) + 3000908: 83e1 srli a5,a5,0x18 + 300090a: 0ff7f713 andi a4,a5,255 + 300090e: 185007b7 lui a5,0x18500 + 3000912: cb98 sw a4,16(a5) + ADC0->ADC_TSENSOR_TRIM.BIT.cfg_tsensor_ofst_trim = trimData21.REG.data2.ts_offset; + 3000914: 18000737 lui a4,0x18000 + 3000918: fd442783 lw a5,-44(s0) + 300091c: 86be mv a3,a5 + 300091e: 6785 lui a5,0x1 + 3000920: 17fd addi a5,a5,-1 # fff + 3000922: 8ff5 and a5,a5,a3 + 3000924: 01079613 slli a2,a5,0x10 + 3000928: 8241 srli a2,a2,0x10 + 300092a: 6785 lui a5,0x1 + 300092c: 973e add a4,a4,a5 + 300092e: 80472783 lw a5,-2044(a4) # 17fff804 + 3000932: 6685 lui a3,0x1 + 3000934: 16fd addi a3,a3,-1 # fff + 3000936: 8ef1 and a3,a3,a2 + 3000938: 767d lui a2,0xfffff + 300093a: 8ff1 and a5,a5,a2 + 300093c: 8fd5 or a5,a5,a3 + 300093e: 80f72223 sw a5,-2044(a4) + CalculateGain(trimData21.REG.data3.ts_gain); + 3000942: fd842783 lw a5,-40(s0) + 3000946: 83a5 srli a5,a5,0x9 + 3000948: 853e mv a0,a5 + 300094a: 3509 jal ra,300074c + + /* PGA */ + PGA0->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga0_vos_trim; + 300094c: 18200737 lui a4,0x18200 + 3000950: fcc42783 lw a5,-52(s0) + 3000954: 1ff7f793 andi a5,a5,511 + 3000958: 01079693 slli a3,a5,0x10 + 300095c: 82c1 srli a3,a3,0x10 + 300095e: 531c lw a5,32(a4) + 3000960: 1ff6f693 andi a3,a3,511 + 3000964: e007f793 andi a5,a5,-512 + 3000968: 8fd5 or a5,a5,a3 + 300096a: d31c sw a5,32(a4) + PGA1->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga1_vos_trim; + 300096c: 18201737 lui a4,0x18201 + 3000970: fcc42783 lw a5,-52(s0) + 3000974: 83c1 srli a5,a5,0x10 + 3000976: 1ff7f793 andi a5,a5,511 + 300097a: 01079693 slli a3,a5,0x10 + 300097e: 82c1 srli a3,a3,0x10 + 3000980: 531c lw a5,32(a4) + 3000982: 1ff6f693 andi a3,a3,511 + 3000986: e007f793 andi a5,a5,-512 + 300098a: 8fd5 or a5,a5,a3 + 300098c: d31c sw a5,32(a4) + + FOTP_INFO_RGN0_NUMBER_22 trimData22; + FOTP_InfoGet(FOTP_INFO_RNG0, 22U, (void *)&trimData22.comData); /* 22 is the number of trim data in otp */ + 300098e: fbc40793 addi a5,s0,-68 + 3000992: 863e mv a2,a5 + 3000994: 45d9 li a1,22 + 3000996: 4501 li a0,0 + 3000998: 257d jal ra,3001046 + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_gain_trim2 = trimData22.REG.data0.pga0_gain2; + 300099a: 18000737 lui a4,0x18000 + 300099e: fbc42783 lw a5,-68(s0) + 30009a2: 86be mv a3,a5 + 30009a4: 6789 lui a5,0x2 + 30009a6: 17fd addi a5,a5,-1 # 1fff + 30009a8: 8ff5 and a5,a5,a3 + 30009aa: 01079613 slli a2,a5,0x10 + 30009ae: 8241 srli a2,a2,0x10 + 30009b0: 6785 lui a5,0x1 + 30009b2: 973e add a4,a4,a5 + 30009b4: 81472783 lw a5,-2028(a4) # 17fff814 + 30009b8: 6689 lui a3,0x2 + 30009ba: 16fd addi a3,a3,-1 # 1fff + 30009bc: 8ef1 and a3,a3,a2 + 30009be: 06c2 slli a3,a3,0x10 + 30009c0: e0010637 lui a2,0xe0010 + 30009c4: 167d addi a2,a2,-1 # e000ffff + 30009c6: 8ff1 and a5,a5,a2 + 30009c8: 8fd5 or a5,a5,a3 + 30009ca: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_ofst_trim2 = trimData22.REG.data0.pga0_offset2; + 30009ce: 18000737 lui a4,0x18000 + 30009d2: fbc42783 lw a5,-68(s0) + 30009d6: 83c1 srli a5,a5,0x10 + 30009d8: 86be mv a3,a5 + 30009da: 6785 lui a5,0x1 + 30009dc: 17fd addi a5,a5,-1 # fff + 30009de: 8ff5 and a5,a5,a3 + 30009e0: 01079613 slli a2,a5,0x10 + 30009e4: 8241 srli a2,a2,0x10 + 30009e6: 6785 lui a5,0x1 + 30009e8: 973e add a4,a4,a5 + 30009ea: 81472783 lw a5,-2028(a4) # 17fff814 + 30009ee: 6685 lui a3,0x1 + 30009f0: 16fd addi a3,a3,-1 # fff + 30009f2: 8ef1 and a3,a3,a2 + 30009f4: 767d lui a2,0xfffff + 30009f6: 8ff1 and a5,a5,a2 + 30009f8: 8fd5 or a5,a5,a3 + 30009fa: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_gain_trim4 = trimData22.REG.data1.pga0_gain4; + 30009fe: 18000737 lui a4,0x18000 + 3000a02: fc042783 lw a5,-64(s0) + 3000a06: 86be mv a3,a5 + 3000a08: 6789 lui a5,0x2 + 3000a0a: 17fd addi a5,a5,-1 # 1fff + 3000a0c: 8ff5 and a5,a5,a3 + 3000a0e: 01079613 slli a2,a5,0x10 + 3000a12: 8241 srli a2,a2,0x10 + 3000a14: 6785 lui a5,0x1 + 3000a16: 973e add a4,a4,a5 + 3000a18: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a1c: 6689 lui a3,0x2 + 3000a1e: 16fd addi a3,a3,-1 # 1fff + 3000a20: 8ef1 and a3,a3,a2 + 3000a22: 06c2 slli a3,a3,0x10 + 3000a24: e0010637 lui a2,0xe0010 + 3000a28: 167d addi a2,a2,-1 # e000ffff + 3000a2a: 8ff1 and a5,a5,a2 + 3000a2c: 8fd5 or a5,a5,a3 + 3000a2e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_ofst_trim4 = trimData22.REG.data1.pga0_offset4; + 3000a32: 18000737 lui a4,0x18000 + 3000a36: fc042783 lw a5,-64(s0) + 3000a3a: 83c1 srli a5,a5,0x10 + 3000a3c: 86be mv a3,a5 + 3000a3e: 6785 lui a5,0x1 + 3000a40: 17fd addi a5,a5,-1 # fff + 3000a42: 8ff5 and a5,a5,a3 + 3000a44: 01079613 slli a2,a5,0x10 + 3000a48: 8241 srli a2,a2,0x10 + 3000a4a: 6785 lui a5,0x1 + 3000a4c: 973e add a4,a4,a5 + 3000a4e: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a52: 6685 lui a3,0x1 + 3000a54: 16fd addi a3,a3,-1 # fff + 3000a56: 8ef1 and a3,a3,a2 + 3000a58: 767d lui a2,0xfffff + 3000a5a: 8ff1 and a5,a5,a2 + 3000a5c: 8fd5 or a5,a5,a3 + 3000a5e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_gain_trim8 = trimData22.REG.data2.pga0_gain8; + 3000a62: 18000737 lui a4,0x18000 + 3000a66: fc442783 lw a5,-60(s0) + 3000a6a: 86be mv a3,a5 + 3000a6c: 6789 lui a5,0x2 + 3000a6e: 17fd addi a5,a5,-1 # 1fff + 3000a70: 8ff5 and a5,a5,a3 + 3000a72: 01079613 slli a2,a5,0x10 + 3000a76: 8241 srli a2,a2,0x10 + 3000a78: 6785 lui a5,0x1 + 3000a7a: 973e add a4,a4,a5 + 3000a7c: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000a80: 6689 lui a3,0x2 + 3000a82: 16fd addi a3,a3,-1 # 1fff + 3000a84: 8ef1 and a3,a3,a2 + 3000a86: 06c2 slli a3,a3,0x10 + 3000a88: e0010637 lui a2,0xe0010 + 3000a8c: 167d addi a2,a2,-1 # e000ffff + 3000a8e: 8ff1 and a5,a5,a2 + 3000a90: 8fd5 or a5,a5,a3 + 3000a92: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_ofst_trim8 = trimData22.REG.data2.pga0_offset8; + 3000a96: 18000737 lui a4,0x18000 + 3000a9a: fc442783 lw a5,-60(s0) + 3000a9e: 83c1 srli a5,a5,0x10 + 3000aa0: 86be mv a3,a5 + 3000aa2: 6785 lui a5,0x1 + 3000aa4: 17fd addi a5,a5,-1 # fff + 3000aa6: 8ff5 and a5,a5,a3 + 3000aa8: 01079613 slli a2,a5,0x10 + 3000aac: 8241 srli a2,a2,0x10 + 3000aae: 6785 lui a5,0x1 + 3000ab0: 973e add a4,a4,a5 + 3000ab2: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000ab6: 6685 lui a3,0x1 + 3000ab8: 16fd addi a3,a3,-1 # fff + 3000aba: 8ef1 and a3,a3,a2 + 3000abc: 767d lui a2,0xfffff + 3000abe: 8ff1 and a5,a5,a2 + 3000ac0: 8fd5 or a5,a5,a3 + 3000ac2: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_gain_trim16 = trimData22.REG.data3.pga0_gain16; + 3000ac6: 18000737 lui a4,0x18000 + 3000aca: fc842783 lw a5,-56(s0) + 3000ace: 86be mv a3,a5 + 3000ad0: 6789 lui a5,0x2 + 3000ad2: 17fd addi a5,a5,-1 # 1fff + 3000ad4: 8ff5 and a5,a5,a3 + 3000ad6: 01079613 slli a2,a5,0x10 + 3000ada: 8241 srli a2,a2,0x10 + 3000adc: 6785 lui a5,0x1 + 3000ade: 973e add a4,a4,a5 + 3000ae0: 82072783 lw a5,-2016(a4) # 17fff820 + 3000ae4: 6689 lui a3,0x2 + 3000ae6: 16fd addi a3,a3,-1 # 1fff + 3000ae8: 8ef1 and a3,a3,a2 + 3000aea: 06c2 slli a3,a3,0x10 + 3000aec: e0010637 lui a2,0xe0010 + 3000af0: 167d addi a2,a2,-1 # e000ffff + 3000af2: 8ff1 and a5,a5,a2 + 3000af4: 8fd5 or a5,a5,a3 + 3000af6: 82f72023 sw a5,-2016(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_ofst_trim16 = trimData22.REG.data3.pga0_offset16; + 3000afa: 18000737 lui a4,0x18000 + 3000afe: fc842783 lw a5,-56(s0) + 3000b02: 83c1 srli a5,a5,0x10 + 3000b04: 86be mv a3,a5 + 3000b06: 6785 lui a5,0x1 + 3000b08: 17fd addi a5,a5,-1 # fff + 3000b0a: 8ff5 and a5,a5,a3 + 3000b0c: 01079613 slli a2,a5,0x10 + 3000b10: 8241 srli a2,a2,0x10 + 3000b12: 6785 lui a5,0x1 + 3000b14: 973e add a4,a4,a5 + 3000b16: 82072783 lw a5,-2016(a4) # 17fff820 + 3000b1a: 6685 lui a3,0x1 + 3000b1c: 16fd addi a3,a3,-1 # fff + 3000b1e: 8ef1 and a3,a3,a2 + 3000b20: 767d lui a2,0xfffff + 3000b22: 8ff1 and a5,a5,a2 + 3000b24: 8fd5 or a5,a5,a3 + 3000b26: 82f72023 sw a5,-2016(a4) + + FOTP_INFO_RGN0_NUMBER_23 trimData23; + FOTP_InfoGet(FOTP_INFO_RNG0, 23U, (void *)&trimData23.comData); /* 23 is the number of trim data in otp */ + 3000b2a: fac40793 addi a5,s0,-84 + 3000b2e: 863e mv a2,a5 + 3000b30: 45dd li a1,23 + 3000b32: 4501 li a0,0 + 3000b34: 2b09 jal ra,3001046 + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_gain_trim2 = trimData23.REG.data0.pga1_gain2; + 3000b36: 18000737 lui a4,0x18000 + 3000b3a: fac42783 lw a5,-84(s0) + 3000b3e: 86be mv a3,a5 + 3000b40: 6789 lui a5,0x2 + 3000b42: 17fd addi a5,a5,-1 # 1fff + 3000b44: 8ff5 and a5,a5,a3 + 3000b46: 01079613 slli a2,a5,0x10 + 3000b4a: 8241 srli a2,a2,0x10 + 3000b4c: 6785 lui a5,0x1 + 3000b4e: 973e add a4,a4,a5 + 3000b50: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b54: 6689 lui a3,0x2 + 3000b56: 16fd addi a3,a3,-1 # 1fff + 3000b58: 8ef1 and a3,a3,a2 + 3000b5a: 06c2 slli a3,a3,0x10 + 3000b5c: e0010637 lui a2,0xe0010 + 3000b60: 167d addi a2,a2,-1 # e000ffff + 3000b62: 8ff1 and a5,a5,a2 + 3000b64: 8fd5 or a5,a5,a3 + 3000b66: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_ofst_trim2 = trimData23.REG.data0.pga1_offset2; + 3000b6a: 18000737 lui a4,0x18000 + 3000b6e: fac42783 lw a5,-84(s0) + 3000b72: 83c1 srli a5,a5,0x10 + 3000b74: 86be mv a3,a5 + 3000b76: 6785 lui a5,0x1 + 3000b78: 17fd addi a5,a5,-1 # fff + 3000b7a: 8ff5 and a5,a5,a3 + 3000b7c: 01079613 slli a2,a5,0x10 + 3000b80: 8241 srli a2,a2,0x10 + 3000b82: 6785 lui a5,0x1 + 3000b84: 973e add a4,a4,a5 + 3000b86: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b8a: 6685 lui a3,0x1 + 3000b8c: 16fd addi a3,a3,-1 # fff + 3000b8e: 8ef1 and a3,a3,a2 + 3000b90: 767d lui a2,0xfffff + 3000b92: 8ff1 and a5,a5,a2 + 3000b94: 8fd5 or a5,a5,a3 + 3000b96: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_gain_trim4 = trimData23.REG.data1.pga1_gain4; + 3000b9a: 18000737 lui a4,0x18000 + 3000b9e: fb042783 lw a5,-80(s0) + 3000ba2: 86be mv a3,a5 + 3000ba4: 6789 lui a5,0x2 + 3000ba6: 17fd addi a5,a5,-1 # 1fff + 3000ba8: 8ff5 and a5,a5,a3 + 3000baa: 01079613 slli a2,a5,0x10 + 3000bae: 8241 srli a2,a2,0x10 + 3000bb0: 6785 lui a5,0x1 + 3000bb2: 973e add a4,a4,a5 + 3000bb4: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bb8: 6689 lui a3,0x2 + 3000bba: 16fd addi a3,a3,-1 # 1fff + 3000bbc: 8ef1 and a3,a3,a2 + 3000bbe: 06c2 slli a3,a3,0x10 + 3000bc0: e0010637 lui a2,0xe0010 + 3000bc4: 167d addi a2,a2,-1 # e000ffff + 3000bc6: 8ff1 and a5,a5,a2 + 3000bc8: 8fd5 or a5,a5,a3 + 3000bca: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_ofst_trim4 = trimData23.REG.data1.pga1_offset4; + 3000bce: 18000737 lui a4,0x18000 + 3000bd2: fb042783 lw a5,-80(s0) + 3000bd6: 83c1 srli a5,a5,0x10 + 3000bd8: 86be mv a3,a5 + 3000bda: 6785 lui a5,0x1 + 3000bdc: 17fd addi a5,a5,-1 # fff + 3000bde: 8ff5 and a5,a5,a3 + 3000be0: 01079613 slli a2,a5,0x10 + 3000be4: 8241 srli a2,a2,0x10 + 3000be6: 6785 lui a5,0x1 + 3000be8: 973e add a4,a4,a5 + 3000bea: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bee: 6685 lui a3,0x1 + 3000bf0: 16fd addi a3,a3,-1 # fff + 3000bf2: 8ef1 and a3,a3,a2 + 3000bf4: 767d lui a2,0xfffff + 3000bf6: 8ff1 and a5,a5,a2 + 3000bf8: 8fd5 or a5,a5,a3 + 3000bfa: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_gain_trim8 = trimData23.REG.data2.pga1_gain8; + 3000bfe: 18000737 lui a4,0x18000 + 3000c02: fb442783 lw a5,-76(s0) + 3000c06: 86be mv a3,a5 + 3000c08: 6789 lui a5,0x2 + 3000c0a: 17fd addi a5,a5,-1 # 1fff + 3000c0c: 8ff5 and a5,a5,a3 + 3000c0e: 01079613 slli a2,a5,0x10 + 3000c12: 8241 srli a2,a2,0x10 + 3000c14: 6785 lui a5,0x1 + 3000c16: 973e add a4,a4,a5 + 3000c18: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c1c: 6689 lui a3,0x2 + 3000c1e: 16fd addi a3,a3,-1 # 1fff + 3000c20: 8ef1 and a3,a3,a2 + 3000c22: 06c2 slli a3,a3,0x10 + 3000c24: e0010637 lui a2,0xe0010 + 3000c28: 167d addi a2,a2,-1 # e000ffff + 3000c2a: 8ff1 and a5,a5,a2 + 3000c2c: 8fd5 or a5,a5,a3 + 3000c2e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_ofst_trim8 = trimData23.REG.data2.pga1_offset8; + 3000c32: 18000737 lui a4,0x18000 + 3000c36: fb442783 lw a5,-76(s0) + 3000c3a: 83c1 srli a5,a5,0x10 + 3000c3c: 86be mv a3,a5 + 3000c3e: 6785 lui a5,0x1 + 3000c40: 17fd addi a5,a5,-1 # fff + 3000c42: 8ff5 and a5,a5,a3 + 3000c44: 01079613 slli a2,a5,0x10 + 3000c48: 8241 srli a2,a2,0x10 + 3000c4a: 6785 lui a5,0x1 + 3000c4c: 973e add a4,a4,a5 + 3000c4e: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c52: 6685 lui a3,0x1 + 3000c54: 16fd addi a3,a3,-1 # fff + 3000c56: 8ef1 and a3,a3,a2 + 3000c58: 767d lui a2,0xfffff + 3000c5a: 8ff1 and a5,a5,a2 + 3000c5c: 8fd5 or a5,a5,a3 + 3000c5e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_gain_trim16 = trimData23.REG.data3.pga1_gain16; + 3000c62: 18000737 lui a4,0x18000 + 3000c66: fb842783 lw a5,-72(s0) + 3000c6a: 86be mv a3,a5 + 3000c6c: 6789 lui a5,0x2 + 3000c6e: 17fd addi a5,a5,-1 # 1fff + 3000c70: 8ff5 and a5,a5,a3 + 3000c72: 01079613 slli a2,a5,0x10 + 3000c76: 8241 srli a2,a2,0x10 + 3000c78: 6785 lui a5,0x1 + 3000c7a: 973e add a4,a4,a5 + 3000c7c: 83072783 lw a5,-2000(a4) # 17fff830 + 3000c80: 6689 lui a3,0x2 + 3000c82: 16fd addi a3,a3,-1 # 1fff + 3000c84: 8ef1 and a3,a3,a2 + 3000c86: 06c2 slli a3,a3,0x10 + 3000c88: e0010637 lui a2,0xe0010 + 3000c8c: 167d addi a2,a2,-1 # e000ffff + 3000c8e: 8ff1 and a5,a5,a2 + 3000c90: 8fd5 or a5,a5,a3 + 3000c92: 82f72823 sw a5,-2000(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_ofst_trim16 = trimData23.REG.data3.pga1_offset16; + 3000c96: 18000737 lui a4,0x18000 + 3000c9a: fb842783 lw a5,-72(s0) + 3000c9e: 83c1 srli a5,a5,0x10 + 3000ca0: 86be mv a3,a5 + 3000ca2: 6785 lui a5,0x1 + 3000ca4: 17fd addi a5,a5,-1 # fff + 3000ca6: 8ff5 and a5,a5,a3 + 3000ca8: 01079613 slli a2,a5,0x10 + 3000cac: 8241 srli a2,a2,0x10 + 3000cae: 6785 lui a5,0x1 + 3000cb0: 973e add a4,a4,a5 + 3000cb2: 83072783 lw a5,-2000(a4) # 17fff830 + 3000cb6: 6685 lui a3,0x1 + 3000cb8: 16fd addi a3,a3,-1 # fff + 3000cba: 8ef1 and a3,a3,a2 + 3000cbc: 767d lui a2,0xfffff + 3000cbe: 8ff1 and a5,a5,a2 + 3000cc0: 8fd5 or a5,a5,a3 + 3000cc2: 82f72823 sw a5,-2000(a4) +} + 3000cc6: 0001 nop + 3000cc8: 40f6 lw ra,92(sp) + 3000cca: 4466 lw s0,88(sp) + 3000ccc: 6125 addi sp,sp,96 + 3000cce: 8082 ret + +03000cd0 : + 3000cd0: 3760006f j 3001046 + +03000cd4 : + * @brief Parameter calibration entry of the analog module. + * @param None + * @retval None + */ +void ANATRIM_Entry(void) +{ + 3000cd4: 1141 addi sp,sp,-16 + 3000cd6: c606 sw ra,12(sp) + 3000cd8: c422 sw s0,8(sp) + 3000cda: 0800 addi s0,sp,16 + if (CHIP_GetInfo() == false) { /* If the chip information is incorrect, calibration is not performed */ + 3000cdc: 3c79 jal ra,300077a + 3000cde: 87aa mv a5,a0 + 3000ce0: 0017c793 xori a5,a5,1 + 3000ce4: 9f81 uxtb a5 + 3000ce6: eb9d bnez a5,3000d1c + return; + } + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_ENABLE); /* Enable the clock for calibration */ + 3000ce8: 4585 li a1,1 + 3000cea: 18000537 lui a0,0x18000 + 3000cee: 2849 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_ENABLE); + 3000cf0: 4585 li a1,1 + 3000cf2: 18200537 lui a0,0x18200 + 3000cf6: 2069 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_ENABLE); + 3000cf8: 4585 li a1,1 + 3000cfa: 18201537 lui a0,0x18201 + 3000cfe: 2049 jal ra,3000d80 + CHIP_AnalogTrim(); + 3000d00: 34d1 jal ra,30007c4 + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_DISABLE); /* The clock is disabled after calibration */ + 3000d02: 4581 li a1,0 + 3000d04: 18000537 lui a0,0x18000 + 3000d08: 28a5 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_DISABLE); + 3000d0a: 4581 li a1,0 + 3000d0c: 18200537 lui a0,0x18200 + 3000d10: 2885 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_DISABLE); + 3000d12: 4581 li a1,0 + 3000d14: 18201537 lui a0,0x18201 + 3000d18: 20a5 jal ra,3000d80 + 3000d1a: a011 j 3000d1e + return; + 3000d1c: 0001 nop + 3000d1e: 40b2 lw ra,12(sp) + 3000d20: 4422 lw s0,8(sp) + 3000d22: 0141 addi sp,sp,16 + 3000d24: 8082 ret + +03000d26 : + * @brief Set Crg Core clock select + * @param None + * @retval None + */ +void ANAVREF_Init(void) +{ + 3000d26: 1141 addi sp,sp,-16 + 3000d28: c606 sw ra,12(sp) + 3000d2a: c422 sw s0,8(sp) + 3000d2c: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(VREF_BASE, IP_CLK_ENABLE); + 3000d2e: 4585 li a1,1 + 3000d30: 18100537 lui a0,0x18100 + 3000d34: 20b1 jal ra,3000d80 + VREF->VREF_CTRL1.BIT.da_ref_temp_trim_enh = 0x1; + 3000d36: 18100737 lui a4,0x18100 + 3000d3a: 531c lw a5,32(a4) + 3000d3c: 66c1 lui a3,0x10 + 3000d3e: 8fd5 or a5,a5,a3 + 3000d40: d31c sw a5,32(a4) + VREF->VREF_CTRL0.BIT.da_ref_enh = BASE_CFG_ENABLE; + 3000d42: 18100737 lui a4,0x18100 + 3000d46: 431c lw a5,0(a4) + 3000d48: 0017e793 ori a5,a5,1 + 3000d4c: c31c sw a5,0(a4) + BASE_FUNC_DELAY_US(200); /* delay 200us */ + 3000d4e: 000f47b7 lui a5,0xf4 + 3000d52: 24078593 addi a1,a5,576 # f4240 + 3000d56: 0c800513 li a0,200 + 3000d5a: 20b5 jal ra,3000dc6 + VREF->VREF_CTRL1.BIT.da_ref_chop_enh = BASE_CFG_ENABLE; + 3000d5c: 18100737 lui a4,0x18100 + 3000d60: 531c lw a5,32(a4) + 3000d62: 0017e793 ori a5,a5,1 + 3000d66: d31c sw a5,32(a4) + BASE_FUNC_DELAY_US(40); /* delay 40us */ + 3000d68: 000f47b7 lui a5,0xf4 + 3000d6c: 24078593 addi a1,a5,576 # f4240 + 3000d70: 02800513 li a0,40 + 3000d74: 2889 jal ra,3000dc6 + 3000d76: 0001 nop + 3000d78: 40b2 lw ra,12(sp) + 3000d7a: 4422 lw s0,8(sp) + 3000d7c: 0141 addi sp,sp,16 + 3000d7e: 8082 ret + +03000d80 : + 3000d80: 0b30206f j 3003632 + +03000d84 : + * @brief Set Crg Core clock select + * @param coreClkSelect Input core clock select value + * @retval None + */ +void CRG_SetCoreClockSelect(CRG_CoreClkSelect coreClkSelect) +{ + 3000d84: 715d addi sp,sp,-80 + 3000d86: c686 sw ra,76(sp) + 3000d88: c4a2 sw s0,72(sp) + 3000d8a: 0880 addi s0,sp,80 + 3000d8c: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3000d90: 100007b7 lui a5,0x10000 + 3000d94: fcf42423 sw a5,-56(s0) + crg.coreClkSelect = coreClkSelect; + 3000d98: fbc42783 lw a5,-68(s0) + 3000d9c: fef42023 sw a5,-32(s0) + if (crg.coreClkSelect == CRG_CORE_CLK_SELECT_TCXO) { /* If an external crystal oscillator is selected. */ + 3000da0: fe042703 lw a4,-32(s0) + 3000da4: 4785 li a5,1 + 3000da6: 00f71663 bne a4,a5,3000db2 + BASE_FUNC_DELAY_MS(10); /* 10: delay 10ms, wait clokc stable. */ + 3000daa: 3e800593 li a1,1000 + 3000dae: 4529 li a0,10 + 3000db0: 2819 jal ra,3000dc6 + } + HAL_CRG_SetCoreClockSelect(&crg); + 3000db2: fc840793 addi a5,s0,-56 + 3000db6: 853e mv a0,a5 + 3000db8: 572020ef jal ra,300332a + 3000dbc: 0001 nop + 3000dbe: 40b6 lw ra,76(sp) + 3000dc0: 4426 lw s0,72(sp) + 3000dc2: 6161 addi sp,sp,80 + 3000dc4: 8082 ret + +03000dc6 : + 3000dc6: 5160106f j 30022dc + +03000dca : + * @param frequence frequnce + * @param div Output Divison + * @retval None + */ +static void SetFlashDiv(unsigned int frequency, unsigned int *nreadDiv) +{ + 3000dca: 7179 addi sp,sp,-48 + 3000dcc: d622 sw s0,44(sp) + 3000dce: 1800 addi s0,sp,48 + 3000dd0: fca42e23 sw a0,-36(s0) + 3000dd4: fcb42c23 sw a1,-40(s0) + unsigned int div; + unsigned int freq = frequency; + 3000dd8: fdc42783 lw a5,-36(s0) + 3000ddc: fef42423 sw a5,-24(s0) + /* Get frequency divider of flash. */ + if (freq < FLASH_BASE_FREQ) { + 3000de0: fe842703 lw a4,-24(s0) + 3000de4: 023c37b7 lui a5,0x23c3 + 3000de8: 45f78793 addi a5,a5,1119 # 23c345f + 3000dec: 00e7e863 bltu a5,a4,3000dfc + freq = FLASH_BASE_FREQ; + 3000df0: 023c37b7 lui a5,0x23c3 + 3000df4: 46078793 addi a5,a5,1120 # 23c3460 + 3000df8: fef42423 sw a5,-24(s0) + } + /* Get the flash frequency division based on the frequency. */ + if ((freq % FLASH_BASE_FREQ) == 0) { + 3000dfc: fe842703 lw a4,-24(s0) + 3000e00: 023c37b7 lui a5,0x23c3 + 3000e04: 46078793 addi a5,a5,1120 # 23c3460 + 3000e08: 02f777b3 remu a5,a4,a5 + 3000e0c: ef81 bnez a5,3000e24 + div = freq / FLASH_BASE_FREQ; + 3000e0e: fe842703 lw a4,-24(s0) + 3000e12: 023c37b7 lui a5,0x23c3 + 3000e16: 46078793 addi a5,a5,1120 # 23c3460 + 3000e1a: 02f757b3 divu a5,a4,a5 + 3000e1e: fef42623 sw a5,-20(s0) + 3000e22: a821 j 3000e3a + } else { + div = (freq / FLASH_BASE_FREQ) + 1; + 3000e24: fe842703 lw a4,-24(s0) + 3000e28: 023c37b7 lui a5,0x23c3 + 3000e2c: 46078793 addi a5,a5,1120 # 23c3460 + 3000e30: 02f757b3 divu a5,a4,a5 + 3000e34: 0785 addi a5,a5,1 + 3000e36: fef42623 sw a5,-20(s0) + } + /* Ensure the flash frequency division is valid. */ + if (div > FLASH_MAX_DIV) { + 3000e3a: fec42703 lw a4,-20(s0) + 3000e3e: 4791 li a5,4 + 3000e40: 00e7f563 bgeu a5,a4,3000e4a + div = FLASH_MAX_DIV; + 3000e44: 4791 li a5,4 + 3000e46: fef42623 sw a5,-20(s0) + } + *nreadDiv = div; + 3000e4a: fd842783 lw a5,-40(s0) + 3000e4e: fec42703 lw a4,-20(s0) + 3000e52: c398 sw a4,0(a5) +} + 3000e54: 0001 nop + 3000e56: 5432 lw s0,44(sp) + 3000e58: 6145 addi sp,sp,48 + 3000e5a: 8082 ret + +03000e5c : + * @brief Get the Rounding up value + * @param coreClkSelect Core Clock select + * @retval Frequency of Flash + */ +static unsigned int GetFlashFreq(CRG_CoreClkSelect coreClkSelect) +{ + 3000e5c: 7179 addi sp,sp,-48 + 3000e5e: d606 sw ra,44(sp) + 3000e60: d422 sw s0,40(sp) + 3000e62: 1800 addi s0,sp,48 + 3000e64: fca42e23 sw a0,-36(s0) + unsigned int hclk; + /* Get frequency of flash. */ + switch (coreClkSelect) { + 3000e68: fdc42783 lw a5,-36(s0) + 3000e6c: 4705 li a4,1 + 3000e6e: 02e78063 beq a5,a4,3000e8e + 3000e72: 4705 li a4,1 + 3000e74: 00e7e663 bltu a5,a4,3000e80 + 3000e78: 4709 li a4,2 + 3000e7a: 02e78163 beq a5,a4,3000e9c + 3000e7e: a025 j 3000ea6 + case CRG_CORE_CLK_SELECT_HOSC: + hclk = HOSC_FREQ; + 3000e80: 017d87b7 lui a5,0x17d8 + 3000e84: 84078793 addi a5,a5,-1984 # 17d7840 + 3000e88: fef42623 sw a5,-20(s0) + break; + 3000e8c: a01d j 3000eb2 + case CRG_CORE_CLK_SELECT_TCXO: + hclk = XTRAIL_FREQ; + 3000e8e: 01c9c7b7 lui a5,0x1c9c + 3000e92: 38078793 addi a5,a5,896 # 1c9c380 + 3000e96: fef42623 sw a5,-20(s0) + break; + 3000e9a: a821 j 3000eb2 + case CRG_CORE_CLK_SELECT_PLL: + hclk = HAL_CRG_GetPllFreq(); + 3000e9c: 5b0020ef jal ra,300344c + 3000ea0: fea42623 sw a0,-20(s0) + break; + 3000ea4: a039 j 3000eb2 + default: + hclk = LOSC_FREQ; + 3000ea6: 67a1 lui a5,0x8 + 3000ea8: d0078793 addi a5,a5,-768 # 7d00 + 3000eac: fef42623 sw a5,-20(s0) + break; + 3000eb0: 0001 nop + } + return hclk; + 3000eb2: fec42783 lw a5,-20(s0) +} + 3000eb6: 853e mv a0,a5 + 3000eb8: 50b2 lw ra,44(sp) + 3000eba: 5422 lw s0,40(sp) + 3000ebc: 6145 addi sp,sp,48 + 3000ebe: 8082 ret + +03000ec0 : + * @brief Set flash clock frequence base on hclk + * @param coreClkSelect core clock select + * @retval None + */ +void FLASH_ClockConfig(CRG_CoreClkSelect coreClkSelect) +{ + 3000ec0: 7179 addi sp,sp,-48 + 3000ec2: d606 sw ra,44(sp) + 3000ec4: d422 sw s0,40(sp) + 3000ec6: 1800 addi s0,sp,48 + 3000ec8: fca42e23 sw a0,-36(s0) + EFC_RegStruct *efc = EFC; + 3000ecc: 147107b7 lui a5,0x14710 + 3000ed0: fef42623 sw a5,-20(s0) + EFLASH_CLK_CFG_REG cfg; + unsigned int hclk; + unsigned int nreadDiv; + + /* Step 1: Set nread_div */ + hclk = GetFlashFreq(coreClkSelect); + 3000ed4: fdc42503 lw a0,-36(s0) + 3000ed8: 3751 jal ra,3000e5c + 3000eda: fea42423 sw a0,-24(s0) + cfg.reg = efc->EFLASH_CLK_CFG.reg; + 3000ede: fec42703 lw a4,-20(s0) + 3000ee2: 6785 lui a5,0x1 + 3000ee4: 97ba add a5,a5,a4 + 3000ee6: 9407a783 lw a5,-1728(a5) # 940 + 3000eea: fef42223 sw a5,-28(s0) + SetFlashDiv(hclk, &nreadDiv); + 3000eee: fe040793 addi a5,s0,-32 + 3000ef2: 85be mv a1,a5 + 3000ef4: fe842503 lw a0,-24(s0) + 3000ef8: 3dc9 jal ra,3000dca + cfg.BIT.nread_div = nreadDiv; + 3000efa: fe042783 lw a5,-32(s0) + 3000efe: 8bbd andi a5,a5,15 + 3000f00: 0ff7f713 andi a4,a5,255 + 3000f04: fe442783 lw a5,-28(s0) + 3000f08: 8b3d andi a4,a4,15 + 3000f0a: 0712 slli a4,a4,0x4 + 3000f0c: f0f7f793 andi a5,a5,-241 + 3000f10: 8fd9 or a5,a5,a4 + 3000f12: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f16: fe442783 lw a5,-28(s0) + 3000f1a: 00100737 lui a4,0x100 + 3000f1e: 8fd9 or a5,a5,a4 + 3000f20: fef42223 sw a5,-28(s0) + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f24: fe442783 lw a5,-28(s0) + 3000f28: 00400737 lui a4,0x400 + 3000f2c: 8fd9 or a5,a5,a4 + 3000f2e: fef42223 sw a5,-28(s0) + + /* Step 2: Wait Busclk_sw_req */ + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f32: fe442783 lw a5,-28(s0) + 3000f36: 00400737 lui a4,0x400 + 3000f3a: 8fd9 or a5,a5,a4 + 3000f3c: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f40: fe442783 lw a5,-28(s0) + 3000f44: 00100737 lui a4,0x100 + 3000f48: 8fd9 or a5,a5,a4 + 3000f4a: fef42223 sw a5,-28(s0) + efc->EFLASH_CLK_CFG.reg = cfg.reg; + 3000f4e: fe442703 lw a4,-28(s0) + 3000f52: fec42683 lw a3,-20(s0) + 3000f56: 6785 lui a5,0x1 + 3000f58: 97b6 add a5,a5,a3 + 3000f5a: 94e7a023 sw a4,-1728(a5) # 940 + while (efc->EFLASH_CLK_CFG.BIT.busclk_sw_req == BASE_CFG_SET) { + 3000f5e: 0001 nop + 3000f60: fec42703 lw a4,-20(s0) + 3000f64: 6785 lui a5,0x1 + 3000f66: 97ba add a5,a5,a4 + 3000f68: 9407a783 lw a5,-1728(a5) # 940 + 3000f6c: 83d1 srli a5,a5,0x14 + 3000f6e: 8b85 andi a5,a5,1 + 3000f70: 0ff7f713 andi a4,a5,255 + 3000f74: 4785 li a5,1 + 3000f76: fef705e3 beq a4,a5,3000f60 + ; + } + 3000f7a: 0001 nop + 3000f7c: 50b2 lw ra,44(sp) + 3000f7e: 5422 lw s0,40(sp) + 3000f80: 6145 addi sp,sp,48 + 3000f82: 8082 ret + +03000f84 : + * @brief Init the systick + * @param None + * @retval None + */ +void SYSTICK_Init(void) +{ + 3000f84: 1141 addi sp,sp,-16 + 3000f86: c622 sw s0,12(sp) + 3000f88: 0800 addi s0,sp,16 + SYSTICK->TIMER_CTRL.reg = 0; + 3000f8a: 143807b7 lui a5,0x14380 + 3000f8e: 0007a023 sw zero,0(a5) # 14380000 + SYSTICK->TIMER_CTRL.BIT.enable = 1; + 3000f92: 14380737 lui a4,0x14380 + 3000f96: 431c lw a5,0(a4) + 3000f98: 0017e793 ori a5,a5,1 + 3000f9c: c31c sw a5,0(a4) +} + 3000f9e: 0001 nop + 3000fa0: 4432 lw s0,12(sp) + 3000fa2: 0141 addi sp,sp,16 + 3000fa4: 8082 ret + +03000fa6 : + * @brief Get the Systick frep(Hz) + * @param None + * @retval Clock frep of systick(Hz) + */ +unsigned int SYSTICK_GetCRGHZ(void) +{ + 3000fa6: 1141 addi sp,sp,-16 + 3000fa8: c606 sw ra,12(sp) + 3000faa: c422 sw s0,8(sp) + 3000fac: 0800 addi s0,sp,16 + /* Get the Systick IP */ + return HAL_CRG_GetIpFreq(SYSTICK_BASE); + 3000fae: 14380537 lui a0,0x14380 + 3000fb2: 59c020ef jal ra,300354e + 3000fb6: 87aa mv a5,a0 + 3000fb8: 853e mv a0,a5 + 3000fba: 40b2 lw ra,12(sp) + 3000fbc: 4422 lw s0,8(sp) + 3000fbe: 0141 addi sp,sp,16 + 3000fc0: 8082 ret + +03000fc2 : + * @param efc Flash control register base address + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +static unsigned int FOTP_CheckReadStatus(EFC_RegStruct *efc) +{ + 3000fc2: 1101 addi sp,sp,-32 + 3000fc4: ce22 sw s0,28(sp) + 3000fc6: 1000 addi s0,sp,32 + 3000fc8: fea42623 sw a0,-20(s0) + /* Check for errors in the flash reading process. */ + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fcc: fec42783 lw a5,-20(s0) + 3000fd0: 1007a783 lw a5,256(a5) + 3000fd4: 83c1 srli a5,a5,0x10 + 3000fd6: 8b85 andi a5,a5,1 + 3000fd8: 9f81 uxtb a5 + 3000fda: e38d bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000fdc: fec42783 lw a5,-20(s0) + 3000fe0: 1007a783 lw a5,256(a5) + 3000fe4: 83cd srli a5,a5,0x13 + 3000fe6: 8b85 andi a5,a5,1 + 3000fe8: 9f81 uxtb a5 + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fea: eb89 bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_chk) { + 3000fec: fec42783 lw a5,-20(s0) + 3000ff0: 1007a783 lw a5,256(a5) + 3000ff4: 83d1 srli a5,a5,0x14 + 3000ff6: 8b85 andi a5,a5,1 + 3000ff8: 9f81 uxtb a5 + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000ffa: c3a9 beqz a5,300103c + efc->INT_CLEAR.BIT.int_clr_err_ecc_corr = BASE_CFG_SET; + 3000ffc: fec42703 lw a4,-20(s0) + 3001000: 10c72783 lw a5,268(a4) # 1438010c + 3001004: 000806b7 lui a3,0x80 + 3001008: 8fd5 or a5,a5,a3 + 300100a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_illegal = BASE_CFG_SET; + 300100e: fec42703 lw a4,-20(s0) + 3001012: 10c72783 lw a5,268(a4) + 3001016: 66c1 lui a3,0x10 + 3001018: 8fd5 or a5,a5,a3 + 300101a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_ecc_chk = BASE_CFG_SET; + 300101e: fec42703 lw a4,-20(s0) + 3001022: 10c72783 lw a5,268(a4) + 3001026: 001006b7 lui a3,0x100 + 300102a: 8fd5 or a5,a5,a3 + 300102c: 10f72623 sw a5,268(a4) + efc->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001030: fec42783 lw a5,-20(s0) + 3001034: 2007a023 sw zero,512(a5) + return BASE_STATUS_ERROR; + 3001038: 4785 li a5,1 + 300103a: a011 j 300103e + } + return BASE_STATUS_OK; + 300103c: 4781 li a5,0 +} + 300103e: 853e mv a0,a5 + 3001040: 4472 lw s0,28(sp) + 3001042: 6105 addi sp,sp,32 + 3001044: 8082 ret + +03001046 : + * @param buf Buffer of read data + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +unsigned int FOTP_InfoGet(FOTP_InfoRngType type, unsigned int index, FOTP_CommonData *buf) +{ + 3001046: 7179 addi sp,sp,-48 + 3001048: d606 sw ra,44(sp) + 300104a: d422 sw s0,40(sp) + 300104c: 1800 addi s0,sp,48 + 300104e: fca42e23 sw a0,-36(s0) + 3001052: fcb42c23 sw a1,-40(s0) + 3001056: fcc42a23 sw a2,-44(s0) + EFC_RegStruct *p = EFC; + 300105a: 147107b7 lui a5,0x14710 + 300105e: fef42423 sw a5,-24(s0) + unsigned int addr; + + if (buf == NULL) { + 3001062: fd442783 lw a5,-44(s0) + 3001066: e399 bnez a5,300106c + return BASE_STATUS_ERROR; + 3001068: 4785 li a5,1 + 300106a: aa15 j 300119e + } + + if ((type >= FOTP_INFO_MAXTYPE) || (index > FOTP_INFO_REG_MAX_ID)) { + 300106c: fdc42703 lw a4,-36(s0) + 3001070: 4785 li a5,1 + 3001072: 00e7e763 bltu a5,a4,3001080 + 3001076: fd842703 lw a4,-40(s0) + 300107a: 47e5 li a5,25 + 300107c: 00e7f463 bgeu a5,a4,3001084 + return BASE_STATUS_ERROR; + 3001080: 4785 li a5,1 + 3001082: aa31 j 300119e + } + + /* If there is a read command, return */ + if (p->EFLASH_CMD.BIT.cmd_start) { + 3001084: fe842783 lw a5,-24(s0) + 3001088: 439c lw a5,0(a5) + 300108a: 8b85 andi a5,a5,1 + 300108c: 9f81 uxtb a5 + 300108e: c399 beqz a5,3001094 + return BASE_STATUS_ERROR; + 3001090: 4785 li a5,1 + 3001092: a231 j 300119e + } + + p->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; + 3001094: fe842783 lw a5,-24(s0) + 3001098: fedcc737 lui a4,0xfedcc + 300109c: a9870713 addi a4,a4,-1384 # fedcba98 + 30010a0: 20e7a023 sw a4,512(a5) # 14710200 + + /* Configure the read command parameters and start the read command */ + addr = (type == FOTP_INFO_RNG0) ? FOTP_INFO_RNG0_BASEADDR : FOTP_INFO_RNG1_BASEADDR; + 30010a4: fdc42783 lw a5,-36(s0) + 30010a8: e781 bnez a5,30010b0 + 30010aa: 008007b7 lui a5,0x800 + 30010ae: a019 j 30010b4 + 30010b0: 008017b7 lui a5,0x801 + 30010b4: fef42223 sw a5,-28(s0) + addr += index * REG_WORDS_NUM; + 30010b8: fd842783 lw a5,-40(s0) + 30010bc: 0792 slli a5,a5,0x4 + 30010be: fe442703 lw a4,-28(s0) + 30010c2: 97ba add a5,a5,a4 + 30010c4: fef42223 sw a5,-28(s0) + p->EFLASH_ADDR.BIT.cmd_addr = addr >> 2; /* Right shift 2 bit change to word */ + 30010c8: fe442783 lw a5,-28(s0) + 30010cc: 0027d713 srli a4,a5,0x2 + 30010d0: 004007b7 lui a5,0x400 + 30010d4: 17fd addi a5,a5,-1 # 3fffff + 30010d6: 00f77633 and a2,a4,a5 + 30010da: fe842703 lw a4,-24(s0) + 30010de: 435c lw a5,4(a4) + 30010e0: 004006b7 lui a3,0x400 + 30010e4: 16fd addi a3,a3,-1 # 3fffff + 30010e6: 8ef1 and a3,a3,a2 + 30010e8: 068a slli a3,a3,0x2 + 30010ea: ff000637 lui a2,0xff000 + 30010ee: 060d addi a2,a2,3 # ff000003 + 30010f0: 8ff1 and a5,a5,a2 + 30010f2: 8fd5 or a5,a5,a3 + 30010f4: c35c sw a5,4(a4) + p->EFLASH_CMD.BIT.cmd_code = FLASH_OPERATION_READ; + 30010f6: fe842703 lw a4,-24(s0) + 30010fa: 431c lw a5,0(a4) + 30010fc: 8ff7f793 andi a5,a5,-1793 + 3001100: 1007e793 ori a5,a5,256 + 3001104: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_read_size = FLASH_READ_128BIT; + 3001106: fe842703 lw a4,-24(s0) + 300110a: 431c lw a5,0(a4) + 300110c: d00006b7 lui a3,0xd0000 + 3001110: 16fd addi a3,a3,-1 # cfffffff + 3001112: 8efd and a3,a3,a5 + 3001114: 100007b7 lui a5,0x10000 + 3001118: 8fd5 or a5,a5,a3 + 300111a: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_start = BASE_CFG_SET; + 300111c: fe842703 lw a4,-24(s0) + 3001120: 431c lw a5,0(a4) + 3001122: 0017e793 ori a5,a5,1 + 3001126: c31c sw a5,0(a4) + + while (p->EFLASH_CMD.BIT.cmd_start) { + 3001128: 0001 nop + 300112a: fe842783 lw a5,-24(s0) + 300112e: 439c lw a5,0(a5) + 3001130: 8b85 andi a5,a5,1 + 3001132: 9f81 uxtb a5 + 3001134: fbfd bnez a5,300112a + ; + } + while (p->EFLASH_CMD.BIT.exec_state) { + 3001136: 0001 nop + 3001138: fe842783 lw a5,-24(s0) + 300113c: 439c lw a5,0(a5) + 300113e: 8399 srli a5,a5,0x6 + 3001140: 8b8d andi a5,a5,3 + 3001142: 9f81 uxtb a5 + 3001144: fbf5 bnez a5,3001138 + ; + } + /* read error, clear interrupt and return */ + if (FOTP_CheckReadStatus(p) != BASE_STATUS_OK) { + 3001146: fe842503 lw a0,-24(s0) + 300114a: 3da5 jal ra,3000fc2 + 300114c: 87aa mv a5,a0 + 300114e: c399 beqz a5,3001154 + return BASE_STATUS_ERROR; + 3001150: 4785 li a5,1 + 3001152: a0b1 j 300119e + } + /* Read data from FIFO to buffer */ + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001154: fe042623 sw zero,-20(s0) + 3001158: a00d j 300117a + buf->data[i] = p->FLASH_RDATA; + 300115a: fe842783 lw a5,-24(s0) + 300115e: 6007a703 lw a4,1536(a5) # 10000600 + 3001162: fd442683 lw a3,-44(s0) + 3001166: fec42783 lw a5,-20(s0) + 300116a: 078a slli a5,a5,0x2 + 300116c: 97b6 add a5,a5,a3 + 300116e: c398 sw a4,0(a5) + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001170: fec42783 lw a5,-20(s0) + 3001174: 0785 addi a5,a5,1 + 3001176: fef42623 sw a5,-20(s0) + 300117a: fec42703 lw a4,-20(s0) + 300117e: 478d li a5,3 + 3001180: fce7fde3 bgeu a5,a4,300115a + } + p->INT_CLEAR.BIT.int_clr_finish = BASE_CFG_SET; + 3001184: fe842703 lw a4,-24(s0) + 3001188: 10c72783 lw a5,268(a4) + 300118c: 0107e793 ori a5,a5,16 + 3001190: 10f72623 sw a5,268(a4) + p->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001194: fe842783 lw a5,-24(s0) + 3001198: 2007a023 sw zero,512(a5) + return BASE_STATUS_OK; + 300119c: 4781 li a5,0 + 300119e: 853e mv a0,a5 + 30011a0: 50b2 lw ra,44(sp) + 30011a2: 5422 lw s0,40(sp) + 30011a4: 6145 addi sp,sp,48 + 30011a6: 8082 ret + +030011a8 : + * @param baseAddr The ip base address + * @retval The Address(offset) in g_crgIpMatch if match success + * @retval 0 if match fail + */ +CHIP_CrgIpMatchInfo *GetCrgIpMatchInfo(const void *baseAddr) +{ + 30011a8: 7179 addi sp,sp,-48 + 30011aa: d622 sw s0,44(sp) + 30011ac: 1800 addi s0,sp,48 + 30011ae: fca42e23 sw a0,-36(s0) + unsigned int i; + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011b2: fe042623 sw zero,-20(s0) + 30011b6: a081 j 30011f6 + if (baseAddr == g_crgIpMatch[i].ipBaseAddr) { + 30011b8: 030067b7 lui a5,0x3006 + 30011bc: 58c78713 addi a4,a5,1420 # 300658c + 30011c0: fec42683 lw a3,-20(s0) + 30011c4: 47b1 li a5,12 + 30011c6: 02f687b3 mul a5,a3,a5 + 30011ca: 97ba add a5,a5,a4 + 30011cc: 439c lw a5,0(a5) + 30011ce: fdc42703 lw a4,-36(s0) + 30011d2: 00f71d63 bne a4,a5,30011ec + return (CHIP_CrgIpMatchInfo *)&g_crgIpMatch[i]; + 30011d6: fec42703 lw a4,-20(s0) + 30011da: 47b1 li a5,12 + 30011dc: 02f70733 mul a4,a4,a5 + 30011e0: 030067b7 lui a5,0x3006 + 30011e4: 58c78793 addi a5,a5,1420 # 300658c + 30011e8: 97ba add a5,a5,a4 + 30011ea: a829 j 3001204 + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011ec: fec42783 lw a5,-20(s0) + 30011f0: 0785 addi a5,a5,1 + 30011f2: fef42623 sw a5,-20(s0) + 30011f6: fec42703 lw a4,-20(s0) + 30011fa: 02d00793 li a5,45 + 30011fe: fae7fde3 bgeu a5,a4,30011b8 + } + } + return (CHIP_CrgIpMatchInfo *)0; /* The base address does not match, return 0. */ + 3001202: 4781 li a5,0 +} + 3001204: 853e mv a0,a5 + 3001206: 5432 lw s0,44(sp) + 3001208: 6145 addi sp,sp,48 + 300120a: 8082 ret + +0300120c : + * @brief Check ADC sample input. + * @param input Number of input. + * @retval bool + */ +static inline bool IsADCSampleChannel(ADC_Input input) +{ + 300120c: 1101 addi sp,sp,-32 + 300120e: ce22 sw s0,28(sp) + 3001210: 1000 addi s0,sp,32 + 3001212: fea42623 sw a0,-20(s0) + return (input >= ADC_CH_ADCINA0) && (input <= ADC_CH_ADCINA19); + 3001216: fec42783 lw a5,-20(s0) + 300121a: 0147b793 sltiu a5,a5,20 + 300121e: 9f81 uxtb a5 +} + 3001220: 853e mv a0,a5 + 3001222: 4472 lw s0,28(sp) + 3001224: 6105 addi sp,sp,32 + 3001226: 8082 ret + +03001228 : + * are configured through the SOC. + * @param soc Number of SOC. + * @retval bool + */ +static inline bool IsADCSOCx(ADC_SOCNumber soc) +{ + 3001228: 1101 addi sp,sp,-32 + 300122a: ce22 sw s0,28(sp) + 300122c: 1000 addi s0,sp,32 + 300122e: fea42623 sw a0,-20(s0) + return (soc >= ADC_SOC_NUM0) && (soc <= ADC_SOC_NUM15); + 3001232: fec42783 lw a5,-20(s0) + 3001236: 0107b793 sltiu a5,a5,16 + 300123a: 9f81 uxtb a5 +} + 300123c: 853e mv a0,a5 + 300123e: 4472 lw s0,28(sp) + 3001240: 6105 addi sp,sp,32 + 3001242: 8082 ret + +03001244 : + * @brief Check ADC interrupt parameter. + * @param intx Number of interrupt. + * @retval bool + */ +static inline bool IsADCIntx(ADC_IntNumber intx) +{ + 3001244: 1101 addi sp,sp,-32 + 3001246: ce22 sw s0,28(sp) + 3001248: 1000 addi s0,sp,32 + 300124a: fea42623 sw a0,-20(s0) + return (intx >= ADC_INT_NUMBER0) && (intx <= ADC_INT_NUMBER3); + 300124e: fec42783 lw a5,-20(s0) + 3001252: 0047b793 sltiu a5,a5,4 + 3001256: 9f81 uxtb a5 +} + 3001258: 853e mv a0,a5 + 300125a: 4472 lw s0,28(sp) + 300125c: 6105 addi sp,sp,32 + 300125e: 8082 ret + +03001260 : + * @brief Check SOC trigger source. + * @param trig Type of trigger source. + * @retval bool + */ +static inline bool IsADCTrigSource(ADC_TrigSource trig) +{ + 3001260: 1101 addi sp,sp,-32 + 3001262: ce22 sw s0,28(sp) + 3001264: 1000 addi s0,sp,32 + 3001266: fea42623 sw a0,-20(s0) + return (trig >= ADC_TRIGSOC_SOFT) && (trig <= ADC_TRIGSOC_GPIOPF1); + 300126a: fec42783 lw a5,-20(s0) + 300126e: 0157b793 sltiu a5,a5,21 + 3001272: 9f81 uxtb a5 +} + 3001274: 853e mv a0,a5 + 3001276: 4472 lw s0,28(sp) + 3001278: 6105 addi sp,sp,32 + 300127a: 8082 ret + +0300127c : + * @brief Check mode of completion of SOC sample + * @param mode Type of completion. + * @retval bool + */ +static inline bool IsADCFinishMode(ADC_SOCFinishMode mode) +{ + 300127c: 1101 addi sp,sp,-32 + 300127e: ce22 sw s0,28(sp) + 3001280: 1000 addi s0,sp,32 + 3001282: fea42623 sw a0,-20(s0) + return (mode >= ADC_SOCFINISH_NONE) && (mode <= ADC_SOCFINISH_INT3); + 3001286: fec42783 lw a5,-20(s0) + 300128a: cb81 beqz a5,300129a + 300128c: fec42703 lw a4,-20(s0) + 3001290: 4799 li a5,6 + 3001292: 00e7e463 bltu a5,a4,300129a + 3001296: 4785 li a5,1 + 3001298: a011 j 300129c + 300129a: 4781 li a5,0 + 300129c: 8b85 andi a5,a5,1 + 300129e: 9f81 uxtb a5 +} + 30012a0: 853e mv a0,a5 + 30012a2: 4472 lw s0,28(sp) + 30012a4: 6105 addi sp,sp,32 + 30012a6: 8082 ret + +030012a8 : + * @brief Check ADC sample priority parameter. + * @param mode Priority mode of SOC. + * @retval bool + */ +static inline bool IsADCPriorityMode(ADC_PriorityMode mode) +{ + 30012a8: 1101 addi sp,sp,-32 + 30012aa: ce22 sw s0,28(sp) + 30012ac: 1000 addi s0,sp,32 + 30012ae: fea42623 sw a0,-20(s0) + return (mode >= ADC_PRIMODE_ALL_ROUND) && (mode <= ADC_PRIMODE_ALL_PRIORITY); + 30012b2: fec42703 lw a4,-20(s0) + 30012b6: 67c1 lui a5,0x10 + 30012b8: 00f737b3 sltu a5,a4,a5 + 30012bc: 9f81 uxtb a5 +} + 30012be: 853e mv a0,a5 + 30012c0: 4472 lw s0,28(sp) + 30012c2: 6105 addi sp,sp,32 + 30012c4: 8082 ret + +030012c6 : + * @brief Check time of total ADC sampling time. + * @param acqps Time of total ADC sampling time. + * @retval bool + */ +static inline bool IsADCTotalTime(unsigned int acqps) +{ + 30012c6: 1101 addi sp,sp,-32 + 30012c8: ce22 sw s0,28(sp) + 30012ca: 1000 addi s0,sp,32 + 30012cc: fea42623 sw a0,-20(s0) + return (acqps <= ADC_SOCSAMPLE_500CLK); + 30012d0: fec42783 lw a5,-20(s0) + 30012d4: 0107b793 sltiu a5,a5,16 + 30012d8: 9f81 uxtb a5 +} + 30012da: 853e mv a0,a5 + 30012dc: 4472 lw s0,28(sp) + 30012de: 6105 addi sp,sp,32 + 30012e0: 8082 ret + +030012e2 : + * @brief Enable AVDD/3 Channal. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_EnableAvddChannel(ADC_RegStruct * const adcx) +{ + 30012e2: 1101 addi sp,sp,-32 + 30012e4: ce06 sw ra,28(sp) + 30012e6: cc22 sw s0,24(sp) + 30012e8: 1000 addi s0,sp,32 + 30012ea: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30012ee: fec42703 lw a4,-20(s0) + 30012f2: 180007b7 lui a5,0x18000 + 30012f6: 00f70b63 beq a4,a5,300130c + 30012fa: 6785 lui a5,0x1 + 30012fc: 86278593 addi a1,a5,-1950 # 862 + 3001300: 030067b7 lui a5,0x3006 + 3001304: 7b478513 addi a0,a5,1972 # 30067b4 + 3001308: 2dad jal ra,3001982 + 300130a: a001 j 300130a + adcx->ADC_AVDD_EN.BIT.cfg_avdd_en = true; + 300130c: fec42703 lw a4,-20(s0) + 3001310: 65872783 lw a5,1624(a4) + 3001314: 0017e793 ori a5,a5,1 + 3001318: 64f72c23 sw a5,1624(a4) +} + 300131c: 0001 nop + 300131e: 40f2 lw ra,28(sp) + 3001320: 4462 lw s0,24(sp) + 3001322: 6105 addi sp,sp,32 + 3001324: 8082 ret + +03001326 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt0(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001326: 7179 addi sp,sp,-48 + 3001328: d606 sw ra,44(sp) + 300132a: d422 sw s0,40(sp) + 300132c: 1800 addi s0,sp,48 + 300132e: fca42e23 sw a0,-36(s0) + 3001332: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001336: fdc42703 lw a4,-36(s0) + 300133a: 180007b7 lui a5,0x18000 + 300133e: 00f70b63 beq a4,a5,3001354 + 3001342: 6785 lui a5,0x1 + 3001344: 87978593 addi a1,a5,-1927 # 879 + 3001348: 030067b7 lui a5,0x3006 + 300134c: 7b478513 addi a0,a5,1972 # 30067b4 + 3001350: 2d0d jal ra,3001982 + 3001352: a001 j 3001352 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 3001354: fd842503 lw a0,-40(s0) + 3001358: 3dc1 jal ra,3001228 + 300135a: 87aa mv a5,a0 + 300135c: 0017c793 xori a5,a5,1 + 3001360: 9f81 uxtb a5 + 3001362: cb91 beqz a5,3001376 + 3001364: 6785 lui a5,0x1 + 3001366: 87a78593 addi a1,a5,-1926 # 87a + 300136a: 030067b7 lui a5,0x3006 + 300136e: 7b478513 addi a0,a5,1972 # 30067b4 + 3001372: 2d01 jal ra,3001982 + 3001374: a01d j 300139a + unsigned int shiftBit = (unsigned int)socx; + 3001376: fd842783 lw a5,-40(s0) + 300137a: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 300137e: fdc42783 lw a5,-36(s0) + 3001382: 2b07a703 lw a4,688(a5) + 3001386: 4685 li a3,1 + 3001388: fec42783 lw a5,-20(s0) + 300138c: 00f697b3 sll a5,a3,a5 + 3001390: 8f5d or a4,a4,a5 + 3001392: fdc42783 lw a5,-36(s0) + 3001396: 2ae7a823 sw a4,688(a5) +} + 300139a: 50b2 lw ra,44(sp) + 300139c: 5422 lw s0,40(sp) + 300139e: 6145 addi sp,sp,48 + 30013a0: 8082 ret + +030013a2 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt1(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30013a2: 7179 addi sp,sp,-48 + 30013a4: d606 sw ra,44(sp) + 30013a6: d422 sw s0,40(sp) + 30013a8: 1800 addi s0,sp,48 + 30013aa: fca42e23 sw a0,-36(s0) + 30013ae: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30013b2: fdc42703 lw a4,-36(s0) + 30013b6: 180007b7 lui a5,0x18000 + 30013ba: 00f70b63 beq a4,a5,30013d0 + 30013be: 6785 lui a5,0x1 + 30013c0: 89478593 addi a1,a5,-1900 # 894 + 30013c4: 030067b7 lui a5,0x3006 + 30013c8: 7b478513 addi a0,a5,1972 # 30067b4 + 30013cc: 2b5d jal ra,3001982 + 30013ce: a001 j 30013ce + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30013d0: fd842503 lw a0,-40(s0) + 30013d4: 3d91 jal ra,3001228 + 30013d6: 87aa mv a5,a0 + 30013d8: 0017c793 xori a5,a5,1 + 30013dc: 9f81 uxtb a5 + 30013de: cb91 beqz a5,30013f2 + 30013e0: 6785 lui a5,0x1 + 30013e2: 89578593 addi a1,a5,-1899 # 895 + 30013e6: 030067b7 lui a5,0x3006 + 30013ea: 7b478513 addi a0,a5,1972 # 30067b4 + 30013ee: 2b51 jal ra,3001982 + 30013f0: a025 j 3001418 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30013f2: fd842783 lw a5,-40(s0) + 30013f6: 07c1 addi a5,a5,16 + 30013f8: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 30013fc: fdc42783 lw a5,-36(s0) + 3001400: 2b07a703 lw a4,688(a5) + 3001404: 4685 li a3,1 + 3001406: fec42783 lw a5,-20(s0) + 300140a: 00f697b3 sll a5,a3,a5 + 300140e: 8f5d or a4,a4,a5 + 3001410: fdc42783 lw a5,-36(s0) + 3001414: 2ae7a823 sw a4,688(a5) +} + 3001418: 50b2 lw ra,44(sp) + 300141a: 5422 lw s0,40(sp) + 300141c: 6145 addi sp,sp,48 + 300141e: 8082 ret + +03001420 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt2(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001420: 7179 addi sp,sp,-48 + 3001422: d606 sw ra,44(sp) + 3001424: d422 sw s0,40(sp) + 3001426: 1800 addi s0,sp,48 + 3001428: fca42e23 sw a0,-36(s0) + 300142c: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001430: fdc42703 lw a4,-36(s0) + 3001434: 180007b7 lui a5,0x18000 + 3001438: 00f70b63 beq a4,a5,300144e + 300143c: 6785 lui a5,0x1 + 300143e: 8af78593 addi a1,a5,-1873 # 8af + 3001442: 030067b7 lui a5,0x3006 + 3001446: 7b478513 addi a0,a5,1972 # 30067b4 + 300144a: 2b25 jal ra,3001982 + 300144c: a001 j 300144c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300144e: fd842503 lw a0,-40(s0) + 3001452: 3bd9 jal ra,3001228 + 3001454: 87aa mv a5,a0 + 3001456: 0017c793 xori a5,a5,1 + 300145a: 9f81 uxtb a5 + 300145c: cb91 beqz a5,3001470 + 300145e: 6785 lui a5,0x1 + 3001460: 8b078593 addi a1,a5,-1872 # 8b0 + 3001464: 030067b7 lui a5,0x3006 + 3001468: 7b478513 addi a0,a5,1972 # 30067b4 + 300146c: 2b19 jal ra,3001982 + 300146e: a01d j 3001494 + unsigned int shiftBit = (unsigned int)socx; + 3001470: fd842783 lw a5,-40(s0) + 3001474: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 3001478: fdc42783 lw a5,-36(s0) + 300147c: 2b47a703 lw a4,692(a5) + 3001480: 4685 li a3,1 + 3001482: fec42783 lw a5,-20(s0) + 3001486: 00f697b3 sll a5,a3,a5 + 300148a: 8f5d or a4,a4,a5 + 300148c: fdc42783 lw a5,-36(s0) + 3001490: 2ae7aa23 sw a4,692(a5) +} + 3001494: 50b2 lw ra,44(sp) + 3001496: 5422 lw s0,40(sp) + 3001498: 6145 addi sp,sp,48 + 300149a: 8082 ret + +0300149c : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt3(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300149c: 7179 addi sp,sp,-48 + 300149e: d606 sw ra,44(sp) + 30014a0: d422 sw s0,40(sp) + 30014a2: 1800 addi s0,sp,48 + 30014a4: fca42e23 sw a0,-36(s0) + 30014a8: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30014ac: fdc42703 lw a4,-36(s0) + 30014b0: 180007b7 lui a5,0x18000 + 30014b4: 00f70b63 beq a4,a5,30014ca + 30014b8: 6785 lui a5,0x1 + 30014ba: 8ca78593 addi a1,a5,-1846 # 8ca + 30014be: 030067b7 lui a5,0x3006 + 30014c2: 7b478513 addi a0,a5,1972 # 30067b4 + 30014c6: 2975 jal ra,3001982 + 30014c8: a001 j 30014c8 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30014ca: fd842503 lw a0,-40(s0) + 30014ce: 3ba9 jal ra,3001228 + 30014d0: 87aa mv a5,a0 + 30014d2: 0017c793 xori a5,a5,1 + 30014d6: 9f81 uxtb a5 + 30014d8: cb91 beqz a5,30014ec + 30014da: 6785 lui a5,0x1 + 30014dc: 8cb78593 addi a1,a5,-1845 # 8cb + 30014e0: 030067b7 lui a5,0x3006 + 30014e4: 7b478513 addi a0,a5,1972 # 30067b4 + 30014e8: 2969 jal ra,3001982 + 30014ea: a025 j 3001512 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30014ec: fd842783 lw a5,-40(s0) + 30014f0: 07c1 addi a5,a5,16 + 30014f2: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 30014f6: fdc42783 lw a5,-36(s0) + 30014fa: 2b47a703 lw a4,692(a5) + 30014fe: 4685 li a3,1 + 3001500: fec42783 lw a5,-20(s0) + 3001504: 00f697b3 sll a5,a3,a5 + 3001508: 8f5d or a4,a4,a5 + 300150a: fdc42783 lw a5,-36(s0) + 300150e: 2ae7aa23 sw a4,692(a5) +} + 3001512: 50b2 lw ra,44(sp) + 3001514: 5422 lw s0,40(sp) + 3001516: 6145 addi sp,sp,48 + 3001518: 8082 ret + +0300151a : + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + 300151a: 1101 addi sp,sp,-32 + 300151c: ce06 sw ra,28(sp) + 300151e: cc22 sw s0,24(sp) + 3001520: 1000 addi s0,sp,32 + 3001522: fea42623 sw a0,-20(s0) + 3001526: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300152a: fec42703 lw a4,-20(s0) + 300152e: 180007b7 lui a5,0x18000 + 3001532: 00f70b63 beq a4,a5,3001548 + 3001536: 6785 lui a5,0x1 + 3001538: 8e578593 addi a1,a5,-1819 # 8e5 + 300153c: 030067b7 lui a5,0x3006 + 3001540: 7b478513 addi a0,a5,1972 # 30067b4 + 3001544: 293d jal ra,3001982 + 3001546: a001 j 3001546 + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + 3001548: fe842503 lw a0,-24(s0) + 300154c: 39e5 jal ra,3001244 + 300154e: 87aa mv a5,a0 + 3001550: 0017c793 xori a5,a5,1 + 3001554: 9f81 uxtb a5 + 3001556: cb91 beqz a5,300156a + 3001558: 6785 lui a5,0x1 + 300155a: 8e678593 addi a1,a5,-1818 # 8e6 + 300155e: 030067b7 lui a5,0x3006 + 3001562: 7b478513 addi a0,a5,1972 # 30067b4 + 3001566: 2931 jal ra,3001982 + 3001568: a839 j 3001586 + adcx->ADC_DATA_FLAG_MASK.reg |= (1U << (unsigned int)intx); + 300156a: fec42783 lw a5,-20(s0) + 300156e: 2c07a703 lw a4,704(a5) + 3001572: 4685 li a3,1 + 3001574: fe842783 lw a5,-24(s0) + 3001578: 00f697b3 sll a5,a3,a5 + 300157c: 8f5d or a4,a4,a5 + 300157e: fec42783 lw a5,-20(s0) + 3001582: 2ce7a023 sw a4,704(a5) +} + 3001586: 40f2 lw ra,28(sp) + 3001588: 4462 lw s0,24(sp) + 300158a: 6105 addi sp,sp,32 + 300158c: 8082 ret + +0300158e : + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_ClearIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + 300158e: 1101 addi sp,sp,-32 + 3001590: ce06 sw ra,28(sp) + 3001592: cc22 sw s0,24(sp) + 3001594: 1000 addi s0,sp,32 + 3001596: fea42623 sw a0,-20(s0) + 300159a: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300159e: fec42703 lw a4,-20(s0) + 30015a2: 180007b7 lui a5,0x18000 + 30015a6: 00f70b63 beq a4,a5,30015bc + 30015aa: 6785 lui a5,0x1 + 30015ac: 8ff78593 addi a1,a5,-1793 # 8ff + 30015b0: 030067b7 lui a5,0x3006 + 30015b4: 7b478513 addi a0,a5,1972 # 30067b4 + 30015b8: 26e9 jal ra,3001982 + 30015ba: a001 j 30015ba + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + 30015bc: fe842503 lw a0,-24(s0) + 30015c0: 3151 jal ra,3001244 + 30015c2: 87aa mv a5,a0 + 30015c4: 0017c793 xori a5,a5,1 + 30015c8: 9f81 uxtb a5 + 30015ca: cb91 beqz a5,30015de + 30015cc: 6785 lui a5,0x1 + 30015ce: 90078593 addi a1,a5,-1792 # 900 + 30015d2: 030067b7 lui a5,0x3006 + 30015d6: 7b478513 addi a0,a5,1972 # 30067b4 + 30015da: 2665 jal ra,3001982 + 30015dc: a811 j 30015f0 + adcx->ADC_INT_DATA_FLAG.reg = (1U << (unsigned int)intx); + 30015de: 4705 li a4,1 + 30015e0: fe842783 lw a5,-24(s0) + 30015e4: 00f71733 sll a4,a4,a5 + 30015e8: fec42783 lw a5,-20(s0) + 30015ec: 2ae7ac23 sw a4,696(a5) +} + 30015f0: 40f2 lw ra,28(sp) + 30015f2: 4462 lw s0,24(sp) + 30015f4: 6105 addi sp,sp,32 + 30015f6: 8082 ret + +030015f8 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval addr, the base address of the SOC registers. + */ +static unsigned int ADC_GetCTRLAddr(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30015f8: 7179 addi sp,sp,-48 + 30015fa: d622 sw s0,44(sp) + 30015fc: 1800 addi s0,sp,48 + 30015fe: fca42e23 sw a0,-36(s0) + 3001602: fcb42c23 sw a1,-40(s0) + unsigned int addr; + addr = (uintptr_t)(void *)&(adcx->ADC_SOC0_CFG); + 3001606: fdc42783 lw a5,-36(s0) + 300160a: 10078793 addi a5,a5,256 + 300160e: fef42623 sw a5,-20(s0) + addr += ((unsigned int)socx * 4); /* Register base address difference 4 */ + 3001612: fd842783 lw a5,-40(s0) + 3001616: 078a slli a5,a5,0x2 + 3001618: fec42703 lw a4,-20(s0) + 300161c: 97ba add a5,a5,a4 + 300161e: fef42623 sw a5,-20(s0) + return addr; + 3001622: fec42783 lw a5,-20(s0) +} + 3001626: 853e mv a0,a5 + 3001628: 5432 lw s0,44(sp) + 300162a: 6145 addi sp,sp,48 + 300162c: 8082 ret + +0300162e : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param input ADC input, @ref ADC_Input. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelectChannel(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_Input input) +{ + 300162e: 7179 addi sp,sp,-48 + 3001630: d606 sw ra,44(sp) + 3001632: d422 sw s0,40(sp) + 3001634: 1800 addi s0,sp,48 + 3001636: fca42e23 sw a0,-36(s0) + 300163a: fcb42c23 sw a1,-40(s0) + 300163e: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001642: fdc42703 lw a4,-36(s0) + 3001646: 180007b7 lui a5,0x18000 + 300164a: 00f70b63 beq a4,a5,3001660 + 300164e: 6785 lui a5,0x1 + 3001650: 91c78593 addi a1,a5,-1764 # 91c + 3001654: 030067b7 lui a5,0x3006 + 3001658: 7b478513 addi a0,a5,1972 # 30067b4 + 300165c: 261d jal ra,3001982 + 300165e: a001 j 300165e + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCSampleChannel(input)); + 3001660: fd842503 lw a0,-40(s0) + 3001664: 36d1 jal ra,3001228 + 3001666: 87aa mv a5,a0 + 3001668: 0017c793 xori a5,a5,1 + 300166c: 9f81 uxtb a5 + 300166e: eb89 bnez a5,3001680 + 3001670: fd442503 lw a0,-44(s0) + 3001674: 3e61 jal ra,300120c + 3001676: 87aa mv a5,a0 + 3001678: 0017c793 xori a5,a5,1 + 300167c: 9f81 uxtb a5 + 300167e: cb91 beqz a5,3001692 + 3001680: 6785 lui a5,0x1 + 3001682: 91d78593 addi a1,a5,-1763 # 91d + 3001686: 030067b7 lui a5,0x3006 + 300168a: 7b478513 addi a0,a5,1972 # 30067b4 + 300168e: 2cd5 jal ra,3001982 + 3001690: a091 j 30016d4 + ADC_SOC0_CFG_REG *soc = NULL; + 3001692: fe042623 sw zero,-20(s0) + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Get the Address After Translation */ + 3001696: fd842583 lw a1,-40(s0) + 300169a: fdc42503 lw a0,-36(s0) + 300169e: 3fa9 jal ra,30015f8 + 30016a0: fea42423 sw a0,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30016a4: fe842783 lw a5,-24(s0) + 30016a8: fef42623 sw a5,-20(s0) + soc->BIT.cfg_soc0_ch_sel = (unsigned int)input; + 30016ac: fd442783 lw a5,-44(s0) + 30016b0: 8bfd andi a5,a5,31 + 30016b2: 0ff7f693 andi a3,a5,255 + 30016b6: fec42703 lw a4,-20(s0) + 30016ba: 431c lw a5,0(a4) + 30016bc: 8afd andi a3,a3,31 + 30016be: 9b81 andi a5,a5,-32 + 30016c0: 8fd5 or a5,a5,a3 + 30016c2: c31c sw a5,0(a4) + if (input == ADC_CH_ADCINA18) { + 30016c4: fd442703 lw a4,-44(s0) + 30016c8: 47c9 li a5,18 + 30016ca: 00f71563 bne a4,a5,30016d4 + DCL_ADC_EnableAvddChannel(adcx); + 30016ce: fdc42503 lw a0,-36(s0) + 30016d2: 3901 jal ra,30012e2 + } +} + 30016d4: 50b2 lw ra,44(sp) + 30016d6: 5422 lw s0,40(sp) + 30016d8: 6145 addi sp,sp,48 + 30016da: 8082 ret + +030016dc : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param trig Source of trigger, @ref ADC_TrigSource. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelcetTrigSource(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_TrigSource trig) +{ + 30016dc: 7179 addi sp,sp,-48 + 30016de: d606 sw ra,44(sp) + 30016e0: d422 sw s0,40(sp) + 30016e2: 1800 addi s0,sp,48 + 30016e4: fca42e23 sw a0,-36(s0) + 30016e8: fcb42c23 sw a1,-40(s0) + 30016ec: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30016f0: fdc42703 lw a4,-36(s0) + 30016f4: 180007b7 lui a5,0x18000 + 30016f8: 00f70b63 beq a4,a5,300170e + 30016fc: 6785 lui a5,0x1 + 30016fe: 93078593 addi a1,a5,-1744 # 930 + 3001702: 030067b7 lui a5,0x3006 + 3001706: 7b478513 addi a0,a5,1972 # 30067b4 + 300170a: 2ca5 jal ra,3001982 + 300170c: a001 j 300170c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCTrigSource(trig)); + 300170e: fd842503 lw a0,-40(s0) + 3001712: 3e19 jal ra,3001228 + 3001714: 87aa mv a5,a0 + 3001716: 0017c793 xori a5,a5,1 + 300171a: 9f81 uxtb a5 + 300171c: eb89 bnez a5,300172e + 300171e: fd442503 lw a0,-44(s0) + 3001722: 3e3d jal ra,3001260 + 3001724: 87aa mv a5,a0 + 3001726: 0017c793 xori a5,a5,1 + 300172a: 9f81 uxtb a5 + 300172c: cb91 beqz a5,3001740 + 300172e: 6785 lui a5,0x1 + 3001730: 93178593 addi a1,a5,-1743 # 931 + 3001734: 030067b7 lui a5,0x3006 + 3001738: 7b478513 addi a0,a5,1972 # 30067b4 + 300173c: 2499 jal ra,3001982 + 300173e: a835 j 300177a + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtaining the Address for Configuring the SOC */ + 3001740: fd842583 lw a1,-40(s0) + 3001744: fdc42503 lw a0,-36(s0) + 3001748: 3d45 jal ra,30015f8 + 300174a: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 300174e: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 3001752: fec42783 lw a5,-20(s0) + 3001756: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_trig_sel = (unsigned int)trig; + 300175a: fd442783 lw a5,-44(s0) + 300175e: 8bfd andi a5,a5,31 + 3001760: 0ff7f693 andi a3,a5,255 + 3001764: fe842703 lw a4,-24(s0) + 3001768: 431c lw a5,0(a4) + 300176a: 8afd andi a3,a3,31 + 300176c: 06a6 slli a3,a3,0x9 + 300176e: 7671 lui a2,0xffffc + 3001770: 1ff60613 addi a2,a2,511 # ffffc1ff + 3001774: 8ff1 and a5,a5,a2 + 3001776: 8fd5 or a5,a5,a3 + 3001778: c31c sw a5,0(a4) +} + 300177a: 50b2 lw ra,44(sp) + 300177c: 5422 lw s0,40(sp) + 300177e: 6145 addi sp,sp,48 + 3001780: 8082 ret + +03001782 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param acqps Capacitor charging time. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetAcqps(ADC_RegStruct * const adcx, ADC_SOCNumber socx, unsigned int acqps) +{ + 3001782: 7179 addi sp,sp,-48 + 3001784: d606 sw ra,44(sp) + 3001786: d422 sw s0,40(sp) + 3001788: 1800 addi s0,sp,48 + 300178a: fca42e23 sw a0,-36(s0) + 300178e: fcb42c23 sw a1,-40(s0) + 3001792: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001796: fdc42703 lw a4,-36(s0) + 300179a: 180007b7 lui a5,0x18000 + 300179e: 00f70b63 beq a4,a5,30017b4 + 30017a2: 6785 lui a5,0x1 + 30017a4: 94178593 addi a1,a5,-1727 # 941 + 30017a8: 030067b7 lui a5,0x3006 + 30017ac: 7b478513 addi a0,a5,1972 # 30067b4 + 30017b0: 2ac9 jal ra,3001982 + 30017b2: a001 j 30017b2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30017b4: fd842503 lw a0,-40(s0) + 30017b8: 3c85 jal ra,3001228 + 30017ba: 87aa mv a5,a0 + 30017bc: 0017c793 xori a5,a5,1 + 30017c0: 9f81 uxtb a5 + 30017c2: cb91 beqz a5,30017d6 + 30017c4: 6785 lui a5,0x1 + 30017c6: 94278593 addi a1,a5,-1726 # 942 + 30017ca: 030067b7 lui a5,0x3006 + 30017ce: 7b478513 addi a0,a5,1972 # 30067b4 + 30017d2: 2a45 jal ra,3001982 + 30017d4: a891 j 3001828 + ADC_PARAM_CHECK_NO_RET(acqps <= 15); /* The value of acqps ranges from 0 to 15 */ + 30017d6: fd442703 lw a4,-44(s0) + 30017da: 47bd li a5,15 + 30017dc: 00e7fb63 bgeu a5,a4,30017f2 + 30017e0: 6785 lui a5,0x1 + 30017e2: 94378593 addi a1,a5,-1725 # 943 + 30017e6: 030067b7 lui a5,0x3006 + 30017ea: 7b478513 addi a0,a5,1972 # 30067b4 + 30017ee: 2a51 jal ra,3001982 + 30017f0: a825 j 3001828 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); + 30017f2: fd842583 lw a1,-40(s0) + 30017f6: fdc42503 lw a0,-36(s0) + 30017fa: 3bfd jal ra,30015f8 + 30017fc: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 3001800: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 3001804: fec42783 lw a5,-20(s0) + 3001808: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_samptime_sel = acqps; + 300180c: fd442783 lw a5,-44(s0) + 3001810: 8bbd andi a5,a5,15 + 3001812: 0ff7f693 andi a3,a5,255 + 3001816: fe842703 lw a4,-24(s0) + 300181a: 431c lw a5,0(a4) + 300181c: 8abd andi a3,a3,15 + 300181e: 0696 slli a3,a3,0x5 + 3001820: e1f7f793 andi a5,a5,-481 + 3001824: 8fd5 or a5,a5,a3 + 3001826: c31c sw a5,0(a4) +} + 3001828: 50b2 lw ra,44(sp) + 300182a: 5422 lw s0,40(sp) + 300182c: 6145 addi sp,sp,48 + 300182e: 8082 ret + +03001830 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SOCxSoftTrigger(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001830: 1101 addi sp,sp,-32 + 3001832: ce06 sw ra,28(sp) + 3001834: cc22 sw s0,24(sp) + 3001836: 1000 addi s0,sp,32 + 3001838: fea42623 sw a0,-20(s0) + 300183c: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001840: fec42703 lw a4,-20(s0) + 3001844: 180007b7 lui a5,0x18000 + 3001848: 00f70b63 beq a4,a5,300185e + 300184c: 6785 lui a5,0x1 + 300184e: 95278593 addi a1,a5,-1710 # 952 + 3001852: 030067b7 lui a5,0x3006 + 3001856: 7b478513 addi a0,a5,1972 # 30067b4 + 300185a: 2225 jal ra,3001982 + 300185c: a001 j 300185c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300185e: fe842503 lw a0,-24(s0) + 3001862: 32d9 jal ra,3001228 + 3001864: 87aa mv a5,a0 + 3001866: 0017c793 xori a5,a5,1 + 300186a: 9f81 uxtb a5 + 300186c: cb91 beqz a5,3001880 + 300186e: 6785 lui a5,0x1 + 3001870: 95378593 addi a1,a5,-1709 # 953 + 3001874: 030067b7 lui a5,0x3006 + 3001878: 7b478513 addi a0,a5,1972 # 30067b4 + 300187c: 2219 jal ra,3001982 + 300187e: a839 j 300189c + adcx->ADC_SOFT_TRIG.reg |= (1U << (unsigned int)socx); + 3001880: fec42783 lw a5,-20(s0) + 3001884: 1607a703 lw a4,352(a5) + 3001888: 4685 li a3,1 + 300188a: fe842783 lw a5,-24(s0) + 300188e: 00f697b3 sll a5,a3,a5 + 3001892: 8f5d or a4,a4,a5 + 3001894: fec42783 lw a5,-20(s0) + 3001898: 16e7a023 sw a4,352(a5) +} + 300189c: 40f2 lw ra,28(sp) + 300189e: 4462 lw s0,24(sp) + 30018a0: 6105 addi sp,sp,32 + 30018a2: 8082 ret + +030018a4 : + * @param adcx ADC register base address. + * @param priorityMode Mode of SOC priority, @ref ADC_PriorityMode. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetPriority(ADC_RegStruct * const adcx, ADC_PriorityMode priorityMode) +{ + 30018a4: 1101 addi sp,sp,-32 + 30018a6: ce06 sw ra,28(sp) + 30018a8: cc22 sw s0,24(sp) + 30018aa: 1000 addi s0,sp,32 + 30018ac: fea42623 sw a0,-20(s0) + 30018b0: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30018b4: fec42703 lw a4,-20(s0) + 30018b8: 180007b7 lui a5,0x18000 + 30018bc: 00f70b63 beq a4,a5,30018d2 + 30018c0: 6785 lui a5,0x1 + 30018c2: 96c78593 addi a1,a5,-1684 # 96c + 30018c6: 030067b7 lui a5,0x3006 + 30018ca: 7b478513 addi a0,a5,1972 # 30067b4 + 30018ce: 2855 jal ra,3001982 + 30018d0: a001 j 30018d0 + ADC_PARAM_CHECK_NO_RET(IsADCPriorityMode(priorityMode)); + 30018d2: fe842503 lw a0,-24(s0) + 30018d6: 3ac9 jal ra,30012a8 + 30018d8: 87aa mv a5,a0 + 30018da: 0017c793 xori a5,a5,1 + 30018de: 9f81 uxtb a5 + 30018e0: cb91 beqz a5,30018f4 + 30018e2: 6785 lui a5,0x1 + 30018e4: 96d78593 addi a1,a5,-1683 # 96d + 30018e8: 030067b7 lui a5,0x3006 + 30018ec: 7b478513 addi a0,a5,1972 # 30067b4 + 30018f0: 2849 jal ra,3001982 + 30018f2: a039 j 3001900 + adcx->ADC_ARBT0.reg = priorityMode; + 30018f4: fec42783 lw a5,-20(s0) + 30018f8: fe842703 lw a4,-24(s0) + 30018fc: 20e7a023 sw a4,512(a5) +} + 3001900: 40f2 lw ra,28(sp) + 3001902: 4462 lw s0,24(sp) + 3001904: 6105 addi sp,sp,32 + 3001906: 8082 ret + +03001908 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval unsigned int, result. + */ +static inline unsigned int DCL_ADC_ReadSOCxResult(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001908: 7179 addi sp,sp,-48 + 300190a: d606 sw ra,44(sp) + 300190c: d422 sw s0,40(sp) + 300190e: 1800 addi s0,sp,48 + 3001910: fca42e23 sw a0,-36(s0) + 3001914: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001918: fdc42703 lw a4,-36(s0) + 300191c: 180007b7 lui a5,0x18000 + 3001920: 00f70b63 beq a4,a5,3001936 + 3001924: 6785 lui a5,0x1 + 3001926: a8778593 addi a1,a5,-1401 # a87 + 300192a: 030067b7 lui a5,0x3006 + 300192e: 7b478513 addi a0,a5,1972 # 30067b4 + 3001932: 2881 jal ra,3001982 + 3001934: a001 j 3001934 + ADC_ASSERT_PARAM(IsADCSOCx(socx)); + 3001936: fd842503 lw a0,-40(s0) + 300193a: 30fd jal ra,3001228 + 300193c: 87aa mv a5,a0 + 300193e: 0017c793 xori a5,a5,1 + 3001942: 9f81 uxtb a5 + 3001944: cb91 beqz a5,3001958 + 3001946: 6785 lui a5,0x1 + 3001948: a8878593 addi a1,a5,-1400 # a88 + 300194c: 030067b7 lui a5,0x3006 + 3001950: 7b478513 addi a0,a5,1972 # 30067b4 + 3001954: 203d jal ra,3001982 + 3001956: a001 j 3001956 + ADC_RESULT0_REG *result; + uintptr_t addr = (uintptr_t)(void *)adcx; + 3001958: fdc42783 lw a5,-36(s0) + 300195c: fef42623 sw a5,-20(s0) + /* The address interval of the result register is 4 */ + result = (ADC_RESULT0_REG *)(void *)(addr + 4 * (unsigned int)socx); + 3001960: fd842783 lw a5,-40(s0) + 3001964: 00279713 slli a4,a5,0x2 + 3001968: fec42783 lw a5,-20(s0) + 300196c: 97ba add a5,a5,a4 + 300196e: fef42423 sw a5,-24(s0) + return result->reg; + 3001972: fe842783 lw a5,-24(s0) + 3001976: 439c lw a5,0(a5) +} + 3001978: 853e mv a0,a5 + 300197a: 50b2 lw ra,44(sp) + 300197c: 5422 lw s0,40(sp) + 300197e: 6145 addi sp,sp,48 + 3001980: 8082 ret + +03001982 : + 3001982: 0650006f j 30021e6 + +03001986 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001986: 7179 addi sp,sp,-48 + 3001988: d606 sw ra,44(sp) + 300198a: d422 sw s0,40(sp) + 300198c: 1800 addi s0,sp,48 + 300198e: fca42e23 sw a0,-36(s0) + 3001992: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001996: fdc42703 lw a4,-36(s0) + 300199a: 180007b7 lui a5,0x18000 + 300199e: 00f70b63 beq a4,a5,30019b4 + 30019a2: 6785 lui a5,0x1 + 30019a4: b4678593 addi a1,a5,-1210 # b46 + 30019a8: 030067b7 lui a5,0x3006 + 30019ac: 7b478513 addi a0,a5,1972 # 30067b4 + 30019b0: 3fc9 jal ra,3001982 + 30019b2: a001 j 30019b2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30019b4: fd842503 lw a0,-40(s0) + 30019b8: 3885 jal ra,3001228 + 30019ba: 87aa mv a5,a0 + 30019bc: 0017c793 xori a5,a5,1 + 30019c0: 9f81 uxtb a5 + 30019c2: cb91 beqz a5,30019d6 + 30019c4: 6785 lui a5,0x1 + 30019c6: b4778593 addi a1,a5,-1209 # b47 + 30019ca: 030067b7 lui a5,0x3006 + 30019ce: 7b478513 addi a0,a5,1972 # 30067b4 + 30019d2: 3f45 jal ra,3001982 + 30019d4: a025 j 30019fc + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 30019d6: fd842583 lw a1,-40(s0) + 30019da: fdc42503 lw a0,-36(s0) + 30019de: 3929 jal ra,30015f8 + 30019e0: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 30019e4: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30019e8: fec42783 lw a5,-20(s0) + 30019ec: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_ENABLE; + 30019f0: fe842703 lw a4,-24(s0) + 30019f4: 431c lw a5,0(a4) + 30019f6: 6691 lui a3,0x4 + 30019f8: 8fd5 or a5,a5,a3 + 30019fa: c31c sw a5,0(a4) +} + 30019fc: 50b2 lw ra,44(sp) + 30019fe: 5422 lw s0,40(sp) + 3001a00: 6145 addi sp,sp,48 + 3001a02: 8082 ret + +03001a04 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_DisableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001a04: 7179 addi sp,sp,-48 + 3001a06: d606 sw ra,44(sp) + 3001a08: d422 sw s0,40(sp) + 3001a0a: 1800 addi s0,sp,48 + 3001a0c: fca42e23 sw a0,-36(s0) + 3001a10: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001a14: fdc42703 lw a4,-36(s0) + 3001a18: 180007b7 lui a5,0x18000 + 3001a1c: 00f70b63 beq a4,a5,3001a32 + 3001a20: 6785 lui a5,0x1 + 3001a22: b5678593 addi a1,a5,-1194 # b56 + 3001a26: 030067b7 lui a5,0x3006 + 3001a2a: 7b478513 addi a0,a5,1972 # 30067b4 + 3001a2e: 3f91 jal ra,3001982 + 3001a30: a001 j 3001a30 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 3001a32: fd842503 lw a0,-40(s0) + 3001a36: ff2ff0ef jal ra,3001228 + 3001a3a: 87aa mv a5,a0 + 3001a3c: 0017c793 xori a5,a5,1 + 3001a40: 9f81 uxtb a5 + 3001a42: cb91 beqz a5,3001a56 + 3001a44: 6785 lui a5,0x1 + 3001a46: b5778593 addi a1,a5,-1193 # b57 + 3001a4a: 030067b7 lui a5,0x3006 + 3001a4e: 7b478513 addi a0,a5,1972 # 30067b4 + 3001a52: 3f05 jal ra,3001982 + 3001a54: a02d j 3001a7e + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 3001a56: fd842583 lw a1,-40(s0) + 3001a5a: fdc42503 lw a0,-36(s0) + 3001a5e: 3e69 jal ra,30015f8 + 3001a60: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 3001a64: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 3001a68: fec42783 lw a5,-20(s0) + 3001a6c: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_DISABLE; + 3001a70: fe842703 lw a4,-24(s0) + 3001a74: 431c lw a5,0(a4) + 3001a76: 76f1 lui a3,0xffffc + 3001a78: 16fd addi a3,a3,-1 # ffffbfff + 3001a7a: 8ff5 and a5,a5,a3 + 3001a7c: c31c sw a5,0(a4) +} + 3001a7e: 50b2 lw ra,44(sp) + 3001a80: 5422 lw s0,40(sp) + 3001a82: 6145 addi sp,sp,48 + 3001a84: 8082 ret + +03001a86 : + * triggered at least 100 us later. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_Init(ADC_Handle *adcHandle) +{ + 3001a86: 1101 addi sp,sp,-32 + 3001a88: ce06 sw ra,28(sp) + 3001a8a: cc22 sw s0,24(sp) + 3001a8c: 1000 addi s0,sp,32 + 3001a8e: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001a92: fec42783 lw a5,-20(s0) + 3001a96: eb89 bnez a5,3001aa8 + 3001a98: 02c00593 li a1,44 + 3001a9c: 030067b7 lui a5,0x3006 + 3001aa0: 7d078513 addi a0,a5,2000 # 30067d0 + 3001aa4: 3df9 jal ra,3001982 + 3001aa6: a001 j 3001aa6 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001aa8: fec42783 lw a5,-20(s0) + 3001aac: 4398 lw a4,0(a5) + 3001aae: 180007b7 lui a5,0x18000 + 3001ab2: 00f70a63 beq a4,a5,3001ac6 + 3001ab6: 02d00593 li a1,45 + 3001aba: 030067b7 lui a5,0x3006 + 3001abe: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ac2: 35c1 jal ra,3001982 + 3001ac4: a001 j 3001ac4 + ADC_PARAM_CHECK_WITH_RET(IsADCPriorityMode(adcHandle->socPriority) == true, BASE_STATUS_ERROR); + 3001ac6: fec42783 lw a5,-20(s0) + 3001aca: 43dc lw a5,4(a5) + 3001acc: 853e mv a0,a5 + 3001ace: fdaff0ef jal ra,30012a8 + 3001ad2: 87aa mv a5,a0 + 3001ad4: 0017c793 xori a5,a5,1 + 3001ad8: 9f81 uxtb a5 + 3001ada: cb99 beqz a5,3001af0 + 3001adc: 02e00593 li a1,46 + 3001ae0: 030067b7 lui a5,0x3006 + 3001ae4: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ae8: 6fe000ef jal ra,30021e6 + 3001aec: 4785 li a5,1 + 3001aee: a091 j 3001b32 + DCL_ADC_SOCxSetPriority(adcHandle->baseAddress, adcHandle->socPriority); + 3001af0: fec42783 lw a5,-20(s0) + 3001af4: 4398 lw a4,0(a5) + 3001af6: fec42783 lw a5,-20(s0) + 3001afa: 43dc lw a5,4(a5) + 3001afc: 85be mv a1,a5 + 3001afe: 853a mv a0,a4 + 3001b00: 3355 jal ra,30018a4 + adcHandle->baseAddress->ADC_ANA_CTRL0.BIT.cfg_sar_samp_cap_sel = 0x4; /* Set the Number of Sampling Capacitors */ + 3001b02: fec42783 lw a5,-20(s0) + 3001b06: 4398 lw a4,0(a5) + 3001b08: 65472783 lw a5,1620(a4) + 3001b0c: 100006b7 lui a3,0x10000 + 3001b10: 16fd addi a3,a3,-1 # fffffff + 3001b12: 8efd and a3,a3,a5 + 3001b14: 400007b7 lui a5,0x40000 + 3001b18: 8fd5 or a5,a5,a3 + 3001b1a: 64f72a23 sw a5,1620(a4) + adcHandle->baseAddress->ADC_EN.reg = BASE_CFG_ENABLE; /* Enable ADC Controller */ + 3001b1e: fec42783 lw a5,-20(s0) + 3001b22: 439c lw a5,0(a5) + 3001b24: 4705 li a4,1 + 3001b26: 30e7a023 sw a4,768(a5) # 40000300 + BASE_FUNC_DelayUs(100); /* Wait for 100 us until the ADC controller is stable */ + 3001b2a: 06400513 li a0,100 + 3001b2e: 25cd jal ra,3002210 + return BASE_STATUS_OK; + 3001b30: 4781 li a5,0 +} + 3001b32: 853e mv a0,a5 + 3001b34: 40f2 lw ra,28(sp) + 3001b36: 4462 lw s0,24(sp) + 3001b38: 6105 addi sp,sp,32 + 3001b3a: 8082 ret + +03001b3c : + * @param soc ID of SOC(start of conversion), managing the specific sample inputs. + * @param socParam Param struct of SOC. This is related to the peripheral circuit design, @ref SOC_Param. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_ConfigureSoc(ADC_Handle *adcHandle, ADC_SOCNumber soc, SOC_Param *socParam) +{ + 3001b3c: 1101 addi sp,sp,-32 + 3001b3e: ce06 sw ra,28(sp) + 3001b40: cc22 sw s0,24(sp) + 3001b42: 1000 addi s0,sp,32 + 3001b44: fea42623 sw a0,-20(s0) + 3001b48: feb42423 sw a1,-24(s0) + 3001b4c: fec42223 sw a2,-28(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001b50: fec42783 lw a5,-20(s0) + 3001b54: eb89 bnez a5,3001b66 + 3001b56: 04c00593 li a1,76 + 3001b5a: 030067b7 lui a5,0x3006 + 3001b5e: 7d078513 addi a0,a5,2000 # 30067d0 + 3001b62: 2551 jal ra,30021e6 + 3001b64: a001 j 3001b64 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001b66: fec42783 lw a5,-20(s0) + 3001b6a: 4398 lw a4,0(a5) + 3001b6c: 180007b7 lui a5,0x18000 + 3001b70: 00f70a63 beq a4,a5,3001b84 + 3001b74: 04d00593 li a1,77 + 3001b78: 030067b7 lui a5,0x3006 + 3001b7c: 7d078513 addi a0,a5,2000 # 30067d0 + 3001b80: 259d jal ra,30021e6 + 3001b82: a001 j 3001b82 + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001b84: fe842503 lw a0,-24(s0) + 3001b88: ea0ff0ef jal ra,3001228 + 3001b8c: 87aa mv a5,a0 + 3001b8e: 0017c793 xori a5,a5,1 + 3001b92: 9f81 uxtb a5 + 3001b94: cb91 beqz a5,3001ba8 + 3001b96: 04e00593 li a1,78 + 3001b9a: 030067b7 lui a5,0x3006 + 3001b9e: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ba2: 2591 jal ra,30021e6 + 3001ba4: 4785 li a5,1 + 3001ba6: aa3d j 3001ce4 + ADC_ASSERT_PARAM(socParam != NULL); + 3001ba8: fe442783 lw a5,-28(s0) + 3001bac: eb89 bnez a5,3001bbe + 3001bae: 04f00593 li a1,79 + 3001bb2: 030067b7 lui a5,0x3006 + 3001bb6: 7d078513 addi a0,a5,2000 # 30067d0 + 3001bba: 2535 jal ra,30021e6 + 3001bbc: a001 j 3001bbc + ADC_PARAM_CHECK_WITH_RET(IsADCSampleChannel(socParam->adcInput) == true, BASE_STATUS_ERROR); + 3001bbe: fe442783 lw a5,-28(s0) + 3001bc2: 439c lw a5,0(a5) + 3001bc4: 853e mv a0,a5 + 3001bc6: e46ff0ef jal ra,300120c + 3001bca: 87aa mv a5,a0 + 3001bcc: 0017c793 xori a5,a5,1 + 3001bd0: 9f81 uxtb a5 + 3001bd2: cb91 beqz a5,3001be6 + 3001bd4: 05000593 li a1,80 + 3001bd8: 030067b7 lui a5,0x3006 + 3001bdc: 7d078513 addi a0,a5,2000 # 30067d0 + 3001be0: 2519 jal ra,30021e6 + 3001be2: 4785 li a5,1 + 3001be4: a201 j 3001ce4 + ADC_PARAM_CHECK_WITH_RET(IsADCTotalTime(socParam->sampleTotalTime) == true, BASE_STATUS_ERROR); + 3001be6: fe442783 lw a5,-28(s0) + 3001bea: 43dc lw a5,4(a5) + 3001bec: 853e mv a0,a5 + 3001bee: ed8ff0ef jal ra,30012c6 + 3001bf2: 87aa mv a5,a0 + 3001bf4: 0017c793 xori a5,a5,1 + 3001bf8: 9f81 uxtb a5 + 3001bfa: cb91 beqz a5,3001c0e + 3001bfc: 05100593 li a1,81 + 3001c00: 030067b7 lui a5,0x3006 + 3001c04: 7d078513 addi a0,a5,2000 # 30067d0 + 3001c08: 2bf9 jal ra,30021e6 + 3001c0a: 4785 li a5,1 + 3001c0c: a8e1 j 3001ce4 + ADC_PARAM_CHECK_WITH_RET(IsADCTrigSource(socParam->trigSource) == true, BASE_STATUS_ERROR); + 3001c0e: fe442783 lw a5,-28(s0) + 3001c12: 479c lw a5,8(a5) + 3001c14: 853e mv a0,a5 + 3001c16: e4aff0ef jal ra,3001260 + 3001c1a: 87aa mv a5,a0 + 3001c1c: 0017c793 xori a5,a5,1 + 3001c20: 9f81 uxtb a5 + 3001c22: cb91 beqz a5,3001c36 + 3001c24: 05200593 li a1,82 + 3001c28: 030067b7 lui a5,0x3006 + 3001c2c: 7d078513 addi a0,a5,2000 # 30067d0 + 3001c30: 2b5d jal ra,30021e6 + 3001c32: 4785 li a5,1 + 3001c34: a845 j 3001ce4 + ADC_PARAM_CHECK_WITH_RET(IsADCFinishMode(socParam->finishMode) == true, BASE_STATUS_ERROR); + 3001c36: fe442783 lw a5,-28(s0) + 3001c3a: 4b9c lw a5,16(a5) + 3001c3c: 853e mv a0,a5 + 3001c3e: e3eff0ef jal ra,300127c + 3001c42: 87aa mv a5,a0 + 3001c44: 0017c793 xori a5,a5,1 + 3001c48: 9f81 uxtb a5 + 3001c4a: cb91 beqz a5,3001c5e + 3001c4c: 05300593 li a1,83 + 3001c50: 030067b7 lui a5,0x3006 + 3001c54: 7d078513 addi a0,a5,2000 # 30067d0 + 3001c58: 2379 jal ra,30021e6 + 3001c5a: 4785 li a5,1 + 3001c5c: a061 j 3001ce4 + DCL_ADC_SOCxSelectChannel(adcHandle->baseAddress, soc, socParam->adcInput); /* Set channel */ + 3001c5e: fec42783 lw a5,-20(s0) + 3001c62: 4398 lw a4,0(a5) + 3001c64: fe442783 lw a5,-28(s0) + 3001c68: 439c lw a5,0(a5) + 3001c6a: 863e mv a2,a5 + 3001c6c: fe842583 lw a1,-24(s0) + 3001c70: 853a mv a0,a4 + 3001c72: 3a75 jal ra,300162e + DCL_ADC_SOCxSetAcqps(adcHandle->baseAddress, soc, socParam->sampleTotalTime); /* Set sampling time */ + 3001c74: fec42783 lw a5,-20(s0) + 3001c78: 4398 lw a4,0(a5) + 3001c7a: fe442783 lw a5,-28(s0) + 3001c7e: 43dc lw a5,4(a5) + 3001c80: 863e mv a2,a5 + 3001c82: fe842583 lw a1,-24(s0) + 3001c86: 853a mv a0,a4 + 3001c88: 3ced jal ra,3001782 + DCL_ADC_SOCxSelcetTrigSource(adcHandle->baseAddress, soc, socParam->trigSource); /* Set trigger source */ + 3001c8a: fec42783 lw a5,-20(s0) + 3001c8e: 4398 lw a4,0(a5) + 3001c90: fe442783 lw a5,-28(s0) + 3001c94: 479c lw a5,8(a5) + 3001c96: 863e mv a2,a5 + 3001c98: fe842583 lw a1,-24(s0) + 3001c9c: 853a mv a0,a4 + 3001c9e: 3c3d jal ra,30016dc + if (socParam->continueMode == true) { /* Continuous Mode Judgment */ + 3001ca0: fe442783 lw a5,-28(s0) + 3001ca4: 27dc lbu a5,12(a5) + 3001ca6: cb89 beqz a5,3001cb8 + DCL_ADC_EnableSOCxContinue(adcHandle->baseAddress, soc); + 3001ca8: fec42783 lw a5,-20(s0) + 3001cac: 439c lw a5,0(a5) + 3001cae: fe842583 lw a1,-24(s0) + 3001cb2: 853e mv a0,a5 + 3001cb4: 39c9 jal ra,3001986 + 3001cb6: a801 j 3001cc6 + } else { + DCL_ADC_DisableSOCxContinue(adcHandle->baseAddress, soc); + 3001cb8: fec42783 lw a5,-20(s0) + 3001cbc: 439c lw a5,0(a5) + 3001cbe: fe842583 lw a1,-24(s0) + 3001cc2: 853e mv a0,a5 + 3001cc4: 3381 jal ra,3001a04 + } + adcHandle->ADC_SOCxParam[soc].finishMode = socParam->finishMode; + 3001cc6: fe442783 lw a5,-28(s0) + 3001cca: 4b9c lw a5,16(a5) + 3001ccc: 01079713 slli a4,a5,0x10 + 3001cd0: 8341 srli a4,a4,0x10 + 3001cd2: fec42683 lw a3,-20(s0) + 3001cd6: fe842783 lw a5,-24(s0) + 3001cda: 07a1 addi a5,a5,8 + 3001cdc: 0786 slli a5,a5,0x1 + 3001cde: 97b6 add a5,a5,a3 + 3001ce0: a3da sh a4,4(a5) + return BASE_STATUS_OK; + 3001ce2: 4781 li a5,0 +} + 3001ce4: 853e mv a0,a5 + 3001ce6: 40f2 lw ra,28(sp) + 3001ce8: 4462 lw s0,24(sp) + 3001cea: 6105 addi sp,sp,32 + 3001cec: 8082 ret + +03001cee : + * interrupt is reported. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_StartIt(ADC_Handle *adcHandle) +{ + 3001cee: 7179 addi sp,sp,-48 + 3001cf0: d606 sw ra,44(sp) + 3001cf2: d422 sw s0,40(sp) + 3001cf4: 1800 addi s0,sp,48 + 3001cf6: fca42e23 sw a0,-36(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001cfa: fdc42783 lw a5,-36(s0) + 3001cfe: eb89 bnez a5,3001d10 + 3001d00: 0af00593 li a1,175 + 3001d04: 030067b7 lui a5,0x3006 + 3001d08: 7d078513 addi a0,a5,2000 # 30067d0 + 3001d0c: 29e9 jal ra,30021e6 + 3001d0e: a001 j 3001d0e + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001d10: fdc42783 lw a5,-36(s0) + 3001d14: 4398 lw a4,0(a5) + 3001d16: 180007b7 lui a5,0x18000 + 3001d1a: 00f70a63 beq a4,a5,3001d2e + 3001d1e: 0b000593 li a1,176 + 3001d22: 030067b7 lui a5,0x3006 + 3001d26: 7d078513 addi a0,a5,2000 # 30067d0 + 3001d2a: 2975 jal ra,30021e6 + 3001d2c: a001 j 3001d2c + unsigned int intVal = 0; + 3001d2e: fe042423 sw zero,-24(s0) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001d32: fe042623 sw zero,-20(s0) + 3001d36: a859 j 3001dcc + intVal = adcHandle->ADC_SOCxParam[i].finishMode; + 3001d38: fdc42703 lw a4,-36(s0) + 3001d3c: fec42783 lw a5,-20(s0) + 3001d40: 07a1 addi a5,a5,8 + 3001d42: 0786 slli a5,a5,0x1 + 3001d44: 97ba add a5,a5,a4 + 3001d46: 23de lhu a5,4(a5) + 3001d48: fef42423 sw a5,-24(s0) + switch (intVal) { + 3001d4c: fe842783 lw a5,-24(s0) + 3001d50: 4711 li a4,4 + 3001d52: 02e78a63 beq a5,a4,3001d86 + 3001d56: 4711 li a4,4 + 3001d58: 00f76663 bltu a4,a5,3001d64 + 3001d5c: 470d li a4,3 + 3001d5e: 00e78a63 beq a5,a4,3001d72 + break; + case ADC_SOCFINISH_INT3: + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + break; + default: + break; + 3001d62: a085 j 3001dc2 + switch (intVal) { + 3001d64: 4715 li a4,5 + 3001d66: 02e78a63 beq a5,a4,3001d9a + 3001d6a: 4719 li a4,6 + 3001d6c: 04e78163 beq a5,a4,3001dae + break; + 3001d70: a889 j 3001dc2 + DCL_ADC_SetSOCxBlindInt0(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 0 */ + 3001d72: fdc42783 lw a5,-36(s0) + 3001d76: 439c lw a5,0(a5) + 3001d78: fec42703 lw a4,-20(s0) + 3001d7c: 85ba mv a1,a4 + 3001d7e: 853e mv a0,a5 + 3001d80: da6ff0ef jal ra,3001326 + break; + 3001d84: a83d j 3001dc2 + DCL_ADC_SetSOCxBlindInt1(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 1 */ + 3001d86: fdc42783 lw a5,-36(s0) + 3001d8a: 439c lw a5,0(a5) + 3001d8c: fec42703 lw a4,-20(s0) + 3001d90: 85ba mv a1,a4 + 3001d92: 853e mv a0,a5 + 3001d94: e0eff0ef jal ra,30013a2 + break; + 3001d98: a02d j 3001dc2 + DCL_ADC_SetSOCxBlindInt2(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 2 */ + 3001d9a: fdc42783 lw a5,-36(s0) + 3001d9e: 439c lw a5,0(a5) + 3001da0: fec42703 lw a4,-20(s0) + 3001da4: 85ba mv a1,a4 + 3001da6: 853e mv a0,a5 + 3001da8: e78ff0ef jal ra,3001420 + break; + 3001dac: a819 j 3001dc2 + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + 3001dae: fdc42783 lw a5,-36(s0) + 3001db2: 439c lw a5,0(a5) + 3001db4: fec42703 lw a4,-20(s0) + 3001db8: 85ba mv a1,a4 + 3001dba: 853e mv a0,a5 + 3001dbc: ee0ff0ef jal ra,300149c + break; + 3001dc0: 0001 nop + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001dc2: fec42783 lw a5,-20(s0) + 3001dc6: 0785 addi a5,a5,1 + 3001dc8: fef42623 sw a5,-20(s0) + 3001dcc: fec42703 lw a4,-20(s0) + 3001dd0: 47bd li a5,15 + 3001dd2: f6e7d3e3 bge a5,a4,3001d38 + } + } /* Enable ADC Interrupt */ + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER0); + 3001dd6: fdc42783 lw a5,-36(s0) + 3001dda: 439c lw a5,0(a5) + 3001ddc: 4581 li a1,0 + 3001dde: 853e mv a0,a5 + 3001de0: f3aff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER1); + 3001de4: fdc42783 lw a5,-36(s0) + 3001de8: 439c lw a5,0(a5) + 3001dea: 4585 li a1,1 + 3001dec: 853e mv a0,a5 + 3001dee: f2cff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + 3001df2: fdc42783 lw a5,-36(s0) + 3001df6: 439c lw a5,0(a5) + 3001df8: 4589 li a1,2 + 3001dfa: 853e mv a0,a5 + 3001dfc: f1eff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER3); + 3001e00: fdc42783 lw a5,-36(s0) + 3001e04: 439c lw a5,0(a5) + 3001e06: 458d li a1,3 + 3001e08: 853e mv a0,a5 + 3001e0a: f10ff0ef jal ra,300151a + return BASE_STATUS_OK; + 3001e0e: 4781 li a5,0 +} + 3001e10: 853e mv a0,a5 + 3001e12: 50b2 lw ra,44(sp) + 3001e14: 5422 lw s0,40(sp) + 3001e16: 6145 addi sp,sp,48 + 3001e18: 8082 ret + +03001e1a : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_SoftTrigSample(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001e1a: 1101 addi sp,sp,-32 + 3001e1c: ce06 sw ra,28(sp) + 3001e1e: cc22 sw s0,24(sp) + 3001e20: 1000 addi s0,sp,32 + 3001e22: fea42623 sw a0,-20(s0) + 3001e26: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001e2a: fec42783 lw a5,-20(s0) + 3001e2e: eb89 bnez a5,3001e40 + 3001e30: 0e500593 li a1,229 + 3001e34: 030067b7 lui a5,0x3006 + 3001e38: 7d078513 addi a0,a5,2000 # 30067d0 + 3001e3c: 266d jal ra,30021e6 + 3001e3e: a001 j 3001e3e + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001e40: fec42783 lw a5,-20(s0) + 3001e44: 4398 lw a4,0(a5) + 3001e46: 180007b7 lui a5,0x18000 + 3001e4a: 00f70a63 beq a4,a5,3001e5e + 3001e4e: 0e600593 li a1,230 + 3001e52: 030067b7 lui a5,0x3006 + 3001e56: 7d078513 addi a0,a5,2000 # 30067d0 + 3001e5a: 2671 jal ra,30021e6 + 3001e5c: a001 j 3001e5c + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001e5e: fe842503 lw a0,-24(s0) + 3001e62: bc6ff0ef jal ra,3001228 + 3001e66: 87aa mv a5,a0 + 3001e68: 0017c793 xori a5,a5,1 + 3001e6c: 9f81 uxtb a5 + 3001e6e: cb91 beqz a5,3001e82 + 3001e70: 0e700593 li a1,231 + 3001e74: 030067b7 lui a5,0x3006 + 3001e78: 7d078513 addi a0,a5,2000 # 30067d0 + 3001e7c: 26ad jal ra,30021e6 + 3001e7e: 4785 li a5,1 + 3001e80: a809 j 3001e92 + DCL_ADC_SOCxSoftTrigger(adcHandle->baseAddress, soc); /* Software triggers a single SOC */ + 3001e82: fec42783 lw a5,-20(s0) + 3001e86: 439c lw a5,0(a5) + 3001e88: fe842583 lw a1,-24(s0) + 3001e8c: 853e mv a0,a5 + 3001e8e: 324d jal ra,3001830 + return BASE_STATUS_OK; + 3001e90: 4781 li a5,0 +} + 3001e92: 853e mv a0,a5 + 3001e94: 40f2 lw ra,28(sp) + 3001e96: 4462 lw s0,24(sp) + 3001e98: 6105 addi sp,sp,32 + 3001e9a: 8082 ret + +03001e9c : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval unsigned int value of ADC convert result. + */ +unsigned int HAL_ADC_GetConvResult(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001e9c: 1101 addi sp,sp,-32 + 3001e9e: ce06 sw ra,28(sp) + 3001ea0: cc22 sw s0,24(sp) + 3001ea2: 1000 addi s0,sp,32 + 3001ea4: fea42623 sw a0,-20(s0) + 3001ea8: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001eac: fec42783 lw a5,-20(s0) + 3001eb0: eb89 bnez a5,3001ec2 + 3001eb2: 0f400593 li a1,244 + 3001eb6: 030067b7 lui a5,0x3006 + 3001eba: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ebe: 2625 jal ra,30021e6 + 3001ec0: a001 j 3001ec0 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001ec2: fec42783 lw a5,-20(s0) + 3001ec6: 4398 lw a4,0(a5) + 3001ec8: 180007b7 lui a5,0x18000 + 3001ecc: 00f70a63 beq a4,a5,3001ee0 + 3001ed0: 0f500593 li a1,245 + 3001ed4: 030067b7 lui a5,0x3006 + 3001ed8: 7d078513 addi a0,a5,2000 # 30067d0 + 3001edc: 2629 jal ra,30021e6 + 3001ede: a001 j 3001ede + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001ee0: fe842503 lw a0,-24(s0) + 3001ee4: b44ff0ef jal ra,3001228 + 3001ee8: 87aa mv a5,a0 + 3001eea: 0017c793 xori a5,a5,1 + 3001eee: 9f81 uxtb a5 + 3001ef0: cb91 beqz a5,3001f04 + 3001ef2: 0f600593 li a1,246 + 3001ef6: 030067b7 lui a5,0x3006 + 3001efa: 7d078513 addi a0,a5,2000 # 30067d0 + 3001efe: 24e5 jal ra,30021e6 + 3001f00: 4785 li a5,1 + 3001f02: a809 j 3001f14 + return DCL_ADC_ReadSOCxResult(adcHandle->baseAddress, soc); + 3001f04: fec42783 lw a5,-20(s0) + 3001f08: 439c lw a5,0(a5) + 3001f0a: fe842583 lw a1,-24(s0) + 3001f0e: 853e mv a0,a5 + 3001f10: 3ae5 jal ra,3001908 + 3001f12: 87aa mv a5,a0 +} + 3001f14: 853e mv a0,a5 + 3001f16: 40f2 lw ra,28(sp) + 3001f18: 4462 lw s0,24(sp) + 3001f1a: 6105 addi sp,sp,32 + 3001f1c: 8082 ret + +03001f1e : + * @param adcHandle ADC handle. + * @param intx ADC interrupt type number @ref ADC_IntNumber. + * @retval None. + */ +static void ADC_IntxClearEoc(ADC_Handle *adcHandle, unsigned int intx) +{ + 3001f1e: 7139 addi sp,sp,-64 + 3001f20: de22 sw s0,60(sp) + 3001f22: 0080 addi s0,sp,64 + 3001f24: fca42623 sw a0,-52(s0) + 3001f28: fcb42423 sw a1,-56(s0) + unsigned int eocFlag = adcHandle->baseAddress->ADC_EOC_FLAG.reg; + 3001f2c: fcc42783 lw a5,-52(s0) + 3001f30: 439c lw a5,0(a5) + 3001f32: 5bbc lw a5,112(a5) + 3001f34: fef42223 sw a5,-28(s0) + ADC_INT_DATA_0_REG intData0; + ADC_INT_DATA_1_REG intData1; + unsigned int eocMask = 0; + 3001f38: fe042623 sw zero,-20(s0) + switch (intx) { + 3001f3c: fc842783 lw a5,-56(s0) + 3001f40: 4705 li a4,1 + 3001f42: 02e78963 beq a5,a4,3001f74 + 3001f46: 4705 li a4,1 + 3001f48: 00e7e963 bltu a5,a4,3001f5a + 3001f4c: 4709 li a4,2 + 3001f4e: 04e78163 beq a5,a4,3001f90 + 3001f52: 470d li a4,3 + 3001f54: 04e78b63 beq a5,a4,3001faa + case ADC_INT_NUMBER3: /* Read Interrupt Configuration */ + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + eocMask = intData1.BIT.cfg_intr_data_sel3; + break; + default: + break; + 3001f58: a0bd j 3001fc6 + intData0.reg = adcHandle->baseAddress->ADC_INT_DATA_0.reg; + 3001f5a: fcc42783 lw a5,-52(s0) + 3001f5e: 439c lw a5,0(a5) + 3001f60: 2b07a783 lw a5,688(a5) + 3001f64: fcf42c23 sw a5,-40(s0) + eocMask = intData0.BIT.cfg_intr_data_sel0; + 3001f68: fd842783 lw a5,-40(s0) + 3001f6c: 9fa1 uxth a5 + 3001f6e: fef42623 sw a5,-20(s0) + break; + 3001f72: a891 j 3001fc6 + intData0.reg = adcHandle->baseAddress->ADC_INT_DATA_0.reg; + 3001f74: fcc42783 lw a5,-52(s0) + 3001f78: 439c lw a5,0(a5) + 3001f7a: 2b07a783 lw a5,688(a5) + 3001f7e: fcf42c23 sw a5,-40(s0) + eocMask = intData0.BIT.cfg_intr_data_sel1; + 3001f82: fd842783 lw a5,-40(s0) + 3001f86: 83c1 srli a5,a5,0x10 + 3001f88: 9fa1 uxth a5 + 3001f8a: fef42623 sw a5,-20(s0) + break; + 3001f8e: a825 j 3001fc6 + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + 3001f90: fcc42783 lw a5,-52(s0) + 3001f94: 439c lw a5,0(a5) + 3001f96: 2b47a783 lw a5,692(a5) + 3001f9a: fcf42a23 sw a5,-44(s0) + eocMask = intData1.BIT.cfg_intr_data_sel2; + 3001f9e: fd442783 lw a5,-44(s0) + 3001fa2: 9fa1 uxth a5 + 3001fa4: fef42623 sw a5,-20(s0) + break; + 3001fa8: a839 j 3001fc6 + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + 3001faa: fcc42783 lw a5,-52(s0) + 3001fae: 439c lw a5,0(a5) + 3001fb0: 2b47a783 lw a5,692(a5) + 3001fb4: fcf42a23 sw a5,-44(s0) + eocMask = intData1.BIT.cfg_intr_data_sel3; + 3001fb8: fd442783 lw a5,-44(s0) + 3001fbc: 83c1 srli a5,a5,0x10 + 3001fbe: 9fa1 uxth a5 + 3001fc0: fef42623 sw a5,-20(s0) + break; + 3001fc4: 0001 nop + } + unsigned int eoc = eocFlag & eocMask; + 3001fc6: fe442703 lw a4,-28(s0) + 3001fca: fec42783 lw a5,-20(s0) + 3001fce: 8ff9 and a5,a5,a4 + 3001fd0: fef42023 sw a5,-32(s0) + adcHandle->ADC_IntxParam[intx].socxFinish = eoc; + 3001fd4: fe042783 lw a5,-32(s0) + 3001fd8: 01079713 slli a4,a5,0x10 + 3001fdc: 8341 srli a4,a4,0x10 + 3001fde: fcc42683 lw a3,-52(s0) + 3001fe2: fc842783 lw a5,-56(s0) + 3001fe6: 07e1 addi a5,a5,24 + 3001fe8: 0786 slli a5,a5,0x1 + 3001fea: 97b6 add a5,a5,a3 + 3001fec: a3da sh a4,4(a5) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001fee: fe042423 sw zero,-24(s0) + 3001ff2: a80d j 3002024 + unsigned int val = (1 << i); + 3001ff4: 4705 li a4,1 + 3001ff6: fe842783 lw a5,-24(s0) + 3001ffa: 00f717b3 sll a5,a4,a5 + 3001ffe: fcf42e23 sw a5,-36(s0) + if (eoc & val) { + 3002002: fe042703 lw a4,-32(s0) + 3002006: fdc42783 lw a5,-36(s0) + 300200a: 8ff9 and a5,a5,a4 + 300200c: c799 beqz a5,300201a + adcHandle->baseAddress->ADC_EOC_FLAG.reg = val; /* Clear the EOC flag */ + 300200e: fcc42783 lw a5,-52(s0) + 3002012: 439c lw a5,0(a5) + 3002014: fdc42703 lw a4,-36(s0) + 3002018: dbb8 sw a4,112(a5) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 300201a: fe842783 lw a5,-24(s0) + 300201e: 0785 addi a5,a5,1 + 3002020: fef42423 sw a5,-24(s0) + 3002024: fe842703 lw a4,-24(s0) + 3002028: 47bd li a5,15 + 300202a: fce7d5e3 bge a5,a4,3001ff4 + } + } +} + 300202e: 0001 nop + 3002030: 5472 lw s0,60(sp) + 3002032: 6121 addi sp,sp,64 + 3002034: 8082 ret + +03002036 : + * @brief ADC Interrupt2 service processing function. + * @param handle ADC handle. + * @retval None. + */ +void HAL_ADC_IrqHandlerInt2(void *handle) +{ + 3002036: 7179 addi sp,sp,-48 + 3002038: d606 sw ra,44(sp) + 300203a: d422 sw s0,40(sp) + 300203c: 1800 addi s0,sp,48 + 300203e: fca42e23 sw a0,-36(s0) + ADC_ASSERT_PARAM(handle != NULL); + 3002042: fdc42783 lw a5,-36(s0) + 3002046: eb89 bnez a5,3002058 + 3002048: 17900593 li a1,377 + 300204c: 030067b7 lui a5,0x3006 + 3002050: 7d078513 addi a0,a5,2000 # 30067d0 + 3002054: 2a49 jal ra,30021e6 + 3002056: a001 j 3002056 + ADC_Handle *adcHandle = (ADC_Handle *)handle; + 3002058: fdc42783 lw a5,-36(s0) + 300205c: fef42623 sw a5,-20(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3002060: fec42783 lw a5,-20(s0) + 3002064: 4398 lw a4,0(a5) + 3002066: 180007b7 lui a5,0x18000 + 300206a: 00f70a63 beq a4,a5,300207e + 300206e: 17b00593 li a1,379 + 3002072: 030067b7 lui a5,0x3006 + 3002076: 7d078513 addi a0,a5,2000 # 30067d0 + 300207a: 22b5 jal ra,30021e6 + 300207c: a001 j 300207c + ADC_IntxClearEoc(adcHandle, ADC_INT_NUMBER2); /* Clear conversion completion flag */ + 300207e: 4589 li a1,2 + 3002080: fec42503 lw a0,-20(s0) + 3002084: 3d69 jal ra,3001f1e + DCL_ADC_ClearIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + 3002086: fec42783 lw a5,-20(s0) + 300208a: 439c lw a5,0(a5) + 300208c: 4589 li a1,2 + 300208e: 853e mv a0,a5 + 3002090: cfeff0ef jal ra,300158e + if (adcHandle->userCallBack.Int2FinishCallBack != NULL) { + 3002094: fec42783 lw a5,-20(s0) + 3002098: 43fc lw a5,68(a5) + 300209a: c799 beqz a5,30020a8 + adcHandle->userCallBack.Int2FinishCallBack(handle); + 300209c: fec42783 lw a5,-20(s0) + 30020a0: 43fc lw a5,68(a5) + 30020a2: fdc42503 lw a0,-36(s0) + 30020a6: 9782 jalr a5 + } +} + 30020a8: 0001 nop + 30020aa: 50b2 lw ra,44(sp) + 30020ac: 5422 lw s0,40(sp) + 30020ae: 6145 addi sp,sp,48 + 30020b0: 8082 ret + +030020b2 : + * @param typeID Id of callback function type. + * @param pCallback Pointer of the specified callbcak function. + * @retval None. + */ +static void ADC_RegieterEventCallBack(ADC_Handle *adcHandle, ADC_CallbackFunType typeID, ADC_CallbackType pCallback) +{ + 30020b2: 7179 addi sp,sp,-48 + 30020b4: d622 sw s0,44(sp) + 30020b6: 1800 addi s0,sp,48 + 30020b8: fca42e23 sw a0,-36(s0) + 30020bc: fcb42c23 sw a1,-40(s0) + 30020c0: fcc42a23 sw a2,-44(s0) + if (typeID > ADC_CALLBACK_EVENT_PPB3_ERROR || typeID < ADC_CALLBACK_EVENT_PPB0_ZERO) { + 30020c4: fd842703 lw a4,-40(s0) + 30020c8: 47fd li a5,31 + 30020ca: 02e7e763 bltu a5,a4,30020f8 + 30020ce: fd842703 lw a4,-40(s0) + 30020d2: 47bd li a5,15 + 30020d4: 02e7f263 bgeu a5,a4,30020f8 + return; + } + unsigned int index = ((unsigned int)typeID & 0xF); + 30020d8: fd842783 lw a5,-40(s0) + 30020dc: 8bbd andi a5,a5,15 + 30020de: fef42623 sw a5,-20(s0) + adcHandle->userCallBack.PPBEventCallBack[index] = pCallback; + 30020e2: fdc42703 lw a4,-36(s0) + 30020e6: fec42783 lw a5,-20(s0) + 30020ea: 07d1 addi a5,a5,20 + 30020ec: 078a slli a5,a5,0x2 + 30020ee: 97ba add a5,a5,a4 + 30020f0: fd442703 lw a4,-44(s0) + 30020f4: cb98 sw a4,16(a5) + 30020f6: a011 j 30020fa + return; + 30020f8: 0001 nop +} + 30020fa: 5432 lw s0,44(sp) + 30020fc: 6145 addi sp,sp,48 + 30020fe: 8082 ret + +03002100 : + * @param typeID Id of callback function type. + * @param pCallback Pointer of the specified callbcak function. + * @retval None. + */ +void HAL_ADC_RegisterCallBack(ADC_Handle *adcHandle, ADC_CallbackFunType typeID, ADC_CallbackType pCallback) +{ + 3002100: 1101 addi sp,sp,-32 + 3002102: ce06 sw ra,28(sp) + 3002104: cc22 sw s0,24(sp) + 3002106: 1000 addi s0,sp,32 + 3002108: fea42623 sw a0,-20(s0) + 300210c: feb42423 sw a1,-24(s0) + 3002110: fec42223 sw a2,-28(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3002114: fec42783 lw a5,-20(s0) + 3002118: eb89 bnez a5,300212a + 300211a: 1d900593 li a1,473 + 300211e: 030067b7 lui a5,0x3006 + 3002122: 7d078513 addi a0,a5,2000 # 30067d0 + 3002126: 20c1 jal ra,30021e6 + 3002128: a001 j 3002128 + ADC_ASSERT_PARAM(pCallback != NULL); + 300212a: fe442783 lw a5,-28(s0) + 300212e: eb89 bnez a5,3002140 + 3002130: 1da00593 li a1,474 + 3002134: 030067b7 lui a5,0x3006 + 3002138: 7d078513 addi a0,a5,2000 # 30067d0 + 300213c: 206d jal ra,30021e6 + 300213e: a001 j 300213e + switch (typeID) { /* Register the callback function based on the interrupt type */ + 3002140: fe842703 lw a4,-24(s0) + 3002144: 47a1 li a5,8 + 3002146: 08e7e363 bltu a5,a4,30021cc + 300214a: fe842783 lw a5,-24(s0) + 300214e: 00279713 slli a4,a5,0x2 + 3002152: 030077b7 lui a5,0x3007 + 3002156: 80478793 addi a5,a5,-2044 # 3006804 + 300215a: 97ba add a5,a5,a4 + 300215c: 439c lw a5,0(a5) + 300215e: 8782 jr a5 + case ADC_CALLBACK_INT0: + adcHandle->userCallBack.Int0FinishCallBack = pCallback; /* Sampling finsish interrupt 0 callback function */ + 3002160: fec42783 lw a5,-20(s0) + 3002164: fe442703 lw a4,-28(s0) + 3002168: dfd8 sw a4,60(a5) + break; + 300216a: a88d j 30021dc + case ADC_CALLBACK_INT1: + adcHandle->userCallBack.Int1FinishCallBack = pCallback; /* Sampling finsish interrupt 1 callback function */ + 300216c: fec42783 lw a5,-20(s0) + 3002170: fe442703 lw a4,-28(s0) + 3002174: c3b8 sw a4,64(a5) + break; + 3002176: a09d j 30021dc + case ADC_CALLBACK_INT2: + adcHandle->userCallBack.Int2FinishCallBack = pCallback; /* Sampling finsish interrupt 2 callback function */ + 3002178: fec42783 lw a5,-20(s0) + 300217c: fe442703 lw a4,-28(s0) + 3002180: c3f8 sw a4,68(a5) + break; + 3002182: a8a9 j 30021dc + case ADC_CALLBACK_INT3: + adcHandle->userCallBack.Int3FinishCallBack = pCallback; /* Sampling finsish interrupt 3 callback function */ + 3002184: fec42783 lw a5,-20(s0) + 3002188: fe442703 lw a4,-28(s0) + 300218c: c7b8 sw a4,72(a5) + break; + 300218e: a0b9 j 30021dc + case ADC_CALLBACK_DMA: + adcHandle->userCallBack.DmaFinishCallBack = pCallback; /* Dma transfer finish callback function */ + 3002190: fec42783 lw a5,-20(s0) + 3002194: fe442703 lw a4,-28(s0) + 3002198: c7f8 sw a4,76(a5) + break; + 300219a: a089 j 30021dc + case ADC_CALLBACK_DMAERROR: + adcHandle->userCallBack.DmaErrorCallBack = pCallback; /* Dma transfer error callback function */ + 300219c: fec42783 lw a5,-20(s0) + 30021a0: fe442703 lw a4,-28(s0) + 30021a4: cbf8 sw a4,84(a5) + break; + 30021a6: a81d j 30021dc + case ADC_CALLBACK_DMAOVER: + adcHandle->userCallBack.DmaOverCallBack = pCallback; /* Dma request over callback function */ + 30021a8: fec42783 lw a5,-20(s0) + 30021ac: fe442703 lw a4,-28(s0) + 30021b0: cfb8 sw a4,88(a5) + break; + 30021b2: a02d j 30021dc + case ADC_CALLBACK_TRIGOVER: + adcHandle->userCallBack.TrigOverCallBack = pCallback; /* trigger over callback function */ + 30021b4: fec42783 lw a5,-20(s0) + 30021b8: fe442703 lw a4,-28(s0) + 30021bc: cff8 sw a4,92(a5) + break; + 30021be: a839 j 30021dc + case ADC_CALLBACK_EVENT_OVERSAMPLING: /* Oversampling callback function */ + adcHandle->userCallBack.OverSamplingFinishCallBack = pCallback; + 30021c0: fec42783 lw a5,-20(s0) + 30021c4: fe442703 lw a4,-28(s0) + 30021c8: cbb8 sw a4,80(a5) + break; + 30021ca: a809 j 30021dc + default: + ADC_RegieterEventCallBack(adcHandle, typeID, pCallback); /* PPB Function Callback Function */ + 30021cc: fe442603 lw a2,-28(s0) + 30021d0: fe842583 lw a1,-24(s0) + 30021d4: fec42503 lw a0,-20(s0) + 30021d8: 3de9 jal ra,30020b2 + break; + 30021da: 0001 nop + } +} + 30021dc: 0001 nop + 30021de: 40f2 lw ra,28(sp) + 30021e0: 4462 lw s0,24(sp) + 30021e2: 6105 addi sp,sp,32 + 30021e4: 8082 ret + +030021e6 : + * @param file Pointer to the name of the file where the error occurs. + * @param line Number of the line where the error occurs. + * @retval None. + */ +__weak void AssertErrorLog(char *file, unsigned int line) +{ + 30021e6: 1101 addi sp,sp,-32 + 30021e8: ce22 sw s0,28(sp) + 30021ea: 1000 addi s0,sp,32 + 30021ec: fea42623 sw a0,-20(s0) + 30021f0: feb42423 sw a1,-24(s0) + /* Use only if the user apllication is not defined. */ + BASE_FUNC_UNUSED(file); + BASE_FUNC_UNUSED(line); + 30021f4: 0001 nop + 30021f6: 4472 lw s0,28(sp) + 30021f8: 6105 addi sp,sp,32 + 30021fa: 8082 ret + +030021fc : + * @brief Get the systick + * @param None + * @retval The SysTick Value + */ +static inline unsigned int DCL_SYSTICK_GetTick(void) +{ + 30021fc: 1141 addi sp,sp,-16 + 30021fe: c622 sw s0,12(sp) + 3002200: 0800 addi s0,sp,16 + return SYSTICK->MTIME; /* Systick value(Lower 32bit register) */ + 3002202: 143807b7 lui a5,0x14380 + 3002206: 479c lw a5,8(a5) +} + 3002208: 853e mv a0,a5 + 300220a: 4432 lw s0,12(sp) + 300220c: 0141 addi sp,sp,16 + 300220e: 8082 ret + +03002210 : + * @brief Delay number of us. + * @param us The number of us to delay. + * @retval None. + */ +void BASE_FUNC_DelayUs(unsigned int us) +{ + 3002210: 7179 addi sp,sp,-48 + 3002212: d606 sw ra,44(sp) + 3002214: d422 sw s0,40(sp) + 3002216: 1800 addi s0,sp,48 + 3002218: fca42e23 sw a0,-36(s0) + unsigned int preTick = DCL_SYSTICK_GetTick(); + 300221c: 37c5 jal ra,30021fc + 300221e: fea42623 sw a0,-20(s0) + unsigned int tickInUs = (SYSTICK_GetCRGHZ() / CRG_FREQ_1MHz) * us; + 3002222: d85fe0ef jal ra,3000fa6 + 3002226: 872a mv a4,a0 + 3002228: 000f47b7 lui a5,0xf4 + 300222c: 24078793 addi a5,a5,576 # f4240 + 3002230: 02f757b3 divu a5,a4,a5 + 3002234: fdc42703 lw a4,-36(s0) + 3002238: 02f707b3 mul a5,a4,a5 + 300223c: fef42423 sw a5,-24(s0) + unsigned int curTick; + unsigned int delta; + + /* Wait until the delta is greater than tickInUs */ + do { + curTick = DCL_SYSTICK_GetTick(); + 3002240: 3f75 jal ra,30021fc + 3002242: fea42223 sw a0,-28(s0) + delta = (curTick >= preTick) ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick + 1; + 3002246: fe442703 lw a4,-28(s0) + 300224a: fec42783 lw a5,-20(s0) + 300224e: 40f707b3 sub a5,a4,a5 + 3002252: fef42023 sw a5,-32(s0) + } while (delta < tickInUs); + 3002256: fe042703 lw a4,-32(s0) + 300225a: fe842783 lw a5,-24(s0) + 300225e: fef761e3 bltu a4,a5,3002240 +} + 3002262: 0001 nop + 3002264: 50b2 lw ra,44(sp) + 3002266: 5422 lw s0,40(sp) + 3002268: 6145 addi sp,sp,48 + 300226a: 8082 ret + +0300226c : + * @brief Delay number of ms. + * @param ms The number of ms to delay. + * @retval None. + */ +void BASE_FUNC_DelayMs(unsigned int ms) +{ + 300226c: 7179 addi sp,sp,-48 + 300226e: d606 sw ra,44(sp) + 3002270: d422 sw s0,40(sp) + 3002272: 1800 addi s0,sp,48 + 3002274: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < ms; ++i) { + 3002278: fe042623 sw zero,-20(s0) + 300227c: a809 j 300228e + BASE_FUNC_DelayUs(BASE_DEFINE_DELAY_US_IN_MS); + 300227e: 3e800513 li a0,1000 + 3002282: 3779 jal ra,3002210 + for (unsigned int i = 0; i < ms; ++i) { + 3002284: fec42783 lw a5,-20(s0) + 3002288: 0785 addi a5,a5,1 + 300228a: fef42623 sw a5,-20(s0) + 300228e: fec42703 lw a4,-20(s0) + 3002292: fdc42783 lw a5,-36(s0) + 3002296: fef764e3 bltu a4,a5,300227e + } +} + 300229a: 0001 nop + 300229c: 50b2 lw ra,44(sp) + 300229e: 5422 lw s0,40(sp) + 30022a0: 6145 addi sp,sp,48 + 30022a2: 8082 ret + +030022a4 : + * @brief Delay number of seconds. + * @param seconds The number of seconds to delay. + * @retval None. + */ +void BASE_FUNC_DelaySeconds(unsigned int seconds) +{ + 30022a4: 7179 addi sp,sp,-48 + 30022a6: d606 sw ra,44(sp) + 30022a8: d422 sw s0,40(sp) + 30022aa: 1800 addi s0,sp,48 + 30022ac: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < seconds; ++i) { + 30022b0: fe042623 sw zero,-20(s0) + 30022b4: a809 j 30022c6 + BASE_FUNC_DelayMs(BASE_DEFINE_DELAY_MS_IN_SEC); + 30022b6: 3e800513 li a0,1000 + 30022ba: 3f4d jal ra,300226c + for (unsigned int i = 0; i < seconds; ++i) { + 30022bc: fec42783 lw a5,-20(s0) + 30022c0: 0785 addi a5,a5,1 + 30022c2: fef42623 sw a5,-20(s0) + 30022c6: fec42703 lw a4,-20(s0) + 30022ca: fdc42783 lw a5,-36(s0) + 30022ce: fef764e3 bltu a4,a5,30022b6 + } +} + 30022d2: 0001 nop + 30022d4: 50b2 lw ra,44(sp) + 30022d6: 5422 lw s0,40(sp) + 30022d8: 6145 addi sp,sp,48 + 30022da: 8082 ret + +030022dc : + * @param delay The number of 'units' to delay. + * @param units Specifies the delay unit. + * @retval None. + */ +void BASE_FUNC_Delay(unsigned int delay, BASE_DelayUnit units) +{ + 30022dc: 1101 addi sp,sp,-32 + 30022de: ce06 sw ra,28(sp) + 30022e0: cc22 sw s0,24(sp) + 30022e2: 1000 addi s0,sp,32 + 30022e4: fea42623 sw a0,-20(s0) + 30022e8: feb42423 sw a1,-24(s0) + switch (units) { + 30022ec: fe842783 lw a5,-24(s0) + 30022f0: 3e800713 li a4,1000 + 30022f4: 02e78063 beq a5,a4,3002314 + 30022f8: 000f4737 lui a4,0xf4 + 30022fc: 24070713 addi a4,a4,576 # f4240 + 3002300: 00e78e63 beq a5,a4,300231c + 3002304: 4705 li a4,1 + 3002306: 00e78363 beq a5,a4,300230c + break; + case BASE_DEFINE_DELAY_MICROSECS: + BASE_FUNC_DelayUs(delay); + break; + default: + break; + 300230a: a829 j 3002324 + BASE_FUNC_DelaySeconds(delay); + 300230c: fec42503 lw a0,-20(s0) + 3002310: 3f51 jal ra,30022a4 + break; + 3002312: a809 j 3002324 + BASE_FUNC_DelayMs(delay); + 3002314: fec42503 lw a0,-20(s0) + 3002318: 3f91 jal ra,300226c + break; + 300231a: a029 j 3002324 + BASE_FUNC_DelayUs(delay); + 300231c: fec42503 lw a0,-20(s0) + 3002320: 3dc5 jal ra,3002210 + break; + 3002322: 0001 nop + } + return; + 3002324: 0001 nop + 3002326: 40f2 lw ra,28(sp) + 3002328: 4462 lw s0,24(sp) + 300232a: 6105 addi sp,sp,32 + 300232c: 8082 ret + +0300232e : + * @brief Clear external interrupt + * @param irqNum external interrupt number + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_NOT_CREATED + */ +static inline void IRQ_ClearN(unsigned int irqNum) +{ + 300232e: 1101 addi sp,sp,-32 + 3002330: ce22 sw s0,28(sp) + 3002332: 1000 addi s0,sp,32 + 3002334: fea42623 sw a0,-20(s0) + asm volatile("fence"); + 3002338: 0ff0000f fence + WRITE_CUSTOM_CSR_VAL(LOCIPCLR, irqNum); + 300233c: fec42783 lw a5,-20(s0) + 3002340: 82be mv t0,a5 + 3002342: bf029073 csrw 0xbf0,t0 +} + 3002346: 0001 nop + 3002348: 4472 lw s0,28(sp) + 300234a: 6105 addi sp,sp,32 + 300234c: 8082 ret + +0300234e : + * @brief Exception/Interrupt Handler Entry. + * @param irqNum external interrupt number. + * @retval None + */ +void InterruptEntry(unsigned int irqNum) +{ + 300234e: 1101 addi sp,sp,-32 + 3002350: ce06 sw ra,28(sp) + 3002352: cc22 sw s0,24(sp) + 3002354: 1000 addi s0,sp,32 + 3002356: fea42623 sw a0,-20(s0) + g_irqCallbackFunc[irqNum].pfnHandler(g_irqCallbackFunc[irqNum].param); + 300235a: 040007b7 lui a5,0x4000 + 300235e: 0fc78713 addi a4,a5,252 # 40000fc + 3002362: fec42783 lw a5,-20(s0) + 3002366: 078e slli a5,a5,0x3 + 3002368: 97ba add a5,a5,a4 + 300236a: 4394 lw a3,0(a5) + 300236c: 040007b7 lui a5,0x4000 + 3002370: 0fc78713 addi a4,a5,252 # 40000fc + 3002374: fec42783 lw a5,-20(s0) + 3002378: 078e slli a5,a5,0x3 + 300237a: 97ba add a5,a5,a4 + 300237c: 43dc lw a5,4(a5) + 300237e: 853e mv a0,a5 + 3002380: 9682 jalr a3 + IRQ_ClearN(irqNum); + 3002382: fec42503 lw a0,-20(s0) + 3002386: 3765 jal ra,300232e +} + 3002388: 0001 nop + 300238a: 40f2 lw ra,28(sp) + 300238c: 4462 lw s0,24(sp) + 300238e: 6105 addi sp,sp,32 + 3002390: 8082 ret + +03002392 : + * @brief Irq initialization. + * @param none. + * @retval None + */ +void IRQ_Init(void) +{ + 3002392: 1101 addi sp,sp,-32 + 3002394: ce22 sw s0,28(sp) + 3002396: 1000 addi s0,sp,32 + unsigned int index; + + for (index = 0; index < IRQ_MAX; index++) { + 3002398: fe042623 sw zero,-20(s0) + 300239c: a82d j 30023d6 + g_irqCallbackFunc[index].pfnHandler = IRQ_DummyHandler; + 300239e: 040007b7 lui a5,0x4000 + 30023a2: 0fc78713 addi a4,a5,252 # 40000fc + 30023a6: fec42783 lw a5,-20(s0) + 30023aa: 078e slli a5,a5,0x3 + 30023ac: 97ba add a5,a5,a4 + 30023ae: 03003737 lui a4,0x3003 + 30023b2: c3270713 addi a4,a4,-974 # 3002c32 + 30023b6: c398 sw a4,0(a5) + g_irqCallbackFunc[index].param = NULL; + 30023b8: 040007b7 lui a5,0x4000 + 30023bc: 0fc78713 addi a4,a5,252 # 40000fc + 30023c0: fec42783 lw a5,-20(s0) + 30023c4: 078e slli a5,a5,0x3 + 30023c6: 97ba add a5,a5,a4 + 30023c8: 0007a223 sw zero,4(a5) + for (index = 0; index < IRQ_MAX; index++) { + 30023cc: fec42783 lw a5,-20(s0) + 30023d0: 0785 addi a5,a5,1 + 30023d2: fef42623 sw a5,-20(s0) + 30023d6: fec42703 lw a4,-20(s0) + 30023da: 07200793 li a5,114 + 30023de: fce7f0e3 bgeu a5,a4,300239e + } +} + 30023e2: 0001 nop + 30023e4: 4472 lw s0,28(sp) + 30023e6: 6105 addi sp,sp,32 + 30023e8: 8082 ret + +030023ea : + * @note In the corresponding interrupt handler, manually clear the interrupt source and the corresponding interrupt + * flag bit (call the IRQ_ClearN function to clear the interrupt), otherwise the interrupt will always be + * triggered. + */ +unsigned int IRQ_Register(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 30023ea: 1101 addi sp,sp,-32 + 30023ec: ce06 sw ra,28(sp) + 30023ee: cc22 sw s0,24(sp) + 30023f0: 1000 addi s0,sp,32 + 30023f2: fea42623 sw a0,-20(s0) + 30023f6: feb42423 sw a1,-24(s0) + 30023fa: fec42223 sw a2,-28(s0) + INTERRUPT_ASSERT_PARAM(func != NULL); + 30023fe: fe842783 lw a5,-24(s0) + 3002402: eb89 bnez a5,3002414 + 3002404: 06300593 li a1,99 + 3002408: 030077b7 lui a5,0x3007 + 300240c: 82878513 addi a0,a5,-2008 # 3006828 + 3002410: 3bd9 jal ra,30021e6 + 3002412: a001 j 3002412 + INTERRUPT_PARAM_CHECK_WITH_RET(irqNum < IRQ_MAX, IRQ_ERRNO_NUM_INVALID); + 3002414: fec42703 lw a4,-20(s0) + 3002418: 07200793 li a5,114 + 300241c: 00e7fb63 bgeu a5,a4,3002432 + 3002420: 06400593 li a1,100 + 3002424: 030077b7 lui a5,0x3007 + 3002428: 82878513 addi a0,a5,-2008 # 3006828 + 300242c: 3b6d jal ra,30021e6 + 300242e: 4789 li a5,2 + 3002430: a81d j 3002466 + + if (g_irqCallbackFunc[irqNum].pfnHandler != IRQ_DummyHandler) { + 3002432: 040007b7 lui a5,0x4000 + 3002436: 0fc78713 addi a4,a5,252 # 40000fc + 300243a: fec42783 lw a5,-20(s0) + 300243e: 078e slli a5,a5,0x3 + 3002440: 97ba add a5,a5,a4 + 3002442: 4398 lw a4,0(a5) + 3002444: 030037b7 lui a5,0x3003 + 3002448: c3278793 addi a5,a5,-974 # 3002c32 + 300244c: 00f70463 beq a4,a5,3002454 + return IRQ_ERRNO_ALREADY_CREATED; + 3002450: 478d li a5,3 + 3002452: a811 j 3002466 + } + IRQ_SetCallBack(irqNum, func, arg); + 3002454: fe442603 lw a2,-28(s0) + 3002458: fe842583 lw a1,-24(s0) + 300245c: fec42503 lw a0,-20(s0) + 3002460: 7e4000ef jal ra,3002c44 + return BASE_STATUS_OK; + 3002464: 4781 li a5,0 +} + 3002466: 853e mv a0,a5 + 3002468: 40f2 lw ra,28(sp) + 300246a: 4462 lw s0,24(sp) + 300246c: 6105 addi sp,sp,32 + 300246e: 8082 ret + +03002470 : + * @brief Enable the specified interrupt. + * @param irqNum External interrupt number. + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID. + */ +unsigned int IRQ_EnableN(unsigned int irqNum) +{ + 3002470: 7139 addi sp,sp,-64 + 3002472: de06 sw ra,60(sp) + 3002474: dc22 sw s0,56(sp) + 3002476: 0080 addi s0,sp,64 + 3002478: fca42623 sw a0,-52(s0) + unsigned int locienVal; +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 300247c: fcc42703 lw a4,-52(s0) + 3002480: 47e5 li a5,25 + 3002482: 00e7f863 bgeu a5,a4,3002492 + 3002486: fcc42703 lw a4,-52(s0) + 300248a: 07200793 li a5,114 + 300248e: 00e7fb63 bgeu a5,a4,30024a4 + 3002492: 0c300593 li a1,195 + 3002496: 030077b7 lui a5,0x3007 + 300249a: 82878513 addi a0,a5,-2008 # 3006828 + 300249e: 33a1 jal ra,30021e6 + 30024a0: 4789 li a5,2 + 30024a2: a8cd j 3002594 + /* The interrupt enable bits that can be controlled in the mie register (32 bits), up to 32 + can be controlled, and each bit corresponds to an interrupt enable */ + + RISCV_PRIV_MODE_SWITCH(priv); + + if (irqNum < IRQ_MIE_TOTAL_CNT) { + 30024a4: fcc42703 lw a4,-52(s0) + 30024a8: 47fd li a5,31 + 30024aa: 02e7e063 bltu a5,a4,30024ca + irqOrder = 1U << irqNum; + 30024ae: 4705 li a4,1 + 30024b0: fcc42783 lw a5,-52(s0) + 30024b4: 00f717b3 sll a5,a4,a5 + 30024b8: fef42623 sw a5,-20(s0) + SET_CSR(mie, irqOrder); + 30024bc: fec42783 lw a5,-20(s0) + 30024c0: 3047a7f3 csrrs a5,mie,a5 + 30024c4: fcf42c23 sw a5,-40(s0) + 30024c8: a0e9 j 3002592 + } else if (irqNum < IRQ_LOCIEN1_OFFSET) { + 30024ca: fcc42703 lw a4,-52(s0) + 30024ce: 03f00793 li a5,63 + 30024d2: 02e7ef63 bltu a5,a4,3002510 + irqOrder = irqNum - IRQ_MIE_TOTAL_CNT; + 30024d6: fcc42783 lw a5,-52(s0) + 30024da: 1781 addi a5,a5,-32 + 30024dc: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN0); + 30024e0: be0027f3 csrr a5,0xbe0 + 30024e4: fcf42e23 sw a5,-36(s0) + 30024e8: fdc42783 lw a5,-36(s0) + 30024ec: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 30024f0: 4705 li a4,1 + 30024f2: fec42783 lw a5,-20(s0) + 30024f6: 00f717b3 sll a5,a4,a5 + 30024fa: fe442703 lw a4,-28(s0) + 30024fe: 8fd9 or a5,a5,a4 + 3002500: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN0, locienVal); + 3002504: fe442783 lw a5,-28(s0) + 3002508: 82be mv t0,a5 + 300250a: be029073 csrw 0xbe0,t0 + 300250e: a051 j 3002592 + } else if (irqNum < IRQ_LOCIEN2_OFFSET) { + 3002510: fcc42703 lw a4,-52(s0) + 3002514: 05f00793 li a5,95 + 3002518: 04e7e063 bltu a5,a4,3002558 + irqOrder = irqNum - IRQ_LOCIEN1_OFFSET; + 300251c: fcc42783 lw a5,-52(s0) + 3002520: fc078793 addi a5,a5,-64 + 3002524: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN1); + 3002528: be1027f3 csrr a5,0xbe1 + 300252c: fef42023 sw a5,-32(s0) + 3002530: fe042783 lw a5,-32(s0) + 3002534: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 3002538: 4705 li a4,1 + 300253a: fec42783 lw a5,-20(s0) + 300253e: 00f717b3 sll a5,a4,a5 + 3002542: fe442703 lw a4,-28(s0) + 3002546: 8fd9 or a5,a5,a4 + 3002548: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN1, locienVal); + 300254c: fe442783 lw a5,-28(s0) + 3002550: 82be mv t0,a5 + 3002552: be129073 csrw 0xbe1,t0 + 3002556: a835 j 3002592 + } else { + irqOrder = irqNum - IRQ_LOCIEN2_OFFSET; + 3002558: fcc42783 lw a5,-52(s0) + 300255c: fa078793 addi a5,a5,-96 + 3002560: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN2); + 3002564: be2027f3 csrr a5,0xbe2 + 3002568: fef42423 sw a5,-24(s0) + 300256c: fe842783 lw a5,-24(s0) + 3002570: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 3002574: 4705 li a4,1 + 3002576: fec42783 lw a5,-20(s0) + 300257a: 00f717b3 sll a5,a4,a5 + 300257e: fe442703 lw a4,-28(s0) + 3002582: 8fd9 or a5,a5,a4 + 3002584: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN2, locienVal); + 3002588: fe442783 lw a5,-28(s0) + 300258c: 82be mv t0,a5 + 300258e: be229073 csrw 0xbe2,t0 + } + + RISCV_PRIV_MODE_SWITCH(priv); + + return BASE_STATUS_OK; + 3002592: 4781 li a5,0 +} + 3002594: 853e mv a0,a5 + 3002596: 50f2 lw ra,60(sp) + 3002598: 5462 lw s0,56(sp) + 300259a: 6121 addi sp,sp,64 + 300259c: 8082 ret + +0300259e : + * @param context. + * @note The actual code is generated by IDE + * @retval None. + */ +__weak void SysErrPrint(const SyserrContext *context) +{ + 300259e: 1101 addi sp,sp,-32 + 30025a0: ce22 sw s0,28(sp) + 30025a2: 1000 addi s0,sp,32 + 30025a4: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(context); +} + 30025a8: 0001 nop + 30025aa: 4472 lw s0,28(sp) + 30025ac: 6105 addi sp,sp,32 + 30025ae: 8082 ret + +030025b0 : + * @brief System error completion processing + * @param None. + * @retval None. + */ +static void SysErrFinish(void) +{ + 30025b0: 1141 addi sp,sp,-16 + 30025b2: c622 sw s0,12(sp) + 30025b4: 0800 addi s0,sp,16 +} + 30025b6: 0001 nop + 30025b8: 4432 lw s0,12(sp) + 30025ba: 0141 addi sp,sp,16 + 30025bc: 8082 ret + +030025be : + * @brief Exception Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrExcEntry(const SyserrContext *context) +{ + 30025be: 1101 addi sp,sp,-32 + 30025c0: ce06 sw ra,28(sp) + 30025c2: cc22 sw s0,24(sp) + 30025c4: 1000 addi s0,sp,32 + 30025c6: fea42623 sw a0,-20(s0) + SysErrPrint(context); + 30025ca: fec42503 lw a0,-20(s0) + 30025ce: 3fc1 jal ra,300259e + SysErrFinish(); + 30025d0: 37c5 jal ra,30025b0 +} + 30025d2: 0001 nop + 30025d4: 40f2 lw ra,28(sp) + 30025d6: 4462 lw s0,24(sp) + 30025d8: 6105 addi sp,sp,32 + 30025da: 8082 ret + +030025dc : + * @brief NMI Interrupt Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrNmiEntry(const SyserrContext *context) +{ + 30025dc: 1101 addi sp,sp,-32 + 30025de: ce06 sw ra,28(sp) + 30025e0: cc22 sw s0,24(sp) + 30025e2: 1000 addi s0,sp,32 + 30025e4: fea42623 sw a0,-20(s0) + INTERRUPT_ASSERT_PARAM(context != NULL); + 30025e8: fec42783 lw a5,-20(s0) + 30025ec: eb89 bnez a5,30025fe + 30025ee: 12d00593 li a1,301 + 30025f2: 030077b7 lui a5,0x3007 + 30025f6: 82878513 addi a0,a5,-2008 # 3006828 + 30025fa: 36f5 jal ra,30021e6 + 30025fc: a001 j 30025fc + SysErrPrint(context); + 30025fe: fec42503 lw a0,-20(s0) + 3002602: 3f71 jal ra,300259e + SysErrFinish(); + 3002604: 3775 jal ra,30025b0 +} + 3002606: 0001 nop + 3002608: 40f2 lw ra,28(sp) + 300260a: 4462 lw s0,24(sp) + 300260c: 6105 addi sp,sp,32 + 300260e: 8082 ret + +03002610 : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior local int prioroty. + * @retval None + */ +static void SetLocalIntNumPri(unsigned int intNum, unsigned int interPriNum, unsigned int prior) +{ + 3002610: 711d addi sp,sp,-96 + 3002612: cea2 sw s0,92(sp) + 3002614: 1080 addi s0,sp,96 + 3002616: faa42623 sw a0,-84(s0) + 300261a: fab42423 sw a1,-88(s0) + 300261e: fac42223 sw a2,-92(s0) + switch (intNum) { + 3002622: fac42783 lw a5,-84(s0) + 3002626: 17e1 addi a5,a5,-8 + 3002628: 471d li a4,7 + 300262a: 2af76363 bltu a4,a5,30028d0 + 300262e: 00279713 slli a4,a5,0x2 + 3002632: 030077b7 lui a5,0x3007 + 3002636: 84878793 addi a5,a5,-1976 # 3006848 + 300263a: 97ba add a5,a5,a4 + 300263c: 439c lw a5,0(a5) + 300263e: 8782 jr a5 + case 8: /* GROUP8 */ + SET_LOCAL_INTER_NUM_PRI(8, interPriNum, prior); + 3002640: bc8027f3 csrr a5,0xbc8 + 3002644: faf42a23 sw a5,-76(s0) + 3002648: fb442783 lw a5,-76(s0) + 300264c: faf42823 sw a5,-80(s0) + 3002650: fa842783 lw a5,-88(s0) + 3002654: 078a slli a5,a5,0x2 + 3002656: 8bf1 andi a5,a5,28 + 3002658: 473d li a4,15 + 300265a: 00f717b3 sll a5,a4,a5 + 300265e: fff7c793 not a5,a5 + 3002662: fb042703 lw a4,-80(s0) + 3002666: 8ff9 and a5,a5,a4 + 3002668: faf42823 sw a5,-80(s0) + 300266c: fa842783 lw a5,-88(s0) + 3002670: 078a slli a5,a5,0x2 + 3002672: 8bf1 andi a5,a5,28 + 3002674: fa442703 lw a4,-92(s0) + 3002678: 00f717b3 sll a5,a4,a5 + 300267c: fb042703 lw a4,-80(s0) + 3002680: 8fd9 or a5,a5,a4 + 3002682: faf42823 sw a5,-80(s0) + 3002686: fb042783 lw a5,-80(s0) + 300268a: 82be mv t0,a5 + 300268c: bc829073 csrw 0xbc8,t0 + break; + 3002690: a489 j 30028d2 + case 9: /* GROUP9 */ + SET_LOCAL_INTER_NUM_PRI(9, interPriNum, prior); + 3002692: bc9027f3 csrr a5,0xbc9 + 3002696: faf42e23 sw a5,-68(s0) + 300269a: fbc42783 lw a5,-68(s0) + 300269e: faf42c23 sw a5,-72(s0) + 30026a2: fa842783 lw a5,-88(s0) + 30026a6: 078a slli a5,a5,0x2 + 30026a8: 8bf1 andi a5,a5,28 + 30026aa: 473d li a4,15 + 30026ac: 00f717b3 sll a5,a4,a5 + 30026b0: fff7c793 not a5,a5 + 30026b4: fb842703 lw a4,-72(s0) + 30026b8: 8ff9 and a5,a5,a4 + 30026ba: faf42c23 sw a5,-72(s0) + 30026be: fa842783 lw a5,-88(s0) + 30026c2: 078a slli a5,a5,0x2 + 30026c4: 8bf1 andi a5,a5,28 + 30026c6: fa442703 lw a4,-92(s0) + 30026ca: 00f717b3 sll a5,a4,a5 + 30026ce: fb842703 lw a4,-72(s0) + 30026d2: 8fd9 or a5,a5,a4 + 30026d4: faf42c23 sw a5,-72(s0) + 30026d8: fb842783 lw a5,-72(s0) + 30026dc: 82be mv t0,a5 + 30026de: bc929073 csrw 0xbc9,t0 + break; + 30026e2: aac5 j 30028d2 + case 10: /* GROUP10 */ + SET_LOCAL_INTER_NUM_PRI(10, interPriNum, prior); + 30026e4: bca027f3 csrr a5,0xbca + 30026e8: fcf42223 sw a5,-60(s0) + 30026ec: fc442783 lw a5,-60(s0) + 30026f0: fcf42023 sw a5,-64(s0) + 30026f4: fa842783 lw a5,-88(s0) + 30026f8: 078a slli a5,a5,0x2 + 30026fa: 8bf1 andi a5,a5,28 + 30026fc: 473d li a4,15 + 30026fe: 00f717b3 sll a5,a4,a5 + 3002702: fff7c793 not a5,a5 + 3002706: fc042703 lw a4,-64(s0) + 300270a: 8ff9 and a5,a5,a4 + 300270c: fcf42023 sw a5,-64(s0) + 3002710: fa842783 lw a5,-88(s0) + 3002714: 078a slli a5,a5,0x2 + 3002716: 8bf1 andi a5,a5,28 + 3002718: fa442703 lw a4,-92(s0) + 300271c: 00f717b3 sll a5,a4,a5 + 3002720: fc042703 lw a4,-64(s0) + 3002724: 8fd9 or a5,a5,a4 + 3002726: fcf42023 sw a5,-64(s0) + 300272a: fc042783 lw a5,-64(s0) + 300272e: 82be mv t0,a5 + 3002730: bca29073 csrw 0xbca,t0 + break; + 3002734: aa79 j 30028d2 + case 11: /* GROUP11 */ + SET_LOCAL_INTER_NUM_PRI(11, interPriNum, prior); + 3002736: bcb027f3 csrr a5,0xbcb + 300273a: fcf42623 sw a5,-52(s0) + 300273e: fcc42783 lw a5,-52(s0) + 3002742: fcf42423 sw a5,-56(s0) + 3002746: fa842783 lw a5,-88(s0) + 300274a: 078a slli a5,a5,0x2 + 300274c: 8bf1 andi a5,a5,28 + 300274e: 473d li a4,15 + 3002750: 00f717b3 sll a5,a4,a5 + 3002754: fff7c793 not a5,a5 + 3002758: fc842703 lw a4,-56(s0) + 300275c: 8ff9 and a5,a5,a4 + 300275e: fcf42423 sw a5,-56(s0) + 3002762: fa842783 lw a5,-88(s0) + 3002766: 078a slli a5,a5,0x2 + 3002768: 8bf1 andi a5,a5,28 + 300276a: fa442703 lw a4,-92(s0) + 300276e: 00f717b3 sll a5,a4,a5 + 3002772: fc842703 lw a4,-56(s0) + 3002776: 8fd9 or a5,a5,a4 + 3002778: fcf42423 sw a5,-56(s0) + 300277c: fc842783 lw a5,-56(s0) + 3002780: 82be mv t0,a5 + 3002782: bcb29073 csrw 0xbcb,t0 + break; + 3002786: a2b1 j 30028d2 + case 12: /* GROUP12 */ + SET_LOCAL_INTER_NUM_PRI(12, interPriNum, prior); + 3002788: bcc027f3 csrr a5,0xbcc + 300278c: fcf42a23 sw a5,-44(s0) + 3002790: fd442783 lw a5,-44(s0) + 3002794: fcf42823 sw a5,-48(s0) + 3002798: fa842783 lw a5,-88(s0) + 300279c: 078a slli a5,a5,0x2 + 300279e: 8bf1 andi a5,a5,28 + 30027a0: 473d li a4,15 + 30027a2: 00f717b3 sll a5,a4,a5 + 30027a6: fff7c793 not a5,a5 + 30027aa: fd042703 lw a4,-48(s0) + 30027ae: 8ff9 and a5,a5,a4 + 30027b0: fcf42823 sw a5,-48(s0) + 30027b4: fa842783 lw a5,-88(s0) + 30027b8: 078a slli a5,a5,0x2 + 30027ba: 8bf1 andi a5,a5,28 + 30027bc: fa442703 lw a4,-92(s0) + 30027c0: 00f717b3 sll a5,a4,a5 + 30027c4: fd042703 lw a4,-48(s0) + 30027c8: 8fd9 or a5,a5,a4 + 30027ca: fcf42823 sw a5,-48(s0) + 30027ce: fd042783 lw a5,-48(s0) + 30027d2: 82be mv t0,a5 + 30027d4: bcc29073 csrw 0xbcc,t0 + break; + 30027d8: a8ed j 30028d2 + case 13: /* GROUP13 */ + SET_LOCAL_INTER_NUM_PRI(13, interPriNum, prior); + 30027da: bcd027f3 csrr a5,0xbcd + 30027de: fcf42e23 sw a5,-36(s0) + 30027e2: fdc42783 lw a5,-36(s0) + 30027e6: fcf42c23 sw a5,-40(s0) + 30027ea: fa842783 lw a5,-88(s0) + 30027ee: 078a slli a5,a5,0x2 + 30027f0: 8bf1 andi a5,a5,28 + 30027f2: 473d li a4,15 + 30027f4: 00f717b3 sll a5,a4,a5 + 30027f8: fff7c793 not a5,a5 + 30027fc: fd842703 lw a4,-40(s0) + 3002800: 8ff9 and a5,a5,a4 + 3002802: fcf42c23 sw a5,-40(s0) + 3002806: fa842783 lw a5,-88(s0) + 300280a: 078a slli a5,a5,0x2 + 300280c: 8bf1 andi a5,a5,28 + 300280e: fa442703 lw a4,-92(s0) + 3002812: 00f717b3 sll a5,a4,a5 + 3002816: fd842703 lw a4,-40(s0) + 300281a: 8fd9 or a5,a5,a4 + 300281c: fcf42c23 sw a5,-40(s0) + 3002820: fd842783 lw a5,-40(s0) + 3002824: 82be mv t0,a5 + 3002826: bcd29073 csrw 0xbcd,t0 + break; + 300282a: a065 j 30028d2 + case 14: /* GROUP14 */ + SET_LOCAL_INTER_NUM_PRI(14, interPriNum, prior); + 300282c: bce027f3 csrr a5,0xbce + 3002830: fef42223 sw a5,-28(s0) + 3002834: fe442783 lw a5,-28(s0) + 3002838: fef42023 sw a5,-32(s0) + 300283c: fa842783 lw a5,-88(s0) + 3002840: 078a slli a5,a5,0x2 + 3002842: 8bf1 andi a5,a5,28 + 3002844: 473d li a4,15 + 3002846: 00f717b3 sll a5,a4,a5 + 300284a: fff7c793 not a5,a5 + 300284e: fe042703 lw a4,-32(s0) + 3002852: 8ff9 and a5,a5,a4 + 3002854: fef42023 sw a5,-32(s0) + 3002858: fa842783 lw a5,-88(s0) + 300285c: 078a slli a5,a5,0x2 + 300285e: 8bf1 andi a5,a5,28 + 3002860: fa442703 lw a4,-92(s0) + 3002864: 00f717b3 sll a5,a4,a5 + 3002868: fe042703 lw a4,-32(s0) + 300286c: 8fd9 or a5,a5,a4 + 300286e: fef42023 sw a5,-32(s0) + 3002872: fe042783 lw a5,-32(s0) + 3002876: 82be mv t0,a5 + 3002878: bce29073 csrw 0xbce,t0 + break; + 300287c: a899 j 30028d2 + case 15: /* GROUP15 */ + SET_LOCAL_INTER_NUM_PRI(15, interPriNum, prior); + 300287e: bcf027f3 csrr a5,0xbcf + 3002882: fef42623 sw a5,-20(s0) + 3002886: fec42783 lw a5,-20(s0) + 300288a: fef42423 sw a5,-24(s0) + 300288e: fa842783 lw a5,-88(s0) + 3002892: 078a slli a5,a5,0x2 + 3002894: 8bf1 andi a5,a5,28 + 3002896: 473d li a4,15 + 3002898: 00f717b3 sll a5,a4,a5 + 300289c: fff7c793 not a5,a5 + 30028a0: fe842703 lw a4,-24(s0) + 30028a4: 8ff9 and a5,a5,a4 + 30028a6: fef42423 sw a5,-24(s0) + 30028aa: fa842783 lw a5,-88(s0) + 30028ae: 078a slli a5,a5,0x2 + 30028b0: 8bf1 andi a5,a5,28 + 30028b2: fa442703 lw a4,-92(s0) + 30028b6: 00f717b3 sll a5,a4,a5 + 30028ba: fe842703 lw a4,-24(s0) + 30028be: 8fd9 or a5,a5,a4 + 30028c0: fef42423 sw a5,-24(s0) + 30028c4: fe842783 lw a5,-24(s0) + 30028c8: 82be mv t0,a5 + 30028ca: bcf29073 csrw 0xbcf,t0 + break; + 30028ce: a011 j 30028d2 + default: + break; + 30028d0: 0001 nop + } +} + 30028d2: 0001 nop + 30028d4: 4476 lw s0,92(sp) + 30028d6: 6125 addi sp,sp,96 + 30028d8: 8082 ret + +030028da : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior Priority of this local interrupt to be set. + * @retval None. + */ +static void IRQ_SetLocalPriority(unsigned int interPriNum, unsigned int prior) +{ + 30028da: 7159 addi sp,sp,-112 + 30028dc: d686 sw ra,108(sp) + 30028de: d4a2 sw s0,104(sp) + 30028e0: 1880 addi s0,sp,112 + 30028e2: f8a42e23 sw a0,-100(s0) + 30028e6: f8b42c23 sw a1,-104(s0) +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + RISCV_PRIV_MODE_SWITCH(priv); + unsigned int intNum = GET_LOCAL_INTER_CONFIGREG_NUM(interPriNum); + 30028ea: f9c42783 lw a5,-100(s0) + 30028ee: 838d srli a5,a5,0x3 + 30028f0: fef42623 sw a5,-20(s0) + switch (intNum) { + 30028f4: fec42703 lw a4,-20(s0) + 30028f8: 479d li a5,7 + 30028fa: 2ae7e563 bltu a5,a4,3002ba4 + 30028fe: fec42783 lw a5,-20(s0) + 3002902: 00279713 slli a4,a5,0x2 + 3002906: 030077b7 lui a5,0x3007 + 300290a: 86878793 addi a5,a5,-1944 # 3006868 + 300290e: 97ba add a5,a5,a4 + 3002910: 439c lw a5,0(a5) + 3002912: 8782 jr a5 + case 0: /* GROUP0 */ + SET_LOCAL_INTER_NUM_PRI(0, interPriNum, prior); + 3002914: bc0027f3 csrr a5,0xbc0 + 3002918: faf42823 sw a5,-80(s0) + 300291c: fb042783 lw a5,-80(s0) + 3002920: faf42623 sw a5,-84(s0) + 3002924: f9c42783 lw a5,-100(s0) + 3002928: 078a slli a5,a5,0x2 + 300292a: 8bf1 andi a5,a5,28 + 300292c: 473d li a4,15 + 300292e: 00f717b3 sll a5,a4,a5 + 3002932: fff7c793 not a5,a5 + 3002936: fac42703 lw a4,-84(s0) + 300293a: 8ff9 and a5,a5,a4 + 300293c: faf42623 sw a5,-84(s0) + 3002940: f9c42783 lw a5,-100(s0) + 3002944: 078a slli a5,a5,0x2 + 3002946: 8bf1 andi a5,a5,28 + 3002948: f9842703 lw a4,-104(s0) + 300294c: 00f717b3 sll a5,a4,a5 + 3002950: fac42703 lw a4,-84(s0) + 3002954: 8fd9 or a5,a5,a4 + 3002956: faf42623 sw a5,-84(s0) + 300295a: fac42783 lw a5,-84(s0) + 300295e: 82be mv t0,a5 + 3002960: bc029073 csrw 0xbc0,t0 + break; + 3002964: ac81 j 3002bb4 + case 1: /* GROUP1 */ + SET_LOCAL_INTER_NUM_PRI(1, interPriNum, prior); + 3002966: bc1027f3 csrr a5,0xbc1 + 300296a: faf42c23 sw a5,-72(s0) + 300296e: fb842783 lw a5,-72(s0) + 3002972: faf42a23 sw a5,-76(s0) + 3002976: f9c42783 lw a5,-100(s0) + 300297a: 078a slli a5,a5,0x2 + 300297c: 8bf1 andi a5,a5,28 + 300297e: 473d li a4,15 + 3002980: 00f717b3 sll a5,a4,a5 + 3002984: fff7c793 not a5,a5 + 3002988: fb442703 lw a4,-76(s0) + 300298c: 8ff9 and a5,a5,a4 + 300298e: faf42a23 sw a5,-76(s0) + 3002992: f9c42783 lw a5,-100(s0) + 3002996: 078a slli a5,a5,0x2 + 3002998: 8bf1 andi a5,a5,28 + 300299a: f9842703 lw a4,-104(s0) + 300299e: 00f717b3 sll a5,a4,a5 + 30029a2: fb442703 lw a4,-76(s0) + 30029a6: 8fd9 or a5,a5,a4 + 30029a8: faf42a23 sw a5,-76(s0) + 30029ac: fb442783 lw a5,-76(s0) + 30029b0: 82be mv t0,a5 + 30029b2: bc129073 csrw 0xbc1,t0 + break; + 30029b6: aafd j 3002bb4 + case 2: /* GROUP2 */ + SET_LOCAL_INTER_NUM_PRI(2, interPriNum, prior); + 30029b8: bc2027f3 csrr a5,0xbc2 + 30029bc: fcf42023 sw a5,-64(s0) + 30029c0: fc042783 lw a5,-64(s0) + 30029c4: faf42e23 sw a5,-68(s0) + 30029c8: f9c42783 lw a5,-100(s0) + 30029cc: 078a slli a5,a5,0x2 + 30029ce: 8bf1 andi a5,a5,28 + 30029d0: 473d li a4,15 + 30029d2: 00f717b3 sll a5,a4,a5 + 30029d6: fff7c793 not a5,a5 + 30029da: fbc42703 lw a4,-68(s0) + 30029de: 8ff9 and a5,a5,a4 + 30029e0: faf42e23 sw a5,-68(s0) + 30029e4: f9c42783 lw a5,-100(s0) + 30029e8: 078a slli a5,a5,0x2 + 30029ea: 8bf1 andi a5,a5,28 + 30029ec: f9842703 lw a4,-104(s0) + 30029f0: 00f717b3 sll a5,a4,a5 + 30029f4: fbc42703 lw a4,-68(s0) + 30029f8: 8fd9 or a5,a5,a4 + 30029fa: faf42e23 sw a5,-68(s0) + 30029fe: fbc42783 lw a5,-68(s0) + 3002a02: 82be mv t0,a5 + 3002a04: bc229073 csrw 0xbc2,t0 + break; + 3002a08: a275 j 3002bb4 + case 3: /* GROUP3 */ + SET_LOCAL_INTER_NUM_PRI(3, interPriNum, prior); + 3002a0a: bc3027f3 csrr a5,0xbc3 + 3002a0e: fcf42423 sw a5,-56(s0) + 3002a12: fc842783 lw a5,-56(s0) + 3002a16: fcf42223 sw a5,-60(s0) + 3002a1a: f9c42783 lw a5,-100(s0) + 3002a1e: 078a slli a5,a5,0x2 + 3002a20: 8bf1 andi a5,a5,28 + 3002a22: 473d li a4,15 + 3002a24: 00f717b3 sll a5,a4,a5 + 3002a28: fff7c793 not a5,a5 + 3002a2c: fc442703 lw a4,-60(s0) + 3002a30: 8ff9 and a5,a5,a4 + 3002a32: fcf42223 sw a5,-60(s0) + 3002a36: f9c42783 lw a5,-100(s0) + 3002a3a: 078a slli a5,a5,0x2 + 3002a3c: 8bf1 andi a5,a5,28 + 3002a3e: f9842703 lw a4,-104(s0) + 3002a42: 00f717b3 sll a5,a4,a5 + 3002a46: fc442703 lw a4,-60(s0) + 3002a4a: 8fd9 or a5,a5,a4 + 3002a4c: fcf42223 sw a5,-60(s0) + 3002a50: fc442783 lw a5,-60(s0) + 3002a54: 82be mv t0,a5 + 3002a56: bc329073 csrw 0xbc3,t0 + break; + 3002a5a: aaa9 j 3002bb4 + case 4: /* GROUP4 */ + SET_LOCAL_INTER_NUM_PRI(4, interPriNum, prior); + 3002a5c: bc4027f3 csrr a5,0xbc4 + 3002a60: fcf42823 sw a5,-48(s0) + 3002a64: fd042783 lw a5,-48(s0) + 3002a68: fcf42623 sw a5,-52(s0) + 3002a6c: f9c42783 lw a5,-100(s0) + 3002a70: 078a slli a5,a5,0x2 + 3002a72: 8bf1 andi a5,a5,28 + 3002a74: 473d li a4,15 + 3002a76: 00f717b3 sll a5,a4,a5 + 3002a7a: fff7c793 not a5,a5 + 3002a7e: fcc42703 lw a4,-52(s0) + 3002a82: 8ff9 and a5,a5,a4 + 3002a84: fcf42623 sw a5,-52(s0) + 3002a88: f9c42783 lw a5,-100(s0) + 3002a8c: 078a slli a5,a5,0x2 + 3002a8e: 8bf1 andi a5,a5,28 + 3002a90: f9842703 lw a4,-104(s0) + 3002a94: 00f717b3 sll a5,a4,a5 + 3002a98: fcc42703 lw a4,-52(s0) + 3002a9c: 8fd9 or a5,a5,a4 + 3002a9e: fcf42623 sw a5,-52(s0) + 3002aa2: fcc42783 lw a5,-52(s0) + 3002aa6: 82be mv t0,a5 + 3002aa8: bc429073 csrw 0xbc4,t0 + break; + 3002aac: a221 j 3002bb4 + case 5: /* GROUP5 */ + SET_LOCAL_INTER_NUM_PRI(5, interPriNum, prior); + 3002aae: bc5027f3 csrr a5,0xbc5 + 3002ab2: fcf42c23 sw a5,-40(s0) + 3002ab6: fd842783 lw a5,-40(s0) + 3002aba: fcf42a23 sw a5,-44(s0) + 3002abe: f9c42783 lw a5,-100(s0) + 3002ac2: 078a slli a5,a5,0x2 + 3002ac4: 8bf1 andi a5,a5,28 + 3002ac6: 473d li a4,15 + 3002ac8: 00f717b3 sll a5,a4,a5 + 3002acc: fff7c793 not a5,a5 + 3002ad0: fd442703 lw a4,-44(s0) + 3002ad4: 8ff9 and a5,a5,a4 + 3002ad6: fcf42a23 sw a5,-44(s0) + 3002ada: f9c42783 lw a5,-100(s0) + 3002ade: 078a slli a5,a5,0x2 + 3002ae0: 8bf1 andi a5,a5,28 + 3002ae2: f9842703 lw a4,-104(s0) + 3002ae6: 00f717b3 sll a5,a4,a5 + 3002aea: fd442703 lw a4,-44(s0) + 3002aee: 8fd9 or a5,a5,a4 + 3002af0: fcf42a23 sw a5,-44(s0) + 3002af4: fd442783 lw a5,-44(s0) + 3002af8: 82be mv t0,a5 + 3002afa: bc529073 csrw 0xbc5,t0 + break; + 3002afe: a85d j 3002bb4 + case 6: /* GROUP6 */ + SET_LOCAL_INTER_NUM_PRI(6, interPriNum, prior); + 3002b00: bc6027f3 csrr a5,0xbc6 + 3002b04: fef42023 sw a5,-32(s0) + 3002b08: fe042783 lw a5,-32(s0) + 3002b0c: fcf42e23 sw a5,-36(s0) + 3002b10: f9c42783 lw a5,-100(s0) + 3002b14: 078a slli a5,a5,0x2 + 3002b16: 8bf1 andi a5,a5,28 + 3002b18: 473d li a4,15 + 3002b1a: 00f717b3 sll a5,a4,a5 + 3002b1e: fff7c793 not a5,a5 + 3002b22: fdc42703 lw a4,-36(s0) + 3002b26: 8ff9 and a5,a5,a4 + 3002b28: fcf42e23 sw a5,-36(s0) + 3002b2c: f9c42783 lw a5,-100(s0) + 3002b30: 078a slli a5,a5,0x2 + 3002b32: 8bf1 andi a5,a5,28 + 3002b34: f9842703 lw a4,-104(s0) + 3002b38: 00f717b3 sll a5,a4,a5 + 3002b3c: fdc42703 lw a4,-36(s0) + 3002b40: 8fd9 or a5,a5,a4 + 3002b42: fcf42e23 sw a5,-36(s0) + 3002b46: fdc42783 lw a5,-36(s0) + 3002b4a: 82be mv t0,a5 + 3002b4c: bc629073 csrw 0xbc6,t0 + break; + 3002b50: a095 j 3002bb4 + case 7: /* GROUP7 */ + SET_LOCAL_INTER_NUM_PRI(7, interPriNum, prior); + 3002b52: bc7027f3 csrr a5,0xbc7 + 3002b56: fef42423 sw a5,-24(s0) + 3002b5a: fe842783 lw a5,-24(s0) + 3002b5e: fef42223 sw a5,-28(s0) + 3002b62: f9c42783 lw a5,-100(s0) + 3002b66: 078a slli a5,a5,0x2 + 3002b68: 8bf1 andi a5,a5,28 + 3002b6a: 473d li a4,15 + 3002b6c: 00f717b3 sll a5,a4,a5 + 3002b70: fff7c793 not a5,a5 + 3002b74: fe442703 lw a4,-28(s0) + 3002b78: 8ff9 and a5,a5,a4 + 3002b7a: fef42223 sw a5,-28(s0) + 3002b7e: f9c42783 lw a5,-100(s0) + 3002b82: 078a slli a5,a5,0x2 + 3002b84: 8bf1 andi a5,a5,28 + 3002b86: f9842703 lw a4,-104(s0) + 3002b8a: 00f717b3 sll a5,a4,a5 + 3002b8e: fe442703 lw a4,-28(s0) + 3002b92: 8fd9 or a5,a5,a4 + 3002b94: fef42223 sw a5,-28(s0) + 3002b98: fe442783 lw a5,-28(s0) + 3002b9c: 82be mv t0,a5 + 3002b9e: bc729073 csrw 0xbc7,t0 + break; + 3002ba2: a809 j 3002bb4 + default: + SetLocalIntNumPri(intNum, interPriNum, prior); + 3002ba4: f9842603 lw a2,-104(s0) + 3002ba8: f9c42583 lw a1,-100(s0) + 3002bac: fec42503 lw a0,-20(s0) + 3002bb0: 3485 jal ra,3002610 + break; + 3002bb2: 0001 nop + } + RISCV_PRIV_MODE_SWITCH(priv); +} + 3002bb4: 0001 nop + 3002bb6: 50b6 lw ra,108(sp) + 3002bb8: 5426 lw s0,104(sp) + 3002bba: 6165 addi sp,sp,112 + 3002bbc: 8082 ret + +03002bbe : + * @param irqNum External interrupt number. + * @param priority. + * @retval IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_PRIORITY_INVALID or BASE_STATUS_OK. + */ +unsigned int IRQ_SetPriority(unsigned int irqNum, unsigned int priority) +{ + 3002bbe: 1101 addi sp,sp,-32 + 3002bc0: ce06 sw ra,28(sp) + 3002bc2: cc22 sw s0,24(sp) + 3002bc4: 1000 addi s0,sp,32 + 3002bc6: fea42623 sw a0,-20(s0) + 3002bca: feb42423 sw a1,-24(s0) + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 3002bce: fec42703 lw a4,-20(s0) + 3002bd2: 47e5 li a5,25 + 3002bd4: 00e7f863 bgeu a5,a4,3002be4 + 3002bd8: fec42703 lw a4,-20(s0) + 3002bdc: 07200793 li a5,114 + 3002be0: 00e7fb63 bgeu a5,a4,3002bf6 + 3002be4: 18c00593 li a1,396 + 3002be8: 030077b7 lui a5,0x3007 + 3002bec: 82878513 addi a0,a5,-2008 # 3006828 + 3002bf0: 21bd jal ra,300305e + 3002bf2: 4789 li a5,2 + 3002bf4: a815 j 3002c28 + INTERRUPT_PARAM_CHECK_WITH_RET((priority >= IRQ_PRIO_LOWEST && priority <= IRQ_PRIO_HIGHEST), \ + 3002bf6: fe842783 lw a5,-24(s0) + 3002bfa: c791 beqz a5,3002c06 + 3002bfc: fe842703 lw a4,-24(s0) + 3002c00: 47bd li a5,15 + 3002c02: 00e7fb63 bgeu a5,a4,3002c18 + 3002c06: 18d00593 li a1,397 + 3002c0a: 030077b7 lui a5,0x3007 + 3002c0e: 82878513 addi a0,a5,-2008 # 3006828 + 3002c12: 21b1 jal ra,300305e + 3002c14: 4795 li a5,5 + 3002c16: a809 j 3002c28 + IRQ_ERRNO_PRIORITY_INVALID); + + /* The locipri register is specifically used to configure the priority of the + external non-standard interrupts of the CPU, so the number of internal + standard interrupts should be subtracted */ + IRQ_SetLocalPriority(irqNum - IRQ_VECTOR_CNT, priority); + 3002c18: fec42783 lw a5,-20(s0) + 3002c1c: 1799 addi a5,a5,-26 + 3002c1e: fe842583 lw a1,-24(s0) + 3002c22: 853e mv a0,a5 + 3002c24: 395d jal ra,30028da + + return BASE_STATUS_OK; + 3002c26: 4781 li a5,0 +} + 3002c28: 853e mv a0,a5 + 3002c2a: 40f2 lw ra,28(sp) + 3002c2c: 4462 lw s0,24(sp) + 3002c2e: 6105 addi sp,sp,32 + 3002c30: 8082 ret + +03002c32 : + * @brief Interrupt dummy handler + * @param arg Not used + * @retval None. + */ +static void IRQ_DummyHandler(void *arg) +{ + 3002c32: 1101 addi sp,sp,-32 + 3002c34: ce22 sw s0,28(sp) + 3002c36: 1000 addi s0,sp,32 + 3002c38: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(arg); +} + 3002c3c: 0001 nop + 3002c3e: 4472 lw s0,28(sp) + 3002c40: 6105 addi sp,sp,32 + 3002c42: 8082 ret + +03002c44 : + * @param func callback function + * @param arg callback arg + * @retval None. + */ +static inline void IRQ_SetCallBack(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 3002c44: 1101 addi sp,sp,-32 + 3002c46: ce22 sw s0,28(sp) + 3002c48: 1000 addi s0,sp,32 + 3002c4a: fea42623 sw a0,-20(s0) + 3002c4e: feb42423 sw a1,-24(s0) + 3002c52: fec42223 sw a2,-28(s0) + g_irqCallbackFunc[irqNum].param = arg; + 3002c56: 040007b7 lui a5,0x4000 + 3002c5a: 0fc78713 addi a4,a5,252 # 40000fc + 3002c5e: fec42783 lw a5,-20(s0) + 3002c62: 078e slli a5,a5,0x3 + 3002c64: 97ba add a5,a5,a4 + 3002c66: fe442703 lw a4,-28(s0) + 3002c6a: c3d8 sw a4,4(a5) + g_irqCallbackFunc[irqNum].pfnHandler = func; + 3002c6c: 040007b7 lui a5,0x4000 + 3002c70: 0fc78713 addi a4,a5,252 # 40000fc + 3002c74: fec42783 lw a5,-20(s0) + 3002c78: 078e slli a5,a5,0x3 + 3002c7a: 97ba add a5,a5,a4 + 3002c7c: fe842703 lw a4,-24(s0) + 3002c80: c398 sw a4,0(a5) +} + 3002c82: 0001 nop + 3002c84: 4472 lw s0,28(sp) + 3002c86: 6105 addi sp,sp,32 + 3002c88: 8082 ret + +03002c8a : + * @brief Set the write protection for CRG-related registers disable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionDisable(void) +{ + 3002c8a: 1141 addi sp,sp,-16 + 3002c8c: c622 sw s0,12(sp) + 3002c8e: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = (SYSCTRL0->SC_LOCKEN.reg & SC_LOCKEN_CRG_DISABLE_MASK) + SC_LOCKEN_VALID_HIGH_BIT; + 3002c90: 101007b7 lui a5,0x10100 + 3002c94: 43f8 lw a4,68(a5) + 3002c96: 67c1 lui a5,0x10 + 3002c98: 17f9 addi a5,a5,-2 # fffe + 3002c9a: 00f776b3 and a3,a4,a5 + 3002c9e: 101007b7 lui a5,0x10100 + 3002ca2: ea510737 lui a4,0xea510 + 3002ca6: 9736 add a4,a4,a3 + 3002ca8: c3f8 sw a4,68(a5) +} + 3002caa: 0001 nop + 3002cac: 4432 lw s0,12(sp) + 3002cae: 0141 addi sp,sp,16 + 3002cb0: 8082 ret + +03002cb2 : + * @brief Set the Set the write protection for CRG-related registers enable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionEnable(void) +{ + 3002cb2: 1141 addi sp,sp,-16 + 3002cb4: c622 sw s0,12(sp) + 3002cb6: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = ((SYSCTRL0->SC_LOCKEN.reg & SC_LOW_BIT_MASK) | SC_LOCKEN_CRG_ENABLE_MASK) + + 3002cb8: 101007b7 lui a5,0x10100 + 3002cbc: 43f8 lw a4,68(a5) + 3002cbe: 67c1 lui a5,0x10 + 3002cc0: 17fd addi a5,a5,-1 # ffff + 3002cc2: 8ff9 and a5,a5,a4 + 3002cc4: 0017e693 ori a3,a5,1 + 3002cc8: 101007b7 lui a5,0x10100 + 3002ccc: ea510737 lui a4,0xea510 + 3002cd0: 9736 add a4,a4,a3 + 3002cd2: c3f8 sw a4,68(a5) + SC_LOCKEN_VALID_HIGH_BIT; +} + 3002cd4: 0001 nop + 3002cd6: 4432 lw s0,12(sp) + 3002cd8: 0141 addi sp,sp,16 + 3002cda: 8082 ret + +03002cdc : + * @param clkSelect pll_ref_cksel + * @retval true + * @retval false + */ +static inline bool IsCrgPllRefClkSelect(CRG_PllRefClkSelect clkSelect) +{ + 3002cdc: 1101 addi sp,sp,-32 + 3002cde: ce22 sw s0,28(sp) + 3002ce0: 1000 addi s0,sp,32 + 3002ce2: fea42623 sw a0,-20(s0) + return ((clkSelect == CRG_PLL_REF_CLK_SELECT_HOSC) || + 3002ce6: fec42783 lw a5,-20(s0) + 3002cea: c791 beqz a5,3002cf6 + 3002cec: fec42703 lw a4,-20(s0) + 3002cf0: 4785 li a5,1 + 3002cf2: 00f71463 bne a4,a5,3002cfa + 3002cf6: 4785 li a5,1 + 3002cf8: a011 j 3002cfc + 3002cfa: 4781 li a5,0 + 3002cfc: 8b85 andi a5,a5,1 + 3002cfe: 9f81 uxtb a5 + (clkSelect == CRG_PLL_REF_CLK_SELECT_XTAL)); +} + 3002d00: 853e mv a0,a5 + 3002d02: 4472 lw s0,28(sp) + 3002d04: 6105 addi sp,sp,32 + 3002d06: 8082 ret + +03002d08 : + * @param preDiv pll prediv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPreDiv(CRG_PllPreDiv preDiv) +{ + 3002d08: 1101 addi sp,sp,-32 + 3002d0a: ce22 sw s0,28(sp) + 3002d0c: 1000 addi s0,sp,32 + 3002d0e: fea42623 sw a0,-20(s0) + return ((preDiv >= CRG_PLL_PREDIV_1) && + 3002d12: fec42783 lw a5,-20(s0) + 3002d16: 0087b793 sltiu a5,a5,8 + 3002d1a: 9f81 uxtb a5 + (preDiv <= CRG_PLL_PREDIV_8)); +} + 3002d1c: 853e mv a0,a5 + 3002d1e: 4472 lw s0,28(sp) + 3002d20: 6105 addi sp,sp,32 + 3002d22: 8082 ret + +03002d24 : + * @param postDiv pll_postdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv(CRG_PllPostDiv postDiv) +{ + 3002d24: 1101 addi sp,sp,-32 + 3002d26: ce22 sw s0,28(sp) + 3002d28: 1000 addi s0,sp,32 + 3002d2a: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV_1) && + 3002d2e: fec42783 lw a5,-20(s0) + 3002d32: 0087b793 sltiu a5,a5,8 + 3002d36: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV_8)); +} + 3002d38: 853e mv a0,a5 + 3002d3a: 4472 lw s0,28(sp) + 3002d3c: 6105 addi sp,sp,32 + 3002d3e: 8082 ret + +03002d40 : + * @param postDiv pll_postdiv2 value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv2(CRG_PllPostDiv2 postDiv) +{ + 3002d40: 1101 addi sp,sp,-32 + 3002d42: ce22 sw s0,28(sp) + 3002d44: 1000 addi s0,sp,32 + 3002d46: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV2_1) && + 3002d4a: fec42783 lw a5,-20(s0) + 3002d4e: 0087b793 sltiu a5,a5,8 + 3002d52: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV2_8_MAX)); +} + 3002d54: 853e mv a0,a5 + 3002d56: 4472 lw s0,28(sp) + 3002d58: 6105 addi sp,sp,32 + 3002d5a: 8082 ret + +03002d5c : + * @param fbDiv pll fbdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllFbDiv(unsigned int fbDiv) +{ + 3002d5c: 1101 addi sp,sp,-32 + 3002d5e: ce22 sw s0,28(sp) + 3002d60: 1000 addi s0,sp,32 + 3002d62: fea42623 sw a0,-20(s0) + return (fbDiv <= CRG_PLL_FBDIV_MAX); + 3002d66: fec42783 lw a5,-20(s0) + 3002d6a: 0807b793 sltiu a5,a5,128 + 3002d6e: 9f81 uxtb a5 +} + 3002d70: 853e mv a0,a5 + 3002d72: 4472 lw s0,28(sp) + 3002d74: 6105 addi sp,sp,32 + 3002d76: 8082 ret + +03002d78 : + * @param select core_cksel value + * @retval true + * @retval false + */ +static inline bool IsCrgCoreCkSel(CRG_CoreClkSelect select) +{ + 3002d78: 1101 addi sp,sp,-32 + 3002d7a: ce22 sw s0,28(sp) + 3002d7c: 1000 addi s0,sp,32 + 3002d7e: fea42623 sw a0,-20(s0) + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002d82: fec42783 lw a5,-20(s0) + 3002d86: cb99 beqz a5,3002d9c + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + 3002d88: fec42703 lw a4,-20(s0) + 3002d8c: 4785 li a5,1 + 3002d8e: 00f70763 beq a4,a5,3002d9c + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002d92: fec42703 lw a4,-20(s0) + 3002d96: 4789 li a5,2 + 3002d98: 00f71463 bne a4,a5,3002da0 + 3002d9c: 4785 li a5,1 + 3002d9e: a011 j 3002da2 + 3002da0: 4781 li a5,0 + 3002da2: 8b85 andi a5,a5,1 + 3002da4: 9f81 uxtb a5 + (select == CRG_CORE_CLK_SELECT_PLL)); +} + 3002da6: 853e mv a0,a5 + 3002da8: 4472 lw s0,28(sp) + 3002daa: 6105 addi sp,sp,32 + 3002dac: 8082 ret + +03002dae : + * @param select 1M clock selection + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkSel(CRG_1MClkSelect select) +{ + 3002dae: 1101 addi sp,sp,-32 + 3002db0: ce22 sw s0,28(sp) + 3002db2: 1000 addi s0,sp,32 + 3002db4: fea42623 sw a0,-20(s0) + return ((select == CRG_1M_CLK_SELECT_HOSC) || + 3002db8: fec42783 lw a5,-20(s0) + 3002dbc: c791 beqz a5,3002dc8 + 3002dbe: fec42703 lw a4,-20(s0) + 3002dc2: 4785 li a5,1 + 3002dc4: 00f71463 bne a4,a5,3002dcc + 3002dc8: 4785 li a5,1 + 3002dca: a011 j 3002dce + 3002dcc: 4781 li a5,0 + 3002dce: 8b85 andi a5,a5,1 + 3002dd0: 9f81 uxtb a5 + (select == CRG_1M_CLK_SELECT_TCXO)); +} + 3002dd2: 853e mv a0,a5 + 3002dd4: 4472 lw s0,28(sp) + 3002dd6: 6105 addi sp,sp,32 + 3002dd8: 8082 ret + +03002dda : + * @param div 1M clock ratio + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkDiv(unsigned int div) +{ + 3002dda: 1101 addi sp,sp,-32 + 3002ddc: ce22 sw s0,28(sp) + 3002dde: 1000 addi s0,sp,32 + 3002de0: fea42623 sw a0,-20(s0) + return (div <= CRG_1MHZ_CLK_MAX_DIV); + 3002de4: fec42783 lw a5,-20(s0) + 3002de8: 0407b793 sltiu a5,a5,64 + 3002dec: 9f81 uxtb a5 +} + 3002dee: 853e mv a0,a5 + 3002df0: 4472 lw s0,28(sp) + 3002df2: 6105 addi sp,sp,32 + 3002df4: 8082 ret + +03002df6 : + * @param preDiv PLL Previous Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPreDiv(unsigned int pllRefFreq, unsigned int preDiv) +{ + 3002df6: 7179 addi sp,sp,-48 + 3002df8: d622 sw s0,44(sp) + 3002dfa: 1800 addi s0,sp,48 + 3002dfc: fca42e23 sw a0,-36(s0) + 3002e00: fcb42c23 sw a1,-40(s0) + unsigned int freq = pllRefFreq; + 3002e04: fdc42783 lw a5,-36(s0) + 3002e08: fef42623 sw a5,-20(s0) + if (preDiv != 0) { + 3002e0c: fd842783 lw a5,-40(s0) + 3002e10: cb89 beqz a5,3002e22 + freq /= preDiv; + 3002e12: fec42703 lw a4,-20(s0) + 3002e16: fd842783 lw a5,-40(s0) + 3002e1a: 02f757b3 divu a5,a4,a5 + 3002e1e: fef42623 sw a5,-20(s0) + } + return (freq >= CRG_CLK_PFD_MIN_FREQ) && (freq <= CRG_CLK_PFD_MAX_FREQ); + 3002e22: fec42703 lw a4,-20(s0) + 3002e26: 003d17b7 lui a5,0x3d1 + 3002e2a: 8ff78793 addi a5,a5,-1793 # 3d08ff + 3002e2e: 00e7fc63 bgeu a5,a4,3002e46 + 3002e32: fec42703 lw a4,-20(s0) + 3002e36: 007277b7 lui a5,0x727 + 3002e3a: 0e078793 addi a5,a5,224 # 7270e0 + 3002e3e: 00e7e463 bltu a5,a4,3002e46 + 3002e42: 4785 li a5,1 + 3002e44: a011 j 3002e48 + 3002e46: 4781 li a5,0 + 3002e48: 8b85 andi a5,a5,1 + 3002e4a: 9f81 uxtb a5 +} + 3002e4c: 853e mv a0,a5 + 3002e4e: 5432 lw s0,44(sp) + 3002e50: 6145 addi sp,sp,48 + 3002e52: 8082 ret + +03002e54 : + * @param fdDiv PLL FD Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidFdDiv(unsigned int clkPfdFreq, unsigned int fdDiv) +{ + 3002e54: 7179 addi sp,sp,-48 + 3002e56: d622 sw s0,44(sp) + 3002e58: 1800 addi s0,sp,48 + 3002e5a: fca42e23 sw a0,-36(s0) + 3002e5e: fcb42c23 sw a1,-40(s0) + if (clkPfdFreq > 30000000U) { /* The maximum speed of the external clock source is 30000000U. */ + 3002e62: fdc42703 lw a4,-36(s0) + 3002e66: 01c9c7b7 lui a5,0x1c9c + 3002e6a: 38078793 addi a5,a5,896 # 1c9c380 + 3002e6e: 00e7f463 bgeu a5,a4,3002e76 + return false; + 3002e72: 4781 li a5,0 + 3002e74: a08d j 3002ed6 + } else if (fdDiv > CRG_PLL_FBDIV_MAX) { + 3002e76: fd842703 lw a4,-40(s0) + 3002e7a: 07f00793 li a5,127 + 3002e7e: 00e7f463 bgeu a5,a4,3002e86 + return false; + 3002e82: 4781 li a5,0 + 3002e84: a889 j 3002ed6 + } + + unsigned int freq = (fdDiv > 0x6) ? (clkPfdFreq * fdDiv) : (clkPfdFreq * 0x6); /* 0x0-0x6: divided by 0x6 */ + 3002e86: fd842703 lw a4,-40(s0) + 3002e8a: 4799 li a5,6 + 3002e8c: 00e7f963 bgeu a5,a4,3002e9e + 3002e90: fdc42703 lw a4,-36(s0) + 3002e94: fd842783 lw a5,-40(s0) + 3002e98: 02f707b3 mul a5,a4,a5 + 3002e9c: a031 j 3002ea8 + 3002e9e: fdc42703 lw a4,-36(s0) + 3002ea2: 4799 li a5,6 + 3002ea4: 02f707b3 mul a5,a4,a5 + 3002ea8: fef42623 sw a5,-20(s0) + return (freq >= CRG_CLK_VCO_MIN_FREQ) && (freq <= CRG_CLK_VCO_MAX_FREQ); + 3002eac: fec42703 lw a4,-20(s0) + 3002eb0: 05f5e7b7 lui a5,0x5f5e + 3002eb4: 0ff78793 addi a5,a5,255 # 5f5e0ff + 3002eb8: 00e7fc63 bgeu a5,a4,3002ed0 + 3002ebc: fec42703 lw a4,-20(s0) + 3002ec0: 11e1a7b7 lui a5,0x11e1a + 3002ec4: 30078793 addi a5,a5,768 # 11e1a300 + 3002ec8: 00e7e463 bltu a5,a4,3002ed0 + 3002ecc: 4785 li a5,1 + 3002ece: a011 j 3002ed2 + 3002ed0: 4781 li a5,0 + 3002ed2: 8b85 andi a5,a5,1 + 3002ed4: 9f81 uxtb a5 +} + 3002ed6: 853e mv a0,a5 + 3002ed8: 5432 lw s0,44(sp) + 3002eda: 6145 addi sp,sp,48 + 3002edc: 8082 ret + +03002ede : + * @param postDiv PLL Post Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv(unsigned int clkVcoFreq, unsigned int postDiv) +{ + 3002ede: 7179 addi sp,sp,-48 + 3002ee0: d622 sw s0,44(sp) + 3002ee2: 1800 addi s0,sp,48 + 3002ee4: fca42e23 sw a0,-36(s0) + 3002ee8: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002eec: fdc42783 lw a5,-36(s0) + 3002ef0: fef42623 sw a5,-20(s0) + if (postDiv != 0) { + 3002ef4: fd842783 lw a5,-40(s0) + 3002ef8: cb91 beqz a5,3002f0c + freq /= (postDiv + 1); + 3002efa: fd842783 lw a5,-40(s0) + 3002efe: 0785 addi a5,a5,1 + 3002f00: fec42703 lw a4,-20(s0) + 3002f04: 02f757b3 divu a5,a4,a5 + 3002f08: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_TARGET_MAX_FREQ); + 3002f0c: fec42703 lw a4,-20(s0) + 3002f10: 08f0d7b7 lui a5,0x8f0d + 3002f14: 18178793 addi a5,a5,385 # 8f0d181 + 3002f18: 00f737b3 sltu a5,a4,a5 + 3002f1c: 9f81 uxtb a5 +} + 3002f1e: 853e mv a0,a5 + 3002f20: 5432 lw s0,44(sp) + 3002f22: 6145 addi sp,sp,48 + 3002f24: 8082 ret + +03002f26 : + * @param postDiv2 PLL Post Divsion2 + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv2(unsigned int clkVcoFreq, unsigned int postDiv2) +{ + 3002f26: 7179 addi sp,sp,-48 + 3002f28: d622 sw s0,44(sp) + 3002f2a: 1800 addi s0,sp,48 + 3002f2c: fca42e23 sw a0,-36(s0) + 3002f30: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002f34: fdc42783 lw a5,-36(s0) + 3002f38: fef42623 sw a5,-20(s0) + if (postDiv2 != 0) { + 3002f3c: fd842783 lw a5,-40(s0) + 3002f40: cb91 beqz a5,3002f54 + freq /= (postDiv2 + 1); + 3002f42: fd842783 lw a5,-40(s0) + 3002f46: 0785 addi a5,a5,1 + 3002f48: fec42703 lw a4,-20(s0) + 3002f4c: 02f757b3 divu a5,a4,a5 + 3002f50: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_PST2_MAX_FREQ); + 3002f54: fec42703 lw a4,-20(s0) + 3002f58: 05f5e7b7 lui a5,0x5f5e + 3002f5c: 10178793 addi a5,a5,257 # 5f5e101 + 3002f60: 00f737b3 sltu a5,a4,a5 + 3002f64: 9f81 uxtb a5 +} + 3002f66: 853e mv a0,a5 + 3002f68: 5432 lw s0,44(sp) + 3002f6a: 6145 addi sp,sp,48 + 3002f6c: 8082 ret + +03002f6e : + * @param adcClkSelect the value of adc clock select + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkModeSelect(CRG_AdcClkSelect adcClkSelect) +{ + 3002f6e: 1101 addi sp,sp,-32 + 3002f70: ce22 sw s0,28(sp) + 3002f72: 1000 addi s0,sp,32 + 3002f74: fea42623 sw a0,-20(s0) + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002f78: fec42783 lw a5,-20(s0) + 3002f7c: c385 beqz a5,3002f9c + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + 3002f7e: fec42703 lw a4,-20(s0) + 3002f82: 4785 li a5,1 + 3002f84: 00f70c63 beq a4,a5,3002f9c + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + 3002f88: fec42703 lw a4,-20(s0) + 3002f8c: 4789 li a5,2 + 3002f8e: 00f70763 beq a4,a5,3002f9c + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002f92: fec42703 lw a4,-20(s0) + 3002f96: 478d li a5,3 + 3002f98: 00f71463 bne a4,a5,3002fa0 + 3002f9c: 4785 li a5,1 + 3002f9e: a011 j 3002fa2 + 3002fa0: 4781 li a5,0 + 3002fa2: 8b85 andi a5,a5,1 + 3002fa4: 9f81 uxtb a5 + adcClkSelect == CRG_ADC_CLK_SYN_CORE); +} + 3002fa6: 853e mv a0,a5 + 3002fa8: 4472 lw s0,28(sp) + 3002faa: 6105 addi sp,sp,32 + 3002fac: 8082 ret + +03002fae : + * @param div the value of adc clock div + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkDiv(CRG_AdcDiv div) +{ + 3002fae: 1101 addi sp,sp,-32 + 3002fb0: ce22 sw s0,28(sp) + 3002fb2: 1000 addi s0,sp,32 + 3002fb4: fea42623 sw a0,-20(s0) + return (div == CRG_ADC_DIV_1 || \ + div == CRG_ADC_DIV_2 || \ + div == CRG_ADC_DIV_3 || \ + 3002fb8: fec42783 lw a5,-20(s0) + 3002fbc: c385 beqz a5,3002fdc + return (div == CRG_ADC_DIV_1 || \ + 3002fbe: fec42703 lw a4,-20(s0) + 3002fc2: 4785 li a5,1 + 3002fc4: 00f70c63 beq a4,a5,3002fdc + div == CRG_ADC_DIV_2 || \ + 3002fc8: fec42703 lw a4,-20(s0) + 3002fcc: 4789 li a5,2 + 3002fce: 00f70763 beq a4,a5,3002fdc + div == CRG_ADC_DIV_3 || \ + 3002fd2: fec42703 lw a4,-20(s0) + 3002fd6: 478d li a5,3 + 3002fd8: 00f71463 bne a4,a5,3002fe0 + 3002fdc: 4785 li a5,1 + 3002fde: a011 j 3002fe2 + 3002fe0: 4781 li a5,0 + 3002fe2: 8b85 andi a5,a5,1 + 3002fe4: 9f81 uxtb a5 + div == CRG_ADC_DIV_4); +} + 3002fe6: 853e mv a0,a5 + 3002fe8: 4472 lw s0,28(sp) + 3002fea: 6105 addi sp,sp,32 + 3002fec: 8082 ret + +03002fee : + * @param clk Clock register base address + * @param select Core clock selection + * @retval None + */ +static inline void DCL_CRG_SetCoreClkSel(CRG_RegStruct *clk, CRG_CoreClkSelect select) +{ + 3002fee: 1101 addi sp,sp,-32 + 3002ff0: ce06 sw ra,28(sp) + 3002ff2: cc22 sw s0,24(sp) + 3002ff4: 1000 addi s0,sp,32 + 3002ff6: fea42623 sw a0,-20(s0) + 3002ffa: feb42423 sw a1,-24(s0) + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + 3002ffe: fec42703 lw a4,-20(s0) + 3003002: 100007b7 lui a5,0x10000 + 3003006: 00f70a63 beq a4,a5,300301a + 300300a: 64b00593 li a1,1611 + 300300e: 030077b7 lui a5,0x3007 + 3003012: 88878513 addi a0,a5,-1912 # 3006888 + 3003016: 20a1 jal ra,300305e + 3003018: a001 j 3003018 + CRG_PARAM_CHECK_NO_RET(IsCrgCoreCkSel(select)); + 300301a: fe842503 lw a0,-24(s0) + 300301e: 3ba9 jal ra,3002d78 + 3003020: 87aa mv a5,a0 + 3003022: 0017c793 xori a5,a5,1 + 3003026: 9f81 uxtb a5 + 3003028: cb89 beqz a5,300303a + 300302a: 64c00593 li a1,1612 + 300302e: 030077b7 lui a5,0x3007 + 3003032: 88878513 addi a0,a5,-1912 # 3006888 + 3003036: 2025 jal ra,300305e + 3003038: a839 j 3003056 + clk->PERI_CRG64.BIT.clk_pst1_sw_sel = select; + 300303a: fe842783 lw a5,-24(s0) + 300303e: 8b8d andi a5,a5,3 + 3003040: 0ff7f693 andi a3,a5,255 + 3003044: fec42703 lw a4,-20(s0) + 3003048: 10072783 lw a5,256(a4) # ea510100 + 300304c: 8a8d andi a3,a3,3 + 300304e: 9bf1 andi a5,a5,-4 + 3003050: 8fd5 or a5,a5,a3 + 3003052: 10f72023 sw a5,256(a4) +} + 3003056: 40f2 lw ra,28(sp) + 3003058: 4462 lw s0,24(sp) + 300305a: 6105 addi sp,sp,32 + 300305c: 8082 ret + +0300305e : + 300305e: 988ff06f j 30021e6 + +03003062 : + * @param handle CRG Handle + * @retval BASE_STATUS_ERROR Parameter Check fail + * @retval BASE_STATUS_OK Success + */ +BASE_StatusType HAL_CRG_Init(const CRG_Handle *handle) +{ + 3003062: 7179 addi sp,sp,-48 + 3003064: d606 sw ra,44(sp) + 3003066: d422 sw s0,40(sp) + 3003068: 1800 addi s0,sp,48 + 300306a: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != NULL); + 300306e: fdc42783 lw a5,-36(s0) + 3003072: eb89 bnez a5,3003084 + 3003074: 07100593 li a1,113 + 3003078: 030077b7 lui a5,0x3007 + 300307c: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003080: 3ff9 jal ra,300305e + 3003082: a001 j 3003082 + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3003084: fdc42783 lw a5,-36(s0) + 3003088: 4398 lw a4,0(a5) + 300308a: 100007b7 lui a5,0x10000 + 300308e: 00f70a63 beq a4,a5,30030a2 + 3003092: 07200593 li a1,114 + 3003096: 030077b7 lui a5,0x3007 + 300309a: 8a478513 addi a0,a5,-1884 # 30068a4 + 300309e: 37c1 jal ra,300305e + 30030a0: a001 j 30030a0 + /* Check the validity of PLL-related parameters. */ + CRG_PARAM_CHECK_WITH_RET(IsCrgPllRefClkSelect(handle->pllRefClkSelect), BASE_STATUS_ERROR); + 30030a2: fdc42783 lw a5,-36(s0) + 30030a6: 43dc lw a5,4(a5) + 30030a8: 853e mv a0,a5 + 30030aa: 390d jal ra,3002cdc + 30030ac: 87aa mv a5,a0 + 30030ae: 0017c793 xori a5,a5,1 + 30030b2: 9f81 uxtb a5 + 30030b4: cb91 beqz a5,30030c8 + 30030b6: 07400593 li a1,116 + 30030ba: 030077b7 lui a5,0x3007 + 30030be: 8a478513 addi a0,a5,-1884 # 30068a4 + 30030c2: 3f71 jal ra,300305e + 30030c4: 4785 li a5,1 + 30030c6: aca9 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPreDiv(handle->pllPreDiv), BASE_STATUS_ERROR); + 30030c8: fdc42783 lw a5,-36(s0) + 30030cc: 479c lw a5,8(a5) + 30030ce: 853e mv a0,a5 + 30030d0: 3925 jal ra,3002d08 + 30030d2: 87aa mv a5,a0 + 30030d4: 0017c793 xori a5,a5,1 + 30030d8: 9f81 uxtb a5 + 30030da: cb91 beqz a5,30030ee + 30030dc: 07500593 li a1,117 + 30030e0: 030077b7 lui a5,0x3007 + 30030e4: 8a478513 addi a0,a5,-1884 # 30068a4 + 30030e8: 3f9d jal ra,300305e + 30030ea: 4785 li a5,1 + 30030ec: ac15 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllFbDiv(handle->pllFbDiv), BASE_STATUS_ERROR); + 30030ee: fdc42783 lw a5,-36(s0) + 30030f2: 47dc lw a5,12(a5) + 30030f4: 853e mv a0,a5 + 30030f6: 319d jal ra,3002d5c + 30030f8: 87aa mv a5,a0 + 30030fa: 0017c793 xori a5,a5,1 + 30030fe: 9f81 uxtb a5 + 3003100: cb91 beqz a5,3003114 + 3003102: 07600593 li a1,118 + 3003106: 030077b7 lui a5,0x3007 + 300310a: 8a478513 addi a0,a5,-1884 # 30068a4 + 300310e: 3f81 jal ra,300305e + 3003110: 4785 li a5,1 + 3003112: a439 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv(handle->pllPostDiv), BASE_STATUS_ERROR); + 3003114: fdc42783 lw a5,-36(s0) + 3003118: 4b9c lw a5,16(a5) + 300311a: 853e mv a0,a5 + 300311c: 3121 jal ra,3002d24 + 300311e: 87aa mv a5,a0 + 3003120: 0017c793 xori a5,a5,1 + 3003124: 9f81 uxtb a5 + 3003126: cb91 beqz a5,300313a + 3003128: 07700593 li a1,119 + 300312c: 030077b7 lui a5,0x3007 + 3003130: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003134: 372d jal ra,300305e + 3003136: 4785 li a5,1 + 3003138: a2e5 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv2(handle->handleEx.pllPostDiv2), BASE_STATUS_ERROR); + 300313a: fdc42783 lw a5,-36(s0) + 300313e: 4fdc lw a5,28(a5) + 3003140: 853e mv a0,a5 + 3003142: 3efd jal ra,3002d40 + 3003144: 87aa mv a5,a0 + 3003146: 0017c793 xori a5,a5,1 + 300314a: 9f81 uxtb a5 + 300314c: cb91 beqz a5,3003160 + 300314e: 07800593 li a1,120 + 3003152: 030077b7 lui a5,0x3007 + 3003156: 8a478513 addi a0,a5,-1884 # 30068a4 + 300315a: 3711 jal ra,300305e + 300315c: 4785 li a5,1 + 300315e: a2c9 j 3003320 + /* Check the Clock Source and Frequency Divider of the 1 MHz Clock. */ + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkSel(handle->handleEx.clk1MSelect), BASE_STATUS_ERROR); + 3003160: fdc42783 lw a5,-36(s0) + 3003164: 539c lw a5,32(a5) + 3003166: 853e mv a0,a5 + 3003168: 3199 jal ra,3002dae + 300316a: 87aa mv a5,a0 + 300316c: 0017c793 xori a5,a5,1 + 3003170: 9f81 uxtb a5 + 3003172: cb91 beqz a5,3003186 + 3003174: 07a00593 li a1,122 + 3003178: 030077b7 lui a5,0x3007 + 300317c: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003180: 3df9 jal ra,300305e + 3003182: 4785 li a5,1 + 3003184: aa71 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkDiv(handle->handleEx.clk1MDiv), BASE_STATUS_ERROR); + 3003186: fdc42783 lw a5,-36(s0) + 300318a: 53dc lw a5,36(a5) + 300318c: 853e mv a0,a5 + 300318e: 31b1 jal ra,3002dda + 3003190: 87aa mv a5,a0 + 3003192: 0017c793 xori a5,a5,1 + 3003196: 9f81 uxtb a5 + 3003198: cb91 beqz a5,30031ac + 300319a: 07b00593 li a1,123 + 300319e: 030077b7 lui a5,0x3007 + 30031a2: 8a478513 addi a0,a5,-1884 # 30068a4 + 30031a6: 3d65 jal ra,300305e + 30031a8: 4785 li a5,1 + 30031aa: aa9d j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 30031ac: fdc42783 lw a5,-36(s0) + 30031b0: 4f9c lw a5,24(a5) + 30031b2: 853e mv a0,a5 + 30031b4: 36d1 jal ra,3002d78 + 30031b6: 87aa mv a5,a0 + 30031b8: 0017c793 xori a5,a5,1 + 30031bc: 9f81 uxtb a5 + 30031be: cb91 beqz a5,30031d2 + 30031c0: 07c00593 li a1,124 + 30031c4: 030077b7 lui a5,0x3007 + 30031c8: 8a478513 addi a0,a5,-1884 # 30068a4 + 30031cc: 3d49 jal ra,300305e + 30031ce: 4785 li a5,1 + 30031d0: aa81 j 3003320 + + *(unsigned int *)CRG_HOSC_CTRL2_ADDR = 0x306E; /* Optimized HOSC temperature drift performance parameter. */ + 30031d2: 100017b7 lui a5,0x10001 + 30031d6: f0478793 addi a5,a5,-252 # 10000f04 + 30031da: 670d lui a4,0x3 + 30031dc: 06e70713 addi a4,a4,110 # 306e + 30031e0: c398 sw a4,0(a5) + + CRG_RegStruct *reg = handle->baseAddress; + 30031e2: fdc42783 lw a5,-36(s0) + 30031e6: 439c lw a5,0(a5) + 30031e8: fef42623 sw a5,-20(s0) + g_crgBaseAddr = (void *)reg; + 30031ec: 040007b7 lui a5,0x4000 + 30031f0: fec42703 lw a4,-20(s0) + 30031f4: 48e7aa23 sw a4,1172(a5) # 4000494 + /* Check the validity of the PLL parameter configuration. */ + if (CRG_IsValidPllConfig(handle) != BASE_STATUS_OK) { + 30031f8: fdc42503 lw a0,-36(s0) + 30031fc: 7a4000ef jal ra,30039a0 + 3003200: 87aa mv a5,a0 + 3003202: c399 beqz a5,3003208 + return BASE_STATUS_ERROR; + 3003204: 4785 li a5,1 + 3003206: aa29 j 3003320 + } + /* Disable the write protection function of the CRG register. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3003208: 3449 jal ra,3002c8a + + reg->PERI_CRG0.BIT.pll_ref_cksel = handle->pllRefClkSelect; + 300320a: fdc42783 lw a5,-36(s0) + 300320e: 43dc lw a5,4(a5) + 3003210: 8b85 andi a5,a5,1 + 3003212: 0ff7f693 andi a3,a5,255 + 3003216: fec42703 lw a4,-20(s0) + 300321a: 431c lw a5,0(a4) + 300321c: 8a85 andi a3,a3,1 + 300321e: 9bf9 andi a5,a5,-2 + 3003220: 8fd5 or a5,a5,a3 + 3003222: c31c sw a5,0(a4) + reg->PERI_CRG1.BIT.pll_prediv = handle->pllPreDiv; + 3003224: fdc42783 lw a5,-36(s0) + 3003228: 479c lw a5,8(a5) + 300322a: 8bbd andi a5,a5,15 + 300322c: 0ff7f693 andi a3,a5,255 + 3003230: fec42703 lw a4,-20(s0) + 3003234: 435c lw a5,4(a4) + 3003236: 8abd andi a3,a3,15 + 3003238: 9bc1 andi a5,a5,-16 + 300323a: 8fd5 or a5,a5,a3 + 300323c: c35c sw a5,4(a4) + reg->PERI_CRG2.BIT.pll_fbdiv = handle->pllFbDiv; + 300323e: fdc42783 lw a5,-36(s0) + 3003242: 47dc lw a5,12(a5) + 3003244: 0ff7f693 andi a3,a5,255 + 3003248: fec42703 lw a4,-20(s0) + 300324c: 471c lw a5,8(a4) + 300324e: 0ff6f693 andi a3,a3,255 + 3003252: f007f793 andi a5,a5,-256 + 3003256: 8fd5 or a5,a5,a3 + 3003258: c71c sw a5,8(a4) + reg->PERI_CRG3.BIT.pll_postdiv1 = handle->pllPostDiv; + 300325a: fdc42783 lw a5,-36(s0) + 300325e: 4b9c lw a5,16(a5) + 3003260: 8bbd andi a5,a5,15 + 3003262: 0ff7f693 andi a3,a5,255 + 3003266: fec42703 lw a4,-20(s0) + 300326a: 475c lw a5,12(a4) + 300326c: 8abd andi a3,a3,15 + 300326e: 9bc1 andi a5,a5,-16 + 3003270: 8fd5 or a5,a5,a3 + 3003272: c75c sw a5,12(a4) + reg->PERI_CRG3.BIT.pll_postdiv2 = handle->handleEx.pllPostDiv2; + 3003274: fdc42783 lw a5,-36(s0) + 3003278: 4fdc lw a5,28(a5) + 300327a: 8bbd andi a5,a5,15 + 300327c: 0ff7f693 andi a3,a5,255 + 3003280: fec42703 lw a4,-20(s0) + 3003284: 475c lw a5,12(a4) + 3003286: 8abd andi a3,a3,15 + 3003288: 0692 slli a3,a3,0x4 + 300328a: f0f7f793 andi a5,a5,-241 + 300328e: 8fd5 or a5,a5,a3 + 3003290: c75c sw a5,12(a4) + reg->PERI_CRG4.BIT.pll_pd = BASE_CFG_UNSET; + 3003292: fec42703 lw a4,-20(s0) + 3003296: 4b1c lw a5,16(a4) + 3003298: 9bf9 andi a5,a5,-2 + 300329a: cb1c sw a5,16(a4) + + while (reg->PERI_CRG7.BIT.pll_lock != BASE_CFG_SET) { + 300329c: 0001 nop + 300329e: fec42783 lw a5,-20(s0) + 30032a2: 4fdc lw a5,28(a5) + 30032a4: 8b85 andi a5,a5,1 + 30032a6: 0ff7f713 andi a4,a5,255 + 30032aa: 4785 li a5,1 + 30032ac: fef719e3 bne a4,a5,300329e + ; /* Wait for PLL to lock */ + } + + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 30032b0: 3409 jal ra,3002cb2 + /* Check the 1MHz clock parameter configuration. */ + if (CRG_IsValid1MHzConfig(handle) != BASE_STATUS_OK) { + 30032b2: fdc42503 lw a0,-36(s0) + 30032b6: 7ac000ef jal ra,3003a62 + 30032ba: 87aa mv a5,a0 + 30032bc: c399 beqz a5,30032c2 + return BASE_STATUS_ERROR; + 30032be: 4785 li a5,1 + 30032c0: a085 j 3003320 + } + while (reg->HOSC_LOCK.BIT.hosc_lock != BASE_CFG_SET) { + 30032c2: 0001 nop + 30032c4: fec42703 lw a4,-20(s0) + 30032c8: 6785 lui a5,0x1 + 30032ca: 97ba add a5,a5,a4 + 30032cc: f107a783 lw a5,-240(a5) # f10 + 30032d0: 8b85 andi a5,a5,1 + 30032d2: 0ff7f713 andi a4,a5,255 + 30032d6: 4785 li a5,1 + 30032d8: fef716e3 bne a4,a5,30032c4 + ; /* Wait for HOSC to lock */ + } + /* Set the Clock Source and Frequency Divider of the 1 MHz Clock. */ + reg->PERI_CRG67.BIT.clk_1m_div = handle->handleEx.clk1MDiv; + 30032dc: fdc42783 lw a5,-36(s0) + 30032e0: 53dc lw a5,36(a5) + 30032e2: 03f7f793 andi a5,a5,63 + 30032e6: 0ff7f693 andi a3,a5,255 + 30032ea: fec42703 lw a4,-20(s0) + 30032ee: 10c72783 lw a5,268(a4) + 30032f2: 03f6f693 andi a3,a3,63 + 30032f6: fc07f793 andi a5,a5,-64 + 30032fa: 8fd5 or a5,a5,a3 + 30032fc: 10f72623 sw a5,268(a4) + reg->PERI_CRG66.BIT.clk_1m_ini_cksel = handle->handleEx.clk1MSelect; + 3003300: fdc42783 lw a5,-36(s0) + 3003304: 539c lw a5,32(a5) + 3003306: 8b85 andi a5,a5,1 + 3003308: 0ff7f693 andi a3,a5,255 + 300330c: fec42703 lw a4,-20(s0) + 3003310: 10872783 lw a5,264(a4) + 3003314: 8a85 andi a3,a3,1 + 3003316: 9bf9 andi a5,a5,-2 + 3003318: 8fd5 or a5,a5,a3 + 300331a: 10f72423 sw a5,264(a4) + return BASE_STATUS_OK; + 300331e: 4781 li a5,0 +} + 3003320: 853e mv a0,a5 + 3003322: 50b2 lw ra,44(sp) + 3003324: 5422 lw s0,40(sp) + 3003326: 6145 addi sp,sp,48 + 3003328: 8082 ret + +0300332a : + * @param handle CRG Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Paramter check fail + */ +BASE_StatusType HAL_CRG_SetCoreClockSelect(CRG_Handle *handle) +{ + 300332a: 7179 addi sp,sp,-48 + 300332c: d606 sw ra,44(sp) + 300332e: d422 sw s0,40(sp) + 3003330: 1800 addi s0,sp,48 + 3003332: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != 0); + 3003336: fdc42783 lw a5,-36(s0) + 300333a: eb89 bnez a5,300334c + 300333c: 10a00593 li a1,266 + 3003340: 030077b7 lui a5,0x3007 + 3003344: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003348: 3b19 jal ra,300305e + 300334a: a001 j 300334a + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 300334c: fdc42783 lw a5,-36(s0) + 3003350: 4398 lw a4,0(a5) + 3003352: 100007b7 lui a5,0x10000 + 3003356: 00f70a63 beq a4,a5,300336a + 300335a: 10b00593 li a1,267 + 300335e: 030077b7 lui a5,0x3007 + 3003362: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003366: 39e5 jal ra,300305e + 3003368: a001 j 3003368 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 300336a: fdc42783 lw a5,-36(s0) + 300336e: 4f9c lw a5,24(a5) + 3003370: 853e mv a0,a5 + 3003372: 3419 jal ra,3002d78 + 3003374: 87aa mv a5,a0 + 3003376: 0017c793 xori a5,a5,1 + 300337a: 9f81 uxtb a5 + 300337c: cb91 beqz a5,3003390 + 300337e: 10c00593 li a1,268 + 3003382: 030077b7 lui a5,0x3007 + 3003386: 8a478513 addi a0,a5,-1884 # 30068a4 + 300338a: 39d1 jal ra,300305e + 300338c: 4785 li a5,1 + 300338e: a005 j 30033ae + + CRG_RegStruct *reg = handle->baseAddress; + 3003390: fdc42783 lw a5,-36(s0) + 3003394: 439c lw a5,0(a5) + 3003396: fef42623 sw a5,-20(s0) + /* The write protection of the CRG register needs to be disabled. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 300339a: 38c5 jal ra,3002c8a + DCL_CRG_SetCoreClkSel(reg, handle->coreClkSelect); + 300339c: fdc42783 lw a5,-36(s0) + 30033a0: 4f9c lw a5,24(a5) + 30033a2: 85be mv a1,a5 + 30033a4: fec42503 lw a0,-20(s0) + 30033a8: 3199 jal ra,3002fee + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 30033aa: 3221 jal ra,3002cb2 + + return BASE_STATUS_OK; + 30033ac: 4781 li a5,0 +} + 30033ae: 853e mv a0,a5 + 30033b0: 50b2 lw ra,44(sp) + 30033b2: 5422 lw s0,40(sp) + 30033b4: 6145 addi sp,sp,48 + 30033b6: 8082 ret + +030033b8 : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +static inline unsigned int CRG_GetVcoFreq(void) +{ + 30033b8: 1101 addi sp,sp,-32 + 30033ba: ce06 sw ra,28(sp) + 30033bc: cc22 sw s0,24(sp) + 30033be: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int regFbdiv; + CRG_RegStruct *crg = g_crgBaseAddr; + 30033c0: 040007b7 lui a5,0x4000 + 30033c4: 4947a783 lw a5,1172(a5) # 4000494 + 30033c8: fef42623 sw a5,-20(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 30033cc: fec42703 lw a4,-20(s0) + 30033d0: 100007b7 lui a5,0x10000 + 30033d4: 00f70a63 beq a4,a5,30033e8 + 30033d8: 12200593 li a1,290 + 30033dc: 030077b7 lui a5,0x3007 + 30033e0: 8a478513 addi a0,a5,-1884 # 30068a4 + 30033e4: 39ad jal ra,300305e + 30033e6: a001 j 30033e6 + CRG_ASSERT_PARAM((XTRAIL_FREQ <= 30000000U)); /* The maximum of the external clock source is 30000000U. */ + + freq = CRG_GetPllRefIni(crg->PERI_CRG0.BIT.pll_ref_cksel); + 30033e8: fec42783 lw a5,-20(s0) + 30033ec: 439c lw a5,0(a5) + 30033ee: 8b85 andi a5,a5,1 + 30033f0: 9f81 uxtb a5 + 30033f2: 853e mv a0,a5 + 30033f4: 25c1 jal ra,3003ab4 + 30033f6: fea42423 sw a0,-24(s0) + freq /= CRG_GetPreDivValue(crg->PERI_CRG1.BIT.pll_prediv); + 30033fa: fec42783 lw a5,-20(s0) + 30033fe: 43dc lw a5,4(a5) + 3003400: 8bbd andi a5,a5,15 + 3003402: 9f81 uxtb a5 + 3003404: 853e mv a0,a5 + 3003406: 2de1 jal ra,3003ade + 3003408: 872a mv a4,a0 + 300340a: fe842783 lw a5,-24(s0) + 300340e: 02e7d7b3 divu a5,a5,a4 + 3003412: fef42423 sw a5,-24(s0) + regFbdiv = CRG_GetPllFbDivValue(crg->PERI_CRG2.BIT.pll_fbdiv); /* Get the value of the fbdiv register. */ + 3003416: fec42783 lw a5,-20(s0) + 300341a: 479c lw a5,8(a5) + 300341c: 9f81 uxtb a5 + 300341e: 853e mv a0,a5 + 3003420: 25f5 jal ra,3003b0c + 3003422: fea42223 sw a0,-28(s0) + freq *= (regFbdiv >= 0x06) ? regFbdiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 3003426: fe442783 lw a5,-28(s0) + 300342a: 4719 li a4,6 + 300342c: 00e7f363 bgeu a5,a4,3003432 + 3003430: 4799 li a5,6 + 3003432: fe842703 lw a4,-24(s0) + 3003436: 02f707b3 mul a5,a4,a5 + 300343a: fef42423 sw a5,-24(s0) + return freq; + 300343e: fe842783 lw a5,-24(s0) +} + 3003442: 853e mv a0,a5 + 3003444: 40f2 lw ra,28(sp) + 3003446: 4462 lw s0,24(sp) + 3003448: 6105 addi sp,sp,32 + 300344a: 8082 ret + +0300344c : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +unsigned int HAL_CRG_GetPllFreq(void) +{ + 300344c: 1101 addi sp,sp,-32 + 300344e: ce06 sw ra,28(sp) + 3003450: cc22 sw s0,24(sp) + 3003452: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int pllPostDivValue; + CRG_RegStruct *crg = g_crgBaseAddr; + 3003454: 040007b7 lui a5,0x4000 + 3003458: 4947a783 lw a5,1172(a5) # 4000494 + 300345c: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003460: fe842703 lw a4,-24(s0) + 3003464: 100007b7 lui a5,0x10000 + 3003468: 00f70a63 beq a4,a5,300347c + 300346c: 13700593 li a1,311 + 3003470: 030077b7 lui a5,0x3007 + 3003474: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003478: 36dd jal ra,300305e + 300347a: a001 j 300347a + freq = CRG_GetVcoFreq(); + 300347c: 3f35 jal ra,30033b8 + 300347e: fea42623 sw a0,-20(s0) + pllPostDivValue = CRG_GetPllPostDivValue((CRG_PllPostDiv)crg->PERI_CRG3.BIT.pll_postdiv1); + 3003482: fe842783 lw a5,-24(s0) + 3003486: 47dc lw a5,12(a5) + 3003488: 8bbd andi a5,a5,15 + 300348a: 9f81 uxtb a5 + 300348c: 853e mv a0,a5 + 300348e: 25c1 jal ra,3003b4e + 3003490: fea42223 sw a0,-28(s0) + /* Calculate the PLL output clock frequency based on the VCO clock frequency and post-division coefficient. */ + if (pllPostDivValue != 0) { + 3003494: fe442783 lw a5,-28(s0) + 3003498: cb89 beqz a5,30034aa + freq /= pllPostDivValue; + 300349a: fec42703 lw a4,-20(s0) + 300349e: fe442783 lw a5,-28(s0) + 30034a2: 02f757b3 divu a5,a4,a5 + 30034a6: fef42623 sw a5,-20(s0) + } + return freq; + 30034aa: fec42783 lw a5,-20(s0) +} + 30034ae: 853e mv a0,a5 + 30034b0: 40f2 lw ra,28(sp) + 30034b2: 4462 lw s0,24(sp) + 30034b4: 6105 addi sp,sp,32 + 30034b6: 8082 ret + +030034b8 : + * @brief Get Core Clock Frequence + * @param None + * @retval unsigned int Core clock frequency + */ +unsigned int HAL_CRG_GetCoreClkFreq(void) +{ + 30034b8: 1101 addi sp,sp,-32 + 30034ba: ce06 sw ra,28(sp) + 30034bc: cc22 sw s0,24(sp) + 30034be: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int coreClkSelect; + CRG_RegStruct *crg = g_crgBaseAddr; + 30034c0: 040007b7 lui a5,0x4000 + 30034c4: 4947a783 lw a5,1172(a5) # 4000494 + 30034c8: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 30034cc: fe842703 lw a4,-24(s0) + 30034d0: 100007b7 lui a5,0x10000 + 30034d4: 00f70a63 beq a4,a5,30034e8 + 30034d8: 14c00593 li a1,332 + 30034dc: 030077b7 lui a5,0x3007 + 30034e0: 8a478513 addi a0,a5,-1884 # 30068a4 + 30034e4: 3ead jal ra,300305e + 30034e6: a001 j 30034e6 + coreClkSelect = crg->PERI_CRG64.BIT.clk_pst1_sw_sel; + 30034e8: fe842783 lw a5,-24(s0) + 30034ec: 1007a783 lw a5,256(a5) + 30034f0: 8b8d andi a5,a5,3 + 30034f2: 9f81 uxtb a5 + 30034f4: fef42223 sw a5,-28(s0) + switch (coreClkSelect) { + 30034f8: fe442783 lw a5,-28(s0) + 30034fc: 4705 li a4,1 + 30034fe: 02e78063 beq a5,a4,300351e + 3003502: 4705 li a4,1 + 3003504: 00e7e663 bltu a5,a4,3003510 + 3003508: 4709 li a4,2 + 300350a: 02e78163 beq a5,a4,300352c + 300350e: a01d j 3003534 + case CRG_CORE_CLK_SELECT_HOSC: /* The clock source is an internal high-speed clock. */ + freq = HOSC_FREQ; + 3003510: 017d87b7 lui a5,0x17d8 + 3003514: 84078793 addi a5,a5,-1984 # 17d7840 + 3003518: fef42623 sw a5,-20(s0) + break; + 300351c: a015 j 3003540 + + case CRG_CORE_CLK_SELECT_TCXO: /* The clock source is the external crystal oscillator clock. */ + freq = XTRAIL_FREQ; + 300351e: 01c9c7b7 lui a5,0x1c9c + 3003522: 38078793 addi a5,a5,896 # 1c9c380 + 3003526: fef42623 sw a5,-20(s0) + break; + 300352a: a819 j 3003540 + + case CRG_CORE_CLK_SELECT_PLL: /* The clock source is the PLL. */ + freq = HAL_CRG_GetPllFreq(); + 300352c: 3705 jal ra,300344c + 300352e: fea42623 sw a0,-20(s0) + break; + 3003532: a039 j 3003540 + + default: + freq = LOSC_FREQ; + 3003534: 67a1 lui a5,0x8 + 3003536: d0078793 addi a5,a5,-768 # 7d00 + 300353a: fef42623 sw a5,-20(s0) + break; + 300353e: 0001 nop + } + return freq; + 3003540: fec42783 lw a5,-20(s0) +} + 3003544: 853e mv a0,a5 + 3003546: 40f2 lw ra,28(sp) + 3003548: 4462 lw s0,24(sp) + 300354a: 6105 addi sp,sp,32 + 300354c: 8082 ret + +0300354e : + * @brief Get Clock Frequence + * @param handle CRG Handle + * @retval Frequece of IP + */ +unsigned int HAL_CRG_GetIpFreq(const void *baseAddress) +{ + 300354e: 7179 addi sp,sp,-48 + 3003550: d606 sw ra,44(sp) + 3003552: d422 sw s0,40(sp) + 3003554: 1800 addi s0,sp,48 + 3003556: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 300355a: fdc42783 lw a5,-36(s0) + 300355e: eb89 bnez a5,3003570 + 3003560: 16900593 li a1,361 + 3003564: 030077b7 lui a5,0x3007 + 3003568: 8a478513 addi a0,a5,-1884 # 30068a4 + 300356c: 3ccd jal ra,300305e + 300356e: a001 j 300356e + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003570: 040007b7 lui a5,0x4000 + 3003574: 4947a703 lw a4,1172(a5) # 4000494 + 3003578: 100007b7 lui a5,0x10000 + 300357c: 00f70a63 beq a4,a5,3003590 + 3003580: 16a00593 li a1,362 + 3003584: 030077b7 lui a5,0x3007 + 3003588: 8a478513 addi a0,a5,-1884 # 30068a4 + 300358c: 3cc9 jal ra,300305e + 300358e: a001 j 300358e +#ifdef FPGA + /* Use this function to obtain the clock frequency during the FPGA phase. */ + return CHIP_GetIpFreqHz(baseAddress); +#else + unsigned int hclk = HAL_CRG_GetCoreClkFreq(); + 3003590: 3725 jal ra,30034b8 + 3003592: fea42423 sw a0,-24(s0) + unsigned int freq = LOSC_FREQ; + 3003596: 67a1 lui a5,0x8 + 3003598: d0078793 addi a5,a5,-768 # 7d00 + 300359c: fef42623 sw a5,-20(s0) + unsigned int coreClkFreq; + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 30035a0: fdc42503 lw a0,-36(s0) + 30035a4: 2cc9 jal ra,3003876 + 30035a6: fea42223 sw a0,-28(s0) + if (p == NULL) { + 30035aa: fe442783 lw a5,-28(s0) + 30035ae: e781 bnez a5,30035b6 + return freq; + 30035b0: fec42783 lw a5,-20(s0) + 30035b4: a895 j 3003628 + } + switch (p->type) { + 30035b6: fe442783 lw a5,-28(s0) + 30035ba: 43dc lw a5,4(a5) + 30035bc: 4715 li a4,5 + 30035be: 04f76a63 bltu a4,a5,3003612 + 30035c2: 00279713 slli a4,a5,0x2 + 30035c6: 030077b7 lui a5,0x3007 + 30035ca: 8e078793 addi a5,a5,-1824 # 30068e0 + 30035ce: 97ba add a5,a5,a4 + 30035d0: 439c lw a5,0(a5) + 30035d2: 8782 jr a5 + case CRG_IP_NONE_CLK_SEL: + case CRG_IP_EFC: + case CRG_IP_ANA: + freq = hclk; /* Returns the internal high speed clock frequency. */ + 30035d4: fe842783 lw a5,-24(s0) + 30035d8: fef42623 sw a5,-20(s0) + break; + 30035dc: a825 j 3003614 + + case CRG_IP_CAN: + freq = CRG_GetPllRefIni(g_crgBaseAddr->PERI_CRG0.BIT.pll_ref_cksel); + 30035de: 040007b7 lui a5,0x4000 + 30035e2: 4947a783 lw a5,1172(a5) # 4000494 + 30035e6: 439c lw a5,0(a5) + 30035e8: 8b85 andi a5,a5,1 + 30035ea: 9f81 uxtb a5 + 30035ec: 853e mv a0,a5 + 30035ee: 21d9 jal ra,3003ab4 + 30035f0: fea42623 sw a0,-20(s0) + break; + 30035f4: a005 j 3003614 + + case CRG_IP_ADC: + /* Get core clock frequence for calculating the ADC clock frequency. */ + coreClkFreq = HAL_CRG_GetCoreClkFreq(); + 30035f6: 35c9 jal ra,30034b8 + 30035f8: fea42023 sw a0,-32(s0) + freq = CRG_GetAdcIpFreq(p, CRG_GetVcoFreq(), coreClkFreq); + 30035fc: 3b75 jal ra,30033b8 + 30035fe: 87aa mv a5,a0 + 3003600: fe042603 lw a2,-32(s0) + 3003604: 85be mv a1,a5 + 3003606: fe442503 lw a0,-28(s0) + 300360a: 2c85 jal ra,300387a + 300360c: fea42623 sw a0,-20(s0) + break; + 3003610: a011 j 3003614 + + case CRG_IP_IWDG: /* The IWDG clock frequency is an internal low-speed clock. */ + default: + break; + 3003612: 0001 nop + } + if (freq == 0) { + 3003614: fec42783 lw a5,-20(s0) + 3003618: e791 bnez a5,3003624 + freq = LOSC_FREQ; + 300361a: 67a1 lui a5,0x8 + 300361c: d0078793 addi a5,a5,-768 # 7d00 + 3003620: fef42623 sw a5,-20(s0) + } + return freq; + 3003624: fec42783 lw a5,-20(s0) +#endif +} + 3003628: 853e mv a0,a5 + 300362a: 50b2 lw ra,44(sp) + 300362c: 5422 lw s0,40(sp) + 300362e: 6145 addi sp,sp,48 + 3003630: 8082 ret + +03003632 : + * @param enable enable mask + * @retval BASE_STATUS_ERROR Can't find the Match or operation is not support + * @retval BASE_STATUS_OK Operation Success + */ +BASE_StatusType HAL_CRG_IpEnableSet(const void *baseAddress, unsigned int enable) +{ + 3003632: 7179 addi sp,sp,-48 + 3003634: d606 sw ra,44(sp) + 3003636: d422 sw s0,40(sp) + 3003638: 1800 addi s0,sp,48 + 300363a: fca42e23 sw a0,-36(s0) + 300363e: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3003642: fdc42783 lw a5,-36(s0) + 3003646: eb89 bnez a5,3003658 + 3003648: 19c00593 li a1,412 + 300364c: 030077b7 lui a5,0x3007 + 3003650: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003654: 3429 jal ra,300305e + 3003656: a001 j 3003656 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003658: 040007b7 lui a5,0x4000 + 300365c: 4947a703 lw a4,1172(a5) # 4000494 + 3003660: 100007b7 lui a5,0x10000 + 3003664: 00f70a63 beq a4,a5,3003678 + 3003668: 19d00593 li a1,413 + 300366c: 030077b7 lui a5,0x3007 + 3003670: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003674: 32ed jal ra,300305e + 3003676: a001 j 3003676 + /* Check the validity of the input parameters. */ + CRG_PARAM_CHECK_WITH_RET((enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE), BASE_STATUS_ERROR); + 3003678: fd842703 lw a4,-40(s0) + 300367c: 4785 li a5,1 + 300367e: 00f70e63 beq a4,a5,300369a + 3003682: fd842783 lw a5,-40(s0) + 3003686: cb91 beqz a5,300369a + 3003688: 19f00593 li a1,415 + 300368c: 030077b7 lui a5,0x3007 + 3003690: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003694: 32e9 jal ra,300305e + 3003696: 4785 li a5,1 + 3003698: a0a5 j 3003700 + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 300369a: fdc42503 lw a0,-36(s0) + 300369e: 2ae1 jal ra,3003876 + 30036a0: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 30036a4: fec42783 lw a5,-20(s0) + 30036a8: c799 beqz a5,30036b6 + 30036aa: fec42783 lw a5,-20(s0) + 30036ae: 43d8 lw a4,4(a5) + 30036b0: 4795 li a5,5 + 30036b2: 00e7f463 bgeu a5,a4,30036ba + return BASE_STATUS_ERROR; + 30036b6: 4785 li a5,1 + 30036b8: a0a1 j 3003700 + } + if (g_ipClkProc[p->type].enableSet == NULL) { + 30036ba: fec42783 lw a5,-20(s0) + 30036be: 43d4 lw a3,4(a5) + 30036c0: 040007b7 lui a5,0x4000 + 30036c4: 02478713 addi a4,a5,36 # 4000024 + 30036c8: 02400793 li a5,36 + 30036cc: 02f687b3 mul a5,a3,a5 + 30036d0: 97ba add a5,a5,a4 + 30036d2: 479c lw a5,8(a5) + 30036d4: e399 bnez a5,30036da + return BASE_STATUS_ERROR; + 30036d6: 4785 li a5,1 + 30036d8: a025 j 3003700 + } + g_ipClkProc[p->type].enableSet(p, enable); + 30036da: fec42783 lw a5,-20(s0) + 30036de: 43d4 lw a3,4(a5) + 30036e0: 040007b7 lui a5,0x4000 + 30036e4: 02478713 addi a4,a5,36 # 4000024 + 30036e8: 02400793 li a5,36 + 30036ec: 02f687b3 mul a5,a3,a5 + 30036f0: 97ba add a5,a5,a4 + 30036f2: 479c lw a5,8(a5) + 30036f4: fd842583 lw a1,-40(s0) + 30036f8: fec42503 lw a0,-20(s0) + 30036fc: 9782 jalr a5 + return BASE_STATUS_OK; + 30036fe: 4781 li a5,0 +} + 3003700: 853e mv a0,a5 + 3003702: 50b2 lw ra,44(sp) + 3003704: 5422 lw s0,40(sp) + 3003706: 6145 addi sp,sp,48 + 3003708: 8082 ret + +0300370a : + * @param select clock select, @see CRG_APBLsClkSelect for ip in apb_ls_subsys or CRG_AdcClkSelect for adc + * @retval BASE_STATUS_OK success + * @retval BASE_STATUS_ERROR fail + */ +BASE_StatusType HAL_CRG_IpClkSelectSet(const void *baseAddress, unsigned int select) +{ + 300370a: 7179 addi sp,sp,-48 + 300370c: d606 sw ra,44(sp) + 300370e: d422 sw s0,40(sp) + 3003710: 1800 addi s0,sp,48 + 3003712: fca42e23 sw a0,-36(s0) + 3003716: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 300371a: fdc42783 lw a5,-36(s0) + 300371e: eb89 bnez a5,3003730 + 3003720: 1cd00593 li a1,461 + 3003724: 030077b7 lui a5,0x3007 + 3003728: 8a478513 addi a0,a5,-1884 # 30068a4 + 300372c: 2d8d jal ra,3003d9e + 300372e: a001 j 300372e + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003730: 040007b7 lui a5,0x4000 + 3003734: 4947a703 lw a4,1172(a5) # 4000494 + 3003738: 100007b7 lui a5,0x10000 + 300373c: 00f70a63 beq a4,a5,3003750 + 3003740: 1ce00593 li a1,462 + 3003744: 030077b7 lui a5,0x3007 + 3003748: 8a478513 addi a0,a5,-1884 # 30068a4 + 300374c: 2d89 jal ra,3003d9e + 300374e: a001 j 300374e + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003750: fdc42503 lw a0,-36(s0) + 3003754: 220d jal ra,3003876 + 3003756: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 300375a: fec42783 lw a5,-20(s0) + 300375e: c799 beqz a5,300376c + 3003760: fec42783 lw a5,-20(s0) + 3003764: 43d8 lw a4,4(a5) + 3003766: 4795 li a5,5 + 3003768: 00e7f463 bgeu a5,a4,3003770 + return BASE_STATUS_ERROR; + 300376c: 4785 li a5,1 + 300376e: a0a1 j 30037b6 + } + if (g_ipClkProc[p->type].clkSelSet == NULL) { + 3003770: fec42783 lw a5,-20(s0) + 3003774: 43d4 lw a3,4(a5) + 3003776: 040007b7 lui a5,0x4000 + 300377a: 02478713 addi a4,a5,36 # 4000024 + 300377e: 02400793 li a5,36 + 3003782: 02f687b3 mul a5,a3,a5 + 3003786: 97ba add a5,a5,a4 + 3003788: 47dc lw a5,12(a5) + 300378a: e399 bnez a5,3003790 + return BASE_STATUS_ERROR; + 300378c: 4785 li a5,1 + 300378e: a025 j 30037b6 + } + g_ipClkProc[p->type].clkSelSet(p, select); /* Clock selection of the configuration module. */ + 3003790: fec42783 lw a5,-20(s0) + 3003794: 43d4 lw a3,4(a5) + 3003796: 040007b7 lui a5,0x4000 + 300379a: 02478713 addi a4,a5,36 # 4000024 + 300379e: 02400793 li a5,36 + 30037a2: 02f687b3 mul a5,a3,a5 + 30037a6: 97ba add a5,a5,a4 + 30037a8: 47dc lw a5,12(a5) + 30037aa: fd842583 lw a1,-40(s0) + 30037ae: fec42503 lw a0,-20(s0) + 30037b2: 9782 jalr a5 + return BASE_STATUS_OK; + 30037b4: 4781 li a5,0 +} + 30037b6: 853e mv a0,a5 + 30037b8: 50b2 lw ra,44(sp) + 30037ba: 5422 lw s0,40(sp) + 30037bc: 6145 addi sp,sp,48 + 30037be: 8082 ret + +030037c0 : + * @param div set div value + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Match Fail or Not support + */ +BASE_StatusType HAL_CRG_IpClkDivSet(const void *baseAddress, unsigned int div) +{ + 30037c0: 7179 addi sp,sp,-48 + 30037c2: d606 sw ra,44(sp) + 30037c4: d422 sw s0,40(sp) + 30037c6: 1800 addi s0,sp,48 + 30037c8: fca42e23 sw a0,-36(s0) + 30037cc: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 30037d0: fdc42783 lw a5,-36(s0) + 30037d4: eb89 bnez a5,30037e6 + 30037d6: 22c00593 li a1,556 + 30037da: 030077b7 lui a5,0x3007 + 30037de: 8a478513 addi a0,a5,-1884 # 30068a4 + 30037e2: 2b75 jal ra,3003d9e + 30037e4: a001 j 30037e4 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30037e6: 040007b7 lui a5,0x4000 + 30037ea: 4947a703 lw a4,1172(a5) # 4000494 + 30037ee: 100007b7 lui a5,0x10000 + 30037f2: 00f70a63 beq a4,a5,3003806 + 30037f6: 22d00593 li a1,557 + 30037fa: 030077b7 lui a5,0x3007 + 30037fe: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003802: 2b71 jal ra,3003d9e + 3003804: a001 j 3003804 + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003806: fdc42503 lw a0,-36(s0) + 300380a: 20b5 jal ra,3003876 + 300380c: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 3003810: fec42783 lw a5,-20(s0) + 3003814: c799 beqz a5,3003822 + 3003816: fec42783 lw a5,-20(s0) + 300381a: 43d8 lw a4,4(a5) + 300381c: 4795 li a5,5 + 300381e: 00e7f463 bgeu a5,a4,3003826 + return BASE_STATUS_ERROR; + 3003822: 4785 li a5,1 + 3003824: a0a1 j 300386c + } + if (g_ipClkProc[p->type].clkDivSet == NULL) { + 3003826: fec42783 lw a5,-20(s0) + 300382a: 43d4 lw a3,4(a5) + 300382c: 040007b7 lui a5,0x4000 + 3003830: 02478713 addi a4,a5,36 # 4000024 + 3003834: 02400793 li a5,36 + 3003838: 02f687b3 mul a5,a3,a5 + 300383c: 97ba add a5,a5,a4 + 300383e: 4b9c lw a5,16(a5) + 3003840: e399 bnez a5,3003846 + return BASE_STATUS_ERROR; + 3003842: 4785 li a5,1 + 3003844: a025 j 300386c + } + g_ipClkProc[p->type].clkDivSet(p, div); /* Configure the clock frequency divider of the module. */ + 3003846: fec42783 lw a5,-20(s0) + 300384a: 43d4 lw a3,4(a5) + 300384c: 040007b7 lui a5,0x4000 + 3003850: 02478713 addi a4,a5,36 # 4000024 + 3003854: 02400793 li a5,36 + 3003858: 02f687b3 mul a5,a3,a5 + 300385c: 97ba add a5,a5,a4 + 300385e: 4b9c lw a5,16(a5) + 3003860: fd842583 lw a1,-40(s0) + 3003864: fec42503 lw a0,-20(s0) + 3003868: 9782 jalr a5 + return BASE_STATUS_OK; + 300386a: 4781 li a5,0 +} + 300386c: 853e mv a0,a5 + 300386e: 50b2 lw ra,44(sp) + 3003870: 5422 lw s0,40(sp) + 3003872: 6145 addi sp,sp,48 + 3003874: 8082 ret + +03003876 : + 3003876: 933fd06f j 30011a8 + +0300387a : + * @param coreClkFreq core clock rate + * @retval Ip Frequence + */ +static unsigned int CRG_GetAdcIpFreq(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int baseClkRate, + unsigned int coreClkFreq) +{ + 300387a: 7139 addi sp,sp,-64 + 300387c: de06 sw ra,60(sp) + 300387e: dc22 sw s0,56(sp) + 3003880: 0080 addi s0,sp,64 + 3003882: fca42623 sw a0,-52(s0) + 3003886: fcb42423 sw a1,-56(s0) + 300388a: fcc42223 sw a2,-60(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300388e: fcc42783 lw a5,-52(s0) + 3003892: eb89 bnez a5,30038a4 + 3003894: 2af00593 li a1,687 + 3003898: 030077b7 lui a5,0x3007 + 300389c: 8a478513 addi a0,a5,-1884 # 30068a4 + 30038a0: 29fd jal ra,3003d9e + 30038a2: a001 j 30038a2 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30038a4: 040007b7 lui a5,0x4000 + 30038a8: 4947a783 lw a5,1172(a5) # 4000494 + 30038ac: eb89 bnez a5,30038be + 30038ae: 2b000593 li a1,688 + 30038b2: 030077b7 lui a5,0x3007 + 30038b6: 8a478513 addi a0,a5,-1884 # 30068a4 + 30038ba: 21d5 jal ra,3003d9e + 30038bc: a001 j 30038bc + + unsigned int clkSel; + unsigned int clkDiv; + unsigned int pst2Div; + unsigned int freq = 0; + 30038be: fe042623 sw zero,-20(s0) + + /* Obtains the clock source selection of the ADC. */ + const CRG_IpProc *proc = &g_ipClkProc[matchInfo->type]; + 30038c2: fcc42783 lw a5,-52(s0) + 30038c6: 43d8 lw a4,4(a5) + 30038c8: 02400793 li a5,36 + 30038cc: 02f70733 mul a4,a4,a5 + 30038d0: 040007b7 lui a5,0x4000 + 30038d4: 02478793 addi a5,a5,36 # 4000024 + 30038d8: 97ba add a5,a5,a4 + 30038da: fef42423 sw a5,-24(s0) + if (proc->clkSelGet == NULL) { + 30038de: fe842783 lw a5,-24(s0) + 30038e2: 4fdc lw a5,28(a5) + 30038e4: e399 bnez a5,30038ea + return 0; + 30038e6: 4781 li a5,0 + 30038e8: a07d j 3003996 + } + clkSel = proc->clkSelGet(matchInfo); + 30038ea: fe842783 lw a5,-24(s0) + 30038ee: 4fdc lw a5,28(a5) + 30038f0: fcc42503 lw a0,-52(s0) + 30038f4: 9782 jalr a5 + 30038f6: fea42223 sw a0,-28(s0) + /* Calculate the frequency from the ADC's clock source. */ + if (clkSel == CRG_ADC_CLK_SYN_CORE) { + 30038fa: fe442703 lw a4,-28(s0) + 30038fe: 478d li a5,3 + 3003900: 00f71763 bne a4,a5,300390e + freq = coreClkFreq; + 3003904: fc442783 lw a5,-60(s0) + 3003908: fef42623 sw a5,-20(s0) + 300390c: a085 j 300396c + } else if (clkSel == CRG_ADC_CLK_ASYN_HOSC) { + 300390e: fe442783 lw a5,-28(s0) + 3003912: eb81 bnez a5,3003922 + freq = HOSC_FREQ; + 3003914: 017d87b7 lui a5,0x17d8 + 3003918: 84078793 addi a5,a5,-1984 # 17d7840 + 300391c: fef42623 sw a5,-20(s0) + 3003920: a0b1 j 300396c + } else if (clkSel == CRG_ADC_CLK_ASYN_TCXO) { + 3003922: fe442703 lw a4,-28(s0) + 3003926: 4785 li a5,1 + 3003928: 00f71963 bne a4,a5,300393a + /* The maximum speed of the external clock source is 30000000U. */ + freq = (XTRAIL_FREQ > 30000000U) ? 0 : XTRAIL_FREQ; + 300392c: 01c9c7b7 lui a5,0x1c9c + 3003930: 38078793 addi a5,a5,896 # 1c9c380 + 3003934: fef42623 sw a5,-20(s0) + 3003938: a815 j 300396c + } else if (clkSel == CRG_ADC_CLK_ASYN_PLL_DIV) { + 300393a: fe442703 lw a4,-28(s0) + 300393e: 4789 li a5,2 + 3003940: 02f71663 bne a4,a5,300396c + pst2Div = CRG_GetPllPostDivValue((CRG_PllPostDiv)g_crgBaseAddr->PERI_CRG3.BIT.pll_postdiv2); + 3003944: 040007b7 lui a5,0x4000 + 3003948: 4947a783 lw a5,1172(a5) # 4000494 + 300394c: 47dc lw a5,12(a5) + 300394e: 8391 srli a5,a5,0x4 + 3003950: 8bbd andi a5,a5,15 + 3003952: 9f81 uxtb a5 + 3003954: 853e mv a0,a5 + 3003956: 2ae5 jal ra,3003b4e + 3003958: fea42023 sw a0,-32(s0) + freq = baseClkRate / pst2Div; + 300395c: fc842703 lw a4,-56(s0) + 3003960: fe042783 lw a5,-32(s0) + 3003964: 02f757b3 divu a5,a4,a5 + 3003968: fef42623 sw a5,-20(s0) + } + + /* Obtain the frequency divider based on the ADC clock source. */ + if (proc->clkDivGet == NULL) { + 300396c: fe842783 lw a5,-24(s0) + 3003970: 539c lw a5,32(a5) + 3003972: e399 bnez a5,3003978 + return 0; + 3003974: 4781 li a5,0 + 3003976: a005 j 3003996 + } + clkDiv = proc->clkDivGet(matchInfo); + 3003978: fe842783 lw a5,-24(s0) + 300397c: 539c lw a5,32(a5) + 300397e: fcc42503 lw a0,-52(s0) + 3003982: 9782 jalr a5 + 3003984: fca42e23 sw a0,-36(s0) + /* Calculate the clock frequency of the ADC. */ + return (freq / (clkDiv + 1)); + 3003988: fdc42783 lw a5,-36(s0) + 300398c: 0785 addi a5,a5,1 + 300398e: fec42703 lw a4,-20(s0) + 3003992: 02f757b3 divu a5,a4,a5 +} + 3003996: 853e mv a0,a5 + 3003998: 50f2 lw ra,60(sp) + 300399a: 5462 lw s0,56(sp) + 300399c: 6121 addi sp,sp,64 + 300399e: 8082 ret + +030039a0 : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValidPllConfig(const CRG_Handle *handle) +{ + 30039a0: 7179 addi sp,sp,-48 + 30039a2: d606 sw ra,44(sp) + 30039a4: d422 sw s0,40(sp) + 30039a6: 1800 addi s0,sp,48 + 30039a8: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + unsigned int freq; + + freq = CRG_GetPllRefIni(handle->pllRefClkSelect); + 30039ac: fdc42783 lw a5,-36(s0) + 30039b0: 43dc lw a5,4(a5) + 30039b2: 853e mv a0,a5 + 30039b4: 2201 jal ra,3003ab4 + 30039b6: fea42623 sw a0,-20(s0) + preDiv = CRG_GetPreDivValue(handle->pllPreDiv); + 30039ba: fdc42783 lw a5,-36(s0) + 30039be: 479c lw a5,8(a5) + 30039c0: 853e mv a0,a5 + 30039c2: 2a31 jal ra,3003ade + 30039c4: fea42423 sw a0,-24(s0) + /* Check the validity of the prescaled clock frequency. */ + if (!IsCrgValidPreDiv(freq, preDiv)) { + 30039c8: fe842583 lw a1,-24(s0) + 30039cc: fec42503 lw a0,-20(s0) + 30039d0: c26ff0ef jal ra,3002df6 + 30039d4: 87aa mv a5,a0 + 30039d6: 0017c793 xori a5,a5,1 + 30039da: 9f81 uxtb a5 + 30039dc: c399 beqz a5,30039e2 + return BASE_STATUS_ERROR; + 30039de: 4785 li a5,1 + 30039e0: a8a5 j 3003a58 + } + freq /= preDiv; + 30039e2: fec42703 lw a4,-20(s0) + 30039e6: fe842783 lw a5,-24(s0) + 30039ea: 02f757b3 divu a5,a4,a5 + 30039ee: fef42623 sw a5,-20(s0) + /* Check the validity of the clock frequency after frequency multiplication. */ + if (!IsCrgValidFdDiv(freq, handle->pllFbDiv)) { + 30039f2: fdc42783 lw a5,-36(s0) + 30039f6: 47dc lw a5,12(a5) + 30039f8: 85be mv a1,a5 + 30039fa: fec42503 lw a0,-20(s0) + 30039fe: c56ff0ef jal ra,3002e54 + 3003a02: 87aa mv a5,a0 + 3003a04: 0017c793 xori a5,a5,1 + 3003a08: 9f81 uxtb a5 + 3003a0a: c399 beqz a5,3003a10 + return BASE_STATUS_ERROR; + 3003a0c: 4785 li a5,1 + 3003a0e: a0a9 j 3003a58 + } + freq *= (handle->pllFbDiv > 0x06) ? handle->pllFbDiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 3003a10: fdc42783 lw a5,-36(s0) + 3003a14: 47dc lw a5,12(a5) + 3003a16: 4719 li a4,6 + 3003a18: 00e7f363 bgeu a5,a4,3003a1e + 3003a1c: 4799 li a5,6 + 3003a1e: fec42703 lw a4,-20(s0) + 3003a22: 02f707b3 mul a5,a4,a5 + 3003a26: fef42623 sw a5,-20(s0) + /* Check whether the PLL output frequency is valid. */ + if (IsCrgValidPostDiv(freq, handle->pllPostDiv) && IsCrgValidPostDiv2(freq, handle->handleEx.pllPostDiv2)) { + 3003a2a: fdc42783 lw a5,-36(s0) + 3003a2e: 4b9c lw a5,16(a5) + 3003a30: 85be mv a1,a5 + 3003a32: fec42503 lw a0,-20(s0) + 3003a36: ca8ff0ef jal ra,3002ede + 3003a3a: 87aa mv a5,a0 + 3003a3c: cf89 beqz a5,3003a56 + 3003a3e: fdc42783 lw a5,-36(s0) + 3003a42: 4fdc lw a5,28(a5) + 3003a44: 85be mv a1,a5 + 3003a46: fec42503 lw a0,-20(s0) + 3003a4a: cdcff0ef jal ra,3002f26 + 3003a4e: 87aa mv a5,a0 + 3003a50: c399 beqz a5,3003a56 + return BASE_STATUS_OK; + 3003a52: 4781 li a5,0 + 3003a54: a011 j 3003a58 + } + return BASE_STATUS_ERROR; + 3003a56: 4785 li a5,1 +} + 3003a58: 853e mv a0,a5 + 3003a5a: 50b2 lw ra,44(sp) + 3003a5c: 5422 lw s0,40(sp) + 3003a5e: 6145 addi sp,sp,48 + 3003a60: 8082 ret + +03003a62 : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValid1MHzConfig(const CRG_Handle *handle) +{ + 3003a62: 7179 addi sp,sp,-48 + 3003a64: d622 sw s0,44(sp) + 3003a66: 1800 addi s0,sp,48 + 3003a68: fca42e23 sw a0,-36(s0) + unsigned int freq; + /* Get the ref frequency of the 1 MHz clock. */ + freq = (handle->handleEx.clk1MSelect == CRG_1M_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003a6c: fdc42783 lw a5,-36(s0) + 3003a70: 539c lw a5,32(a5) + 3003a72: e791 bnez a5,3003a7e + 3003a74: 017d87b7 lui a5,0x17d8 + 3003a78: 84078793 addi a5,a5,-1984 # 17d7840 + 3003a7c: a029 j 3003a86 + 3003a7e: 01c9c7b7 lui a5,0x1c9c + 3003a82: 38078793 addi a5,a5,896 # 1c9c380 + 3003a86: fef42623 sw a5,-20(s0) + /* Check whether the 1MHz output frequency is valid. */ + if ((freq / (handle->handleEx.clk1MDiv + 1)) == CRG_FREQ_1MHz) { + 3003a8a: fdc42783 lw a5,-36(s0) + 3003a8e: 53dc lw a5,36(a5) + 3003a90: 0785 addi a5,a5,1 + 3003a92: fec42703 lw a4,-20(s0) + 3003a96: 02f75733 divu a4,a4,a5 + 3003a9a: 000f47b7 lui a5,0xf4 + 3003a9e: 24078793 addi a5,a5,576 # f4240 + 3003aa2: 00f71463 bne a4,a5,3003aaa + return BASE_STATUS_OK; + 3003aa6: 4781 li a5,0 + 3003aa8: a011 j 3003aac + } + return BASE_STATUS_ERROR; + 3003aaa: 4785 li a5,1 +} + 3003aac: 853e mv a0,a5 + 3003aae: 5432 lw s0,44(sp) + 3003ab0: 6145 addi sp,sp,48 + 3003ab2: 8082 ret + +03003ab4 : + * @brief Get clock frequence + * @param crg CRG_RegStruct + * @retval The frequence fo clock + */ +static inline unsigned int CRG_GetPllRefIni(CRG_PllRefClkSelect pllRefClkSelect) +{ + 3003ab4: 1101 addi sp,sp,-32 + 3003ab6: ce22 sw s0,28(sp) + 3003ab8: 1000 addi s0,sp,32 + 3003aba: fea42623 sw a0,-20(s0) + /* The maximum speed of the external clock source is 30000000U. */ + if (pllRefClkSelect == CRG_PLL_REF_CLK_SELECT_XTAL && XTRAIL_FREQ > 30000000U) { + return 0; + } + return (pllRefClkSelect == (unsigned int)CRG_PLL_REF_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003abe: fec42783 lw a5,-20(s0) + 3003ac2: e791 bnez a5,3003ace + 3003ac4: 017d87b7 lui a5,0x17d8 + 3003ac8: 84078793 addi a5,a5,-1984 # 17d7840 + 3003acc: a029 j 3003ad6 + 3003ace: 01c9c7b7 lui a5,0x1c9c + 3003ad2: 38078793 addi a5,a5,896 # 1c9c380 +} + 3003ad6: 853e mv a0,a5 + 3003ad8: 4472 lw s0,28(sp) + 3003ada: 6105 addi sp,sp,32 + 3003adc: 8082 ret + +03003ade : + * @brief Get previous division Value before PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPreDivValue(CRG_PllPreDiv pllPredDiv) +{ + 3003ade: 7179 addi sp,sp,-48 + 3003ae0: d622 sw s0,44(sp) + 3003ae2: 1800 addi s0,sp,48 + 3003ae4: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + if (pllPredDiv <= CRG_PLL_PREDIV_1) { /* 0 or 1 returns PLL_PREDIV_OUT_1. */ + 3003ae8: fdc42783 lw a5,-36(s0) + 3003aec: e789 bnez a5,3003af6 + preDiv = PLL_PREDIV_OUT_1; + 3003aee: 4785 li a5,1 + 3003af0: fef42623 sw a5,-20(s0) + 3003af4: a031 j 3003b00 + } else { + preDiv = pllPredDiv + 1; + 3003af6: fdc42783 lw a5,-36(s0) + 3003afa: 0785 addi a5,a5,1 + 3003afc: fef42623 sw a5,-20(s0) + } + return preDiv; + 3003b00: fec42783 lw a5,-20(s0) +} + 3003b04: 853e mv a0,a5 + 3003b06: 5432 lw s0,44(sp) + 3003b08: 6145 addi sp,sp,48 + 3003b0a: 8082 ret + +03003b0c : + * @brief Get PLL loop divider ratio + * @param crg CRG_RegStruct + * @retval PLL loop divider ratio + */ +static inline unsigned int CRG_GetPllFbDivValue(unsigned int pllFbDiv) +{ + 3003b0c: 7179 addi sp,sp,-48 + 3003b0e: d622 sw s0,44(sp) + 3003b10: 1800 addi s0,sp,48 + 3003b12: fca42e23 sw a0,-36(s0) + unsigned int div = pllFbDiv; + 3003b16: fdc42783 lw a5,-36(s0) + 3003b1a: fef42623 sw a5,-20(s0) + /* Check the validity of the minimum frequency multiplication parameter. */ + if (div < CRG_PLL_FBDIV_MIN) { + 3003b1e: fec42703 lw a4,-20(s0) + 3003b22: 4795 li a5,5 + 3003b24: 00e7e563 bltu a5,a4,3003b2e + div = CRG_PLL_FBDIV_MIN; + 3003b28: 4799 li a5,6 + 3003b2a: fef42623 sw a5,-20(s0) + } + /* Check the validity of the maximum frequency multiplication parameter. */ + if (div > CRG_PLL_FBDIV_MAX) { + 3003b2e: fec42703 lw a4,-20(s0) + 3003b32: 07f00793 li a5,127 + 3003b36: 00e7f663 bgeu a5,a4,3003b42 + div = CRG_PLL_FBDIV_MAX; + 3003b3a: 07f00793 li a5,127 + 3003b3e: fef42623 sw a5,-20(s0) + } + return div; + 3003b42: fec42783 lw a5,-20(s0) +} + 3003b46: 853e mv a0,a5 + 3003b48: 5432 lw s0,44(sp) + 3003b4a: 6145 addi sp,sp,48 + 3003b4c: 8082 ret + +03003b4e : + * @brief Get post division Value after PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPllPostDivValue(unsigned int pllPostDiv) +{ + 3003b4e: 7179 addi sp,sp,-48 + 3003b50: d622 sw s0,44(sp) + 3003b52: 1800 addi s0,sp,48 + 3003b54: fca42e23 sw a0,-36(s0) + unsigned int div = pllPostDiv; + 3003b58: fdc42783 lw a5,-36(s0) + 3003b5c: fef42623 sw a5,-20(s0) + if (div > CRG_PLL_POSTDIV_8) { + 3003b60: fec42703 lw a4,-20(s0) + 3003b64: 479d li a5,7 + 3003b66: 00e7f663 bgeu a5,a4,3003b72 + div = (CRG_PLL_POSTDIV_8 + 1); /* If the postdiv is greater than 8, set this postdiv to 8. */ + 3003b6a: 47a1 li a5,8 + 3003b6c: fef42623 sw a5,-20(s0) + 3003b70: a031 j 3003b7c + } else { + div += 1; + 3003b72: fec42783 lw a5,-20(s0) + 3003b76: 0785 addi a5,a5,1 + 3003b78: fef42623 sw a5,-20(s0) + } + return div; + 3003b7c: fec42783 lw a5,-20(s0) +} + 3003b80: 853e mv a0,a5 + 3003b82: 5432 lw s0,44(sp) + 3003b84: 6145 addi sp,sp,48 + 3003b86: 8082 ret + +03003b88 : + * @param matchInfo IP without Clock select match info + * @param enable BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003b88: 7179 addi sp,sp,-48 + 3003b8a: d606 sw ra,44(sp) + 3003b8c: d422 sw s0,40(sp) + 3003b8e: 1800 addi s0,sp,48 + 3003b90: fca42e23 sw a0,-36(s0) + 3003b94: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003b98: fdc42783 lw a5,-36(s0) + 3003b9c: eb89 bnez a5,3003bae + 3003b9e: 34d00593 li a1,845 + 3003ba2: 030077b7 lui a5,0x3007 + 3003ba6: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003baa: 2ad5 jal ra,3003d9e + 3003bac: a001 j 3003bac + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003bae: 040007b7 lui a5,0x4000 + 3003bb2: 4947a783 lw a5,1172(a5) # 4000494 + 3003bb6: eb89 bnez a5,3003bc8 + 3003bb8: 34e00593 li a1,846 + 3003bbc: 030077b7 lui a5,0x3007 + 3003bc0: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003bc4: 2ae9 jal ra,3003d9e + 3003bc6: a001 j 3003bc6 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003bc8: 040007b7 lui a5,0x4000 + 3003bcc: 4947a783 lw a5,1172(a5) # 4000494 + 3003bd0: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003bd4: fdc42783 lw a5,-36(s0) + 3003bd8: 279e lhu a5,8(a5) + 3003bda: 873e mv a4,a5 + 3003bdc: fec42783 lw a5,-20(s0) + 3003be0: 97ba add a5,a5,a4 + 3003be2: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003be6: fe842783 lw a5,-24(s0) + 3003bea: 439c lw a5,0(a5) + 3003bec: fef42223 sw a5,-28(s0) + if (enable & IP_CLK_ENABLE) { /* Set enable of target ip. */ + 3003bf0: fd842783 lw a5,-40(s0) + 3003bf4: 8b85 andi a5,a5,1 + 3003bf6: c7c1 beqz a5,3003c7e + cfg.BIT.clkEnMask |= 1 << matchInfo->bitOffset; + 3003bf8: fe442783 lw a5,-28(s0) + 3003bfc: 9fa1 uxth a5 + 3003bfe: 01079713 slli a4,a5,0x10 + 3003c02: 8741 srai a4,a4,0x10 + 3003c04: fdc42783 lw a5,-36(s0) + 3003c08: 27bc lbu a5,10(a5) + 3003c0a: 86be mv a3,a5 + 3003c0c: 4785 li a5,1 + 3003c0e: 00d797b3 sll a5,a5,a3 + 3003c12: 07c2 slli a5,a5,0x10 + 3003c14: 87c1 srai a5,a5,0x10 + 3003c16: 8fd9 or a5,a5,a4 + 3003c18: 07c2 slli a5,a5,0x10 + 3003c1a: 87c1 srai a5,a5,0x10 + 3003c1c: 01079693 slli a3,a5,0x10 + 3003c20: 82c1 srli a3,a3,0x10 + 3003c22: fe442783 lw a5,-28(s0) + 3003c26: 6741 lui a4,0x10 + 3003c28: 177d addi a4,a4,-1 # ffff + 3003c2a: 8f75 and a4,a4,a3 + 3003c2c: 76c1 lui a3,0xffff0 + 3003c2e: 8ff5 and a5,a5,a3 + 3003c30: 8fd9 or a5,a5,a4 + 3003c32: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); + 3003c36: fe442783 lw a5,-28(s0) + 3003c3a: 83c1 srli a5,a5,0x10 + 3003c3c: 9fa1 uxth a5 + 3003c3e: 01079713 slli a4,a5,0x10 + 3003c42: 8741 srai a4,a4,0x10 + 3003c44: fdc42783 lw a5,-36(s0) + 3003c48: 27bc lbu a5,10(a5) + 3003c4a: 86be mv a3,a5 + 3003c4c: 4785 li a5,1 + 3003c4e: 00d797b3 sll a5,a5,a3 + 3003c52: 07c2 slli a5,a5,0x10 + 3003c54: 87c1 srai a5,a5,0x10 + 3003c56: fff7c793 not a5,a5 + 3003c5a: 07c2 slli a5,a5,0x10 + 3003c5c: 87c1 srai a5,a5,0x10 + 3003c5e: 8ff9 and a5,a5,a4 + 3003c60: 07c2 slli a5,a5,0x10 + 3003c62: 87c1 srai a5,a5,0x10 + 3003c64: 01079713 slli a4,a5,0x10 + 3003c68: 8341 srli a4,a4,0x10 + 3003c6a: fe442783 lw a5,-28(s0) + 3003c6e: 0742 slli a4,a4,0x10 + 3003c70: 66c1 lui a3,0x10 + 3003c72: 16fd addi a3,a3,-1 # ffff + 3003c74: 8ff5 and a5,a5,a3 + 3003c76: 8fd9 or a5,a5,a4 + 3003c78: fef42223 sw a5,-28(s0) + 3003c7c: a059 j 3003d02 + } else { + cfg.BIT.clkEnMask &= ~(1 << matchInfo->bitOffset); /* Disable of target ip. */ + 3003c7e: fe442783 lw a5,-28(s0) + 3003c82: 9fa1 uxth a5 + 3003c84: 01079713 slli a4,a5,0x10 + 3003c88: 8741 srai a4,a4,0x10 + 3003c8a: fdc42783 lw a5,-36(s0) + 3003c8e: 27bc lbu a5,10(a5) + 3003c90: 86be mv a3,a5 + 3003c92: 4785 li a5,1 + 3003c94: 00d797b3 sll a5,a5,a3 + 3003c98: 07c2 slli a5,a5,0x10 + 3003c9a: 87c1 srai a5,a5,0x10 + 3003c9c: fff7c793 not a5,a5 + 3003ca0: 07c2 slli a5,a5,0x10 + 3003ca2: 87c1 srai a5,a5,0x10 + 3003ca4: 8ff9 and a5,a5,a4 + 3003ca6: 07c2 slli a5,a5,0x10 + 3003ca8: 87c1 srai a5,a5,0x10 + 3003caa: 01079693 slli a3,a5,0x10 + 3003cae: 82c1 srli a3,a3,0x10 + 3003cb0: fe442783 lw a5,-28(s0) + 3003cb4: 6741 lui a4,0x10 + 3003cb6: 177d addi a4,a4,-1 # ffff + 3003cb8: 8f75 and a4,a4,a3 + 3003cba: 76c1 lui a3,0xffff0 + 3003cbc: 8ff5 and a5,a5,a3 + 3003cbe: 8fd9 or a5,a5,a4 + 3003cc0: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq |= (1 << matchInfo->bitOffset); + 3003cc4: fe442783 lw a5,-28(s0) + 3003cc8: 83c1 srli a5,a5,0x10 + 3003cca: 9fa1 uxth a5 + 3003ccc: 01079713 slli a4,a5,0x10 + 3003cd0: 8741 srai a4,a4,0x10 + 3003cd2: fdc42783 lw a5,-36(s0) + 3003cd6: 27bc lbu a5,10(a5) + 3003cd8: 86be mv a3,a5 + 3003cda: 4785 li a5,1 + 3003cdc: 00d797b3 sll a5,a5,a3 + 3003ce0: 07c2 slli a5,a5,0x10 + 3003ce2: 87c1 srai a5,a5,0x10 + 3003ce4: 8fd9 or a5,a5,a4 + 3003ce6: 07c2 slli a5,a5,0x10 + 3003ce8: 87c1 srai a5,a5,0x10 + 3003cea: 01079713 slli a4,a5,0x10 + 3003cee: 8341 srli a4,a4,0x10 + 3003cf0: fe442783 lw a5,-28(s0) + 3003cf4: 0742 slli a4,a4,0x10 + 3003cf6: 66c1 lui a3,0x10 + 3003cf8: 16fd addi a3,a3,-1 # ffff + 3003cfa: 8ff5 and a5,a5,a3 + 3003cfc: 8fd9 or a5,a5,a4 + 3003cfe: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3003d02: fe442703 lw a4,-28(s0) + 3003d06: fe842783 lw a5,-24(s0) + 3003d0a: c398 sw a4,0(a5) +} + 3003d0c: 0001 nop + 3003d0e: 50b2 lw ra,44(sp) + 3003d10: 5422 lw s0,40(sp) + 3003d12: 6145 addi sp,sp,48 + 3003d14: 8082 ret + +03003d16 : + * @brief Get Enable status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock Enable status + */ +static unsigned int CRG_IpWoClkSelEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003d16: 7179 addi sp,sp,-48 + 3003d18: d606 sw ra,44(sp) + 3003d1a: d422 sw s0,40(sp) + 3003d1c: 1800 addi s0,sp,48 + 3003d1e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003d22: fdc42783 lw a5,-36(s0) + 3003d26: eb89 bnez a5,3003d38 + 3003d28: 36500593 li a1,869 + 3003d2c: 030077b7 lui a5,0x3007 + 3003d30: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003d34: 20ad jal ra,3003d9e + 3003d36: a001 j 3003d36 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003d38: 040007b7 lui a5,0x4000 + 3003d3c: 4947a783 lw a5,1172(a5) # 4000494 + 3003d40: eb89 bnez a5,3003d52 + 3003d42: 36600593 li a1,870 + 3003d46: 030077b7 lui a5,0x3007 + 3003d4a: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003d4e: 2881 jal ra,3003d9e + 3003d50: a001 j 3003d50 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003d52: 040007b7 lui a5,0x4000 + 3003d56: 4947a783 lw a5,1172(a5) # 4000494 + 3003d5a: fef42623 sw a5,-20(s0) + /* Get enable status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003d5e: fdc42783 lw a5,-36(s0) + 3003d62: 279e lhu a5,8(a5) + 3003d64: 873e mv a4,a5 + 3003d66: fec42783 lw a5,-20(s0) + 3003d6a: 97ba add a5,a5,a4 + 3003d6c: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + + cfg.value = p->value; + 3003d70: fe842783 lw a5,-24(s0) + 3003d74: 439c lw a5,0(a5) + 3003d76: fef42223 sw a5,-28(s0) + return (cfg.BIT.clkEnMask & (1 << matchInfo->bitOffset)) == 0 ? false : true; + 3003d7a: fe442783 lw a5,-28(s0) + 3003d7e: 9fa1 uxth a5 + 3003d80: 873e mv a4,a5 + 3003d82: fdc42783 lw a5,-36(s0) + 3003d86: 27bc lbu a5,10(a5) + 3003d88: 40f757b3 sra a5,a4,a5 + 3003d8c: 8b85 andi a5,a5,1 + 3003d8e: 00f037b3 snez a5,a5 + 3003d92: 9f81 uxtb a5 +} + 3003d94: 853e mv a0,a5 + 3003d96: 50b2 lw ra,44(sp) + 3003d98: 5422 lw s0,40(sp) + 3003d9a: 6145 addi sp,sp,48 + 3003d9c: 8082 ret + +03003d9e : + 3003d9e: c48fe06f j 30021e6 + +03003da2 : + * @param matchInfo IP without Clock select match info + * @param reset BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelResetSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int reset) +{ + 3003da2: 7179 addi sp,sp,-48 + 3003da4: d606 sw ra,44(sp) + 3003da6: d422 sw s0,40(sp) + 3003da8: 1800 addi s0,sp,48 + 3003daa: fca42e23 sw a0,-36(s0) + 3003dae: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003db2: fdc42783 lw a5,-36(s0) + 3003db6: eb89 bnez a5,3003dc8 + 3003db8: 37900593 li a1,889 + 3003dbc: 030077b7 lui a5,0x3007 + 3003dc0: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003dc4: 3fe9 jal ra,3003d9e + 3003dc6: a001 j 3003dc6 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003dc8: 040007b7 lui a5,0x4000 + 3003dcc: 4947a783 lw a5,1172(a5) # 4000494 + 3003dd0: eb89 bnez a5,3003de2 + 3003dd2: 37a00593 li a1,890 + 3003dd6: 030077b7 lui a5,0x3007 + 3003dda: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003dde: 37c1 jal ra,3003d9e + 3003de0: a001 j 3003de0 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003de2: 040007b7 lui a5,0x4000 + 3003de6: 4947a783 lw a5,1172(a5) # 4000494 + 3003dea: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003dee: fdc42783 lw a5,-36(s0) + 3003df2: 279e lhu a5,8(a5) + 3003df4: 873e mv a4,a5 + 3003df6: fec42783 lw a5,-20(s0) + 3003dfa: 97ba add a5,a5,a4 + 3003dfc: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003e00: fe842783 lw a5,-24(s0) + 3003e04: 439c lw a5,0(a5) + 3003e06: fef42223 sw a5,-28(s0) + if (reset & BASE_CFG_SET) { + 3003e0a: fd842783 lw a5,-40(s0) + 3003e0e: 8b85 andi a5,a5,1 + 3003e10: c3a9 beqz a5,3003e52 + cfg.BIT.softResetReq |= 1 << matchInfo->bitOffset; /* reset of target ip. */ + 3003e12: fe442783 lw a5,-28(s0) + 3003e16: 83c1 srli a5,a5,0x10 + 3003e18: 9fa1 uxth a5 + 3003e1a: 01079713 slli a4,a5,0x10 + 3003e1e: 8741 srai a4,a4,0x10 + 3003e20: fdc42783 lw a5,-36(s0) + 3003e24: 27bc lbu a5,10(a5) + 3003e26: 86be mv a3,a5 + 3003e28: 4785 li a5,1 + 3003e2a: 00d797b3 sll a5,a5,a3 + 3003e2e: 07c2 slli a5,a5,0x10 + 3003e30: 87c1 srai a5,a5,0x10 + 3003e32: 8fd9 or a5,a5,a4 + 3003e34: 07c2 slli a5,a5,0x10 + 3003e36: 87c1 srai a5,a5,0x10 + 3003e38: 01079713 slli a4,a5,0x10 + 3003e3c: 8341 srli a4,a4,0x10 + 3003e3e: fe442783 lw a5,-28(s0) + 3003e42: 0742 slli a4,a4,0x10 + 3003e44: 66c1 lui a3,0x10 + 3003e46: 16fd addi a3,a3,-1 # ffff + 3003e48: 8ff5 and a5,a5,a3 + 3003e4a: 8fd9 or a5,a5,a4 + 3003e4c: fef42223 sw a5,-28(s0) + 3003e50: a0a1 j 3003e98 + } else { + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); /* Undo reset of target ip. */ + 3003e52: fe442783 lw a5,-28(s0) + 3003e56: 83c1 srli a5,a5,0x10 + 3003e58: 9fa1 uxth a5 + 3003e5a: 01079713 slli a4,a5,0x10 + 3003e5e: 8741 srai a4,a4,0x10 + 3003e60: fdc42783 lw a5,-36(s0) + 3003e64: 27bc lbu a5,10(a5) + 3003e66: 86be mv a3,a5 + 3003e68: 4785 li a5,1 + 3003e6a: 00d797b3 sll a5,a5,a3 + 3003e6e: 07c2 slli a5,a5,0x10 + 3003e70: 87c1 srai a5,a5,0x10 + 3003e72: fff7c793 not a5,a5 + 3003e76: 07c2 slli a5,a5,0x10 + 3003e78: 87c1 srai a5,a5,0x10 + 3003e7a: 8ff9 and a5,a5,a4 + 3003e7c: 07c2 slli a5,a5,0x10 + 3003e7e: 87c1 srai a5,a5,0x10 + 3003e80: 01079713 slli a4,a5,0x10 + 3003e84: 8341 srli a4,a4,0x10 + 3003e86: fe442783 lw a5,-28(s0) + 3003e8a: 0742 slli a4,a4,0x10 + 3003e8c: 66c1 lui a3,0x10 + 3003e8e: 16fd addi a3,a3,-1 # ffff + 3003e90: 8ff5 and a5,a5,a3 + 3003e92: 8fd9 or a5,a5,a4 + 3003e94: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3003e98: fe442703 lw a4,-28(s0) + 3003e9c: fe842783 lw a5,-24(s0) + 3003ea0: c398 sw a4,0(a5) +} + 3003ea2: 0001 nop + 3003ea4: 50b2 lw ra,44(sp) + 3003ea6: 5422 lw s0,40(sp) + 3003ea8: 6145 addi sp,sp,48 + 3003eaa: 8082 ret + +03003eac : + * @brief Get Reset status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock select reset status + */ +static unsigned int CRG_IpWoClkSelResetGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003eac: 7179 addi sp,sp,-48 + 3003eae: d606 sw ra,44(sp) + 3003eb0: d422 sw s0,40(sp) + 3003eb2: 1800 addi s0,sp,48 + 3003eb4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003eb8: fdc42783 lw a5,-36(s0) + 3003ebc: eb89 bnez a5,3003ece + 3003ebe: 38f00593 li a1,911 + 3003ec2: 030077b7 lui a5,0x3007 + 3003ec6: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003eca: 3dd1 jal ra,3003d9e + 3003ecc: a001 j 3003ecc + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003ece: 040007b7 lui a5,0x4000 + 3003ed2: 4947a783 lw a5,1172(a5) # 4000494 + 3003ed6: eb89 bnez a5,3003ee8 + 3003ed8: 39000593 li a1,912 + 3003edc: 030077b7 lui a5,0x3007 + 3003ee0: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003ee4: 3d6d jal ra,3003d9e + 3003ee6: a001 j 3003ee6 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003ee8: 040007b7 lui a5,0x4000 + 3003eec: 4947a783 lw a5,1172(a5) # 4000494 + 3003ef0: fef42623 sw a5,-20(s0) + /* Get the reset status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003ef4: fdc42783 lw a5,-36(s0) + 3003ef8: 279e lhu a5,8(a5) + 3003efa: 873e mv a4,a5 + 3003efc: fec42783 lw a5,-20(s0) + 3003f00: 97ba add a5,a5,a4 + 3003f02: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003f06: fe842783 lw a5,-24(s0) + 3003f0a: 439c lw a5,0(a5) + 3003f0c: fef42223 sw a5,-28(s0) + return (cfg.BIT.softResetReq & (1 << matchInfo->bitOffset)) ? BASE_CFG_SET : BASE_CFG_UNSET; + 3003f10: fe442783 lw a5,-28(s0) + 3003f14: 83c1 srli a5,a5,0x10 + 3003f16: 9fa1 uxth a5 + 3003f18: 873e mv a4,a5 + 3003f1a: fdc42783 lw a5,-36(s0) + 3003f1e: 27bc lbu a5,10(a5) + 3003f20: 40f757b3 sra a5,a4,a5 + 3003f24: 8b85 andi a5,a5,1 + 3003f26: 00f037b3 snez a5,a5 + 3003f2a: 9f81 uxtb a5 +} + 3003f2c: 853e mv a0,a5 + 3003f2e: 50b2 lw ra,44(sp) + 3003f30: 5422 lw s0,40(sp) + 3003f32: 6145 addi sp,sp,48 + 3003f34: 8082 ret + +03003f36 : + * @param matchInfo ADC match info + * @param enable IP_CLK_ENABLE + * @retval None + */ +static void CRG_AdcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003f36: 7179 addi sp,sp,-48 + 3003f38: d606 sw ra,44(sp) + 3003f3a: d422 sw s0,40(sp) + 3003f3c: 1800 addi s0,sp,48 + 3003f3e: fca42e23 sw a0,-36(s0) + 3003f42: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003f46: fdc42783 lw a5,-36(s0) + 3003f4a: eb89 bnez a5,3003f5c + 3003f4c: 3a200593 li a1,930 + 3003f50: 030077b7 lui a5,0x3007 + 3003f54: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003f58: 3599 jal ra,3003d9e + 3003f5a: a001 j 3003f5a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003f5c: 040007b7 lui a5,0x4000 + 3003f60: 4947a783 lw a5,1172(a5) # 4000494 + 3003f64: eb89 bnez a5,3003f76 + 3003f66: 3a300593 li a1,931 + 3003f6a: 030077b7 lui a5,0x3007 + 3003f6e: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003f72: 3535 jal ra,3003d9e + 3003f74: a001 j 3003f74 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003f76: 040007b7 lui a5,0x4000 + 3003f7a: 4947a783 lw a5,1172(a5) # 4000494 + 3003f7e: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003f82: fdc42783 lw a5,-36(s0) + 3003f86: 279e lhu a5,8(a5) + 3003f88: 873e mv a4,a5 + 3003f8a: fec42783 lw a5,-20(s0) + 3003f8e: 97ba add a5,a5,a4 + 3003f90: fef42423 sw a5,-24(s0) + CRG_AdcIpCfg cfg; + cfg.value[1] = p->value[1]; + 3003f94: fe842783 lw a5,-24(s0) + 3003f98: 43dc lw a5,4(a5) + 3003f9a: fef42223 sw a5,-28(s0) + if (enable) { /* Enables and Deassert reset the ADC clock. */ + 3003f9e: fd842783 lw a5,-40(s0) + 3003fa2: cf99 beqz a5,3003fc0 + cfg.BIT.clk_adc_cken = BASE_CFG_SET; + 3003fa4: fe442783 lw a5,-28(s0) + 3003fa8: 0017e793 ori a5,a5,1 + 3003fac: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003fb0: fe442783 lw a5,-28(s0) + 3003fb4: 7741 lui a4,0xffff0 + 3003fb6: 177d addi a4,a4,-1 # fffeffff + 3003fb8: 8ff9 and a5,a5,a4 + 3003fba: fef42223 sw a5,-28(s0) + 3003fbe: a829 j 3003fd8 + } else { /* Disable and reset the ADC clock. */ + cfg.BIT.clk_adc_cken = BASE_CFG_UNSET; + 3003fc0: fe442783 lw a5,-28(s0) + 3003fc4: 9bf9 andi a5,a5,-2 + 3003fc6: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003fca: fe442783 lw a5,-28(s0) + 3003fce: 7741 lui a4,0xffff0 + 3003fd0: 177d addi a4,a4,-1 # fffeffff + 3003fd2: 8ff9 and a5,a5,a4 + 3003fd4: fef42223 sw a5,-28(s0) + } + p->value[1] = cfg.value[1]; + 3003fd8: fe442703 lw a4,-28(s0) + 3003fdc: fe842783 lw a5,-24(s0) + 3003fe0: c3d8 sw a4,4(a5) +} + 3003fe2: 0001 nop + 3003fe4: 50b2 lw ra,44(sp) + 3003fe6: 5422 lw s0,40(sp) + 3003fe8: 6145 addi sp,sp,48 + 3003fea: 8082 ret + +03003fec : + * @brief Get Enable status of ADC + * @param matchInfo ADC match info + * @retval Cken of ADC + */ +static unsigned int CRG_AdcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003fec: 7179 addi sp,sp,-48 + 3003fee: d606 sw ra,44(sp) + 3003ff0: d422 sw s0,40(sp) + 3003ff2: 1800 addi s0,sp,48 + 3003ff4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003ff8: fdc42783 lw a5,-36(s0) + 3003ffc: eb89 bnez a5,300400e + 3003ffe: 3ba00593 li a1,954 + 3004002: 030077b7 lui a5,0x3007 + 3004006: 8a478513 addi a0,a5,-1884 # 30068a4 + 300400a: 3b51 jal ra,3003d9e + 300400c: a001 j 300400c + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300400e: 040007b7 lui a5,0x4000 + 3004012: 4947a783 lw a5,1172(a5) # 4000494 + 3004016: eb89 bnez a5,3004028 + 3004018: 3bb00593 li a1,955 + 300401c: 030077b7 lui a5,0x3007 + 3004020: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004024: 3bad jal ra,3003d9e + 3004026: a001 j 3004026 + unsigned int enable; + /* Get the enable status of the ADC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3004028: 040007b7 lui a5,0x4000 + 300402c: 4947a783 lw a5,1172(a5) # 4000494 + 3004030: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004034: fdc42783 lw a5,-36(s0) + 3004038: 279e lhu a5,8(a5) + 300403a: 873e mv a4,a5 + 300403c: fec42783 lw a5,-20(s0) + 3004040: 97ba add a5,a5,a4 + 3004042: fef42423 sw a5,-24(s0) + enable = ((p->BIT.clk_adc_cken != 0)) ? IP_CLK_ENABLE : IP_CLK_DISABLE; + 3004046: fe842783 lw a5,-24(s0) + 300404a: 43dc lw a5,4(a5) + 300404c: 8b85 andi a5,a5,1 + 300404e: 9f81 uxtb a5 + 3004050: c399 beqz a5,3004056 + 3004052: 4785 li a5,1 + 3004054: a011 j 3004058 + 3004056: 4781 li a5,0 + 3004058: fef42223 sw a5,-28(s0) + return enable; + 300405c: fe442783 lw a5,-28(s0) +} + 3004060: 853e mv a0,a5 + 3004062: 50b2 lw ra,44(sp) + 3004064: 5422 lw s0,40(sp) + 3004066: 6145 addi sp,sp,48 + 3004068: 8082 ret + +0300406a : + * @param matchInfo ADC match info + * @param clkSelect @see CRG_AdcClkSelect + * @retval None + */ +static void CRG_AdcClkSelectSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int clkSelect) +{ + 300406a: 7179 addi sp,sp,-48 + 300406c: d606 sw ra,44(sp) + 300406e: d422 sw s0,40(sp) + 3004070: 1800 addi s0,sp,48 + 3004072: fca42e23 sw a0,-36(s0) + 3004076: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300407a: fdc42783 lw a5,-36(s0) + 300407e: eb89 bnez a5,3004090 + 3004080: 3cc00593 li a1,972 + 3004084: 030077b7 lui a5,0x3007 + 3004088: 8a478513 addi a0,a5,-1884 # 30068a4 + 300408c: 3b09 jal ra,3003d9e + 300408e: a001 j 300408e + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004090: 040007b7 lui a5,0x4000 + 3004094: 4947a783 lw a5,1172(a5) # 4000494 + 3004098: eb89 bnez a5,30040aa + 300409a: 3cd00593 li a1,973 + 300409e: 030077b7 lui a5,0x3007 + 30040a2: 8a478513 addi a0,a5,-1884 # 30068a4 + 30040a6: 39e5 jal ra,3003d9e + 30040a8: a001 j 30040a8 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30040aa: 040007b7 lui a5,0x4000 + 30040ae: 4947a703 lw a4,1172(a5) # 4000494 + 30040b2: 100007b7 lui a5,0x10000 + 30040b6: 00f70a63 beq a4,a5,30040ca + 30040ba: 3ce00593 li a1,974 + 30040be: 030077b7 lui a5,0x3007 + 30040c2: 8a478513 addi a0,a5,-1884 # 30068a4 + 30040c6: 39e1 jal ra,3003d9e + 30040c8: a001 j 30040c8 + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkModeSelect(clkSelect)); + 30040ca: fd842503 lw a0,-40(s0) + 30040ce: ea1fe0ef jal ra,3002f6e + 30040d2: 87aa mv a5,a0 + 30040d4: 0017c793 xori a5,a5,1 + 30040d8: 9f81 uxtb a5 + 30040da: cb89 beqz a5,30040ec + 30040dc: 3cf00593 li a1,975 + 30040e0: 030077b7 lui a5,0x3007 + 30040e4: 8a478513 addi a0,a5,-1884 # 30068a4 + 30040e8: 395d jal ra,3003d9e + 30040ea: a89d j 3004160 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30040ec: 040007b7 lui a5,0x4000 + 30040f0: 4947a783 lw a5,1172(a5) # 4000494 + 30040f4: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 30040f8: fdc42783 lw a5,-36(s0) + 30040fc: 279e lhu a5,8(a5) + 30040fe: 873e mv a4,a5 + 3004100: fec42783 lw a5,-20(s0) + 3004104: 97ba add a5,a5,a4 + 3004106: fef42423 sw a5,-24(s0) + if (clkSelect == CRG_ADC_CLK_SYN_CORE) { + 300410a: fd842703 lw a4,-40(s0) + 300410e: 478d li a5,3 + 3004110: 00f71a63 bne a4,a5,3004124 + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_SET; /* use sync clock */ + 3004114: fe842703 lw a4,-24(s0) + 3004118: 435c lw a5,4(a4) + 300411a: 010006b7 lui a3,0x1000 + 300411e: 8fd5 or a5,a5,a3 + 3004120: c35c sw a5,4(a4) + 3004122: a83d j 3004160 + } else { + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3004124: b67fe0ef jal ra,3002c8a + g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel = clkSelect; /* write clock selection */ + 3004128: 040007b7 lui a5,0x4000 + 300412c: 4947a703 lw a4,1172(a5) # 4000494 + 3004130: fd842783 lw a5,-40(s0) + 3004134: 8b8d andi a5,a5,3 + 3004136: 0ff7f693 andi a3,a5,255 + 300413a: 10072783 lw a5,256(a4) + 300413e: 8a8d andi a3,a3,3 + 3004140: 0692 slli a3,a3,0x4 + 3004142: fcf7f793 andi a5,a5,-49 + 3004146: 8fd5 or a5,a5,a3 + 3004148: 10f72023 sw a5,256(a4) + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 300414c: b67fe0ef jal ra,3002cb2 + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_UNSET; + 3004150: fe842703 lw a4,-24(s0) + 3004154: 435c lw a5,4(a4) + 3004156: ff0006b7 lui a3,0xff000 + 300415a: 16fd addi a3,a3,-1 # feffffff + 300415c: 8ff5 and a5,a5,a3 + 300415e: c35c sw a5,4(a4) + } +} + 3004160: 50b2 lw ra,44(sp) + 3004162: 5422 lw s0,40(sp) + 3004164: 6145 addi sp,sp,48 + 3004166: 8082 ret + +03004168 : + * @brief Get ADC Clock Select + * @param matchInfo ADC match info + * @retval Adc Clock select @see CRG_AdcClkSelect + */ +static unsigned int CRG_AdcClkSelectGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3004168: 7179 addi sp,sp,-48 + 300416a: d606 sw ra,44(sp) + 300416c: d422 sw s0,40(sp) + 300416e: 1800 addi s0,sp,48 + 3004170: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004174: fdc42783 lw a5,-36(s0) + 3004178: eb89 bnez a5,300418a + 300417a: 3e400593 li a1,996 + 300417e: 030077b7 lui a5,0x3007 + 3004182: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004186: 3921 jal ra,3003d9e + 3004188: a001 j 3004188 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300418a: 040007b7 lui a5,0x4000 + 300418e: 4947a783 lw a5,1172(a5) # 4000494 + 3004192: eb89 bnez a5,30041a4 + 3004194: 3e500593 li a1,997 + 3004198: 030077b7 lui a5,0x3007 + 300419c: 8a478513 addi a0,a5,-1884 # 30068a4 + 30041a0: 3efd jal ra,3003d9e + 30041a2: a001 j 30041a2 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30041a4: 040007b7 lui a5,0x4000 + 30041a8: 4947a783 lw a5,1172(a5) # 4000494 + 30041ac: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 30041b0: fdc42783 lw a5,-36(s0) + 30041b4: 279e lhu a5,8(a5) + 30041b6: 873e mv a4,a5 + 30041b8: fec42783 lw a5,-20(s0) + 30041bc: 97ba add a5,a5,a4 + 30041be: fef42423 sw a5,-24(s0) + if (p->BIT.cfg_adc_ckmode_sel == BASE_CFG_SET) { + 30041c2: fe842783 lw a5,-24(s0) + 30041c6: 43dc lw a5,4(a5) + 30041c8: 83e1 srli a5,a5,0x18 + 30041ca: 8b85 andi a5,a5,1 + 30041cc: 0ff7f713 andi a4,a5,255 + 30041d0: 4785 li a5,1 + 30041d2: 00f71463 bne a4,a5,30041da + return CRG_ADC_CLK_SYN_CORE; /* Synchronous clock signal */ + 30041d6: 478d li a5,3 + 30041d8: a811 j 30041ec + } + return g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel; /* asynchronous clock signal */ + 30041da: 040007b7 lui a5,0x4000 + 30041de: 4947a783 lw a5,1172(a5) # 4000494 + 30041e2: 1007a783 lw a5,256(a5) + 30041e6: 8391 srli a5,a5,0x4 + 30041e8: 8b8d andi a5,a5,3 + 30041ea: 9f81 uxtb a5 +} + 30041ec: 853e mv a0,a5 + 30041ee: 50b2 lw ra,44(sp) + 30041f0: 5422 lw s0,40(sp) + 30041f2: 6145 addi sp,sp,48 + 30041f4: 8082 ret + +030041f6 : + * @param matchInfo ADC match info + * @param div Adc clock division + * @retval None + */ +static void CRG_AdcDivSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int div) +{ + 30041f6: 7179 addi sp,sp,-48 + 30041f8: d606 sw ra,44(sp) + 30041fa: d422 sw s0,40(sp) + 30041fc: 1800 addi s0,sp,48 + 30041fe: fca42e23 sw a0,-36(s0) + 3004202: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004206: fdc42783 lw a5,-36(s0) + 300420a: eb89 bnez a5,300421c + 300420c: 3f700593 li a1,1015 + 3004210: 030077b7 lui a5,0x3007 + 3004214: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004218: 3659 jal ra,3003d9e + 300421a: a001 j 300421a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300421c: 040007b7 lui a5,0x4000 + 3004220: 4947a783 lw a5,1172(a5) # 4000494 + 3004224: eb89 bnez a5,3004236 + 3004226: 3f800593 li a1,1016 + 300422a: 030077b7 lui a5,0x3007 + 300422e: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004232: 36b5 jal ra,3003d9e + 3004234: a001 j 3004234 + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkDiv(div)); + 3004236: fd842503 lw a0,-40(s0) + 300423a: d75fe0ef jal ra,3002fae + 300423e: 87aa mv a5,a0 + 3004240: 0017c793 xori a5,a5,1 + 3004244: 9f81 uxtb a5 + 3004246: cb89 beqz a5,3004258 + 3004248: 3f900593 li a1,1017 + 300424c: 030077b7 lui a5,0x3007 + 3004250: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004254: 36a9 jal ra,3003d9e + 3004256: a885 j 30042c6 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3004258: 040007b7 lui a5,0x4000 + 300425c: 4947a783 lw a5,1172(a5) # 4000494 + 3004260: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004264: fdc42783 lw a5,-36(s0) + 3004268: 279e lhu a5,8(a5) + 300426a: 873e mv a4,a5 + 300426c: fec42783 lw a5,-20(s0) + 3004270: 97ba add a5,a5,a4 + 3004272: fef42423 sw a5,-24(s0) + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3004276: fe842783 lw a5,-24(s0) + 300427a: 43dc lw a5,4(a5) + 300427c: 83e1 srli a5,a5,0x18 + 300427e: 8b85 andi a5,a5,1 + 3004280: 9f81 uxtb a5 + 3004282: fef42223 sw a5,-28(s0) + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3004286: fe442703 lw a4,-28(s0) + 300428a: 4785 li a5,1 + 300428c: 02f71163 bne a4,a5,30042ae + p->BIT.clk_adc_div1 = div; /* write div to I1 */ + 3004290: fd842783 lw a5,-40(s0) + 3004294: 8b8d andi a5,a5,3 + 3004296: 0ff7f693 andi a3,a5,255 + 300429a: fe842703 lw a4,-24(s0) + 300429e: 431c lw a5,0(a4) + 30042a0: 8a8d andi a3,a3,3 + 30042a2: 06a2 slli a3,a3,0x8 + 30042a4: cff7f793 andi a5,a5,-769 + 30042a8: 8fd5 or a5,a5,a3 + 30042aa: c31c sw a5,0(a4) + 30042ac: a829 j 30042c6 + } else { + p->BIT.clk_adc_div0 = div; /* write div to I0 */ + 30042ae: fd842783 lw a5,-40(s0) + 30042b2: 8b8d andi a5,a5,3 + 30042b4: 0ff7f693 andi a3,a5,255 + 30042b8: fe842703 lw a4,-24(s0) + 30042bc: 431c lw a5,0(a4) + 30042be: 8a8d andi a3,a3,3 + 30042c0: 9bf1 andi a5,a5,-4 + 30042c2: 8fd5 or a5,a5,a3 + 30042c4: c31c sw a5,0(a4) + } +} + 30042c6: 50b2 lw ra,44(sp) + 30042c8: 5422 lw s0,40(sp) + 30042ca: 6145 addi sp,sp,48 + 30042cc: 8082 ret + +030042ce : + * @brief Get ADC clock division + * @param matchInfo ADC match info + * @retval Adc clock division + */ +static unsigned int CRG_AdcDivGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30042ce: 7179 addi sp,sp,-48 + 30042d0: d606 sw ra,44(sp) + 30042d2: d422 sw s0,40(sp) + 30042d4: 1800 addi s0,sp,48 + 30042d6: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30042da: fdc42783 lw a5,-36(s0) + 30042de: eb89 bnez a5,30042f0 + 30042e0: 40c00593 li a1,1036 + 30042e4: 030077b7 lui a5,0x3007 + 30042e8: 8a478513 addi a0,a5,-1884 # 30068a4 + 30042ec: 3c4d jal ra,3003d9e + 30042ee: a001 j 30042ee + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30042f0: 040007b7 lui a5,0x4000 + 30042f4: 4947a783 lw a5,1172(a5) # 4000494 + 30042f8: eb89 bnez a5,300430a + 30042fa: 40d00593 li a1,1037 + 30042fe: 030077b7 lui a5,0x3007 + 3004302: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004306: 3c61 jal ra,3003d9e + 3004308: a001 j 3004308 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300430a: 040007b7 lui a5,0x4000 + 300430e: 4947a783 lw a5,1172(a5) # 4000494 + 3004312: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004316: fdc42783 lw a5,-36(s0) + 300431a: 279e lhu a5,8(a5) + 300431c: 873e mv a4,a5 + 300431e: fec42783 lw a5,-20(s0) + 3004322: 97ba add a5,a5,a4 + 3004324: fef42423 sw a5,-24(s0) + + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3004328: fe842783 lw a5,-24(s0) + 300432c: 43dc lw a5,4(a5) + 300432e: 83e1 srli a5,a5,0x18 + 3004330: 8b85 andi a5,a5,1 + 3004332: 9f81 uxtb a5 + 3004334: fef42223 sw a5,-28(s0) + + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3004338: fe442703 lw a4,-28(s0) + 300433c: 4785 li a5,1 + 300433e: 00f71963 bne a4,a5,3004350 + return p->BIT.clk_adc_div1; /* return div value I1 */ + 3004342: fe842783 lw a5,-24(s0) + 3004346: 439c lw a5,0(a5) + 3004348: 83a1 srli a5,a5,0x8 + 300434a: 8b8d andi a5,a5,3 + 300434c: 9f81 uxtb a5 + 300434e: a031 j 300435a + } + return p->BIT.clk_adc_div0; /* return div valye I0 */ + 3004350: fe842783 lw a5,-24(s0) + 3004354: 439c lw a5,0(a5) + 3004356: 8b8d andi a5,a5,3 + 3004358: 9f81 uxtb a5 +} + 300435a: 853e mv a0,a5 + 300435c: 50b2 lw ra,44(sp) + 300435e: 5422 lw s0,40(sp) + 3004360: 6145 addi sp,sp,48 + 3004362: 8082 ret + +03004364 : + * @brief Enable Clock of EFC + * @param matchInfo EFC match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_EfcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3004364: 7179 addi sp,sp,-48 + 3004366: d606 sw ra,44(sp) + 3004368: d422 sw s0,40(sp) + 300436a: 1800 addi s0,sp,48 + 300436c: fca42e23 sw a0,-36(s0) + 3004370: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004374: fdc42783 lw a5,-36(s0) + 3004378: eb89 bnez a5,300438a + 300437a: 42100593 li a1,1057 + 300437e: 030077b7 lui a5,0x3007 + 3004382: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004386: 3c21 jal ra,3003d9e + 3004388: a001 j 3004388 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300438a: 040007b7 lui a5,0x4000 + 300438e: 4947a783 lw a5,1172(a5) # 4000494 + 3004392: eb89 bnez a5,30043a4 + 3004394: 42200593 li a1,1058 + 3004398: 030077b7 lui a5,0x3007 + 300439c: 8a478513 addi a0,a5,-1884 # 30068a4 + 30043a0: 3afd jal ra,3003d9e + 30043a2: a001 j 30043a2 + /* Enables or disables EFC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30043a4: 040007b7 lui a5,0x4000 + 30043a8: 4947a783 lw a5,1172(a5) # 4000494 + 30043ac: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 30043b0: fdc42783 lw a5,-36(s0) + 30043b4: 279e lhu a5,8(a5) + 30043b6: 873e mv a4,a5 + 30043b8: fec42783 lw a5,-20(s0) + 30043bc: 97ba add a5,a5,a4 + 30043be: fef42423 sw a5,-24(s0) + p->BIT.eflash_cken = (enable & IP_CLK_ENABLE) ? BASE_CFG_SET : BASE_CFG_UNSET; + 30043c2: fd842783 lw a5,-40(s0) + 30043c6: 8b85 andi a5,a5,1 + 30043c8: 0ff7f693 andi a3,a5,255 + 30043cc: fe842703 lw a4,-24(s0) + 30043d0: 431c lw a5,0(a4) + 30043d2: 8a85 andi a3,a3,1 + 30043d4: 9bf9 andi a5,a5,-2 + 30043d6: 8fd5 or a5,a5,a3 + 30043d8: c31c sw a5,0(a4) +} + 30043da: 0001 nop + 30043dc: 50b2 lw ra,44(sp) + 30043de: 5422 lw s0,40(sp) + 30043e0: 6145 addi sp,sp,48 + 30043e2: 8082 ret + +030043e4 : + * @brief Disable Clock of EFC + * @param matchInfo EFC match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_EfcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30043e4: 7179 addi sp,sp,-48 + 30043e6: d606 sw ra,44(sp) + 30043e8: d422 sw s0,40(sp) + 30043ea: 1800 addi s0,sp,48 + 30043ec: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30043f0: fdc42783 lw a5,-36(s0) + 30043f4: eb89 bnez a5,3004406 + 30043f6: 43000593 li a1,1072 + 30043fa: 030077b7 lui a5,0x3007 + 30043fe: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004402: 3a71 jal ra,3003d9e + 3004404: a001 j 3004404 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004406: 040007b7 lui a5,0x4000 + 300440a: 4947a783 lw a5,1172(a5) # 4000494 + 300440e: eb89 bnez a5,3004420 + 3004410: 43100593 li a1,1073 + 3004414: 030077b7 lui a5,0x3007 + 3004418: 8a478513 addi a0,a5,-1884 # 30068a4 + 300441c: 3249 jal ra,3003d9e + 300441e: a001 j 300441e + /* Get the value of the EFC register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3004420: 040007b7 lui a5,0x4000 + 3004424: 4947a783 lw a5,1172(a5) # 4000494 + 3004428: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 300442c: fdc42783 lw a5,-36(s0) + 3004430: 279e lhu a5,8(a5) + 3004432: 873e mv a4,a5 + 3004434: fec42783 lw a5,-20(s0) + 3004438: 97ba add a5,a5,a4 + 300443a: fef42423 sw a5,-24(s0) + return p->BIT.eflash_cken; + 300443e: fe842783 lw a5,-24(s0) + 3004442: 439c lw a5,0(a5) + 3004444: 8b85 andi a5,a5,1 + 3004446: 9f81 uxtb a5 +} + 3004448: 853e mv a0,a5 + 300444a: 50b2 lw ra,44(sp) + 300444c: 5422 lw s0,40(sp) + 300444e: 6145 addi sp,sp,48 + 3004450: 8082 ret + +03004452 : + * @brief Enable Clock of ANA + * @param matchInfo ANA match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_AnaEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3004452: 7179 addi sp,sp,-48 + 3004454: d606 sw ra,44(sp) + 3004456: d422 sw s0,40(sp) + 3004458: 1800 addi s0,sp,48 + 300445a: fca42e23 sw a0,-36(s0) + 300445e: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004462: fdc42783 lw a5,-36(s0) + 3004466: eb89 bnez a5,3004478 + 3004468: 44000593 li a1,1088 + 300446c: 030077b7 lui a5,0x3007 + 3004470: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004474: 322d jal ra,3003d9e + 3004476: a001 j 3004476 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004478: 040007b7 lui a5,0x4000 + 300447c: 4947a783 lw a5,1172(a5) # 4000494 + 3004480: eb89 bnez a5,3004492 + 3004482: 44100593 li a1,1089 + 3004486: 030077b7 lui a5,0x3007 + 300448a: 8a478513 addi a0,a5,-1884 # 30068a4 + 300448e: 3a01 jal ra,3003d9e + 3004490: a001 j 3004490 + CRG_PARAM_CHECK_NO_RET(enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE); + 3004492: fd842703 lw a4,-40(s0) + 3004496: 4785 li a5,1 + 3004498: 00f70d63 beq a4,a5,30044b2 + 300449c: fd842783 lw a5,-40(s0) + 30044a0: cb89 beqz a5,30044b2 + 30044a2: 44200593 li a1,1090 + 30044a6: 030077b7 lui a5,0x3007 + 30044aa: 8a478513 addi a0,a5,-1884 # 30068a4 + 30044ae: 38c5 jal ra,3003d9e + 30044b0: a20d j 30045d2 + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30044b2: 040007b7 lui a5,0x4000 + 30044b6: 4947a783 lw a5,1172(a5) # 4000494 + 30044ba: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 30044be: fdc42783 lw a5,-36(s0) + 30044c2: 279e lhu a5,8(a5) + 30044c4: 873e mv a4,a5 + 30044c6: fec42783 lw a5,-20(s0) + 30044ca: 97ba add a5,a5,a4 + 30044cc: fdc42703 lw a4,-36(s0) + 30044d0: 2738 lbu a4,10(a4) + 30044d2: 97ba add a5,a5,a4 + 30044d4: fef42423 sw a5,-24(s0) + + if ((enable == IP_CLK_ENABLE) && (p->BIT.ip_srst_req == BASE_CFG_SET)) { + 30044d8: fd842703 lw a4,-40(s0) + 30044dc: 4785 li a5,1 + 30044de: 02f71f63 bne a4,a5,300451c + 30044e2: fe842783 lw a5,-24(s0) + 30044e6: 439c lw a5,0(a5) + 30044e8: 83c1 srli a5,a5,0x10 + 30044ea: 8b85 andi a5,a5,1 + 30044ec: 0ff7f713 andi a4,a5,255 + 30044f0: 4785 li a5,1 + 30044f2: 02f71563 bne a4,a5,300451c + p->BIT.ip_srst_req = BASE_CFG_UNSET; + 30044f6: fe842703 lw a4,-24(s0) + 30044fa: 431c lw a5,0(a4) + 30044fc: 76c1 lui a3,0xffff0 + 30044fe: 16fd addi a3,a3,-1 # fffeffff + 3004500: 8ff5 and a5,a5,a3 + 3004502: c31c sw a5,0(a4) + g_anaEnableFlag++; /* count enable analog IP number */ + 3004504: 040007b7 lui a5,0x4000 + 3004508: 4987c783 lbu a5,1176(a5) # 4000498 + 300450c: 0785 addi a5,a5,1 + 300450e: 0ff7f713 andi a4,a5,255 + 3004512: 040007b7 lui a5,0x4000 + 3004516: 48e78c23 sb a4,1176(a5) # 4000498 + 300451a: a089 j 300455c + } else if ((enable == IP_CLK_DISABLE) && (p->BIT.ip_srst_req == BASE_CFG_UNSET)) { + 300451c: fd842783 lw a5,-40(s0) + 3004520: ef95 bnez a5,300455c + 3004522: fe842783 lw a5,-24(s0) + 3004526: 439c lw a5,0(a5) + 3004528: 83c1 srli a5,a5,0x10 + 300452a: 8b85 andi a5,a5,1 + 300452c: 9f81 uxtb a5 + 300452e: e79d bnez a5,300455c + p->BIT.ip_srst_req = BASE_CFG_SET; + 3004530: fe842703 lw a4,-24(s0) + 3004534: 431c lw a5,0(a4) + 3004536: 66c1 lui a3,0x10 + 3004538: 8fd5 or a5,a5,a3 + 300453a: c31c sw a5,0(a4) + if (g_anaEnableFlag > 0) { + 300453c: 040007b7 lui a5,0x4000 + 3004540: 4987c783 lbu a5,1176(a5) # 4000498 + 3004544: cf81 beqz a5,300455c + g_anaEnableFlag--; /* Decreasing the count to enable the analog IP number. */ + 3004546: 040007b7 lui a5,0x4000 + 300454a: 4987c783 lbu a5,1176(a5) # 4000498 + 300454e: 17fd addi a5,a5,-1 + 3004550: 0ff7f713 andi a4,a5,255 + 3004554: 040007b7 lui a5,0x4000 + 3004558: 48e78c23 sb a4,1176(a5) # 4000498 + } + } + + if ((g_anaEnableFlag == 0) && (enable == IP_CLK_DISABLE)) { /* all analog clock disable */ + 300455c: 040007b7 lui a5,0x4000 + 3004560: 4987c783 lbu a5,1176(a5) # 4000498 + 3004564: eb85 bnez a5,3004594 + 3004566: fd842783 lw a5,-40(s0) + 300456a: e78d bnez a5,3004594 + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_UNSET; + 300456c: 10000737 lui a4,0x10000 + 3004570: 6785 lui a5,0x1 + 3004572: 973e add a4,a4,a5 + 3004574: a5072783 lw a5,-1456(a4) # ffffa50 + 3004578: 9bf9 andi a5,a5,-2 + 300457a: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_SET; + 300457e: 10000737 lui a4,0x10000 + 3004582: 6785 lui a5,0x1 + 3004584: 973e add a4,a4,a5 + 3004586: a5072783 lw a5,-1456(a4) # ffffa50 + 300458a: 66c1 lui a3,0x10 + 300458c: 8fd5 or a5,a5,a3 + 300458e: a4f72823 sw a5,-1456(a4) + 3004592: a081 j 30045d2 + } else if ((g_anaEnableFlag > 0) && (enable == IP_CLK_ENABLE)) { /* all analog clock enable */ + 3004594: 040007b7 lui a5,0x4000 + 3004598: 4987c783 lbu a5,1176(a5) # 4000498 + 300459c: cb9d beqz a5,30045d2 + 300459e: fd842703 lw a4,-40(s0) + 30045a2: 4785 li a5,1 + 30045a4: 02f71763 bne a4,a5,30045d2 + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_UNSET; + 30045a8: 10000737 lui a4,0x10000 + 30045ac: 6785 lui a5,0x1 + 30045ae: 973e add a4,a4,a5 + 30045b0: a5072783 lw a5,-1456(a4) # ffffa50 + 30045b4: 76c1 lui a3,0xffff0 + 30045b6: 16fd addi a3,a3,-1 # fffeffff + 30045b8: 8ff5 and a5,a5,a3 + 30045ba: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_SET; + 30045be: 10000737 lui a4,0x10000 + 30045c2: 6785 lui a5,0x1 + 30045c4: 973e add a4,a4,a5 + 30045c6: a5072783 lw a5,-1456(a4) # ffffa50 + 30045ca: 0017e793 ori a5,a5,1 + 30045ce: a4f72823 sw a5,-1456(a4) + } +} + 30045d2: 50b2 lw ra,44(sp) + 30045d4: 5422 lw s0,40(sp) + 30045d6: 6145 addi sp,sp,48 + 30045d8: 8082 ret + +030045da : + * @brief Get Clock of ANA + * @param matchInfo ANA match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_AnaEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30045da: 7179 addi sp,sp,-48 + 30045dc: d606 sw ra,44(sp) + 30045de: d422 sw s0,40(sp) + 30045e0: 1800 addi s0,sp,48 + 30045e2: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30045e6: fdc42783 lw a5,-36(s0) + 30045ea: eb91 bnez a5,30045fe + 30045ec: 46200593 li a1,1122 + 30045f0: 030077b7 lui a5,0x3007 + 30045f4: 8a478513 addi a0,a5,-1884 # 30068a4 + 30045f8: beffd0ef jal ra,30021e6 + 30045fc: a001 j 30045fc + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30045fe: 040007b7 lui a5,0x4000 + 3004602: 4947a783 lw a5,1172(a5) # 4000494 + 3004606: eb91 bnez a5,300461a + 3004608: 46300593 li a1,1123 + 300460c: 030077b7 lui a5,0x3007 + 3004610: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004614: bd3fd0ef jal ra,30021e6 + 3004618: a001 j 3004618 + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300461a: 040007b7 lui a5,0x4000 + 300461e: 4947a783 lw a5,1172(a5) # 4000494 + 3004622: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 3004626: fdc42783 lw a5,-36(s0) + 300462a: 279e lhu a5,8(a5) + 300462c: 873e mv a4,a5 + 300462e: fec42783 lw a5,-20(s0) + 3004632: 97ba add a5,a5,a4 + 3004634: fdc42703 lw a4,-36(s0) + 3004638: 2738 lbu a4,10(a4) + 300463a: 97ba add a5,a5,a4 + 300463c: fef42423 sw a5,-24(s0) + /* The clock is enabled based on the IP reset status. */ + return (p->BIT.ip_srst_req) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3004640: fe842783 lw a5,-24(s0) + 3004644: 439c lw a5,0(a5) + 3004646: 83c1 srli a5,a5,0x10 + 3004648: 8b85 andi a5,a5,1 + 300464a: 9f81 uxtb a5 + 300464c: 0017c793 xori a5,a5,1 + 3004650: 9f81 uxtb a5 +} + 3004652: 853e mv a0,a5 + 3004654: 50b2 lw ra,44(sp) + 3004656: 5422 lw s0,40(sp) + 3004658: 6145 addi sp,sp,48 + 300465a: 8082 ret + +0300465c : + * @brief Write a character to the UART port. + * @param ch The int promotion of the character to be written. + * @retval None. + */ +static void DBG_PrintCh(unsigned int ch) +{ + 300465c: 1101 addi sp,sp,-32 + 300465e: ce22 sw s0,28(sp) + 3004660: 1000 addi s0,sp,32 + 3004662: fea42623 sw a0,-20(s0) + while (DBG_PRINTF_UART_PORT->UART_FR.BIT.txff == 1) { + 3004666: 0001 nop + 3004668: 140007b7 lui a5,0x14000 + 300466c: 4f9c lw a5,24(a5) + 300466e: 8395 srli a5,a5,0x5 + 3004670: 8b85 andi a5,a5,1 + 3004672: 0ff7f713 andi a4,a5,255 + 3004676: 4785 li a5,1 + 3004678: fef708e3 beq a4,a5,3004668 + ; + } + DBG_PRINTF_UART_PORT->UART_DR.BIT.data = (unsigned char)ch; + 300467c: 14000737 lui a4,0x14000 + 3004680: fec42783 lw a5,-20(s0) + 3004684: 0ff7f693 andi a3,a5,255 + 3004688: 431c lw a5,0(a4) + 300468a: 0ff6f693 andi a3,a3,255 + 300468e: f007f793 andi a5,a5,-256 + 3004692: 8fd5 or a5,a5,a3 + 3004694: c31c sw a5,0(a4) +} + 3004696: 0001 nop + 3004698: 4472 lw s0,28(sp) + 300469a: 6105 addi sp,sp,32 + 300469c: 8082 ret + +0300469e : + * @param str The string to be printed. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, a BASE_STATUS_ERROR is returned. + */ +static int DBG_PrintStr(const char *str) +{ + 300469e: 7179 addi sp,sp,-48 + 30046a0: d606 sw ra,44(sp) + 30046a2: d422 sw s0,40(sp) + 30046a4: 1800 addi s0,sp,48 + 30046a6: fca42e23 sw a0,-36(s0) + DEBUG_ASSERT_PARAM(str != NULL); + int cnt = 0; + 30046aa: fe042623 sw zero,-20(s0) + while (*str != '\0') { + 30046ae: a00d j 30046d0 + DBG_PrintCh(*str); + 30046b0: fdc42783 lw a5,-36(s0) + 30046b4: 00078783 lb a5,0(a5) # 14000000 + 30046b8: 853e mv a0,a5 + 30046ba: 374d jal ra,300465c + str++; + 30046bc: fdc42783 lw a5,-36(s0) + 30046c0: 0785 addi a5,a5,1 + 30046c2: fcf42e23 sw a5,-36(s0) + cnt++; + 30046c6: fec42783 lw a5,-20(s0) + 30046ca: 0785 addi a5,a5,1 + 30046cc: fef42623 sw a5,-20(s0) + while (*str != '\0') { + 30046d0: fdc42783 lw a5,-36(s0) + 30046d4: 00078783 lb a5,0(a5) + 30046d8: ffe1 bnez a5,30046b0 + } + return cnt; + 30046da: fec42783 lw a5,-20(s0) +} + 30046de: 853e mv a0,a5 + 30046e0: 50b2 lw ra,44(sp) + 30046e2: 5422 lw s0,40(sp) + 30046e4: 6145 addi sp,sp,48 + 30046e6: 8082 ret + +030046e8 : + * @param base Base value. + * @param exponent Exponent value. + * @retval unsigned long The result of raising base to the power exponent. + */ +static unsigned long DBG_Pow(unsigned int base, unsigned int exponent) +{ + 30046e8: 7179 addi sp,sp,-48 + 30046ea: d622 sw s0,44(sp) + 30046ec: 1800 addi s0,sp,48 + 30046ee: fca42e23 sw a0,-36(s0) + 30046f2: fcb42c23 sw a1,-40(s0) + unsigned long ret = 1; + 30046f6: 4785 li a5,1 + 30046f8: fef42623 sw a5,-20(s0) + while (exponent--) { + 30046fc: a809 j 300470e + ret *= base; + 30046fe: fec42703 lw a4,-20(s0) + 3004702: fdc42783 lw a5,-36(s0) + 3004706: 02f707b3 mul a5,a4,a5 + 300470a: fef42623 sw a5,-20(s0) + while (exponent--) { + 300470e: fd842783 lw a5,-40(s0) + 3004712: fff78713 addi a4,a5,-1 + 3004716: fce42c23 sw a4,-40(s0) + 300471a: f3f5 bnez a5,30046fe + } + return ret; /* ret = base ^ exponent */ + 300471c: fec42783 lw a5,-20(s0) +} + 3004720: 853e mv a0,a5 + 3004722: 5432 lw s0,44(sp) + 3004724: 6145 addi sp,sp,48 + 3004726: 8082 ret + +03004728 : + * @param num The number to be counted. + * @param base The number base of num. + * @retval unsigned int The number of digits. + */ +static unsigned int DBG_CountDigits(int num, NumBase base) +{ + 3004728: 7179 addi sp,sp,-48 + 300472a: d622 sw s0,44(sp) + 300472c: 1800 addi s0,sp,48 + 300472e: fca42e23 sw a0,-36(s0) + 3004732: fcb42c23 sw a1,-40(s0) + unsigned int cnt = 0; + 3004736: fe042623 sw zero,-20(s0) + if (base == 0) { + 300473a: fd842783 lw a5,-40(s0) + 300473e: e78d bnez a5,3004768 + return 0; + 3004740: 4781 li a5,0 + 3004742: a099 j 3004788 + } + while (num != 0) { + cnt++; + 3004744: fec42783 lw a5,-20(s0) + 3004748: 0785 addi a5,a5,1 + 300474a: fef42623 sw a5,-20(s0) + if (cnt > MAX_DIV_TIMES) { + 300474e: fec42703 lw a4,-20(s0) + 3004752: 47fd li a5,31 + 3004754: 00e7ee63 bltu a5,a4,3004770 + break; + } + num /= base; + 3004758: fdc42703 lw a4,-36(s0) + 300475c: fd842783 lw a5,-40(s0) + 3004760: 02f757b3 divu a5,a4,a5 + 3004764: fcf42e23 sw a5,-36(s0) + while (num != 0) { + 3004768: fdc42783 lw a5,-36(s0) + 300476c: ffe1 bnez a5,3004744 + 300476e: a011 j 3004772 + break; + 3004770: 0001 nop + } + cnt = (cnt == 0) ? 1 : cnt; + 3004772: fec42783 lw a5,-20(s0) + 3004776: c781 beqz a5,300477e + 3004778: fec42783 lw a5,-20(s0) + 300477c: a011 j 3004780 + 300477e: 4785 li a5,1 + 3004780: fef42623 sw a5,-20(s0) + return cnt; + 3004784: fec42783 lw a5,-20(s0) +} + 3004788: 853e mv a0,a5 + 300478a: 5432 lw s0,44(sp) + 300478c: 6145 addi sp,sp,48 + 300478e: 8082 ret + +03004790 : + * @param num The unsigned number to be printed. + * @param base The number base of num. + * @param digits The digits of num. + */ +static void DBG_PutUnsignedNum(unsigned int num, NumBase base, unsigned int digits) +{ + 3004790: 7179 addi sp,sp,-48 + 3004792: d606 sw ra,44(sp) + 3004794: d422 sw s0,40(sp) + 3004796: 1800 addi s0,sp,48 + 3004798: fca42e23 sw a0,-36(s0) + 300479c: fcb42c23 sw a1,-40(s0) + 30047a0: fcc42a23 sw a2,-44(s0) + unsigned char ch; + while (digits != 0) { + 30047a4: a069 j 300482e + ch = num / DBG_Pow(base, digits - 1); + 30047a6: fd442783 lw a5,-44(s0) + 30047aa: 17fd addi a5,a5,-1 + 30047ac: 85be mv a1,a5 + 30047ae: fd842503 lw a0,-40(s0) + 30047b2: 3f1d jal ra,30046e8 + 30047b4: 872a mv a4,a0 + 30047b6: fdc42783 lw a5,-36(s0) + 30047ba: 02e7d7b3 divu a5,a5,a4 + 30047be: fef407a3 sb a5,-17(s0) + num %= DBG_Pow(base, digits - 1); + 30047c2: fd442783 lw a5,-44(s0) + 30047c6: 17fd addi a5,a5,-1 + 30047c8: 85be mv a1,a5 + 30047ca: fd842503 lw a0,-40(s0) + 30047ce: 3f29 jal ra,30046e8 + 30047d0: 872a mv a4,a0 + 30047d2: fdc42783 lw a5,-36(s0) + 30047d6: 02e7f7b3 remu a5,a5,a4 + 30047da: fcf42e23 sw a5,-36(s0) + if (base == DECIMAL) { + 30047de: fd842703 lw a4,-40(s0) + 30047e2: 47a9 li a5,10 + 30047e4: 00f71963 bne a4,a5,30047f6 + DBG_PrintCh(ch + '0'); + 30047e8: fef44783 lbu a5,-17(s0) + 30047ec: 03078793 addi a5,a5,48 + 30047f0: 853e mv a0,a5 + 30047f2: 35ad jal ra,300465c + 30047f4: a805 j 3004824 + } else if (base == HEXADECIMAL) { + 30047f6: fd842703 lw a4,-40(s0) + 30047fa: 47c1 li a5,16 + 30047fc: 02f71d63 bne a4,a5,3004836 + if (ch < DECIMAL_BASE) { + 3004800: fef44703 lbu a4,-17(s0) + 3004804: 47a5 li a5,9 + 3004806: 00e7e963 bltu a5,a4,3004818 + DBG_PrintCh(ch + '0'); + 300480a: fef44783 lbu a5,-17(s0) + 300480e: 03078793 addi a5,a5,48 + 3004812: 853e mv a0,a5 + 3004814: 35a1 jal ra,300465c + 3004816: a039 j 3004824 + } else { + DBG_PrintCh(ch - DECIMAL_BASE + 'A'); + 3004818: fef44783 lbu a5,-17(s0) + 300481c: 03778793 addi a5,a5,55 + 3004820: 853e mv a0,a5 + 3004822: 3d2d jal ra,300465c + } + } else { + break; + } + digits--; + 3004824: fd442783 lw a5,-44(s0) + 3004828: 17fd addi a5,a5,-1 + 300482a: fcf42a23 sw a5,-44(s0) + while (digits != 0) { + 300482e: fd442783 lw a5,-44(s0) + 3004832: fbb5 bnez a5,30047a6 + } +} + 3004834: a011 j 3004838 + break; + 3004836: 0001 nop +} + 3004838: 0001 nop + 300483a: 50b2 lw ra,44(sp) + 300483c: 5422 lw s0,40(sp) + 300483e: 6145 addi sp,sp,48 + 3004840: 8082 ret + +03004842 : + * @brief Print decimal number through UART port. + * @param intNum The decimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintInt(int intNum) +{ + 3004842: 7179 addi sp,sp,-48 + 3004844: d606 sw ra,44(sp) + 3004846: d422 sw s0,40(sp) + 3004848: 1800 addi s0,sp,48 + 300484a: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (intNum == 0) { + 300484e: fdc42783 lw a5,-36(s0) + 3004852: e791 bnez a5,300485e + DBG_PrintCh('0'); + 3004854: 03000513 li a0,48 + 3004858: 3511 jal ra,300465c + return 1; + 300485a: 4785 li a5,1 + 300485c: a82d j 3004896 + } + if (intNum < 0) { + 300485e: fdc42783 lw a5,-36(s0) + 3004862: 0007db63 bgez a5,3004878 + DBG_PrintCh('-'); + 3004866: 02d00513 li a0,45 + 300486a: 3bcd jal ra,300465c + intNum = -intNum; + 300486c: fdc42783 lw a5,-36(s0) + 3004870: 40f007b3 neg a5,a5 + 3004874: fcf42e23 sw a5,-36(s0) + } + cnt = DBG_CountDigits(intNum, DECIMAL); + 3004878: 45a9 li a1,10 + 300487a: fdc42503 lw a0,-36(s0) + 300487e: 356d jal ra,3004728 + 3004880: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(intNum, DECIMAL, cnt); + 3004884: fdc42783 lw a5,-36(s0) + 3004888: fec42603 lw a2,-20(s0) + 300488c: 45a9 li a1,10 + 300488e: 853e mv a0,a5 + 3004890: 3701 jal ra,3004790 + return cnt; + 3004892: fec42783 lw a5,-20(s0) +} + 3004896: 853e mv a0,a5 + 3004898: 50b2 lw ra,44(sp) + 300489a: 5422 lw s0,40(sp) + 300489c: 6145 addi sp,sp,48 + 300489e: 8082 ret + +030048a0 : + * @brief Print hexadecimal number through UART port. + * @param hexNum The hexadecimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintHex(unsigned int hexNum) +{ + 30048a0: 7179 addi sp,sp,-48 + 30048a2: d606 sw ra,44(sp) + 30048a4: d422 sw s0,40(sp) + 30048a6: 1800 addi s0,sp,48 + 30048a8: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (hexNum == 0) { + 30048ac: fdc42783 lw a5,-36(s0) + 30048b0: e791 bnez a5,30048bc + DBG_PrintCh('0'); + 30048b2: 03000513 li a0,48 + 30048b6: 335d jal ra,300465c + return 1; + 30048b8: 4785 li a5,1 + 30048ba: a005 j 30048da + } + cnt = DBG_CountDigits(hexNum, HEXADECIMAL); + 30048bc: fdc42783 lw a5,-36(s0) + 30048c0: 45c1 li a1,16 + 30048c2: 853e mv a0,a5 + 30048c4: 3595 jal ra,3004728 + 30048c6: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(hexNum, HEXADECIMAL, cnt); + 30048ca: fec42603 lw a2,-20(s0) + 30048ce: 45c1 li a1,16 + 30048d0: fdc42503 lw a0,-36(s0) + 30048d4: 3d75 jal ra,3004790 + return cnt; + 30048d6: fec42783 lw a5,-20(s0) +} + 30048da: 853e mv a0,a5 + 30048dc: 50b2 lw ra,44(sp) + 30048de: 5422 lw s0,40(sp) + 30048e0: 6145 addi sp,sp,48 + 30048e2: 8082 ret + +030048e4 : + * @brief Print floating-point number through UART port. + * @param fltNum The floating-point number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintFlt(float fltNum, unsigned int precision) +{ + 30048e4: 7139 addi sp,sp,-64 + 30048e6: de06 sw ra,60(sp) + 30048e8: dc22 sw s0,56(sp) + 30048ea: 0080 addi s0,sp,64 + 30048ec: fca42627 fsw fa0,-52(s0) + 30048f0: fca42423 sw a0,-56(s0) + unsigned int cnt = 0; + 30048f4: fe042623 sw zero,-20(s0) + unsigned int floatScale; + + if (fltNum < 0) { + 30048f8: fcc42787 flw fa5,-52(s0) + 30048fc: f0000753 fmv.w.x fa4,zero + 3004900: a0e797d3 flt.s a5,fa5,fa4 + 3004904: cf99 beqz a5,3004922 + DBG_PrintCh('-'); + 3004906: 02d00513 li a0,45 + 300490a: 3b89 jal ra,300465c + cnt += 1; + 300490c: fec42783 lw a5,-20(s0) + 3004910: 0785 addi a5,a5,1 + 3004912: fef42623 sw a5,-20(s0) + fltNum = -fltNum; + 3004916: fcc42787 flw fa5,-52(s0) + 300491a: 20f797d3 fneg.s fa5,fa5 + 300491e: fcf42627 fsw fa5,-52(s0) + } + int integerVal = (int)fltNum; + 3004922: fcc42787 flw fa5,-52(s0) + 3004926: c00797d3 fcvt.w.s a5,fa5,rtz + 300492a: fef42023 sw a5,-32(s0) + floatScale = DBG_Pow(10, (precision + 1)); /* 10: decimal */ + 300492e: fc842783 lw a5,-56(s0) + 3004932: 0785 addi a5,a5,1 + 3004934: 85be mv a1,a5 + 3004936: 4529 li a0,10 + 3004938: 3b45 jal ra,30046e8 + 300493a: fca42e23 sw a0,-36(s0) + int floatVal = (long)(floatScale * (fltNum - integerVal)); + 300493e: fdc42783 lw a5,-36(s0) + 3004942: d017f753 fcvt.s.wu fa4,a5 + 3004946: fe042783 lw a5,-32(s0) + 300494a: d007f7d3 fcvt.s.w fa5,a5 + 300494e: fcc42687 flw fa3,-52(s0) + 3004952: 08f6f7d3 fsub.s fa5,fa3,fa5 + 3004956: 10f777d3 fmul.s fa5,fa4,fa5 + 300495a: c00797d3 fcvt.w.s a5,fa5,rtz + 300495e: fef42423 sw a5,-24(s0) + /* Half-adjust: round up or round down */ + if (floatVal % DECIMAL_BASE >= HALF_ADJUST_BOUNDARY) { + 3004962: fe842703 lw a4,-24(s0) + 3004966: 47a9 li a5,10 + 3004968: 02f77733 remu a4,a4,a5 + 300496c: 4791 li a5,4 + 300496e: 00e7fb63 bgeu a5,a4,3004984 + floatVal = floatVal / DECIMAL_BASE + 1; + 3004972: fe842703 lw a4,-24(s0) + 3004976: 47a9 li a5,10 + 3004978: 02f757b3 divu a5,a4,a5 + 300497c: 0785 addi a5,a5,1 + 300497e: fef42423 sw a5,-24(s0) + 3004982: a801 j 3004992 + } else { + floatVal = floatVal / DECIMAL_BASE; + 3004984: fe842703 lw a4,-24(s0) + 3004988: 47a9 li a5,10 + 300498a: 02f757b3 divu a5,a4,a5 + 300498e: fef42423 sw a5,-24(s0) + } + cnt += DBG_PrintInt(integerVal); + 3004992: fe042503 lw a0,-32(s0) + 3004996: 3575 jal ra,3004842 + 3004998: 872a mv a4,a0 + 300499a: fec42783 lw a5,-20(s0) + 300499e: 97ba add a5,a5,a4 + 30049a0: fef42623 sw a5,-20(s0) + DBG_PrintCh('.'); + 30049a4: 02e00513 li a0,46 + 30049a8: 3955 jal ra,300465c + cnt += 1; + 30049aa: fec42783 lw a5,-20(s0) + 30049ae: 0785 addi a5,a5,1 + 30049b0: fef42623 sw a5,-20(s0) + /* Pad 0 in float part */ + unsigned int fltCnt = DBG_CountDigits(floatVal, DECIMAL); + 30049b4: 45a9 li a1,10 + 30049b6: fe842503 lw a0,-24(s0) + 30049ba: 33bd jal ra,3004728 + 30049bc: fca42c23 sw a0,-40(s0) + if (precision > fltCnt) { + 30049c0: fc842703 lw a4,-56(s0) + 30049c4: fd842783 lw a5,-40(s0) + 30049c8: 02e7f763 bgeu a5,a4,30049f6 + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 30049cc: fe042223 sw zero,-28(s0) + 30049d0: a809 j 30049e2 + DBG_PrintCh('0'); /* add '0' */ + 30049d2: 03000513 li a0,48 + 30049d6: 3159 jal ra,300465c + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 30049d8: fe442783 lw a5,-28(s0) + 30049dc: 0785 addi a5,a5,1 + 30049de: fef42223 sw a5,-28(s0) + 30049e2: fc842703 lw a4,-56(s0) + 30049e6: fd842783 lw a5,-40(s0) + 30049ea: 40f707b3 sub a5,a4,a5 + 30049ee: fe442703 lw a4,-28(s0) + 30049f2: fef760e3 bltu a4,a5,30049d2 + } + } + DBG_PutUnsignedNum(floatVal, DECIMAL, fltCnt); /* print unsigned number */ + 30049f6: fe842783 lw a5,-24(s0) + 30049fa: fd842603 lw a2,-40(s0) + 30049fe: 45a9 li a1,10 + 3004a00: 853e mv a0,a5 + 3004a02: 3379 jal ra,3004790 + cnt += precision; + 3004a04: fec42703 lw a4,-20(s0) + 3004a08: fc842783 lw a5,-56(s0) + 3004a0c: 97ba add a5,a5,a4 + 3004a0e: fef42623 sw a5,-20(s0) + return cnt; + 3004a12: fec42783 lw a5,-20(s0) +} + 3004a16: 853e mv a0,a5 + 3004a18: 50f2 lw ra,60(sp) + 3004a1a: 5462 lw s0,56(sp) + 3004a1c: 6121 addi sp,sp,64 + 3004a1e: 8082 ret + +03004a20 : + * @param ch The format specifier. + * @param paramList The pointer of the variable parameter list. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int ParseSpecifier(const char ch, va_list *paramList) +{ + 3004a20: 7139 addi sp,sp,-64 + 3004a22: de06 sw ra,60(sp) + 3004a24: dc22 sw s0,56(sp) + 3004a26: 0080 addi s0,sp,64 + 3004a28: 87aa mv a5,a0 + 3004a2a: fcb42423 sw a1,-56(s0) + 3004a2e: fcf407a3 sb a5,-49(s0) + unsigned int cnt = 0; + 3004a32: fe042623 sw zero,-20(s0) + unsigned int tmpCnt; + char chVal = 0; + 3004a36: fe0405a3 sb zero,-21(s0) + const char *strVal = NULL; + 3004a3a: fe042223 sw zero,-28(s0) + int intVal = 0; + 3004a3e: fe042023 sw zero,-32(s0) + unsigned int unsignedVal = 0; + 3004a42: fc042e23 sw zero,-36(s0) + unsigned int hexVal = 0; + 3004a46: fc042c23 sw zero,-40(s0) + float fltVal = 0; + 3004a4a: fc042a23 sw zero,-44(s0) + switch (ch) { + 3004a4e: fcf40783 lb a5,-49(s0) + 3004a52: fa878793 addi a5,a5,-88 + 3004a56: 02000713 li a4,32 + 3004a5a: 14f76063 bltu a4,a5,3004b9a + 3004a5e: 00279713 slli a4,a5,0x2 + 3004a62: 030077b7 lui a5,0x3007 + 3004a66: 8f878793 addi a5,a5,-1800 # 30068f8 + 3004a6a: 97ba add a5,a5,a4 + 3004a6c: 439c lw a5,0(a5) + 3004a6e: 8782 jr a5 + case 'c': /* Character format data. */ + chVal = VA_ARG(*paramList, int); /* Use type int because of byte alignment */ + 3004a70: fc842783 lw a5,-56(s0) + 3004a74: 439c lw a5,0(a5) + 3004a76: 00478693 addi a3,a5,4 + 3004a7a: fc842703 lw a4,-56(s0) + 3004a7e: c314 sw a3,0(a4) + 3004a80: 439c lw a5,0(a5) + 3004a82: fef405a3 sb a5,-21(s0) + DBG_PrintCh(chVal); + 3004a86: feb40783 lb a5,-21(s0) + 3004a8a: 853e mv a0,a5 + 3004a8c: 3ec1 jal ra,300465c + cnt += 1; + 3004a8e: fec42783 lw a5,-20(s0) + 3004a92: 0785 addi a5,a5,1 + 3004a94: fef42623 sw a5,-20(s0) + break; + 3004a98: aa19 j 3004bae + case 's': /* String format data. */ + strVal = VA_ARG(*paramList, const char *); + 3004a9a: fc842783 lw a5,-56(s0) + 3004a9e: 439c lw a5,0(a5) + 3004aa0: 00478693 addi a3,a5,4 + 3004aa4: fc842703 lw a4,-56(s0) + 3004aa8: c314 sw a3,0(a4) + 3004aaa: 439c lw a5,0(a5) + 3004aac: fef42223 sw a5,-28(s0) + cnt += DBG_PrintStr(strVal); + 3004ab0: fe442503 lw a0,-28(s0) + 3004ab4: 36ed jal ra,300469e + 3004ab6: 87aa mv a5,a0 + 3004ab8: 873e mv a4,a5 + 3004aba: fec42783 lw a5,-20(s0) + 3004abe: 97ba add a5,a5,a4 + 3004ac0: fef42623 sw a5,-20(s0) + break; + 3004ac4: a0ed j 3004bae + case 'd': /* Integer decimal data. */ + intVal = VA_ARG(*paramList, int); + 3004ac6: fc842783 lw a5,-56(s0) + 3004aca: 439c lw a5,0(a5) + 3004acc: 00478693 addi a3,a5,4 + 3004ad0: fc842703 lw a4,-56(s0) + 3004ad4: c314 sw a3,0(a4) + 3004ad6: 439c lw a5,0(a5) + 3004ad8: fef42023 sw a5,-32(s0) + cnt += DBG_PrintInt(intVal); + 3004adc: fe042503 lw a0,-32(s0) + 3004ae0: 338d jal ra,3004842 + 3004ae2: 872a mv a4,a0 + 3004ae4: fec42783 lw a5,-20(s0) + 3004ae8: 97ba add a5,a5,a4 + 3004aea: fef42623 sw a5,-20(s0) + break; + 3004aee: a0c1 j 3004bae + case 'u': /* Unsigned decimal data. */ + unsignedVal = VA_ARG(*paramList, unsigned int); + 3004af0: fc842783 lw a5,-56(s0) + 3004af4: 439c lw a5,0(a5) + 3004af6: 00478693 addi a3,a5,4 + 3004afa: fc842703 lw a4,-56(s0) + 3004afe: c314 sw a3,0(a4) + 3004b00: 439c lw a5,0(a5) + 3004b02: fcf42e23 sw a5,-36(s0) + tmpCnt = DBG_CountDigits(unsignedVal, DECIMAL); + 3004b06: fdc42783 lw a5,-36(s0) + 3004b0a: 45a9 li a1,10 + 3004b0c: 853e mv a0,a5 + 3004b0e: 3929 jal ra,3004728 + 3004b10: fca42823 sw a0,-48(s0) + DBG_PutUnsignedNum(unsignedVal, DECIMAL, tmpCnt); + 3004b14: fd042603 lw a2,-48(s0) + 3004b18: 45a9 li a1,10 + 3004b1a: fdc42503 lw a0,-36(s0) + 3004b1e: 398d jal ra,3004790 + cnt += tmpCnt; + 3004b20: fec42703 lw a4,-20(s0) + 3004b24: fd042783 lw a5,-48(s0) + 3004b28: 97ba add a5,a5,a4 + 3004b2a: fef42623 sw a5,-20(s0) + break; + 3004b2e: a041 j 3004bae + case 'x': /* Hexadecimal data. */ + case 'X': + case 'p': /* Address data. */ + hexVal = VA_ARG(*paramList, unsigned int); + 3004b30: fc842783 lw a5,-56(s0) + 3004b34: 439c lw a5,0(a5) + 3004b36: 00478693 addi a3,a5,4 + 3004b3a: fc842703 lw a4,-56(s0) + 3004b3e: c314 sw a3,0(a4) + 3004b40: 439c lw a5,0(a5) + 3004b42: fcf42c23 sw a5,-40(s0) + cnt += DBG_PrintHex(hexVal); + 3004b46: fd842503 lw a0,-40(s0) + 3004b4a: 3b99 jal ra,30048a0 + 3004b4c: 872a mv a4,a0 + 3004b4e: fec42783 lw a5,-20(s0) + 3004b52: 97ba add a5,a5,a4 + 3004b54: fef42623 sw a5,-20(s0) + break; + 3004b58: a899 j 3004bae + case 'f': /* Floating-point data. */ + fltVal = VA_ARG(*paramList, double); + 3004b5a: fc842783 lw a5,-56(s0) + 3004b5e: 439c lw a5,0(a5) + 3004b60: 079d addi a5,a5,7 + 3004b62: 9be1 andi a5,a5,-8 + 3004b64: 00878693 addi a3,a5,8 + 3004b68: fc842703 lw a4,-56(s0) + 3004b6c: c314 sw a3,0(a4) + 3004b6e: 0047a803 lw a6,4(a5) + 3004b72: 439c lw a5,0(a5) + 3004b74: 853e mv a0,a5 + 3004b76: 85c2 mv a1,a6 + 3004b78: 7b0010ef jal ra,3006328 <__truncdfsf2> + 3004b7c: 20a507d3 fmv.s fa5,fa0 + 3004b80: fcf42a27 fsw fa5,-44(s0) + cnt += DBG_PrintFlt(fltVal, 5); /* default precision: 5 */ + 3004b84: 4515 li a0,5 + 3004b86: fd442507 flw fa0,-44(s0) + 3004b8a: 3ba9 jal ra,30048e4 + 3004b8c: 872a mv a4,a0 + 3004b8e: fec42783 lw a5,-20(s0) + 3004b92: 97ba add a5,a5,a4 + 3004b94: fef42623 sw a5,-20(s0) + break; + 3004b98: a819 j 3004bae + default: + DBG_PrintCh(ch); + 3004b9a: fcf40783 lb a5,-49(s0) + 3004b9e: 853e mv a0,a5 + 3004ba0: 3c75 jal ra,300465c + cnt += 1; + 3004ba2: fec42783 lw a5,-20(s0) + 3004ba6: 0785 addi a5,a5,1 + 3004ba8: fef42623 sw a5,-20(s0) + break; + 3004bac: 0001 nop + } + return cnt; + 3004bae: fec42783 lw a5,-20(s0) +} + 3004bb2: 853e mv a0,a5 + 3004bb4: 50f2 lw ra,60(sp) + 3004bb6: 5462 lw s0,56(sp) + 3004bb8: 6121 addi sp,sp,64 + 3004bba: 8082 ret + +03004bbc : + * @param intNum The decimal number to be printed. + * @param fieldWidth Field width. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintIntWithField(int intNum, int fieldWidth) +{ + 3004bbc: 7139 addi sp,sp,-64 + 3004bbe: de06 sw ra,60(sp) + 3004bc0: dc22 sw s0,56(sp) + 3004bc2: 0080 addi s0,sp,64 + 3004bc4: fca42623 sw a0,-52(s0) + 3004bc8: fcb42423 sw a1,-56(s0) + int zeroCnt = 0; + 3004bcc: fc042e23 sw zero,-36(s0) + int digitsCnt = 0; + 3004bd0: fe042623 sw zero,-20(s0) + unsigned int cnt = 0; + 3004bd4: fe042423 sw zero,-24(s0) + + if (intNum == 0) { + 3004bd8: fcc42783 lw a5,-52(s0) + 3004bdc: e791 bnez a5,3004be8 + DBG_PrintCh('0'); + 3004bde: 03000513 li a0,48 + 3004be2: 3cad jal ra,300465c + return 1; + 3004be4: 4785 li a5,1 + 3004be6: a0dd j 3004ccc + } + if (intNum < 0) { + 3004be8: fcc42783 lw a5,-52(s0) + 3004bec: 0607dd63 bgez a5,3004c66 + DBG_PrintCh('-'); /* add symbol */ + 3004bf0: 02d00513 li a0,45 + 3004bf4: 34a5 jal ra,300465c + cnt++; + 3004bf6: fe842783 lw a5,-24(s0) + 3004bfa: 0785 addi a5,a5,1 + 3004bfc: fef42423 sw a5,-24(s0) + intNum = -intNum; + 3004c00: fcc42783 lw a5,-52(s0) + 3004c04: 40f007b3 neg a5,a5 + 3004c08: fcf42623 sw a5,-52(s0) + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 3004c0c: 45a9 li a1,10 + 3004c0e: fcc42503 lw a0,-52(s0) + 3004c12: 3e19 jal ra,3004728 + 3004c14: 87aa mv a5,a0 + 3004c16: fef42623 sw a5,-20(s0) + zeroCnt = fieldWidth - digitsCnt; + 3004c1a: fc842703 lw a4,-56(s0) + 3004c1e: fec42783 lw a5,-20(s0) + 3004c22: 40f707b3 sub a5,a4,a5 + 3004c26: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004c2a: fe042223 sw zero,-28(s0) + 3004c2e: a831 j 3004c4a + DBG_PrintCh('0'); /* add '0' */ + 3004c30: 03000513 li a0,48 + 3004c34: 3425 jal ra,300465c + cnt++; + 3004c36: fe842783 lw a5,-24(s0) + 3004c3a: 0785 addi a5,a5,1 + 3004c3c: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004c40: fe442783 lw a5,-28(s0) + 3004c44: 0785 addi a5,a5,1 + 3004c46: fef42223 sw a5,-28(s0) + 3004c4a: fe442703 lw a4,-28(s0) + 3004c4e: fdc42783 lw a5,-36(s0) + 3004c52: fcf74fe3 blt a4,a5,3004c30 + } + cnt += digitsCnt; + 3004c56: fec42783 lw a5,-20(s0) + 3004c5a: fe842703 lw a4,-24(s0) + 3004c5e: 97ba add a5,a5,a4 + 3004c60: fef42423 sw a5,-24(s0) + 3004c64: a891 j 3004cb8 + } else { + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 3004c66: 45a9 li a1,10 + 3004c68: fcc42503 lw a0,-52(s0) + 3004c6c: 3c75 jal ra,3004728 + 3004c6e: 87aa mv a5,a0 + 3004c70: fef42623 sw a5,-20(s0) + cnt = digitsCnt; + 3004c74: fec42783 lw a5,-20(s0) + 3004c78: fef42423 sw a5,-24(s0) + zeroCnt = fieldWidth - digitsCnt; + 3004c7c: fc842703 lw a4,-56(s0) + 3004c80: fec42783 lw a5,-20(s0) + 3004c84: 40f707b3 sub a5,a4,a5 + 3004c88: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004c8c: fe042023 sw zero,-32(s0) + 3004c90: a831 j 3004cac + DBG_PrintCh('0'); /* add '0' */ + 3004c92: 03000513 li a0,48 + 3004c96: 32d9 jal ra,300465c + cnt++; + 3004c98: fe842783 lw a5,-24(s0) + 3004c9c: 0785 addi a5,a5,1 + 3004c9e: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004ca2: fe042783 lw a5,-32(s0) + 3004ca6: 0785 addi a5,a5,1 + 3004ca8: fef42023 sw a5,-32(s0) + 3004cac: fe042703 lw a4,-32(s0) + 3004cb0: fdc42783 lw a5,-36(s0) + 3004cb4: fcf74fe3 blt a4,a5,3004c92 + } + } + DBG_PutUnsignedNum(intNum, DECIMAL, digitsCnt); + 3004cb8: fcc42783 lw a5,-52(s0) + 3004cbc: fec42703 lw a4,-20(s0) + 3004cc0: 863a mv a2,a4 + 3004cc2: 45a9 li a1,10 + 3004cc4: 853e mv a0,a5 + 3004cc6: 34e9 jal ra,3004790 + return cnt; + 3004cc8: fe842783 lw a5,-24(s0) +} + 3004ccc: 853e mv a0,a5 + 3004cce: 50f2 lw ra,60(sp) + 3004cd0: 5462 lw s0,56(sp) + 3004cd2: 6121 addi sp,sp,64 + 3004cd4: 8082 ret + +03004cd6 : + +static int DBG_Atoi(const char **s) +{ + 3004cd6: 7179 addi sp,sp,-48 + 3004cd8: d622 sw s0,44(sp) + 3004cda: 1800 addi s0,sp,48 + 3004cdc: fca42e23 sw a0,-36(s0) + int i, c; + + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 3004ce0: fe042623 sw zero,-20(s0) + 3004ce4: a02d j 3004d0e + i = i * 10 + c - '0'; /* 10: decimal */ + 3004ce6: fec42703 lw a4,-20(s0) + 3004cea: 47a9 li a5,10 + 3004cec: 02f70733 mul a4,a4,a5 + 3004cf0: fe842783 lw a5,-24(s0) + 3004cf4: 97ba add a5,a5,a4 + 3004cf6: fd078793 addi a5,a5,-48 + 3004cfa: fef42623 sw a5,-20(s0) + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 3004cfe: fdc42783 lw a5,-36(s0) + 3004d02: 439c lw a5,0(a5) + 3004d04: 00178713 addi a4,a5,1 + 3004d08: fdc42783 lw a5,-36(s0) + 3004d0c: c398 sw a4,0(a5) + 3004d0e: fdc42783 lw a5,-36(s0) + 3004d12: 439c lw a5,0(a5) + 3004d14: 00078783 lb a5,0(a5) + 3004d18: fef42423 sw a5,-24(s0) + 3004d1c: fe842703 lw a4,-24(s0) + 3004d20: 02f00793 li a5,47 + 3004d24: 00e7d863 bge a5,a4,3004d34 + 3004d28: fe842703 lw a4,-24(s0) + 3004d2c: 03900793 li a5,57 + 3004d30: fae7dbe3 bge a5,a4,3004ce6 + } + return i; + 3004d34: fec42783 lw a5,-20(s0) +} + 3004d38: 853e mv a0,a5 + 3004d3a: 5432 lw s0,44(sp) + 3004d3c: 6145 addi sp,sp,48 + 3004d3e: 8082 ret + +03004d40 : + * @param ... Variable parameter list. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, return BASE_STATUS_ERROR. + */ +int DBG_UartPrintf(const char *format, ...) +{ + 3004d40: 711d addi sp,sp,-96 + 3004d42: de06 sw ra,60(sp) + 3004d44: dc22 sw s0,56(sp) + 3004d46: 0080 addi s0,sp,64 + 3004d48: fca42623 sw a0,-52(s0) + 3004d4c: c04c sw a1,4(s0) + 3004d4e: c410 sw a2,8(s0) + 3004d50: c454 sw a3,12(s0) + 3004d52: c818 sw a4,16(s0) + 3004d54: c85c sw a5,20(s0) + 3004d56: 01042c23 sw a6,24(s0) + 3004d5a: 01142e23 sw a7,28(s0) + DEBUG_ASSERT_PARAM(format != NULL); + int cnt = 0; + 3004d5e: fe042623 sw zero,-20(s0) + int fieldWidth = 0; + 3004d62: fe042423 sw zero,-24(s0) + int floatPrecision = 0; + 3004d66: fe042223 sw zero,-28(s0) + float fltVal = 0; + 3004d6a: fe042023 sw zero,-32(s0) + int intVal = 0; + 3004d6e: fc042e23 sw zero,-36(s0) + va_list paramList; + VA_START(paramList, format); + 3004d72: 02040793 addi a5,s0,32 + 3004d76: 1791 addi a5,a5,-28 + 3004d78: fcf42c23 sw a5,-40(s0) + + while (*format != '\0') { + 3004d7c: aa09 j 3004e8e + if (*format != '%') { + 3004d7e: fcc42783 lw a5,-52(s0) + 3004d82: 00078703 lb a4,0(a5) + 3004d86: 02500793 li a5,37 + 3004d8a: 00f70e63 beq a4,a5,3004da6 + DBG_PrintCh(*format); + 3004d8e: fcc42783 lw a5,-52(s0) + 3004d92: 00078783 lb a5,0(a5) + 3004d96: 853e mv a0,a5 + 3004d98: 30d1 jal ra,300465c + cnt += 1; + 3004d9a: fec42783 lw a5,-20(s0) + 3004d9e: 0785 addi a5,a5,1 + 3004da0: fef42623 sw a5,-20(s0) + 3004da4: a0c5 j 3004e84 + } else { + format++; + 3004da6: fcc42783 lw a5,-52(s0) + 3004daa: 0785 addi a5,a5,1 + 3004dac: fcf42623 sw a5,-52(s0) + if (*format == '0') { + 3004db0: fcc42783 lw a5,-52(s0) + 3004db4: 00078703 lb a4,0(a5) + 3004db8: 03000793 li a5,48 + 3004dbc: 04f71263 bne a4,a5,3004e00 + format++; + 3004dc0: fcc42783 lw a5,-52(s0) + 3004dc4: 0785 addi a5,a5,1 + 3004dc6: fcf42623 sw a5,-52(s0) + fieldWidth = DBG_Atoi(&format); + 3004dca: fcc40793 addi a5,s0,-52 + 3004dce: 853e mv a0,a5 + 3004dd0: 3719 jal ra,3004cd6 + 3004dd2: fea42423 sw a0,-24(s0) + intVal = VA_ARG(paramList, int); + 3004dd6: fd842783 lw a5,-40(s0) + 3004dda: 00478713 addi a4,a5,4 + 3004dde: fce42c23 sw a4,-40(s0) + 3004de2: 439c lw a5,0(a5) + 3004de4: fcf42e23 sw a5,-36(s0) + cnt += DBG_PrintIntWithField(intVal, fieldWidth); + 3004de8: fe842583 lw a1,-24(s0) + 3004dec: fdc42503 lw a0,-36(s0) + 3004df0: 33f1 jal ra,3004bbc + 3004df2: 872a mv a4,a0 + 3004df4: fec42783 lw a5,-20(s0) + 3004df8: 97ba add a5,a5,a4 + 3004dfa: fef42623 sw a5,-20(s0) + 3004dfe: a059 j 3004e84 + } else if (*format == '.') { + 3004e00: fcc42783 lw a5,-52(s0) + 3004e04: 00078703 lb a4,0(a5) + 3004e08: 02e00793 li a5,46 + 3004e0c: 04f71d63 bne a4,a5,3004e66 + format++; + 3004e10: fcc42783 lw a5,-52(s0) + 3004e14: 0785 addi a5,a5,1 + 3004e16: fcf42623 sw a5,-52(s0) + floatPrecision = DBG_Atoi(&format); + 3004e1a: fcc40793 addi a5,s0,-52 + 3004e1e: 853e mv a0,a5 + 3004e20: 3d5d jal ra,3004cd6 + 3004e22: fea42223 sw a0,-28(s0) + fltVal = VA_ARG(paramList, double); + 3004e26: fd842783 lw a5,-40(s0) + 3004e2a: 079d addi a5,a5,7 + 3004e2c: 9be1 andi a5,a5,-8 + 3004e2e: 00878713 addi a4,a5,8 + 3004e32: fce42c23 sw a4,-40(s0) + 3004e36: 0047a803 lw a6,4(a5) + 3004e3a: 439c lw a5,0(a5) + 3004e3c: 853e mv a0,a5 + 3004e3e: 85c2 mv a1,a6 + 3004e40: 4e8010ef jal ra,3006328 <__truncdfsf2> + 3004e44: 20a507d3 fmv.s fa5,fa0 + 3004e48: fef42027 fsw fa5,-32(s0) + cnt += DBG_PrintFlt(fltVal, floatPrecision); + 3004e4c: fe442783 lw a5,-28(s0) + 3004e50: 853e mv a0,a5 + 3004e52: fe042507 flw fa0,-32(s0) + 3004e56: 3479 jal ra,30048e4 + 3004e58: 872a mv a4,a0 + 3004e5a: fec42783 lw a5,-20(s0) + 3004e5e: 97ba add a5,a5,a4 + 3004e60: fef42623 sw a5,-20(s0) + 3004e64: a005 j 3004e84 + } else { + cnt += ParseSpecifier(*format, ¶mList); + 3004e66: fcc42783 lw a5,-52(s0) + 3004e6a: 00078783 lb a5,0(a5) + 3004e6e: fd840713 addi a4,s0,-40 + 3004e72: 85ba mv a1,a4 + 3004e74: 853e mv a0,a5 + 3004e76: 366d jal ra,3004a20 + 3004e78: 872a mv a4,a0 + 3004e7a: fec42783 lw a5,-20(s0) + 3004e7e: 97ba add a5,a5,a4 + 3004e80: fef42623 sw a5,-20(s0) + } + } + format++; + 3004e84: fcc42783 lw a5,-52(s0) + 3004e88: 0785 addi a5,a5,1 + 3004e8a: fcf42623 sw a5,-52(s0) + while (*format != '\0') { + 3004e8e: fcc42783 lw a5,-52(s0) + 3004e92: 00078783 lb a5,0(a5) + 3004e96: ee0794e3 bnez a5,3004d7e + } + VA_END(paramList); + return cnt; + 3004e9a: fec42783 lw a5,-20(s0) +} + 3004e9e: 853e mv a0,a5 + 3004ea0: 50f2 lw ra,60(sp) + 3004ea2: 5462 lw s0,56(sp) + 3004ea4: 6125 addi sp,sp,96 + 3004ea6: 8082 ret + +03004ea8 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param regValue value of @ref IOCMG_REG. + * @retval None. + */ +static inline void DCL_IOCMG_SetRegValue(IOCMG_REG *iocmgRegx, unsigned int regValue) +{ + 3004ea8: 1101 addi sp,sp,-32 + 3004eaa: ce06 sw ra,28(sp) + 3004eac: cc22 sw s0,24(sp) + 3004eae: 1000 addi s0,sp,32 + 3004eb0: fea42623 sw a0,-20(s0) + 3004eb4: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004eb8: fec42703 lw a4,-20(s0) + 3004ebc: 77c1 lui a5,0xffff0 + 3004ebe: 8f7d and a4,a4,a5 + 3004ec0: 147f07b7 lui a5,0x147f0 + 3004ec4: 00f70a63 beq a4,a5,3004ed8 + 3004ec8: 08b00593 li a1,139 + 3004ecc: 030077b7 lui a5,0x3007 + 3004ed0: 97c78513 addi a0,a5,-1668 # 300697c + 3004ed4: 2df1 jal ra,30055b0 + 3004ed6: a001 j 3004ed6 + iocmgRegx->reg = regValue; + 3004ed8: fec42783 lw a5,-20(s0) + 3004edc: fe842703 lw a4,-24(s0) + 3004ee0: c398 sw a4,0(a5) +} + 3004ee2: 0001 nop + 3004ee4: 40f2 lw ra,28(sp) + 3004ee6: 4462 lw s0,24(sp) + 3004ee8: 6105 addi sp,sp,32 + 3004eea: 8082 ret + +03004eec : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param driveRate value of @ref IOCMG_DriveRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetDriveRate(IOCMG_REG *iocmgRegx, IOCMG_DriveRate driveRate) +{ + 3004eec: 1101 addi sp,sp,-32 + 3004eee: ce06 sw ra,28(sp) + 3004ef0: cc22 sw s0,24(sp) + 3004ef2: 1000 addi s0,sp,32 + 3004ef4: fea42623 sw a0,-20(s0) + 3004ef8: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004efc: fec42703 lw a4,-20(s0) + 3004f00: 77c1 lui a5,0xffff0 + 3004f02: 8f7d and a4,a4,a5 + 3004f04: 147f07b7 lui a5,0x147f0 + 3004f08: 00f70a63 beq a4,a5,3004f1c + 3004f0c: 0ba00593 li a1,186 + 3004f10: 030077b7 lui a5,0x3007 + 3004f14: 97c78513 addi a0,a5,-1668 # 300697c + 3004f18: 2d61 jal ra,30055b0 + 3004f1a: a001 j 3004f1a + IOCMG_PARAM_CHECK_NO_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4); + 3004f1c: fe842703 lw a4,-24(s0) + 3004f20: 478d li a5,3 + 3004f22: 00e7fa63 bgeu a5,a4,3004f36 + 3004f26: 0bb00593 li a1,187 + 3004f2a: 030077b7 lui a5,0x3007 + 3004f2e: 97c78513 addi a0,a5,-1668 # 300697c + 3004f32: 2dbd jal ra,30055b0 + 3004f34: a839 j 3004f52 + iocmgRegx->BIT.ds = driveRate; + 3004f36: fe842783 lw a5,-24(s0) + 3004f3a: 8b8d andi a5,a5,3 + 3004f3c: 0ff7f693 andi a3,a5,255 + 3004f40: fec42703 lw a4,-20(s0) + 3004f44: 431c lw a5,0(a4) + 3004f46: 8a8d andi a3,a3,3 + 3004f48: 0692 slli a3,a3,0x4 + 3004f4a: fcf7f793 andi a5,a5,-49 + 3004f4e: 8fd5 or a5,a5,a3 + 3004f50: c31c sw a5,0(a4) +} + 3004f52: 40f2 lw ra,28(sp) + 3004f54: 4462 lw s0,24(sp) + 3004f56: 6105 addi sp,sp,32 + 3004f58: 8082 ret + +03004f5a : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param pullMode value of @ref IOCMG_PullMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetPullMode(IOCMG_REG *iocmgRegx, IOCMG_PullMode pullMode) +{ + 3004f5a: 1101 addi sp,sp,-32 + 3004f5c: ce06 sw ra,28(sp) + 3004f5e: cc22 sw s0,24(sp) + 3004f60: 1000 addi s0,sp,32 + 3004f62: fea42623 sw a0,-20(s0) + 3004f66: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004f6a: fec42703 lw a4,-20(s0) + 3004f6e: 77c1 lui a5,0xffff0 + 3004f70: 8f7d and a4,a4,a5 + 3004f72: 147f07b7 lui a5,0x147f0 + 3004f76: 00f70a63 beq a4,a5,3004f8a + 3004f7a: 0d200593 li a1,210 + 3004f7e: 030077b7 lui a5,0x3007 + 3004f82: 97c78513 addi a0,a5,-1668 # 300697c + 3004f86: 252d jal ra,30055b0 + 3004f88: a001 j 3004f88 + IOCMG_PARAM_CHECK_NO_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE); + 3004f8a: fe842703 lw a4,-24(s0) + 3004f8e: 478d li a5,3 + 3004f90: 00e7fa63 bgeu a5,a4,3004fa4 + 3004f94: 0d300593 li a1,211 + 3004f98: 030077b7 lui a5,0x3007 + 3004f9c: 97c78513 addi a0,a5,-1668 # 300697c + 3004fa0: 2d01 jal ra,30055b0 + 3004fa2: a835 j 3004fde + iocmgRegx->BIT.pu = (pullMode & 0x02) >> 1; /* 10b: pull up mode */ + 3004fa4: fe842783 lw a5,-24(s0) + 3004fa8: 8385 srli a5,a5,0x1 + 3004faa: 8b85 andi a5,a5,1 + 3004fac: 0ff7f693 andi a3,a5,255 + 3004fb0: fec42703 lw a4,-20(s0) + 3004fb4: 431c lw a5,0(a4) + 3004fb6: 8a85 andi a3,a3,1 + 3004fb8: 06a2 slli a3,a3,0x8 + 3004fba: eff7f793 andi a5,a5,-257 + 3004fbe: 8fd5 or a5,a5,a3 + 3004fc0: c31c sw a5,0(a4) + iocmgRegx->BIT.pd = pullMode & 0x01; /* 01b: pull down mode */ + 3004fc2: fe842783 lw a5,-24(s0) + 3004fc6: 8b85 andi a5,a5,1 + 3004fc8: 0ff7f693 andi a3,a5,255 + 3004fcc: fec42703 lw a4,-20(s0) + 3004fd0: 431c lw a5,0(a4) + 3004fd2: 8a85 andi a3,a3,1 + 3004fd4: 069e slli a3,a3,0x7 + 3004fd6: f7f7f793 andi a5,a5,-129 + 3004fda: 8fd5 or a5,a5,a3 + 3004fdc: c31c sw a5,0(a4) +} + 3004fde: 40f2 lw ra,28(sp) + 3004fe0: 4462 lw s0,24(sp) + 3004fe2: 6105 addi sp,sp,32 + 3004fe4: 8082 ret + +03004fe6 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param levelShiftRate value of @ref IOCMG_LevelShiftRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetLevelShiftRate(IOCMG_REG *iocmgRegx, IOCMG_LevelShiftRate levelShiftRate) +{ + 3004fe6: 1101 addi sp,sp,-32 + 3004fe8: ce06 sw ra,28(sp) + 3004fea: cc22 sw s0,24(sp) + 3004fec: 1000 addi s0,sp,32 + 3004fee: fea42623 sw a0,-20(s0) + 3004ff2: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004ff6: fec42703 lw a4,-20(s0) + 3004ffa: 77c1 lui a5,0xffff0 + 3004ffc: 8f7d and a4,a4,a5 + 3004ffe: 147f07b7 lui a5,0x147f0 + 3005002: 00f70a63 beq a4,a5,3005016 + 3005006: 0ed00593 li a1,237 + 300500a: 030077b7 lui a5,0x3007 + 300500e: 97c78513 addi a0,a5,-1668 # 300697c + 3005012: 2b79 jal ra,30055b0 + 3005014: a001 j 3005014 + IOCMG_PARAM_CHECK_NO_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX && levelShiftRate >= LEVEL_SHIFT_RATE_FAST); + 3005016: fe842703 lw a4,-24(s0) + 300501a: 4785 li a5,1 + 300501c: 00e7fa63 bgeu a5,a4,3005030 + 3005020: 0ee00593 li a1,238 + 3005024: 030077b7 lui a5,0x3007 + 3005028: 97c78513 addi a0,a5,-1668 # 300697c + 300502c: 2351 jal ra,30055b0 + 300502e: a839 j 300504c + iocmgRegx->BIT.sr = levelShiftRate; + 3005030: fe842783 lw a5,-24(s0) + 3005034: 8b85 andi a5,a5,1 + 3005036: 0ff7f693 andi a3,a5,255 + 300503a: fec42703 lw a4,-20(s0) + 300503e: 431c lw a5,0(a4) + 3005040: 8a85 andi a3,a3,1 + 3005042: 06a6 slli a3,a3,0x9 + 3005044: dff7f793 andi a5,a5,-513 + 3005048: 8fd5 or a5,a5,a3 + 300504a: c31c sw a5,0(a4) +} + 300504c: 40f2 lw ra,28(sp) + 300504e: 4462 lw s0,24(sp) + 3005050: 6105 addi sp,sp,32 + 3005052: 8082 ret + +03005054 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param schmidtMode value of @ref IOCMG_SchmidtMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetSchmidtMode(IOCMG_REG *iocmgRegx, IOCMG_SchmidtMode schmidtMode) +{ + 3005054: 1101 addi sp,sp,-32 + 3005056: ce06 sw ra,28(sp) + 3005058: cc22 sw s0,24(sp) + 300505a: 1000 addi s0,sp,32 + 300505c: fea42623 sw a0,-20(s0) + 3005060: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3005064: fec42703 lw a4,-20(s0) + 3005068: 77c1 lui a5,0xffff0 + 300506a: 8f7d and a4,a4,a5 + 300506c: 147f07b7 lui a5,0x147f0 + 3005070: 00f70a63 beq a4,a5,3005084 + 3005074: 10500593 li a1,261 + 3005078: 030077b7 lui a5,0x3007 + 300507c: 97c78513 addi a0,a5,-1668 # 300697c + 3005080: 2b05 jal ra,30055b0 + 3005082: a001 j 3005082 + IOCMG_PARAM_CHECK_NO_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE); + 3005084: fe842703 lw a4,-24(s0) + 3005088: 4785 li a5,1 + 300508a: 00e7fa63 bgeu a5,a4,300509e + 300508e: 10600593 li a1,262 + 3005092: 030077b7 lui a5,0x3007 + 3005096: 97c78513 addi a0,a5,-1668 # 300697c + 300509a: 2b19 jal ra,30055b0 + 300509c: a839 j 30050ba + iocmgRegx->BIT.se = schmidtMode; + 300509e: fe842783 lw a5,-24(s0) + 30050a2: 8b85 andi a5,a5,1 + 30050a4: 0ff7f693 andi a3,a5,255 + 30050a8: fec42703 lw a4,-20(s0) + 30050ac: 431c lw a5,0(a4) + 30050ae: 8a85 andi a3,a3,1 + 30050b0: 06aa slli a3,a3,0xa + 30050b2: bff7f793 andi a5,a5,-1025 + 30050b6: 8fd5 or a5,a5,a3 + 30050b8: c31c sw a5,0(a4) +} + 30050ba: 40f2 lw ra,28(sp) + 30050bc: 4462 lw s0,24(sp) + 30050be: 6105 addi sp,sp,32 + 30050c0: 8082 ret + +030050c2 : + * @brief Get pins iocmg reg address + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_REG iocmg reg address. + */ +static IOCMG_REG* IOCMG_GetRegAddr(unsigned int pinTypedef) +{ + 30050c2: 7179 addi sp,sp,-48 + 30050c4: d622 sw s0,44(sp) + 30050c6: 1800 addi s0,sp,48 + 30050c8: fca42e23 sw a0,-36(s0) + /* decode pin's iocmg reg offset address in base address, and conver value to point address */ + unsigned int iocmgBaseAddrValue = (uintptr_t)IOCMG_BASE; + 30050cc: 147f07b7 lui a5,0x147f0 + 30050d0: fef42623 sw a5,-20(s0) + unsigned int iocmgRegOffsetAddrValue = (pinTypedef >> 16) & 0x00000FFF; /* 16 : shift 16 bit */ + 30050d4: fdc42783 lw a5,-36(s0) + 30050d8: 0107d713 srli a4,a5,0x10 + 30050dc: 6785 lui a5,0x1 + 30050de: 17fd addi a5,a5,-1 # fff + 30050e0: 8ff9 and a5,a5,a4 + 30050e2: fef42423 sw a5,-24(s0) + IOCMG_REG* iocmgRegxAddr = (IOCMG_REG*)(void*)(iocmgBaseAddrValue + iocmgRegOffsetAddrValue); + 30050e6: fec42703 lw a4,-20(s0) + 30050ea: fe842783 lw a5,-24(s0) + 30050ee: 97ba add a5,a5,a4 + 30050f0: fef42223 sw a5,-28(s0) + if (!IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegxAddr & IOCMG_BASE_ADDR_MASK))) { + 30050f4: fe442703 lw a4,-28(s0) + 30050f8: 77c1 lui a5,0xffff0 + 30050fa: 8f7d and a4,a4,a5 + 30050fc: 147f07b7 lui a5,0x147f0 + 3005100: 00f70463 beq a4,a5,3005108 + return NULL; + 3005104: 4781 li a5,0 + 3005106: a019 j 300510c + } + return iocmgRegxAddr; + 3005108: fe442783 lw a5,-28(s0) +} + 300510c: 853e mv a0,a5 + 300510e: 5432 lw s0,44(sp) + 3005110: 6145 addi sp,sp,48 + 3005112: 8082 ret + +03005114 : + * @brief Set pins as function mode + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinAltFuncMode(unsigned int pinTypedef) +{ + 3005114: 7179 addi sp,sp,-48 + 3005116: d606 sw ra,44(sp) + 3005118: d422 sw s0,40(sp) + 300511a: 1800 addi s0,sp,48 + 300511c: fca42e23 sw a0,-36(s0) + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3005120: fdc42503 lw a0,-36(s0) + 3005124: 3f79 jal ra,30050c2 + 3005126: fea42623 sw a0,-20(s0) + /* get iocmg reg default value */ + unsigned int regValue = pinTypedef & IOCMG_REG_VALUE_MASK; + 300512a: fdc42703 lw a4,-36(s0) + 300512e: 67c1 lui a5,0x10 + 3005130: 17fd addi a5,a5,-1 # ffff + 3005132: 8ff9 and a5,a5,a4 + 3005134: fef42423 sw a5,-24(s0) + DCL_IOCMG_SetRegValue(iocmgRegx, regValue); + 3005138: fe842583 lw a1,-24(s0) + 300513c: fec42503 lw a0,-20(s0) + 3005140: 33a5 jal ra,3004ea8 + return IOCMG_STATUS_OK; + 3005142: 4781 li a5,0 +} + 3005144: 853e mv a0,a5 + 3005146: 50b2 lw ra,44(sp) + 3005148: 5422 lw s0,40(sp) + 300514a: 6145 addi sp,sp,48 + 300514c: 8082 ret + +0300514e : + * @param pinTypedef the pin type defined in iomap.h + * @param pullMode function define as @ref IOCMG_PullMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinPullMode(unsigned int pinTypedef, IOCMG_PullMode pullMode) +{ + 300514e: 7179 addi sp,sp,-48 + 3005150: d606 sw ra,44(sp) + 3005152: d422 sw s0,40(sp) + 3005154: 1800 addi s0,sp,48 + 3005156: fca42e23 sw a0,-36(s0) + 300515a: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE, IOCMG_PARAM_ERROR); + 300515e: fd842703 lw a4,-40(s0) + 3005162: 478d li a5,3 + 3005164: 00e7fb63 bgeu a5,a4,300517a + 3005168: 07800593 li a1,120 + 300516c: 030077b7 lui a5,0x3007 + 3005170: 99c78513 addi a0,a5,-1636 # 300699c + 3005174: 2935 jal ra,30055b0 + 3005176: 4791 li a5,4 + 3005178: a821 j 3005190 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 300517a: fdc42503 lw a0,-36(s0) + 300517e: 3791 jal ra,30050c2 + 3005180: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetPullMode(iocmgRegx, pullMode); + 3005184: fd842583 lw a1,-40(s0) + 3005188: fec42503 lw a0,-20(s0) + 300518c: 33f9 jal ra,3004f5a + return IOCMG_STATUS_OK; + 300518e: 4781 li a5,0 +} + 3005190: 853e mv a0,a5 + 3005192: 50b2 lw ra,44(sp) + 3005194: 5422 lw s0,40(sp) + 3005196: 6145 addi sp,sp,48 + 3005198: 8082 ret + +0300519a : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinSchmidtMode(unsigned int pinTypedef, IOCMG_SchmidtMode schmidtMode) +{ + 300519a: 7179 addi sp,sp,-48 + 300519c: d606 sw ra,44(sp) + 300519e: d422 sw s0,40(sp) + 30051a0: 1800 addi s0,sp,48 + 30051a2: fca42e23 sw a0,-36(s0) + 30051a6: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE, IOCMG_PARAM_ERROR); + 30051aa: fd842703 lw a4,-40(s0) + 30051ae: 4785 li a5,1 + 30051b0: 00e7fb63 bgeu a5,a4,30051c6 + 30051b4: 09300593 li a1,147 + 30051b8: 030077b7 lui a5,0x3007 + 30051bc: 99c78513 addi a0,a5,-1636 # 300699c + 30051c0: 2ec5 jal ra,30055b0 + 30051c2: 4791 li a5,4 + 30051c4: a821 j 30051dc + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 30051c6: fdc42503 lw a0,-36(s0) + 30051ca: 3de5 jal ra,30050c2 + 30051cc: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetSchmidtMode(iocmgRegx, schmidtMode); + 30051d0: fd842583 lw a1,-40(s0) + 30051d4: fec42503 lw a0,-20(s0) + 30051d8: 3db5 jal ra,3005054 + return IOCMG_STATUS_OK; + 30051da: 4781 li a5,0 +} + 30051dc: 853e mv a0,a5 + 30051de: 50b2 lw ra,44(sp) + 30051e0: 5422 lw s0,40(sp) + 30051e2: 6145 addi sp,sp,48 + 30051e4: 8082 ret + +030051e6 : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinLevelShiftRate(unsigned int pinTypedef, IOCMG_LevelShiftRate levelShiftRate) +{ + 30051e6: 7179 addi sp,sp,-48 + 30051e8: d606 sw ra,44(sp) + 30051ea: d422 sw s0,40(sp) + 30051ec: 1800 addi s0,sp,48 + 30051ee: fca42e23 sw a0,-36(s0) + 30051f2: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX, IOCMG_PARAM_ERROR); + 30051f6: fd842703 lw a4,-40(s0) + 30051fa: 4785 li a5,1 + 30051fc: 00e7fb63 bgeu a5,a4,3005212 + 3005200: 0ae00593 li a1,174 + 3005204: 030077b7 lui a5,0x3007 + 3005208: 99c78513 addi a0,a5,-1636 # 300699c + 300520c: 2655 jal ra,30055b0 + 300520e: 4791 li a5,4 + 3005210: a821 j 3005228 + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate >= LEVEL_SHIFT_RATE_FAST, IOCMG_PARAM_ERROR); + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3005212: fdc42503 lw a0,-36(s0) + 3005216: 3575 jal ra,30050c2 + 3005218: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetLevelShiftRate(iocmgRegx, levelShiftRate); + 300521c: fd842583 lw a1,-40(s0) + 3005220: fec42503 lw a0,-20(s0) + 3005224: 33c9 jal ra,3004fe6 + return IOCMG_STATUS_OK; + 3005226: 4781 li a5,0 +} + 3005228: 853e mv a0,a5 + 300522a: 50b2 lw ra,44(sp) + 300522c: 5422 lw s0,40(sp) + 300522e: 6145 addi sp,sp,48 + 3005230: 8082 ret + +03005232 : + * @param pinTypedef the pin type defined in iomap.h + * @param driveRate function define as @ref IOCMG_DriveRate + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinDriveRate(unsigned int pinTypedef, IOCMG_DriveRate driveRate) +{ + 3005232: 7179 addi sp,sp,-48 + 3005234: d606 sw ra,44(sp) + 3005236: d422 sw s0,40(sp) + 3005238: 1800 addi s0,sp,48 + 300523a: fca42e23 sw a0,-36(s0) + 300523e: fcb42c23 sw a1,-40(s0) + /* get iocmg reg address */ + IOCMG_PARAM_CHECK_WITH_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4, IOCMG_PARAM_ERROR); + 3005242: fd842703 lw a4,-40(s0) + 3005246: 478d li a5,3 + 3005248: 00e7fb63 bgeu a5,a4,300525e + 300524c: 0cb00593 li a1,203 + 3005250: 030077b7 lui a5,0x3007 + 3005254: 99c78513 addi a0,a5,-1636 # 300699c + 3005258: 2ea1 jal ra,30055b0 + 300525a: 4791 li a5,4 + 300525c: a821 j 3005274 + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 300525e: fdc42503 lw a0,-36(s0) + 3005262: 3585 jal ra,30050c2 + 3005264: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetDriveRate(iocmgRegx, driveRate); + 3005268: fd842583 lw a1,-40(s0) + 300526c: fec42503 lw a0,-20(s0) + 3005270: 39b5 jal ra,3004eec + return IOCMG_STATUS_OK; + 3005272: 4781 li a5,0 +} + 3005274: 853e mv a0,a5 + 3005276: 50b2 lw ra,44(sp) + 3005278: 5422 lw s0,40(sp) + 300527a: 6145 addi sp,sp,48 + 300527c: 8082 ret + +0300527e : + * @param mode Timer Mode, @ref TIMER_Mode + * @retval true + * @retval false + */ +static inline bool IsTimerMode(TIMER_Mode mode) +{ + 300527e: 1101 addi sp,sp,-32 + 3005280: ce22 sw s0,28(sp) + 3005282: 1000 addi s0,sp,32 + 3005284: fea42623 sw a0,-20(s0) + return (((mode) == TIMER_MODE_RUN_FREE) || + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3005288: fec42783 lw a5,-20(s0) + 300528c: cb99 beqz a5,30052a2 + return (((mode) == TIMER_MODE_RUN_FREE) || + 300528e: fec42703 lw a4,-20(s0) + 3005292: 4785 li a5,1 + 3005294: 00f70763 beq a4,a5,30052a2 + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3005298: fec42703 lw a4,-20(s0) + 300529c: 4789 li a5,2 + 300529e: 00f71463 bne a4,a5,30052a6 + 30052a2: 4785 li a5,1 + 30052a4: a011 j 30052a8 + 30052a6: 4781 li a5,0 + 30052a8: 8b85 andi a5,a5,1 + 30052aa: 9f81 uxtb a5 + ((mode) == TIMER_MODE_RUN_ONTSHOT)); +} + 30052ac: 853e mv a0,a5 + 30052ae: 4472 lw s0,28(sp) + 30052b0: 6105 addi sp,sp,32 + 30052b2: 8082 ret + +030052b4 : + * @param mode Timer Interrupt Type, @ref TIMER_InterruptType + * @retval true + * @retval false + */ +static inline bool IsTimerInterruptType(TIMER_InterruptType interruptType) +{ + 30052b4: 1101 addi sp,sp,-32 + 30052b6: ce22 sw s0,28(sp) + 30052b8: 1000 addi s0,sp,32 + 30052ba: fea42623 sw a0,-20(s0) + return (((interruptType) == TIMER_PERIOD_FIN) || + 30052be: fec42783 lw a5,-20(s0) + 30052c2: c791 beqz a5,30052ce + 30052c4: fec42703 lw a4,-20(s0) + 30052c8: 4785 li a5,1 + 30052ca: 00f71463 bne a4,a5,30052d2 + 30052ce: 4785 li a5,1 + 30052d0: a011 j 30052d4 + 30052d2: 4781 li a5,0 + 30052d4: 8b85 andi a5,a5,1 + 30052d6: 9f81 uxtb a5 + ((interruptType) == TIMER_OVER_FLOW)); +} + 30052d8: 853e mv a0,a5 + 30052da: 4472 lw s0,28(sp) + 30052dc: 6105 addi sp,sp,32 + 30052de: 8082 ret + +030052e0 : + * @param size Timer Size, @ref TIMER_Size + * @retval true + * @retval false + */ +static inline bool IsTimerSize(TIMER_Size size) +{ + 30052e0: 1101 addi sp,sp,-32 + 30052e2: ce22 sw s0,28(sp) + 30052e4: 1000 addi s0,sp,32 + 30052e6: fea42623 sw a0,-20(s0) + return (((size) == TIMER_SIZE_16BIT) || + 30052ea: fec42783 lw a5,-20(s0) + 30052ee: c791 beqz a5,30052fa + 30052f0: fec42703 lw a4,-20(s0) + 30052f4: 4785 li a5,1 + 30052f6: 00f71463 bne a4,a5,30052fe + 30052fa: 4785 li a5,1 + 30052fc: a011 j 3005300 + 30052fe: 4781 li a5,0 + 3005300: 8b85 andi a5,a5,1 + 3005302: 9f81 uxtb a5 + ((size) == TIMER_SIZE_32BIT)); +} + 3005304: 853e mv a0,a5 + 3005306: 4472 lw s0,28(sp) + 3005308: 6105 addi sp,sp,32 + 300530a: 8082 ret + +0300530c : + * @param period + * @retval true + * @retval false + */ +static inline bool IsTimerPeriod(unsigned int period) +{ + 300530c: 1101 addi sp,sp,-32 + 300530e: ce22 sw s0,28(sp) + 3005310: 1000 addi s0,sp,32 + 3005312: fea42623 sw a0,-20(s0) + return ((period) >= PERIOD_MIN_VALUE); + 3005316: fec42783 lw a5,-20(s0) + 300531a: 00f037b3 snez a5,a5 + 300531e: 9f81 uxtb a5 +} + 3005320: 853e mv a0,a5 + 3005322: 4472 lw s0,28(sp) + 3005324: 6105 addi sp,sp,32 + 3005326: 8082 ret + +03005328 : + * @param div @see TIMER_PrescalerFactor + * @retval true + * @retval false + */ +static inline bool IsTimerDiv(TIMER_PrescalerFactor div) +{ + 3005328: 1101 addi sp,sp,-32 + 300532a: ce22 sw s0,28(sp) + 300532c: 1000 addi s0,sp,32 + 300532e: fea42623 sw a0,-20(s0) + return (((div) == TIMERPRESCALER_NO_DIV) || + ((div) == TIMERPRESCALER_DIV_16) || + 3005332: fec42783 lw a5,-20(s0) + 3005336: cb99 beqz a5,300534c + return (((div) == TIMERPRESCALER_NO_DIV) || + 3005338: fec42703 lw a4,-20(s0) + 300533c: 4785 li a5,1 + 300533e: 00f70763 beq a4,a5,300534c + ((div) == TIMERPRESCALER_DIV_16) || + 3005342: fec42703 lw a4,-20(s0) + 3005346: 4789 li a5,2 + 3005348: 00f71463 bne a4,a5,3005350 + 300534c: 4785 li a5,1 + 300534e: a011 j 3005352 + 3005350: 4781 li a5,0 + 3005352: 8b85 andi a5,a5,1 + 3005354: 9f81 uxtb a5 + ((div) == TIMERPRESCALER_DIV_256)); +} + 3005356: 853e mv a0,a5 + 3005358: 4472 lw s0,28(sp) + 300535a: 6105 addi sp,sp,32 + 300535c: 8082 ret + +0300535e : + * @param handle Timer Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR parameter check fail + */ +BASE_StatusType HAL_TIMER_Init(TIMER_Handle *handle) +{ + 300535e: 1101 addi sp,sp,-32 + 3005360: ce06 sw ra,28(sp) + 3005362: cc22 sw s0,24(sp) + 3005364: 1000 addi s0,sp,32 + 3005366: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 300536a: fec42783 lw a5,-20(s0) + 300536e: eb89 bnez a5,3005380 + 3005370: 02800593 li a1,40 + 3005374: 030077b7 lui a5,0x3007 + 3005378: 9dc78513 addi a0,a5,-1572 # 30069dc + 300537c: 2c15 jal ra,30055b0 + 300537e: a001 j 300537e + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 3005380: fec42783 lw a5,-20(s0) + 3005384: 4398 lw a4,0(a5) + 3005386: 143007b7 lui a5,0x14300 + 300538a: 02f70f63 beq a4,a5,30053c8 + 300538e: fec42783 lw a5,-20(s0) + 3005392: 4398 lw a4,0(a5) + 3005394: 143017b7 lui a5,0x14301 + 3005398: 02f70863 beq a4,a5,30053c8 + 300539c: fec42783 lw a5,-20(s0) + 30053a0: 4398 lw a4,0(a5) + 30053a2: 143027b7 lui a5,0x14302 + 30053a6: 02f70163 beq a4,a5,30053c8 + 30053aa: fec42783 lw a5,-20(s0) + 30053ae: 4398 lw a4,0(a5) + 30053b0: 143037b7 lui a5,0x14303 + 30053b4: 00f70a63 beq a4,a5,30053c8 + 30053b8: 02900593 li a1,41 + 30053bc: 030077b7 lui a5,0x3007 + 30053c0: 9dc78513 addi a0,a5,-1572 # 30069dc + 30053c4: 22f5 jal ra,30055b0 + 30053c6: a001 j 30053c6 + + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->load), BASE_STATUS_ERROR); + 30053c8: fec42783 lw a5,-20(s0) + 30053cc: 4bdc lw a5,20(a5) + 30053ce: 853e mv a0,a5 + 30053d0: 3f35 jal ra,300530c + 30053d2: 87aa mv a5,a0 + 30053d4: 0017c793 xori a5,a5,1 + 30053d8: 9f81 uxtb a5 + 30053da: cb91 beqz a5,30053ee + 30053dc: 02b00593 li a1,43 + 30053e0: 030077b7 lui a5,0x3007 + 30053e4: 9dc78513 addi a0,a5,-1572 # 30069dc + 30053e8: 22e1 jal ra,30055b0 + 30053ea: 4785 li a5,1 + 30053ec: aa6d j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->bgLoad), BASE_STATUS_ERROR); + 30053ee: fec42783 lw a5,-20(s0) + 30053f2: 4f9c lw a5,24(a5) + 30053f4: 853e mv a0,a5 + 30053f6: 3f19 jal ra,300530c + 30053f8: 87aa mv a5,a0 + 30053fa: 0017c793 xori a5,a5,1 + 30053fe: 9f81 uxtb a5 + 3005400: cb91 beqz a5,3005414 + 3005402: 02c00593 li a1,44 + 3005406: 030077b7 lui a5,0x3007 + 300540a: 9dc78513 addi a0,a5,-1572 # 30069dc + 300540e: 224d jal ra,30055b0 + 3005410: 4785 li a5,1 + 3005412: aa51 j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerMode(handle->mode), BASE_STATUS_ERROR); + 3005414: fec42783 lw a5,-20(s0) + 3005418: 479c lw a5,8(a5) + 300541a: 853e mv a0,a5 + 300541c: 358d jal ra,300527e + 300541e: 87aa mv a5,a0 + 3005420: 0017c793 xori a5,a5,1 + 3005424: 9f81 uxtb a5 + 3005426: cb91 beqz a5,300543a + 3005428: 02d00593 li a1,45 + 300542c: 030077b7 lui a5,0x3007 + 3005430: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005434: 2ab5 jal ra,30055b0 + 3005436: 4785 li a5,1 + 3005438: a2bd j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerSize(handle->size), BASE_STATUS_ERROR); + 300543a: fec42783 lw a5,-20(s0) + 300543e: 4b9c lw a5,16(a5) + 3005440: 853e mv a0,a5 + 3005442: 3d79 jal ra,30052e0 + 3005444: 87aa mv a5,a0 + 3005446: 0017c793 xori a5,a5,1 + 300544a: 9f81 uxtb a5 + 300544c: cb91 beqz a5,3005460 + 300544e: 02e00593 li a1,46 + 3005452: 030077b7 lui a5,0x3007 + 3005456: 9dc78513 addi a0,a5,-1572 # 30069dc + 300545a: 2a99 jal ra,30055b0 + 300545c: 4785 li a5,1 + 300545e: a2a1 j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerDiv(handle->prescaler), BASE_STATUS_ERROR); + 3005460: fec42783 lw a5,-20(s0) + 3005464: 47dc lw a5,12(a5) + 3005466: 853e mv a0,a5 + 3005468: 35c1 jal ra,3005328 + 300546a: 87aa mv a5,a0 + 300546c: 0017c793 xori a5,a5,1 + 3005470: 9f81 uxtb a5 + 3005472: cb91 beqz a5,3005486 + 3005474: 02f00593 li a1,47 + 3005478: 030077b7 lui a5,0x3007 + 300547c: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005480: 2a05 jal ra,30055b0 + 3005482: 4785 li a5,1 + 3005484: a20d j 30055a6 + + /* Initialize the configuration parameters of the timer */ + handle->baseAddress->timer_intclr = BASE_CFG_SET; /* Writing to this register clears interrupt output of timer */ + 3005486: fec42783 lw a5,-20(s0) + 300548a: 439c lw a5,0(a5) + 300548c: 4705 li a4,1 + 300548e: c7d8 sw a4,12(a5) + handle->baseAddress->timer_load = handle->load; + 3005490: fec42783 lw a5,-20(s0) + 3005494: 439c lw a5,0(a5) + 3005496: fec42703 lw a4,-20(s0) + 300549a: 4b58 lw a4,20(a4) + 300549c: c398 sw a4,0(a5) + handle->baseAddress->timerbgload = handle->bgLoad; + 300549e: fec42783 lw a5,-20(s0) + 30054a2: 439c lw a5,0(a5) + 30054a4: fec42703 lw a4,-20(s0) + 30054a8: 4f18 lw a4,24(a4) + 30054aa: cf98 sw a4,24(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_DISABLE; + 30054ac: fec42783 lw a5,-20(s0) + 30054b0: 4398 lw a4,0(a5) + 30054b2: 471c lw a5,8(a4) + 30054b4: f7f7f793 andi a5,a5,-129 + 30054b8: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timerintenable = handle->interruptEn; + 30054ba: fec42783 lw a5,-20(s0) + 30054be: 4398 lw a4,0(a5) + 30054c0: fec42783 lw a5,-20(s0) + 30054c4: 2fd4 lbu a3,28(a5) + 30054c6: 471c lw a5,8(a4) + 30054c8: 8a85 andi a3,a3,1 + 30054ca: 0696 slli a3,a3,0x5 + 30054cc: fdf7f793 andi a5,a5,-33 + 30054d0: 8fd5 or a5,a5,a3 + 30054d2: c71c sw a5,8(a4) + + /* Sets the frequency divider and size of the timer module. */ + handle->baseAddress->TIMERx_CONTROL.BIT.timerpre = handle->prescaler; + 30054d4: fec42783 lw a5,-20(s0) + 30054d8: 47d4 lw a3,12(a5) + 30054da: fec42783 lw a5,-20(s0) + 30054de: 4398 lw a4,0(a5) + 30054e0: 87b6 mv a5,a3 + 30054e2: 8b8d andi a5,a5,3 + 30054e4: 0ff7f693 andi a3,a5,255 + 30054e8: 471c lw a5,8(a4) + 30054ea: 8a8d andi a3,a3,3 + 30054ec: 068a slli a3,a3,0x2 + 30054ee: 9bcd andi a5,a5,-13 + 30054f0: 8fd5 or a5,a5,a3 + 30054f2: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timersize = handle->size; + 30054f4: fec42783 lw a5,-20(s0) + 30054f8: 4b94 lw a3,16(a5) + 30054fa: fec42783 lw a5,-20(s0) + 30054fe: 4398 lw a4,0(a5) + 3005500: 87b6 mv a5,a3 + 3005502: 8b85 andi a5,a5,1 + 3005504: 0ff7f693 andi a3,a5,255 + 3005508: 471c lw a5,8(a4) + 300550a: 8a85 andi a3,a3,1 + 300550c: 0686 slli a3,a3,0x1 + 300550e: 9bf5 andi a5,a5,-3 + 3005510: 8fd5 or a5,a5,a3 + 3005512: c71c sw a5,8(a4) + + /* Sets the running mode of the timer. */ + if (handle->mode == TIMER_MODE_RUN_ONTSHOT) { + 3005514: fec42783 lw a5,-20(s0) + 3005518: 4798 lw a4,8(a5) + 300551a: 4789 li a5,2 + 300551c: 00f71a63 bne a4,a5,3005530 + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_SET; + 3005520: fec42783 lw a5,-20(s0) + 3005524: 4398 lw a4,0(a5) + 3005526: 471c lw a5,8(a4) + 3005528: 0017e793 ori a5,a5,1 + 300552c: c71c sw a5,8(a4) + 300552e: a805 j 300555e + } else { + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_UNSET; + 3005530: fec42783 lw a5,-20(s0) + 3005534: 4398 lw a4,0(a5) + 3005536: 471c lw a5,8(a4) + 3005538: 9bf9 andi a5,a5,-2 + 300553a: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 300553c: fec42783 lw a5,-20(s0) + 3005540: 479c lw a5,8(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005542: fec42703 lw a4,-20(s0) + 3005546: 4318 lw a4,0(a4) + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005548: 00f037b3 snez a5,a5 + 300554c: 0ff7f693 andi a3,a5,255 + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005550: 471c lw a5,8(a4) + 3005552: 8a85 andi a3,a3,1 + 3005554: 069a slli a3,a3,0x6 + 3005556: fbf7f793 andi a5,a5,-65 + 300555a: 8fd5 or a5,a5,a3 + 300555c: c71c sw a5,8(a4) + } + + /* Request for setting the DMA and ADC. */ + handle->baseAddress->TIMERx_CONTROLB.BIT.dmasreqen = handle->dmaReqEnable; + 300555e: fec42783 lw a5,-20(s0) + 3005562: 4398 lw a4,0(a5) + 3005564: fec42783 lw a5,-20(s0) + 3005568: 2ff4 lbu a3,30(a5) + 300556a: 4f5c lw a5,28(a4) + 300556c: 8a85 andi a3,a3,1 + 300556e: 0686 slli a3,a3,0x1 + 3005570: 9bf5 andi a5,a5,-3 + 3005572: 8fd5 or a5,a5,a3 + 3005574: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.dmabreqen = handle->dmaReqEnable; + 3005576: fec42783 lw a5,-20(s0) + 300557a: 4398 lw a4,0(a5) + 300557c: fec42783 lw a5,-20(s0) + 3005580: 2ff4 lbu a3,30(a5) + 3005582: 4f5c lw a5,28(a4) + 3005584: 8a85 andi a3,a3,1 + 3005586: 9bf9 andi a5,a5,-2 + 3005588: 8fd5 or a5,a5,a3 + 300558a: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.socen = handle->adcSocReqEnable; + 300558c: fec42783 lw a5,-20(s0) + 3005590: 4398 lw a4,0(a5) + 3005592: fec42783 lw a5,-20(s0) + 3005596: 3fd4 lbu a3,29(a5) + 3005598: 4f5c lw a5,28(a4) + 300559a: 8a85 andi a3,a3,1 + 300559c: 068a slli a3,a3,0x2 + 300559e: 9bed andi a5,a5,-5 + 30055a0: 8fd5 or a5,a5,a3 + 30055a2: cf5c sw a5,28(a4) + return BASE_STATUS_OK; + 30055a4: 4781 li a5,0 +} + 30055a6: 853e mv a0,a5 + 30055a8: 40f2 lw ra,28(sp) + 30055aa: 4462 lw s0,24(sp) + 30055ac: 6105 addi sp,sp,32 + 30055ae: 8082 ret + +030055b0 : + 30055b0: c37fc06f j 30021e6 + +030055b4 : + * @brief Start timer. + * @param handle Timer Handle + * @retval None + */ +void HAL_TIMER_Start(TIMER_Handle *handle) +{ + 30055b4: 1101 addi sp,sp,-32 + 30055b6: ce06 sw ra,28(sp) + 30055b8: cc22 sw s0,24(sp) + 30055ba: 1000 addi s0,sp,32 + 30055bc: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 30055c0: fec42783 lw a5,-20(s0) + 30055c4: eb89 bnez a5,30055d6 + 30055c6: 0bc00593 li a1,188 + 30055ca: 030077b7 lui a5,0x3007 + 30055ce: 9dc78513 addi a0,a5,-1572 # 30069dc + 30055d2: 3ff9 jal ra,30055b0 + 30055d4: a001 j 30055d4 + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 30055d6: fec42783 lw a5,-20(s0) + 30055da: 4398 lw a4,0(a5) + 30055dc: 143007b7 lui a5,0x14300 + 30055e0: 02f70f63 beq a4,a5,300561e + 30055e4: fec42783 lw a5,-20(s0) + 30055e8: 4398 lw a4,0(a5) + 30055ea: 143017b7 lui a5,0x14301 + 30055ee: 02f70863 beq a4,a5,300561e + 30055f2: fec42783 lw a5,-20(s0) + 30055f6: 4398 lw a4,0(a5) + 30055f8: 143027b7 lui a5,0x14302 + 30055fc: 02f70163 beq a4,a5,300561e + 3005600: fec42783 lw a5,-20(s0) + 3005604: 4398 lw a4,0(a5) + 3005606: 143037b7 lui a5,0x14303 + 300560a: 00f70a63 beq a4,a5,300561e + 300560e: 0bd00593 li a1,189 + 3005612: 030077b7 lui a5,0x3007 + 3005616: 9dc78513 addi a0,a5,-1572 # 30069dc + 300561a: 3f59 jal ra,30055b0 + 300561c: a001 j 300561c + /* Enable timer */ + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_SET; + 300561e: fec42783 lw a5,-20(s0) + 3005622: 4398 lw a4,0(a5) + 3005624: 471c lw a5,8(a4) + 3005626: 0807e793 ori a5,a5,128 + 300562a: c71c sw a5,8(a4) +} + 300562c: 0001 nop + 300562e: 40f2 lw ra,28(sp) + 3005630: 4462 lw s0,24(sp) + 3005632: 6105 addi sp,sp,32 + 3005634: 8082 ret + +03005636 : + * @brief GPT Interrupt service processing function. + * @param handle TIMER Handle + * @retval None + */ +void HAL_TIMER_IrqHandler(void *handle) +{ + 3005636: 7179 addi sp,sp,-48 + 3005638: d606 sw ra,44(sp) + 300563a: d422 sw s0,40(sp) + 300563c: 1800 addi s0,sp,48 + 300563e: fca42e23 sw a0,-36(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005642: fdc42783 lw a5,-36(s0) + 3005646: eb89 bnez a5,3005658 + 3005648: 0d800593 li a1,216 + 300564c: 030077b7 lui a5,0x3007 + 3005650: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005654: 3fb1 jal ra,30055b0 + 3005656: a001 j 3005656 + TIMER_Handle *timerHandle = (TIMER_Handle *)handle; + 3005658: fdc42783 lw a5,-36(s0) + 300565c: fef42623 sw a5,-20(s0) + TIMER_ASSERT_PARAM(IsTIMERInstance(timerHandle->baseAddress)); + 3005660: fec42783 lw a5,-20(s0) + 3005664: 4398 lw a4,0(a5) + 3005666: 143007b7 lui a5,0x14300 + 300566a: 02f70f63 beq a4,a5,30056a8 + 300566e: fec42783 lw a5,-20(s0) + 3005672: 4398 lw a4,0(a5) + 3005674: 143017b7 lui a5,0x14301 + 3005678: 02f70863 beq a4,a5,30056a8 + 300567c: fec42783 lw a5,-20(s0) + 3005680: 4398 lw a4,0(a5) + 3005682: 143027b7 lui a5,0x14302 + 3005686: 02f70163 beq a4,a5,30056a8 + 300568a: fec42783 lw a5,-20(s0) + 300568e: 4398 lw a4,0(a5) + 3005690: 143037b7 lui a5,0x14303 + 3005694: 00f70a63 beq a4,a5,30056a8 + 3005698: 0da00593 li a1,218 + 300569c: 030077b7 lui a5,0x3007 + 30056a0: 9dc78513 addi a0,a5,-1572 # 30069dc + 30056a4: 3731 jal ra,30055b0 + 30056a6: a001 j 30056a6 + /* Check interrupt type */ + if (timerHandle->baseAddress->TIMERx_MIS.dmaovmis == BASE_CFG_ENABLE) { + 30056a8: fec42783 lw a5,-20(s0) + 30056ac: 439c lw a5,0(a5) + 30056ae: 4bdc lw a5,20(a5) + 30056b0: 8385 srli a5,a5,0x1 + 30056b2: 8b85 andi a5,a5,1 + 30056b4: 0ff7f713 andi a4,a5,255 + 30056b8: 4785 li a5,1 + 30056ba: 02f71363 bne a4,a5,30056e0 + /* DMA overflow interrupt */ + timerHandle->baseAddress->DMAOV_INTCLR.BIT.dmaov_intclr = BASE_CFG_ENABLE; + 30056be: fec42783 lw a5,-20(s0) + 30056c2: 4398 lw a4,0(a5) + 30056c4: 531c lw a5,32(a4) + 30056c6: 0017e793 ori a5,a5,1 + 30056ca: d31c sw a5,32(a4) + /* Call the timer DMA request overflow callback function of the user. */ + if (timerHandle->userCallBack.TimerOverFlowCallBack != NULL) { + 30056cc: fec42783 lw a5,-20(s0) + 30056d0: 53dc lw a5,36(a5) + 30056d2: c799 beqz a5,30056e0 + timerHandle->userCallBack.TimerOverFlowCallBack(timerHandle); + 30056d4: fec42783 lw a5,-20(s0) + 30056d8: 53dc lw a5,36(a5) + 30056da: fec42503 lw a0,-20(s0) + 30056de: 9782 jalr a5 + } + } + if (timerHandle->baseAddress->TIMERx_MIS.timermis == BASE_CFG_ENABLE) { + 30056e0: fec42783 lw a5,-20(s0) + 30056e4: 439c lw a5,0(a5) + 30056e6: 4bdc lw a5,20(a5) + 30056e8: 8b85 andi a5,a5,1 + 30056ea: 0ff7f713 andi a4,a5,255 + 30056ee: 4785 li a5,1 + 30056f0: 02f71263 bne a4,a5,3005714 + /* TIMER Interrupt */ + timerHandle->baseAddress->timer_intclr = BASE_CFG_ENABLE; + 30056f4: fec42783 lw a5,-20(s0) + 30056f8: 439c lw a5,0(a5) + 30056fa: 4705 li a4,1 + 30056fc: c7d8 sw a4,12(a5) + /* Call the period finish callback function of the user. */ + if (timerHandle->userCallBack.TimerPeriodFinCallBack != NULL) { + 30056fe: fec42783 lw a5,-20(s0) + 3005702: 539c lw a5,32(a5) + 3005704: cb81 beqz a5,3005714 + timerHandle->userCallBack.TimerPeriodFinCallBack(timerHandle); + 3005706: fec42783 lw a5,-20(s0) + 300570a: 539c lw a5,32(a5) + 300570c: fec42503 lw a0,-20(s0) + 3005710: 9782 jalr a5 + } + } + return; + 3005712: 0001 nop + 3005714: 0001 nop +} + 3005716: 50b2 lw ra,44(sp) + 3005718: 5422 lw s0,40(sp) + 300571a: 6145 addi sp,sp,48 + 300571c: 8082 ret + +0300571e : + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_TIMER_RegisterCallback(TIMER_Handle *handle, TIMER_InterruptType typeID, + TIMER_CallBackFunc callBackFunc) +{ + 300571e: 1101 addi sp,sp,-32 + 3005720: ce06 sw ra,28(sp) + 3005722: cc22 sw s0,24(sp) + 3005724: 1000 addi s0,sp,32 + 3005726: fea42623 sw a0,-20(s0) + 300572a: feb42423 sw a1,-24(s0) + 300572e: fec42223 sw a2,-28(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005732: fec42783 lw a5,-20(s0) + 3005736: eb89 bnez a5,3005748 + 3005738: 0fa00593 li a1,250 + 300573c: 030077b7 lui a5,0x3007 + 3005740: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005744: 35b5 jal ra,30055b0 + 3005746: a001 j 3005746 + TIMER_ASSERT_PARAM(callBackFunc != NULL); + 3005748: fe442783 lw a5,-28(s0) + 300574c: eb89 bnez a5,300575e + 300574e: 0fb00593 li a1,251 + 3005752: 030077b7 lui a5,0x3007 + 3005756: 9dc78513 addi a0,a5,-1572 # 30069dc + 300575a: 3d99 jal ra,30055b0 + 300575c: a001 j 300575c + TIMER_ASSERT_PARAM(IsTimerInterruptType(typeID)); + 300575e: fe842503 lw a0,-24(s0) + 3005762: 3e89 jal ra,30052b4 + 3005764: 87aa mv a5,a0 + 3005766: 0017c793 xori a5,a5,1 + 300576a: 9f81 uxtb a5 + 300576c: cb89 beqz a5,300577e + 300576e: 0fc00593 li a1,252 + 3005772: 030077b7 lui a5,0x3007 + 3005776: 9dc78513 addi a0,a5,-1572 # 30069dc + 300577a: 3d1d jal ra,30055b0 + 300577c: a001 j 300577c + + /* Registers the user callback function. */ + switch (typeID) { + 300577e: fe842783 lw a5,-24(s0) + 3005782: cb91 beqz a5,3005796 + 3005784: 4705 li a4,1 + 3005786: 00e79e63 bne a5,a4,30057a2 + case TIMER_OVER_FLOW: + handle->userCallBack.TimerOverFlowCallBack = callBackFunc; /* User DMA request overflow function */ + 300578a: fec42783 lw a5,-20(s0) + 300578e: fe442703 lw a4,-28(s0) + 3005792: d3d8 sw a4,36(a5) + break; + 3005794: a809 j 30057a6 + case TIMER_PERIOD_FIN: + handle->userCallBack.TimerPeriodFinCallBack = callBackFunc; /* User timer period finish call back. */ + 3005796: fec42783 lw a5,-20(s0) + 300579a: fe442703 lw a4,-28(s0) + 300579e: d398 sw a4,32(a5) + break; + 30057a0: a019 j 30057a6 + default: + return BASE_STATUS_ERROR; + 30057a2: 4785 li a5,1 + 30057a4: a011 j 30057a8 + } + return BASE_STATUS_OK; + 30057a6: 4781 li a5,0 +} + 30057a8: 853e mv a0,a5 + 30057aa: 40f2 lw ra,28(sp) + 30057ac: 4462 lw s0,24(sp) + 30057ae: 6105 addi sp,sp,32 + 30057b0: 8082 ret + +030057b2 : + * @brief Check UART datalength parameter. + * @param datalength The number of data bits in a frame, @ref UART_DataLength + * @retval bool + */ +static inline bool IsUartDatalength(UART_DataLength datalength) +{ + 30057b2: 1101 addi sp,sp,-32 + 30057b4: ce22 sw s0,28(sp) + 30057b6: 1000 addi s0,sp,32 + 30057b8: fea42623 sw a0,-20(s0) + return (datalength >= UART_DATALENGTH_5BIT) && (datalength <= UART_DATALENGTH_8BIT); + 30057bc: fec42783 lw a5,-20(s0) + 30057c0: 0047b793 sltiu a5,a5,4 + 30057c4: 9f81 uxtb a5 +} + 30057c6: 853e mv a0,a5 + 30057c8: 4472 lw s0,28(sp) + 30057ca: 6105 addi sp,sp,32 + 30057cc: 8082 ret + +030057ce : + * @brief Check UART stopbits parameter. + * @param stopbits The number of stop bits in a frame, @ref UART_StopBits + * @retval bool + */ +static inline bool IsUartStopbits(UART_StopBits stopbits) +{ + 30057ce: 1101 addi sp,sp,-32 + 30057d0: ce22 sw s0,28(sp) + 30057d2: 1000 addi s0,sp,32 + 30057d4: fea42623 sw a0,-20(s0) + return (stopbits == UART_STOPBITS_ONE) || (stopbits == UART_STOPBITS_TWO); + 30057d8: fec42783 lw a5,-20(s0) + 30057dc: c791 beqz a5,30057e8 + 30057de: fec42703 lw a4,-20(s0) + 30057e2: 4785 li a5,1 + 30057e4: 00f71463 bne a4,a5,30057ec + 30057e8: 4785 li a5,1 + 30057ea: a011 j 30057ee + 30057ec: 4781 li a5,0 + 30057ee: 8b85 andi a5,a5,1 + 30057f0: 9f81 uxtb a5 +} + 30057f2: 853e mv a0,a5 + 30057f4: 4472 lw s0,28(sp) + 30057f6: 6105 addi sp,sp,32 + 30057f8: 8082 ret + +030057fa : + * @brief Check UART paritymode parameter. + * @param paritymode UART parity check mode, @ref UART_Parity_Mode + * @retval bool + */ +static inline bool IsUartParitymode(UART_Parity_Mode paritymode) +{ + 30057fa: 1101 addi sp,sp,-32 + 30057fc: ce22 sw s0,28(sp) + 30057fe: 1000 addi s0,sp,32 + 3005800: fea42623 sw a0,-20(s0) + if ((paritymode >= UART_PARITY_ODD) && (paritymode <= UART_PARITY_NONE)) { + 3005804: fec42703 lw a4,-20(s0) + 3005808: 4791 li a5,4 + 300580a: 00e7e463 bltu a5,a4,3005812 + return true; + 300580e: 4785 li a5,1 + 3005810: a011 j 3005814 + } + return false; + 3005812: 4781 li a5,0 +} + 3005814: 853e mv a0,a5 + 3005816: 4472 lw s0,28(sp) + 3005818: 6105 addi sp,sp,32 + 300581a: 8082 ret + +0300581c : + * @brief Check UART transmode parameter. + * @param transmode Transmit mode, @ref UART_Transmit_Mode + * @retval bool + */ +static inline bool IsUartTransmode(UART_Transmit_Mode transmode) +{ + 300581c: 1101 addi sp,sp,-32 + 300581e: ce22 sw s0,28(sp) + 3005820: 1000 addi s0,sp,32 + 3005822: fea42623 sw a0,-20(s0) + if ((transmode == UART_MODE_BLOCKING) || + 3005826: fec42783 lw a5,-20(s0) + 300582a: c385 beqz a5,300584a + 300582c: fec42703 lw a4,-20(s0) + 3005830: 4785 li a5,1 + 3005832: 00f70c63 beq a4,a5,300584a + (transmode == UART_MODE_INTERRUPT) || + 3005836: fec42703 lw a4,-20(s0) + 300583a: 4789 li a5,2 + 300583c: 00f70763 beq a4,a5,300584a + (transmode == UART_MODE_DMA) || + 3005840: fec42703 lw a4,-20(s0) + 3005844: 478d li a5,3 + 3005846: 00f71463 bne a4,a5,300584e + (transmode == UART_MODE_DISABLE)) { + return true; + 300584a: 4785 li a5,1 + 300584c: a011 j 3005850 + } + return false; + 300584e: 4781 li a5,0 +} + 3005850: 853e mv a0,a5 + 3005852: 4472 lw s0,28(sp) + 3005854: 6105 addi sp,sp,32 + 3005856: 8082 ret + +03005858 : + * @brief Check UART fifoThreshold parameter. + * @param fifoThreshold UART TX/RX FIFO line interrupt threshold, @ref UART_FIFO_Threshold + * @retval bool + */ +static inline bool IsUartFIFOThreshold(UART_FIFO_Threshold fifoThreshold) +{ + 3005858: 1101 addi sp,sp,-32 + 300585a: ce22 sw s0,28(sp) + 300585c: 1000 addi s0,sp,32 + 300585e: fea42623 sw a0,-20(s0) + return (fifoThreshold >= UART_FIFODEPTH_SIZE0) && (fifoThreshold <= UART_FIFODEPTH_SIZE15); + 3005862: fec42783 lw a5,-20(s0) + 3005866: 0107b793 sltiu a5,a5,16 + 300586a: 9f81 uxtb a5 +} + 300586c: 853e mv a0,a5 + 300586e: 4472 lw s0,28(sp) + 3005870: 6105 addi sp,sp,32 + 3005872: 8082 ret + +03005874 : + * @brief Check UART Oversampling multiple. + * @param multiple Oversampling multiple, @ref UART_OversampleMultiple + * @retval bool + */ +static inline bool IsUartOversampleMultiple(UART_OversampleMultiple multiple) +{ + 3005874: 1101 addi sp,sp,-32 + 3005876: ce22 sw s0,28(sp) + 3005878: 1000 addi s0,sp,32 + 300587a: fea42623 sw a0,-20(s0) + return (multiple >= UART_OVERSAMPLING_16X) && (multiple <= UART_OVERSAMPLING_12X); + 300587e: fec42783 lw a5,-20(s0) + 3005882: 0057b793 sltiu a5,a5,5 + 3005886: 9f81 uxtb a5 +} + 3005888: 853e mv a0,a5 + 300588a: 4472 lw s0,28(sp) + 300588c: 6105 addi sp,sp,32 + 300588e: 8082 ret + +03005890 : +#define PARITY_EVEN 0x6 +#define PARITY_MARK 0x82 +#define PARITY_SPACE 0x86 + +static unsigned int DivClosest(unsigned int x, unsigned int divisor) +{ + 3005890: 7179 addi sp,sp,-48 + 3005892: d622 sw s0,44(sp) + 3005894: 1800 addi s0,sp,48 + 3005896: fca42e23 sw a0,-36(s0) + 300589a: fcb42c23 sw a1,-40(s0) + unsigned int ret; + if (divisor == 0) { + 300589e: fd842783 lw a5,-40(s0) + 30058a2: e399 bnez a5,30058a8 + return 0; + 30058a4: 4781 li a5,0 + 30058a6: a005 j 30058c6 + } + ret = (((x) + ((divisor) / 2)) / (divisor)); /* Round up the result, add 1/2 */ + 30058a8: fd842783 lw a5,-40(s0) + 30058ac: 0017d713 srli a4,a5,0x1 + 30058b0: fdc42783 lw a5,-36(s0) + 30058b4: 973e add a4,a4,a5 + 30058b6: fd842783 lw a5,-40(s0) + 30058ba: 02f757b3 divu a5,a4,a5 + 30058be: fef42623 sw a5,-20(s0) + return ret; + 30058c2: fec42783 lw a5,-20(s0) +} + 30058c6: 853e mv a0,a5 + 30058c8: 5432 lw s0,44(sp) + 30058ca: 6145 addi sp,sp,48 + 30058cc: 8082 ret + +030058ce : + * @brief Sets the parity bit of the UART. + * @param uartHandle UART handle. + * @retval None. + */ +static void UART_SetParityBit(UART_Handle *uartHandle) +{ + 30058ce: 1101 addi sp,sp,-32 + 30058d0: ce22 sw s0,28(sp) + 30058d2: 1000 addi s0,sp,32 + 30058d4: fea42623 sw a0,-20(s0) + /* Sets the UART check mode. */ + switch (uartHandle->parity) { + 30058d8: fec42783 lw a5,-20(s0) + 30058dc: 4b9c lw a5,16(a5) + 30058de: 4711 li a4,4 + 30058e0: 06f76e63 bltu a4,a5,300595c + 30058e4: 00279713 slli a4,a5,0x2 + 30058e8: 030077b7 lui a5,0x3007 + 30058ec: 9fc78793 addi a5,a5,-1540 # 30069fc + 30058f0: 97ba add a5,a5,a4 + 30058f2: 439c lw a5,0(a5) + 30058f4: 8782 jr a5 + case UART_PARITY_ODD: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_ODD; /* Odd parity. */ + 30058f6: fec42783 lw a5,-20(s0) + 30058fa: 439c lw a5,0(a5) + 30058fc: 57d8 lw a4,44(a5) + 30058fe: fec42783 lw a5,-20(s0) + 3005902: 439c lw a5,0(a5) + 3005904: 00276713 ori a4,a4,2 + 3005908: d7d8 sw a4,44(a5) + break; + 300590a: a891 j 300595e + case UART_PARITY_EVEN: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_EVEN; /* Even parity. */ + 300590c: fec42783 lw a5,-20(s0) + 3005910: 439c lw a5,0(a5) + 3005912: 57d8 lw a4,44(a5) + 3005914: fec42783 lw a5,-20(s0) + 3005918: 439c lw a5,0(a5) + 300591a: 00676713 ori a4,a4,6 + 300591e: d7d8 sw a4,44(a5) + break; + 3005920: a83d j 300595e + case UART_PARITY_MARK: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_MARK; /* Marking parity */ + 3005922: fec42783 lw a5,-20(s0) + 3005926: 439c lw a5,0(a5) + 3005928: 57d8 lw a4,44(a5) + 300592a: fec42783 lw a5,-20(s0) + 300592e: 439c lw a5,0(a5) + 3005930: 08276713 ori a4,a4,130 + 3005934: d7d8 sw a4,44(a5) + break; + 3005936: a025 j 300595e + case UART_PARITY_SPACE: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_SPACE; /* space parity */ + 3005938: fec42783 lw a5,-20(s0) + 300593c: 439c lw a5,0(a5) + 300593e: 57d8 lw a4,44(a5) + 3005940: fec42783 lw a5,-20(s0) + 3005944: 439c lw a5,0(a5) + 3005946: 08676713 ori a4,a4,134 + 300594a: d7d8 sw a4,44(a5) + break; + 300594c: a809 j 300595e + case UART_PARITY_NONE: + uartHandle->baseAddress->UART_LCR_H.BIT.pen = BASE_CFG_DISABLE; /* No parity */ + 300594e: fec42783 lw a5,-20(s0) + 3005952: 4398 lw a4,0(a5) + 3005954: 575c lw a5,44(a4) + 3005956: 9bf5 andi a5,a5,-3 + 3005958: d75c sw a5,44(a4) + break; + 300595a: a011 j 300595e + default: + return; + 300595c: 0001 nop + } +} + 300595e: 4472 lw s0,28(sp) + 3005960: 6105 addi sp,sp,32 + 3005962: 8082 ret + +03005964 : + * @brief Initialize the UART hardware configuration and configure parameters based on the specified handle. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_Init(UART_Handle *uartHandle) +{ + 3005964: 7179 addi sp,sp,-48 + 3005966: d606 sw ra,44(sp) + 3005968: d422 sw s0,40(sp) + 300596a: 1800 addi s0,sp,48 + 300596c: fca42e23 sw a0,-36(s0) + UART_ASSERT_PARAM(uartHandle != NULL); + 3005970: fdc42783 lw a5,-36(s0) + 3005974: eb89 bnez a5,3005986 + 3005976: 09700593 li a1,151 + 300597a: 030077b7 lui a5,0x3007 + 300597e: a1078513 addi a0,a5,-1520 # 3006a10 + 3005982: 313d jal ra,30055b0 + 3005984: a001 j 3005984 + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + 3005986: fdc42783 lw a5,-36(s0) + 300598a: 4398 lw a4,0(a5) + 300598c: 140007b7 lui a5,0x14000 + 3005990: 02f70f63 beq a4,a5,30059ce + 3005994: fdc42783 lw a5,-36(s0) + 3005998: 4398 lw a4,0(a5) + 300599a: 140017b7 lui a5,0x14001 + 300599e: 02f70863 beq a4,a5,30059ce + 30059a2: fdc42783 lw a5,-36(s0) + 30059a6: 4398 lw a4,0(a5) + 30059a8: 140027b7 lui a5,0x14002 + 30059ac: 02f70163 beq a4,a5,30059ce + 30059b0: fdc42783 lw a5,-36(s0) + 30059b4: 4398 lw a4,0(a5) + 30059b6: 140037b7 lui a5,0x14003 + 30059ba: 00f70a63 beq a4,a5,30059ce + 30059be: 09800593 li a1,152 + 30059c2: 030077b7 lui a5,0x3007 + 30059c6: a1078513 addi a0,a5,-1520 # 3006a10 + 30059ca: 36dd jal ra,30055b0 + 30059cc: a001 j 30059cc + UART_PARAM_CHECK_WITH_RET(uartHandle->txState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 30059ce: fdc42783 lw a5,-36(s0) + 30059d2: 47bc lw a5,72(a5) + 30059d4: cb91 beqz a5,30059e8 + 30059d6: 09900593 li a1,153 + 30059da: 030077b7 lui a5,0x3007 + 30059de: a1078513 addi a0,a5,-1520 # 3006a10 + 30059e2: 36f9 jal ra,30055b0 + 30059e4: 4785 li a5,1 + 30059e6: ae0d j 3005d18 + UART_PARAM_CHECK_WITH_RET(uartHandle->rxState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 30059e8: fdc42783 lw a5,-36(s0) + 30059ec: 47fc lw a5,76(a5) + 30059ee: cb91 beqz a5,3005a02 + 30059f0: 09a00593 li a1,154 + 30059f4: 030077b7 lui a5,0x3007 + 30059f8: a1078513 addi a0,a5,-1520 # 3006a10 + 30059fc: 3e55 jal ra,30055b0 + 30059fe: 4785 li a5,1 + 3005a00: ae21 j 3005d18 + unsigned int uartClock, quot; + UART_PARAM_CHECK_WITH_RET(IsUartDatalength(uartHandle->dataLength), BASE_STATUS_ERROR); + 3005a02: fdc42783 lw a5,-36(s0) + 3005a06: 479c lw a5,8(a5) + 3005a08: 853e mv a0,a5 + 3005a0a: 3365 jal ra,30057b2 + 3005a0c: 87aa mv a5,a0 + 3005a0e: 0017c793 xori a5,a5,1 + 3005a12: 9f81 uxtb a5 + 3005a14: cb91 beqz a5,3005a28 + 3005a16: 09c00593 li a1,156 + 3005a1a: 030077b7 lui a5,0x3007 + 3005a1e: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a22: 3679 jal ra,30055b0 + 3005a24: 4785 li a5,1 + 3005a26: accd j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartStopbits(uartHandle->stopBits), BASE_STATUS_ERROR); + 3005a28: fdc42783 lw a5,-36(s0) + 3005a2c: 47dc lw a5,12(a5) + 3005a2e: 853e mv a0,a5 + 3005a30: 3b79 jal ra,30057ce + 3005a32: 87aa mv a5,a0 + 3005a34: 0017c793 xori a5,a5,1 + 3005a38: 9f81 uxtb a5 + 3005a3a: cb91 beqz a5,3005a4e + 3005a3c: 09d00593 li a1,157 + 3005a40: 030077b7 lui a5,0x3007 + 3005a44: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a48: 36a5 jal ra,30055b0 + 3005a4a: 4785 li a5,1 + 3005a4c: a4f1 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartParitymode(uartHandle->parity), BASE_STATUS_ERROR); + 3005a4e: fdc42783 lw a5,-36(s0) + 3005a52: 4b9c lw a5,16(a5) + 3005a54: 853e mv a0,a5 + 3005a56: 3355 jal ra,30057fa + 3005a58: 87aa mv a5,a0 + 3005a5a: 0017c793 xori a5,a5,1 + 3005a5e: 9f81 uxtb a5 + 3005a60: cb91 beqz a5,3005a74 + 3005a62: 09e00593 li a1,158 + 3005a66: 030077b7 lui a5,0x3007 + 3005a6a: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a6e: 3689 jal ra,30055b0 + 3005a70: 4785 li a5,1 + 3005a72: a45d j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->txMode), BASE_STATUS_ERROR); + 3005a74: fdc42783 lw a5,-36(s0) + 3005a78: 4bdc lw a5,20(a5) + 3005a7a: 853e mv a0,a5 + 3005a7c: 3345 jal ra,300581c + 3005a7e: 87aa mv a5,a0 + 3005a80: 0017c793 xori a5,a5,1 + 3005a84: 9f81 uxtb a5 + 3005a86: cb91 beqz a5,3005a9a + 3005a88: 09f00593 li a1,159 + 3005a8c: 030077b7 lui a5,0x3007 + 3005a90: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a94: 3e31 jal ra,30055b0 + 3005a96: 4785 li a5,1 + 3005a98: a441 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->rxMode), BASE_STATUS_ERROR); + 3005a9a: fdc42783 lw a5,-36(s0) + 3005a9e: 4f9c lw a5,24(a5) + 3005aa0: 853e mv a0,a5 + 3005aa2: 3bad jal ra,300581c + 3005aa4: 87aa mv a5,a0 + 3005aa6: 0017c793 xori a5,a5,1 + 3005aaa: 9f81 uxtb a5 + 3005aac: cb91 beqz a5,3005ac0 + 3005aae: 0a000593 li a1,160 + 3005ab2: 030077b7 lui a5,0x3007 + 3005ab6: a1078513 addi a0,a5,-1520 # 3006a10 + 3005aba: 3cdd jal ra,30055b0 + 3005abc: 4785 li a5,1 + 3005abe: aca9 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoTxThr), BASE_STATUS_ERROR); + 3005ac0: fdc42783 lw a5,-36(s0) + 3005ac4: 5b9c lw a5,48(a5) + 3005ac6: 853e mv a0,a5 + 3005ac8: 3b41 jal ra,3005858 + 3005aca: 87aa mv a5,a0 + 3005acc: 0017c793 xori a5,a5,1 + 3005ad0: 9f81 uxtb a5 + 3005ad2: cb91 beqz a5,3005ae6 + 3005ad4: 0a100593 li a1,161 + 3005ad8: 030077b7 lui a5,0x3007 + 3005adc: a1078513 addi a0,a5,-1520 # 3006a10 + 3005ae0: 3cc1 jal ra,30055b0 + 3005ae2: 4785 li a5,1 + 3005ae4: ac15 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoRxThr), BASE_STATUS_ERROR); + 3005ae6: fdc42783 lw a5,-36(s0) + 3005aea: 5bdc lw a5,52(a5) + 3005aec: 853e mv a0,a5 + 3005aee: 33ad jal ra,3005858 + 3005af0: 87aa mv a5,a0 + 3005af2: 0017c793 xori a5,a5,1 + 3005af6: 9f81 uxtb a5 + 3005af8: cb91 beqz a5,3005b0c + 3005afa: 0a200593 li a1,162 + 3005afe: 030077b7 lui a5,0x3007 + 3005b02: a1078513 addi a0,a5,-1520 # 3006a10 + 3005b06: 346d jal ra,30055b0 + 3005b08: 4785 li a5,1 + 3005b0a: a439 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartOversampleMultiple(uartHandle->handleEx.overSampleMultiple), BASE_STATUS_ERROR); + 3005b0c: fdc42783 lw a5,-36(s0) + 3005b10: 5fbc lw a5,120(a5) + 3005b12: 853e mv a0,a5 + 3005b14: 3385 jal ra,3005874 + 3005b16: 87aa mv a5,a0 + 3005b18: 0017c793 xori a5,a5,1 + 3005b1c: 9f81 uxtb a5 + 3005b1e: cb91 beqz a5,3005b32 + 3005b20: 0a300593 li a1,163 + 3005b24: 030077b7 lui a5,0x3007 + 3005b28: a1078513 addi a0,a5,-1520 # 3006a10 + 3005b2c: 3451 jal ra,30055b0 + 3005b2e: 4785 li a5,1 + 3005b30: a2e5 j 3005d18 + + uartHandle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; + 3005b32: fdc42783 lw a5,-36(s0) + 3005b36: 4398 lw a4,0(a5) + 3005b38: 5b1c lw a5,48(a4) + 3005b3a: 9bf9 andi a5,a5,-2 + 3005b3c: db1c sw a5,48(a4) + while (uartHandle->baseAddress->UART_FR.BIT.busy == 0x01) { + 3005b3e: 0001 nop + 3005b40: fdc42783 lw a5,-36(s0) + 3005b44: 439c lw a5,0(a5) + 3005b46: 4f9c lw a5,24(a5) + 3005b48: 838d srli a5,a5,0x3 + 3005b4a: 8b85 andi a5,a5,1 + 3005b4c: 0ff7f713 andi a4,a5,255 + 3005b50: 4785 li a5,1 + 3005b52: fef707e3 beq a4,a5,3005b40 + ; + } + + uartClock = HAL_CRG_GetIpFreq((void *)uartHandle->baseAddress); + 3005b56: fdc42783 lw a5,-36(s0) + 3005b5a: 439c lw a5,0(a5) + 3005b5c: 853e mv a0,a5 + 3005b5e: 9f1fd0ef jal ra,300354e + 3005b62: fea42623 sw a0,-20(s0) + + /* DCL OverSample Multiple check */ + uartHandle->baseAddress->UART_SPCFG.BIT.spcfg = uartHandle->handleEx.overSampleMultiple; + 3005b66: fdc42783 lw a5,-36(s0) + 3005b6a: 5fb4 lw a3,120(a5) + 3005b6c: fdc42783 lw a5,-36(s0) + 3005b70: 4398 lw a4,0(a5) + 3005b72: 87b6 mv a5,a3 + 3005b74: 8bbd andi a5,a5,15 + 3005b76: 0ff7f693 andi a3,a5,255 + 3005b7a: 4f3c lw a5,88(a4) + 3005b7c: 8abd andi a3,a3,15 + 3005b7e: 9bc1 andi a5,a5,-16 + 3005b80: 8fd5 or a5,a5,a3 + 3005b82: cf3c sw a5,88(a4) + + /* DCL sequences setting */ + uartHandle->baseAddress->UART_DS.BIT.msbfirst = uartHandle->handleEx.msbFirst; + 3005b84: fdc42783 lw a5,-36(s0) + 3005b88: 4398 lw a4,0(a5) + 3005b8a: fdc42783 lw a5,-36(s0) + 3005b8e: 07c7c683 lbu a3,124(a5) + 3005b92: 4b3c lw a5,80(a4) + 3005b94: 8a85 andi a3,a3,1 + 3005b96: 9bf9 andi a5,a5,-2 + 3005b98: 8fd5 or a5,a5,a3 + 3005b9a: cb3c sw a5,80(a4) + + /* The baud rate divider(BRD) based on the baud rate and clock frequency, calculation formula */ + unsigned int oversample = uartHandle->baseAddress->UART_SPCFG.reg; + 3005b9c: fdc42783 lw a5,-36(s0) + 3005ba0: 439c lw a5,0(a5) + 3005ba2: 4fbc lw a5,88(a5) + 3005ba4: fef42423 sw a5,-24(s0) + if (uartHandle->baudRate > (uartClock / (OVERSAMPLING_PARAM - oversample))) { + 3005ba8: fdc42783 lw a5,-36(s0) + 3005bac: 43d8 lw a4,4(a5) + 3005bae: 46c1 li a3,16 + 3005bb0: fe842783 lw a5,-24(s0) + 3005bb4: 40f687b3 sub a5,a3,a5 + 3005bb8: fec42683 lw a3,-20(s0) + 3005bbc: 02f6d7b3 divu a5,a3,a5 + 3005bc0: 00e7f463 bgeu a5,a4,3005bc8 + return BASE_STATUS_ERROR; + 3005bc4: 4785 li a5,1 + 3005bc6: aa89 j 3005d18 + } else { + unsigned int tmpClock = uartClock / (OVERSAMPLING_PARAM - oversample) * 64; /* 64 is for decimal parts */ + 3005bc8: 4741 li a4,16 + 3005bca: fe842783 lw a5,-24(s0) + 3005bce: 40f707b3 sub a5,a4,a5 + 3005bd2: fec42703 lw a4,-20(s0) + 3005bd6: 02f757b3 divu a5,a4,a5 + 3005bda: 079a slli a5,a5,0x6 + 3005bdc: fef42223 sw a5,-28(s0) + quot = DivClosest(tmpClock, uartHandle->baudRate); + 3005be0: fdc42783 lw a5,-36(s0) + 3005be4: 43dc lw a5,4(a5) + 3005be6: 85be mv a1,a5 + 3005be8: fe442503 lw a0,-28(s0) + 3005bec: 3155 jal ra,3005890 + 3005bee: fea42023 sw a0,-32(s0) + } + /* Clear the baud rate divider register */ + uartHandle->baseAddress->UART_FBRD.reg = 0; + 3005bf2: fdc42783 lw a5,-36(s0) + 3005bf6: 439c lw a5,0(a5) + 3005bf8: 0207a423 sw zero,40(a5) + uartHandle->baseAddress->UART_IBRD.reg = 0; + 3005bfc: fdc42783 lw a5,-36(s0) + 3005c00: 439c lw a5,0(a5) + 3005c02: 0207a223 sw zero,36(a5) + /* The fractional baud rate divider value is stored to the lower 6 bits of the FBRD */ + uartHandle->baseAddress->UART_FBRD.reg = (quot & 0x3F); + 3005c06: fdc42783 lw a5,-36(s0) + 3005c0a: 439c lw a5,0(a5) + 3005c0c: fe042703 lw a4,-32(s0) + 3005c10: 03f77713 andi a4,a4,63 + 3005c14: d798 sw a4,40(a5) + /* Right shift 6 bits is the integer baud rate divider value, is stored to IBRD */ + uartHandle->baseAddress->UART_IBRD.reg = (quot >> 6); + 3005c16: fdc42783 lw a5,-36(s0) + 3005c1a: 439c lw a5,0(a5) + 3005c1c: fe042703 lw a4,-32(s0) + 3005c20: 8319 srli a4,a4,0x6 + 3005c22: d3d8 sw a4,36(a5) + uartHandle->baseAddress->UART_LCR_H.reg = 0; + 3005c24: fdc42783 lw a5,-36(s0) + 3005c28: 439c lw a5,0(a5) + 3005c2a: 0207a623 sw zero,44(a5) + uartHandle->baseAddress->UART_LCR_H.BIT.wlen = uartHandle->dataLength; /* Frame length seting */ + 3005c2e: fdc42783 lw a5,-36(s0) + 3005c32: 4794 lw a3,8(a5) + 3005c34: fdc42783 lw a5,-36(s0) + 3005c38: 4398 lw a4,0(a5) + 3005c3a: 87b6 mv a5,a3 + 3005c3c: 8b8d andi a5,a5,3 + 3005c3e: 0ff7f693 andi a3,a5,255 + 3005c42: 575c lw a5,44(a4) + 3005c44: 8a8d andi a3,a3,3 + 3005c46: 0696 slli a3,a3,0x5 + 3005c48: f9f7f793 andi a5,a5,-97 + 3005c4c: 8fd5 or a5,a5,a3 + 3005c4e: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_LCR_H.BIT.stp2 = uartHandle->stopBits; /* Stop bit seting */ + 3005c50: fdc42783 lw a5,-36(s0) + 3005c54: 47d4 lw a3,12(a5) + 3005c56: fdc42783 lw a5,-36(s0) + 3005c5a: 4398 lw a4,0(a5) + 3005c5c: 87b6 mv a5,a3 + 3005c5e: 8b85 andi a5,a5,1 + 3005c60: 0ff7f693 andi a3,a5,255 + 3005c64: 575c lw a5,44(a4) + 3005c66: 8a85 andi a3,a3,1 + 3005c68: 068e slli a3,a3,0x3 + 3005c6a: 9bdd andi a5,a5,-9 + 3005c6c: 8fd5 or a5,a5,a3 + 3005c6e: d75c sw a5,44(a4) + UART_SetParityBit(uartHandle); + 3005c70: fdc42503 lw a0,-36(s0) + 3005c74: 39a9 jal ra,30058ce + if (uartHandle->fifoMode == true) { /* FIFO threshold setting */ + 3005c76: fdc42783 lw a5,-36(s0) + 3005c7a: 02c7c783 lbu a5,44(a5) + 3005c7e: cbb1 beqz a5,3005cd2 + uartHandle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_ENABLE; + 3005c80: fdc42783 lw a5,-36(s0) + 3005c84: 4398 lw a4,0(a5) + 3005c86: 575c lw a5,44(a4) + 3005c88: 0107e793 ori a5,a5,16 + 3005c8c: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_IFLS.BIT.rxiflsel = uartHandle->fifoRxThr; + 3005c8e: fdc42783 lw a5,-36(s0) + 3005c92: 5bd4 lw a3,52(a5) + 3005c94: fdc42783 lw a5,-36(s0) + 3005c98: 4398 lw a4,0(a5) + 3005c9a: 87b6 mv a5,a3 + 3005c9c: 8bbd andi a5,a5,15 + 3005c9e: 0ff7f693 andi a3,a5,255 + 3005ca2: 5b5c lw a5,52(a4) + 3005ca4: 8abd andi a3,a3,15 + 3005ca6: 06a2 slli a3,a3,0x8 + 3005ca8: 767d lui a2,0xfffff + 3005caa: 0ff60613 addi a2,a2,255 # fffff0ff + 3005cae: 8ff1 and a5,a5,a2 + 3005cb0: 8fd5 or a5,a5,a3 + 3005cb2: db5c sw a5,52(a4) + uartHandle->baseAddress->UART_IFLS.BIT.txiflsel = uartHandle->fifoTxThr; + 3005cb4: fdc42783 lw a5,-36(s0) + 3005cb8: 5b94 lw a3,48(a5) + 3005cba: fdc42783 lw a5,-36(s0) + 3005cbe: 4398 lw a4,0(a5) + 3005cc0: 87b6 mv a5,a3 + 3005cc2: 8bbd andi a5,a5,15 + 3005cc4: 0ff7f693 andi a3,a5,255 + 3005cc8: 5b5c lw a5,52(a4) + 3005cca: 8abd andi a3,a3,15 + 3005ccc: 9bc1 andi a5,a5,-16 + 3005cce: 8fd5 or a5,a5,a3 + 3005cd0: db5c sw a5,52(a4) + } + if (uartHandle->hwFlowCtr == UART_HW_FLOWCTR_ENABLE) { /* Hardwarer flow control setting */ + 3005cd2: fdc42783 lw a5,-36(s0) + 3005cd6: 5f98 lw a4,56(a5) + 3005cd8: 4785 li a5,1 + 3005cda: 00f71c63 bne a4,a5,3005cf2 + uartHandle->baseAddress->UART_CR.reg |= 0xC000; + 3005cde: fdc42783 lw a5,-36(s0) + 3005ce2: 439c lw a5,0(a5) + 3005ce4: 5b94 lw a3,48(a5) + 3005ce6: fdc42783 lw a5,-36(s0) + 3005cea: 439c lw a5,0(a5) + 3005cec: 6731 lui a4,0xc + 3005cee: 8f55 or a4,a4,a3 + 3005cf0: db98 sw a4,48(a5) + } + uartHandle->baseAddress->UART_CR.reg |= 0x301; /* Enable bit use 0x301 is to set txe/rxe/uarten */ + 3005cf2: fdc42783 lw a5,-36(s0) + 3005cf6: 439c lw a5,0(a5) + 3005cf8: 5b98 lw a4,48(a5) + 3005cfa: fdc42783 lw a5,-36(s0) + 3005cfe: 439c lw a5,0(a5) + 3005d00: 30176713 ori a4,a4,769 + 3005d04: db98 sw a4,48(a5) + uartHandle->txState = UART_STATE_READY; + 3005d06: fdc42783 lw a5,-36(s0) + 3005d0a: 4705 li a4,1 + 3005d0c: c7b8 sw a4,72(a5) + uartHandle->rxState = UART_STATE_READY; + 3005d0e: fdc42783 lw a5,-36(s0) + 3005d12: 4705 li a4,1 + 3005d14: c7f8 sw a4,76(a5) + return BASE_STATUS_OK; + 3005d16: 4781 li a5,0 +} + 3005d18: 853e mv a0,a5 + 3005d1a: 50b2 lw ra,44(sp) + 3005d1c: 5422 lw s0,40(sp) + 3005d1e: 6145 addi sp,sp,48 + 3005d20: 8082 ret + +03005d22
: +/* USER CODE BEGIN 1 */ +/* 建议用户定义全局变量、结构体、宏定义或函数声明等 */ +/* USER CODE END 1 */ + +int main(void) +{ + 3005d22: 1141 addi sp,sp,-16 + 3005d24: c606 sw ra,12(sp) + 3005d26: c422 sw s0,8(sp) + 3005d28: 0800 addi s0,sp,16 + /* USER CODE BEGIN 2 */ + /* 建议用户放置初始化代码或启动代码等 */ + /* USER CODE END 2 */ + SystemInit(); + 3005d2a: 2ee5 jal ra,3006122 + /* USER CODE BEGIN 3 */ + /* 建议用户放置初始配置代码 */ + /* USER CODE END 3 */ + while (1) { + 3005d2c: a001 j 3005d2c + +03005d2e : +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + 3005d2e: 715d addi sp,sp,-80 + 3005d30: c686 sw ra,76(sp) + 3005d32: c4a2 sw s0,72(sp) + 3005d34: 0880 addi s0,sp,80 + 3005d36: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3005d3a: 100007b7 lui a5,0x10000 + 3005d3e: fcf42423 sw a5,-56(s0) + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + 3005d42: fc042623 sw zero,-52(s0) + crg.pllPreDiv = CRG_PLL_PREDIV_4; + 3005d46: 478d li a5,3 + 3005d48: fcf42823 sw a5,-48(s0) + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + 3005d4c: 03000793 li a5,48 + 3005d50: fcf42a23 sw a5,-44(s0) + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + 3005d54: 4785 li a5,1 + 3005d56: fcf42c23 sw a5,-40(s0) + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + 3005d5a: 4789 li a5,2 + 3005d5c: fef42023 sw a5,-32(s0) + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + 3005d60: 4789 li a5,2 + 3005d62: fef42223 sw a5,-28(s0) + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + 3005d66: fe042423 sw zero,-24(s0) + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + 3005d6a: 47e1 li a5,24 + 3005d6c: fef42623 sw a5,-20(s0) + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + 3005d70: fc840793 addi a5,s0,-56 + 3005d74: 853e mv a0,a5 + 3005d76: aecfd0ef jal ra,3003062 + 3005d7a: 87aa mv a5,a0 + 3005d7c: c399 beqz a5,3005d82 + return BASE_STATUS_ERROR; + 3005d7e: 4785 li a5,1 + 3005d80: a039 j 3005d8e + } + *coreClkSelect = crg.coreClkSelect; + 3005d82: fe042703 lw a4,-32(s0) + 3005d86: fbc42783 lw a5,-68(s0) + 3005d8a: c398 sw a4,0(a5) + return BASE_STATUS_OK; + 3005d8c: 4781 li a5,0 +} + 3005d8e: 853e mv a0,a5 + 3005d90: 40b6 lw ra,76(sp) + 3005d92: 4426 lw s0,72(sp) + 3005d94: 6161 addi sp,sp,80 + 3005d96: 8082 ret + +03005d98 : + +__weak void ADC0Interrupt2Callback(ADC_Handle *handle) +{ + 3005d98: 1101 addi sp,sp,-32 + 3005d9a: ce22 sw s0,28(sp) + 3005d9c: 1000 addi s0,sp,32 + 3005d9e: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ADC0_CALLBACK_INT2 */ + /* USER CODE END ADC0_CALLBACK_INT2 */ +} + 3005da2: 0001 nop + 3005da4: 4472 lw s0,28(sp) + 3005da6: 6105 addi sp,sp,32 + 3005da8: 8082 ret + +03005daa : + +static void ADC0_Init(void) +{ + 3005daa: 7179 addi sp,sp,-48 + 3005dac: d606 sw ra,44(sp) + 3005dae: d422 sw s0,40(sp) + 3005db0: 1800 addi s0,sp,48 + HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); + 3005db2: 4585 li a1,1 + 3005db4: 18000537 lui a0,0x18000 + 3005db8: 2c49 jal ra,300604a + HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); + 3005dba: 4589 li a1,2 + 3005dbc: 18000537 lui a0,0x18000 + 3005dc0: 94bfd0ef jal ra,300370a + HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_1); + 3005dc4: 4581 li a1,0 + 3005dc6: 18000537 lui a0,0x18000 + 3005dca: 9f7fd0ef jal ra,30037c0 + + g_adc0.baseAddress = ADC0; + 3005dce: 040007b7 lui a5,0x4000 + 3005dd2: 54478793 addi a5,a5,1348 # 4000544 + 3005dd6: 18000737 lui a4,0x18000 + 3005dda: c398 sw a4,0(a5) + g_adc0.socPriority = ADC_PRIMODE_ALL_ROUND; + 3005ddc: 040007b7 lui a5,0x4000 + 3005de0: 54478793 addi a5,a5,1348 # 4000544 + 3005de4: 0007a223 sw zero,4(a5) + + HAL_ADC_Init(&g_adc0); + 3005de8: 040007b7 lui a5,0x4000 + 3005dec: 54478513 addi a0,a5,1348 # 4000544 + 3005df0: c97fb0ef jal ra,3001a86 + + SOC_Param socParam = {0}; + 3005df4: fc042e23 sw zero,-36(s0) + 3005df8: fe042023 sw zero,-32(s0) + 3005dfc: fe042223 sw zero,-28(s0) + 3005e00: fe042423 sw zero,-24(s0) + 3005e04: fe042623 sw zero,-20(s0) + socParam.adcInput = ADC_CH_ADCINA6; /* PIN4(ADC AIN6) */ + 3005e08: 4799 li a5,6 + 3005e0a: fcf42e23 sw a5,-36(s0) + socParam.sampleTotalTime = ADC_SOCSAMPLE_10CLK; /* adc sample total time 10 adc_clk */ + 3005e0e: 4789 li a5,2 + 3005e10: fef42023 sw a5,-32(s0) + socParam.trigSource = ADC_TRIGSOC_SOFT; + 3005e14: fe042223 sw zero,-28(s0) + socParam.continueMode = BASE_CFG_ENABLE; + 3005e18: 4785 li a5,1 + 3005e1a: fef40423 sb a5,-24(s0) + socParam.finishMode = ADC_SOCFINISH_INT2; + 3005e1e: 4795 li a5,5 + 3005e20: fef42623 sw a5,-20(s0) + HAL_ADC_ConfigureSoc(&g_adc0, ADC_SOC_NUM1, &socParam); + 3005e24: fdc40793 addi a5,s0,-36 + 3005e28: 863e mv a2,a5 + 3005e2a: 4585 li a1,1 + 3005e2c: 040007b7 lui a5,0x4000 + 3005e30: 54478513 addi a0,a5,1348 # 4000544 + 3005e34: d09fb0ef jal ra,3001b3c + HAL_ADC_RegisterCallBack(&g_adc0, ADC_CALLBACK_INT2, (ADC_CallbackType)ADC0Interrupt2Callback); + 3005e38: 030067b7 lui a5,0x3006 + 3005e3c: d9878613 addi a2,a5,-616 # 3005d98 + 3005e40: 4589 li a1,2 + 3005e42: 040007b7 lui a5,0x4000 + 3005e46: 54478513 addi a0,a5,1348 # 4000544 + 3005e4a: ab6fc0ef jal ra,3002100 + IRQ_Register(IRQ_ADC0_INT2, HAL_ADC_IrqHandlerInt2, &g_adc0); + 3005e4e: 040007b7 lui a5,0x4000 + 3005e52: 54478613 addi a2,a5,1348 # 4000544 + 3005e56: 030027b7 lui a5,0x3002 + 3005e5a: 03678593 addi a1,a5,54 # 3002036 + 3005e5e: 05f00513 li a0,95 + 3005e62: d88fc0ef jal ra,30023ea + IRQ_SetPriority(IRQ_ADC0_INT2, 1); /* 1 is priority value */ + 3005e66: 4585 li a1,1 + 3005e68: 05f00513 li a0,95 + 3005e6c: d53fc0ef jal ra,3002bbe + IRQ_EnableN(IRQ_ADC0_INT2); + 3005e70: 05f00513 li a0,95 + 3005e74: dfcfc0ef jal ra,3002470 +} + 3005e78: 0001 nop + 3005e7a: 50b2 lw ra,44(sp) + 3005e7c: 5422 lw s0,40(sp) + 3005e7e: 6145 addi sp,sp,48 + 3005e80: 8082 ret + +03005e82 : + /* USER CODE BEGIN TIMER3_InterruptProcess */ + /* USER CODE END TIMER3_InterruptProcess */ +} + +static void TIMER3_Init(void) +{ + 3005e82: 1101 addi sp,sp,-32 + 3005e84: ce06 sw ra,28(sp) + 3005e86: cc22 sw s0,24(sp) + 3005e88: 1000 addi s0,sp,32 + HAL_CRG_IpEnableSet(TIMER3_BASE, IP_CLK_ENABLE); /* TIMER3 clock enable. */ + 3005e8a: 4585 li a1,1 + 3005e8c: 14303537 lui a0,0x14303 + 3005e90: 2a6d jal ra,300604a + unsigned int load = (HAL_CRG_GetIpFreq((void *)TIMER3) / (1u << (TIMERPRESCALER_NO_DIV * 4)) / 1000000u) * 10; + 3005e92: 14303537 lui a0,0x14303 + 3005e96: eb8fd0ef jal ra,300354e + 3005e9a: 872a mv a4,a0 + 3005e9c: 000f47b7 lui a5,0xf4 + 3005ea0: 24078793 addi a5,a5,576 # f4240 + 3005ea4: 02f75733 divu a4,a4,a5 + 3005ea8: 47a9 li a5,10 + 3005eaa: 02f707b3 mul a5,a4,a5 + 3005eae: fef42623 sw a5,-20(s0) + + g_timer3.baseAddress = TIMER3; + 3005eb2: 040007b7 lui a5,0x4000 + 3005eb6: 49c78793 addi a5,a5,1180 # 400049c + 3005eba: 14303737 lui a4,0x14303 + 3005ebe: c398 sw a4,0(a5) + g_timer3.load = load - 1; /* Set timer value immediately */ + 3005ec0: fec42783 lw a5,-20(s0) + 3005ec4: fff78713 addi a4,a5,-1 + 3005ec8: 040007b7 lui a5,0x4000 + 3005ecc: 49c78793 addi a5,a5,1180 # 400049c + 3005ed0: cbd8 sw a4,20(a5) + g_timer3.bgLoad = load - 1; /* Set timer value */ + 3005ed2: fec42783 lw a5,-20(s0) + 3005ed6: fff78713 addi a4,a5,-1 + 3005eda: 040007b7 lui a5,0x4000 + 3005ede: 49c78793 addi a5,a5,1180 # 400049c + 3005ee2: cf98 sw a4,24(a5) + g_timer3.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ + 3005ee4: 040007b7 lui a5,0x4000 + 3005ee8: 49c78793 addi a5,a5,1180 # 400049c + 3005eec: 4705 li a4,1 + 3005eee: c798 sw a4,8(a5) + g_timer3.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ + 3005ef0: 040007b7 lui a5,0x4000 + 3005ef4: 49c78793 addi a5,a5,1180 # 400049c + 3005ef8: 0007a623 sw zero,12(a5) + g_timer3.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ + 3005efc: 040007b7 lui a5,0x4000 + 3005f00: 49c78793 addi a5,a5,1180 # 400049c + 3005f04: 4705 li a4,1 + 3005f06: cb98 sw a4,16(a5) + g_timer3.interruptEn = BASE_CFG_ENABLE; + 3005f08: 040007b7 lui a5,0x4000 + 3005f0c: 49c78793 addi a5,a5,1180 # 400049c + 3005f10: 4705 li a4,1 + 3005f12: afd8 sb a4,28(a5) + g_timer3.adcSocReqEnable = BASE_CFG_DISABLE; + 3005f14: 040007b7 lui a5,0x4000 + 3005f18: 49c78793 addi a5,a5,1180 # 400049c + 3005f1c: 00078ea3 sb zero,29(a5) + g_timer3.dmaReqEnable = BASE_CFG_DISABLE; + 3005f20: 040007b7 lui a5,0x4000 + 3005f24: 49c78793 addi a5,a5,1180 # 400049c + 3005f28: 00078f23 sb zero,30(a5) + HAL_TIMER_Init(&g_timer3); + 3005f2c: 040007b7 lui a5,0x4000 + 3005f30: 49c78513 addi a0,a5,1180 # 400049c + 3005f34: c2aff0ef jal ra,300535e + IRQ_Register(IRQ_TIMER3, HAL_TIMER_IrqHandler, &g_timer3); + 3005f38: 040007b7 lui a5,0x4000 + 3005f3c: 49c78613 addi a2,a5,1180 # 400049c + 3005f40: 030057b7 lui a5,0x3005 + 3005f44: 63678593 addi a1,a5,1590 # 3005636 + 3005f48: 02300513 li a0,35 + 3005f4c: c9efc0ef jal ra,30023ea + + HAL_TIMER_RegisterCallback(&g_timer3, TIMER_PERIOD_FIN, TIMER3_InterruptProcess); + 3005f50: 030067b7 lui a5,0x3006 + 3005f54: 16278613 addi a2,a5,354 # 3006162 + 3005f58: 4581 li a1,0 + 3005f5a: 040007b7 lui a5,0x4000 + 3005f5e: 49c78513 addi a0,a5,1180 # 400049c + 3005f62: fbcff0ef jal ra,300571e + IRQ_SetPriority(IRQ_TIMER3, 1); /* 1 is priority value */ + 3005f66: 4585 li a1,1 + 3005f68: 02300513 li a0,35 + 3005f6c: c53fc0ef jal ra,3002bbe + IRQ_EnableN(IRQ_TIMER3); + 3005f70: 02300513 li a0,35 + 3005f74: cfcfc0ef jal ra,3002470 +} + 3005f78: 0001 nop + 3005f7a: 40f2 lw ra,28(sp) + 3005f7c: 4462 lw s0,24(sp) + 3005f7e: 6105 addi sp,sp,32 + 3005f80: 8082 ret + +03005f82 : + +static void UART0_Init(void) +{ + 3005f82: 1141 addi sp,sp,-16 + 3005f84: c606 sw ra,12(sp) + 3005f86: c422 sw s0,8(sp) + 3005f88: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + 3005f8a: 4585 li a1,1 + 3005f8c: 14000537 lui a0,0x14000 + 3005f90: 286d jal ra,300604a + g_uart0.baseAddress = UART0; + 3005f92: 040007b7 lui a5,0x4000 + 3005f96: 4c478793 addi a5,a5,1220 # 40004c4 + 3005f9a: 14000737 lui a4,0x14000 + 3005f9e: c398 sw a4,0(a5) + + g_uart0.baudRate = UART0_BAND_RATE; + 3005fa0: 040007b7 lui a5,0x4000 + 3005fa4: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fa8: 6771 lui a4,0x1c + 3005faa: 20070713 addi a4,a4,512 # 1c200 + 3005fae: c3d8 sw a4,4(a5) + g_uart0.dataLength = UART_DATALENGTH_8BIT; + 3005fb0: 040007b7 lui a5,0x4000 + 3005fb4: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fb8: 470d li a4,3 + 3005fba: c798 sw a4,8(a5) + g_uart0.stopBits = UART_STOPBITS_ONE; + 3005fbc: 040007b7 lui a5,0x4000 + 3005fc0: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fc4: 0007a623 sw zero,12(a5) + g_uart0.parity = UART_PARITY_NONE; + 3005fc8: 040007b7 lui a5,0x4000 + 3005fcc: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fd0: 4711 li a4,4 + 3005fd2: cb98 sw a4,16(a5) + g_uart0.txMode = UART_MODE_BLOCKING; + 3005fd4: 040007b7 lui a5,0x4000 + 3005fd8: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fdc: 0007aa23 sw zero,20(a5) + g_uart0.rxMode = UART_MODE_BLOCKING; + 3005fe0: 040007b7 lui a5,0x4000 + 3005fe4: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fe8: 0007ac23 sw zero,24(a5) + g_uart0.fifoMode = BASE_CFG_ENABLE; + 3005fec: 040007b7 lui a5,0x4000 + 3005ff0: 4c478793 addi a5,a5,1220 # 40004c4 + 3005ff4: 4705 li a4,1 + 3005ff6: 02e78623 sb a4,44(a5) + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + 3005ffa: 040007b7 lui a5,0x4000 + 3005ffe: 4c478793 addi a5,a5,1220 # 40004c4 + 3006002: 4721 li a4,8 + 3006004: db98 sw a4,48(a5) + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + 3006006: 040007b7 lui a5,0x4000 + 300600a: 4c478793 addi a5,a5,1220 # 40004c4 + 300600e: 4721 li a4,8 + 3006010: dbd8 sw a4,52(a5) + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + 3006012: 040007b7 lui a5,0x4000 + 3006016: 4c478793 addi a5,a5,1220 # 40004c4 + 300601a: 0207ac23 sw zero,56(a5) + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + 300601e: 040007b7 lui a5,0x4000 + 3006022: 4c478793 addi a5,a5,1220 # 40004c4 + 3006026: 0607ac23 sw zero,120(a5) + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + 300602a: 040007b7 lui a5,0x4000 + 300602e: 4c478793 addi a5,a5,1220 # 40004c4 + 3006032: 06078e23 sb zero,124(a5) + HAL_UART_Init(&g_uart0); + 3006036: 040007b7 lui a5,0x4000 + 300603a: 4c478513 addi a0,a5,1220 # 40004c4 + 300603e: 321d jal ra,3005964 +} + 3006040: 0001 nop + 3006042: 40b2 lw ra,12(sp) + 3006044: 4422 lw s0,8(sp) + 3006046: 0141 addi sp,sp,16 + 3006048: 8082 ret + +0300604a : + 300604a: de8fd06f j 3003632 + +0300604e : + +static void IOConfig(void) +{ + 300604e: 1141 addi sp,sp,-16 + 3006050: c606 sw ra,12(sp) + 3006052: c422 sw s0,8(sp) + 3006054: 0800 addi s0,sp,16 + /* Config PIN4 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_ADC_AIN6); /* Check function selection */ + 3006056: 010c07b7 lui a5,0x10c0 + 300605a: 23c78513 addi a0,a5,572 # 10c023c + 300605e: 20c1 jal ra,300611e + HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_ADC_AIN6, PULL_NONE); /* Pull-up and Pull-down */ + 3006060: 4581 li a1,0 + 3006062: 010c07b7 lui a5,0x10c0 + 3006066: 23c78513 addi a0,a5,572 # 10c023c + 300606a: 2845 jal ra,300611a + HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_ADC_AIN6, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 300606c: 4581 li a1,0 + 300606e: 010c07b7 lui a5,0x10c0 + 3006072: 23c78513 addi a0,a5,572 # 10c023c + 3006076: 2045 jal ra,3006116 + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_ADC_AIN6, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3006078: 4585 li a1,1 + 300607a: 010c07b7 lui a5,0x10c0 + 300607e: 23c78513 addi a0,a5,572 # 10c023c + 3006082: 2841 jal ra,3006112 + HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_ADC_AIN6, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3006084: 4589 li a1,2 + 3006086: 010c07b7 lui a5,0x10c0 + 300608a: 23c78513 addi a0,a5,572 # 10c023c + 300608e: 2041 jal ra,300610e + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + 3006090: 019007b7 lui a5,0x1900 + 3006094: 23378513 addi a0,a5,563 # 1900233 + 3006098: 2059 jal ra,300611e + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + 300609a: 4581 li a1,0 + 300609c: 019007b7 lui a5,0x1900 + 30060a0: 23378513 addi a0,a5,563 # 1900233 + 30060a4: 289d jal ra,300611a + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 30060a6: 4581 li a1,0 + 30060a8: 019007b7 lui a5,0x1900 + 30060ac: 23378513 addi a0,a5,563 # 1900233 + 30060b0: 209d jal ra,3006116 + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 30060b2: 4585 li a1,1 + 30060b4: 019007b7 lui a5,0x1900 + 30060b8: 23378513 addi a0,a5,563 # 1900233 + 30060bc: 2899 jal ra,3006112 + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 30060be: 4589 li a1,2 + 30060c0: 019007b7 lui a5,0x1900 + 30060c4: 23378513 addi a0,a5,563 # 1900233 + 30060c8: 2099 jal ra,300610e + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + 30060ca: 019407b7 lui a5,0x1940 + 30060ce: 23378513 addi a0,a5,563 # 1940233 + 30060d2: 20b1 jal ra,300611e + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + 30060d4: 4589 li a1,2 + 30060d6: 019407b7 lui a5,0x1940 + 30060da: 23378513 addi a0,a5,563 # 1940233 + 30060de: 2835 jal ra,300611a + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 30060e0: 4581 li a1,0 + 30060e2: 019407b7 lui a5,0x1940 + 30060e6: 23378513 addi a0,a5,563 # 1940233 + 30060ea: 2035 jal ra,3006116 + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 30060ec: 4585 li a1,1 + 30060ee: 019407b7 lui a5,0x1940 + 30060f2: 23378513 addi a0,a5,563 # 1940233 + 30060f6: 2831 jal ra,3006112 + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 30060f8: 4589 li a1,2 + 30060fa: 019407b7 lui a5,0x1940 + 30060fe: 23378513 addi a0,a5,563 # 1940233 + 3006102: 2031 jal ra,300610e +} + 3006104: 0001 nop + 3006106: 40b2 lw ra,12(sp) + 3006108: 4422 lw s0,8(sp) + 300610a: 0141 addi sp,sp,16 + 300610c: 8082 ret + +0300610e : + 300610e: 924ff06f j 3005232 + +03006112 : + 3006112: 8d4ff06f j 30051e6 + +03006116 : + 3006116: 884ff06f j 300519a + +0300611a : + 300611a: 834ff06f j 300514e + +0300611e : + 300611e: ff7fe06f j 3005114 + +03006122 : + +void SystemInit(void) +{ + 3006122: 1141 addi sp,sp,-16 + 3006124: c606 sw ra,12(sp) + 3006126: c422 sw s0,8(sp) + 3006128: 0800 addi s0,sp,16 + IOConfig(); + 300612a: 3715 jal ra,300604e + UART0_Init(); + 300612c: 3d99 jal ra,3005f82 + ADC0_Init(); + 300612e: 39b5 jal ra,3005daa + TIMER3_Init(); + 3006130: 3b89 jal ra,3005e82 + + /* USER CODE BEGIN system_init */ + HAL_TIMER_Start(&g_timer3); + 3006132: 040007b7 lui a5,0x4000 + 3006136: 49c78513 addi a0,a5,1180 # 400049c + 300613a: c7aff0ef jal ra,30055b4 + HAL_ADC_StartIt(&g_adc0); + 300613e: 040007b7 lui a5,0x4000 + 3006142: 54478513 addi a0,a5,1348 # 4000544 + 3006146: ba9fb0ef jal ra,3001cee + HAL_ADC_SoftTrigSample(&g_adc0, ADC_SOC_NUM1); + 300614a: 4585 li a1,1 + 300614c: 040007b7 lui a5,0x4000 + 3006150: 54478513 addi a0,a5,1348 # 4000544 + 3006154: cc7fb0ef jal ra,3001e1a + /* USER CODE END system_init */ + 3006158: 0001 nop + 300615a: 40b2 lw ra,12(sp) + 300615c: 4422 lw s0,8(sp) + 300615e: 0141 addi sp,sp,16 + 3006160: 8082 ret + +03006162 : +float adc_num[adc_shownum]={0}; +unsigned int i=0; + + +void TIMER3_InterruptProcess(void *handle) +{ + 3006162: 7179 addi sp,sp,-48 + 3006164: d606 sw ra,44(sp) + 3006166: d422 sw s0,40(sp) + 3006168: 1800 addi s0,sp,48 + 300616a: fca42e23 sw a0,-36(s0) + unsigned int ret = HAL_ADC_GetConvResult(&g_adc0, ADC_SOC_NUM1); + 300616e: 4585 li a1,1 + 3006170: 040007b7 lui a5,0x4000 + 3006174: 54478513 addi a0,a5,1348 # 4000544 + 3006178: d25fb0ef jal ra,3001e9c + 300617c: fea42623 sw a0,-20(s0) + + + adc_num[i] = (float)ret / (float)4096 * 3.3; + 3006180: fec42783 lw a5,-20(s0) + 3006184: d017f753 fcvt.s.wu fa4,a5 + 3006188: 030077b7 lui a5,0x3007 + 300618c: a387a787 flw fa5,-1480(a5) # 3006a38 + 3006190: 18f77753 fdiv.s fa4,fa4,fa5 + 3006194: 040027b7 lui a5,0x4002 + 3006198: 2047a783 lw a5,516(a5) # 4002204 + 300619c: 03007737 lui a4,0x3007 + 30061a0: a3c72787 flw fa5,-1476(a4) # 3006a3c + 30061a4: 10f777d3 fmul.s fa5,fa4,fa5 + 30061a8: 04000737 lui a4,0x4000 + 30061ac: 5e470713 addi a4,a4,1508 # 40005e4 + 30061b0: 078a slli a5,a5,0x2 + 30061b2: 97ba add a5,a5,a4 + 30061b4: e39c fsw fa5,0(a5) + i++; + 30061b6: 040027b7 lui a5,0x4002 + 30061ba: 2047a783 lw a5,516(a5) # 4002204 + 30061be: 00178713 addi a4,a5,1 + 30061c2: 040027b7 lui a5,0x4002 + 30061c6: 20e7a223 sw a4,516(a5) # 4002204 + if(i>adc_shownum){ + 30061ca: 040027b7 lui a5,0x4002 + 30061ce: 2047a703 lw a4,516(a5) # 4002204 + 30061d2: 70800793 li a5,1800 + 30061d6: 06e7f563 bgeu a5,a4,3006240 + for(i=0;i + 30061e2: a099 j 3006228 + { + DBG_PRINTF("V: %.2f\r\n", adc_num[i]); + 30061e4: 040027b7 lui a5,0x4002 + 30061e8: 2047a783 lw a5,516(a5) # 4002204 + 30061ec: 04000737 lui a4,0x4000 + 30061f0: 5e470713 addi a4,a4,1508 # 40005e4 + 30061f4: 078a slli a5,a5,0x2 + 30061f6: 97ba add a5,a5,a4 + 30061f8: 639c flw fa5,0(a5) + 30061fa: 20f78553 fmv.s fa0,fa5 + 30061fe: 20b1 jal ra,300624a <__extendsfdf2> + 3006200: 87aa mv a5,a0 + 3006202: 882e mv a6,a1 + 3006204: 863e mv a2,a5 + 3006206: 86c2 mv a3,a6 + 3006208: 030077b7 lui a5,0x3007 + 300620c: a2c78513 addi a0,a5,-1492 # 3006a2c + 3006210: b31fe0ef jal ra,3004d40 + for(i=0;i + 300621c: 00178713 addi a4,a5,1 + 3006220: 040027b7 lui a5,0x4002 + 3006224: 20e7a223 sw a4,516(a5) # 4002204 + 3006228: 040027b7 lui a5,0x4002 + 300622c: 2047a703 lw a4,516(a5) # 4002204 + 3006230: 70700793 li a5,1799 + 3006234: fae7f8e3 bgeu a5,a4,30061e4 + } + i=0; + 3006238: 040027b7 lui a5,0x4002 + 300623c: 2007a223 sw zero,516(a5) # 4002204 + } + +} + 3006240: 0001 nop + 3006242: 50b2 lw ra,44(sp) + 3006244: 5422 lw s0,40(sp) + 3006246: 6145 addi sp,sp,48 + 3006248: 8082 ret + +0300624a <__extendsfdf2>: + 300624a: 1141 addi sp,sp,-16 + 300624c: c606 sw ra,12(sp) + 300624e: c422 sw s0,8(sp) + 3006250: c226 sw s1,4(sp) + 3006252: e00506d3 fmv.x.w a3,fa0 + 3006256: 002027f3 frrm a5 + 300625a: 0176d513 srli a0,a3,0x17 + 300625e: 0ff57513 andi a0,a0,255 + 3006262: 00800437 lui s0,0x800 + 3006266: 00150793 addi a5,a0,1 # 14000001 + 300626a: 147d addi s0,s0,-1 # 7fffff + 300626c: 0ff7f793 andi a5,a5,255 + 3006270: 4705 li a4,1 + 3006272: 8c75 and s0,s0,a3 + 3006274: 01f6d493 srli s1,a3,0x1f + 3006278: 00f75963 bge a4,a5,300628a <__extendsfdf2+0x40> + 300627c: 00345793 srli a5,s0,0x3 + 3006280: 38050513 addi a0,a0,896 + 3006284: 0476 slli s0,s0,0x1d + 3006286: 4701 li a4,0 + 3006288: a891 j 30062dc <__extendsfdf2+0x92> + 300628a: e915 bnez a0,30062be <__extendsfdf2+0x74> + 300628c: c459 beqz s0,300631a <__extendsfdf2+0xd0> + 300628e: 8522 mv a0,s0 + 3006290: 2c6d jal ra,300654a <__clzsi2> + 3006292: 47a9 li a5,10 + 3006294: 00a7cf63 blt a5,a0,30062b2 <__extendsfdf2+0x68> + 3006298: 47ad li a5,11 + 300629a: 8f89 sub a5,a5,a0 + 300629c: 01550713 addi a4,a0,21 + 30062a0: 00f457b3 srl a5,s0,a5 + 30062a4: 00e41433 sll s0,s0,a4 + 30062a8: 38900713 li a4,905 + 30062ac: 40a70533 sub a0,a4,a0 + 30062b0: bfd9 j 3006286 <__extendsfdf2+0x3c> + 30062b2: ff550793 addi a5,a0,-11 + 30062b6: 00f417b3 sll a5,s0,a5 + 30062ba: 4401 li s0,0 + 30062bc: b7f5 j 30062a8 <__extendsfdf2+0x5e> + 30062be: c02d beqz s0,3006320 <__extendsfdf2+0xd6> + 30062c0: 00400737 lui a4,0x400 + 30062c4: 8f61 and a4,a4,s0 + 30062c6: 00345793 srli a5,s0,0x3 + 30062ca: 00173713 seqz a4,a4 + 30062ce: 000806b7 lui a3,0x80 + 30062d2: 0712 slli a4,a4,0x4 + 30062d4: 0476 slli s0,s0,0x1d + 30062d6: 8fd5 or a5,a5,a3 + 30062d8: 7ff00513 li a0,2047 + 30062dc: 00100637 lui a2,0x100 + 30062e0: 167d addi a2,a2,-1 # fffff + 30062e2: 8ff1 and a5,a5,a2 + 30062e4: 80100637 lui a2,0x80100 + 30062e8: 167d addi a2,a2,-1 # 800fffff + 30062ea: 7ff57513 andi a0,a0,2047 + 30062ee: 0552 slli a0,a0,0x14 + 30062f0: 8ff1 and a5,a5,a2 + 30062f2: 80000637 lui a2,0x80000 + 30062f6: 8fc9 or a5,a5,a0 + 30062f8: fff64613 not a2,a2 + 30062fc: 01f49693 slli a3,s1,0x1f + 3006300: 8ff1 and a5,a5,a2 + 3006302: 00d7e633 or a2,a5,a3 + 3006306: 8522 mv a0,s0 + 3006308: 85b2 mv a1,a2 + 300630a: c319 beqz a4,3006310 <__extendsfdf2+0xc6> + 300630c: 00172073 csrs fflags,a4 + 3006310: 40b2 lw ra,12(sp) + 3006312: 4422 lw s0,8(sp) + 3006314: 4492 lw s1,4(sp) + 3006316: 0141 addi sp,sp,16 + 3006318: 8082 ret + 300631a: 4781 li a5,0 + 300631c: 4501 li a0,0 + 300631e: b7a5 j 3006286 <__extendsfdf2+0x3c> + 3006320: 4781 li a5,0 + 3006322: 7ff00513 li a0,2047 + 3006326: b785 j 3006286 <__extendsfdf2+0x3c> + +03006328 <__truncdfsf2>: + 3006328: 00202873 frrm a6 + 300632c: 001006b7 lui a3,0x100 + 3006330: 16fd addi a3,a3,-1 # fffff + 3006332: 8eed and a3,a3,a1 + 3006334: 0145d893 srli a7,a1,0x14 + 3006338: 00369793 slli a5,a3,0x3 + 300633c: 7ff8f893 andi a7,a7,2047 + 3006340: 01d55693 srli a3,a0,0x1d + 3006344: 8edd or a3,a3,a5 + 3006346: 00188793 addi a5,a7,1 + 300634a: 7ff7f793 andi a5,a5,2047 + 300634e: 4705 li a4,1 + 3006350: 81fd srli a1,a1,0x1f + 3006352: 00351613 slli a2,a0,0x3 + 3006356: 16f75b63 bge a4,a5,30064cc <__truncdfsf2+0x1a4> + 300635a: c8088713 addi a4,a7,-896 + 300635e: 0fe00793 li a5,254 + 3006362: 0ae7d063 bge a5,a4,3006402 <__truncdfsf2+0xda> + 3006366: 04080063 beqz a6,30063a6 <__truncdfsf2+0x7e> + 300636a: 478d li a5,3 + 300636c: 02f81963 bne a6,a5,300639e <__truncdfsf2+0x76> + 3006370: c99d beqz a1,30063a6 <__truncdfsf2+0x7e> + 3006372: 57fd li a5,-1 + 3006374: 0fe00713 li a4,254 + 3006378: 4681 li a3,0 + 300637a: 4615 li a2,5 + 300637c: 4509 li a0,2 + 300637e: 00166613 ori a2,a2,1 + 3006382: 1aa80063 beq a6,a0,3006522 <__truncdfsf2+0x1fa> + 3006386: 450d li a0,3 + 3006388: 18a80a63 beq a6,a0,300651c <__truncdfsf2+0x1f4> + 300638c: 12081763 bnez a6,30064ba <__truncdfsf2+0x192> + 3006390: 00f7f513 andi a0,a5,15 + 3006394: 4891 li a7,4 + 3006396: 13150263 beq a0,a7,30064ba <__truncdfsf2+0x192> + 300639a: 0791 addi a5,a5,4 + 300639c: aa39 j 30064ba <__truncdfsf2+0x192> + 300639e: 4789 li a5,2 + 30063a0: fcf819e3 bne a6,a5,3006372 <__truncdfsf2+0x4a> + 30063a4: d5f9 beqz a1,3006372 <__truncdfsf2+0x4a> + 30063a6: 4781 li a5,0 + 30063a8: 0ff00713 li a4,255 + 30063ac: 4615 li a2,5 + 30063ae: 00579693 slli a3,a5,0x5 + 30063b2: 0006db63 bgez a3,30063c8 <__truncdfsf2+0xa0> + 30063b6: 0705 addi a4,a4,1 # 400001 + 30063b8: 0ff00693 li a3,255 + 30063bc: 16d70563 beq a4,a3,3006526 <__truncdfsf2+0x1fe> + 30063c0: fc0006b7 lui a3,0xfc000 + 30063c4: 16fd addi a3,a3,-1 # fbffffff + 30063c6: 8ff5 and a5,a5,a3 + 30063c8: 0ff00693 li a3,255 + 30063cc: 838d srli a5,a5,0x3 + 30063ce: 00d71663 bne a4,a3,30063da <__truncdfsf2+0xb2> + 30063d2: c781 beqz a5,30063da <__truncdfsf2+0xb2> + 30063d4: 004007b7 lui a5,0x400 + 30063d8: 4581 li a1,0 + 30063da: 008006b7 lui a3,0x800 + 30063de: 16fd addi a3,a3,-1 # 7fffff + 30063e0: 8ff5 and a5,a5,a3 + 30063e2: 808006b7 lui a3,0x80800 + 30063e6: 0ff77713 andi a4,a4,255 + 30063ea: 16fd addi a3,a3,-1 # 807fffff + 30063ec: 075e slli a4,a4,0x17 + 30063ee: 8ff5 and a5,a5,a3 + 30063f0: 05fe slli a1,a1,0x1f + 30063f2: 8fd9 or a5,a5,a4 + 30063f4: 8fcd or a5,a5,a1 + 30063f6: c219 beqz a2,30063fc <__truncdfsf2+0xd4> + 30063f8: 00162073 csrs fflags,a2 + 30063fc: f0078553 fmv.w.x fa0,a5 + 3006400: 8082 ret + 3006402: 08e04e63 bgtz a4,300649e <__truncdfsf2+0x176> + 3006406: 57a5 li a5,-23 + 3006408: 0ef74d63 blt a4,a5,3006502 <__truncdfsf2+0x1da> + 300640c: 008007b7 lui a5,0x800 + 3006410: 4379 li t1,30 + 3006412: 8edd or a3,a3,a5 + 3006414: 40e30333 sub t1,t1,a4 + 3006418: 47fd li a5,31 + 300641a: 0467ce63 blt a5,t1,3006476 <__truncdfsf2+0x14e> + 300641e: c8288893 addi a7,a7,-894 + 3006422: 011617b3 sll a5,a2,a7 + 3006426: 00f037b3 snez a5,a5 + 300642a: 011696b3 sll a3,a3,a7 + 300642e: 00665333 srl t1,a2,t1 + 3006432: 8edd or a3,a3,a5 + 3006434: 00d367b3 or a5,t1,a3 + 3006438: 4701 li a4,0 + 300643a: cff9 beqz a5,3006518 <__truncdfsf2+0x1f0> + 300643c: 00179713 slli a4,a5,0x1 + 3006440: 00777693 andi a3,a4,7 + 3006444: 4601 li a2,0 + 3006446: c28d beqz a3,3006468 <__truncdfsf2+0x140> + 3006448: 4689 li a3,2 + 300644a: 0cd80263 beq a6,a3,300650e <__truncdfsf2+0x1e6> + 300644e: 468d li a3,3 + 3006450: 0ad80b63 beq a6,a3,3006506 <__truncdfsf2+0x1de> + 3006454: 4605 li a2,1 + 3006456: 00081963 bnez a6,3006468 <__truncdfsf2+0x140> + 300645a: 00f77693 andi a3,a4,15 + 300645e: 4511 li a0,4 + 3006460: 4605 li a2,1 + 3006462: 00a68363 beq a3,a0,3006468 <__truncdfsf2+0x140> + 3006466: 0711 addi a4,a4,4 + 3006468: 01b75693 srli a3,a4,0x1b + 300646c: 0016c693 xori a3,a3,1 + 3006470: 8a85 andi a3,a3,1 + 3006472: 4701 li a4,0 + 3006474: a83d j 30064b2 <__truncdfsf2+0x18a> + 3006476: 57f9 li a5,-2 + 3006478: 40e78733 sub a4,a5,a4 + 300647c: 02000793 li a5,32 + 3006480: 00e6d733 srl a4,a3,a4 + 3006484: 4501 li a0,0 + 3006486: 00f30663 beq t1,a5,3006492 <__truncdfsf2+0x16a> + 300648a: ca288893 addi a7,a7,-862 + 300648e: 01169533 sll a0,a3,a7 + 3006492: 00c567b3 or a5,a0,a2 + 3006496: 00f037b3 snez a5,a5 + 300649a: 8fd9 or a5,a5,a4 + 300649c: bf71 j 3006438 <__truncdfsf2+0x110> + 300649e: 051a slli a0,a0,0x6 + 30064a0: 00a037b3 snez a5,a0 + 30064a4: 068e slli a3,a3,0x3 + 30064a6: 8275 srli a2,a2,0x1d + 30064a8: 8edd or a3,a3,a5 + 30064aa: 00c6e7b3 or a5,a3,a2 + 30064ae: 4681 li a3,0 + 30064b0: 4601 li a2,0 + 30064b2: 0077f513 andi a0,a5,7 + 30064b6: ec0513e3 bnez a0,300637c <__truncdfsf2+0x54> + 30064ba: ee068ae3 beqz a3,30063ae <__truncdfsf2+0x86> + 30064be: 00167693 andi a3,a2,1 + 30064c2: ee0686e3 beqz a3,30063ae <__truncdfsf2+0x86> + 30064c6: 00266613 ori a2,a2,2 + 30064ca: b5d5 j 30063ae <__truncdfsf2+0x86> + 30064cc: 00c6e7b3 or a5,a3,a2 + 30064d0: 00089563 bnez a7,30064da <__truncdfsf2+0x1b2> + 30064d4: 00f037b3 snez a5,a5 + 30064d8: b785 j 3006438 <__truncdfsf2+0x110> + 30064da: cf8d beqz a5,3006514 <__truncdfsf2+0x1ec> + 30064dc: 7ff00793 li a5,2047 + 30064e0: 4601 li a2,0 + 30064e2: 00f89863 bne a7,a5,30064f2 <__truncdfsf2+0x1ca> + 30064e6: 00400637 lui a2,0x400 + 30064ea: 8e75 and a2,a2,a3 + 30064ec: 00163613 seqz a2,a2 + 30064f0: 0612 slli a2,a2,0x4 + 30064f2: 068e slli a3,a3,0x3 + 30064f4: 020007b7 lui a5,0x2000 + 30064f8: 8fd5 or a5,a5,a3 + 30064fa: 0ff00713 li a4,255 + 30064fe: 4681 li a3,0 + 3006500: bf4d j 30064b2 <__truncdfsf2+0x18a> + 3006502: 4785 li a5,1 + 3006504: bf25 j 300643c <__truncdfsf2+0x114> + 3006506: 4605 li a2,1 + 3006508: f1a5 bnez a1,3006468 <__truncdfsf2+0x140> + 300650a: 0721 addi a4,a4,8 + 300650c: bfb1 j 3006468 <__truncdfsf2+0x140> + 300650e: 4605 li a2,1 + 3006510: dda1 beqz a1,3006468 <__truncdfsf2+0x140> + 3006512: bfe5 j 300650a <__truncdfsf2+0x1e2> + 3006514: 0ff00713 li a4,255 + 3006518: 4601 li a2,0 + 300651a: bd51 j 30063ae <__truncdfsf2+0x86> + 300651c: fdd9 bnez a1,30064ba <__truncdfsf2+0x192> + 300651e: 07a1 addi a5,a5,8 # 2000008 + 3006520: bf69 j 30064ba <__truncdfsf2+0x192> + 3006522: ddc1 beqz a1,30064ba <__truncdfsf2+0x192> + 3006524: bfed j 300651e <__truncdfsf2+0x1f6> + 3006526: 4781 li a5,0 + 3006528: 00080e63 beqz a6,3006544 <__truncdfsf2+0x21c> + 300652c: 468d li a3,3 + 300652e: 00d81763 bne a6,a3,300653c <__truncdfsf2+0x214> + 3006532: c989 beqz a1,3006544 <__truncdfsf2+0x21c> + 3006534: 57fd li a5,-1 + 3006536: 0fe00713 li a4,254 + 300653a: a029 j 3006544 <__truncdfsf2+0x21c> + 300653c: 4689 li a3,2 + 300653e: fed81be3 bne a6,a3,3006534 <__truncdfsf2+0x20c> + 3006542: d9ed beqz a1,3006534 <__truncdfsf2+0x20c> + 3006544: 00566613 ori a2,a2,5 + 3006548: b541 j 30063c8 <__truncdfsf2+0xa0> + +0300654a <__clzsi2>: + 300654a: 67c1 lui a5,0x10 + 300654c: 02f57663 bgeu a0,a5,3006578 <__clzsi2+0x2e> + 3006550: 0ff00793 li a5,255 + 3006554: 00a7b7b3 sltu a5,a5,a0 + 3006558: 078e slli a5,a5,0x3 + 300655a: 02000713 li a4,32 + 300655e: 8f1d sub a4,a4,a5 + 3006560: 00f557b3 srl a5,a0,a5 + 3006564: 00000517 auipc a0,0x0 + 3006568: 5e052503 lw a0,1504(a0) # 3006b44 <_GLOBAL_OFFSET_TABLE_+0x4> + 300656c: 97aa add a5,a5,a0 + 300656e: 0007c503 lbu a0,0(a5) # 10000 + 3006572: 40a70533 sub a0,a4,a0 + 3006576: 8082 ret + 3006578: 01000737 lui a4,0x1000 + 300657c: 47c1 li a5,16 + 300657e: fce56ee3 bltu a0,a4,300655a <__clzsi2+0x10> + 3006582: 47e1 li a5,24 + 3006584: bfd9 j 300655a <__clzsi2+0x10> + ... + +03006588 <__rodata_start>: + 3006588: 9680 pop {ra,s0-s6},384 + 300658a: 4b18 lw a4,16(a4) + +0300658c : + 300658c: 0000 1400 0000 0000 0140 0000 1000 1400 ........@....... + 300659c: 0000 0000 0144 0000 2000 1400 0000 0000 ....D.... ...... + 30065ac: 0148 0000 3000 1400 0000 0000 014c 0000 H....0......L... + 30065bc: 0000 1430 0000 0000 0240 0000 1000 1430 ..0.....@.....0. + 30065cc: 0000 0000 0244 0000 2000 1430 0000 0000 ....D.... 0..... + 30065dc: 0248 0000 3000 1430 0000 0000 024c 0000 H....00.....L... + 30065ec: 0000 1438 0000 0000 0040 0000 0000 1420 ..8.....@..... . + 30065fc: 0000 0000 0180 0000 1000 1420 0000 0000 .......... ..... + 300660c: 0184 0000 0000 1410 0000 0000 01c0 0000 ................ + 300661c: 1000 1410 0000 0000 01c4 0000 0000 1460 ..............`. + 300662c: 0001 0000 02c0 0000 0000 1470 0000 0000 ..........p..... + 300663c: 0440 0000 1000 1470 0000 0000 0444 0000 @.....p.....D... + 300664c: 2000 1470 0000 0000 0448 0000 3000 1470 . p.....H....0p. + 300665c: 0000 0000 044c 0000 0000 1440 0000 0000 ....L.....@..... + 300666c: 0200 0000 0000 14b0 0000 0000 0280 0000 ................ + 300667c: 1000 14b0 0000 0000 0284 0000 2000 14b0 ............. .. + 300668c: 0000 0000 0288 0000 0000 1c00 0000 0000 ................ + 300669c: 0300 0000 0000 1450 0000 0000 0480 0000 ......P......... + 30066ac: 1000 1450 0000 0000 0484 0000 2000 1450 ..P.......... P. + 30066bc: 0000 0000 0488 0000 3000 1450 0000 0000 .........0P..... + 30066cc: 048c 0000 4000 1450 0000 0000 0490 0000 .....@P......... + 30066dc: 5000 1450 0000 0000 0494 0000 1000 1440 .PP...........@. + 30066ec: 0004 0000 03c0 0000 0000 14c0 0000 0000 ................ + 30066fc: 04c0 0000 1000 14c0 0000 0000 04c4 0000 ................ + 300670c: 0000 147d 0000 0000 0b00 0000 0000 1480 ..}............. + 300671c: 0000 0000 0380 0000 0000 14a0 0000 0000 ................ + 300672c: 0400 0000 1000 14a0 0000 0000 0404 0000 ................ + 300673c: 2000 14a0 0000 0000 0408 0000 3000 14a0 . ...........0.. + 300674c: 0000 0000 040c 0000 0000 1001 0000 0000 ................ + 300675c: 0340 0000 0000 1810 0005 0000 0a60 0000 @...........`... + 300676c: 0000 1830 0005 0000 0a70 0000 0000 1840 ..0.....p.....@. + 300677c: 0005 0000 0a80 0000 0000 1820 0005 0000 .......... ..... + 300678c: 0a90 0000 1000 1820 0005 0000 0a90 0004 ...... ......... + 300679c: 0000 1800 0002 0000 0a00 0000 0000 1471 ..............q. + 30067ac: 0003 0000 0500 0000 2e2e 642f 6972 6576 ........../drive + 30067bc: 7372 612f 6364 692f 636e 612f 6364 695f rs/adc/inc/adc_i + 30067cc: 2e70 0068 2e2e 642f 6972 6576 7372 612f p.h.../drivers/a + 30067dc: 6364 732f 6372 612f 6364 632e 0000 0000 dc/src/adc.c.... + 30067ec: 0000 3f80 0000 4480 5547 4055 0000 4580 ...?...DGUU@...E + 30067fc: 6666 4026 51ec 4068 2160 0300 216c 0300 ff&@.Qh@`!..l!.. + 300680c: 2178 0300 2184 0300 2190 0300 219c 0300 x!...!...!...!.. + 300681c: 21a8 0300 21b4 0300 21c0 0300 2e2e 642f .!...!...!..../d + 300682c: 6972 6576 7372 622f 7361 2f65 7273 2f63 rivers/base/src/ + 300683c: 6e69 6574 7272 7075 2e74 0063 2640 0300 interrupt.c.@&.. + 300684c: 2692 0300 26e4 0300 2736 0300 2788 0300 .&...&..6'...'.. + 300685c: 27da 0300 282c 0300 287e 0300 2914 0300 .'..,(..~(...).. + 300686c: 2966 0300 29b8 0300 2a0a 0300 2a5c 0300 f)...)...*..\*.. + 300687c: 2aae 0300 2b00 0300 2b52 0300 2e2e 642f .*...+..R+..../d + 300688c: 6972 6576 7372 632f 6772 692f 636e 632f rivers/crg/inc/c + 300689c: 6772 695f 2e70 0068 2e2e 642f 6972 6576 rg_ip.h.../drive + 30068ac: 7372 632f 6772 732f 6372 632f 6772 632e rs/crg/src/crg.c + ... + 30068c4: 0001 0000 0002 0000 0003 0000 0004 0000 ................ + 30068d4: 0005 0000 0006 0000 0007 0000 35d4 0300 .............5.. + 30068e4: 35de 0300 35f6 0300 35d4 0300 3612 0300 .5...5...5...6.. + 30068f4: 35d4 0300 4b30 0300 4b9a 0300 4b9a 0300 .5..0K...K...K.. + 3006904: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006914: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006924: 4a70 0300 4ac6 0300 4b9a 0300 4b5a 0300 pJ...J...K..ZK.. + 3006934: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006944: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006954: 4b9a 0300 4b30 0300 4b9a 0300 4b9a 0300 .K..0K...K...K.. + 3006964: 4a9a 0300 4b9a 0300 4af0 0300 4b9a 0300 .J...K...J...K.. + 3006974: 4b9a 0300 4b30 0300 2e2e 642f 6972 6576 .K..0K..../drive + 3006984: 7372 692f 636f 676d 692f 636e 692f 636f rs/iocmg/inc/ioc + 3006994: 676d 695f 2e70 0068 2e2e 642f 6972 6576 mg_ip.h.../drive + 30069a4: 7372 692f 636f 676d 732f 6372 692f 636f rs/iocmg/src/ioc + 30069b4: 676d 632e 0000 0000 2e2e 642f 6972 6576 mg.c....../drive + 30069c4: 7372 742f 6d69 7265 692f 636e 742f 6d69 rs/timer/inc/tim + 30069d4: 7265 695f 2e70 0068 2e2e 642f 6972 6576 er_ip.h.../drive + 30069e4: 7372 742f 6d69 7265 732f 6372 742f 6d69 rs/timer/src/tim + 30069f4: 7265 632e 0000 0000 58f6 0300 590c 0300 er.c.....X...Y.. + 3006a04: 5922 0300 5938 0300 594e 0300 2e2e 642f "Y..8Y..NY..../d + 3006a14: 6972 6576 7372 752f 7261 2f74 7273 2f63 rivers/uart/src/ + 3006a24: 6175 7472 632e 0000 3a56 2520 322e 0d66 uart.c..V: %.2f. + 3006a34: 000a 0000 0000 4580 3333 4053 .......E33S@ + +03006a40 <__clz_tab>: + 3006a40: 0100 0202 0303 0303 0404 0404 0404 0404 ................ + 3006a50: 0505 0505 0505 0505 0505 0505 0505 0505 ................ + 3006a60: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 3006a70: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 3006a80: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006a90: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006aa0: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006ab0: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006ac0: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006ad0: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006ae0: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006af0: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b00: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b10: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b20: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b30: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + +03006b40 <_GLOBAL_OFFSET_TABLE_>: + 3006b40: 0000 0000 6a40 0300 ffff ffff 0000 0000 ....@j.......... + +out/bin/target.elf: file format elf32-littleriscv + + +Disassembly of section .text.entry: + +03000004 <_start>: + + .section .text.entry + .global _start + .option norvc +_start: + j handle_reset + 3000004: 4fc0006f j 3000500 + +03000008 : +.endm + +/* The interrupt vector table must be aligned with 4 bytes */ +.align 2 +TrapHandler: + j TrapVector /* trap and INT 0 */ + 3000008: 4680006f j 3000470 + j TrapVector /* INT 1 */ + 300000c: 4640006f j 3000470 + j TrapVector /* INT 2 */ + 3000010: 4600006f j 3000470 + j TrapVector /* INT 3 */ + 3000014: 45c0006f j 3000470 + j TrapVector /* INT 4 */ + 3000018: 4580006f j 3000470 + j TrapVector /* INT 5 */ + 300001c: 4540006f j 3000470 + j TrapVector /* INT 6 */ + 3000020: 4500006f j 3000470 + j TrapVector /* INT 7 */ + 3000024: 44c0006f j 3000470 + j TrapVector /* INT 8 */ + 3000028: 4480006f j 3000470 + j TrapVector /* INT 9 */ + 300002c: 4440006f j 3000470 + j TrapVector /* INT 10 */ + 3000030: 4400006f j 3000470 + j TrapVector /* INT 11 */ + 3000034: 43c0006f j 3000470 + j TrapVector /* INT 12 */ + 3000038: 4380006f j 3000470 + j TrapVector /* INT 13 */ + 300003c: 4340006f j 3000470 + j TrapVector /* INT 14 */ + 3000040: 4300006f j 3000470 + j TrapVector /* INT 15 */ + 3000044: 42c0006f j 3000470 + j TrapVector /* INT 16 */ + 3000048: 4280006f j 3000470 + j TrapVector /* INT 17 */ + 300004c: 4240006f j 3000470 + j TrapVector /* INT 18 */ + 3000050: 4200006f j 3000470 + j TrapVector /* INT 19 */ + 3000054: 41c0006f j 3000470 + j TrapVector /* INT 20 */ + 3000058: 4180006f j 3000470 + j TrapVector /* INT 21 */ + 300005c: 4140006f j 3000470 + j TrapVector /* INT 22 */ + 3000060: 4100006f j 3000470 + j TrapVector /* INT 23 */ + 3000064: 40c0006f j 3000470 + j TrapVector /* INT 24 */ + 3000068: 4080006f j 3000470 + j TrapVector /* INT 25 */ + 300006c: 4040006f j 3000470 + + j IntHandler /* INT 26 */ + 3000070: 2640006f j 30002d4 + j IntHandler /* INT 27 */ + 3000074: 2600006f j 30002d4 + j IntHandler /* INT 28 */ + 3000078: 25c0006f j 30002d4 + j IntHandler /* INT 29 */ + 300007c: 2580006f j 30002d4 + j IntHandler /* INT 30 */ + 3000080: 2540006f j 30002d4 + j IntHandler /* INT 31 */ + 3000084: 2500006f j 30002d4 + j IntHandler /* INT 32 */ + 3000088: 24c0006f j 30002d4 + j IntHandler /* INT 33 */ + 300008c: 2480006f j 30002d4 + j IntHandler /* INT 34 */ + 3000090: 2440006f j 30002d4 + j IntHandler /* INT 35 */ + 3000094: 2400006f j 30002d4 + j IntHandler /* INT 36 */ + 3000098: 23c0006f j 30002d4 + j IntHandler /* INT 37 */ + 300009c: 2380006f j 30002d4 + j IntHandler /* INT 38 */ + 30000a0: 2340006f j 30002d4 + j IntHandler /* INT 39 */ + 30000a4: 2300006f j 30002d4 + j IntHandler /* INT 40 */ + 30000a8: 22c0006f j 30002d4 + j IntHandler /* INT 41 */ + 30000ac: 2280006f j 30002d4 + j IntHandler /* INT 42 */ + 30000b0: 2240006f j 30002d4 + j IntHandler /* INT 43 */ + 30000b4: 2200006f j 30002d4 + j IntHandler /* INT 44 */ + 30000b8: 21c0006f j 30002d4 + j IntHandler /* INT 45 */ + 30000bc: 2180006f j 30002d4 + j IntHandler /* INT 46 */ + 30000c0: 2140006f j 30002d4 + j IntHandler /* INT 47 */ + 30000c4: 2100006f j 30002d4 + j IntHandler /* INT 48 */ + 30000c8: 20c0006f j 30002d4 + j IntHandler /* INT 49 */ + 30000cc: 2080006f j 30002d4 + j IntHandler /* INT 50 */ + 30000d0: 2040006f j 30002d4 + j IntHandler /* INT 51 */ + 30000d4: 2000006f j 30002d4 + j IntHandler /* INT 52 */ + 30000d8: 1fc0006f j 30002d4 + j IntHandler /* INT 53 */ + 30000dc: 1f80006f j 30002d4 + j IntHandler /* INT 54 */ + 30000e0: 1f40006f j 30002d4 + j IntHandler /* INT 55 */ + 30000e4: 1f00006f j 30002d4 + j IntHandler /* INT 56 */ + 30000e8: 1ec0006f j 30002d4 + j IntHandler /* INT 57 */ + 30000ec: 1e80006f j 30002d4 + j IntHandler /* INT 58 */ + 30000f0: 1e40006f j 30002d4 + j IntHandler /* INT 59 */ + 30000f4: 1e00006f j 30002d4 + j IntHandler /* INT 60 */ + 30000f8: 1dc0006f j 30002d4 + j IntHandler /* INT 61 */ + 30000fc: 1d80006f j 30002d4 + j IntHandler /* INT 62 */ + 3000100: 1d40006f j 30002d4 + j IntHandler /* INT 63 */ + 3000104: 1d00006f j 30002d4 + j IntHandler /* INT 64 */ + 3000108: 1cc0006f j 30002d4 + j IntHandler /* INT 65 */ + 300010c: 1c80006f j 30002d4 + j IntHandler /* INT 66 */ + 3000110: 1c40006f j 30002d4 + j IntHandler /* INT 67 */ + 3000114: 1c00006f j 30002d4 + j IntHandler /* INT 68 */ + 3000118: 1bc0006f j 30002d4 + j IntHandler /* INT 69 */ + 300011c: 1b80006f j 30002d4 + j IntHandler /* INT 70 */ + 3000120: 1b40006f j 30002d4 + j IntHandler /* INT 71 */ + 3000124: 1b00006f j 30002d4 + j IntHandler /* INT 72 */ + 3000128: 1ac0006f j 30002d4 + j IntHandler /* INT 73 */ + 300012c: 1a80006f j 30002d4 + j IntHandler /* INT 74 */ + 3000130: 1a40006f j 30002d4 + j IntHandler /* INT 75 */ + 3000134: 1a00006f j 30002d4 + j IntHandler /* INT 76 */ + 3000138: 19c0006f j 30002d4 + j IntHandler /* INT 77 */ + 300013c: 1980006f j 30002d4 + j IntHandler /* INT 78 */ + 3000140: 1940006f j 30002d4 + j IntHandler /* INT 79 */ + 3000144: 1900006f j 30002d4 + j IntHandler /* INT 80 */ + 3000148: 18c0006f j 30002d4 + j IntHandler /* INT 81 */ + 300014c: 1880006f j 30002d4 + j IntHandler /* INT 82 */ + 3000150: 1840006f j 30002d4 + j IntHandler /* INT 83 */ + 3000154: 1800006f j 30002d4 + j IntHandler /* INT 84 */ + 3000158: 17c0006f j 30002d4 + j IntHandler /* INT 85 */ + 300015c: 1780006f j 30002d4 + j IntHandler /* INT 86 */ + 3000160: 1740006f j 30002d4 + j IntHandler /* INT 87 */ + 3000164: 1700006f j 30002d4 + j IntHandler /* INT 88 */ + 3000168: 16c0006f j 30002d4 + j IntHandler /* INT 89 */ + 300016c: 1680006f j 30002d4 + j IntHandler /* INT 90 */ + 3000170: 1640006f j 30002d4 + j IntHandler /* INT 91 */ + 3000174: 1600006f j 30002d4 + j IntHandler /* INT 92 */ + 3000178: 15c0006f j 30002d4 + j IntHandler /* INT 93 */ + 300017c: 1580006f j 30002d4 + j IntHandler /* INT 94 */ + 3000180: 1540006f j 30002d4 + j IntHandler /* INT 95 */ + 3000184: 1500006f j 30002d4 + j IntHandler /* INT 96 */ + 3000188: 14c0006f j 30002d4 + j IntHandler /* INT 97 */ + 300018c: 1480006f j 30002d4 + j IntHandler /* INT 98 */ + 3000190: 1440006f j 30002d4 + j IntHandler /* INT 99 */ + 3000194: 1400006f j 30002d4 + j IntHandler /* INT 100 */ + 3000198: 13c0006f j 30002d4 + j IntHandler /* INT 101 */ + 300019c: 1380006f j 30002d4 + j IntHandler /* INT 102 */ + 30001a0: 1340006f j 30002d4 + j IntHandler /* INT 103 */ + 30001a4: 1300006f j 30002d4 + j IntHandler /* INT 104 */ + 30001a8: 12c0006f j 30002d4 + j IntHandler /* INT 105 */ + 30001ac: 1280006f j 30002d4 + j IntHandler /* INT 106 */ + 30001b0: 1240006f j 30002d4 + j IntHandler /* INT 107 */ + 30001b4: 1200006f j 30002d4 + j IntHandler /* INT 108 */ + 30001b8: 11c0006f j 30002d4 + j IntHandler /* INT 109 */ + 30001bc: 1180006f j 30002d4 + j IntHandler /* INT 110 */ + 30001c0: 1140006f j 30002d4 + j IntHandler /* INT 111 */ + 30001c4: 1100006f j 30002d4 + j IntHandler /* INT 112 */ + 30001c8: 10c0006f j 30002d4 + j IntHandler /* INT 113 */ + 30001cc: 1080006f j 30002d4 + j IntHandler /* INT 114 */ + 30001d0: 1040006f j 30002d4 + j IntHandler /* INT 115 */ + 30001d4: 1000006f j 30002d4 + j IntHandler /* INT 116 */ + 30001d8: 0fc0006f j 30002d4 + j IntHandler /* INT 117 */ + 30001dc: 0f80006f j 30002d4 + j IntHandler /* INT 118 */ + 30001e0: 0f40006f j 30002d4 + j IntHandler /* INT 119 */ + 30001e4: 0f00006f j 30002d4 + j IntHandler /* INT 120 */ + 30001e8: 0ec0006f j 30002d4 + j IntHandler /* INT 121 */ + 30001ec: 0e80006f j 30002d4 + +030001f0 : + +.align 2 +NmiEntry: + SAVE_SYSERR_REGS + 30001f0: f9010113 addi sp,sp,-112 + 30001f4: 04812023 sw s0,64(sp) + 30001f8: 04912223 sw s1,68(sp) + 30001fc: 05212423 sw s2,72(sp) + 3000200: 05312623 sw s3,76(sp) + 3000204: 05412823 sw s4,80(sp) + 3000208: 05512a23 sw s5,84(sp) + 300020c: 05612c23 sw s6,88(sp) + 3000210: 05712e23 sw s7,92(sp) + 3000214: 07812023 sw s8,96(sp) + 3000218: 07912223 sw s9,100(sp) + 300021c: 07a12423 sw s10,104(sp) + 3000220: 07b12623 sw s11,108(sp) + 3000224: 11010593 addi a1,sp,272 + 3000228: 06b12823 sw a1,112(sp) + 300022c: 06312a23 sw gp,116(sp) + 3000230: 06412c23 sw tp,120(sp) + 3000234: 34102573 csrr a0,mepc + 3000238: 300025f3 csrr a1,mstatus + 300023c: 34302673 csrr a2,mtval + 3000240: 342026f3 csrr a3,mcause + 3000244: 06a12e23 sw a0,124(sp) + 3000248: 08b12023 sw a1,128(sp) + 300024c: 08c12223 sw a2,132(sp) + 3000250: 08d12423 sw a3,136(sp) + 3000254: 00010513 mv a0,sp + call SysErrNmiEntry + 3000258: 384020ef jal ra,30025dc + +0300025c : +deadLoop1: + tail deadLoop1 + 300025c: a001 j 300025c + nop + 300025e: 00000013 nop + +03000262 : + +.align 2 +TrapEntry: + SAVE_SYSERR_REGS + 3000262: f9010113 addi sp,sp,-112 + 3000266: 04812023 sw s0,64(sp) + 300026a: 04912223 sw s1,68(sp) + 300026e: 05212423 sw s2,72(sp) + 3000272: 05312623 sw s3,76(sp) + 3000276: 05412823 sw s4,80(sp) + 300027a: 05512a23 sw s5,84(sp) + 300027e: 05612c23 sw s6,88(sp) + 3000282: 05712e23 sw s7,92(sp) + 3000286: 07812023 sw s8,96(sp) + 300028a: 07912223 sw s9,100(sp) + 300028e: 07a12423 sw s10,104(sp) + 3000292: 07b12623 sw s11,108(sp) + 3000296: 11010593 addi a1,sp,272 + 300029a: 06b12823 sw a1,112(sp) + 300029e: 06312a23 sw gp,116(sp) + 30002a2: 06412c23 sw tp,120(sp) + 30002a6: 34102573 csrr a0,mepc + 30002aa: 300025f3 csrr a1,mstatus + 30002ae: 34302673 csrr a2,mtval + 30002b2: 342026f3 csrr a3,mcause + 30002b6: 06a12e23 sw a0,124(sp) + 30002ba: 08b12023 sw a1,128(sp) + 30002be: 08c12223 sw a2,132(sp) + 30002c2: 08d12423 sw a3,136(sp) + 30002c6: 00010513 mv a0,sp + /* Exception run with interrupts masked */ + csrc mstatus, MSTATUS_MIE + 30002ca: 30047073 csrci mstatus,8 + call SysErrExcEntry + 30002ce: 2f0020ef jal ra,30025be + +030002d2 : +deadLoop2: + tail deadLoop2 + 30002d2: a001 j 30002d2 + +030002d4 : + +.align 2 +IntHandler: + addi sp, sp, -(TOTAL_INT_SIZE_ON_STACK) + 30002d4: f6010113 addi sp,sp,-160 + + SREG a0, 3 * REGBYTES(sp) + 30002d8: 00a12623 sw a0,12(sp) + SREG a1, 4 * REGBYTES(sp) + 30002dc: 00b12823 sw a1,16(sp) +#endif + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + csrr a0, mcause +#else + csrr a0, cipri + 30002e0: 7ed02573 csrr a0,0x7ed + csrr a1, prithd + 30002e4: bfe025f3 csrr a1,0xbfe + csrw prithd, a0 /* read prithd */ + 30002e8: bfe51073 csrw 0xbfe,a0 + SREG a1, 6 * REGBYTES(sp) /* save prithd */ + 30002ec: 00b12c23 sw a1,24(sp) + csrr a1, mstatus /* read mstatus */ + 30002f0: 300025f3 csrr a1,mstatus + SREG a1, 7 * REGBYTES(sp) /* save mstatus */ + 30002f4: 00b12e23 sw a1,28(sp) + csrr a1, mepc /* read mepc */ + 30002f8: 341025f3 csrr a1,mepc + SREG a1, 8 * REGBYTES(sp) /* save mepc */ + 30002fc: 02b12023 sw a1,32(sp) + + csrr a0, mcause + 3000300: 34202573 csrr a0,mcause + + li a1, (3<<11) + 3000304: 000025b7 lui a1,0x2 + 3000308: 80058593 addi a1,a1,-2048 # 1800 + csrs mstatus, a1 + 300030c: 3005a073 csrs mstatus,a1 + la a1, custom_nested_irq_main_handler_entry + 3000310: 00000597 auipc a1,0x0 + 3000314: 01058593 addi a1,a1,16 # 3000320 + csrw mepc, a1 + 3000318: 34159073 csrw mepc,a1 + mret + 300031c: 30200073 mret + +03000320 : +#endif + +.align 2 +custom_nested_irq_main_handler_entry: + SREG t0, 0 * REGBYTES(sp) + 3000320: 00512023 sw t0,0(sp) + SREG t1, 1 * REGBYTES(sp) + 3000324: 00612223 sw t1,4(sp) + SREG t2, 2 * REGBYTES(sp) + 3000328: 00712423 sw t2,8(sp) + SREG a2, 5 * REGBYTES(sp) + 300032c: 00c12a23 sw a2,20(sp) + SREG ra, 9 * REGBYTES(sp) + 3000330: 02112223 sw ra,36(sp) + SREG a3, 10 * REGBYTES(sp) + 3000334: 02d12423 sw a3,40(sp) + SREG a4, 11 * REGBYTES(sp) + 3000338: 02e12623 sw a4,44(sp) + SREG a5, 12 * REGBYTES(sp) + 300033c: 02f12823 sw a5,48(sp) + SREG a6, 13 * REGBYTES(sp) + 3000340: 03012a23 sw a6,52(sp) + SREG a7, 14 * REGBYTES(sp) + 3000344: 03112c23 sw a7,56(sp) + SREG t3, 15 * REGBYTES(sp) + 3000348: 03c12e23 sw t3,60(sp) + SREG t4, 16 * REGBYTES(sp) + 300034c: 05d12023 sw t4,64(sp) + SREG t5, 17 * REGBYTES(sp) + 3000350: 05e12223 sw t5,68(sp) + SREG t6, 18 * REGBYTES(sp) + 3000354: 05f12423 sw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FSREG f0, 19 * REGBYTES(sp) + 3000358: 04012627 fsw ft0,76(sp) + FSREG f1, 20 * REGBYTES(sp) + 300035c: 04112827 fsw ft1,80(sp) + FSREG f2, 21 * REGBYTES(sp) + 3000360: 04212a27 fsw ft2,84(sp) + FSREG f3, 22 * REGBYTES(sp) + 3000364: 04312c27 fsw ft3,88(sp) + FSREG f4, 23 * REGBYTES(sp) + 3000368: 04412e27 fsw ft4,92(sp) + FSREG f5, 24 * REGBYTES(sp) + 300036c: 06512027 fsw ft5,96(sp) + FSREG f6, 25 * REGBYTES(sp) + 3000370: 06612227 fsw ft6,100(sp) + FSREG f7, 26 * REGBYTES(sp) + 3000374: 06712427 fsw ft7,104(sp) + FSREG f10, 27 * REGBYTES(sp) + 3000378: 06a12627 fsw fa0,108(sp) + FSREG f11, 28 * REGBYTES(sp) + 300037c: 06b12827 fsw fa1,112(sp) + FSREG f12, 29 * REGBYTES(sp) + 3000380: 06c12a27 fsw fa2,116(sp) + FSREG f13, 30 * REGBYTES(sp) + 3000384: 06d12c27 fsw fa3,120(sp) + FSREG f14, 31 * REGBYTES(sp) + 3000388: 06e12e27 fsw fa4,124(sp) + FSREG f15, 32 * REGBYTES(sp) + 300038c: 08f12027 fsw fa5,128(sp) + FSREG f16, 33 * REGBYTES(sp) + 3000390: 09012227 fsw fa6,132(sp) + FSREG f17, 34 * REGBYTES(sp) + 3000394: 09112427 fsw fa7,136(sp) + FSREG f28, 35 * REGBYTES(sp) + 3000398: 09c12627 fsw ft8,140(sp) + FSREG f29, 36 * REGBYTES(sp) + 300039c: 09d12827 fsw ft9,144(sp) + FSREG f30, 37 * REGBYTES(sp) + 30003a0: 09e12a27 fsw ft10,148(sp) + FSREG f31, 38 * REGBYTES(sp) + 30003a4: 09f12c27 fsw ft11,152(sp) +#endif + + andi a0, a0, MCAUSE_MASK_INT_NUM + 30003a8: 0ff57513 andi a0,a0,255 + call InterruptEntry + 30003ac: 7a3010ef jal ra,300234e + + LREG t1, 1 * REGBYTES(sp) + 30003b0: 00412303 lw t1,4(sp) + LREG t2, 2 * REGBYTES(sp) + 30003b4: 00812383 lw t2,8(sp) + LREG a2, 5 * REGBYTES(sp) + 30003b8: 01412603 lw a2,20(sp) + LREG ra, 9 * REGBYTES(sp) + 30003bc: 02412083 lw ra,36(sp) + LREG a3, 10 * REGBYTES(sp) + 30003c0: 02812683 lw a3,40(sp) + LREG a4, 11 * REGBYTES(sp) + 30003c4: 02c12703 lw a4,44(sp) + LREG a5, 12 * REGBYTES(sp) + 30003c8: 03012783 lw a5,48(sp) + LREG a6, 13 * REGBYTES(sp) + 30003cc: 03412803 lw a6,52(sp) + LREG a7, 14 * REGBYTES(sp) + 30003d0: 03812883 lw a7,56(sp) + LREG t3, 15 * REGBYTES(sp) + 30003d4: 03c12e03 lw t3,60(sp) + LREG t4, 16 * REGBYTES(sp) + 30003d8: 04012e83 lw t4,64(sp) + LREG t5, 17 * REGBYTES(sp) + 30003dc: 04412f03 lw t5,68(sp) + LREG t6, 18 * REGBYTES(sp) + 30003e0: 04812f83 lw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FLREG f0, 19 * REGBYTES(sp) + 30003e4: 04c12007 flw ft0,76(sp) + FLREG f1, 20 * REGBYTES(sp) + 30003e8: 05012087 flw ft1,80(sp) + FLREG f2, 21 * REGBYTES(sp) + 30003ec: 05412107 flw ft2,84(sp) + FLREG f3, 22 * REGBYTES(sp) + 30003f0: 05812187 flw ft3,88(sp) + FLREG f4, 23 * REGBYTES(sp) + 30003f4: 05c12207 flw ft4,92(sp) + FLREG f5, 24 * REGBYTES(sp) + 30003f8: 06012287 flw ft5,96(sp) + FLREG f6, 25 * REGBYTES(sp) + 30003fc: 06412307 flw ft6,100(sp) + FLREG f7, 26 * REGBYTES(sp) + 3000400: 06812387 flw ft7,104(sp) + FLREG f10, 27 * REGBYTES(sp) + 3000404: 06c12507 flw fa0,108(sp) + FLREG f11, 28 * REGBYTES(sp) + 3000408: 07012587 flw fa1,112(sp) + FLREG f12, 29 * REGBYTES(sp) + 300040c: 07412607 flw fa2,116(sp) + FLREG f13, 30 * REGBYTES(sp) + 3000410: 07812687 flw fa3,120(sp) + FLREG f14, 31 * REGBYTES(sp) + 3000414: 07c12707 flw fa4,124(sp) + FLREG f15, 32 * REGBYTES(sp) + 3000418: 08012787 flw fa5,128(sp) + FLREG f16, 33 * REGBYTES(sp) + 300041c: 08412807 flw fa6,132(sp) + FLREG f17, 34 * REGBYTES(sp) + 3000420: 08812887 flw fa7,136(sp) + FLREG f28, 35 * REGBYTES(sp) + 3000424: 08c12e07 flw ft8,140(sp) + FLREG f29, 36 * REGBYTES(sp) + 3000428: 09012e87 flw ft9,144(sp) + FLREG f30, 37 * REGBYTES(sp) + 300042c: 09412f07 flw ft10,148(sp) + FLREG f31, 38 * REGBYTES(sp) + 3000430: 09812f87 flw ft11,152(sp) + +03000434 : + */ + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + LREG t0, 0 * REGBYTES(sp) +#else + LREG a0, 7 * REGBYTES(sp) /* load mstatus */ + 3000434: 01c12503 lw a0,28(sp) + csrr t0, mstatus + 3000438: 300022f3 csrr t0,mstatus + LREG a1, 8 * REGBYTES(sp) /* load mepc */ + 300043c: 02012583 lw a1,32(sp) + andi t0, t0, MSTATUS_MIE + 3000440: 0082f293 andi t0,t0,8 + bnei t0, 0, restore_mstatus + 3000444: 0002923b bnei t0,0,300044c + andi a0, a0, ~(MSTATUS_MIE | MSTATUS_MPIE) + 3000448: f7757513 andi a0,a0,-137 + +0300044c : +restore_mstatus: + csrw mstatus, a0 + 300044c: 30051073 csrw mstatus,a0 + + LREG t0, 0 * REGBYTES(sp) + 3000450: 00012283 lw t0,0(sp) + csrw mepc, a1 + 3000454: 34159073 csrw mepc,a1 + LREG a0, 6 * REGBYTES(sp) /* load prithd */ + 3000458: 01812503 lw a0,24(sp) + csrw prithd, a0 + 300045c: bfe51073 csrw 0xbfe,a0 + lw a1, (a0) + addi a1, a1, -1 + sw a1, (a0) +#endif + + LREG a1, 4 * REGBYTES(sp) /* 2 consecutive csrw instructions will have a bubble */ + 3000460: 01012583 lw a1,16(sp) + + LREG a0, 3 * REGBYTES(sp) + 3000464: 00c12503 lw a0,12(sp) + + addi sp, sp, TOTAL_INT_SIZE_ON_STACK + 3000468: 0a010113 addi sp,sp,160 + + mret + 300046c: 30200073 mret + +03000470 : + +.align 2 +TrapVector: + push_reg + 3000470: f6010113 addi sp,sp,-160 + 3000474: fff11f8b stmia {ra,t0-t6,a0-a7},(sp) + 3000478: f6010113 addi sp,sp,-160 + csrr a0, mcause + 300047c: 34202573 csrr a0,mcause + li t1, MCAUSE_ECALL_FROM_MMODE + 3000480: 00b00313 li t1,11 +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + beq a0, t1, switch_to_umode +#else + beq a0, t1, switch_to_mmode + 3000484: 02650c63 beq a0,t1,30004bc +#endif + li t1, MCAUSE_ECALL_FROM_UMODE + 3000488: 00800313 li t1,8 + beq a0, t1, switch_to_mmode + 300048c: 02650863 beq a0,t1,30004bc + + li a1, MCAUSE_MASK_INT_BIT + 3000490: 800005b7 lui a1,0x80000 + li a2, MCAUSE_MASK_INT_NUM + 3000494: 0ff00613 li a2,255 + and a1, a0, a1 + 3000498: 00b575b3 and a1,a0,a1 + and a0, a0, a2 + 300049c: 00c57533 and a0,a0,a2 + + li a2, 0xc + 30004a0: 00c00613 li a2,12 + beq a0, a2, NmiEntry + 30004a4: d4c506e3 beq a0,a2,30001f0 + beqz a1, TrapEntry + 30004a8: da058de3 beqz a1,3000262 + pop_reg + 30004ac: 0a010113 addi sp,sp,160 + 30004b0: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004b4: 0a010113 addi sp,sp,160 + mret + 30004b8: 30200073 mret + +030004bc : + mret +#endif + +.align 2 +switch_to_mmode: + li t2, MSTATUS_MPP_MACHINE + 30004bc: 000023b7 lui t2,0x2 + 30004c0: 80038393 addi t2,t2,-2048 # 1800 + csrs mstatus, t2 + 30004c4: 3003a073 csrs mstatus,t2 + csrr t0, mepc + 30004c8: 341022f3 csrr t0,mepc + addi t0, t0, 4 + 30004cc: 00428293 addi t0,t0,4 + csrw mepc, t0 + 30004d0: 34129073 csrw mepc,t0 + pop_reg + 30004d4: 0a010113 addi sp,sp,160 + 30004d8: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004dc: 0a010113 addi sp,sp,160 + mret + 30004e0: 30200073 mret + +030004e4 : + +.align 2 +mem_cpy: + bge t0, t2, cpy_done + 30004e4: 0072dc63 bge t0,t2,30004fc + lw t3, (t1) + 30004e8: 00032e03 lw t3,0(t1) + sw t3, (t0) + 30004ec: 01c2a023 sw t3,0(t0) + addi t0, t0, 4 + 30004f0: 00428293 addi t0,t0,4 + addi t1, t1, 4 + 30004f4: 00430313 addi t1,t1,4 + j mem_cpy + 30004f8: fedff06f j 30004e4 + +030004fc : +cpy_done: + ret + 30004fc: 00008067 ret + +03000500 : + +.align 2 +handle_reset: + csrwi mstatus, 0 + 3000500: 30005073 csrwi mstatus,0 + csrwi mie, 0 + 3000504: 30405073 csrwi mie,0 + csrci mstatus, 0x08 + 3000508: 30047073 csrci mstatus,8 + la t0, TrapHandler + 300050c: 00000297 auipc t0,0x0 + 3000510: afc28293 addi t0,t0,-1284 # 3000008 + addi t0, t0, 1 + 3000514: 00128293 addi t0,t0,1 + csrw mtvec, t0 + 3000518: 30529073 csrw mtvec,t0 + csrwi 0x7EF, 0x1 /* lock mtvec */ + 300051c: 7ef0d073 csrwi 0x7ef,1 + +03000520 : + csrwi 0x7C8, 0x1 /* enable hardware nest interrupt support */ +#endif + +flash_init: +/* eflash prefetch enable */ + li t0, EFC_BASE_ADDR + 3000520: 147102b7 lui t0,0x14710 + lw t1, 0x120(t0) + 3000524: 1202a303 lw t1,288(t0) # 14710120 + ori t1, t1, 1 + 3000528: 00136313 ori t1,t1,1 + sw t1, 0x120(t0) + 300052c: 1262a023 sw t1,288(t0) + +/* eflash cache enable */ + lw t1, 0x124(t0) + 3000530: 1242a303 lw t1,292(t0) + ori t1, t1, 1 + 3000534: 00136313 ori t1,t1,1 + sw t1, 0x124(t0) + 3000538: 1262a223 sw t1,292(t0) + +/* enable flash cmd */ + li t0, EFC_MAGIC_NUMBER + 300053c: fedcc2b7 lui t0,0xfedcc + 3000540: a9828293 addi t0,t0,-1384 # fedcba98 + li t1, EFC_MAGIC_LOCK_RW + 3000544: 14710337 lui t1,0x14710 + 3000548: 20030313 addi t1,t1,512 # 14710200 + sw t0, (t1) + 300054c: 00532023 sw t0,0(t1) + +/* initialize global pointer */ + .option push + .option norelax + la gp, __global_pointer$ + 3000550: 01001197 auipc gp,0x1001 + 3000554: bc418193 addi gp,gp,-1084 # 4001114 <__global_pointer$> + .option pop + +/* initialize stack pointer */ + la sp, __stack_top + 3000558: 01007117 auipc sp,0x1007 + 300055c: 6a810113 addi sp,sp,1704 # 4007c00 <__INTERRUPT_STACK_BEGIN__> + +/* timer0 interrupt enable */ + li t0, TIMER0_CONTROL + 3000560: 143002b7 lui t0,0x14300 + 3000564: 00828293 addi t0,t0,8 # 14300008 + lw t1, (t0) + 3000568: 0002a303 lw t1,0(t0) + andi t1, t1, TIMER0_INTENABLE + 300056c: 02037313 andi t1,t1,32 + sw t1, (t0) + 3000570: 0062a023 sw t1,0(t0) + +/* uart0 deinit */ + li t0, 0x14000000 + 3000574: 140002b7 lui t0,0x14000 + li t1, 0 + 3000578: 00000313 li t1,0 + sw t1, IBRD_OFFSET(t0) + 300057c: 0262a223 sw t1,36(t0) # 14000024 + sw t1, FBRD_OFFSET(t0) + 3000580: 0262a423 sw t1,40(t0) + sw t1, LCR_H_OFFSET(t0) + 3000584: 0262a623 sw t1,44(t0) + sw t1, CR_OFFSET(t0) + 3000588: 0262a823 sw t1,48(t0) + sw t1, DMACR_OFFSET(t0) + 300058c: 0462a423 sw t1,72(t0) + +03000590 : + +/* perform the rest of initialization in C */ +clear_sram: + /* clear sysram parity error */ + li t0, SYSRAM_ERROR + 3000590: 101082b7 lui t0,0x10108 + 3000594: 30028293 addi t0,t0,768 # 10108300 + lw t1, (t0) + 3000598: 0002a303 lw t1,0(t0) + ori t1, t1, 1 + 300059c: 00136313 ori t1,t1,1 + sw t1, (t0) + 30005a0: 0062a023 sw t1,0(t0) + + la t0, SRAM_START + 30005a4: 01000297 auipc t0,0x1000 + 30005a8: a5c28293 addi t0,t0,-1444 # 4000000 + la t1, SRAM_END + 30005ac: 01008317 auipc t1,0x1008 + 30005b0: a5430313 addi t1,t1,-1452 # 4008000 + li t2, 0 + 30005b4: 00000393 li t2,0 + +030005b8 : + +clear_sram_loop: + sw t2, (t0) /* clear all sram */ + 30005b8: 0072a023 sw t2,0(t0) + addi t0, t0, 4 /* increment clear index pointer */ + 30005bc: 00428293 addi t0,t0,4 + blt t0, t1, clear_sram_loop /* are we at the end yet, if not , contiue till the end */ + 30005c0: fe62cce3 blt t0,t1,30005b8 + +030005c4 : + +start_coderom_code_copy: + la t0, __sram_code_start_addr /* SRAM addr */ + 30005c4: ff000297 auipc t0,0xff000 + 30005c8: a3c28293 addi t0,t0,-1476 # 2000000 + la t1, __sram_code_load_addr /* ROM addr */ + 30005cc: 00000317 auipc t1,0x0 + 30005d0: 13830313 addi t1,t1,312 # 3000704 + la t2, __sram_code_end_addr + 30005d4: ff000397 auipc t2,0xff000 + 30005d8: a2c38393 addi t2,t2,-1492 # 2000000 + jal mem_cpy + 30005dc: f09ff0ef jal ra,30004e4 + +030005e0 : + +start_reserved_data_copy: + la t0, __reserved_code_start_addr /* SRAM addr */ + 30005e0: 01000297 auipc t0,0x1000 + 30005e4: a2028293 addi t0,t0,-1504 # 4000000 + la t1, __reserved_code_load_addr /* ROM addr */ + 30005e8: 00000317 auipc t1,0x0 + 30005ec: 11c30313 addi t1,t1,284 # 3000704 + la t2, __reserved_code_end_addr + 30005f0: 01000397 auipc t2,0x1000 + 30005f4: a1038393 addi t2,t2,-1520 # 4000000 + jal mem_cpy + 30005f8: eedff0ef jal ra,30004e4 + +030005fc : + +start_coderom_data_copy: + la t0, __data_start /* SRAM addr */ + 30005fc: 01000297 auipc t0,0x1000 + 3000600: a2428293 addi t0,t0,-1500 # 4000020 + la t1, __data_load /* ROM addr */ + 3000604: 00006317 auipc t1,0x6 + 3000608: 54c30313 addi t1,t1,1356 # 3006b50 <__data_load> + la t2, __data_end + 300060c: 01000397 auipc t2,0x1000 + 3000610: af038393 addi t2,t2,-1296 # 40000fc + jal mem_cpy + 3000614: ed1ff0ef jal ra,30004e4 + +03000618 : + +pmp_init: + li t0, 0xB00 + 3000618: 000012b7 lui t0,0x1 + 300061c: b0028293 addi t0,t0,-1280 # b00 + csrw pmpaddr0, t0 + 3000620: 3b029073 csrw pmpaddr0,t0 + li t0, 0x400400 /* 0x2C00~0x1000FFF, BOOTROM, enable R+X */ + 3000624: 004002b7 lui t0,0x400 + 3000628: 40028293 addi t0,t0,1024 # 400400 + csrw pmpaddr1, t0 + 300062c: 3b129073 csrw pmpaddr1,t0 + li t0, 0x800000 /* 0x1001000~0x1FFFFFF, Reserved: diable R+X+W */ + 3000630: 008002b7 lui t0,0x800 + csrw pmpaddr2, t0 + 3000634: 3b229073 csrw pmpaddr2,t0 + li t0, 0x802000 /* 0x2000000~0x2007FFF, SYSRAM_ITCM */ + 3000638: 008022b7 lui t0,0x802 + csrw pmpaddr3, t0 + 300063c: 3b329073 csrw pmpaddr3,t0 + li t0, 0xC00000 /* 0x2008000 ~ 0x2FFFFFF, Reserved: disable R+X+W */ + 3000640: 00c002b7 lui t0,0xc00 + csrw pmpaddr4, t0 + 3000644: 3b429073 csrw pmpaddr4,t0 + li t0, 0x1000000 /* 0x3000000 ~ 0x03FFFFFF: EFLASH: enable R+X */ + 3000648: 010002b7 lui t0,0x1000 + csrw pmpaddr5, t0 + 300064c: 3b529073 csrw pmpaddr5,t0 + li t0, 0x1002000 /* 0x4000000 ~ 0x04007FFF: SYSTEM_DTCM enable R+W */ + 3000650: 010022b7 lui t0,0x1002 + csrw pmpaddr6, t0 + 3000654: 3b629073 csrw pmpaddr6,t0 + li t0,0x7000400 /* 0x4008000 ~ 0x01C000FFF: REGISTER R+W */ + 3000658: 070002b7 lui t0,0x7000 + 300065c: 40028293 addi t0,t0,1024 # 7000400 + csrw pmpaddr7, t0 + 3000660: 3b729073 csrw pmpaddr7,t0 + + li t0,0xf3333333 /* register TOR-R-W */ + 3000664: f33332b7 lui t0,0xf3333 + 3000668: 33328293 addi t0,t0,819 # f3333333 + csrw 0x7d8,t0 + 300066c: 7d829073 csrw 0x7d8,t0 + li t0,0x0d080d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + csrw pmpcfg0,t0 + li t0,0x0b0b0d08 + csrw pmpcfg1,t0 +#else + li t0,0x8d888d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + 3000670: 8d8892b7 lui t0,0x8d889 + 3000674: d8b28293 addi t0,t0,-629 # 8d888d8b + csrw pmpcfg0,t0 + 3000678: 3a029073 csrw pmpcfg0,t0 + li t0,0x8b8b8d88 + 300067c: 8b8b92b7 lui t0,0x8b8b9 + 3000680: d8828293 addi t0,t0,-632 # 8b8b8d88 + csrw pmpcfg1,t0 + 3000684: 3a129073 csrw pmpcfg1,t0 +#endif + +/* disable Icache */ + csrwi 0x7C0, 0x0 /* disable ICACHE */ + 3000688: 7c005073 csrwi 0x7c0,0 + fence + 300068c: 0ff0000f fence + +/* disable Dcache */ + csrwi 0x7C1, 0x0 /* disable DCACHE */ + 3000690: 7c105073 csrwi 0x7c1,0 + fence + 3000694: 0ff0000f fence + +/* support float and mie */ + li t0,0x2008 + 3000698: 000022b7 lui t0,0x2 + 300069c: 00828293 addi t0,t0,8 # 2008 + csrs mstatus,t0 + 30006a0: 3002a073 csrs mstatus,t0 + li t0,0x20 + 30006a4: 02000293 li t0,32 + csrs misa,t0 + 30006a8: 3012a073 csrs misa,t0 + +/* Interrupt set default priority = 1*/ + li t0, 0x11111111 + 30006ac: 111112b7 lui t0,0x11111 + 30006b0: 11128293 addi t0,t0,273 # 11111111 + csrw locipri0, t0 + 30006b4: bc029073 csrw 0xbc0,t0 + csrw locipri1, t0 + 30006b8: bc129073 csrw 0xbc1,t0 + csrw locipri2, t0 + 30006bc: bc229073 csrw 0xbc2,t0 + csrw locipri3, t0 + 30006c0: bc329073 csrw 0xbc3,t0 + csrw locipri4, t0 + 30006c4: bc429073 csrw 0xbc4,t0 + csrw locipri5, t0 + 30006c8: bc529073 csrw 0xbc5,t0 + csrw locipri6, t0 + 30006cc: bc629073 csrw 0xbc6,t0 + csrw locipri7, t0 + 30006d0: bc729073 csrw 0xbc7,t0 + csrw locipri8, t0 + 30006d4: bc829073 csrw 0xbc8,t0 + csrw locipri9, t0 + 30006d8: bc929073 csrw 0xbc9,t0 + csrw locipri10, t0 + 30006dc: bca29073 csrw 0xbca,t0 + csrw locipri11, t0 + 30006e0: bcb29073 csrw 0xbcb,t0 + csrw locipri12, t0 + 30006e4: bcc29073 csrw 0xbcc,t0 + csrw locipri13, t0 + 30006e8: bcd29073 csrw 0xbcd,t0 + csrw locipri14, t0 + 30006ec: bce29073 csrw 0xbce,t0 + csrw locipri15, t0 + 30006f0: bcf29073 csrw 0xbcf,t0 + + ecall + 30006f4: 00000073 ecall + jal Chip_Init + 30006f8: 014000ef jal ra,300070c + +/* jump to C func. */ + jal main + 30006fc: 626050ef jal ra,3005d22
+ +03000700 : + +dead_loop: + j dead_loop + 3000700: 0000006f j 3000700 + +Disassembly of section .text: + +03000704 : + * @brief Chip Init Fail Process, deadloop if Chip Init fail + * @param None + * @retval None + */ +static inline void Chip_InitFail(void) +{ + 3000704: 1141 addi sp,sp,-16 + 3000706: c622 sw s0,12(sp) + 3000708: 0800 addi s0,sp,16 + while (1) { + 300070a: a001 j 300070a + +0300070c : + * @brief Chip Init + * @param None + * @retval None + */ +void Chip_Init(void) +{ + 300070c: 1101 addi sp,sp,-32 + 300070e: ce06 sw ra,28(sp) + 3000710: cc22 sw s0,24(sp) + 3000712: 1000 addi s0,sp,32 + CRG_CoreClkSelect coreClkSelect; + /* Config CRG */ + if (CRG_Config(&coreClkSelect) != BASE_STATUS_OK) { + 3000714: fec40793 addi a5,s0,-20 + 3000718: 853e mv a0,a5 + 300071a: 614050ef jal ra,3005d2e + 300071e: 87aa mv a5,a0 + 3000720: c391 beqz a5,3000724 + Chip_InitFail(); + 3000722: 37cd jal ra,3000704 + } + + /* Config FLASH Clock */ + FLASH_ClockConfig(coreClkSelect); + 3000724: fec42783 lw a5,-20(s0) + 3000728: 853e mv a0,a5 + 300072a: 796000ef jal ra,3000ec0 + SYSTICK_Init(); + 300072e: 057000ef jal ra,3000f84 + /* Set CoreClock Select after FLASH Config Done */ + CRG_SetCoreClockSelect(coreClkSelect); + 3000732: fec42783 lw a5,-20(s0) + 3000736: 853e mv a0,a5 + 3000738: 25b1 jal ra,3000d84 + + IRQ_Init(); + 300073a: 459010ef jal ra,3002392 + ANAVREF_Init(); + 300073e: 23e5 jal ra,3000d26 + ANATRIM_Entry(); + 3000740: 2b51 jal ra,3000cd4 + /* User Add Code Here */ + 3000742: 0001 nop + 3000744: 40f2 lw ra,28(sp) + 3000746: 4462 lw s0,24(sp) + 3000748: 6105 addi sp,sp,32 + 300074a: 8082 ret + +0300074c : + * @brief Calculate the conversion gain of the tsensor. + * @param data, original data. + * @retval None + */ +static void CalculateGain(unsigned int data) +{ + 300074c: 1101 addi sp,sp,-32 + 300074e: ce22 sw s0,28(sp) + 3000750: 1000 addi s0,sp,32 + 3000752: fea42623 sw a0,-20(s0) + g_tsensorGain = ((float)(data) / 10000000.0f); + 3000756: fec42783 lw a5,-20(s0) + 300075a: d017f753 fcvt.s.wu fa4,a5 + 300075e: 030067b7 lui a5,0x3006 + 3000762: 5887a787 flw fa5,1416(a5) # 3006588 <__rodata_start> + 3000766: 18f777d3 fdiv.s fa5,fa4,fa5 + 300076a: 040007b7 lui a5,0x4000 + 300076e: 02f7a027 fsw fa5,32(a5) # 4000020 +} + 3000772: 0001 nop + 3000774: 4472 lw s0,28(sp) + 3000776: 6105 addi sp,sp,32 + 3000778: 8082 ret + +0300077a : + * @brief Obtains the chip ID. + * @param None + * @retval None + */ +static bool CHIP_GetInfo(void) +{ + 300077a: 7179 addi sp,sp,-48 + 300077c: d606 sw ra,44(sp) + 300077e: d422 sw s0,40(sp) + 3000780: 1800 addi s0,sp,48 + FOTP_INFO_RGN0_NUMBER_4 emptyData; + FOTP_INFO_RGN0_NUMBER_2 idData; + FOTP_InfoGet(FOTP_INFO_RNG0, 4U, (void *)&emptyData.comData); /* 4 is the number of fotp_empty_flag in otp */ + 3000782: fe040793 addi a5,s0,-32 + 3000786: 863e mv a2,a5 + 3000788: 4591 li a1,4 + 300078a: 4501 li a0,0 + 300078c: 2391 jal ra,3000cd0 + FOTP_InfoGet(FOTP_INFO_RNG0, 2U, (void *)&idData.comData); /* 2 is the number of idData in otp */ + 300078e: fd040793 addi a5,s0,-48 + 3000792: 863e mv a2,a5 + 3000794: 4589 li a1,2 + 3000796: 4501 li a0,0 + 3000798: 2b25 jal ra,3000cd0 + if (emptyData.REG.fotp_empty_flag != 0x5AA59669 || idData.REG.chip_id == 0xFFFFFFFF) { + 300079a: fe042703 lw a4,-32(s0) + 300079e: 5aa597b7 lui a5,0x5aa59 + 30007a2: 66978793 addi a5,a5,1641 # 5aa59669 + 30007a6: 00f71763 bne a4,a5,30007b4 + 30007aa: fd042703 lw a4,-48(s0) + 30007ae: 57fd li a5,-1 + 30007b0: 00f71463 bne a4,a5,30007b8 + return false; + 30007b4: 4781 li a5,0 + 30007b6: a011 j 30007ba + } + return true; + 30007b8: 4785 li a5,1 +} + 30007ba: 853e mv a0,a5 + 30007bc: 50b2 lw ra,44(sp) + 30007be: 5422 lw s0,40(sp) + 30007c0: 6145 addi sp,sp,48 + 30007c2: 8082 ret + +030007c4 : + * @brief Analog module trim. + * @param None + * @retval None + */ +static void CHIP_AnalogTrim(void) +{ + 30007c4: 711d addi sp,sp,-96 + 30007c6: ce86 sw ra,92(sp) + 30007c8: cca2 sw s0,88(sp) + 30007ca: 1080 addi s0,sp,96 + FOTP_INFO_RGN0_NUMBER_20 trimData20; + FOTP_InfoGet(FOTP_INFO_RNG0, 20U, (void *)&trimData20.comData); /* 20 is the number of trim data in otp */ + 30007cc: fdc40793 addi a5,s0,-36 + 30007d0: 863e mv a2,a5 + 30007d2: 45d1 li a1,20 + 30007d4: 4501 li a0,0 + 30007d6: 29ed jal ra,3000cd0 + /* VREF */ + VREF->VREF_TRIM0.BIT.da_iref_trim = trimData20.REG.data0.da_iref_trim; + 30007d8: 18100737 lui a4,0x18100 + 30007dc: fdc42783 lw a5,-36(s0) + 30007e0: 83c1 srli a5,a5,0x10 + 30007e2: 9bfd andi a5,a5,-1 + 30007e4: 0ff7f693 andi a3,a5,255 + 30007e8: 433c lw a5,64(a4) + 30007ea: 0ff6f693 andi a3,a3,255 + 30007ee: f007f793 andi a5,a5,-256 + 30007f2: 8fd5 or a5,a5,a3 + 30007f4: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vref_trim = trimData20.REG.data0.da_ref_vref_trim; + 30007f6: 18100737 lui a4,0x18100 + 30007fa: fdc42783 lw a5,-36(s0) + 30007fe: 83a1 srli a5,a5,0x8 + 3000800: 9bfd andi a5,a5,-1 + 3000802: 0ff7f693 andi a3,a5,255 + 3000806: 433c lw a5,64(a4) + 3000808: 0ff6f693 andi a3,a3,255 + 300080c: 06a2 slli a3,a3,0x8 + 300080e: 7641 lui a2,0xffff0 + 3000810: 0ff60613 addi a2,a2,255 # ffff00ff + 3000814: 8ff1 and a5,a5,a2 + 3000816: 8fd5 or a5,a5,a3 + 3000818: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vbg_trim = trimData20.REG.data0.da_ref_vbg_trim; + 300081a: 18100737 lui a4,0x18100 + 300081e: fdc42783 lw a5,-36(s0) + 3000822: 0ff7f693 andi a3,a5,255 + 3000826: 433c lw a5,64(a4) + 3000828: 0ff6f693 andi a3,a3,255 + 300082c: 06c2 slli a3,a3,0x10 + 300082e: ff010637 lui a2,0xff010 + 3000832: 167d addi a2,a2,-1 # ff00ffff + 3000834: 8ff1 and a5,a5,a2 + 3000836: 8fd5 or a5,a5,a3 + 3000838: c33c sw a5,64(a4) + unsigned int value = trimData20.REG.data1.da_ref_temp_trim3; + 300083a: fe042783 lw a5,-32(s0) + 300083e: 83c1 srli a5,a5,0x10 + 3000840: 9bfd andi a5,a5,-1 + 3000842: 9f81 uxtb a5 + 3000844: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim2 << 8U); /* Shift left by 8 bits */ + 3000848: fe042783 lw a5,-32(s0) + 300084c: 83a1 srli a5,a5,0x8 + 300084e: 9bfd andi a5,a5,-1 + 3000850: 9f81 uxtb a5 + 3000852: 07a2 slli a5,a5,0x8 + 3000854: 873e mv a4,a5 + 3000856: fec42783 lw a5,-20(s0) + 300085a: 8fd9 or a5,a5,a4 + 300085c: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim1 << 16U); /* Shift left by 16 bits */ + 3000860: fe042783 lw a5,-32(s0) + 3000864: 9f81 uxtb a5 + 3000866: 07c2 slli a5,a5,0x10 + 3000868: 873e mv a4,a5 + 300086a: fec42783 lw a5,-20(s0) + 300086e: 8fd9 or a5,a5,a4 + 3000870: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data0.da_ref_temp_trim0 << 24U); /* Shift left by 24 bits */ + 3000874: fdc42783 lw a5,-36(s0) + 3000878: 83e1 srli a5,a5,0x18 + 300087a: 9f81 uxtb a5 + 300087c: 07e2 slli a5,a5,0x18 + 300087e: 873e mv a4,a5 + 3000880: fec42783 lw a5,-20(s0) + 3000884: 8fd9 or a5,a5,a4 + 3000886: fef42623 sw a5,-20(s0) + VREF->VREF_TRIM1.reg = value; + 300088a: 181007b7 lui a5,0x18100 + 300088e: fec42703 lw a4,-20(s0) + 3000892: c3f8 sw a4,68(a5) + + FOTP_INFO_RGN0_NUMBER_21 trimData21; + FOTP_InfoGet(FOTP_INFO_RNG0, 21U, (void *)&trimData21.comData); /* 21 is the number of trim data in otp */ + 3000894: fcc40793 addi a5,s0,-52 + 3000898: 863e mv a2,a5 + 300089a: 45d5 li a1,21 + 300089c: 4501 li a0,0 + 300089e: 290d jal ra,3000cd0 + /* ADC */ + ADC0->ADC_OEGE_TRIM.BIT.cfg_gain_cali_trim = trimData21.REG.data1.saradc_gain; + 30008a0: 18000737 lui a4,0x18000 + 30008a4: fd042783 lw a5,-48(s0) + 30008a8: 86be mv a3,a5 + 30008aa: 6789 lui a5,0x2 + 30008ac: 17fd addi a5,a5,-1 # 1fff + 30008ae: 8ff5 and a5,a5,a3 + 30008b0: 01079613 slli a2,a5,0x10 + 30008b4: 8241 srli a2,a2,0x10 + 30008b6: 6785 lui a5,0x1 + 30008b8: 973e add a4,a4,a5 + 30008ba: 80872783 lw a5,-2040(a4) # 17fff808 + 30008be: 6689 lui a3,0x2 + 30008c0: 16fd addi a3,a3,-1 # 1fff + 30008c2: 8ef1 and a3,a3,a2 + 30008c4: 06c2 slli a3,a3,0x10 + 30008c6: e0010637 lui a2,0xe0010 + 30008ca: 167d addi a2,a2,-1 # e000ffff + 30008cc: 8ff1 and a5,a5,a2 + 30008ce: 8fd5 or a5,a5,a3 + 30008d0: 80f72423 sw a5,-2040(a4) + ADC0->ADC_OEGE_TRIM.BIT.cfg_ofst_cali_trim = trimData21.REG.data1.saradc_offset; + 30008d4: 18000737 lui a4,0x18000 + 30008d8: fd042783 lw a5,-48(s0) + 30008dc: 83c1 srli a5,a5,0x10 + 30008de: 86be mv a3,a5 + 30008e0: 6785 lui a5,0x1 + 30008e2: 17fd addi a5,a5,-1 # fff + 30008e4: 8ff5 and a5,a5,a3 + 30008e6: 01079613 slli a2,a5,0x10 + 30008ea: 8241 srli a2,a2,0x10 + 30008ec: 6785 lui a5,0x1 + 30008ee: 973e add a4,a4,a5 + 30008f0: 80872783 lw a5,-2040(a4) # 17fff808 + 30008f4: 6685 lui a3,0x1 + 30008f6: 16fd addi a3,a3,-1 # fff + 30008f8: 8ef1 and a3,a3,a2 + 30008fa: 767d lui a2,0xfffff + 30008fc: 8ff1 and a5,a5,a2 + 30008fe: 8fd5 or a5,a5,a3 + 3000900: 80f72423 sw a5,-2040(a4) + + /* TSENSOR */ + TSENSOR->TSENSOR_TRIM.reg = trimData20.REG.data1.da_ref_vptat_trim; + 3000904: fe042783 lw a5,-32(s0) + 3000908: 83e1 srli a5,a5,0x18 + 300090a: 0ff7f713 andi a4,a5,255 + 300090e: 185007b7 lui a5,0x18500 + 3000912: cb98 sw a4,16(a5) + ADC0->ADC_TSENSOR_TRIM.BIT.cfg_tsensor_ofst_trim = trimData21.REG.data2.ts_offset; + 3000914: 18000737 lui a4,0x18000 + 3000918: fd442783 lw a5,-44(s0) + 300091c: 86be mv a3,a5 + 300091e: 6785 lui a5,0x1 + 3000920: 17fd addi a5,a5,-1 # fff + 3000922: 8ff5 and a5,a5,a3 + 3000924: 01079613 slli a2,a5,0x10 + 3000928: 8241 srli a2,a2,0x10 + 300092a: 6785 lui a5,0x1 + 300092c: 973e add a4,a4,a5 + 300092e: 80472783 lw a5,-2044(a4) # 17fff804 + 3000932: 6685 lui a3,0x1 + 3000934: 16fd addi a3,a3,-1 # fff + 3000936: 8ef1 and a3,a3,a2 + 3000938: 767d lui a2,0xfffff + 300093a: 8ff1 and a5,a5,a2 + 300093c: 8fd5 or a5,a5,a3 + 300093e: 80f72223 sw a5,-2044(a4) + CalculateGain(trimData21.REG.data3.ts_gain); + 3000942: fd842783 lw a5,-40(s0) + 3000946: 83a5 srli a5,a5,0x9 + 3000948: 853e mv a0,a5 + 300094a: 3509 jal ra,300074c + + /* PGA */ + PGA0->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga0_vos_trim; + 300094c: 18200737 lui a4,0x18200 + 3000950: fcc42783 lw a5,-52(s0) + 3000954: 1ff7f793 andi a5,a5,511 + 3000958: 01079693 slli a3,a5,0x10 + 300095c: 82c1 srli a3,a3,0x10 + 300095e: 531c lw a5,32(a4) + 3000960: 1ff6f693 andi a3,a3,511 + 3000964: e007f793 andi a5,a5,-512 + 3000968: 8fd5 or a5,a5,a3 + 300096a: d31c sw a5,32(a4) + PGA1->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga1_vos_trim; + 300096c: 18201737 lui a4,0x18201 + 3000970: fcc42783 lw a5,-52(s0) + 3000974: 83c1 srli a5,a5,0x10 + 3000976: 1ff7f793 andi a5,a5,511 + 300097a: 01079693 slli a3,a5,0x10 + 300097e: 82c1 srli a3,a3,0x10 + 3000980: 531c lw a5,32(a4) + 3000982: 1ff6f693 andi a3,a3,511 + 3000986: e007f793 andi a5,a5,-512 + 300098a: 8fd5 or a5,a5,a3 + 300098c: d31c sw a5,32(a4) + + FOTP_INFO_RGN0_NUMBER_22 trimData22; + FOTP_InfoGet(FOTP_INFO_RNG0, 22U, (void *)&trimData22.comData); /* 22 is the number of trim data in otp */ + 300098e: fbc40793 addi a5,s0,-68 + 3000992: 863e mv a2,a5 + 3000994: 45d9 li a1,22 + 3000996: 4501 li a0,0 + 3000998: 257d jal ra,3001046 + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_gain_trim2 = trimData22.REG.data0.pga0_gain2; + 300099a: 18000737 lui a4,0x18000 + 300099e: fbc42783 lw a5,-68(s0) + 30009a2: 86be mv a3,a5 + 30009a4: 6789 lui a5,0x2 + 30009a6: 17fd addi a5,a5,-1 # 1fff + 30009a8: 8ff5 and a5,a5,a3 + 30009aa: 01079613 slli a2,a5,0x10 + 30009ae: 8241 srli a2,a2,0x10 + 30009b0: 6785 lui a5,0x1 + 30009b2: 973e add a4,a4,a5 + 30009b4: 81472783 lw a5,-2028(a4) # 17fff814 + 30009b8: 6689 lui a3,0x2 + 30009ba: 16fd addi a3,a3,-1 # 1fff + 30009bc: 8ef1 and a3,a3,a2 + 30009be: 06c2 slli a3,a3,0x10 + 30009c0: e0010637 lui a2,0xe0010 + 30009c4: 167d addi a2,a2,-1 # e000ffff + 30009c6: 8ff1 and a5,a5,a2 + 30009c8: 8fd5 or a5,a5,a3 + 30009ca: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_ofst_trim2 = trimData22.REG.data0.pga0_offset2; + 30009ce: 18000737 lui a4,0x18000 + 30009d2: fbc42783 lw a5,-68(s0) + 30009d6: 83c1 srli a5,a5,0x10 + 30009d8: 86be mv a3,a5 + 30009da: 6785 lui a5,0x1 + 30009dc: 17fd addi a5,a5,-1 # fff + 30009de: 8ff5 and a5,a5,a3 + 30009e0: 01079613 slli a2,a5,0x10 + 30009e4: 8241 srli a2,a2,0x10 + 30009e6: 6785 lui a5,0x1 + 30009e8: 973e add a4,a4,a5 + 30009ea: 81472783 lw a5,-2028(a4) # 17fff814 + 30009ee: 6685 lui a3,0x1 + 30009f0: 16fd addi a3,a3,-1 # fff + 30009f2: 8ef1 and a3,a3,a2 + 30009f4: 767d lui a2,0xfffff + 30009f6: 8ff1 and a5,a5,a2 + 30009f8: 8fd5 or a5,a5,a3 + 30009fa: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_gain_trim4 = trimData22.REG.data1.pga0_gain4; + 30009fe: 18000737 lui a4,0x18000 + 3000a02: fc042783 lw a5,-64(s0) + 3000a06: 86be mv a3,a5 + 3000a08: 6789 lui a5,0x2 + 3000a0a: 17fd addi a5,a5,-1 # 1fff + 3000a0c: 8ff5 and a5,a5,a3 + 3000a0e: 01079613 slli a2,a5,0x10 + 3000a12: 8241 srli a2,a2,0x10 + 3000a14: 6785 lui a5,0x1 + 3000a16: 973e add a4,a4,a5 + 3000a18: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a1c: 6689 lui a3,0x2 + 3000a1e: 16fd addi a3,a3,-1 # 1fff + 3000a20: 8ef1 and a3,a3,a2 + 3000a22: 06c2 slli a3,a3,0x10 + 3000a24: e0010637 lui a2,0xe0010 + 3000a28: 167d addi a2,a2,-1 # e000ffff + 3000a2a: 8ff1 and a5,a5,a2 + 3000a2c: 8fd5 or a5,a5,a3 + 3000a2e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_ofst_trim4 = trimData22.REG.data1.pga0_offset4; + 3000a32: 18000737 lui a4,0x18000 + 3000a36: fc042783 lw a5,-64(s0) + 3000a3a: 83c1 srli a5,a5,0x10 + 3000a3c: 86be mv a3,a5 + 3000a3e: 6785 lui a5,0x1 + 3000a40: 17fd addi a5,a5,-1 # fff + 3000a42: 8ff5 and a5,a5,a3 + 3000a44: 01079613 slli a2,a5,0x10 + 3000a48: 8241 srli a2,a2,0x10 + 3000a4a: 6785 lui a5,0x1 + 3000a4c: 973e add a4,a4,a5 + 3000a4e: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a52: 6685 lui a3,0x1 + 3000a54: 16fd addi a3,a3,-1 # fff + 3000a56: 8ef1 and a3,a3,a2 + 3000a58: 767d lui a2,0xfffff + 3000a5a: 8ff1 and a5,a5,a2 + 3000a5c: 8fd5 or a5,a5,a3 + 3000a5e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_gain_trim8 = trimData22.REG.data2.pga0_gain8; + 3000a62: 18000737 lui a4,0x18000 + 3000a66: fc442783 lw a5,-60(s0) + 3000a6a: 86be mv a3,a5 + 3000a6c: 6789 lui a5,0x2 + 3000a6e: 17fd addi a5,a5,-1 # 1fff + 3000a70: 8ff5 and a5,a5,a3 + 3000a72: 01079613 slli a2,a5,0x10 + 3000a76: 8241 srli a2,a2,0x10 + 3000a78: 6785 lui a5,0x1 + 3000a7a: 973e add a4,a4,a5 + 3000a7c: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000a80: 6689 lui a3,0x2 + 3000a82: 16fd addi a3,a3,-1 # 1fff + 3000a84: 8ef1 and a3,a3,a2 + 3000a86: 06c2 slli a3,a3,0x10 + 3000a88: e0010637 lui a2,0xe0010 + 3000a8c: 167d addi a2,a2,-1 # e000ffff + 3000a8e: 8ff1 and a5,a5,a2 + 3000a90: 8fd5 or a5,a5,a3 + 3000a92: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_ofst_trim8 = trimData22.REG.data2.pga0_offset8; + 3000a96: 18000737 lui a4,0x18000 + 3000a9a: fc442783 lw a5,-60(s0) + 3000a9e: 83c1 srli a5,a5,0x10 + 3000aa0: 86be mv a3,a5 + 3000aa2: 6785 lui a5,0x1 + 3000aa4: 17fd addi a5,a5,-1 # fff + 3000aa6: 8ff5 and a5,a5,a3 + 3000aa8: 01079613 slli a2,a5,0x10 + 3000aac: 8241 srli a2,a2,0x10 + 3000aae: 6785 lui a5,0x1 + 3000ab0: 973e add a4,a4,a5 + 3000ab2: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000ab6: 6685 lui a3,0x1 + 3000ab8: 16fd addi a3,a3,-1 # fff + 3000aba: 8ef1 and a3,a3,a2 + 3000abc: 767d lui a2,0xfffff + 3000abe: 8ff1 and a5,a5,a2 + 3000ac0: 8fd5 or a5,a5,a3 + 3000ac2: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_gain_trim16 = trimData22.REG.data3.pga0_gain16; + 3000ac6: 18000737 lui a4,0x18000 + 3000aca: fc842783 lw a5,-56(s0) + 3000ace: 86be mv a3,a5 + 3000ad0: 6789 lui a5,0x2 + 3000ad2: 17fd addi a5,a5,-1 # 1fff + 3000ad4: 8ff5 and a5,a5,a3 + 3000ad6: 01079613 slli a2,a5,0x10 + 3000ada: 8241 srli a2,a2,0x10 + 3000adc: 6785 lui a5,0x1 + 3000ade: 973e add a4,a4,a5 + 3000ae0: 82072783 lw a5,-2016(a4) # 17fff820 + 3000ae4: 6689 lui a3,0x2 + 3000ae6: 16fd addi a3,a3,-1 # 1fff + 3000ae8: 8ef1 and a3,a3,a2 + 3000aea: 06c2 slli a3,a3,0x10 + 3000aec: e0010637 lui a2,0xe0010 + 3000af0: 167d addi a2,a2,-1 # e000ffff + 3000af2: 8ff1 and a5,a5,a2 + 3000af4: 8fd5 or a5,a5,a3 + 3000af6: 82f72023 sw a5,-2016(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_ofst_trim16 = trimData22.REG.data3.pga0_offset16; + 3000afa: 18000737 lui a4,0x18000 + 3000afe: fc842783 lw a5,-56(s0) + 3000b02: 83c1 srli a5,a5,0x10 + 3000b04: 86be mv a3,a5 + 3000b06: 6785 lui a5,0x1 + 3000b08: 17fd addi a5,a5,-1 # fff + 3000b0a: 8ff5 and a5,a5,a3 + 3000b0c: 01079613 slli a2,a5,0x10 + 3000b10: 8241 srli a2,a2,0x10 + 3000b12: 6785 lui a5,0x1 + 3000b14: 973e add a4,a4,a5 + 3000b16: 82072783 lw a5,-2016(a4) # 17fff820 + 3000b1a: 6685 lui a3,0x1 + 3000b1c: 16fd addi a3,a3,-1 # fff + 3000b1e: 8ef1 and a3,a3,a2 + 3000b20: 767d lui a2,0xfffff + 3000b22: 8ff1 and a5,a5,a2 + 3000b24: 8fd5 or a5,a5,a3 + 3000b26: 82f72023 sw a5,-2016(a4) + + FOTP_INFO_RGN0_NUMBER_23 trimData23; + FOTP_InfoGet(FOTP_INFO_RNG0, 23U, (void *)&trimData23.comData); /* 23 is the number of trim data in otp */ + 3000b2a: fac40793 addi a5,s0,-84 + 3000b2e: 863e mv a2,a5 + 3000b30: 45dd li a1,23 + 3000b32: 4501 li a0,0 + 3000b34: 2b09 jal ra,3001046 + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_gain_trim2 = trimData23.REG.data0.pga1_gain2; + 3000b36: 18000737 lui a4,0x18000 + 3000b3a: fac42783 lw a5,-84(s0) + 3000b3e: 86be mv a3,a5 + 3000b40: 6789 lui a5,0x2 + 3000b42: 17fd addi a5,a5,-1 # 1fff + 3000b44: 8ff5 and a5,a5,a3 + 3000b46: 01079613 slli a2,a5,0x10 + 3000b4a: 8241 srli a2,a2,0x10 + 3000b4c: 6785 lui a5,0x1 + 3000b4e: 973e add a4,a4,a5 + 3000b50: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b54: 6689 lui a3,0x2 + 3000b56: 16fd addi a3,a3,-1 # 1fff + 3000b58: 8ef1 and a3,a3,a2 + 3000b5a: 06c2 slli a3,a3,0x10 + 3000b5c: e0010637 lui a2,0xe0010 + 3000b60: 167d addi a2,a2,-1 # e000ffff + 3000b62: 8ff1 and a5,a5,a2 + 3000b64: 8fd5 or a5,a5,a3 + 3000b66: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_ofst_trim2 = trimData23.REG.data0.pga1_offset2; + 3000b6a: 18000737 lui a4,0x18000 + 3000b6e: fac42783 lw a5,-84(s0) + 3000b72: 83c1 srli a5,a5,0x10 + 3000b74: 86be mv a3,a5 + 3000b76: 6785 lui a5,0x1 + 3000b78: 17fd addi a5,a5,-1 # fff + 3000b7a: 8ff5 and a5,a5,a3 + 3000b7c: 01079613 slli a2,a5,0x10 + 3000b80: 8241 srli a2,a2,0x10 + 3000b82: 6785 lui a5,0x1 + 3000b84: 973e add a4,a4,a5 + 3000b86: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b8a: 6685 lui a3,0x1 + 3000b8c: 16fd addi a3,a3,-1 # fff + 3000b8e: 8ef1 and a3,a3,a2 + 3000b90: 767d lui a2,0xfffff + 3000b92: 8ff1 and a5,a5,a2 + 3000b94: 8fd5 or a5,a5,a3 + 3000b96: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_gain_trim4 = trimData23.REG.data1.pga1_gain4; + 3000b9a: 18000737 lui a4,0x18000 + 3000b9e: fb042783 lw a5,-80(s0) + 3000ba2: 86be mv a3,a5 + 3000ba4: 6789 lui a5,0x2 + 3000ba6: 17fd addi a5,a5,-1 # 1fff + 3000ba8: 8ff5 and a5,a5,a3 + 3000baa: 01079613 slli a2,a5,0x10 + 3000bae: 8241 srli a2,a2,0x10 + 3000bb0: 6785 lui a5,0x1 + 3000bb2: 973e add a4,a4,a5 + 3000bb4: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bb8: 6689 lui a3,0x2 + 3000bba: 16fd addi a3,a3,-1 # 1fff + 3000bbc: 8ef1 and a3,a3,a2 + 3000bbe: 06c2 slli a3,a3,0x10 + 3000bc0: e0010637 lui a2,0xe0010 + 3000bc4: 167d addi a2,a2,-1 # e000ffff + 3000bc6: 8ff1 and a5,a5,a2 + 3000bc8: 8fd5 or a5,a5,a3 + 3000bca: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_ofst_trim4 = trimData23.REG.data1.pga1_offset4; + 3000bce: 18000737 lui a4,0x18000 + 3000bd2: fb042783 lw a5,-80(s0) + 3000bd6: 83c1 srli a5,a5,0x10 + 3000bd8: 86be mv a3,a5 + 3000bda: 6785 lui a5,0x1 + 3000bdc: 17fd addi a5,a5,-1 # fff + 3000bde: 8ff5 and a5,a5,a3 + 3000be0: 01079613 slli a2,a5,0x10 + 3000be4: 8241 srli a2,a2,0x10 + 3000be6: 6785 lui a5,0x1 + 3000be8: 973e add a4,a4,a5 + 3000bea: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bee: 6685 lui a3,0x1 + 3000bf0: 16fd addi a3,a3,-1 # fff + 3000bf2: 8ef1 and a3,a3,a2 + 3000bf4: 767d lui a2,0xfffff + 3000bf6: 8ff1 and a5,a5,a2 + 3000bf8: 8fd5 or a5,a5,a3 + 3000bfa: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_gain_trim8 = trimData23.REG.data2.pga1_gain8; + 3000bfe: 18000737 lui a4,0x18000 + 3000c02: fb442783 lw a5,-76(s0) + 3000c06: 86be mv a3,a5 + 3000c08: 6789 lui a5,0x2 + 3000c0a: 17fd addi a5,a5,-1 # 1fff + 3000c0c: 8ff5 and a5,a5,a3 + 3000c0e: 01079613 slli a2,a5,0x10 + 3000c12: 8241 srli a2,a2,0x10 + 3000c14: 6785 lui a5,0x1 + 3000c16: 973e add a4,a4,a5 + 3000c18: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c1c: 6689 lui a3,0x2 + 3000c1e: 16fd addi a3,a3,-1 # 1fff + 3000c20: 8ef1 and a3,a3,a2 + 3000c22: 06c2 slli a3,a3,0x10 + 3000c24: e0010637 lui a2,0xe0010 + 3000c28: 167d addi a2,a2,-1 # e000ffff + 3000c2a: 8ff1 and a5,a5,a2 + 3000c2c: 8fd5 or a5,a5,a3 + 3000c2e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_ofst_trim8 = trimData23.REG.data2.pga1_offset8; + 3000c32: 18000737 lui a4,0x18000 + 3000c36: fb442783 lw a5,-76(s0) + 3000c3a: 83c1 srli a5,a5,0x10 + 3000c3c: 86be mv a3,a5 + 3000c3e: 6785 lui a5,0x1 + 3000c40: 17fd addi a5,a5,-1 # fff + 3000c42: 8ff5 and a5,a5,a3 + 3000c44: 01079613 slli a2,a5,0x10 + 3000c48: 8241 srli a2,a2,0x10 + 3000c4a: 6785 lui a5,0x1 + 3000c4c: 973e add a4,a4,a5 + 3000c4e: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c52: 6685 lui a3,0x1 + 3000c54: 16fd addi a3,a3,-1 # fff + 3000c56: 8ef1 and a3,a3,a2 + 3000c58: 767d lui a2,0xfffff + 3000c5a: 8ff1 and a5,a5,a2 + 3000c5c: 8fd5 or a5,a5,a3 + 3000c5e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_gain_trim16 = trimData23.REG.data3.pga1_gain16; + 3000c62: 18000737 lui a4,0x18000 + 3000c66: fb842783 lw a5,-72(s0) + 3000c6a: 86be mv a3,a5 + 3000c6c: 6789 lui a5,0x2 + 3000c6e: 17fd addi a5,a5,-1 # 1fff + 3000c70: 8ff5 and a5,a5,a3 + 3000c72: 01079613 slli a2,a5,0x10 + 3000c76: 8241 srli a2,a2,0x10 + 3000c78: 6785 lui a5,0x1 + 3000c7a: 973e add a4,a4,a5 + 3000c7c: 83072783 lw a5,-2000(a4) # 17fff830 + 3000c80: 6689 lui a3,0x2 + 3000c82: 16fd addi a3,a3,-1 # 1fff + 3000c84: 8ef1 and a3,a3,a2 + 3000c86: 06c2 slli a3,a3,0x10 + 3000c88: e0010637 lui a2,0xe0010 + 3000c8c: 167d addi a2,a2,-1 # e000ffff + 3000c8e: 8ff1 and a5,a5,a2 + 3000c90: 8fd5 or a5,a5,a3 + 3000c92: 82f72823 sw a5,-2000(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_ofst_trim16 = trimData23.REG.data3.pga1_offset16; + 3000c96: 18000737 lui a4,0x18000 + 3000c9a: fb842783 lw a5,-72(s0) + 3000c9e: 83c1 srli a5,a5,0x10 + 3000ca0: 86be mv a3,a5 + 3000ca2: 6785 lui a5,0x1 + 3000ca4: 17fd addi a5,a5,-1 # fff + 3000ca6: 8ff5 and a5,a5,a3 + 3000ca8: 01079613 slli a2,a5,0x10 + 3000cac: 8241 srli a2,a2,0x10 + 3000cae: 6785 lui a5,0x1 + 3000cb0: 973e add a4,a4,a5 + 3000cb2: 83072783 lw a5,-2000(a4) # 17fff830 + 3000cb6: 6685 lui a3,0x1 + 3000cb8: 16fd addi a3,a3,-1 # fff + 3000cba: 8ef1 and a3,a3,a2 + 3000cbc: 767d lui a2,0xfffff + 3000cbe: 8ff1 and a5,a5,a2 + 3000cc0: 8fd5 or a5,a5,a3 + 3000cc2: 82f72823 sw a5,-2000(a4) +} + 3000cc6: 0001 nop + 3000cc8: 40f6 lw ra,92(sp) + 3000cca: 4466 lw s0,88(sp) + 3000ccc: 6125 addi sp,sp,96 + 3000cce: 8082 ret + +03000cd0 : + 3000cd0: 3760006f j 3001046 + +03000cd4 : + * @brief Parameter calibration entry of the analog module. + * @param None + * @retval None + */ +void ANATRIM_Entry(void) +{ + 3000cd4: 1141 addi sp,sp,-16 + 3000cd6: c606 sw ra,12(sp) + 3000cd8: c422 sw s0,8(sp) + 3000cda: 0800 addi s0,sp,16 + if (CHIP_GetInfo() == false) { /* If the chip information is incorrect, calibration is not performed */ + 3000cdc: 3c79 jal ra,300077a + 3000cde: 87aa mv a5,a0 + 3000ce0: 0017c793 xori a5,a5,1 + 3000ce4: 9f81 uxtb a5 + 3000ce6: eb9d bnez a5,3000d1c + return; + } + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_ENABLE); /* Enable the clock for calibration */ + 3000ce8: 4585 li a1,1 + 3000cea: 18000537 lui a0,0x18000 + 3000cee: 2849 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_ENABLE); + 3000cf0: 4585 li a1,1 + 3000cf2: 18200537 lui a0,0x18200 + 3000cf6: 2069 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_ENABLE); + 3000cf8: 4585 li a1,1 + 3000cfa: 18201537 lui a0,0x18201 + 3000cfe: 2049 jal ra,3000d80 + CHIP_AnalogTrim(); + 3000d00: 34d1 jal ra,30007c4 + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_DISABLE); /* The clock is disabled after calibration */ + 3000d02: 4581 li a1,0 + 3000d04: 18000537 lui a0,0x18000 + 3000d08: 28a5 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_DISABLE); + 3000d0a: 4581 li a1,0 + 3000d0c: 18200537 lui a0,0x18200 + 3000d10: 2885 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_DISABLE); + 3000d12: 4581 li a1,0 + 3000d14: 18201537 lui a0,0x18201 + 3000d18: 20a5 jal ra,3000d80 + 3000d1a: a011 j 3000d1e + return; + 3000d1c: 0001 nop + 3000d1e: 40b2 lw ra,12(sp) + 3000d20: 4422 lw s0,8(sp) + 3000d22: 0141 addi sp,sp,16 + 3000d24: 8082 ret + +03000d26 : + * @brief Set Crg Core clock select + * @param None + * @retval None + */ +void ANAVREF_Init(void) +{ + 3000d26: 1141 addi sp,sp,-16 + 3000d28: c606 sw ra,12(sp) + 3000d2a: c422 sw s0,8(sp) + 3000d2c: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(VREF_BASE, IP_CLK_ENABLE); + 3000d2e: 4585 li a1,1 + 3000d30: 18100537 lui a0,0x18100 + 3000d34: 20b1 jal ra,3000d80 + VREF->VREF_CTRL1.BIT.da_ref_temp_trim_enh = 0x1; + 3000d36: 18100737 lui a4,0x18100 + 3000d3a: 531c lw a5,32(a4) + 3000d3c: 66c1 lui a3,0x10 + 3000d3e: 8fd5 or a5,a5,a3 + 3000d40: d31c sw a5,32(a4) + VREF->VREF_CTRL0.BIT.da_ref_enh = BASE_CFG_ENABLE; + 3000d42: 18100737 lui a4,0x18100 + 3000d46: 431c lw a5,0(a4) + 3000d48: 0017e793 ori a5,a5,1 + 3000d4c: c31c sw a5,0(a4) + BASE_FUNC_DELAY_US(200); /* delay 200us */ + 3000d4e: 000f47b7 lui a5,0xf4 + 3000d52: 24078593 addi a1,a5,576 # f4240 + 3000d56: 0c800513 li a0,200 + 3000d5a: 20b5 jal ra,3000dc6 + VREF->VREF_CTRL1.BIT.da_ref_chop_enh = BASE_CFG_ENABLE; + 3000d5c: 18100737 lui a4,0x18100 + 3000d60: 531c lw a5,32(a4) + 3000d62: 0017e793 ori a5,a5,1 + 3000d66: d31c sw a5,32(a4) + BASE_FUNC_DELAY_US(40); /* delay 40us */ + 3000d68: 000f47b7 lui a5,0xf4 + 3000d6c: 24078593 addi a1,a5,576 # f4240 + 3000d70: 02800513 li a0,40 + 3000d74: 2889 jal ra,3000dc6 + 3000d76: 0001 nop + 3000d78: 40b2 lw ra,12(sp) + 3000d7a: 4422 lw s0,8(sp) + 3000d7c: 0141 addi sp,sp,16 + 3000d7e: 8082 ret + +03000d80 : + 3000d80: 0b30206f j 3003632 + +03000d84 : + * @brief Set Crg Core clock select + * @param coreClkSelect Input core clock select value + * @retval None + */ +void CRG_SetCoreClockSelect(CRG_CoreClkSelect coreClkSelect) +{ + 3000d84: 715d addi sp,sp,-80 + 3000d86: c686 sw ra,76(sp) + 3000d88: c4a2 sw s0,72(sp) + 3000d8a: 0880 addi s0,sp,80 + 3000d8c: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3000d90: 100007b7 lui a5,0x10000 + 3000d94: fcf42423 sw a5,-56(s0) + crg.coreClkSelect = coreClkSelect; + 3000d98: fbc42783 lw a5,-68(s0) + 3000d9c: fef42023 sw a5,-32(s0) + if (crg.coreClkSelect == CRG_CORE_CLK_SELECT_TCXO) { /* If an external crystal oscillator is selected. */ + 3000da0: fe042703 lw a4,-32(s0) + 3000da4: 4785 li a5,1 + 3000da6: 00f71663 bne a4,a5,3000db2 + BASE_FUNC_DELAY_MS(10); /* 10: delay 10ms, wait clokc stable. */ + 3000daa: 3e800593 li a1,1000 + 3000dae: 4529 li a0,10 + 3000db0: 2819 jal ra,3000dc6 + } + HAL_CRG_SetCoreClockSelect(&crg); + 3000db2: fc840793 addi a5,s0,-56 + 3000db6: 853e mv a0,a5 + 3000db8: 572020ef jal ra,300332a + 3000dbc: 0001 nop + 3000dbe: 40b6 lw ra,76(sp) + 3000dc0: 4426 lw s0,72(sp) + 3000dc2: 6161 addi sp,sp,80 + 3000dc4: 8082 ret + +03000dc6 : + 3000dc6: 5160106f j 30022dc + +03000dca : + * @param frequence frequnce + * @param div Output Divison + * @retval None + */ +static void SetFlashDiv(unsigned int frequency, unsigned int *nreadDiv) +{ + 3000dca: 7179 addi sp,sp,-48 + 3000dcc: d622 sw s0,44(sp) + 3000dce: 1800 addi s0,sp,48 + 3000dd0: fca42e23 sw a0,-36(s0) + 3000dd4: fcb42c23 sw a1,-40(s0) + unsigned int div; + unsigned int freq = frequency; + 3000dd8: fdc42783 lw a5,-36(s0) + 3000ddc: fef42423 sw a5,-24(s0) + /* Get frequency divider of flash. */ + if (freq < FLASH_BASE_FREQ) { + 3000de0: fe842703 lw a4,-24(s0) + 3000de4: 023c37b7 lui a5,0x23c3 + 3000de8: 45f78793 addi a5,a5,1119 # 23c345f + 3000dec: 00e7e863 bltu a5,a4,3000dfc + freq = FLASH_BASE_FREQ; + 3000df0: 023c37b7 lui a5,0x23c3 + 3000df4: 46078793 addi a5,a5,1120 # 23c3460 + 3000df8: fef42423 sw a5,-24(s0) + } + /* Get the flash frequency division based on the frequency. */ + if ((freq % FLASH_BASE_FREQ) == 0) { + 3000dfc: fe842703 lw a4,-24(s0) + 3000e00: 023c37b7 lui a5,0x23c3 + 3000e04: 46078793 addi a5,a5,1120 # 23c3460 + 3000e08: 02f777b3 remu a5,a4,a5 + 3000e0c: ef81 bnez a5,3000e24 + div = freq / FLASH_BASE_FREQ; + 3000e0e: fe842703 lw a4,-24(s0) + 3000e12: 023c37b7 lui a5,0x23c3 + 3000e16: 46078793 addi a5,a5,1120 # 23c3460 + 3000e1a: 02f757b3 divu a5,a4,a5 + 3000e1e: fef42623 sw a5,-20(s0) + 3000e22: a821 j 3000e3a + } else { + div = (freq / FLASH_BASE_FREQ) + 1; + 3000e24: fe842703 lw a4,-24(s0) + 3000e28: 023c37b7 lui a5,0x23c3 + 3000e2c: 46078793 addi a5,a5,1120 # 23c3460 + 3000e30: 02f757b3 divu a5,a4,a5 + 3000e34: 0785 addi a5,a5,1 + 3000e36: fef42623 sw a5,-20(s0) + } + /* Ensure the flash frequency division is valid. */ + if (div > FLASH_MAX_DIV) { + 3000e3a: fec42703 lw a4,-20(s0) + 3000e3e: 4791 li a5,4 + 3000e40: 00e7f563 bgeu a5,a4,3000e4a + div = FLASH_MAX_DIV; + 3000e44: 4791 li a5,4 + 3000e46: fef42623 sw a5,-20(s0) + } + *nreadDiv = div; + 3000e4a: fd842783 lw a5,-40(s0) + 3000e4e: fec42703 lw a4,-20(s0) + 3000e52: c398 sw a4,0(a5) +} + 3000e54: 0001 nop + 3000e56: 5432 lw s0,44(sp) + 3000e58: 6145 addi sp,sp,48 + 3000e5a: 8082 ret + +03000e5c : + * @brief Get the Rounding up value + * @param coreClkSelect Core Clock select + * @retval Frequency of Flash + */ +static unsigned int GetFlashFreq(CRG_CoreClkSelect coreClkSelect) +{ + 3000e5c: 7179 addi sp,sp,-48 + 3000e5e: d606 sw ra,44(sp) + 3000e60: d422 sw s0,40(sp) + 3000e62: 1800 addi s0,sp,48 + 3000e64: fca42e23 sw a0,-36(s0) + unsigned int hclk; + /* Get frequency of flash. */ + switch (coreClkSelect) { + 3000e68: fdc42783 lw a5,-36(s0) + 3000e6c: 4705 li a4,1 + 3000e6e: 02e78063 beq a5,a4,3000e8e + 3000e72: 4705 li a4,1 + 3000e74: 00e7e663 bltu a5,a4,3000e80 + 3000e78: 4709 li a4,2 + 3000e7a: 02e78163 beq a5,a4,3000e9c + 3000e7e: a025 j 3000ea6 + case CRG_CORE_CLK_SELECT_HOSC: + hclk = HOSC_FREQ; + 3000e80: 017d87b7 lui a5,0x17d8 + 3000e84: 84078793 addi a5,a5,-1984 # 17d7840 + 3000e88: fef42623 sw a5,-20(s0) + break; + 3000e8c: a01d j 3000eb2 + case CRG_CORE_CLK_SELECT_TCXO: + hclk = XTRAIL_FREQ; + 3000e8e: 01c9c7b7 lui a5,0x1c9c + 3000e92: 38078793 addi a5,a5,896 # 1c9c380 + 3000e96: fef42623 sw a5,-20(s0) + break; + 3000e9a: a821 j 3000eb2 + case CRG_CORE_CLK_SELECT_PLL: + hclk = HAL_CRG_GetPllFreq(); + 3000e9c: 5b0020ef jal ra,300344c + 3000ea0: fea42623 sw a0,-20(s0) + break; + 3000ea4: a039 j 3000eb2 + default: + hclk = LOSC_FREQ; + 3000ea6: 67a1 lui a5,0x8 + 3000ea8: d0078793 addi a5,a5,-768 # 7d00 + 3000eac: fef42623 sw a5,-20(s0) + break; + 3000eb0: 0001 nop + } + return hclk; + 3000eb2: fec42783 lw a5,-20(s0) +} + 3000eb6: 853e mv a0,a5 + 3000eb8: 50b2 lw ra,44(sp) + 3000eba: 5422 lw s0,40(sp) + 3000ebc: 6145 addi sp,sp,48 + 3000ebe: 8082 ret + +03000ec0 : + * @brief Set flash clock frequence base on hclk + * @param coreClkSelect core clock select + * @retval None + */ +void FLASH_ClockConfig(CRG_CoreClkSelect coreClkSelect) +{ + 3000ec0: 7179 addi sp,sp,-48 + 3000ec2: d606 sw ra,44(sp) + 3000ec4: d422 sw s0,40(sp) + 3000ec6: 1800 addi s0,sp,48 + 3000ec8: fca42e23 sw a0,-36(s0) + EFC_RegStruct *efc = EFC; + 3000ecc: 147107b7 lui a5,0x14710 + 3000ed0: fef42623 sw a5,-20(s0) + EFLASH_CLK_CFG_REG cfg; + unsigned int hclk; + unsigned int nreadDiv; + + /* Step 1: Set nread_div */ + hclk = GetFlashFreq(coreClkSelect); + 3000ed4: fdc42503 lw a0,-36(s0) + 3000ed8: 3751 jal ra,3000e5c + 3000eda: fea42423 sw a0,-24(s0) + cfg.reg = efc->EFLASH_CLK_CFG.reg; + 3000ede: fec42703 lw a4,-20(s0) + 3000ee2: 6785 lui a5,0x1 + 3000ee4: 97ba add a5,a5,a4 + 3000ee6: 9407a783 lw a5,-1728(a5) # 940 + 3000eea: fef42223 sw a5,-28(s0) + SetFlashDiv(hclk, &nreadDiv); + 3000eee: fe040793 addi a5,s0,-32 + 3000ef2: 85be mv a1,a5 + 3000ef4: fe842503 lw a0,-24(s0) + 3000ef8: 3dc9 jal ra,3000dca + cfg.BIT.nread_div = nreadDiv; + 3000efa: fe042783 lw a5,-32(s0) + 3000efe: 8bbd andi a5,a5,15 + 3000f00: 0ff7f713 andi a4,a5,255 + 3000f04: fe442783 lw a5,-28(s0) + 3000f08: 8b3d andi a4,a4,15 + 3000f0a: 0712 slli a4,a4,0x4 + 3000f0c: f0f7f793 andi a5,a5,-241 + 3000f10: 8fd9 or a5,a5,a4 + 3000f12: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f16: fe442783 lw a5,-28(s0) + 3000f1a: 00100737 lui a4,0x100 + 3000f1e: 8fd9 or a5,a5,a4 + 3000f20: fef42223 sw a5,-28(s0) + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f24: fe442783 lw a5,-28(s0) + 3000f28: 00400737 lui a4,0x400 + 3000f2c: 8fd9 or a5,a5,a4 + 3000f2e: fef42223 sw a5,-28(s0) + + /* Step 2: Wait Busclk_sw_req */ + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f32: fe442783 lw a5,-28(s0) + 3000f36: 00400737 lui a4,0x400 + 3000f3a: 8fd9 or a5,a5,a4 + 3000f3c: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f40: fe442783 lw a5,-28(s0) + 3000f44: 00100737 lui a4,0x100 + 3000f48: 8fd9 or a5,a5,a4 + 3000f4a: fef42223 sw a5,-28(s0) + efc->EFLASH_CLK_CFG.reg = cfg.reg; + 3000f4e: fe442703 lw a4,-28(s0) + 3000f52: fec42683 lw a3,-20(s0) + 3000f56: 6785 lui a5,0x1 + 3000f58: 97b6 add a5,a5,a3 + 3000f5a: 94e7a023 sw a4,-1728(a5) # 940 + while (efc->EFLASH_CLK_CFG.BIT.busclk_sw_req == BASE_CFG_SET) { + 3000f5e: 0001 nop + 3000f60: fec42703 lw a4,-20(s0) + 3000f64: 6785 lui a5,0x1 + 3000f66: 97ba add a5,a5,a4 + 3000f68: 9407a783 lw a5,-1728(a5) # 940 + 3000f6c: 83d1 srli a5,a5,0x14 + 3000f6e: 8b85 andi a5,a5,1 + 3000f70: 0ff7f713 andi a4,a5,255 + 3000f74: 4785 li a5,1 + 3000f76: fef705e3 beq a4,a5,3000f60 + ; + } + 3000f7a: 0001 nop + 3000f7c: 50b2 lw ra,44(sp) + 3000f7e: 5422 lw s0,40(sp) + 3000f80: 6145 addi sp,sp,48 + 3000f82: 8082 ret + +03000f84 : + * @brief Init the systick + * @param None + * @retval None + */ +void SYSTICK_Init(void) +{ + 3000f84: 1141 addi sp,sp,-16 + 3000f86: c622 sw s0,12(sp) + 3000f88: 0800 addi s0,sp,16 + SYSTICK->TIMER_CTRL.reg = 0; + 3000f8a: 143807b7 lui a5,0x14380 + 3000f8e: 0007a023 sw zero,0(a5) # 14380000 + SYSTICK->TIMER_CTRL.BIT.enable = 1; + 3000f92: 14380737 lui a4,0x14380 + 3000f96: 431c lw a5,0(a4) + 3000f98: 0017e793 ori a5,a5,1 + 3000f9c: c31c sw a5,0(a4) +} + 3000f9e: 0001 nop + 3000fa0: 4432 lw s0,12(sp) + 3000fa2: 0141 addi sp,sp,16 + 3000fa4: 8082 ret + +03000fa6 : + * @brief Get the Systick frep(Hz) + * @param None + * @retval Clock frep of systick(Hz) + */ +unsigned int SYSTICK_GetCRGHZ(void) +{ + 3000fa6: 1141 addi sp,sp,-16 + 3000fa8: c606 sw ra,12(sp) + 3000faa: c422 sw s0,8(sp) + 3000fac: 0800 addi s0,sp,16 + /* Get the Systick IP */ + return HAL_CRG_GetIpFreq(SYSTICK_BASE); + 3000fae: 14380537 lui a0,0x14380 + 3000fb2: 59c020ef jal ra,300354e + 3000fb6: 87aa mv a5,a0 + 3000fb8: 853e mv a0,a5 + 3000fba: 40b2 lw ra,12(sp) + 3000fbc: 4422 lw s0,8(sp) + 3000fbe: 0141 addi sp,sp,16 + 3000fc0: 8082 ret + +03000fc2 : + * @param efc Flash control register base address + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +static unsigned int FOTP_CheckReadStatus(EFC_RegStruct *efc) +{ + 3000fc2: 1101 addi sp,sp,-32 + 3000fc4: ce22 sw s0,28(sp) + 3000fc6: 1000 addi s0,sp,32 + 3000fc8: fea42623 sw a0,-20(s0) + /* Check for errors in the flash reading process. */ + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fcc: fec42783 lw a5,-20(s0) + 3000fd0: 1007a783 lw a5,256(a5) + 3000fd4: 83c1 srli a5,a5,0x10 + 3000fd6: 8b85 andi a5,a5,1 + 3000fd8: 9f81 uxtb a5 + 3000fda: e38d bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000fdc: fec42783 lw a5,-20(s0) + 3000fe0: 1007a783 lw a5,256(a5) + 3000fe4: 83cd srli a5,a5,0x13 + 3000fe6: 8b85 andi a5,a5,1 + 3000fe8: 9f81 uxtb a5 + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fea: eb89 bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_chk) { + 3000fec: fec42783 lw a5,-20(s0) + 3000ff0: 1007a783 lw a5,256(a5) + 3000ff4: 83d1 srli a5,a5,0x14 + 3000ff6: 8b85 andi a5,a5,1 + 3000ff8: 9f81 uxtb a5 + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000ffa: c3a9 beqz a5,300103c + efc->INT_CLEAR.BIT.int_clr_err_ecc_corr = BASE_CFG_SET; + 3000ffc: fec42703 lw a4,-20(s0) + 3001000: 10c72783 lw a5,268(a4) # 1438010c + 3001004: 000806b7 lui a3,0x80 + 3001008: 8fd5 or a5,a5,a3 + 300100a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_illegal = BASE_CFG_SET; + 300100e: fec42703 lw a4,-20(s0) + 3001012: 10c72783 lw a5,268(a4) + 3001016: 66c1 lui a3,0x10 + 3001018: 8fd5 or a5,a5,a3 + 300101a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_ecc_chk = BASE_CFG_SET; + 300101e: fec42703 lw a4,-20(s0) + 3001022: 10c72783 lw a5,268(a4) + 3001026: 001006b7 lui a3,0x100 + 300102a: 8fd5 or a5,a5,a3 + 300102c: 10f72623 sw a5,268(a4) + efc->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001030: fec42783 lw a5,-20(s0) + 3001034: 2007a023 sw zero,512(a5) + return BASE_STATUS_ERROR; + 3001038: 4785 li a5,1 + 300103a: a011 j 300103e + } + return BASE_STATUS_OK; + 300103c: 4781 li a5,0 +} + 300103e: 853e mv a0,a5 + 3001040: 4472 lw s0,28(sp) + 3001042: 6105 addi sp,sp,32 + 3001044: 8082 ret + +03001046 : + * @param buf Buffer of read data + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +unsigned int FOTP_InfoGet(FOTP_InfoRngType type, unsigned int index, FOTP_CommonData *buf) +{ + 3001046: 7179 addi sp,sp,-48 + 3001048: d606 sw ra,44(sp) + 300104a: d422 sw s0,40(sp) + 300104c: 1800 addi s0,sp,48 + 300104e: fca42e23 sw a0,-36(s0) + 3001052: fcb42c23 sw a1,-40(s0) + 3001056: fcc42a23 sw a2,-44(s0) + EFC_RegStruct *p = EFC; + 300105a: 147107b7 lui a5,0x14710 + 300105e: fef42423 sw a5,-24(s0) + unsigned int addr; + + if (buf == NULL) { + 3001062: fd442783 lw a5,-44(s0) + 3001066: e399 bnez a5,300106c + return BASE_STATUS_ERROR; + 3001068: 4785 li a5,1 + 300106a: aa15 j 300119e + } + + if ((type >= FOTP_INFO_MAXTYPE) || (index > FOTP_INFO_REG_MAX_ID)) { + 300106c: fdc42703 lw a4,-36(s0) + 3001070: 4785 li a5,1 + 3001072: 00e7e763 bltu a5,a4,3001080 + 3001076: fd842703 lw a4,-40(s0) + 300107a: 47e5 li a5,25 + 300107c: 00e7f463 bgeu a5,a4,3001084 + return BASE_STATUS_ERROR; + 3001080: 4785 li a5,1 + 3001082: aa31 j 300119e + } + + /* If there is a read command, return */ + if (p->EFLASH_CMD.BIT.cmd_start) { + 3001084: fe842783 lw a5,-24(s0) + 3001088: 439c lw a5,0(a5) + 300108a: 8b85 andi a5,a5,1 + 300108c: 9f81 uxtb a5 + 300108e: c399 beqz a5,3001094 + return BASE_STATUS_ERROR; + 3001090: 4785 li a5,1 + 3001092: a231 j 300119e + } + + p->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; + 3001094: fe842783 lw a5,-24(s0) + 3001098: fedcc737 lui a4,0xfedcc + 300109c: a9870713 addi a4,a4,-1384 # fedcba98 + 30010a0: 20e7a023 sw a4,512(a5) # 14710200 + + /* Configure the read command parameters and start the read command */ + addr = (type == FOTP_INFO_RNG0) ? FOTP_INFO_RNG0_BASEADDR : FOTP_INFO_RNG1_BASEADDR; + 30010a4: fdc42783 lw a5,-36(s0) + 30010a8: e781 bnez a5,30010b0 + 30010aa: 008007b7 lui a5,0x800 + 30010ae: a019 j 30010b4 + 30010b0: 008017b7 lui a5,0x801 + 30010b4: fef42223 sw a5,-28(s0) + addr += index * REG_WORDS_NUM; + 30010b8: fd842783 lw a5,-40(s0) + 30010bc: 0792 slli a5,a5,0x4 + 30010be: fe442703 lw a4,-28(s0) + 30010c2: 97ba add a5,a5,a4 + 30010c4: fef42223 sw a5,-28(s0) + p->EFLASH_ADDR.BIT.cmd_addr = addr >> 2; /* Right shift 2 bit change to word */ + 30010c8: fe442783 lw a5,-28(s0) + 30010cc: 0027d713 srli a4,a5,0x2 + 30010d0: 004007b7 lui a5,0x400 + 30010d4: 17fd addi a5,a5,-1 # 3fffff + 30010d6: 00f77633 and a2,a4,a5 + 30010da: fe842703 lw a4,-24(s0) + 30010de: 435c lw a5,4(a4) + 30010e0: 004006b7 lui a3,0x400 + 30010e4: 16fd addi a3,a3,-1 # 3fffff + 30010e6: 8ef1 and a3,a3,a2 + 30010e8: 068a slli a3,a3,0x2 + 30010ea: ff000637 lui a2,0xff000 + 30010ee: 060d addi a2,a2,3 # ff000003 + 30010f0: 8ff1 and a5,a5,a2 + 30010f2: 8fd5 or a5,a5,a3 + 30010f4: c35c sw a5,4(a4) + p->EFLASH_CMD.BIT.cmd_code = FLASH_OPERATION_READ; + 30010f6: fe842703 lw a4,-24(s0) + 30010fa: 431c lw a5,0(a4) + 30010fc: 8ff7f793 andi a5,a5,-1793 + 3001100: 1007e793 ori a5,a5,256 + 3001104: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_read_size = FLASH_READ_128BIT; + 3001106: fe842703 lw a4,-24(s0) + 300110a: 431c lw a5,0(a4) + 300110c: d00006b7 lui a3,0xd0000 + 3001110: 16fd addi a3,a3,-1 # cfffffff + 3001112: 8efd and a3,a3,a5 + 3001114: 100007b7 lui a5,0x10000 + 3001118: 8fd5 or a5,a5,a3 + 300111a: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_start = BASE_CFG_SET; + 300111c: fe842703 lw a4,-24(s0) + 3001120: 431c lw a5,0(a4) + 3001122: 0017e793 ori a5,a5,1 + 3001126: c31c sw a5,0(a4) + + while (p->EFLASH_CMD.BIT.cmd_start) { + 3001128: 0001 nop + 300112a: fe842783 lw a5,-24(s0) + 300112e: 439c lw a5,0(a5) + 3001130: 8b85 andi a5,a5,1 + 3001132: 9f81 uxtb a5 + 3001134: fbfd bnez a5,300112a + ; + } + while (p->EFLASH_CMD.BIT.exec_state) { + 3001136: 0001 nop + 3001138: fe842783 lw a5,-24(s0) + 300113c: 439c lw a5,0(a5) + 300113e: 8399 srli a5,a5,0x6 + 3001140: 8b8d andi a5,a5,3 + 3001142: 9f81 uxtb a5 + 3001144: fbf5 bnez a5,3001138 + ; + } + /* read error, clear interrupt and return */ + if (FOTP_CheckReadStatus(p) != BASE_STATUS_OK) { + 3001146: fe842503 lw a0,-24(s0) + 300114a: 3da5 jal ra,3000fc2 + 300114c: 87aa mv a5,a0 + 300114e: c399 beqz a5,3001154 + return BASE_STATUS_ERROR; + 3001150: 4785 li a5,1 + 3001152: a0b1 j 300119e + } + /* Read data from FIFO to buffer */ + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001154: fe042623 sw zero,-20(s0) + 3001158: a00d j 300117a + buf->data[i] = p->FLASH_RDATA; + 300115a: fe842783 lw a5,-24(s0) + 300115e: 6007a703 lw a4,1536(a5) # 10000600 + 3001162: fd442683 lw a3,-44(s0) + 3001166: fec42783 lw a5,-20(s0) + 300116a: 078a slli a5,a5,0x2 + 300116c: 97b6 add a5,a5,a3 + 300116e: c398 sw a4,0(a5) + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001170: fec42783 lw a5,-20(s0) + 3001174: 0785 addi a5,a5,1 + 3001176: fef42623 sw a5,-20(s0) + 300117a: fec42703 lw a4,-20(s0) + 300117e: 478d li a5,3 + 3001180: fce7fde3 bgeu a5,a4,300115a + } + p->INT_CLEAR.BIT.int_clr_finish = BASE_CFG_SET; + 3001184: fe842703 lw a4,-24(s0) + 3001188: 10c72783 lw a5,268(a4) + 300118c: 0107e793 ori a5,a5,16 + 3001190: 10f72623 sw a5,268(a4) + p->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001194: fe842783 lw a5,-24(s0) + 3001198: 2007a023 sw zero,512(a5) + return BASE_STATUS_OK; + 300119c: 4781 li a5,0 + 300119e: 853e mv a0,a5 + 30011a0: 50b2 lw ra,44(sp) + 30011a2: 5422 lw s0,40(sp) + 30011a4: 6145 addi sp,sp,48 + 30011a6: 8082 ret + +030011a8 : + * @param baseAddr The ip base address + * @retval The Address(offset) in g_crgIpMatch if match success + * @retval 0 if match fail + */ +CHIP_CrgIpMatchInfo *GetCrgIpMatchInfo(const void *baseAddr) +{ + 30011a8: 7179 addi sp,sp,-48 + 30011aa: d622 sw s0,44(sp) + 30011ac: 1800 addi s0,sp,48 + 30011ae: fca42e23 sw a0,-36(s0) + unsigned int i; + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011b2: fe042623 sw zero,-20(s0) + 30011b6: a081 j 30011f6 + if (baseAddr == g_crgIpMatch[i].ipBaseAddr) { + 30011b8: 030067b7 lui a5,0x3006 + 30011bc: 58c78713 addi a4,a5,1420 # 300658c + 30011c0: fec42683 lw a3,-20(s0) + 30011c4: 47b1 li a5,12 + 30011c6: 02f687b3 mul a5,a3,a5 + 30011ca: 97ba add a5,a5,a4 + 30011cc: 439c lw a5,0(a5) + 30011ce: fdc42703 lw a4,-36(s0) + 30011d2: 00f71d63 bne a4,a5,30011ec + return (CHIP_CrgIpMatchInfo *)&g_crgIpMatch[i]; + 30011d6: fec42703 lw a4,-20(s0) + 30011da: 47b1 li a5,12 + 30011dc: 02f70733 mul a4,a4,a5 + 30011e0: 030067b7 lui a5,0x3006 + 30011e4: 58c78793 addi a5,a5,1420 # 300658c + 30011e8: 97ba add a5,a5,a4 + 30011ea: a829 j 3001204 + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011ec: fec42783 lw a5,-20(s0) + 30011f0: 0785 addi a5,a5,1 + 30011f2: fef42623 sw a5,-20(s0) + 30011f6: fec42703 lw a4,-20(s0) + 30011fa: 02d00793 li a5,45 + 30011fe: fae7fde3 bgeu a5,a4,30011b8 + } + } + return (CHIP_CrgIpMatchInfo *)0; /* The base address does not match, return 0. */ + 3001202: 4781 li a5,0 +} + 3001204: 853e mv a0,a5 + 3001206: 5432 lw s0,44(sp) + 3001208: 6145 addi sp,sp,48 + 300120a: 8082 ret + +0300120c : + * @brief Check ADC sample input. + * @param input Number of input. + * @retval bool + */ +static inline bool IsADCSampleChannel(ADC_Input input) +{ + 300120c: 1101 addi sp,sp,-32 + 300120e: ce22 sw s0,28(sp) + 3001210: 1000 addi s0,sp,32 + 3001212: fea42623 sw a0,-20(s0) + return (input >= ADC_CH_ADCINA0) && (input <= ADC_CH_ADCINA19); + 3001216: fec42783 lw a5,-20(s0) + 300121a: 0147b793 sltiu a5,a5,20 + 300121e: 9f81 uxtb a5 +} + 3001220: 853e mv a0,a5 + 3001222: 4472 lw s0,28(sp) + 3001224: 6105 addi sp,sp,32 + 3001226: 8082 ret + +03001228 : + * are configured through the SOC. + * @param soc Number of SOC. + * @retval bool + */ +static inline bool IsADCSOCx(ADC_SOCNumber soc) +{ + 3001228: 1101 addi sp,sp,-32 + 300122a: ce22 sw s0,28(sp) + 300122c: 1000 addi s0,sp,32 + 300122e: fea42623 sw a0,-20(s0) + return (soc >= ADC_SOC_NUM0) && (soc <= ADC_SOC_NUM15); + 3001232: fec42783 lw a5,-20(s0) + 3001236: 0107b793 sltiu a5,a5,16 + 300123a: 9f81 uxtb a5 +} + 300123c: 853e mv a0,a5 + 300123e: 4472 lw s0,28(sp) + 3001240: 6105 addi sp,sp,32 + 3001242: 8082 ret + +03001244 : + * @brief Check ADC interrupt parameter. + * @param intx Number of interrupt. + * @retval bool + */ +static inline bool IsADCIntx(ADC_IntNumber intx) +{ + 3001244: 1101 addi sp,sp,-32 + 3001246: ce22 sw s0,28(sp) + 3001248: 1000 addi s0,sp,32 + 300124a: fea42623 sw a0,-20(s0) + return (intx >= ADC_INT_NUMBER0) && (intx <= ADC_INT_NUMBER3); + 300124e: fec42783 lw a5,-20(s0) + 3001252: 0047b793 sltiu a5,a5,4 + 3001256: 9f81 uxtb a5 +} + 3001258: 853e mv a0,a5 + 300125a: 4472 lw s0,28(sp) + 300125c: 6105 addi sp,sp,32 + 300125e: 8082 ret + +03001260 : + * @brief Check SOC trigger source. + * @param trig Type of trigger source. + * @retval bool + */ +static inline bool IsADCTrigSource(ADC_TrigSource trig) +{ + 3001260: 1101 addi sp,sp,-32 + 3001262: ce22 sw s0,28(sp) + 3001264: 1000 addi s0,sp,32 + 3001266: fea42623 sw a0,-20(s0) + return (trig >= ADC_TRIGSOC_SOFT) && (trig <= ADC_TRIGSOC_GPIOPF1); + 300126a: fec42783 lw a5,-20(s0) + 300126e: 0157b793 sltiu a5,a5,21 + 3001272: 9f81 uxtb a5 +} + 3001274: 853e mv a0,a5 + 3001276: 4472 lw s0,28(sp) + 3001278: 6105 addi sp,sp,32 + 300127a: 8082 ret + +0300127c : + * @brief Check mode of completion of SOC sample + * @param mode Type of completion. + * @retval bool + */ +static inline bool IsADCFinishMode(ADC_SOCFinishMode mode) +{ + 300127c: 1101 addi sp,sp,-32 + 300127e: ce22 sw s0,28(sp) + 3001280: 1000 addi s0,sp,32 + 3001282: fea42623 sw a0,-20(s0) + return (mode >= ADC_SOCFINISH_NONE) && (mode <= ADC_SOCFINISH_INT3); + 3001286: fec42783 lw a5,-20(s0) + 300128a: cb81 beqz a5,300129a + 300128c: fec42703 lw a4,-20(s0) + 3001290: 4799 li a5,6 + 3001292: 00e7e463 bltu a5,a4,300129a + 3001296: 4785 li a5,1 + 3001298: a011 j 300129c + 300129a: 4781 li a5,0 + 300129c: 8b85 andi a5,a5,1 + 300129e: 9f81 uxtb a5 +} + 30012a0: 853e mv a0,a5 + 30012a2: 4472 lw s0,28(sp) + 30012a4: 6105 addi sp,sp,32 + 30012a6: 8082 ret + +030012a8 : + * @brief Check ADC sample priority parameter. + * @param mode Priority mode of SOC. + * @retval bool + */ +static inline bool IsADCPriorityMode(ADC_PriorityMode mode) +{ + 30012a8: 1101 addi sp,sp,-32 + 30012aa: ce22 sw s0,28(sp) + 30012ac: 1000 addi s0,sp,32 + 30012ae: fea42623 sw a0,-20(s0) + return (mode >= ADC_PRIMODE_ALL_ROUND) && (mode <= ADC_PRIMODE_ALL_PRIORITY); + 30012b2: fec42703 lw a4,-20(s0) + 30012b6: 67c1 lui a5,0x10 + 30012b8: 00f737b3 sltu a5,a4,a5 + 30012bc: 9f81 uxtb a5 +} + 30012be: 853e mv a0,a5 + 30012c0: 4472 lw s0,28(sp) + 30012c2: 6105 addi sp,sp,32 + 30012c4: 8082 ret + +030012c6 : + * @brief Check time of total ADC sampling time. + * @param acqps Time of total ADC sampling time. + * @retval bool + */ +static inline bool IsADCTotalTime(unsigned int acqps) +{ + 30012c6: 1101 addi sp,sp,-32 + 30012c8: ce22 sw s0,28(sp) + 30012ca: 1000 addi s0,sp,32 + 30012cc: fea42623 sw a0,-20(s0) + return (acqps <= ADC_SOCSAMPLE_500CLK); + 30012d0: fec42783 lw a5,-20(s0) + 30012d4: 0107b793 sltiu a5,a5,16 + 30012d8: 9f81 uxtb a5 +} + 30012da: 853e mv a0,a5 + 30012dc: 4472 lw s0,28(sp) + 30012de: 6105 addi sp,sp,32 + 30012e0: 8082 ret + +030012e2 : + * @brief Enable AVDD/3 Channal. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_EnableAvddChannel(ADC_RegStruct * const adcx) +{ + 30012e2: 1101 addi sp,sp,-32 + 30012e4: ce06 sw ra,28(sp) + 30012e6: cc22 sw s0,24(sp) + 30012e8: 1000 addi s0,sp,32 + 30012ea: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30012ee: fec42703 lw a4,-20(s0) + 30012f2: 180007b7 lui a5,0x18000 + 30012f6: 00f70b63 beq a4,a5,300130c + 30012fa: 6785 lui a5,0x1 + 30012fc: 86278593 addi a1,a5,-1950 # 862 + 3001300: 030067b7 lui a5,0x3006 + 3001304: 7b478513 addi a0,a5,1972 # 30067b4 + 3001308: 2dad jal ra,3001982 + 300130a: a001 j 300130a + adcx->ADC_AVDD_EN.BIT.cfg_avdd_en = true; + 300130c: fec42703 lw a4,-20(s0) + 3001310: 65872783 lw a5,1624(a4) + 3001314: 0017e793 ori a5,a5,1 + 3001318: 64f72c23 sw a5,1624(a4) +} + 300131c: 0001 nop + 300131e: 40f2 lw ra,28(sp) + 3001320: 4462 lw s0,24(sp) + 3001322: 6105 addi sp,sp,32 + 3001324: 8082 ret + +03001326 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt0(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001326: 7179 addi sp,sp,-48 + 3001328: d606 sw ra,44(sp) + 300132a: d422 sw s0,40(sp) + 300132c: 1800 addi s0,sp,48 + 300132e: fca42e23 sw a0,-36(s0) + 3001332: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001336: fdc42703 lw a4,-36(s0) + 300133a: 180007b7 lui a5,0x18000 + 300133e: 00f70b63 beq a4,a5,3001354 + 3001342: 6785 lui a5,0x1 + 3001344: 87978593 addi a1,a5,-1927 # 879 + 3001348: 030067b7 lui a5,0x3006 + 300134c: 7b478513 addi a0,a5,1972 # 30067b4 + 3001350: 2d0d jal ra,3001982 + 3001352: a001 j 3001352 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 3001354: fd842503 lw a0,-40(s0) + 3001358: 3dc1 jal ra,3001228 + 300135a: 87aa mv a5,a0 + 300135c: 0017c793 xori a5,a5,1 + 3001360: 9f81 uxtb a5 + 3001362: cb91 beqz a5,3001376 + 3001364: 6785 lui a5,0x1 + 3001366: 87a78593 addi a1,a5,-1926 # 87a + 300136a: 030067b7 lui a5,0x3006 + 300136e: 7b478513 addi a0,a5,1972 # 30067b4 + 3001372: 2d01 jal ra,3001982 + 3001374: a01d j 300139a + unsigned int shiftBit = (unsigned int)socx; + 3001376: fd842783 lw a5,-40(s0) + 300137a: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 300137e: fdc42783 lw a5,-36(s0) + 3001382: 2b07a703 lw a4,688(a5) + 3001386: 4685 li a3,1 + 3001388: fec42783 lw a5,-20(s0) + 300138c: 00f697b3 sll a5,a3,a5 + 3001390: 8f5d or a4,a4,a5 + 3001392: fdc42783 lw a5,-36(s0) + 3001396: 2ae7a823 sw a4,688(a5) +} + 300139a: 50b2 lw ra,44(sp) + 300139c: 5422 lw s0,40(sp) + 300139e: 6145 addi sp,sp,48 + 30013a0: 8082 ret + +030013a2 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt1(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30013a2: 7179 addi sp,sp,-48 + 30013a4: d606 sw ra,44(sp) + 30013a6: d422 sw s0,40(sp) + 30013a8: 1800 addi s0,sp,48 + 30013aa: fca42e23 sw a0,-36(s0) + 30013ae: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30013b2: fdc42703 lw a4,-36(s0) + 30013b6: 180007b7 lui a5,0x18000 + 30013ba: 00f70b63 beq a4,a5,30013d0 + 30013be: 6785 lui a5,0x1 + 30013c0: 89478593 addi a1,a5,-1900 # 894 + 30013c4: 030067b7 lui a5,0x3006 + 30013c8: 7b478513 addi a0,a5,1972 # 30067b4 + 30013cc: 2b5d jal ra,3001982 + 30013ce: a001 j 30013ce + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30013d0: fd842503 lw a0,-40(s0) + 30013d4: 3d91 jal ra,3001228 + 30013d6: 87aa mv a5,a0 + 30013d8: 0017c793 xori a5,a5,1 + 30013dc: 9f81 uxtb a5 + 30013de: cb91 beqz a5,30013f2 + 30013e0: 6785 lui a5,0x1 + 30013e2: 89578593 addi a1,a5,-1899 # 895 + 30013e6: 030067b7 lui a5,0x3006 + 30013ea: 7b478513 addi a0,a5,1972 # 30067b4 + 30013ee: 2b51 jal ra,3001982 + 30013f0: a025 j 3001418 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30013f2: fd842783 lw a5,-40(s0) + 30013f6: 07c1 addi a5,a5,16 + 30013f8: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 30013fc: fdc42783 lw a5,-36(s0) + 3001400: 2b07a703 lw a4,688(a5) + 3001404: 4685 li a3,1 + 3001406: fec42783 lw a5,-20(s0) + 300140a: 00f697b3 sll a5,a3,a5 + 300140e: 8f5d or a4,a4,a5 + 3001410: fdc42783 lw a5,-36(s0) + 3001414: 2ae7a823 sw a4,688(a5) +} + 3001418: 50b2 lw ra,44(sp) + 300141a: 5422 lw s0,40(sp) + 300141c: 6145 addi sp,sp,48 + 300141e: 8082 ret + +03001420 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt2(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001420: 7179 addi sp,sp,-48 + 3001422: d606 sw ra,44(sp) + 3001424: d422 sw s0,40(sp) + 3001426: 1800 addi s0,sp,48 + 3001428: fca42e23 sw a0,-36(s0) + 300142c: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001430: fdc42703 lw a4,-36(s0) + 3001434: 180007b7 lui a5,0x18000 + 3001438: 00f70b63 beq a4,a5,300144e + 300143c: 6785 lui a5,0x1 + 300143e: 8af78593 addi a1,a5,-1873 # 8af + 3001442: 030067b7 lui a5,0x3006 + 3001446: 7b478513 addi a0,a5,1972 # 30067b4 + 300144a: 2b25 jal ra,3001982 + 300144c: a001 j 300144c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300144e: fd842503 lw a0,-40(s0) + 3001452: 3bd9 jal ra,3001228 + 3001454: 87aa mv a5,a0 + 3001456: 0017c793 xori a5,a5,1 + 300145a: 9f81 uxtb a5 + 300145c: cb91 beqz a5,3001470 + 300145e: 6785 lui a5,0x1 + 3001460: 8b078593 addi a1,a5,-1872 # 8b0 + 3001464: 030067b7 lui a5,0x3006 + 3001468: 7b478513 addi a0,a5,1972 # 30067b4 + 300146c: 2b19 jal ra,3001982 + 300146e: a01d j 3001494 + unsigned int shiftBit = (unsigned int)socx; + 3001470: fd842783 lw a5,-40(s0) + 3001474: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 3001478: fdc42783 lw a5,-36(s0) + 300147c: 2b47a703 lw a4,692(a5) + 3001480: 4685 li a3,1 + 3001482: fec42783 lw a5,-20(s0) + 3001486: 00f697b3 sll a5,a3,a5 + 300148a: 8f5d or a4,a4,a5 + 300148c: fdc42783 lw a5,-36(s0) + 3001490: 2ae7aa23 sw a4,692(a5) +} + 3001494: 50b2 lw ra,44(sp) + 3001496: 5422 lw s0,40(sp) + 3001498: 6145 addi sp,sp,48 + 300149a: 8082 ret + +0300149c : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt3(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300149c: 7179 addi sp,sp,-48 + 300149e: d606 sw ra,44(sp) + 30014a0: d422 sw s0,40(sp) + 30014a2: 1800 addi s0,sp,48 + 30014a4: fca42e23 sw a0,-36(s0) + 30014a8: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30014ac: fdc42703 lw a4,-36(s0) + 30014b0: 180007b7 lui a5,0x18000 + 30014b4: 00f70b63 beq a4,a5,30014ca + 30014b8: 6785 lui a5,0x1 + 30014ba: 8ca78593 addi a1,a5,-1846 # 8ca + 30014be: 030067b7 lui a5,0x3006 + 30014c2: 7b478513 addi a0,a5,1972 # 30067b4 + 30014c6: 2975 jal ra,3001982 + 30014c8: a001 j 30014c8 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30014ca: fd842503 lw a0,-40(s0) + 30014ce: 3ba9 jal ra,3001228 + 30014d0: 87aa mv a5,a0 + 30014d2: 0017c793 xori a5,a5,1 + 30014d6: 9f81 uxtb a5 + 30014d8: cb91 beqz a5,30014ec + 30014da: 6785 lui a5,0x1 + 30014dc: 8cb78593 addi a1,a5,-1845 # 8cb + 30014e0: 030067b7 lui a5,0x3006 + 30014e4: 7b478513 addi a0,a5,1972 # 30067b4 + 30014e8: 2969 jal ra,3001982 + 30014ea: a025 j 3001512 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30014ec: fd842783 lw a5,-40(s0) + 30014f0: 07c1 addi a5,a5,16 + 30014f2: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 30014f6: fdc42783 lw a5,-36(s0) + 30014fa: 2b47a703 lw a4,692(a5) + 30014fe: 4685 li a3,1 + 3001500: fec42783 lw a5,-20(s0) + 3001504: 00f697b3 sll a5,a3,a5 + 3001508: 8f5d or a4,a4,a5 + 300150a: fdc42783 lw a5,-36(s0) + 300150e: 2ae7aa23 sw a4,692(a5) +} + 3001512: 50b2 lw ra,44(sp) + 3001514: 5422 lw s0,40(sp) + 3001516: 6145 addi sp,sp,48 + 3001518: 8082 ret + +0300151a : + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + 300151a: 1101 addi sp,sp,-32 + 300151c: ce06 sw ra,28(sp) + 300151e: cc22 sw s0,24(sp) + 3001520: 1000 addi s0,sp,32 + 3001522: fea42623 sw a0,-20(s0) + 3001526: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300152a: fec42703 lw a4,-20(s0) + 300152e: 180007b7 lui a5,0x18000 + 3001532: 00f70b63 beq a4,a5,3001548 + 3001536: 6785 lui a5,0x1 + 3001538: 8e578593 addi a1,a5,-1819 # 8e5 + 300153c: 030067b7 lui a5,0x3006 + 3001540: 7b478513 addi a0,a5,1972 # 30067b4 + 3001544: 293d jal ra,3001982 + 3001546: a001 j 3001546 + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + 3001548: fe842503 lw a0,-24(s0) + 300154c: 39e5 jal ra,3001244 + 300154e: 87aa mv a5,a0 + 3001550: 0017c793 xori a5,a5,1 + 3001554: 9f81 uxtb a5 + 3001556: cb91 beqz a5,300156a + 3001558: 6785 lui a5,0x1 + 300155a: 8e678593 addi a1,a5,-1818 # 8e6 + 300155e: 030067b7 lui a5,0x3006 + 3001562: 7b478513 addi a0,a5,1972 # 30067b4 + 3001566: 2931 jal ra,3001982 + 3001568: a839 j 3001586 + adcx->ADC_DATA_FLAG_MASK.reg |= (1U << (unsigned int)intx); + 300156a: fec42783 lw a5,-20(s0) + 300156e: 2c07a703 lw a4,704(a5) + 3001572: 4685 li a3,1 + 3001574: fe842783 lw a5,-24(s0) + 3001578: 00f697b3 sll a5,a3,a5 + 300157c: 8f5d or a4,a4,a5 + 300157e: fec42783 lw a5,-20(s0) + 3001582: 2ce7a023 sw a4,704(a5) +} + 3001586: 40f2 lw ra,28(sp) + 3001588: 4462 lw s0,24(sp) + 300158a: 6105 addi sp,sp,32 + 300158c: 8082 ret + +0300158e : + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_ClearIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + 300158e: 1101 addi sp,sp,-32 + 3001590: ce06 sw ra,28(sp) + 3001592: cc22 sw s0,24(sp) + 3001594: 1000 addi s0,sp,32 + 3001596: fea42623 sw a0,-20(s0) + 300159a: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300159e: fec42703 lw a4,-20(s0) + 30015a2: 180007b7 lui a5,0x18000 + 30015a6: 00f70b63 beq a4,a5,30015bc + 30015aa: 6785 lui a5,0x1 + 30015ac: 8ff78593 addi a1,a5,-1793 # 8ff + 30015b0: 030067b7 lui a5,0x3006 + 30015b4: 7b478513 addi a0,a5,1972 # 30067b4 + 30015b8: 26e9 jal ra,3001982 + 30015ba: a001 j 30015ba + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + 30015bc: fe842503 lw a0,-24(s0) + 30015c0: 3151 jal ra,3001244 + 30015c2: 87aa mv a5,a0 + 30015c4: 0017c793 xori a5,a5,1 + 30015c8: 9f81 uxtb a5 + 30015ca: cb91 beqz a5,30015de + 30015cc: 6785 lui a5,0x1 + 30015ce: 90078593 addi a1,a5,-1792 # 900 + 30015d2: 030067b7 lui a5,0x3006 + 30015d6: 7b478513 addi a0,a5,1972 # 30067b4 + 30015da: 2665 jal ra,3001982 + 30015dc: a811 j 30015f0 + adcx->ADC_INT_DATA_FLAG.reg = (1U << (unsigned int)intx); + 30015de: 4705 li a4,1 + 30015e0: fe842783 lw a5,-24(s0) + 30015e4: 00f71733 sll a4,a4,a5 + 30015e8: fec42783 lw a5,-20(s0) + 30015ec: 2ae7ac23 sw a4,696(a5) +} + 30015f0: 40f2 lw ra,28(sp) + 30015f2: 4462 lw s0,24(sp) + 30015f4: 6105 addi sp,sp,32 + 30015f6: 8082 ret + +030015f8 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval addr, the base address of the SOC registers. + */ +static unsigned int ADC_GetCTRLAddr(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30015f8: 7179 addi sp,sp,-48 + 30015fa: d622 sw s0,44(sp) + 30015fc: 1800 addi s0,sp,48 + 30015fe: fca42e23 sw a0,-36(s0) + 3001602: fcb42c23 sw a1,-40(s0) + unsigned int addr; + addr = (uintptr_t)(void *)&(adcx->ADC_SOC0_CFG); + 3001606: fdc42783 lw a5,-36(s0) + 300160a: 10078793 addi a5,a5,256 + 300160e: fef42623 sw a5,-20(s0) + addr += ((unsigned int)socx * 4); /* Register base address difference 4 */ + 3001612: fd842783 lw a5,-40(s0) + 3001616: 078a slli a5,a5,0x2 + 3001618: fec42703 lw a4,-20(s0) + 300161c: 97ba add a5,a5,a4 + 300161e: fef42623 sw a5,-20(s0) + return addr; + 3001622: fec42783 lw a5,-20(s0) +} + 3001626: 853e mv a0,a5 + 3001628: 5432 lw s0,44(sp) + 300162a: 6145 addi sp,sp,48 + 300162c: 8082 ret + +0300162e : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param input ADC input, @ref ADC_Input. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelectChannel(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_Input input) +{ + 300162e: 7179 addi sp,sp,-48 + 3001630: d606 sw ra,44(sp) + 3001632: d422 sw s0,40(sp) + 3001634: 1800 addi s0,sp,48 + 3001636: fca42e23 sw a0,-36(s0) + 300163a: fcb42c23 sw a1,-40(s0) + 300163e: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001642: fdc42703 lw a4,-36(s0) + 3001646: 180007b7 lui a5,0x18000 + 300164a: 00f70b63 beq a4,a5,3001660 + 300164e: 6785 lui a5,0x1 + 3001650: 91c78593 addi a1,a5,-1764 # 91c + 3001654: 030067b7 lui a5,0x3006 + 3001658: 7b478513 addi a0,a5,1972 # 30067b4 + 300165c: 261d jal ra,3001982 + 300165e: a001 j 300165e + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCSampleChannel(input)); + 3001660: fd842503 lw a0,-40(s0) + 3001664: 36d1 jal ra,3001228 + 3001666: 87aa mv a5,a0 + 3001668: 0017c793 xori a5,a5,1 + 300166c: 9f81 uxtb a5 + 300166e: eb89 bnez a5,3001680 + 3001670: fd442503 lw a0,-44(s0) + 3001674: 3e61 jal ra,300120c + 3001676: 87aa mv a5,a0 + 3001678: 0017c793 xori a5,a5,1 + 300167c: 9f81 uxtb a5 + 300167e: cb91 beqz a5,3001692 + 3001680: 6785 lui a5,0x1 + 3001682: 91d78593 addi a1,a5,-1763 # 91d + 3001686: 030067b7 lui a5,0x3006 + 300168a: 7b478513 addi a0,a5,1972 # 30067b4 + 300168e: 2cd5 jal ra,3001982 + 3001690: a091 j 30016d4 + ADC_SOC0_CFG_REG *soc = NULL; + 3001692: fe042623 sw zero,-20(s0) + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Get the Address After Translation */ + 3001696: fd842583 lw a1,-40(s0) + 300169a: fdc42503 lw a0,-36(s0) + 300169e: 3fa9 jal ra,30015f8 + 30016a0: fea42423 sw a0,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30016a4: fe842783 lw a5,-24(s0) + 30016a8: fef42623 sw a5,-20(s0) + soc->BIT.cfg_soc0_ch_sel = (unsigned int)input; + 30016ac: fd442783 lw a5,-44(s0) + 30016b0: 8bfd andi a5,a5,31 + 30016b2: 0ff7f693 andi a3,a5,255 + 30016b6: fec42703 lw a4,-20(s0) + 30016ba: 431c lw a5,0(a4) + 30016bc: 8afd andi a3,a3,31 + 30016be: 9b81 andi a5,a5,-32 + 30016c0: 8fd5 or a5,a5,a3 + 30016c2: c31c sw a5,0(a4) + if (input == ADC_CH_ADCINA18) { + 30016c4: fd442703 lw a4,-44(s0) + 30016c8: 47c9 li a5,18 + 30016ca: 00f71563 bne a4,a5,30016d4 + DCL_ADC_EnableAvddChannel(adcx); + 30016ce: fdc42503 lw a0,-36(s0) + 30016d2: 3901 jal ra,30012e2 + } +} + 30016d4: 50b2 lw ra,44(sp) + 30016d6: 5422 lw s0,40(sp) + 30016d8: 6145 addi sp,sp,48 + 30016da: 8082 ret + +030016dc : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param trig Source of trigger, @ref ADC_TrigSource. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelcetTrigSource(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_TrigSource trig) +{ + 30016dc: 7179 addi sp,sp,-48 + 30016de: d606 sw ra,44(sp) + 30016e0: d422 sw s0,40(sp) + 30016e2: 1800 addi s0,sp,48 + 30016e4: fca42e23 sw a0,-36(s0) + 30016e8: fcb42c23 sw a1,-40(s0) + 30016ec: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30016f0: fdc42703 lw a4,-36(s0) + 30016f4: 180007b7 lui a5,0x18000 + 30016f8: 00f70b63 beq a4,a5,300170e + 30016fc: 6785 lui a5,0x1 + 30016fe: 93078593 addi a1,a5,-1744 # 930 + 3001702: 030067b7 lui a5,0x3006 + 3001706: 7b478513 addi a0,a5,1972 # 30067b4 + 300170a: 2ca5 jal ra,3001982 + 300170c: a001 j 300170c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCTrigSource(trig)); + 300170e: fd842503 lw a0,-40(s0) + 3001712: 3e19 jal ra,3001228 + 3001714: 87aa mv a5,a0 + 3001716: 0017c793 xori a5,a5,1 + 300171a: 9f81 uxtb a5 + 300171c: eb89 bnez a5,300172e + 300171e: fd442503 lw a0,-44(s0) + 3001722: 3e3d jal ra,3001260 + 3001724: 87aa mv a5,a0 + 3001726: 0017c793 xori a5,a5,1 + 300172a: 9f81 uxtb a5 + 300172c: cb91 beqz a5,3001740 + 300172e: 6785 lui a5,0x1 + 3001730: 93178593 addi a1,a5,-1743 # 931 + 3001734: 030067b7 lui a5,0x3006 + 3001738: 7b478513 addi a0,a5,1972 # 30067b4 + 300173c: 2499 jal ra,3001982 + 300173e: a835 j 300177a + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtaining the Address for Configuring the SOC */ + 3001740: fd842583 lw a1,-40(s0) + 3001744: fdc42503 lw a0,-36(s0) + 3001748: 3d45 jal ra,30015f8 + 300174a: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 300174e: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 3001752: fec42783 lw a5,-20(s0) + 3001756: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_trig_sel = (unsigned int)trig; + 300175a: fd442783 lw a5,-44(s0) + 300175e: 8bfd andi a5,a5,31 + 3001760: 0ff7f693 andi a3,a5,255 + 3001764: fe842703 lw a4,-24(s0) + 3001768: 431c lw a5,0(a4) + 300176a: 8afd andi a3,a3,31 + 300176c: 06a6 slli a3,a3,0x9 + 300176e: 7671 lui a2,0xffffc + 3001770: 1ff60613 addi a2,a2,511 # ffffc1ff + 3001774: 8ff1 and a5,a5,a2 + 3001776: 8fd5 or a5,a5,a3 + 3001778: c31c sw a5,0(a4) +} + 300177a: 50b2 lw ra,44(sp) + 300177c: 5422 lw s0,40(sp) + 300177e: 6145 addi sp,sp,48 + 3001780: 8082 ret + +03001782 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param acqps Capacitor charging time. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetAcqps(ADC_RegStruct * const adcx, ADC_SOCNumber socx, unsigned int acqps) +{ + 3001782: 7179 addi sp,sp,-48 + 3001784: d606 sw ra,44(sp) + 3001786: d422 sw s0,40(sp) + 3001788: 1800 addi s0,sp,48 + 300178a: fca42e23 sw a0,-36(s0) + 300178e: fcb42c23 sw a1,-40(s0) + 3001792: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001796: fdc42703 lw a4,-36(s0) + 300179a: 180007b7 lui a5,0x18000 + 300179e: 00f70b63 beq a4,a5,30017b4 + 30017a2: 6785 lui a5,0x1 + 30017a4: 94178593 addi a1,a5,-1727 # 941 + 30017a8: 030067b7 lui a5,0x3006 + 30017ac: 7b478513 addi a0,a5,1972 # 30067b4 + 30017b0: 2ac9 jal ra,3001982 + 30017b2: a001 j 30017b2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30017b4: fd842503 lw a0,-40(s0) + 30017b8: 3c85 jal ra,3001228 + 30017ba: 87aa mv a5,a0 + 30017bc: 0017c793 xori a5,a5,1 + 30017c0: 9f81 uxtb a5 + 30017c2: cb91 beqz a5,30017d6 + 30017c4: 6785 lui a5,0x1 + 30017c6: 94278593 addi a1,a5,-1726 # 942 + 30017ca: 030067b7 lui a5,0x3006 + 30017ce: 7b478513 addi a0,a5,1972 # 30067b4 + 30017d2: 2a45 jal ra,3001982 + 30017d4: a891 j 3001828 + ADC_PARAM_CHECK_NO_RET(acqps <= 15); /* The value of acqps ranges from 0 to 15 */ + 30017d6: fd442703 lw a4,-44(s0) + 30017da: 47bd li a5,15 + 30017dc: 00e7fb63 bgeu a5,a4,30017f2 + 30017e0: 6785 lui a5,0x1 + 30017e2: 94378593 addi a1,a5,-1725 # 943 + 30017e6: 030067b7 lui a5,0x3006 + 30017ea: 7b478513 addi a0,a5,1972 # 30067b4 + 30017ee: 2a51 jal ra,3001982 + 30017f0: a825 j 3001828 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); + 30017f2: fd842583 lw a1,-40(s0) + 30017f6: fdc42503 lw a0,-36(s0) + 30017fa: 3bfd jal ra,30015f8 + 30017fc: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 3001800: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 3001804: fec42783 lw a5,-20(s0) + 3001808: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_samptime_sel = acqps; + 300180c: fd442783 lw a5,-44(s0) + 3001810: 8bbd andi a5,a5,15 + 3001812: 0ff7f693 andi a3,a5,255 + 3001816: fe842703 lw a4,-24(s0) + 300181a: 431c lw a5,0(a4) + 300181c: 8abd andi a3,a3,15 + 300181e: 0696 slli a3,a3,0x5 + 3001820: e1f7f793 andi a5,a5,-481 + 3001824: 8fd5 or a5,a5,a3 + 3001826: c31c sw a5,0(a4) +} + 3001828: 50b2 lw ra,44(sp) + 300182a: 5422 lw s0,40(sp) + 300182c: 6145 addi sp,sp,48 + 300182e: 8082 ret + +03001830 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SOCxSoftTrigger(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001830: 1101 addi sp,sp,-32 + 3001832: ce06 sw ra,28(sp) + 3001834: cc22 sw s0,24(sp) + 3001836: 1000 addi s0,sp,32 + 3001838: fea42623 sw a0,-20(s0) + 300183c: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001840: fec42703 lw a4,-20(s0) + 3001844: 180007b7 lui a5,0x18000 + 3001848: 00f70b63 beq a4,a5,300185e + 300184c: 6785 lui a5,0x1 + 300184e: 95278593 addi a1,a5,-1710 # 952 + 3001852: 030067b7 lui a5,0x3006 + 3001856: 7b478513 addi a0,a5,1972 # 30067b4 + 300185a: 2225 jal ra,3001982 + 300185c: a001 j 300185c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300185e: fe842503 lw a0,-24(s0) + 3001862: 32d9 jal ra,3001228 + 3001864: 87aa mv a5,a0 + 3001866: 0017c793 xori a5,a5,1 + 300186a: 9f81 uxtb a5 + 300186c: cb91 beqz a5,3001880 + 300186e: 6785 lui a5,0x1 + 3001870: 95378593 addi a1,a5,-1709 # 953 + 3001874: 030067b7 lui a5,0x3006 + 3001878: 7b478513 addi a0,a5,1972 # 30067b4 + 300187c: 2219 jal ra,3001982 + 300187e: a839 j 300189c + adcx->ADC_SOFT_TRIG.reg |= (1U << (unsigned int)socx); + 3001880: fec42783 lw a5,-20(s0) + 3001884: 1607a703 lw a4,352(a5) + 3001888: 4685 li a3,1 + 300188a: fe842783 lw a5,-24(s0) + 300188e: 00f697b3 sll a5,a3,a5 + 3001892: 8f5d or a4,a4,a5 + 3001894: fec42783 lw a5,-20(s0) + 3001898: 16e7a023 sw a4,352(a5) +} + 300189c: 40f2 lw ra,28(sp) + 300189e: 4462 lw s0,24(sp) + 30018a0: 6105 addi sp,sp,32 + 30018a2: 8082 ret + +030018a4 : + * @param adcx ADC register base address. + * @param priorityMode Mode of SOC priority, @ref ADC_PriorityMode. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetPriority(ADC_RegStruct * const adcx, ADC_PriorityMode priorityMode) +{ + 30018a4: 1101 addi sp,sp,-32 + 30018a6: ce06 sw ra,28(sp) + 30018a8: cc22 sw s0,24(sp) + 30018aa: 1000 addi s0,sp,32 + 30018ac: fea42623 sw a0,-20(s0) + 30018b0: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30018b4: fec42703 lw a4,-20(s0) + 30018b8: 180007b7 lui a5,0x18000 + 30018bc: 00f70b63 beq a4,a5,30018d2 + 30018c0: 6785 lui a5,0x1 + 30018c2: 96c78593 addi a1,a5,-1684 # 96c + 30018c6: 030067b7 lui a5,0x3006 + 30018ca: 7b478513 addi a0,a5,1972 # 30067b4 + 30018ce: 2855 jal ra,3001982 + 30018d0: a001 j 30018d0 + ADC_PARAM_CHECK_NO_RET(IsADCPriorityMode(priorityMode)); + 30018d2: fe842503 lw a0,-24(s0) + 30018d6: 3ac9 jal ra,30012a8 + 30018d8: 87aa mv a5,a0 + 30018da: 0017c793 xori a5,a5,1 + 30018de: 9f81 uxtb a5 + 30018e0: cb91 beqz a5,30018f4 + 30018e2: 6785 lui a5,0x1 + 30018e4: 96d78593 addi a1,a5,-1683 # 96d + 30018e8: 030067b7 lui a5,0x3006 + 30018ec: 7b478513 addi a0,a5,1972 # 30067b4 + 30018f0: 2849 jal ra,3001982 + 30018f2: a039 j 3001900 + adcx->ADC_ARBT0.reg = priorityMode; + 30018f4: fec42783 lw a5,-20(s0) + 30018f8: fe842703 lw a4,-24(s0) + 30018fc: 20e7a023 sw a4,512(a5) +} + 3001900: 40f2 lw ra,28(sp) + 3001902: 4462 lw s0,24(sp) + 3001904: 6105 addi sp,sp,32 + 3001906: 8082 ret + +03001908 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval unsigned int, result. + */ +static inline unsigned int DCL_ADC_ReadSOCxResult(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001908: 7179 addi sp,sp,-48 + 300190a: d606 sw ra,44(sp) + 300190c: d422 sw s0,40(sp) + 300190e: 1800 addi s0,sp,48 + 3001910: fca42e23 sw a0,-36(s0) + 3001914: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001918: fdc42703 lw a4,-36(s0) + 300191c: 180007b7 lui a5,0x18000 + 3001920: 00f70b63 beq a4,a5,3001936 + 3001924: 6785 lui a5,0x1 + 3001926: a8778593 addi a1,a5,-1401 # a87 + 300192a: 030067b7 lui a5,0x3006 + 300192e: 7b478513 addi a0,a5,1972 # 30067b4 + 3001932: 2881 jal ra,3001982 + 3001934: a001 j 3001934 + ADC_ASSERT_PARAM(IsADCSOCx(socx)); + 3001936: fd842503 lw a0,-40(s0) + 300193a: 30fd jal ra,3001228 + 300193c: 87aa mv a5,a0 + 300193e: 0017c793 xori a5,a5,1 + 3001942: 9f81 uxtb a5 + 3001944: cb91 beqz a5,3001958 + 3001946: 6785 lui a5,0x1 + 3001948: a8878593 addi a1,a5,-1400 # a88 + 300194c: 030067b7 lui a5,0x3006 + 3001950: 7b478513 addi a0,a5,1972 # 30067b4 + 3001954: 203d jal ra,3001982 + 3001956: a001 j 3001956 + ADC_RESULT0_REG *result; + uintptr_t addr = (uintptr_t)(void *)adcx; + 3001958: fdc42783 lw a5,-36(s0) + 300195c: fef42623 sw a5,-20(s0) + /* The address interval of the result register is 4 */ + result = (ADC_RESULT0_REG *)(void *)(addr + 4 * (unsigned int)socx); + 3001960: fd842783 lw a5,-40(s0) + 3001964: 00279713 slli a4,a5,0x2 + 3001968: fec42783 lw a5,-20(s0) + 300196c: 97ba add a5,a5,a4 + 300196e: fef42423 sw a5,-24(s0) + return result->reg; + 3001972: fe842783 lw a5,-24(s0) + 3001976: 439c lw a5,0(a5) +} + 3001978: 853e mv a0,a5 + 300197a: 50b2 lw ra,44(sp) + 300197c: 5422 lw s0,40(sp) + 300197e: 6145 addi sp,sp,48 + 3001980: 8082 ret + +03001982 : + 3001982: 0650006f j 30021e6 + +03001986 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001986: 7179 addi sp,sp,-48 + 3001988: d606 sw ra,44(sp) + 300198a: d422 sw s0,40(sp) + 300198c: 1800 addi s0,sp,48 + 300198e: fca42e23 sw a0,-36(s0) + 3001992: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001996: fdc42703 lw a4,-36(s0) + 300199a: 180007b7 lui a5,0x18000 + 300199e: 00f70b63 beq a4,a5,30019b4 + 30019a2: 6785 lui a5,0x1 + 30019a4: b4678593 addi a1,a5,-1210 # b46 + 30019a8: 030067b7 lui a5,0x3006 + 30019ac: 7b478513 addi a0,a5,1972 # 30067b4 + 30019b0: 3fc9 jal ra,3001982 + 30019b2: a001 j 30019b2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30019b4: fd842503 lw a0,-40(s0) + 30019b8: 3885 jal ra,3001228 + 30019ba: 87aa mv a5,a0 + 30019bc: 0017c793 xori a5,a5,1 + 30019c0: 9f81 uxtb a5 + 30019c2: cb91 beqz a5,30019d6 + 30019c4: 6785 lui a5,0x1 + 30019c6: b4778593 addi a1,a5,-1209 # b47 + 30019ca: 030067b7 lui a5,0x3006 + 30019ce: 7b478513 addi a0,a5,1972 # 30067b4 + 30019d2: 3f45 jal ra,3001982 + 30019d4: a025 j 30019fc + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 30019d6: fd842583 lw a1,-40(s0) + 30019da: fdc42503 lw a0,-36(s0) + 30019de: 3929 jal ra,30015f8 + 30019e0: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 30019e4: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30019e8: fec42783 lw a5,-20(s0) + 30019ec: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_ENABLE; + 30019f0: fe842703 lw a4,-24(s0) + 30019f4: 431c lw a5,0(a4) + 30019f6: 6691 lui a3,0x4 + 30019f8: 8fd5 or a5,a5,a3 + 30019fa: c31c sw a5,0(a4) +} + 30019fc: 50b2 lw ra,44(sp) + 30019fe: 5422 lw s0,40(sp) + 3001a00: 6145 addi sp,sp,48 + 3001a02: 8082 ret + +03001a04 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_DisableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001a04: 7179 addi sp,sp,-48 + 3001a06: d606 sw ra,44(sp) + 3001a08: d422 sw s0,40(sp) + 3001a0a: 1800 addi s0,sp,48 + 3001a0c: fca42e23 sw a0,-36(s0) + 3001a10: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001a14: fdc42703 lw a4,-36(s0) + 3001a18: 180007b7 lui a5,0x18000 + 3001a1c: 00f70b63 beq a4,a5,3001a32 + 3001a20: 6785 lui a5,0x1 + 3001a22: b5678593 addi a1,a5,-1194 # b56 + 3001a26: 030067b7 lui a5,0x3006 + 3001a2a: 7b478513 addi a0,a5,1972 # 30067b4 + 3001a2e: 3f91 jal ra,3001982 + 3001a30: a001 j 3001a30 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 3001a32: fd842503 lw a0,-40(s0) + 3001a36: ff2ff0ef jal ra,3001228 + 3001a3a: 87aa mv a5,a0 + 3001a3c: 0017c793 xori a5,a5,1 + 3001a40: 9f81 uxtb a5 + 3001a42: cb91 beqz a5,3001a56 + 3001a44: 6785 lui a5,0x1 + 3001a46: b5778593 addi a1,a5,-1193 # b57 + 3001a4a: 030067b7 lui a5,0x3006 + 3001a4e: 7b478513 addi a0,a5,1972 # 30067b4 + 3001a52: 3f05 jal ra,3001982 + 3001a54: a02d j 3001a7e + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 3001a56: fd842583 lw a1,-40(s0) + 3001a5a: fdc42503 lw a0,-36(s0) + 3001a5e: 3e69 jal ra,30015f8 + 3001a60: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 3001a64: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 3001a68: fec42783 lw a5,-20(s0) + 3001a6c: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_DISABLE; + 3001a70: fe842703 lw a4,-24(s0) + 3001a74: 431c lw a5,0(a4) + 3001a76: 76f1 lui a3,0xffffc + 3001a78: 16fd addi a3,a3,-1 # ffffbfff + 3001a7a: 8ff5 and a5,a5,a3 + 3001a7c: c31c sw a5,0(a4) +} + 3001a7e: 50b2 lw ra,44(sp) + 3001a80: 5422 lw s0,40(sp) + 3001a82: 6145 addi sp,sp,48 + 3001a84: 8082 ret + +03001a86 : + * triggered at least 100 us later. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_Init(ADC_Handle *adcHandle) +{ + 3001a86: 1101 addi sp,sp,-32 + 3001a88: ce06 sw ra,28(sp) + 3001a8a: cc22 sw s0,24(sp) + 3001a8c: 1000 addi s0,sp,32 + 3001a8e: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001a92: fec42783 lw a5,-20(s0) + 3001a96: eb89 bnez a5,3001aa8 + 3001a98: 02c00593 li a1,44 + 3001a9c: 030067b7 lui a5,0x3006 + 3001aa0: 7d078513 addi a0,a5,2000 # 30067d0 + 3001aa4: 3df9 jal ra,3001982 + 3001aa6: a001 j 3001aa6 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001aa8: fec42783 lw a5,-20(s0) + 3001aac: 4398 lw a4,0(a5) + 3001aae: 180007b7 lui a5,0x18000 + 3001ab2: 00f70a63 beq a4,a5,3001ac6 + 3001ab6: 02d00593 li a1,45 + 3001aba: 030067b7 lui a5,0x3006 + 3001abe: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ac2: 35c1 jal ra,3001982 + 3001ac4: a001 j 3001ac4 + ADC_PARAM_CHECK_WITH_RET(IsADCPriorityMode(adcHandle->socPriority) == true, BASE_STATUS_ERROR); + 3001ac6: fec42783 lw a5,-20(s0) + 3001aca: 43dc lw a5,4(a5) + 3001acc: 853e mv a0,a5 + 3001ace: fdaff0ef jal ra,30012a8 + 3001ad2: 87aa mv a5,a0 + 3001ad4: 0017c793 xori a5,a5,1 + 3001ad8: 9f81 uxtb a5 + 3001ada: cb99 beqz a5,3001af0 + 3001adc: 02e00593 li a1,46 + 3001ae0: 030067b7 lui a5,0x3006 + 3001ae4: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ae8: 6fe000ef jal ra,30021e6 + 3001aec: 4785 li a5,1 + 3001aee: a091 j 3001b32 + DCL_ADC_SOCxSetPriority(adcHandle->baseAddress, adcHandle->socPriority); + 3001af0: fec42783 lw a5,-20(s0) + 3001af4: 4398 lw a4,0(a5) + 3001af6: fec42783 lw a5,-20(s0) + 3001afa: 43dc lw a5,4(a5) + 3001afc: 85be mv a1,a5 + 3001afe: 853a mv a0,a4 + 3001b00: 3355 jal ra,30018a4 + adcHandle->baseAddress->ADC_ANA_CTRL0.BIT.cfg_sar_samp_cap_sel = 0x4; /* Set the Number of Sampling Capacitors */ + 3001b02: fec42783 lw a5,-20(s0) + 3001b06: 4398 lw a4,0(a5) + 3001b08: 65472783 lw a5,1620(a4) + 3001b0c: 100006b7 lui a3,0x10000 + 3001b10: 16fd addi a3,a3,-1 # fffffff + 3001b12: 8efd and a3,a3,a5 + 3001b14: 400007b7 lui a5,0x40000 + 3001b18: 8fd5 or a5,a5,a3 + 3001b1a: 64f72a23 sw a5,1620(a4) + adcHandle->baseAddress->ADC_EN.reg = BASE_CFG_ENABLE; /* Enable ADC Controller */ + 3001b1e: fec42783 lw a5,-20(s0) + 3001b22: 439c lw a5,0(a5) + 3001b24: 4705 li a4,1 + 3001b26: 30e7a023 sw a4,768(a5) # 40000300 + BASE_FUNC_DelayUs(100); /* Wait for 100 us until the ADC controller is stable */ + 3001b2a: 06400513 li a0,100 + 3001b2e: 25cd jal ra,3002210 + return BASE_STATUS_OK; + 3001b30: 4781 li a5,0 +} + 3001b32: 853e mv a0,a5 + 3001b34: 40f2 lw ra,28(sp) + 3001b36: 4462 lw s0,24(sp) + 3001b38: 6105 addi sp,sp,32 + 3001b3a: 8082 ret + +03001b3c : + * @param soc ID of SOC(start of conversion), managing the specific sample inputs. + * @param socParam Param struct of SOC. This is related to the peripheral circuit design, @ref SOC_Param. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_ConfigureSoc(ADC_Handle *adcHandle, ADC_SOCNumber soc, SOC_Param *socParam) +{ + 3001b3c: 1101 addi sp,sp,-32 + 3001b3e: ce06 sw ra,28(sp) + 3001b40: cc22 sw s0,24(sp) + 3001b42: 1000 addi s0,sp,32 + 3001b44: fea42623 sw a0,-20(s0) + 3001b48: feb42423 sw a1,-24(s0) + 3001b4c: fec42223 sw a2,-28(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001b50: fec42783 lw a5,-20(s0) + 3001b54: eb89 bnez a5,3001b66 + 3001b56: 04c00593 li a1,76 + 3001b5a: 030067b7 lui a5,0x3006 + 3001b5e: 7d078513 addi a0,a5,2000 # 30067d0 + 3001b62: 2551 jal ra,30021e6 + 3001b64: a001 j 3001b64 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001b66: fec42783 lw a5,-20(s0) + 3001b6a: 4398 lw a4,0(a5) + 3001b6c: 180007b7 lui a5,0x18000 + 3001b70: 00f70a63 beq a4,a5,3001b84 + 3001b74: 04d00593 li a1,77 + 3001b78: 030067b7 lui a5,0x3006 + 3001b7c: 7d078513 addi a0,a5,2000 # 30067d0 + 3001b80: 259d jal ra,30021e6 + 3001b82: a001 j 3001b82 + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001b84: fe842503 lw a0,-24(s0) + 3001b88: ea0ff0ef jal ra,3001228 + 3001b8c: 87aa mv a5,a0 + 3001b8e: 0017c793 xori a5,a5,1 + 3001b92: 9f81 uxtb a5 + 3001b94: cb91 beqz a5,3001ba8 + 3001b96: 04e00593 li a1,78 + 3001b9a: 030067b7 lui a5,0x3006 + 3001b9e: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ba2: 2591 jal ra,30021e6 + 3001ba4: 4785 li a5,1 + 3001ba6: aa3d j 3001ce4 + ADC_ASSERT_PARAM(socParam != NULL); + 3001ba8: fe442783 lw a5,-28(s0) + 3001bac: eb89 bnez a5,3001bbe + 3001bae: 04f00593 li a1,79 + 3001bb2: 030067b7 lui a5,0x3006 + 3001bb6: 7d078513 addi a0,a5,2000 # 30067d0 + 3001bba: 2535 jal ra,30021e6 + 3001bbc: a001 j 3001bbc + ADC_PARAM_CHECK_WITH_RET(IsADCSampleChannel(socParam->adcInput) == true, BASE_STATUS_ERROR); + 3001bbe: fe442783 lw a5,-28(s0) + 3001bc2: 439c lw a5,0(a5) + 3001bc4: 853e mv a0,a5 + 3001bc6: e46ff0ef jal ra,300120c + 3001bca: 87aa mv a5,a0 + 3001bcc: 0017c793 xori a5,a5,1 + 3001bd0: 9f81 uxtb a5 + 3001bd2: cb91 beqz a5,3001be6 + 3001bd4: 05000593 li a1,80 + 3001bd8: 030067b7 lui a5,0x3006 + 3001bdc: 7d078513 addi a0,a5,2000 # 30067d0 + 3001be0: 2519 jal ra,30021e6 + 3001be2: 4785 li a5,1 + 3001be4: a201 j 3001ce4 + ADC_PARAM_CHECK_WITH_RET(IsADCTotalTime(socParam->sampleTotalTime) == true, BASE_STATUS_ERROR); + 3001be6: fe442783 lw a5,-28(s0) + 3001bea: 43dc lw a5,4(a5) + 3001bec: 853e mv a0,a5 + 3001bee: ed8ff0ef jal ra,30012c6 + 3001bf2: 87aa mv a5,a0 + 3001bf4: 0017c793 xori a5,a5,1 + 3001bf8: 9f81 uxtb a5 + 3001bfa: cb91 beqz a5,3001c0e + 3001bfc: 05100593 li a1,81 + 3001c00: 030067b7 lui a5,0x3006 + 3001c04: 7d078513 addi a0,a5,2000 # 30067d0 + 3001c08: 2bf9 jal ra,30021e6 + 3001c0a: 4785 li a5,1 + 3001c0c: a8e1 j 3001ce4 + ADC_PARAM_CHECK_WITH_RET(IsADCTrigSource(socParam->trigSource) == true, BASE_STATUS_ERROR); + 3001c0e: fe442783 lw a5,-28(s0) + 3001c12: 479c lw a5,8(a5) + 3001c14: 853e mv a0,a5 + 3001c16: e4aff0ef jal ra,3001260 + 3001c1a: 87aa mv a5,a0 + 3001c1c: 0017c793 xori a5,a5,1 + 3001c20: 9f81 uxtb a5 + 3001c22: cb91 beqz a5,3001c36 + 3001c24: 05200593 li a1,82 + 3001c28: 030067b7 lui a5,0x3006 + 3001c2c: 7d078513 addi a0,a5,2000 # 30067d0 + 3001c30: 2b5d jal ra,30021e6 + 3001c32: 4785 li a5,1 + 3001c34: a845 j 3001ce4 + ADC_PARAM_CHECK_WITH_RET(IsADCFinishMode(socParam->finishMode) == true, BASE_STATUS_ERROR); + 3001c36: fe442783 lw a5,-28(s0) + 3001c3a: 4b9c lw a5,16(a5) + 3001c3c: 853e mv a0,a5 + 3001c3e: e3eff0ef jal ra,300127c + 3001c42: 87aa mv a5,a0 + 3001c44: 0017c793 xori a5,a5,1 + 3001c48: 9f81 uxtb a5 + 3001c4a: cb91 beqz a5,3001c5e + 3001c4c: 05300593 li a1,83 + 3001c50: 030067b7 lui a5,0x3006 + 3001c54: 7d078513 addi a0,a5,2000 # 30067d0 + 3001c58: 2379 jal ra,30021e6 + 3001c5a: 4785 li a5,1 + 3001c5c: a061 j 3001ce4 + DCL_ADC_SOCxSelectChannel(adcHandle->baseAddress, soc, socParam->adcInput); /* Set channel */ + 3001c5e: fec42783 lw a5,-20(s0) + 3001c62: 4398 lw a4,0(a5) + 3001c64: fe442783 lw a5,-28(s0) + 3001c68: 439c lw a5,0(a5) + 3001c6a: 863e mv a2,a5 + 3001c6c: fe842583 lw a1,-24(s0) + 3001c70: 853a mv a0,a4 + 3001c72: 3a75 jal ra,300162e + DCL_ADC_SOCxSetAcqps(adcHandle->baseAddress, soc, socParam->sampleTotalTime); /* Set sampling time */ + 3001c74: fec42783 lw a5,-20(s0) + 3001c78: 4398 lw a4,0(a5) + 3001c7a: fe442783 lw a5,-28(s0) + 3001c7e: 43dc lw a5,4(a5) + 3001c80: 863e mv a2,a5 + 3001c82: fe842583 lw a1,-24(s0) + 3001c86: 853a mv a0,a4 + 3001c88: 3ced jal ra,3001782 + DCL_ADC_SOCxSelcetTrigSource(adcHandle->baseAddress, soc, socParam->trigSource); /* Set trigger source */ + 3001c8a: fec42783 lw a5,-20(s0) + 3001c8e: 4398 lw a4,0(a5) + 3001c90: fe442783 lw a5,-28(s0) + 3001c94: 479c lw a5,8(a5) + 3001c96: 863e mv a2,a5 + 3001c98: fe842583 lw a1,-24(s0) + 3001c9c: 853a mv a0,a4 + 3001c9e: 3c3d jal ra,30016dc + if (socParam->continueMode == true) { /* Continuous Mode Judgment */ + 3001ca0: fe442783 lw a5,-28(s0) + 3001ca4: 27dc lbu a5,12(a5) + 3001ca6: cb89 beqz a5,3001cb8 + DCL_ADC_EnableSOCxContinue(adcHandle->baseAddress, soc); + 3001ca8: fec42783 lw a5,-20(s0) + 3001cac: 439c lw a5,0(a5) + 3001cae: fe842583 lw a1,-24(s0) + 3001cb2: 853e mv a0,a5 + 3001cb4: 39c9 jal ra,3001986 + 3001cb6: a801 j 3001cc6 + } else { + DCL_ADC_DisableSOCxContinue(adcHandle->baseAddress, soc); + 3001cb8: fec42783 lw a5,-20(s0) + 3001cbc: 439c lw a5,0(a5) + 3001cbe: fe842583 lw a1,-24(s0) + 3001cc2: 853e mv a0,a5 + 3001cc4: 3381 jal ra,3001a04 + } + adcHandle->ADC_SOCxParam[soc].finishMode = socParam->finishMode; + 3001cc6: fe442783 lw a5,-28(s0) + 3001cca: 4b9c lw a5,16(a5) + 3001ccc: 01079713 slli a4,a5,0x10 + 3001cd0: 8341 srli a4,a4,0x10 + 3001cd2: fec42683 lw a3,-20(s0) + 3001cd6: fe842783 lw a5,-24(s0) + 3001cda: 07a1 addi a5,a5,8 + 3001cdc: 0786 slli a5,a5,0x1 + 3001cde: 97b6 add a5,a5,a3 + 3001ce0: a3da sh a4,4(a5) + return BASE_STATUS_OK; + 3001ce2: 4781 li a5,0 +} + 3001ce4: 853e mv a0,a5 + 3001ce6: 40f2 lw ra,28(sp) + 3001ce8: 4462 lw s0,24(sp) + 3001cea: 6105 addi sp,sp,32 + 3001cec: 8082 ret + +03001cee : + * interrupt is reported. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_StartIt(ADC_Handle *adcHandle) +{ + 3001cee: 7179 addi sp,sp,-48 + 3001cf0: d606 sw ra,44(sp) + 3001cf2: d422 sw s0,40(sp) + 3001cf4: 1800 addi s0,sp,48 + 3001cf6: fca42e23 sw a0,-36(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001cfa: fdc42783 lw a5,-36(s0) + 3001cfe: eb89 bnez a5,3001d10 + 3001d00: 0af00593 li a1,175 + 3001d04: 030067b7 lui a5,0x3006 + 3001d08: 7d078513 addi a0,a5,2000 # 30067d0 + 3001d0c: 29e9 jal ra,30021e6 + 3001d0e: a001 j 3001d0e + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001d10: fdc42783 lw a5,-36(s0) + 3001d14: 4398 lw a4,0(a5) + 3001d16: 180007b7 lui a5,0x18000 + 3001d1a: 00f70a63 beq a4,a5,3001d2e + 3001d1e: 0b000593 li a1,176 + 3001d22: 030067b7 lui a5,0x3006 + 3001d26: 7d078513 addi a0,a5,2000 # 30067d0 + 3001d2a: 2975 jal ra,30021e6 + 3001d2c: a001 j 3001d2c + unsigned int intVal = 0; + 3001d2e: fe042423 sw zero,-24(s0) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001d32: fe042623 sw zero,-20(s0) + 3001d36: a859 j 3001dcc + intVal = adcHandle->ADC_SOCxParam[i].finishMode; + 3001d38: fdc42703 lw a4,-36(s0) + 3001d3c: fec42783 lw a5,-20(s0) + 3001d40: 07a1 addi a5,a5,8 + 3001d42: 0786 slli a5,a5,0x1 + 3001d44: 97ba add a5,a5,a4 + 3001d46: 23de lhu a5,4(a5) + 3001d48: fef42423 sw a5,-24(s0) + switch (intVal) { + 3001d4c: fe842783 lw a5,-24(s0) + 3001d50: 4711 li a4,4 + 3001d52: 02e78a63 beq a5,a4,3001d86 + 3001d56: 4711 li a4,4 + 3001d58: 00f76663 bltu a4,a5,3001d64 + 3001d5c: 470d li a4,3 + 3001d5e: 00e78a63 beq a5,a4,3001d72 + break; + case ADC_SOCFINISH_INT3: + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + break; + default: + break; + 3001d62: a085 j 3001dc2 + switch (intVal) { + 3001d64: 4715 li a4,5 + 3001d66: 02e78a63 beq a5,a4,3001d9a + 3001d6a: 4719 li a4,6 + 3001d6c: 04e78163 beq a5,a4,3001dae + break; + 3001d70: a889 j 3001dc2 + DCL_ADC_SetSOCxBlindInt0(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 0 */ + 3001d72: fdc42783 lw a5,-36(s0) + 3001d76: 439c lw a5,0(a5) + 3001d78: fec42703 lw a4,-20(s0) + 3001d7c: 85ba mv a1,a4 + 3001d7e: 853e mv a0,a5 + 3001d80: da6ff0ef jal ra,3001326 + break; + 3001d84: a83d j 3001dc2 + DCL_ADC_SetSOCxBlindInt1(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 1 */ + 3001d86: fdc42783 lw a5,-36(s0) + 3001d8a: 439c lw a5,0(a5) + 3001d8c: fec42703 lw a4,-20(s0) + 3001d90: 85ba mv a1,a4 + 3001d92: 853e mv a0,a5 + 3001d94: e0eff0ef jal ra,30013a2 + break; + 3001d98: a02d j 3001dc2 + DCL_ADC_SetSOCxBlindInt2(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 2 */ + 3001d9a: fdc42783 lw a5,-36(s0) + 3001d9e: 439c lw a5,0(a5) + 3001da0: fec42703 lw a4,-20(s0) + 3001da4: 85ba mv a1,a4 + 3001da6: 853e mv a0,a5 + 3001da8: e78ff0ef jal ra,3001420 + break; + 3001dac: a819 j 3001dc2 + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + 3001dae: fdc42783 lw a5,-36(s0) + 3001db2: 439c lw a5,0(a5) + 3001db4: fec42703 lw a4,-20(s0) + 3001db8: 85ba mv a1,a4 + 3001dba: 853e mv a0,a5 + 3001dbc: ee0ff0ef jal ra,300149c + break; + 3001dc0: 0001 nop + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001dc2: fec42783 lw a5,-20(s0) + 3001dc6: 0785 addi a5,a5,1 + 3001dc8: fef42623 sw a5,-20(s0) + 3001dcc: fec42703 lw a4,-20(s0) + 3001dd0: 47bd li a5,15 + 3001dd2: f6e7d3e3 bge a5,a4,3001d38 + } + } /* Enable ADC Interrupt */ + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER0); + 3001dd6: fdc42783 lw a5,-36(s0) + 3001dda: 439c lw a5,0(a5) + 3001ddc: 4581 li a1,0 + 3001dde: 853e mv a0,a5 + 3001de0: f3aff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER1); + 3001de4: fdc42783 lw a5,-36(s0) + 3001de8: 439c lw a5,0(a5) + 3001dea: 4585 li a1,1 + 3001dec: 853e mv a0,a5 + 3001dee: f2cff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + 3001df2: fdc42783 lw a5,-36(s0) + 3001df6: 439c lw a5,0(a5) + 3001df8: 4589 li a1,2 + 3001dfa: 853e mv a0,a5 + 3001dfc: f1eff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER3); + 3001e00: fdc42783 lw a5,-36(s0) + 3001e04: 439c lw a5,0(a5) + 3001e06: 458d li a1,3 + 3001e08: 853e mv a0,a5 + 3001e0a: f10ff0ef jal ra,300151a + return BASE_STATUS_OK; + 3001e0e: 4781 li a5,0 +} + 3001e10: 853e mv a0,a5 + 3001e12: 50b2 lw ra,44(sp) + 3001e14: 5422 lw s0,40(sp) + 3001e16: 6145 addi sp,sp,48 + 3001e18: 8082 ret + +03001e1a : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_SoftTrigSample(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001e1a: 1101 addi sp,sp,-32 + 3001e1c: ce06 sw ra,28(sp) + 3001e1e: cc22 sw s0,24(sp) + 3001e20: 1000 addi s0,sp,32 + 3001e22: fea42623 sw a0,-20(s0) + 3001e26: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001e2a: fec42783 lw a5,-20(s0) + 3001e2e: eb89 bnez a5,3001e40 + 3001e30: 0e500593 li a1,229 + 3001e34: 030067b7 lui a5,0x3006 + 3001e38: 7d078513 addi a0,a5,2000 # 30067d0 + 3001e3c: 266d jal ra,30021e6 + 3001e3e: a001 j 3001e3e + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001e40: fec42783 lw a5,-20(s0) + 3001e44: 4398 lw a4,0(a5) + 3001e46: 180007b7 lui a5,0x18000 + 3001e4a: 00f70a63 beq a4,a5,3001e5e + 3001e4e: 0e600593 li a1,230 + 3001e52: 030067b7 lui a5,0x3006 + 3001e56: 7d078513 addi a0,a5,2000 # 30067d0 + 3001e5a: 2671 jal ra,30021e6 + 3001e5c: a001 j 3001e5c + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001e5e: fe842503 lw a0,-24(s0) + 3001e62: bc6ff0ef jal ra,3001228 + 3001e66: 87aa mv a5,a0 + 3001e68: 0017c793 xori a5,a5,1 + 3001e6c: 9f81 uxtb a5 + 3001e6e: cb91 beqz a5,3001e82 + 3001e70: 0e700593 li a1,231 + 3001e74: 030067b7 lui a5,0x3006 + 3001e78: 7d078513 addi a0,a5,2000 # 30067d0 + 3001e7c: 26ad jal ra,30021e6 + 3001e7e: 4785 li a5,1 + 3001e80: a809 j 3001e92 + DCL_ADC_SOCxSoftTrigger(adcHandle->baseAddress, soc); /* Software triggers a single SOC */ + 3001e82: fec42783 lw a5,-20(s0) + 3001e86: 439c lw a5,0(a5) + 3001e88: fe842583 lw a1,-24(s0) + 3001e8c: 853e mv a0,a5 + 3001e8e: 324d jal ra,3001830 + return BASE_STATUS_OK; + 3001e90: 4781 li a5,0 +} + 3001e92: 853e mv a0,a5 + 3001e94: 40f2 lw ra,28(sp) + 3001e96: 4462 lw s0,24(sp) + 3001e98: 6105 addi sp,sp,32 + 3001e9a: 8082 ret + +03001e9c : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval unsigned int value of ADC convert result. + */ +unsigned int HAL_ADC_GetConvResult(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001e9c: 1101 addi sp,sp,-32 + 3001e9e: ce06 sw ra,28(sp) + 3001ea0: cc22 sw s0,24(sp) + 3001ea2: 1000 addi s0,sp,32 + 3001ea4: fea42623 sw a0,-20(s0) + 3001ea8: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001eac: fec42783 lw a5,-20(s0) + 3001eb0: eb89 bnez a5,3001ec2 + 3001eb2: 0f400593 li a1,244 + 3001eb6: 030067b7 lui a5,0x3006 + 3001eba: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ebe: 2625 jal ra,30021e6 + 3001ec0: a001 j 3001ec0 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001ec2: fec42783 lw a5,-20(s0) + 3001ec6: 4398 lw a4,0(a5) + 3001ec8: 180007b7 lui a5,0x18000 + 3001ecc: 00f70a63 beq a4,a5,3001ee0 + 3001ed0: 0f500593 li a1,245 + 3001ed4: 030067b7 lui a5,0x3006 + 3001ed8: 7d078513 addi a0,a5,2000 # 30067d0 + 3001edc: 2629 jal ra,30021e6 + 3001ede: a001 j 3001ede + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001ee0: fe842503 lw a0,-24(s0) + 3001ee4: b44ff0ef jal ra,3001228 + 3001ee8: 87aa mv a5,a0 + 3001eea: 0017c793 xori a5,a5,1 + 3001eee: 9f81 uxtb a5 + 3001ef0: cb91 beqz a5,3001f04 + 3001ef2: 0f600593 li a1,246 + 3001ef6: 030067b7 lui a5,0x3006 + 3001efa: 7d078513 addi a0,a5,2000 # 30067d0 + 3001efe: 24e5 jal ra,30021e6 + 3001f00: 4785 li a5,1 + 3001f02: a809 j 3001f14 + return DCL_ADC_ReadSOCxResult(adcHandle->baseAddress, soc); + 3001f04: fec42783 lw a5,-20(s0) + 3001f08: 439c lw a5,0(a5) + 3001f0a: fe842583 lw a1,-24(s0) + 3001f0e: 853e mv a0,a5 + 3001f10: 3ae5 jal ra,3001908 + 3001f12: 87aa mv a5,a0 +} + 3001f14: 853e mv a0,a5 + 3001f16: 40f2 lw ra,28(sp) + 3001f18: 4462 lw s0,24(sp) + 3001f1a: 6105 addi sp,sp,32 + 3001f1c: 8082 ret + +03001f1e : + * @param adcHandle ADC handle. + * @param intx ADC interrupt type number @ref ADC_IntNumber. + * @retval None. + */ +static void ADC_IntxClearEoc(ADC_Handle *adcHandle, unsigned int intx) +{ + 3001f1e: 7139 addi sp,sp,-64 + 3001f20: de22 sw s0,60(sp) + 3001f22: 0080 addi s0,sp,64 + 3001f24: fca42623 sw a0,-52(s0) + 3001f28: fcb42423 sw a1,-56(s0) + unsigned int eocFlag = adcHandle->baseAddress->ADC_EOC_FLAG.reg; + 3001f2c: fcc42783 lw a5,-52(s0) + 3001f30: 439c lw a5,0(a5) + 3001f32: 5bbc lw a5,112(a5) + 3001f34: fef42223 sw a5,-28(s0) + ADC_INT_DATA_0_REG intData0; + ADC_INT_DATA_1_REG intData1; + unsigned int eocMask = 0; + 3001f38: fe042623 sw zero,-20(s0) + switch (intx) { + 3001f3c: fc842783 lw a5,-56(s0) + 3001f40: 4705 li a4,1 + 3001f42: 02e78963 beq a5,a4,3001f74 + 3001f46: 4705 li a4,1 + 3001f48: 00e7e963 bltu a5,a4,3001f5a + 3001f4c: 4709 li a4,2 + 3001f4e: 04e78163 beq a5,a4,3001f90 + 3001f52: 470d li a4,3 + 3001f54: 04e78b63 beq a5,a4,3001faa + case ADC_INT_NUMBER3: /* Read Interrupt Configuration */ + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + eocMask = intData1.BIT.cfg_intr_data_sel3; + break; + default: + break; + 3001f58: a0bd j 3001fc6 + intData0.reg = adcHandle->baseAddress->ADC_INT_DATA_0.reg; + 3001f5a: fcc42783 lw a5,-52(s0) + 3001f5e: 439c lw a5,0(a5) + 3001f60: 2b07a783 lw a5,688(a5) + 3001f64: fcf42c23 sw a5,-40(s0) + eocMask = intData0.BIT.cfg_intr_data_sel0; + 3001f68: fd842783 lw a5,-40(s0) + 3001f6c: 9fa1 uxth a5 + 3001f6e: fef42623 sw a5,-20(s0) + break; + 3001f72: a891 j 3001fc6 + intData0.reg = adcHandle->baseAddress->ADC_INT_DATA_0.reg; + 3001f74: fcc42783 lw a5,-52(s0) + 3001f78: 439c lw a5,0(a5) + 3001f7a: 2b07a783 lw a5,688(a5) + 3001f7e: fcf42c23 sw a5,-40(s0) + eocMask = intData0.BIT.cfg_intr_data_sel1; + 3001f82: fd842783 lw a5,-40(s0) + 3001f86: 83c1 srli a5,a5,0x10 + 3001f88: 9fa1 uxth a5 + 3001f8a: fef42623 sw a5,-20(s0) + break; + 3001f8e: a825 j 3001fc6 + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + 3001f90: fcc42783 lw a5,-52(s0) + 3001f94: 439c lw a5,0(a5) + 3001f96: 2b47a783 lw a5,692(a5) + 3001f9a: fcf42a23 sw a5,-44(s0) + eocMask = intData1.BIT.cfg_intr_data_sel2; + 3001f9e: fd442783 lw a5,-44(s0) + 3001fa2: 9fa1 uxth a5 + 3001fa4: fef42623 sw a5,-20(s0) + break; + 3001fa8: a839 j 3001fc6 + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + 3001faa: fcc42783 lw a5,-52(s0) + 3001fae: 439c lw a5,0(a5) + 3001fb0: 2b47a783 lw a5,692(a5) + 3001fb4: fcf42a23 sw a5,-44(s0) + eocMask = intData1.BIT.cfg_intr_data_sel3; + 3001fb8: fd442783 lw a5,-44(s0) + 3001fbc: 83c1 srli a5,a5,0x10 + 3001fbe: 9fa1 uxth a5 + 3001fc0: fef42623 sw a5,-20(s0) + break; + 3001fc4: 0001 nop + } + unsigned int eoc = eocFlag & eocMask; + 3001fc6: fe442703 lw a4,-28(s0) + 3001fca: fec42783 lw a5,-20(s0) + 3001fce: 8ff9 and a5,a5,a4 + 3001fd0: fef42023 sw a5,-32(s0) + adcHandle->ADC_IntxParam[intx].socxFinish = eoc; + 3001fd4: fe042783 lw a5,-32(s0) + 3001fd8: 01079713 slli a4,a5,0x10 + 3001fdc: 8341 srli a4,a4,0x10 + 3001fde: fcc42683 lw a3,-52(s0) + 3001fe2: fc842783 lw a5,-56(s0) + 3001fe6: 07e1 addi a5,a5,24 + 3001fe8: 0786 slli a5,a5,0x1 + 3001fea: 97b6 add a5,a5,a3 + 3001fec: a3da sh a4,4(a5) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001fee: fe042423 sw zero,-24(s0) + 3001ff2: a80d j 3002024 + unsigned int val = (1 << i); + 3001ff4: 4705 li a4,1 + 3001ff6: fe842783 lw a5,-24(s0) + 3001ffa: 00f717b3 sll a5,a4,a5 + 3001ffe: fcf42e23 sw a5,-36(s0) + if (eoc & val) { + 3002002: fe042703 lw a4,-32(s0) + 3002006: fdc42783 lw a5,-36(s0) + 300200a: 8ff9 and a5,a5,a4 + 300200c: c799 beqz a5,300201a + adcHandle->baseAddress->ADC_EOC_FLAG.reg = val; /* Clear the EOC flag */ + 300200e: fcc42783 lw a5,-52(s0) + 3002012: 439c lw a5,0(a5) + 3002014: fdc42703 lw a4,-36(s0) + 3002018: dbb8 sw a4,112(a5) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 300201a: fe842783 lw a5,-24(s0) + 300201e: 0785 addi a5,a5,1 + 3002020: fef42423 sw a5,-24(s0) + 3002024: fe842703 lw a4,-24(s0) + 3002028: 47bd li a5,15 + 300202a: fce7d5e3 bge a5,a4,3001ff4 + } + } +} + 300202e: 0001 nop + 3002030: 5472 lw s0,60(sp) + 3002032: 6121 addi sp,sp,64 + 3002034: 8082 ret + +03002036 : + * @brief ADC Interrupt2 service processing function. + * @param handle ADC handle. + * @retval None. + */ +void HAL_ADC_IrqHandlerInt2(void *handle) +{ + 3002036: 7179 addi sp,sp,-48 + 3002038: d606 sw ra,44(sp) + 300203a: d422 sw s0,40(sp) + 300203c: 1800 addi s0,sp,48 + 300203e: fca42e23 sw a0,-36(s0) + ADC_ASSERT_PARAM(handle != NULL); + 3002042: fdc42783 lw a5,-36(s0) + 3002046: eb89 bnez a5,3002058 + 3002048: 17900593 li a1,377 + 300204c: 030067b7 lui a5,0x3006 + 3002050: 7d078513 addi a0,a5,2000 # 30067d0 + 3002054: 2a49 jal ra,30021e6 + 3002056: a001 j 3002056 + ADC_Handle *adcHandle = (ADC_Handle *)handle; + 3002058: fdc42783 lw a5,-36(s0) + 300205c: fef42623 sw a5,-20(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3002060: fec42783 lw a5,-20(s0) + 3002064: 4398 lw a4,0(a5) + 3002066: 180007b7 lui a5,0x18000 + 300206a: 00f70a63 beq a4,a5,300207e + 300206e: 17b00593 li a1,379 + 3002072: 030067b7 lui a5,0x3006 + 3002076: 7d078513 addi a0,a5,2000 # 30067d0 + 300207a: 22b5 jal ra,30021e6 + 300207c: a001 j 300207c + ADC_IntxClearEoc(adcHandle, ADC_INT_NUMBER2); /* Clear conversion completion flag */ + 300207e: 4589 li a1,2 + 3002080: fec42503 lw a0,-20(s0) + 3002084: 3d69 jal ra,3001f1e + DCL_ADC_ClearIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + 3002086: fec42783 lw a5,-20(s0) + 300208a: 439c lw a5,0(a5) + 300208c: 4589 li a1,2 + 300208e: 853e mv a0,a5 + 3002090: cfeff0ef jal ra,300158e + if (adcHandle->userCallBack.Int2FinishCallBack != NULL) { + 3002094: fec42783 lw a5,-20(s0) + 3002098: 43fc lw a5,68(a5) + 300209a: c799 beqz a5,30020a8 + adcHandle->userCallBack.Int2FinishCallBack(handle); + 300209c: fec42783 lw a5,-20(s0) + 30020a0: 43fc lw a5,68(a5) + 30020a2: fdc42503 lw a0,-36(s0) + 30020a6: 9782 jalr a5 + } +} + 30020a8: 0001 nop + 30020aa: 50b2 lw ra,44(sp) + 30020ac: 5422 lw s0,40(sp) + 30020ae: 6145 addi sp,sp,48 + 30020b0: 8082 ret + +030020b2 : + * @param typeID Id of callback function type. + * @param pCallback Pointer of the specified callbcak function. + * @retval None. + */ +static void ADC_RegieterEventCallBack(ADC_Handle *adcHandle, ADC_CallbackFunType typeID, ADC_CallbackType pCallback) +{ + 30020b2: 7179 addi sp,sp,-48 + 30020b4: d622 sw s0,44(sp) + 30020b6: 1800 addi s0,sp,48 + 30020b8: fca42e23 sw a0,-36(s0) + 30020bc: fcb42c23 sw a1,-40(s0) + 30020c0: fcc42a23 sw a2,-44(s0) + if (typeID > ADC_CALLBACK_EVENT_PPB3_ERROR || typeID < ADC_CALLBACK_EVENT_PPB0_ZERO) { + 30020c4: fd842703 lw a4,-40(s0) + 30020c8: 47fd li a5,31 + 30020ca: 02e7e763 bltu a5,a4,30020f8 + 30020ce: fd842703 lw a4,-40(s0) + 30020d2: 47bd li a5,15 + 30020d4: 02e7f263 bgeu a5,a4,30020f8 + return; + } + unsigned int index = ((unsigned int)typeID & 0xF); + 30020d8: fd842783 lw a5,-40(s0) + 30020dc: 8bbd andi a5,a5,15 + 30020de: fef42623 sw a5,-20(s0) + adcHandle->userCallBack.PPBEventCallBack[index] = pCallback; + 30020e2: fdc42703 lw a4,-36(s0) + 30020e6: fec42783 lw a5,-20(s0) + 30020ea: 07d1 addi a5,a5,20 + 30020ec: 078a slli a5,a5,0x2 + 30020ee: 97ba add a5,a5,a4 + 30020f0: fd442703 lw a4,-44(s0) + 30020f4: cb98 sw a4,16(a5) + 30020f6: a011 j 30020fa + return; + 30020f8: 0001 nop +} + 30020fa: 5432 lw s0,44(sp) + 30020fc: 6145 addi sp,sp,48 + 30020fe: 8082 ret + +03002100 : + * @param typeID Id of callback function type. + * @param pCallback Pointer of the specified callbcak function. + * @retval None. + */ +void HAL_ADC_RegisterCallBack(ADC_Handle *adcHandle, ADC_CallbackFunType typeID, ADC_CallbackType pCallback) +{ + 3002100: 1101 addi sp,sp,-32 + 3002102: ce06 sw ra,28(sp) + 3002104: cc22 sw s0,24(sp) + 3002106: 1000 addi s0,sp,32 + 3002108: fea42623 sw a0,-20(s0) + 300210c: feb42423 sw a1,-24(s0) + 3002110: fec42223 sw a2,-28(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3002114: fec42783 lw a5,-20(s0) + 3002118: eb89 bnez a5,300212a + 300211a: 1d900593 li a1,473 + 300211e: 030067b7 lui a5,0x3006 + 3002122: 7d078513 addi a0,a5,2000 # 30067d0 + 3002126: 20c1 jal ra,30021e6 + 3002128: a001 j 3002128 + ADC_ASSERT_PARAM(pCallback != NULL); + 300212a: fe442783 lw a5,-28(s0) + 300212e: eb89 bnez a5,3002140 + 3002130: 1da00593 li a1,474 + 3002134: 030067b7 lui a5,0x3006 + 3002138: 7d078513 addi a0,a5,2000 # 30067d0 + 300213c: 206d jal ra,30021e6 + 300213e: a001 j 300213e + switch (typeID) { /* Register the callback function based on the interrupt type */ + 3002140: fe842703 lw a4,-24(s0) + 3002144: 47a1 li a5,8 + 3002146: 08e7e363 bltu a5,a4,30021cc + 300214a: fe842783 lw a5,-24(s0) + 300214e: 00279713 slli a4,a5,0x2 + 3002152: 030077b7 lui a5,0x3007 + 3002156: 80478793 addi a5,a5,-2044 # 3006804 + 300215a: 97ba add a5,a5,a4 + 300215c: 439c lw a5,0(a5) + 300215e: 8782 jr a5 + case ADC_CALLBACK_INT0: + adcHandle->userCallBack.Int0FinishCallBack = pCallback; /* Sampling finsish interrupt 0 callback function */ + 3002160: fec42783 lw a5,-20(s0) + 3002164: fe442703 lw a4,-28(s0) + 3002168: dfd8 sw a4,60(a5) + break; + 300216a: a88d j 30021dc + case ADC_CALLBACK_INT1: + adcHandle->userCallBack.Int1FinishCallBack = pCallback; /* Sampling finsish interrupt 1 callback function */ + 300216c: fec42783 lw a5,-20(s0) + 3002170: fe442703 lw a4,-28(s0) + 3002174: c3b8 sw a4,64(a5) + break; + 3002176: a09d j 30021dc + case ADC_CALLBACK_INT2: + adcHandle->userCallBack.Int2FinishCallBack = pCallback; /* Sampling finsish interrupt 2 callback function */ + 3002178: fec42783 lw a5,-20(s0) + 300217c: fe442703 lw a4,-28(s0) + 3002180: c3f8 sw a4,68(a5) + break; + 3002182: a8a9 j 30021dc + case ADC_CALLBACK_INT3: + adcHandle->userCallBack.Int3FinishCallBack = pCallback; /* Sampling finsish interrupt 3 callback function */ + 3002184: fec42783 lw a5,-20(s0) + 3002188: fe442703 lw a4,-28(s0) + 300218c: c7b8 sw a4,72(a5) + break; + 300218e: a0b9 j 30021dc + case ADC_CALLBACK_DMA: + adcHandle->userCallBack.DmaFinishCallBack = pCallback; /* Dma transfer finish callback function */ + 3002190: fec42783 lw a5,-20(s0) + 3002194: fe442703 lw a4,-28(s0) + 3002198: c7f8 sw a4,76(a5) + break; + 300219a: a089 j 30021dc + case ADC_CALLBACK_DMAERROR: + adcHandle->userCallBack.DmaErrorCallBack = pCallback; /* Dma transfer error callback function */ + 300219c: fec42783 lw a5,-20(s0) + 30021a0: fe442703 lw a4,-28(s0) + 30021a4: cbf8 sw a4,84(a5) + break; + 30021a6: a81d j 30021dc + case ADC_CALLBACK_DMAOVER: + adcHandle->userCallBack.DmaOverCallBack = pCallback; /* Dma request over callback function */ + 30021a8: fec42783 lw a5,-20(s0) + 30021ac: fe442703 lw a4,-28(s0) + 30021b0: cfb8 sw a4,88(a5) + break; + 30021b2: a02d j 30021dc + case ADC_CALLBACK_TRIGOVER: + adcHandle->userCallBack.TrigOverCallBack = pCallback; /* trigger over callback function */ + 30021b4: fec42783 lw a5,-20(s0) + 30021b8: fe442703 lw a4,-28(s0) + 30021bc: cff8 sw a4,92(a5) + break; + 30021be: a839 j 30021dc + case ADC_CALLBACK_EVENT_OVERSAMPLING: /* Oversampling callback function */ + adcHandle->userCallBack.OverSamplingFinishCallBack = pCallback; + 30021c0: fec42783 lw a5,-20(s0) + 30021c4: fe442703 lw a4,-28(s0) + 30021c8: cbb8 sw a4,80(a5) + break; + 30021ca: a809 j 30021dc + default: + ADC_RegieterEventCallBack(adcHandle, typeID, pCallback); /* PPB Function Callback Function */ + 30021cc: fe442603 lw a2,-28(s0) + 30021d0: fe842583 lw a1,-24(s0) + 30021d4: fec42503 lw a0,-20(s0) + 30021d8: 3de9 jal ra,30020b2 + break; + 30021da: 0001 nop + } +} + 30021dc: 0001 nop + 30021de: 40f2 lw ra,28(sp) + 30021e0: 4462 lw s0,24(sp) + 30021e2: 6105 addi sp,sp,32 + 30021e4: 8082 ret + +030021e6 : + * @param file Pointer to the name of the file where the error occurs. + * @param line Number of the line where the error occurs. + * @retval None. + */ +__weak void AssertErrorLog(char *file, unsigned int line) +{ + 30021e6: 1101 addi sp,sp,-32 + 30021e8: ce22 sw s0,28(sp) + 30021ea: 1000 addi s0,sp,32 + 30021ec: fea42623 sw a0,-20(s0) + 30021f0: feb42423 sw a1,-24(s0) + /* Use only if the user apllication is not defined. */ + BASE_FUNC_UNUSED(file); + BASE_FUNC_UNUSED(line); + 30021f4: 0001 nop + 30021f6: 4472 lw s0,28(sp) + 30021f8: 6105 addi sp,sp,32 + 30021fa: 8082 ret + +030021fc : + * @brief Get the systick + * @param None + * @retval The SysTick Value + */ +static inline unsigned int DCL_SYSTICK_GetTick(void) +{ + 30021fc: 1141 addi sp,sp,-16 + 30021fe: c622 sw s0,12(sp) + 3002200: 0800 addi s0,sp,16 + return SYSTICK->MTIME; /* Systick value(Lower 32bit register) */ + 3002202: 143807b7 lui a5,0x14380 + 3002206: 479c lw a5,8(a5) +} + 3002208: 853e mv a0,a5 + 300220a: 4432 lw s0,12(sp) + 300220c: 0141 addi sp,sp,16 + 300220e: 8082 ret + +03002210 : + * @brief Delay number of us. + * @param us The number of us to delay. + * @retval None. + */ +void BASE_FUNC_DelayUs(unsigned int us) +{ + 3002210: 7179 addi sp,sp,-48 + 3002212: d606 sw ra,44(sp) + 3002214: d422 sw s0,40(sp) + 3002216: 1800 addi s0,sp,48 + 3002218: fca42e23 sw a0,-36(s0) + unsigned int preTick = DCL_SYSTICK_GetTick(); + 300221c: 37c5 jal ra,30021fc + 300221e: fea42623 sw a0,-20(s0) + unsigned int tickInUs = (SYSTICK_GetCRGHZ() / CRG_FREQ_1MHz) * us; + 3002222: d85fe0ef jal ra,3000fa6 + 3002226: 872a mv a4,a0 + 3002228: 000f47b7 lui a5,0xf4 + 300222c: 24078793 addi a5,a5,576 # f4240 + 3002230: 02f757b3 divu a5,a4,a5 + 3002234: fdc42703 lw a4,-36(s0) + 3002238: 02f707b3 mul a5,a4,a5 + 300223c: fef42423 sw a5,-24(s0) + unsigned int curTick; + unsigned int delta; + + /* Wait until the delta is greater than tickInUs */ + do { + curTick = DCL_SYSTICK_GetTick(); + 3002240: 3f75 jal ra,30021fc + 3002242: fea42223 sw a0,-28(s0) + delta = (curTick >= preTick) ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick + 1; + 3002246: fe442703 lw a4,-28(s0) + 300224a: fec42783 lw a5,-20(s0) + 300224e: 40f707b3 sub a5,a4,a5 + 3002252: fef42023 sw a5,-32(s0) + } while (delta < tickInUs); + 3002256: fe042703 lw a4,-32(s0) + 300225a: fe842783 lw a5,-24(s0) + 300225e: fef761e3 bltu a4,a5,3002240 +} + 3002262: 0001 nop + 3002264: 50b2 lw ra,44(sp) + 3002266: 5422 lw s0,40(sp) + 3002268: 6145 addi sp,sp,48 + 300226a: 8082 ret + +0300226c : + * @brief Delay number of ms. + * @param ms The number of ms to delay. + * @retval None. + */ +void BASE_FUNC_DelayMs(unsigned int ms) +{ + 300226c: 7179 addi sp,sp,-48 + 300226e: d606 sw ra,44(sp) + 3002270: d422 sw s0,40(sp) + 3002272: 1800 addi s0,sp,48 + 3002274: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < ms; ++i) { + 3002278: fe042623 sw zero,-20(s0) + 300227c: a809 j 300228e + BASE_FUNC_DelayUs(BASE_DEFINE_DELAY_US_IN_MS); + 300227e: 3e800513 li a0,1000 + 3002282: 3779 jal ra,3002210 + for (unsigned int i = 0; i < ms; ++i) { + 3002284: fec42783 lw a5,-20(s0) + 3002288: 0785 addi a5,a5,1 + 300228a: fef42623 sw a5,-20(s0) + 300228e: fec42703 lw a4,-20(s0) + 3002292: fdc42783 lw a5,-36(s0) + 3002296: fef764e3 bltu a4,a5,300227e + } +} + 300229a: 0001 nop + 300229c: 50b2 lw ra,44(sp) + 300229e: 5422 lw s0,40(sp) + 30022a0: 6145 addi sp,sp,48 + 30022a2: 8082 ret + +030022a4 : + * @brief Delay number of seconds. + * @param seconds The number of seconds to delay. + * @retval None. + */ +void BASE_FUNC_DelaySeconds(unsigned int seconds) +{ + 30022a4: 7179 addi sp,sp,-48 + 30022a6: d606 sw ra,44(sp) + 30022a8: d422 sw s0,40(sp) + 30022aa: 1800 addi s0,sp,48 + 30022ac: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < seconds; ++i) { + 30022b0: fe042623 sw zero,-20(s0) + 30022b4: a809 j 30022c6 + BASE_FUNC_DelayMs(BASE_DEFINE_DELAY_MS_IN_SEC); + 30022b6: 3e800513 li a0,1000 + 30022ba: 3f4d jal ra,300226c + for (unsigned int i = 0; i < seconds; ++i) { + 30022bc: fec42783 lw a5,-20(s0) + 30022c0: 0785 addi a5,a5,1 + 30022c2: fef42623 sw a5,-20(s0) + 30022c6: fec42703 lw a4,-20(s0) + 30022ca: fdc42783 lw a5,-36(s0) + 30022ce: fef764e3 bltu a4,a5,30022b6 + } +} + 30022d2: 0001 nop + 30022d4: 50b2 lw ra,44(sp) + 30022d6: 5422 lw s0,40(sp) + 30022d8: 6145 addi sp,sp,48 + 30022da: 8082 ret + +030022dc : + * @param delay The number of 'units' to delay. + * @param units Specifies the delay unit. + * @retval None. + */ +void BASE_FUNC_Delay(unsigned int delay, BASE_DelayUnit units) +{ + 30022dc: 1101 addi sp,sp,-32 + 30022de: ce06 sw ra,28(sp) + 30022e0: cc22 sw s0,24(sp) + 30022e2: 1000 addi s0,sp,32 + 30022e4: fea42623 sw a0,-20(s0) + 30022e8: feb42423 sw a1,-24(s0) + switch (units) { + 30022ec: fe842783 lw a5,-24(s0) + 30022f0: 3e800713 li a4,1000 + 30022f4: 02e78063 beq a5,a4,3002314 + 30022f8: 000f4737 lui a4,0xf4 + 30022fc: 24070713 addi a4,a4,576 # f4240 + 3002300: 00e78e63 beq a5,a4,300231c + 3002304: 4705 li a4,1 + 3002306: 00e78363 beq a5,a4,300230c + break; + case BASE_DEFINE_DELAY_MICROSECS: + BASE_FUNC_DelayUs(delay); + break; + default: + break; + 300230a: a829 j 3002324 + BASE_FUNC_DelaySeconds(delay); + 300230c: fec42503 lw a0,-20(s0) + 3002310: 3f51 jal ra,30022a4 + break; + 3002312: a809 j 3002324 + BASE_FUNC_DelayMs(delay); + 3002314: fec42503 lw a0,-20(s0) + 3002318: 3f91 jal ra,300226c + break; + 300231a: a029 j 3002324 + BASE_FUNC_DelayUs(delay); + 300231c: fec42503 lw a0,-20(s0) + 3002320: 3dc5 jal ra,3002210 + break; + 3002322: 0001 nop + } + return; + 3002324: 0001 nop + 3002326: 40f2 lw ra,28(sp) + 3002328: 4462 lw s0,24(sp) + 300232a: 6105 addi sp,sp,32 + 300232c: 8082 ret + +0300232e : + * @brief Clear external interrupt + * @param irqNum external interrupt number + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_NOT_CREATED + */ +static inline void IRQ_ClearN(unsigned int irqNum) +{ + 300232e: 1101 addi sp,sp,-32 + 3002330: ce22 sw s0,28(sp) + 3002332: 1000 addi s0,sp,32 + 3002334: fea42623 sw a0,-20(s0) + asm volatile("fence"); + 3002338: 0ff0000f fence + WRITE_CUSTOM_CSR_VAL(LOCIPCLR, irqNum); + 300233c: fec42783 lw a5,-20(s0) + 3002340: 82be mv t0,a5 + 3002342: bf029073 csrw 0xbf0,t0 +} + 3002346: 0001 nop + 3002348: 4472 lw s0,28(sp) + 300234a: 6105 addi sp,sp,32 + 300234c: 8082 ret + +0300234e : + * @brief Exception/Interrupt Handler Entry. + * @param irqNum external interrupt number. + * @retval None + */ +void InterruptEntry(unsigned int irqNum) +{ + 300234e: 1101 addi sp,sp,-32 + 3002350: ce06 sw ra,28(sp) + 3002352: cc22 sw s0,24(sp) + 3002354: 1000 addi s0,sp,32 + 3002356: fea42623 sw a0,-20(s0) + g_irqCallbackFunc[irqNum].pfnHandler(g_irqCallbackFunc[irqNum].param); + 300235a: 040007b7 lui a5,0x4000 + 300235e: 0fc78713 addi a4,a5,252 # 40000fc + 3002362: fec42783 lw a5,-20(s0) + 3002366: 078e slli a5,a5,0x3 + 3002368: 97ba add a5,a5,a4 + 300236a: 4394 lw a3,0(a5) + 300236c: 040007b7 lui a5,0x4000 + 3002370: 0fc78713 addi a4,a5,252 # 40000fc + 3002374: fec42783 lw a5,-20(s0) + 3002378: 078e slli a5,a5,0x3 + 300237a: 97ba add a5,a5,a4 + 300237c: 43dc lw a5,4(a5) + 300237e: 853e mv a0,a5 + 3002380: 9682 jalr a3 + IRQ_ClearN(irqNum); + 3002382: fec42503 lw a0,-20(s0) + 3002386: 3765 jal ra,300232e +} + 3002388: 0001 nop + 300238a: 40f2 lw ra,28(sp) + 300238c: 4462 lw s0,24(sp) + 300238e: 6105 addi sp,sp,32 + 3002390: 8082 ret + +03002392 : + * @brief Irq initialization. + * @param none. + * @retval None + */ +void IRQ_Init(void) +{ + 3002392: 1101 addi sp,sp,-32 + 3002394: ce22 sw s0,28(sp) + 3002396: 1000 addi s0,sp,32 + unsigned int index; + + for (index = 0; index < IRQ_MAX; index++) { + 3002398: fe042623 sw zero,-20(s0) + 300239c: a82d j 30023d6 + g_irqCallbackFunc[index].pfnHandler = IRQ_DummyHandler; + 300239e: 040007b7 lui a5,0x4000 + 30023a2: 0fc78713 addi a4,a5,252 # 40000fc + 30023a6: fec42783 lw a5,-20(s0) + 30023aa: 078e slli a5,a5,0x3 + 30023ac: 97ba add a5,a5,a4 + 30023ae: 03003737 lui a4,0x3003 + 30023b2: c3270713 addi a4,a4,-974 # 3002c32 + 30023b6: c398 sw a4,0(a5) + g_irqCallbackFunc[index].param = NULL; + 30023b8: 040007b7 lui a5,0x4000 + 30023bc: 0fc78713 addi a4,a5,252 # 40000fc + 30023c0: fec42783 lw a5,-20(s0) + 30023c4: 078e slli a5,a5,0x3 + 30023c6: 97ba add a5,a5,a4 + 30023c8: 0007a223 sw zero,4(a5) + for (index = 0; index < IRQ_MAX; index++) { + 30023cc: fec42783 lw a5,-20(s0) + 30023d0: 0785 addi a5,a5,1 + 30023d2: fef42623 sw a5,-20(s0) + 30023d6: fec42703 lw a4,-20(s0) + 30023da: 07200793 li a5,114 + 30023de: fce7f0e3 bgeu a5,a4,300239e + } +} + 30023e2: 0001 nop + 30023e4: 4472 lw s0,28(sp) + 30023e6: 6105 addi sp,sp,32 + 30023e8: 8082 ret + +030023ea : + * @note In the corresponding interrupt handler, manually clear the interrupt source and the corresponding interrupt + * flag bit (call the IRQ_ClearN function to clear the interrupt), otherwise the interrupt will always be + * triggered. + */ +unsigned int IRQ_Register(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 30023ea: 1101 addi sp,sp,-32 + 30023ec: ce06 sw ra,28(sp) + 30023ee: cc22 sw s0,24(sp) + 30023f0: 1000 addi s0,sp,32 + 30023f2: fea42623 sw a0,-20(s0) + 30023f6: feb42423 sw a1,-24(s0) + 30023fa: fec42223 sw a2,-28(s0) + INTERRUPT_ASSERT_PARAM(func != NULL); + 30023fe: fe842783 lw a5,-24(s0) + 3002402: eb89 bnez a5,3002414 + 3002404: 06300593 li a1,99 + 3002408: 030077b7 lui a5,0x3007 + 300240c: 82878513 addi a0,a5,-2008 # 3006828 + 3002410: 3bd9 jal ra,30021e6 + 3002412: a001 j 3002412 + INTERRUPT_PARAM_CHECK_WITH_RET(irqNum < IRQ_MAX, IRQ_ERRNO_NUM_INVALID); + 3002414: fec42703 lw a4,-20(s0) + 3002418: 07200793 li a5,114 + 300241c: 00e7fb63 bgeu a5,a4,3002432 + 3002420: 06400593 li a1,100 + 3002424: 030077b7 lui a5,0x3007 + 3002428: 82878513 addi a0,a5,-2008 # 3006828 + 300242c: 3b6d jal ra,30021e6 + 300242e: 4789 li a5,2 + 3002430: a81d j 3002466 + + if (g_irqCallbackFunc[irqNum].pfnHandler != IRQ_DummyHandler) { + 3002432: 040007b7 lui a5,0x4000 + 3002436: 0fc78713 addi a4,a5,252 # 40000fc + 300243a: fec42783 lw a5,-20(s0) + 300243e: 078e slli a5,a5,0x3 + 3002440: 97ba add a5,a5,a4 + 3002442: 4398 lw a4,0(a5) + 3002444: 030037b7 lui a5,0x3003 + 3002448: c3278793 addi a5,a5,-974 # 3002c32 + 300244c: 00f70463 beq a4,a5,3002454 + return IRQ_ERRNO_ALREADY_CREATED; + 3002450: 478d li a5,3 + 3002452: a811 j 3002466 + } + IRQ_SetCallBack(irqNum, func, arg); + 3002454: fe442603 lw a2,-28(s0) + 3002458: fe842583 lw a1,-24(s0) + 300245c: fec42503 lw a0,-20(s0) + 3002460: 7e4000ef jal ra,3002c44 + return BASE_STATUS_OK; + 3002464: 4781 li a5,0 +} + 3002466: 853e mv a0,a5 + 3002468: 40f2 lw ra,28(sp) + 300246a: 4462 lw s0,24(sp) + 300246c: 6105 addi sp,sp,32 + 300246e: 8082 ret + +03002470 : + * @brief Enable the specified interrupt. + * @param irqNum External interrupt number. + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID. + */ +unsigned int IRQ_EnableN(unsigned int irqNum) +{ + 3002470: 7139 addi sp,sp,-64 + 3002472: de06 sw ra,60(sp) + 3002474: dc22 sw s0,56(sp) + 3002476: 0080 addi s0,sp,64 + 3002478: fca42623 sw a0,-52(s0) + unsigned int locienVal; +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 300247c: fcc42703 lw a4,-52(s0) + 3002480: 47e5 li a5,25 + 3002482: 00e7f863 bgeu a5,a4,3002492 + 3002486: fcc42703 lw a4,-52(s0) + 300248a: 07200793 li a5,114 + 300248e: 00e7fb63 bgeu a5,a4,30024a4 + 3002492: 0c300593 li a1,195 + 3002496: 030077b7 lui a5,0x3007 + 300249a: 82878513 addi a0,a5,-2008 # 3006828 + 300249e: 33a1 jal ra,30021e6 + 30024a0: 4789 li a5,2 + 30024a2: a8cd j 3002594 + /* The interrupt enable bits that can be controlled in the mie register (32 bits), up to 32 + can be controlled, and each bit corresponds to an interrupt enable */ + + RISCV_PRIV_MODE_SWITCH(priv); + + if (irqNum < IRQ_MIE_TOTAL_CNT) { + 30024a4: fcc42703 lw a4,-52(s0) + 30024a8: 47fd li a5,31 + 30024aa: 02e7e063 bltu a5,a4,30024ca + irqOrder = 1U << irqNum; + 30024ae: 4705 li a4,1 + 30024b0: fcc42783 lw a5,-52(s0) + 30024b4: 00f717b3 sll a5,a4,a5 + 30024b8: fef42623 sw a5,-20(s0) + SET_CSR(mie, irqOrder); + 30024bc: fec42783 lw a5,-20(s0) + 30024c0: 3047a7f3 csrrs a5,mie,a5 + 30024c4: fcf42c23 sw a5,-40(s0) + 30024c8: a0e9 j 3002592 + } else if (irqNum < IRQ_LOCIEN1_OFFSET) { + 30024ca: fcc42703 lw a4,-52(s0) + 30024ce: 03f00793 li a5,63 + 30024d2: 02e7ef63 bltu a5,a4,3002510 + irqOrder = irqNum - IRQ_MIE_TOTAL_CNT; + 30024d6: fcc42783 lw a5,-52(s0) + 30024da: 1781 addi a5,a5,-32 + 30024dc: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN0); + 30024e0: be0027f3 csrr a5,0xbe0 + 30024e4: fcf42e23 sw a5,-36(s0) + 30024e8: fdc42783 lw a5,-36(s0) + 30024ec: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 30024f0: 4705 li a4,1 + 30024f2: fec42783 lw a5,-20(s0) + 30024f6: 00f717b3 sll a5,a4,a5 + 30024fa: fe442703 lw a4,-28(s0) + 30024fe: 8fd9 or a5,a5,a4 + 3002500: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN0, locienVal); + 3002504: fe442783 lw a5,-28(s0) + 3002508: 82be mv t0,a5 + 300250a: be029073 csrw 0xbe0,t0 + 300250e: a051 j 3002592 + } else if (irqNum < IRQ_LOCIEN2_OFFSET) { + 3002510: fcc42703 lw a4,-52(s0) + 3002514: 05f00793 li a5,95 + 3002518: 04e7e063 bltu a5,a4,3002558 + irqOrder = irqNum - IRQ_LOCIEN1_OFFSET; + 300251c: fcc42783 lw a5,-52(s0) + 3002520: fc078793 addi a5,a5,-64 + 3002524: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN1); + 3002528: be1027f3 csrr a5,0xbe1 + 300252c: fef42023 sw a5,-32(s0) + 3002530: fe042783 lw a5,-32(s0) + 3002534: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 3002538: 4705 li a4,1 + 300253a: fec42783 lw a5,-20(s0) + 300253e: 00f717b3 sll a5,a4,a5 + 3002542: fe442703 lw a4,-28(s0) + 3002546: 8fd9 or a5,a5,a4 + 3002548: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN1, locienVal); + 300254c: fe442783 lw a5,-28(s0) + 3002550: 82be mv t0,a5 + 3002552: be129073 csrw 0xbe1,t0 + 3002556: a835 j 3002592 + } else { + irqOrder = irqNum - IRQ_LOCIEN2_OFFSET; + 3002558: fcc42783 lw a5,-52(s0) + 300255c: fa078793 addi a5,a5,-96 + 3002560: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN2); + 3002564: be2027f3 csrr a5,0xbe2 + 3002568: fef42423 sw a5,-24(s0) + 300256c: fe842783 lw a5,-24(s0) + 3002570: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 3002574: 4705 li a4,1 + 3002576: fec42783 lw a5,-20(s0) + 300257a: 00f717b3 sll a5,a4,a5 + 300257e: fe442703 lw a4,-28(s0) + 3002582: 8fd9 or a5,a5,a4 + 3002584: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN2, locienVal); + 3002588: fe442783 lw a5,-28(s0) + 300258c: 82be mv t0,a5 + 300258e: be229073 csrw 0xbe2,t0 + } + + RISCV_PRIV_MODE_SWITCH(priv); + + return BASE_STATUS_OK; + 3002592: 4781 li a5,0 +} + 3002594: 853e mv a0,a5 + 3002596: 50f2 lw ra,60(sp) + 3002598: 5462 lw s0,56(sp) + 300259a: 6121 addi sp,sp,64 + 300259c: 8082 ret + +0300259e : + * @param context. + * @note The actual code is generated by IDE + * @retval None. + */ +__weak void SysErrPrint(const SyserrContext *context) +{ + 300259e: 1101 addi sp,sp,-32 + 30025a0: ce22 sw s0,28(sp) + 30025a2: 1000 addi s0,sp,32 + 30025a4: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(context); +} + 30025a8: 0001 nop + 30025aa: 4472 lw s0,28(sp) + 30025ac: 6105 addi sp,sp,32 + 30025ae: 8082 ret + +030025b0 : + * @brief System error completion processing + * @param None. + * @retval None. + */ +static void SysErrFinish(void) +{ + 30025b0: 1141 addi sp,sp,-16 + 30025b2: c622 sw s0,12(sp) + 30025b4: 0800 addi s0,sp,16 +} + 30025b6: 0001 nop + 30025b8: 4432 lw s0,12(sp) + 30025ba: 0141 addi sp,sp,16 + 30025bc: 8082 ret + +030025be : + * @brief Exception Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrExcEntry(const SyserrContext *context) +{ + 30025be: 1101 addi sp,sp,-32 + 30025c0: ce06 sw ra,28(sp) + 30025c2: cc22 sw s0,24(sp) + 30025c4: 1000 addi s0,sp,32 + 30025c6: fea42623 sw a0,-20(s0) + SysErrPrint(context); + 30025ca: fec42503 lw a0,-20(s0) + 30025ce: 3fc1 jal ra,300259e + SysErrFinish(); + 30025d0: 37c5 jal ra,30025b0 +} + 30025d2: 0001 nop + 30025d4: 40f2 lw ra,28(sp) + 30025d6: 4462 lw s0,24(sp) + 30025d8: 6105 addi sp,sp,32 + 30025da: 8082 ret + +030025dc : + * @brief NMI Interrupt Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrNmiEntry(const SyserrContext *context) +{ + 30025dc: 1101 addi sp,sp,-32 + 30025de: ce06 sw ra,28(sp) + 30025e0: cc22 sw s0,24(sp) + 30025e2: 1000 addi s0,sp,32 + 30025e4: fea42623 sw a0,-20(s0) + INTERRUPT_ASSERT_PARAM(context != NULL); + 30025e8: fec42783 lw a5,-20(s0) + 30025ec: eb89 bnez a5,30025fe + 30025ee: 12d00593 li a1,301 + 30025f2: 030077b7 lui a5,0x3007 + 30025f6: 82878513 addi a0,a5,-2008 # 3006828 + 30025fa: 36f5 jal ra,30021e6 + 30025fc: a001 j 30025fc + SysErrPrint(context); + 30025fe: fec42503 lw a0,-20(s0) + 3002602: 3f71 jal ra,300259e + SysErrFinish(); + 3002604: 3775 jal ra,30025b0 +} + 3002606: 0001 nop + 3002608: 40f2 lw ra,28(sp) + 300260a: 4462 lw s0,24(sp) + 300260c: 6105 addi sp,sp,32 + 300260e: 8082 ret + +03002610 : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior local int prioroty. + * @retval None + */ +static void SetLocalIntNumPri(unsigned int intNum, unsigned int interPriNum, unsigned int prior) +{ + 3002610: 711d addi sp,sp,-96 + 3002612: cea2 sw s0,92(sp) + 3002614: 1080 addi s0,sp,96 + 3002616: faa42623 sw a0,-84(s0) + 300261a: fab42423 sw a1,-88(s0) + 300261e: fac42223 sw a2,-92(s0) + switch (intNum) { + 3002622: fac42783 lw a5,-84(s0) + 3002626: 17e1 addi a5,a5,-8 + 3002628: 471d li a4,7 + 300262a: 2af76363 bltu a4,a5,30028d0 + 300262e: 00279713 slli a4,a5,0x2 + 3002632: 030077b7 lui a5,0x3007 + 3002636: 84878793 addi a5,a5,-1976 # 3006848 + 300263a: 97ba add a5,a5,a4 + 300263c: 439c lw a5,0(a5) + 300263e: 8782 jr a5 + case 8: /* GROUP8 */ + SET_LOCAL_INTER_NUM_PRI(8, interPriNum, prior); + 3002640: bc8027f3 csrr a5,0xbc8 + 3002644: faf42a23 sw a5,-76(s0) + 3002648: fb442783 lw a5,-76(s0) + 300264c: faf42823 sw a5,-80(s0) + 3002650: fa842783 lw a5,-88(s0) + 3002654: 078a slli a5,a5,0x2 + 3002656: 8bf1 andi a5,a5,28 + 3002658: 473d li a4,15 + 300265a: 00f717b3 sll a5,a4,a5 + 300265e: fff7c793 not a5,a5 + 3002662: fb042703 lw a4,-80(s0) + 3002666: 8ff9 and a5,a5,a4 + 3002668: faf42823 sw a5,-80(s0) + 300266c: fa842783 lw a5,-88(s0) + 3002670: 078a slli a5,a5,0x2 + 3002672: 8bf1 andi a5,a5,28 + 3002674: fa442703 lw a4,-92(s0) + 3002678: 00f717b3 sll a5,a4,a5 + 300267c: fb042703 lw a4,-80(s0) + 3002680: 8fd9 or a5,a5,a4 + 3002682: faf42823 sw a5,-80(s0) + 3002686: fb042783 lw a5,-80(s0) + 300268a: 82be mv t0,a5 + 300268c: bc829073 csrw 0xbc8,t0 + break; + 3002690: a489 j 30028d2 + case 9: /* GROUP9 */ + SET_LOCAL_INTER_NUM_PRI(9, interPriNum, prior); + 3002692: bc9027f3 csrr a5,0xbc9 + 3002696: faf42e23 sw a5,-68(s0) + 300269a: fbc42783 lw a5,-68(s0) + 300269e: faf42c23 sw a5,-72(s0) + 30026a2: fa842783 lw a5,-88(s0) + 30026a6: 078a slli a5,a5,0x2 + 30026a8: 8bf1 andi a5,a5,28 + 30026aa: 473d li a4,15 + 30026ac: 00f717b3 sll a5,a4,a5 + 30026b0: fff7c793 not a5,a5 + 30026b4: fb842703 lw a4,-72(s0) + 30026b8: 8ff9 and a5,a5,a4 + 30026ba: faf42c23 sw a5,-72(s0) + 30026be: fa842783 lw a5,-88(s0) + 30026c2: 078a slli a5,a5,0x2 + 30026c4: 8bf1 andi a5,a5,28 + 30026c6: fa442703 lw a4,-92(s0) + 30026ca: 00f717b3 sll a5,a4,a5 + 30026ce: fb842703 lw a4,-72(s0) + 30026d2: 8fd9 or a5,a5,a4 + 30026d4: faf42c23 sw a5,-72(s0) + 30026d8: fb842783 lw a5,-72(s0) + 30026dc: 82be mv t0,a5 + 30026de: bc929073 csrw 0xbc9,t0 + break; + 30026e2: aac5 j 30028d2 + case 10: /* GROUP10 */ + SET_LOCAL_INTER_NUM_PRI(10, interPriNum, prior); + 30026e4: bca027f3 csrr a5,0xbca + 30026e8: fcf42223 sw a5,-60(s0) + 30026ec: fc442783 lw a5,-60(s0) + 30026f0: fcf42023 sw a5,-64(s0) + 30026f4: fa842783 lw a5,-88(s0) + 30026f8: 078a slli a5,a5,0x2 + 30026fa: 8bf1 andi a5,a5,28 + 30026fc: 473d li a4,15 + 30026fe: 00f717b3 sll a5,a4,a5 + 3002702: fff7c793 not a5,a5 + 3002706: fc042703 lw a4,-64(s0) + 300270a: 8ff9 and a5,a5,a4 + 300270c: fcf42023 sw a5,-64(s0) + 3002710: fa842783 lw a5,-88(s0) + 3002714: 078a slli a5,a5,0x2 + 3002716: 8bf1 andi a5,a5,28 + 3002718: fa442703 lw a4,-92(s0) + 300271c: 00f717b3 sll a5,a4,a5 + 3002720: fc042703 lw a4,-64(s0) + 3002724: 8fd9 or a5,a5,a4 + 3002726: fcf42023 sw a5,-64(s0) + 300272a: fc042783 lw a5,-64(s0) + 300272e: 82be mv t0,a5 + 3002730: bca29073 csrw 0xbca,t0 + break; + 3002734: aa79 j 30028d2 + case 11: /* GROUP11 */ + SET_LOCAL_INTER_NUM_PRI(11, interPriNum, prior); + 3002736: bcb027f3 csrr a5,0xbcb + 300273a: fcf42623 sw a5,-52(s0) + 300273e: fcc42783 lw a5,-52(s0) + 3002742: fcf42423 sw a5,-56(s0) + 3002746: fa842783 lw a5,-88(s0) + 300274a: 078a slli a5,a5,0x2 + 300274c: 8bf1 andi a5,a5,28 + 300274e: 473d li a4,15 + 3002750: 00f717b3 sll a5,a4,a5 + 3002754: fff7c793 not a5,a5 + 3002758: fc842703 lw a4,-56(s0) + 300275c: 8ff9 and a5,a5,a4 + 300275e: fcf42423 sw a5,-56(s0) + 3002762: fa842783 lw a5,-88(s0) + 3002766: 078a slli a5,a5,0x2 + 3002768: 8bf1 andi a5,a5,28 + 300276a: fa442703 lw a4,-92(s0) + 300276e: 00f717b3 sll a5,a4,a5 + 3002772: fc842703 lw a4,-56(s0) + 3002776: 8fd9 or a5,a5,a4 + 3002778: fcf42423 sw a5,-56(s0) + 300277c: fc842783 lw a5,-56(s0) + 3002780: 82be mv t0,a5 + 3002782: bcb29073 csrw 0xbcb,t0 + break; + 3002786: a2b1 j 30028d2 + case 12: /* GROUP12 */ + SET_LOCAL_INTER_NUM_PRI(12, interPriNum, prior); + 3002788: bcc027f3 csrr a5,0xbcc + 300278c: fcf42a23 sw a5,-44(s0) + 3002790: fd442783 lw a5,-44(s0) + 3002794: fcf42823 sw a5,-48(s0) + 3002798: fa842783 lw a5,-88(s0) + 300279c: 078a slli a5,a5,0x2 + 300279e: 8bf1 andi a5,a5,28 + 30027a0: 473d li a4,15 + 30027a2: 00f717b3 sll a5,a4,a5 + 30027a6: fff7c793 not a5,a5 + 30027aa: fd042703 lw a4,-48(s0) + 30027ae: 8ff9 and a5,a5,a4 + 30027b0: fcf42823 sw a5,-48(s0) + 30027b4: fa842783 lw a5,-88(s0) + 30027b8: 078a slli a5,a5,0x2 + 30027ba: 8bf1 andi a5,a5,28 + 30027bc: fa442703 lw a4,-92(s0) + 30027c0: 00f717b3 sll a5,a4,a5 + 30027c4: fd042703 lw a4,-48(s0) + 30027c8: 8fd9 or a5,a5,a4 + 30027ca: fcf42823 sw a5,-48(s0) + 30027ce: fd042783 lw a5,-48(s0) + 30027d2: 82be mv t0,a5 + 30027d4: bcc29073 csrw 0xbcc,t0 + break; + 30027d8: a8ed j 30028d2 + case 13: /* GROUP13 */ + SET_LOCAL_INTER_NUM_PRI(13, interPriNum, prior); + 30027da: bcd027f3 csrr a5,0xbcd + 30027de: fcf42e23 sw a5,-36(s0) + 30027e2: fdc42783 lw a5,-36(s0) + 30027e6: fcf42c23 sw a5,-40(s0) + 30027ea: fa842783 lw a5,-88(s0) + 30027ee: 078a slli a5,a5,0x2 + 30027f0: 8bf1 andi a5,a5,28 + 30027f2: 473d li a4,15 + 30027f4: 00f717b3 sll a5,a4,a5 + 30027f8: fff7c793 not a5,a5 + 30027fc: fd842703 lw a4,-40(s0) + 3002800: 8ff9 and a5,a5,a4 + 3002802: fcf42c23 sw a5,-40(s0) + 3002806: fa842783 lw a5,-88(s0) + 300280a: 078a slli a5,a5,0x2 + 300280c: 8bf1 andi a5,a5,28 + 300280e: fa442703 lw a4,-92(s0) + 3002812: 00f717b3 sll a5,a4,a5 + 3002816: fd842703 lw a4,-40(s0) + 300281a: 8fd9 or a5,a5,a4 + 300281c: fcf42c23 sw a5,-40(s0) + 3002820: fd842783 lw a5,-40(s0) + 3002824: 82be mv t0,a5 + 3002826: bcd29073 csrw 0xbcd,t0 + break; + 300282a: a065 j 30028d2 + case 14: /* GROUP14 */ + SET_LOCAL_INTER_NUM_PRI(14, interPriNum, prior); + 300282c: bce027f3 csrr a5,0xbce + 3002830: fef42223 sw a5,-28(s0) + 3002834: fe442783 lw a5,-28(s0) + 3002838: fef42023 sw a5,-32(s0) + 300283c: fa842783 lw a5,-88(s0) + 3002840: 078a slli a5,a5,0x2 + 3002842: 8bf1 andi a5,a5,28 + 3002844: 473d li a4,15 + 3002846: 00f717b3 sll a5,a4,a5 + 300284a: fff7c793 not a5,a5 + 300284e: fe042703 lw a4,-32(s0) + 3002852: 8ff9 and a5,a5,a4 + 3002854: fef42023 sw a5,-32(s0) + 3002858: fa842783 lw a5,-88(s0) + 300285c: 078a slli a5,a5,0x2 + 300285e: 8bf1 andi a5,a5,28 + 3002860: fa442703 lw a4,-92(s0) + 3002864: 00f717b3 sll a5,a4,a5 + 3002868: fe042703 lw a4,-32(s0) + 300286c: 8fd9 or a5,a5,a4 + 300286e: fef42023 sw a5,-32(s0) + 3002872: fe042783 lw a5,-32(s0) + 3002876: 82be mv t0,a5 + 3002878: bce29073 csrw 0xbce,t0 + break; + 300287c: a899 j 30028d2 + case 15: /* GROUP15 */ + SET_LOCAL_INTER_NUM_PRI(15, interPriNum, prior); + 300287e: bcf027f3 csrr a5,0xbcf + 3002882: fef42623 sw a5,-20(s0) + 3002886: fec42783 lw a5,-20(s0) + 300288a: fef42423 sw a5,-24(s0) + 300288e: fa842783 lw a5,-88(s0) + 3002892: 078a slli a5,a5,0x2 + 3002894: 8bf1 andi a5,a5,28 + 3002896: 473d li a4,15 + 3002898: 00f717b3 sll a5,a4,a5 + 300289c: fff7c793 not a5,a5 + 30028a0: fe842703 lw a4,-24(s0) + 30028a4: 8ff9 and a5,a5,a4 + 30028a6: fef42423 sw a5,-24(s0) + 30028aa: fa842783 lw a5,-88(s0) + 30028ae: 078a slli a5,a5,0x2 + 30028b0: 8bf1 andi a5,a5,28 + 30028b2: fa442703 lw a4,-92(s0) + 30028b6: 00f717b3 sll a5,a4,a5 + 30028ba: fe842703 lw a4,-24(s0) + 30028be: 8fd9 or a5,a5,a4 + 30028c0: fef42423 sw a5,-24(s0) + 30028c4: fe842783 lw a5,-24(s0) + 30028c8: 82be mv t0,a5 + 30028ca: bcf29073 csrw 0xbcf,t0 + break; + 30028ce: a011 j 30028d2 + default: + break; + 30028d0: 0001 nop + } +} + 30028d2: 0001 nop + 30028d4: 4476 lw s0,92(sp) + 30028d6: 6125 addi sp,sp,96 + 30028d8: 8082 ret + +030028da : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior Priority of this local interrupt to be set. + * @retval None. + */ +static void IRQ_SetLocalPriority(unsigned int interPriNum, unsigned int prior) +{ + 30028da: 7159 addi sp,sp,-112 + 30028dc: d686 sw ra,108(sp) + 30028de: d4a2 sw s0,104(sp) + 30028e0: 1880 addi s0,sp,112 + 30028e2: f8a42e23 sw a0,-100(s0) + 30028e6: f8b42c23 sw a1,-104(s0) +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + RISCV_PRIV_MODE_SWITCH(priv); + unsigned int intNum = GET_LOCAL_INTER_CONFIGREG_NUM(interPriNum); + 30028ea: f9c42783 lw a5,-100(s0) + 30028ee: 838d srli a5,a5,0x3 + 30028f0: fef42623 sw a5,-20(s0) + switch (intNum) { + 30028f4: fec42703 lw a4,-20(s0) + 30028f8: 479d li a5,7 + 30028fa: 2ae7e563 bltu a5,a4,3002ba4 + 30028fe: fec42783 lw a5,-20(s0) + 3002902: 00279713 slli a4,a5,0x2 + 3002906: 030077b7 lui a5,0x3007 + 300290a: 86878793 addi a5,a5,-1944 # 3006868 + 300290e: 97ba add a5,a5,a4 + 3002910: 439c lw a5,0(a5) + 3002912: 8782 jr a5 + case 0: /* GROUP0 */ + SET_LOCAL_INTER_NUM_PRI(0, interPriNum, prior); + 3002914: bc0027f3 csrr a5,0xbc0 + 3002918: faf42823 sw a5,-80(s0) + 300291c: fb042783 lw a5,-80(s0) + 3002920: faf42623 sw a5,-84(s0) + 3002924: f9c42783 lw a5,-100(s0) + 3002928: 078a slli a5,a5,0x2 + 300292a: 8bf1 andi a5,a5,28 + 300292c: 473d li a4,15 + 300292e: 00f717b3 sll a5,a4,a5 + 3002932: fff7c793 not a5,a5 + 3002936: fac42703 lw a4,-84(s0) + 300293a: 8ff9 and a5,a5,a4 + 300293c: faf42623 sw a5,-84(s0) + 3002940: f9c42783 lw a5,-100(s0) + 3002944: 078a slli a5,a5,0x2 + 3002946: 8bf1 andi a5,a5,28 + 3002948: f9842703 lw a4,-104(s0) + 300294c: 00f717b3 sll a5,a4,a5 + 3002950: fac42703 lw a4,-84(s0) + 3002954: 8fd9 or a5,a5,a4 + 3002956: faf42623 sw a5,-84(s0) + 300295a: fac42783 lw a5,-84(s0) + 300295e: 82be mv t0,a5 + 3002960: bc029073 csrw 0xbc0,t0 + break; + 3002964: ac81 j 3002bb4 + case 1: /* GROUP1 */ + SET_LOCAL_INTER_NUM_PRI(1, interPriNum, prior); + 3002966: bc1027f3 csrr a5,0xbc1 + 300296a: faf42c23 sw a5,-72(s0) + 300296e: fb842783 lw a5,-72(s0) + 3002972: faf42a23 sw a5,-76(s0) + 3002976: f9c42783 lw a5,-100(s0) + 300297a: 078a slli a5,a5,0x2 + 300297c: 8bf1 andi a5,a5,28 + 300297e: 473d li a4,15 + 3002980: 00f717b3 sll a5,a4,a5 + 3002984: fff7c793 not a5,a5 + 3002988: fb442703 lw a4,-76(s0) + 300298c: 8ff9 and a5,a5,a4 + 300298e: faf42a23 sw a5,-76(s0) + 3002992: f9c42783 lw a5,-100(s0) + 3002996: 078a slli a5,a5,0x2 + 3002998: 8bf1 andi a5,a5,28 + 300299a: f9842703 lw a4,-104(s0) + 300299e: 00f717b3 sll a5,a4,a5 + 30029a2: fb442703 lw a4,-76(s0) + 30029a6: 8fd9 or a5,a5,a4 + 30029a8: faf42a23 sw a5,-76(s0) + 30029ac: fb442783 lw a5,-76(s0) + 30029b0: 82be mv t0,a5 + 30029b2: bc129073 csrw 0xbc1,t0 + break; + 30029b6: aafd j 3002bb4 + case 2: /* GROUP2 */ + SET_LOCAL_INTER_NUM_PRI(2, interPriNum, prior); + 30029b8: bc2027f3 csrr a5,0xbc2 + 30029bc: fcf42023 sw a5,-64(s0) + 30029c0: fc042783 lw a5,-64(s0) + 30029c4: faf42e23 sw a5,-68(s0) + 30029c8: f9c42783 lw a5,-100(s0) + 30029cc: 078a slli a5,a5,0x2 + 30029ce: 8bf1 andi a5,a5,28 + 30029d0: 473d li a4,15 + 30029d2: 00f717b3 sll a5,a4,a5 + 30029d6: fff7c793 not a5,a5 + 30029da: fbc42703 lw a4,-68(s0) + 30029de: 8ff9 and a5,a5,a4 + 30029e0: faf42e23 sw a5,-68(s0) + 30029e4: f9c42783 lw a5,-100(s0) + 30029e8: 078a slli a5,a5,0x2 + 30029ea: 8bf1 andi a5,a5,28 + 30029ec: f9842703 lw a4,-104(s0) + 30029f0: 00f717b3 sll a5,a4,a5 + 30029f4: fbc42703 lw a4,-68(s0) + 30029f8: 8fd9 or a5,a5,a4 + 30029fa: faf42e23 sw a5,-68(s0) + 30029fe: fbc42783 lw a5,-68(s0) + 3002a02: 82be mv t0,a5 + 3002a04: bc229073 csrw 0xbc2,t0 + break; + 3002a08: a275 j 3002bb4 + case 3: /* GROUP3 */ + SET_LOCAL_INTER_NUM_PRI(3, interPriNum, prior); + 3002a0a: bc3027f3 csrr a5,0xbc3 + 3002a0e: fcf42423 sw a5,-56(s0) + 3002a12: fc842783 lw a5,-56(s0) + 3002a16: fcf42223 sw a5,-60(s0) + 3002a1a: f9c42783 lw a5,-100(s0) + 3002a1e: 078a slli a5,a5,0x2 + 3002a20: 8bf1 andi a5,a5,28 + 3002a22: 473d li a4,15 + 3002a24: 00f717b3 sll a5,a4,a5 + 3002a28: fff7c793 not a5,a5 + 3002a2c: fc442703 lw a4,-60(s0) + 3002a30: 8ff9 and a5,a5,a4 + 3002a32: fcf42223 sw a5,-60(s0) + 3002a36: f9c42783 lw a5,-100(s0) + 3002a3a: 078a slli a5,a5,0x2 + 3002a3c: 8bf1 andi a5,a5,28 + 3002a3e: f9842703 lw a4,-104(s0) + 3002a42: 00f717b3 sll a5,a4,a5 + 3002a46: fc442703 lw a4,-60(s0) + 3002a4a: 8fd9 or a5,a5,a4 + 3002a4c: fcf42223 sw a5,-60(s0) + 3002a50: fc442783 lw a5,-60(s0) + 3002a54: 82be mv t0,a5 + 3002a56: bc329073 csrw 0xbc3,t0 + break; + 3002a5a: aaa9 j 3002bb4 + case 4: /* GROUP4 */ + SET_LOCAL_INTER_NUM_PRI(4, interPriNum, prior); + 3002a5c: bc4027f3 csrr a5,0xbc4 + 3002a60: fcf42823 sw a5,-48(s0) + 3002a64: fd042783 lw a5,-48(s0) + 3002a68: fcf42623 sw a5,-52(s0) + 3002a6c: f9c42783 lw a5,-100(s0) + 3002a70: 078a slli a5,a5,0x2 + 3002a72: 8bf1 andi a5,a5,28 + 3002a74: 473d li a4,15 + 3002a76: 00f717b3 sll a5,a4,a5 + 3002a7a: fff7c793 not a5,a5 + 3002a7e: fcc42703 lw a4,-52(s0) + 3002a82: 8ff9 and a5,a5,a4 + 3002a84: fcf42623 sw a5,-52(s0) + 3002a88: f9c42783 lw a5,-100(s0) + 3002a8c: 078a slli a5,a5,0x2 + 3002a8e: 8bf1 andi a5,a5,28 + 3002a90: f9842703 lw a4,-104(s0) + 3002a94: 00f717b3 sll a5,a4,a5 + 3002a98: fcc42703 lw a4,-52(s0) + 3002a9c: 8fd9 or a5,a5,a4 + 3002a9e: fcf42623 sw a5,-52(s0) + 3002aa2: fcc42783 lw a5,-52(s0) + 3002aa6: 82be mv t0,a5 + 3002aa8: bc429073 csrw 0xbc4,t0 + break; + 3002aac: a221 j 3002bb4 + case 5: /* GROUP5 */ + SET_LOCAL_INTER_NUM_PRI(5, interPriNum, prior); + 3002aae: bc5027f3 csrr a5,0xbc5 + 3002ab2: fcf42c23 sw a5,-40(s0) + 3002ab6: fd842783 lw a5,-40(s0) + 3002aba: fcf42a23 sw a5,-44(s0) + 3002abe: f9c42783 lw a5,-100(s0) + 3002ac2: 078a slli a5,a5,0x2 + 3002ac4: 8bf1 andi a5,a5,28 + 3002ac6: 473d li a4,15 + 3002ac8: 00f717b3 sll a5,a4,a5 + 3002acc: fff7c793 not a5,a5 + 3002ad0: fd442703 lw a4,-44(s0) + 3002ad4: 8ff9 and a5,a5,a4 + 3002ad6: fcf42a23 sw a5,-44(s0) + 3002ada: f9c42783 lw a5,-100(s0) + 3002ade: 078a slli a5,a5,0x2 + 3002ae0: 8bf1 andi a5,a5,28 + 3002ae2: f9842703 lw a4,-104(s0) + 3002ae6: 00f717b3 sll a5,a4,a5 + 3002aea: fd442703 lw a4,-44(s0) + 3002aee: 8fd9 or a5,a5,a4 + 3002af0: fcf42a23 sw a5,-44(s0) + 3002af4: fd442783 lw a5,-44(s0) + 3002af8: 82be mv t0,a5 + 3002afa: bc529073 csrw 0xbc5,t0 + break; + 3002afe: a85d j 3002bb4 + case 6: /* GROUP6 */ + SET_LOCAL_INTER_NUM_PRI(6, interPriNum, prior); + 3002b00: bc6027f3 csrr a5,0xbc6 + 3002b04: fef42023 sw a5,-32(s0) + 3002b08: fe042783 lw a5,-32(s0) + 3002b0c: fcf42e23 sw a5,-36(s0) + 3002b10: f9c42783 lw a5,-100(s0) + 3002b14: 078a slli a5,a5,0x2 + 3002b16: 8bf1 andi a5,a5,28 + 3002b18: 473d li a4,15 + 3002b1a: 00f717b3 sll a5,a4,a5 + 3002b1e: fff7c793 not a5,a5 + 3002b22: fdc42703 lw a4,-36(s0) + 3002b26: 8ff9 and a5,a5,a4 + 3002b28: fcf42e23 sw a5,-36(s0) + 3002b2c: f9c42783 lw a5,-100(s0) + 3002b30: 078a slli a5,a5,0x2 + 3002b32: 8bf1 andi a5,a5,28 + 3002b34: f9842703 lw a4,-104(s0) + 3002b38: 00f717b3 sll a5,a4,a5 + 3002b3c: fdc42703 lw a4,-36(s0) + 3002b40: 8fd9 or a5,a5,a4 + 3002b42: fcf42e23 sw a5,-36(s0) + 3002b46: fdc42783 lw a5,-36(s0) + 3002b4a: 82be mv t0,a5 + 3002b4c: bc629073 csrw 0xbc6,t0 + break; + 3002b50: a095 j 3002bb4 + case 7: /* GROUP7 */ + SET_LOCAL_INTER_NUM_PRI(7, interPriNum, prior); + 3002b52: bc7027f3 csrr a5,0xbc7 + 3002b56: fef42423 sw a5,-24(s0) + 3002b5a: fe842783 lw a5,-24(s0) + 3002b5e: fef42223 sw a5,-28(s0) + 3002b62: f9c42783 lw a5,-100(s0) + 3002b66: 078a slli a5,a5,0x2 + 3002b68: 8bf1 andi a5,a5,28 + 3002b6a: 473d li a4,15 + 3002b6c: 00f717b3 sll a5,a4,a5 + 3002b70: fff7c793 not a5,a5 + 3002b74: fe442703 lw a4,-28(s0) + 3002b78: 8ff9 and a5,a5,a4 + 3002b7a: fef42223 sw a5,-28(s0) + 3002b7e: f9c42783 lw a5,-100(s0) + 3002b82: 078a slli a5,a5,0x2 + 3002b84: 8bf1 andi a5,a5,28 + 3002b86: f9842703 lw a4,-104(s0) + 3002b8a: 00f717b3 sll a5,a4,a5 + 3002b8e: fe442703 lw a4,-28(s0) + 3002b92: 8fd9 or a5,a5,a4 + 3002b94: fef42223 sw a5,-28(s0) + 3002b98: fe442783 lw a5,-28(s0) + 3002b9c: 82be mv t0,a5 + 3002b9e: bc729073 csrw 0xbc7,t0 + break; + 3002ba2: a809 j 3002bb4 + default: + SetLocalIntNumPri(intNum, interPriNum, prior); + 3002ba4: f9842603 lw a2,-104(s0) + 3002ba8: f9c42583 lw a1,-100(s0) + 3002bac: fec42503 lw a0,-20(s0) + 3002bb0: 3485 jal ra,3002610 + break; + 3002bb2: 0001 nop + } + RISCV_PRIV_MODE_SWITCH(priv); +} + 3002bb4: 0001 nop + 3002bb6: 50b6 lw ra,108(sp) + 3002bb8: 5426 lw s0,104(sp) + 3002bba: 6165 addi sp,sp,112 + 3002bbc: 8082 ret + +03002bbe : + * @param irqNum External interrupt number. + * @param priority. + * @retval IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_PRIORITY_INVALID or BASE_STATUS_OK. + */ +unsigned int IRQ_SetPriority(unsigned int irqNum, unsigned int priority) +{ + 3002bbe: 1101 addi sp,sp,-32 + 3002bc0: ce06 sw ra,28(sp) + 3002bc2: cc22 sw s0,24(sp) + 3002bc4: 1000 addi s0,sp,32 + 3002bc6: fea42623 sw a0,-20(s0) + 3002bca: feb42423 sw a1,-24(s0) + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 3002bce: fec42703 lw a4,-20(s0) + 3002bd2: 47e5 li a5,25 + 3002bd4: 00e7f863 bgeu a5,a4,3002be4 + 3002bd8: fec42703 lw a4,-20(s0) + 3002bdc: 07200793 li a5,114 + 3002be0: 00e7fb63 bgeu a5,a4,3002bf6 + 3002be4: 18c00593 li a1,396 + 3002be8: 030077b7 lui a5,0x3007 + 3002bec: 82878513 addi a0,a5,-2008 # 3006828 + 3002bf0: 21bd jal ra,300305e + 3002bf2: 4789 li a5,2 + 3002bf4: a815 j 3002c28 + INTERRUPT_PARAM_CHECK_WITH_RET((priority >= IRQ_PRIO_LOWEST && priority <= IRQ_PRIO_HIGHEST), \ + 3002bf6: fe842783 lw a5,-24(s0) + 3002bfa: c791 beqz a5,3002c06 + 3002bfc: fe842703 lw a4,-24(s0) + 3002c00: 47bd li a5,15 + 3002c02: 00e7fb63 bgeu a5,a4,3002c18 + 3002c06: 18d00593 li a1,397 + 3002c0a: 030077b7 lui a5,0x3007 + 3002c0e: 82878513 addi a0,a5,-2008 # 3006828 + 3002c12: 21b1 jal ra,300305e + 3002c14: 4795 li a5,5 + 3002c16: a809 j 3002c28 + IRQ_ERRNO_PRIORITY_INVALID); + + /* The locipri register is specifically used to configure the priority of the + external non-standard interrupts of the CPU, so the number of internal + standard interrupts should be subtracted */ + IRQ_SetLocalPriority(irqNum - IRQ_VECTOR_CNT, priority); + 3002c18: fec42783 lw a5,-20(s0) + 3002c1c: 1799 addi a5,a5,-26 + 3002c1e: fe842583 lw a1,-24(s0) + 3002c22: 853e mv a0,a5 + 3002c24: 395d jal ra,30028da + + return BASE_STATUS_OK; + 3002c26: 4781 li a5,0 +} + 3002c28: 853e mv a0,a5 + 3002c2a: 40f2 lw ra,28(sp) + 3002c2c: 4462 lw s0,24(sp) + 3002c2e: 6105 addi sp,sp,32 + 3002c30: 8082 ret + +03002c32 : + * @brief Interrupt dummy handler + * @param arg Not used + * @retval None. + */ +static void IRQ_DummyHandler(void *arg) +{ + 3002c32: 1101 addi sp,sp,-32 + 3002c34: ce22 sw s0,28(sp) + 3002c36: 1000 addi s0,sp,32 + 3002c38: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(arg); +} + 3002c3c: 0001 nop + 3002c3e: 4472 lw s0,28(sp) + 3002c40: 6105 addi sp,sp,32 + 3002c42: 8082 ret + +03002c44 : + * @param func callback function + * @param arg callback arg + * @retval None. + */ +static inline void IRQ_SetCallBack(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 3002c44: 1101 addi sp,sp,-32 + 3002c46: ce22 sw s0,28(sp) + 3002c48: 1000 addi s0,sp,32 + 3002c4a: fea42623 sw a0,-20(s0) + 3002c4e: feb42423 sw a1,-24(s0) + 3002c52: fec42223 sw a2,-28(s0) + g_irqCallbackFunc[irqNum].param = arg; + 3002c56: 040007b7 lui a5,0x4000 + 3002c5a: 0fc78713 addi a4,a5,252 # 40000fc + 3002c5e: fec42783 lw a5,-20(s0) + 3002c62: 078e slli a5,a5,0x3 + 3002c64: 97ba add a5,a5,a4 + 3002c66: fe442703 lw a4,-28(s0) + 3002c6a: c3d8 sw a4,4(a5) + g_irqCallbackFunc[irqNum].pfnHandler = func; + 3002c6c: 040007b7 lui a5,0x4000 + 3002c70: 0fc78713 addi a4,a5,252 # 40000fc + 3002c74: fec42783 lw a5,-20(s0) + 3002c78: 078e slli a5,a5,0x3 + 3002c7a: 97ba add a5,a5,a4 + 3002c7c: fe842703 lw a4,-24(s0) + 3002c80: c398 sw a4,0(a5) +} + 3002c82: 0001 nop + 3002c84: 4472 lw s0,28(sp) + 3002c86: 6105 addi sp,sp,32 + 3002c88: 8082 ret + +03002c8a : + * @brief Set the write protection for CRG-related registers disable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionDisable(void) +{ + 3002c8a: 1141 addi sp,sp,-16 + 3002c8c: c622 sw s0,12(sp) + 3002c8e: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = (SYSCTRL0->SC_LOCKEN.reg & SC_LOCKEN_CRG_DISABLE_MASK) + SC_LOCKEN_VALID_HIGH_BIT; + 3002c90: 101007b7 lui a5,0x10100 + 3002c94: 43f8 lw a4,68(a5) + 3002c96: 67c1 lui a5,0x10 + 3002c98: 17f9 addi a5,a5,-2 # fffe + 3002c9a: 00f776b3 and a3,a4,a5 + 3002c9e: 101007b7 lui a5,0x10100 + 3002ca2: ea510737 lui a4,0xea510 + 3002ca6: 9736 add a4,a4,a3 + 3002ca8: c3f8 sw a4,68(a5) +} + 3002caa: 0001 nop + 3002cac: 4432 lw s0,12(sp) + 3002cae: 0141 addi sp,sp,16 + 3002cb0: 8082 ret + +03002cb2 : + * @brief Set the Set the write protection for CRG-related registers enable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionEnable(void) +{ + 3002cb2: 1141 addi sp,sp,-16 + 3002cb4: c622 sw s0,12(sp) + 3002cb6: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = ((SYSCTRL0->SC_LOCKEN.reg & SC_LOW_BIT_MASK) | SC_LOCKEN_CRG_ENABLE_MASK) + + 3002cb8: 101007b7 lui a5,0x10100 + 3002cbc: 43f8 lw a4,68(a5) + 3002cbe: 67c1 lui a5,0x10 + 3002cc0: 17fd addi a5,a5,-1 # ffff + 3002cc2: 8ff9 and a5,a5,a4 + 3002cc4: 0017e693 ori a3,a5,1 + 3002cc8: 101007b7 lui a5,0x10100 + 3002ccc: ea510737 lui a4,0xea510 + 3002cd0: 9736 add a4,a4,a3 + 3002cd2: c3f8 sw a4,68(a5) + SC_LOCKEN_VALID_HIGH_BIT; +} + 3002cd4: 0001 nop + 3002cd6: 4432 lw s0,12(sp) + 3002cd8: 0141 addi sp,sp,16 + 3002cda: 8082 ret + +03002cdc : + * @param clkSelect pll_ref_cksel + * @retval true + * @retval false + */ +static inline bool IsCrgPllRefClkSelect(CRG_PllRefClkSelect clkSelect) +{ + 3002cdc: 1101 addi sp,sp,-32 + 3002cde: ce22 sw s0,28(sp) + 3002ce0: 1000 addi s0,sp,32 + 3002ce2: fea42623 sw a0,-20(s0) + return ((clkSelect == CRG_PLL_REF_CLK_SELECT_HOSC) || + 3002ce6: fec42783 lw a5,-20(s0) + 3002cea: c791 beqz a5,3002cf6 + 3002cec: fec42703 lw a4,-20(s0) + 3002cf0: 4785 li a5,1 + 3002cf2: 00f71463 bne a4,a5,3002cfa + 3002cf6: 4785 li a5,1 + 3002cf8: a011 j 3002cfc + 3002cfa: 4781 li a5,0 + 3002cfc: 8b85 andi a5,a5,1 + 3002cfe: 9f81 uxtb a5 + (clkSelect == CRG_PLL_REF_CLK_SELECT_XTAL)); +} + 3002d00: 853e mv a0,a5 + 3002d02: 4472 lw s0,28(sp) + 3002d04: 6105 addi sp,sp,32 + 3002d06: 8082 ret + +03002d08 : + * @param preDiv pll prediv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPreDiv(CRG_PllPreDiv preDiv) +{ + 3002d08: 1101 addi sp,sp,-32 + 3002d0a: ce22 sw s0,28(sp) + 3002d0c: 1000 addi s0,sp,32 + 3002d0e: fea42623 sw a0,-20(s0) + return ((preDiv >= CRG_PLL_PREDIV_1) && + 3002d12: fec42783 lw a5,-20(s0) + 3002d16: 0087b793 sltiu a5,a5,8 + 3002d1a: 9f81 uxtb a5 + (preDiv <= CRG_PLL_PREDIV_8)); +} + 3002d1c: 853e mv a0,a5 + 3002d1e: 4472 lw s0,28(sp) + 3002d20: 6105 addi sp,sp,32 + 3002d22: 8082 ret + +03002d24 : + * @param postDiv pll_postdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv(CRG_PllPostDiv postDiv) +{ + 3002d24: 1101 addi sp,sp,-32 + 3002d26: ce22 sw s0,28(sp) + 3002d28: 1000 addi s0,sp,32 + 3002d2a: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV_1) && + 3002d2e: fec42783 lw a5,-20(s0) + 3002d32: 0087b793 sltiu a5,a5,8 + 3002d36: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV_8)); +} + 3002d38: 853e mv a0,a5 + 3002d3a: 4472 lw s0,28(sp) + 3002d3c: 6105 addi sp,sp,32 + 3002d3e: 8082 ret + +03002d40 : + * @param postDiv pll_postdiv2 value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv2(CRG_PllPostDiv2 postDiv) +{ + 3002d40: 1101 addi sp,sp,-32 + 3002d42: ce22 sw s0,28(sp) + 3002d44: 1000 addi s0,sp,32 + 3002d46: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV2_1) && + 3002d4a: fec42783 lw a5,-20(s0) + 3002d4e: 0087b793 sltiu a5,a5,8 + 3002d52: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV2_8_MAX)); +} + 3002d54: 853e mv a0,a5 + 3002d56: 4472 lw s0,28(sp) + 3002d58: 6105 addi sp,sp,32 + 3002d5a: 8082 ret + +03002d5c : + * @param fbDiv pll fbdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllFbDiv(unsigned int fbDiv) +{ + 3002d5c: 1101 addi sp,sp,-32 + 3002d5e: ce22 sw s0,28(sp) + 3002d60: 1000 addi s0,sp,32 + 3002d62: fea42623 sw a0,-20(s0) + return (fbDiv <= CRG_PLL_FBDIV_MAX); + 3002d66: fec42783 lw a5,-20(s0) + 3002d6a: 0807b793 sltiu a5,a5,128 + 3002d6e: 9f81 uxtb a5 +} + 3002d70: 853e mv a0,a5 + 3002d72: 4472 lw s0,28(sp) + 3002d74: 6105 addi sp,sp,32 + 3002d76: 8082 ret + +03002d78 : + * @param select core_cksel value + * @retval true + * @retval false + */ +static inline bool IsCrgCoreCkSel(CRG_CoreClkSelect select) +{ + 3002d78: 1101 addi sp,sp,-32 + 3002d7a: ce22 sw s0,28(sp) + 3002d7c: 1000 addi s0,sp,32 + 3002d7e: fea42623 sw a0,-20(s0) + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002d82: fec42783 lw a5,-20(s0) + 3002d86: cb99 beqz a5,3002d9c + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + 3002d88: fec42703 lw a4,-20(s0) + 3002d8c: 4785 li a5,1 + 3002d8e: 00f70763 beq a4,a5,3002d9c + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002d92: fec42703 lw a4,-20(s0) + 3002d96: 4789 li a5,2 + 3002d98: 00f71463 bne a4,a5,3002da0 + 3002d9c: 4785 li a5,1 + 3002d9e: a011 j 3002da2 + 3002da0: 4781 li a5,0 + 3002da2: 8b85 andi a5,a5,1 + 3002da4: 9f81 uxtb a5 + (select == CRG_CORE_CLK_SELECT_PLL)); +} + 3002da6: 853e mv a0,a5 + 3002da8: 4472 lw s0,28(sp) + 3002daa: 6105 addi sp,sp,32 + 3002dac: 8082 ret + +03002dae : + * @param select 1M clock selection + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkSel(CRG_1MClkSelect select) +{ + 3002dae: 1101 addi sp,sp,-32 + 3002db0: ce22 sw s0,28(sp) + 3002db2: 1000 addi s0,sp,32 + 3002db4: fea42623 sw a0,-20(s0) + return ((select == CRG_1M_CLK_SELECT_HOSC) || + 3002db8: fec42783 lw a5,-20(s0) + 3002dbc: c791 beqz a5,3002dc8 + 3002dbe: fec42703 lw a4,-20(s0) + 3002dc2: 4785 li a5,1 + 3002dc4: 00f71463 bne a4,a5,3002dcc + 3002dc8: 4785 li a5,1 + 3002dca: a011 j 3002dce + 3002dcc: 4781 li a5,0 + 3002dce: 8b85 andi a5,a5,1 + 3002dd0: 9f81 uxtb a5 + (select == CRG_1M_CLK_SELECT_TCXO)); +} + 3002dd2: 853e mv a0,a5 + 3002dd4: 4472 lw s0,28(sp) + 3002dd6: 6105 addi sp,sp,32 + 3002dd8: 8082 ret + +03002dda : + * @param div 1M clock ratio + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkDiv(unsigned int div) +{ + 3002dda: 1101 addi sp,sp,-32 + 3002ddc: ce22 sw s0,28(sp) + 3002dde: 1000 addi s0,sp,32 + 3002de0: fea42623 sw a0,-20(s0) + return (div <= CRG_1MHZ_CLK_MAX_DIV); + 3002de4: fec42783 lw a5,-20(s0) + 3002de8: 0407b793 sltiu a5,a5,64 + 3002dec: 9f81 uxtb a5 +} + 3002dee: 853e mv a0,a5 + 3002df0: 4472 lw s0,28(sp) + 3002df2: 6105 addi sp,sp,32 + 3002df4: 8082 ret + +03002df6 : + * @param preDiv PLL Previous Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPreDiv(unsigned int pllRefFreq, unsigned int preDiv) +{ + 3002df6: 7179 addi sp,sp,-48 + 3002df8: d622 sw s0,44(sp) + 3002dfa: 1800 addi s0,sp,48 + 3002dfc: fca42e23 sw a0,-36(s0) + 3002e00: fcb42c23 sw a1,-40(s0) + unsigned int freq = pllRefFreq; + 3002e04: fdc42783 lw a5,-36(s0) + 3002e08: fef42623 sw a5,-20(s0) + if (preDiv != 0) { + 3002e0c: fd842783 lw a5,-40(s0) + 3002e10: cb89 beqz a5,3002e22 + freq /= preDiv; + 3002e12: fec42703 lw a4,-20(s0) + 3002e16: fd842783 lw a5,-40(s0) + 3002e1a: 02f757b3 divu a5,a4,a5 + 3002e1e: fef42623 sw a5,-20(s0) + } + return (freq >= CRG_CLK_PFD_MIN_FREQ) && (freq <= CRG_CLK_PFD_MAX_FREQ); + 3002e22: fec42703 lw a4,-20(s0) + 3002e26: 003d17b7 lui a5,0x3d1 + 3002e2a: 8ff78793 addi a5,a5,-1793 # 3d08ff + 3002e2e: 00e7fc63 bgeu a5,a4,3002e46 + 3002e32: fec42703 lw a4,-20(s0) + 3002e36: 007277b7 lui a5,0x727 + 3002e3a: 0e078793 addi a5,a5,224 # 7270e0 + 3002e3e: 00e7e463 bltu a5,a4,3002e46 + 3002e42: 4785 li a5,1 + 3002e44: a011 j 3002e48 + 3002e46: 4781 li a5,0 + 3002e48: 8b85 andi a5,a5,1 + 3002e4a: 9f81 uxtb a5 +} + 3002e4c: 853e mv a0,a5 + 3002e4e: 5432 lw s0,44(sp) + 3002e50: 6145 addi sp,sp,48 + 3002e52: 8082 ret + +03002e54 : + * @param fdDiv PLL FD Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidFdDiv(unsigned int clkPfdFreq, unsigned int fdDiv) +{ + 3002e54: 7179 addi sp,sp,-48 + 3002e56: d622 sw s0,44(sp) + 3002e58: 1800 addi s0,sp,48 + 3002e5a: fca42e23 sw a0,-36(s0) + 3002e5e: fcb42c23 sw a1,-40(s0) + if (clkPfdFreq > 30000000U) { /* The maximum speed of the external clock source is 30000000U. */ + 3002e62: fdc42703 lw a4,-36(s0) + 3002e66: 01c9c7b7 lui a5,0x1c9c + 3002e6a: 38078793 addi a5,a5,896 # 1c9c380 + 3002e6e: 00e7f463 bgeu a5,a4,3002e76 + return false; + 3002e72: 4781 li a5,0 + 3002e74: a08d j 3002ed6 + } else if (fdDiv > CRG_PLL_FBDIV_MAX) { + 3002e76: fd842703 lw a4,-40(s0) + 3002e7a: 07f00793 li a5,127 + 3002e7e: 00e7f463 bgeu a5,a4,3002e86 + return false; + 3002e82: 4781 li a5,0 + 3002e84: a889 j 3002ed6 + } + + unsigned int freq = (fdDiv > 0x6) ? (clkPfdFreq * fdDiv) : (clkPfdFreq * 0x6); /* 0x0-0x6: divided by 0x6 */ + 3002e86: fd842703 lw a4,-40(s0) + 3002e8a: 4799 li a5,6 + 3002e8c: 00e7f963 bgeu a5,a4,3002e9e + 3002e90: fdc42703 lw a4,-36(s0) + 3002e94: fd842783 lw a5,-40(s0) + 3002e98: 02f707b3 mul a5,a4,a5 + 3002e9c: a031 j 3002ea8 + 3002e9e: fdc42703 lw a4,-36(s0) + 3002ea2: 4799 li a5,6 + 3002ea4: 02f707b3 mul a5,a4,a5 + 3002ea8: fef42623 sw a5,-20(s0) + return (freq >= CRG_CLK_VCO_MIN_FREQ) && (freq <= CRG_CLK_VCO_MAX_FREQ); + 3002eac: fec42703 lw a4,-20(s0) + 3002eb0: 05f5e7b7 lui a5,0x5f5e + 3002eb4: 0ff78793 addi a5,a5,255 # 5f5e0ff + 3002eb8: 00e7fc63 bgeu a5,a4,3002ed0 + 3002ebc: fec42703 lw a4,-20(s0) + 3002ec0: 11e1a7b7 lui a5,0x11e1a + 3002ec4: 30078793 addi a5,a5,768 # 11e1a300 + 3002ec8: 00e7e463 bltu a5,a4,3002ed0 + 3002ecc: 4785 li a5,1 + 3002ece: a011 j 3002ed2 + 3002ed0: 4781 li a5,0 + 3002ed2: 8b85 andi a5,a5,1 + 3002ed4: 9f81 uxtb a5 +} + 3002ed6: 853e mv a0,a5 + 3002ed8: 5432 lw s0,44(sp) + 3002eda: 6145 addi sp,sp,48 + 3002edc: 8082 ret + +03002ede : + * @param postDiv PLL Post Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv(unsigned int clkVcoFreq, unsigned int postDiv) +{ + 3002ede: 7179 addi sp,sp,-48 + 3002ee0: d622 sw s0,44(sp) + 3002ee2: 1800 addi s0,sp,48 + 3002ee4: fca42e23 sw a0,-36(s0) + 3002ee8: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002eec: fdc42783 lw a5,-36(s0) + 3002ef0: fef42623 sw a5,-20(s0) + if (postDiv != 0) { + 3002ef4: fd842783 lw a5,-40(s0) + 3002ef8: cb91 beqz a5,3002f0c + freq /= (postDiv + 1); + 3002efa: fd842783 lw a5,-40(s0) + 3002efe: 0785 addi a5,a5,1 + 3002f00: fec42703 lw a4,-20(s0) + 3002f04: 02f757b3 divu a5,a4,a5 + 3002f08: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_TARGET_MAX_FREQ); + 3002f0c: fec42703 lw a4,-20(s0) + 3002f10: 08f0d7b7 lui a5,0x8f0d + 3002f14: 18178793 addi a5,a5,385 # 8f0d181 + 3002f18: 00f737b3 sltu a5,a4,a5 + 3002f1c: 9f81 uxtb a5 +} + 3002f1e: 853e mv a0,a5 + 3002f20: 5432 lw s0,44(sp) + 3002f22: 6145 addi sp,sp,48 + 3002f24: 8082 ret + +03002f26 : + * @param postDiv2 PLL Post Divsion2 + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv2(unsigned int clkVcoFreq, unsigned int postDiv2) +{ + 3002f26: 7179 addi sp,sp,-48 + 3002f28: d622 sw s0,44(sp) + 3002f2a: 1800 addi s0,sp,48 + 3002f2c: fca42e23 sw a0,-36(s0) + 3002f30: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002f34: fdc42783 lw a5,-36(s0) + 3002f38: fef42623 sw a5,-20(s0) + if (postDiv2 != 0) { + 3002f3c: fd842783 lw a5,-40(s0) + 3002f40: cb91 beqz a5,3002f54 + freq /= (postDiv2 + 1); + 3002f42: fd842783 lw a5,-40(s0) + 3002f46: 0785 addi a5,a5,1 + 3002f48: fec42703 lw a4,-20(s0) + 3002f4c: 02f757b3 divu a5,a4,a5 + 3002f50: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_PST2_MAX_FREQ); + 3002f54: fec42703 lw a4,-20(s0) + 3002f58: 05f5e7b7 lui a5,0x5f5e + 3002f5c: 10178793 addi a5,a5,257 # 5f5e101 + 3002f60: 00f737b3 sltu a5,a4,a5 + 3002f64: 9f81 uxtb a5 +} + 3002f66: 853e mv a0,a5 + 3002f68: 5432 lw s0,44(sp) + 3002f6a: 6145 addi sp,sp,48 + 3002f6c: 8082 ret + +03002f6e : + * @param adcClkSelect the value of adc clock select + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkModeSelect(CRG_AdcClkSelect adcClkSelect) +{ + 3002f6e: 1101 addi sp,sp,-32 + 3002f70: ce22 sw s0,28(sp) + 3002f72: 1000 addi s0,sp,32 + 3002f74: fea42623 sw a0,-20(s0) + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002f78: fec42783 lw a5,-20(s0) + 3002f7c: c385 beqz a5,3002f9c + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + 3002f7e: fec42703 lw a4,-20(s0) + 3002f82: 4785 li a5,1 + 3002f84: 00f70c63 beq a4,a5,3002f9c + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + 3002f88: fec42703 lw a4,-20(s0) + 3002f8c: 4789 li a5,2 + 3002f8e: 00f70763 beq a4,a5,3002f9c + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002f92: fec42703 lw a4,-20(s0) + 3002f96: 478d li a5,3 + 3002f98: 00f71463 bne a4,a5,3002fa0 + 3002f9c: 4785 li a5,1 + 3002f9e: a011 j 3002fa2 + 3002fa0: 4781 li a5,0 + 3002fa2: 8b85 andi a5,a5,1 + 3002fa4: 9f81 uxtb a5 + adcClkSelect == CRG_ADC_CLK_SYN_CORE); +} + 3002fa6: 853e mv a0,a5 + 3002fa8: 4472 lw s0,28(sp) + 3002faa: 6105 addi sp,sp,32 + 3002fac: 8082 ret + +03002fae : + * @param div the value of adc clock div + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkDiv(CRG_AdcDiv div) +{ + 3002fae: 1101 addi sp,sp,-32 + 3002fb0: ce22 sw s0,28(sp) + 3002fb2: 1000 addi s0,sp,32 + 3002fb4: fea42623 sw a0,-20(s0) + return (div == CRG_ADC_DIV_1 || \ + div == CRG_ADC_DIV_2 || \ + div == CRG_ADC_DIV_3 || \ + 3002fb8: fec42783 lw a5,-20(s0) + 3002fbc: c385 beqz a5,3002fdc + return (div == CRG_ADC_DIV_1 || \ + 3002fbe: fec42703 lw a4,-20(s0) + 3002fc2: 4785 li a5,1 + 3002fc4: 00f70c63 beq a4,a5,3002fdc + div == CRG_ADC_DIV_2 || \ + 3002fc8: fec42703 lw a4,-20(s0) + 3002fcc: 4789 li a5,2 + 3002fce: 00f70763 beq a4,a5,3002fdc + div == CRG_ADC_DIV_3 || \ + 3002fd2: fec42703 lw a4,-20(s0) + 3002fd6: 478d li a5,3 + 3002fd8: 00f71463 bne a4,a5,3002fe0 + 3002fdc: 4785 li a5,1 + 3002fde: a011 j 3002fe2 + 3002fe0: 4781 li a5,0 + 3002fe2: 8b85 andi a5,a5,1 + 3002fe4: 9f81 uxtb a5 + div == CRG_ADC_DIV_4); +} + 3002fe6: 853e mv a0,a5 + 3002fe8: 4472 lw s0,28(sp) + 3002fea: 6105 addi sp,sp,32 + 3002fec: 8082 ret + +03002fee : + * @param clk Clock register base address + * @param select Core clock selection + * @retval None + */ +static inline void DCL_CRG_SetCoreClkSel(CRG_RegStruct *clk, CRG_CoreClkSelect select) +{ + 3002fee: 1101 addi sp,sp,-32 + 3002ff0: ce06 sw ra,28(sp) + 3002ff2: cc22 sw s0,24(sp) + 3002ff4: 1000 addi s0,sp,32 + 3002ff6: fea42623 sw a0,-20(s0) + 3002ffa: feb42423 sw a1,-24(s0) + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + 3002ffe: fec42703 lw a4,-20(s0) + 3003002: 100007b7 lui a5,0x10000 + 3003006: 00f70a63 beq a4,a5,300301a + 300300a: 64b00593 li a1,1611 + 300300e: 030077b7 lui a5,0x3007 + 3003012: 88878513 addi a0,a5,-1912 # 3006888 + 3003016: 20a1 jal ra,300305e + 3003018: a001 j 3003018 + CRG_PARAM_CHECK_NO_RET(IsCrgCoreCkSel(select)); + 300301a: fe842503 lw a0,-24(s0) + 300301e: 3ba9 jal ra,3002d78 + 3003020: 87aa mv a5,a0 + 3003022: 0017c793 xori a5,a5,1 + 3003026: 9f81 uxtb a5 + 3003028: cb89 beqz a5,300303a + 300302a: 64c00593 li a1,1612 + 300302e: 030077b7 lui a5,0x3007 + 3003032: 88878513 addi a0,a5,-1912 # 3006888 + 3003036: 2025 jal ra,300305e + 3003038: a839 j 3003056 + clk->PERI_CRG64.BIT.clk_pst1_sw_sel = select; + 300303a: fe842783 lw a5,-24(s0) + 300303e: 8b8d andi a5,a5,3 + 3003040: 0ff7f693 andi a3,a5,255 + 3003044: fec42703 lw a4,-20(s0) + 3003048: 10072783 lw a5,256(a4) # ea510100 + 300304c: 8a8d andi a3,a3,3 + 300304e: 9bf1 andi a5,a5,-4 + 3003050: 8fd5 or a5,a5,a3 + 3003052: 10f72023 sw a5,256(a4) +} + 3003056: 40f2 lw ra,28(sp) + 3003058: 4462 lw s0,24(sp) + 300305a: 6105 addi sp,sp,32 + 300305c: 8082 ret + +0300305e : + 300305e: 988ff06f j 30021e6 + +03003062 : + * @param handle CRG Handle + * @retval BASE_STATUS_ERROR Parameter Check fail + * @retval BASE_STATUS_OK Success + */ +BASE_StatusType HAL_CRG_Init(const CRG_Handle *handle) +{ + 3003062: 7179 addi sp,sp,-48 + 3003064: d606 sw ra,44(sp) + 3003066: d422 sw s0,40(sp) + 3003068: 1800 addi s0,sp,48 + 300306a: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != NULL); + 300306e: fdc42783 lw a5,-36(s0) + 3003072: eb89 bnez a5,3003084 + 3003074: 07100593 li a1,113 + 3003078: 030077b7 lui a5,0x3007 + 300307c: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003080: 3ff9 jal ra,300305e + 3003082: a001 j 3003082 + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3003084: fdc42783 lw a5,-36(s0) + 3003088: 4398 lw a4,0(a5) + 300308a: 100007b7 lui a5,0x10000 + 300308e: 00f70a63 beq a4,a5,30030a2 + 3003092: 07200593 li a1,114 + 3003096: 030077b7 lui a5,0x3007 + 300309a: 8a478513 addi a0,a5,-1884 # 30068a4 + 300309e: 37c1 jal ra,300305e + 30030a0: a001 j 30030a0 + /* Check the validity of PLL-related parameters. */ + CRG_PARAM_CHECK_WITH_RET(IsCrgPllRefClkSelect(handle->pllRefClkSelect), BASE_STATUS_ERROR); + 30030a2: fdc42783 lw a5,-36(s0) + 30030a6: 43dc lw a5,4(a5) + 30030a8: 853e mv a0,a5 + 30030aa: 390d jal ra,3002cdc + 30030ac: 87aa mv a5,a0 + 30030ae: 0017c793 xori a5,a5,1 + 30030b2: 9f81 uxtb a5 + 30030b4: cb91 beqz a5,30030c8 + 30030b6: 07400593 li a1,116 + 30030ba: 030077b7 lui a5,0x3007 + 30030be: 8a478513 addi a0,a5,-1884 # 30068a4 + 30030c2: 3f71 jal ra,300305e + 30030c4: 4785 li a5,1 + 30030c6: aca9 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPreDiv(handle->pllPreDiv), BASE_STATUS_ERROR); + 30030c8: fdc42783 lw a5,-36(s0) + 30030cc: 479c lw a5,8(a5) + 30030ce: 853e mv a0,a5 + 30030d0: 3925 jal ra,3002d08 + 30030d2: 87aa mv a5,a0 + 30030d4: 0017c793 xori a5,a5,1 + 30030d8: 9f81 uxtb a5 + 30030da: cb91 beqz a5,30030ee + 30030dc: 07500593 li a1,117 + 30030e0: 030077b7 lui a5,0x3007 + 30030e4: 8a478513 addi a0,a5,-1884 # 30068a4 + 30030e8: 3f9d jal ra,300305e + 30030ea: 4785 li a5,1 + 30030ec: ac15 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllFbDiv(handle->pllFbDiv), BASE_STATUS_ERROR); + 30030ee: fdc42783 lw a5,-36(s0) + 30030f2: 47dc lw a5,12(a5) + 30030f4: 853e mv a0,a5 + 30030f6: 319d jal ra,3002d5c + 30030f8: 87aa mv a5,a0 + 30030fa: 0017c793 xori a5,a5,1 + 30030fe: 9f81 uxtb a5 + 3003100: cb91 beqz a5,3003114 + 3003102: 07600593 li a1,118 + 3003106: 030077b7 lui a5,0x3007 + 300310a: 8a478513 addi a0,a5,-1884 # 30068a4 + 300310e: 3f81 jal ra,300305e + 3003110: 4785 li a5,1 + 3003112: a439 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv(handle->pllPostDiv), BASE_STATUS_ERROR); + 3003114: fdc42783 lw a5,-36(s0) + 3003118: 4b9c lw a5,16(a5) + 300311a: 853e mv a0,a5 + 300311c: 3121 jal ra,3002d24 + 300311e: 87aa mv a5,a0 + 3003120: 0017c793 xori a5,a5,1 + 3003124: 9f81 uxtb a5 + 3003126: cb91 beqz a5,300313a + 3003128: 07700593 li a1,119 + 300312c: 030077b7 lui a5,0x3007 + 3003130: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003134: 372d jal ra,300305e + 3003136: 4785 li a5,1 + 3003138: a2e5 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv2(handle->handleEx.pllPostDiv2), BASE_STATUS_ERROR); + 300313a: fdc42783 lw a5,-36(s0) + 300313e: 4fdc lw a5,28(a5) + 3003140: 853e mv a0,a5 + 3003142: 3efd jal ra,3002d40 + 3003144: 87aa mv a5,a0 + 3003146: 0017c793 xori a5,a5,1 + 300314a: 9f81 uxtb a5 + 300314c: cb91 beqz a5,3003160 + 300314e: 07800593 li a1,120 + 3003152: 030077b7 lui a5,0x3007 + 3003156: 8a478513 addi a0,a5,-1884 # 30068a4 + 300315a: 3711 jal ra,300305e + 300315c: 4785 li a5,1 + 300315e: a2c9 j 3003320 + /* Check the Clock Source and Frequency Divider of the 1 MHz Clock. */ + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkSel(handle->handleEx.clk1MSelect), BASE_STATUS_ERROR); + 3003160: fdc42783 lw a5,-36(s0) + 3003164: 539c lw a5,32(a5) + 3003166: 853e mv a0,a5 + 3003168: 3199 jal ra,3002dae + 300316a: 87aa mv a5,a0 + 300316c: 0017c793 xori a5,a5,1 + 3003170: 9f81 uxtb a5 + 3003172: cb91 beqz a5,3003186 + 3003174: 07a00593 li a1,122 + 3003178: 030077b7 lui a5,0x3007 + 300317c: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003180: 3df9 jal ra,300305e + 3003182: 4785 li a5,1 + 3003184: aa71 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkDiv(handle->handleEx.clk1MDiv), BASE_STATUS_ERROR); + 3003186: fdc42783 lw a5,-36(s0) + 300318a: 53dc lw a5,36(a5) + 300318c: 853e mv a0,a5 + 300318e: 31b1 jal ra,3002dda + 3003190: 87aa mv a5,a0 + 3003192: 0017c793 xori a5,a5,1 + 3003196: 9f81 uxtb a5 + 3003198: cb91 beqz a5,30031ac + 300319a: 07b00593 li a1,123 + 300319e: 030077b7 lui a5,0x3007 + 30031a2: 8a478513 addi a0,a5,-1884 # 30068a4 + 30031a6: 3d65 jal ra,300305e + 30031a8: 4785 li a5,1 + 30031aa: aa9d j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 30031ac: fdc42783 lw a5,-36(s0) + 30031b0: 4f9c lw a5,24(a5) + 30031b2: 853e mv a0,a5 + 30031b4: 36d1 jal ra,3002d78 + 30031b6: 87aa mv a5,a0 + 30031b8: 0017c793 xori a5,a5,1 + 30031bc: 9f81 uxtb a5 + 30031be: cb91 beqz a5,30031d2 + 30031c0: 07c00593 li a1,124 + 30031c4: 030077b7 lui a5,0x3007 + 30031c8: 8a478513 addi a0,a5,-1884 # 30068a4 + 30031cc: 3d49 jal ra,300305e + 30031ce: 4785 li a5,1 + 30031d0: aa81 j 3003320 + + *(unsigned int *)CRG_HOSC_CTRL2_ADDR = 0x306E; /* Optimized HOSC temperature drift performance parameter. */ + 30031d2: 100017b7 lui a5,0x10001 + 30031d6: f0478793 addi a5,a5,-252 # 10000f04 + 30031da: 670d lui a4,0x3 + 30031dc: 06e70713 addi a4,a4,110 # 306e + 30031e0: c398 sw a4,0(a5) + + CRG_RegStruct *reg = handle->baseAddress; + 30031e2: fdc42783 lw a5,-36(s0) + 30031e6: 439c lw a5,0(a5) + 30031e8: fef42623 sw a5,-20(s0) + g_crgBaseAddr = (void *)reg; + 30031ec: 040007b7 lui a5,0x4000 + 30031f0: fec42703 lw a4,-20(s0) + 30031f4: 48e7aa23 sw a4,1172(a5) # 4000494 + /* Check the validity of the PLL parameter configuration. */ + if (CRG_IsValidPllConfig(handle) != BASE_STATUS_OK) { + 30031f8: fdc42503 lw a0,-36(s0) + 30031fc: 7a4000ef jal ra,30039a0 + 3003200: 87aa mv a5,a0 + 3003202: c399 beqz a5,3003208 + return BASE_STATUS_ERROR; + 3003204: 4785 li a5,1 + 3003206: aa29 j 3003320 + } + /* Disable the write protection function of the CRG register. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3003208: 3449 jal ra,3002c8a + + reg->PERI_CRG0.BIT.pll_ref_cksel = handle->pllRefClkSelect; + 300320a: fdc42783 lw a5,-36(s0) + 300320e: 43dc lw a5,4(a5) + 3003210: 8b85 andi a5,a5,1 + 3003212: 0ff7f693 andi a3,a5,255 + 3003216: fec42703 lw a4,-20(s0) + 300321a: 431c lw a5,0(a4) + 300321c: 8a85 andi a3,a3,1 + 300321e: 9bf9 andi a5,a5,-2 + 3003220: 8fd5 or a5,a5,a3 + 3003222: c31c sw a5,0(a4) + reg->PERI_CRG1.BIT.pll_prediv = handle->pllPreDiv; + 3003224: fdc42783 lw a5,-36(s0) + 3003228: 479c lw a5,8(a5) + 300322a: 8bbd andi a5,a5,15 + 300322c: 0ff7f693 andi a3,a5,255 + 3003230: fec42703 lw a4,-20(s0) + 3003234: 435c lw a5,4(a4) + 3003236: 8abd andi a3,a3,15 + 3003238: 9bc1 andi a5,a5,-16 + 300323a: 8fd5 or a5,a5,a3 + 300323c: c35c sw a5,4(a4) + reg->PERI_CRG2.BIT.pll_fbdiv = handle->pllFbDiv; + 300323e: fdc42783 lw a5,-36(s0) + 3003242: 47dc lw a5,12(a5) + 3003244: 0ff7f693 andi a3,a5,255 + 3003248: fec42703 lw a4,-20(s0) + 300324c: 471c lw a5,8(a4) + 300324e: 0ff6f693 andi a3,a3,255 + 3003252: f007f793 andi a5,a5,-256 + 3003256: 8fd5 or a5,a5,a3 + 3003258: c71c sw a5,8(a4) + reg->PERI_CRG3.BIT.pll_postdiv1 = handle->pllPostDiv; + 300325a: fdc42783 lw a5,-36(s0) + 300325e: 4b9c lw a5,16(a5) + 3003260: 8bbd andi a5,a5,15 + 3003262: 0ff7f693 andi a3,a5,255 + 3003266: fec42703 lw a4,-20(s0) + 300326a: 475c lw a5,12(a4) + 300326c: 8abd andi a3,a3,15 + 300326e: 9bc1 andi a5,a5,-16 + 3003270: 8fd5 or a5,a5,a3 + 3003272: c75c sw a5,12(a4) + reg->PERI_CRG3.BIT.pll_postdiv2 = handle->handleEx.pllPostDiv2; + 3003274: fdc42783 lw a5,-36(s0) + 3003278: 4fdc lw a5,28(a5) + 300327a: 8bbd andi a5,a5,15 + 300327c: 0ff7f693 andi a3,a5,255 + 3003280: fec42703 lw a4,-20(s0) + 3003284: 475c lw a5,12(a4) + 3003286: 8abd andi a3,a3,15 + 3003288: 0692 slli a3,a3,0x4 + 300328a: f0f7f793 andi a5,a5,-241 + 300328e: 8fd5 or a5,a5,a3 + 3003290: c75c sw a5,12(a4) + reg->PERI_CRG4.BIT.pll_pd = BASE_CFG_UNSET; + 3003292: fec42703 lw a4,-20(s0) + 3003296: 4b1c lw a5,16(a4) + 3003298: 9bf9 andi a5,a5,-2 + 300329a: cb1c sw a5,16(a4) + + while (reg->PERI_CRG7.BIT.pll_lock != BASE_CFG_SET) { + 300329c: 0001 nop + 300329e: fec42783 lw a5,-20(s0) + 30032a2: 4fdc lw a5,28(a5) + 30032a4: 8b85 andi a5,a5,1 + 30032a6: 0ff7f713 andi a4,a5,255 + 30032aa: 4785 li a5,1 + 30032ac: fef719e3 bne a4,a5,300329e + ; /* Wait for PLL to lock */ + } + + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 30032b0: 3409 jal ra,3002cb2 + /* Check the 1MHz clock parameter configuration. */ + if (CRG_IsValid1MHzConfig(handle) != BASE_STATUS_OK) { + 30032b2: fdc42503 lw a0,-36(s0) + 30032b6: 7ac000ef jal ra,3003a62 + 30032ba: 87aa mv a5,a0 + 30032bc: c399 beqz a5,30032c2 + return BASE_STATUS_ERROR; + 30032be: 4785 li a5,1 + 30032c0: a085 j 3003320 + } + while (reg->HOSC_LOCK.BIT.hosc_lock != BASE_CFG_SET) { + 30032c2: 0001 nop + 30032c4: fec42703 lw a4,-20(s0) + 30032c8: 6785 lui a5,0x1 + 30032ca: 97ba add a5,a5,a4 + 30032cc: f107a783 lw a5,-240(a5) # f10 + 30032d0: 8b85 andi a5,a5,1 + 30032d2: 0ff7f713 andi a4,a5,255 + 30032d6: 4785 li a5,1 + 30032d8: fef716e3 bne a4,a5,30032c4 + ; /* Wait for HOSC to lock */ + } + /* Set the Clock Source and Frequency Divider of the 1 MHz Clock. */ + reg->PERI_CRG67.BIT.clk_1m_div = handle->handleEx.clk1MDiv; + 30032dc: fdc42783 lw a5,-36(s0) + 30032e0: 53dc lw a5,36(a5) + 30032e2: 03f7f793 andi a5,a5,63 + 30032e6: 0ff7f693 andi a3,a5,255 + 30032ea: fec42703 lw a4,-20(s0) + 30032ee: 10c72783 lw a5,268(a4) + 30032f2: 03f6f693 andi a3,a3,63 + 30032f6: fc07f793 andi a5,a5,-64 + 30032fa: 8fd5 or a5,a5,a3 + 30032fc: 10f72623 sw a5,268(a4) + reg->PERI_CRG66.BIT.clk_1m_ini_cksel = handle->handleEx.clk1MSelect; + 3003300: fdc42783 lw a5,-36(s0) + 3003304: 539c lw a5,32(a5) + 3003306: 8b85 andi a5,a5,1 + 3003308: 0ff7f693 andi a3,a5,255 + 300330c: fec42703 lw a4,-20(s0) + 3003310: 10872783 lw a5,264(a4) + 3003314: 8a85 andi a3,a3,1 + 3003316: 9bf9 andi a5,a5,-2 + 3003318: 8fd5 or a5,a5,a3 + 300331a: 10f72423 sw a5,264(a4) + return BASE_STATUS_OK; + 300331e: 4781 li a5,0 +} + 3003320: 853e mv a0,a5 + 3003322: 50b2 lw ra,44(sp) + 3003324: 5422 lw s0,40(sp) + 3003326: 6145 addi sp,sp,48 + 3003328: 8082 ret + +0300332a : + * @param handle CRG Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Paramter check fail + */ +BASE_StatusType HAL_CRG_SetCoreClockSelect(CRG_Handle *handle) +{ + 300332a: 7179 addi sp,sp,-48 + 300332c: d606 sw ra,44(sp) + 300332e: d422 sw s0,40(sp) + 3003330: 1800 addi s0,sp,48 + 3003332: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != 0); + 3003336: fdc42783 lw a5,-36(s0) + 300333a: eb89 bnez a5,300334c + 300333c: 10a00593 li a1,266 + 3003340: 030077b7 lui a5,0x3007 + 3003344: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003348: 3b19 jal ra,300305e + 300334a: a001 j 300334a + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 300334c: fdc42783 lw a5,-36(s0) + 3003350: 4398 lw a4,0(a5) + 3003352: 100007b7 lui a5,0x10000 + 3003356: 00f70a63 beq a4,a5,300336a + 300335a: 10b00593 li a1,267 + 300335e: 030077b7 lui a5,0x3007 + 3003362: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003366: 39e5 jal ra,300305e + 3003368: a001 j 3003368 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 300336a: fdc42783 lw a5,-36(s0) + 300336e: 4f9c lw a5,24(a5) + 3003370: 853e mv a0,a5 + 3003372: 3419 jal ra,3002d78 + 3003374: 87aa mv a5,a0 + 3003376: 0017c793 xori a5,a5,1 + 300337a: 9f81 uxtb a5 + 300337c: cb91 beqz a5,3003390 + 300337e: 10c00593 li a1,268 + 3003382: 030077b7 lui a5,0x3007 + 3003386: 8a478513 addi a0,a5,-1884 # 30068a4 + 300338a: 39d1 jal ra,300305e + 300338c: 4785 li a5,1 + 300338e: a005 j 30033ae + + CRG_RegStruct *reg = handle->baseAddress; + 3003390: fdc42783 lw a5,-36(s0) + 3003394: 439c lw a5,0(a5) + 3003396: fef42623 sw a5,-20(s0) + /* The write protection of the CRG register needs to be disabled. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 300339a: 38c5 jal ra,3002c8a + DCL_CRG_SetCoreClkSel(reg, handle->coreClkSelect); + 300339c: fdc42783 lw a5,-36(s0) + 30033a0: 4f9c lw a5,24(a5) + 30033a2: 85be mv a1,a5 + 30033a4: fec42503 lw a0,-20(s0) + 30033a8: 3199 jal ra,3002fee + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 30033aa: 3221 jal ra,3002cb2 + + return BASE_STATUS_OK; + 30033ac: 4781 li a5,0 +} + 30033ae: 853e mv a0,a5 + 30033b0: 50b2 lw ra,44(sp) + 30033b2: 5422 lw s0,40(sp) + 30033b4: 6145 addi sp,sp,48 + 30033b6: 8082 ret + +030033b8 : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +static inline unsigned int CRG_GetVcoFreq(void) +{ + 30033b8: 1101 addi sp,sp,-32 + 30033ba: ce06 sw ra,28(sp) + 30033bc: cc22 sw s0,24(sp) + 30033be: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int regFbdiv; + CRG_RegStruct *crg = g_crgBaseAddr; + 30033c0: 040007b7 lui a5,0x4000 + 30033c4: 4947a783 lw a5,1172(a5) # 4000494 + 30033c8: fef42623 sw a5,-20(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 30033cc: fec42703 lw a4,-20(s0) + 30033d0: 100007b7 lui a5,0x10000 + 30033d4: 00f70a63 beq a4,a5,30033e8 + 30033d8: 12200593 li a1,290 + 30033dc: 030077b7 lui a5,0x3007 + 30033e0: 8a478513 addi a0,a5,-1884 # 30068a4 + 30033e4: 39ad jal ra,300305e + 30033e6: a001 j 30033e6 + CRG_ASSERT_PARAM((XTRAIL_FREQ <= 30000000U)); /* The maximum of the external clock source is 30000000U. */ + + freq = CRG_GetPllRefIni(crg->PERI_CRG0.BIT.pll_ref_cksel); + 30033e8: fec42783 lw a5,-20(s0) + 30033ec: 439c lw a5,0(a5) + 30033ee: 8b85 andi a5,a5,1 + 30033f0: 9f81 uxtb a5 + 30033f2: 853e mv a0,a5 + 30033f4: 25c1 jal ra,3003ab4 + 30033f6: fea42423 sw a0,-24(s0) + freq /= CRG_GetPreDivValue(crg->PERI_CRG1.BIT.pll_prediv); + 30033fa: fec42783 lw a5,-20(s0) + 30033fe: 43dc lw a5,4(a5) + 3003400: 8bbd andi a5,a5,15 + 3003402: 9f81 uxtb a5 + 3003404: 853e mv a0,a5 + 3003406: 2de1 jal ra,3003ade + 3003408: 872a mv a4,a0 + 300340a: fe842783 lw a5,-24(s0) + 300340e: 02e7d7b3 divu a5,a5,a4 + 3003412: fef42423 sw a5,-24(s0) + regFbdiv = CRG_GetPllFbDivValue(crg->PERI_CRG2.BIT.pll_fbdiv); /* Get the value of the fbdiv register. */ + 3003416: fec42783 lw a5,-20(s0) + 300341a: 479c lw a5,8(a5) + 300341c: 9f81 uxtb a5 + 300341e: 853e mv a0,a5 + 3003420: 25f5 jal ra,3003b0c + 3003422: fea42223 sw a0,-28(s0) + freq *= (regFbdiv >= 0x06) ? regFbdiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 3003426: fe442783 lw a5,-28(s0) + 300342a: 4719 li a4,6 + 300342c: 00e7f363 bgeu a5,a4,3003432 + 3003430: 4799 li a5,6 + 3003432: fe842703 lw a4,-24(s0) + 3003436: 02f707b3 mul a5,a4,a5 + 300343a: fef42423 sw a5,-24(s0) + return freq; + 300343e: fe842783 lw a5,-24(s0) +} + 3003442: 853e mv a0,a5 + 3003444: 40f2 lw ra,28(sp) + 3003446: 4462 lw s0,24(sp) + 3003448: 6105 addi sp,sp,32 + 300344a: 8082 ret + +0300344c : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +unsigned int HAL_CRG_GetPllFreq(void) +{ + 300344c: 1101 addi sp,sp,-32 + 300344e: ce06 sw ra,28(sp) + 3003450: cc22 sw s0,24(sp) + 3003452: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int pllPostDivValue; + CRG_RegStruct *crg = g_crgBaseAddr; + 3003454: 040007b7 lui a5,0x4000 + 3003458: 4947a783 lw a5,1172(a5) # 4000494 + 300345c: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003460: fe842703 lw a4,-24(s0) + 3003464: 100007b7 lui a5,0x10000 + 3003468: 00f70a63 beq a4,a5,300347c + 300346c: 13700593 li a1,311 + 3003470: 030077b7 lui a5,0x3007 + 3003474: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003478: 36dd jal ra,300305e + 300347a: a001 j 300347a + freq = CRG_GetVcoFreq(); + 300347c: 3f35 jal ra,30033b8 + 300347e: fea42623 sw a0,-20(s0) + pllPostDivValue = CRG_GetPllPostDivValue((CRG_PllPostDiv)crg->PERI_CRG3.BIT.pll_postdiv1); + 3003482: fe842783 lw a5,-24(s0) + 3003486: 47dc lw a5,12(a5) + 3003488: 8bbd andi a5,a5,15 + 300348a: 9f81 uxtb a5 + 300348c: 853e mv a0,a5 + 300348e: 25c1 jal ra,3003b4e + 3003490: fea42223 sw a0,-28(s0) + /* Calculate the PLL output clock frequency based on the VCO clock frequency and post-division coefficient. */ + if (pllPostDivValue != 0) { + 3003494: fe442783 lw a5,-28(s0) + 3003498: cb89 beqz a5,30034aa + freq /= pllPostDivValue; + 300349a: fec42703 lw a4,-20(s0) + 300349e: fe442783 lw a5,-28(s0) + 30034a2: 02f757b3 divu a5,a4,a5 + 30034a6: fef42623 sw a5,-20(s0) + } + return freq; + 30034aa: fec42783 lw a5,-20(s0) +} + 30034ae: 853e mv a0,a5 + 30034b0: 40f2 lw ra,28(sp) + 30034b2: 4462 lw s0,24(sp) + 30034b4: 6105 addi sp,sp,32 + 30034b6: 8082 ret + +030034b8 : + * @brief Get Core Clock Frequence + * @param None + * @retval unsigned int Core clock frequency + */ +unsigned int HAL_CRG_GetCoreClkFreq(void) +{ + 30034b8: 1101 addi sp,sp,-32 + 30034ba: ce06 sw ra,28(sp) + 30034bc: cc22 sw s0,24(sp) + 30034be: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int coreClkSelect; + CRG_RegStruct *crg = g_crgBaseAddr; + 30034c0: 040007b7 lui a5,0x4000 + 30034c4: 4947a783 lw a5,1172(a5) # 4000494 + 30034c8: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 30034cc: fe842703 lw a4,-24(s0) + 30034d0: 100007b7 lui a5,0x10000 + 30034d4: 00f70a63 beq a4,a5,30034e8 + 30034d8: 14c00593 li a1,332 + 30034dc: 030077b7 lui a5,0x3007 + 30034e0: 8a478513 addi a0,a5,-1884 # 30068a4 + 30034e4: 3ead jal ra,300305e + 30034e6: a001 j 30034e6 + coreClkSelect = crg->PERI_CRG64.BIT.clk_pst1_sw_sel; + 30034e8: fe842783 lw a5,-24(s0) + 30034ec: 1007a783 lw a5,256(a5) + 30034f0: 8b8d andi a5,a5,3 + 30034f2: 9f81 uxtb a5 + 30034f4: fef42223 sw a5,-28(s0) + switch (coreClkSelect) { + 30034f8: fe442783 lw a5,-28(s0) + 30034fc: 4705 li a4,1 + 30034fe: 02e78063 beq a5,a4,300351e + 3003502: 4705 li a4,1 + 3003504: 00e7e663 bltu a5,a4,3003510 + 3003508: 4709 li a4,2 + 300350a: 02e78163 beq a5,a4,300352c + 300350e: a01d j 3003534 + case CRG_CORE_CLK_SELECT_HOSC: /* The clock source is an internal high-speed clock. */ + freq = HOSC_FREQ; + 3003510: 017d87b7 lui a5,0x17d8 + 3003514: 84078793 addi a5,a5,-1984 # 17d7840 + 3003518: fef42623 sw a5,-20(s0) + break; + 300351c: a015 j 3003540 + + case CRG_CORE_CLK_SELECT_TCXO: /* The clock source is the external crystal oscillator clock. */ + freq = XTRAIL_FREQ; + 300351e: 01c9c7b7 lui a5,0x1c9c + 3003522: 38078793 addi a5,a5,896 # 1c9c380 + 3003526: fef42623 sw a5,-20(s0) + break; + 300352a: a819 j 3003540 + + case CRG_CORE_CLK_SELECT_PLL: /* The clock source is the PLL. */ + freq = HAL_CRG_GetPllFreq(); + 300352c: 3705 jal ra,300344c + 300352e: fea42623 sw a0,-20(s0) + break; + 3003532: a039 j 3003540 + + default: + freq = LOSC_FREQ; + 3003534: 67a1 lui a5,0x8 + 3003536: d0078793 addi a5,a5,-768 # 7d00 + 300353a: fef42623 sw a5,-20(s0) + break; + 300353e: 0001 nop + } + return freq; + 3003540: fec42783 lw a5,-20(s0) +} + 3003544: 853e mv a0,a5 + 3003546: 40f2 lw ra,28(sp) + 3003548: 4462 lw s0,24(sp) + 300354a: 6105 addi sp,sp,32 + 300354c: 8082 ret + +0300354e : + * @brief Get Clock Frequence + * @param handle CRG Handle + * @retval Frequece of IP + */ +unsigned int HAL_CRG_GetIpFreq(const void *baseAddress) +{ + 300354e: 7179 addi sp,sp,-48 + 3003550: d606 sw ra,44(sp) + 3003552: d422 sw s0,40(sp) + 3003554: 1800 addi s0,sp,48 + 3003556: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 300355a: fdc42783 lw a5,-36(s0) + 300355e: eb89 bnez a5,3003570 + 3003560: 16900593 li a1,361 + 3003564: 030077b7 lui a5,0x3007 + 3003568: 8a478513 addi a0,a5,-1884 # 30068a4 + 300356c: 3ccd jal ra,300305e + 300356e: a001 j 300356e + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003570: 040007b7 lui a5,0x4000 + 3003574: 4947a703 lw a4,1172(a5) # 4000494 + 3003578: 100007b7 lui a5,0x10000 + 300357c: 00f70a63 beq a4,a5,3003590 + 3003580: 16a00593 li a1,362 + 3003584: 030077b7 lui a5,0x3007 + 3003588: 8a478513 addi a0,a5,-1884 # 30068a4 + 300358c: 3cc9 jal ra,300305e + 300358e: a001 j 300358e +#ifdef FPGA + /* Use this function to obtain the clock frequency during the FPGA phase. */ + return CHIP_GetIpFreqHz(baseAddress); +#else + unsigned int hclk = HAL_CRG_GetCoreClkFreq(); + 3003590: 3725 jal ra,30034b8 + 3003592: fea42423 sw a0,-24(s0) + unsigned int freq = LOSC_FREQ; + 3003596: 67a1 lui a5,0x8 + 3003598: d0078793 addi a5,a5,-768 # 7d00 + 300359c: fef42623 sw a5,-20(s0) + unsigned int coreClkFreq; + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 30035a0: fdc42503 lw a0,-36(s0) + 30035a4: 2cc9 jal ra,3003876 + 30035a6: fea42223 sw a0,-28(s0) + if (p == NULL) { + 30035aa: fe442783 lw a5,-28(s0) + 30035ae: e781 bnez a5,30035b6 + return freq; + 30035b0: fec42783 lw a5,-20(s0) + 30035b4: a895 j 3003628 + } + switch (p->type) { + 30035b6: fe442783 lw a5,-28(s0) + 30035ba: 43dc lw a5,4(a5) + 30035bc: 4715 li a4,5 + 30035be: 04f76a63 bltu a4,a5,3003612 + 30035c2: 00279713 slli a4,a5,0x2 + 30035c6: 030077b7 lui a5,0x3007 + 30035ca: 8e078793 addi a5,a5,-1824 # 30068e0 + 30035ce: 97ba add a5,a5,a4 + 30035d0: 439c lw a5,0(a5) + 30035d2: 8782 jr a5 + case CRG_IP_NONE_CLK_SEL: + case CRG_IP_EFC: + case CRG_IP_ANA: + freq = hclk; /* Returns the internal high speed clock frequency. */ + 30035d4: fe842783 lw a5,-24(s0) + 30035d8: fef42623 sw a5,-20(s0) + break; + 30035dc: a825 j 3003614 + + case CRG_IP_CAN: + freq = CRG_GetPllRefIni(g_crgBaseAddr->PERI_CRG0.BIT.pll_ref_cksel); + 30035de: 040007b7 lui a5,0x4000 + 30035e2: 4947a783 lw a5,1172(a5) # 4000494 + 30035e6: 439c lw a5,0(a5) + 30035e8: 8b85 andi a5,a5,1 + 30035ea: 9f81 uxtb a5 + 30035ec: 853e mv a0,a5 + 30035ee: 21d9 jal ra,3003ab4 + 30035f0: fea42623 sw a0,-20(s0) + break; + 30035f4: a005 j 3003614 + + case CRG_IP_ADC: + /* Get core clock frequence for calculating the ADC clock frequency. */ + coreClkFreq = HAL_CRG_GetCoreClkFreq(); + 30035f6: 35c9 jal ra,30034b8 + 30035f8: fea42023 sw a0,-32(s0) + freq = CRG_GetAdcIpFreq(p, CRG_GetVcoFreq(), coreClkFreq); + 30035fc: 3b75 jal ra,30033b8 + 30035fe: 87aa mv a5,a0 + 3003600: fe042603 lw a2,-32(s0) + 3003604: 85be mv a1,a5 + 3003606: fe442503 lw a0,-28(s0) + 300360a: 2c85 jal ra,300387a + 300360c: fea42623 sw a0,-20(s0) + break; + 3003610: a011 j 3003614 + + case CRG_IP_IWDG: /* The IWDG clock frequency is an internal low-speed clock. */ + default: + break; + 3003612: 0001 nop + } + if (freq == 0) { + 3003614: fec42783 lw a5,-20(s0) + 3003618: e791 bnez a5,3003624 + freq = LOSC_FREQ; + 300361a: 67a1 lui a5,0x8 + 300361c: d0078793 addi a5,a5,-768 # 7d00 + 3003620: fef42623 sw a5,-20(s0) + } + return freq; + 3003624: fec42783 lw a5,-20(s0) +#endif +} + 3003628: 853e mv a0,a5 + 300362a: 50b2 lw ra,44(sp) + 300362c: 5422 lw s0,40(sp) + 300362e: 6145 addi sp,sp,48 + 3003630: 8082 ret + +03003632 : + * @param enable enable mask + * @retval BASE_STATUS_ERROR Can't find the Match or operation is not support + * @retval BASE_STATUS_OK Operation Success + */ +BASE_StatusType HAL_CRG_IpEnableSet(const void *baseAddress, unsigned int enable) +{ + 3003632: 7179 addi sp,sp,-48 + 3003634: d606 sw ra,44(sp) + 3003636: d422 sw s0,40(sp) + 3003638: 1800 addi s0,sp,48 + 300363a: fca42e23 sw a0,-36(s0) + 300363e: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3003642: fdc42783 lw a5,-36(s0) + 3003646: eb89 bnez a5,3003658 + 3003648: 19c00593 li a1,412 + 300364c: 030077b7 lui a5,0x3007 + 3003650: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003654: 3429 jal ra,300305e + 3003656: a001 j 3003656 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003658: 040007b7 lui a5,0x4000 + 300365c: 4947a703 lw a4,1172(a5) # 4000494 + 3003660: 100007b7 lui a5,0x10000 + 3003664: 00f70a63 beq a4,a5,3003678 + 3003668: 19d00593 li a1,413 + 300366c: 030077b7 lui a5,0x3007 + 3003670: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003674: 32ed jal ra,300305e + 3003676: a001 j 3003676 + /* Check the validity of the input parameters. */ + CRG_PARAM_CHECK_WITH_RET((enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE), BASE_STATUS_ERROR); + 3003678: fd842703 lw a4,-40(s0) + 300367c: 4785 li a5,1 + 300367e: 00f70e63 beq a4,a5,300369a + 3003682: fd842783 lw a5,-40(s0) + 3003686: cb91 beqz a5,300369a + 3003688: 19f00593 li a1,415 + 300368c: 030077b7 lui a5,0x3007 + 3003690: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003694: 32e9 jal ra,300305e + 3003696: 4785 li a5,1 + 3003698: a0a5 j 3003700 + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 300369a: fdc42503 lw a0,-36(s0) + 300369e: 2ae1 jal ra,3003876 + 30036a0: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 30036a4: fec42783 lw a5,-20(s0) + 30036a8: c799 beqz a5,30036b6 + 30036aa: fec42783 lw a5,-20(s0) + 30036ae: 43d8 lw a4,4(a5) + 30036b0: 4795 li a5,5 + 30036b2: 00e7f463 bgeu a5,a4,30036ba + return BASE_STATUS_ERROR; + 30036b6: 4785 li a5,1 + 30036b8: a0a1 j 3003700 + } + if (g_ipClkProc[p->type].enableSet == NULL) { + 30036ba: fec42783 lw a5,-20(s0) + 30036be: 43d4 lw a3,4(a5) + 30036c0: 040007b7 lui a5,0x4000 + 30036c4: 02478713 addi a4,a5,36 # 4000024 + 30036c8: 02400793 li a5,36 + 30036cc: 02f687b3 mul a5,a3,a5 + 30036d0: 97ba add a5,a5,a4 + 30036d2: 479c lw a5,8(a5) + 30036d4: e399 bnez a5,30036da + return BASE_STATUS_ERROR; + 30036d6: 4785 li a5,1 + 30036d8: a025 j 3003700 + } + g_ipClkProc[p->type].enableSet(p, enable); + 30036da: fec42783 lw a5,-20(s0) + 30036de: 43d4 lw a3,4(a5) + 30036e0: 040007b7 lui a5,0x4000 + 30036e4: 02478713 addi a4,a5,36 # 4000024 + 30036e8: 02400793 li a5,36 + 30036ec: 02f687b3 mul a5,a3,a5 + 30036f0: 97ba add a5,a5,a4 + 30036f2: 479c lw a5,8(a5) + 30036f4: fd842583 lw a1,-40(s0) + 30036f8: fec42503 lw a0,-20(s0) + 30036fc: 9782 jalr a5 + return BASE_STATUS_OK; + 30036fe: 4781 li a5,0 +} + 3003700: 853e mv a0,a5 + 3003702: 50b2 lw ra,44(sp) + 3003704: 5422 lw s0,40(sp) + 3003706: 6145 addi sp,sp,48 + 3003708: 8082 ret + +0300370a : + * @param select clock select, @see CRG_APBLsClkSelect for ip in apb_ls_subsys or CRG_AdcClkSelect for adc + * @retval BASE_STATUS_OK success + * @retval BASE_STATUS_ERROR fail + */ +BASE_StatusType HAL_CRG_IpClkSelectSet(const void *baseAddress, unsigned int select) +{ + 300370a: 7179 addi sp,sp,-48 + 300370c: d606 sw ra,44(sp) + 300370e: d422 sw s0,40(sp) + 3003710: 1800 addi s0,sp,48 + 3003712: fca42e23 sw a0,-36(s0) + 3003716: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 300371a: fdc42783 lw a5,-36(s0) + 300371e: eb89 bnez a5,3003730 + 3003720: 1cd00593 li a1,461 + 3003724: 030077b7 lui a5,0x3007 + 3003728: 8a478513 addi a0,a5,-1884 # 30068a4 + 300372c: 2d8d jal ra,3003d9e + 300372e: a001 j 300372e + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003730: 040007b7 lui a5,0x4000 + 3003734: 4947a703 lw a4,1172(a5) # 4000494 + 3003738: 100007b7 lui a5,0x10000 + 300373c: 00f70a63 beq a4,a5,3003750 + 3003740: 1ce00593 li a1,462 + 3003744: 030077b7 lui a5,0x3007 + 3003748: 8a478513 addi a0,a5,-1884 # 30068a4 + 300374c: 2d89 jal ra,3003d9e + 300374e: a001 j 300374e + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003750: fdc42503 lw a0,-36(s0) + 3003754: 220d jal ra,3003876 + 3003756: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 300375a: fec42783 lw a5,-20(s0) + 300375e: c799 beqz a5,300376c + 3003760: fec42783 lw a5,-20(s0) + 3003764: 43d8 lw a4,4(a5) + 3003766: 4795 li a5,5 + 3003768: 00e7f463 bgeu a5,a4,3003770 + return BASE_STATUS_ERROR; + 300376c: 4785 li a5,1 + 300376e: a0a1 j 30037b6 + } + if (g_ipClkProc[p->type].clkSelSet == NULL) { + 3003770: fec42783 lw a5,-20(s0) + 3003774: 43d4 lw a3,4(a5) + 3003776: 040007b7 lui a5,0x4000 + 300377a: 02478713 addi a4,a5,36 # 4000024 + 300377e: 02400793 li a5,36 + 3003782: 02f687b3 mul a5,a3,a5 + 3003786: 97ba add a5,a5,a4 + 3003788: 47dc lw a5,12(a5) + 300378a: e399 bnez a5,3003790 + return BASE_STATUS_ERROR; + 300378c: 4785 li a5,1 + 300378e: a025 j 30037b6 + } + g_ipClkProc[p->type].clkSelSet(p, select); /* Clock selection of the configuration module. */ + 3003790: fec42783 lw a5,-20(s0) + 3003794: 43d4 lw a3,4(a5) + 3003796: 040007b7 lui a5,0x4000 + 300379a: 02478713 addi a4,a5,36 # 4000024 + 300379e: 02400793 li a5,36 + 30037a2: 02f687b3 mul a5,a3,a5 + 30037a6: 97ba add a5,a5,a4 + 30037a8: 47dc lw a5,12(a5) + 30037aa: fd842583 lw a1,-40(s0) + 30037ae: fec42503 lw a0,-20(s0) + 30037b2: 9782 jalr a5 + return BASE_STATUS_OK; + 30037b4: 4781 li a5,0 +} + 30037b6: 853e mv a0,a5 + 30037b8: 50b2 lw ra,44(sp) + 30037ba: 5422 lw s0,40(sp) + 30037bc: 6145 addi sp,sp,48 + 30037be: 8082 ret + +030037c0 : + * @param div set div value + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Match Fail or Not support + */ +BASE_StatusType HAL_CRG_IpClkDivSet(const void *baseAddress, unsigned int div) +{ + 30037c0: 7179 addi sp,sp,-48 + 30037c2: d606 sw ra,44(sp) + 30037c4: d422 sw s0,40(sp) + 30037c6: 1800 addi s0,sp,48 + 30037c8: fca42e23 sw a0,-36(s0) + 30037cc: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 30037d0: fdc42783 lw a5,-36(s0) + 30037d4: eb89 bnez a5,30037e6 + 30037d6: 22c00593 li a1,556 + 30037da: 030077b7 lui a5,0x3007 + 30037de: 8a478513 addi a0,a5,-1884 # 30068a4 + 30037e2: 2b75 jal ra,3003d9e + 30037e4: a001 j 30037e4 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30037e6: 040007b7 lui a5,0x4000 + 30037ea: 4947a703 lw a4,1172(a5) # 4000494 + 30037ee: 100007b7 lui a5,0x10000 + 30037f2: 00f70a63 beq a4,a5,3003806 + 30037f6: 22d00593 li a1,557 + 30037fa: 030077b7 lui a5,0x3007 + 30037fe: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003802: 2b71 jal ra,3003d9e + 3003804: a001 j 3003804 + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003806: fdc42503 lw a0,-36(s0) + 300380a: 20b5 jal ra,3003876 + 300380c: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 3003810: fec42783 lw a5,-20(s0) + 3003814: c799 beqz a5,3003822 + 3003816: fec42783 lw a5,-20(s0) + 300381a: 43d8 lw a4,4(a5) + 300381c: 4795 li a5,5 + 300381e: 00e7f463 bgeu a5,a4,3003826 + return BASE_STATUS_ERROR; + 3003822: 4785 li a5,1 + 3003824: a0a1 j 300386c + } + if (g_ipClkProc[p->type].clkDivSet == NULL) { + 3003826: fec42783 lw a5,-20(s0) + 300382a: 43d4 lw a3,4(a5) + 300382c: 040007b7 lui a5,0x4000 + 3003830: 02478713 addi a4,a5,36 # 4000024 + 3003834: 02400793 li a5,36 + 3003838: 02f687b3 mul a5,a3,a5 + 300383c: 97ba add a5,a5,a4 + 300383e: 4b9c lw a5,16(a5) + 3003840: e399 bnez a5,3003846 + return BASE_STATUS_ERROR; + 3003842: 4785 li a5,1 + 3003844: a025 j 300386c + } + g_ipClkProc[p->type].clkDivSet(p, div); /* Configure the clock frequency divider of the module. */ + 3003846: fec42783 lw a5,-20(s0) + 300384a: 43d4 lw a3,4(a5) + 300384c: 040007b7 lui a5,0x4000 + 3003850: 02478713 addi a4,a5,36 # 4000024 + 3003854: 02400793 li a5,36 + 3003858: 02f687b3 mul a5,a3,a5 + 300385c: 97ba add a5,a5,a4 + 300385e: 4b9c lw a5,16(a5) + 3003860: fd842583 lw a1,-40(s0) + 3003864: fec42503 lw a0,-20(s0) + 3003868: 9782 jalr a5 + return BASE_STATUS_OK; + 300386a: 4781 li a5,0 +} + 300386c: 853e mv a0,a5 + 300386e: 50b2 lw ra,44(sp) + 3003870: 5422 lw s0,40(sp) + 3003872: 6145 addi sp,sp,48 + 3003874: 8082 ret + +03003876 : + 3003876: 933fd06f j 30011a8 + +0300387a : + * @param coreClkFreq core clock rate + * @retval Ip Frequence + */ +static unsigned int CRG_GetAdcIpFreq(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int baseClkRate, + unsigned int coreClkFreq) +{ + 300387a: 7139 addi sp,sp,-64 + 300387c: de06 sw ra,60(sp) + 300387e: dc22 sw s0,56(sp) + 3003880: 0080 addi s0,sp,64 + 3003882: fca42623 sw a0,-52(s0) + 3003886: fcb42423 sw a1,-56(s0) + 300388a: fcc42223 sw a2,-60(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300388e: fcc42783 lw a5,-52(s0) + 3003892: eb89 bnez a5,30038a4 + 3003894: 2af00593 li a1,687 + 3003898: 030077b7 lui a5,0x3007 + 300389c: 8a478513 addi a0,a5,-1884 # 30068a4 + 30038a0: 29fd jal ra,3003d9e + 30038a2: a001 j 30038a2 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30038a4: 040007b7 lui a5,0x4000 + 30038a8: 4947a783 lw a5,1172(a5) # 4000494 + 30038ac: eb89 bnez a5,30038be + 30038ae: 2b000593 li a1,688 + 30038b2: 030077b7 lui a5,0x3007 + 30038b6: 8a478513 addi a0,a5,-1884 # 30068a4 + 30038ba: 21d5 jal ra,3003d9e + 30038bc: a001 j 30038bc + + unsigned int clkSel; + unsigned int clkDiv; + unsigned int pst2Div; + unsigned int freq = 0; + 30038be: fe042623 sw zero,-20(s0) + + /* Obtains the clock source selection of the ADC. */ + const CRG_IpProc *proc = &g_ipClkProc[matchInfo->type]; + 30038c2: fcc42783 lw a5,-52(s0) + 30038c6: 43d8 lw a4,4(a5) + 30038c8: 02400793 li a5,36 + 30038cc: 02f70733 mul a4,a4,a5 + 30038d0: 040007b7 lui a5,0x4000 + 30038d4: 02478793 addi a5,a5,36 # 4000024 + 30038d8: 97ba add a5,a5,a4 + 30038da: fef42423 sw a5,-24(s0) + if (proc->clkSelGet == NULL) { + 30038de: fe842783 lw a5,-24(s0) + 30038e2: 4fdc lw a5,28(a5) + 30038e4: e399 bnez a5,30038ea + return 0; + 30038e6: 4781 li a5,0 + 30038e8: a07d j 3003996 + } + clkSel = proc->clkSelGet(matchInfo); + 30038ea: fe842783 lw a5,-24(s0) + 30038ee: 4fdc lw a5,28(a5) + 30038f0: fcc42503 lw a0,-52(s0) + 30038f4: 9782 jalr a5 + 30038f6: fea42223 sw a0,-28(s0) + /* Calculate the frequency from the ADC's clock source. */ + if (clkSel == CRG_ADC_CLK_SYN_CORE) { + 30038fa: fe442703 lw a4,-28(s0) + 30038fe: 478d li a5,3 + 3003900: 00f71763 bne a4,a5,300390e + freq = coreClkFreq; + 3003904: fc442783 lw a5,-60(s0) + 3003908: fef42623 sw a5,-20(s0) + 300390c: a085 j 300396c + } else if (clkSel == CRG_ADC_CLK_ASYN_HOSC) { + 300390e: fe442783 lw a5,-28(s0) + 3003912: eb81 bnez a5,3003922 + freq = HOSC_FREQ; + 3003914: 017d87b7 lui a5,0x17d8 + 3003918: 84078793 addi a5,a5,-1984 # 17d7840 + 300391c: fef42623 sw a5,-20(s0) + 3003920: a0b1 j 300396c + } else if (clkSel == CRG_ADC_CLK_ASYN_TCXO) { + 3003922: fe442703 lw a4,-28(s0) + 3003926: 4785 li a5,1 + 3003928: 00f71963 bne a4,a5,300393a + /* The maximum speed of the external clock source is 30000000U. */ + freq = (XTRAIL_FREQ > 30000000U) ? 0 : XTRAIL_FREQ; + 300392c: 01c9c7b7 lui a5,0x1c9c + 3003930: 38078793 addi a5,a5,896 # 1c9c380 + 3003934: fef42623 sw a5,-20(s0) + 3003938: a815 j 300396c + } else if (clkSel == CRG_ADC_CLK_ASYN_PLL_DIV) { + 300393a: fe442703 lw a4,-28(s0) + 300393e: 4789 li a5,2 + 3003940: 02f71663 bne a4,a5,300396c + pst2Div = CRG_GetPllPostDivValue((CRG_PllPostDiv)g_crgBaseAddr->PERI_CRG3.BIT.pll_postdiv2); + 3003944: 040007b7 lui a5,0x4000 + 3003948: 4947a783 lw a5,1172(a5) # 4000494 + 300394c: 47dc lw a5,12(a5) + 300394e: 8391 srli a5,a5,0x4 + 3003950: 8bbd andi a5,a5,15 + 3003952: 9f81 uxtb a5 + 3003954: 853e mv a0,a5 + 3003956: 2ae5 jal ra,3003b4e + 3003958: fea42023 sw a0,-32(s0) + freq = baseClkRate / pst2Div; + 300395c: fc842703 lw a4,-56(s0) + 3003960: fe042783 lw a5,-32(s0) + 3003964: 02f757b3 divu a5,a4,a5 + 3003968: fef42623 sw a5,-20(s0) + } + + /* Obtain the frequency divider based on the ADC clock source. */ + if (proc->clkDivGet == NULL) { + 300396c: fe842783 lw a5,-24(s0) + 3003970: 539c lw a5,32(a5) + 3003972: e399 bnez a5,3003978 + return 0; + 3003974: 4781 li a5,0 + 3003976: a005 j 3003996 + } + clkDiv = proc->clkDivGet(matchInfo); + 3003978: fe842783 lw a5,-24(s0) + 300397c: 539c lw a5,32(a5) + 300397e: fcc42503 lw a0,-52(s0) + 3003982: 9782 jalr a5 + 3003984: fca42e23 sw a0,-36(s0) + /* Calculate the clock frequency of the ADC. */ + return (freq / (clkDiv + 1)); + 3003988: fdc42783 lw a5,-36(s0) + 300398c: 0785 addi a5,a5,1 + 300398e: fec42703 lw a4,-20(s0) + 3003992: 02f757b3 divu a5,a4,a5 +} + 3003996: 853e mv a0,a5 + 3003998: 50f2 lw ra,60(sp) + 300399a: 5462 lw s0,56(sp) + 300399c: 6121 addi sp,sp,64 + 300399e: 8082 ret + +030039a0 : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValidPllConfig(const CRG_Handle *handle) +{ + 30039a0: 7179 addi sp,sp,-48 + 30039a2: d606 sw ra,44(sp) + 30039a4: d422 sw s0,40(sp) + 30039a6: 1800 addi s0,sp,48 + 30039a8: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + unsigned int freq; + + freq = CRG_GetPllRefIni(handle->pllRefClkSelect); + 30039ac: fdc42783 lw a5,-36(s0) + 30039b0: 43dc lw a5,4(a5) + 30039b2: 853e mv a0,a5 + 30039b4: 2201 jal ra,3003ab4 + 30039b6: fea42623 sw a0,-20(s0) + preDiv = CRG_GetPreDivValue(handle->pllPreDiv); + 30039ba: fdc42783 lw a5,-36(s0) + 30039be: 479c lw a5,8(a5) + 30039c0: 853e mv a0,a5 + 30039c2: 2a31 jal ra,3003ade + 30039c4: fea42423 sw a0,-24(s0) + /* Check the validity of the prescaled clock frequency. */ + if (!IsCrgValidPreDiv(freq, preDiv)) { + 30039c8: fe842583 lw a1,-24(s0) + 30039cc: fec42503 lw a0,-20(s0) + 30039d0: c26ff0ef jal ra,3002df6 + 30039d4: 87aa mv a5,a0 + 30039d6: 0017c793 xori a5,a5,1 + 30039da: 9f81 uxtb a5 + 30039dc: c399 beqz a5,30039e2 + return BASE_STATUS_ERROR; + 30039de: 4785 li a5,1 + 30039e0: a8a5 j 3003a58 + } + freq /= preDiv; + 30039e2: fec42703 lw a4,-20(s0) + 30039e6: fe842783 lw a5,-24(s0) + 30039ea: 02f757b3 divu a5,a4,a5 + 30039ee: fef42623 sw a5,-20(s0) + /* Check the validity of the clock frequency after frequency multiplication. */ + if (!IsCrgValidFdDiv(freq, handle->pllFbDiv)) { + 30039f2: fdc42783 lw a5,-36(s0) + 30039f6: 47dc lw a5,12(a5) + 30039f8: 85be mv a1,a5 + 30039fa: fec42503 lw a0,-20(s0) + 30039fe: c56ff0ef jal ra,3002e54 + 3003a02: 87aa mv a5,a0 + 3003a04: 0017c793 xori a5,a5,1 + 3003a08: 9f81 uxtb a5 + 3003a0a: c399 beqz a5,3003a10 + return BASE_STATUS_ERROR; + 3003a0c: 4785 li a5,1 + 3003a0e: a0a9 j 3003a58 + } + freq *= (handle->pllFbDiv > 0x06) ? handle->pllFbDiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 3003a10: fdc42783 lw a5,-36(s0) + 3003a14: 47dc lw a5,12(a5) + 3003a16: 4719 li a4,6 + 3003a18: 00e7f363 bgeu a5,a4,3003a1e + 3003a1c: 4799 li a5,6 + 3003a1e: fec42703 lw a4,-20(s0) + 3003a22: 02f707b3 mul a5,a4,a5 + 3003a26: fef42623 sw a5,-20(s0) + /* Check whether the PLL output frequency is valid. */ + if (IsCrgValidPostDiv(freq, handle->pllPostDiv) && IsCrgValidPostDiv2(freq, handle->handleEx.pllPostDiv2)) { + 3003a2a: fdc42783 lw a5,-36(s0) + 3003a2e: 4b9c lw a5,16(a5) + 3003a30: 85be mv a1,a5 + 3003a32: fec42503 lw a0,-20(s0) + 3003a36: ca8ff0ef jal ra,3002ede + 3003a3a: 87aa mv a5,a0 + 3003a3c: cf89 beqz a5,3003a56 + 3003a3e: fdc42783 lw a5,-36(s0) + 3003a42: 4fdc lw a5,28(a5) + 3003a44: 85be mv a1,a5 + 3003a46: fec42503 lw a0,-20(s0) + 3003a4a: cdcff0ef jal ra,3002f26 + 3003a4e: 87aa mv a5,a0 + 3003a50: c399 beqz a5,3003a56 + return BASE_STATUS_OK; + 3003a52: 4781 li a5,0 + 3003a54: a011 j 3003a58 + } + return BASE_STATUS_ERROR; + 3003a56: 4785 li a5,1 +} + 3003a58: 853e mv a0,a5 + 3003a5a: 50b2 lw ra,44(sp) + 3003a5c: 5422 lw s0,40(sp) + 3003a5e: 6145 addi sp,sp,48 + 3003a60: 8082 ret + +03003a62 : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValid1MHzConfig(const CRG_Handle *handle) +{ + 3003a62: 7179 addi sp,sp,-48 + 3003a64: d622 sw s0,44(sp) + 3003a66: 1800 addi s0,sp,48 + 3003a68: fca42e23 sw a0,-36(s0) + unsigned int freq; + /* Get the ref frequency of the 1 MHz clock. */ + freq = (handle->handleEx.clk1MSelect == CRG_1M_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003a6c: fdc42783 lw a5,-36(s0) + 3003a70: 539c lw a5,32(a5) + 3003a72: e791 bnez a5,3003a7e + 3003a74: 017d87b7 lui a5,0x17d8 + 3003a78: 84078793 addi a5,a5,-1984 # 17d7840 + 3003a7c: a029 j 3003a86 + 3003a7e: 01c9c7b7 lui a5,0x1c9c + 3003a82: 38078793 addi a5,a5,896 # 1c9c380 + 3003a86: fef42623 sw a5,-20(s0) + /* Check whether the 1MHz output frequency is valid. */ + if ((freq / (handle->handleEx.clk1MDiv + 1)) == CRG_FREQ_1MHz) { + 3003a8a: fdc42783 lw a5,-36(s0) + 3003a8e: 53dc lw a5,36(a5) + 3003a90: 0785 addi a5,a5,1 + 3003a92: fec42703 lw a4,-20(s0) + 3003a96: 02f75733 divu a4,a4,a5 + 3003a9a: 000f47b7 lui a5,0xf4 + 3003a9e: 24078793 addi a5,a5,576 # f4240 + 3003aa2: 00f71463 bne a4,a5,3003aaa + return BASE_STATUS_OK; + 3003aa6: 4781 li a5,0 + 3003aa8: a011 j 3003aac + } + return BASE_STATUS_ERROR; + 3003aaa: 4785 li a5,1 +} + 3003aac: 853e mv a0,a5 + 3003aae: 5432 lw s0,44(sp) + 3003ab0: 6145 addi sp,sp,48 + 3003ab2: 8082 ret + +03003ab4 : + * @brief Get clock frequence + * @param crg CRG_RegStruct + * @retval The frequence fo clock + */ +static inline unsigned int CRG_GetPllRefIni(CRG_PllRefClkSelect pllRefClkSelect) +{ + 3003ab4: 1101 addi sp,sp,-32 + 3003ab6: ce22 sw s0,28(sp) + 3003ab8: 1000 addi s0,sp,32 + 3003aba: fea42623 sw a0,-20(s0) + /* The maximum speed of the external clock source is 30000000U. */ + if (pllRefClkSelect == CRG_PLL_REF_CLK_SELECT_XTAL && XTRAIL_FREQ > 30000000U) { + return 0; + } + return (pllRefClkSelect == (unsigned int)CRG_PLL_REF_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003abe: fec42783 lw a5,-20(s0) + 3003ac2: e791 bnez a5,3003ace + 3003ac4: 017d87b7 lui a5,0x17d8 + 3003ac8: 84078793 addi a5,a5,-1984 # 17d7840 + 3003acc: a029 j 3003ad6 + 3003ace: 01c9c7b7 lui a5,0x1c9c + 3003ad2: 38078793 addi a5,a5,896 # 1c9c380 +} + 3003ad6: 853e mv a0,a5 + 3003ad8: 4472 lw s0,28(sp) + 3003ada: 6105 addi sp,sp,32 + 3003adc: 8082 ret + +03003ade : + * @brief Get previous division Value before PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPreDivValue(CRG_PllPreDiv pllPredDiv) +{ + 3003ade: 7179 addi sp,sp,-48 + 3003ae0: d622 sw s0,44(sp) + 3003ae2: 1800 addi s0,sp,48 + 3003ae4: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + if (pllPredDiv <= CRG_PLL_PREDIV_1) { /* 0 or 1 returns PLL_PREDIV_OUT_1. */ + 3003ae8: fdc42783 lw a5,-36(s0) + 3003aec: e789 bnez a5,3003af6 + preDiv = PLL_PREDIV_OUT_1; + 3003aee: 4785 li a5,1 + 3003af0: fef42623 sw a5,-20(s0) + 3003af4: a031 j 3003b00 + } else { + preDiv = pllPredDiv + 1; + 3003af6: fdc42783 lw a5,-36(s0) + 3003afa: 0785 addi a5,a5,1 + 3003afc: fef42623 sw a5,-20(s0) + } + return preDiv; + 3003b00: fec42783 lw a5,-20(s0) +} + 3003b04: 853e mv a0,a5 + 3003b06: 5432 lw s0,44(sp) + 3003b08: 6145 addi sp,sp,48 + 3003b0a: 8082 ret + +03003b0c : + * @brief Get PLL loop divider ratio + * @param crg CRG_RegStruct + * @retval PLL loop divider ratio + */ +static inline unsigned int CRG_GetPllFbDivValue(unsigned int pllFbDiv) +{ + 3003b0c: 7179 addi sp,sp,-48 + 3003b0e: d622 sw s0,44(sp) + 3003b10: 1800 addi s0,sp,48 + 3003b12: fca42e23 sw a0,-36(s0) + unsigned int div = pllFbDiv; + 3003b16: fdc42783 lw a5,-36(s0) + 3003b1a: fef42623 sw a5,-20(s0) + /* Check the validity of the minimum frequency multiplication parameter. */ + if (div < CRG_PLL_FBDIV_MIN) { + 3003b1e: fec42703 lw a4,-20(s0) + 3003b22: 4795 li a5,5 + 3003b24: 00e7e563 bltu a5,a4,3003b2e + div = CRG_PLL_FBDIV_MIN; + 3003b28: 4799 li a5,6 + 3003b2a: fef42623 sw a5,-20(s0) + } + /* Check the validity of the maximum frequency multiplication parameter. */ + if (div > CRG_PLL_FBDIV_MAX) { + 3003b2e: fec42703 lw a4,-20(s0) + 3003b32: 07f00793 li a5,127 + 3003b36: 00e7f663 bgeu a5,a4,3003b42 + div = CRG_PLL_FBDIV_MAX; + 3003b3a: 07f00793 li a5,127 + 3003b3e: fef42623 sw a5,-20(s0) + } + return div; + 3003b42: fec42783 lw a5,-20(s0) +} + 3003b46: 853e mv a0,a5 + 3003b48: 5432 lw s0,44(sp) + 3003b4a: 6145 addi sp,sp,48 + 3003b4c: 8082 ret + +03003b4e : + * @brief Get post division Value after PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPllPostDivValue(unsigned int pllPostDiv) +{ + 3003b4e: 7179 addi sp,sp,-48 + 3003b50: d622 sw s0,44(sp) + 3003b52: 1800 addi s0,sp,48 + 3003b54: fca42e23 sw a0,-36(s0) + unsigned int div = pllPostDiv; + 3003b58: fdc42783 lw a5,-36(s0) + 3003b5c: fef42623 sw a5,-20(s0) + if (div > CRG_PLL_POSTDIV_8) { + 3003b60: fec42703 lw a4,-20(s0) + 3003b64: 479d li a5,7 + 3003b66: 00e7f663 bgeu a5,a4,3003b72 + div = (CRG_PLL_POSTDIV_8 + 1); /* If the postdiv is greater than 8, set this postdiv to 8. */ + 3003b6a: 47a1 li a5,8 + 3003b6c: fef42623 sw a5,-20(s0) + 3003b70: a031 j 3003b7c + } else { + div += 1; + 3003b72: fec42783 lw a5,-20(s0) + 3003b76: 0785 addi a5,a5,1 + 3003b78: fef42623 sw a5,-20(s0) + } + return div; + 3003b7c: fec42783 lw a5,-20(s0) +} + 3003b80: 853e mv a0,a5 + 3003b82: 5432 lw s0,44(sp) + 3003b84: 6145 addi sp,sp,48 + 3003b86: 8082 ret + +03003b88 : + * @param matchInfo IP without Clock select match info + * @param enable BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003b88: 7179 addi sp,sp,-48 + 3003b8a: d606 sw ra,44(sp) + 3003b8c: d422 sw s0,40(sp) + 3003b8e: 1800 addi s0,sp,48 + 3003b90: fca42e23 sw a0,-36(s0) + 3003b94: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003b98: fdc42783 lw a5,-36(s0) + 3003b9c: eb89 bnez a5,3003bae + 3003b9e: 34d00593 li a1,845 + 3003ba2: 030077b7 lui a5,0x3007 + 3003ba6: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003baa: 2ad5 jal ra,3003d9e + 3003bac: a001 j 3003bac + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003bae: 040007b7 lui a5,0x4000 + 3003bb2: 4947a783 lw a5,1172(a5) # 4000494 + 3003bb6: eb89 bnez a5,3003bc8 + 3003bb8: 34e00593 li a1,846 + 3003bbc: 030077b7 lui a5,0x3007 + 3003bc0: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003bc4: 2ae9 jal ra,3003d9e + 3003bc6: a001 j 3003bc6 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003bc8: 040007b7 lui a5,0x4000 + 3003bcc: 4947a783 lw a5,1172(a5) # 4000494 + 3003bd0: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003bd4: fdc42783 lw a5,-36(s0) + 3003bd8: 279e lhu a5,8(a5) + 3003bda: 873e mv a4,a5 + 3003bdc: fec42783 lw a5,-20(s0) + 3003be0: 97ba add a5,a5,a4 + 3003be2: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003be6: fe842783 lw a5,-24(s0) + 3003bea: 439c lw a5,0(a5) + 3003bec: fef42223 sw a5,-28(s0) + if (enable & IP_CLK_ENABLE) { /* Set enable of target ip. */ + 3003bf0: fd842783 lw a5,-40(s0) + 3003bf4: 8b85 andi a5,a5,1 + 3003bf6: c7c1 beqz a5,3003c7e + cfg.BIT.clkEnMask |= 1 << matchInfo->bitOffset; + 3003bf8: fe442783 lw a5,-28(s0) + 3003bfc: 9fa1 uxth a5 + 3003bfe: 01079713 slli a4,a5,0x10 + 3003c02: 8741 srai a4,a4,0x10 + 3003c04: fdc42783 lw a5,-36(s0) + 3003c08: 27bc lbu a5,10(a5) + 3003c0a: 86be mv a3,a5 + 3003c0c: 4785 li a5,1 + 3003c0e: 00d797b3 sll a5,a5,a3 + 3003c12: 07c2 slli a5,a5,0x10 + 3003c14: 87c1 srai a5,a5,0x10 + 3003c16: 8fd9 or a5,a5,a4 + 3003c18: 07c2 slli a5,a5,0x10 + 3003c1a: 87c1 srai a5,a5,0x10 + 3003c1c: 01079693 slli a3,a5,0x10 + 3003c20: 82c1 srli a3,a3,0x10 + 3003c22: fe442783 lw a5,-28(s0) + 3003c26: 6741 lui a4,0x10 + 3003c28: 177d addi a4,a4,-1 # ffff + 3003c2a: 8f75 and a4,a4,a3 + 3003c2c: 76c1 lui a3,0xffff0 + 3003c2e: 8ff5 and a5,a5,a3 + 3003c30: 8fd9 or a5,a5,a4 + 3003c32: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); + 3003c36: fe442783 lw a5,-28(s0) + 3003c3a: 83c1 srli a5,a5,0x10 + 3003c3c: 9fa1 uxth a5 + 3003c3e: 01079713 slli a4,a5,0x10 + 3003c42: 8741 srai a4,a4,0x10 + 3003c44: fdc42783 lw a5,-36(s0) + 3003c48: 27bc lbu a5,10(a5) + 3003c4a: 86be mv a3,a5 + 3003c4c: 4785 li a5,1 + 3003c4e: 00d797b3 sll a5,a5,a3 + 3003c52: 07c2 slli a5,a5,0x10 + 3003c54: 87c1 srai a5,a5,0x10 + 3003c56: fff7c793 not a5,a5 + 3003c5a: 07c2 slli a5,a5,0x10 + 3003c5c: 87c1 srai a5,a5,0x10 + 3003c5e: 8ff9 and a5,a5,a4 + 3003c60: 07c2 slli a5,a5,0x10 + 3003c62: 87c1 srai a5,a5,0x10 + 3003c64: 01079713 slli a4,a5,0x10 + 3003c68: 8341 srli a4,a4,0x10 + 3003c6a: fe442783 lw a5,-28(s0) + 3003c6e: 0742 slli a4,a4,0x10 + 3003c70: 66c1 lui a3,0x10 + 3003c72: 16fd addi a3,a3,-1 # ffff + 3003c74: 8ff5 and a5,a5,a3 + 3003c76: 8fd9 or a5,a5,a4 + 3003c78: fef42223 sw a5,-28(s0) + 3003c7c: a059 j 3003d02 + } else { + cfg.BIT.clkEnMask &= ~(1 << matchInfo->bitOffset); /* Disable of target ip. */ + 3003c7e: fe442783 lw a5,-28(s0) + 3003c82: 9fa1 uxth a5 + 3003c84: 01079713 slli a4,a5,0x10 + 3003c88: 8741 srai a4,a4,0x10 + 3003c8a: fdc42783 lw a5,-36(s0) + 3003c8e: 27bc lbu a5,10(a5) + 3003c90: 86be mv a3,a5 + 3003c92: 4785 li a5,1 + 3003c94: 00d797b3 sll a5,a5,a3 + 3003c98: 07c2 slli a5,a5,0x10 + 3003c9a: 87c1 srai a5,a5,0x10 + 3003c9c: fff7c793 not a5,a5 + 3003ca0: 07c2 slli a5,a5,0x10 + 3003ca2: 87c1 srai a5,a5,0x10 + 3003ca4: 8ff9 and a5,a5,a4 + 3003ca6: 07c2 slli a5,a5,0x10 + 3003ca8: 87c1 srai a5,a5,0x10 + 3003caa: 01079693 slli a3,a5,0x10 + 3003cae: 82c1 srli a3,a3,0x10 + 3003cb0: fe442783 lw a5,-28(s0) + 3003cb4: 6741 lui a4,0x10 + 3003cb6: 177d addi a4,a4,-1 # ffff + 3003cb8: 8f75 and a4,a4,a3 + 3003cba: 76c1 lui a3,0xffff0 + 3003cbc: 8ff5 and a5,a5,a3 + 3003cbe: 8fd9 or a5,a5,a4 + 3003cc0: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq |= (1 << matchInfo->bitOffset); + 3003cc4: fe442783 lw a5,-28(s0) + 3003cc8: 83c1 srli a5,a5,0x10 + 3003cca: 9fa1 uxth a5 + 3003ccc: 01079713 slli a4,a5,0x10 + 3003cd0: 8741 srai a4,a4,0x10 + 3003cd2: fdc42783 lw a5,-36(s0) + 3003cd6: 27bc lbu a5,10(a5) + 3003cd8: 86be mv a3,a5 + 3003cda: 4785 li a5,1 + 3003cdc: 00d797b3 sll a5,a5,a3 + 3003ce0: 07c2 slli a5,a5,0x10 + 3003ce2: 87c1 srai a5,a5,0x10 + 3003ce4: 8fd9 or a5,a5,a4 + 3003ce6: 07c2 slli a5,a5,0x10 + 3003ce8: 87c1 srai a5,a5,0x10 + 3003cea: 01079713 slli a4,a5,0x10 + 3003cee: 8341 srli a4,a4,0x10 + 3003cf0: fe442783 lw a5,-28(s0) + 3003cf4: 0742 slli a4,a4,0x10 + 3003cf6: 66c1 lui a3,0x10 + 3003cf8: 16fd addi a3,a3,-1 # ffff + 3003cfa: 8ff5 and a5,a5,a3 + 3003cfc: 8fd9 or a5,a5,a4 + 3003cfe: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3003d02: fe442703 lw a4,-28(s0) + 3003d06: fe842783 lw a5,-24(s0) + 3003d0a: c398 sw a4,0(a5) +} + 3003d0c: 0001 nop + 3003d0e: 50b2 lw ra,44(sp) + 3003d10: 5422 lw s0,40(sp) + 3003d12: 6145 addi sp,sp,48 + 3003d14: 8082 ret + +03003d16 : + * @brief Get Enable status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock Enable status + */ +static unsigned int CRG_IpWoClkSelEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003d16: 7179 addi sp,sp,-48 + 3003d18: d606 sw ra,44(sp) + 3003d1a: d422 sw s0,40(sp) + 3003d1c: 1800 addi s0,sp,48 + 3003d1e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003d22: fdc42783 lw a5,-36(s0) + 3003d26: eb89 bnez a5,3003d38 + 3003d28: 36500593 li a1,869 + 3003d2c: 030077b7 lui a5,0x3007 + 3003d30: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003d34: 20ad jal ra,3003d9e + 3003d36: a001 j 3003d36 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003d38: 040007b7 lui a5,0x4000 + 3003d3c: 4947a783 lw a5,1172(a5) # 4000494 + 3003d40: eb89 bnez a5,3003d52 + 3003d42: 36600593 li a1,870 + 3003d46: 030077b7 lui a5,0x3007 + 3003d4a: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003d4e: 2881 jal ra,3003d9e + 3003d50: a001 j 3003d50 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003d52: 040007b7 lui a5,0x4000 + 3003d56: 4947a783 lw a5,1172(a5) # 4000494 + 3003d5a: fef42623 sw a5,-20(s0) + /* Get enable status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003d5e: fdc42783 lw a5,-36(s0) + 3003d62: 279e lhu a5,8(a5) + 3003d64: 873e mv a4,a5 + 3003d66: fec42783 lw a5,-20(s0) + 3003d6a: 97ba add a5,a5,a4 + 3003d6c: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + + cfg.value = p->value; + 3003d70: fe842783 lw a5,-24(s0) + 3003d74: 439c lw a5,0(a5) + 3003d76: fef42223 sw a5,-28(s0) + return (cfg.BIT.clkEnMask & (1 << matchInfo->bitOffset)) == 0 ? false : true; + 3003d7a: fe442783 lw a5,-28(s0) + 3003d7e: 9fa1 uxth a5 + 3003d80: 873e mv a4,a5 + 3003d82: fdc42783 lw a5,-36(s0) + 3003d86: 27bc lbu a5,10(a5) + 3003d88: 40f757b3 sra a5,a4,a5 + 3003d8c: 8b85 andi a5,a5,1 + 3003d8e: 00f037b3 snez a5,a5 + 3003d92: 9f81 uxtb a5 +} + 3003d94: 853e mv a0,a5 + 3003d96: 50b2 lw ra,44(sp) + 3003d98: 5422 lw s0,40(sp) + 3003d9a: 6145 addi sp,sp,48 + 3003d9c: 8082 ret + +03003d9e : + 3003d9e: c48fe06f j 30021e6 + +03003da2 : + * @param matchInfo IP without Clock select match info + * @param reset BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelResetSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int reset) +{ + 3003da2: 7179 addi sp,sp,-48 + 3003da4: d606 sw ra,44(sp) + 3003da6: d422 sw s0,40(sp) + 3003da8: 1800 addi s0,sp,48 + 3003daa: fca42e23 sw a0,-36(s0) + 3003dae: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003db2: fdc42783 lw a5,-36(s0) + 3003db6: eb89 bnez a5,3003dc8 + 3003db8: 37900593 li a1,889 + 3003dbc: 030077b7 lui a5,0x3007 + 3003dc0: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003dc4: 3fe9 jal ra,3003d9e + 3003dc6: a001 j 3003dc6 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003dc8: 040007b7 lui a5,0x4000 + 3003dcc: 4947a783 lw a5,1172(a5) # 4000494 + 3003dd0: eb89 bnez a5,3003de2 + 3003dd2: 37a00593 li a1,890 + 3003dd6: 030077b7 lui a5,0x3007 + 3003dda: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003dde: 37c1 jal ra,3003d9e + 3003de0: a001 j 3003de0 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003de2: 040007b7 lui a5,0x4000 + 3003de6: 4947a783 lw a5,1172(a5) # 4000494 + 3003dea: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003dee: fdc42783 lw a5,-36(s0) + 3003df2: 279e lhu a5,8(a5) + 3003df4: 873e mv a4,a5 + 3003df6: fec42783 lw a5,-20(s0) + 3003dfa: 97ba add a5,a5,a4 + 3003dfc: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003e00: fe842783 lw a5,-24(s0) + 3003e04: 439c lw a5,0(a5) + 3003e06: fef42223 sw a5,-28(s0) + if (reset & BASE_CFG_SET) { + 3003e0a: fd842783 lw a5,-40(s0) + 3003e0e: 8b85 andi a5,a5,1 + 3003e10: c3a9 beqz a5,3003e52 + cfg.BIT.softResetReq |= 1 << matchInfo->bitOffset; /* reset of target ip. */ + 3003e12: fe442783 lw a5,-28(s0) + 3003e16: 83c1 srli a5,a5,0x10 + 3003e18: 9fa1 uxth a5 + 3003e1a: 01079713 slli a4,a5,0x10 + 3003e1e: 8741 srai a4,a4,0x10 + 3003e20: fdc42783 lw a5,-36(s0) + 3003e24: 27bc lbu a5,10(a5) + 3003e26: 86be mv a3,a5 + 3003e28: 4785 li a5,1 + 3003e2a: 00d797b3 sll a5,a5,a3 + 3003e2e: 07c2 slli a5,a5,0x10 + 3003e30: 87c1 srai a5,a5,0x10 + 3003e32: 8fd9 or a5,a5,a4 + 3003e34: 07c2 slli a5,a5,0x10 + 3003e36: 87c1 srai a5,a5,0x10 + 3003e38: 01079713 slli a4,a5,0x10 + 3003e3c: 8341 srli a4,a4,0x10 + 3003e3e: fe442783 lw a5,-28(s0) + 3003e42: 0742 slli a4,a4,0x10 + 3003e44: 66c1 lui a3,0x10 + 3003e46: 16fd addi a3,a3,-1 # ffff + 3003e48: 8ff5 and a5,a5,a3 + 3003e4a: 8fd9 or a5,a5,a4 + 3003e4c: fef42223 sw a5,-28(s0) + 3003e50: a0a1 j 3003e98 + } else { + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); /* Undo reset of target ip. */ + 3003e52: fe442783 lw a5,-28(s0) + 3003e56: 83c1 srli a5,a5,0x10 + 3003e58: 9fa1 uxth a5 + 3003e5a: 01079713 slli a4,a5,0x10 + 3003e5e: 8741 srai a4,a4,0x10 + 3003e60: fdc42783 lw a5,-36(s0) + 3003e64: 27bc lbu a5,10(a5) + 3003e66: 86be mv a3,a5 + 3003e68: 4785 li a5,1 + 3003e6a: 00d797b3 sll a5,a5,a3 + 3003e6e: 07c2 slli a5,a5,0x10 + 3003e70: 87c1 srai a5,a5,0x10 + 3003e72: fff7c793 not a5,a5 + 3003e76: 07c2 slli a5,a5,0x10 + 3003e78: 87c1 srai a5,a5,0x10 + 3003e7a: 8ff9 and a5,a5,a4 + 3003e7c: 07c2 slli a5,a5,0x10 + 3003e7e: 87c1 srai a5,a5,0x10 + 3003e80: 01079713 slli a4,a5,0x10 + 3003e84: 8341 srli a4,a4,0x10 + 3003e86: fe442783 lw a5,-28(s0) + 3003e8a: 0742 slli a4,a4,0x10 + 3003e8c: 66c1 lui a3,0x10 + 3003e8e: 16fd addi a3,a3,-1 # ffff + 3003e90: 8ff5 and a5,a5,a3 + 3003e92: 8fd9 or a5,a5,a4 + 3003e94: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3003e98: fe442703 lw a4,-28(s0) + 3003e9c: fe842783 lw a5,-24(s0) + 3003ea0: c398 sw a4,0(a5) +} + 3003ea2: 0001 nop + 3003ea4: 50b2 lw ra,44(sp) + 3003ea6: 5422 lw s0,40(sp) + 3003ea8: 6145 addi sp,sp,48 + 3003eaa: 8082 ret + +03003eac : + * @brief Get Reset status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock select reset status + */ +static unsigned int CRG_IpWoClkSelResetGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003eac: 7179 addi sp,sp,-48 + 3003eae: d606 sw ra,44(sp) + 3003eb0: d422 sw s0,40(sp) + 3003eb2: 1800 addi s0,sp,48 + 3003eb4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003eb8: fdc42783 lw a5,-36(s0) + 3003ebc: eb89 bnez a5,3003ece + 3003ebe: 38f00593 li a1,911 + 3003ec2: 030077b7 lui a5,0x3007 + 3003ec6: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003eca: 3dd1 jal ra,3003d9e + 3003ecc: a001 j 3003ecc + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003ece: 040007b7 lui a5,0x4000 + 3003ed2: 4947a783 lw a5,1172(a5) # 4000494 + 3003ed6: eb89 bnez a5,3003ee8 + 3003ed8: 39000593 li a1,912 + 3003edc: 030077b7 lui a5,0x3007 + 3003ee0: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003ee4: 3d6d jal ra,3003d9e + 3003ee6: a001 j 3003ee6 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003ee8: 040007b7 lui a5,0x4000 + 3003eec: 4947a783 lw a5,1172(a5) # 4000494 + 3003ef0: fef42623 sw a5,-20(s0) + /* Get the reset status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003ef4: fdc42783 lw a5,-36(s0) + 3003ef8: 279e lhu a5,8(a5) + 3003efa: 873e mv a4,a5 + 3003efc: fec42783 lw a5,-20(s0) + 3003f00: 97ba add a5,a5,a4 + 3003f02: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003f06: fe842783 lw a5,-24(s0) + 3003f0a: 439c lw a5,0(a5) + 3003f0c: fef42223 sw a5,-28(s0) + return (cfg.BIT.softResetReq & (1 << matchInfo->bitOffset)) ? BASE_CFG_SET : BASE_CFG_UNSET; + 3003f10: fe442783 lw a5,-28(s0) + 3003f14: 83c1 srli a5,a5,0x10 + 3003f16: 9fa1 uxth a5 + 3003f18: 873e mv a4,a5 + 3003f1a: fdc42783 lw a5,-36(s0) + 3003f1e: 27bc lbu a5,10(a5) + 3003f20: 40f757b3 sra a5,a4,a5 + 3003f24: 8b85 andi a5,a5,1 + 3003f26: 00f037b3 snez a5,a5 + 3003f2a: 9f81 uxtb a5 +} + 3003f2c: 853e mv a0,a5 + 3003f2e: 50b2 lw ra,44(sp) + 3003f30: 5422 lw s0,40(sp) + 3003f32: 6145 addi sp,sp,48 + 3003f34: 8082 ret + +03003f36 : + * @param matchInfo ADC match info + * @param enable IP_CLK_ENABLE + * @retval None + */ +static void CRG_AdcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003f36: 7179 addi sp,sp,-48 + 3003f38: d606 sw ra,44(sp) + 3003f3a: d422 sw s0,40(sp) + 3003f3c: 1800 addi s0,sp,48 + 3003f3e: fca42e23 sw a0,-36(s0) + 3003f42: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003f46: fdc42783 lw a5,-36(s0) + 3003f4a: eb89 bnez a5,3003f5c + 3003f4c: 3a200593 li a1,930 + 3003f50: 030077b7 lui a5,0x3007 + 3003f54: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003f58: 3599 jal ra,3003d9e + 3003f5a: a001 j 3003f5a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003f5c: 040007b7 lui a5,0x4000 + 3003f60: 4947a783 lw a5,1172(a5) # 4000494 + 3003f64: eb89 bnez a5,3003f76 + 3003f66: 3a300593 li a1,931 + 3003f6a: 030077b7 lui a5,0x3007 + 3003f6e: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003f72: 3535 jal ra,3003d9e + 3003f74: a001 j 3003f74 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003f76: 040007b7 lui a5,0x4000 + 3003f7a: 4947a783 lw a5,1172(a5) # 4000494 + 3003f7e: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003f82: fdc42783 lw a5,-36(s0) + 3003f86: 279e lhu a5,8(a5) + 3003f88: 873e mv a4,a5 + 3003f8a: fec42783 lw a5,-20(s0) + 3003f8e: 97ba add a5,a5,a4 + 3003f90: fef42423 sw a5,-24(s0) + CRG_AdcIpCfg cfg; + cfg.value[1] = p->value[1]; + 3003f94: fe842783 lw a5,-24(s0) + 3003f98: 43dc lw a5,4(a5) + 3003f9a: fef42223 sw a5,-28(s0) + if (enable) { /* Enables and Deassert reset the ADC clock. */ + 3003f9e: fd842783 lw a5,-40(s0) + 3003fa2: cf99 beqz a5,3003fc0 + cfg.BIT.clk_adc_cken = BASE_CFG_SET; + 3003fa4: fe442783 lw a5,-28(s0) + 3003fa8: 0017e793 ori a5,a5,1 + 3003fac: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003fb0: fe442783 lw a5,-28(s0) + 3003fb4: 7741 lui a4,0xffff0 + 3003fb6: 177d addi a4,a4,-1 # fffeffff + 3003fb8: 8ff9 and a5,a5,a4 + 3003fba: fef42223 sw a5,-28(s0) + 3003fbe: a829 j 3003fd8 + } else { /* Disable and reset the ADC clock. */ + cfg.BIT.clk_adc_cken = BASE_CFG_UNSET; + 3003fc0: fe442783 lw a5,-28(s0) + 3003fc4: 9bf9 andi a5,a5,-2 + 3003fc6: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003fca: fe442783 lw a5,-28(s0) + 3003fce: 7741 lui a4,0xffff0 + 3003fd0: 177d addi a4,a4,-1 # fffeffff + 3003fd2: 8ff9 and a5,a5,a4 + 3003fd4: fef42223 sw a5,-28(s0) + } + p->value[1] = cfg.value[1]; + 3003fd8: fe442703 lw a4,-28(s0) + 3003fdc: fe842783 lw a5,-24(s0) + 3003fe0: c3d8 sw a4,4(a5) +} + 3003fe2: 0001 nop + 3003fe4: 50b2 lw ra,44(sp) + 3003fe6: 5422 lw s0,40(sp) + 3003fe8: 6145 addi sp,sp,48 + 3003fea: 8082 ret + +03003fec : + * @brief Get Enable status of ADC + * @param matchInfo ADC match info + * @retval Cken of ADC + */ +static unsigned int CRG_AdcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003fec: 7179 addi sp,sp,-48 + 3003fee: d606 sw ra,44(sp) + 3003ff0: d422 sw s0,40(sp) + 3003ff2: 1800 addi s0,sp,48 + 3003ff4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003ff8: fdc42783 lw a5,-36(s0) + 3003ffc: eb89 bnez a5,300400e + 3003ffe: 3ba00593 li a1,954 + 3004002: 030077b7 lui a5,0x3007 + 3004006: 8a478513 addi a0,a5,-1884 # 30068a4 + 300400a: 3b51 jal ra,3003d9e + 300400c: a001 j 300400c + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300400e: 040007b7 lui a5,0x4000 + 3004012: 4947a783 lw a5,1172(a5) # 4000494 + 3004016: eb89 bnez a5,3004028 + 3004018: 3bb00593 li a1,955 + 300401c: 030077b7 lui a5,0x3007 + 3004020: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004024: 3bad jal ra,3003d9e + 3004026: a001 j 3004026 + unsigned int enable; + /* Get the enable status of the ADC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3004028: 040007b7 lui a5,0x4000 + 300402c: 4947a783 lw a5,1172(a5) # 4000494 + 3004030: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004034: fdc42783 lw a5,-36(s0) + 3004038: 279e lhu a5,8(a5) + 300403a: 873e mv a4,a5 + 300403c: fec42783 lw a5,-20(s0) + 3004040: 97ba add a5,a5,a4 + 3004042: fef42423 sw a5,-24(s0) + enable = ((p->BIT.clk_adc_cken != 0)) ? IP_CLK_ENABLE : IP_CLK_DISABLE; + 3004046: fe842783 lw a5,-24(s0) + 300404a: 43dc lw a5,4(a5) + 300404c: 8b85 andi a5,a5,1 + 300404e: 9f81 uxtb a5 + 3004050: c399 beqz a5,3004056 + 3004052: 4785 li a5,1 + 3004054: a011 j 3004058 + 3004056: 4781 li a5,0 + 3004058: fef42223 sw a5,-28(s0) + return enable; + 300405c: fe442783 lw a5,-28(s0) +} + 3004060: 853e mv a0,a5 + 3004062: 50b2 lw ra,44(sp) + 3004064: 5422 lw s0,40(sp) + 3004066: 6145 addi sp,sp,48 + 3004068: 8082 ret + +0300406a : + * @param matchInfo ADC match info + * @param clkSelect @see CRG_AdcClkSelect + * @retval None + */ +static void CRG_AdcClkSelectSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int clkSelect) +{ + 300406a: 7179 addi sp,sp,-48 + 300406c: d606 sw ra,44(sp) + 300406e: d422 sw s0,40(sp) + 3004070: 1800 addi s0,sp,48 + 3004072: fca42e23 sw a0,-36(s0) + 3004076: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300407a: fdc42783 lw a5,-36(s0) + 300407e: eb89 bnez a5,3004090 + 3004080: 3cc00593 li a1,972 + 3004084: 030077b7 lui a5,0x3007 + 3004088: 8a478513 addi a0,a5,-1884 # 30068a4 + 300408c: 3b09 jal ra,3003d9e + 300408e: a001 j 300408e + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004090: 040007b7 lui a5,0x4000 + 3004094: 4947a783 lw a5,1172(a5) # 4000494 + 3004098: eb89 bnez a5,30040aa + 300409a: 3cd00593 li a1,973 + 300409e: 030077b7 lui a5,0x3007 + 30040a2: 8a478513 addi a0,a5,-1884 # 30068a4 + 30040a6: 39e5 jal ra,3003d9e + 30040a8: a001 j 30040a8 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30040aa: 040007b7 lui a5,0x4000 + 30040ae: 4947a703 lw a4,1172(a5) # 4000494 + 30040b2: 100007b7 lui a5,0x10000 + 30040b6: 00f70a63 beq a4,a5,30040ca + 30040ba: 3ce00593 li a1,974 + 30040be: 030077b7 lui a5,0x3007 + 30040c2: 8a478513 addi a0,a5,-1884 # 30068a4 + 30040c6: 39e1 jal ra,3003d9e + 30040c8: a001 j 30040c8 + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkModeSelect(clkSelect)); + 30040ca: fd842503 lw a0,-40(s0) + 30040ce: ea1fe0ef jal ra,3002f6e + 30040d2: 87aa mv a5,a0 + 30040d4: 0017c793 xori a5,a5,1 + 30040d8: 9f81 uxtb a5 + 30040da: cb89 beqz a5,30040ec + 30040dc: 3cf00593 li a1,975 + 30040e0: 030077b7 lui a5,0x3007 + 30040e4: 8a478513 addi a0,a5,-1884 # 30068a4 + 30040e8: 395d jal ra,3003d9e + 30040ea: a89d j 3004160 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30040ec: 040007b7 lui a5,0x4000 + 30040f0: 4947a783 lw a5,1172(a5) # 4000494 + 30040f4: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 30040f8: fdc42783 lw a5,-36(s0) + 30040fc: 279e lhu a5,8(a5) + 30040fe: 873e mv a4,a5 + 3004100: fec42783 lw a5,-20(s0) + 3004104: 97ba add a5,a5,a4 + 3004106: fef42423 sw a5,-24(s0) + if (clkSelect == CRG_ADC_CLK_SYN_CORE) { + 300410a: fd842703 lw a4,-40(s0) + 300410e: 478d li a5,3 + 3004110: 00f71a63 bne a4,a5,3004124 + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_SET; /* use sync clock */ + 3004114: fe842703 lw a4,-24(s0) + 3004118: 435c lw a5,4(a4) + 300411a: 010006b7 lui a3,0x1000 + 300411e: 8fd5 or a5,a5,a3 + 3004120: c35c sw a5,4(a4) + 3004122: a83d j 3004160 + } else { + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3004124: b67fe0ef jal ra,3002c8a + g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel = clkSelect; /* write clock selection */ + 3004128: 040007b7 lui a5,0x4000 + 300412c: 4947a703 lw a4,1172(a5) # 4000494 + 3004130: fd842783 lw a5,-40(s0) + 3004134: 8b8d andi a5,a5,3 + 3004136: 0ff7f693 andi a3,a5,255 + 300413a: 10072783 lw a5,256(a4) + 300413e: 8a8d andi a3,a3,3 + 3004140: 0692 slli a3,a3,0x4 + 3004142: fcf7f793 andi a5,a5,-49 + 3004146: 8fd5 or a5,a5,a3 + 3004148: 10f72023 sw a5,256(a4) + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 300414c: b67fe0ef jal ra,3002cb2 + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_UNSET; + 3004150: fe842703 lw a4,-24(s0) + 3004154: 435c lw a5,4(a4) + 3004156: ff0006b7 lui a3,0xff000 + 300415a: 16fd addi a3,a3,-1 # feffffff + 300415c: 8ff5 and a5,a5,a3 + 300415e: c35c sw a5,4(a4) + } +} + 3004160: 50b2 lw ra,44(sp) + 3004162: 5422 lw s0,40(sp) + 3004164: 6145 addi sp,sp,48 + 3004166: 8082 ret + +03004168 : + * @brief Get ADC Clock Select + * @param matchInfo ADC match info + * @retval Adc Clock select @see CRG_AdcClkSelect + */ +static unsigned int CRG_AdcClkSelectGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3004168: 7179 addi sp,sp,-48 + 300416a: d606 sw ra,44(sp) + 300416c: d422 sw s0,40(sp) + 300416e: 1800 addi s0,sp,48 + 3004170: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004174: fdc42783 lw a5,-36(s0) + 3004178: eb89 bnez a5,300418a + 300417a: 3e400593 li a1,996 + 300417e: 030077b7 lui a5,0x3007 + 3004182: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004186: 3921 jal ra,3003d9e + 3004188: a001 j 3004188 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300418a: 040007b7 lui a5,0x4000 + 300418e: 4947a783 lw a5,1172(a5) # 4000494 + 3004192: eb89 bnez a5,30041a4 + 3004194: 3e500593 li a1,997 + 3004198: 030077b7 lui a5,0x3007 + 300419c: 8a478513 addi a0,a5,-1884 # 30068a4 + 30041a0: 3efd jal ra,3003d9e + 30041a2: a001 j 30041a2 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30041a4: 040007b7 lui a5,0x4000 + 30041a8: 4947a783 lw a5,1172(a5) # 4000494 + 30041ac: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 30041b0: fdc42783 lw a5,-36(s0) + 30041b4: 279e lhu a5,8(a5) + 30041b6: 873e mv a4,a5 + 30041b8: fec42783 lw a5,-20(s0) + 30041bc: 97ba add a5,a5,a4 + 30041be: fef42423 sw a5,-24(s0) + if (p->BIT.cfg_adc_ckmode_sel == BASE_CFG_SET) { + 30041c2: fe842783 lw a5,-24(s0) + 30041c6: 43dc lw a5,4(a5) + 30041c8: 83e1 srli a5,a5,0x18 + 30041ca: 8b85 andi a5,a5,1 + 30041cc: 0ff7f713 andi a4,a5,255 + 30041d0: 4785 li a5,1 + 30041d2: 00f71463 bne a4,a5,30041da + return CRG_ADC_CLK_SYN_CORE; /* Synchronous clock signal */ + 30041d6: 478d li a5,3 + 30041d8: a811 j 30041ec + } + return g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel; /* asynchronous clock signal */ + 30041da: 040007b7 lui a5,0x4000 + 30041de: 4947a783 lw a5,1172(a5) # 4000494 + 30041e2: 1007a783 lw a5,256(a5) + 30041e6: 8391 srli a5,a5,0x4 + 30041e8: 8b8d andi a5,a5,3 + 30041ea: 9f81 uxtb a5 +} + 30041ec: 853e mv a0,a5 + 30041ee: 50b2 lw ra,44(sp) + 30041f0: 5422 lw s0,40(sp) + 30041f2: 6145 addi sp,sp,48 + 30041f4: 8082 ret + +030041f6 : + * @param matchInfo ADC match info + * @param div Adc clock division + * @retval None + */ +static void CRG_AdcDivSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int div) +{ + 30041f6: 7179 addi sp,sp,-48 + 30041f8: d606 sw ra,44(sp) + 30041fa: d422 sw s0,40(sp) + 30041fc: 1800 addi s0,sp,48 + 30041fe: fca42e23 sw a0,-36(s0) + 3004202: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004206: fdc42783 lw a5,-36(s0) + 300420a: eb89 bnez a5,300421c + 300420c: 3f700593 li a1,1015 + 3004210: 030077b7 lui a5,0x3007 + 3004214: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004218: 3659 jal ra,3003d9e + 300421a: a001 j 300421a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300421c: 040007b7 lui a5,0x4000 + 3004220: 4947a783 lw a5,1172(a5) # 4000494 + 3004224: eb89 bnez a5,3004236 + 3004226: 3f800593 li a1,1016 + 300422a: 030077b7 lui a5,0x3007 + 300422e: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004232: 36b5 jal ra,3003d9e + 3004234: a001 j 3004234 + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkDiv(div)); + 3004236: fd842503 lw a0,-40(s0) + 300423a: d75fe0ef jal ra,3002fae + 300423e: 87aa mv a5,a0 + 3004240: 0017c793 xori a5,a5,1 + 3004244: 9f81 uxtb a5 + 3004246: cb89 beqz a5,3004258 + 3004248: 3f900593 li a1,1017 + 300424c: 030077b7 lui a5,0x3007 + 3004250: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004254: 36a9 jal ra,3003d9e + 3004256: a885 j 30042c6 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3004258: 040007b7 lui a5,0x4000 + 300425c: 4947a783 lw a5,1172(a5) # 4000494 + 3004260: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004264: fdc42783 lw a5,-36(s0) + 3004268: 279e lhu a5,8(a5) + 300426a: 873e mv a4,a5 + 300426c: fec42783 lw a5,-20(s0) + 3004270: 97ba add a5,a5,a4 + 3004272: fef42423 sw a5,-24(s0) + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3004276: fe842783 lw a5,-24(s0) + 300427a: 43dc lw a5,4(a5) + 300427c: 83e1 srli a5,a5,0x18 + 300427e: 8b85 andi a5,a5,1 + 3004280: 9f81 uxtb a5 + 3004282: fef42223 sw a5,-28(s0) + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3004286: fe442703 lw a4,-28(s0) + 300428a: 4785 li a5,1 + 300428c: 02f71163 bne a4,a5,30042ae + p->BIT.clk_adc_div1 = div; /* write div to I1 */ + 3004290: fd842783 lw a5,-40(s0) + 3004294: 8b8d andi a5,a5,3 + 3004296: 0ff7f693 andi a3,a5,255 + 300429a: fe842703 lw a4,-24(s0) + 300429e: 431c lw a5,0(a4) + 30042a0: 8a8d andi a3,a3,3 + 30042a2: 06a2 slli a3,a3,0x8 + 30042a4: cff7f793 andi a5,a5,-769 + 30042a8: 8fd5 or a5,a5,a3 + 30042aa: c31c sw a5,0(a4) + 30042ac: a829 j 30042c6 + } else { + p->BIT.clk_adc_div0 = div; /* write div to I0 */ + 30042ae: fd842783 lw a5,-40(s0) + 30042b2: 8b8d andi a5,a5,3 + 30042b4: 0ff7f693 andi a3,a5,255 + 30042b8: fe842703 lw a4,-24(s0) + 30042bc: 431c lw a5,0(a4) + 30042be: 8a8d andi a3,a3,3 + 30042c0: 9bf1 andi a5,a5,-4 + 30042c2: 8fd5 or a5,a5,a3 + 30042c4: c31c sw a5,0(a4) + } +} + 30042c6: 50b2 lw ra,44(sp) + 30042c8: 5422 lw s0,40(sp) + 30042ca: 6145 addi sp,sp,48 + 30042cc: 8082 ret + +030042ce : + * @brief Get ADC clock division + * @param matchInfo ADC match info + * @retval Adc clock division + */ +static unsigned int CRG_AdcDivGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30042ce: 7179 addi sp,sp,-48 + 30042d0: d606 sw ra,44(sp) + 30042d2: d422 sw s0,40(sp) + 30042d4: 1800 addi s0,sp,48 + 30042d6: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30042da: fdc42783 lw a5,-36(s0) + 30042de: eb89 bnez a5,30042f0 + 30042e0: 40c00593 li a1,1036 + 30042e4: 030077b7 lui a5,0x3007 + 30042e8: 8a478513 addi a0,a5,-1884 # 30068a4 + 30042ec: 3c4d jal ra,3003d9e + 30042ee: a001 j 30042ee + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30042f0: 040007b7 lui a5,0x4000 + 30042f4: 4947a783 lw a5,1172(a5) # 4000494 + 30042f8: eb89 bnez a5,300430a + 30042fa: 40d00593 li a1,1037 + 30042fe: 030077b7 lui a5,0x3007 + 3004302: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004306: 3c61 jal ra,3003d9e + 3004308: a001 j 3004308 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300430a: 040007b7 lui a5,0x4000 + 300430e: 4947a783 lw a5,1172(a5) # 4000494 + 3004312: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004316: fdc42783 lw a5,-36(s0) + 300431a: 279e lhu a5,8(a5) + 300431c: 873e mv a4,a5 + 300431e: fec42783 lw a5,-20(s0) + 3004322: 97ba add a5,a5,a4 + 3004324: fef42423 sw a5,-24(s0) + + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3004328: fe842783 lw a5,-24(s0) + 300432c: 43dc lw a5,4(a5) + 300432e: 83e1 srli a5,a5,0x18 + 3004330: 8b85 andi a5,a5,1 + 3004332: 9f81 uxtb a5 + 3004334: fef42223 sw a5,-28(s0) + + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3004338: fe442703 lw a4,-28(s0) + 300433c: 4785 li a5,1 + 300433e: 00f71963 bne a4,a5,3004350 + return p->BIT.clk_adc_div1; /* return div value I1 */ + 3004342: fe842783 lw a5,-24(s0) + 3004346: 439c lw a5,0(a5) + 3004348: 83a1 srli a5,a5,0x8 + 300434a: 8b8d andi a5,a5,3 + 300434c: 9f81 uxtb a5 + 300434e: a031 j 300435a + } + return p->BIT.clk_adc_div0; /* return div valye I0 */ + 3004350: fe842783 lw a5,-24(s0) + 3004354: 439c lw a5,0(a5) + 3004356: 8b8d andi a5,a5,3 + 3004358: 9f81 uxtb a5 +} + 300435a: 853e mv a0,a5 + 300435c: 50b2 lw ra,44(sp) + 300435e: 5422 lw s0,40(sp) + 3004360: 6145 addi sp,sp,48 + 3004362: 8082 ret + +03004364 : + * @brief Enable Clock of EFC + * @param matchInfo EFC match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_EfcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3004364: 7179 addi sp,sp,-48 + 3004366: d606 sw ra,44(sp) + 3004368: d422 sw s0,40(sp) + 300436a: 1800 addi s0,sp,48 + 300436c: fca42e23 sw a0,-36(s0) + 3004370: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004374: fdc42783 lw a5,-36(s0) + 3004378: eb89 bnez a5,300438a + 300437a: 42100593 li a1,1057 + 300437e: 030077b7 lui a5,0x3007 + 3004382: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004386: 3c21 jal ra,3003d9e + 3004388: a001 j 3004388 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300438a: 040007b7 lui a5,0x4000 + 300438e: 4947a783 lw a5,1172(a5) # 4000494 + 3004392: eb89 bnez a5,30043a4 + 3004394: 42200593 li a1,1058 + 3004398: 030077b7 lui a5,0x3007 + 300439c: 8a478513 addi a0,a5,-1884 # 30068a4 + 30043a0: 3afd jal ra,3003d9e + 30043a2: a001 j 30043a2 + /* Enables or disables EFC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30043a4: 040007b7 lui a5,0x4000 + 30043a8: 4947a783 lw a5,1172(a5) # 4000494 + 30043ac: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 30043b0: fdc42783 lw a5,-36(s0) + 30043b4: 279e lhu a5,8(a5) + 30043b6: 873e mv a4,a5 + 30043b8: fec42783 lw a5,-20(s0) + 30043bc: 97ba add a5,a5,a4 + 30043be: fef42423 sw a5,-24(s0) + p->BIT.eflash_cken = (enable & IP_CLK_ENABLE) ? BASE_CFG_SET : BASE_CFG_UNSET; + 30043c2: fd842783 lw a5,-40(s0) + 30043c6: 8b85 andi a5,a5,1 + 30043c8: 0ff7f693 andi a3,a5,255 + 30043cc: fe842703 lw a4,-24(s0) + 30043d0: 431c lw a5,0(a4) + 30043d2: 8a85 andi a3,a3,1 + 30043d4: 9bf9 andi a5,a5,-2 + 30043d6: 8fd5 or a5,a5,a3 + 30043d8: c31c sw a5,0(a4) +} + 30043da: 0001 nop + 30043dc: 50b2 lw ra,44(sp) + 30043de: 5422 lw s0,40(sp) + 30043e0: 6145 addi sp,sp,48 + 30043e2: 8082 ret + +030043e4 : + * @brief Disable Clock of EFC + * @param matchInfo EFC match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_EfcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30043e4: 7179 addi sp,sp,-48 + 30043e6: d606 sw ra,44(sp) + 30043e8: d422 sw s0,40(sp) + 30043ea: 1800 addi s0,sp,48 + 30043ec: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30043f0: fdc42783 lw a5,-36(s0) + 30043f4: eb89 bnez a5,3004406 + 30043f6: 43000593 li a1,1072 + 30043fa: 030077b7 lui a5,0x3007 + 30043fe: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004402: 3a71 jal ra,3003d9e + 3004404: a001 j 3004404 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004406: 040007b7 lui a5,0x4000 + 300440a: 4947a783 lw a5,1172(a5) # 4000494 + 300440e: eb89 bnez a5,3004420 + 3004410: 43100593 li a1,1073 + 3004414: 030077b7 lui a5,0x3007 + 3004418: 8a478513 addi a0,a5,-1884 # 30068a4 + 300441c: 3249 jal ra,3003d9e + 300441e: a001 j 300441e + /* Get the value of the EFC register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3004420: 040007b7 lui a5,0x4000 + 3004424: 4947a783 lw a5,1172(a5) # 4000494 + 3004428: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 300442c: fdc42783 lw a5,-36(s0) + 3004430: 279e lhu a5,8(a5) + 3004432: 873e mv a4,a5 + 3004434: fec42783 lw a5,-20(s0) + 3004438: 97ba add a5,a5,a4 + 300443a: fef42423 sw a5,-24(s0) + return p->BIT.eflash_cken; + 300443e: fe842783 lw a5,-24(s0) + 3004442: 439c lw a5,0(a5) + 3004444: 8b85 andi a5,a5,1 + 3004446: 9f81 uxtb a5 +} + 3004448: 853e mv a0,a5 + 300444a: 50b2 lw ra,44(sp) + 300444c: 5422 lw s0,40(sp) + 300444e: 6145 addi sp,sp,48 + 3004450: 8082 ret + +03004452 : + * @brief Enable Clock of ANA + * @param matchInfo ANA match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_AnaEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3004452: 7179 addi sp,sp,-48 + 3004454: d606 sw ra,44(sp) + 3004456: d422 sw s0,40(sp) + 3004458: 1800 addi s0,sp,48 + 300445a: fca42e23 sw a0,-36(s0) + 300445e: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004462: fdc42783 lw a5,-36(s0) + 3004466: eb89 bnez a5,3004478 + 3004468: 44000593 li a1,1088 + 300446c: 030077b7 lui a5,0x3007 + 3004470: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004474: 322d jal ra,3003d9e + 3004476: a001 j 3004476 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004478: 040007b7 lui a5,0x4000 + 300447c: 4947a783 lw a5,1172(a5) # 4000494 + 3004480: eb89 bnez a5,3004492 + 3004482: 44100593 li a1,1089 + 3004486: 030077b7 lui a5,0x3007 + 300448a: 8a478513 addi a0,a5,-1884 # 30068a4 + 300448e: 3a01 jal ra,3003d9e + 3004490: a001 j 3004490 + CRG_PARAM_CHECK_NO_RET(enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE); + 3004492: fd842703 lw a4,-40(s0) + 3004496: 4785 li a5,1 + 3004498: 00f70d63 beq a4,a5,30044b2 + 300449c: fd842783 lw a5,-40(s0) + 30044a0: cb89 beqz a5,30044b2 + 30044a2: 44200593 li a1,1090 + 30044a6: 030077b7 lui a5,0x3007 + 30044aa: 8a478513 addi a0,a5,-1884 # 30068a4 + 30044ae: 38c5 jal ra,3003d9e + 30044b0: a20d j 30045d2 + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30044b2: 040007b7 lui a5,0x4000 + 30044b6: 4947a783 lw a5,1172(a5) # 4000494 + 30044ba: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 30044be: fdc42783 lw a5,-36(s0) + 30044c2: 279e lhu a5,8(a5) + 30044c4: 873e mv a4,a5 + 30044c6: fec42783 lw a5,-20(s0) + 30044ca: 97ba add a5,a5,a4 + 30044cc: fdc42703 lw a4,-36(s0) + 30044d0: 2738 lbu a4,10(a4) + 30044d2: 97ba add a5,a5,a4 + 30044d4: fef42423 sw a5,-24(s0) + + if ((enable == IP_CLK_ENABLE) && (p->BIT.ip_srst_req == BASE_CFG_SET)) { + 30044d8: fd842703 lw a4,-40(s0) + 30044dc: 4785 li a5,1 + 30044de: 02f71f63 bne a4,a5,300451c + 30044e2: fe842783 lw a5,-24(s0) + 30044e6: 439c lw a5,0(a5) + 30044e8: 83c1 srli a5,a5,0x10 + 30044ea: 8b85 andi a5,a5,1 + 30044ec: 0ff7f713 andi a4,a5,255 + 30044f0: 4785 li a5,1 + 30044f2: 02f71563 bne a4,a5,300451c + p->BIT.ip_srst_req = BASE_CFG_UNSET; + 30044f6: fe842703 lw a4,-24(s0) + 30044fa: 431c lw a5,0(a4) + 30044fc: 76c1 lui a3,0xffff0 + 30044fe: 16fd addi a3,a3,-1 # fffeffff + 3004500: 8ff5 and a5,a5,a3 + 3004502: c31c sw a5,0(a4) + g_anaEnableFlag++; /* count enable analog IP number */ + 3004504: 040007b7 lui a5,0x4000 + 3004508: 4987c783 lbu a5,1176(a5) # 4000498 + 300450c: 0785 addi a5,a5,1 + 300450e: 0ff7f713 andi a4,a5,255 + 3004512: 040007b7 lui a5,0x4000 + 3004516: 48e78c23 sb a4,1176(a5) # 4000498 + 300451a: a089 j 300455c + } else if ((enable == IP_CLK_DISABLE) && (p->BIT.ip_srst_req == BASE_CFG_UNSET)) { + 300451c: fd842783 lw a5,-40(s0) + 3004520: ef95 bnez a5,300455c + 3004522: fe842783 lw a5,-24(s0) + 3004526: 439c lw a5,0(a5) + 3004528: 83c1 srli a5,a5,0x10 + 300452a: 8b85 andi a5,a5,1 + 300452c: 9f81 uxtb a5 + 300452e: e79d bnez a5,300455c + p->BIT.ip_srst_req = BASE_CFG_SET; + 3004530: fe842703 lw a4,-24(s0) + 3004534: 431c lw a5,0(a4) + 3004536: 66c1 lui a3,0x10 + 3004538: 8fd5 or a5,a5,a3 + 300453a: c31c sw a5,0(a4) + if (g_anaEnableFlag > 0) { + 300453c: 040007b7 lui a5,0x4000 + 3004540: 4987c783 lbu a5,1176(a5) # 4000498 + 3004544: cf81 beqz a5,300455c + g_anaEnableFlag--; /* Decreasing the count to enable the analog IP number. */ + 3004546: 040007b7 lui a5,0x4000 + 300454a: 4987c783 lbu a5,1176(a5) # 4000498 + 300454e: 17fd addi a5,a5,-1 + 3004550: 0ff7f713 andi a4,a5,255 + 3004554: 040007b7 lui a5,0x4000 + 3004558: 48e78c23 sb a4,1176(a5) # 4000498 + } + } + + if ((g_anaEnableFlag == 0) && (enable == IP_CLK_DISABLE)) { /* all analog clock disable */ + 300455c: 040007b7 lui a5,0x4000 + 3004560: 4987c783 lbu a5,1176(a5) # 4000498 + 3004564: eb85 bnez a5,3004594 + 3004566: fd842783 lw a5,-40(s0) + 300456a: e78d bnez a5,3004594 + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_UNSET; + 300456c: 10000737 lui a4,0x10000 + 3004570: 6785 lui a5,0x1 + 3004572: 973e add a4,a4,a5 + 3004574: a5072783 lw a5,-1456(a4) # ffffa50 + 3004578: 9bf9 andi a5,a5,-2 + 300457a: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_SET; + 300457e: 10000737 lui a4,0x10000 + 3004582: 6785 lui a5,0x1 + 3004584: 973e add a4,a4,a5 + 3004586: a5072783 lw a5,-1456(a4) # ffffa50 + 300458a: 66c1 lui a3,0x10 + 300458c: 8fd5 or a5,a5,a3 + 300458e: a4f72823 sw a5,-1456(a4) + 3004592: a081 j 30045d2 + } else if ((g_anaEnableFlag > 0) && (enable == IP_CLK_ENABLE)) { /* all analog clock enable */ + 3004594: 040007b7 lui a5,0x4000 + 3004598: 4987c783 lbu a5,1176(a5) # 4000498 + 300459c: cb9d beqz a5,30045d2 + 300459e: fd842703 lw a4,-40(s0) + 30045a2: 4785 li a5,1 + 30045a4: 02f71763 bne a4,a5,30045d2 + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_UNSET; + 30045a8: 10000737 lui a4,0x10000 + 30045ac: 6785 lui a5,0x1 + 30045ae: 973e add a4,a4,a5 + 30045b0: a5072783 lw a5,-1456(a4) # ffffa50 + 30045b4: 76c1 lui a3,0xffff0 + 30045b6: 16fd addi a3,a3,-1 # fffeffff + 30045b8: 8ff5 and a5,a5,a3 + 30045ba: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_SET; + 30045be: 10000737 lui a4,0x10000 + 30045c2: 6785 lui a5,0x1 + 30045c4: 973e add a4,a4,a5 + 30045c6: a5072783 lw a5,-1456(a4) # ffffa50 + 30045ca: 0017e793 ori a5,a5,1 + 30045ce: a4f72823 sw a5,-1456(a4) + } +} + 30045d2: 50b2 lw ra,44(sp) + 30045d4: 5422 lw s0,40(sp) + 30045d6: 6145 addi sp,sp,48 + 30045d8: 8082 ret + +030045da : + * @brief Get Clock of ANA + * @param matchInfo ANA match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_AnaEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30045da: 7179 addi sp,sp,-48 + 30045dc: d606 sw ra,44(sp) + 30045de: d422 sw s0,40(sp) + 30045e0: 1800 addi s0,sp,48 + 30045e2: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30045e6: fdc42783 lw a5,-36(s0) + 30045ea: eb91 bnez a5,30045fe + 30045ec: 46200593 li a1,1122 + 30045f0: 030077b7 lui a5,0x3007 + 30045f4: 8a478513 addi a0,a5,-1884 # 30068a4 + 30045f8: beffd0ef jal ra,30021e6 + 30045fc: a001 j 30045fc + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30045fe: 040007b7 lui a5,0x4000 + 3004602: 4947a783 lw a5,1172(a5) # 4000494 + 3004606: eb91 bnez a5,300461a + 3004608: 46300593 li a1,1123 + 300460c: 030077b7 lui a5,0x3007 + 3004610: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004614: bd3fd0ef jal ra,30021e6 + 3004618: a001 j 3004618 + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300461a: 040007b7 lui a5,0x4000 + 300461e: 4947a783 lw a5,1172(a5) # 4000494 + 3004622: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 3004626: fdc42783 lw a5,-36(s0) + 300462a: 279e lhu a5,8(a5) + 300462c: 873e mv a4,a5 + 300462e: fec42783 lw a5,-20(s0) + 3004632: 97ba add a5,a5,a4 + 3004634: fdc42703 lw a4,-36(s0) + 3004638: 2738 lbu a4,10(a4) + 300463a: 97ba add a5,a5,a4 + 300463c: fef42423 sw a5,-24(s0) + /* The clock is enabled based on the IP reset status. */ + return (p->BIT.ip_srst_req) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3004640: fe842783 lw a5,-24(s0) + 3004644: 439c lw a5,0(a5) + 3004646: 83c1 srli a5,a5,0x10 + 3004648: 8b85 andi a5,a5,1 + 300464a: 9f81 uxtb a5 + 300464c: 0017c793 xori a5,a5,1 + 3004650: 9f81 uxtb a5 +} + 3004652: 853e mv a0,a5 + 3004654: 50b2 lw ra,44(sp) + 3004656: 5422 lw s0,40(sp) + 3004658: 6145 addi sp,sp,48 + 300465a: 8082 ret + +0300465c : + * @brief Write a character to the UART port. + * @param ch The int promotion of the character to be written. + * @retval None. + */ +static void DBG_PrintCh(unsigned int ch) +{ + 300465c: 1101 addi sp,sp,-32 + 300465e: ce22 sw s0,28(sp) + 3004660: 1000 addi s0,sp,32 + 3004662: fea42623 sw a0,-20(s0) + while (DBG_PRINTF_UART_PORT->UART_FR.BIT.txff == 1) { + 3004666: 0001 nop + 3004668: 140007b7 lui a5,0x14000 + 300466c: 4f9c lw a5,24(a5) + 300466e: 8395 srli a5,a5,0x5 + 3004670: 8b85 andi a5,a5,1 + 3004672: 0ff7f713 andi a4,a5,255 + 3004676: 4785 li a5,1 + 3004678: fef708e3 beq a4,a5,3004668 + ; + } + DBG_PRINTF_UART_PORT->UART_DR.BIT.data = (unsigned char)ch; + 300467c: 14000737 lui a4,0x14000 + 3004680: fec42783 lw a5,-20(s0) + 3004684: 0ff7f693 andi a3,a5,255 + 3004688: 431c lw a5,0(a4) + 300468a: 0ff6f693 andi a3,a3,255 + 300468e: f007f793 andi a5,a5,-256 + 3004692: 8fd5 or a5,a5,a3 + 3004694: c31c sw a5,0(a4) +} + 3004696: 0001 nop + 3004698: 4472 lw s0,28(sp) + 300469a: 6105 addi sp,sp,32 + 300469c: 8082 ret + +0300469e : + * @param str The string to be printed. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, a BASE_STATUS_ERROR is returned. + */ +static int DBG_PrintStr(const char *str) +{ + 300469e: 7179 addi sp,sp,-48 + 30046a0: d606 sw ra,44(sp) + 30046a2: d422 sw s0,40(sp) + 30046a4: 1800 addi s0,sp,48 + 30046a6: fca42e23 sw a0,-36(s0) + DEBUG_ASSERT_PARAM(str != NULL); + int cnt = 0; + 30046aa: fe042623 sw zero,-20(s0) + while (*str != '\0') { + 30046ae: a00d j 30046d0 + DBG_PrintCh(*str); + 30046b0: fdc42783 lw a5,-36(s0) + 30046b4: 00078783 lb a5,0(a5) # 14000000 + 30046b8: 853e mv a0,a5 + 30046ba: 374d jal ra,300465c + str++; + 30046bc: fdc42783 lw a5,-36(s0) + 30046c0: 0785 addi a5,a5,1 + 30046c2: fcf42e23 sw a5,-36(s0) + cnt++; + 30046c6: fec42783 lw a5,-20(s0) + 30046ca: 0785 addi a5,a5,1 + 30046cc: fef42623 sw a5,-20(s0) + while (*str != '\0') { + 30046d0: fdc42783 lw a5,-36(s0) + 30046d4: 00078783 lb a5,0(a5) + 30046d8: ffe1 bnez a5,30046b0 + } + return cnt; + 30046da: fec42783 lw a5,-20(s0) +} + 30046de: 853e mv a0,a5 + 30046e0: 50b2 lw ra,44(sp) + 30046e2: 5422 lw s0,40(sp) + 30046e4: 6145 addi sp,sp,48 + 30046e6: 8082 ret + +030046e8 : + * @param base Base value. + * @param exponent Exponent value. + * @retval unsigned long The result of raising base to the power exponent. + */ +static unsigned long DBG_Pow(unsigned int base, unsigned int exponent) +{ + 30046e8: 7179 addi sp,sp,-48 + 30046ea: d622 sw s0,44(sp) + 30046ec: 1800 addi s0,sp,48 + 30046ee: fca42e23 sw a0,-36(s0) + 30046f2: fcb42c23 sw a1,-40(s0) + unsigned long ret = 1; + 30046f6: 4785 li a5,1 + 30046f8: fef42623 sw a5,-20(s0) + while (exponent--) { + 30046fc: a809 j 300470e + ret *= base; + 30046fe: fec42703 lw a4,-20(s0) + 3004702: fdc42783 lw a5,-36(s0) + 3004706: 02f707b3 mul a5,a4,a5 + 300470a: fef42623 sw a5,-20(s0) + while (exponent--) { + 300470e: fd842783 lw a5,-40(s0) + 3004712: fff78713 addi a4,a5,-1 + 3004716: fce42c23 sw a4,-40(s0) + 300471a: f3f5 bnez a5,30046fe + } + return ret; /* ret = base ^ exponent */ + 300471c: fec42783 lw a5,-20(s0) +} + 3004720: 853e mv a0,a5 + 3004722: 5432 lw s0,44(sp) + 3004724: 6145 addi sp,sp,48 + 3004726: 8082 ret + +03004728 : + * @param num The number to be counted. + * @param base The number base of num. + * @retval unsigned int The number of digits. + */ +static unsigned int DBG_CountDigits(int num, NumBase base) +{ + 3004728: 7179 addi sp,sp,-48 + 300472a: d622 sw s0,44(sp) + 300472c: 1800 addi s0,sp,48 + 300472e: fca42e23 sw a0,-36(s0) + 3004732: fcb42c23 sw a1,-40(s0) + unsigned int cnt = 0; + 3004736: fe042623 sw zero,-20(s0) + if (base == 0) { + 300473a: fd842783 lw a5,-40(s0) + 300473e: e78d bnez a5,3004768 + return 0; + 3004740: 4781 li a5,0 + 3004742: a099 j 3004788 + } + while (num != 0) { + cnt++; + 3004744: fec42783 lw a5,-20(s0) + 3004748: 0785 addi a5,a5,1 + 300474a: fef42623 sw a5,-20(s0) + if (cnt > MAX_DIV_TIMES) { + 300474e: fec42703 lw a4,-20(s0) + 3004752: 47fd li a5,31 + 3004754: 00e7ee63 bltu a5,a4,3004770 + break; + } + num /= base; + 3004758: fdc42703 lw a4,-36(s0) + 300475c: fd842783 lw a5,-40(s0) + 3004760: 02f757b3 divu a5,a4,a5 + 3004764: fcf42e23 sw a5,-36(s0) + while (num != 0) { + 3004768: fdc42783 lw a5,-36(s0) + 300476c: ffe1 bnez a5,3004744 + 300476e: a011 j 3004772 + break; + 3004770: 0001 nop + } + cnt = (cnt == 0) ? 1 : cnt; + 3004772: fec42783 lw a5,-20(s0) + 3004776: c781 beqz a5,300477e + 3004778: fec42783 lw a5,-20(s0) + 300477c: a011 j 3004780 + 300477e: 4785 li a5,1 + 3004780: fef42623 sw a5,-20(s0) + return cnt; + 3004784: fec42783 lw a5,-20(s0) +} + 3004788: 853e mv a0,a5 + 300478a: 5432 lw s0,44(sp) + 300478c: 6145 addi sp,sp,48 + 300478e: 8082 ret + +03004790 : + * @param num The unsigned number to be printed. + * @param base The number base of num. + * @param digits The digits of num. + */ +static void DBG_PutUnsignedNum(unsigned int num, NumBase base, unsigned int digits) +{ + 3004790: 7179 addi sp,sp,-48 + 3004792: d606 sw ra,44(sp) + 3004794: d422 sw s0,40(sp) + 3004796: 1800 addi s0,sp,48 + 3004798: fca42e23 sw a0,-36(s0) + 300479c: fcb42c23 sw a1,-40(s0) + 30047a0: fcc42a23 sw a2,-44(s0) + unsigned char ch; + while (digits != 0) { + 30047a4: a069 j 300482e + ch = num / DBG_Pow(base, digits - 1); + 30047a6: fd442783 lw a5,-44(s0) + 30047aa: 17fd addi a5,a5,-1 + 30047ac: 85be mv a1,a5 + 30047ae: fd842503 lw a0,-40(s0) + 30047b2: 3f1d jal ra,30046e8 + 30047b4: 872a mv a4,a0 + 30047b6: fdc42783 lw a5,-36(s0) + 30047ba: 02e7d7b3 divu a5,a5,a4 + 30047be: fef407a3 sb a5,-17(s0) + num %= DBG_Pow(base, digits - 1); + 30047c2: fd442783 lw a5,-44(s0) + 30047c6: 17fd addi a5,a5,-1 + 30047c8: 85be mv a1,a5 + 30047ca: fd842503 lw a0,-40(s0) + 30047ce: 3f29 jal ra,30046e8 + 30047d0: 872a mv a4,a0 + 30047d2: fdc42783 lw a5,-36(s0) + 30047d6: 02e7f7b3 remu a5,a5,a4 + 30047da: fcf42e23 sw a5,-36(s0) + if (base == DECIMAL) { + 30047de: fd842703 lw a4,-40(s0) + 30047e2: 47a9 li a5,10 + 30047e4: 00f71963 bne a4,a5,30047f6 + DBG_PrintCh(ch + '0'); + 30047e8: fef44783 lbu a5,-17(s0) + 30047ec: 03078793 addi a5,a5,48 + 30047f0: 853e mv a0,a5 + 30047f2: 35ad jal ra,300465c + 30047f4: a805 j 3004824 + } else if (base == HEXADECIMAL) { + 30047f6: fd842703 lw a4,-40(s0) + 30047fa: 47c1 li a5,16 + 30047fc: 02f71d63 bne a4,a5,3004836 + if (ch < DECIMAL_BASE) { + 3004800: fef44703 lbu a4,-17(s0) + 3004804: 47a5 li a5,9 + 3004806: 00e7e963 bltu a5,a4,3004818 + DBG_PrintCh(ch + '0'); + 300480a: fef44783 lbu a5,-17(s0) + 300480e: 03078793 addi a5,a5,48 + 3004812: 853e mv a0,a5 + 3004814: 35a1 jal ra,300465c + 3004816: a039 j 3004824 + } else { + DBG_PrintCh(ch - DECIMAL_BASE + 'A'); + 3004818: fef44783 lbu a5,-17(s0) + 300481c: 03778793 addi a5,a5,55 + 3004820: 853e mv a0,a5 + 3004822: 3d2d jal ra,300465c + } + } else { + break; + } + digits--; + 3004824: fd442783 lw a5,-44(s0) + 3004828: 17fd addi a5,a5,-1 + 300482a: fcf42a23 sw a5,-44(s0) + while (digits != 0) { + 300482e: fd442783 lw a5,-44(s0) + 3004832: fbb5 bnez a5,30047a6 + } +} + 3004834: a011 j 3004838 + break; + 3004836: 0001 nop +} + 3004838: 0001 nop + 300483a: 50b2 lw ra,44(sp) + 300483c: 5422 lw s0,40(sp) + 300483e: 6145 addi sp,sp,48 + 3004840: 8082 ret + +03004842 : + * @brief Print decimal number through UART port. + * @param intNum The decimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintInt(int intNum) +{ + 3004842: 7179 addi sp,sp,-48 + 3004844: d606 sw ra,44(sp) + 3004846: d422 sw s0,40(sp) + 3004848: 1800 addi s0,sp,48 + 300484a: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (intNum == 0) { + 300484e: fdc42783 lw a5,-36(s0) + 3004852: e791 bnez a5,300485e + DBG_PrintCh('0'); + 3004854: 03000513 li a0,48 + 3004858: 3511 jal ra,300465c + return 1; + 300485a: 4785 li a5,1 + 300485c: a82d j 3004896 + } + if (intNum < 0) { + 300485e: fdc42783 lw a5,-36(s0) + 3004862: 0007db63 bgez a5,3004878 + DBG_PrintCh('-'); + 3004866: 02d00513 li a0,45 + 300486a: 3bcd jal ra,300465c + intNum = -intNum; + 300486c: fdc42783 lw a5,-36(s0) + 3004870: 40f007b3 neg a5,a5 + 3004874: fcf42e23 sw a5,-36(s0) + } + cnt = DBG_CountDigits(intNum, DECIMAL); + 3004878: 45a9 li a1,10 + 300487a: fdc42503 lw a0,-36(s0) + 300487e: 356d jal ra,3004728 + 3004880: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(intNum, DECIMAL, cnt); + 3004884: fdc42783 lw a5,-36(s0) + 3004888: fec42603 lw a2,-20(s0) + 300488c: 45a9 li a1,10 + 300488e: 853e mv a0,a5 + 3004890: 3701 jal ra,3004790 + return cnt; + 3004892: fec42783 lw a5,-20(s0) +} + 3004896: 853e mv a0,a5 + 3004898: 50b2 lw ra,44(sp) + 300489a: 5422 lw s0,40(sp) + 300489c: 6145 addi sp,sp,48 + 300489e: 8082 ret + +030048a0 : + * @brief Print hexadecimal number through UART port. + * @param hexNum The hexadecimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintHex(unsigned int hexNum) +{ + 30048a0: 7179 addi sp,sp,-48 + 30048a2: d606 sw ra,44(sp) + 30048a4: d422 sw s0,40(sp) + 30048a6: 1800 addi s0,sp,48 + 30048a8: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (hexNum == 0) { + 30048ac: fdc42783 lw a5,-36(s0) + 30048b0: e791 bnez a5,30048bc + DBG_PrintCh('0'); + 30048b2: 03000513 li a0,48 + 30048b6: 335d jal ra,300465c + return 1; + 30048b8: 4785 li a5,1 + 30048ba: a005 j 30048da + } + cnt = DBG_CountDigits(hexNum, HEXADECIMAL); + 30048bc: fdc42783 lw a5,-36(s0) + 30048c0: 45c1 li a1,16 + 30048c2: 853e mv a0,a5 + 30048c4: 3595 jal ra,3004728 + 30048c6: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(hexNum, HEXADECIMAL, cnt); + 30048ca: fec42603 lw a2,-20(s0) + 30048ce: 45c1 li a1,16 + 30048d0: fdc42503 lw a0,-36(s0) + 30048d4: 3d75 jal ra,3004790 + return cnt; + 30048d6: fec42783 lw a5,-20(s0) +} + 30048da: 853e mv a0,a5 + 30048dc: 50b2 lw ra,44(sp) + 30048de: 5422 lw s0,40(sp) + 30048e0: 6145 addi sp,sp,48 + 30048e2: 8082 ret + +030048e4 : + * @brief Print floating-point number through UART port. + * @param fltNum The floating-point number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintFlt(float fltNum, unsigned int precision) +{ + 30048e4: 7139 addi sp,sp,-64 + 30048e6: de06 sw ra,60(sp) + 30048e8: dc22 sw s0,56(sp) + 30048ea: 0080 addi s0,sp,64 + 30048ec: fca42627 fsw fa0,-52(s0) + 30048f0: fca42423 sw a0,-56(s0) + unsigned int cnt = 0; + 30048f4: fe042623 sw zero,-20(s0) + unsigned int floatScale; + + if (fltNum < 0) { + 30048f8: fcc42787 flw fa5,-52(s0) + 30048fc: f0000753 fmv.w.x fa4,zero + 3004900: a0e797d3 flt.s a5,fa5,fa4 + 3004904: cf99 beqz a5,3004922 + DBG_PrintCh('-'); + 3004906: 02d00513 li a0,45 + 300490a: 3b89 jal ra,300465c + cnt += 1; + 300490c: fec42783 lw a5,-20(s0) + 3004910: 0785 addi a5,a5,1 + 3004912: fef42623 sw a5,-20(s0) + fltNum = -fltNum; + 3004916: fcc42787 flw fa5,-52(s0) + 300491a: 20f797d3 fneg.s fa5,fa5 + 300491e: fcf42627 fsw fa5,-52(s0) + } + int integerVal = (int)fltNum; + 3004922: fcc42787 flw fa5,-52(s0) + 3004926: c00797d3 fcvt.w.s a5,fa5,rtz + 300492a: fef42023 sw a5,-32(s0) + floatScale = DBG_Pow(10, (precision + 1)); /* 10: decimal */ + 300492e: fc842783 lw a5,-56(s0) + 3004932: 0785 addi a5,a5,1 + 3004934: 85be mv a1,a5 + 3004936: 4529 li a0,10 + 3004938: 3b45 jal ra,30046e8 + 300493a: fca42e23 sw a0,-36(s0) + int floatVal = (long)(floatScale * (fltNum - integerVal)); + 300493e: fdc42783 lw a5,-36(s0) + 3004942: d017f753 fcvt.s.wu fa4,a5 + 3004946: fe042783 lw a5,-32(s0) + 300494a: d007f7d3 fcvt.s.w fa5,a5 + 300494e: fcc42687 flw fa3,-52(s0) + 3004952: 08f6f7d3 fsub.s fa5,fa3,fa5 + 3004956: 10f777d3 fmul.s fa5,fa4,fa5 + 300495a: c00797d3 fcvt.w.s a5,fa5,rtz + 300495e: fef42423 sw a5,-24(s0) + /* Half-adjust: round up or round down */ + if (floatVal % DECIMAL_BASE >= HALF_ADJUST_BOUNDARY) { + 3004962: fe842703 lw a4,-24(s0) + 3004966: 47a9 li a5,10 + 3004968: 02f77733 remu a4,a4,a5 + 300496c: 4791 li a5,4 + 300496e: 00e7fb63 bgeu a5,a4,3004984 + floatVal = floatVal / DECIMAL_BASE + 1; + 3004972: fe842703 lw a4,-24(s0) + 3004976: 47a9 li a5,10 + 3004978: 02f757b3 divu a5,a4,a5 + 300497c: 0785 addi a5,a5,1 + 300497e: fef42423 sw a5,-24(s0) + 3004982: a801 j 3004992 + } else { + floatVal = floatVal / DECIMAL_BASE; + 3004984: fe842703 lw a4,-24(s0) + 3004988: 47a9 li a5,10 + 300498a: 02f757b3 divu a5,a4,a5 + 300498e: fef42423 sw a5,-24(s0) + } + cnt += DBG_PrintInt(integerVal); + 3004992: fe042503 lw a0,-32(s0) + 3004996: 3575 jal ra,3004842 + 3004998: 872a mv a4,a0 + 300499a: fec42783 lw a5,-20(s0) + 300499e: 97ba add a5,a5,a4 + 30049a0: fef42623 sw a5,-20(s0) + DBG_PrintCh('.'); + 30049a4: 02e00513 li a0,46 + 30049a8: 3955 jal ra,300465c + cnt += 1; + 30049aa: fec42783 lw a5,-20(s0) + 30049ae: 0785 addi a5,a5,1 + 30049b0: fef42623 sw a5,-20(s0) + /* Pad 0 in float part */ + unsigned int fltCnt = DBG_CountDigits(floatVal, DECIMAL); + 30049b4: 45a9 li a1,10 + 30049b6: fe842503 lw a0,-24(s0) + 30049ba: 33bd jal ra,3004728 + 30049bc: fca42c23 sw a0,-40(s0) + if (precision > fltCnt) { + 30049c0: fc842703 lw a4,-56(s0) + 30049c4: fd842783 lw a5,-40(s0) + 30049c8: 02e7f763 bgeu a5,a4,30049f6 + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 30049cc: fe042223 sw zero,-28(s0) + 30049d0: a809 j 30049e2 + DBG_PrintCh('0'); /* add '0' */ + 30049d2: 03000513 li a0,48 + 30049d6: 3159 jal ra,300465c + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 30049d8: fe442783 lw a5,-28(s0) + 30049dc: 0785 addi a5,a5,1 + 30049de: fef42223 sw a5,-28(s0) + 30049e2: fc842703 lw a4,-56(s0) + 30049e6: fd842783 lw a5,-40(s0) + 30049ea: 40f707b3 sub a5,a4,a5 + 30049ee: fe442703 lw a4,-28(s0) + 30049f2: fef760e3 bltu a4,a5,30049d2 + } + } + DBG_PutUnsignedNum(floatVal, DECIMAL, fltCnt); /* print unsigned number */ + 30049f6: fe842783 lw a5,-24(s0) + 30049fa: fd842603 lw a2,-40(s0) + 30049fe: 45a9 li a1,10 + 3004a00: 853e mv a0,a5 + 3004a02: 3379 jal ra,3004790 + cnt += precision; + 3004a04: fec42703 lw a4,-20(s0) + 3004a08: fc842783 lw a5,-56(s0) + 3004a0c: 97ba add a5,a5,a4 + 3004a0e: fef42623 sw a5,-20(s0) + return cnt; + 3004a12: fec42783 lw a5,-20(s0) +} + 3004a16: 853e mv a0,a5 + 3004a18: 50f2 lw ra,60(sp) + 3004a1a: 5462 lw s0,56(sp) + 3004a1c: 6121 addi sp,sp,64 + 3004a1e: 8082 ret + +03004a20 : + * @param ch The format specifier. + * @param paramList The pointer of the variable parameter list. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int ParseSpecifier(const char ch, va_list *paramList) +{ + 3004a20: 7139 addi sp,sp,-64 + 3004a22: de06 sw ra,60(sp) + 3004a24: dc22 sw s0,56(sp) + 3004a26: 0080 addi s0,sp,64 + 3004a28: 87aa mv a5,a0 + 3004a2a: fcb42423 sw a1,-56(s0) + 3004a2e: fcf407a3 sb a5,-49(s0) + unsigned int cnt = 0; + 3004a32: fe042623 sw zero,-20(s0) + unsigned int tmpCnt; + char chVal = 0; + 3004a36: fe0405a3 sb zero,-21(s0) + const char *strVal = NULL; + 3004a3a: fe042223 sw zero,-28(s0) + int intVal = 0; + 3004a3e: fe042023 sw zero,-32(s0) + unsigned int unsignedVal = 0; + 3004a42: fc042e23 sw zero,-36(s0) + unsigned int hexVal = 0; + 3004a46: fc042c23 sw zero,-40(s0) + float fltVal = 0; + 3004a4a: fc042a23 sw zero,-44(s0) + switch (ch) { + 3004a4e: fcf40783 lb a5,-49(s0) + 3004a52: fa878793 addi a5,a5,-88 + 3004a56: 02000713 li a4,32 + 3004a5a: 14f76063 bltu a4,a5,3004b9a + 3004a5e: 00279713 slli a4,a5,0x2 + 3004a62: 030077b7 lui a5,0x3007 + 3004a66: 8f878793 addi a5,a5,-1800 # 30068f8 + 3004a6a: 97ba add a5,a5,a4 + 3004a6c: 439c lw a5,0(a5) + 3004a6e: 8782 jr a5 + case 'c': /* Character format data. */ + chVal = VA_ARG(*paramList, int); /* Use type int because of byte alignment */ + 3004a70: fc842783 lw a5,-56(s0) + 3004a74: 439c lw a5,0(a5) + 3004a76: 00478693 addi a3,a5,4 + 3004a7a: fc842703 lw a4,-56(s0) + 3004a7e: c314 sw a3,0(a4) + 3004a80: 439c lw a5,0(a5) + 3004a82: fef405a3 sb a5,-21(s0) + DBG_PrintCh(chVal); + 3004a86: feb40783 lb a5,-21(s0) + 3004a8a: 853e mv a0,a5 + 3004a8c: 3ec1 jal ra,300465c + cnt += 1; + 3004a8e: fec42783 lw a5,-20(s0) + 3004a92: 0785 addi a5,a5,1 + 3004a94: fef42623 sw a5,-20(s0) + break; + 3004a98: aa19 j 3004bae + case 's': /* String format data. */ + strVal = VA_ARG(*paramList, const char *); + 3004a9a: fc842783 lw a5,-56(s0) + 3004a9e: 439c lw a5,0(a5) + 3004aa0: 00478693 addi a3,a5,4 + 3004aa4: fc842703 lw a4,-56(s0) + 3004aa8: c314 sw a3,0(a4) + 3004aaa: 439c lw a5,0(a5) + 3004aac: fef42223 sw a5,-28(s0) + cnt += DBG_PrintStr(strVal); + 3004ab0: fe442503 lw a0,-28(s0) + 3004ab4: 36ed jal ra,300469e + 3004ab6: 87aa mv a5,a0 + 3004ab8: 873e mv a4,a5 + 3004aba: fec42783 lw a5,-20(s0) + 3004abe: 97ba add a5,a5,a4 + 3004ac0: fef42623 sw a5,-20(s0) + break; + 3004ac4: a0ed j 3004bae + case 'd': /* Integer decimal data. */ + intVal = VA_ARG(*paramList, int); + 3004ac6: fc842783 lw a5,-56(s0) + 3004aca: 439c lw a5,0(a5) + 3004acc: 00478693 addi a3,a5,4 + 3004ad0: fc842703 lw a4,-56(s0) + 3004ad4: c314 sw a3,0(a4) + 3004ad6: 439c lw a5,0(a5) + 3004ad8: fef42023 sw a5,-32(s0) + cnt += DBG_PrintInt(intVal); + 3004adc: fe042503 lw a0,-32(s0) + 3004ae0: 338d jal ra,3004842 + 3004ae2: 872a mv a4,a0 + 3004ae4: fec42783 lw a5,-20(s0) + 3004ae8: 97ba add a5,a5,a4 + 3004aea: fef42623 sw a5,-20(s0) + break; + 3004aee: a0c1 j 3004bae + case 'u': /* Unsigned decimal data. */ + unsignedVal = VA_ARG(*paramList, unsigned int); + 3004af0: fc842783 lw a5,-56(s0) + 3004af4: 439c lw a5,0(a5) + 3004af6: 00478693 addi a3,a5,4 + 3004afa: fc842703 lw a4,-56(s0) + 3004afe: c314 sw a3,0(a4) + 3004b00: 439c lw a5,0(a5) + 3004b02: fcf42e23 sw a5,-36(s0) + tmpCnt = DBG_CountDigits(unsignedVal, DECIMAL); + 3004b06: fdc42783 lw a5,-36(s0) + 3004b0a: 45a9 li a1,10 + 3004b0c: 853e mv a0,a5 + 3004b0e: 3929 jal ra,3004728 + 3004b10: fca42823 sw a0,-48(s0) + DBG_PutUnsignedNum(unsignedVal, DECIMAL, tmpCnt); + 3004b14: fd042603 lw a2,-48(s0) + 3004b18: 45a9 li a1,10 + 3004b1a: fdc42503 lw a0,-36(s0) + 3004b1e: 398d jal ra,3004790 + cnt += tmpCnt; + 3004b20: fec42703 lw a4,-20(s0) + 3004b24: fd042783 lw a5,-48(s0) + 3004b28: 97ba add a5,a5,a4 + 3004b2a: fef42623 sw a5,-20(s0) + break; + 3004b2e: a041 j 3004bae + case 'x': /* Hexadecimal data. */ + case 'X': + case 'p': /* Address data. */ + hexVal = VA_ARG(*paramList, unsigned int); + 3004b30: fc842783 lw a5,-56(s0) + 3004b34: 439c lw a5,0(a5) + 3004b36: 00478693 addi a3,a5,4 + 3004b3a: fc842703 lw a4,-56(s0) + 3004b3e: c314 sw a3,0(a4) + 3004b40: 439c lw a5,0(a5) + 3004b42: fcf42c23 sw a5,-40(s0) + cnt += DBG_PrintHex(hexVal); + 3004b46: fd842503 lw a0,-40(s0) + 3004b4a: 3b99 jal ra,30048a0 + 3004b4c: 872a mv a4,a0 + 3004b4e: fec42783 lw a5,-20(s0) + 3004b52: 97ba add a5,a5,a4 + 3004b54: fef42623 sw a5,-20(s0) + break; + 3004b58: a899 j 3004bae + case 'f': /* Floating-point data. */ + fltVal = VA_ARG(*paramList, double); + 3004b5a: fc842783 lw a5,-56(s0) + 3004b5e: 439c lw a5,0(a5) + 3004b60: 079d addi a5,a5,7 + 3004b62: 9be1 andi a5,a5,-8 + 3004b64: 00878693 addi a3,a5,8 + 3004b68: fc842703 lw a4,-56(s0) + 3004b6c: c314 sw a3,0(a4) + 3004b6e: 0047a803 lw a6,4(a5) + 3004b72: 439c lw a5,0(a5) + 3004b74: 853e mv a0,a5 + 3004b76: 85c2 mv a1,a6 + 3004b78: 7b0010ef jal ra,3006328 <__truncdfsf2> + 3004b7c: 20a507d3 fmv.s fa5,fa0 + 3004b80: fcf42a27 fsw fa5,-44(s0) + cnt += DBG_PrintFlt(fltVal, 5); /* default precision: 5 */ + 3004b84: 4515 li a0,5 + 3004b86: fd442507 flw fa0,-44(s0) + 3004b8a: 3ba9 jal ra,30048e4 + 3004b8c: 872a mv a4,a0 + 3004b8e: fec42783 lw a5,-20(s0) + 3004b92: 97ba add a5,a5,a4 + 3004b94: fef42623 sw a5,-20(s0) + break; + 3004b98: a819 j 3004bae + default: + DBG_PrintCh(ch); + 3004b9a: fcf40783 lb a5,-49(s0) + 3004b9e: 853e mv a0,a5 + 3004ba0: 3c75 jal ra,300465c + cnt += 1; + 3004ba2: fec42783 lw a5,-20(s0) + 3004ba6: 0785 addi a5,a5,1 + 3004ba8: fef42623 sw a5,-20(s0) + break; + 3004bac: 0001 nop + } + return cnt; + 3004bae: fec42783 lw a5,-20(s0) +} + 3004bb2: 853e mv a0,a5 + 3004bb4: 50f2 lw ra,60(sp) + 3004bb6: 5462 lw s0,56(sp) + 3004bb8: 6121 addi sp,sp,64 + 3004bba: 8082 ret + +03004bbc : + * @param intNum The decimal number to be printed. + * @param fieldWidth Field width. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintIntWithField(int intNum, int fieldWidth) +{ + 3004bbc: 7139 addi sp,sp,-64 + 3004bbe: de06 sw ra,60(sp) + 3004bc0: dc22 sw s0,56(sp) + 3004bc2: 0080 addi s0,sp,64 + 3004bc4: fca42623 sw a0,-52(s0) + 3004bc8: fcb42423 sw a1,-56(s0) + int zeroCnt = 0; + 3004bcc: fc042e23 sw zero,-36(s0) + int digitsCnt = 0; + 3004bd0: fe042623 sw zero,-20(s0) + unsigned int cnt = 0; + 3004bd4: fe042423 sw zero,-24(s0) + + if (intNum == 0) { + 3004bd8: fcc42783 lw a5,-52(s0) + 3004bdc: e791 bnez a5,3004be8 + DBG_PrintCh('0'); + 3004bde: 03000513 li a0,48 + 3004be2: 3cad jal ra,300465c + return 1; + 3004be4: 4785 li a5,1 + 3004be6: a0dd j 3004ccc + } + if (intNum < 0) { + 3004be8: fcc42783 lw a5,-52(s0) + 3004bec: 0607dd63 bgez a5,3004c66 + DBG_PrintCh('-'); /* add symbol */ + 3004bf0: 02d00513 li a0,45 + 3004bf4: 34a5 jal ra,300465c + cnt++; + 3004bf6: fe842783 lw a5,-24(s0) + 3004bfa: 0785 addi a5,a5,1 + 3004bfc: fef42423 sw a5,-24(s0) + intNum = -intNum; + 3004c00: fcc42783 lw a5,-52(s0) + 3004c04: 40f007b3 neg a5,a5 + 3004c08: fcf42623 sw a5,-52(s0) + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 3004c0c: 45a9 li a1,10 + 3004c0e: fcc42503 lw a0,-52(s0) + 3004c12: 3e19 jal ra,3004728 + 3004c14: 87aa mv a5,a0 + 3004c16: fef42623 sw a5,-20(s0) + zeroCnt = fieldWidth - digitsCnt; + 3004c1a: fc842703 lw a4,-56(s0) + 3004c1e: fec42783 lw a5,-20(s0) + 3004c22: 40f707b3 sub a5,a4,a5 + 3004c26: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004c2a: fe042223 sw zero,-28(s0) + 3004c2e: a831 j 3004c4a + DBG_PrintCh('0'); /* add '0' */ + 3004c30: 03000513 li a0,48 + 3004c34: 3425 jal ra,300465c + cnt++; + 3004c36: fe842783 lw a5,-24(s0) + 3004c3a: 0785 addi a5,a5,1 + 3004c3c: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004c40: fe442783 lw a5,-28(s0) + 3004c44: 0785 addi a5,a5,1 + 3004c46: fef42223 sw a5,-28(s0) + 3004c4a: fe442703 lw a4,-28(s0) + 3004c4e: fdc42783 lw a5,-36(s0) + 3004c52: fcf74fe3 blt a4,a5,3004c30 + } + cnt += digitsCnt; + 3004c56: fec42783 lw a5,-20(s0) + 3004c5a: fe842703 lw a4,-24(s0) + 3004c5e: 97ba add a5,a5,a4 + 3004c60: fef42423 sw a5,-24(s0) + 3004c64: a891 j 3004cb8 + } else { + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 3004c66: 45a9 li a1,10 + 3004c68: fcc42503 lw a0,-52(s0) + 3004c6c: 3c75 jal ra,3004728 + 3004c6e: 87aa mv a5,a0 + 3004c70: fef42623 sw a5,-20(s0) + cnt = digitsCnt; + 3004c74: fec42783 lw a5,-20(s0) + 3004c78: fef42423 sw a5,-24(s0) + zeroCnt = fieldWidth - digitsCnt; + 3004c7c: fc842703 lw a4,-56(s0) + 3004c80: fec42783 lw a5,-20(s0) + 3004c84: 40f707b3 sub a5,a4,a5 + 3004c88: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004c8c: fe042023 sw zero,-32(s0) + 3004c90: a831 j 3004cac + DBG_PrintCh('0'); /* add '0' */ + 3004c92: 03000513 li a0,48 + 3004c96: 32d9 jal ra,300465c + cnt++; + 3004c98: fe842783 lw a5,-24(s0) + 3004c9c: 0785 addi a5,a5,1 + 3004c9e: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004ca2: fe042783 lw a5,-32(s0) + 3004ca6: 0785 addi a5,a5,1 + 3004ca8: fef42023 sw a5,-32(s0) + 3004cac: fe042703 lw a4,-32(s0) + 3004cb0: fdc42783 lw a5,-36(s0) + 3004cb4: fcf74fe3 blt a4,a5,3004c92 + } + } + DBG_PutUnsignedNum(intNum, DECIMAL, digitsCnt); + 3004cb8: fcc42783 lw a5,-52(s0) + 3004cbc: fec42703 lw a4,-20(s0) + 3004cc0: 863a mv a2,a4 + 3004cc2: 45a9 li a1,10 + 3004cc4: 853e mv a0,a5 + 3004cc6: 34e9 jal ra,3004790 + return cnt; + 3004cc8: fe842783 lw a5,-24(s0) +} + 3004ccc: 853e mv a0,a5 + 3004cce: 50f2 lw ra,60(sp) + 3004cd0: 5462 lw s0,56(sp) + 3004cd2: 6121 addi sp,sp,64 + 3004cd4: 8082 ret + +03004cd6 : + +static int DBG_Atoi(const char **s) +{ + 3004cd6: 7179 addi sp,sp,-48 + 3004cd8: d622 sw s0,44(sp) + 3004cda: 1800 addi s0,sp,48 + 3004cdc: fca42e23 sw a0,-36(s0) + int i, c; + + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 3004ce0: fe042623 sw zero,-20(s0) + 3004ce4: a02d j 3004d0e + i = i * 10 + c - '0'; /* 10: decimal */ + 3004ce6: fec42703 lw a4,-20(s0) + 3004cea: 47a9 li a5,10 + 3004cec: 02f70733 mul a4,a4,a5 + 3004cf0: fe842783 lw a5,-24(s0) + 3004cf4: 97ba add a5,a5,a4 + 3004cf6: fd078793 addi a5,a5,-48 + 3004cfa: fef42623 sw a5,-20(s0) + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 3004cfe: fdc42783 lw a5,-36(s0) + 3004d02: 439c lw a5,0(a5) + 3004d04: 00178713 addi a4,a5,1 + 3004d08: fdc42783 lw a5,-36(s0) + 3004d0c: c398 sw a4,0(a5) + 3004d0e: fdc42783 lw a5,-36(s0) + 3004d12: 439c lw a5,0(a5) + 3004d14: 00078783 lb a5,0(a5) + 3004d18: fef42423 sw a5,-24(s0) + 3004d1c: fe842703 lw a4,-24(s0) + 3004d20: 02f00793 li a5,47 + 3004d24: 00e7d863 bge a5,a4,3004d34 + 3004d28: fe842703 lw a4,-24(s0) + 3004d2c: 03900793 li a5,57 + 3004d30: fae7dbe3 bge a5,a4,3004ce6 + } + return i; + 3004d34: fec42783 lw a5,-20(s0) +} + 3004d38: 853e mv a0,a5 + 3004d3a: 5432 lw s0,44(sp) + 3004d3c: 6145 addi sp,sp,48 + 3004d3e: 8082 ret + +03004d40 : + * @param ... Variable parameter list. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, return BASE_STATUS_ERROR. + */ +int DBG_UartPrintf(const char *format, ...) +{ + 3004d40: 711d addi sp,sp,-96 + 3004d42: de06 sw ra,60(sp) + 3004d44: dc22 sw s0,56(sp) + 3004d46: 0080 addi s0,sp,64 + 3004d48: fca42623 sw a0,-52(s0) + 3004d4c: c04c sw a1,4(s0) + 3004d4e: c410 sw a2,8(s0) + 3004d50: c454 sw a3,12(s0) + 3004d52: c818 sw a4,16(s0) + 3004d54: c85c sw a5,20(s0) + 3004d56: 01042c23 sw a6,24(s0) + 3004d5a: 01142e23 sw a7,28(s0) + DEBUG_ASSERT_PARAM(format != NULL); + int cnt = 0; + 3004d5e: fe042623 sw zero,-20(s0) + int fieldWidth = 0; + 3004d62: fe042423 sw zero,-24(s0) + int floatPrecision = 0; + 3004d66: fe042223 sw zero,-28(s0) + float fltVal = 0; + 3004d6a: fe042023 sw zero,-32(s0) + int intVal = 0; + 3004d6e: fc042e23 sw zero,-36(s0) + va_list paramList; + VA_START(paramList, format); + 3004d72: 02040793 addi a5,s0,32 + 3004d76: 1791 addi a5,a5,-28 + 3004d78: fcf42c23 sw a5,-40(s0) + + while (*format != '\0') { + 3004d7c: aa09 j 3004e8e + if (*format != '%') { + 3004d7e: fcc42783 lw a5,-52(s0) + 3004d82: 00078703 lb a4,0(a5) + 3004d86: 02500793 li a5,37 + 3004d8a: 00f70e63 beq a4,a5,3004da6 + DBG_PrintCh(*format); + 3004d8e: fcc42783 lw a5,-52(s0) + 3004d92: 00078783 lb a5,0(a5) + 3004d96: 853e mv a0,a5 + 3004d98: 30d1 jal ra,300465c + cnt += 1; + 3004d9a: fec42783 lw a5,-20(s0) + 3004d9e: 0785 addi a5,a5,1 + 3004da0: fef42623 sw a5,-20(s0) + 3004da4: a0c5 j 3004e84 + } else { + format++; + 3004da6: fcc42783 lw a5,-52(s0) + 3004daa: 0785 addi a5,a5,1 + 3004dac: fcf42623 sw a5,-52(s0) + if (*format == '0') { + 3004db0: fcc42783 lw a5,-52(s0) + 3004db4: 00078703 lb a4,0(a5) + 3004db8: 03000793 li a5,48 + 3004dbc: 04f71263 bne a4,a5,3004e00 + format++; + 3004dc0: fcc42783 lw a5,-52(s0) + 3004dc4: 0785 addi a5,a5,1 + 3004dc6: fcf42623 sw a5,-52(s0) + fieldWidth = DBG_Atoi(&format); + 3004dca: fcc40793 addi a5,s0,-52 + 3004dce: 853e mv a0,a5 + 3004dd0: 3719 jal ra,3004cd6 + 3004dd2: fea42423 sw a0,-24(s0) + intVal = VA_ARG(paramList, int); + 3004dd6: fd842783 lw a5,-40(s0) + 3004dda: 00478713 addi a4,a5,4 + 3004dde: fce42c23 sw a4,-40(s0) + 3004de2: 439c lw a5,0(a5) + 3004de4: fcf42e23 sw a5,-36(s0) + cnt += DBG_PrintIntWithField(intVal, fieldWidth); + 3004de8: fe842583 lw a1,-24(s0) + 3004dec: fdc42503 lw a0,-36(s0) + 3004df0: 33f1 jal ra,3004bbc + 3004df2: 872a mv a4,a0 + 3004df4: fec42783 lw a5,-20(s0) + 3004df8: 97ba add a5,a5,a4 + 3004dfa: fef42623 sw a5,-20(s0) + 3004dfe: a059 j 3004e84 + } else if (*format == '.') { + 3004e00: fcc42783 lw a5,-52(s0) + 3004e04: 00078703 lb a4,0(a5) + 3004e08: 02e00793 li a5,46 + 3004e0c: 04f71d63 bne a4,a5,3004e66 + format++; + 3004e10: fcc42783 lw a5,-52(s0) + 3004e14: 0785 addi a5,a5,1 + 3004e16: fcf42623 sw a5,-52(s0) + floatPrecision = DBG_Atoi(&format); + 3004e1a: fcc40793 addi a5,s0,-52 + 3004e1e: 853e mv a0,a5 + 3004e20: 3d5d jal ra,3004cd6 + 3004e22: fea42223 sw a0,-28(s0) + fltVal = VA_ARG(paramList, double); + 3004e26: fd842783 lw a5,-40(s0) + 3004e2a: 079d addi a5,a5,7 + 3004e2c: 9be1 andi a5,a5,-8 + 3004e2e: 00878713 addi a4,a5,8 + 3004e32: fce42c23 sw a4,-40(s0) + 3004e36: 0047a803 lw a6,4(a5) + 3004e3a: 439c lw a5,0(a5) + 3004e3c: 853e mv a0,a5 + 3004e3e: 85c2 mv a1,a6 + 3004e40: 4e8010ef jal ra,3006328 <__truncdfsf2> + 3004e44: 20a507d3 fmv.s fa5,fa0 + 3004e48: fef42027 fsw fa5,-32(s0) + cnt += DBG_PrintFlt(fltVal, floatPrecision); + 3004e4c: fe442783 lw a5,-28(s0) + 3004e50: 853e mv a0,a5 + 3004e52: fe042507 flw fa0,-32(s0) + 3004e56: 3479 jal ra,30048e4 + 3004e58: 872a mv a4,a0 + 3004e5a: fec42783 lw a5,-20(s0) + 3004e5e: 97ba add a5,a5,a4 + 3004e60: fef42623 sw a5,-20(s0) + 3004e64: a005 j 3004e84 + } else { + cnt += ParseSpecifier(*format, ¶mList); + 3004e66: fcc42783 lw a5,-52(s0) + 3004e6a: 00078783 lb a5,0(a5) + 3004e6e: fd840713 addi a4,s0,-40 + 3004e72: 85ba mv a1,a4 + 3004e74: 853e mv a0,a5 + 3004e76: 366d jal ra,3004a20 + 3004e78: 872a mv a4,a0 + 3004e7a: fec42783 lw a5,-20(s0) + 3004e7e: 97ba add a5,a5,a4 + 3004e80: fef42623 sw a5,-20(s0) + } + } + format++; + 3004e84: fcc42783 lw a5,-52(s0) + 3004e88: 0785 addi a5,a5,1 + 3004e8a: fcf42623 sw a5,-52(s0) + while (*format != '\0') { + 3004e8e: fcc42783 lw a5,-52(s0) + 3004e92: 00078783 lb a5,0(a5) + 3004e96: ee0794e3 bnez a5,3004d7e + } + VA_END(paramList); + return cnt; + 3004e9a: fec42783 lw a5,-20(s0) +} + 3004e9e: 853e mv a0,a5 + 3004ea0: 50f2 lw ra,60(sp) + 3004ea2: 5462 lw s0,56(sp) + 3004ea4: 6125 addi sp,sp,96 + 3004ea6: 8082 ret + +03004ea8 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param regValue value of @ref IOCMG_REG. + * @retval None. + */ +static inline void DCL_IOCMG_SetRegValue(IOCMG_REG *iocmgRegx, unsigned int regValue) +{ + 3004ea8: 1101 addi sp,sp,-32 + 3004eaa: ce06 sw ra,28(sp) + 3004eac: cc22 sw s0,24(sp) + 3004eae: 1000 addi s0,sp,32 + 3004eb0: fea42623 sw a0,-20(s0) + 3004eb4: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004eb8: fec42703 lw a4,-20(s0) + 3004ebc: 77c1 lui a5,0xffff0 + 3004ebe: 8f7d and a4,a4,a5 + 3004ec0: 147f07b7 lui a5,0x147f0 + 3004ec4: 00f70a63 beq a4,a5,3004ed8 + 3004ec8: 08b00593 li a1,139 + 3004ecc: 030077b7 lui a5,0x3007 + 3004ed0: 97c78513 addi a0,a5,-1668 # 300697c + 3004ed4: 2df1 jal ra,30055b0 + 3004ed6: a001 j 3004ed6 + iocmgRegx->reg = regValue; + 3004ed8: fec42783 lw a5,-20(s0) + 3004edc: fe842703 lw a4,-24(s0) + 3004ee0: c398 sw a4,0(a5) +} + 3004ee2: 0001 nop + 3004ee4: 40f2 lw ra,28(sp) + 3004ee6: 4462 lw s0,24(sp) + 3004ee8: 6105 addi sp,sp,32 + 3004eea: 8082 ret + +03004eec : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param driveRate value of @ref IOCMG_DriveRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetDriveRate(IOCMG_REG *iocmgRegx, IOCMG_DriveRate driveRate) +{ + 3004eec: 1101 addi sp,sp,-32 + 3004eee: ce06 sw ra,28(sp) + 3004ef0: cc22 sw s0,24(sp) + 3004ef2: 1000 addi s0,sp,32 + 3004ef4: fea42623 sw a0,-20(s0) + 3004ef8: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004efc: fec42703 lw a4,-20(s0) + 3004f00: 77c1 lui a5,0xffff0 + 3004f02: 8f7d and a4,a4,a5 + 3004f04: 147f07b7 lui a5,0x147f0 + 3004f08: 00f70a63 beq a4,a5,3004f1c + 3004f0c: 0ba00593 li a1,186 + 3004f10: 030077b7 lui a5,0x3007 + 3004f14: 97c78513 addi a0,a5,-1668 # 300697c + 3004f18: 2d61 jal ra,30055b0 + 3004f1a: a001 j 3004f1a + IOCMG_PARAM_CHECK_NO_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4); + 3004f1c: fe842703 lw a4,-24(s0) + 3004f20: 478d li a5,3 + 3004f22: 00e7fa63 bgeu a5,a4,3004f36 + 3004f26: 0bb00593 li a1,187 + 3004f2a: 030077b7 lui a5,0x3007 + 3004f2e: 97c78513 addi a0,a5,-1668 # 300697c + 3004f32: 2dbd jal ra,30055b0 + 3004f34: a839 j 3004f52 + iocmgRegx->BIT.ds = driveRate; + 3004f36: fe842783 lw a5,-24(s0) + 3004f3a: 8b8d andi a5,a5,3 + 3004f3c: 0ff7f693 andi a3,a5,255 + 3004f40: fec42703 lw a4,-20(s0) + 3004f44: 431c lw a5,0(a4) + 3004f46: 8a8d andi a3,a3,3 + 3004f48: 0692 slli a3,a3,0x4 + 3004f4a: fcf7f793 andi a5,a5,-49 + 3004f4e: 8fd5 or a5,a5,a3 + 3004f50: c31c sw a5,0(a4) +} + 3004f52: 40f2 lw ra,28(sp) + 3004f54: 4462 lw s0,24(sp) + 3004f56: 6105 addi sp,sp,32 + 3004f58: 8082 ret + +03004f5a : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param pullMode value of @ref IOCMG_PullMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetPullMode(IOCMG_REG *iocmgRegx, IOCMG_PullMode pullMode) +{ + 3004f5a: 1101 addi sp,sp,-32 + 3004f5c: ce06 sw ra,28(sp) + 3004f5e: cc22 sw s0,24(sp) + 3004f60: 1000 addi s0,sp,32 + 3004f62: fea42623 sw a0,-20(s0) + 3004f66: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004f6a: fec42703 lw a4,-20(s0) + 3004f6e: 77c1 lui a5,0xffff0 + 3004f70: 8f7d and a4,a4,a5 + 3004f72: 147f07b7 lui a5,0x147f0 + 3004f76: 00f70a63 beq a4,a5,3004f8a + 3004f7a: 0d200593 li a1,210 + 3004f7e: 030077b7 lui a5,0x3007 + 3004f82: 97c78513 addi a0,a5,-1668 # 300697c + 3004f86: 252d jal ra,30055b0 + 3004f88: a001 j 3004f88 + IOCMG_PARAM_CHECK_NO_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE); + 3004f8a: fe842703 lw a4,-24(s0) + 3004f8e: 478d li a5,3 + 3004f90: 00e7fa63 bgeu a5,a4,3004fa4 + 3004f94: 0d300593 li a1,211 + 3004f98: 030077b7 lui a5,0x3007 + 3004f9c: 97c78513 addi a0,a5,-1668 # 300697c + 3004fa0: 2d01 jal ra,30055b0 + 3004fa2: a835 j 3004fde + iocmgRegx->BIT.pu = (pullMode & 0x02) >> 1; /* 10b: pull up mode */ + 3004fa4: fe842783 lw a5,-24(s0) + 3004fa8: 8385 srli a5,a5,0x1 + 3004faa: 8b85 andi a5,a5,1 + 3004fac: 0ff7f693 andi a3,a5,255 + 3004fb0: fec42703 lw a4,-20(s0) + 3004fb4: 431c lw a5,0(a4) + 3004fb6: 8a85 andi a3,a3,1 + 3004fb8: 06a2 slli a3,a3,0x8 + 3004fba: eff7f793 andi a5,a5,-257 + 3004fbe: 8fd5 or a5,a5,a3 + 3004fc0: c31c sw a5,0(a4) + iocmgRegx->BIT.pd = pullMode & 0x01; /* 01b: pull down mode */ + 3004fc2: fe842783 lw a5,-24(s0) + 3004fc6: 8b85 andi a5,a5,1 + 3004fc8: 0ff7f693 andi a3,a5,255 + 3004fcc: fec42703 lw a4,-20(s0) + 3004fd0: 431c lw a5,0(a4) + 3004fd2: 8a85 andi a3,a3,1 + 3004fd4: 069e slli a3,a3,0x7 + 3004fd6: f7f7f793 andi a5,a5,-129 + 3004fda: 8fd5 or a5,a5,a3 + 3004fdc: c31c sw a5,0(a4) +} + 3004fde: 40f2 lw ra,28(sp) + 3004fe0: 4462 lw s0,24(sp) + 3004fe2: 6105 addi sp,sp,32 + 3004fe4: 8082 ret + +03004fe6 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param levelShiftRate value of @ref IOCMG_LevelShiftRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetLevelShiftRate(IOCMG_REG *iocmgRegx, IOCMG_LevelShiftRate levelShiftRate) +{ + 3004fe6: 1101 addi sp,sp,-32 + 3004fe8: ce06 sw ra,28(sp) + 3004fea: cc22 sw s0,24(sp) + 3004fec: 1000 addi s0,sp,32 + 3004fee: fea42623 sw a0,-20(s0) + 3004ff2: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004ff6: fec42703 lw a4,-20(s0) + 3004ffa: 77c1 lui a5,0xffff0 + 3004ffc: 8f7d and a4,a4,a5 + 3004ffe: 147f07b7 lui a5,0x147f0 + 3005002: 00f70a63 beq a4,a5,3005016 + 3005006: 0ed00593 li a1,237 + 300500a: 030077b7 lui a5,0x3007 + 300500e: 97c78513 addi a0,a5,-1668 # 300697c + 3005012: 2b79 jal ra,30055b0 + 3005014: a001 j 3005014 + IOCMG_PARAM_CHECK_NO_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX && levelShiftRate >= LEVEL_SHIFT_RATE_FAST); + 3005016: fe842703 lw a4,-24(s0) + 300501a: 4785 li a5,1 + 300501c: 00e7fa63 bgeu a5,a4,3005030 + 3005020: 0ee00593 li a1,238 + 3005024: 030077b7 lui a5,0x3007 + 3005028: 97c78513 addi a0,a5,-1668 # 300697c + 300502c: 2351 jal ra,30055b0 + 300502e: a839 j 300504c + iocmgRegx->BIT.sr = levelShiftRate; + 3005030: fe842783 lw a5,-24(s0) + 3005034: 8b85 andi a5,a5,1 + 3005036: 0ff7f693 andi a3,a5,255 + 300503a: fec42703 lw a4,-20(s0) + 300503e: 431c lw a5,0(a4) + 3005040: 8a85 andi a3,a3,1 + 3005042: 06a6 slli a3,a3,0x9 + 3005044: dff7f793 andi a5,a5,-513 + 3005048: 8fd5 or a5,a5,a3 + 300504a: c31c sw a5,0(a4) +} + 300504c: 40f2 lw ra,28(sp) + 300504e: 4462 lw s0,24(sp) + 3005050: 6105 addi sp,sp,32 + 3005052: 8082 ret + +03005054 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param schmidtMode value of @ref IOCMG_SchmidtMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetSchmidtMode(IOCMG_REG *iocmgRegx, IOCMG_SchmidtMode schmidtMode) +{ + 3005054: 1101 addi sp,sp,-32 + 3005056: ce06 sw ra,28(sp) + 3005058: cc22 sw s0,24(sp) + 300505a: 1000 addi s0,sp,32 + 300505c: fea42623 sw a0,-20(s0) + 3005060: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3005064: fec42703 lw a4,-20(s0) + 3005068: 77c1 lui a5,0xffff0 + 300506a: 8f7d and a4,a4,a5 + 300506c: 147f07b7 lui a5,0x147f0 + 3005070: 00f70a63 beq a4,a5,3005084 + 3005074: 10500593 li a1,261 + 3005078: 030077b7 lui a5,0x3007 + 300507c: 97c78513 addi a0,a5,-1668 # 300697c + 3005080: 2b05 jal ra,30055b0 + 3005082: a001 j 3005082 + IOCMG_PARAM_CHECK_NO_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE); + 3005084: fe842703 lw a4,-24(s0) + 3005088: 4785 li a5,1 + 300508a: 00e7fa63 bgeu a5,a4,300509e + 300508e: 10600593 li a1,262 + 3005092: 030077b7 lui a5,0x3007 + 3005096: 97c78513 addi a0,a5,-1668 # 300697c + 300509a: 2b19 jal ra,30055b0 + 300509c: a839 j 30050ba + iocmgRegx->BIT.se = schmidtMode; + 300509e: fe842783 lw a5,-24(s0) + 30050a2: 8b85 andi a5,a5,1 + 30050a4: 0ff7f693 andi a3,a5,255 + 30050a8: fec42703 lw a4,-20(s0) + 30050ac: 431c lw a5,0(a4) + 30050ae: 8a85 andi a3,a3,1 + 30050b0: 06aa slli a3,a3,0xa + 30050b2: bff7f793 andi a5,a5,-1025 + 30050b6: 8fd5 or a5,a5,a3 + 30050b8: c31c sw a5,0(a4) +} + 30050ba: 40f2 lw ra,28(sp) + 30050bc: 4462 lw s0,24(sp) + 30050be: 6105 addi sp,sp,32 + 30050c0: 8082 ret + +030050c2 : + * @brief Get pins iocmg reg address + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_REG iocmg reg address. + */ +static IOCMG_REG* IOCMG_GetRegAddr(unsigned int pinTypedef) +{ + 30050c2: 7179 addi sp,sp,-48 + 30050c4: d622 sw s0,44(sp) + 30050c6: 1800 addi s0,sp,48 + 30050c8: fca42e23 sw a0,-36(s0) + /* decode pin's iocmg reg offset address in base address, and conver value to point address */ + unsigned int iocmgBaseAddrValue = (uintptr_t)IOCMG_BASE; + 30050cc: 147f07b7 lui a5,0x147f0 + 30050d0: fef42623 sw a5,-20(s0) + unsigned int iocmgRegOffsetAddrValue = (pinTypedef >> 16) & 0x00000FFF; /* 16 : shift 16 bit */ + 30050d4: fdc42783 lw a5,-36(s0) + 30050d8: 0107d713 srli a4,a5,0x10 + 30050dc: 6785 lui a5,0x1 + 30050de: 17fd addi a5,a5,-1 # fff + 30050e0: 8ff9 and a5,a5,a4 + 30050e2: fef42423 sw a5,-24(s0) + IOCMG_REG* iocmgRegxAddr = (IOCMG_REG*)(void*)(iocmgBaseAddrValue + iocmgRegOffsetAddrValue); + 30050e6: fec42703 lw a4,-20(s0) + 30050ea: fe842783 lw a5,-24(s0) + 30050ee: 97ba add a5,a5,a4 + 30050f0: fef42223 sw a5,-28(s0) + if (!IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegxAddr & IOCMG_BASE_ADDR_MASK))) { + 30050f4: fe442703 lw a4,-28(s0) + 30050f8: 77c1 lui a5,0xffff0 + 30050fa: 8f7d and a4,a4,a5 + 30050fc: 147f07b7 lui a5,0x147f0 + 3005100: 00f70463 beq a4,a5,3005108 + return NULL; + 3005104: 4781 li a5,0 + 3005106: a019 j 300510c + } + return iocmgRegxAddr; + 3005108: fe442783 lw a5,-28(s0) +} + 300510c: 853e mv a0,a5 + 300510e: 5432 lw s0,44(sp) + 3005110: 6145 addi sp,sp,48 + 3005112: 8082 ret + +03005114 : + * @brief Set pins as function mode + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinAltFuncMode(unsigned int pinTypedef) +{ + 3005114: 7179 addi sp,sp,-48 + 3005116: d606 sw ra,44(sp) + 3005118: d422 sw s0,40(sp) + 300511a: 1800 addi s0,sp,48 + 300511c: fca42e23 sw a0,-36(s0) + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3005120: fdc42503 lw a0,-36(s0) + 3005124: 3f79 jal ra,30050c2 + 3005126: fea42623 sw a0,-20(s0) + /* get iocmg reg default value */ + unsigned int regValue = pinTypedef & IOCMG_REG_VALUE_MASK; + 300512a: fdc42703 lw a4,-36(s0) + 300512e: 67c1 lui a5,0x10 + 3005130: 17fd addi a5,a5,-1 # ffff + 3005132: 8ff9 and a5,a5,a4 + 3005134: fef42423 sw a5,-24(s0) + DCL_IOCMG_SetRegValue(iocmgRegx, regValue); + 3005138: fe842583 lw a1,-24(s0) + 300513c: fec42503 lw a0,-20(s0) + 3005140: 33a5 jal ra,3004ea8 + return IOCMG_STATUS_OK; + 3005142: 4781 li a5,0 +} + 3005144: 853e mv a0,a5 + 3005146: 50b2 lw ra,44(sp) + 3005148: 5422 lw s0,40(sp) + 300514a: 6145 addi sp,sp,48 + 300514c: 8082 ret + +0300514e : + * @param pinTypedef the pin type defined in iomap.h + * @param pullMode function define as @ref IOCMG_PullMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinPullMode(unsigned int pinTypedef, IOCMG_PullMode pullMode) +{ + 300514e: 7179 addi sp,sp,-48 + 3005150: d606 sw ra,44(sp) + 3005152: d422 sw s0,40(sp) + 3005154: 1800 addi s0,sp,48 + 3005156: fca42e23 sw a0,-36(s0) + 300515a: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE, IOCMG_PARAM_ERROR); + 300515e: fd842703 lw a4,-40(s0) + 3005162: 478d li a5,3 + 3005164: 00e7fb63 bgeu a5,a4,300517a + 3005168: 07800593 li a1,120 + 300516c: 030077b7 lui a5,0x3007 + 3005170: 99c78513 addi a0,a5,-1636 # 300699c + 3005174: 2935 jal ra,30055b0 + 3005176: 4791 li a5,4 + 3005178: a821 j 3005190 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 300517a: fdc42503 lw a0,-36(s0) + 300517e: 3791 jal ra,30050c2 + 3005180: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetPullMode(iocmgRegx, pullMode); + 3005184: fd842583 lw a1,-40(s0) + 3005188: fec42503 lw a0,-20(s0) + 300518c: 33f9 jal ra,3004f5a + return IOCMG_STATUS_OK; + 300518e: 4781 li a5,0 +} + 3005190: 853e mv a0,a5 + 3005192: 50b2 lw ra,44(sp) + 3005194: 5422 lw s0,40(sp) + 3005196: 6145 addi sp,sp,48 + 3005198: 8082 ret + +0300519a : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinSchmidtMode(unsigned int pinTypedef, IOCMG_SchmidtMode schmidtMode) +{ + 300519a: 7179 addi sp,sp,-48 + 300519c: d606 sw ra,44(sp) + 300519e: d422 sw s0,40(sp) + 30051a0: 1800 addi s0,sp,48 + 30051a2: fca42e23 sw a0,-36(s0) + 30051a6: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE, IOCMG_PARAM_ERROR); + 30051aa: fd842703 lw a4,-40(s0) + 30051ae: 4785 li a5,1 + 30051b0: 00e7fb63 bgeu a5,a4,30051c6 + 30051b4: 09300593 li a1,147 + 30051b8: 030077b7 lui a5,0x3007 + 30051bc: 99c78513 addi a0,a5,-1636 # 300699c + 30051c0: 2ec5 jal ra,30055b0 + 30051c2: 4791 li a5,4 + 30051c4: a821 j 30051dc + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 30051c6: fdc42503 lw a0,-36(s0) + 30051ca: 3de5 jal ra,30050c2 + 30051cc: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetSchmidtMode(iocmgRegx, schmidtMode); + 30051d0: fd842583 lw a1,-40(s0) + 30051d4: fec42503 lw a0,-20(s0) + 30051d8: 3db5 jal ra,3005054 + return IOCMG_STATUS_OK; + 30051da: 4781 li a5,0 +} + 30051dc: 853e mv a0,a5 + 30051de: 50b2 lw ra,44(sp) + 30051e0: 5422 lw s0,40(sp) + 30051e2: 6145 addi sp,sp,48 + 30051e4: 8082 ret + +030051e6 : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinLevelShiftRate(unsigned int pinTypedef, IOCMG_LevelShiftRate levelShiftRate) +{ + 30051e6: 7179 addi sp,sp,-48 + 30051e8: d606 sw ra,44(sp) + 30051ea: d422 sw s0,40(sp) + 30051ec: 1800 addi s0,sp,48 + 30051ee: fca42e23 sw a0,-36(s0) + 30051f2: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX, IOCMG_PARAM_ERROR); + 30051f6: fd842703 lw a4,-40(s0) + 30051fa: 4785 li a5,1 + 30051fc: 00e7fb63 bgeu a5,a4,3005212 + 3005200: 0ae00593 li a1,174 + 3005204: 030077b7 lui a5,0x3007 + 3005208: 99c78513 addi a0,a5,-1636 # 300699c + 300520c: 2655 jal ra,30055b0 + 300520e: 4791 li a5,4 + 3005210: a821 j 3005228 + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate >= LEVEL_SHIFT_RATE_FAST, IOCMG_PARAM_ERROR); + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3005212: fdc42503 lw a0,-36(s0) + 3005216: 3575 jal ra,30050c2 + 3005218: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetLevelShiftRate(iocmgRegx, levelShiftRate); + 300521c: fd842583 lw a1,-40(s0) + 3005220: fec42503 lw a0,-20(s0) + 3005224: 33c9 jal ra,3004fe6 + return IOCMG_STATUS_OK; + 3005226: 4781 li a5,0 +} + 3005228: 853e mv a0,a5 + 300522a: 50b2 lw ra,44(sp) + 300522c: 5422 lw s0,40(sp) + 300522e: 6145 addi sp,sp,48 + 3005230: 8082 ret + +03005232 : + * @param pinTypedef the pin type defined in iomap.h + * @param driveRate function define as @ref IOCMG_DriveRate + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinDriveRate(unsigned int pinTypedef, IOCMG_DriveRate driveRate) +{ + 3005232: 7179 addi sp,sp,-48 + 3005234: d606 sw ra,44(sp) + 3005236: d422 sw s0,40(sp) + 3005238: 1800 addi s0,sp,48 + 300523a: fca42e23 sw a0,-36(s0) + 300523e: fcb42c23 sw a1,-40(s0) + /* get iocmg reg address */ + IOCMG_PARAM_CHECK_WITH_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4, IOCMG_PARAM_ERROR); + 3005242: fd842703 lw a4,-40(s0) + 3005246: 478d li a5,3 + 3005248: 00e7fb63 bgeu a5,a4,300525e + 300524c: 0cb00593 li a1,203 + 3005250: 030077b7 lui a5,0x3007 + 3005254: 99c78513 addi a0,a5,-1636 # 300699c + 3005258: 2ea1 jal ra,30055b0 + 300525a: 4791 li a5,4 + 300525c: a821 j 3005274 + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 300525e: fdc42503 lw a0,-36(s0) + 3005262: 3585 jal ra,30050c2 + 3005264: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetDriveRate(iocmgRegx, driveRate); + 3005268: fd842583 lw a1,-40(s0) + 300526c: fec42503 lw a0,-20(s0) + 3005270: 39b5 jal ra,3004eec + return IOCMG_STATUS_OK; + 3005272: 4781 li a5,0 +} + 3005274: 853e mv a0,a5 + 3005276: 50b2 lw ra,44(sp) + 3005278: 5422 lw s0,40(sp) + 300527a: 6145 addi sp,sp,48 + 300527c: 8082 ret + +0300527e : + * @param mode Timer Mode, @ref TIMER_Mode + * @retval true + * @retval false + */ +static inline bool IsTimerMode(TIMER_Mode mode) +{ + 300527e: 1101 addi sp,sp,-32 + 3005280: ce22 sw s0,28(sp) + 3005282: 1000 addi s0,sp,32 + 3005284: fea42623 sw a0,-20(s0) + return (((mode) == TIMER_MODE_RUN_FREE) || + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3005288: fec42783 lw a5,-20(s0) + 300528c: cb99 beqz a5,30052a2 + return (((mode) == TIMER_MODE_RUN_FREE) || + 300528e: fec42703 lw a4,-20(s0) + 3005292: 4785 li a5,1 + 3005294: 00f70763 beq a4,a5,30052a2 + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3005298: fec42703 lw a4,-20(s0) + 300529c: 4789 li a5,2 + 300529e: 00f71463 bne a4,a5,30052a6 + 30052a2: 4785 li a5,1 + 30052a4: a011 j 30052a8 + 30052a6: 4781 li a5,0 + 30052a8: 8b85 andi a5,a5,1 + 30052aa: 9f81 uxtb a5 + ((mode) == TIMER_MODE_RUN_ONTSHOT)); +} + 30052ac: 853e mv a0,a5 + 30052ae: 4472 lw s0,28(sp) + 30052b0: 6105 addi sp,sp,32 + 30052b2: 8082 ret + +030052b4 : + * @param mode Timer Interrupt Type, @ref TIMER_InterruptType + * @retval true + * @retval false + */ +static inline bool IsTimerInterruptType(TIMER_InterruptType interruptType) +{ + 30052b4: 1101 addi sp,sp,-32 + 30052b6: ce22 sw s0,28(sp) + 30052b8: 1000 addi s0,sp,32 + 30052ba: fea42623 sw a0,-20(s0) + return (((interruptType) == TIMER_PERIOD_FIN) || + 30052be: fec42783 lw a5,-20(s0) + 30052c2: c791 beqz a5,30052ce + 30052c4: fec42703 lw a4,-20(s0) + 30052c8: 4785 li a5,1 + 30052ca: 00f71463 bne a4,a5,30052d2 + 30052ce: 4785 li a5,1 + 30052d0: a011 j 30052d4 + 30052d2: 4781 li a5,0 + 30052d4: 8b85 andi a5,a5,1 + 30052d6: 9f81 uxtb a5 + ((interruptType) == TIMER_OVER_FLOW)); +} + 30052d8: 853e mv a0,a5 + 30052da: 4472 lw s0,28(sp) + 30052dc: 6105 addi sp,sp,32 + 30052de: 8082 ret + +030052e0 : + * @param size Timer Size, @ref TIMER_Size + * @retval true + * @retval false + */ +static inline bool IsTimerSize(TIMER_Size size) +{ + 30052e0: 1101 addi sp,sp,-32 + 30052e2: ce22 sw s0,28(sp) + 30052e4: 1000 addi s0,sp,32 + 30052e6: fea42623 sw a0,-20(s0) + return (((size) == TIMER_SIZE_16BIT) || + 30052ea: fec42783 lw a5,-20(s0) + 30052ee: c791 beqz a5,30052fa + 30052f0: fec42703 lw a4,-20(s0) + 30052f4: 4785 li a5,1 + 30052f6: 00f71463 bne a4,a5,30052fe + 30052fa: 4785 li a5,1 + 30052fc: a011 j 3005300 + 30052fe: 4781 li a5,0 + 3005300: 8b85 andi a5,a5,1 + 3005302: 9f81 uxtb a5 + ((size) == TIMER_SIZE_32BIT)); +} + 3005304: 853e mv a0,a5 + 3005306: 4472 lw s0,28(sp) + 3005308: 6105 addi sp,sp,32 + 300530a: 8082 ret + +0300530c : + * @param period + * @retval true + * @retval false + */ +static inline bool IsTimerPeriod(unsigned int period) +{ + 300530c: 1101 addi sp,sp,-32 + 300530e: ce22 sw s0,28(sp) + 3005310: 1000 addi s0,sp,32 + 3005312: fea42623 sw a0,-20(s0) + return ((period) >= PERIOD_MIN_VALUE); + 3005316: fec42783 lw a5,-20(s0) + 300531a: 00f037b3 snez a5,a5 + 300531e: 9f81 uxtb a5 +} + 3005320: 853e mv a0,a5 + 3005322: 4472 lw s0,28(sp) + 3005324: 6105 addi sp,sp,32 + 3005326: 8082 ret + +03005328 : + * @param div @see TIMER_PrescalerFactor + * @retval true + * @retval false + */ +static inline bool IsTimerDiv(TIMER_PrescalerFactor div) +{ + 3005328: 1101 addi sp,sp,-32 + 300532a: ce22 sw s0,28(sp) + 300532c: 1000 addi s0,sp,32 + 300532e: fea42623 sw a0,-20(s0) + return (((div) == TIMERPRESCALER_NO_DIV) || + ((div) == TIMERPRESCALER_DIV_16) || + 3005332: fec42783 lw a5,-20(s0) + 3005336: cb99 beqz a5,300534c + return (((div) == TIMERPRESCALER_NO_DIV) || + 3005338: fec42703 lw a4,-20(s0) + 300533c: 4785 li a5,1 + 300533e: 00f70763 beq a4,a5,300534c + ((div) == TIMERPRESCALER_DIV_16) || + 3005342: fec42703 lw a4,-20(s0) + 3005346: 4789 li a5,2 + 3005348: 00f71463 bne a4,a5,3005350 + 300534c: 4785 li a5,1 + 300534e: a011 j 3005352 + 3005350: 4781 li a5,0 + 3005352: 8b85 andi a5,a5,1 + 3005354: 9f81 uxtb a5 + ((div) == TIMERPRESCALER_DIV_256)); +} + 3005356: 853e mv a0,a5 + 3005358: 4472 lw s0,28(sp) + 300535a: 6105 addi sp,sp,32 + 300535c: 8082 ret + +0300535e : + * @param handle Timer Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR parameter check fail + */ +BASE_StatusType HAL_TIMER_Init(TIMER_Handle *handle) +{ + 300535e: 1101 addi sp,sp,-32 + 3005360: ce06 sw ra,28(sp) + 3005362: cc22 sw s0,24(sp) + 3005364: 1000 addi s0,sp,32 + 3005366: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 300536a: fec42783 lw a5,-20(s0) + 300536e: eb89 bnez a5,3005380 + 3005370: 02800593 li a1,40 + 3005374: 030077b7 lui a5,0x3007 + 3005378: 9dc78513 addi a0,a5,-1572 # 30069dc + 300537c: 2c15 jal ra,30055b0 + 300537e: a001 j 300537e + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 3005380: fec42783 lw a5,-20(s0) + 3005384: 4398 lw a4,0(a5) + 3005386: 143007b7 lui a5,0x14300 + 300538a: 02f70f63 beq a4,a5,30053c8 + 300538e: fec42783 lw a5,-20(s0) + 3005392: 4398 lw a4,0(a5) + 3005394: 143017b7 lui a5,0x14301 + 3005398: 02f70863 beq a4,a5,30053c8 + 300539c: fec42783 lw a5,-20(s0) + 30053a0: 4398 lw a4,0(a5) + 30053a2: 143027b7 lui a5,0x14302 + 30053a6: 02f70163 beq a4,a5,30053c8 + 30053aa: fec42783 lw a5,-20(s0) + 30053ae: 4398 lw a4,0(a5) + 30053b0: 143037b7 lui a5,0x14303 + 30053b4: 00f70a63 beq a4,a5,30053c8 + 30053b8: 02900593 li a1,41 + 30053bc: 030077b7 lui a5,0x3007 + 30053c0: 9dc78513 addi a0,a5,-1572 # 30069dc + 30053c4: 22f5 jal ra,30055b0 + 30053c6: a001 j 30053c6 + + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->load), BASE_STATUS_ERROR); + 30053c8: fec42783 lw a5,-20(s0) + 30053cc: 4bdc lw a5,20(a5) + 30053ce: 853e mv a0,a5 + 30053d0: 3f35 jal ra,300530c + 30053d2: 87aa mv a5,a0 + 30053d4: 0017c793 xori a5,a5,1 + 30053d8: 9f81 uxtb a5 + 30053da: cb91 beqz a5,30053ee + 30053dc: 02b00593 li a1,43 + 30053e0: 030077b7 lui a5,0x3007 + 30053e4: 9dc78513 addi a0,a5,-1572 # 30069dc + 30053e8: 22e1 jal ra,30055b0 + 30053ea: 4785 li a5,1 + 30053ec: aa6d j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->bgLoad), BASE_STATUS_ERROR); + 30053ee: fec42783 lw a5,-20(s0) + 30053f2: 4f9c lw a5,24(a5) + 30053f4: 853e mv a0,a5 + 30053f6: 3f19 jal ra,300530c + 30053f8: 87aa mv a5,a0 + 30053fa: 0017c793 xori a5,a5,1 + 30053fe: 9f81 uxtb a5 + 3005400: cb91 beqz a5,3005414 + 3005402: 02c00593 li a1,44 + 3005406: 030077b7 lui a5,0x3007 + 300540a: 9dc78513 addi a0,a5,-1572 # 30069dc + 300540e: 224d jal ra,30055b0 + 3005410: 4785 li a5,1 + 3005412: aa51 j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerMode(handle->mode), BASE_STATUS_ERROR); + 3005414: fec42783 lw a5,-20(s0) + 3005418: 479c lw a5,8(a5) + 300541a: 853e mv a0,a5 + 300541c: 358d jal ra,300527e + 300541e: 87aa mv a5,a0 + 3005420: 0017c793 xori a5,a5,1 + 3005424: 9f81 uxtb a5 + 3005426: cb91 beqz a5,300543a + 3005428: 02d00593 li a1,45 + 300542c: 030077b7 lui a5,0x3007 + 3005430: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005434: 2ab5 jal ra,30055b0 + 3005436: 4785 li a5,1 + 3005438: a2bd j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerSize(handle->size), BASE_STATUS_ERROR); + 300543a: fec42783 lw a5,-20(s0) + 300543e: 4b9c lw a5,16(a5) + 3005440: 853e mv a0,a5 + 3005442: 3d79 jal ra,30052e0 + 3005444: 87aa mv a5,a0 + 3005446: 0017c793 xori a5,a5,1 + 300544a: 9f81 uxtb a5 + 300544c: cb91 beqz a5,3005460 + 300544e: 02e00593 li a1,46 + 3005452: 030077b7 lui a5,0x3007 + 3005456: 9dc78513 addi a0,a5,-1572 # 30069dc + 300545a: 2a99 jal ra,30055b0 + 300545c: 4785 li a5,1 + 300545e: a2a1 j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerDiv(handle->prescaler), BASE_STATUS_ERROR); + 3005460: fec42783 lw a5,-20(s0) + 3005464: 47dc lw a5,12(a5) + 3005466: 853e mv a0,a5 + 3005468: 35c1 jal ra,3005328 + 300546a: 87aa mv a5,a0 + 300546c: 0017c793 xori a5,a5,1 + 3005470: 9f81 uxtb a5 + 3005472: cb91 beqz a5,3005486 + 3005474: 02f00593 li a1,47 + 3005478: 030077b7 lui a5,0x3007 + 300547c: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005480: 2a05 jal ra,30055b0 + 3005482: 4785 li a5,1 + 3005484: a20d j 30055a6 + + /* Initialize the configuration parameters of the timer */ + handle->baseAddress->timer_intclr = BASE_CFG_SET; /* Writing to this register clears interrupt output of timer */ + 3005486: fec42783 lw a5,-20(s0) + 300548a: 439c lw a5,0(a5) + 300548c: 4705 li a4,1 + 300548e: c7d8 sw a4,12(a5) + handle->baseAddress->timer_load = handle->load; + 3005490: fec42783 lw a5,-20(s0) + 3005494: 439c lw a5,0(a5) + 3005496: fec42703 lw a4,-20(s0) + 300549a: 4b58 lw a4,20(a4) + 300549c: c398 sw a4,0(a5) + handle->baseAddress->timerbgload = handle->bgLoad; + 300549e: fec42783 lw a5,-20(s0) + 30054a2: 439c lw a5,0(a5) + 30054a4: fec42703 lw a4,-20(s0) + 30054a8: 4f18 lw a4,24(a4) + 30054aa: cf98 sw a4,24(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_DISABLE; + 30054ac: fec42783 lw a5,-20(s0) + 30054b0: 4398 lw a4,0(a5) + 30054b2: 471c lw a5,8(a4) + 30054b4: f7f7f793 andi a5,a5,-129 + 30054b8: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timerintenable = handle->interruptEn; + 30054ba: fec42783 lw a5,-20(s0) + 30054be: 4398 lw a4,0(a5) + 30054c0: fec42783 lw a5,-20(s0) + 30054c4: 2fd4 lbu a3,28(a5) + 30054c6: 471c lw a5,8(a4) + 30054c8: 8a85 andi a3,a3,1 + 30054ca: 0696 slli a3,a3,0x5 + 30054cc: fdf7f793 andi a5,a5,-33 + 30054d0: 8fd5 or a5,a5,a3 + 30054d2: c71c sw a5,8(a4) + + /* Sets the frequency divider and size of the timer module. */ + handle->baseAddress->TIMERx_CONTROL.BIT.timerpre = handle->prescaler; + 30054d4: fec42783 lw a5,-20(s0) + 30054d8: 47d4 lw a3,12(a5) + 30054da: fec42783 lw a5,-20(s0) + 30054de: 4398 lw a4,0(a5) + 30054e0: 87b6 mv a5,a3 + 30054e2: 8b8d andi a5,a5,3 + 30054e4: 0ff7f693 andi a3,a5,255 + 30054e8: 471c lw a5,8(a4) + 30054ea: 8a8d andi a3,a3,3 + 30054ec: 068a slli a3,a3,0x2 + 30054ee: 9bcd andi a5,a5,-13 + 30054f0: 8fd5 or a5,a5,a3 + 30054f2: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timersize = handle->size; + 30054f4: fec42783 lw a5,-20(s0) + 30054f8: 4b94 lw a3,16(a5) + 30054fa: fec42783 lw a5,-20(s0) + 30054fe: 4398 lw a4,0(a5) + 3005500: 87b6 mv a5,a3 + 3005502: 8b85 andi a5,a5,1 + 3005504: 0ff7f693 andi a3,a5,255 + 3005508: 471c lw a5,8(a4) + 300550a: 8a85 andi a3,a3,1 + 300550c: 0686 slli a3,a3,0x1 + 300550e: 9bf5 andi a5,a5,-3 + 3005510: 8fd5 or a5,a5,a3 + 3005512: c71c sw a5,8(a4) + + /* Sets the running mode of the timer. */ + if (handle->mode == TIMER_MODE_RUN_ONTSHOT) { + 3005514: fec42783 lw a5,-20(s0) + 3005518: 4798 lw a4,8(a5) + 300551a: 4789 li a5,2 + 300551c: 00f71a63 bne a4,a5,3005530 + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_SET; + 3005520: fec42783 lw a5,-20(s0) + 3005524: 4398 lw a4,0(a5) + 3005526: 471c lw a5,8(a4) + 3005528: 0017e793 ori a5,a5,1 + 300552c: c71c sw a5,8(a4) + 300552e: a805 j 300555e + } else { + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_UNSET; + 3005530: fec42783 lw a5,-20(s0) + 3005534: 4398 lw a4,0(a5) + 3005536: 471c lw a5,8(a4) + 3005538: 9bf9 andi a5,a5,-2 + 300553a: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 300553c: fec42783 lw a5,-20(s0) + 3005540: 479c lw a5,8(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005542: fec42703 lw a4,-20(s0) + 3005546: 4318 lw a4,0(a4) + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005548: 00f037b3 snez a5,a5 + 300554c: 0ff7f693 andi a3,a5,255 + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005550: 471c lw a5,8(a4) + 3005552: 8a85 andi a3,a3,1 + 3005554: 069a slli a3,a3,0x6 + 3005556: fbf7f793 andi a5,a5,-65 + 300555a: 8fd5 or a5,a5,a3 + 300555c: c71c sw a5,8(a4) + } + + /* Request for setting the DMA and ADC. */ + handle->baseAddress->TIMERx_CONTROLB.BIT.dmasreqen = handle->dmaReqEnable; + 300555e: fec42783 lw a5,-20(s0) + 3005562: 4398 lw a4,0(a5) + 3005564: fec42783 lw a5,-20(s0) + 3005568: 2ff4 lbu a3,30(a5) + 300556a: 4f5c lw a5,28(a4) + 300556c: 8a85 andi a3,a3,1 + 300556e: 0686 slli a3,a3,0x1 + 3005570: 9bf5 andi a5,a5,-3 + 3005572: 8fd5 or a5,a5,a3 + 3005574: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.dmabreqen = handle->dmaReqEnable; + 3005576: fec42783 lw a5,-20(s0) + 300557a: 4398 lw a4,0(a5) + 300557c: fec42783 lw a5,-20(s0) + 3005580: 2ff4 lbu a3,30(a5) + 3005582: 4f5c lw a5,28(a4) + 3005584: 8a85 andi a3,a3,1 + 3005586: 9bf9 andi a5,a5,-2 + 3005588: 8fd5 or a5,a5,a3 + 300558a: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.socen = handle->adcSocReqEnable; + 300558c: fec42783 lw a5,-20(s0) + 3005590: 4398 lw a4,0(a5) + 3005592: fec42783 lw a5,-20(s0) + 3005596: 3fd4 lbu a3,29(a5) + 3005598: 4f5c lw a5,28(a4) + 300559a: 8a85 andi a3,a3,1 + 300559c: 068a slli a3,a3,0x2 + 300559e: 9bed andi a5,a5,-5 + 30055a0: 8fd5 or a5,a5,a3 + 30055a2: cf5c sw a5,28(a4) + return BASE_STATUS_OK; + 30055a4: 4781 li a5,0 +} + 30055a6: 853e mv a0,a5 + 30055a8: 40f2 lw ra,28(sp) + 30055aa: 4462 lw s0,24(sp) + 30055ac: 6105 addi sp,sp,32 + 30055ae: 8082 ret + +030055b0 : + 30055b0: c37fc06f j 30021e6 + +030055b4 : + * @brief Start timer. + * @param handle Timer Handle + * @retval None + */ +void HAL_TIMER_Start(TIMER_Handle *handle) +{ + 30055b4: 1101 addi sp,sp,-32 + 30055b6: ce06 sw ra,28(sp) + 30055b8: cc22 sw s0,24(sp) + 30055ba: 1000 addi s0,sp,32 + 30055bc: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 30055c0: fec42783 lw a5,-20(s0) + 30055c4: eb89 bnez a5,30055d6 + 30055c6: 0bc00593 li a1,188 + 30055ca: 030077b7 lui a5,0x3007 + 30055ce: 9dc78513 addi a0,a5,-1572 # 30069dc + 30055d2: 3ff9 jal ra,30055b0 + 30055d4: a001 j 30055d4 + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 30055d6: fec42783 lw a5,-20(s0) + 30055da: 4398 lw a4,0(a5) + 30055dc: 143007b7 lui a5,0x14300 + 30055e0: 02f70f63 beq a4,a5,300561e + 30055e4: fec42783 lw a5,-20(s0) + 30055e8: 4398 lw a4,0(a5) + 30055ea: 143017b7 lui a5,0x14301 + 30055ee: 02f70863 beq a4,a5,300561e + 30055f2: fec42783 lw a5,-20(s0) + 30055f6: 4398 lw a4,0(a5) + 30055f8: 143027b7 lui a5,0x14302 + 30055fc: 02f70163 beq a4,a5,300561e + 3005600: fec42783 lw a5,-20(s0) + 3005604: 4398 lw a4,0(a5) + 3005606: 143037b7 lui a5,0x14303 + 300560a: 00f70a63 beq a4,a5,300561e + 300560e: 0bd00593 li a1,189 + 3005612: 030077b7 lui a5,0x3007 + 3005616: 9dc78513 addi a0,a5,-1572 # 30069dc + 300561a: 3f59 jal ra,30055b0 + 300561c: a001 j 300561c + /* Enable timer */ + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_SET; + 300561e: fec42783 lw a5,-20(s0) + 3005622: 4398 lw a4,0(a5) + 3005624: 471c lw a5,8(a4) + 3005626: 0807e793 ori a5,a5,128 + 300562a: c71c sw a5,8(a4) +} + 300562c: 0001 nop + 300562e: 40f2 lw ra,28(sp) + 3005630: 4462 lw s0,24(sp) + 3005632: 6105 addi sp,sp,32 + 3005634: 8082 ret + +03005636 : + * @brief GPT Interrupt service processing function. + * @param handle TIMER Handle + * @retval None + */ +void HAL_TIMER_IrqHandler(void *handle) +{ + 3005636: 7179 addi sp,sp,-48 + 3005638: d606 sw ra,44(sp) + 300563a: d422 sw s0,40(sp) + 300563c: 1800 addi s0,sp,48 + 300563e: fca42e23 sw a0,-36(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005642: fdc42783 lw a5,-36(s0) + 3005646: eb89 bnez a5,3005658 + 3005648: 0d800593 li a1,216 + 300564c: 030077b7 lui a5,0x3007 + 3005650: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005654: 3fb1 jal ra,30055b0 + 3005656: a001 j 3005656 + TIMER_Handle *timerHandle = (TIMER_Handle *)handle; + 3005658: fdc42783 lw a5,-36(s0) + 300565c: fef42623 sw a5,-20(s0) + TIMER_ASSERT_PARAM(IsTIMERInstance(timerHandle->baseAddress)); + 3005660: fec42783 lw a5,-20(s0) + 3005664: 4398 lw a4,0(a5) + 3005666: 143007b7 lui a5,0x14300 + 300566a: 02f70f63 beq a4,a5,30056a8 + 300566e: fec42783 lw a5,-20(s0) + 3005672: 4398 lw a4,0(a5) + 3005674: 143017b7 lui a5,0x14301 + 3005678: 02f70863 beq a4,a5,30056a8 + 300567c: fec42783 lw a5,-20(s0) + 3005680: 4398 lw a4,0(a5) + 3005682: 143027b7 lui a5,0x14302 + 3005686: 02f70163 beq a4,a5,30056a8 + 300568a: fec42783 lw a5,-20(s0) + 300568e: 4398 lw a4,0(a5) + 3005690: 143037b7 lui a5,0x14303 + 3005694: 00f70a63 beq a4,a5,30056a8 + 3005698: 0da00593 li a1,218 + 300569c: 030077b7 lui a5,0x3007 + 30056a0: 9dc78513 addi a0,a5,-1572 # 30069dc + 30056a4: 3731 jal ra,30055b0 + 30056a6: a001 j 30056a6 + /* Check interrupt type */ + if (timerHandle->baseAddress->TIMERx_MIS.dmaovmis == BASE_CFG_ENABLE) { + 30056a8: fec42783 lw a5,-20(s0) + 30056ac: 439c lw a5,0(a5) + 30056ae: 4bdc lw a5,20(a5) + 30056b0: 8385 srli a5,a5,0x1 + 30056b2: 8b85 andi a5,a5,1 + 30056b4: 0ff7f713 andi a4,a5,255 + 30056b8: 4785 li a5,1 + 30056ba: 02f71363 bne a4,a5,30056e0 + /* DMA overflow interrupt */ + timerHandle->baseAddress->DMAOV_INTCLR.BIT.dmaov_intclr = BASE_CFG_ENABLE; + 30056be: fec42783 lw a5,-20(s0) + 30056c2: 4398 lw a4,0(a5) + 30056c4: 531c lw a5,32(a4) + 30056c6: 0017e793 ori a5,a5,1 + 30056ca: d31c sw a5,32(a4) + /* Call the timer DMA request overflow callback function of the user. */ + if (timerHandle->userCallBack.TimerOverFlowCallBack != NULL) { + 30056cc: fec42783 lw a5,-20(s0) + 30056d0: 53dc lw a5,36(a5) + 30056d2: c799 beqz a5,30056e0 + timerHandle->userCallBack.TimerOverFlowCallBack(timerHandle); + 30056d4: fec42783 lw a5,-20(s0) + 30056d8: 53dc lw a5,36(a5) + 30056da: fec42503 lw a0,-20(s0) + 30056de: 9782 jalr a5 + } + } + if (timerHandle->baseAddress->TIMERx_MIS.timermis == BASE_CFG_ENABLE) { + 30056e0: fec42783 lw a5,-20(s0) + 30056e4: 439c lw a5,0(a5) + 30056e6: 4bdc lw a5,20(a5) + 30056e8: 8b85 andi a5,a5,1 + 30056ea: 0ff7f713 andi a4,a5,255 + 30056ee: 4785 li a5,1 + 30056f0: 02f71263 bne a4,a5,3005714 + /* TIMER Interrupt */ + timerHandle->baseAddress->timer_intclr = BASE_CFG_ENABLE; + 30056f4: fec42783 lw a5,-20(s0) + 30056f8: 439c lw a5,0(a5) + 30056fa: 4705 li a4,1 + 30056fc: c7d8 sw a4,12(a5) + /* Call the period finish callback function of the user. */ + if (timerHandle->userCallBack.TimerPeriodFinCallBack != NULL) { + 30056fe: fec42783 lw a5,-20(s0) + 3005702: 539c lw a5,32(a5) + 3005704: cb81 beqz a5,3005714 + timerHandle->userCallBack.TimerPeriodFinCallBack(timerHandle); + 3005706: fec42783 lw a5,-20(s0) + 300570a: 539c lw a5,32(a5) + 300570c: fec42503 lw a0,-20(s0) + 3005710: 9782 jalr a5 + } + } + return; + 3005712: 0001 nop + 3005714: 0001 nop +} + 3005716: 50b2 lw ra,44(sp) + 3005718: 5422 lw s0,40(sp) + 300571a: 6145 addi sp,sp,48 + 300571c: 8082 ret + +0300571e : + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_TIMER_RegisterCallback(TIMER_Handle *handle, TIMER_InterruptType typeID, + TIMER_CallBackFunc callBackFunc) +{ + 300571e: 1101 addi sp,sp,-32 + 3005720: ce06 sw ra,28(sp) + 3005722: cc22 sw s0,24(sp) + 3005724: 1000 addi s0,sp,32 + 3005726: fea42623 sw a0,-20(s0) + 300572a: feb42423 sw a1,-24(s0) + 300572e: fec42223 sw a2,-28(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005732: fec42783 lw a5,-20(s0) + 3005736: eb89 bnez a5,3005748 + 3005738: 0fa00593 li a1,250 + 300573c: 030077b7 lui a5,0x3007 + 3005740: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005744: 35b5 jal ra,30055b0 + 3005746: a001 j 3005746 + TIMER_ASSERT_PARAM(callBackFunc != NULL); + 3005748: fe442783 lw a5,-28(s0) + 300574c: eb89 bnez a5,300575e + 300574e: 0fb00593 li a1,251 + 3005752: 030077b7 lui a5,0x3007 + 3005756: 9dc78513 addi a0,a5,-1572 # 30069dc + 300575a: 3d99 jal ra,30055b0 + 300575c: a001 j 300575c + TIMER_ASSERT_PARAM(IsTimerInterruptType(typeID)); + 300575e: fe842503 lw a0,-24(s0) + 3005762: 3e89 jal ra,30052b4 + 3005764: 87aa mv a5,a0 + 3005766: 0017c793 xori a5,a5,1 + 300576a: 9f81 uxtb a5 + 300576c: cb89 beqz a5,300577e + 300576e: 0fc00593 li a1,252 + 3005772: 030077b7 lui a5,0x3007 + 3005776: 9dc78513 addi a0,a5,-1572 # 30069dc + 300577a: 3d1d jal ra,30055b0 + 300577c: a001 j 300577c + + /* Registers the user callback function. */ + switch (typeID) { + 300577e: fe842783 lw a5,-24(s0) + 3005782: cb91 beqz a5,3005796 + 3005784: 4705 li a4,1 + 3005786: 00e79e63 bne a5,a4,30057a2 + case TIMER_OVER_FLOW: + handle->userCallBack.TimerOverFlowCallBack = callBackFunc; /* User DMA request overflow function */ + 300578a: fec42783 lw a5,-20(s0) + 300578e: fe442703 lw a4,-28(s0) + 3005792: d3d8 sw a4,36(a5) + break; + 3005794: a809 j 30057a6 + case TIMER_PERIOD_FIN: + handle->userCallBack.TimerPeriodFinCallBack = callBackFunc; /* User timer period finish call back. */ + 3005796: fec42783 lw a5,-20(s0) + 300579a: fe442703 lw a4,-28(s0) + 300579e: d398 sw a4,32(a5) + break; + 30057a0: a019 j 30057a6 + default: + return BASE_STATUS_ERROR; + 30057a2: 4785 li a5,1 + 30057a4: a011 j 30057a8 + } + return BASE_STATUS_OK; + 30057a6: 4781 li a5,0 +} + 30057a8: 853e mv a0,a5 + 30057aa: 40f2 lw ra,28(sp) + 30057ac: 4462 lw s0,24(sp) + 30057ae: 6105 addi sp,sp,32 + 30057b0: 8082 ret + +030057b2 : + * @brief Check UART datalength parameter. + * @param datalength The number of data bits in a frame, @ref UART_DataLength + * @retval bool + */ +static inline bool IsUartDatalength(UART_DataLength datalength) +{ + 30057b2: 1101 addi sp,sp,-32 + 30057b4: ce22 sw s0,28(sp) + 30057b6: 1000 addi s0,sp,32 + 30057b8: fea42623 sw a0,-20(s0) + return (datalength >= UART_DATALENGTH_5BIT) && (datalength <= UART_DATALENGTH_8BIT); + 30057bc: fec42783 lw a5,-20(s0) + 30057c0: 0047b793 sltiu a5,a5,4 + 30057c4: 9f81 uxtb a5 +} + 30057c6: 853e mv a0,a5 + 30057c8: 4472 lw s0,28(sp) + 30057ca: 6105 addi sp,sp,32 + 30057cc: 8082 ret + +030057ce : + * @brief Check UART stopbits parameter. + * @param stopbits The number of stop bits in a frame, @ref UART_StopBits + * @retval bool + */ +static inline bool IsUartStopbits(UART_StopBits stopbits) +{ + 30057ce: 1101 addi sp,sp,-32 + 30057d0: ce22 sw s0,28(sp) + 30057d2: 1000 addi s0,sp,32 + 30057d4: fea42623 sw a0,-20(s0) + return (stopbits == UART_STOPBITS_ONE) || (stopbits == UART_STOPBITS_TWO); + 30057d8: fec42783 lw a5,-20(s0) + 30057dc: c791 beqz a5,30057e8 + 30057de: fec42703 lw a4,-20(s0) + 30057e2: 4785 li a5,1 + 30057e4: 00f71463 bne a4,a5,30057ec + 30057e8: 4785 li a5,1 + 30057ea: a011 j 30057ee + 30057ec: 4781 li a5,0 + 30057ee: 8b85 andi a5,a5,1 + 30057f0: 9f81 uxtb a5 +} + 30057f2: 853e mv a0,a5 + 30057f4: 4472 lw s0,28(sp) + 30057f6: 6105 addi sp,sp,32 + 30057f8: 8082 ret + +030057fa : + * @brief Check UART paritymode parameter. + * @param paritymode UART parity check mode, @ref UART_Parity_Mode + * @retval bool + */ +static inline bool IsUartParitymode(UART_Parity_Mode paritymode) +{ + 30057fa: 1101 addi sp,sp,-32 + 30057fc: ce22 sw s0,28(sp) + 30057fe: 1000 addi s0,sp,32 + 3005800: fea42623 sw a0,-20(s0) + if ((paritymode >= UART_PARITY_ODD) && (paritymode <= UART_PARITY_NONE)) { + 3005804: fec42703 lw a4,-20(s0) + 3005808: 4791 li a5,4 + 300580a: 00e7e463 bltu a5,a4,3005812 + return true; + 300580e: 4785 li a5,1 + 3005810: a011 j 3005814 + } + return false; + 3005812: 4781 li a5,0 +} + 3005814: 853e mv a0,a5 + 3005816: 4472 lw s0,28(sp) + 3005818: 6105 addi sp,sp,32 + 300581a: 8082 ret + +0300581c : + * @brief Check UART transmode parameter. + * @param transmode Transmit mode, @ref UART_Transmit_Mode + * @retval bool + */ +static inline bool IsUartTransmode(UART_Transmit_Mode transmode) +{ + 300581c: 1101 addi sp,sp,-32 + 300581e: ce22 sw s0,28(sp) + 3005820: 1000 addi s0,sp,32 + 3005822: fea42623 sw a0,-20(s0) + if ((transmode == UART_MODE_BLOCKING) || + 3005826: fec42783 lw a5,-20(s0) + 300582a: c385 beqz a5,300584a + 300582c: fec42703 lw a4,-20(s0) + 3005830: 4785 li a5,1 + 3005832: 00f70c63 beq a4,a5,300584a + (transmode == UART_MODE_INTERRUPT) || + 3005836: fec42703 lw a4,-20(s0) + 300583a: 4789 li a5,2 + 300583c: 00f70763 beq a4,a5,300584a + (transmode == UART_MODE_DMA) || + 3005840: fec42703 lw a4,-20(s0) + 3005844: 478d li a5,3 + 3005846: 00f71463 bne a4,a5,300584e + (transmode == UART_MODE_DISABLE)) { + return true; + 300584a: 4785 li a5,1 + 300584c: a011 j 3005850 + } + return false; + 300584e: 4781 li a5,0 +} + 3005850: 853e mv a0,a5 + 3005852: 4472 lw s0,28(sp) + 3005854: 6105 addi sp,sp,32 + 3005856: 8082 ret + +03005858 : + * @brief Check UART fifoThreshold parameter. + * @param fifoThreshold UART TX/RX FIFO line interrupt threshold, @ref UART_FIFO_Threshold + * @retval bool + */ +static inline bool IsUartFIFOThreshold(UART_FIFO_Threshold fifoThreshold) +{ + 3005858: 1101 addi sp,sp,-32 + 300585a: ce22 sw s0,28(sp) + 300585c: 1000 addi s0,sp,32 + 300585e: fea42623 sw a0,-20(s0) + return (fifoThreshold >= UART_FIFODEPTH_SIZE0) && (fifoThreshold <= UART_FIFODEPTH_SIZE15); + 3005862: fec42783 lw a5,-20(s0) + 3005866: 0107b793 sltiu a5,a5,16 + 300586a: 9f81 uxtb a5 +} + 300586c: 853e mv a0,a5 + 300586e: 4472 lw s0,28(sp) + 3005870: 6105 addi sp,sp,32 + 3005872: 8082 ret + +03005874 : + * @brief Check UART Oversampling multiple. + * @param multiple Oversampling multiple, @ref UART_OversampleMultiple + * @retval bool + */ +static inline bool IsUartOversampleMultiple(UART_OversampleMultiple multiple) +{ + 3005874: 1101 addi sp,sp,-32 + 3005876: ce22 sw s0,28(sp) + 3005878: 1000 addi s0,sp,32 + 300587a: fea42623 sw a0,-20(s0) + return (multiple >= UART_OVERSAMPLING_16X) && (multiple <= UART_OVERSAMPLING_12X); + 300587e: fec42783 lw a5,-20(s0) + 3005882: 0057b793 sltiu a5,a5,5 + 3005886: 9f81 uxtb a5 +} + 3005888: 853e mv a0,a5 + 300588a: 4472 lw s0,28(sp) + 300588c: 6105 addi sp,sp,32 + 300588e: 8082 ret + +03005890 : +#define PARITY_EVEN 0x6 +#define PARITY_MARK 0x82 +#define PARITY_SPACE 0x86 + +static unsigned int DivClosest(unsigned int x, unsigned int divisor) +{ + 3005890: 7179 addi sp,sp,-48 + 3005892: d622 sw s0,44(sp) + 3005894: 1800 addi s0,sp,48 + 3005896: fca42e23 sw a0,-36(s0) + 300589a: fcb42c23 sw a1,-40(s0) + unsigned int ret; + if (divisor == 0) { + 300589e: fd842783 lw a5,-40(s0) + 30058a2: e399 bnez a5,30058a8 + return 0; + 30058a4: 4781 li a5,0 + 30058a6: a005 j 30058c6 + } + ret = (((x) + ((divisor) / 2)) / (divisor)); /* Round up the result, add 1/2 */ + 30058a8: fd842783 lw a5,-40(s0) + 30058ac: 0017d713 srli a4,a5,0x1 + 30058b0: fdc42783 lw a5,-36(s0) + 30058b4: 973e add a4,a4,a5 + 30058b6: fd842783 lw a5,-40(s0) + 30058ba: 02f757b3 divu a5,a4,a5 + 30058be: fef42623 sw a5,-20(s0) + return ret; + 30058c2: fec42783 lw a5,-20(s0) +} + 30058c6: 853e mv a0,a5 + 30058c8: 5432 lw s0,44(sp) + 30058ca: 6145 addi sp,sp,48 + 30058cc: 8082 ret + +030058ce : + * @brief Sets the parity bit of the UART. + * @param uartHandle UART handle. + * @retval None. + */ +static void UART_SetParityBit(UART_Handle *uartHandle) +{ + 30058ce: 1101 addi sp,sp,-32 + 30058d0: ce22 sw s0,28(sp) + 30058d2: 1000 addi s0,sp,32 + 30058d4: fea42623 sw a0,-20(s0) + /* Sets the UART check mode. */ + switch (uartHandle->parity) { + 30058d8: fec42783 lw a5,-20(s0) + 30058dc: 4b9c lw a5,16(a5) + 30058de: 4711 li a4,4 + 30058e0: 06f76e63 bltu a4,a5,300595c + 30058e4: 00279713 slli a4,a5,0x2 + 30058e8: 030077b7 lui a5,0x3007 + 30058ec: 9fc78793 addi a5,a5,-1540 # 30069fc + 30058f0: 97ba add a5,a5,a4 + 30058f2: 439c lw a5,0(a5) + 30058f4: 8782 jr a5 + case UART_PARITY_ODD: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_ODD; /* Odd parity. */ + 30058f6: fec42783 lw a5,-20(s0) + 30058fa: 439c lw a5,0(a5) + 30058fc: 57d8 lw a4,44(a5) + 30058fe: fec42783 lw a5,-20(s0) + 3005902: 439c lw a5,0(a5) + 3005904: 00276713 ori a4,a4,2 + 3005908: d7d8 sw a4,44(a5) + break; + 300590a: a891 j 300595e + case UART_PARITY_EVEN: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_EVEN; /* Even parity. */ + 300590c: fec42783 lw a5,-20(s0) + 3005910: 439c lw a5,0(a5) + 3005912: 57d8 lw a4,44(a5) + 3005914: fec42783 lw a5,-20(s0) + 3005918: 439c lw a5,0(a5) + 300591a: 00676713 ori a4,a4,6 + 300591e: d7d8 sw a4,44(a5) + break; + 3005920: a83d j 300595e + case UART_PARITY_MARK: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_MARK; /* Marking parity */ + 3005922: fec42783 lw a5,-20(s0) + 3005926: 439c lw a5,0(a5) + 3005928: 57d8 lw a4,44(a5) + 300592a: fec42783 lw a5,-20(s0) + 300592e: 439c lw a5,0(a5) + 3005930: 08276713 ori a4,a4,130 + 3005934: d7d8 sw a4,44(a5) + break; + 3005936: a025 j 300595e + case UART_PARITY_SPACE: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_SPACE; /* space parity */ + 3005938: fec42783 lw a5,-20(s0) + 300593c: 439c lw a5,0(a5) + 300593e: 57d8 lw a4,44(a5) + 3005940: fec42783 lw a5,-20(s0) + 3005944: 439c lw a5,0(a5) + 3005946: 08676713 ori a4,a4,134 + 300594a: d7d8 sw a4,44(a5) + break; + 300594c: a809 j 300595e + case UART_PARITY_NONE: + uartHandle->baseAddress->UART_LCR_H.BIT.pen = BASE_CFG_DISABLE; /* No parity */ + 300594e: fec42783 lw a5,-20(s0) + 3005952: 4398 lw a4,0(a5) + 3005954: 575c lw a5,44(a4) + 3005956: 9bf5 andi a5,a5,-3 + 3005958: d75c sw a5,44(a4) + break; + 300595a: a011 j 300595e + default: + return; + 300595c: 0001 nop + } +} + 300595e: 4472 lw s0,28(sp) + 3005960: 6105 addi sp,sp,32 + 3005962: 8082 ret + +03005964 : + * @brief Initialize the UART hardware configuration and configure parameters based on the specified handle. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_Init(UART_Handle *uartHandle) +{ + 3005964: 7179 addi sp,sp,-48 + 3005966: d606 sw ra,44(sp) + 3005968: d422 sw s0,40(sp) + 300596a: 1800 addi s0,sp,48 + 300596c: fca42e23 sw a0,-36(s0) + UART_ASSERT_PARAM(uartHandle != NULL); + 3005970: fdc42783 lw a5,-36(s0) + 3005974: eb89 bnez a5,3005986 + 3005976: 09700593 li a1,151 + 300597a: 030077b7 lui a5,0x3007 + 300597e: a1078513 addi a0,a5,-1520 # 3006a10 + 3005982: 313d jal ra,30055b0 + 3005984: a001 j 3005984 + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + 3005986: fdc42783 lw a5,-36(s0) + 300598a: 4398 lw a4,0(a5) + 300598c: 140007b7 lui a5,0x14000 + 3005990: 02f70f63 beq a4,a5,30059ce + 3005994: fdc42783 lw a5,-36(s0) + 3005998: 4398 lw a4,0(a5) + 300599a: 140017b7 lui a5,0x14001 + 300599e: 02f70863 beq a4,a5,30059ce + 30059a2: fdc42783 lw a5,-36(s0) + 30059a6: 4398 lw a4,0(a5) + 30059a8: 140027b7 lui a5,0x14002 + 30059ac: 02f70163 beq a4,a5,30059ce + 30059b0: fdc42783 lw a5,-36(s0) + 30059b4: 4398 lw a4,0(a5) + 30059b6: 140037b7 lui a5,0x14003 + 30059ba: 00f70a63 beq a4,a5,30059ce + 30059be: 09800593 li a1,152 + 30059c2: 030077b7 lui a5,0x3007 + 30059c6: a1078513 addi a0,a5,-1520 # 3006a10 + 30059ca: 36dd jal ra,30055b0 + 30059cc: a001 j 30059cc + UART_PARAM_CHECK_WITH_RET(uartHandle->txState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 30059ce: fdc42783 lw a5,-36(s0) + 30059d2: 47bc lw a5,72(a5) + 30059d4: cb91 beqz a5,30059e8 + 30059d6: 09900593 li a1,153 + 30059da: 030077b7 lui a5,0x3007 + 30059de: a1078513 addi a0,a5,-1520 # 3006a10 + 30059e2: 36f9 jal ra,30055b0 + 30059e4: 4785 li a5,1 + 30059e6: ae0d j 3005d18 + UART_PARAM_CHECK_WITH_RET(uartHandle->rxState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 30059e8: fdc42783 lw a5,-36(s0) + 30059ec: 47fc lw a5,76(a5) + 30059ee: cb91 beqz a5,3005a02 + 30059f0: 09a00593 li a1,154 + 30059f4: 030077b7 lui a5,0x3007 + 30059f8: a1078513 addi a0,a5,-1520 # 3006a10 + 30059fc: 3e55 jal ra,30055b0 + 30059fe: 4785 li a5,1 + 3005a00: ae21 j 3005d18 + unsigned int uartClock, quot; + UART_PARAM_CHECK_WITH_RET(IsUartDatalength(uartHandle->dataLength), BASE_STATUS_ERROR); + 3005a02: fdc42783 lw a5,-36(s0) + 3005a06: 479c lw a5,8(a5) + 3005a08: 853e mv a0,a5 + 3005a0a: 3365 jal ra,30057b2 + 3005a0c: 87aa mv a5,a0 + 3005a0e: 0017c793 xori a5,a5,1 + 3005a12: 9f81 uxtb a5 + 3005a14: cb91 beqz a5,3005a28 + 3005a16: 09c00593 li a1,156 + 3005a1a: 030077b7 lui a5,0x3007 + 3005a1e: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a22: 3679 jal ra,30055b0 + 3005a24: 4785 li a5,1 + 3005a26: accd j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartStopbits(uartHandle->stopBits), BASE_STATUS_ERROR); + 3005a28: fdc42783 lw a5,-36(s0) + 3005a2c: 47dc lw a5,12(a5) + 3005a2e: 853e mv a0,a5 + 3005a30: 3b79 jal ra,30057ce + 3005a32: 87aa mv a5,a0 + 3005a34: 0017c793 xori a5,a5,1 + 3005a38: 9f81 uxtb a5 + 3005a3a: cb91 beqz a5,3005a4e + 3005a3c: 09d00593 li a1,157 + 3005a40: 030077b7 lui a5,0x3007 + 3005a44: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a48: 36a5 jal ra,30055b0 + 3005a4a: 4785 li a5,1 + 3005a4c: a4f1 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartParitymode(uartHandle->parity), BASE_STATUS_ERROR); + 3005a4e: fdc42783 lw a5,-36(s0) + 3005a52: 4b9c lw a5,16(a5) + 3005a54: 853e mv a0,a5 + 3005a56: 3355 jal ra,30057fa + 3005a58: 87aa mv a5,a0 + 3005a5a: 0017c793 xori a5,a5,1 + 3005a5e: 9f81 uxtb a5 + 3005a60: cb91 beqz a5,3005a74 + 3005a62: 09e00593 li a1,158 + 3005a66: 030077b7 lui a5,0x3007 + 3005a6a: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a6e: 3689 jal ra,30055b0 + 3005a70: 4785 li a5,1 + 3005a72: a45d j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->txMode), BASE_STATUS_ERROR); + 3005a74: fdc42783 lw a5,-36(s0) + 3005a78: 4bdc lw a5,20(a5) + 3005a7a: 853e mv a0,a5 + 3005a7c: 3345 jal ra,300581c + 3005a7e: 87aa mv a5,a0 + 3005a80: 0017c793 xori a5,a5,1 + 3005a84: 9f81 uxtb a5 + 3005a86: cb91 beqz a5,3005a9a + 3005a88: 09f00593 li a1,159 + 3005a8c: 030077b7 lui a5,0x3007 + 3005a90: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a94: 3e31 jal ra,30055b0 + 3005a96: 4785 li a5,1 + 3005a98: a441 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->rxMode), BASE_STATUS_ERROR); + 3005a9a: fdc42783 lw a5,-36(s0) + 3005a9e: 4f9c lw a5,24(a5) + 3005aa0: 853e mv a0,a5 + 3005aa2: 3bad jal ra,300581c + 3005aa4: 87aa mv a5,a0 + 3005aa6: 0017c793 xori a5,a5,1 + 3005aaa: 9f81 uxtb a5 + 3005aac: cb91 beqz a5,3005ac0 + 3005aae: 0a000593 li a1,160 + 3005ab2: 030077b7 lui a5,0x3007 + 3005ab6: a1078513 addi a0,a5,-1520 # 3006a10 + 3005aba: 3cdd jal ra,30055b0 + 3005abc: 4785 li a5,1 + 3005abe: aca9 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoTxThr), BASE_STATUS_ERROR); + 3005ac0: fdc42783 lw a5,-36(s0) + 3005ac4: 5b9c lw a5,48(a5) + 3005ac6: 853e mv a0,a5 + 3005ac8: 3b41 jal ra,3005858 + 3005aca: 87aa mv a5,a0 + 3005acc: 0017c793 xori a5,a5,1 + 3005ad0: 9f81 uxtb a5 + 3005ad2: cb91 beqz a5,3005ae6 + 3005ad4: 0a100593 li a1,161 + 3005ad8: 030077b7 lui a5,0x3007 + 3005adc: a1078513 addi a0,a5,-1520 # 3006a10 + 3005ae0: 3cc1 jal ra,30055b0 + 3005ae2: 4785 li a5,1 + 3005ae4: ac15 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoRxThr), BASE_STATUS_ERROR); + 3005ae6: fdc42783 lw a5,-36(s0) + 3005aea: 5bdc lw a5,52(a5) + 3005aec: 853e mv a0,a5 + 3005aee: 33ad jal ra,3005858 + 3005af0: 87aa mv a5,a0 + 3005af2: 0017c793 xori a5,a5,1 + 3005af6: 9f81 uxtb a5 + 3005af8: cb91 beqz a5,3005b0c + 3005afa: 0a200593 li a1,162 + 3005afe: 030077b7 lui a5,0x3007 + 3005b02: a1078513 addi a0,a5,-1520 # 3006a10 + 3005b06: 346d jal ra,30055b0 + 3005b08: 4785 li a5,1 + 3005b0a: a439 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartOversampleMultiple(uartHandle->handleEx.overSampleMultiple), BASE_STATUS_ERROR); + 3005b0c: fdc42783 lw a5,-36(s0) + 3005b10: 5fbc lw a5,120(a5) + 3005b12: 853e mv a0,a5 + 3005b14: 3385 jal ra,3005874 + 3005b16: 87aa mv a5,a0 + 3005b18: 0017c793 xori a5,a5,1 + 3005b1c: 9f81 uxtb a5 + 3005b1e: cb91 beqz a5,3005b32 + 3005b20: 0a300593 li a1,163 + 3005b24: 030077b7 lui a5,0x3007 + 3005b28: a1078513 addi a0,a5,-1520 # 3006a10 + 3005b2c: 3451 jal ra,30055b0 + 3005b2e: 4785 li a5,1 + 3005b30: a2e5 j 3005d18 + + uartHandle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; + 3005b32: fdc42783 lw a5,-36(s0) + 3005b36: 4398 lw a4,0(a5) + 3005b38: 5b1c lw a5,48(a4) + 3005b3a: 9bf9 andi a5,a5,-2 + 3005b3c: db1c sw a5,48(a4) + while (uartHandle->baseAddress->UART_FR.BIT.busy == 0x01) { + 3005b3e: 0001 nop + 3005b40: fdc42783 lw a5,-36(s0) + 3005b44: 439c lw a5,0(a5) + 3005b46: 4f9c lw a5,24(a5) + 3005b48: 838d srli a5,a5,0x3 + 3005b4a: 8b85 andi a5,a5,1 + 3005b4c: 0ff7f713 andi a4,a5,255 + 3005b50: 4785 li a5,1 + 3005b52: fef707e3 beq a4,a5,3005b40 + ; + } + + uartClock = HAL_CRG_GetIpFreq((void *)uartHandle->baseAddress); + 3005b56: fdc42783 lw a5,-36(s0) + 3005b5a: 439c lw a5,0(a5) + 3005b5c: 853e mv a0,a5 + 3005b5e: 9f1fd0ef jal ra,300354e + 3005b62: fea42623 sw a0,-20(s0) + + /* DCL OverSample Multiple check */ + uartHandle->baseAddress->UART_SPCFG.BIT.spcfg = uartHandle->handleEx.overSampleMultiple; + 3005b66: fdc42783 lw a5,-36(s0) + 3005b6a: 5fb4 lw a3,120(a5) + 3005b6c: fdc42783 lw a5,-36(s0) + 3005b70: 4398 lw a4,0(a5) + 3005b72: 87b6 mv a5,a3 + 3005b74: 8bbd andi a5,a5,15 + 3005b76: 0ff7f693 andi a3,a5,255 + 3005b7a: 4f3c lw a5,88(a4) + 3005b7c: 8abd andi a3,a3,15 + 3005b7e: 9bc1 andi a5,a5,-16 + 3005b80: 8fd5 or a5,a5,a3 + 3005b82: cf3c sw a5,88(a4) + + /* DCL sequences setting */ + uartHandle->baseAddress->UART_DS.BIT.msbfirst = uartHandle->handleEx.msbFirst; + 3005b84: fdc42783 lw a5,-36(s0) + 3005b88: 4398 lw a4,0(a5) + 3005b8a: fdc42783 lw a5,-36(s0) + 3005b8e: 07c7c683 lbu a3,124(a5) + 3005b92: 4b3c lw a5,80(a4) + 3005b94: 8a85 andi a3,a3,1 + 3005b96: 9bf9 andi a5,a5,-2 + 3005b98: 8fd5 or a5,a5,a3 + 3005b9a: cb3c sw a5,80(a4) + + /* The baud rate divider(BRD) based on the baud rate and clock frequency, calculation formula */ + unsigned int oversample = uartHandle->baseAddress->UART_SPCFG.reg; + 3005b9c: fdc42783 lw a5,-36(s0) + 3005ba0: 439c lw a5,0(a5) + 3005ba2: 4fbc lw a5,88(a5) + 3005ba4: fef42423 sw a5,-24(s0) + if (uartHandle->baudRate > (uartClock / (OVERSAMPLING_PARAM - oversample))) { + 3005ba8: fdc42783 lw a5,-36(s0) + 3005bac: 43d8 lw a4,4(a5) + 3005bae: 46c1 li a3,16 + 3005bb0: fe842783 lw a5,-24(s0) + 3005bb4: 40f687b3 sub a5,a3,a5 + 3005bb8: fec42683 lw a3,-20(s0) + 3005bbc: 02f6d7b3 divu a5,a3,a5 + 3005bc0: 00e7f463 bgeu a5,a4,3005bc8 + return BASE_STATUS_ERROR; + 3005bc4: 4785 li a5,1 + 3005bc6: aa89 j 3005d18 + } else { + unsigned int tmpClock = uartClock / (OVERSAMPLING_PARAM - oversample) * 64; /* 64 is for decimal parts */ + 3005bc8: 4741 li a4,16 + 3005bca: fe842783 lw a5,-24(s0) + 3005bce: 40f707b3 sub a5,a4,a5 + 3005bd2: fec42703 lw a4,-20(s0) + 3005bd6: 02f757b3 divu a5,a4,a5 + 3005bda: 079a slli a5,a5,0x6 + 3005bdc: fef42223 sw a5,-28(s0) + quot = DivClosest(tmpClock, uartHandle->baudRate); + 3005be0: fdc42783 lw a5,-36(s0) + 3005be4: 43dc lw a5,4(a5) + 3005be6: 85be mv a1,a5 + 3005be8: fe442503 lw a0,-28(s0) + 3005bec: 3155 jal ra,3005890 + 3005bee: fea42023 sw a0,-32(s0) + } + /* Clear the baud rate divider register */ + uartHandle->baseAddress->UART_FBRD.reg = 0; + 3005bf2: fdc42783 lw a5,-36(s0) + 3005bf6: 439c lw a5,0(a5) + 3005bf8: 0207a423 sw zero,40(a5) + uartHandle->baseAddress->UART_IBRD.reg = 0; + 3005bfc: fdc42783 lw a5,-36(s0) + 3005c00: 439c lw a5,0(a5) + 3005c02: 0207a223 sw zero,36(a5) + /* The fractional baud rate divider value is stored to the lower 6 bits of the FBRD */ + uartHandle->baseAddress->UART_FBRD.reg = (quot & 0x3F); + 3005c06: fdc42783 lw a5,-36(s0) + 3005c0a: 439c lw a5,0(a5) + 3005c0c: fe042703 lw a4,-32(s0) + 3005c10: 03f77713 andi a4,a4,63 + 3005c14: d798 sw a4,40(a5) + /* Right shift 6 bits is the integer baud rate divider value, is stored to IBRD */ + uartHandle->baseAddress->UART_IBRD.reg = (quot >> 6); + 3005c16: fdc42783 lw a5,-36(s0) + 3005c1a: 439c lw a5,0(a5) + 3005c1c: fe042703 lw a4,-32(s0) + 3005c20: 8319 srli a4,a4,0x6 + 3005c22: d3d8 sw a4,36(a5) + uartHandle->baseAddress->UART_LCR_H.reg = 0; + 3005c24: fdc42783 lw a5,-36(s0) + 3005c28: 439c lw a5,0(a5) + 3005c2a: 0207a623 sw zero,44(a5) + uartHandle->baseAddress->UART_LCR_H.BIT.wlen = uartHandle->dataLength; /* Frame length seting */ + 3005c2e: fdc42783 lw a5,-36(s0) + 3005c32: 4794 lw a3,8(a5) + 3005c34: fdc42783 lw a5,-36(s0) + 3005c38: 4398 lw a4,0(a5) + 3005c3a: 87b6 mv a5,a3 + 3005c3c: 8b8d andi a5,a5,3 + 3005c3e: 0ff7f693 andi a3,a5,255 + 3005c42: 575c lw a5,44(a4) + 3005c44: 8a8d andi a3,a3,3 + 3005c46: 0696 slli a3,a3,0x5 + 3005c48: f9f7f793 andi a5,a5,-97 + 3005c4c: 8fd5 or a5,a5,a3 + 3005c4e: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_LCR_H.BIT.stp2 = uartHandle->stopBits; /* Stop bit seting */ + 3005c50: fdc42783 lw a5,-36(s0) + 3005c54: 47d4 lw a3,12(a5) + 3005c56: fdc42783 lw a5,-36(s0) + 3005c5a: 4398 lw a4,0(a5) + 3005c5c: 87b6 mv a5,a3 + 3005c5e: 8b85 andi a5,a5,1 + 3005c60: 0ff7f693 andi a3,a5,255 + 3005c64: 575c lw a5,44(a4) + 3005c66: 8a85 andi a3,a3,1 + 3005c68: 068e slli a3,a3,0x3 + 3005c6a: 9bdd andi a5,a5,-9 + 3005c6c: 8fd5 or a5,a5,a3 + 3005c6e: d75c sw a5,44(a4) + UART_SetParityBit(uartHandle); + 3005c70: fdc42503 lw a0,-36(s0) + 3005c74: 39a9 jal ra,30058ce + if (uartHandle->fifoMode == true) { /* FIFO threshold setting */ + 3005c76: fdc42783 lw a5,-36(s0) + 3005c7a: 02c7c783 lbu a5,44(a5) + 3005c7e: cbb1 beqz a5,3005cd2 + uartHandle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_ENABLE; + 3005c80: fdc42783 lw a5,-36(s0) + 3005c84: 4398 lw a4,0(a5) + 3005c86: 575c lw a5,44(a4) + 3005c88: 0107e793 ori a5,a5,16 + 3005c8c: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_IFLS.BIT.rxiflsel = uartHandle->fifoRxThr; + 3005c8e: fdc42783 lw a5,-36(s0) + 3005c92: 5bd4 lw a3,52(a5) + 3005c94: fdc42783 lw a5,-36(s0) + 3005c98: 4398 lw a4,0(a5) + 3005c9a: 87b6 mv a5,a3 + 3005c9c: 8bbd andi a5,a5,15 + 3005c9e: 0ff7f693 andi a3,a5,255 + 3005ca2: 5b5c lw a5,52(a4) + 3005ca4: 8abd andi a3,a3,15 + 3005ca6: 06a2 slli a3,a3,0x8 + 3005ca8: 767d lui a2,0xfffff + 3005caa: 0ff60613 addi a2,a2,255 # fffff0ff + 3005cae: 8ff1 and a5,a5,a2 + 3005cb0: 8fd5 or a5,a5,a3 + 3005cb2: db5c sw a5,52(a4) + uartHandle->baseAddress->UART_IFLS.BIT.txiflsel = uartHandle->fifoTxThr; + 3005cb4: fdc42783 lw a5,-36(s0) + 3005cb8: 5b94 lw a3,48(a5) + 3005cba: fdc42783 lw a5,-36(s0) + 3005cbe: 4398 lw a4,0(a5) + 3005cc0: 87b6 mv a5,a3 + 3005cc2: 8bbd andi a5,a5,15 + 3005cc4: 0ff7f693 andi a3,a5,255 + 3005cc8: 5b5c lw a5,52(a4) + 3005cca: 8abd andi a3,a3,15 + 3005ccc: 9bc1 andi a5,a5,-16 + 3005cce: 8fd5 or a5,a5,a3 + 3005cd0: db5c sw a5,52(a4) + } + if (uartHandle->hwFlowCtr == UART_HW_FLOWCTR_ENABLE) { /* Hardwarer flow control setting */ + 3005cd2: fdc42783 lw a5,-36(s0) + 3005cd6: 5f98 lw a4,56(a5) + 3005cd8: 4785 li a5,1 + 3005cda: 00f71c63 bne a4,a5,3005cf2 + uartHandle->baseAddress->UART_CR.reg |= 0xC000; + 3005cde: fdc42783 lw a5,-36(s0) + 3005ce2: 439c lw a5,0(a5) + 3005ce4: 5b94 lw a3,48(a5) + 3005ce6: fdc42783 lw a5,-36(s0) + 3005cea: 439c lw a5,0(a5) + 3005cec: 6731 lui a4,0xc + 3005cee: 8f55 or a4,a4,a3 + 3005cf0: db98 sw a4,48(a5) + } + uartHandle->baseAddress->UART_CR.reg |= 0x301; /* Enable bit use 0x301 is to set txe/rxe/uarten */ + 3005cf2: fdc42783 lw a5,-36(s0) + 3005cf6: 439c lw a5,0(a5) + 3005cf8: 5b98 lw a4,48(a5) + 3005cfa: fdc42783 lw a5,-36(s0) + 3005cfe: 439c lw a5,0(a5) + 3005d00: 30176713 ori a4,a4,769 + 3005d04: db98 sw a4,48(a5) + uartHandle->txState = UART_STATE_READY; + 3005d06: fdc42783 lw a5,-36(s0) + 3005d0a: 4705 li a4,1 + 3005d0c: c7b8 sw a4,72(a5) + uartHandle->rxState = UART_STATE_READY; + 3005d0e: fdc42783 lw a5,-36(s0) + 3005d12: 4705 li a4,1 + 3005d14: c7f8 sw a4,76(a5) + return BASE_STATUS_OK; + 3005d16: 4781 li a5,0 +} + 3005d18: 853e mv a0,a5 + 3005d1a: 50b2 lw ra,44(sp) + 3005d1c: 5422 lw s0,40(sp) + 3005d1e: 6145 addi sp,sp,48 + 3005d20: 8082 ret + +03005d22
: +/* USER CODE BEGIN 1 */ +/* 建议用户定义全局变量、结构体、宏定义或函数声明等 */ +/* USER CODE END 1 */ + +int main(void) +{ + 3005d22: 1141 addi sp,sp,-16 + 3005d24: c606 sw ra,12(sp) + 3005d26: c422 sw s0,8(sp) + 3005d28: 0800 addi s0,sp,16 + /* USER CODE BEGIN 2 */ + /* 建议用户放置初始化代码或启动代码等 */ + /* USER CODE END 2 */ + SystemInit(); + 3005d2a: 2ee5 jal ra,3006122 + /* USER CODE BEGIN 3 */ + /* 建议用户放置初始配置代码 */ + /* USER CODE END 3 */ + while (1) { + 3005d2c: a001 j 3005d2c + +03005d2e : +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + 3005d2e: 715d addi sp,sp,-80 + 3005d30: c686 sw ra,76(sp) + 3005d32: c4a2 sw s0,72(sp) + 3005d34: 0880 addi s0,sp,80 + 3005d36: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3005d3a: 100007b7 lui a5,0x10000 + 3005d3e: fcf42423 sw a5,-56(s0) + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + 3005d42: fc042623 sw zero,-52(s0) + crg.pllPreDiv = CRG_PLL_PREDIV_4; + 3005d46: 478d li a5,3 + 3005d48: fcf42823 sw a5,-48(s0) + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + 3005d4c: 03000793 li a5,48 + 3005d50: fcf42a23 sw a5,-44(s0) + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + 3005d54: 4785 li a5,1 + 3005d56: fcf42c23 sw a5,-40(s0) + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + 3005d5a: 4789 li a5,2 + 3005d5c: fef42023 sw a5,-32(s0) + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + 3005d60: 4789 li a5,2 + 3005d62: fef42223 sw a5,-28(s0) + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + 3005d66: fe042423 sw zero,-24(s0) + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + 3005d6a: 47e1 li a5,24 + 3005d6c: fef42623 sw a5,-20(s0) + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + 3005d70: fc840793 addi a5,s0,-56 + 3005d74: 853e mv a0,a5 + 3005d76: aecfd0ef jal ra,3003062 + 3005d7a: 87aa mv a5,a0 + 3005d7c: c399 beqz a5,3005d82 + return BASE_STATUS_ERROR; + 3005d7e: 4785 li a5,1 + 3005d80: a039 j 3005d8e + } + *coreClkSelect = crg.coreClkSelect; + 3005d82: fe042703 lw a4,-32(s0) + 3005d86: fbc42783 lw a5,-68(s0) + 3005d8a: c398 sw a4,0(a5) + return BASE_STATUS_OK; + 3005d8c: 4781 li a5,0 +} + 3005d8e: 853e mv a0,a5 + 3005d90: 40b6 lw ra,76(sp) + 3005d92: 4426 lw s0,72(sp) + 3005d94: 6161 addi sp,sp,80 + 3005d96: 8082 ret + +03005d98 : + +__weak void ADC0Interrupt2Callback(ADC_Handle *handle) +{ + 3005d98: 1101 addi sp,sp,-32 + 3005d9a: ce22 sw s0,28(sp) + 3005d9c: 1000 addi s0,sp,32 + 3005d9e: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ADC0_CALLBACK_INT2 */ + /* USER CODE END ADC0_CALLBACK_INT2 */ +} + 3005da2: 0001 nop + 3005da4: 4472 lw s0,28(sp) + 3005da6: 6105 addi sp,sp,32 + 3005da8: 8082 ret + +03005daa : + +static void ADC0_Init(void) +{ + 3005daa: 7179 addi sp,sp,-48 + 3005dac: d606 sw ra,44(sp) + 3005dae: d422 sw s0,40(sp) + 3005db0: 1800 addi s0,sp,48 + HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); + 3005db2: 4585 li a1,1 + 3005db4: 18000537 lui a0,0x18000 + 3005db8: 2c49 jal ra,300604a + HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); + 3005dba: 4589 li a1,2 + 3005dbc: 18000537 lui a0,0x18000 + 3005dc0: 94bfd0ef jal ra,300370a + HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_1); + 3005dc4: 4581 li a1,0 + 3005dc6: 18000537 lui a0,0x18000 + 3005dca: 9f7fd0ef jal ra,30037c0 + + g_adc0.baseAddress = ADC0; + 3005dce: 040007b7 lui a5,0x4000 + 3005dd2: 54478793 addi a5,a5,1348 # 4000544 + 3005dd6: 18000737 lui a4,0x18000 + 3005dda: c398 sw a4,0(a5) + g_adc0.socPriority = ADC_PRIMODE_ALL_ROUND; + 3005ddc: 040007b7 lui a5,0x4000 + 3005de0: 54478793 addi a5,a5,1348 # 4000544 + 3005de4: 0007a223 sw zero,4(a5) + + HAL_ADC_Init(&g_adc0); + 3005de8: 040007b7 lui a5,0x4000 + 3005dec: 54478513 addi a0,a5,1348 # 4000544 + 3005df0: c97fb0ef jal ra,3001a86 + + SOC_Param socParam = {0}; + 3005df4: fc042e23 sw zero,-36(s0) + 3005df8: fe042023 sw zero,-32(s0) + 3005dfc: fe042223 sw zero,-28(s0) + 3005e00: fe042423 sw zero,-24(s0) + 3005e04: fe042623 sw zero,-20(s0) + socParam.adcInput = ADC_CH_ADCINA6; /* PIN4(ADC AIN6) */ + 3005e08: 4799 li a5,6 + 3005e0a: fcf42e23 sw a5,-36(s0) + socParam.sampleTotalTime = ADC_SOCSAMPLE_10CLK; /* adc sample total time 10 adc_clk */ + 3005e0e: 4789 li a5,2 + 3005e10: fef42023 sw a5,-32(s0) + socParam.trigSource = ADC_TRIGSOC_SOFT; + 3005e14: fe042223 sw zero,-28(s0) + socParam.continueMode = BASE_CFG_ENABLE; + 3005e18: 4785 li a5,1 + 3005e1a: fef40423 sb a5,-24(s0) + socParam.finishMode = ADC_SOCFINISH_INT2; + 3005e1e: 4795 li a5,5 + 3005e20: fef42623 sw a5,-20(s0) + HAL_ADC_ConfigureSoc(&g_adc0, ADC_SOC_NUM1, &socParam); + 3005e24: fdc40793 addi a5,s0,-36 + 3005e28: 863e mv a2,a5 + 3005e2a: 4585 li a1,1 + 3005e2c: 040007b7 lui a5,0x4000 + 3005e30: 54478513 addi a0,a5,1348 # 4000544 + 3005e34: d09fb0ef jal ra,3001b3c + HAL_ADC_RegisterCallBack(&g_adc0, ADC_CALLBACK_INT2, (ADC_CallbackType)ADC0Interrupt2Callback); + 3005e38: 030067b7 lui a5,0x3006 + 3005e3c: d9878613 addi a2,a5,-616 # 3005d98 + 3005e40: 4589 li a1,2 + 3005e42: 040007b7 lui a5,0x4000 + 3005e46: 54478513 addi a0,a5,1348 # 4000544 + 3005e4a: ab6fc0ef jal ra,3002100 + IRQ_Register(IRQ_ADC0_INT2, HAL_ADC_IrqHandlerInt2, &g_adc0); + 3005e4e: 040007b7 lui a5,0x4000 + 3005e52: 54478613 addi a2,a5,1348 # 4000544 + 3005e56: 030027b7 lui a5,0x3002 + 3005e5a: 03678593 addi a1,a5,54 # 3002036 + 3005e5e: 05f00513 li a0,95 + 3005e62: d88fc0ef jal ra,30023ea + IRQ_SetPriority(IRQ_ADC0_INT2, 1); /* 1 is priority value */ + 3005e66: 4585 li a1,1 + 3005e68: 05f00513 li a0,95 + 3005e6c: d53fc0ef jal ra,3002bbe + IRQ_EnableN(IRQ_ADC0_INT2); + 3005e70: 05f00513 li a0,95 + 3005e74: dfcfc0ef jal ra,3002470 +} + 3005e78: 0001 nop + 3005e7a: 50b2 lw ra,44(sp) + 3005e7c: 5422 lw s0,40(sp) + 3005e7e: 6145 addi sp,sp,48 + 3005e80: 8082 ret + +03005e82 : + /* USER CODE BEGIN TIMER3_InterruptProcess */ + /* USER CODE END TIMER3_InterruptProcess */ +} + +static void TIMER3_Init(void) +{ + 3005e82: 1101 addi sp,sp,-32 + 3005e84: ce06 sw ra,28(sp) + 3005e86: cc22 sw s0,24(sp) + 3005e88: 1000 addi s0,sp,32 + HAL_CRG_IpEnableSet(TIMER3_BASE, IP_CLK_ENABLE); /* TIMER3 clock enable. */ + 3005e8a: 4585 li a1,1 + 3005e8c: 14303537 lui a0,0x14303 + 3005e90: 2a6d jal ra,300604a + unsigned int load = (HAL_CRG_GetIpFreq((void *)TIMER3) / (1u << (TIMERPRESCALER_NO_DIV * 4)) / 1000000u) * 10; + 3005e92: 14303537 lui a0,0x14303 + 3005e96: eb8fd0ef jal ra,300354e + 3005e9a: 872a mv a4,a0 + 3005e9c: 000f47b7 lui a5,0xf4 + 3005ea0: 24078793 addi a5,a5,576 # f4240 + 3005ea4: 02f75733 divu a4,a4,a5 + 3005ea8: 47a9 li a5,10 + 3005eaa: 02f707b3 mul a5,a4,a5 + 3005eae: fef42623 sw a5,-20(s0) + + g_timer3.baseAddress = TIMER3; + 3005eb2: 040007b7 lui a5,0x4000 + 3005eb6: 49c78793 addi a5,a5,1180 # 400049c + 3005eba: 14303737 lui a4,0x14303 + 3005ebe: c398 sw a4,0(a5) + g_timer3.load = load - 1; /* Set timer value immediately */ + 3005ec0: fec42783 lw a5,-20(s0) + 3005ec4: fff78713 addi a4,a5,-1 + 3005ec8: 040007b7 lui a5,0x4000 + 3005ecc: 49c78793 addi a5,a5,1180 # 400049c + 3005ed0: cbd8 sw a4,20(a5) + g_timer3.bgLoad = load - 1; /* Set timer value */ + 3005ed2: fec42783 lw a5,-20(s0) + 3005ed6: fff78713 addi a4,a5,-1 + 3005eda: 040007b7 lui a5,0x4000 + 3005ede: 49c78793 addi a5,a5,1180 # 400049c + 3005ee2: cf98 sw a4,24(a5) + g_timer3.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ + 3005ee4: 040007b7 lui a5,0x4000 + 3005ee8: 49c78793 addi a5,a5,1180 # 400049c + 3005eec: 4705 li a4,1 + 3005eee: c798 sw a4,8(a5) + g_timer3.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ + 3005ef0: 040007b7 lui a5,0x4000 + 3005ef4: 49c78793 addi a5,a5,1180 # 400049c + 3005ef8: 0007a623 sw zero,12(a5) + g_timer3.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ + 3005efc: 040007b7 lui a5,0x4000 + 3005f00: 49c78793 addi a5,a5,1180 # 400049c + 3005f04: 4705 li a4,1 + 3005f06: cb98 sw a4,16(a5) + g_timer3.interruptEn = BASE_CFG_ENABLE; + 3005f08: 040007b7 lui a5,0x4000 + 3005f0c: 49c78793 addi a5,a5,1180 # 400049c + 3005f10: 4705 li a4,1 + 3005f12: afd8 sb a4,28(a5) + g_timer3.adcSocReqEnable = BASE_CFG_DISABLE; + 3005f14: 040007b7 lui a5,0x4000 + 3005f18: 49c78793 addi a5,a5,1180 # 400049c + 3005f1c: 00078ea3 sb zero,29(a5) + g_timer3.dmaReqEnable = BASE_CFG_DISABLE; + 3005f20: 040007b7 lui a5,0x4000 + 3005f24: 49c78793 addi a5,a5,1180 # 400049c + 3005f28: 00078f23 sb zero,30(a5) + HAL_TIMER_Init(&g_timer3); + 3005f2c: 040007b7 lui a5,0x4000 + 3005f30: 49c78513 addi a0,a5,1180 # 400049c + 3005f34: c2aff0ef jal ra,300535e + IRQ_Register(IRQ_TIMER3, HAL_TIMER_IrqHandler, &g_timer3); + 3005f38: 040007b7 lui a5,0x4000 + 3005f3c: 49c78613 addi a2,a5,1180 # 400049c + 3005f40: 030057b7 lui a5,0x3005 + 3005f44: 63678593 addi a1,a5,1590 # 3005636 + 3005f48: 02300513 li a0,35 + 3005f4c: c9efc0ef jal ra,30023ea + + HAL_TIMER_RegisterCallback(&g_timer3, TIMER_PERIOD_FIN, TIMER3_InterruptProcess); + 3005f50: 030067b7 lui a5,0x3006 + 3005f54: 16278613 addi a2,a5,354 # 3006162 + 3005f58: 4581 li a1,0 + 3005f5a: 040007b7 lui a5,0x4000 + 3005f5e: 49c78513 addi a0,a5,1180 # 400049c + 3005f62: fbcff0ef jal ra,300571e + IRQ_SetPriority(IRQ_TIMER3, 1); /* 1 is priority value */ + 3005f66: 4585 li a1,1 + 3005f68: 02300513 li a0,35 + 3005f6c: c53fc0ef jal ra,3002bbe + IRQ_EnableN(IRQ_TIMER3); + 3005f70: 02300513 li a0,35 + 3005f74: cfcfc0ef jal ra,3002470 +} + 3005f78: 0001 nop + 3005f7a: 40f2 lw ra,28(sp) + 3005f7c: 4462 lw s0,24(sp) + 3005f7e: 6105 addi sp,sp,32 + 3005f80: 8082 ret + +03005f82 : + +static void UART0_Init(void) +{ + 3005f82: 1141 addi sp,sp,-16 + 3005f84: c606 sw ra,12(sp) + 3005f86: c422 sw s0,8(sp) + 3005f88: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + 3005f8a: 4585 li a1,1 + 3005f8c: 14000537 lui a0,0x14000 + 3005f90: 286d jal ra,300604a + g_uart0.baseAddress = UART0; + 3005f92: 040007b7 lui a5,0x4000 + 3005f96: 4c478793 addi a5,a5,1220 # 40004c4 + 3005f9a: 14000737 lui a4,0x14000 + 3005f9e: c398 sw a4,0(a5) + + g_uart0.baudRate = UART0_BAND_RATE; + 3005fa0: 040007b7 lui a5,0x4000 + 3005fa4: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fa8: 6771 lui a4,0x1c + 3005faa: 20070713 addi a4,a4,512 # 1c200 + 3005fae: c3d8 sw a4,4(a5) + g_uart0.dataLength = UART_DATALENGTH_8BIT; + 3005fb0: 040007b7 lui a5,0x4000 + 3005fb4: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fb8: 470d li a4,3 + 3005fba: c798 sw a4,8(a5) + g_uart0.stopBits = UART_STOPBITS_ONE; + 3005fbc: 040007b7 lui a5,0x4000 + 3005fc0: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fc4: 0007a623 sw zero,12(a5) + g_uart0.parity = UART_PARITY_NONE; + 3005fc8: 040007b7 lui a5,0x4000 + 3005fcc: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fd0: 4711 li a4,4 + 3005fd2: cb98 sw a4,16(a5) + g_uart0.txMode = UART_MODE_BLOCKING; + 3005fd4: 040007b7 lui a5,0x4000 + 3005fd8: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fdc: 0007aa23 sw zero,20(a5) + g_uart0.rxMode = UART_MODE_BLOCKING; + 3005fe0: 040007b7 lui a5,0x4000 + 3005fe4: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fe8: 0007ac23 sw zero,24(a5) + g_uart0.fifoMode = BASE_CFG_ENABLE; + 3005fec: 040007b7 lui a5,0x4000 + 3005ff0: 4c478793 addi a5,a5,1220 # 40004c4 + 3005ff4: 4705 li a4,1 + 3005ff6: 02e78623 sb a4,44(a5) + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + 3005ffa: 040007b7 lui a5,0x4000 + 3005ffe: 4c478793 addi a5,a5,1220 # 40004c4 + 3006002: 4721 li a4,8 + 3006004: db98 sw a4,48(a5) + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + 3006006: 040007b7 lui a5,0x4000 + 300600a: 4c478793 addi a5,a5,1220 # 40004c4 + 300600e: 4721 li a4,8 + 3006010: dbd8 sw a4,52(a5) + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + 3006012: 040007b7 lui a5,0x4000 + 3006016: 4c478793 addi a5,a5,1220 # 40004c4 + 300601a: 0207ac23 sw zero,56(a5) + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + 300601e: 040007b7 lui a5,0x4000 + 3006022: 4c478793 addi a5,a5,1220 # 40004c4 + 3006026: 0607ac23 sw zero,120(a5) + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + 300602a: 040007b7 lui a5,0x4000 + 300602e: 4c478793 addi a5,a5,1220 # 40004c4 + 3006032: 06078e23 sb zero,124(a5) + HAL_UART_Init(&g_uart0); + 3006036: 040007b7 lui a5,0x4000 + 300603a: 4c478513 addi a0,a5,1220 # 40004c4 + 300603e: 321d jal ra,3005964 +} + 3006040: 0001 nop + 3006042: 40b2 lw ra,12(sp) + 3006044: 4422 lw s0,8(sp) + 3006046: 0141 addi sp,sp,16 + 3006048: 8082 ret + +0300604a : + 300604a: de8fd06f j 3003632 + +0300604e : + +static void IOConfig(void) +{ + 300604e: 1141 addi sp,sp,-16 + 3006050: c606 sw ra,12(sp) + 3006052: c422 sw s0,8(sp) + 3006054: 0800 addi s0,sp,16 + /* Config PIN4 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_ADC_AIN6); /* Check function selection */ + 3006056: 010c07b7 lui a5,0x10c0 + 300605a: 23c78513 addi a0,a5,572 # 10c023c + 300605e: 20c1 jal ra,300611e + HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_ADC_AIN6, PULL_NONE); /* Pull-up and Pull-down */ + 3006060: 4581 li a1,0 + 3006062: 010c07b7 lui a5,0x10c0 + 3006066: 23c78513 addi a0,a5,572 # 10c023c + 300606a: 2845 jal ra,300611a + HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_ADC_AIN6, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 300606c: 4581 li a1,0 + 300606e: 010c07b7 lui a5,0x10c0 + 3006072: 23c78513 addi a0,a5,572 # 10c023c + 3006076: 2045 jal ra,3006116 + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_ADC_AIN6, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3006078: 4585 li a1,1 + 300607a: 010c07b7 lui a5,0x10c0 + 300607e: 23c78513 addi a0,a5,572 # 10c023c + 3006082: 2841 jal ra,3006112 + HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_ADC_AIN6, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3006084: 4589 li a1,2 + 3006086: 010c07b7 lui a5,0x10c0 + 300608a: 23c78513 addi a0,a5,572 # 10c023c + 300608e: 2041 jal ra,300610e + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + 3006090: 019007b7 lui a5,0x1900 + 3006094: 23378513 addi a0,a5,563 # 1900233 + 3006098: 2059 jal ra,300611e + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + 300609a: 4581 li a1,0 + 300609c: 019007b7 lui a5,0x1900 + 30060a0: 23378513 addi a0,a5,563 # 1900233 + 30060a4: 289d jal ra,300611a + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 30060a6: 4581 li a1,0 + 30060a8: 019007b7 lui a5,0x1900 + 30060ac: 23378513 addi a0,a5,563 # 1900233 + 30060b0: 209d jal ra,3006116 + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 30060b2: 4585 li a1,1 + 30060b4: 019007b7 lui a5,0x1900 + 30060b8: 23378513 addi a0,a5,563 # 1900233 + 30060bc: 2899 jal ra,3006112 + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 30060be: 4589 li a1,2 + 30060c0: 019007b7 lui a5,0x1900 + 30060c4: 23378513 addi a0,a5,563 # 1900233 + 30060c8: 2099 jal ra,300610e + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + 30060ca: 019407b7 lui a5,0x1940 + 30060ce: 23378513 addi a0,a5,563 # 1940233 + 30060d2: 20b1 jal ra,300611e + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + 30060d4: 4589 li a1,2 + 30060d6: 019407b7 lui a5,0x1940 + 30060da: 23378513 addi a0,a5,563 # 1940233 + 30060de: 2835 jal ra,300611a + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 30060e0: 4581 li a1,0 + 30060e2: 019407b7 lui a5,0x1940 + 30060e6: 23378513 addi a0,a5,563 # 1940233 + 30060ea: 2035 jal ra,3006116 + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 30060ec: 4585 li a1,1 + 30060ee: 019407b7 lui a5,0x1940 + 30060f2: 23378513 addi a0,a5,563 # 1940233 + 30060f6: 2831 jal ra,3006112 + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 30060f8: 4589 li a1,2 + 30060fa: 019407b7 lui a5,0x1940 + 30060fe: 23378513 addi a0,a5,563 # 1940233 + 3006102: 2031 jal ra,300610e +} + 3006104: 0001 nop + 3006106: 40b2 lw ra,12(sp) + 3006108: 4422 lw s0,8(sp) + 300610a: 0141 addi sp,sp,16 + 300610c: 8082 ret + +0300610e : + 300610e: 924ff06f j 3005232 + +03006112 : + 3006112: 8d4ff06f j 30051e6 + +03006116 : + 3006116: 884ff06f j 300519a + +0300611a : + 300611a: 834ff06f j 300514e + +0300611e : + 300611e: ff7fe06f j 3005114 + +03006122 : + +void SystemInit(void) +{ + 3006122: 1141 addi sp,sp,-16 + 3006124: c606 sw ra,12(sp) + 3006126: c422 sw s0,8(sp) + 3006128: 0800 addi s0,sp,16 + IOConfig(); + 300612a: 3715 jal ra,300604e + UART0_Init(); + 300612c: 3d99 jal ra,3005f82 + ADC0_Init(); + 300612e: 39b5 jal ra,3005daa + TIMER3_Init(); + 3006130: 3b89 jal ra,3005e82 + + /* USER CODE BEGIN system_init */ + HAL_TIMER_Start(&g_timer3); + 3006132: 040007b7 lui a5,0x4000 + 3006136: 49c78513 addi a0,a5,1180 # 400049c + 300613a: c7aff0ef jal ra,30055b4 + HAL_ADC_StartIt(&g_adc0); + 300613e: 040007b7 lui a5,0x4000 + 3006142: 54478513 addi a0,a5,1348 # 4000544 + 3006146: ba9fb0ef jal ra,3001cee + HAL_ADC_SoftTrigSample(&g_adc0, ADC_SOC_NUM1); + 300614a: 4585 li a1,1 + 300614c: 040007b7 lui a5,0x4000 + 3006150: 54478513 addi a0,a5,1348 # 4000544 + 3006154: cc7fb0ef jal ra,3001e1a + /* USER CODE END system_init */ + 3006158: 0001 nop + 300615a: 40b2 lw ra,12(sp) + 300615c: 4422 lw s0,8(sp) + 300615e: 0141 addi sp,sp,16 + 3006160: 8082 ret + +03006162 : +float adc_num[adc_shownum]={0}; +unsigned int i=0; + + +void TIMER3_InterruptProcess(void *handle) +{ + 3006162: 7179 addi sp,sp,-48 + 3006164: d606 sw ra,44(sp) + 3006166: d422 sw s0,40(sp) + 3006168: 1800 addi s0,sp,48 + 300616a: fca42e23 sw a0,-36(s0) + unsigned int ret = HAL_ADC_GetConvResult(&g_adc0, ADC_SOC_NUM1); + 300616e: 4585 li a1,1 + 3006170: 040007b7 lui a5,0x4000 + 3006174: 54478513 addi a0,a5,1348 # 4000544 + 3006178: d25fb0ef jal ra,3001e9c + 300617c: fea42623 sw a0,-20(s0) + + + adc_num[i] = (float)ret / (float)4096 * 3.3; + 3006180: fec42783 lw a5,-20(s0) + 3006184: d017f753 fcvt.s.wu fa4,a5 + 3006188: 030077b7 lui a5,0x3007 + 300618c: a387a787 flw fa5,-1480(a5) # 3006a38 + 3006190: 18f77753 fdiv.s fa4,fa4,fa5 + 3006194: 040027b7 lui a5,0x4002 + 3006198: 2047a783 lw a5,516(a5) # 4002204 + 300619c: 03007737 lui a4,0x3007 + 30061a0: a3c72787 flw fa5,-1476(a4) # 3006a3c + 30061a4: 10f777d3 fmul.s fa5,fa4,fa5 + 30061a8: 04000737 lui a4,0x4000 + 30061ac: 5e470713 addi a4,a4,1508 # 40005e4 + 30061b0: 078a slli a5,a5,0x2 + 30061b2: 97ba add a5,a5,a4 + 30061b4: e39c fsw fa5,0(a5) + i++; + 30061b6: 040027b7 lui a5,0x4002 + 30061ba: 2047a783 lw a5,516(a5) # 4002204 + 30061be: 00178713 addi a4,a5,1 + 30061c2: 040027b7 lui a5,0x4002 + 30061c6: 20e7a223 sw a4,516(a5) # 4002204 + if(i>adc_shownum){ + 30061ca: 040027b7 lui a5,0x4002 + 30061ce: 2047a703 lw a4,516(a5) # 4002204 + 30061d2: 70800793 li a5,1800 + 30061d6: 06e7f563 bgeu a5,a4,3006240 + for(i=0;i + 30061e2: a099 j 3006228 + { + DBG_PRINTF("V:%.2f\r\n", adc_num[i]); + 30061e4: 040027b7 lui a5,0x4002 + 30061e8: 2047a783 lw a5,516(a5) # 4002204 + 30061ec: 04000737 lui a4,0x4000 + 30061f0: 5e470713 addi a4,a4,1508 # 40005e4 + 30061f4: 078a slli a5,a5,0x2 + 30061f6: 97ba add a5,a5,a4 + 30061f8: 639c flw fa5,0(a5) + 30061fa: 20f78553 fmv.s fa0,fa5 + 30061fe: 20b1 jal ra,300624a <__extendsfdf2> + 3006200: 87aa mv a5,a0 + 3006202: 882e mv a6,a1 + 3006204: 863e mv a2,a5 + 3006206: 86c2 mv a3,a6 + 3006208: 030077b7 lui a5,0x3007 + 300620c: a2c78513 addi a0,a5,-1492 # 3006a2c + 3006210: b31fe0ef jal ra,3004d40 + for(i=0;i + 300621c: 00178713 addi a4,a5,1 + 3006220: 040027b7 lui a5,0x4002 + 3006224: 20e7a223 sw a4,516(a5) # 4002204 + 3006228: 040027b7 lui a5,0x4002 + 300622c: 2047a703 lw a4,516(a5) # 4002204 + 3006230: 70700793 li a5,1799 + 3006234: fae7f8e3 bgeu a5,a4,30061e4 + } + i=0; + 3006238: 040027b7 lui a5,0x4002 + 300623c: 2007a223 sw zero,516(a5) # 4002204 + } + +} + 3006240: 0001 nop + 3006242: 50b2 lw ra,44(sp) + 3006244: 5422 lw s0,40(sp) + 3006246: 6145 addi sp,sp,48 + 3006248: 8082 ret + +0300624a <__extendsfdf2>: + 300624a: 1141 addi sp,sp,-16 + 300624c: c606 sw ra,12(sp) + 300624e: c422 sw s0,8(sp) + 3006250: c226 sw s1,4(sp) + 3006252: e00506d3 fmv.x.w a3,fa0 + 3006256: 002027f3 frrm a5 + 300625a: 0176d513 srli a0,a3,0x17 + 300625e: 0ff57513 andi a0,a0,255 + 3006262: 00800437 lui s0,0x800 + 3006266: 00150793 addi a5,a0,1 # 14000001 + 300626a: 147d addi s0,s0,-1 # 7fffff + 300626c: 0ff7f793 andi a5,a5,255 + 3006270: 4705 li a4,1 + 3006272: 8c75 and s0,s0,a3 + 3006274: 01f6d493 srli s1,a3,0x1f + 3006278: 00f75963 bge a4,a5,300628a <__extendsfdf2+0x40> + 300627c: 00345793 srli a5,s0,0x3 + 3006280: 38050513 addi a0,a0,896 + 3006284: 0476 slli s0,s0,0x1d + 3006286: 4701 li a4,0 + 3006288: a891 j 30062dc <__extendsfdf2+0x92> + 300628a: e915 bnez a0,30062be <__extendsfdf2+0x74> + 300628c: c459 beqz s0,300631a <__extendsfdf2+0xd0> + 300628e: 8522 mv a0,s0 + 3006290: 2c6d jal ra,300654a <__clzsi2> + 3006292: 47a9 li a5,10 + 3006294: 00a7cf63 blt a5,a0,30062b2 <__extendsfdf2+0x68> + 3006298: 47ad li a5,11 + 300629a: 8f89 sub a5,a5,a0 + 300629c: 01550713 addi a4,a0,21 + 30062a0: 00f457b3 srl a5,s0,a5 + 30062a4: 00e41433 sll s0,s0,a4 + 30062a8: 38900713 li a4,905 + 30062ac: 40a70533 sub a0,a4,a0 + 30062b0: bfd9 j 3006286 <__extendsfdf2+0x3c> + 30062b2: ff550793 addi a5,a0,-11 + 30062b6: 00f417b3 sll a5,s0,a5 + 30062ba: 4401 li s0,0 + 30062bc: b7f5 j 30062a8 <__extendsfdf2+0x5e> + 30062be: c02d beqz s0,3006320 <__extendsfdf2+0xd6> + 30062c0: 00400737 lui a4,0x400 + 30062c4: 8f61 and a4,a4,s0 + 30062c6: 00345793 srli a5,s0,0x3 + 30062ca: 00173713 seqz a4,a4 + 30062ce: 000806b7 lui a3,0x80 + 30062d2: 0712 slli a4,a4,0x4 + 30062d4: 0476 slli s0,s0,0x1d + 30062d6: 8fd5 or a5,a5,a3 + 30062d8: 7ff00513 li a0,2047 + 30062dc: 00100637 lui a2,0x100 + 30062e0: 167d addi a2,a2,-1 # fffff + 30062e2: 8ff1 and a5,a5,a2 + 30062e4: 80100637 lui a2,0x80100 + 30062e8: 167d addi a2,a2,-1 # 800fffff + 30062ea: 7ff57513 andi a0,a0,2047 + 30062ee: 0552 slli a0,a0,0x14 + 30062f0: 8ff1 and a5,a5,a2 + 30062f2: 80000637 lui a2,0x80000 + 30062f6: 8fc9 or a5,a5,a0 + 30062f8: fff64613 not a2,a2 + 30062fc: 01f49693 slli a3,s1,0x1f + 3006300: 8ff1 and a5,a5,a2 + 3006302: 00d7e633 or a2,a5,a3 + 3006306: 8522 mv a0,s0 + 3006308: 85b2 mv a1,a2 + 300630a: c319 beqz a4,3006310 <__extendsfdf2+0xc6> + 300630c: 00172073 csrs fflags,a4 + 3006310: 40b2 lw ra,12(sp) + 3006312: 4422 lw s0,8(sp) + 3006314: 4492 lw s1,4(sp) + 3006316: 0141 addi sp,sp,16 + 3006318: 8082 ret + 300631a: 4781 li a5,0 + 300631c: 4501 li a0,0 + 300631e: b7a5 j 3006286 <__extendsfdf2+0x3c> + 3006320: 4781 li a5,0 + 3006322: 7ff00513 li a0,2047 + 3006326: b785 j 3006286 <__extendsfdf2+0x3c> + +03006328 <__truncdfsf2>: + 3006328: 00202873 frrm a6 + 300632c: 001006b7 lui a3,0x100 + 3006330: 16fd addi a3,a3,-1 # fffff + 3006332: 8eed and a3,a3,a1 + 3006334: 0145d893 srli a7,a1,0x14 + 3006338: 00369793 slli a5,a3,0x3 + 300633c: 7ff8f893 andi a7,a7,2047 + 3006340: 01d55693 srli a3,a0,0x1d + 3006344: 8edd or a3,a3,a5 + 3006346: 00188793 addi a5,a7,1 + 300634a: 7ff7f793 andi a5,a5,2047 + 300634e: 4705 li a4,1 + 3006350: 81fd srli a1,a1,0x1f + 3006352: 00351613 slli a2,a0,0x3 + 3006356: 16f75b63 bge a4,a5,30064cc <__truncdfsf2+0x1a4> + 300635a: c8088713 addi a4,a7,-896 + 300635e: 0fe00793 li a5,254 + 3006362: 0ae7d063 bge a5,a4,3006402 <__truncdfsf2+0xda> + 3006366: 04080063 beqz a6,30063a6 <__truncdfsf2+0x7e> + 300636a: 478d li a5,3 + 300636c: 02f81963 bne a6,a5,300639e <__truncdfsf2+0x76> + 3006370: c99d beqz a1,30063a6 <__truncdfsf2+0x7e> + 3006372: 57fd li a5,-1 + 3006374: 0fe00713 li a4,254 + 3006378: 4681 li a3,0 + 300637a: 4615 li a2,5 + 300637c: 4509 li a0,2 + 300637e: 00166613 ori a2,a2,1 + 3006382: 1aa80063 beq a6,a0,3006522 <__truncdfsf2+0x1fa> + 3006386: 450d li a0,3 + 3006388: 18a80a63 beq a6,a0,300651c <__truncdfsf2+0x1f4> + 300638c: 12081763 bnez a6,30064ba <__truncdfsf2+0x192> + 3006390: 00f7f513 andi a0,a5,15 + 3006394: 4891 li a7,4 + 3006396: 13150263 beq a0,a7,30064ba <__truncdfsf2+0x192> + 300639a: 0791 addi a5,a5,4 + 300639c: aa39 j 30064ba <__truncdfsf2+0x192> + 300639e: 4789 li a5,2 + 30063a0: fcf819e3 bne a6,a5,3006372 <__truncdfsf2+0x4a> + 30063a4: d5f9 beqz a1,3006372 <__truncdfsf2+0x4a> + 30063a6: 4781 li a5,0 + 30063a8: 0ff00713 li a4,255 + 30063ac: 4615 li a2,5 + 30063ae: 00579693 slli a3,a5,0x5 + 30063b2: 0006db63 bgez a3,30063c8 <__truncdfsf2+0xa0> + 30063b6: 0705 addi a4,a4,1 # 400001 + 30063b8: 0ff00693 li a3,255 + 30063bc: 16d70563 beq a4,a3,3006526 <__truncdfsf2+0x1fe> + 30063c0: fc0006b7 lui a3,0xfc000 + 30063c4: 16fd addi a3,a3,-1 # fbffffff + 30063c6: 8ff5 and a5,a5,a3 + 30063c8: 0ff00693 li a3,255 + 30063cc: 838d srli a5,a5,0x3 + 30063ce: 00d71663 bne a4,a3,30063da <__truncdfsf2+0xb2> + 30063d2: c781 beqz a5,30063da <__truncdfsf2+0xb2> + 30063d4: 004007b7 lui a5,0x400 + 30063d8: 4581 li a1,0 + 30063da: 008006b7 lui a3,0x800 + 30063de: 16fd addi a3,a3,-1 # 7fffff + 30063e0: 8ff5 and a5,a5,a3 + 30063e2: 808006b7 lui a3,0x80800 + 30063e6: 0ff77713 andi a4,a4,255 + 30063ea: 16fd addi a3,a3,-1 # 807fffff + 30063ec: 075e slli a4,a4,0x17 + 30063ee: 8ff5 and a5,a5,a3 + 30063f0: 05fe slli a1,a1,0x1f + 30063f2: 8fd9 or a5,a5,a4 + 30063f4: 8fcd or a5,a5,a1 + 30063f6: c219 beqz a2,30063fc <__truncdfsf2+0xd4> + 30063f8: 00162073 csrs fflags,a2 + 30063fc: f0078553 fmv.w.x fa0,a5 + 3006400: 8082 ret + 3006402: 08e04e63 bgtz a4,300649e <__truncdfsf2+0x176> + 3006406: 57a5 li a5,-23 + 3006408: 0ef74d63 blt a4,a5,3006502 <__truncdfsf2+0x1da> + 300640c: 008007b7 lui a5,0x800 + 3006410: 4379 li t1,30 + 3006412: 8edd or a3,a3,a5 + 3006414: 40e30333 sub t1,t1,a4 + 3006418: 47fd li a5,31 + 300641a: 0467ce63 blt a5,t1,3006476 <__truncdfsf2+0x14e> + 300641e: c8288893 addi a7,a7,-894 + 3006422: 011617b3 sll a5,a2,a7 + 3006426: 00f037b3 snez a5,a5 + 300642a: 011696b3 sll a3,a3,a7 + 300642e: 00665333 srl t1,a2,t1 + 3006432: 8edd or a3,a3,a5 + 3006434: 00d367b3 or a5,t1,a3 + 3006438: 4701 li a4,0 + 300643a: cff9 beqz a5,3006518 <__truncdfsf2+0x1f0> + 300643c: 00179713 slli a4,a5,0x1 + 3006440: 00777693 andi a3,a4,7 + 3006444: 4601 li a2,0 + 3006446: c28d beqz a3,3006468 <__truncdfsf2+0x140> + 3006448: 4689 li a3,2 + 300644a: 0cd80263 beq a6,a3,300650e <__truncdfsf2+0x1e6> + 300644e: 468d li a3,3 + 3006450: 0ad80b63 beq a6,a3,3006506 <__truncdfsf2+0x1de> + 3006454: 4605 li a2,1 + 3006456: 00081963 bnez a6,3006468 <__truncdfsf2+0x140> + 300645a: 00f77693 andi a3,a4,15 + 300645e: 4511 li a0,4 + 3006460: 4605 li a2,1 + 3006462: 00a68363 beq a3,a0,3006468 <__truncdfsf2+0x140> + 3006466: 0711 addi a4,a4,4 + 3006468: 01b75693 srli a3,a4,0x1b + 300646c: 0016c693 xori a3,a3,1 + 3006470: 8a85 andi a3,a3,1 + 3006472: 4701 li a4,0 + 3006474: a83d j 30064b2 <__truncdfsf2+0x18a> + 3006476: 57f9 li a5,-2 + 3006478: 40e78733 sub a4,a5,a4 + 300647c: 02000793 li a5,32 + 3006480: 00e6d733 srl a4,a3,a4 + 3006484: 4501 li a0,0 + 3006486: 00f30663 beq t1,a5,3006492 <__truncdfsf2+0x16a> + 300648a: ca288893 addi a7,a7,-862 + 300648e: 01169533 sll a0,a3,a7 + 3006492: 00c567b3 or a5,a0,a2 + 3006496: 00f037b3 snez a5,a5 + 300649a: 8fd9 or a5,a5,a4 + 300649c: bf71 j 3006438 <__truncdfsf2+0x110> + 300649e: 051a slli a0,a0,0x6 + 30064a0: 00a037b3 snez a5,a0 + 30064a4: 068e slli a3,a3,0x3 + 30064a6: 8275 srli a2,a2,0x1d + 30064a8: 8edd or a3,a3,a5 + 30064aa: 00c6e7b3 or a5,a3,a2 + 30064ae: 4681 li a3,0 + 30064b0: 4601 li a2,0 + 30064b2: 0077f513 andi a0,a5,7 + 30064b6: ec0513e3 bnez a0,300637c <__truncdfsf2+0x54> + 30064ba: ee068ae3 beqz a3,30063ae <__truncdfsf2+0x86> + 30064be: 00167693 andi a3,a2,1 + 30064c2: ee0686e3 beqz a3,30063ae <__truncdfsf2+0x86> + 30064c6: 00266613 ori a2,a2,2 + 30064ca: b5d5 j 30063ae <__truncdfsf2+0x86> + 30064cc: 00c6e7b3 or a5,a3,a2 + 30064d0: 00089563 bnez a7,30064da <__truncdfsf2+0x1b2> + 30064d4: 00f037b3 snez a5,a5 + 30064d8: b785 j 3006438 <__truncdfsf2+0x110> + 30064da: cf8d beqz a5,3006514 <__truncdfsf2+0x1ec> + 30064dc: 7ff00793 li a5,2047 + 30064e0: 4601 li a2,0 + 30064e2: 00f89863 bne a7,a5,30064f2 <__truncdfsf2+0x1ca> + 30064e6: 00400637 lui a2,0x400 + 30064ea: 8e75 and a2,a2,a3 + 30064ec: 00163613 seqz a2,a2 + 30064f0: 0612 slli a2,a2,0x4 + 30064f2: 068e slli a3,a3,0x3 + 30064f4: 020007b7 lui a5,0x2000 + 30064f8: 8fd5 or a5,a5,a3 + 30064fa: 0ff00713 li a4,255 + 30064fe: 4681 li a3,0 + 3006500: bf4d j 30064b2 <__truncdfsf2+0x18a> + 3006502: 4785 li a5,1 + 3006504: bf25 j 300643c <__truncdfsf2+0x114> + 3006506: 4605 li a2,1 + 3006508: f1a5 bnez a1,3006468 <__truncdfsf2+0x140> + 300650a: 0721 addi a4,a4,8 + 300650c: bfb1 j 3006468 <__truncdfsf2+0x140> + 300650e: 4605 li a2,1 + 3006510: dda1 beqz a1,3006468 <__truncdfsf2+0x140> + 3006512: bfe5 j 300650a <__truncdfsf2+0x1e2> + 3006514: 0ff00713 li a4,255 + 3006518: 4601 li a2,0 + 300651a: bd51 j 30063ae <__truncdfsf2+0x86> + 300651c: fdd9 bnez a1,30064ba <__truncdfsf2+0x192> + 300651e: 07a1 addi a5,a5,8 # 2000008 + 3006520: bf69 j 30064ba <__truncdfsf2+0x192> + 3006522: ddc1 beqz a1,30064ba <__truncdfsf2+0x192> + 3006524: bfed j 300651e <__truncdfsf2+0x1f6> + 3006526: 4781 li a5,0 + 3006528: 00080e63 beqz a6,3006544 <__truncdfsf2+0x21c> + 300652c: 468d li a3,3 + 300652e: 00d81763 bne a6,a3,300653c <__truncdfsf2+0x214> + 3006532: c989 beqz a1,3006544 <__truncdfsf2+0x21c> + 3006534: 57fd li a5,-1 + 3006536: 0fe00713 li a4,254 + 300653a: a029 j 3006544 <__truncdfsf2+0x21c> + 300653c: 4689 li a3,2 + 300653e: fed81be3 bne a6,a3,3006534 <__truncdfsf2+0x20c> + 3006542: d9ed beqz a1,3006534 <__truncdfsf2+0x20c> + 3006544: 00566613 ori a2,a2,5 + 3006548: b541 j 30063c8 <__truncdfsf2+0xa0> + +0300654a <__clzsi2>: + 300654a: 67c1 lui a5,0x10 + 300654c: 02f57663 bgeu a0,a5,3006578 <__clzsi2+0x2e> + 3006550: 0ff00793 li a5,255 + 3006554: 00a7b7b3 sltu a5,a5,a0 + 3006558: 078e slli a5,a5,0x3 + 300655a: 02000713 li a4,32 + 300655e: 8f1d sub a4,a4,a5 + 3006560: 00f557b3 srl a5,a0,a5 + 3006564: 00000517 auipc a0,0x0 + 3006568: 5e052503 lw a0,1504(a0) # 3006b44 <_GLOBAL_OFFSET_TABLE_+0x4> + 300656c: 97aa add a5,a5,a0 + 300656e: 0007c503 lbu a0,0(a5) # 10000 + 3006572: 40a70533 sub a0,a4,a0 + 3006576: 8082 ret + 3006578: 01000737 lui a4,0x1000 + 300657c: 47c1 li a5,16 + 300657e: fce56ee3 bltu a0,a4,300655a <__clzsi2+0x10> + 3006582: 47e1 li a5,24 + 3006584: bfd9 j 300655a <__clzsi2+0x10> + ... + +03006588 <__rodata_start>: + 3006588: 9680 pop {ra,s0-s6},384 + 300658a: 4b18 lw a4,16(a4) + +0300658c : + 300658c: 0000 1400 0000 0000 0140 0000 1000 1400 ........@....... + 300659c: 0000 0000 0144 0000 2000 1400 0000 0000 ....D.... ...... + 30065ac: 0148 0000 3000 1400 0000 0000 014c 0000 H....0......L... + 30065bc: 0000 1430 0000 0000 0240 0000 1000 1430 ..0.....@.....0. + 30065cc: 0000 0000 0244 0000 2000 1430 0000 0000 ....D.... 0..... + 30065dc: 0248 0000 3000 1430 0000 0000 024c 0000 H....00.....L... + 30065ec: 0000 1438 0000 0000 0040 0000 0000 1420 ..8.....@..... . + 30065fc: 0000 0000 0180 0000 1000 1420 0000 0000 .......... ..... + 300660c: 0184 0000 0000 1410 0000 0000 01c0 0000 ................ + 300661c: 1000 1410 0000 0000 01c4 0000 0000 1460 ..............`. + 300662c: 0001 0000 02c0 0000 0000 1470 0000 0000 ..........p..... + 300663c: 0440 0000 1000 1470 0000 0000 0444 0000 @.....p.....D... + 300664c: 2000 1470 0000 0000 0448 0000 3000 1470 . p.....H....0p. + 300665c: 0000 0000 044c 0000 0000 1440 0000 0000 ....L.....@..... + 300666c: 0200 0000 0000 14b0 0000 0000 0280 0000 ................ + 300667c: 1000 14b0 0000 0000 0284 0000 2000 14b0 ............. .. + 300668c: 0000 0000 0288 0000 0000 1c00 0000 0000 ................ + 300669c: 0300 0000 0000 1450 0000 0000 0480 0000 ......P......... + 30066ac: 1000 1450 0000 0000 0484 0000 2000 1450 ..P.......... P. + 30066bc: 0000 0000 0488 0000 3000 1450 0000 0000 .........0P..... + 30066cc: 048c 0000 4000 1450 0000 0000 0490 0000 .....@P......... + 30066dc: 5000 1450 0000 0000 0494 0000 1000 1440 .PP...........@. + 30066ec: 0004 0000 03c0 0000 0000 14c0 0000 0000 ................ + 30066fc: 04c0 0000 1000 14c0 0000 0000 04c4 0000 ................ + 300670c: 0000 147d 0000 0000 0b00 0000 0000 1480 ..}............. + 300671c: 0000 0000 0380 0000 0000 14a0 0000 0000 ................ + 300672c: 0400 0000 1000 14a0 0000 0000 0404 0000 ................ + 300673c: 2000 14a0 0000 0000 0408 0000 3000 14a0 . ...........0.. + 300674c: 0000 0000 040c 0000 0000 1001 0000 0000 ................ + 300675c: 0340 0000 0000 1810 0005 0000 0a60 0000 @...........`... + 300676c: 0000 1830 0005 0000 0a70 0000 0000 1840 ..0.....p.....@. + 300677c: 0005 0000 0a80 0000 0000 1820 0005 0000 .......... ..... + 300678c: 0a90 0000 1000 1820 0005 0000 0a90 0004 ...... ......... + 300679c: 0000 1800 0002 0000 0a00 0000 0000 1471 ..............q. + 30067ac: 0003 0000 0500 0000 2e2e 642f 6972 6576 ........../drive + 30067bc: 7372 612f 6364 692f 636e 612f 6364 695f rs/adc/inc/adc_i + 30067cc: 2e70 0068 2e2e 642f 6972 6576 7372 612f p.h.../drivers/a + 30067dc: 6364 732f 6372 612f 6364 632e 0000 0000 dc/src/adc.c.... + 30067ec: 0000 3f80 0000 4480 5547 4055 0000 4580 ...?...DGUU@...E + 30067fc: 6666 4026 51ec 4068 2160 0300 216c 0300 ff&@.Qh@`!..l!.. + 300680c: 2178 0300 2184 0300 2190 0300 219c 0300 x!...!...!...!.. + 300681c: 21a8 0300 21b4 0300 21c0 0300 2e2e 642f .!...!...!..../d + 300682c: 6972 6576 7372 622f 7361 2f65 7273 2f63 rivers/base/src/ + 300683c: 6e69 6574 7272 7075 2e74 0063 2640 0300 interrupt.c.@&.. + 300684c: 2692 0300 26e4 0300 2736 0300 2788 0300 .&...&..6'...'.. + 300685c: 27da 0300 282c 0300 287e 0300 2914 0300 .'..,(..~(...).. + 300686c: 2966 0300 29b8 0300 2a0a 0300 2a5c 0300 f)...)...*..\*.. + 300687c: 2aae 0300 2b00 0300 2b52 0300 2e2e 642f .*...+..R+..../d + 300688c: 6972 6576 7372 632f 6772 692f 636e 632f rivers/crg/inc/c + 300689c: 6772 695f 2e70 0068 2e2e 642f 6972 6576 rg_ip.h.../drive + 30068ac: 7372 632f 6772 732f 6372 632f 6772 632e rs/crg/src/crg.c + ... + 30068c4: 0001 0000 0002 0000 0003 0000 0004 0000 ................ + 30068d4: 0005 0000 0006 0000 0007 0000 35d4 0300 .............5.. + 30068e4: 35de 0300 35f6 0300 35d4 0300 3612 0300 .5...5...5...6.. + 30068f4: 35d4 0300 4b30 0300 4b9a 0300 4b9a 0300 .5..0K...K...K.. + 3006904: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006914: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006924: 4a70 0300 4ac6 0300 4b9a 0300 4b5a 0300 pJ...J...K..ZK.. + 3006934: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006944: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006954: 4b9a 0300 4b30 0300 4b9a 0300 4b9a 0300 .K..0K...K...K.. + 3006964: 4a9a 0300 4b9a 0300 4af0 0300 4b9a 0300 .J...K...J...K.. + 3006974: 4b9a 0300 4b30 0300 2e2e 642f 6972 6576 .K..0K..../drive + 3006984: 7372 692f 636f 676d 692f 636e 692f 636f rs/iocmg/inc/ioc + 3006994: 676d 695f 2e70 0068 2e2e 642f 6972 6576 mg_ip.h.../drive + 30069a4: 7372 692f 636f 676d 732f 6372 692f 636f rs/iocmg/src/ioc + 30069b4: 676d 632e 0000 0000 2e2e 642f 6972 6576 mg.c....../drive + 30069c4: 7372 742f 6d69 7265 692f 636e 742f 6d69 rs/timer/inc/tim + 30069d4: 7265 695f 2e70 0068 2e2e 642f 6972 6576 er_ip.h.../drive + 30069e4: 7372 742f 6d69 7265 732f 6372 742f 6d69 rs/timer/src/tim + 30069f4: 7265 632e 0000 0000 58f6 0300 590c 0300 er.c.....X...Y.. + 3006a04: 5922 0300 5938 0300 594e 0300 2e2e 642f "Y..8Y..NY..../d + 3006a14: 6972 6576 7372 752f 7261 2f74 7273 2f63 rivers/uart/src/ + 3006a24: 6175 7472 632e 0000 3a56 2e25 6632 0a0d uart.c..V:%.2f.. + 3006a34: 0000 0000 0000 4580 3333 4053 .......E33S@ + +03006a40 <__clz_tab>: + 3006a40: 0100 0202 0303 0303 0404 0404 0404 0404 ................ + 3006a50: 0505 0505 0505 0505 0505 0505 0505 0505 ................ + 3006a60: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 3006a70: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 3006a80: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006a90: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006aa0: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006ab0: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006ac0: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006ad0: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006ae0: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006af0: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b00: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b10: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b20: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b30: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + +03006b40 <_GLOBAL_OFFSET_TABLE_>: + 3006b40: 0000 0000 6a40 0300 ffff ffff 0000 0000 ....@j.......... + +out/bin/target.elf: file format elf32-littleriscv + + +Disassembly of section .text.entry: + +03000004 <_start>: + + .section .text.entry + .global _start + .option norvc +_start: + j handle_reset + 3000004: 4fc0006f j 3000500 + +03000008 : +.endm + +/* The interrupt vector table must be aligned with 4 bytes */ +.align 2 +TrapHandler: + j TrapVector /* trap and INT 0 */ + 3000008: 4680006f j 3000470 + j TrapVector /* INT 1 */ + 300000c: 4640006f j 3000470 + j TrapVector /* INT 2 */ + 3000010: 4600006f j 3000470 + j TrapVector /* INT 3 */ + 3000014: 45c0006f j 3000470 + j TrapVector /* INT 4 */ + 3000018: 4580006f j 3000470 + j TrapVector /* INT 5 */ + 300001c: 4540006f j 3000470 + j TrapVector /* INT 6 */ + 3000020: 4500006f j 3000470 + j TrapVector /* INT 7 */ + 3000024: 44c0006f j 3000470 + j TrapVector /* INT 8 */ + 3000028: 4480006f j 3000470 + j TrapVector /* INT 9 */ + 300002c: 4440006f j 3000470 + j TrapVector /* INT 10 */ + 3000030: 4400006f j 3000470 + j TrapVector /* INT 11 */ + 3000034: 43c0006f j 3000470 + j TrapVector /* INT 12 */ + 3000038: 4380006f j 3000470 + j TrapVector /* INT 13 */ + 300003c: 4340006f j 3000470 + j TrapVector /* INT 14 */ + 3000040: 4300006f j 3000470 + j TrapVector /* INT 15 */ + 3000044: 42c0006f j 3000470 + j TrapVector /* INT 16 */ + 3000048: 4280006f j 3000470 + j TrapVector /* INT 17 */ + 300004c: 4240006f j 3000470 + j TrapVector /* INT 18 */ + 3000050: 4200006f j 3000470 + j TrapVector /* INT 19 */ + 3000054: 41c0006f j 3000470 + j TrapVector /* INT 20 */ + 3000058: 4180006f j 3000470 + j TrapVector /* INT 21 */ + 300005c: 4140006f j 3000470 + j TrapVector /* INT 22 */ + 3000060: 4100006f j 3000470 + j TrapVector /* INT 23 */ + 3000064: 40c0006f j 3000470 + j TrapVector /* INT 24 */ + 3000068: 4080006f j 3000470 + j TrapVector /* INT 25 */ + 300006c: 4040006f j 3000470 + + j IntHandler /* INT 26 */ + 3000070: 2640006f j 30002d4 + j IntHandler /* INT 27 */ + 3000074: 2600006f j 30002d4 + j IntHandler /* INT 28 */ + 3000078: 25c0006f j 30002d4 + j IntHandler /* INT 29 */ + 300007c: 2580006f j 30002d4 + j IntHandler /* INT 30 */ + 3000080: 2540006f j 30002d4 + j IntHandler /* INT 31 */ + 3000084: 2500006f j 30002d4 + j IntHandler /* INT 32 */ + 3000088: 24c0006f j 30002d4 + j IntHandler /* INT 33 */ + 300008c: 2480006f j 30002d4 + j IntHandler /* INT 34 */ + 3000090: 2440006f j 30002d4 + j IntHandler /* INT 35 */ + 3000094: 2400006f j 30002d4 + j IntHandler /* INT 36 */ + 3000098: 23c0006f j 30002d4 + j IntHandler /* INT 37 */ + 300009c: 2380006f j 30002d4 + j IntHandler /* INT 38 */ + 30000a0: 2340006f j 30002d4 + j IntHandler /* INT 39 */ + 30000a4: 2300006f j 30002d4 + j IntHandler /* INT 40 */ + 30000a8: 22c0006f j 30002d4 + j IntHandler /* INT 41 */ + 30000ac: 2280006f j 30002d4 + j IntHandler /* INT 42 */ + 30000b0: 2240006f j 30002d4 + j IntHandler /* INT 43 */ + 30000b4: 2200006f j 30002d4 + j IntHandler /* INT 44 */ + 30000b8: 21c0006f j 30002d4 + j IntHandler /* INT 45 */ + 30000bc: 2180006f j 30002d4 + j IntHandler /* INT 46 */ + 30000c0: 2140006f j 30002d4 + j IntHandler /* INT 47 */ + 30000c4: 2100006f j 30002d4 + j IntHandler /* INT 48 */ + 30000c8: 20c0006f j 30002d4 + j IntHandler /* INT 49 */ + 30000cc: 2080006f j 30002d4 + j IntHandler /* INT 50 */ + 30000d0: 2040006f j 30002d4 + j IntHandler /* INT 51 */ + 30000d4: 2000006f j 30002d4 + j IntHandler /* INT 52 */ + 30000d8: 1fc0006f j 30002d4 + j IntHandler /* INT 53 */ + 30000dc: 1f80006f j 30002d4 + j IntHandler /* INT 54 */ + 30000e0: 1f40006f j 30002d4 + j IntHandler /* INT 55 */ + 30000e4: 1f00006f j 30002d4 + j IntHandler /* INT 56 */ + 30000e8: 1ec0006f j 30002d4 + j IntHandler /* INT 57 */ + 30000ec: 1e80006f j 30002d4 + j IntHandler /* INT 58 */ + 30000f0: 1e40006f j 30002d4 + j IntHandler /* INT 59 */ + 30000f4: 1e00006f j 30002d4 + j IntHandler /* INT 60 */ + 30000f8: 1dc0006f j 30002d4 + j IntHandler /* INT 61 */ + 30000fc: 1d80006f j 30002d4 + j IntHandler /* INT 62 */ + 3000100: 1d40006f j 30002d4 + j IntHandler /* INT 63 */ + 3000104: 1d00006f j 30002d4 + j IntHandler /* INT 64 */ + 3000108: 1cc0006f j 30002d4 + j IntHandler /* INT 65 */ + 300010c: 1c80006f j 30002d4 + j IntHandler /* INT 66 */ + 3000110: 1c40006f j 30002d4 + j IntHandler /* INT 67 */ + 3000114: 1c00006f j 30002d4 + j IntHandler /* INT 68 */ + 3000118: 1bc0006f j 30002d4 + j IntHandler /* INT 69 */ + 300011c: 1b80006f j 30002d4 + j IntHandler /* INT 70 */ + 3000120: 1b40006f j 30002d4 + j IntHandler /* INT 71 */ + 3000124: 1b00006f j 30002d4 + j IntHandler /* INT 72 */ + 3000128: 1ac0006f j 30002d4 + j IntHandler /* INT 73 */ + 300012c: 1a80006f j 30002d4 + j IntHandler /* INT 74 */ + 3000130: 1a40006f j 30002d4 + j IntHandler /* INT 75 */ + 3000134: 1a00006f j 30002d4 + j IntHandler /* INT 76 */ + 3000138: 19c0006f j 30002d4 + j IntHandler /* INT 77 */ + 300013c: 1980006f j 30002d4 + j IntHandler /* INT 78 */ + 3000140: 1940006f j 30002d4 + j IntHandler /* INT 79 */ + 3000144: 1900006f j 30002d4 + j IntHandler /* INT 80 */ + 3000148: 18c0006f j 30002d4 + j IntHandler /* INT 81 */ + 300014c: 1880006f j 30002d4 + j IntHandler /* INT 82 */ + 3000150: 1840006f j 30002d4 + j IntHandler /* INT 83 */ + 3000154: 1800006f j 30002d4 + j IntHandler /* INT 84 */ + 3000158: 17c0006f j 30002d4 + j IntHandler /* INT 85 */ + 300015c: 1780006f j 30002d4 + j IntHandler /* INT 86 */ + 3000160: 1740006f j 30002d4 + j IntHandler /* INT 87 */ + 3000164: 1700006f j 30002d4 + j IntHandler /* INT 88 */ + 3000168: 16c0006f j 30002d4 + j IntHandler /* INT 89 */ + 300016c: 1680006f j 30002d4 + j IntHandler /* INT 90 */ + 3000170: 1640006f j 30002d4 + j IntHandler /* INT 91 */ + 3000174: 1600006f j 30002d4 + j IntHandler /* INT 92 */ + 3000178: 15c0006f j 30002d4 + j IntHandler /* INT 93 */ + 300017c: 1580006f j 30002d4 + j IntHandler /* INT 94 */ + 3000180: 1540006f j 30002d4 + j IntHandler /* INT 95 */ + 3000184: 1500006f j 30002d4 + j IntHandler /* INT 96 */ + 3000188: 14c0006f j 30002d4 + j IntHandler /* INT 97 */ + 300018c: 1480006f j 30002d4 + j IntHandler /* INT 98 */ + 3000190: 1440006f j 30002d4 + j IntHandler /* INT 99 */ + 3000194: 1400006f j 30002d4 + j IntHandler /* INT 100 */ + 3000198: 13c0006f j 30002d4 + j IntHandler /* INT 101 */ + 300019c: 1380006f j 30002d4 + j IntHandler /* INT 102 */ + 30001a0: 1340006f j 30002d4 + j IntHandler /* INT 103 */ + 30001a4: 1300006f j 30002d4 + j IntHandler /* INT 104 */ + 30001a8: 12c0006f j 30002d4 + j IntHandler /* INT 105 */ + 30001ac: 1280006f j 30002d4 + j IntHandler /* INT 106 */ + 30001b0: 1240006f j 30002d4 + j IntHandler /* INT 107 */ + 30001b4: 1200006f j 30002d4 + j IntHandler /* INT 108 */ + 30001b8: 11c0006f j 30002d4 + j IntHandler /* INT 109 */ + 30001bc: 1180006f j 30002d4 + j IntHandler /* INT 110 */ + 30001c0: 1140006f j 30002d4 + j IntHandler /* INT 111 */ + 30001c4: 1100006f j 30002d4 + j IntHandler /* INT 112 */ + 30001c8: 10c0006f j 30002d4 + j IntHandler /* INT 113 */ + 30001cc: 1080006f j 30002d4 + j IntHandler /* INT 114 */ + 30001d0: 1040006f j 30002d4 + j IntHandler /* INT 115 */ + 30001d4: 1000006f j 30002d4 + j IntHandler /* INT 116 */ + 30001d8: 0fc0006f j 30002d4 + j IntHandler /* INT 117 */ + 30001dc: 0f80006f j 30002d4 + j IntHandler /* INT 118 */ + 30001e0: 0f40006f j 30002d4 + j IntHandler /* INT 119 */ + 30001e4: 0f00006f j 30002d4 + j IntHandler /* INT 120 */ + 30001e8: 0ec0006f j 30002d4 + j IntHandler /* INT 121 */ + 30001ec: 0e80006f j 30002d4 + +030001f0 : + +.align 2 +NmiEntry: + SAVE_SYSERR_REGS + 30001f0: f9010113 addi sp,sp,-112 + 30001f4: 04812023 sw s0,64(sp) + 30001f8: 04912223 sw s1,68(sp) + 30001fc: 05212423 sw s2,72(sp) + 3000200: 05312623 sw s3,76(sp) + 3000204: 05412823 sw s4,80(sp) + 3000208: 05512a23 sw s5,84(sp) + 300020c: 05612c23 sw s6,88(sp) + 3000210: 05712e23 sw s7,92(sp) + 3000214: 07812023 sw s8,96(sp) + 3000218: 07912223 sw s9,100(sp) + 300021c: 07a12423 sw s10,104(sp) + 3000220: 07b12623 sw s11,108(sp) + 3000224: 11010593 addi a1,sp,272 + 3000228: 06b12823 sw a1,112(sp) + 300022c: 06312a23 sw gp,116(sp) + 3000230: 06412c23 sw tp,120(sp) + 3000234: 34102573 csrr a0,mepc + 3000238: 300025f3 csrr a1,mstatus + 300023c: 34302673 csrr a2,mtval + 3000240: 342026f3 csrr a3,mcause + 3000244: 06a12e23 sw a0,124(sp) + 3000248: 08b12023 sw a1,128(sp) + 300024c: 08c12223 sw a2,132(sp) + 3000250: 08d12423 sw a3,136(sp) + 3000254: 00010513 mv a0,sp + call SysErrNmiEntry + 3000258: 384020ef jal ra,30025dc + +0300025c : +deadLoop1: + tail deadLoop1 + 300025c: a001 j 300025c + nop + 300025e: 00000013 nop + +03000262 : + +.align 2 +TrapEntry: + SAVE_SYSERR_REGS + 3000262: f9010113 addi sp,sp,-112 + 3000266: 04812023 sw s0,64(sp) + 300026a: 04912223 sw s1,68(sp) + 300026e: 05212423 sw s2,72(sp) + 3000272: 05312623 sw s3,76(sp) + 3000276: 05412823 sw s4,80(sp) + 300027a: 05512a23 sw s5,84(sp) + 300027e: 05612c23 sw s6,88(sp) + 3000282: 05712e23 sw s7,92(sp) + 3000286: 07812023 sw s8,96(sp) + 300028a: 07912223 sw s9,100(sp) + 300028e: 07a12423 sw s10,104(sp) + 3000292: 07b12623 sw s11,108(sp) + 3000296: 11010593 addi a1,sp,272 + 300029a: 06b12823 sw a1,112(sp) + 300029e: 06312a23 sw gp,116(sp) + 30002a2: 06412c23 sw tp,120(sp) + 30002a6: 34102573 csrr a0,mepc + 30002aa: 300025f3 csrr a1,mstatus + 30002ae: 34302673 csrr a2,mtval + 30002b2: 342026f3 csrr a3,mcause + 30002b6: 06a12e23 sw a0,124(sp) + 30002ba: 08b12023 sw a1,128(sp) + 30002be: 08c12223 sw a2,132(sp) + 30002c2: 08d12423 sw a3,136(sp) + 30002c6: 00010513 mv a0,sp + /* Exception run with interrupts masked */ + csrc mstatus, MSTATUS_MIE + 30002ca: 30047073 csrci mstatus,8 + call SysErrExcEntry + 30002ce: 2f0020ef jal ra,30025be + +030002d2 : +deadLoop2: + tail deadLoop2 + 30002d2: a001 j 30002d2 + +030002d4 : + +.align 2 +IntHandler: + addi sp, sp, -(TOTAL_INT_SIZE_ON_STACK) + 30002d4: f6010113 addi sp,sp,-160 + + SREG a0, 3 * REGBYTES(sp) + 30002d8: 00a12623 sw a0,12(sp) + SREG a1, 4 * REGBYTES(sp) + 30002dc: 00b12823 sw a1,16(sp) +#endif + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + csrr a0, mcause +#else + csrr a0, cipri + 30002e0: 7ed02573 csrr a0,0x7ed + csrr a1, prithd + 30002e4: bfe025f3 csrr a1,0xbfe + csrw prithd, a0 /* read prithd */ + 30002e8: bfe51073 csrw 0xbfe,a0 + SREG a1, 6 * REGBYTES(sp) /* save prithd */ + 30002ec: 00b12c23 sw a1,24(sp) + csrr a1, mstatus /* read mstatus */ + 30002f0: 300025f3 csrr a1,mstatus + SREG a1, 7 * REGBYTES(sp) /* save mstatus */ + 30002f4: 00b12e23 sw a1,28(sp) + csrr a1, mepc /* read mepc */ + 30002f8: 341025f3 csrr a1,mepc + SREG a1, 8 * REGBYTES(sp) /* save mepc */ + 30002fc: 02b12023 sw a1,32(sp) + + csrr a0, mcause + 3000300: 34202573 csrr a0,mcause + + li a1, (3<<11) + 3000304: 000025b7 lui a1,0x2 + 3000308: 80058593 addi a1,a1,-2048 # 1800 + csrs mstatus, a1 + 300030c: 3005a073 csrs mstatus,a1 + la a1, custom_nested_irq_main_handler_entry + 3000310: 00000597 auipc a1,0x0 + 3000314: 01058593 addi a1,a1,16 # 3000320 + csrw mepc, a1 + 3000318: 34159073 csrw mepc,a1 + mret + 300031c: 30200073 mret + +03000320 : +#endif + +.align 2 +custom_nested_irq_main_handler_entry: + SREG t0, 0 * REGBYTES(sp) + 3000320: 00512023 sw t0,0(sp) + SREG t1, 1 * REGBYTES(sp) + 3000324: 00612223 sw t1,4(sp) + SREG t2, 2 * REGBYTES(sp) + 3000328: 00712423 sw t2,8(sp) + SREG a2, 5 * REGBYTES(sp) + 300032c: 00c12a23 sw a2,20(sp) + SREG ra, 9 * REGBYTES(sp) + 3000330: 02112223 sw ra,36(sp) + SREG a3, 10 * REGBYTES(sp) + 3000334: 02d12423 sw a3,40(sp) + SREG a4, 11 * REGBYTES(sp) + 3000338: 02e12623 sw a4,44(sp) + SREG a5, 12 * REGBYTES(sp) + 300033c: 02f12823 sw a5,48(sp) + SREG a6, 13 * REGBYTES(sp) + 3000340: 03012a23 sw a6,52(sp) + SREG a7, 14 * REGBYTES(sp) + 3000344: 03112c23 sw a7,56(sp) + SREG t3, 15 * REGBYTES(sp) + 3000348: 03c12e23 sw t3,60(sp) + SREG t4, 16 * REGBYTES(sp) + 300034c: 05d12023 sw t4,64(sp) + SREG t5, 17 * REGBYTES(sp) + 3000350: 05e12223 sw t5,68(sp) + SREG t6, 18 * REGBYTES(sp) + 3000354: 05f12423 sw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FSREG f0, 19 * REGBYTES(sp) + 3000358: 04012627 fsw ft0,76(sp) + FSREG f1, 20 * REGBYTES(sp) + 300035c: 04112827 fsw ft1,80(sp) + FSREG f2, 21 * REGBYTES(sp) + 3000360: 04212a27 fsw ft2,84(sp) + FSREG f3, 22 * REGBYTES(sp) + 3000364: 04312c27 fsw ft3,88(sp) + FSREG f4, 23 * REGBYTES(sp) + 3000368: 04412e27 fsw ft4,92(sp) + FSREG f5, 24 * REGBYTES(sp) + 300036c: 06512027 fsw ft5,96(sp) + FSREG f6, 25 * REGBYTES(sp) + 3000370: 06612227 fsw ft6,100(sp) + FSREG f7, 26 * REGBYTES(sp) + 3000374: 06712427 fsw ft7,104(sp) + FSREG f10, 27 * REGBYTES(sp) + 3000378: 06a12627 fsw fa0,108(sp) + FSREG f11, 28 * REGBYTES(sp) + 300037c: 06b12827 fsw fa1,112(sp) + FSREG f12, 29 * REGBYTES(sp) + 3000380: 06c12a27 fsw fa2,116(sp) + FSREG f13, 30 * REGBYTES(sp) + 3000384: 06d12c27 fsw fa3,120(sp) + FSREG f14, 31 * REGBYTES(sp) + 3000388: 06e12e27 fsw fa4,124(sp) + FSREG f15, 32 * REGBYTES(sp) + 300038c: 08f12027 fsw fa5,128(sp) + FSREG f16, 33 * REGBYTES(sp) + 3000390: 09012227 fsw fa6,132(sp) + FSREG f17, 34 * REGBYTES(sp) + 3000394: 09112427 fsw fa7,136(sp) + FSREG f28, 35 * REGBYTES(sp) + 3000398: 09c12627 fsw ft8,140(sp) + FSREG f29, 36 * REGBYTES(sp) + 300039c: 09d12827 fsw ft9,144(sp) + FSREG f30, 37 * REGBYTES(sp) + 30003a0: 09e12a27 fsw ft10,148(sp) + FSREG f31, 38 * REGBYTES(sp) + 30003a4: 09f12c27 fsw ft11,152(sp) +#endif + + andi a0, a0, MCAUSE_MASK_INT_NUM + 30003a8: 0ff57513 andi a0,a0,255 + call InterruptEntry + 30003ac: 7a3010ef jal ra,300234e + + LREG t1, 1 * REGBYTES(sp) + 30003b0: 00412303 lw t1,4(sp) + LREG t2, 2 * REGBYTES(sp) + 30003b4: 00812383 lw t2,8(sp) + LREG a2, 5 * REGBYTES(sp) + 30003b8: 01412603 lw a2,20(sp) + LREG ra, 9 * REGBYTES(sp) + 30003bc: 02412083 lw ra,36(sp) + LREG a3, 10 * REGBYTES(sp) + 30003c0: 02812683 lw a3,40(sp) + LREG a4, 11 * REGBYTES(sp) + 30003c4: 02c12703 lw a4,44(sp) + LREG a5, 12 * REGBYTES(sp) + 30003c8: 03012783 lw a5,48(sp) + LREG a6, 13 * REGBYTES(sp) + 30003cc: 03412803 lw a6,52(sp) + LREG a7, 14 * REGBYTES(sp) + 30003d0: 03812883 lw a7,56(sp) + LREG t3, 15 * REGBYTES(sp) + 30003d4: 03c12e03 lw t3,60(sp) + LREG t4, 16 * REGBYTES(sp) + 30003d8: 04012e83 lw t4,64(sp) + LREG t5, 17 * REGBYTES(sp) + 30003dc: 04412f03 lw t5,68(sp) + LREG t6, 18 * REGBYTES(sp) + 30003e0: 04812f83 lw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FLREG f0, 19 * REGBYTES(sp) + 30003e4: 04c12007 flw ft0,76(sp) + FLREG f1, 20 * REGBYTES(sp) + 30003e8: 05012087 flw ft1,80(sp) + FLREG f2, 21 * REGBYTES(sp) + 30003ec: 05412107 flw ft2,84(sp) + FLREG f3, 22 * REGBYTES(sp) + 30003f0: 05812187 flw ft3,88(sp) + FLREG f4, 23 * REGBYTES(sp) + 30003f4: 05c12207 flw ft4,92(sp) + FLREG f5, 24 * REGBYTES(sp) + 30003f8: 06012287 flw ft5,96(sp) + FLREG f6, 25 * REGBYTES(sp) + 30003fc: 06412307 flw ft6,100(sp) + FLREG f7, 26 * REGBYTES(sp) + 3000400: 06812387 flw ft7,104(sp) + FLREG f10, 27 * REGBYTES(sp) + 3000404: 06c12507 flw fa0,108(sp) + FLREG f11, 28 * REGBYTES(sp) + 3000408: 07012587 flw fa1,112(sp) + FLREG f12, 29 * REGBYTES(sp) + 300040c: 07412607 flw fa2,116(sp) + FLREG f13, 30 * REGBYTES(sp) + 3000410: 07812687 flw fa3,120(sp) + FLREG f14, 31 * REGBYTES(sp) + 3000414: 07c12707 flw fa4,124(sp) + FLREG f15, 32 * REGBYTES(sp) + 3000418: 08012787 flw fa5,128(sp) + FLREG f16, 33 * REGBYTES(sp) + 300041c: 08412807 flw fa6,132(sp) + FLREG f17, 34 * REGBYTES(sp) + 3000420: 08812887 flw fa7,136(sp) + FLREG f28, 35 * REGBYTES(sp) + 3000424: 08c12e07 flw ft8,140(sp) + FLREG f29, 36 * REGBYTES(sp) + 3000428: 09012e87 flw ft9,144(sp) + FLREG f30, 37 * REGBYTES(sp) + 300042c: 09412f07 flw ft10,148(sp) + FLREG f31, 38 * REGBYTES(sp) + 3000430: 09812f87 flw ft11,152(sp) + +03000434 : + */ + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + LREG t0, 0 * REGBYTES(sp) +#else + LREG a0, 7 * REGBYTES(sp) /* load mstatus */ + 3000434: 01c12503 lw a0,28(sp) + csrr t0, mstatus + 3000438: 300022f3 csrr t0,mstatus + LREG a1, 8 * REGBYTES(sp) /* load mepc */ + 300043c: 02012583 lw a1,32(sp) + andi t0, t0, MSTATUS_MIE + 3000440: 0082f293 andi t0,t0,8 + bnei t0, 0, restore_mstatus + 3000444: 0002923b bnei t0,0,300044c + andi a0, a0, ~(MSTATUS_MIE | MSTATUS_MPIE) + 3000448: f7757513 andi a0,a0,-137 + +0300044c : +restore_mstatus: + csrw mstatus, a0 + 300044c: 30051073 csrw mstatus,a0 + + LREG t0, 0 * REGBYTES(sp) + 3000450: 00012283 lw t0,0(sp) + csrw mepc, a1 + 3000454: 34159073 csrw mepc,a1 + LREG a0, 6 * REGBYTES(sp) /* load prithd */ + 3000458: 01812503 lw a0,24(sp) + csrw prithd, a0 + 300045c: bfe51073 csrw 0xbfe,a0 + lw a1, (a0) + addi a1, a1, -1 + sw a1, (a0) +#endif + + LREG a1, 4 * REGBYTES(sp) /* 2 consecutive csrw instructions will have a bubble */ + 3000460: 01012583 lw a1,16(sp) + + LREG a0, 3 * REGBYTES(sp) + 3000464: 00c12503 lw a0,12(sp) + + addi sp, sp, TOTAL_INT_SIZE_ON_STACK + 3000468: 0a010113 addi sp,sp,160 + + mret + 300046c: 30200073 mret + +03000470 : + +.align 2 +TrapVector: + push_reg + 3000470: f6010113 addi sp,sp,-160 + 3000474: fff11f8b stmia {ra,t0-t6,a0-a7},(sp) + 3000478: f6010113 addi sp,sp,-160 + csrr a0, mcause + 300047c: 34202573 csrr a0,mcause + li t1, MCAUSE_ECALL_FROM_MMODE + 3000480: 00b00313 li t1,11 +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + beq a0, t1, switch_to_umode +#else + beq a0, t1, switch_to_mmode + 3000484: 02650c63 beq a0,t1,30004bc +#endif + li t1, MCAUSE_ECALL_FROM_UMODE + 3000488: 00800313 li t1,8 + beq a0, t1, switch_to_mmode + 300048c: 02650863 beq a0,t1,30004bc + + li a1, MCAUSE_MASK_INT_BIT + 3000490: 800005b7 lui a1,0x80000 + li a2, MCAUSE_MASK_INT_NUM + 3000494: 0ff00613 li a2,255 + and a1, a0, a1 + 3000498: 00b575b3 and a1,a0,a1 + and a0, a0, a2 + 300049c: 00c57533 and a0,a0,a2 + + li a2, 0xc + 30004a0: 00c00613 li a2,12 + beq a0, a2, NmiEntry + 30004a4: d4c506e3 beq a0,a2,30001f0 + beqz a1, TrapEntry + 30004a8: da058de3 beqz a1,3000262 + pop_reg + 30004ac: 0a010113 addi sp,sp,160 + 30004b0: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004b4: 0a010113 addi sp,sp,160 + mret + 30004b8: 30200073 mret + +030004bc : + mret +#endif + +.align 2 +switch_to_mmode: + li t2, MSTATUS_MPP_MACHINE + 30004bc: 000023b7 lui t2,0x2 + 30004c0: 80038393 addi t2,t2,-2048 # 1800 + csrs mstatus, t2 + 30004c4: 3003a073 csrs mstatus,t2 + csrr t0, mepc + 30004c8: 341022f3 csrr t0,mepc + addi t0, t0, 4 + 30004cc: 00428293 addi t0,t0,4 + csrw mepc, t0 + 30004d0: 34129073 csrw mepc,t0 + pop_reg + 30004d4: 0a010113 addi sp,sp,160 + 30004d8: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004dc: 0a010113 addi sp,sp,160 + mret + 30004e0: 30200073 mret + +030004e4 : + +.align 2 +mem_cpy: + bge t0, t2, cpy_done + 30004e4: 0072dc63 bge t0,t2,30004fc + lw t3, (t1) + 30004e8: 00032e03 lw t3,0(t1) + sw t3, (t0) + 30004ec: 01c2a023 sw t3,0(t0) + addi t0, t0, 4 + 30004f0: 00428293 addi t0,t0,4 + addi t1, t1, 4 + 30004f4: 00430313 addi t1,t1,4 + j mem_cpy + 30004f8: fedff06f j 30004e4 + +030004fc : +cpy_done: + ret + 30004fc: 00008067 ret + +03000500 : + +.align 2 +handle_reset: + csrwi mstatus, 0 + 3000500: 30005073 csrwi mstatus,0 + csrwi mie, 0 + 3000504: 30405073 csrwi mie,0 + csrci mstatus, 0x08 + 3000508: 30047073 csrci mstatus,8 + la t0, TrapHandler + 300050c: 00000297 auipc t0,0x0 + 3000510: afc28293 addi t0,t0,-1284 # 3000008 + addi t0, t0, 1 + 3000514: 00128293 addi t0,t0,1 + csrw mtvec, t0 + 3000518: 30529073 csrw mtvec,t0 + csrwi 0x7EF, 0x1 /* lock mtvec */ + 300051c: 7ef0d073 csrwi 0x7ef,1 + +03000520 : + csrwi 0x7C8, 0x1 /* enable hardware nest interrupt support */ +#endif + +flash_init: +/* eflash prefetch enable */ + li t0, EFC_BASE_ADDR + 3000520: 147102b7 lui t0,0x14710 + lw t1, 0x120(t0) + 3000524: 1202a303 lw t1,288(t0) # 14710120 + ori t1, t1, 1 + 3000528: 00136313 ori t1,t1,1 + sw t1, 0x120(t0) + 300052c: 1262a023 sw t1,288(t0) + +/* eflash cache enable */ + lw t1, 0x124(t0) + 3000530: 1242a303 lw t1,292(t0) + ori t1, t1, 1 + 3000534: 00136313 ori t1,t1,1 + sw t1, 0x124(t0) + 3000538: 1262a223 sw t1,292(t0) + +/* enable flash cmd */ + li t0, EFC_MAGIC_NUMBER + 300053c: fedcc2b7 lui t0,0xfedcc + 3000540: a9828293 addi t0,t0,-1384 # fedcba98 + li t1, EFC_MAGIC_LOCK_RW + 3000544: 14710337 lui t1,0x14710 + 3000548: 20030313 addi t1,t1,512 # 14710200 + sw t0, (t1) + 300054c: 00532023 sw t0,0(t1) + +/* initialize global pointer */ + .option push + .option norelax + la gp, __global_pointer$ + 3000550: 01001197 auipc gp,0x1001 + 3000554: bc418193 addi gp,gp,-1084 # 4001114 <__global_pointer$> + .option pop + +/* initialize stack pointer */ + la sp, __stack_top + 3000558: 01007117 auipc sp,0x1007 + 300055c: 6a810113 addi sp,sp,1704 # 4007c00 <__INTERRUPT_STACK_BEGIN__> + +/* timer0 interrupt enable */ + li t0, TIMER0_CONTROL + 3000560: 143002b7 lui t0,0x14300 + 3000564: 00828293 addi t0,t0,8 # 14300008 + lw t1, (t0) + 3000568: 0002a303 lw t1,0(t0) + andi t1, t1, TIMER0_INTENABLE + 300056c: 02037313 andi t1,t1,32 + sw t1, (t0) + 3000570: 0062a023 sw t1,0(t0) + +/* uart0 deinit */ + li t0, 0x14000000 + 3000574: 140002b7 lui t0,0x14000 + li t1, 0 + 3000578: 00000313 li t1,0 + sw t1, IBRD_OFFSET(t0) + 300057c: 0262a223 sw t1,36(t0) # 14000024 + sw t1, FBRD_OFFSET(t0) + 3000580: 0262a423 sw t1,40(t0) + sw t1, LCR_H_OFFSET(t0) + 3000584: 0262a623 sw t1,44(t0) + sw t1, CR_OFFSET(t0) + 3000588: 0262a823 sw t1,48(t0) + sw t1, DMACR_OFFSET(t0) + 300058c: 0462a423 sw t1,72(t0) + +03000590 : + +/* perform the rest of initialization in C */ +clear_sram: + /* clear sysram parity error */ + li t0, SYSRAM_ERROR + 3000590: 101082b7 lui t0,0x10108 + 3000594: 30028293 addi t0,t0,768 # 10108300 + lw t1, (t0) + 3000598: 0002a303 lw t1,0(t0) + ori t1, t1, 1 + 300059c: 00136313 ori t1,t1,1 + sw t1, (t0) + 30005a0: 0062a023 sw t1,0(t0) + + la t0, SRAM_START + 30005a4: 01000297 auipc t0,0x1000 + 30005a8: a5c28293 addi t0,t0,-1444 # 4000000 + la t1, SRAM_END + 30005ac: 01008317 auipc t1,0x1008 + 30005b0: a5430313 addi t1,t1,-1452 # 4008000 + li t2, 0 + 30005b4: 00000393 li t2,0 + +030005b8 : + +clear_sram_loop: + sw t2, (t0) /* clear all sram */ + 30005b8: 0072a023 sw t2,0(t0) + addi t0, t0, 4 /* increment clear index pointer */ + 30005bc: 00428293 addi t0,t0,4 + blt t0, t1, clear_sram_loop /* are we at the end yet, if not , contiue till the end */ + 30005c0: fe62cce3 blt t0,t1,30005b8 + +030005c4 : + +start_coderom_code_copy: + la t0, __sram_code_start_addr /* SRAM addr */ + 30005c4: ff000297 auipc t0,0xff000 + 30005c8: a3c28293 addi t0,t0,-1476 # 2000000 + la t1, __sram_code_load_addr /* ROM addr */ + 30005cc: 00000317 auipc t1,0x0 + 30005d0: 13830313 addi t1,t1,312 # 3000704 + la t2, __sram_code_end_addr + 30005d4: ff000397 auipc t2,0xff000 + 30005d8: a2c38393 addi t2,t2,-1492 # 2000000 + jal mem_cpy + 30005dc: f09ff0ef jal ra,30004e4 + +030005e0 : + +start_reserved_data_copy: + la t0, __reserved_code_start_addr /* SRAM addr */ + 30005e0: 01000297 auipc t0,0x1000 + 30005e4: a2028293 addi t0,t0,-1504 # 4000000 + la t1, __reserved_code_load_addr /* ROM addr */ + 30005e8: 00000317 auipc t1,0x0 + 30005ec: 11c30313 addi t1,t1,284 # 3000704 + la t2, __reserved_code_end_addr + 30005f0: 01000397 auipc t2,0x1000 + 30005f4: a1038393 addi t2,t2,-1520 # 4000000 + jal mem_cpy + 30005f8: eedff0ef jal ra,30004e4 + +030005fc : + +start_coderom_data_copy: + la t0, __data_start /* SRAM addr */ + 30005fc: 01000297 auipc t0,0x1000 + 3000600: a2428293 addi t0,t0,-1500 # 4000020 + la t1, __data_load /* ROM addr */ + 3000604: 00006317 auipc t1,0x6 + 3000608: 54830313 addi t1,t1,1352 # 3006b4c <__data_load> + la t2, __data_end + 300060c: 01000397 auipc t2,0x1000 + 3000610: af038393 addi t2,t2,-1296 # 40000fc + jal mem_cpy + 3000614: ed1ff0ef jal ra,30004e4 + +03000618 : + +pmp_init: + li t0, 0xB00 + 3000618: 000012b7 lui t0,0x1 + 300061c: b0028293 addi t0,t0,-1280 # b00 + csrw pmpaddr0, t0 + 3000620: 3b029073 csrw pmpaddr0,t0 + li t0, 0x400400 /* 0x2C00~0x1000FFF, BOOTROM, enable R+X */ + 3000624: 004002b7 lui t0,0x400 + 3000628: 40028293 addi t0,t0,1024 # 400400 + csrw pmpaddr1, t0 + 300062c: 3b129073 csrw pmpaddr1,t0 + li t0, 0x800000 /* 0x1001000~0x1FFFFFF, Reserved: diable R+X+W */ + 3000630: 008002b7 lui t0,0x800 + csrw pmpaddr2, t0 + 3000634: 3b229073 csrw pmpaddr2,t0 + li t0, 0x802000 /* 0x2000000~0x2007FFF, SYSRAM_ITCM */ + 3000638: 008022b7 lui t0,0x802 + csrw pmpaddr3, t0 + 300063c: 3b329073 csrw pmpaddr3,t0 + li t0, 0xC00000 /* 0x2008000 ~ 0x2FFFFFF, Reserved: disable R+X+W */ + 3000640: 00c002b7 lui t0,0xc00 + csrw pmpaddr4, t0 + 3000644: 3b429073 csrw pmpaddr4,t0 + li t0, 0x1000000 /* 0x3000000 ~ 0x03FFFFFF: EFLASH: enable R+X */ + 3000648: 010002b7 lui t0,0x1000 + csrw pmpaddr5, t0 + 300064c: 3b529073 csrw pmpaddr5,t0 + li t0, 0x1002000 /* 0x4000000 ~ 0x04007FFF: SYSTEM_DTCM enable R+W */ + 3000650: 010022b7 lui t0,0x1002 + csrw pmpaddr6, t0 + 3000654: 3b629073 csrw pmpaddr6,t0 + li t0,0x7000400 /* 0x4008000 ~ 0x01C000FFF: REGISTER R+W */ + 3000658: 070002b7 lui t0,0x7000 + 300065c: 40028293 addi t0,t0,1024 # 7000400 + csrw pmpaddr7, t0 + 3000660: 3b729073 csrw pmpaddr7,t0 + + li t0,0xf3333333 /* register TOR-R-W */ + 3000664: f33332b7 lui t0,0xf3333 + 3000668: 33328293 addi t0,t0,819 # f3333333 + csrw 0x7d8,t0 + 300066c: 7d829073 csrw 0x7d8,t0 + li t0,0x0d080d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + csrw pmpcfg0,t0 + li t0,0x0b0b0d08 + csrw pmpcfg1,t0 +#else + li t0,0x8d888d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + 3000670: 8d8892b7 lui t0,0x8d889 + 3000674: d8b28293 addi t0,t0,-629 # 8d888d8b + csrw pmpcfg0,t0 + 3000678: 3a029073 csrw pmpcfg0,t0 + li t0,0x8b8b8d88 + 300067c: 8b8b92b7 lui t0,0x8b8b9 + 3000680: d8828293 addi t0,t0,-632 # 8b8b8d88 + csrw pmpcfg1,t0 + 3000684: 3a129073 csrw pmpcfg1,t0 +#endif + +/* disable Icache */ + csrwi 0x7C0, 0x0 /* disable ICACHE */ + 3000688: 7c005073 csrwi 0x7c0,0 + fence + 300068c: 0ff0000f fence + +/* disable Dcache */ + csrwi 0x7C1, 0x0 /* disable DCACHE */ + 3000690: 7c105073 csrwi 0x7c1,0 + fence + 3000694: 0ff0000f fence + +/* support float and mie */ + li t0,0x2008 + 3000698: 000022b7 lui t0,0x2 + 300069c: 00828293 addi t0,t0,8 # 2008 + csrs mstatus,t0 + 30006a0: 3002a073 csrs mstatus,t0 + li t0,0x20 + 30006a4: 02000293 li t0,32 + csrs misa,t0 + 30006a8: 3012a073 csrs misa,t0 + +/* Interrupt set default priority = 1*/ + li t0, 0x11111111 + 30006ac: 111112b7 lui t0,0x11111 + 30006b0: 11128293 addi t0,t0,273 # 11111111 + csrw locipri0, t0 + 30006b4: bc029073 csrw 0xbc0,t0 + csrw locipri1, t0 + 30006b8: bc129073 csrw 0xbc1,t0 + csrw locipri2, t0 + 30006bc: bc229073 csrw 0xbc2,t0 + csrw locipri3, t0 + 30006c0: bc329073 csrw 0xbc3,t0 + csrw locipri4, t0 + 30006c4: bc429073 csrw 0xbc4,t0 + csrw locipri5, t0 + 30006c8: bc529073 csrw 0xbc5,t0 + csrw locipri6, t0 + 30006cc: bc629073 csrw 0xbc6,t0 + csrw locipri7, t0 + 30006d0: bc729073 csrw 0xbc7,t0 + csrw locipri8, t0 + 30006d4: bc829073 csrw 0xbc8,t0 + csrw locipri9, t0 + 30006d8: bc929073 csrw 0xbc9,t0 + csrw locipri10, t0 + 30006dc: bca29073 csrw 0xbca,t0 + csrw locipri11, t0 + 30006e0: bcb29073 csrw 0xbcb,t0 + csrw locipri12, t0 + 30006e4: bcc29073 csrw 0xbcc,t0 + csrw locipri13, t0 + 30006e8: bcd29073 csrw 0xbcd,t0 + csrw locipri14, t0 + 30006ec: bce29073 csrw 0xbce,t0 + csrw locipri15, t0 + 30006f0: bcf29073 csrw 0xbcf,t0 + + ecall + 30006f4: 00000073 ecall + jal Chip_Init + 30006f8: 014000ef jal ra,300070c + +/* jump to C func. */ + jal main + 30006fc: 626050ef jal ra,3005d22
+ +03000700 : + +dead_loop: + j dead_loop + 3000700: 0000006f j 3000700 + +Disassembly of section .text: + +03000704 : + * @brief Chip Init Fail Process, deadloop if Chip Init fail + * @param None + * @retval None + */ +static inline void Chip_InitFail(void) +{ + 3000704: 1141 addi sp,sp,-16 + 3000706: c622 sw s0,12(sp) + 3000708: 0800 addi s0,sp,16 + while (1) { + 300070a: a001 j 300070a + +0300070c : + * @brief Chip Init + * @param None + * @retval None + */ +void Chip_Init(void) +{ + 300070c: 1101 addi sp,sp,-32 + 300070e: ce06 sw ra,28(sp) + 3000710: cc22 sw s0,24(sp) + 3000712: 1000 addi s0,sp,32 + CRG_CoreClkSelect coreClkSelect; + /* Config CRG */ + if (CRG_Config(&coreClkSelect) != BASE_STATUS_OK) { + 3000714: fec40793 addi a5,s0,-20 + 3000718: 853e mv a0,a5 + 300071a: 614050ef jal ra,3005d2e + 300071e: 87aa mv a5,a0 + 3000720: c391 beqz a5,3000724 + Chip_InitFail(); + 3000722: 37cd jal ra,3000704 + } + + /* Config FLASH Clock */ + FLASH_ClockConfig(coreClkSelect); + 3000724: fec42783 lw a5,-20(s0) + 3000728: 853e mv a0,a5 + 300072a: 796000ef jal ra,3000ec0 + SYSTICK_Init(); + 300072e: 057000ef jal ra,3000f84 + /* Set CoreClock Select after FLASH Config Done */ + CRG_SetCoreClockSelect(coreClkSelect); + 3000732: fec42783 lw a5,-20(s0) + 3000736: 853e mv a0,a5 + 3000738: 25b1 jal ra,3000d84 + + IRQ_Init(); + 300073a: 459010ef jal ra,3002392 + ANAVREF_Init(); + 300073e: 23e5 jal ra,3000d26 + ANATRIM_Entry(); + 3000740: 2b51 jal ra,3000cd4 + /* User Add Code Here */ + 3000742: 0001 nop + 3000744: 40f2 lw ra,28(sp) + 3000746: 4462 lw s0,24(sp) + 3000748: 6105 addi sp,sp,32 + 300074a: 8082 ret + +0300074c : + * @brief Calculate the conversion gain of the tsensor. + * @param data, original data. + * @retval None + */ +static void CalculateGain(unsigned int data) +{ + 300074c: 1101 addi sp,sp,-32 + 300074e: ce22 sw s0,28(sp) + 3000750: 1000 addi s0,sp,32 + 3000752: fea42623 sw a0,-20(s0) + g_tsensorGain = ((float)(data) / 10000000.0f); + 3000756: fec42783 lw a5,-20(s0) + 300075a: d017f753 fcvt.s.wu fa4,a5 + 300075e: 030067b7 lui a5,0x3006 + 3000762: 5887a787 flw fa5,1416(a5) # 3006588 <__rodata_start> + 3000766: 18f777d3 fdiv.s fa5,fa4,fa5 + 300076a: 040007b7 lui a5,0x4000 + 300076e: 02f7a027 fsw fa5,32(a5) # 4000020 +} + 3000772: 0001 nop + 3000774: 4472 lw s0,28(sp) + 3000776: 6105 addi sp,sp,32 + 3000778: 8082 ret + +0300077a : + * @brief Obtains the chip ID. + * @param None + * @retval None + */ +static bool CHIP_GetInfo(void) +{ + 300077a: 7179 addi sp,sp,-48 + 300077c: d606 sw ra,44(sp) + 300077e: d422 sw s0,40(sp) + 3000780: 1800 addi s0,sp,48 + FOTP_INFO_RGN0_NUMBER_4 emptyData; + FOTP_INFO_RGN0_NUMBER_2 idData; + FOTP_InfoGet(FOTP_INFO_RNG0, 4U, (void *)&emptyData.comData); /* 4 is the number of fotp_empty_flag in otp */ + 3000782: fe040793 addi a5,s0,-32 + 3000786: 863e mv a2,a5 + 3000788: 4591 li a1,4 + 300078a: 4501 li a0,0 + 300078c: 2391 jal ra,3000cd0 + FOTP_InfoGet(FOTP_INFO_RNG0, 2U, (void *)&idData.comData); /* 2 is the number of idData in otp */ + 300078e: fd040793 addi a5,s0,-48 + 3000792: 863e mv a2,a5 + 3000794: 4589 li a1,2 + 3000796: 4501 li a0,0 + 3000798: 2b25 jal ra,3000cd0 + if (emptyData.REG.fotp_empty_flag != 0x5AA59669 || idData.REG.chip_id == 0xFFFFFFFF) { + 300079a: fe042703 lw a4,-32(s0) + 300079e: 5aa597b7 lui a5,0x5aa59 + 30007a2: 66978793 addi a5,a5,1641 # 5aa59669 + 30007a6: 00f71763 bne a4,a5,30007b4 + 30007aa: fd042703 lw a4,-48(s0) + 30007ae: 57fd li a5,-1 + 30007b0: 00f71463 bne a4,a5,30007b8 + return false; + 30007b4: 4781 li a5,0 + 30007b6: a011 j 30007ba + } + return true; + 30007b8: 4785 li a5,1 +} + 30007ba: 853e mv a0,a5 + 30007bc: 50b2 lw ra,44(sp) + 30007be: 5422 lw s0,40(sp) + 30007c0: 6145 addi sp,sp,48 + 30007c2: 8082 ret + +030007c4 : + * @brief Analog module trim. + * @param None + * @retval None + */ +static void CHIP_AnalogTrim(void) +{ + 30007c4: 711d addi sp,sp,-96 + 30007c6: ce86 sw ra,92(sp) + 30007c8: cca2 sw s0,88(sp) + 30007ca: 1080 addi s0,sp,96 + FOTP_INFO_RGN0_NUMBER_20 trimData20; + FOTP_InfoGet(FOTP_INFO_RNG0, 20U, (void *)&trimData20.comData); /* 20 is the number of trim data in otp */ + 30007cc: fdc40793 addi a5,s0,-36 + 30007d0: 863e mv a2,a5 + 30007d2: 45d1 li a1,20 + 30007d4: 4501 li a0,0 + 30007d6: 29ed jal ra,3000cd0 + /* VREF */ + VREF->VREF_TRIM0.BIT.da_iref_trim = trimData20.REG.data0.da_iref_trim; + 30007d8: 18100737 lui a4,0x18100 + 30007dc: fdc42783 lw a5,-36(s0) + 30007e0: 83c1 srli a5,a5,0x10 + 30007e2: 9bfd andi a5,a5,-1 + 30007e4: 0ff7f693 andi a3,a5,255 + 30007e8: 433c lw a5,64(a4) + 30007ea: 0ff6f693 andi a3,a3,255 + 30007ee: f007f793 andi a5,a5,-256 + 30007f2: 8fd5 or a5,a5,a3 + 30007f4: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vref_trim = trimData20.REG.data0.da_ref_vref_trim; + 30007f6: 18100737 lui a4,0x18100 + 30007fa: fdc42783 lw a5,-36(s0) + 30007fe: 83a1 srli a5,a5,0x8 + 3000800: 9bfd andi a5,a5,-1 + 3000802: 0ff7f693 andi a3,a5,255 + 3000806: 433c lw a5,64(a4) + 3000808: 0ff6f693 andi a3,a3,255 + 300080c: 06a2 slli a3,a3,0x8 + 300080e: 7641 lui a2,0xffff0 + 3000810: 0ff60613 addi a2,a2,255 # ffff00ff + 3000814: 8ff1 and a5,a5,a2 + 3000816: 8fd5 or a5,a5,a3 + 3000818: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vbg_trim = trimData20.REG.data0.da_ref_vbg_trim; + 300081a: 18100737 lui a4,0x18100 + 300081e: fdc42783 lw a5,-36(s0) + 3000822: 0ff7f693 andi a3,a5,255 + 3000826: 433c lw a5,64(a4) + 3000828: 0ff6f693 andi a3,a3,255 + 300082c: 06c2 slli a3,a3,0x10 + 300082e: ff010637 lui a2,0xff010 + 3000832: 167d addi a2,a2,-1 # ff00ffff + 3000834: 8ff1 and a5,a5,a2 + 3000836: 8fd5 or a5,a5,a3 + 3000838: c33c sw a5,64(a4) + unsigned int value = trimData20.REG.data1.da_ref_temp_trim3; + 300083a: fe042783 lw a5,-32(s0) + 300083e: 83c1 srli a5,a5,0x10 + 3000840: 9bfd andi a5,a5,-1 + 3000842: 9f81 uxtb a5 + 3000844: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim2 << 8U); /* Shift left by 8 bits */ + 3000848: fe042783 lw a5,-32(s0) + 300084c: 83a1 srli a5,a5,0x8 + 300084e: 9bfd andi a5,a5,-1 + 3000850: 9f81 uxtb a5 + 3000852: 07a2 slli a5,a5,0x8 + 3000854: 873e mv a4,a5 + 3000856: fec42783 lw a5,-20(s0) + 300085a: 8fd9 or a5,a5,a4 + 300085c: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim1 << 16U); /* Shift left by 16 bits */ + 3000860: fe042783 lw a5,-32(s0) + 3000864: 9f81 uxtb a5 + 3000866: 07c2 slli a5,a5,0x10 + 3000868: 873e mv a4,a5 + 300086a: fec42783 lw a5,-20(s0) + 300086e: 8fd9 or a5,a5,a4 + 3000870: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data0.da_ref_temp_trim0 << 24U); /* Shift left by 24 bits */ + 3000874: fdc42783 lw a5,-36(s0) + 3000878: 83e1 srli a5,a5,0x18 + 300087a: 9f81 uxtb a5 + 300087c: 07e2 slli a5,a5,0x18 + 300087e: 873e mv a4,a5 + 3000880: fec42783 lw a5,-20(s0) + 3000884: 8fd9 or a5,a5,a4 + 3000886: fef42623 sw a5,-20(s0) + VREF->VREF_TRIM1.reg = value; + 300088a: 181007b7 lui a5,0x18100 + 300088e: fec42703 lw a4,-20(s0) + 3000892: c3f8 sw a4,68(a5) + + FOTP_INFO_RGN0_NUMBER_21 trimData21; + FOTP_InfoGet(FOTP_INFO_RNG0, 21U, (void *)&trimData21.comData); /* 21 is the number of trim data in otp */ + 3000894: fcc40793 addi a5,s0,-52 + 3000898: 863e mv a2,a5 + 300089a: 45d5 li a1,21 + 300089c: 4501 li a0,0 + 300089e: 290d jal ra,3000cd0 + /* ADC */ + ADC0->ADC_OEGE_TRIM.BIT.cfg_gain_cali_trim = trimData21.REG.data1.saradc_gain; + 30008a0: 18000737 lui a4,0x18000 + 30008a4: fd042783 lw a5,-48(s0) + 30008a8: 86be mv a3,a5 + 30008aa: 6789 lui a5,0x2 + 30008ac: 17fd addi a5,a5,-1 # 1fff + 30008ae: 8ff5 and a5,a5,a3 + 30008b0: 01079613 slli a2,a5,0x10 + 30008b4: 8241 srli a2,a2,0x10 + 30008b6: 6785 lui a5,0x1 + 30008b8: 973e add a4,a4,a5 + 30008ba: 80872783 lw a5,-2040(a4) # 17fff808 + 30008be: 6689 lui a3,0x2 + 30008c0: 16fd addi a3,a3,-1 # 1fff + 30008c2: 8ef1 and a3,a3,a2 + 30008c4: 06c2 slli a3,a3,0x10 + 30008c6: e0010637 lui a2,0xe0010 + 30008ca: 167d addi a2,a2,-1 # e000ffff + 30008cc: 8ff1 and a5,a5,a2 + 30008ce: 8fd5 or a5,a5,a3 + 30008d0: 80f72423 sw a5,-2040(a4) + ADC0->ADC_OEGE_TRIM.BIT.cfg_ofst_cali_trim = trimData21.REG.data1.saradc_offset; + 30008d4: 18000737 lui a4,0x18000 + 30008d8: fd042783 lw a5,-48(s0) + 30008dc: 83c1 srli a5,a5,0x10 + 30008de: 86be mv a3,a5 + 30008e0: 6785 lui a5,0x1 + 30008e2: 17fd addi a5,a5,-1 # fff + 30008e4: 8ff5 and a5,a5,a3 + 30008e6: 01079613 slli a2,a5,0x10 + 30008ea: 8241 srli a2,a2,0x10 + 30008ec: 6785 lui a5,0x1 + 30008ee: 973e add a4,a4,a5 + 30008f0: 80872783 lw a5,-2040(a4) # 17fff808 + 30008f4: 6685 lui a3,0x1 + 30008f6: 16fd addi a3,a3,-1 # fff + 30008f8: 8ef1 and a3,a3,a2 + 30008fa: 767d lui a2,0xfffff + 30008fc: 8ff1 and a5,a5,a2 + 30008fe: 8fd5 or a5,a5,a3 + 3000900: 80f72423 sw a5,-2040(a4) + + /* TSENSOR */ + TSENSOR->TSENSOR_TRIM.reg = trimData20.REG.data1.da_ref_vptat_trim; + 3000904: fe042783 lw a5,-32(s0) + 3000908: 83e1 srli a5,a5,0x18 + 300090a: 0ff7f713 andi a4,a5,255 + 300090e: 185007b7 lui a5,0x18500 + 3000912: cb98 sw a4,16(a5) + ADC0->ADC_TSENSOR_TRIM.BIT.cfg_tsensor_ofst_trim = trimData21.REG.data2.ts_offset; + 3000914: 18000737 lui a4,0x18000 + 3000918: fd442783 lw a5,-44(s0) + 300091c: 86be mv a3,a5 + 300091e: 6785 lui a5,0x1 + 3000920: 17fd addi a5,a5,-1 # fff + 3000922: 8ff5 and a5,a5,a3 + 3000924: 01079613 slli a2,a5,0x10 + 3000928: 8241 srli a2,a2,0x10 + 300092a: 6785 lui a5,0x1 + 300092c: 973e add a4,a4,a5 + 300092e: 80472783 lw a5,-2044(a4) # 17fff804 + 3000932: 6685 lui a3,0x1 + 3000934: 16fd addi a3,a3,-1 # fff + 3000936: 8ef1 and a3,a3,a2 + 3000938: 767d lui a2,0xfffff + 300093a: 8ff1 and a5,a5,a2 + 300093c: 8fd5 or a5,a5,a3 + 300093e: 80f72223 sw a5,-2044(a4) + CalculateGain(trimData21.REG.data3.ts_gain); + 3000942: fd842783 lw a5,-40(s0) + 3000946: 83a5 srli a5,a5,0x9 + 3000948: 853e mv a0,a5 + 300094a: 3509 jal ra,300074c + + /* PGA */ + PGA0->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga0_vos_trim; + 300094c: 18200737 lui a4,0x18200 + 3000950: fcc42783 lw a5,-52(s0) + 3000954: 1ff7f793 andi a5,a5,511 + 3000958: 01079693 slli a3,a5,0x10 + 300095c: 82c1 srli a3,a3,0x10 + 300095e: 531c lw a5,32(a4) + 3000960: 1ff6f693 andi a3,a3,511 + 3000964: e007f793 andi a5,a5,-512 + 3000968: 8fd5 or a5,a5,a3 + 300096a: d31c sw a5,32(a4) + PGA1->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga1_vos_trim; + 300096c: 18201737 lui a4,0x18201 + 3000970: fcc42783 lw a5,-52(s0) + 3000974: 83c1 srli a5,a5,0x10 + 3000976: 1ff7f793 andi a5,a5,511 + 300097a: 01079693 slli a3,a5,0x10 + 300097e: 82c1 srli a3,a3,0x10 + 3000980: 531c lw a5,32(a4) + 3000982: 1ff6f693 andi a3,a3,511 + 3000986: e007f793 andi a5,a5,-512 + 300098a: 8fd5 or a5,a5,a3 + 300098c: d31c sw a5,32(a4) + + FOTP_INFO_RGN0_NUMBER_22 trimData22; + FOTP_InfoGet(FOTP_INFO_RNG0, 22U, (void *)&trimData22.comData); /* 22 is the number of trim data in otp */ + 300098e: fbc40793 addi a5,s0,-68 + 3000992: 863e mv a2,a5 + 3000994: 45d9 li a1,22 + 3000996: 4501 li a0,0 + 3000998: 257d jal ra,3001046 + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_gain_trim2 = trimData22.REG.data0.pga0_gain2; + 300099a: 18000737 lui a4,0x18000 + 300099e: fbc42783 lw a5,-68(s0) + 30009a2: 86be mv a3,a5 + 30009a4: 6789 lui a5,0x2 + 30009a6: 17fd addi a5,a5,-1 # 1fff + 30009a8: 8ff5 and a5,a5,a3 + 30009aa: 01079613 slli a2,a5,0x10 + 30009ae: 8241 srli a2,a2,0x10 + 30009b0: 6785 lui a5,0x1 + 30009b2: 973e add a4,a4,a5 + 30009b4: 81472783 lw a5,-2028(a4) # 17fff814 + 30009b8: 6689 lui a3,0x2 + 30009ba: 16fd addi a3,a3,-1 # 1fff + 30009bc: 8ef1 and a3,a3,a2 + 30009be: 06c2 slli a3,a3,0x10 + 30009c0: e0010637 lui a2,0xe0010 + 30009c4: 167d addi a2,a2,-1 # e000ffff + 30009c6: 8ff1 and a5,a5,a2 + 30009c8: 8fd5 or a5,a5,a3 + 30009ca: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_ofst_trim2 = trimData22.REG.data0.pga0_offset2; + 30009ce: 18000737 lui a4,0x18000 + 30009d2: fbc42783 lw a5,-68(s0) + 30009d6: 83c1 srli a5,a5,0x10 + 30009d8: 86be mv a3,a5 + 30009da: 6785 lui a5,0x1 + 30009dc: 17fd addi a5,a5,-1 # fff + 30009de: 8ff5 and a5,a5,a3 + 30009e0: 01079613 slli a2,a5,0x10 + 30009e4: 8241 srli a2,a2,0x10 + 30009e6: 6785 lui a5,0x1 + 30009e8: 973e add a4,a4,a5 + 30009ea: 81472783 lw a5,-2028(a4) # 17fff814 + 30009ee: 6685 lui a3,0x1 + 30009f0: 16fd addi a3,a3,-1 # fff + 30009f2: 8ef1 and a3,a3,a2 + 30009f4: 767d lui a2,0xfffff + 30009f6: 8ff1 and a5,a5,a2 + 30009f8: 8fd5 or a5,a5,a3 + 30009fa: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_gain_trim4 = trimData22.REG.data1.pga0_gain4; + 30009fe: 18000737 lui a4,0x18000 + 3000a02: fc042783 lw a5,-64(s0) + 3000a06: 86be mv a3,a5 + 3000a08: 6789 lui a5,0x2 + 3000a0a: 17fd addi a5,a5,-1 # 1fff + 3000a0c: 8ff5 and a5,a5,a3 + 3000a0e: 01079613 slli a2,a5,0x10 + 3000a12: 8241 srli a2,a2,0x10 + 3000a14: 6785 lui a5,0x1 + 3000a16: 973e add a4,a4,a5 + 3000a18: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a1c: 6689 lui a3,0x2 + 3000a1e: 16fd addi a3,a3,-1 # 1fff + 3000a20: 8ef1 and a3,a3,a2 + 3000a22: 06c2 slli a3,a3,0x10 + 3000a24: e0010637 lui a2,0xe0010 + 3000a28: 167d addi a2,a2,-1 # e000ffff + 3000a2a: 8ff1 and a5,a5,a2 + 3000a2c: 8fd5 or a5,a5,a3 + 3000a2e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_ofst_trim4 = trimData22.REG.data1.pga0_offset4; + 3000a32: 18000737 lui a4,0x18000 + 3000a36: fc042783 lw a5,-64(s0) + 3000a3a: 83c1 srli a5,a5,0x10 + 3000a3c: 86be mv a3,a5 + 3000a3e: 6785 lui a5,0x1 + 3000a40: 17fd addi a5,a5,-1 # fff + 3000a42: 8ff5 and a5,a5,a3 + 3000a44: 01079613 slli a2,a5,0x10 + 3000a48: 8241 srli a2,a2,0x10 + 3000a4a: 6785 lui a5,0x1 + 3000a4c: 973e add a4,a4,a5 + 3000a4e: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a52: 6685 lui a3,0x1 + 3000a54: 16fd addi a3,a3,-1 # fff + 3000a56: 8ef1 and a3,a3,a2 + 3000a58: 767d lui a2,0xfffff + 3000a5a: 8ff1 and a5,a5,a2 + 3000a5c: 8fd5 or a5,a5,a3 + 3000a5e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_gain_trim8 = trimData22.REG.data2.pga0_gain8; + 3000a62: 18000737 lui a4,0x18000 + 3000a66: fc442783 lw a5,-60(s0) + 3000a6a: 86be mv a3,a5 + 3000a6c: 6789 lui a5,0x2 + 3000a6e: 17fd addi a5,a5,-1 # 1fff + 3000a70: 8ff5 and a5,a5,a3 + 3000a72: 01079613 slli a2,a5,0x10 + 3000a76: 8241 srli a2,a2,0x10 + 3000a78: 6785 lui a5,0x1 + 3000a7a: 973e add a4,a4,a5 + 3000a7c: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000a80: 6689 lui a3,0x2 + 3000a82: 16fd addi a3,a3,-1 # 1fff + 3000a84: 8ef1 and a3,a3,a2 + 3000a86: 06c2 slli a3,a3,0x10 + 3000a88: e0010637 lui a2,0xe0010 + 3000a8c: 167d addi a2,a2,-1 # e000ffff + 3000a8e: 8ff1 and a5,a5,a2 + 3000a90: 8fd5 or a5,a5,a3 + 3000a92: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_ofst_trim8 = trimData22.REG.data2.pga0_offset8; + 3000a96: 18000737 lui a4,0x18000 + 3000a9a: fc442783 lw a5,-60(s0) + 3000a9e: 83c1 srli a5,a5,0x10 + 3000aa0: 86be mv a3,a5 + 3000aa2: 6785 lui a5,0x1 + 3000aa4: 17fd addi a5,a5,-1 # fff + 3000aa6: 8ff5 and a5,a5,a3 + 3000aa8: 01079613 slli a2,a5,0x10 + 3000aac: 8241 srli a2,a2,0x10 + 3000aae: 6785 lui a5,0x1 + 3000ab0: 973e add a4,a4,a5 + 3000ab2: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000ab6: 6685 lui a3,0x1 + 3000ab8: 16fd addi a3,a3,-1 # fff + 3000aba: 8ef1 and a3,a3,a2 + 3000abc: 767d lui a2,0xfffff + 3000abe: 8ff1 and a5,a5,a2 + 3000ac0: 8fd5 or a5,a5,a3 + 3000ac2: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_gain_trim16 = trimData22.REG.data3.pga0_gain16; + 3000ac6: 18000737 lui a4,0x18000 + 3000aca: fc842783 lw a5,-56(s0) + 3000ace: 86be mv a3,a5 + 3000ad0: 6789 lui a5,0x2 + 3000ad2: 17fd addi a5,a5,-1 # 1fff + 3000ad4: 8ff5 and a5,a5,a3 + 3000ad6: 01079613 slli a2,a5,0x10 + 3000ada: 8241 srli a2,a2,0x10 + 3000adc: 6785 lui a5,0x1 + 3000ade: 973e add a4,a4,a5 + 3000ae0: 82072783 lw a5,-2016(a4) # 17fff820 + 3000ae4: 6689 lui a3,0x2 + 3000ae6: 16fd addi a3,a3,-1 # 1fff + 3000ae8: 8ef1 and a3,a3,a2 + 3000aea: 06c2 slli a3,a3,0x10 + 3000aec: e0010637 lui a2,0xe0010 + 3000af0: 167d addi a2,a2,-1 # e000ffff + 3000af2: 8ff1 and a5,a5,a2 + 3000af4: 8fd5 or a5,a5,a3 + 3000af6: 82f72023 sw a5,-2016(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_ofst_trim16 = trimData22.REG.data3.pga0_offset16; + 3000afa: 18000737 lui a4,0x18000 + 3000afe: fc842783 lw a5,-56(s0) + 3000b02: 83c1 srli a5,a5,0x10 + 3000b04: 86be mv a3,a5 + 3000b06: 6785 lui a5,0x1 + 3000b08: 17fd addi a5,a5,-1 # fff + 3000b0a: 8ff5 and a5,a5,a3 + 3000b0c: 01079613 slli a2,a5,0x10 + 3000b10: 8241 srli a2,a2,0x10 + 3000b12: 6785 lui a5,0x1 + 3000b14: 973e add a4,a4,a5 + 3000b16: 82072783 lw a5,-2016(a4) # 17fff820 + 3000b1a: 6685 lui a3,0x1 + 3000b1c: 16fd addi a3,a3,-1 # fff + 3000b1e: 8ef1 and a3,a3,a2 + 3000b20: 767d lui a2,0xfffff + 3000b22: 8ff1 and a5,a5,a2 + 3000b24: 8fd5 or a5,a5,a3 + 3000b26: 82f72023 sw a5,-2016(a4) + + FOTP_INFO_RGN0_NUMBER_23 trimData23; + FOTP_InfoGet(FOTP_INFO_RNG0, 23U, (void *)&trimData23.comData); /* 23 is the number of trim data in otp */ + 3000b2a: fac40793 addi a5,s0,-84 + 3000b2e: 863e mv a2,a5 + 3000b30: 45dd li a1,23 + 3000b32: 4501 li a0,0 + 3000b34: 2b09 jal ra,3001046 + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_gain_trim2 = trimData23.REG.data0.pga1_gain2; + 3000b36: 18000737 lui a4,0x18000 + 3000b3a: fac42783 lw a5,-84(s0) + 3000b3e: 86be mv a3,a5 + 3000b40: 6789 lui a5,0x2 + 3000b42: 17fd addi a5,a5,-1 # 1fff + 3000b44: 8ff5 and a5,a5,a3 + 3000b46: 01079613 slli a2,a5,0x10 + 3000b4a: 8241 srli a2,a2,0x10 + 3000b4c: 6785 lui a5,0x1 + 3000b4e: 973e add a4,a4,a5 + 3000b50: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b54: 6689 lui a3,0x2 + 3000b56: 16fd addi a3,a3,-1 # 1fff + 3000b58: 8ef1 and a3,a3,a2 + 3000b5a: 06c2 slli a3,a3,0x10 + 3000b5c: e0010637 lui a2,0xe0010 + 3000b60: 167d addi a2,a2,-1 # e000ffff + 3000b62: 8ff1 and a5,a5,a2 + 3000b64: 8fd5 or a5,a5,a3 + 3000b66: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_ofst_trim2 = trimData23.REG.data0.pga1_offset2; + 3000b6a: 18000737 lui a4,0x18000 + 3000b6e: fac42783 lw a5,-84(s0) + 3000b72: 83c1 srli a5,a5,0x10 + 3000b74: 86be mv a3,a5 + 3000b76: 6785 lui a5,0x1 + 3000b78: 17fd addi a5,a5,-1 # fff + 3000b7a: 8ff5 and a5,a5,a3 + 3000b7c: 01079613 slli a2,a5,0x10 + 3000b80: 8241 srli a2,a2,0x10 + 3000b82: 6785 lui a5,0x1 + 3000b84: 973e add a4,a4,a5 + 3000b86: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b8a: 6685 lui a3,0x1 + 3000b8c: 16fd addi a3,a3,-1 # fff + 3000b8e: 8ef1 and a3,a3,a2 + 3000b90: 767d lui a2,0xfffff + 3000b92: 8ff1 and a5,a5,a2 + 3000b94: 8fd5 or a5,a5,a3 + 3000b96: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_gain_trim4 = trimData23.REG.data1.pga1_gain4; + 3000b9a: 18000737 lui a4,0x18000 + 3000b9e: fb042783 lw a5,-80(s0) + 3000ba2: 86be mv a3,a5 + 3000ba4: 6789 lui a5,0x2 + 3000ba6: 17fd addi a5,a5,-1 # 1fff + 3000ba8: 8ff5 and a5,a5,a3 + 3000baa: 01079613 slli a2,a5,0x10 + 3000bae: 8241 srli a2,a2,0x10 + 3000bb0: 6785 lui a5,0x1 + 3000bb2: 973e add a4,a4,a5 + 3000bb4: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bb8: 6689 lui a3,0x2 + 3000bba: 16fd addi a3,a3,-1 # 1fff + 3000bbc: 8ef1 and a3,a3,a2 + 3000bbe: 06c2 slli a3,a3,0x10 + 3000bc0: e0010637 lui a2,0xe0010 + 3000bc4: 167d addi a2,a2,-1 # e000ffff + 3000bc6: 8ff1 and a5,a5,a2 + 3000bc8: 8fd5 or a5,a5,a3 + 3000bca: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_ofst_trim4 = trimData23.REG.data1.pga1_offset4; + 3000bce: 18000737 lui a4,0x18000 + 3000bd2: fb042783 lw a5,-80(s0) + 3000bd6: 83c1 srli a5,a5,0x10 + 3000bd8: 86be mv a3,a5 + 3000bda: 6785 lui a5,0x1 + 3000bdc: 17fd addi a5,a5,-1 # fff + 3000bde: 8ff5 and a5,a5,a3 + 3000be0: 01079613 slli a2,a5,0x10 + 3000be4: 8241 srli a2,a2,0x10 + 3000be6: 6785 lui a5,0x1 + 3000be8: 973e add a4,a4,a5 + 3000bea: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bee: 6685 lui a3,0x1 + 3000bf0: 16fd addi a3,a3,-1 # fff + 3000bf2: 8ef1 and a3,a3,a2 + 3000bf4: 767d lui a2,0xfffff + 3000bf6: 8ff1 and a5,a5,a2 + 3000bf8: 8fd5 or a5,a5,a3 + 3000bfa: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_gain_trim8 = trimData23.REG.data2.pga1_gain8; + 3000bfe: 18000737 lui a4,0x18000 + 3000c02: fb442783 lw a5,-76(s0) + 3000c06: 86be mv a3,a5 + 3000c08: 6789 lui a5,0x2 + 3000c0a: 17fd addi a5,a5,-1 # 1fff + 3000c0c: 8ff5 and a5,a5,a3 + 3000c0e: 01079613 slli a2,a5,0x10 + 3000c12: 8241 srli a2,a2,0x10 + 3000c14: 6785 lui a5,0x1 + 3000c16: 973e add a4,a4,a5 + 3000c18: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c1c: 6689 lui a3,0x2 + 3000c1e: 16fd addi a3,a3,-1 # 1fff + 3000c20: 8ef1 and a3,a3,a2 + 3000c22: 06c2 slli a3,a3,0x10 + 3000c24: e0010637 lui a2,0xe0010 + 3000c28: 167d addi a2,a2,-1 # e000ffff + 3000c2a: 8ff1 and a5,a5,a2 + 3000c2c: 8fd5 or a5,a5,a3 + 3000c2e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_ofst_trim8 = trimData23.REG.data2.pga1_offset8; + 3000c32: 18000737 lui a4,0x18000 + 3000c36: fb442783 lw a5,-76(s0) + 3000c3a: 83c1 srli a5,a5,0x10 + 3000c3c: 86be mv a3,a5 + 3000c3e: 6785 lui a5,0x1 + 3000c40: 17fd addi a5,a5,-1 # fff + 3000c42: 8ff5 and a5,a5,a3 + 3000c44: 01079613 slli a2,a5,0x10 + 3000c48: 8241 srli a2,a2,0x10 + 3000c4a: 6785 lui a5,0x1 + 3000c4c: 973e add a4,a4,a5 + 3000c4e: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c52: 6685 lui a3,0x1 + 3000c54: 16fd addi a3,a3,-1 # fff + 3000c56: 8ef1 and a3,a3,a2 + 3000c58: 767d lui a2,0xfffff + 3000c5a: 8ff1 and a5,a5,a2 + 3000c5c: 8fd5 or a5,a5,a3 + 3000c5e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_gain_trim16 = trimData23.REG.data3.pga1_gain16; + 3000c62: 18000737 lui a4,0x18000 + 3000c66: fb842783 lw a5,-72(s0) + 3000c6a: 86be mv a3,a5 + 3000c6c: 6789 lui a5,0x2 + 3000c6e: 17fd addi a5,a5,-1 # 1fff + 3000c70: 8ff5 and a5,a5,a3 + 3000c72: 01079613 slli a2,a5,0x10 + 3000c76: 8241 srli a2,a2,0x10 + 3000c78: 6785 lui a5,0x1 + 3000c7a: 973e add a4,a4,a5 + 3000c7c: 83072783 lw a5,-2000(a4) # 17fff830 + 3000c80: 6689 lui a3,0x2 + 3000c82: 16fd addi a3,a3,-1 # 1fff + 3000c84: 8ef1 and a3,a3,a2 + 3000c86: 06c2 slli a3,a3,0x10 + 3000c88: e0010637 lui a2,0xe0010 + 3000c8c: 167d addi a2,a2,-1 # e000ffff + 3000c8e: 8ff1 and a5,a5,a2 + 3000c90: 8fd5 or a5,a5,a3 + 3000c92: 82f72823 sw a5,-2000(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_ofst_trim16 = trimData23.REG.data3.pga1_offset16; + 3000c96: 18000737 lui a4,0x18000 + 3000c9a: fb842783 lw a5,-72(s0) + 3000c9e: 83c1 srli a5,a5,0x10 + 3000ca0: 86be mv a3,a5 + 3000ca2: 6785 lui a5,0x1 + 3000ca4: 17fd addi a5,a5,-1 # fff + 3000ca6: 8ff5 and a5,a5,a3 + 3000ca8: 01079613 slli a2,a5,0x10 + 3000cac: 8241 srli a2,a2,0x10 + 3000cae: 6785 lui a5,0x1 + 3000cb0: 973e add a4,a4,a5 + 3000cb2: 83072783 lw a5,-2000(a4) # 17fff830 + 3000cb6: 6685 lui a3,0x1 + 3000cb8: 16fd addi a3,a3,-1 # fff + 3000cba: 8ef1 and a3,a3,a2 + 3000cbc: 767d lui a2,0xfffff + 3000cbe: 8ff1 and a5,a5,a2 + 3000cc0: 8fd5 or a5,a5,a3 + 3000cc2: 82f72823 sw a5,-2000(a4) +} + 3000cc6: 0001 nop + 3000cc8: 40f6 lw ra,92(sp) + 3000cca: 4466 lw s0,88(sp) + 3000ccc: 6125 addi sp,sp,96 + 3000cce: 8082 ret + +03000cd0 : + 3000cd0: 3760006f j 3001046 + +03000cd4 : + * @brief Parameter calibration entry of the analog module. + * @param None + * @retval None + */ +void ANATRIM_Entry(void) +{ + 3000cd4: 1141 addi sp,sp,-16 + 3000cd6: c606 sw ra,12(sp) + 3000cd8: c422 sw s0,8(sp) + 3000cda: 0800 addi s0,sp,16 + if (CHIP_GetInfo() == false) { /* If the chip information is incorrect, calibration is not performed */ + 3000cdc: 3c79 jal ra,300077a + 3000cde: 87aa mv a5,a0 + 3000ce0: 0017c793 xori a5,a5,1 + 3000ce4: 9f81 uxtb a5 + 3000ce6: eb9d bnez a5,3000d1c + return; + } + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_ENABLE); /* Enable the clock for calibration */ + 3000ce8: 4585 li a1,1 + 3000cea: 18000537 lui a0,0x18000 + 3000cee: 2849 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_ENABLE); + 3000cf0: 4585 li a1,1 + 3000cf2: 18200537 lui a0,0x18200 + 3000cf6: 2069 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_ENABLE); + 3000cf8: 4585 li a1,1 + 3000cfa: 18201537 lui a0,0x18201 + 3000cfe: 2049 jal ra,3000d80 + CHIP_AnalogTrim(); + 3000d00: 34d1 jal ra,30007c4 + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_DISABLE); /* The clock is disabled after calibration */ + 3000d02: 4581 li a1,0 + 3000d04: 18000537 lui a0,0x18000 + 3000d08: 28a5 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_DISABLE); + 3000d0a: 4581 li a1,0 + 3000d0c: 18200537 lui a0,0x18200 + 3000d10: 2885 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_DISABLE); + 3000d12: 4581 li a1,0 + 3000d14: 18201537 lui a0,0x18201 + 3000d18: 20a5 jal ra,3000d80 + 3000d1a: a011 j 3000d1e + return; + 3000d1c: 0001 nop + 3000d1e: 40b2 lw ra,12(sp) + 3000d20: 4422 lw s0,8(sp) + 3000d22: 0141 addi sp,sp,16 + 3000d24: 8082 ret + +03000d26 : + * @brief Set Crg Core clock select + * @param None + * @retval None + */ +void ANAVREF_Init(void) +{ + 3000d26: 1141 addi sp,sp,-16 + 3000d28: c606 sw ra,12(sp) + 3000d2a: c422 sw s0,8(sp) + 3000d2c: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(VREF_BASE, IP_CLK_ENABLE); + 3000d2e: 4585 li a1,1 + 3000d30: 18100537 lui a0,0x18100 + 3000d34: 20b1 jal ra,3000d80 + VREF->VREF_CTRL1.BIT.da_ref_temp_trim_enh = 0x1; + 3000d36: 18100737 lui a4,0x18100 + 3000d3a: 531c lw a5,32(a4) + 3000d3c: 66c1 lui a3,0x10 + 3000d3e: 8fd5 or a5,a5,a3 + 3000d40: d31c sw a5,32(a4) + VREF->VREF_CTRL0.BIT.da_ref_enh = BASE_CFG_ENABLE; + 3000d42: 18100737 lui a4,0x18100 + 3000d46: 431c lw a5,0(a4) + 3000d48: 0017e793 ori a5,a5,1 + 3000d4c: c31c sw a5,0(a4) + BASE_FUNC_DELAY_US(200); /* delay 200us */ + 3000d4e: 000f47b7 lui a5,0xf4 + 3000d52: 24078593 addi a1,a5,576 # f4240 + 3000d56: 0c800513 li a0,200 + 3000d5a: 20b5 jal ra,3000dc6 + VREF->VREF_CTRL1.BIT.da_ref_chop_enh = BASE_CFG_ENABLE; + 3000d5c: 18100737 lui a4,0x18100 + 3000d60: 531c lw a5,32(a4) + 3000d62: 0017e793 ori a5,a5,1 + 3000d66: d31c sw a5,32(a4) + BASE_FUNC_DELAY_US(40); /* delay 40us */ + 3000d68: 000f47b7 lui a5,0xf4 + 3000d6c: 24078593 addi a1,a5,576 # f4240 + 3000d70: 02800513 li a0,40 + 3000d74: 2889 jal ra,3000dc6 + 3000d76: 0001 nop + 3000d78: 40b2 lw ra,12(sp) + 3000d7a: 4422 lw s0,8(sp) + 3000d7c: 0141 addi sp,sp,16 + 3000d7e: 8082 ret + +03000d80 : + 3000d80: 0b30206f j 3003632 + +03000d84 : + * @brief Set Crg Core clock select + * @param coreClkSelect Input core clock select value + * @retval None + */ +void CRG_SetCoreClockSelect(CRG_CoreClkSelect coreClkSelect) +{ + 3000d84: 715d addi sp,sp,-80 + 3000d86: c686 sw ra,76(sp) + 3000d88: c4a2 sw s0,72(sp) + 3000d8a: 0880 addi s0,sp,80 + 3000d8c: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3000d90: 100007b7 lui a5,0x10000 + 3000d94: fcf42423 sw a5,-56(s0) + crg.coreClkSelect = coreClkSelect; + 3000d98: fbc42783 lw a5,-68(s0) + 3000d9c: fef42023 sw a5,-32(s0) + if (crg.coreClkSelect == CRG_CORE_CLK_SELECT_TCXO) { /* If an external crystal oscillator is selected. */ + 3000da0: fe042703 lw a4,-32(s0) + 3000da4: 4785 li a5,1 + 3000da6: 00f71663 bne a4,a5,3000db2 + BASE_FUNC_DELAY_MS(10); /* 10: delay 10ms, wait clokc stable. */ + 3000daa: 3e800593 li a1,1000 + 3000dae: 4529 li a0,10 + 3000db0: 2819 jal ra,3000dc6 + } + HAL_CRG_SetCoreClockSelect(&crg); + 3000db2: fc840793 addi a5,s0,-56 + 3000db6: 853e mv a0,a5 + 3000db8: 572020ef jal ra,300332a + 3000dbc: 0001 nop + 3000dbe: 40b6 lw ra,76(sp) + 3000dc0: 4426 lw s0,72(sp) + 3000dc2: 6161 addi sp,sp,80 + 3000dc4: 8082 ret + +03000dc6 : + 3000dc6: 5160106f j 30022dc + +03000dca : + * @param frequence frequnce + * @param div Output Divison + * @retval None + */ +static void SetFlashDiv(unsigned int frequency, unsigned int *nreadDiv) +{ + 3000dca: 7179 addi sp,sp,-48 + 3000dcc: d622 sw s0,44(sp) + 3000dce: 1800 addi s0,sp,48 + 3000dd0: fca42e23 sw a0,-36(s0) + 3000dd4: fcb42c23 sw a1,-40(s0) + unsigned int div; + unsigned int freq = frequency; + 3000dd8: fdc42783 lw a5,-36(s0) + 3000ddc: fef42423 sw a5,-24(s0) + /* Get frequency divider of flash. */ + if (freq < FLASH_BASE_FREQ) { + 3000de0: fe842703 lw a4,-24(s0) + 3000de4: 023c37b7 lui a5,0x23c3 + 3000de8: 45f78793 addi a5,a5,1119 # 23c345f + 3000dec: 00e7e863 bltu a5,a4,3000dfc + freq = FLASH_BASE_FREQ; + 3000df0: 023c37b7 lui a5,0x23c3 + 3000df4: 46078793 addi a5,a5,1120 # 23c3460 + 3000df8: fef42423 sw a5,-24(s0) + } + /* Get the flash frequency division based on the frequency. */ + if ((freq % FLASH_BASE_FREQ) == 0) { + 3000dfc: fe842703 lw a4,-24(s0) + 3000e00: 023c37b7 lui a5,0x23c3 + 3000e04: 46078793 addi a5,a5,1120 # 23c3460 + 3000e08: 02f777b3 remu a5,a4,a5 + 3000e0c: ef81 bnez a5,3000e24 + div = freq / FLASH_BASE_FREQ; + 3000e0e: fe842703 lw a4,-24(s0) + 3000e12: 023c37b7 lui a5,0x23c3 + 3000e16: 46078793 addi a5,a5,1120 # 23c3460 + 3000e1a: 02f757b3 divu a5,a4,a5 + 3000e1e: fef42623 sw a5,-20(s0) + 3000e22: a821 j 3000e3a + } else { + div = (freq / FLASH_BASE_FREQ) + 1; + 3000e24: fe842703 lw a4,-24(s0) + 3000e28: 023c37b7 lui a5,0x23c3 + 3000e2c: 46078793 addi a5,a5,1120 # 23c3460 + 3000e30: 02f757b3 divu a5,a4,a5 + 3000e34: 0785 addi a5,a5,1 + 3000e36: fef42623 sw a5,-20(s0) + } + /* Ensure the flash frequency division is valid. */ + if (div > FLASH_MAX_DIV) { + 3000e3a: fec42703 lw a4,-20(s0) + 3000e3e: 4791 li a5,4 + 3000e40: 00e7f563 bgeu a5,a4,3000e4a + div = FLASH_MAX_DIV; + 3000e44: 4791 li a5,4 + 3000e46: fef42623 sw a5,-20(s0) + } + *nreadDiv = div; + 3000e4a: fd842783 lw a5,-40(s0) + 3000e4e: fec42703 lw a4,-20(s0) + 3000e52: c398 sw a4,0(a5) +} + 3000e54: 0001 nop + 3000e56: 5432 lw s0,44(sp) + 3000e58: 6145 addi sp,sp,48 + 3000e5a: 8082 ret + +03000e5c : + * @brief Get the Rounding up value + * @param coreClkSelect Core Clock select + * @retval Frequency of Flash + */ +static unsigned int GetFlashFreq(CRG_CoreClkSelect coreClkSelect) +{ + 3000e5c: 7179 addi sp,sp,-48 + 3000e5e: d606 sw ra,44(sp) + 3000e60: d422 sw s0,40(sp) + 3000e62: 1800 addi s0,sp,48 + 3000e64: fca42e23 sw a0,-36(s0) + unsigned int hclk; + /* Get frequency of flash. */ + switch (coreClkSelect) { + 3000e68: fdc42783 lw a5,-36(s0) + 3000e6c: 4705 li a4,1 + 3000e6e: 02e78063 beq a5,a4,3000e8e + 3000e72: 4705 li a4,1 + 3000e74: 00e7e663 bltu a5,a4,3000e80 + 3000e78: 4709 li a4,2 + 3000e7a: 02e78163 beq a5,a4,3000e9c + 3000e7e: a025 j 3000ea6 + case CRG_CORE_CLK_SELECT_HOSC: + hclk = HOSC_FREQ; + 3000e80: 017d87b7 lui a5,0x17d8 + 3000e84: 84078793 addi a5,a5,-1984 # 17d7840 + 3000e88: fef42623 sw a5,-20(s0) + break; + 3000e8c: a01d j 3000eb2 + case CRG_CORE_CLK_SELECT_TCXO: + hclk = XTRAIL_FREQ; + 3000e8e: 01c9c7b7 lui a5,0x1c9c + 3000e92: 38078793 addi a5,a5,896 # 1c9c380 + 3000e96: fef42623 sw a5,-20(s0) + break; + 3000e9a: a821 j 3000eb2 + case CRG_CORE_CLK_SELECT_PLL: + hclk = HAL_CRG_GetPllFreq(); + 3000e9c: 5b0020ef jal ra,300344c + 3000ea0: fea42623 sw a0,-20(s0) + break; + 3000ea4: a039 j 3000eb2 + default: + hclk = LOSC_FREQ; + 3000ea6: 67a1 lui a5,0x8 + 3000ea8: d0078793 addi a5,a5,-768 # 7d00 + 3000eac: fef42623 sw a5,-20(s0) + break; + 3000eb0: 0001 nop + } + return hclk; + 3000eb2: fec42783 lw a5,-20(s0) +} + 3000eb6: 853e mv a0,a5 + 3000eb8: 50b2 lw ra,44(sp) + 3000eba: 5422 lw s0,40(sp) + 3000ebc: 6145 addi sp,sp,48 + 3000ebe: 8082 ret + +03000ec0 : + * @brief Set flash clock frequence base on hclk + * @param coreClkSelect core clock select + * @retval None + */ +void FLASH_ClockConfig(CRG_CoreClkSelect coreClkSelect) +{ + 3000ec0: 7179 addi sp,sp,-48 + 3000ec2: d606 sw ra,44(sp) + 3000ec4: d422 sw s0,40(sp) + 3000ec6: 1800 addi s0,sp,48 + 3000ec8: fca42e23 sw a0,-36(s0) + EFC_RegStruct *efc = EFC; + 3000ecc: 147107b7 lui a5,0x14710 + 3000ed0: fef42623 sw a5,-20(s0) + EFLASH_CLK_CFG_REG cfg; + unsigned int hclk; + unsigned int nreadDiv; + + /* Step 1: Set nread_div */ + hclk = GetFlashFreq(coreClkSelect); + 3000ed4: fdc42503 lw a0,-36(s0) + 3000ed8: 3751 jal ra,3000e5c + 3000eda: fea42423 sw a0,-24(s0) + cfg.reg = efc->EFLASH_CLK_CFG.reg; + 3000ede: fec42703 lw a4,-20(s0) + 3000ee2: 6785 lui a5,0x1 + 3000ee4: 97ba add a5,a5,a4 + 3000ee6: 9407a783 lw a5,-1728(a5) # 940 + 3000eea: fef42223 sw a5,-28(s0) + SetFlashDiv(hclk, &nreadDiv); + 3000eee: fe040793 addi a5,s0,-32 + 3000ef2: 85be mv a1,a5 + 3000ef4: fe842503 lw a0,-24(s0) + 3000ef8: 3dc9 jal ra,3000dca + cfg.BIT.nread_div = nreadDiv; + 3000efa: fe042783 lw a5,-32(s0) + 3000efe: 8bbd andi a5,a5,15 + 3000f00: 0ff7f713 andi a4,a5,255 + 3000f04: fe442783 lw a5,-28(s0) + 3000f08: 8b3d andi a4,a4,15 + 3000f0a: 0712 slli a4,a4,0x4 + 3000f0c: f0f7f793 andi a5,a5,-241 + 3000f10: 8fd9 or a5,a5,a4 + 3000f12: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f16: fe442783 lw a5,-28(s0) + 3000f1a: 00100737 lui a4,0x100 + 3000f1e: 8fd9 or a5,a5,a4 + 3000f20: fef42223 sw a5,-28(s0) + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f24: fe442783 lw a5,-28(s0) + 3000f28: 00400737 lui a4,0x400 + 3000f2c: 8fd9 or a5,a5,a4 + 3000f2e: fef42223 sw a5,-28(s0) + + /* Step 2: Wait Busclk_sw_req */ + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f32: fe442783 lw a5,-28(s0) + 3000f36: 00400737 lui a4,0x400 + 3000f3a: 8fd9 or a5,a5,a4 + 3000f3c: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f40: fe442783 lw a5,-28(s0) + 3000f44: 00100737 lui a4,0x100 + 3000f48: 8fd9 or a5,a5,a4 + 3000f4a: fef42223 sw a5,-28(s0) + efc->EFLASH_CLK_CFG.reg = cfg.reg; + 3000f4e: fe442703 lw a4,-28(s0) + 3000f52: fec42683 lw a3,-20(s0) + 3000f56: 6785 lui a5,0x1 + 3000f58: 97b6 add a5,a5,a3 + 3000f5a: 94e7a023 sw a4,-1728(a5) # 940 + while (efc->EFLASH_CLK_CFG.BIT.busclk_sw_req == BASE_CFG_SET) { + 3000f5e: 0001 nop + 3000f60: fec42703 lw a4,-20(s0) + 3000f64: 6785 lui a5,0x1 + 3000f66: 97ba add a5,a5,a4 + 3000f68: 9407a783 lw a5,-1728(a5) # 940 + 3000f6c: 83d1 srli a5,a5,0x14 + 3000f6e: 8b85 andi a5,a5,1 + 3000f70: 0ff7f713 andi a4,a5,255 + 3000f74: 4785 li a5,1 + 3000f76: fef705e3 beq a4,a5,3000f60 + ; + } + 3000f7a: 0001 nop + 3000f7c: 50b2 lw ra,44(sp) + 3000f7e: 5422 lw s0,40(sp) + 3000f80: 6145 addi sp,sp,48 + 3000f82: 8082 ret + +03000f84 : + * @brief Init the systick + * @param None + * @retval None + */ +void SYSTICK_Init(void) +{ + 3000f84: 1141 addi sp,sp,-16 + 3000f86: c622 sw s0,12(sp) + 3000f88: 0800 addi s0,sp,16 + SYSTICK->TIMER_CTRL.reg = 0; + 3000f8a: 143807b7 lui a5,0x14380 + 3000f8e: 0007a023 sw zero,0(a5) # 14380000 + SYSTICK->TIMER_CTRL.BIT.enable = 1; + 3000f92: 14380737 lui a4,0x14380 + 3000f96: 431c lw a5,0(a4) + 3000f98: 0017e793 ori a5,a5,1 + 3000f9c: c31c sw a5,0(a4) +} + 3000f9e: 0001 nop + 3000fa0: 4432 lw s0,12(sp) + 3000fa2: 0141 addi sp,sp,16 + 3000fa4: 8082 ret + +03000fa6 : + * @brief Get the Systick frep(Hz) + * @param None + * @retval Clock frep of systick(Hz) + */ +unsigned int SYSTICK_GetCRGHZ(void) +{ + 3000fa6: 1141 addi sp,sp,-16 + 3000fa8: c606 sw ra,12(sp) + 3000faa: c422 sw s0,8(sp) + 3000fac: 0800 addi s0,sp,16 + /* Get the Systick IP */ + return HAL_CRG_GetIpFreq(SYSTICK_BASE); + 3000fae: 14380537 lui a0,0x14380 + 3000fb2: 59c020ef jal ra,300354e + 3000fb6: 87aa mv a5,a0 + 3000fb8: 853e mv a0,a5 + 3000fba: 40b2 lw ra,12(sp) + 3000fbc: 4422 lw s0,8(sp) + 3000fbe: 0141 addi sp,sp,16 + 3000fc0: 8082 ret + +03000fc2 : + * @param efc Flash control register base address + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +static unsigned int FOTP_CheckReadStatus(EFC_RegStruct *efc) +{ + 3000fc2: 1101 addi sp,sp,-32 + 3000fc4: ce22 sw s0,28(sp) + 3000fc6: 1000 addi s0,sp,32 + 3000fc8: fea42623 sw a0,-20(s0) + /* Check for errors in the flash reading process. */ + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fcc: fec42783 lw a5,-20(s0) + 3000fd0: 1007a783 lw a5,256(a5) + 3000fd4: 83c1 srli a5,a5,0x10 + 3000fd6: 8b85 andi a5,a5,1 + 3000fd8: 9f81 uxtb a5 + 3000fda: e38d bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000fdc: fec42783 lw a5,-20(s0) + 3000fe0: 1007a783 lw a5,256(a5) + 3000fe4: 83cd srli a5,a5,0x13 + 3000fe6: 8b85 andi a5,a5,1 + 3000fe8: 9f81 uxtb a5 + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fea: eb89 bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_chk) { + 3000fec: fec42783 lw a5,-20(s0) + 3000ff0: 1007a783 lw a5,256(a5) + 3000ff4: 83d1 srli a5,a5,0x14 + 3000ff6: 8b85 andi a5,a5,1 + 3000ff8: 9f81 uxtb a5 + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000ffa: c3a9 beqz a5,300103c + efc->INT_CLEAR.BIT.int_clr_err_ecc_corr = BASE_CFG_SET; + 3000ffc: fec42703 lw a4,-20(s0) + 3001000: 10c72783 lw a5,268(a4) # 1438010c + 3001004: 000806b7 lui a3,0x80 + 3001008: 8fd5 or a5,a5,a3 + 300100a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_illegal = BASE_CFG_SET; + 300100e: fec42703 lw a4,-20(s0) + 3001012: 10c72783 lw a5,268(a4) + 3001016: 66c1 lui a3,0x10 + 3001018: 8fd5 or a5,a5,a3 + 300101a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_ecc_chk = BASE_CFG_SET; + 300101e: fec42703 lw a4,-20(s0) + 3001022: 10c72783 lw a5,268(a4) + 3001026: 001006b7 lui a3,0x100 + 300102a: 8fd5 or a5,a5,a3 + 300102c: 10f72623 sw a5,268(a4) + efc->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001030: fec42783 lw a5,-20(s0) + 3001034: 2007a023 sw zero,512(a5) + return BASE_STATUS_ERROR; + 3001038: 4785 li a5,1 + 300103a: a011 j 300103e + } + return BASE_STATUS_OK; + 300103c: 4781 li a5,0 +} + 300103e: 853e mv a0,a5 + 3001040: 4472 lw s0,28(sp) + 3001042: 6105 addi sp,sp,32 + 3001044: 8082 ret + +03001046 : + * @param buf Buffer of read data + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +unsigned int FOTP_InfoGet(FOTP_InfoRngType type, unsigned int index, FOTP_CommonData *buf) +{ + 3001046: 7179 addi sp,sp,-48 + 3001048: d606 sw ra,44(sp) + 300104a: d422 sw s0,40(sp) + 300104c: 1800 addi s0,sp,48 + 300104e: fca42e23 sw a0,-36(s0) + 3001052: fcb42c23 sw a1,-40(s0) + 3001056: fcc42a23 sw a2,-44(s0) + EFC_RegStruct *p = EFC; + 300105a: 147107b7 lui a5,0x14710 + 300105e: fef42423 sw a5,-24(s0) + unsigned int addr; + + if (buf == NULL) { + 3001062: fd442783 lw a5,-44(s0) + 3001066: e399 bnez a5,300106c + return BASE_STATUS_ERROR; + 3001068: 4785 li a5,1 + 300106a: aa15 j 300119e + } + + if ((type >= FOTP_INFO_MAXTYPE) || (index > FOTP_INFO_REG_MAX_ID)) { + 300106c: fdc42703 lw a4,-36(s0) + 3001070: 4785 li a5,1 + 3001072: 00e7e763 bltu a5,a4,3001080 + 3001076: fd842703 lw a4,-40(s0) + 300107a: 47e5 li a5,25 + 300107c: 00e7f463 bgeu a5,a4,3001084 + return BASE_STATUS_ERROR; + 3001080: 4785 li a5,1 + 3001082: aa31 j 300119e + } + + /* If there is a read command, return */ + if (p->EFLASH_CMD.BIT.cmd_start) { + 3001084: fe842783 lw a5,-24(s0) + 3001088: 439c lw a5,0(a5) + 300108a: 8b85 andi a5,a5,1 + 300108c: 9f81 uxtb a5 + 300108e: c399 beqz a5,3001094 + return BASE_STATUS_ERROR; + 3001090: 4785 li a5,1 + 3001092: a231 j 300119e + } + + p->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; + 3001094: fe842783 lw a5,-24(s0) + 3001098: fedcc737 lui a4,0xfedcc + 300109c: a9870713 addi a4,a4,-1384 # fedcba98 + 30010a0: 20e7a023 sw a4,512(a5) # 14710200 + + /* Configure the read command parameters and start the read command */ + addr = (type == FOTP_INFO_RNG0) ? FOTP_INFO_RNG0_BASEADDR : FOTP_INFO_RNG1_BASEADDR; + 30010a4: fdc42783 lw a5,-36(s0) + 30010a8: e781 bnez a5,30010b0 + 30010aa: 008007b7 lui a5,0x800 + 30010ae: a019 j 30010b4 + 30010b0: 008017b7 lui a5,0x801 + 30010b4: fef42223 sw a5,-28(s0) + addr += index * REG_WORDS_NUM; + 30010b8: fd842783 lw a5,-40(s0) + 30010bc: 0792 slli a5,a5,0x4 + 30010be: fe442703 lw a4,-28(s0) + 30010c2: 97ba add a5,a5,a4 + 30010c4: fef42223 sw a5,-28(s0) + p->EFLASH_ADDR.BIT.cmd_addr = addr >> 2; /* Right shift 2 bit change to word */ + 30010c8: fe442783 lw a5,-28(s0) + 30010cc: 0027d713 srli a4,a5,0x2 + 30010d0: 004007b7 lui a5,0x400 + 30010d4: 17fd addi a5,a5,-1 # 3fffff + 30010d6: 00f77633 and a2,a4,a5 + 30010da: fe842703 lw a4,-24(s0) + 30010de: 435c lw a5,4(a4) + 30010e0: 004006b7 lui a3,0x400 + 30010e4: 16fd addi a3,a3,-1 # 3fffff + 30010e6: 8ef1 and a3,a3,a2 + 30010e8: 068a slli a3,a3,0x2 + 30010ea: ff000637 lui a2,0xff000 + 30010ee: 060d addi a2,a2,3 # ff000003 + 30010f0: 8ff1 and a5,a5,a2 + 30010f2: 8fd5 or a5,a5,a3 + 30010f4: c35c sw a5,4(a4) + p->EFLASH_CMD.BIT.cmd_code = FLASH_OPERATION_READ; + 30010f6: fe842703 lw a4,-24(s0) + 30010fa: 431c lw a5,0(a4) + 30010fc: 8ff7f793 andi a5,a5,-1793 + 3001100: 1007e793 ori a5,a5,256 + 3001104: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_read_size = FLASH_READ_128BIT; + 3001106: fe842703 lw a4,-24(s0) + 300110a: 431c lw a5,0(a4) + 300110c: d00006b7 lui a3,0xd0000 + 3001110: 16fd addi a3,a3,-1 # cfffffff + 3001112: 8efd and a3,a3,a5 + 3001114: 100007b7 lui a5,0x10000 + 3001118: 8fd5 or a5,a5,a3 + 300111a: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_start = BASE_CFG_SET; + 300111c: fe842703 lw a4,-24(s0) + 3001120: 431c lw a5,0(a4) + 3001122: 0017e793 ori a5,a5,1 + 3001126: c31c sw a5,0(a4) + + while (p->EFLASH_CMD.BIT.cmd_start) { + 3001128: 0001 nop + 300112a: fe842783 lw a5,-24(s0) + 300112e: 439c lw a5,0(a5) + 3001130: 8b85 andi a5,a5,1 + 3001132: 9f81 uxtb a5 + 3001134: fbfd bnez a5,300112a + ; + } + while (p->EFLASH_CMD.BIT.exec_state) { + 3001136: 0001 nop + 3001138: fe842783 lw a5,-24(s0) + 300113c: 439c lw a5,0(a5) + 300113e: 8399 srli a5,a5,0x6 + 3001140: 8b8d andi a5,a5,3 + 3001142: 9f81 uxtb a5 + 3001144: fbf5 bnez a5,3001138 + ; + } + /* read error, clear interrupt and return */ + if (FOTP_CheckReadStatus(p) != BASE_STATUS_OK) { + 3001146: fe842503 lw a0,-24(s0) + 300114a: 3da5 jal ra,3000fc2 + 300114c: 87aa mv a5,a0 + 300114e: c399 beqz a5,3001154 + return BASE_STATUS_ERROR; + 3001150: 4785 li a5,1 + 3001152: a0b1 j 300119e + } + /* Read data from FIFO to buffer */ + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001154: fe042623 sw zero,-20(s0) + 3001158: a00d j 300117a + buf->data[i] = p->FLASH_RDATA; + 300115a: fe842783 lw a5,-24(s0) + 300115e: 6007a703 lw a4,1536(a5) # 10000600 + 3001162: fd442683 lw a3,-44(s0) + 3001166: fec42783 lw a5,-20(s0) + 300116a: 078a slli a5,a5,0x2 + 300116c: 97b6 add a5,a5,a3 + 300116e: c398 sw a4,0(a5) + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001170: fec42783 lw a5,-20(s0) + 3001174: 0785 addi a5,a5,1 + 3001176: fef42623 sw a5,-20(s0) + 300117a: fec42703 lw a4,-20(s0) + 300117e: 478d li a5,3 + 3001180: fce7fde3 bgeu a5,a4,300115a + } + p->INT_CLEAR.BIT.int_clr_finish = BASE_CFG_SET; + 3001184: fe842703 lw a4,-24(s0) + 3001188: 10c72783 lw a5,268(a4) + 300118c: 0107e793 ori a5,a5,16 + 3001190: 10f72623 sw a5,268(a4) + p->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001194: fe842783 lw a5,-24(s0) + 3001198: 2007a023 sw zero,512(a5) + return BASE_STATUS_OK; + 300119c: 4781 li a5,0 + 300119e: 853e mv a0,a5 + 30011a0: 50b2 lw ra,44(sp) + 30011a2: 5422 lw s0,40(sp) + 30011a4: 6145 addi sp,sp,48 + 30011a6: 8082 ret + +030011a8 : + * @param baseAddr The ip base address + * @retval The Address(offset) in g_crgIpMatch if match success + * @retval 0 if match fail + */ +CHIP_CrgIpMatchInfo *GetCrgIpMatchInfo(const void *baseAddr) +{ + 30011a8: 7179 addi sp,sp,-48 + 30011aa: d622 sw s0,44(sp) + 30011ac: 1800 addi s0,sp,48 + 30011ae: fca42e23 sw a0,-36(s0) + unsigned int i; + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011b2: fe042623 sw zero,-20(s0) + 30011b6: a081 j 30011f6 + if (baseAddr == g_crgIpMatch[i].ipBaseAddr) { + 30011b8: 030067b7 lui a5,0x3006 + 30011bc: 58c78713 addi a4,a5,1420 # 300658c + 30011c0: fec42683 lw a3,-20(s0) + 30011c4: 47b1 li a5,12 + 30011c6: 02f687b3 mul a5,a3,a5 + 30011ca: 97ba add a5,a5,a4 + 30011cc: 439c lw a5,0(a5) + 30011ce: fdc42703 lw a4,-36(s0) + 30011d2: 00f71d63 bne a4,a5,30011ec + return (CHIP_CrgIpMatchInfo *)&g_crgIpMatch[i]; + 30011d6: fec42703 lw a4,-20(s0) + 30011da: 47b1 li a5,12 + 30011dc: 02f70733 mul a4,a4,a5 + 30011e0: 030067b7 lui a5,0x3006 + 30011e4: 58c78793 addi a5,a5,1420 # 300658c + 30011e8: 97ba add a5,a5,a4 + 30011ea: a829 j 3001204 + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011ec: fec42783 lw a5,-20(s0) + 30011f0: 0785 addi a5,a5,1 + 30011f2: fef42623 sw a5,-20(s0) + 30011f6: fec42703 lw a4,-20(s0) + 30011fa: 02d00793 li a5,45 + 30011fe: fae7fde3 bgeu a5,a4,30011b8 + } + } + return (CHIP_CrgIpMatchInfo *)0; /* The base address does not match, return 0. */ + 3001202: 4781 li a5,0 +} + 3001204: 853e mv a0,a5 + 3001206: 5432 lw s0,44(sp) + 3001208: 6145 addi sp,sp,48 + 300120a: 8082 ret + +0300120c : + * @brief Check ADC sample input. + * @param input Number of input. + * @retval bool + */ +static inline bool IsADCSampleChannel(ADC_Input input) +{ + 300120c: 1101 addi sp,sp,-32 + 300120e: ce22 sw s0,28(sp) + 3001210: 1000 addi s0,sp,32 + 3001212: fea42623 sw a0,-20(s0) + return (input >= ADC_CH_ADCINA0) && (input <= ADC_CH_ADCINA19); + 3001216: fec42783 lw a5,-20(s0) + 300121a: 0147b793 sltiu a5,a5,20 + 300121e: 9f81 uxtb a5 +} + 3001220: 853e mv a0,a5 + 3001222: 4472 lw s0,28(sp) + 3001224: 6105 addi sp,sp,32 + 3001226: 8082 ret + +03001228 : + * are configured through the SOC. + * @param soc Number of SOC. + * @retval bool + */ +static inline bool IsADCSOCx(ADC_SOCNumber soc) +{ + 3001228: 1101 addi sp,sp,-32 + 300122a: ce22 sw s0,28(sp) + 300122c: 1000 addi s0,sp,32 + 300122e: fea42623 sw a0,-20(s0) + return (soc >= ADC_SOC_NUM0) && (soc <= ADC_SOC_NUM15); + 3001232: fec42783 lw a5,-20(s0) + 3001236: 0107b793 sltiu a5,a5,16 + 300123a: 9f81 uxtb a5 +} + 300123c: 853e mv a0,a5 + 300123e: 4472 lw s0,28(sp) + 3001240: 6105 addi sp,sp,32 + 3001242: 8082 ret + +03001244 : + * @brief Check ADC interrupt parameter. + * @param intx Number of interrupt. + * @retval bool + */ +static inline bool IsADCIntx(ADC_IntNumber intx) +{ + 3001244: 1101 addi sp,sp,-32 + 3001246: ce22 sw s0,28(sp) + 3001248: 1000 addi s0,sp,32 + 300124a: fea42623 sw a0,-20(s0) + return (intx >= ADC_INT_NUMBER0) && (intx <= ADC_INT_NUMBER3); + 300124e: fec42783 lw a5,-20(s0) + 3001252: 0047b793 sltiu a5,a5,4 + 3001256: 9f81 uxtb a5 +} + 3001258: 853e mv a0,a5 + 300125a: 4472 lw s0,28(sp) + 300125c: 6105 addi sp,sp,32 + 300125e: 8082 ret + +03001260 : + * @brief Check SOC trigger source. + * @param trig Type of trigger source. + * @retval bool + */ +static inline bool IsADCTrigSource(ADC_TrigSource trig) +{ + 3001260: 1101 addi sp,sp,-32 + 3001262: ce22 sw s0,28(sp) + 3001264: 1000 addi s0,sp,32 + 3001266: fea42623 sw a0,-20(s0) + return (trig >= ADC_TRIGSOC_SOFT) && (trig <= ADC_TRIGSOC_GPIOPF1); + 300126a: fec42783 lw a5,-20(s0) + 300126e: 0157b793 sltiu a5,a5,21 + 3001272: 9f81 uxtb a5 +} + 3001274: 853e mv a0,a5 + 3001276: 4472 lw s0,28(sp) + 3001278: 6105 addi sp,sp,32 + 300127a: 8082 ret + +0300127c : + * @brief Check mode of completion of SOC sample + * @param mode Type of completion. + * @retval bool + */ +static inline bool IsADCFinishMode(ADC_SOCFinishMode mode) +{ + 300127c: 1101 addi sp,sp,-32 + 300127e: ce22 sw s0,28(sp) + 3001280: 1000 addi s0,sp,32 + 3001282: fea42623 sw a0,-20(s0) + return (mode >= ADC_SOCFINISH_NONE) && (mode <= ADC_SOCFINISH_INT3); + 3001286: fec42783 lw a5,-20(s0) + 300128a: cb81 beqz a5,300129a + 300128c: fec42703 lw a4,-20(s0) + 3001290: 4799 li a5,6 + 3001292: 00e7e463 bltu a5,a4,300129a + 3001296: 4785 li a5,1 + 3001298: a011 j 300129c + 300129a: 4781 li a5,0 + 300129c: 8b85 andi a5,a5,1 + 300129e: 9f81 uxtb a5 +} + 30012a0: 853e mv a0,a5 + 30012a2: 4472 lw s0,28(sp) + 30012a4: 6105 addi sp,sp,32 + 30012a6: 8082 ret + +030012a8 : + * @brief Check ADC sample priority parameter. + * @param mode Priority mode of SOC. + * @retval bool + */ +static inline bool IsADCPriorityMode(ADC_PriorityMode mode) +{ + 30012a8: 1101 addi sp,sp,-32 + 30012aa: ce22 sw s0,28(sp) + 30012ac: 1000 addi s0,sp,32 + 30012ae: fea42623 sw a0,-20(s0) + return (mode >= ADC_PRIMODE_ALL_ROUND) && (mode <= ADC_PRIMODE_ALL_PRIORITY); + 30012b2: fec42703 lw a4,-20(s0) + 30012b6: 67c1 lui a5,0x10 + 30012b8: 00f737b3 sltu a5,a4,a5 + 30012bc: 9f81 uxtb a5 +} + 30012be: 853e mv a0,a5 + 30012c0: 4472 lw s0,28(sp) + 30012c2: 6105 addi sp,sp,32 + 30012c4: 8082 ret + +030012c6 : + * @brief Check time of total ADC sampling time. + * @param acqps Time of total ADC sampling time. + * @retval bool + */ +static inline bool IsADCTotalTime(unsigned int acqps) +{ + 30012c6: 1101 addi sp,sp,-32 + 30012c8: ce22 sw s0,28(sp) + 30012ca: 1000 addi s0,sp,32 + 30012cc: fea42623 sw a0,-20(s0) + return (acqps <= ADC_SOCSAMPLE_500CLK); + 30012d0: fec42783 lw a5,-20(s0) + 30012d4: 0107b793 sltiu a5,a5,16 + 30012d8: 9f81 uxtb a5 +} + 30012da: 853e mv a0,a5 + 30012dc: 4472 lw s0,28(sp) + 30012de: 6105 addi sp,sp,32 + 30012e0: 8082 ret + +030012e2 : + * @brief Enable AVDD/3 Channal. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_EnableAvddChannel(ADC_RegStruct * const adcx) +{ + 30012e2: 1101 addi sp,sp,-32 + 30012e4: ce06 sw ra,28(sp) + 30012e6: cc22 sw s0,24(sp) + 30012e8: 1000 addi s0,sp,32 + 30012ea: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30012ee: fec42703 lw a4,-20(s0) + 30012f2: 180007b7 lui a5,0x18000 + 30012f6: 00f70b63 beq a4,a5,300130c + 30012fa: 6785 lui a5,0x1 + 30012fc: 86278593 addi a1,a5,-1950 # 862 + 3001300: 030067b7 lui a5,0x3006 + 3001304: 7b478513 addi a0,a5,1972 # 30067b4 + 3001308: 2dad jal ra,3001982 + 300130a: a001 j 300130a + adcx->ADC_AVDD_EN.BIT.cfg_avdd_en = true; + 300130c: fec42703 lw a4,-20(s0) + 3001310: 65872783 lw a5,1624(a4) + 3001314: 0017e793 ori a5,a5,1 + 3001318: 64f72c23 sw a5,1624(a4) +} + 300131c: 0001 nop + 300131e: 40f2 lw ra,28(sp) + 3001320: 4462 lw s0,24(sp) + 3001322: 6105 addi sp,sp,32 + 3001324: 8082 ret + +03001326 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt0(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001326: 7179 addi sp,sp,-48 + 3001328: d606 sw ra,44(sp) + 300132a: d422 sw s0,40(sp) + 300132c: 1800 addi s0,sp,48 + 300132e: fca42e23 sw a0,-36(s0) + 3001332: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001336: fdc42703 lw a4,-36(s0) + 300133a: 180007b7 lui a5,0x18000 + 300133e: 00f70b63 beq a4,a5,3001354 + 3001342: 6785 lui a5,0x1 + 3001344: 87978593 addi a1,a5,-1927 # 879 + 3001348: 030067b7 lui a5,0x3006 + 300134c: 7b478513 addi a0,a5,1972 # 30067b4 + 3001350: 2d0d jal ra,3001982 + 3001352: a001 j 3001352 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 3001354: fd842503 lw a0,-40(s0) + 3001358: 3dc1 jal ra,3001228 + 300135a: 87aa mv a5,a0 + 300135c: 0017c793 xori a5,a5,1 + 3001360: 9f81 uxtb a5 + 3001362: cb91 beqz a5,3001376 + 3001364: 6785 lui a5,0x1 + 3001366: 87a78593 addi a1,a5,-1926 # 87a + 300136a: 030067b7 lui a5,0x3006 + 300136e: 7b478513 addi a0,a5,1972 # 30067b4 + 3001372: 2d01 jal ra,3001982 + 3001374: a01d j 300139a + unsigned int shiftBit = (unsigned int)socx; + 3001376: fd842783 lw a5,-40(s0) + 300137a: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 300137e: fdc42783 lw a5,-36(s0) + 3001382: 2b07a703 lw a4,688(a5) + 3001386: 4685 li a3,1 + 3001388: fec42783 lw a5,-20(s0) + 300138c: 00f697b3 sll a5,a3,a5 + 3001390: 8f5d or a4,a4,a5 + 3001392: fdc42783 lw a5,-36(s0) + 3001396: 2ae7a823 sw a4,688(a5) +} + 300139a: 50b2 lw ra,44(sp) + 300139c: 5422 lw s0,40(sp) + 300139e: 6145 addi sp,sp,48 + 30013a0: 8082 ret + +030013a2 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt1(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30013a2: 7179 addi sp,sp,-48 + 30013a4: d606 sw ra,44(sp) + 30013a6: d422 sw s0,40(sp) + 30013a8: 1800 addi s0,sp,48 + 30013aa: fca42e23 sw a0,-36(s0) + 30013ae: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30013b2: fdc42703 lw a4,-36(s0) + 30013b6: 180007b7 lui a5,0x18000 + 30013ba: 00f70b63 beq a4,a5,30013d0 + 30013be: 6785 lui a5,0x1 + 30013c0: 89478593 addi a1,a5,-1900 # 894 + 30013c4: 030067b7 lui a5,0x3006 + 30013c8: 7b478513 addi a0,a5,1972 # 30067b4 + 30013cc: 2b5d jal ra,3001982 + 30013ce: a001 j 30013ce + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30013d0: fd842503 lw a0,-40(s0) + 30013d4: 3d91 jal ra,3001228 + 30013d6: 87aa mv a5,a0 + 30013d8: 0017c793 xori a5,a5,1 + 30013dc: 9f81 uxtb a5 + 30013de: cb91 beqz a5,30013f2 + 30013e0: 6785 lui a5,0x1 + 30013e2: 89578593 addi a1,a5,-1899 # 895 + 30013e6: 030067b7 lui a5,0x3006 + 30013ea: 7b478513 addi a0,a5,1972 # 30067b4 + 30013ee: 2b51 jal ra,3001982 + 30013f0: a025 j 3001418 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30013f2: fd842783 lw a5,-40(s0) + 30013f6: 07c1 addi a5,a5,16 + 30013f8: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 30013fc: fdc42783 lw a5,-36(s0) + 3001400: 2b07a703 lw a4,688(a5) + 3001404: 4685 li a3,1 + 3001406: fec42783 lw a5,-20(s0) + 300140a: 00f697b3 sll a5,a3,a5 + 300140e: 8f5d or a4,a4,a5 + 3001410: fdc42783 lw a5,-36(s0) + 3001414: 2ae7a823 sw a4,688(a5) +} + 3001418: 50b2 lw ra,44(sp) + 300141a: 5422 lw s0,40(sp) + 300141c: 6145 addi sp,sp,48 + 300141e: 8082 ret + +03001420 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt2(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001420: 7179 addi sp,sp,-48 + 3001422: d606 sw ra,44(sp) + 3001424: d422 sw s0,40(sp) + 3001426: 1800 addi s0,sp,48 + 3001428: fca42e23 sw a0,-36(s0) + 300142c: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001430: fdc42703 lw a4,-36(s0) + 3001434: 180007b7 lui a5,0x18000 + 3001438: 00f70b63 beq a4,a5,300144e + 300143c: 6785 lui a5,0x1 + 300143e: 8af78593 addi a1,a5,-1873 # 8af + 3001442: 030067b7 lui a5,0x3006 + 3001446: 7b478513 addi a0,a5,1972 # 30067b4 + 300144a: 2b25 jal ra,3001982 + 300144c: a001 j 300144c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300144e: fd842503 lw a0,-40(s0) + 3001452: 3bd9 jal ra,3001228 + 3001454: 87aa mv a5,a0 + 3001456: 0017c793 xori a5,a5,1 + 300145a: 9f81 uxtb a5 + 300145c: cb91 beqz a5,3001470 + 300145e: 6785 lui a5,0x1 + 3001460: 8b078593 addi a1,a5,-1872 # 8b0 + 3001464: 030067b7 lui a5,0x3006 + 3001468: 7b478513 addi a0,a5,1972 # 30067b4 + 300146c: 2b19 jal ra,3001982 + 300146e: a01d j 3001494 + unsigned int shiftBit = (unsigned int)socx; + 3001470: fd842783 lw a5,-40(s0) + 3001474: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 3001478: fdc42783 lw a5,-36(s0) + 300147c: 2b47a703 lw a4,692(a5) + 3001480: 4685 li a3,1 + 3001482: fec42783 lw a5,-20(s0) + 3001486: 00f697b3 sll a5,a3,a5 + 300148a: 8f5d or a4,a4,a5 + 300148c: fdc42783 lw a5,-36(s0) + 3001490: 2ae7aa23 sw a4,692(a5) +} + 3001494: 50b2 lw ra,44(sp) + 3001496: 5422 lw s0,40(sp) + 3001498: 6145 addi sp,sp,48 + 300149a: 8082 ret + +0300149c : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt3(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300149c: 7179 addi sp,sp,-48 + 300149e: d606 sw ra,44(sp) + 30014a0: d422 sw s0,40(sp) + 30014a2: 1800 addi s0,sp,48 + 30014a4: fca42e23 sw a0,-36(s0) + 30014a8: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30014ac: fdc42703 lw a4,-36(s0) + 30014b0: 180007b7 lui a5,0x18000 + 30014b4: 00f70b63 beq a4,a5,30014ca + 30014b8: 6785 lui a5,0x1 + 30014ba: 8ca78593 addi a1,a5,-1846 # 8ca + 30014be: 030067b7 lui a5,0x3006 + 30014c2: 7b478513 addi a0,a5,1972 # 30067b4 + 30014c6: 2975 jal ra,3001982 + 30014c8: a001 j 30014c8 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30014ca: fd842503 lw a0,-40(s0) + 30014ce: 3ba9 jal ra,3001228 + 30014d0: 87aa mv a5,a0 + 30014d2: 0017c793 xori a5,a5,1 + 30014d6: 9f81 uxtb a5 + 30014d8: cb91 beqz a5,30014ec + 30014da: 6785 lui a5,0x1 + 30014dc: 8cb78593 addi a1,a5,-1845 # 8cb + 30014e0: 030067b7 lui a5,0x3006 + 30014e4: 7b478513 addi a0,a5,1972 # 30067b4 + 30014e8: 2969 jal ra,3001982 + 30014ea: a025 j 3001512 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30014ec: fd842783 lw a5,-40(s0) + 30014f0: 07c1 addi a5,a5,16 + 30014f2: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 30014f6: fdc42783 lw a5,-36(s0) + 30014fa: 2b47a703 lw a4,692(a5) + 30014fe: 4685 li a3,1 + 3001500: fec42783 lw a5,-20(s0) + 3001504: 00f697b3 sll a5,a3,a5 + 3001508: 8f5d or a4,a4,a5 + 300150a: fdc42783 lw a5,-36(s0) + 300150e: 2ae7aa23 sw a4,692(a5) +} + 3001512: 50b2 lw ra,44(sp) + 3001514: 5422 lw s0,40(sp) + 3001516: 6145 addi sp,sp,48 + 3001518: 8082 ret + +0300151a : + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + 300151a: 1101 addi sp,sp,-32 + 300151c: ce06 sw ra,28(sp) + 300151e: cc22 sw s0,24(sp) + 3001520: 1000 addi s0,sp,32 + 3001522: fea42623 sw a0,-20(s0) + 3001526: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300152a: fec42703 lw a4,-20(s0) + 300152e: 180007b7 lui a5,0x18000 + 3001532: 00f70b63 beq a4,a5,3001548 + 3001536: 6785 lui a5,0x1 + 3001538: 8e578593 addi a1,a5,-1819 # 8e5 + 300153c: 030067b7 lui a5,0x3006 + 3001540: 7b478513 addi a0,a5,1972 # 30067b4 + 3001544: 293d jal ra,3001982 + 3001546: a001 j 3001546 + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + 3001548: fe842503 lw a0,-24(s0) + 300154c: 39e5 jal ra,3001244 + 300154e: 87aa mv a5,a0 + 3001550: 0017c793 xori a5,a5,1 + 3001554: 9f81 uxtb a5 + 3001556: cb91 beqz a5,300156a + 3001558: 6785 lui a5,0x1 + 300155a: 8e678593 addi a1,a5,-1818 # 8e6 + 300155e: 030067b7 lui a5,0x3006 + 3001562: 7b478513 addi a0,a5,1972 # 30067b4 + 3001566: 2931 jal ra,3001982 + 3001568: a839 j 3001586 + adcx->ADC_DATA_FLAG_MASK.reg |= (1U << (unsigned int)intx); + 300156a: fec42783 lw a5,-20(s0) + 300156e: 2c07a703 lw a4,704(a5) + 3001572: 4685 li a3,1 + 3001574: fe842783 lw a5,-24(s0) + 3001578: 00f697b3 sll a5,a3,a5 + 300157c: 8f5d or a4,a4,a5 + 300157e: fec42783 lw a5,-20(s0) + 3001582: 2ce7a023 sw a4,704(a5) +} + 3001586: 40f2 lw ra,28(sp) + 3001588: 4462 lw s0,24(sp) + 300158a: 6105 addi sp,sp,32 + 300158c: 8082 ret + +0300158e : + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_ClearIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + 300158e: 1101 addi sp,sp,-32 + 3001590: ce06 sw ra,28(sp) + 3001592: cc22 sw s0,24(sp) + 3001594: 1000 addi s0,sp,32 + 3001596: fea42623 sw a0,-20(s0) + 300159a: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300159e: fec42703 lw a4,-20(s0) + 30015a2: 180007b7 lui a5,0x18000 + 30015a6: 00f70b63 beq a4,a5,30015bc + 30015aa: 6785 lui a5,0x1 + 30015ac: 8ff78593 addi a1,a5,-1793 # 8ff + 30015b0: 030067b7 lui a5,0x3006 + 30015b4: 7b478513 addi a0,a5,1972 # 30067b4 + 30015b8: 26e9 jal ra,3001982 + 30015ba: a001 j 30015ba + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + 30015bc: fe842503 lw a0,-24(s0) + 30015c0: 3151 jal ra,3001244 + 30015c2: 87aa mv a5,a0 + 30015c4: 0017c793 xori a5,a5,1 + 30015c8: 9f81 uxtb a5 + 30015ca: cb91 beqz a5,30015de + 30015cc: 6785 lui a5,0x1 + 30015ce: 90078593 addi a1,a5,-1792 # 900 + 30015d2: 030067b7 lui a5,0x3006 + 30015d6: 7b478513 addi a0,a5,1972 # 30067b4 + 30015da: 2665 jal ra,3001982 + 30015dc: a811 j 30015f0 + adcx->ADC_INT_DATA_FLAG.reg = (1U << (unsigned int)intx); + 30015de: 4705 li a4,1 + 30015e0: fe842783 lw a5,-24(s0) + 30015e4: 00f71733 sll a4,a4,a5 + 30015e8: fec42783 lw a5,-20(s0) + 30015ec: 2ae7ac23 sw a4,696(a5) +} + 30015f0: 40f2 lw ra,28(sp) + 30015f2: 4462 lw s0,24(sp) + 30015f4: 6105 addi sp,sp,32 + 30015f6: 8082 ret + +030015f8 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval addr, the base address of the SOC registers. + */ +static unsigned int ADC_GetCTRLAddr(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30015f8: 7179 addi sp,sp,-48 + 30015fa: d622 sw s0,44(sp) + 30015fc: 1800 addi s0,sp,48 + 30015fe: fca42e23 sw a0,-36(s0) + 3001602: fcb42c23 sw a1,-40(s0) + unsigned int addr; + addr = (uintptr_t)(void *)&(adcx->ADC_SOC0_CFG); + 3001606: fdc42783 lw a5,-36(s0) + 300160a: 10078793 addi a5,a5,256 + 300160e: fef42623 sw a5,-20(s0) + addr += ((unsigned int)socx * 4); /* Register base address difference 4 */ + 3001612: fd842783 lw a5,-40(s0) + 3001616: 078a slli a5,a5,0x2 + 3001618: fec42703 lw a4,-20(s0) + 300161c: 97ba add a5,a5,a4 + 300161e: fef42623 sw a5,-20(s0) + return addr; + 3001622: fec42783 lw a5,-20(s0) +} + 3001626: 853e mv a0,a5 + 3001628: 5432 lw s0,44(sp) + 300162a: 6145 addi sp,sp,48 + 300162c: 8082 ret + +0300162e : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param input ADC input, @ref ADC_Input. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelectChannel(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_Input input) +{ + 300162e: 7179 addi sp,sp,-48 + 3001630: d606 sw ra,44(sp) + 3001632: d422 sw s0,40(sp) + 3001634: 1800 addi s0,sp,48 + 3001636: fca42e23 sw a0,-36(s0) + 300163a: fcb42c23 sw a1,-40(s0) + 300163e: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001642: fdc42703 lw a4,-36(s0) + 3001646: 180007b7 lui a5,0x18000 + 300164a: 00f70b63 beq a4,a5,3001660 + 300164e: 6785 lui a5,0x1 + 3001650: 91c78593 addi a1,a5,-1764 # 91c + 3001654: 030067b7 lui a5,0x3006 + 3001658: 7b478513 addi a0,a5,1972 # 30067b4 + 300165c: 261d jal ra,3001982 + 300165e: a001 j 300165e + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCSampleChannel(input)); + 3001660: fd842503 lw a0,-40(s0) + 3001664: 36d1 jal ra,3001228 + 3001666: 87aa mv a5,a0 + 3001668: 0017c793 xori a5,a5,1 + 300166c: 9f81 uxtb a5 + 300166e: eb89 bnez a5,3001680 + 3001670: fd442503 lw a0,-44(s0) + 3001674: 3e61 jal ra,300120c + 3001676: 87aa mv a5,a0 + 3001678: 0017c793 xori a5,a5,1 + 300167c: 9f81 uxtb a5 + 300167e: cb91 beqz a5,3001692 + 3001680: 6785 lui a5,0x1 + 3001682: 91d78593 addi a1,a5,-1763 # 91d + 3001686: 030067b7 lui a5,0x3006 + 300168a: 7b478513 addi a0,a5,1972 # 30067b4 + 300168e: 2cd5 jal ra,3001982 + 3001690: a091 j 30016d4 + ADC_SOC0_CFG_REG *soc = NULL; + 3001692: fe042623 sw zero,-20(s0) + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Get the Address After Translation */ + 3001696: fd842583 lw a1,-40(s0) + 300169a: fdc42503 lw a0,-36(s0) + 300169e: 3fa9 jal ra,30015f8 + 30016a0: fea42423 sw a0,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30016a4: fe842783 lw a5,-24(s0) + 30016a8: fef42623 sw a5,-20(s0) + soc->BIT.cfg_soc0_ch_sel = (unsigned int)input; + 30016ac: fd442783 lw a5,-44(s0) + 30016b0: 8bfd andi a5,a5,31 + 30016b2: 0ff7f693 andi a3,a5,255 + 30016b6: fec42703 lw a4,-20(s0) + 30016ba: 431c lw a5,0(a4) + 30016bc: 8afd andi a3,a3,31 + 30016be: 9b81 andi a5,a5,-32 + 30016c0: 8fd5 or a5,a5,a3 + 30016c2: c31c sw a5,0(a4) + if (input == ADC_CH_ADCINA18) { + 30016c4: fd442703 lw a4,-44(s0) + 30016c8: 47c9 li a5,18 + 30016ca: 00f71563 bne a4,a5,30016d4 + DCL_ADC_EnableAvddChannel(adcx); + 30016ce: fdc42503 lw a0,-36(s0) + 30016d2: 3901 jal ra,30012e2 + } +} + 30016d4: 50b2 lw ra,44(sp) + 30016d6: 5422 lw s0,40(sp) + 30016d8: 6145 addi sp,sp,48 + 30016da: 8082 ret + +030016dc : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param trig Source of trigger, @ref ADC_TrigSource. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelcetTrigSource(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_TrigSource trig) +{ + 30016dc: 7179 addi sp,sp,-48 + 30016de: d606 sw ra,44(sp) + 30016e0: d422 sw s0,40(sp) + 30016e2: 1800 addi s0,sp,48 + 30016e4: fca42e23 sw a0,-36(s0) + 30016e8: fcb42c23 sw a1,-40(s0) + 30016ec: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30016f0: fdc42703 lw a4,-36(s0) + 30016f4: 180007b7 lui a5,0x18000 + 30016f8: 00f70b63 beq a4,a5,300170e + 30016fc: 6785 lui a5,0x1 + 30016fe: 93078593 addi a1,a5,-1744 # 930 + 3001702: 030067b7 lui a5,0x3006 + 3001706: 7b478513 addi a0,a5,1972 # 30067b4 + 300170a: 2ca5 jal ra,3001982 + 300170c: a001 j 300170c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCTrigSource(trig)); + 300170e: fd842503 lw a0,-40(s0) + 3001712: 3e19 jal ra,3001228 + 3001714: 87aa mv a5,a0 + 3001716: 0017c793 xori a5,a5,1 + 300171a: 9f81 uxtb a5 + 300171c: eb89 bnez a5,300172e + 300171e: fd442503 lw a0,-44(s0) + 3001722: 3e3d jal ra,3001260 + 3001724: 87aa mv a5,a0 + 3001726: 0017c793 xori a5,a5,1 + 300172a: 9f81 uxtb a5 + 300172c: cb91 beqz a5,3001740 + 300172e: 6785 lui a5,0x1 + 3001730: 93178593 addi a1,a5,-1743 # 931 + 3001734: 030067b7 lui a5,0x3006 + 3001738: 7b478513 addi a0,a5,1972 # 30067b4 + 300173c: 2499 jal ra,3001982 + 300173e: a835 j 300177a + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtaining the Address for Configuring the SOC */ + 3001740: fd842583 lw a1,-40(s0) + 3001744: fdc42503 lw a0,-36(s0) + 3001748: 3d45 jal ra,30015f8 + 300174a: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 300174e: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 3001752: fec42783 lw a5,-20(s0) + 3001756: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_trig_sel = (unsigned int)trig; + 300175a: fd442783 lw a5,-44(s0) + 300175e: 8bfd andi a5,a5,31 + 3001760: 0ff7f693 andi a3,a5,255 + 3001764: fe842703 lw a4,-24(s0) + 3001768: 431c lw a5,0(a4) + 300176a: 8afd andi a3,a3,31 + 300176c: 06a6 slli a3,a3,0x9 + 300176e: 7671 lui a2,0xffffc + 3001770: 1ff60613 addi a2,a2,511 # ffffc1ff + 3001774: 8ff1 and a5,a5,a2 + 3001776: 8fd5 or a5,a5,a3 + 3001778: c31c sw a5,0(a4) +} + 300177a: 50b2 lw ra,44(sp) + 300177c: 5422 lw s0,40(sp) + 300177e: 6145 addi sp,sp,48 + 3001780: 8082 ret + +03001782 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param acqps Capacitor charging time. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetAcqps(ADC_RegStruct * const adcx, ADC_SOCNumber socx, unsigned int acqps) +{ + 3001782: 7179 addi sp,sp,-48 + 3001784: d606 sw ra,44(sp) + 3001786: d422 sw s0,40(sp) + 3001788: 1800 addi s0,sp,48 + 300178a: fca42e23 sw a0,-36(s0) + 300178e: fcb42c23 sw a1,-40(s0) + 3001792: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001796: fdc42703 lw a4,-36(s0) + 300179a: 180007b7 lui a5,0x18000 + 300179e: 00f70b63 beq a4,a5,30017b4 + 30017a2: 6785 lui a5,0x1 + 30017a4: 94178593 addi a1,a5,-1727 # 941 + 30017a8: 030067b7 lui a5,0x3006 + 30017ac: 7b478513 addi a0,a5,1972 # 30067b4 + 30017b0: 2ac9 jal ra,3001982 + 30017b2: a001 j 30017b2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30017b4: fd842503 lw a0,-40(s0) + 30017b8: 3c85 jal ra,3001228 + 30017ba: 87aa mv a5,a0 + 30017bc: 0017c793 xori a5,a5,1 + 30017c0: 9f81 uxtb a5 + 30017c2: cb91 beqz a5,30017d6 + 30017c4: 6785 lui a5,0x1 + 30017c6: 94278593 addi a1,a5,-1726 # 942 + 30017ca: 030067b7 lui a5,0x3006 + 30017ce: 7b478513 addi a0,a5,1972 # 30067b4 + 30017d2: 2a45 jal ra,3001982 + 30017d4: a891 j 3001828 + ADC_PARAM_CHECK_NO_RET(acqps <= 15); /* The value of acqps ranges from 0 to 15 */ + 30017d6: fd442703 lw a4,-44(s0) + 30017da: 47bd li a5,15 + 30017dc: 00e7fb63 bgeu a5,a4,30017f2 + 30017e0: 6785 lui a5,0x1 + 30017e2: 94378593 addi a1,a5,-1725 # 943 + 30017e6: 030067b7 lui a5,0x3006 + 30017ea: 7b478513 addi a0,a5,1972 # 30067b4 + 30017ee: 2a51 jal ra,3001982 + 30017f0: a825 j 3001828 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); + 30017f2: fd842583 lw a1,-40(s0) + 30017f6: fdc42503 lw a0,-36(s0) + 30017fa: 3bfd jal ra,30015f8 + 30017fc: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 3001800: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 3001804: fec42783 lw a5,-20(s0) + 3001808: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_samptime_sel = acqps; + 300180c: fd442783 lw a5,-44(s0) + 3001810: 8bbd andi a5,a5,15 + 3001812: 0ff7f693 andi a3,a5,255 + 3001816: fe842703 lw a4,-24(s0) + 300181a: 431c lw a5,0(a4) + 300181c: 8abd andi a3,a3,15 + 300181e: 0696 slli a3,a3,0x5 + 3001820: e1f7f793 andi a5,a5,-481 + 3001824: 8fd5 or a5,a5,a3 + 3001826: c31c sw a5,0(a4) +} + 3001828: 50b2 lw ra,44(sp) + 300182a: 5422 lw s0,40(sp) + 300182c: 6145 addi sp,sp,48 + 300182e: 8082 ret + +03001830 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SOCxSoftTrigger(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001830: 1101 addi sp,sp,-32 + 3001832: ce06 sw ra,28(sp) + 3001834: cc22 sw s0,24(sp) + 3001836: 1000 addi s0,sp,32 + 3001838: fea42623 sw a0,-20(s0) + 300183c: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001840: fec42703 lw a4,-20(s0) + 3001844: 180007b7 lui a5,0x18000 + 3001848: 00f70b63 beq a4,a5,300185e + 300184c: 6785 lui a5,0x1 + 300184e: 95278593 addi a1,a5,-1710 # 952 + 3001852: 030067b7 lui a5,0x3006 + 3001856: 7b478513 addi a0,a5,1972 # 30067b4 + 300185a: 2225 jal ra,3001982 + 300185c: a001 j 300185c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300185e: fe842503 lw a0,-24(s0) + 3001862: 32d9 jal ra,3001228 + 3001864: 87aa mv a5,a0 + 3001866: 0017c793 xori a5,a5,1 + 300186a: 9f81 uxtb a5 + 300186c: cb91 beqz a5,3001880 + 300186e: 6785 lui a5,0x1 + 3001870: 95378593 addi a1,a5,-1709 # 953 + 3001874: 030067b7 lui a5,0x3006 + 3001878: 7b478513 addi a0,a5,1972 # 30067b4 + 300187c: 2219 jal ra,3001982 + 300187e: a839 j 300189c + adcx->ADC_SOFT_TRIG.reg |= (1U << (unsigned int)socx); + 3001880: fec42783 lw a5,-20(s0) + 3001884: 1607a703 lw a4,352(a5) + 3001888: 4685 li a3,1 + 300188a: fe842783 lw a5,-24(s0) + 300188e: 00f697b3 sll a5,a3,a5 + 3001892: 8f5d or a4,a4,a5 + 3001894: fec42783 lw a5,-20(s0) + 3001898: 16e7a023 sw a4,352(a5) +} + 300189c: 40f2 lw ra,28(sp) + 300189e: 4462 lw s0,24(sp) + 30018a0: 6105 addi sp,sp,32 + 30018a2: 8082 ret + +030018a4 : + * @param adcx ADC register base address. + * @param priorityMode Mode of SOC priority, @ref ADC_PriorityMode. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetPriority(ADC_RegStruct * const adcx, ADC_PriorityMode priorityMode) +{ + 30018a4: 1101 addi sp,sp,-32 + 30018a6: ce06 sw ra,28(sp) + 30018a8: cc22 sw s0,24(sp) + 30018aa: 1000 addi s0,sp,32 + 30018ac: fea42623 sw a0,-20(s0) + 30018b0: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30018b4: fec42703 lw a4,-20(s0) + 30018b8: 180007b7 lui a5,0x18000 + 30018bc: 00f70b63 beq a4,a5,30018d2 + 30018c0: 6785 lui a5,0x1 + 30018c2: 96c78593 addi a1,a5,-1684 # 96c + 30018c6: 030067b7 lui a5,0x3006 + 30018ca: 7b478513 addi a0,a5,1972 # 30067b4 + 30018ce: 2855 jal ra,3001982 + 30018d0: a001 j 30018d0 + ADC_PARAM_CHECK_NO_RET(IsADCPriorityMode(priorityMode)); + 30018d2: fe842503 lw a0,-24(s0) + 30018d6: 3ac9 jal ra,30012a8 + 30018d8: 87aa mv a5,a0 + 30018da: 0017c793 xori a5,a5,1 + 30018de: 9f81 uxtb a5 + 30018e0: cb91 beqz a5,30018f4 + 30018e2: 6785 lui a5,0x1 + 30018e4: 96d78593 addi a1,a5,-1683 # 96d + 30018e8: 030067b7 lui a5,0x3006 + 30018ec: 7b478513 addi a0,a5,1972 # 30067b4 + 30018f0: 2849 jal ra,3001982 + 30018f2: a039 j 3001900 + adcx->ADC_ARBT0.reg = priorityMode; + 30018f4: fec42783 lw a5,-20(s0) + 30018f8: fe842703 lw a4,-24(s0) + 30018fc: 20e7a023 sw a4,512(a5) +} + 3001900: 40f2 lw ra,28(sp) + 3001902: 4462 lw s0,24(sp) + 3001904: 6105 addi sp,sp,32 + 3001906: 8082 ret + +03001908 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval unsigned int, result. + */ +static inline unsigned int DCL_ADC_ReadSOCxResult(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001908: 7179 addi sp,sp,-48 + 300190a: d606 sw ra,44(sp) + 300190c: d422 sw s0,40(sp) + 300190e: 1800 addi s0,sp,48 + 3001910: fca42e23 sw a0,-36(s0) + 3001914: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001918: fdc42703 lw a4,-36(s0) + 300191c: 180007b7 lui a5,0x18000 + 3001920: 00f70b63 beq a4,a5,3001936 + 3001924: 6785 lui a5,0x1 + 3001926: a8778593 addi a1,a5,-1401 # a87 + 300192a: 030067b7 lui a5,0x3006 + 300192e: 7b478513 addi a0,a5,1972 # 30067b4 + 3001932: 2881 jal ra,3001982 + 3001934: a001 j 3001934 + ADC_ASSERT_PARAM(IsADCSOCx(socx)); + 3001936: fd842503 lw a0,-40(s0) + 300193a: 30fd jal ra,3001228 + 300193c: 87aa mv a5,a0 + 300193e: 0017c793 xori a5,a5,1 + 3001942: 9f81 uxtb a5 + 3001944: cb91 beqz a5,3001958 + 3001946: 6785 lui a5,0x1 + 3001948: a8878593 addi a1,a5,-1400 # a88 + 300194c: 030067b7 lui a5,0x3006 + 3001950: 7b478513 addi a0,a5,1972 # 30067b4 + 3001954: 203d jal ra,3001982 + 3001956: a001 j 3001956 + ADC_RESULT0_REG *result; + uintptr_t addr = (uintptr_t)(void *)adcx; + 3001958: fdc42783 lw a5,-36(s0) + 300195c: fef42623 sw a5,-20(s0) + /* The address interval of the result register is 4 */ + result = (ADC_RESULT0_REG *)(void *)(addr + 4 * (unsigned int)socx); + 3001960: fd842783 lw a5,-40(s0) + 3001964: 00279713 slli a4,a5,0x2 + 3001968: fec42783 lw a5,-20(s0) + 300196c: 97ba add a5,a5,a4 + 300196e: fef42423 sw a5,-24(s0) + return result->reg; + 3001972: fe842783 lw a5,-24(s0) + 3001976: 439c lw a5,0(a5) +} + 3001978: 853e mv a0,a5 + 300197a: 50b2 lw ra,44(sp) + 300197c: 5422 lw s0,40(sp) + 300197e: 6145 addi sp,sp,48 + 3001980: 8082 ret + +03001982 : + 3001982: 0650006f j 30021e6 + +03001986 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001986: 7179 addi sp,sp,-48 + 3001988: d606 sw ra,44(sp) + 300198a: d422 sw s0,40(sp) + 300198c: 1800 addi s0,sp,48 + 300198e: fca42e23 sw a0,-36(s0) + 3001992: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001996: fdc42703 lw a4,-36(s0) + 300199a: 180007b7 lui a5,0x18000 + 300199e: 00f70b63 beq a4,a5,30019b4 + 30019a2: 6785 lui a5,0x1 + 30019a4: b4678593 addi a1,a5,-1210 # b46 + 30019a8: 030067b7 lui a5,0x3006 + 30019ac: 7b478513 addi a0,a5,1972 # 30067b4 + 30019b0: 3fc9 jal ra,3001982 + 30019b2: a001 j 30019b2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30019b4: fd842503 lw a0,-40(s0) + 30019b8: 3885 jal ra,3001228 + 30019ba: 87aa mv a5,a0 + 30019bc: 0017c793 xori a5,a5,1 + 30019c0: 9f81 uxtb a5 + 30019c2: cb91 beqz a5,30019d6 + 30019c4: 6785 lui a5,0x1 + 30019c6: b4778593 addi a1,a5,-1209 # b47 + 30019ca: 030067b7 lui a5,0x3006 + 30019ce: 7b478513 addi a0,a5,1972 # 30067b4 + 30019d2: 3f45 jal ra,3001982 + 30019d4: a025 j 30019fc + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 30019d6: fd842583 lw a1,-40(s0) + 30019da: fdc42503 lw a0,-36(s0) + 30019de: 3929 jal ra,30015f8 + 30019e0: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 30019e4: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30019e8: fec42783 lw a5,-20(s0) + 30019ec: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_ENABLE; + 30019f0: fe842703 lw a4,-24(s0) + 30019f4: 431c lw a5,0(a4) + 30019f6: 6691 lui a3,0x4 + 30019f8: 8fd5 or a5,a5,a3 + 30019fa: c31c sw a5,0(a4) +} + 30019fc: 50b2 lw ra,44(sp) + 30019fe: 5422 lw s0,40(sp) + 3001a00: 6145 addi sp,sp,48 + 3001a02: 8082 ret + +03001a04 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_DisableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001a04: 7179 addi sp,sp,-48 + 3001a06: d606 sw ra,44(sp) + 3001a08: d422 sw s0,40(sp) + 3001a0a: 1800 addi s0,sp,48 + 3001a0c: fca42e23 sw a0,-36(s0) + 3001a10: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001a14: fdc42703 lw a4,-36(s0) + 3001a18: 180007b7 lui a5,0x18000 + 3001a1c: 00f70b63 beq a4,a5,3001a32 + 3001a20: 6785 lui a5,0x1 + 3001a22: b5678593 addi a1,a5,-1194 # b56 + 3001a26: 030067b7 lui a5,0x3006 + 3001a2a: 7b478513 addi a0,a5,1972 # 30067b4 + 3001a2e: 3f91 jal ra,3001982 + 3001a30: a001 j 3001a30 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 3001a32: fd842503 lw a0,-40(s0) + 3001a36: ff2ff0ef jal ra,3001228 + 3001a3a: 87aa mv a5,a0 + 3001a3c: 0017c793 xori a5,a5,1 + 3001a40: 9f81 uxtb a5 + 3001a42: cb91 beqz a5,3001a56 + 3001a44: 6785 lui a5,0x1 + 3001a46: b5778593 addi a1,a5,-1193 # b57 + 3001a4a: 030067b7 lui a5,0x3006 + 3001a4e: 7b478513 addi a0,a5,1972 # 30067b4 + 3001a52: 3f05 jal ra,3001982 + 3001a54: a02d j 3001a7e + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 3001a56: fd842583 lw a1,-40(s0) + 3001a5a: fdc42503 lw a0,-36(s0) + 3001a5e: 3e69 jal ra,30015f8 + 3001a60: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 3001a64: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 3001a68: fec42783 lw a5,-20(s0) + 3001a6c: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_DISABLE; + 3001a70: fe842703 lw a4,-24(s0) + 3001a74: 431c lw a5,0(a4) + 3001a76: 76f1 lui a3,0xffffc + 3001a78: 16fd addi a3,a3,-1 # ffffbfff + 3001a7a: 8ff5 and a5,a5,a3 + 3001a7c: c31c sw a5,0(a4) +} + 3001a7e: 50b2 lw ra,44(sp) + 3001a80: 5422 lw s0,40(sp) + 3001a82: 6145 addi sp,sp,48 + 3001a84: 8082 ret + +03001a86 : + * triggered at least 100 us later. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_Init(ADC_Handle *adcHandle) +{ + 3001a86: 1101 addi sp,sp,-32 + 3001a88: ce06 sw ra,28(sp) + 3001a8a: cc22 sw s0,24(sp) + 3001a8c: 1000 addi s0,sp,32 + 3001a8e: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001a92: fec42783 lw a5,-20(s0) + 3001a96: eb89 bnez a5,3001aa8 + 3001a98: 02c00593 li a1,44 + 3001a9c: 030067b7 lui a5,0x3006 + 3001aa0: 7d078513 addi a0,a5,2000 # 30067d0 + 3001aa4: 3df9 jal ra,3001982 + 3001aa6: a001 j 3001aa6 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001aa8: fec42783 lw a5,-20(s0) + 3001aac: 4398 lw a4,0(a5) + 3001aae: 180007b7 lui a5,0x18000 + 3001ab2: 00f70a63 beq a4,a5,3001ac6 + 3001ab6: 02d00593 li a1,45 + 3001aba: 030067b7 lui a5,0x3006 + 3001abe: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ac2: 35c1 jal ra,3001982 + 3001ac4: a001 j 3001ac4 + ADC_PARAM_CHECK_WITH_RET(IsADCPriorityMode(adcHandle->socPriority) == true, BASE_STATUS_ERROR); + 3001ac6: fec42783 lw a5,-20(s0) + 3001aca: 43dc lw a5,4(a5) + 3001acc: 853e mv a0,a5 + 3001ace: fdaff0ef jal ra,30012a8 + 3001ad2: 87aa mv a5,a0 + 3001ad4: 0017c793 xori a5,a5,1 + 3001ad8: 9f81 uxtb a5 + 3001ada: cb99 beqz a5,3001af0 + 3001adc: 02e00593 li a1,46 + 3001ae0: 030067b7 lui a5,0x3006 + 3001ae4: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ae8: 6fe000ef jal ra,30021e6 + 3001aec: 4785 li a5,1 + 3001aee: a091 j 3001b32 + DCL_ADC_SOCxSetPriority(adcHandle->baseAddress, adcHandle->socPriority); + 3001af0: fec42783 lw a5,-20(s0) + 3001af4: 4398 lw a4,0(a5) + 3001af6: fec42783 lw a5,-20(s0) + 3001afa: 43dc lw a5,4(a5) + 3001afc: 85be mv a1,a5 + 3001afe: 853a mv a0,a4 + 3001b00: 3355 jal ra,30018a4 + adcHandle->baseAddress->ADC_ANA_CTRL0.BIT.cfg_sar_samp_cap_sel = 0x4; /* Set the Number of Sampling Capacitors */ + 3001b02: fec42783 lw a5,-20(s0) + 3001b06: 4398 lw a4,0(a5) + 3001b08: 65472783 lw a5,1620(a4) + 3001b0c: 100006b7 lui a3,0x10000 + 3001b10: 16fd addi a3,a3,-1 # fffffff + 3001b12: 8efd and a3,a3,a5 + 3001b14: 400007b7 lui a5,0x40000 + 3001b18: 8fd5 or a5,a5,a3 + 3001b1a: 64f72a23 sw a5,1620(a4) + adcHandle->baseAddress->ADC_EN.reg = BASE_CFG_ENABLE; /* Enable ADC Controller */ + 3001b1e: fec42783 lw a5,-20(s0) + 3001b22: 439c lw a5,0(a5) + 3001b24: 4705 li a4,1 + 3001b26: 30e7a023 sw a4,768(a5) # 40000300 + BASE_FUNC_DelayUs(100); /* Wait for 100 us until the ADC controller is stable */ + 3001b2a: 06400513 li a0,100 + 3001b2e: 25cd jal ra,3002210 + return BASE_STATUS_OK; + 3001b30: 4781 li a5,0 +} + 3001b32: 853e mv a0,a5 + 3001b34: 40f2 lw ra,28(sp) + 3001b36: 4462 lw s0,24(sp) + 3001b38: 6105 addi sp,sp,32 + 3001b3a: 8082 ret + +03001b3c : + * @param soc ID of SOC(start of conversion), managing the specific sample inputs. + * @param socParam Param struct of SOC. This is related to the peripheral circuit design, @ref SOC_Param. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_ConfigureSoc(ADC_Handle *adcHandle, ADC_SOCNumber soc, SOC_Param *socParam) +{ + 3001b3c: 1101 addi sp,sp,-32 + 3001b3e: ce06 sw ra,28(sp) + 3001b40: cc22 sw s0,24(sp) + 3001b42: 1000 addi s0,sp,32 + 3001b44: fea42623 sw a0,-20(s0) + 3001b48: feb42423 sw a1,-24(s0) + 3001b4c: fec42223 sw a2,-28(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001b50: fec42783 lw a5,-20(s0) + 3001b54: eb89 bnez a5,3001b66 + 3001b56: 04c00593 li a1,76 + 3001b5a: 030067b7 lui a5,0x3006 + 3001b5e: 7d078513 addi a0,a5,2000 # 30067d0 + 3001b62: 2551 jal ra,30021e6 + 3001b64: a001 j 3001b64 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001b66: fec42783 lw a5,-20(s0) + 3001b6a: 4398 lw a4,0(a5) + 3001b6c: 180007b7 lui a5,0x18000 + 3001b70: 00f70a63 beq a4,a5,3001b84 + 3001b74: 04d00593 li a1,77 + 3001b78: 030067b7 lui a5,0x3006 + 3001b7c: 7d078513 addi a0,a5,2000 # 30067d0 + 3001b80: 259d jal ra,30021e6 + 3001b82: a001 j 3001b82 + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001b84: fe842503 lw a0,-24(s0) + 3001b88: ea0ff0ef jal ra,3001228 + 3001b8c: 87aa mv a5,a0 + 3001b8e: 0017c793 xori a5,a5,1 + 3001b92: 9f81 uxtb a5 + 3001b94: cb91 beqz a5,3001ba8 + 3001b96: 04e00593 li a1,78 + 3001b9a: 030067b7 lui a5,0x3006 + 3001b9e: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ba2: 2591 jal ra,30021e6 + 3001ba4: 4785 li a5,1 + 3001ba6: aa3d j 3001ce4 + ADC_ASSERT_PARAM(socParam != NULL); + 3001ba8: fe442783 lw a5,-28(s0) + 3001bac: eb89 bnez a5,3001bbe + 3001bae: 04f00593 li a1,79 + 3001bb2: 030067b7 lui a5,0x3006 + 3001bb6: 7d078513 addi a0,a5,2000 # 30067d0 + 3001bba: 2535 jal ra,30021e6 + 3001bbc: a001 j 3001bbc + ADC_PARAM_CHECK_WITH_RET(IsADCSampleChannel(socParam->adcInput) == true, BASE_STATUS_ERROR); + 3001bbe: fe442783 lw a5,-28(s0) + 3001bc2: 439c lw a5,0(a5) + 3001bc4: 853e mv a0,a5 + 3001bc6: e46ff0ef jal ra,300120c + 3001bca: 87aa mv a5,a0 + 3001bcc: 0017c793 xori a5,a5,1 + 3001bd0: 9f81 uxtb a5 + 3001bd2: cb91 beqz a5,3001be6 + 3001bd4: 05000593 li a1,80 + 3001bd8: 030067b7 lui a5,0x3006 + 3001bdc: 7d078513 addi a0,a5,2000 # 30067d0 + 3001be0: 2519 jal ra,30021e6 + 3001be2: 4785 li a5,1 + 3001be4: a201 j 3001ce4 + ADC_PARAM_CHECK_WITH_RET(IsADCTotalTime(socParam->sampleTotalTime) == true, BASE_STATUS_ERROR); + 3001be6: fe442783 lw a5,-28(s0) + 3001bea: 43dc lw a5,4(a5) + 3001bec: 853e mv a0,a5 + 3001bee: ed8ff0ef jal ra,30012c6 + 3001bf2: 87aa mv a5,a0 + 3001bf4: 0017c793 xori a5,a5,1 + 3001bf8: 9f81 uxtb a5 + 3001bfa: cb91 beqz a5,3001c0e + 3001bfc: 05100593 li a1,81 + 3001c00: 030067b7 lui a5,0x3006 + 3001c04: 7d078513 addi a0,a5,2000 # 30067d0 + 3001c08: 2bf9 jal ra,30021e6 + 3001c0a: 4785 li a5,1 + 3001c0c: a8e1 j 3001ce4 + ADC_PARAM_CHECK_WITH_RET(IsADCTrigSource(socParam->trigSource) == true, BASE_STATUS_ERROR); + 3001c0e: fe442783 lw a5,-28(s0) + 3001c12: 479c lw a5,8(a5) + 3001c14: 853e mv a0,a5 + 3001c16: e4aff0ef jal ra,3001260 + 3001c1a: 87aa mv a5,a0 + 3001c1c: 0017c793 xori a5,a5,1 + 3001c20: 9f81 uxtb a5 + 3001c22: cb91 beqz a5,3001c36 + 3001c24: 05200593 li a1,82 + 3001c28: 030067b7 lui a5,0x3006 + 3001c2c: 7d078513 addi a0,a5,2000 # 30067d0 + 3001c30: 2b5d jal ra,30021e6 + 3001c32: 4785 li a5,1 + 3001c34: a845 j 3001ce4 + ADC_PARAM_CHECK_WITH_RET(IsADCFinishMode(socParam->finishMode) == true, BASE_STATUS_ERROR); + 3001c36: fe442783 lw a5,-28(s0) + 3001c3a: 4b9c lw a5,16(a5) + 3001c3c: 853e mv a0,a5 + 3001c3e: e3eff0ef jal ra,300127c + 3001c42: 87aa mv a5,a0 + 3001c44: 0017c793 xori a5,a5,1 + 3001c48: 9f81 uxtb a5 + 3001c4a: cb91 beqz a5,3001c5e + 3001c4c: 05300593 li a1,83 + 3001c50: 030067b7 lui a5,0x3006 + 3001c54: 7d078513 addi a0,a5,2000 # 30067d0 + 3001c58: 2379 jal ra,30021e6 + 3001c5a: 4785 li a5,1 + 3001c5c: a061 j 3001ce4 + DCL_ADC_SOCxSelectChannel(adcHandle->baseAddress, soc, socParam->adcInput); /* Set channel */ + 3001c5e: fec42783 lw a5,-20(s0) + 3001c62: 4398 lw a4,0(a5) + 3001c64: fe442783 lw a5,-28(s0) + 3001c68: 439c lw a5,0(a5) + 3001c6a: 863e mv a2,a5 + 3001c6c: fe842583 lw a1,-24(s0) + 3001c70: 853a mv a0,a4 + 3001c72: 3a75 jal ra,300162e + DCL_ADC_SOCxSetAcqps(adcHandle->baseAddress, soc, socParam->sampleTotalTime); /* Set sampling time */ + 3001c74: fec42783 lw a5,-20(s0) + 3001c78: 4398 lw a4,0(a5) + 3001c7a: fe442783 lw a5,-28(s0) + 3001c7e: 43dc lw a5,4(a5) + 3001c80: 863e mv a2,a5 + 3001c82: fe842583 lw a1,-24(s0) + 3001c86: 853a mv a0,a4 + 3001c88: 3ced jal ra,3001782 + DCL_ADC_SOCxSelcetTrigSource(adcHandle->baseAddress, soc, socParam->trigSource); /* Set trigger source */ + 3001c8a: fec42783 lw a5,-20(s0) + 3001c8e: 4398 lw a4,0(a5) + 3001c90: fe442783 lw a5,-28(s0) + 3001c94: 479c lw a5,8(a5) + 3001c96: 863e mv a2,a5 + 3001c98: fe842583 lw a1,-24(s0) + 3001c9c: 853a mv a0,a4 + 3001c9e: 3c3d jal ra,30016dc + if (socParam->continueMode == true) { /* Continuous Mode Judgment */ + 3001ca0: fe442783 lw a5,-28(s0) + 3001ca4: 27dc lbu a5,12(a5) + 3001ca6: cb89 beqz a5,3001cb8 + DCL_ADC_EnableSOCxContinue(adcHandle->baseAddress, soc); + 3001ca8: fec42783 lw a5,-20(s0) + 3001cac: 439c lw a5,0(a5) + 3001cae: fe842583 lw a1,-24(s0) + 3001cb2: 853e mv a0,a5 + 3001cb4: 39c9 jal ra,3001986 + 3001cb6: a801 j 3001cc6 + } else { + DCL_ADC_DisableSOCxContinue(adcHandle->baseAddress, soc); + 3001cb8: fec42783 lw a5,-20(s0) + 3001cbc: 439c lw a5,0(a5) + 3001cbe: fe842583 lw a1,-24(s0) + 3001cc2: 853e mv a0,a5 + 3001cc4: 3381 jal ra,3001a04 + } + adcHandle->ADC_SOCxParam[soc].finishMode = socParam->finishMode; + 3001cc6: fe442783 lw a5,-28(s0) + 3001cca: 4b9c lw a5,16(a5) + 3001ccc: 01079713 slli a4,a5,0x10 + 3001cd0: 8341 srli a4,a4,0x10 + 3001cd2: fec42683 lw a3,-20(s0) + 3001cd6: fe842783 lw a5,-24(s0) + 3001cda: 07a1 addi a5,a5,8 + 3001cdc: 0786 slli a5,a5,0x1 + 3001cde: 97b6 add a5,a5,a3 + 3001ce0: a3da sh a4,4(a5) + return BASE_STATUS_OK; + 3001ce2: 4781 li a5,0 +} + 3001ce4: 853e mv a0,a5 + 3001ce6: 40f2 lw ra,28(sp) + 3001ce8: 4462 lw s0,24(sp) + 3001cea: 6105 addi sp,sp,32 + 3001cec: 8082 ret + +03001cee : + * interrupt is reported. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_StartIt(ADC_Handle *adcHandle) +{ + 3001cee: 7179 addi sp,sp,-48 + 3001cf0: d606 sw ra,44(sp) + 3001cf2: d422 sw s0,40(sp) + 3001cf4: 1800 addi s0,sp,48 + 3001cf6: fca42e23 sw a0,-36(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001cfa: fdc42783 lw a5,-36(s0) + 3001cfe: eb89 bnez a5,3001d10 + 3001d00: 0af00593 li a1,175 + 3001d04: 030067b7 lui a5,0x3006 + 3001d08: 7d078513 addi a0,a5,2000 # 30067d0 + 3001d0c: 29e9 jal ra,30021e6 + 3001d0e: a001 j 3001d0e + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001d10: fdc42783 lw a5,-36(s0) + 3001d14: 4398 lw a4,0(a5) + 3001d16: 180007b7 lui a5,0x18000 + 3001d1a: 00f70a63 beq a4,a5,3001d2e + 3001d1e: 0b000593 li a1,176 + 3001d22: 030067b7 lui a5,0x3006 + 3001d26: 7d078513 addi a0,a5,2000 # 30067d0 + 3001d2a: 2975 jal ra,30021e6 + 3001d2c: a001 j 3001d2c + unsigned int intVal = 0; + 3001d2e: fe042423 sw zero,-24(s0) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001d32: fe042623 sw zero,-20(s0) + 3001d36: a859 j 3001dcc + intVal = adcHandle->ADC_SOCxParam[i].finishMode; + 3001d38: fdc42703 lw a4,-36(s0) + 3001d3c: fec42783 lw a5,-20(s0) + 3001d40: 07a1 addi a5,a5,8 + 3001d42: 0786 slli a5,a5,0x1 + 3001d44: 97ba add a5,a5,a4 + 3001d46: 23de lhu a5,4(a5) + 3001d48: fef42423 sw a5,-24(s0) + switch (intVal) { + 3001d4c: fe842783 lw a5,-24(s0) + 3001d50: 4711 li a4,4 + 3001d52: 02e78a63 beq a5,a4,3001d86 + 3001d56: 4711 li a4,4 + 3001d58: 00f76663 bltu a4,a5,3001d64 + 3001d5c: 470d li a4,3 + 3001d5e: 00e78a63 beq a5,a4,3001d72 + break; + case ADC_SOCFINISH_INT3: + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + break; + default: + break; + 3001d62: a085 j 3001dc2 + switch (intVal) { + 3001d64: 4715 li a4,5 + 3001d66: 02e78a63 beq a5,a4,3001d9a + 3001d6a: 4719 li a4,6 + 3001d6c: 04e78163 beq a5,a4,3001dae + break; + 3001d70: a889 j 3001dc2 + DCL_ADC_SetSOCxBlindInt0(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 0 */ + 3001d72: fdc42783 lw a5,-36(s0) + 3001d76: 439c lw a5,0(a5) + 3001d78: fec42703 lw a4,-20(s0) + 3001d7c: 85ba mv a1,a4 + 3001d7e: 853e mv a0,a5 + 3001d80: da6ff0ef jal ra,3001326 + break; + 3001d84: a83d j 3001dc2 + DCL_ADC_SetSOCxBlindInt1(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 1 */ + 3001d86: fdc42783 lw a5,-36(s0) + 3001d8a: 439c lw a5,0(a5) + 3001d8c: fec42703 lw a4,-20(s0) + 3001d90: 85ba mv a1,a4 + 3001d92: 853e mv a0,a5 + 3001d94: e0eff0ef jal ra,30013a2 + break; + 3001d98: a02d j 3001dc2 + DCL_ADC_SetSOCxBlindInt2(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 2 */ + 3001d9a: fdc42783 lw a5,-36(s0) + 3001d9e: 439c lw a5,0(a5) + 3001da0: fec42703 lw a4,-20(s0) + 3001da4: 85ba mv a1,a4 + 3001da6: 853e mv a0,a5 + 3001da8: e78ff0ef jal ra,3001420 + break; + 3001dac: a819 j 3001dc2 + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + 3001dae: fdc42783 lw a5,-36(s0) + 3001db2: 439c lw a5,0(a5) + 3001db4: fec42703 lw a4,-20(s0) + 3001db8: 85ba mv a1,a4 + 3001dba: 853e mv a0,a5 + 3001dbc: ee0ff0ef jal ra,300149c + break; + 3001dc0: 0001 nop + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001dc2: fec42783 lw a5,-20(s0) + 3001dc6: 0785 addi a5,a5,1 + 3001dc8: fef42623 sw a5,-20(s0) + 3001dcc: fec42703 lw a4,-20(s0) + 3001dd0: 47bd li a5,15 + 3001dd2: f6e7d3e3 bge a5,a4,3001d38 + } + } /* Enable ADC Interrupt */ + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER0); + 3001dd6: fdc42783 lw a5,-36(s0) + 3001dda: 439c lw a5,0(a5) + 3001ddc: 4581 li a1,0 + 3001dde: 853e mv a0,a5 + 3001de0: f3aff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER1); + 3001de4: fdc42783 lw a5,-36(s0) + 3001de8: 439c lw a5,0(a5) + 3001dea: 4585 li a1,1 + 3001dec: 853e mv a0,a5 + 3001dee: f2cff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + 3001df2: fdc42783 lw a5,-36(s0) + 3001df6: 439c lw a5,0(a5) + 3001df8: 4589 li a1,2 + 3001dfa: 853e mv a0,a5 + 3001dfc: f1eff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER3); + 3001e00: fdc42783 lw a5,-36(s0) + 3001e04: 439c lw a5,0(a5) + 3001e06: 458d li a1,3 + 3001e08: 853e mv a0,a5 + 3001e0a: f10ff0ef jal ra,300151a + return BASE_STATUS_OK; + 3001e0e: 4781 li a5,0 +} + 3001e10: 853e mv a0,a5 + 3001e12: 50b2 lw ra,44(sp) + 3001e14: 5422 lw s0,40(sp) + 3001e16: 6145 addi sp,sp,48 + 3001e18: 8082 ret + +03001e1a : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_SoftTrigSample(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001e1a: 1101 addi sp,sp,-32 + 3001e1c: ce06 sw ra,28(sp) + 3001e1e: cc22 sw s0,24(sp) + 3001e20: 1000 addi s0,sp,32 + 3001e22: fea42623 sw a0,-20(s0) + 3001e26: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001e2a: fec42783 lw a5,-20(s0) + 3001e2e: eb89 bnez a5,3001e40 + 3001e30: 0e500593 li a1,229 + 3001e34: 030067b7 lui a5,0x3006 + 3001e38: 7d078513 addi a0,a5,2000 # 30067d0 + 3001e3c: 266d jal ra,30021e6 + 3001e3e: a001 j 3001e3e + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001e40: fec42783 lw a5,-20(s0) + 3001e44: 4398 lw a4,0(a5) + 3001e46: 180007b7 lui a5,0x18000 + 3001e4a: 00f70a63 beq a4,a5,3001e5e + 3001e4e: 0e600593 li a1,230 + 3001e52: 030067b7 lui a5,0x3006 + 3001e56: 7d078513 addi a0,a5,2000 # 30067d0 + 3001e5a: 2671 jal ra,30021e6 + 3001e5c: a001 j 3001e5c + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001e5e: fe842503 lw a0,-24(s0) + 3001e62: bc6ff0ef jal ra,3001228 + 3001e66: 87aa mv a5,a0 + 3001e68: 0017c793 xori a5,a5,1 + 3001e6c: 9f81 uxtb a5 + 3001e6e: cb91 beqz a5,3001e82 + 3001e70: 0e700593 li a1,231 + 3001e74: 030067b7 lui a5,0x3006 + 3001e78: 7d078513 addi a0,a5,2000 # 30067d0 + 3001e7c: 26ad jal ra,30021e6 + 3001e7e: 4785 li a5,1 + 3001e80: a809 j 3001e92 + DCL_ADC_SOCxSoftTrigger(adcHandle->baseAddress, soc); /* Software triggers a single SOC */ + 3001e82: fec42783 lw a5,-20(s0) + 3001e86: 439c lw a5,0(a5) + 3001e88: fe842583 lw a1,-24(s0) + 3001e8c: 853e mv a0,a5 + 3001e8e: 324d jal ra,3001830 + return BASE_STATUS_OK; + 3001e90: 4781 li a5,0 +} + 3001e92: 853e mv a0,a5 + 3001e94: 40f2 lw ra,28(sp) + 3001e96: 4462 lw s0,24(sp) + 3001e98: 6105 addi sp,sp,32 + 3001e9a: 8082 ret + +03001e9c : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval unsigned int value of ADC convert result. + */ +unsigned int HAL_ADC_GetConvResult(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001e9c: 1101 addi sp,sp,-32 + 3001e9e: ce06 sw ra,28(sp) + 3001ea0: cc22 sw s0,24(sp) + 3001ea2: 1000 addi s0,sp,32 + 3001ea4: fea42623 sw a0,-20(s0) + 3001ea8: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001eac: fec42783 lw a5,-20(s0) + 3001eb0: eb89 bnez a5,3001ec2 + 3001eb2: 0f400593 li a1,244 + 3001eb6: 030067b7 lui a5,0x3006 + 3001eba: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ebe: 2625 jal ra,30021e6 + 3001ec0: a001 j 3001ec0 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001ec2: fec42783 lw a5,-20(s0) + 3001ec6: 4398 lw a4,0(a5) + 3001ec8: 180007b7 lui a5,0x18000 + 3001ecc: 00f70a63 beq a4,a5,3001ee0 + 3001ed0: 0f500593 li a1,245 + 3001ed4: 030067b7 lui a5,0x3006 + 3001ed8: 7d078513 addi a0,a5,2000 # 30067d0 + 3001edc: 2629 jal ra,30021e6 + 3001ede: a001 j 3001ede + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001ee0: fe842503 lw a0,-24(s0) + 3001ee4: b44ff0ef jal ra,3001228 + 3001ee8: 87aa mv a5,a0 + 3001eea: 0017c793 xori a5,a5,1 + 3001eee: 9f81 uxtb a5 + 3001ef0: cb91 beqz a5,3001f04 + 3001ef2: 0f600593 li a1,246 + 3001ef6: 030067b7 lui a5,0x3006 + 3001efa: 7d078513 addi a0,a5,2000 # 30067d0 + 3001efe: 24e5 jal ra,30021e6 + 3001f00: 4785 li a5,1 + 3001f02: a809 j 3001f14 + return DCL_ADC_ReadSOCxResult(adcHandle->baseAddress, soc); + 3001f04: fec42783 lw a5,-20(s0) + 3001f08: 439c lw a5,0(a5) + 3001f0a: fe842583 lw a1,-24(s0) + 3001f0e: 853e mv a0,a5 + 3001f10: 3ae5 jal ra,3001908 + 3001f12: 87aa mv a5,a0 +} + 3001f14: 853e mv a0,a5 + 3001f16: 40f2 lw ra,28(sp) + 3001f18: 4462 lw s0,24(sp) + 3001f1a: 6105 addi sp,sp,32 + 3001f1c: 8082 ret + +03001f1e : + * @param adcHandle ADC handle. + * @param intx ADC interrupt type number @ref ADC_IntNumber. + * @retval None. + */ +static void ADC_IntxClearEoc(ADC_Handle *adcHandle, unsigned int intx) +{ + 3001f1e: 7139 addi sp,sp,-64 + 3001f20: de22 sw s0,60(sp) + 3001f22: 0080 addi s0,sp,64 + 3001f24: fca42623 sw a0,-52(s0) + 3001f28: fcb42423 sw a1,-56(s0) + unsigned int eocFlag = adcHandle->baseAddress->ADC_EOC_FLAG.reg; + 3001f2c: fcc42783 lw a5,-52(s0) + 3001f30: 439c lw a5,0(a5) + 3001f32: 5bbc lw a5,112(a5) + 3001f34: fef42223 sw a5,-28(s0) + ADC_INT_DATA_0_REG intData0; + ADC_INT_DATA_1_REG intData1; + unsigned int eocMask = 0; + 3001f38: fe042623 sw zero,-20(s0) + switch (intx) { + 3001f3c: fc842783 lw a5,-56(s0) + 3001f40: 4705 li a4,1 + 3001f42: 02e78963 beq a5,a4,3001f74 + 3001f46: 4705 li a4,1 + 3001f48: 00e7e963 bltu a5,a4,3001f5a + 3001f4c: 4709 li a4,2 + 3001f4e: 04e78163 beq a5,a4,3001f90 + 3001f52: 470d li a4,3 + 3001f54: 04e78b63 beq a5,a4,3001faa + case ADC_INT_NUMBER3: /* Read Interrupt Configuration */ + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + eocMask = intData1.BIT.cfg_intr_data_sel3; + break; + default: + break; + 3001f58: a0bd j 3001fc6 + intData0.reg = adcHandle->baseAddress->ADC_INT_DATA_0.reg; + 3001f5a: fcc42783 lw a5,-52(s0) + 3001f5e: 439c lw a5,0(a5) + 3001f60: 2b07a783 lw a5,688(a5) + 3001f64: fcf42c23 sw a5,-40(s0) + eocMask = intData0.BIT.cfg_intr_data_sel0; + 3001f68: fd842783 lw a5,-40(s0) + 3001f6c: 9fa1 uxth a5 + 3001f6e: fef42623 sw a5,-20(s0) + break; + 3001f72: a891 j 3001fc6 + intData0.reg = adcHandle->baseAddress->ADC_INT_DATA_0.reg; + 3001f74: fcc42783 lw a5,-52(s0) + 3001f78: 439c lw a5,0(a5) + 3001f7a: 2b07a783 lw a5,688(a5) + 3001f7e: fcf42c23 sw a5,-40(s0) + eocMask = intData0.BIT.cfg_intr_data_sel1; + 3001f82: fd842783 lw a5,-40(s0) + 3001f86: 83c1 srli a5,a5,0x10 + 3001f88: 9fa1 uxth a5 + 3001f8a: fef42623 sw a5,-20(s0) + break; + 3001f8e: a825 j 3001fc6 + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + 3001f90: fcc42783 lw a5,-52(s0) + 3001f94: 439c lw a5,0(a5) + 3001f96: 2b47a783 lw a5,692(a5) + 3001f9a: fcf42a23 sw a5,-44(s0) + eocMask = intData1.BIT.cfg_intr_data_sel2; + 3001f9e: fd442783 lw a5,-44(s0) + 3001fa2: 9fa1 uxth a5 + 3001fa4: fef42623 sw a5,-20(s0) + break; + 3001fa8: a839 j 3001fc6 + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + 3001faa: fcc42783 lw a5,-52(s0) + 3001fae: 439c lw a5,0(a5) + 3001fb0: 2b47a783 lw a5,692(a5) + 3001fb4: fcf42a23 sw a5,-44(s0) + eocMask = intData1.BIT.cfg_intr_data_sel3; + 3001fb8: fd442783 lw a5,-44(s0) + 3001fbc: 83c1 srli a5,a5,0x10 + 3001fbe: 9fa1 uxth a5 + 3001fc0: fef42623 sw a5,-20(s0) + break; + 3001fc4: 0001 nop + } + unsigned int eoc = eocFlag & eocMask; + 3001fc6: fe442703 lw a4,-28(s0) + 3001fca: fec42783 lw a5,-20(s0) + 3001fce: 8ff9 and a5,a5,a4 + 3001fd0: fef42023 sw a5,-32(s0) + adcHandle->ADC_IntxParam[intx].socxFinish = eoc; + 3001fd4: fe042783 lw a5,-32(s0) + 3001fd8: 01079713 slli a4,a5,0x10 + 3001fdc: 8341 srli a4,a4,0x10 + 3001fde: fcc42683 lw a3,-52(s0) + 3001fe2: fc842783 lw a5,-56(s0) + 3001fe6: 07e1 addi a5,a5,24 + 3001fe8: 0786 slli a5,a5,0x1 + 3001fea: 97b6 add a5,a5,a3 + 3001fec: a3da sh a4,4(a5) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001fee: fe042423 sw zero,-24(s0) + 3001ff2: a80d j 3002024 + unsigned int val = (1 << i); + 3001ff4: 4705 li a4,1 + 3001ff6: fe842783 lw a5,-24(s0) + 3001ffa: 00f717b3 sll a5,a4,a5 + 3001ffe: fcf42e23 sw a5,-36(s0) + if (eoc & val) { + 3002002: fe042703 lw a4,-32(s0) + 3002006: fdc42783 lw a5,-36(s0) + 300200a: 8ff9 and a5,a5,a4 + 300200c: c799 beqz a5,300201a + adcHandle->baseAddress->ADC_EOC_FLAG.reg = val; /* Clear the EOC flag */ + 300200e: fcc42783 lw a5,-52(s0) + 3002012: 439c lw a5,0(a5) + 3002014: fdc42703 lw a4,-36(s0) + 3002018: dbb8 sw a4,112(a5) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 300201a: fe842783 lw a5,-24(s0) + 300201e: 0785 addi a5,a5,1 + 3002020: fef42423 sw a5,-24(s0) + 3002024: fe842703 lw a4,-24(s0) + 3002028: 47bd li a5,15 + 300202a: fce7d5e3 bge a5,a4,3001ff4 + } + } +} + 300202e: 0001 nop + 3002030: 5472 lw s0,60(sp) + 3002032: 6121 addi sp,sp,64 + 3002034: 8082 ret + +03002036 : + * @brief ADC Interrupt2 service processing function. + * @param handle ADC handle. + * @retval None. + */ +void HAL_ADC_IrqHandlerInt2(void *handle) +{ + 3002036: 7179 addi sp,sp,-48 + 3002038: d606 sw ra,44(sp) + 300203a: d422 sw s0,40(sp) + 300203c: 1800 addi s0,sp,48 + 300203e: fca42e23 sw a0,-36(s0) + ADC_ASSERT_PARAM(handle != NULL); + 3002042: fdc42783 lw a5,-36(s0) + 3002046: eb89 bnez a5,3002058 + 3002048: 17900593 li a1,377 + 300204c: 030067b7 lui a5,0x3006 + 3002050: 7d078513 addi a0,a5,2000 # 30067d0 + 3002054: 2a49 jal ra,30021e6 + 3002056: a001 j 3002056 + ADC_Handle *adcHandle = (ADC_Handle *)handle; + 3002058: fdc42783 lw a5,-36(s0) + 300205c: fef42623 sw a5,-20(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3002060: fec42783 lw a5,-20(s0) + 3002064: 4398 lw a4,0(a5) + 3002066: 180007b7 lui a5,0x18000 + 300206a: 00f70a63 beq a4,a5,300207e + 300206e: 17b00593 li a1,379 + 3002072: 030067b7 lui a5,0x3006 + 3002076: 7d078513 addi a0,a5,2000 # 30067d0 + 300207a: 22b5 jal ra,30021e6 + 300207c: a001 j 300207c + ADC_IntxClearEoc(adcHandle, ADC_INT_NUMBER2); /* Clear conversion completion flag */ + 300207e: 4589 li a1,2 + 3002080: fec42503 lw a0,-20(s0) + 3002084: 3d69 jal ra,3001f1e + DCL_ADC_ClearIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + 3002086: fec42783 lw a5,-20(s0) + 300208a: 439c lw a5,0(a5) + 300208c: 4589 li a1,2 + 300208e: 853e mv a0,a5 + 3002090: cfeff0ef jal ra,300158e + if (adcHandle->userCallBack.Int2FinishCallBack != NULL) { + 3002094: fec42783 lw a5,-20(s0) + 3002098: 43fc lw a5,68(a5) + 300209a: c799 beqz a5,30020a8 + adcHandle->userCallBack.Int2FinishCallBack(handle); + 300209c: fec42783 lw a5,-20(s0) + 30020a0: 43fc lw a5,68(a5) + 30020a2: fdc42503 lw a0,-36(s0) + 30020a6: 9782 jalr a5 + } +} + 30020a8: 0001 nop + 30020aa: 50b2 lw ra,44(sp) + 30020ac: 5422 lw s0,40(sp) + 30020ae: 6145 addi sp,sp,48 + 30020b0: 8082 ret + +030020b2 : + * @param typeID Id of callback function type. + * @param pCallback Pointer of the specified callbcak function. + * @retval None. + */ +static void ADC_RegieterEventCallBack(ADC_Handle *adcHandle, ADC_CallbackFunType typeID, ADC_CallbackType pCallback) +{ + 30020b2: 7179 addi sp,sp,-48 + 30020b4: d622 sw s0,44(sp) + 30020b6: 1800 addi s0,sp,48 + 30020b8: fca42e23 sw a0,-36(s0) + 30020bc: fcb42c23 sw a1,-40(s0) + 30020c0: fcc42a23 sw a2,-44(s0) + if (typeID > ADC_CALLBACK_EVENT_PPB3_ERROR || typeID < ADC_CALLBACK_EVENT_PPB0_ZERO) { + 30020c4: fd842703 lw a4,-40(s0) + 30020c8: 47fd li a5,31 + 30020ca: 02e7e763 bltu a5,a4,30020f8 + 30020ce: fd842703 lw a4,-40(s0) + 30020d2: 47bd li a5,15 + 30020d4: 02e7f263 bgeu a5,a4,30020f8 + return; + } + unsigned int index = ((unsigned int)typeID & 0xF); + 30020d8: fd842783 lw a5,-40(s0) + 30020dc: 8bbd andi a5,a5,15 + 30020de: fef42623 sw a5,-20(s0) + adcHandle->userCallBack.PPBEventCallBack[index] = pCallback; + 30020e2: fdc42703 lw a4,-36(s0) + 30020e6: fec42783 lw a5,-20(s0) + 30020ea: 07d1 addi a5,a5,20 + 30020ec: 078a slli a5,a5,0x2 + 30020ee: 97ba add a5,a5,a4 + 30020f0: fd442703 lw a4,-44(s0) + 30020f4: cb98 sw a4,16(a5) + 30020f6: a011 j 30020fa + return; + 30020f8: 0001 nop +} + 30020fa: 5432 lw s0,44(sp) + 30020fc: 6145 addi sp,sp,48 + 30020fe: 8082 ret + +03002100 : + * @param typeID Id of callback function type. + * @param pCallback Pointer of the specified callbcak function. + * @retval None. + */ +void HAL_ADC_RegisterCallBack(ADC_Handle *adcHandle, ADC_CallbackFunType typeID, ADC_CallbackType pCallback) +{ + 3002100: 1101 addi sp,sp,-32 + 3002102: ce06 sw ra,28(sp) + 3002104: cc22 sw s0,24(sp) + 3002106: 1000 addi s0,sp,32 + 3002108: fea42623 sw a0,-20(s0) + 300210c: feb42423 sw a1,-24(s0) + 3002110: fec42223 sw a2,-28(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3002114: fec42783 lw a5,-20(s0) + 3002118: eb89 bnez a5,300212a + 300211a: 1d900593 li a1,473 + 300211e: 030067b7 lui a5,0x3006 + 3002122: 7d078513 addi a0,a5,2000 # 30067d0 + 3002126: 20c1 jal ra,30021e6 + 3002128: a001 j 3002128 + ADC_ASSERT_PARAM(pCallback != NULL); + 300212a: fe442783 lw a5,-28(s0) + 300212e: eb89 bnez a5,3002140 + 3002130: 1da00593 li a1,474 + 3002134: 030067b7 lui a5,0x3006 + 3002138: 7d078513 addi a0,a5,2000 # 30067d0 + 300213c: 206d jal ra,30021e6 + 300213e: a001 j 300213e + switch (typeID) { /* Register the callback function based on the interrupt type */ + 3002140: fe842703 lw a4,-24(s0) + 3002144: 47a1 li a5,8 + 3002146: 08e7e363 bltu a5,a4,30021cc + 300214a: fe842783 lw a5,-24(s0) + 300214e: 00279713 slli a4,a5,0x2 + 3002152: 030077b7 lui a5,0x3007 + 3002156: 80478793 addi a5,a5,-2044 # 3006804 + 300215a: 97ba add a5,a5,a4 + 300215c: 439c lw a5,0(a5) + 300215e: 8782 jr a5 + case ADC_CALLBACK_INT0: + adcHandle->userCallBack.Int0FinishCallBack = pCallback; /* Sampling finsish interrupt 0 callback function */ + 3002160: fec42783 lw a5,-20(s0) + 3002164: fe442703 lw a4,-28(s0) + 3002168: dfd8 sw a4,60(a5) + break; + 300216a: a88d j 30021dc + case ADC_CALLBACK_INT1: + adcHandle->userCallBack.Int1FinishCallBack = pCallback; /* Sampling finsish interrupt 1 callback function */ + 300216c: fec42783 lw a5,-20(s0) + 3002170: fe442703 lw a4,-28(s0) + 3002174: c3b8 sw a4,64(a5) + break; + 3002176: a09d j 30021dc + case ADC_CALLBACK_INT2: + adcHandle->userCallBack.Int2FinishCallBack = pCallback; /* Sampling finsish interrupt 2 callback function */ + 3002178: fec42783 lw a5,-20(s0) + 300217c: fe442703 lw a4,-28(s0) + 3002180: c3f8 sw a4,68(a5) + break; + 3002182: a8a9 j 30021dc + case ADC_CALLBACK_INT3: + adcHandle->userCallBack.Int3FinishCallBack = pCallback; /* Sampling finsish interrupt 3 callback function */ + 3002184: fec42783 lw a5,-20(s0) + 3002188: fe442703 lw a4,-28(s0) + 300218c: c7b8 sw a4,72(a5) + break; + 300218e: a0b9 j 30021dc + case ADC_CALLBACK_DMA: + adcHandle->userCallBack.DmaFinishCallBack = pCallback; /* Dma transfer finish callback function */ + 3002190: fec42783 lw a5,-20(s0) + 3002194: fe442703 lw a4,-28(s0) + 3002198: c7f8 sw a4,76(a5) + break; + 300219a: a089 j 30021dc + case ADC_CALLBACK_DMAERROR: + adcHandle->userCallBack.DmaErrorCallBack = pCallback; /* Dma transfer error callback function */ + 300219c: fec42783 lw a5,-20(s0) + 30021a0: fe442703 lw a4,-28(s0) + 30021a4: cbf8 sw a4,84(a5) + break; + 30021a6: a81d j 30021dc + case ADC_CALLBACK_DMAOVER: + adcHandle->userCallBack.DmaOverCallBack = pCallback; /* Dma request over callback function */ + 30021a8: fec42783 lw a5,-20(s0) + 30021ac: fe442703 lw a4,-28(s0) + 30021b0: cfb8 sw a4,88(a5) + break; + 30021b2: a02d j 30021dc + case ADC_CALLBACK_TRIGOVER: + adcHandle->userCallBack.TrigOverCallBack = pCallback; /* trigger over callback function */ + 30021b4: fec42783 lw a5,-20(s0) + 30021b8: fe442703 lw a4,-28(s0) + 30021bc: cff8 sw a4,92(a5) + break; + 30021be: a839 j 30021dc + case ADC_CALLBACK_EVENT_OVERSAMPLING: /* Oversampling callback function */ + adcHandle->userCallBack.OverSamplingFinishCallBack = pCallback; + 30021c0: fec42783 lw a5,-20(s0) + 30021c4: fe442703 lw a4,-28(s0) + 30021c8: cbb8 sw a4,80(a5) + break; + 30021ca: a809 j 30021dc + default: + ADC_RegieterEventCallBack(adcHandle, typeID, pCallback); /* PPB Function Callback Function */ + 30021cc: fe442603 lw a2,-28(s0) + 30021d0: fe842583 lw a1,-24(s0) + 30021d4: fec42503 lw a0,-20(s0) + 30021d8: 3de9 jal ra,30020b2 + break; + 30021da: 0001 nop + } +} + 30021dc: 0001 nop + 30021de: 40f2 lw ra,28(sp) + 30021e0: 4462 lw s0,24(sp) + 30021e2: 6105 addi sp,sp,32 + 30021e4: 8082 ret + +030021e6 : + * @param file Pointer to the name of the file where the error occurs. + * @param line Number of the line where the error occurs. + * @retval None. + */ +__weak void AssertErrorLog(char *file, unsigned int line) +{ + 30021e6: 1101 addi sp,sp,-32 + 30021e8: ce22 sw s0,28(sp) + 30021ea: 1000 addi s0,sp,32 + 30021ec: fea42623 sw a0,-20(s0) + 30021f0: feb42423 sw a1,-24(s0) + /* Use only if the user apllication is not defined. */ + BASE_FUNC_UNUSED(file); + BASE_FUNC_UNUSED(line); + 30021f4: 0001 nop + 30021f6: 4472 lw s0,28(sp) + 30021f8: 6105 addi sp,sp,32 + 30021fa: 8082 ret + +030021fc : + * @brief Get the systick + * @param None + * @retval The SysTick Value + */ +static inline unsigned int DCL_SYSTICK_GetTick(void) +{ + 30021fc: 1141 addi sp,sp,-16 + 30021fe: c622 sw s0,12(sp) + 3002200: 0800 addi s0,sp,16 + return SYSTICK->MTIME; /* Systick value(Lower 32bit register) */ + 3002202: 143807b7 lui a5,0x14380 + 3002206: 479c lw a5,8(a5) +} + 3002208: 853e mv a0,a5 + 300220a: 4432 lw s0,12(sp) + 300220c: 0141 addi sp,sp,16 + 300220e: 8082 ret + +03002210 : + * @brief Delay number of us. + * @param us The number of us to delay. + * @retval None. + */ +void BASE_FUNC_DelayUs(unsigned int us) +{ + 3002210: 7179 addi sp,sp,-48 + 3002212: d606 sw ra,44(sp) + 3002214: d422 sw s0,40(sp) + 3002216: 1800 addi s0,sp,48 + 3002218: fca42e23 sw a0,-36(s0) + unsigned int preTick = DCL_SYSTICK_GetTick(); + 300221c: 37c5 jal ra,30021fc + 300221e: fea42623 sw a0,-20(s0) + unsigned int tickInUs = (SYSTICK_GetCRGHZ() / CRG_FREQ_1MHz) * us; + 3002222: d85fe0ef jal ra,3000fa6 + 3002226: 872a mv a4,a0 + 3002228: 000f47b7 lui a5,0xf4 + 300222c: 24078793 addi a5,a5,576 # f4240 + 3002230: 02f757b3 divu a5,a4,a5 + 3002234: fdc42703 lw a4,-36(s0) + 3002238: 02f707b3 mul a5,a4,a5 + 300223c: fef42423 sw a5,-24(s0) + unsigned int curTick; + unsigned int delta; + + /* Wait until the delta is greater than tickInUs */ + do { + curTick = DCL_SYSTICK_GetTick(); + 3002240: 3f75 jal ra,30021fc + 3002242: fea42223 sw a0,-28(s0) + delta = (curTick >= preTick) ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick + 1; + 3002246: fe442703 lw a4,-28(s0) + 300224a: fec42783 lw a5,-20(s0) + 300224e: 40f707b3 sub a5,a4,a5 + 3002252: fef42023 sw a5,-32(s0) + } while (delta < tickInUs); + 3002256: fe042703 lw a4,-32(s0) + 300225a: fe842783 lw a5,-24(s0) + 300225e: fef761e3 bltu a4,a5,3002240 +} + 3002262: 0001 nop + 3002264: 50b2 lw ra,44(sp) + 3002266: 5422 lw s0,40(sp) + 3002268: 6145 addi sp,sp,48 + 300226a: 8082 ret + +0300226c : + * @brief Delay number of ms. + * @param ms The number of ms to delay. + * @retval None. + */ +void BASE_FUNC_DelayMs(unsigned int ms) +{ + 300226c: 7179 addi sp,sp,-48 + 300226e: d606 sw ra,44(sp) + 3002270: d422 sw s0,40(sp) + 3002272: 1800 addi s0,sp,48 + 3002274: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < ms; ++i) { + 3002278: fe042623 sw zero,-20(s0) + 300227c: a809 j 300228e + BASE_FUNC_DelayUs(BASE_DEFINE_DELAY_US_IN_MS); + 300227e: 3e800513 li a0,1000 + 3002282: 3779 jal ra,3002210 + for (unsigned int i = 0; i < ms; ++i) { + 3002284: fec42783 lw a5,-20(s0) + 3002288: 0785 addi a5,a5,1 + 300228a: fef42623 sw a5,-20(s0) + 300228e: fec42703 lw a4,-20(s0) + 3002292: fdc42783 lw a5,-36(s0) + 3002296: fef764e3 bltu a4,a5,300227e + } +} + 300229a: 0001 nop + 300229c: 50b2 lw ra,44(sp) + 300229e: 5422 lw s0,40(sp) + 30022a0: 6145 addi sp,sp,48 + 30022a2: 8082 ret + +030022a4 : + * @brief Delay number of seconds. + * @param seconds The number of seconds to delay. + * @retval None. + */ +void BASE_FUNC_DelaySeconds(unsigned int seconds) +{ + 30022a4: 7179 addi sp,sp,-48 + 30022a6: d606 sw ra,44(sp) + 30022a8: d422 sw s0,40(sp) + 30022aa: 1800 addi s0,sp,48 + 30022ac: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < seconds; ++i) { + 30022b0: fe042623 sw zero,-20(s0) + 30022b4: a809 j 30022c6 + BASE_FUNC_DelayMs(BASE_DEFINE_DELAY_MS_IN_SEC); + 30022b6: 3e800513 li a0,1000 + 30022ba: 3f4d jal ra,300226c + for (unsigned int i = 0; i < seconds; ++i) { + 30022bc: fec42783 lw a5,-20(s0) + 30022c0: 0785 addi a5,a5,1 + 30022c2: fef42623 sw a5,-20(s0) + 30022c6: fec42703 lw a4,-20(s0) + 30022ca: fdc42783 lw a5,-36(s0) + 30022ce: fef764e3 bltu a4,a5,30022b6 + } +} + 30022d2: 0001 nop + 30022d4: 50b2 lw ra,44(sp) + 30022d6: 5422 lw s0,40(sp) + 30022d8: 6145 addi sp,sp,48 + 30022da: 8082 ret + +030022dc : + * @param delay The number of 'units' to delay. + * @param units Specifies the delay unit. + * @retval None. + */ +void BASE_FUNC_Delay(unsigned int delay, BASE_DelayUnit units) +{ + 30022dc: 1101 addi sp,sp,-32 + 30022de: ce06 sw ra,28(sp) + 30022e0: cc22 sw s0,24(sp) + 30022e2: 1000 addi s0,sp,32 + 30022e4: fea42623 sw a0,-20(s0) + 30022e8: feb42423 sw a1,-24(s0) + switch (units) { + 30022ec: fe842783 lw a5,-24(s0) + 30022f0: 3e800713 li a4,1000 + 30022f4: 02e78063 beq a5,a4,3002314 + 30022f8: 000f4737 lui a4,0xf4 + 30022fc: 24070713 addi a4,a4,576 # f4240 + 3002300: 00e78e63 beq a5,a4,300231c + 3002304: 4705 li a4,1 + 3002306: 00e78363 beq a5,a4,300230c + break; + case BASE_DEFINE_DELAY_MICROSECS: + BASE_FUNC_DelayUs(delay); + break; + default: + break; + 300230a: a829 j 3002324 + BASE_FUNC_DelaySeconds(delay); + 300230c: fec42503 lw a0,-20(s0) + 3002310: 3f51 jal ra,30022a4 + break; + 3002312: a809 j 3002324 + BASE_FUNC_DelayMs(delay); + 3002314: fec42503 lw a0,-20(s0) + 3002318: 3f91 jal ra,300226c + break; + 300231a: a029 j 3002324 + BASE_FUNC_DelayUs(delay); + 300231c: fec42503 lw a0,-20(s0) + 3002320: 3dc5 jal ra,3002210 + break; + 3002322: 0001 nop + } + return; + 3002324: 0001 nop + 3002326: 40f2 lw ra,28(sp) + 3002328: 4462 lw s0,24(sp) + 300232a: 6105 addi sp,sp,32 + 300232c: 8082 ret + +0300232e : + * @brief Clear external interrupt + * @param irqNum external interrupt number + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_NOT_CREATED + */ +static inline void IRQ_ClearN(unsigned int irqNum) +{ + 300232e: 1101 addi sp,sp,-32 + 3002330: ce22 sw s0,28(sp) + 3002332: 1000 addi s0,sp,32 + 3002334: fea42623 sw a0,-20(s0) + asm volatile("fence"); + 3002338: 0ff0000f fence + WRITE_CUSTOM_CSR_VAL(LOCIPCLR, irqNum); + 300233c: fec42783 lw a5,-20(s0) + 3002340: 82be mv t0,a5 + 3002342: bf029073 csrw 0xbf0,t0 +} + 3002346: 0001 nop + 3002348: 4472 lw s0,28(sp) + 300234a: 6105 addi sp,sp,32 + 300234c: 8082 ret + +0300234e : + * @brief Exception/Interrupt Handler Entry. + * @param irqNum external interrupt number. + * @retval None + */ +void InterruptEntry(unsigned int irqNum) +{ + 300234e: 1101 addi sp,sp,-32 + 3002350: ce06 sw ra,28(sp) + 3002352: cc22 sw s0,24(sp) + 3002354: 1000 addi s0,sp,32 + 3002356: fea42623 sw a0,-20(s0) + g_irqCallbackFunc[irqNum].pfnHandler(g_irqCallbackFunc[irqNum].param); + 300235a: 040007b7 lui a5,0x4000 + 300235e: 0fc78713 addi a4,a5,252 # 40000fc + 3002362: fec42783 lw a5,-20(s0) + 3002366: 078e slli a5,a5,0x3 + 3002368: 97ba add a5,a5,a4 + 300236a: 4394 lw a3,0(a5) + 300236c: 040007b7 lui a5,0x4000 + 3002370: 0fc78713 addi a4,a5,252 # 40000fc + 3002374: fec42783 lw a5,-20(s0) + 3002378: 078e slli a5,a5,0x3 + 300237a: 97ba add a5,a5,a4 + 300237c: 43dc lw a5,4(a5) + 300237e: 853e mv a0,a5 + 3002380: 9682 jalr a3 + IRQ_ClearN(irqNum); + 3002382: fec42503 lw a0,-20(s0) + 3002386: 3765 jal ra,300232e +} + 3002388: 0001 nop + 300238a: 40f2 lw ra,28(sp) + 300238c: 4462 lw s0,24(sp) + 300238e: 6105 addi sp,sp,32 + 3002390: 8082 ret + +03002392 : + * @brief Irq initialization. + * @param none. + * @retval None + */ +void IRQ_Init(void) +{ + 3002392: 1101 addi sp,sp,-32 + 3002394: ce22 sw s0,28(sp) + 3002396: 1000 addi s0,sp,32 + unsigned int index; + + for (index = 0; index < IRQ_MAX; index++) { + 3002398: fe042623 sw zero,-20(s0) + 300239c: a82d j 30023d6 + g_irqCallbackFunc[index].pfnHandler = IRQ_DummyHandler; + 300239e: 040007b7 lui a5,0x4000 + 30023a2: 0fc78713 addi a4,a5,252 # 40000fc + 30023a6: fec42783 lw a5,-20(s0) + 30023aa: 078e slli a5,a5,0x3 + 30023ac: 97ba add a5,a5,a4 + 30023ae: 03003737 lui a4,0x3003 + 30023b2: c3270713 addi a4,a4,-974 # 3002c32 + 30023b6: c398 sw a4,0(a5) + g_irqCallbackFunc[index].param = NULL; + 30023b8: 040007b7 lui a5,0x4000 + 30023bc: 0fc78713 addi a4,a5,252 # 40000fc + 30023c0: fec42783 lw a5,-20(s0) + 30023c4: 078e slli a5,a5,0x3 + 30023c6: 97ba add a5,a5,a4 + 30023c8: 0007a223 sw zero,4(a5) + for (index = 0; index < IRQ_MAX; index++) { + 30023cc: fec42783 lw a5,-20(s0) + 30023d0: 0785 addi a5,a5,1 + 30023d2: fef42623 sw a5,-20(s0) + 30023d6: fec42703 lw a4,-20(s0) + 30023da: 07200793 li a5,114 + 30023de: fce7f0e3 bgeu a5,a4,300239e + } +} + 30023e2: 0001 nop + 30023e4: 4472 lw s0,28(sp) + 30023e6: 6105 addi sp,sp,32 + 30023e8: 8082 ret + +030023ea : + * @note In the corresponding interrupt handler, manually clear the interrupt source and the corresponding interrupt + * flag bit (call the IRQ_ClearN function to clear the interrupt), otherwise the interrupt will always be + * triggered. + */ +unsigned int IRQ_Register(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 30023ea: 1101 addi sp,sp,-32 + 30023ec: ce06 sw ra,28(sp) + 30023ee: cc22 sw s0,24(sp) + 30023f0: 1000 addi s0,sp,32 + 30023f2: fea42623 sw a0,-20(s0) + 30023f6: feb42423 sw a1,-24(s0) + 30023fa: fec42223 sw a2,-28(s0) + INTERRUPT_ASSERT_PARAM(func != NULL); + 30023fe: fe842783 lw a5,-24(s0) + 3002402: eb89 bnez a5,3002414 + 3002404: 06300593 li a1,99 + 3002408: 030077b7 lui a5,0x3007 + 300240c: 82878513 addi a0,a5,-2008 # 3006828 + 3002410: 3bd9 jal ra,30021e6 + 3002412: a001 j 3002412 + INTERRUPT_PARAM_CHECK_WITH_RET(irqNum < IRQ_MAX, IRQ_ERRNO_NUM_INVALID); + 3002414: fec42703 lw a4,-20(s0) + 3002418: 07200793 li a5,114 + 300241c: 00e7fb63 bgeu a5,a4,3002432 + 3002420: 06400593 li a1,100 + 3002424: 030077b7 lui a5,0x3007 + 3002428: 82878513 addi a0,a5,-2008 # 3006828 + 300242c: 3b6d jal ra,30021e6 + 300242e: 4789 li a5,2 + 3002430: a81d j 3002466 + + if (g_irqCallbackFunc[irqNum].pfnHandler != IRQ_DummyHandler) { + 3002432: 040007b7 lui a5,0x4000 + 3002436: 0fc78713 addi a4,a5,252 # 40000fc + 300243a: fec42783 lw a5,-20(s0) + 300243e: 078e slli a5,a5,0x3 + 3002440: 97ba add a5,a5,a4 + 3002442: 4398 lw a4,0(a5) + 3002444: 030037b7 lui a5,0x3003 + 3002448: c3278793 addi a5,a5,-974 # 3002c32 + 300244c: 00f70463 beq a4,a5,3002454 + return IRQ_ERRNO_ALREADY_CREATED; + 3002450: 478d li a5,3 + 3002452: a811 j 3002466 + } + IRQ_SetCallBack(irqNum, func, arg); + 3002454: fe442603 lw a2,-28(s0) + 3002458: fe842583 lw a1,-24(s0) + 300245c: fec42503 lw a0,-20(s0) + 3002460: 7e4000ef jal ra,3002c44 + return BASE_STATUS_OK; + 3002464: 4781 li a5,0 +} + 3002466: 853e mv a0,a5 + 3002468: 40f2 lw ra,28(sp) + 300246a: 4462 lw s0,24(sp) + 300246c: 6105 addi sp,sp,32 + 300246e: 8082 ret + +03002470 : + * @brief Enable the specified interrupt. + * @param irqNum External interrupt number. + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID. + */ +unsigned int IRQ_EnableN(unsigned int irqNum) +{ + 3002470: 7139 addi sp,sp,-64 + 3002472: de06 sw ra,60(sp) + 3002474: dc22 sw s0,56(sp) + 3002476: 0080 addi s0,sp,64 + 3002478: fca42623 sw a0,-52(s0) + unsigned int locienVal; +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 300247c: fcc42703 lw a4,-52(s0) + 3002480: 47e5 li a5,25 + 3002482: 00e7f863 bgeu a5,a4,3002492 + 3002486: fcc42703 lw a4,-52(s0) + 300248a: 07200793 li a5,114 + 300248e: 00e7fb63 bgeu a5,a4,30024a4 + 3002492: 0c300593 li a1,195 + 3002496: 030077b7 lui a5,0x3007 + 300249a: 82878513 addi a0,a5,-2008 # 3006828 + 300249e: 33a1 jal ra,30021e6 + 30024a0: 4789 li a5,2 + 30024a2: a8cd j 3002594 + /* The interrupt enable bits that can be controlled in the mie register (32 bits), up to 32 + can be controlled, and each bit corresponds to an interrupt enable */ + + RISCV_PRIV_MODE_SWITCH(priv); + + if (irqNum < IRQ_MIE_TOTAL_CNT) { + 30024a4: fcc42703 lw a4,-52(s0) + 30024a8: 47fd li a5,31 + 30024aa: 02e7e063 bltu a5,a4,30024ca + irqOrder = 1U << irqNum; + 30024ae: 4705 li a4,1 + 30024b0: fcc42783 lw a5,-52(s0) + 30024b4: 00f717b3 sll a5,a4,a5 + 30024b8: fef42623 sw a5,-20(s0) + SET_CSR(mie, irqOrder); + 30024bc: fec42783 lw a5,-20(s0) + 30024c0: 3047a7f3 csrrs a5,mie,a5 + 30024c4: fcf42c23 sw a5,-40(s0) + 30024c8: a0e9 j 3002592 + } else if (irqNum < IRQ_LOCIEN1_OFFSET) { + 30024ca: fcc42703 lw a4,-52(s0) + 30024ce: 03f00793 li a5,63 + 30024d2: 02e7ef63 bltu a5,a4,3002510 + irqOrder = irqNum - IRQ_MIE_TOTAL_CNT; + 30024d6: fcc42783 lw a5,-52(s0) + 30024da: 1781 addi a5,a5,-32 + 30024dc: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN0); + 30024e0: be0027f3 csrr a5,0xbe0 + 30024e4: fcf42e23 sw a5,-36(s0) + 30024e8: fdc42783 lw a5,-36(s0) + 30024ec: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 30024f0: 4705 li a4,1 + 30024f2: fec42783 lw a5,-20(s0) + 30024f6: 00f717b3 sll a5,a4,a5 + 30024fa: fe442703 lw a4,-28(s0) + 30024fe: 8fd9 or a5,a5,a4 + 3002500: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN0, locienVal); + 3002504: fe442783 lw a5,-28(s0) + 3002508: 82be mv t0,a5 + 300250a: be029073 csrw 0xbe0,t0 + 300250e: a051 j 3002592 + } else if (irqNum < IRQ_LOCIEN2_OFFSET) { + 3002510: fcc42703 lw a4,-52(s0) + 3002514: 05f00793 li a5,95 + 3002518: 04e7e063 bltu a5,a4,3002558 + irqOrder = irqNum - IRQ_LOCIEN1_OFFSET; + 300251c: fcc42783 lw a5,-52(s0) + 3002520: fc078793 addi a5,a5,-64 + 3002524: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN1); + 3002528: be1027f3 csrr a5,0xbe1 + 300252c: fef42023 sw a5,-32(s0) + 3002530: fe042783 lw a5,-32(s0) + 3002534: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 3002538: 4705 li a4,1 + 300253a: fec42783 lw a5,-20(s0) + 300253e: 00f717b3 sll a5,a4,a5 + 3002542: fe442703 lw a4,-28(s0) + 3002546: 8fd9 or a5,a5,a4 + 3002548: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN1, locienVal); + 300254c: fe442783 lw a5,-28(s0) + 3002550: 82be mv t0,a5 + 3002552: be129073 csrw 0xbe1,t0 + 3002556: a835 j 3002592 + } else { + irqOrder = irqNum - IRQ_LOCIEN2_OFFSET; + 3002558: fcc42783 lw a5,-52(s0) + 300255c: fa078793 addi a5,a5,-96 + 3002560: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN2); + 3002564: be2027f3 csrr a5,0xbe2 + 3002568: fef42423 sw a5,-24(s0) + 300256c: fe842783 lw a5,-24(s0) + 3002570: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 3002574: 4705 li a4,1 + 3002576: fec42783 lw a5,-20(s0) + 300257a: 00f717b3 sll a5,a4,a5 + 300257e: fe442703 lw a4,-28(s0) + 3002582: 8fd9 or a5,a5,a4 + 3002584: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN2, locienVal); + 3002588: fe442783 lw a5,-28(s0) + 300258c: 82be mv t0,a5 + 300258e: be229073 csrw 0xbe2,t0 + } + + RISCV_PRIV_MODE_SWITCH(priv); + + return BASE_STATUS_OK; + 3002592: 4781 li a5,0 +} + 3002594: 853e mv a0,a5 + 3002596: 50f2 lw ra,60(sp) + 3002598: 5462 lw s0,56(sp) + 300259a: 6121 addi sp,sp,64 + 300259c: 8082 ret + +0300259e : + * @param context. + * @note The actual code is generated by IDE + * @retval None. + */ +__weak void SysErrPrint(const SyserrContext *context) +{ + 300259e: 1101 addi sp,sp,-32 + 30025a0: ce22 sw s0,28(sp) + 30025a2: 1000 addi s0,sp,32 + 30025a4: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(context); +} + 30025a8: 0001 nop + 30025aa: 4472 lw s0,28(sp) + 30025ac: 6105 addi sp,sp,32 + 30025ae: 8082 ret + +030025b0 : + * @brief System error completion processing + * @param None. + * @retval None. + */ +static void SysErrFinish(void) +{ + 30025b0: 1141 addi sp,sp,-16 + 30025b2: c622 sw s0,12(sp) + 30025b4: 0800 addi s0,sp,16 +} + 30025b6: 0001 nop + 30025b8: 4432 lw s0,12(sp) + 30025ba: 0141 addi sp,sp,16 + 30025bc: 8082 ret + +030025be : + * @brief Exception Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrExcEntry(const SyserrContext *context) +{ + 30025be: 1101 addi sp,sp,-32 + 30025c0: ce06 sw ra,28(sp) + 30025c2: cc22 sw s0,24(sp) + 30025c4: 1000 addi s0,sp,32 + 30025c6: fea42623 sw a0,-20(s0) + SysErrPrint(context); + 30025ca: fec42503 lw a0,-20(s0) + 30025ce: 3fc1 jal ra,300259e + SysErrFinish(); + 30025d0: 37c5 jal ra,30025b0 +} + 30025d2: 0001 nop + 30025d4: 40f2 lw ra,28(sp) + 30025d6: 4462 lw s0,24(sp) + 30025d8: 6105 addi sp,sp,32 + 30025da: 8082 ret + +030025dc : + * @brief NMI Interrupt Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrNmiEntry(const SyserrContext *context) +{ + 30025dc: 1101 addi sp,sp,-32 + 30025de: ce06 sw ra,28(sp) + 30025e0: cc22 sw s0,24(sp) + 30025e2: 1000 addi s0,sp,32 + 30025e4: fea42623 sw a0,-20(s0) + INTERRUPT_ASSERT_PARAM(context != NULL); + 30025e8: fec42783 lw a5,-20(s0) + 30025ec: eb89 bnez a5,30025fe + 30025ee: 12d00593 li a1,301 + 30025f2: 030077b7 lui a5,0x3007 + 30025f6: 82878513 addi a0,a5,-2008 # 3006828 + 30025fa: 36f5 jal ra,30021e6 + 30025fc: a001 j 30025fc + SysErrPrint(context); + 30025fe: fec42503 lw a0,-20(s0) + 3002602: 3f71 jal ra,300259e + SysErrFinish(); + 3002604: 3775 jal ra,30025b0 +} + 3002606: 0001 nop + 3002608: 40f2 lw ra,28(sp) + 300260a: 4462 lw s0,24(sp) + 300260c: 6105 addi sp,sp,32 + 300260e: 8082 ret + +03002610 : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior local int prioroty. + * @retval None + */ +static void SetLocalIntNumPri(unsigned int intNum, unsigned int interPriNum, unsigned int prior) +{ + 3002610: 711d addi sp,sp,-96 + 3002612: cea2 sw s0,92(sp) + 3002614: 1080 addi s0,sp,96 + 3002616: faa42623 sw a0,-84(s0) + 300261a: fab42423 sw a1,-88(s0) + 300261e: fac42223 sw a2,-92(s0) + switch (intNum) { + 3002622: fac42783 lw a5,-84(s0) + 3002626: 17e1 addi a5,a5,-8 + 3002628: 471d li a4,7 + 300262a: 2af76363 bltu a4,a5,30028d0 + 300262e: 00279713 slli a4,a5,0x2 + 3002632: 030077b7 lui a5,0x3007 + 3002636: 84878793 addi a5,a5,-1976 # 3006848 + 300263a: 97ba add a5,a5,a4 + 300263c: 439c lw a5,0(a5) + 300263e: 8782 jr a5 + case 8: /* GROUP8 */ + SET_LOCAL_INTER_NUM_PRI(8, interPriNum, prior); + 3002640: bc8027f3 csrr a5,0xbc8 + 3002644: faf42a23 sw a5,-76(s0) + 3002648: fb442783 lw a5,-76(s0) + 300264c: faf42823 sw a5,-80(s0) + 3002650: fa842783 lw a5,-88(s0) + 3002654: 078a slli a5,a5,0x2 + 3002656: 8bf1 andi a5,a5,28 + 3002658: 473d li a4,15 + 300265a: 00f717b3 sll a5,a4,a5 + 300265e: fff7c793 not a5,a5 + 3002662: fb042703 lw a4,-80(s0) + 3002666: 8ff9 and a5,a5,a4 + 3002668: faf42823 sw a5,-80(s0) + 300266c: fa842783 lw a5,-88(s0) + 3002670: 078a slli a5,a5,0x2 + 3002672: 8bf1 andi a5,a5,28 + 3002674: fa442703 lw a4,-92(s0) + 3002678: 00f717b3 sll a5,a4,a5 + 300267c: fb042703 lw a4,-80(s0) + 3002680: 8fd9 or a5,a5,a4 + 3002682: faf42823 sw a5,-80(s0) + 3002686: fb042783 lw a5,-80(s0) + 300268a: 82be mv t0,a5 + 300268c: bc829073 csrw 0xbc8,t0 + break; + 3002690: a489 j 30028d2 + case 9: /* GROUP9 */ + SET_LOCAL_INTER_NUM_PRI(9, interPriNum, prior); + 3002692: bc9027f3 csrr a5,0xbc9 + 3002696: faf42e23 sw a5,-68(s0) + 300269a: fbc42783 lw a5,-68(s0) + 300269e: faf42c23 sw a5,-72(s0) + 30026a2: fa842783 lw a5,-88(s0) + 30026a6: 078a slli a5,a5,0x2 + 30026a8: 8bf1 andi a5,a5,28 + 30026aa: 473d li a4,15 + 30026ac: 00f717b3 sll a5,a4,a5 + 30026b0: fff7c793 not a5,a5 + 30026b4: fb842703 lw a4,-72(s0) + 30026b8: 8ff9 and a5,a5,a4 + 30026ba: faf42c23 sw a5,-72(s0) + 30026be: fa842783 lw a5,-88(s0) + 30026c2: 078a slli a5,a5,0x2 + 30026c4: 8bf1 andi a5,a5,28 + 30026c6: fa442703 lw a4,-92(s0) + 30026ca: 00f717b3 sll a5,a4,a5 + 30026ce: fb842703 lw a4,-72(s0) + 30026d2: 8fd9 or a5,a5,a4 + 30026d4: faf42c23 sw a5,-72(s0) + 30026d8: fb842783 lw a5,-72(s0) + 30026dc: 82be mv t0,a5 + 30026de: bc929073 csrw 0xbc9,t0 + break; + 30026e2: aac5 j 30028d2 + case 10: /* GROUP10 */ + SET_LOCAL_INTER_NUM_PRI(10, interPriNum, prior); + 30026e4: bca027f3 csrr a5,0xbca + 30026e8: fcf42223 sw a5,-60(s0) + 30026ec: fc442783 lw a5,-60(s0) + 30026f0: fcf42023 sw a5,-64(s0) + 30026f4: fa842783 lw a5,-88(s0) + 30026f8: 078a slli a5,a5,0x2 + 30026fa: 8bf1 andi a5,a5,28 + 30026fc: 473d li a4,15 + 30026fe: 00f717b3 sll a5,a4,a5 + 3002702: fff7c793 not a5,a5 + 3002706: fc042703 lw a4,-64(s0) + 300270a: 8ff9 and a5,a5,a4 + 300270c: fcf42023 sw a5,-64(s0) + 3002710: fa842783 lw a5,-88(s0) + 3002714: 078a slli a5,a5,0x2 + 3002716: 8bf1 andi a5,a5,28 + 3002718: fa442703 lw a4,-92(s0) + 300271c: 00f717b3 sll a5,a4,a5 + 3002720: fc042703 lw a4,-64(s0) + 3002724: 8fd9 or a5,a5,a4 + 3002726: fcf42023 sw a5,-64(s0) + 300272a: fc042783 lw a5,-64(s0) + 300272e: 82be mv t0,a5 + 3002730: bca29073 csrw 0xbca,t0 + break; + 3002734: aa79 j 30028d2 + case 11: /* GROUP11 */ + SET_LOCAL_INTER_NUM_PRI(11, interPriNum, prior); + 3002736: bcb027f3 csrr a5,0xbcb + 300273a: fcf42623 sw a5,-52(s0) + 300273e: fcc42783 lw a5,-52(s0) + 3002742: fcf42423 sw a5,-56(s0) + 3002746: fa842783 lw a5,-88(s0) + 300274a: 078a slli a5,a5,0x2 + 300274c: 8bf1 andi a5,a5,28 + 300274e: 473d li a4,15 + 3002750: 00f717b3 sll a5,a4,a5 + 3002754: fff7c793 not a5,a5 + 3002758: fc842703 lw a4,-56(s0) + 300275c: 8ff9 and a5,a5,a4 + 300275e: fcf42423 sw a5,-56(s0) + 3002762: fa842783 lw a5,-88(s0) + 3002766: 078a slli a5,a5,0x2 + 3002768: 8bf1 andi a5,a5,28 + 300276a: fa442703 lw a4,-92(s0) + 300276e: 00f717b3 sll a5,a4,a5 + 3002772: fc842703 lw a4,-56(s0) + 3002776: 8fd9 or a5,a5,a4 + 3002778: fcf42423 sw a5,-56(s0) + 300277c: fc842783 lw a5,-56(s0) + 3002780: 82be mv t0,a5 + 3002782: bcb29073 csrw 0xbcb,t0 + break; + 3002786: a2b1 j 30028d2 + case 12: /* GROUP12 */ + SET_LOCAL_INTER_NUM_PRI(12, interPriNum, prior); + 3002788: bcc027f3 csrr a5,0xbcc + 300278c: fcf42a23 sw a5,-44(s0) + 3002790: fd442783 lw a5,-44(s0) + 3002794: fcf42823 sw a5,-48(s0) + 3002798: fa842783 lw a5,-88(s0) + 300279c: 078a slli a5,a5,0x2 + 300279e: 8bf1 andi a5,a5,28 + 30027a0: 473d li a4,15 + 30027a2: 00f717b3 sll a5,a4,a5 + 30027a6: fff7c793 not a5,a5 + 30027aa: fd042703 lw a4,-48(s0) + 30027ae: 8ff9 and a5,a5,a4 + 30027b0: fcf42823 sw a5,-48(s0) + 30027b4: fa842783 lw a5,-88(s0) + 30027b8: 078a slli a5,a5,0x2 + 30027ba: 8bf1 andi a5,a5,28 + 30027bc: fa442703 lw a4,-92(s0) + 30027c0: 00f717b3 sll a5,a4,a5 + 30027c4: fd042703 lw a4,-48(s0) + 30027c8: 8fd9 or a5,a5,a4 + 30027ca: fcf42823 sw a5,-48(s0) + 30027ce: fd042783 lw a5,-48(s0) + 30027d2: 82be mv t0,a5 + 30027d4: bcc29073 csrw 0xbcc,t0 + break; + 30027d8: a8ed j 30028d2 + case 13: /* GROUP13 */ + SET_LOCAL_INTER_NUM_PRI(13, interPriNum, prior); + 30027da: bcd027f3 csrr a5,0xbcd + 30027de: fcf42e23 sw a5,-36(s0) + 30027e2: fdc42783 lw a5,-36(s0) + 30027e6: fcf42c23 sw a5,-40(s0) + 30027ea: fa842783 lw a5,-88(s0) + 30027ee: 078a slli a5,a5,0x2 + 30027f0: 8bf1 andi a5,a5,28 + 30027f2: 473d li a4,15 + 30027f4: 00f717b3 sll a5,a4,a5 + 30027f8: fff7c793 not a5,a5 + 30027fc: fd842703 lw a4,-40(s0) + 3002800: 8ff9 and a5,a5,a4 + 3002802: fcf42c23 sw a5,-40(s0) + 3002806: fa842783 lw a5,-88(s0) + 300280a: 078a slli a5,a5,0x2 + 300280c: 8bf1 andi a5,a5,28 + 300280e: fa442703 lw a4,-92(s0) + 3002812: 00f717b3 sll a5,a4,a5 + 3002816: fd842703 lw a4,-40(s0) + 300281a: 8fd9 or a5,a5,a4 + 300281c: fcf42c23 sw a5,-40(s0) + 3002820: fd842783 lw a5,-40(s0) + 3002824: 82be mv t0,a5 + 3002826: bcd29073 csrw 0xbcd,t0 + break; + 300282a: a065 j 30028d2 + case 14: /* GROUP14 */ + SET_LOCAL_INTER_NUM_PRI(14, interPriNum, prior); + 300282c: bce027f3 csrr a5,0xbce + 3002830: fef42223 sw a5,-28(s0) + 3002834: fe442783 lw a5,-28(s0) + 3002838: fef42023 sw a5,-32(s0) + 300283c: fa842783 lw a5,-88(s0) + 3002840: 078a slli a5,a5,0x2 + 3002842: 8bf1 andi a5,a5,28 + 3002844: 473d li a4,15 + 3002846: 00f717b3 sll a5,a4,a5 + 300284a: fff7c793 not a5,a5 + 300284e: fe042703 lw a4,-32(s0) + 3002852: 8ff9 and a5,a5,a4 + 3002854: fef42023 sw a5,-32(s0) + 3002858: fa842783 lw a5,-88(s0) + 300285c: 078a slli a5,a5,0x2 + 300285e: 8bf1 andi a5,a5,28 + 3002860: fa442703 lw a4,-92(s0) + 3002864: 00f717b3 sll a5,a4,a5 + 3002868: fe042703 lw a4,-32(s0) + 300286c: 8fd9 or a5,a5,a4 + 300286e: fef42023 sw a5,-32(s0) + 3002872: fe042783 lw a5,-32(s0) + 3002876: 82be mv t0,a5 + 3002878: bce29073 csrw 0xbce,t0 + break; + 300287c: a899 j 30028d2 + case 15: /* GROUP15 */ + SET_LOCAL_INTER_NUM_PRI(15, interPriNum, prior); + 300287e: bcf027f3 csrr a5,0xbcf + 3002882: fef42623 sw a5,-20(s0) + 3002886: fec42783 lw a5,-20(s0) + 300288a: fef42423 sw a5,-24(s0) + 300288e: fa842783 lw a5,-88(s0) + 3002892: 078a slli a5,a5,0x2 + 3002894: 8bf1 andi a5,a5,28 + 3002896: 473d li a4,15 + 3002898: 00f717b3 sll a5,a4,a5 + 300289c: fff7c793 not a5,a5 + 30028a0: fe842703 lw a4,-24(s0) + 30028a4: 8ff9 and a5,a5,a4 + 30028a6: fef42423 sw a5,-24(s0) + 30028aa: fa842783 lw a5,-88(s0) + 30028ae: 078a slli a5,a5,0x2 + 30028b0: 8bf1 andi a5,a5,28 + 30028b2: fa442703 lw a4,-92(s0) + 30028b6: 00f717b3 sll a5,a4,a5 + 30028ba: fe842703 lw a4,-24(s0) + 30028be: 8fd9 or a5,a5,a4 + 30028c0: fef42423 sw a5,-24(s0) + 30028c4: fe842783 lw a5,-24(s0) + 30028c8: 82be mv t0,a5 + 30028ca: bcf29073 csrw 0xbcf,t0 + break; + 30028ce: a011 j 30028d2 + default: + break; + 30028d0: 0001 nop + } +} + 30028d2: 0001 nop + 30028d4: 4476 lw s0,92(sp) + 30028d6: 6125 addi sp,sp,96 + 30028d8: 8082 ret + +030028da : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior Priority of this local interrupt to be set. + * @retval None. + */ +static void IRQ_SetLocalPriority(unsigned int interPriNum, unsigned int prior) +{ + 30028da: 7159 addi sp,sp,-112 + 30028dc: d686 sw ra,108(sp) + 30028de: d4a2 sw s0,104(sp) + 30028e0: 1880 addi s0,sp,112 + 30028e2: f8a42e23 sw a0,-100(s0) + 30028e6: f8b42c23 sw a1,-104(s0) +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + RISCV_PRIV_MODE_SWITCH(priv); + unsigned int intNum = GET_LOCAL_INTER_CONFIGREG_NUM(interPriNum); + 30028ea: f9c42783 lw a5,-100(s0) + 30028ee: 838d srli a5,a5,0x3 + 30028f0: fef42623 sw a5,-20(s0) + switch (intNum) { + 30028f4: fec42703 lw a4,-20(s0) + 30028f8: 479d li a5,7 + 30028fa: 2ae7e563 bltu a5,a4,3002ba4 + 30028fe: fec42783 lw a5,-20(s0) + 3002902: 00279713 slli a4,a5,0x2 + 3002906: 030077b7 lui a5,0x3007 + 300290a: 86878793 addi a5,a5,-1944 # 3006868 + 300290e: 97ba add a5,a5,a4 + 3002910: 439c lw a5,0(a5) + 3002912: 8782 jr a5 + case 0: /* GROUP0 */ + SET_LOCAL_INTER_NUM_PRI(0, interPriNum, prior); + 3002914: bc0027f3 csrr a5,0xbc0 + 3002918: faf42823 sw a5,-80(s0) + 300291c: fb042783 lw a5,-80(s0) + 3002920: faf42623 sw a5,-84(s0) + 3002924: f9c42783 lw a5,-100(s0) + 3002928: 078a slli a5,a5,0x2 + 300292a: 8bf1 andi a5,a5,28 + 300292c: 473d li a4,15 + 300292e: 00f717b3 sll a5,a4,a5 + 3002932: fff7c793 not a5,a5 + 3002936: fac42703 lw a4,-84(s0) + 300293a: 8ff9 and a5,a5,a4 + 300293c: faf42623 sw a5,-84(s0) + 3002940: f9c42783 lw a5,-100(s0) + 3002944: 078a slli a5,a5,0x2 + 3002946: 8bf1 andi a5,a5,28 + 3002948: f9842703 lw a4,-104(s0) + 300294c: 00f717b3 sll a5,a4,a5 + 3002950: fac42703 lw a4,-84(s0) + 3002954: 8fd9 or a5,a5,a4 + 3002956: faf42623 sw a5,-84(s0) + 300295a: fac42783 lw a5,-84(s0) + 300295e: 82be mv t0,a5 + 3002960: bc029073 csrw 0xbc0,t0 + break; + 3002964: ac81 j 3002bb4 + case 1: /* GROUP1 */ + SET_LOCAL_INTER_NUM_PRI(1, interPriNum, prior); + 3002966: bc1027f3 csrr a5,0xbc1 + 300296a: faf42c23 sw a5,-72(s0) + 300296e: fb842783 lw a5,-72(s0) + 3002972: faf42a23 sw a5,-76(s0) + 3002976: f9c42783 lw a5,-100(s0) + 300297a: 078a slli a5,a5,0x2 + 300297c: 8bf1 andi a5,a5,28 + 300297e: 473d li a4,15 + 3002980: 00f717b3 sll a5,a4,a5 + 3002984: fff7c793 not a5,a5 + 3002988: fb442703 lw a4,-76(s0) + 300298c: 8ff9 and a5,a5,a4 + 300298e: faf42a23 sw a5,-76(s0) + 3002992: f9c42783 lw a5,-100(s0) + 3002996: 078a slli a5,a5,0x2 + 3002998: 8bf1 andi a5,a5,28 + 300299a: f9842703 lw a4,-104(s0) + 300299e: 00f717b3 sll a5,a4,a5 + 30029a2: fb442703 lw a4,-76(s0) + 30029a6: 8fd9 or a5,a5,a4 + 30029a8: faf42a23 sw a5,-76(s0) + 30029ac: fb442783 lw a5,-76(s0) + 30029b0: 82be mv t0,a5 + 30029b2: bc129073 csrw 0xbc1,t0 + break; + 30029b6: aafd j 3002bb4 + case 2: /* GROUP2 */ + SET_LOCAL_INTER_NUM_PRI(2, interPriNum, prior); + 30029b8: bc2027f3 csrr a5,0xbc2 + 30029bc: fcf42023 sw a5,-64(s0) + 30029c0: fc042783 lw a5,-64(s0) + 30029c4: faf42e23 sw a5,-68(s0) + 30029c8: f9c42783 lw a5,-100(s0) + 30029cc: 078a slli a5,a5,0x2 + 30029ce: 8bf1 andi a5,a5,28 + 30029d0: 473d li a4,15 + 30029d2: 00f717b3 sll a5,a4,a5 + 30029d6: fff7c793 not a5,a5 + 30029da: fbc42703 lw a4,-68(s0) + 30029de: 8ff9 and a5,a5,a4 + 30029e0: faf42e23 sw a5,-68(s0) + 30029e4: f9c42783 lw a5,-100(s0) + 30029e8: 078a slli a5,a5,0x2 + 30029ea: 8bf1 andi a5,a5,28 + 30029ec: f9842703 lw a4,-104(s0) + 30029f0: 00f717b3 sll a5,a4,a5 + 30029f4: fbc42703 lw a4,-68(s0) + 30029f8: 8fd9 or a5,a5,a4 + 30029fa: faf42e23 sw a5,-68(s0) + 30029fe: fbc42783 lw a5,-68(s0) + 3002a02: 82be mv t0,a5 + 3002a04: bc229073 csrw 0xbc2,t0 + break; + 3002a08: a275 j 3002bb4 + case 3: /* GROUP3 */ + SET_LOCAL_INTER_NUM_PRI(3, interPriNum, prior); + 3002a0a: bc3027f3 csrr a5,0xbc3 + 3002a0e: fcf42423 sw a5,-56(s0) + 3002a12: fc842783 lw a5,-56(s0) + 3002a16: fcf42223 sw a5,-60(s0) + 3002a1a: f9c42783 lw a5,-100(s0) + 3002a1e: 078a slli a5,a5,0x2 + 3002a20: 8bf1 andi a5,a5,28 + 3002a22: 473d li a4,15 + 3002a24: 00f717b3 sll a5,a4,a5 + 3002a28: fff7c793 not a5,a5 + 3002a2c: fc442703 lw a4,-60(s0) + 3002a30: 8ff9 and a5,a5,a4 + 3002a32: fcf42223 sw a5,-60(s0) + 3002a36: f9c42783 lw a5,-100(s0) + 3002a3a: 078a slli a5,a5,0x2 + 3002a3c: 8bf1 andi a5,a5,28 + 3002a3e: f9842703 lw a4,-104(s0) + 3002a42: 00f717b3 sll a5,a4,a5 + 3002a46: fc442703 lw a4,-60(s0) + 3002a4a: 8fd9 or a5,a5,a4 + 3002a4c: fcf42223 sw a5,-60(s0) + 3002a50: fc442783 lw a5,-60(s0) + 3002a54: 82be mv t0,a5 + 3002a56: bc329073 csrw 0xbc3,t0 + break; + 3002a5a: aaa9 j 3002bb4 + case 4: /* GROUP4 */ + SET_LOCAL_INTER_NUM_PRI(4, interPriNum, prior); + 3002a5c: bc4027f3 csrr a5,0xbc4 + 3002a60: fcf42823 sw a5,-48(s0) + 3002a64: fd042783 lw a5,-48(s0) + 3002a68: fcf42623 sw a5,-52(s0) + 3002a6c: f9c42783 lw a5,-100(s0) + 3002a70: 078a slli a5,a5,0x2 + 3002a72: 8bf1 andi a5,a5,28 + 3002a74: 473d li a4,15 + 3002a76: 00f717b3 sll a5,a4,a5 + 3002a7a: fff7c793 not a5,a5 + 3002a7e: fcc42703 lw a4,-52(s0) + 3002a82: 8ff9 and a5,a5,a4 + 3002a84: fcf42623 sw a5,-52(s0) + 3002a88: f9c42783 lw a5,-100(s0) + 3002a8c: 078a slli a5,a5,0x2 + 3002a8e: 8bf1 andi a5,a5,28 + 3002a90: f9842703 lw a4,-104(s0) + 3002a94: 00f717b3 sll a5,a4,a5 + 3002a98: fcc42703 lw a4,-52(s0) + 3002a9c: 8fd9 or a5,a5,a4 + 3002a9e: fcf42623 sw a5,-52(s0) + 3002aa2: fcc42783 lw a5,-52(s0) + 3002aa6: 82be mv t0,a5 + 3002aa8: bc429073 csrw 0xbc4,t0 + break; + 3002aac: a221 j 3002bb4 + case 5: /* GROUP5 */ + SET_LOCAL_INTER_NUM_PRI(5, interPriNum, prior); + 3002aae: bc5027f3 csrr a5,0xbc5 + 3002ab2: fcf42c23 sw a5,-40(s0) + 3002ab6: fd842783 lw a5,-40(s0) + 3002aba: fcf42a23 sw a5,-44(s0) + 3002abe: f9c42783 lw a5,-100(s0) + 3002ac2: 078a slli a5,a5,0x2 + 3002ac4: 8bf1 andi a5,a5,28 + 3002ac6: 473d li a4,15 + 3002ac8: 00f717b3 sll a5,a4,a5 + 3002acc: fff7c793 not a5,a5 + 3002ad0: fd442703 lw a4,-44(s0) + 3002ad4: 8ff9 and a5,a5,a4 + 3002ad6: fcf42a23 sw a5,-44(s0) + 3002ada: f9c42783 lw a5,-100(s0) + 3002ade: 078a slli a5,a5,0x2 + 3002ae0: 8bf1 andi a5,a5,28 + 3002ae2: f9842703 lw a4,-104(s0) + 3002ae6: 00f717b3 sll a5,a4,a5 + 3002aea: fd442703 lw a4,-44(s0) + 3002aee: 8fd9 or a5,a5,a4 + 3002af0: fcf42a23 sw a5,-44(s0) + 3002af4: fd442783 lw a5,-44(s0) + 3002af8: 82be mv t0,a5 + 3002afa: bc529073 csrw 0xbc5,t0 + break; + 3002afe: a85d j 3002bb4 + case 6: /* GROUP6 */ + SET_LOCAL_INTER_NUM_PRI(6, interPriNum, prior); + 3002b00: bc6027f3 csrr a5,0xbc6 + 3002b04: fef42023 sw a5,-32(s0) + 3002b08: fe042783 lw a5,-32(s0) + 3002b0c: fcf42e23 sw a5,-36(s0) + 3002b10: f9c42783 lw a5,-100(s0) + 3002b14: 078a slli a5,a5,0x2 + 3002b16: 8bf1 andi a5,a5,28 + 3002b18: 473d li a4,15 + 3002b1a: 00f717b3 sll a5,a4,a5 + 3002b1e: fff7c793 not a5,a5 + 3002b22: fdc42703 lw a4,-36(s0) + 3002b26: 8ff9 and a5,a5,a4 + 3002b28: fcf42e23 sw a5,-36(s0) + 3002b2c: f9c42783 lw a5,-100(s0) + 3002b30: 078a slli a5,a5,0x2 + 3002b32: 8bf1 andi a5,a5,28 + 3002b34: f9842703 lw a4,-104(s0) + 3002b38: 00f717b3 sll a5,a4,a5 + 3002b3c: fdc42703 lw a4,-36(s0) + 3002b40: 8fd9 or a5,a5,a4 + 3002b42: fcf42e23 sw a5,-36(s0) + 3002b46: fdc42783 lw a5,-36(s0) + 3002b4a: 82be mv t0,a5 + 3002b4c: bc629073 csrw 0xbc6,t0 + break; + 3002b50: a095 j 3002bb4 + case 7: /* GROUP7 */ + SET_LOCAL_INTER_NUM_PRI(7, interPriNum, prior); + 3002b52: bc7027f3 csrr a5,0xbc7 + 3002b56: fef42423 sw a5,-24(s0) + 3002b5a: fe842783 lw a5,-24(s0) + 3002b5e: fef42223 sw a5,-28(s0) + 3002b62: f9c42783 lw a5,-100(s0) + 3002b66: 078a slli a5,a5,0x2 + 3002b68: 8bf1 andi a5,a5,28 + 3002b6a: 473d li a4,15 + 3002b6c: 00f717b3 sll a5,a4,a5 + 3002b70: fff7c793 not a5,a5 + 3002b74: fe442703 lw a4,-28(s0) + 3002b78: 8ff9 and a5,a5,a4 + 3002b7a: fef42223 sw a5,-28(s0) + 3002b7e: f9c42783 lw a5,-100(s0) + 3002b82: 078a slli a5,a5,0x2 + 3002b84: 8bf1 andi a5,a5,28 + 3002b86: f9842703 lw a4,-104(s0) + 3002b8a: 00f717b3 sll a5,a4,a5 + 3002b8e: fe442703 lw a4,-28(s0) + 3002b92: 8fd9 or a5,a5,a4 + 3002b94: fef42223 sw a5,-28(s0) + 3002b98: fe442783 lw a5,-28(s0) + 3002b9c: 82be mv t0,a5 + 3002b9e: bc729073 csrw 0xbc7,t0 + break; + 3002ba2: a809 j 3002bb4 + default: + SetLocalIntNumPri(intNum, interPriNum, prior); + 3002ba4: f9842603 lw a2,-104(s0) + 3002ba8: f9c42583 lw a1,-100(s0) + 3002bac: fec42503 lw a0,-20(s0) + 3002bb0: 3485 jal ra,3002610 + break; + 3002bb2: 0001 nop + } + RISCV_PRIV_MODE_SWITCH(priv); +} + 3002bb4: 0001 nop + 3002bb6: 50b6 lw ra,108(sp) + 3002bb8: 5426 lw s0,104(sp) + 3002bba: 6165 addi sp,sp,112 + 3002bbc: 8082 ret + +03002bbe : + * @param irqNum External interrupt number. + * @param priority. + * @retval IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_PRIORITY_INVALID or BASE_STATUS_OK. + */ +unsigned int IRQ_SetPriority(unsigned int irqNum, unsigned int priority) +{ + 3002bbe: 1101 addi sp,sp,-32 + 3002bc0: ce06 sw ra,28(sp) + 3002bc2: cc22 sw s0,24(sp) + 3002bc4: 1000 addi s0,sp,32 + 3002bc6: fea42623 sw a0,-20(s0) + 3002bca: feb42423 sw a1,-24(s0) + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 3002bce: fec42703 lw a4,-20(s0) + 3002bd2: 47e5 li a5,25 + 3002bd4: 00e7f863 bgeu a5,a4,3002be4 + 3002bd8: fec42703 lw a4,-20(s0) + 3002bdc: 07200793 li a5,114 + 3002be0: 00e7fb63 bgeu a5,a4,3002bf6 + 3002be4: 18c00593 li a1,396 + 3002be8: 030077b7 lui a5,0x3007 + 3002bec: 82878513 addi a0,a5,-2008 # 3006828 + 3002bf0: 21bd jal ra,300305e + 3002bf2: 4789 li a5,2 + 3002bf4: a815 j 3002c28 + INTERRUPT_PARAM_CHECK_WITH_RET((priority >= IRQ_PRIO_LOWEST && priority <= IRQ_PRIO_HIGHEST), \ + 3002bf6: fe842783 lw a5,-24(s0) + 3002bfa: c791 beqz a5,3002c06 + 3002bfc: fe842703 lw a4,-24(s0) + 3002c00: 47bd li a5,15 + 3002c02: 00e7fb63 bgeu a5,a4,3002c18 + 3002c06: 18d00593 li a1,397 + 3002c0a: 030077b7 lui a5,0x3007 + 3002c0e: 82878513 addi a0,a5,-2008 # 3006828 + 3002c12: 21b1 jal ra,300305e + 3002c14: 4795 li a5,5 + 3002c16: a809 j 3002c28 + IRQ_ERRNO_PRIORITY_INVALID); + + /* The locipri register is specifically used to configure the priority of the + external non-standard interrupts of the CPU, so the number of internal + standard interrupts should be subtracted */ + IRQ_SetLocalPriority(irqNum - IRQ_VECTOR_CNT, priority); + 3002c18: fec42783 lw a5,-20(s0) + 3002c1c: 1799 addi a5,a5,-26 + 3002c1e: fe842583 lw a1,-24(s0) + 3002c22: 853e mv a0,a5 + 3002c24: 395d jal ra,30028da + + return BASE_STATUS_OK; + 3002c26: 4781 li a5,0 +} + 3002c28: 853e mv a0,a5 + 3002c2a: 40f2 lw ra,28(sp) + 3002c2c: 4462 lw s0,24(sp) + 3002c2e: 6105 addi sp,sp,32 + 3002c30: 8082 ret + +03002c32 : + * @brief Interrupt dummy handler + * @param arg Not used + * @retval None. + */ +static void IRQ_DummyHandler(void *arg) +{ + 3002c32: 1101 addi sp,sp,-32 + 3002c34: ce22 sw s0,28(sp) + 3002c36: 1000 addi s0,sp,32 + 3002c38: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(arg); +} + 3002c3c: 0001 nop + 3002c3e: 4472 lw s0,28(sp) + 3002c40: 6105 addi sp,sp,32 + 3002c42: 8082 ret + +03002c44 : + * @param func callback function + * @param arg callback arg + * @retval None. + */ +static inline void IRQ_SetCallBack(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 3002c44: 1101 addi sp,sp,-32 + 3002c46: ce22 sw s0,28(sp) + 3002c48: 1000 addi s0,sp,32 + 3002c4a: fea42623 sw a0,-20(s0) + 3002c4e: feb42423 sw a1,-24(s0) + 3002c52: fec42223 sw a2,-28(s0) + g_irqCallbackFunc[irqNum].param = arg; + 3002c56: 040007b7 lui a5,0x4000 + 3002c5a: 0fc78713 addi a4,a5,252 # 40000fc + 3002c5e: fec42783 lw a5,-20(s0) + 3002c62: 078e slli a5,a5,0x3 + 3002c64: 97ba add a5,a5,a4 + 3002c66: fe442703 lw a4,-28(s0) + 3002c6a: c3d8 sw a4,4(a5) + g_irqCallbackFunc[irqNum].pfnHandler = func; + 3002c6c: 040007b7 lui a5,0x4000 + 3002c70: 0fc78713 addi a4,a5,252 # 40000fc + 3002c74: fec42783 lw a5,-20(s0) + 3002c78: 078e slli a5,a5,0x3 + 3002c7a: 97ba add a5,a5,a4 + 3002c7c: fe842703 lw a4,-24(s0) + 3002c80: c398 sw a4,0(a5) +} + 3002c82: 0001 nop + 3002c84: 4472 lw s0,28(sp) + 3002c86: 6105 addi sp,sp,32 + 3002c88: 8082 ret + +03002c8a : + * @brief Set the write protection for CRG-related registers disable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionDisable(void) +{ + 3002c8a: 1141 addi sp,sp,-16 + 3002c8c: c622 sw s0,12(sp) + 3002c8e: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = (SYSCTRL0->SC_LOCKEN.reg & SC_LOCKEN_CRG_DISABLE_MASK) + SC_LOCKEN_VALID_HIGH_BIT; + 3002c90: 101007b7 lui a5,0x10100 + 3002c94: 43f8 lw a4,68(a5) + 3002c96: 67c1 lui a5,0x10 + 3002c98: 17f9 addi a5,a5,-2 # fffe + 3002c9a: 00f776b3 and a3,a4,a5 + 3002c9e: 101007b7 lui a5,0x10100 + 3002ca2: ea510737 lui a4,0xea510 + 3002ca6: 9736 add a4,a4,a3 + 3002ca8: c3f8 sw a4,68(a5) +} + 3002caa: 0001 nop + 3002cac: 4432 lw s0,12(sp) + 3002cae: 0141 addi sp,sp,16 + 3002cb0: 8082 ret + +03002cb2 : + * @brief Set the Set the write protection for CRG-related registers enable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionEnable(void) +{ + 3002cb2: 1141 addi sp,sp,-16 + 3002cb4: c622 sw s0,12(sp) + 3002cb6: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = ((SYSCTRL0->SC_LOCKEN.reg & SC_LOW_BIT_MASK) | SC_LOCKEN_CRG_ENABLE_MASK) + + 3002cb8: 101007b7 lui a5,0x10100 + 3002cbc: 43f8 lw a4,68(a5) + 3002cbe: 67c1 lui a5,0x10 + 3002cc0: 17fd addi a5,a5,-1 # ffff + 3002cc2: 8ff9 and a5,a5,a4 + 3002cc4: 0017e693 ori a3,a5,1 + 3002cc8: 101007b7 lui a5,0x10100 + 3002ccc: ea510737 lui a4,0xea510 + 3002cd0: 9736 add a4,a4,a3 + 3002cd2: c3f8 sw a4,68(a5) + SC_LOCKEN_VALID_HIGH_BIT; +} + 3002cd4: 0001 nop + 3002cd6: 4432 lw s0,12(sp) + 3002cd8: 0141 addi sp,sp,16 + 3002cda: 8082 ret + +03002cdc : + * @param clkSelect pll_ref_cksel + * @retval true + * @retval false + */ +static inline bool IsCrgPllRefClkSelect(CRG_PllRefClkSelect clkSelect) +{ + 3002cdc: 1101 addi sp,sp,-32 + 3002cde: ce22 sw s0,28(sp) + 3002ce0: 1000 addi s0,sp,32 + 3002ce2: fea42623 sw a0,-20(s0) + return ((clkSelect == CRG_PLL_REF_CLK_SELECT_HOSC) || + 3002ce6: fec42783 lw a5,-20(s0) + 3002cea: c791 beqz a5,3002cf6 + 3002cec: fec42703 lw a4,-20(s0) + 3002cf0: 4785 li a5,1 + 3002cf2: 00f71463 bne a4,a5,3002cfa + 3002cf6: 4785 li a5,1 + 3002cf8: a011 j 3002cfc + 3002cfa: 4781 li a5,0 + 3002cfc: 8b85 andi a5,a5,1 + 3002cfe: 9f81 uxtb a5 + (clkSelect == CRG_PLL_REF_CLK_SELECT_XTAL)); +} + 3002d00: 853e mv a0,a5 + 3002d02: 4472 lw s0,28(sp) + 3002d04: 6105 addi sp,sp,32 + 3002d06: 8082 ret + +03002d08 : + * @param preDiv pll prediv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPreDiv(CRG_PllPreDiv preDiv) +{ + 3002d08: 1101 addi sp,sp,-32 + 3002d0a: ce22 sw s0,28(sp) + 3002d0c: 1000 addi s0,sp,32 + 3002d0e: fea42623 sw a0,-20(s0) + return ((preDiv >= CRG_PLL_PREDIV_1) && + 3002d12: fec42783 lw a5,-20(s0) + 3002d16: 0087b793 sltiu a5,a5,8 + 3002d1a: 9f81 uxtb a5 + (preDiv <= CRG_PLL_PREDIV_8)); +} + 3002d1c: 853e mv a0,a5 + 3002d1e: 4472 lw s0,28(sp) + 3002d20: 6105 addi sp,sp,32 + 3002d22: 8082 ret + +03002d24 : + * @param postDiv pll_postdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv(CRG_PllPostDiv postDiv) +{ + 3002d24: 1101 addi sp,sp,-32 + 3002d26: ce22 sw s0,28(sp) + 3002d28: 1000 addi s0,sp,32 + 3002d2a: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV_1) && + 3002d2e: fec42783 lw a5,-20(s0) + 3002d32: 0087b793 sltiu a5,a5,8 + 3002d36: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV_8)); +} + 3002d38: 853e mv a0,a5 + 3002d3a: 4472 lw s0,28(sp) + 3002d3c: 6105 addi sp,sp,32 + 3002d3e: 8082 ret + +03002d40 : + * @param postDiv pll_postdiv2 value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv2(CRG_PllPostDiv2 postDiv) +{ + 3002d40: 1101 addi sp,sp,-32 + 3002d42: ce22 sw s0,28(sp) + 3002d44: 1000 addi s0,sp,32 + 3002d46: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV2_1) && + 3002d4a: fec42783 lw a5,-20(s0) + 3002d4e: 0087b793 sltiu a5,a5,8 + 3002d52: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV2_8_MAX)); +} + 3002d54: 853e mv a0,a5 + 3002d56: 4472 lw s0,28(sp) + 3002d58: 6105 addi sp,sp,32 + 3002d5a: 8082 ret + +03002d5c : + * @param fbDiv pll fbdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllFbDiv(unsigned int fbDiv) +{ + 3002d5c: 1101 addi sp,sp,-32 + 3002d5e: ce22 sw s0,28(sp) + 3002d60: 1000 addi s0,sp,32 + 3002d62: fea42623 sw a0,-20(s0) + return (fbDiv <= CRG_PLL_FBDIV_MAX); + 3002d66: fec42783 lw a5,-20(s0) + 3002d6a: 0807b793 sltiu a5,a5,128 + 3002d6e: 9f81 uxtb a5 +} + 3002d70: 853e mv a0,a5 + 3002d72: 4472 lw s0,28(sp) + 3002d74: 6105 addi sp,sp,32 + 3002d76: 8082 ret + +03002d78 : + * @param select core_cksel value + * @retval true + * @retval false + */ +static inline bool IsCrgCoreCkSel(CRG_CoreClkSelect select) +{ + 3002d78: 1101 addi sp,sp,-32 + 3002d7a: ce22 sw s0,28(sp) + 3002d7c: 1000 addi s0,sp,32 + 3002d7e: fea42623 sw a0,-20(s0) + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002d82: fec42783 lw a5,-20(s0) + 3002d86: cb99 beqz a5,3002d9c + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + 3002d88: fec42703 lw a4,-20(s0) + 3002d8c: 4785 li a5,1 + 3002d8e: 00f70763 beq a4,a5,3002d9c + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002d92: fec42703 lw a4,-20(s0) + 3002d96: 4789 li a5,2 + 3002d98: 00f71463 bne a4,a5,3002da0 + 3002d9c: 4785 li a5,1 + 3002d9e: a011 j 3002da2 + 3002da0: 4781 li a5,0 + 3002da2: 8b85 andi a5,a5,1 + 3002da4: 9f81 uxtb a5 + (select == CRG_CORE_CLK_SELECT_PLL)); +} + 3002da6: 853e mv a0,a5 + 3002da8: 4472 lw s0,28(sp) + 3002daa: 6105 addi sp,sp,32 + 3002dac: 8082 ret + +03002dae : + * @param select 1M clock selection + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkSel(CRG_1MClkSelect select) +{ + 3002dae: 1101 addi sp,sp,-32 + 3002db0: ce22 sw s0,28(sp) + 3002db2: 1000 addi s0,sp,32 + 3002db4: fea42623 sw a0,-20(s0) + return ((select == CRG_1M_CLK_SELECT_HOSC) || + 3002db8: fec42783 lw a5,-20(s0) + 3002dbc: c791 beqz a5,3002dc8 + 3002dbe: fec42703 lw a4,-20(s0) + 3002dc2: 4785 li a5,1 + 3002dc4: 00f71463 bne a4,a5,3002dcc + 3002dc8: 4785 li a5,1 + 3002dca: a011 j 3002dce + 3002dcc: 4781 li a5,0 + 3002dce: 8b85 andi a5,a5,1 + 3002dd0: 9f81 uxtb a5 + (select == CRG_1M_CLK_SELECT_TCXO)); +} + 3002dd2: 853e mv a0,a5 + 3002dd4: 4472 lw s0,28(sp) + 3002dd6: 6105 addi sp,sp,32 + 3002dd8: 8082 ret + +03002dda : + * @param div 1M clock ratio + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkDiv(unsigned int div) +{ + 3002dda: 1101 addi sp,sp,-32 + 3002ddc: ce22 sw s0,28(sp) + 3002dde: 1000 addi s0,sp,32 + 3002de0: fea42623 sw a0,-20(s0) + return (div <= CRG_1MHZ_CLK_MAX_DIV); + 3002de4: fec42783 lw a5,-20(s0) + 3002de8: 0407b793 sltiu a5,a5,64 + 3002dec: 9f81 uxtb a5 +} + 3002dee: 853e mv a0,a5 + 3002df0: 4472 lw s0,28(sp) + 3002df2: 6105 addi sp,sp,32 + 3002df4: 8082 ret + +03002df6 : + * @param preDiv PLL Previous Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPreDiv(unsigned int pllRefFreq, unsigned int preDiv) +{ + 3002df6: 7179 addi sp,sp,-48 + 3002df8: d622 sw s0,44(sp) + 3002dfa: 1800 addi s0,sp,48 + 3002dfc: fca42e23 sw a0,-36(s0) + 3002e00: fcb42c23 sw a1,-40(s0) + unsigned int freq = pllRefFreq; + 3002e04: fdc42783 lw a5,-36(s0) + 3002e08: fef42623 sw a5,-20(s0) + if (preDiv != 0) { + 3002e0c: fd842783 lw a5,-40(s0) + 3002e10: cb89 beqz a5,3002e22 + freq /= preDiv; + 3002e12: fec42703 lw a4,-20(s0) + 3002e16: fd842783 lw a5,-40(s0) + 3002e1a: 02f757b3 divu a5,a4,a5 + 3002e1e: fef42623 sw a5,-20(s0) + } + return (freq >= CRG_CLK_PFD_MIN_FREQ) && (freq <= CRG_CLK_PFD_MAX_FREQ); + 3002e22: fec42703 lw a4,-20(s0) + 3002e26: 003d17b7 lui a5,0x3d1 + 3002e2a: 8ff78793 addi a5,a5,-1793 # 3d08ff + 3002e2e: 00e7fc63 bgeu a5,a4,3002e46 + 3002e32: fec42703 lw a4,-20(s0) + 3002e36: 007277b7 lui a5,0x727 + 3002e3a: 0e078793 addi a5,a5,224 # 7270e0 + 3002e3e: 00e7e463 bltu a5,a4,3002e46 + 3002e42: 4785 li a5,1 + 3002e44: a011 j 3002e48 + 3002e46: 4781 li a5,0 + 3002e48: 8b85 andi a5,a5,1 + 3002e4a: 9f81 uxtb a5 +} + 3002e4c: 853e mv a0,a5 + 3002e4e: 5432 lw s0,44(sp) + 3002e50: 6145 addi sp,sp,48 + 3002e52: 8082 ret + +03002e54 : + * @param fdDiv PLL FD Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidFdDiv(unsigned int clkPfdFreq, unsigned int fdDiv) +{ + 3002e54: 7179 addi sp,sp,-48 + 3002e56: d622 sw s0,44(sp) + 3002e58: 1800 addi s0,sp,48 + 3002e5a: fca42e23 sw a0,-36(s0) + 3002e5e: fcb42c23 sw a1,-40(s0) + if (clkPfdFreq > 30000000U) { /* The maximum speed of the external clock source is 30000000U. */ + 3002e62: fdc42703 lw a4,-36(s0) + 3002e66: 01c9c7b7 lui a5,0x1c9c + 3002e6a: 38078793 addi a5,a5,896 # 1c9c380 + 3002e6e: 00e7f463 bgeu a5,a4,3002e76 + return false; + 3002e72: 4781 li a5,0 + 3002e74: a08d j 3002ed6 + } else if (fdDiv > CRG_PLL_FBDIV_MAX) { + 3002e76: fd842703 lw a4,-40(s0) + 3002e7a: 07f00793 li a5,127 + 3002e7e: 00e7f463 bgeu a5,a4,3002e86 + return false; + 3002e82: 4781 li a5,0 + 3002e84: a889 j 3002ed6 + } + + unsigned int freq = (fdDiv > 0x6) ? (clkPfdFreq * fdDiv) : (clkPfdFreq * 0x6); /* 0x0-0x6: divided by 0x6 */ + 3002e86: fd842703 lw a4,-40(s0) + 3002e8a: 4799 li a5,6 + 3002e8c: 00e7f963 bgeu a5,a4,3002e9e + 3002e90: fdc42703 lw a4,-36(s0) + 3002e94: fd842783 lw a5,-40(s0) + 3002e98: 02f707b3 mul a5,a4,a5 + 3002e9c: a031 j 3002ea8 + 3002e9e: fdc42703 lw a4,-36(s0) + 3002ea2: 4799 li a5,6 + 3002ea4: 02f707b3 mul a5,a4,a5 + 3002ea8: fef42623 sw a5,-20(s0) + return (freq >= CRG_CLK_VCO_MIN_FREQ) && (freq <= CRG_CLK_VCO_MAX_FREQ); + 3002eac: fec42703 lw a4,-20(s0) + 3002eb0: 05f5e7b7 lui a5,0x5f5e + 3002eb4: 0ff78793 addi a5,a5,255 # 5f5e0ff + 3002eb8: 00e7fc63 bgeu a5,a4,3002ed0 + 3002ebc: fec42703 lw a4,-20(s0) + 3002ec0: 11e1a7b7 lui a5,0x11e1a + 3002ec4: 30078793 addi a5,a5,768 # 11e1a300 + 3002ec8: 00e7e463 bltu a5,a4,3002ed0 + 3002ecc: 4785 li a5,1 + 3002ece: a011 j 3002ed2 + 3002ed0: 4781 li a5,0 + 3002ed2: 8b85 andi a5,a5,1 + 3002ed4: 9f81 uxtb a5 +} + 3002ed6: 853e mv a0,a5 + 3002ed8: 5432 lw s0,44(sp) + 3002eda: 6145 addi sp,sp,48 + 3002edc: 8082 ret + +03002ede : + * @param postDiv PLL Post Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv(unsigned int clkVcoFreq, unsigned int postDiv) +{ + 3002ede: 7179 addi sp,sp,-48 + 3002ee0: d622 sw s0,44(sp) + 3002ee2: 1800 addi s0,sp,48 + 3002ee4: fca42e23 sw a0,-36(s0) + 3002ee8: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002eec: fdc42783 lw a5,-36(s0) + 3002ef0: fef42623 sw a5,-20(s0) + if (postDiv != 0) { + 3002ef4: fd842783 lw a5,-40(s0) + 3002ef8: cb91 beqz a5,3002f0c + freq /= (postDiv + 1); + 3002efa: fd842783 lw a5,-40(s0) + 3002efe: 0785 addi a5,a5,1 + 3002f00: fec42703 lw a4,-20(s0) + 3002f04: 02f757b3 divu a5,a4,a5 + 3002f08: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_TARGET_MAX_FREQ); + 3002f0c: fec42703 lw a4,-20(s0) + 3002f10: 08f0d7b7 lui a5,0x8f0d + 3002f14: 18178793 addi a5,a5,385 # 8f0d181 + 3002f18: 00f737b3 sltu a5,a4,a5 + 3002f1c: 9f81 uxtb a5 +} + 3002f1e: 853e mv a0,a5 + 3002f20: 5432 lw s0,44(sp) + 3002f22: 6145 addi sp,sp,48 + 3002f24: 8082 ret + +03002f26 : + * @param postDiv2 PLL Post Divsion2 + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv2(unsigned int clkVcoFreq, unsigned int postDiv2) +{ + 3002f26: 7179 addi sp,sp,-48 + 3002f28: d622 sw s0,44(sp) + 3002f2a: 1800 addi s0,sp,48 + 3002f2c: fca42e23 sw a0,-36(s0) + 3002f30: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002f34: fdc42783 lw a5,-36(s0) + 3002f38: fef42623 sw a5,-20(s0) + if (postDiv2 != 0) { + 3002f3c: fd842783 lw a5,-40(s0) + 3002f40: cb91 beqz a5,3002f54 + freq /= (postDiv2 + 1); + 3002f42: fd842783 lw a5,-40(s0) + 3002f46: 0785 addi a5,a5,1 + 3002f48: fec42703 lw a4,-20(s0) + 3002f4c: 02f757b3 divu a5,a4,a5 + 3002f50: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_PST2_MAX_FREQ); + 3002f54: fec42703 lw a4,-20(s0) + 3002f58: 05f5e7b7 lui a5,0x5f5e + 3002f5c: 10178793 addi a5,a5,257 # 5f5e101 + 3002f60: 00f737b3 sltu a5,a4,a5 + 3002f64: 9f81 uxtb a5 +} + 3002f66: 853e mv a0,a5 + 3002f68: 5432 lw s0,44(sp) + 3002f6a: 6145 addi sp,sp,48 + 3002f6c: 8082 ret + +03002f6e : + * @param adcClkSelect the value of adc clock select + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkModeSelect(CRG_AdcClkSelect adcClkSelect) +{ + 3002f6e: 1101 addi sp,sp,-32 + 3002f70: ce22 sw s0,28(sp) + 3002f72: 1000 addi s0,sp,32 + 3002f74: fea42623 sw a0,-20(s0) + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002f78: fec42783 lw a5,-20(s0) + 3002f7c: c385 beqz a5,3002f9c + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + 3002f7e: fec42703 lw a4,-20(s0) + 3002f82: 4785 li a5,1 + 3002f84: 00f70c63 beq a4,a5,3002f9c + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + 3002f88: fec42703 lw a4,-20(s0) + 3002f8c: 4789 li a5,2 + 3002f8e: 00f70763 beq a4,a5,3002f9c + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002f92: fec42703 lw a4,-20(s0) + 3002f96: 478d li a5,3 + 3002f98: 00f71463 bne a4,a5,3002fa0 + 3002f9c: 4785 li a5,1 + 3002f9e: a011 j 3002fa2 + 3002fa0: 4781 li a5,0 + 3002fa2: 8b85 andi a5,a5,1 + 3002fa4: 9f81 uxtb a5 + adcClkSelect == CRG_ADC_CLK_SYN_CORE); +} + 3002fa6: 853e mv a0,a5 + 3002fa8: 4472 lw s0,28(sp) + 3002faa: 6105 addi sp,sp,32 + 3002fac: 8082 ret + +03002fae : + * @param div the value of adc clock div + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkDiv(CRG_AdcDiv div) +{ + 3002fae: 1101 addi sp,sp,-32 + 3002fb0: ce22 sw s0,28(sp) + 3002fb2: 1000 addi s0,sp,32 + 3002fb4: fea42623 sw a0,-20(s0) + return (div == CRG_ADC_DIV_1 || \ + div == CRG_ADC_DIV_2 || \ + div == CRG_ADC_DIV_3 || \ + 3002fb8: fec42783 lw a5,-20(s0) + 3002fbc: c385 beqz a5,3002fdc + return (div == CRG_ADC_DIV_1 || \ + 3002fbe: fec42703 lw a4,-20(s0) + 3002fc2: 4785 li a5,1 + 3002fc4: 00f70c63 beq a4,a5,3002fdc + div == CRG_ADC_DIV_2 || \ + 3002fc8: fec42703 lw a4,-20(s0) + 3002fcc: 4789 li a5,2 + 3002fce: 00f70763 beq a4,a5,3002fdc + div == CRG_ADC_DIV_3 || \ + 3002fd2: fec42703 lw a4,-20(s0) + 3002fd6: 478d li a5,3 + 3002fd8: 00f71463 bne a4,a5,3002fe0 + 3002fdc: 4785 li a5,1 + 3002fde: a011 j 3002fe2 + 3002fe0: 4781 li a5,0 + 3002fe2: 8b85 andi a5,a5,1 + 3002fe4: 9f81 uxtb a5 + div == CRG_ADC_DIV_4); +} + 3002fe6: 853e mv a0,a5 + 3002fe8: 4472 lw s0,28(sp) + 3002fea: 6105 addi sp,sp,32 + 3002fec: 8082 ret + +03002fee : + * @param clk Clock register base address + * @param select Core clock selection + * @retval None + */ +static inline void DCL_CRG_SetCoreClkSel(CRG_RegStruct *clk, CRG_CoreClkSelect select) +{ + 3002fee: 1101 addi sp,sp,-32 + 3002ff0: ce06 sw ra,28(sp) + 3002ff2: cc22 sw s0,24(sp) + 3002ff4: 1000 addi s0,sp,32 + 3002ff6: fea42623 sw a0,-20(s0) + 3002ffa: feb42423 sw a1,-24(s0) + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + 3002ffe: fec42703 lw a4,-20(s0) + 3003002: 100007b7 lui a5,0x10000 + 3003006: 00f70a63 beq a4,a5,300301a + 300300a: 64b00593 li a1,1611 + 300300e: 030077b7 lui a5,0x3007 + 3003012: 88878513 addi a0,a5,-1912 # 3006888 + 3003016: 20a1 jal ra,300305e + 3003018: a001 j 3003018 + CRG_PARAM_CHECK_NO_RET(IsCrgCoreCkSel(select)); + 300301a: fe842503 lw a0,-24(s0) + 300301e: 3ba9 jal ra,3002d78 + 3003020: 87aa mv a5,a0 + 3003022: 0017c793 xori a5,a5,1 + 3003026: 9f81 uxtb a5 + 3003028: cb89 beqz a5,300303a + 300302a: 64c00593 li a1,1612 + 300302e: 030077b7 lui a5,0x3007 + 3003032: 88878513 addi a0,a5,-1912 # 3006888 + 3003036: 2025 jal ra,300305e + 3003038: a839 j 3003056 + clk->PERI_CRG64.BIT.clk_pst1_sw_sel = select; + 300303a: fe842783 lw a5,-24(s0) + 300303e: 8b8d andi a5,a5,3 + 3003040: 0ff7f693 andi a3,a5,255 + 3003044: fec42703 lw a4,-20(s0) + 3003048: 10072783 lw a5,256(a4) # ea510100 + 300304c: 8a8d andi a3,a3,3 + 300304e: 9bf1 andi a5,a5,-4 + 3003050: 8fd5 or a5,a5,a3 + 3003052: 10f72023 sw a5,256(a4) +} + 3003056: 40f2 lw ra,28(sp) + 3003058: 4462 lw s0,24(sp) + 300305a: 6105 addi sp,sp,32 + 300305c: 8082 ret + +0300305e : + 300305e: 988ff06f j 30021e6 + +03003062 : + * @param handle CRG Handle + * @retval BASE_STATUS_ERROR Parameter Check fail + * @retval BASE_STATUS_OK Success + */ +BASE_StatusType HAL_CRG_Init(const CRG_Handle *handle) +{ + 3003062: 7179 addi sp,sp,-48 + 3003064: d606 sw ra,44(sp) + 3003066: d422 sw s0,40(sp) + 3003068: 1800 addi s0,sp,48 + 300306a: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != NULL); + 300306e: fdc42783 lw a5,-36(s0) + 3003072: eb89 bnez a5,3003084 + 3003074: 07100593 li a1,113 + 3003078: 030077b7 lui a5,0x3007 + 300307c: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003080: 3ff9 jal ra,300305e + 3003082: a001 j 3003082 + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3003084: fdc42783 lw a5,-36(s0) + 3003088: 4398 lw a4,0(a5) + 300308a: 100007b7 lui a5,0x10000 + 300308e: 00f70a63 beq a4,a5,30030a2 + 3003092: 07200593 li a1,114 + 3003096: 030077b7 lui a5,0x3007 + 300309a: 8a478513 addi a0,a5,-1884 # 30068a4 + 300309e: 37c1 jal ra,300305e + 30030a0: a001 j 30030a0 + /* Check the validity of PLL-related parameters. */ + CRG_PARAM_CHECK_WITH_RET(IsCrgPllRefClkSelect(handle->pllRefClkSelect), BASE_STATUS_ERROR); + 30030a2: fdc42783 lw a5,-36(s0) + 30030a6: 43dc lw a5,4(a5) + 30030a8: 853e mv a0,a5 + 30030aa: 390d jal ra,3002cdc + 30030ac: 87aa mv a5,a0 + 30030ae: 0017c793 xori a5,a5,1 + 30030b2: 9f81 uxtb a5 + 30030b4: cb91 beqz a5,30030c8 + 30030b6: 07400593 li a1,116 + 30030ba: 030077b7 lui a5,0x3007 + 30030be: 8a478513 addi a0,a5,-1884 # 30068a4 + 30030c2: 3f71 jal ra,300305e + 30030c4: 4785 li a5,1 + 30030c6: aca9 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPreDiv(handle->pllPreDiv), BASE_STATUS_ERROR); + 30030c8: fdc42783 lw a5,-36(s0) + 30030cc: 479c lw a5,8(a5) + 30030ce: 853e mv a0,a5 + 30030d0: 3925 jal ra,3002d08 + 30030d2: 87aa mv a5,a0 + 30030d4: 0017c793 xori a5,a5,1 + 30030d8: 9f81 uxtb a5 + 30030da: cb91 beqz a5,30030ee + 30030dc: 07500593 li a1,117 + 30030e0: 030077b7 lui a5,0x3007 + 30030e4: 8a478513 addi a0,a5,-1884 # 30068a4 + 30030e8: 3f9d jal ra,300305e + 30030ea: 4785 li a5,1 + 30030ec: ac15 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllFbDiv(handle->pllFbDiv), BASE_STATUS_ERROR); + 30030ee: fdc42783 lw a5,-36(s0) + 30030f2: 47dc lw a5,12(a5) + 30030f4: 853e mv a0,a5 + 30030f6: 319d jal ra,3002d5c + 30030f8: 87aa mv a5,a0 + 30030fa: 0017c793 xori a5,a5,1 + 30030fe: 9f81 uxtb a5 + 3003100: cb91 beqz a5,3003114 + 3003102: 07600593 li a1,118 + 3003106: 030077b7 lui a5,0x3007 + 300310a: 8a478513 addi a0,a5,-1884 # 30068a4 + 300310e: 3f81 jal ra,300305e + 3003110: 4785 li a5,1 + 3003112: a439 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv(handle->pllPostDiv), BASE_STATUS_ERROR); + 3003114: fdc42783 lw a5,-36(s0) + 3003118: 4b9c lw a5,16(a5) + 300311a: 853e mv a0,a5 + 300311c: 3121 jal ra,3002d24 + 300311e: 87aa mv a5,a0 + 3003120: 0017c793 xori a5,a5,1 + 3003124: 9f81 uxtb a5 + 3003126: cb91 beqz a5,300313a + 3003128: 07700593 li a1,119 + 300312c: 030077b7 lui a5,0x3007 + 3003130: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003134: 372d jal ra,300305e + 3003136: 4785 li a5,1 + 3003138: a2e5 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv2(handle->handleEx.pllPostDiv2), BASE_STATUS_ERROR); + 300313a: fdc42783 lw a5,-36(s0) + 300313e: 4fdc lw a5,28(a5) + 3003140: 853e mv a0,a5 + 3003142: 3efd jal ra,3002d40 + 3003144: 87aa mv a5,a0 + 3003146: 0017c793 xori a5,a5,1 + 300314a: 9f81 uxtb a5 + 300314c: cb91 beqz a5,3003160 + 300314e: 07800593 li a1,120 + 3003152: 030077b7 lui a5,0x3007 + 3003156: 8a478513 addi a0,a5,-1884 # 30068a4 + 300315a: 3711 jal ra,300305e + 300315c: 4785 li a5,1 + 300315e: a2c9 j 3003320 + /* Check the Clock Source and Frequency Divider of the 1 MHz Clock. */ + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkSel(handle->handleEx.clk1MSelect), BASE_STATUS_ERROR); + 3003160: fdc42783 lw a5,-36(s0) + 3003164: 539c lw a5,32(a5) + 3003166: 853e mv a0,a5 + 3003168: 3199 jal ra,3002dae + 300316a: 87aa mv a5,a0 + 300316c: 0017c793 xori a5,a5,1 + 3003170: 9f81 uxtb a5 + 3003172: cb91 beqz a5,3003186 + 3003174: 07a00593 li a1,122 + 3003178: 030077b7 lui a5,0x3007 + 300317c: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003180: 3df9 jal ra,300305e + 3003182: 4785 li a5,1 + 3003184: aa71 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkDiv(handle->handleEx.clk1MDiv), BASE_STATUS_ERROR); + 3003186: fdc42783 lw a5,-36(s0) + 300318a: 53dc lw a5,36(a5) + 300318c: 853e mv a0,a5 + 300318e: 31b1 jal ra,3002dda + 3003190: 87aa mv a5,a0 + 3003192: 0017c793 xori a5,a5,1 + 3003196: 9f81 uxtb a5 + 3003198: cb91 beqz a5,30031ac + 300319a: 07b00593 li a1,123 + 300319e: 030077b7 lui a5,0x3007 + 30031a2: 8a478513 addi a0,a5,-1884 # 30068a4 + 30031a6: 3d65 jal ra,300305e + 30031a8: 4785 li a5,1 + 30031aa: aa9d j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 30031ac: fdc42783 lw a5,-36(s0) + 30031b0: 4f9c lw a5,24(a5) + 30031b2: 853e mv a0,a5 + 30031b4: 36d1 jal ra,3002d78 + 30031b6: 87aa mv a5,a0 + 30031b8: 0017c793 xori a5,a5,1 + 30031bc: 9f81 uxtb a5 + 30031be: cb91 beqz a5,30031d2 + 30031c0: 07c00593 li a1,124 + 30031c4: 030077b7 lui a5,0x3007 + 30031c8: 8a478513 addi a0,a5,-1884 # 30068a4 + 30031cc: 3d49 jal ra,300305e + 30031ce: 4785 li a5,1 + 30031d0: aa81 j 3003320 + + *(unsigned int *)CRG_HOSC_CTRL2_ADDR = 0x306E; /* Optimized HOSC temperature drift performance parameter. */ + 30031d2: 100017b7 lui a5,0x10001 + 30031d6: f0478793 addi a5,a5,-252 # 10000f04 + 30031da: 670d lui a4,0x3 + 30031dc: 06e70713 addi a4,a4,110 # 306e + 30031e0: c398 sw a4,0(a5) + + CRG_RegStruct *reg = handle->baseAddress; + 30031e2: fdc42783 lw a5,-36(s0) + 30031e6: 439c lw a5,0(a5) + 30031e8: fef42623 sw a5,-20(s0) + g_crgBaseAddr = (void *)reg; + 30031ec: 040007b7 lui a5,0x4000 + 30031f0: fec42703 lw a4,-20(s0) + 30031f4: 48e7aa23 sw a4,1172(a5) # 4000494 + /* Check the validity of the PLL parameter configuration. */ + if (CRG_IsValidPllConfig(handle) != BASE_STATUS_OK) { + 30031f8: fdc42503 lw a0,-36(s0) + 30031fc: 7a4000ef jal ra,30039a0 + 3003200: 87aa mv a5,a0 + 3003202: c399 beqz a5,3003208 + return BASE_STATUS_ERROR; + 3003204: 4785 li a5,1 + 3003206: aa29 j 3003320 + } + /* Disable the write protection function of the CRG register. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3003208: 3449 jal ra,3002c8a + + reg->PERI_CRG0.BIT.pll_ref_cksel = handle->pllRefClkSelect; + 300320a: fdc42783 lw a5,-36(s0) + 300320e: 43dc lw a5,4(a5) + 3003210: 8b85 andi a5,a5,1 + 3003212: 0ff7f693 andi a3,a5,255 + 3003216: fec42703 lw a4,-20(s0) + 300321a: 431c lw a5,0(a4) + 300321c: 8a85 andi a3,a3,1 + 300321e: 9bf9 andi a5,a5,-2 + 3003220: 8fd5 or a5,a5,a3 + 3003222: c31c sw a5,0(a4) + reg->PERI_CRG1.BIT.pll_prediv = handle->pllPreDiv; + 3003224: fdc42783 lw a5,-36(s0) + 3003228: 479c lw a5,8(a5) + 300322a: 8bbd andi a5,a5,15 + 300322c: 0ff7f693 andi a3,a5,255 + 3003230: fec42703 lw a4,-20(s0) + 3003234: 435c lw a5,4(a4) + 3003236: 8abd andi a3,a3,15 + 3003238: 9bc1 andi a5,a5,-16 + 300323a: 8fd5 or a5,a5,a3 + 300323c: c35c sw a5,4(a4) + reg->PERI_CRG2.BIT.pll_fbdiv = handle->pllFbDiv; + 300323e: fdc42783 lw a5,-36(s0) + 3003242: 47dc lw a5,12(a5) + 3003244: 0ff7f693 andi a3,a5,255 + 3003248: fec42703 lw a4,-20(s0) + 300324c: 471c lw a5,8(a4) + 300324e: 0ff6f693 andi a3,a3,255 + 3003252: f007f793 andi a5,a5,-256 + 3003256: 8fd5 or a5,a5,a3 + 3003258: c71c sw a5,8(a4) + reg->PERI_CRG3.BIT.pll_postdiv1 = handle->pllPostDiv; + 300325a: fdc42783 lw a5,-36(s0) + 300325e: 4b9c lw a5,16(a5) + 3003260: 8bbd andi a5,a5,15 + 3003262: 0ff7f693 andi a3,a5,255 + 3003266: fec42703 lw a4,-20(s0) + 300326a: 475c lw a5,12(a4) + 300326c: 8abd andi a3,a3,15 + 300326e: 9bc1 andi a5,a5,-16 + 3003270: 8fd5 or a5,a5,a3 + 3003272: c75c sw a5,12(a4) + reg->PERI_CRG3.BIT.pll_postdiv2 = handle->handleEx.pllPostDiv2; + 3003274: fdc42783 lw a5,-36(s0) + 3003278: 4fdc lw a5,28(a5) + 300327a: 8bbd andi a5,a5,15 + 300327c: 0ff7f693 andi a3,a5,255 + 3003280: fec42703 lw a4,-20(s0) + 3003284: 475c lw a5,12(a4) + 3003286: 8abd andi a3,a3,15 + 3003288: 0692 slli a3,a3,0x4 + 300328a: f0f7f793 andi a5,a5,-241 + 300328e: 8fd5 or a5,a5,a3 + 3003290: c75c sw a5,12(a4) + reg->PERI_CRG4.BIT.pll_pd = BASE_CFG_UNSET; + 3003292: fec42703 lw a4,-20(s0) + 3003296: 4b1c lw a5,16(a4) + 3003298: 9bf9 andi a5,a5,-2 + 300329a: cb1c sw a5,16(a4) + + while (reg->PERI_CRG7.BIT.pll_lock != BASE_CFG_SET) { + 300329c: 0001 nop + 300329e: fec42783 lw a5,-20(s0) + 30032a2: 4fdc lw a5,28(a5) + 30032a4: 8b85 andi a5,a5,1 + 30032a6: 0ff7f713 andi a4,a5,255 + 30032aa: 4785 li a5,1 + 30032ac: fef719e3 bne a4,a5,300329e + ; /* Wait for PLL to lock */ + } + + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 30032b0: 3409 jal ra,3002cb2 + /* Check the 1MHz clock parameter configuration. */ + if (CRG_IsValid1MHzConfig(handle) != BASE_STATUS_OK) { + 30032b2: fdc42503 lw a0,-36(s0) + 30032b6: 7ac000ef jal ra,3003a62 + 30032ba: 87aa mv a5,a0 + 30032bc: c399 beqz a5,30032c2 + return BASE_STATUS_ERROR; + 30032be: 4785 li a5,1 + 30032c0: a085 j 3003320 + } + while (reg->HOSC_LOCK.BIT.hosc_lock != BASE_CFG_SET) { + 30032c2: 0001 nop + 30032c4: fec42703 lw a4,-20(s0) + 30032c8: 6785 lui a5,0x1 + 30032ca: 97ba add a5,a5,a4 + 30032cc: f107a783 lw a5,-240(a5) # f10 + 30032d0: 8b85 andi a5,a5,1 + 30032d2: 0ff7f713 andi a4,a5,255 + 30032d6: 4785 li a5,1 + 30032d8: fef716e3 bne a4,a5,30032c4 + ; /* Wait for HOSC to lock */ + } + /* Set the Clock Source and Frequency Divider of the 1 MHz Clock. */ + reg->PERI_CRG67.BIT.clk_1m_div = handle->handleEx.clk1MDiv; + 30032dc: fdc42783 lw a5,-36(s0) + 30032e0: 53dc lw a5,36(a5) + 30032e2: 03f7f793 andi a5,a5,63 + 30032e6: 0ff7f693 andi a3,a5,255 + 30032ea: fec42703 lw a4,-20(s0) + 30032ee: 10c72783 lw a5,268(a4) + 30032f2: 03f6f693 andi a3,a3,63 + 30032f6: fc07f793 andi a5,a5,-64 + 30032fa: 8fd5 or a5,a5,a3 + 30032fc: 10f72623 sw a5,268(a4) + reg->PERI_CRG66.BIT.clk_1m_ini_cksel = handle->handleEx.clk1MSelect; + 3003300: fdc42783 lw a5,-36(s0) + 3003304: 539c lw a5,32(a5) + 3003306: 8b85 andi a5,a5,1 + 3003308: 0ff7f693 andi a3,a5,255 + 300330c: fec42703 lw a4,-20(s0) + 3003310: 10872783 lw a5,264(a4) + 3003314: 8a85 andi a3,a3,1 + 3003316: 9bf9 andi a5,a5,-2 + 3003318: 8fd5 or a5,a5,a3 + 300331a: 10f72423 sw a5,264(a4) + return BASE_STATUS_OK; + 300331e: 4781 li a5,0 +} + 3003320: 853e mv a0,a5 + 3003322: 50b2 lw ra,44(sp) + 3003324: 5422 lw s0,40(sp) + 3003326: 6145 addi sp,sp,48 + 3003328: 8082 ret + +0300332a : + * @param handle CRG Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Paramter check fail + */ +BASE_StatusType HAL_CRG_SetCoreClockSelect(CRG_Handle *handle) +{ + 300332a: 7179 addi sp,sp,-48 + 300332c: d606 sw ra,44(sp) + 300332e: d422 sw s0,40(sp) + 3003330: 1800 addi s0,sp,48 + 3003332: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != 0); + 3003336: fdc42783 lw a5,-36(s0) + 300333a: eb89 bnez a5,300334c + 300333c: 10a00593 li a1,266 + 3003340: 030077b7 lui a5,0x3007 + 3003344: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003348: 3b19 jal ra,300305e + 300334a: a001 j 300334a + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 300334c: fdc42783 lw a5,-36(s0) + 3003350: 4398 lw a4,0(a5) + 3003352: 100007b7 lui a5,0x10000 + 3003356: 00f70a63 beq a4,a5,300336a + 300335a: 10b00593 li a1,267 + 300335e: 030077b7 lui a5,0x3007 + 3003362: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003366: 39e5 jal ra,300305e + 3003368: a001 j 3003368 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 300336a: fdc42783 lw a5,-36(s0) + 300336e: 4f9c lw a5,24(a5) + 3003370: 853e mv a0,a5 + 3003372: 3419 jal ra,3002d78 + 3003374: 87aa mv a5,a0 + 3003376: 0017c793 xori a5,a5,1 + 300337a: 9f81 uxtb a5 + 300337c: cb91 beqz a5,3003390 + 300337e: 10c00593 li a1,268 + 3003382: 030077b7 lui a5,0x3007 + 3003386: 8a478513 addi a0,a5,-1884 # 30068a4 + 300338a: 39d1 jal ra,300305e + 300338c: 4785 li a5,1 + 300338e: a005 j 30033ae + + CRG_RegStruct *reg = handle->baseAddress; + 3003390: fdc42783 lw a5,-36(s0) + 3003394: 439c lw a5,0(a5) + 3003396: fef42623 sw a5,-20(s0) + /* The write protection of the CRG register needs to be disabled. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 300339a: 38c5 jal ra,3002c8a + DCL_CRG_SetCoreClkSel(reg, handle->coreClkSelect); + 300339c: fdc42783 lw a5,-36(s0) + 30033a0: 4f9c lw a5,24(a5) + 30033a2: 85be mv a1,a5 + 30033a4: fec42503 lw a0,-20(s0) + 30033a8: 3199 jal ra,3002fee + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 30033aa: 3221 jal ra,3002cb2 + + return BASE_STATUS_OK; + 30033ac: 4781 li a5,0 +} + 30033ae: 853e mv a0,a5 + 30033b0: 50b2 lw ra,44(sp) + 30033b2: 5422 lw s0,40(sp) + 30033b4: 6145 addi sp,sp,48 + 30033b6: 8082 ret + +030033b8 : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +static inline unsigned int CRG_GetVcoFreq(void) +{ + 30033b8: 1101 addi sp,sp,-32 + 30033ba: ce06 sw ra,28(sp) + 30033bc: cc22 sw s0,24(sp) + 30033be: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int regFbdiv; + CRG_RegStruct *crg = g_crgBaseAddr; + 30033c0: 040007b7 lui a5,0x4000 + 30033c4: 4947a783 lw a5,1172(a5) # 4000494 + 30033c8: fef42623 sw a5,-20(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 30033cc: fec42703 lw a4,-20(s0) + 30033d0: 100007b7 lui a5,0x10000 + 30033d4: 00f70a63 beq a4,a5,30033e8 + 30033d8: 12200593 li a1,290 + 30033dc: 030077b7 lui a5,0x3007 + 30033e0: 8a478513 addi a0,a5,-1884 # 30068a4 + 30033e4: 39ad jal ra,300305e + 30033e6: a001 j 30033e6 + CRG_ASSERT_PARAM((XTRAIL_FREQ <= 30000000U)); /* The maximum of the external clock source is 30000000U. */ + + freq = CRG_GetPllRefIni(crg->PERI_CRG0.BIT.pll_ref_cksel); + 30033e8: fec42783 lw a5,-20(s0) + 30033ec: 439c lw a5,0(a5) + 30033ee: 8b85 andi a5,a5,1 + 30033f0: 9f81 uxtb a5 + 30033f2: 853e mv a0,a5 + 30033f4: 25c1 jal ra,3003ab4 + 30033f6: fea42423 sw a0,-24(s0) + freq /= CRG_GetPreDivValue(crg->PERI_CRG1.BIT.pll_prediv); + 30033fa: fec42783 lw a5,-20(s0) + 30033fe: 43dc lw a5,4(a5) + 3003400: 8bbd andi a5,a5,15 + 3003402: 9f81 uxtb a5 + 3003404: 853e mv a0,a5 + 3003406: 2de1 jal ra,3003ade + 3003408: 872a mv a4,a0 + 300340a: fe842783 lw a5,-24(s0) + 300340e: 02e7d7b3 divu a5,a5,a4 + 3003412: fef42423 sw a5,-24(s0) + regFbdiv = CRG_GetPllFbDivValue(crg->PERI_CRG2.BIT.pll_fbdiv); /* Get the value of the fbdiv register. */ + 3003416: fec42783 lw a5,-20(s0) + 300341a: 479c lw a5,8(a5) + 300341c: 9f81 uxtb a5 + 300341e: 853e mv a0,a5 + 3003420: 25f5 jal ra,3003b0c + 3003422: fea42223 sw a0,-28(s0) + freq *= (regFbdiv >= 0x06) ? regFbdiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 3003426: fe442783 lw a5,-28(s0) + 300342a: 4719 li a4,6 + 300342c: 00e7f363 bgeu a5,a4,3003432 + 3003430: 4799 li a5,6 + 3003432: fe842703 lw a4,-24(s0) + 3003436: 02f707b3 mul a5,a4,a5 + 300343a: fef42423 sw a5,-24(s0) + return freq; + 300343e: fe842783 lw a5,-24(s0) +} + 3003442: 853e mv a0,a5 + 3003444: 40f2 lw ra,28(sp) + 3003446: 4462 lw s0,24(sp) + 3003448: 6105 addi sp,sp,32 + 300344a: 8082 ret + +0300344c : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +unsigned int HAL_CRG_GetPllFreq(void) +{ + 300344c: 1101 addi sp,sp,-32 + 300344e: ce06 sw ra,28(sp) + 3003450: cc22 sw s0,24(sp) + 3003452: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int pllPostDivValue; + CRG_RegStruct *crg = g_crgBaseAddr; + 3003454: 040007b7 lui a5,0x4000 + 3003458: 4947a783 lw a5,1172(a5) # 4000494 + 300345c: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003460: fe842703 lw a4,-24(s0) + 3003464: 100007b7 lui a5,0x10000 + 3003468: 00f70a63 beq a4,a5,300347c + 300346c: 13700593 li a1,311 + 3003470: 030077b7 lui a5,0x3007 + 3003474: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003478: 36dd jal ra,300305e + 300347a: a001 j 300347a + freq = CRG_GetVcoFreq(); + 300347c: 3f35 jal ra,30033b8 + 300347e: fea42623 sw a0,-20(s0) + pllPostDivValue = CRG_GetPllPostDivValue((CRG_PllPostDiv)crg->PERI_CRG3.BIT.pll_postdiv1); + 3003482: fe842783 lw a5,-24(s0) + 3003486: 47dc lw a5,12(a5) + 3003488: 8bbd andi a5,a5,15 + 300348a: 9f81 uxtb a5 + 300348c: 853e mv a0,a5 + 300348e: 25c1 jal ra,3003b4e + 3003490: fea42223 sw a0,-28(s0) + /* Calculate the PLL output clock frequency based on the VCO clock frequency and post-division coefficient. */ + if (pllPostDivValue != 0) { + 3003494: fe442783 lw a5,-28(s0) + 3003498: cb89 beqz a5,30034aa + freq /= pllPostDivValue; + 300349a: fec42703 lw a4,-20(s0) + 300349e: fe442783 lw a5,-28(s0) + 30034a2: 02f757b3 divu a5,a4,a5 + 30034a6: fef42623 sw a5,-20(s0) + } + return freq; + 30034aa: fec42783 lw a5,-20(s0) +} + 30034ae: 853e mv a0,a5 + 30034b0: 40f2 lw ra,28(sp) + 30034b2: 4462 lw s0,24(sp) + 30034b4: 6105 addi sp,sp,32 + 30034b6: 8082 ret + +030034b8 : + * @brief Get Core Clock Frequence + * @param None + * @retval unsigned int Core clock frequency + */ +unsigned int HAL_CRG_GetCoreClkFreq(void) +{ + 30034b8: 1101 addi sp,sp,-32 + 30034ba: ce06 sw ra,28(sp) + 30034bc: cc22 sw s0,24(sp) + 30034be: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int coreClkSelect; + CRG_RegStruct *crg = g_crgBaseAddr; + 30034c0: 040007b7 lui a5,0x4000 + 30034c4: 4947a783 lw a5,1172(a5) # 4000494 + 30034c8: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 30034cc: fe842703 lw a4,-24(s0) + 30034d0: 100007b7 lui a5,0x10000 + 30034d4: 00f70a63 beq a4,a5,30034e8 + 30034d8: 14c00593 li a1,332 + 30034dc: 030077b7 lui a5,0x3007 + 30034e0: 8a478513 addi a0,a5,-1884 # 30068a4 + 30034e4: 3ead jal ra,300305e + 30034e6: a001 j 30034e6 + coreClkSelect = crg->PERI_CRG64.BIT.clk_pst1_sw_sel; + 30034e8: fe842783 lw a5,-24(s0) + 30034ec: 1007a783 lw a5,256(a5) + 30034f0: 8b8d andi a5,a5,3 + 30034f2: 9f81 uxtb a5 + 30034f4: fef42223 sw a5,-28(s0) + switch (coreClkSelect) { + 30034f8: fe442783 lw a5,-28(s0) + 30034fc: 4705 li a4,1 + 30034fe: 02e78063 beq a5,a4,300351e + 3003502: 4705 li a4,1 + 3003504: 00e7e663 bltu a5,a4,3003510 + 3003508: 4709 li a4,2 + 300350a: 02e78163 beq a5,a4,300352c + 300350e: a01d j 3003534 + case CRG_CORE_CLK_SELECT_HOSC: /* The clock source is an internal high-speed clock. */ + freq = HOSC_FREQ; + 3003510: 017d87b7 lui a5,0x17d8 + 3003514: 84078793 addi a5,a5,-1984 # 17d7840 + 3003518: fef42623 sw a5,-20(s0) + break; + 300351c: a015 j 3003540 + + case CRG_CORE_CLK_SELECT_TCXO: /* The clock source is the external crystal oscillator clock. */ + freq = XTRAIL_FREQ; + 300351e: 01c9c7b7 lui a5,0x1c9c + 3003522: 38078793 addi a5,a5,896 # 1c9c380 + 3003526: fef42623 sw a5,-20(s0) + break; + 300352a: a819 j 3003540 + + case CRG_CORE_CLK_SELECT_PLL: /* The clock source is the PLL. */ + freq = HAL_CRG_GetPllFreq(); + 300352c: 3705 jal ra,300344c + 300352e: fea42623 sw a0,-20(s0) + break; + 3003532: a039 j 3003540 + + default: + freq = LOSC_FREQ; + 3003534: 67a1 lui a5,0x8 + 3003536: d0078793 addi a5,a5,-768 # 7d00 + 300353a: fef42623 sw a5,-20(s0) + break; + 300353e: 0001 nop + } + return freq; + 3003540: fec42783 lw a5,-20(s0) +} + 3003544: 853e mv a0,a5 + 3003546: 40f2 lw ra,28(sp) + 3003548: 4462 lw s0,24(sp) + 300354a: 6105 addi sp,sp,32 + 300354c: 8082 ret + +0300354e : + * @brief Get Clock Frequence + * @param handle CRG Handle + * @retval Frequece of IP + */ +unsigned int HAL_CRG_GetIpFreq(const void *baseAddress) +{ + 300354e: 7179 addi sp,sp,-48 + 3003550: d606 sw ra,44(sp) + 3003552: d422 sw s0,40(sp) + 3003554: 1800 addi s0,sp,48 + 3003556: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 300355a: fdc42783 lw a5,-36(s0) + 300355e: eb89 bnez a5,3003570 + 3003560: 16900593 li a1,361 + 3003564: 030077b7 lui a5,0x3007 + 3003568: 8a478513 addi a0,a5,-1884 # 30068a4 + 300356c: 3ccd jal ra,300305e + 300356e: a001 j 300356e + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003570: 040007b7 lui a5,0x4000 + 3003574: 4947a703 lw a4,1172(a5) # 4000494 + 3003578: 100007b7 lui a5,0x10000 + 300357c: 00f70a63 beq a4,a5,3003590 + 3003580: 16a00593 li a1,362 + 3003584: 030077b7 lui a5,0x3007 + 3003588: 8a478513 addi a0,a5,-1884 # 30068a4 + 300358c: 3cc9 jal ra,300305e + 300358e: a001 j 300358e +#ifdef FPGA + /* Use this function to obtain the clock frequency during the FPGA phase. */ + return CHIP_GetIpFreqHz(baseAddress); +#else + unsigned int hclk = HAL_CRG_GetCoreClkFreq(); + 3003590: 3725 jal ra,30034b8 + 3003592: fea42423 sw a0,-24(s0) + unsigned int freq = LOSC_FREQ; + 3003596: 67a1 lui a5,0x8 + 3003598: d0078793 addi a5,a5,-768 # 7d00 + 300359c: fef42623 sw a5,-20(s0) + unsigned int coreClkFreq; + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 30035a0: fdc42503 lw a0,-36(s0) + 30035a4: 2cc9 jal ra,3003876 + 30035a6: fea42223 sw a0,-28(s0) + if (p == NULL) { + 30035aa: fe442783 lw a5,-28(s0) + 30035ae: e781 bnez a5,30035b6 + return freq; + 30035b0: fec42783 lw a5,-20(s0) + 30035b4: a895 j 3003628 + } + switch (p->type) { + 30035b6: fe442783 lw a5,-28(s0) + 30035ba: 43dc lw a5,4(a5) + 30035bc: 4715 li a4,5 + 30035be: 04f76a63 bltu a4,a5,3003612 + 30035c2: 00279713 slli a4,a5,0x2 + 30035c6: 030077b7 lui a5,0x3007 + 30035ca: 8e078793 addi a5,a5,-1824 # 30068e0 + 30035ce: 97ba add a5,a5,a4 + 30035d0: 439c lw a5,0(a5) + 30035d2: 8782 jr a5 + case CRG_IP_NONE_CLK_SEL: + case CRG_IP_EFC: + case CRG_IP_ANA: + freq = hclk; /* Returns the internal high speed clock frequency. */ + 30035d4: fe842783 lw a5,-24(s0) + 30035d8: fef42623 sw a5,-20(s0) + break; + 30035dc: a825 j 3003614 + + case CRG_IP_CAN: + freq = CRG_GetPllRefIni(g_crgBaseAddr->PERI_CRG0.BIT.pll_ref_cksel); + 30035de: 040007b7 lui a5,0x4000 + 30035e2: 4947a783 lw a5,1172(a5) # 4000494 + 30035e6: 439c lw a5,0(a5) + 30035e8: 8b85 andi a5,a5,1 + 30035ea: 9f81 uxtb a5 + 30035ec: 853e mv a0,a5 + 30035ee: 21d9 jal ra,3003ab4 + 30035f0: fea42623 sw a0,-20(s0) + break; + 30035f4: a005 j 3003614 + + case CRG_IP_ADC: + /* Get core clock frequence for calculating the ADC clock frequency. */ + coreClkFreq = HAL_CRG_GetCoreClkFreq(); + 30035f6: 35c9 jal ra,30034b8 + 30035f8: fea42023 sw a0,-32(s0) + freq = CRG_GetAdcIpFreq(p, CRG_GetVcoFreq(), coreClkFreq); + 30035fc: 3b75 jal ra,30033b8 + 30035fe: 87aa mv a5,a0 + 3003600: fe042603 lw a2,-32(s0) + 3003604: 85be mv a1,a5 + 3003606: fe442503 lw a0,-28(s0) + 300360a: 2c85 jal ra,300387a + 300360c: fea42623 sw a0,-20(s0) + break; + 3003610: a011 j 3003614 + + case CRG_IP_IWDG: /* The IWDG clock frequency is an internal low-speed clock. */ + default: + break; + 3003612: 0001 nop + } + if (freq == 0) { + 3003614: fec42783 lw a5,-20(s0) + 3003618: e791 bnez a5,3003624 + freq = LOSC_FREQ; + 300361a: 67a1 lui a5,0x8 + 300361c: d0078793 addi a5,a5,-768 # 7d00 + 3003620: fef42623 sw a5,-20(s0) + } + return freq; + 3003624: fec42783 lw a5,-20(s0) +#endif +} + 3003628: 853e mv a0,a5 + 300362a: 50b2 lw ra,44(sp) + 300362c: 5422 lw s0,40(sp) + 300362e: 6145 addi sp,sp,48 + 3003630: 8082 ret + +03003632 : + * @param enable enable mask + * @retval BASE_STATUS_ERROR Can't find the Match or operation is not support + * @retval BASE_STATUS_OK Operation Success + */ +BASE_StatusType HAL_CRG_IpEnableSet(const void *baseAddress, unsigned int enable) +{ + 3003632: 7179 addi sp,sp,-48 + 3003634: d606 sw ra,44(sp) + 3003636: d422 sw s0,40(sp) + 3003638: 1800 addi s0,sp,48 + 300363a: fca42e23 sw a0,-36(s0) + 300363e: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3003642: fdc42783 lw a5,-36(s0) + 3003646: eb89 bnez a5,3003658 + 3003648: 19c00593 li a1,412 + 300364c: 030077b7 lui a5,0x3007 + 3003650: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003654: 3429 jal ra,300305e + 3003656: a001 j 3003656 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003658: 040007b7 lui a5,0x4000 + 300365c: 4947a703 lw a4,1172(a5) # 4000494 + 3003660: 100007b7 lui a5,0x10000 + 3003664: 00f70a63 beq a4,a5,3003678 + 3003668: 19d00593 li a1,413 + 300366c: 030077b7 lui a5,0x3007 + 3003670: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003674: 32ed jal ra,300305e + 3003676: a001 j 3003676 + /* Check the validity of the input parameters. */ + CRG_PARAM_CHECK_WITH_RET((enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE), BASE_STATUS_ERROR); + 3003678: fd842703 lw a4,-40(s0) + 300367c: 4785 li a5,1 + 300367e: 00f70e63 beq a4,a5,300369a + 3003682: fd842783 lw a5,-40(s0) + 3003686: cb91 beqz a5,300369a + 3003688: 19f00593 li a1,415 + 300368c: 030077b7 lui a5,0x3007 + 3003690: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003694: 32e9 jal ra,300305e + 3003696: 4785 li a5,1 + 3003698: a0a5 j 3003700 + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 300369a: fdc42503 lw a0,-36(s0) + 300369e: 2ae1 jal ra,3003876 + 30036a0: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 30036a4: fec42783 lw a5,-20(s0) + 30036a8: c799 beqz a5,30036b6 + 30036aa: fec42783 lw a5,-20(s0) + 30036ae: 43d8 lw a4,4(a5) + 30036b0: 4795 li a5,5 + 30036b2: 00e7f463 bgeu a5,a4,30036ba + return BASE_STATUS_ERROR; + 30036b6: 4785 li a5,1 + 30036b8: a0a1 j 3003700 + } + if (g_ipClkProc[p->type].enableSet == NULL) { + 30036ba: fec42783 lw a5,-20(s0) + 30036be: 43d4 lw a3,4(a5) + 30036c0: 040007b7 lui a5,0x4000 + 30036c4: 02478713 addi a4,a5,36 # 4000024 + 30036c8: 02400793 li a5,36 + 30036cc: 02f687b3 mul a5,a3,a5 + 30036d0: 97ba add a5,a5,a4 + 30036d2: 479c lw a5,8(a5) + 30036d4: e399 bnez a5,30036da + return BASE_STATUS_ERROR; + 30036d6: 4785 li a5,1 + 30036d8: a025 j 3003700 + } + g_ipClkProc[p->type].enableSet(p, enable); + 30036da: fec42783 lw a5,-20(s0) + 30036de: 43d4 lw a3,4(a5) + 30036e0: 040007b7 lui a5,0x4000 + 30036e4: 02478713 addi a4,a5,36 # 4000024 + 30036e8: 02400793 li a5,36 + 30036ec: 02f687b3 mul a5,a3,a5 + 30036f0: 97ba add a5,a5,a4 + 30036f2: 479c lw a5,8(a5) + 30036f4: fd842583 lw a1,-40(s0) + 30036f8: fec42503 lw a0,-20(s0) + 30036fc: 9782 jalr a5 + return BASE_STATUS_OK; + 30036fe: 4781 li a5,0 +} + 3003700: 853e mv a0,a5 + 3003702: 50b2 lw ra,44(sp) + 3003704: 5422 lw s0,40(sp) + 3003706: 6145 addi sp,sp,48 + 3003708: 8082 ret + +0300370a : + * @param select clock select, @see CRG_APBLsClkSelect for ip in apb_ls_subsys or CRG_AdcClkSelect for adc + * @retval BASE_STATUS_OK success + * @retval BASE_STATUS_ERROR fail + */ +BASE_StatusType HAL_CRG_IpClkSelectSet(const void *baseAddress, unsigned int select) +{ + 300370a: 7179 addi sp,sp,-48 + 300370c: d606 sw ra,44(sp) + 300370e: d422 sw s0,40(sp) + 3003710: 1800 addi s0,sp,48 + 3003712: fca42e23 sw a0,-36(s0) + 3003716: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 300371a: fdc42783 lw a5,-36(s0) + 300371e: eb89 bnez a5,3003730 + 3003720: 1cd00593 li a1,461 + 3003724: 030077b7 lui a5,0x3007 + 3003728: 8a478513 addi a0,a5,-1884 # 30068a4 + 300372c: 2d8d jal ra,3003d9e + 300372e: a001 j 300372e + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003730: 040007b7 lui a5,0x4000 + 3003734: 4947a703 lw a4,1172(a5) # 4000494 + 3003738: 100007b7 lui a5,0x10000 + 300373c: 00f70a63 beq a4,a5,3003750 + 3003740: 1ce00593 li a1,462 + 3003744: 030077b7 lui a5,0x3007 + 3003748: 8a478513 addi a0,a5,-1884 # 30068a4 + 300374c: 2d89 jal ra,3003d9e + 300374e: a001 j 300374e + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003750: fdc42503 lw a0,-36(s0) + 3003754: 220d jal ra,3003876 + 3003756: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 300375a: fec42783 lw a5,-20(s0) + 300375e: c799 beqz a5,300376c + 3003760: fec42783 lw a5,-20(s0) + 3003764: 43d8 lw a4,4(a5) + 3003766: 4795 li a5,5 + 3003768: 00e7f463 bgeu a5,a4,3003770 + return BASE_STATUS_ERROR; + 300376c: 4785 li a5,1 + 300376e: a0a1 j 30037b6 + } + if (g_ipClkProc[p->type].clkSelSet == NULL) { + 3003770: fec42783 lw a5,-20(s0) + 3003774: 43d4 lw a3,4(a5) + 3003776: 040007b7 lui a5,0x4000 + 300377a: 02478713 addi a4,a5,36 # 4000024 + 300377e: 02400793 li a5,36 + 3003782: 02f687b3 mul a5,a3,a5 + 3003786: 97ba add a5,a5,a4 + 3003788: 47dc lw a5,12(a5) + 300378a: e399 bnez a5,3003790 + return BASE_STATUS_ERROR; + 300378c: 4785 li a5,1 + 300378e: a025 j 30037b6 + } + g_ipClkProc[p->type].clkSelSet(p, select); /* Clock selection of the configuration module. */ + 3003790: fec42783 lw a5,-20(s0) + 3003794: 43d4 lw a3,4(a5) + 3003796: 040007b7 lui a5,0x4000 + 300379a: 02478713 addi a4,a5,36 # 4000024 + 300379e: 02400793 li a5,36 + 30037a2: 02f687b3 mul a5,a3,a5 + 30037a6: 97ba add a5,a5,a4 + 30037a8: 47dc lw a5,12(a5) + 30037aa: fd842583 lw a1,-40(s0) + 30037ae: fec42503 lw a0,-20(s0) + 30037b2: 9782 jalr a5 + return BASE_STATUS_OK; + 30037b4: 4781 li a5,0 +} + 30037b6: 853e mv a0,a5 + 30037b8: 50b2 lw ra,44(sp) + 30037ba: 5422 lw s0,40(sp) + 30037bc: 6145 addi sp,sp,48 + 30037be: 8082 ret + +030037c0 : + * @param div set div value + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Match Fail or Not support + */ +BASE_StatusType HAL_CRG_IpClkDivSet(const void *baseAddress, unsigned int div) +{ + 30037c0: 7179 addi sp,sp,-48 + 30037c2: d606 sw ra,44(sp) + 30037c4: d422 sw s0,40(sp) + 30037c6: 1800 addi s0,sp,48 + 30037c8: fca42e23 sw a0,-36(s0) + 30037cc: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 30037d0: fdc42783 lw a5,-36(s0) + 30037d4: eb89 bnez a5,30037e6 + 30037d6: 22c00593 li a1,556 + 30037da: 030077b7 lui a5,0x3007 + 30037de: 8a478513 addi a0,a5,-1884 # 30068a4 + 30037e2: 2b75 jal ra,3003d9e + 30037e4: a001 j 30037e4 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30037e6: 040007b7 lui a5,0x4000 + 30037ea: 4947a703 lw a4,1172(a5) # 4000494 + 30037ee: 100007b7 lui a5,0x10000 + 30037f2: 00f70a63 beq a4,a5,3003806 + 30037f6: 22d00593 li a1,557 + 30037fa: 030077b7 lui a5,0x3007 + 30037fe: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003802: 2b71 jal ra,3003d9e + 3003804: a001 j 3003804 + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003806: fdc42503 lw a0,-36(s0) + 300380a: 20b5 jal ra,3003876 + 300380c: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 3003810: fec42783 lw a5,-20(s0) + 3003814: c799 beqz a5,3003822 + 3003816: fec42783 lw a5,-20(s0) + 300381a: 43d8 lw a4,4(a5) + 300381c: 4795 li a5,5 + 300381e: 00e7f463 bgeu a5,a4,3003826 + return BASE_STATUS_ERROR; + 3003822: 4785 li a5,1 + 3003824: a0a1 j 300386c + } + if (g_ipClkProc[p->type].clkDivSet == NULL) { + 3003826: fec42783 lw a5,-20(s0) + 300382a: 43d4 lw a3,4(a5) + 300382c: 040007b7 lui a5,0x4000 + 3003830: 02478713 addi a4,a5,36 # 4000024 + 3003834: 02400793 li a5,36 + 3003838: 02f687b3 mul a5,a3,a5 + 300383c: 97ba add a5,a5,a4 + 300383e: 4b9c lw a5,16(a5) + 3003840: e399 bnez a5,3003846 + return BASE_STATUS_ERROR; + 3003842: 4785 li a5,1 + 3003844: a025 j 300386c + } + g_ipClkProc[p->type].clkDivSet(p, div); /* Configure the clock frequency divider of the module. */ + 3003846: fec42783 lw a5,-20(s0) + 300384a: 43d4 lw a3,4(a5) + 300384c: 040007b7 lui a5,0x4000 + 3003850: 02478713 addi a4,a5,36 # 4000024 + 3003854: 02400793 li a5,36 + 3003858: 02f687b3 mul a5,a3,a5 + 300385c: 97ba add a5,a5,a4 + 300385e: 4b9c lw a5,16(a5) + 3003860: fd842583 lw a1,-40(s0) + 3003864: fec42503 lw a0,-20(s0) + 3003868: 9782 jalr a5 + return BASE_STATUS_OK; + 300386a: 4781 li a5,0 +} + 300386c: 853e mv a0,a5 + 300386e: 50b2 lw ra,44(sp) + 3003870: 5422 lw s0,40(sp) + 3003872: 6145 addi sp,sp,48 + 3003874: 8082 ret + +03003876 : + 3003876: 933fd06f j 30011a8 + +0300387a : + * @param coreClkFreq core clock rate + * @retval Ip Frequence + */ +static unsigned int CRG_GetAdcIpFreq(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int baseClkRate, + unsigned int coreClkFreq) +{ + 300387a: 7139 addi sp,sp,-64 + 300387c: de06 sw ra,60(sp) + 300387e: dc22 sw s0,56(sp) + 3003880: 0080 addi s0,sp,64 + 3003882: fca42623 sw a0,-52(s0) + 3003886: fcb42423 sw a1,-56(s0) + 300388a: fcc42223 sw a2,-60(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300388e: fcc42783 lw a5,-52(s0) + 3003892: eb89 bnez a5,30038a4 + 3003894: 2af00593 li a1,687 + 3003898: 030077b7 lui a5,0x3007 + 300389c: 8a478513 addi a0,a5,-1884 # 30068a4 + 30038a0: 29fd jal ra,3003d9e + 30038a2: a001 j 30038a2 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30038a4: 040007b7 lui a5,0x4000 + 30038a8: 4947a783 lw a5,1172(a5) # 4000494 + 30038ac: eb89 bnez a5,30038be + 30038ae: 2b000593 li a1,688 + 30038b2: 030077b7 lui a5,0x3007 + 30038b6: 8a478513 addi a0,a5,-1884 # 30068a4 + 30038ba: 21d5 jal ra,3003d9e + 30038bc: a001 j 30038bc + + unsigned int clkSel; + unsigned int clkDiv; + unsigned int pst2Div; + unsigned int freq = 0; + 30038be: fe042623 sw zero,-20(s0) + + /* Obtains the clock source selection of the ADC. */ + const CRG_IpProc *proc = &g_ipClkProc[matchInfo->type]; + 30038c2: fcc42783 lw a5,-52(s0) + 30038c6: 43d8 lw a4,4(a5) + 30038c8: 02400793 li a5,36 + 30038cc: 02f70733 mul a4,a4,a5 + 30038d0: 040007b7 lui a5,0x4000 + 30038d4: 02478793 addi a5,a5,36 # 4000024 + 30038d8: 97ba add a5,a5,a4 + 30038da: fef42423 sw a5,-24(s0) + if (proc->clkSelGet == NULL) { + 30038de: fe842783 lw a5,-24(s0) + 30038e2: 4fdc lw a5,28(a5) + 30038e4: e399 bnez a5,30038ea + return 0; + 30038e6: 4781 li a5,0 + 30038e8: a07d j 3003996 + } + clkSel = proc->clkSelGet(matchInfo); + 30038ea: fe842783 lw a5,-24(s0) + 30038ee: 4fdc lw a5,28(a5) + 30038f0: fcc42503 lw a0,-52(s0) + 30038f4: 9782 jalr a5 + 30038f6: fea42223 sw a0,-28(s0) + /* Calculate the frequency from the ADC's clock source. */ + if (clkSel == CRG_ADC_CLK_SYN_CORE) { + 30038fa: fe442703 lw a4,-28(s0) + 30038fe: 478d li a5,3 + 3003900: 00f71763 bne a4,a5,300390e + freq = coreClkFreq; + 3003904: fc442783 lw a5,-60(s0) + 3003908: fef42623 sw a5,-20(s0) + 300390c: a085 j 300396c + } else if (clkSel == CRG_ADC_CLK_ASYN_HOSC) { + 300390e: fe442783 lw a5,-28(s0) + 3003912: eb81 bnez a5,3003922 + freq = HOSC_FREQ; + 3003914: 017d87b7 lui a5,0x17d8 + 3003918: 84078793 addi a5,a5,-1984 # 17d7840 + 300391c: fef42623 sw a5,-20(s0) + 3003920: a0b1 j 300396c + } else if (clkSel == CRG_ADC_CLK_ASYN_TCXO) { + 3003922: fe442703 lw a4,-28(s0) + 3003926: 4785 li a5,1 + 3003928: 00f71963 bne a4,a5,300393a + /* The maximum speed of the external clock source is 30000000U. */ + freq = (XTRAIL_FREQ > 30000000U) ? 0 : XTRAIL_FREQ; + 300392c: 01c9c7b7 lui a5,0x1c9c + 3003930: 38078793 addi a5,a5,896 # 1c9c380 + 3003934: fef42623 sw a5,-20(s0) + 3003938: a815 j 300396c + } else if (clkSel == CRG_ADC_CLK_ASYN_PLL_DIV) { + 300393a: fe442703 lw a4,-28(s0) + 300393e: 4789 li a5,2 + 3003940: 02f71663 bne a4,a5,300396c + pst2Div = CRG_GetPllPostDivValue((CRG_PllPostDiv)g_crgBaseAddr->PERI_CRG3.BIT.pll_postdiv2); + 3003944: 040007b7 lui a5,0x4000 + 3003948: 4947a783 lw a5,1172(a5) # 4000494 + 300394c: 47dc lw a5,12(a5) + 300394e: 8391 srli a5,a5,0x4 + 3003950: 8bbd andi a5,a5,15 + 3003952: 9f81 uxtb a5 + 3003954: 853e mv a0,a5 + 3003956: 2ae5 jal ra,3003b4e + 3003958: fea42023 sw a0,-32(s0) + freq = baseClkRate / pst2Div; + 300395c: fc842703 lw a4,-56(s0) + 3003960: fe042783 lw a5,-32(s0) + 3003964: 02f757b3 divu a5,a4,a5 + 3003968: fef42623 sw a5,-20(s0) + } + + /* Obtain the frequency divider based on the ADC clock source. */ + if (proc->clkDivGet == NULL) { + 300396c: fe842783 lw a5,-24(s0) + 3003970: 539c lw a5,32(a5) + 3003972: e399 bnez a5,3003978 + return 0; + 3003974: 4781 li a5,0 + 3003976: a005 j 3003996 + } + clkDiv = proc->clkDivGet(matchInfo); + 3003978: fe842783 lw a5,-24(s0) + 300397c: 539c lw a5,32(a5) + 300397e: fcc42503 lw a0,-52(s0) + 3003982: 9782 jalr a5 + 3003984: fca42e23 sw a0,-36(s0) + /* Calculate the clock frequency of the ADC. */ + return (freq / (clkDiv + 1)); + 3003988: fdc42783 lw a5,-36(s0) + 300398c: 0785 addi a5,a5,1 + 300398e: fec42703 lw a4,-20(s0) + 3003992: 02f757b3 divu a5,a4,a5 +} + 3003996: 853e mv a0,a5 + 3003998: 50f2 lw ra,60(sp) + 300399a: 5462 lw s0,56(sp) + 300399c: 6121 addi sp,sp,64 + 300399e: 8082 ret + +030039a0 : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValidPllConfig(const CRG_Handle *handle) +{ + 30039a0: 7179 addi sp,sp,-48 + 30039a2: d606 sw ra,44(sp) + 30039a4: d422 sw s0,40(sp) + 30039a6: 1800 addi s0,sp,48 + 30039a8: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + unsigned int freq; + + freq = CRG_GetPllRefIni(handle->pllRefClkSelect); + 30039ac: fdc42783 lw a5,-36(s0) + 30039b0: 43dc lw a5,4(a5) + 30039b2: 853e mv a0,a5 + 30039b4: 2201 jal ra,3003ab4 + 30039b6: fea42623 sw a0,-20(s0) + preDiv = CRG_GetPreDivValue(handle->pllPreDiv); + 30039ba: fdc42783 lw a5,-36(s0) + 30039be: 479c lw a5,8(a5) + 30039c0: 853e mv a0,a5 + 30039c2: 2a31 jal ra,3003ade + 30039c4: fea42423 sw a0,-24(s0) + /* Check the validity of the prescaled clock frequency. */ + if (!IsCrgValidPreDiv(freq, preDiv)) { + 30039c8: fe842583 lw a1,-24(s0) + 30039cc: fec42503 lw a0,-20(s0) + 30039d0: c26ff0ef jal ra,3002df6 + 30039d4: 87aa mv a5,a0 + 30039d6: 0017c793 xori a5,a5,1 + 30039da: 9f81 uxtb a5 + 30039dc: c399 beqz a5,30039e2 + return BASE_STATUS_ERROR; + 30039de: 4785 li a5,1 + 30039e0: a8a5 j 3003a58 + } + freq /= preDiv; + 30039e2: fec42703 lw a4,-20(s0) + 30039e6: fe842783 lw a5,-24(s0) + 30039ea: 02f757b3 divu a5,a4,a5 + 30039ee: fef42623 sw a5,-20(s0) + /* Check the validity of the clock frequency after frequency multiplication. */ + if (!IsCrgValidFdDiv(freq, handle->pllFbDiv)) { + 30039f2: fdc42783 lw a5,-36(s0) + 30039f6: 47dc lw a5,12(a5) + 30039f8: 85be mv a1,a5 + 30039fa: fec42503 lw a0,-20(s0) + 30039fe: c56ff0ef jal ra,3002e54 + 3003a02: 87aa mv a5,a0 + 3003a04: 0017c793 xori a5,a5,1 + 3003a08: 9f81 uxtb a5 + 3003a0a: c399 beqz a5,3003a10 + return BASE_STATUS_ERROR; + 3003a0c: 4785 li a5,1 + 3003a0e: a0a9 j 3003a58 + } + freq *= (handle->pllFbDiv > 0x06) ? handle->pllFbDiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 3003a10: fdc42783 lw a5,-36(s0) + 3003a14: 47dc lw a5,12(a5) + 3003a16: 4719 li a4,6 + 3003a18: 00e7f363 bgeu a5,a4,3003a1e + 3003a1c: 4799 li a5,6 + 3003a1e: fec42703 lw a4,-20(s0) + 3003a22: 02f707b3 mul a5,a4,a5 + 3003a26: fef42623 sw a5,-20(s0) + /* Check whether the PLL output frequency is valid. */ + if (IsCrgValidPostDiv(freq, handle->pllPostDiv) && IsCrgValidPostDiv2(freq, handle->handleEx.pllPostDiv2)) { + 3003a2a: fdc42783 lw a5,-36(s0) + 3003a2e: 4b9c lw a5,16(a5) + 3003a30: 85be mv a1,a5 + 3003a32: fec42503 lw a0,-20(s0) + 3003a36: ca8ff0ef jal ra,3002ede + 3003a3a: 87aa mv a5,a0 + 3003a3c: cf89 beqz a5,3003a56 + 3003a3e: fdc42783 lw a5,-36(s0) + 3003a42: 4fdc lw a5,28(a5) + 3003a44: 85be mv a1,a5 + 3003a46: fec42503 lw a0,-20(s0) + 3003a4a: cdcff0ef jal ra,3002f26 + 3003a4e: 87aa mv a5,a0 + 3003a50: c399 beqz a5,3003a56 + return BASE_STATUS_OK; + 3003a52: 4781 li a5,0 + 3003a54: a011 j 3003a58 + } + return BASE_STATUS_ERROR; + 3003a56: 4785 li a5,1 +} + 3003a58: 853e mv a0,a5 + 3003a5a: 50b2 lw ra,44(sp) + 3003a5c: 5422 lw s0,40(sp) + 3003a5e: 6145 addi sp,sp,48 + 3003a60: 8082 ret + +03003a62 : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValid1MHzConfig(const CRG_Handle *handle) +{ + 3003a62: 7179 addi sp,sp,-48 + 3003a64: d622 sw s0,44(sp) + 3003a66: 1800 addi s0,sp,48 + 3003a68: fca42e23 sw a0,-36(s0) + unsigned int freq; + /* Get the ref frequency of the 1 MHz clock. */ + freq = (handle->handleEx.clk1MSelect == CRG_1M_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003a6c: fdc42783 lw a5,-36(s0) + 3003a70: 539c lw a5,32(a5) + 3003a72: e791 bnez a5,3003a7e + 3003a74: 017d87b7 lui a5,0x17d8 + 3003a78: 84078793 addi a5,a5,-1984 # 17d7840 + 3003a7c: a029 j 3003a86 + 3003a7e: 01c9c7b7 lui a5,0x1c9c + 3003a82: 38078793 addi a5,a5,896 # 1c9c380 + 3003a86: fef42623 sw a5,-20(s0) + /* Check whether the 1MHz output frequency is valid. */ + if ((freq / (handle->handleEx.clk1MDiv + 1)) == CRG_FREQ_1MHz) { + 3003a8a: fdc42783 lw a5,-36(s0) + 3003a8e: 53dc lw a5,36(a5) + 3003a90: 0785 addi a5,a5,1 + 3003a92: fec42703 lw a4,-20(s0) + 3003a96: 02f75733 divu a4,a4,a5 + 3003a9a: 000f47b7 lui a5,0xf4 + 3003a9e: 24078793 addi a5,a5,576 # f4240 + 3003aa2: 00f71463 bne a4,a5,3003aaa + return BASE_STATUS_OK; + 3003aa6: 4781 li a5,0 + 3003aa8: a011 j 3003aac + } + return BASE_STATUS_ERROR; + 3003aaa: 4785 li a5,1 +} + 3003aac: 853e mv a0,a5 + 3003aae: 5432 lw s0,44(sp) + 3003ab0: 6145 addi sp,sp,48 + 3003ab2: 8082 ret + +03003ab4 : + * @brief Get clock frequence + * @param crg CRG_RegStruct + * @retval The frequence fo clock + */ +static inline unsigned int CRG_GetPllRefIni(CRG_PllRefClkSelect pllRefClkSelect) +{ + 3003ab4: 1101 addi sp,sp,-32 + 3003ab6: ce22 sw s0,28(sp) + 3003ab8: 1000 addi s0,sp,32 + 3003aba: fea42623 sw a0,-20(s0) + /* The maximum speed of the external clock source is 30000000U. */ + if (pllRefClkSelect == CRG_PLL_REF_CLK_SELECT_XTAL && XTRAIL_FREQ > 30000000U) { + return 0; + } + return (pllRefClkSelect == (unsigned int)CRG_PLL_REF_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003abe: fec42783 lw a5,-20(s0) + 3003ac2: e791 bnez a5,3003ace + 3003ac4: 017d87b7 lui a5,0x17d8 + 3003ac8: 84078793 addi a5,a5,-1984 # 17d7840 + 3003acc: a029 j 3003ad6 + 3003ace: 01c9c7b7 lui a5,0x1c9c + 3003ad2: 38078793 addi a5,a5,896 # 1c9c380 +} + 3003ad6: 853e mv a0,a5 + 3003ad8: 4472 lw s0,28(sp) + 3003ada: 6105 addi sp,sp,32 + 3003adc: 8082 ret + +03003ade : + * @brief Get previous division Value before PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPreDivValue(CRG_PllPreDiv pllPredDiv) +{ + 3003ade: 7179 addi sp,sp,-48 + 3003ae0: d622 sw s0,44(sp) + 3003ae2: 1800 addi s0,sp,48 + 3003ae4: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + if (pllPredDiv <= CRG_PLL_PREDIV_1) { /* 0 or 1 returns PLL_PREDIV_OUT_1. */ + 3003ae8: fdc42783 lw a5,-36(s0) + 3003aec: e789 bnez a5,3003af6 + preDiv = PLL_PREDIV_OUT_1; + 3003aee: 4785 li a5,1 + 3003af0: fef42623 sw a5,-20(s0) + 3003af4: a031 j 3003b00 + } else { + preDiv = pllPredDiv + 1; + 3003af6: fdc42783 lw a5,-36(s0) + 3003afa: 0785 addi a5,a5,1 + 3003afc: fef42623 sw a5,-20(s0) + } + return preDiv; + 3003b00: fec42783 lw a5,-20(s0) +} + 3003b04: 853e mv a0,a5 + 3003b06: 5432 lw s0,44(sp) + 3003b08: 6145 addi sp,sp,48 + 3003b0a: 8082 ret + +03003b0c : + * @brief Get PLL loop divider ratio + * @param crg CRG_RegStruct + * @retval PLL loop divider ratio + */ +static inline unsigned int CRG_GetPllFbDivValue(unsigned int pllFbDiv) +{ + 3003b0c: 7179 addi sp,sp,-48 + 3003b0e: d622 sw s0,44(sp) + 3003b10: 1800 addi s0,sp,48 + 3003b12: fca42e23 sw a0,-36(s0) + unsigned int div = pllFbDiv; + 3003b16: fdc42783 lw a5,-36(s0) + 3003b1a: fef42623 sw a5,-20(s0) + /* Check the validity of the minimum frequency multiplication parameter. */ + if (div < CRG_PLL_FBDIV_MIN) { + 3003b1e: fec42703 lw a4,-20(s0) + 3003b22: 4795 li a5,5 + 3003b24: 00e7e563 bltu a5,a4,3003b2e + div = CRG_PLL_FBDIV_MIN; + 3003b28: 4799 li a5,6 + 3003b2a: fef42623 sw a5,-20(s0) + } + /* Check the validity of the maximum frequency multiplication parameter. */ + if (div > CRG_PLL_FBDIV_MAX) { + 3003b2e: fec42703 lw a4,-20(s0) + 3003b32: 07f00793 li a5,127 + 3003b36: 00e7f663 bgeu a5,a4,3003b42 + div = CRG_PLL_FBDIV_MAX; + 3003b3a: 07f00793 li a5,127 + 3003b3e: fef42623 sw a5,-20(s0) + } + return div; + 3003b42: fec42783 lw a5,-20(s0) +} + 3003b46: 853e mv a0,a5 + 3003b48: 5432 lw s0,44(sp) + 3003b4a: 6145 addi sp,sp,48 + 3003b4c: 8082 ret + +03003b4e : + * @brief Get post division Value after PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPllPostDivValue(unsigned int pllPostDiv) +{ + 3003b4e: 7179 addi sp,sp,-48 + 3003b50: d622 sw s0,44(sp) + 3003b52: 1800 addi s0,sp,48 + 3003b54: fca42e23 sw a0,-36(s0) + unsigned int div = pllPostDiv; + 3003b58: fdc42783 lw a5,-36(s0) + 3003b5c: fef42623 sw a5,-20(s0) + if (div > CRG_PLL_POSTDIV_8) { + 3003b60: fec42703 lw a4,-20(s0) + 3003b64: 479d li a5,7 + 3003b66: 00e7f663 bgeu a5,a4,3003b72 + div = (CRG_PLL_POSTDIV_8 + 1); /* If the postdiv is greater than 8, set this postdiv to 8. */ + 3003b6a: 47a1 li a5,8 + 3003b6c: fef42623 sw a5,-20(s0) + 3003b70: a031 j 3003b7c + } else { + div += 1; + 3003b72: fec42783 lw a5,-20(s0) + 3003b76: 0785 addi a5,a5,1 + 3003b78: fef42623 sw a5,-20(s0) + } + return div; + 3003b7c: fec42783 lw a5,-20(s0) +} + 3003b80: 853e mv a0,a5 + 3003b82: 5432 lw s0,44(sp) + 3003b84: 6145 addi sp,sp,48 + 3003b86: 8082 ret + +03003b88 : + * @param matchInfo IP without Clock select match info + * @param enable BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003b88: 7179 addi sp,sp,-48 + 3003b8a: d606 sw ra,44(sp) + 3003b8c: d422 sw s0,40(sp) + 3003b8e: 1800 addi s0,sp,48 + 3003b90: fca42e23 sw a0,-36(s0) + 3003b94: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003b98: fdc42783 lw a5,-36(s0) + 3003b9c: eb89 bnez a5,3003bae + 3003b9e: 34d00593 li a1,845 + 3003ba2: 030077b7 lui a5,0x3007 + 3003ba6: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003baa: 2ad5 jal ra,3003d9e + 3003bac: a001 j 3003bac + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003bae: 040007b7 lui a5,0x4000 + 3003bb2: 4947a783 lw a5,1172(a5) # 4000494 + 3003bb6: eb89 bnez a5,3003bc8 + 3003bb8: 34e00593 li a1,846 + 3003bbc: 030077b7 lui a5,0x3007 + 3003bc0: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003bc4: 2ae9 jal ra,3003d9e + 3003bc6: a001 j 3003bc6 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003bc8: 040007b7 lui a5,0x4000 + 3003bcc: 4947a783 lw a5,1172(a5) # 4000494 + 3003bd0: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003bd4: fdc42783 lw a5,-36(s0) + 3003bd8: 279e lhu a5,8(a5) + 3003bda: 873e mv a4,a5 + 3003bdc: fec42783 lw a5,-20(s0) + 3003be0: 97ba add a5,a5,a4 + 3003be2: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003be6: fe842783 lw a5,-24(s0) + 3003bea: 439c lw a5,0(a5) + 3003bec: fef42223 sw a5,-28(s0) + if (enable & IP_CLK_ENABLE) { /* Set enable of target ip. */ + 3003bf0: fd842783 lw a5,-40(s0) + 3003bf4: 8b85 andi a5,a5,1 + 3003bf6: c7c1 beqz a5,3003c7e + cfg.BIT.clkEnMask |= 1 << matchInfo->bitOffset; + 3003bf8: fe442783 lw a5,-28(s0) + 3003bfc: 9fa1 uxth a5 + 3003bfe: 01079713 slli a4,a5,0x10 + 3003c02: 8741 srai a4,a4,0x10 + 3003c04: fdc42783 lw a5,-36(s0) + 3003c08: 27bc lbu a5,10(a5) + 3003c0a: 86be mv a3,a5 + 3003c0c: 4785 li a5,1 + 3003c0e: 00d797b3 sll a5,a5,a3 + 3003c12: 07c2 slli a5,a5,0x10 + 3003c14: 87c1 srai a5,a5,0x10 + 3003c16: 8fd9 or a5,a5,a4 + 3003c18: 07c2 slli a5,a5,0x10 + 3003c1a: 87c1 srai a5,a5,0x10 + 3003c1c: 01079693 slli a3,a5,0x10 + 3003c20: 82c1 srli a3,a3,0x10 + 3003c22: fe442783 lw a5,-28(s0) + 3003c26: 6741 lui a4,0x10 + 3003c28: 177d addi a4,a4,-1 # ffff + 3003c2a: 8f75 and a4,a4,a3 + 3003c2c: 76c1 lui a3,0xffff0 + 3003c2e: 8ff5 and a5,a5,a3 + 3003c30: 8fd9 or a5,a5,a4 + 3003c32: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); + 3003c36: fe442783 lw a5,-28(s0) + 3003c3a: 83c1 srli a5,a5,0x10 + 3003c3c: 9fa1 uxth a5 + 3003c3e: 01079713 slli a4,a5,0x10 + 3003c42: 8741 srai a4,a4,0x10 + 3003c44: fdc42783 lw a5,-36(s0) + 3003c48: 27bc lbu a5,10(a5) + 3003c4a: 86be mv a3,a5 + 3003c4c: 4785 li a5,1 + 3003c4e: 00d797b3 sll a5,a5,a3 + 3003c52: 07c2 slli a5,a5,0x10 + 3003c54: 87c1 srai a5,a5,0x10 + 3003c56: fff7c793 not a5,a5 + 3003c5a: 07c2 slli a5,a5,0x10 + 3003c5c: 87c1 srai a5,a5,0x10 + 3003c5e: 8ff9 and a5,a5,a4 + 3003c60: 07c2 slli a5,a5,0x10 + 3003c62: 87c1 srai a5,a5,0x10 + 3003c64: 01079713 slli a4,a5,0x10 + 3003c68: 8341 srli a4,a4,0x10 + 3003c6a: fe442783 lw a5,-28(s0) + 3003c6e: 0742 slli a4,a4,0x10 + 3003c70: 66c1 lui a3,0x10 + 3003c72: 16fd addi a3,a3,-1 # ffff + 3003c74: 8ff5 and a5,a5,a3 + 3003c76: 8fd9 or a5,a5,a4 + 3003c78: fef42223 sw a5,-28(s0) + 3003c7c: a059 j 3003d02 + } else { + cfg.BIT.clkEnMask &= ~(1 << matchInfo->bitOffset); /* Disable of target ip. */ + 3003c7e: fe442783 lw a5,-28(s0) + 3003c82: 9fa1 uxth a5 + 3003c84: 01079713 slli a4,a5,0x10 + 3003c88: 8741 srai a4,a4,0x10 + 3003c8a: fdc42783 lw a5,-36(s0) + 3003c8e: 27bc lbu a5,10(a5) + 3003c90: 86be mv a3,a5 + 3003c92: 4785 li a5,1 + 3003c94: 00d797b3 sll a5,a5,a3 + 3003c98: 07c2 slli a5,a5,0x10 + 3003c9a: 87c1 srai a5,a5,0x10 + 3003c9c: fff7c793 not a5,a5 + 3003ca0: 07c2 slli a5,a5,0x10 + 3003ca2: 87c1 srai a5,a5,0x10 + 3003ca4: 8ff9 and a5,a5,a4 + 3003ca6: 07c2 slli a5,a5,0x10 + 3003ca8: 87c1 srai a5,a5,0x10 + 3003caa: 01079693 slli a3,a5,0x10 + 3003cae: 82c1 srli a3,a3,0x10 + 3003cb0: fe442783 lw a5,-28(s0) + 3003cb4: 6741 lui a4,0x10 + 3003cb6: 177d addi a4,a4,-1 # ffff + 3003cb8: 8f75 and a4,a4,a3 + 3003cba: 76c1 lui a3,0xffff0 + 3003cbc: 8ff5 and a5,a5,a3 + 3003cbe: 8fd9 or a5,a5,a4 + 3003cc0: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq |= (1 << matchInfo->bitOffset); + 3003cc4: fe442783 lw a5,-28(s0) + 3003cc8: 83c1 srli a5,a5,0x10 + 3003cca: 9fa1 uxth a5 + 3003ccc: 01079713 slli a4,a5,0x10 + 3003cd0: 8741 srai a4,a4,0x10 + 3003cd2: fdc42783 lw a5,-36(s0) + 3003cd6: 27bc lbu a5,10(a5) + 3003cd8: 86be mv a3,a5 + 3003cda: 4785 li a5,1 + 3003cdc: 00d797b3 sll a5,a5,a3 + 3003ce0: 07c2 slli a5,a5,0x10 + 3003ce2: 87c1 srai a5,a5,0x10 + 3003ce4: 8fd9 or a5,a5,a4 + 3003ce6: 07c2 slli a5,a5,0x10 + 3003ce8: 87c1 srai a5,a5,0x10 + 3003cea: 01079713 slli a4,a5,0x10 + 3003cee: 8341 srli a4,a4,0x10 + 3003cf0: fe442783 lw a5,-28(s0) + 3003cf4: 0742 slli a4,a4,0x10 + 3003cf6: 66c1 lui a3,0x10 + 3003cf8: 16fd addi a3,a3,-1 # ffff + 3003cfa: 8ff5 and a5,a5,a3 + 3003cfc: 8fd9 or a5,a5,a4 + 3003cfe: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3003d02: fe442703 lw a4,-28(s0) + 3003d06: fe842783 lw a5,-24(s0) + 3003d0a: c398 sw a4,0(a5) +} + 3003d0c: 0001 nop + 3003d0e: 50b2 lw ra,44(sp) + 3003d10: 5422 lw s0,40(sp) + 3003d12: 6145 addi sp,sp,48 + 3003d14: 8082 ret + +03003d16 : + * @brief Get Enable status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock Enable status + */ +static unsigned int CRG_IpWoClkSelEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003d16: 7179 addi sp,sp,-48 + 3003d18: d606 sw ra,44(sp) + 3003d1a: d422 sw s0,40(sp) + 3003d1c: 1800 addi s0,sp,48 + 3003d1e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003d22: fdc42783 lw a5,-36(s0) + 3003d26: eb89 bnez a5,3003d38 + 3003d28: 36500593 li a1,869 + 3003d2c: 030077b7 lui a5,0x3007 + 3003d30: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003d34: 20ad jal ra,3003d9e + 3003d36: a001 j 3003d36 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003d38: 040007b7 lui a5,0x4000 + 3003d3c: 4947a783 lw a5,1172(a5) # 4000494 + 3003d40: eb89 bnez a5,3003d52 + 3003d42: 36600593 li a1,870 + 3003d46: 030077b7 lui a5,0x3007 + 3003d4a: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003d4e: 2881 jal ra,3003d9e + 3003d50: a001 j 3003d50 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003d52: 040007b7 lui a5,0x4000 + 3003d56: 4947a783 lw a5,1172(a5) # 4000494 + 3003d5a: fef42623 sw a5,-20(s0) + /* Get enable status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003d5e: fdc42783 lw a5,-36(s0) + 3003d62: 279e lhu a5,8(a5) + 3003d64: 873e mv a4,a5 + 3003d66: fec42783 lw a5,-20(s0) + 3003d6a: 97ba add a5,a5,a4 + 3003d6c: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + + cfg.value = p->value; + 3003d70: fe842783 lw a5,-24(s0) + 3003d74: 439c lw a5,0(a5) + 3003d76: fef42223 sw a5,-28(s0) + return (cfg.BIT.clkEnMask & (1 << matchInfo->bitOffset)) == 0 ? false : true; + 3003d7a: fe442783 lw a5,-28(s0) + 3003d7e: 9fa1 uxth a5 + 3003d80: 873e mv a4,a5 + 3003d82: fdc42783 lw a5,-36(s0) + 3003d86: 27bc lbu a5,10(a5) + 3003d88: 40f757b3 sra a5,a4,a5 + 3003d8c: 8b85 andi a5,a5,1 + 3003d8e: 00f037b3 snez a5,a5 + 3003d92: 9f81 uxtb a5 +} + 3003d94: 853e mv a0,a5 + 3003d96: 50b2 lw ra,44(sp) + 3003d98: 5422 lw s0,40(sp) + 3003d9a: 6145 addi sp,sp,48 + 3003d9c: 8082 ret + +03003d9e : + 3003d9e: c48fe06f j 30021e6 + +03003da2 : + * @param matchInfo IP without Clock select match info + * @param reset BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelResetSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int reset) +{ + 3003da2: 7179 addi sp,sp,-48 + 3003da4: d606 sw ra,44(sp) + 3003da6: d422 sw s0,40(sp) + 3003da8: 1800 addi s0,sp,48 + 3003daa: fca42e23 sw a0,-36(s0) + 3003dae: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003db2: fdc42783 lw a5,-36(s0) + 3003db6: eb89 bnez a5,3003dc8 + 3003db8: 37900593 li a1,889 + 3003dbc: 030077b7 lui a5,0x3007 + 3003dc0: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003dc4: 3fe9 jal ra,3003d9e + 3003dc6: a001 j 3003dc6 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003dc8: 040007b7 lui a5,0x4000 + 3003dcc: 4947a783 lw a5,1172(a5) # 4000494 + 3003dd0: eb89 bnez a5,3003de2 + 3003dd2: 37a00593 li a1,890 + 3003dd6: 030077b7 lui a5,0x3007 + 3003dda: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003dde: 37c1 jal ra,3003d9e + 3003de0: a001 j 3003de0 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003de2: 040007b7 lui a5,0x4000 + 3003de6: 4947a783 lw a5,1172(a5) # 4000494 + 3003dea: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003dee: fdc42783 lw a5,-36(s0) + 3003df2: 279e lhu a5,8(a5) + 3003df4: 873e mv a4,a5 + 3003df6: fec42783 lw a5,-20(s0) + 3003dfa: 97ba add a5,a5,a4 + 3003dfc: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003e00: fe842783 lw a5,-24(s0) + 3003e04: 439c lw a5,0(a5) + 3003e06: fef42223 sw a5,-28(s0) + if (reset & BASE_CFG_SET) { + 3003e0a: fd842783 lw a5,-40(s0) + 3003e0e: 8b85 andi a5,a5,1 + 3003e10: c3a9 beqz a5,3003e52 + cfg.BIT.softResetReq |= 1 << matchInfo->bitOffset; /* reset of target ip. */ + 3003e12: fe442783 lw a5,-28(s0) + 3003e16: 83c1 srli a5,a5,0x10 + 3003e18: 9fa1 uxth a5 + 3003e1a: 01079713 slli a4,a5,0x10 + 3003e1e: 8741 srai a4,a4,0x10 + 3003e20: fdc42783 lw a5,-36(s0) + 3003e24: 27bc lbu a5,10(a5) + 3003e26: 86be mv a3,a5 + 3003e28: 4785 li a5,1 + 3003e2a: 00d797b3 sll a5,a5,a3 + 3003e2e: 07c2 slli a5,a5,0x10 + 3003e30: 87c1 srai a5,a5,0x10 + 3003e32: 8fd9 or a5,a5,a4 + 3003e34: 07c2 slli a5,a5,0x10 + 3003e36: 87c1 srai a5,a5,0x10 + 3003e38: 01079713 slli a4,a5,0x10 + 3003e3c: 8341 srli a4,a4,0x10 + 3003e3e: fe442783 lw a5,-28(s0) + 3003e42: 0742 slli a4,a4,0x10 + 3003e44: 66c1 lui a3,0x10 + 3003e46: 16fd addi a3,a3,-1 # ffff + 3003e48: 8ff5 and a5,a5,a3 + 3003e4a: 8fd9 or a5,a5,a4 + 3003e4c: fef42223 sw a5,-28(s0) + 3003e50: a0a1 j 3003e98 + } else { + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); /* Undo reset of target ip. */ + 3003e52: fe442783 lw a5,-28(s0) + 3003e56: 83c1 srli a5,a5,0x10 + 3003e58: 9fa1 uxth a5 + 3003e5a: 01079713 slli a4,a5,0x10 + 3003e5e: 8741 srai a4,a4,0x10 + 3003e60: fdc42783 lw a5,-36(s0) + 3003e64: 27bc lbu a5,10(a5) + 3003e66: 86be mv a3,a5 + 3003e68: 4785 li a5,1 + 3003e6a: 00d797b3 sll a5,a5,a3 + 3003e6e: 07c2 slli a5,a5,0x10 + 3003e70: 87c1 srai a5,a5,0x10 + 3003e72: fff7c793 not a5,a5 + 3003e76: 07c2 slli a5,a5,0x10 + 3003e78: 87c1 srai a5,a5,0x10 + 3003e7a: 8ff9 and a5,a5,a4 + 3003e7c: 07c2 slli a5,a5,0x10 + 3003e7e: 87c1 srai a5,a5,0x10 + 3003e80: 01079713 slli a4,a5,0x10 + 3003e84: 8341 srli a4,a4,0x10 + 3003e86: fe442783 lw a5,-28(s0) + 3003e8a: 0742 slli a4,a4,0x10 + 3003e8c: 66c1 lui a3,0x10 + 3003e8e: 16fd addi a3,a3,-1 # ffff + 3003e90: 8ff5 and a5,a5,a3 + 3003e92: 8fd9 or a5,a5,a4 + 3003e94: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3003e98: fe442703 lw a4,-28(s0) + 3003e9c: fe842783 lw a5,-24(s0) + 3003ea0: c398 sw a4,0(a5) +} + 3003ea2: 0001 nop + 3003ea4: 50b2 lw ra,44(sp) + 3003ea6: 5422 lw s0,40(sp) + 3003ea8: 6145 addi sp,sp,48 + 3003eaa: 8082 ret + +03003eac : + * @brief Get Reset status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock select reset status + */ +static unsigned int CRG_IpWoClkSelResetGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003eac: 7179 addi sp,sp,-48 + 3003eae: d606 sw ra,44(sp) + 3003eb0: d422 sw s0,40(sp) + 3003eb2: 1800 addi s0,sp,48 + 3003eb4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003eb8: fdc42783 lw a5,-36(s0) + 3003ebc: eb89 bnez a5,3003ece + 3003ebe: 38f00593 li a1,911 + 3003ec2: 030077b7 lui a5,0x3007 + 3003ec6: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003eca: 3dd1 jal ra,3003d9e + 3003ecc: a001 j 3003ecc + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003ece: 040007b7 lui a5,0x4000 + 3003ed2: 4947a783 lw a5,1172(a5) # 4000494 + 3003ed6: eb89 bnez a5,3003ee8 + 3003ed8: 39000593 li a1,912 + 3003edc: 030077b7 lui a5,0x3007 + 3003ee0: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003ee4: 3d6d jal ra,3003d9e + 3003ee6: a001 j 3003ee6 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003ee8: 040007b7 lui a5,0x4000 + 3003eec: 4947a783 lw a5,1172(a5) # 4000494 + 3003ef0: fef42623 sw a5,-20(s0) + /* Get the reset status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003ef4: fdc42783 lw a5,-36(s0) + 3003ef8: 279e lhu a5,8(a5) + 3003efa: 873e mv a4,a5 + 3003efc: fec42783 lw a5,-20(s0) + 3003f00: 97ba add a5,a5,a4 + 3003f02: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003f06: fe842783 lw a5,-24(s0) + 3003f0a: 439c lw a5,0(a5) + 3003f0c: fef42223 sw a5,-28(s0) + return (cfg.BIT.softResetReq & (1 << matchInfo->bitOffset)) ? BASE_CFG_SET : BASE_CFG_UNSET; + 3003f10: fe442783 lw a5,-28(s0) + 3003f14: 83c1 srli a5,a5,0x10 + 3003f16: 9fa1 uxth a5 + 3003f18: 873e mv a4,a5 + 3003f1a: fdc42783 lw a5,-36(s0) + 3003f1e: 27bc lbu a5,10(a5) + 3003f20: 40f757b3 sra a5,a4,a5 + 3003f24: 8b85 andi a5,a5,1 + 3003f26: 00f037b3 snez a5,a5 + 3003f2a: 9f81 uxtb a5 +} + 3003f2c: 853e mv a0,a5 + 3003f2e: 50b2 lw ra,44(sp) + 3003f30: 5422 lw s0,40(sp) + 3003f32: 6145 addi sp,sp,48 + 3003f34: 8082 ret + +03003f36 : + * @param matchInfo ADC match info + * @param enable IP_CLK_ENABLE + * @retval None + */ +static void CRG_AdcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003f36: 7179 addi sp,sp,-48 + 3003f38: d606 sw ra,44(sp) + 3003f3a: d422 sw s0,40(sp) + 3003f3c: 1800 addi s0,sp,48 + 3003f3e: fca42e23 sw a0,-36(s0) + 3003f42: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003f46: fdc42783 lw a5,-36(s0) + 3003f4a: eb89 bnez a5,3003f5c + 3003f4c: 3a200593 li a1,930 + 3003f50: 030077b7 lui a5,0x3007 + 3003f54: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003f58: 3599 jal ra,3003d9e + 3003f5a: a001 j 3003f5a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003f5c: 040007b7 lui a5,0x4000 + 3003f60: 4947a783 lw a5,1172(a5) # 4000494 + 3003f64: eb89 bnez a5,3003f76 + 3003f66: 3a300593 li a1,931 + 3003f6a: 030077b7 lui a5,0x3007 + 3003f6e: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003f72: 3535 jal ra,3003d9e + 3003f74: a001 j 3003f74 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003f76: 040007b7 lui a5,0x4000 + 3003f7a: 4947a783 lw a5,1172(a5) # 4000494 + 3003f7e: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003f82: fdc42783 lw a5,-36(s0) + 3003f86: 279e lhu a5,8(a5) + 3003f88: 873e mv a4,a5 + 3003f8a: fec42783 lw a5,-20(s0) + 3003f8e: 97ba add a5,a5,a4 + 3003f90: fef42423 sw a5,-24(s0) + CRG_AdcIpCfg cfg; + cfg.value[1] = p->value[1]; + 3003f94: fe842783 lw a5,-24(s0) + 3003f98: 43dc lw a5,4(a5) + 3003f9a: fef42223 sw a5,-28(s0) + if (enable) { /* Enables and Deassert reset the ADC clock. */ + 3003f9e: fd842783 lw a5,-40(s0) + 3003fa2: cf99 beqz a5,3003fc0 + cfg.BIT.clk_adc_cken = BASE_CFG_SET; + 3003fa4: fe442783 lw a5,-28(s0) + 3003fa8: 0017e793 ori a5,a5,1 + 3003fac: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003fb0: fe442783 lw a5,-28(s0) + 3003fb4: 7741 lui a4,0xffff0 + 3003fb6: 177d addi a4,a4,-1 # fffeffff + 3003fb8: 8ff9 and a5,a5,a4 + 3003fba: fef42223 sw a5,-28(s0) + 3003fbe: a829 j 3003fd8 + } else { /* Disable and reset the ADC clock. */ + cfg.BIT.clk_adc_cken = BASE_CFG_UNSET; + 3003fc0: fe442783 lw a5,-28(s0) + 3003fc4: 9bf9 andi a5,a5,-2 + 3003fc6: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003fca: fe442783 lw a5,-28(s0) + 3003fce: 7741 lui a4,0xffff0 + 3003fd0: 177d addi a4,a4,-1 # fffeffff + 3003fd2: 8ff9 and a5,a5,a4 + 3003fd4: fef42223 sw a5,-28(s0) + } + p->value[1] = cfg.value[1]; + 3003fd8: fe442703 lw a4,-28(s0) + 3003fdc: fe842783 lw a5,-24(s0) + 3003fe0: c3d8 sw a4,4(a5) +} + 3003fe2: 0001 nop + 3003fe4: 50b2 lw ra,44(sp) + 3003fe6: 5422 lw s0,40(sp) + 3003fe8: 6145 addi sp,sp,48 + 3003fea: 8082 ret + +03003fec : + * @brief Get Enable status of ADC + * @param matchInfo ADC match info + * @retval Cken of ADC + */ +static unsigned int CRG_AdcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003fec: 7179 addi sp,sp,-48 + 3003fee: d606 sw ra,44(sp) + 3003ff0: d422 sw s0,40(sp) + 3003ff2: 1800 addi s0,sp,48 + 3003ff4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003ff8: fdc42783 lw a5,-36(s0) + 3003ffc: eb89 bnez a5,300400e + 3003ffe: 3ba00593 li a1,954 + 3004002: 030077b7 lui a5,0x3007 + 3004006: 8a478513 addi a0,a5,-1884 # 30068a4 + 300400a: 3b51 jal ra,3003d9e + 300400c: a001 j 300400c + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300400e: 040007b7 lui a5,0x4000 + 3004012: 4947a783 lw a5,1172(a5) # 4000494 + 3004016: eb89 bnez a5,3004028 + 3004018: 3bb00593 li a1,955 + 300401c: 030077b7 lui a5,0x3007 + 3004020: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004024: 3bad jal ra,3003d9e + 3004026: a001 j 3004026 + unsigned int enable; + /* Get the enable status of the ADC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3004028: 040007b7 lui a5,0x4000 + 300402c: 4947a783 lw a5,1172(a5) # 4000494 + 3004030: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004034: fdc42783 lw a5,-36(s0) + 3004038: 279e lhu a5,8(a5) + 300403a: 873e mv a4,a5 + 300403c: fec42783 lw a5,-20(s0) + 3004040: 97ba add a5,a5,a4 + 3004042: fef42423 sw a5,-24(s0) + enable = ((p->BIT.clk_adc_cken != 0)) ? IP_CLK_ENABLE : IP_CLK_DISABLE; + 3004046: fe842783 lw a5,-24(s0) + 300404a: 43dc lw a5,4(a5) + 300404c: 8b85 andi a5,a5,1 + 300404e: 9f81 uxtb a5 + 3004050: c399 beqz a5,3004056 + 3004052: 4785 li a5,1 + 3004054: a011 j 3004058 + 3004056: 4781 li a5,0 + 3004058: fef42223 sw a5,-28(s0) + return enable; + 300405c: fe442783 lw a5,-28(s0) +} + 3004060: 853e mv a0,a5 + 3004062: 50b2 lw ra,44(sp) + 3004064: 5422 lw s0,40(sp) + 3004066: 6145 addi sp,sp,48 + 3004068: 8082 ret + +0300406a : + * @param matchInfo ADC match info + * @param clkSelect @see CRG_AdcClkSelect + * @retval None + */ +static void CRG_AdcClkSelectSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int clkSelect) +{ + 300406a: 7179 addi sp,sp,-48 + 300406c: d606 sw ra,44(sp) + 300406e: d422 sw s0,40(sp) + 3004070: 1800 addi s0,sp,48 + 3004072: fca42e23 sw a0,-36(s0) + 3004076: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300407a: fdc42783 lw a5,-36(s0) + 300407e: eb89 bnez a5,3004090 + 3004080: 3cc00593 li a1,972 + 3004084: 030077b7 lui a5,0x3007 + 3004088: 8a478513 addi a0,a5,-1884 # 30068a4 + 300408c: 3b09 jal ra,3003d9e + 300408e: a001 j 300408e + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004090: 040007b7 lui a5,0x4000 + 3004094: 4947a783 lw a5,1172(a5) # 4000494 + 3004098: eb89 bnez a5,30040aa + 300409a: 3cd00593 li a1,973 + 300409e: 030077b7 lui a5,0x3007 + 30040a2: 8a478513 addi a0,a5,-1884 # 30068a4 + 30040a6: 39e5 jal ra,3003d9e + 30040a8: a001 j 30040a8 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30040aa: 040007b7 lui a5,0x4000 + 30040ae: 4947a703 lw a4,1172(a5) # 4000494 + 30040b2: 100007b7 lui a5,0x10000 + 30040b6: 00f70a63 beq a4,a5,30040ca + 30040ba: 3ce00593 li a1,974 + 30040be: 030077b7 lui a5,0x3007 + 30040c2: 8a478513 addi a0,a5,-1884 # 30068a4 + 30040c6: 39e1 jal ra,3003d9e + 30040c8: a001 j 30040c8 + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkModeSelect(clkSelect)); + 30040ca: fd842503 lw a0,-40(s0) + 30040ce: ea1fe0ef jal ra,3002f6e + 30040d2: 87aa mv a5,a0 + 30040d4: 0017c793 xori a5,a5,1 + 30040d8: 9f81 uxtb a5 + 30040da: cb89 beqz a5,30040ec + 30040dc: 3cf00593 li a1,975 + 30040e0: 030077b7 lui a5,0x3007 + 30040e4: 8a478513 addi a0,a5,-1884 # 30068a4 + 30040e8: 395d jal ra,3003d9e + 30040ea: a89d j 3004160 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30040ec: 040007b7 lui a5,0x4000 + 30040f0: 4947a783 lw a5,1172(a5) # 4000494 + 30040f4: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 30040f8: fdc42783 lw a5,-36(s0) + 30040fc: 279e lhu a5,8(a5) + 30040fe: 873e mv a4,a5 + 3004100: fec42783 lw a5,-20(s0) + 3004104: 97ba add a5,a5,a4 + 3004106: fef42423 sw a5,-24(s0) + if (clkSelect == CRG_ADC_CLK_SYN_CORE) { + 300410a: fd842703 lw a4,-40(s0) + 300410e: 478d li a5,3 + 3004110: 00f71a63 bne a4,a5,3004124 + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_SET; /* use sync clock */ + 3004114: fe842703 lw a4,-24(s0) + 3004118: 435c lw a5,4(a4) + 300411a: 010006b7 lui a3,0x1000 + 300411e: 8fd5 or a5,a5,a3 + 3004120: c35c sw a5,4(a4) + 3004122: a83d j 3004160 + } else { + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3004124: b67fe0ef jal ra,3002c8a + g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel = clkSelect; /* write clock selection */ + 3004128: 040007b7 lui a5,0x4000 + 300412c: 4947a703 lw a4,1172(a5) # 4000494 + 3004130: fd842783 lw a5,-40(s0) + 3004134: 8b8d andi a5,a5,3 + 3004136: 0ff7f693 andi a3,a5,255 + 300413a: 10072783 lw a5,256(a4) + 300413e: 8a8d andi a3,a3,3 + 3004140: 0692 slli a3,a3,0x4 + 3004142: fcf7f793 andi a5,a5,-49 + 3004146: 8fd5 or a5,a5,a3 + 3004148: 10f72023 sw a5,256(a4) + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 300414c: b67fe0ef jal ra,3002cb2 + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_UNSET; + 3004150: fe842703 lw a4,-24(s0) + 3004154: 435c lw a5,4(a4) + 3004156: ff0006b7 lui a3,0xff000 + 300415a: 16fd addi a3,a3,-1 # feffffff + 300415c: 8ff5 and a5,a5,a3 + 300415e: c35c sw a5,4(a4) + } +} + 3004160: 50b2 lw ra,44(sp) + 3004162: 5422 lw s0,40(sp) + 3004164: 6145 addi sp,sp,48 + 3004166: 8082 ret + +03004168 : + * @brief Get ADC Clock Select + * @param matchInfo ADC match info + * @retval Adc Clock select @see CRG_AdcClkSelect + */ +static unsigned int CRG_AdcClkSelectGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3004168: 7179 addi sp,sp,-48 + 300416a: d606 sw ra,44(sp) + 300416c: d422 sw s0,40(sp) + 300416e: 1800 addi s0,sp,48 + 3004170: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004174: fdc42783 lw a5,-36(s0) + 3004178: eb89 bnez a5,300418a + 300417a: 3e400593 li a1,996 + 300417e: 030077b7 lui a5,0x3007 + 3004182: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004186: 3921 jal ra,3003d9e + 3004188: a001 j 3004188 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300418a: 040007b7 lui a5,0x4000 + 300418e: 4947a783 lw a5,1172(a5) # 4000494 + 3004192: eb89 bnez a5,30041a4 + 3004194: 3e500593 li a1,997 + 3004198: 030077b7 lui a5,0x3007 + 300419c: 8a478513 addi a0,a5,-1884 # 30068a4 + 30041a0: 3efd jal ra,3003d9e + 30041a2: a001 j 30041a2 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30041a4: 040007b7 lui a5,0x4000 + 30041a8: 4947a783 lw a5,1172(a5) # 4000494 + 30041ac: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 30041b0: fdc42783 lw a5,-36(s0) + 30041b4: 279e lhu a5,8(a5) + 30041b6: 873e mv a4,a5 + 30041b8: fec42783 lw a5,-20(s0) + 30041bc: 97ba add a5,a5,a4 + 30041be: fef42423 sw a5,-24(s0) + if (p->BIT.cfg_adc_ckmode_sel == BASE_CFG_SET) { + 30041c2: fe842783 lw a5,-24(s0) + 30041c6: 43dc lw a5,4(a5) + 30041c8: 83e1 srli a5,a5,0x18 + 30041ca: 8b85 andi a5,a5,1 + 30041cc: 0ff7f713 andi a4,a5,255 + 30041d0: 4785 li a5,1 + 30041d2: 00f71463 bne a4,a5,30041da + return CRG_ADC_CLK_SYN_CORE; /* Synchronous clock signal */ + 30041d6: 478d li a5,3 + 30041d8: a811 j 30041ec + } + return g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel; /* asynchronous clock signal */ + 30041da: 040007b7 lui a5,0x4000 + 30041de: 4947a783 lw a5,1172(a5) # 4000494 + 30041e2: 1007a783 lw a5,256(a5) + 30041e6: 8391 srli a5,a5,0x4 + 30041e8: 8b8d andi a5,a5,3 + 30041ea: 9f81 uxtb a5 +} + 30041ec: 853e mv a0,a5 + 30041ee: 50b2 lw ra,44(sp) + 30041f0: 5422 lw s0,40(sp) + 30041f2: 6145 addi sp,sp,48 + 30041f4: 8082 ret + +030041f6 : + * @param matchInfo ADC match info + * @param div Adc clock division + * @retval None + */ +static void CRG_AdcDivSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int div) +{ + 30041f6: 7179 addi sp,sp,-48 + 30041f8: d606 sw ra,44(sp) + 30041fa: d422 sw s0,40(sp) + 30041fc: 1800 addi s0,sp,48 + 30041fe: fca42e23 sw a0,-36(s0) + 3004202: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004206: fdc42783 lw a5,-36(s0) + 300420a: eb89 bnez a5,300421c + 300420c: 3f700593 li a1,1015 + 3004210: 030077b7 lui a5,0x3007 + 3004214: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004218: 3659 jal ra,3003d9e + 300421a: a001 j 300421a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300421c: 040007b7 lui a5,0x4000 + 3004220: 4947a783 lw a5,1172(a5) # 4000494 + 3004224: eb89 bnez a5,3004236 + 3004226: 3f800593 li a1,1016 + 300422a: 030077b7 lui a5,0x3007 + 300422e: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004232: 36b5 jal ra,3003d9e + 3004234: a001 j 3004234 + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkDiv(div)); + 3004236: fd842503 lw a0,-40(s0) + 300423a: d75fe0ef jal ra,3002fae + 300423e: 87aa mv a5,a0 + 3004240: 0017c793 xori a5,a5,1 + 3004244: 9f81 uxtb a5 + 3004246: cb89 beqz a5,3004258 + 3004248: 3f900593 li a1,1017 + 300424c: 030077b7 lui a5,0x3007 + 3004250: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004254: 36a9 jal ra,3003d9e + 3004256: a885 j 30042c6 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3004258: 040007b7 lui a5,0x4000 + 300425c: 4947a783 lw a5,1172(a5) # 4000494 + 3004260: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004264: fdc42783 lw a5,-36(s0) + 3004268: 279e lhu a5,8(a5) + 300426a: 873e mv a4,a5 + 300426c: fec42783 lw a5,-20(s0) + 3004270: 97ba add a5,a5,a4 + 3004272: fef42423 sw a5,-24(s0) + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3004276: fe842783 lw a5,-24(s0) + 300427a: 43dc lw a5,4(a5) + 300427c: 83e1 srli a5,a5,0x18 + 300427e: 8b85 andi a5,a5,1 + 3004280: 9f81 uxtb a5 + 3004282: fef42223 sw a5,-28(s0) + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3004286: fe442703 lw a4,-28(s0) + 300428a: 4785 li a5,1 + 300428c: 02f71163 bne a4,a5,30042ae + p->BIT.clk_adc_div1 = div; /* write div to I1 */ + 3004290: fd842783 lw a5,-40(s0) + 3004294: 8b8d andi a5,a5,3 + 3004296: 0ff7f693 andi a3,a5,255 + 300429a: fe842703 lw a4,-24(s0) + 300429e: 431c lw a5,0(a4) + 30042a0: 8a8d andi a3,a3,3 + 30042a2: 06a2 slli a3,a3,0x8 + 30042a4: cff7f793 andi a5,a5,-769 + 30042a8: 8fd5 or a5,a5,a3 + 30042aa: c31c sw a5,0(a4) + 30042ac: a829 j 30042c6 + } else { + p->BIT.clk_adc_div0 = div; /* write div to I0 */ + 30042ae: fd842783 lw a5,-40(s0) + 30042b2: 8b8d andi a5,a5,3 + 30042b4: 0ff7f693 andi a3,a5,255 + 30042b8: fe842703 lw a4,-24(s0) + 30042bc: 431c lw a5,0(a4) + 30042be: 8a8d andi a3,a3,3 + 30042c0: 9bf1 andi a5,a5,-4 + 30042c2: 8fd5 or a5,a5,a3 + 30042c4: c31c sw a5,0(a4) + } +} + 30042c6: 50b2 lw ra,44(sp) + 30042c8: 5422 lw s0,40(sp) + 30042ca: 6145 addi sp,sp,48 + 30042cc: 8082 ret + +030042ce : + * @brief Get ADC clock division + * @param matchInfo ADC match info + * @retval Adc clock division + */ +static unsigned int CRG_AdcDivGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30042ce: 7179 addi sp,sp,-48 + 30042d0: d606 sw ra,44(sp) + 30042d2: d422 sw s0,40(sp) + 30042d4: 1800 addi s0,sp,48 + 30042d6: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30042da: fdc42783 lw a5,-36(s0) + 30042de: eb89 bnez a5,30042f0 + 30042e0: 40c00593 li a1,1036 + 30042e4: 030077b7 lui a5,0x3007 + 30042e8: 8a478513 addi a0,a5,-1884 # 30068a4 + 30042ec: 3c4d jal ra,3003d9e + 30042ee: a001 j 30042ee + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30042f0: 040007b7 lui a5,0x4000 + 30042f4: 4947a783 lw a5,1172(a5) # 4000494 + 30042f8: eb89 bnez a5,300430a + 30042fa: 40d00593 li a1,1037 + 30042fe: 030077b7 lui a5,0x3007 + 3004302: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004306: 3c61 jal ra,3003d9e + 3004308: a001 j 3004308 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300430a: 040007b7 lui a5,0x4000 + 300430e: 4947a783 lw a5,1172(a5) # 4000494 + 3004312: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004316: fdc42783 lw a5,-36(s0) + 300431a: 279e lhu a5,8(a5) + 300431c: 873e mv a4,a5 + 300431e: fec42783 lw a5,-20(s0) + 3004322: 97ba add a5,a5,a4 + 3004324: fef42423 sw a5,-24(s0) + + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3004328: fe842783 lw a5,-24(s0) + 300432c: 43dc lw a5,4(a5) + 300432e: 83e1 srli a5,a5,0x18 + 3004330: 8b85 andi a5,a5,1 + 3004332: 9f81 uxtb a5 + 3004334: fef42223 sw a5,-28(s0) + + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3004338: fe442703 lw a4,-28(s0) + 300433c: 4785 li a5,1 + 300433e: 00f71963 bne a4,a5,3004350 + return p->BIT.clk_adc_div1; /* return div value I1 */ + 3004342: fe842783 lw a5,-24(s0) + 3004346: 439c lw a5,0(a5) + 3004348: 83a1 srli a5,a5,0x8 + 300434a: 8b8d andi a5,a5,3 + 300434c: 9f81 uxtb a5 + 300434e: a031 j 300435a + } + return p->BIT.clk_adc_div0; /* return div valye I0 */ + 3004350: fe842783 lw a5,-24(s0) + 3004354: 439c lw a5,0(a5) + 3004356: 8b8d andi a5,a5,3 + 3004358: 9f81 uxtb a5 +} + 300435a: 853e mv a0,a5 + 300435c: 50b2 lw ra,44(sp) + 300435e: 5422 lw s0,40(sp) + 3004360: 6145 addi sp,sp,48 + 3004362: 8082 ret + +03004364 : + * @brief Enable Clock of EFC + * @param matchInfo EFC match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_EfcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3004364: 7179 addi sp,sp,-48 + 3004366: d606 sw ra,44(sp) + 3004368: d422 sw s0,40(sp) + 300436a: 1800 addi s0,sp,48 + 300436c: fca42e23 sw a0,-36(s0) + 3004370: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004374: fdc42783 lw a5,-36(s0) + 3004378: eb89 bnez a5,300438a + 300437a: 42100593 li a1,1057 + 300437e: 030077b7 lui a5,0x3007 + 3004382: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004386: 3c21 jal ra,3003d9e + 3004388: a001 j 3004388 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300438a: 040007b7 lui a5,0x4000 + 300438e: 4947a783 lw a5,1172(a5) # 4000494 + 3004392: eb89 bnez a5,30043a4 + 3004394: 42200593 li a1,1058 + 3004398: 030077b7 lui a5,0x3007 + 300439c: 8a478513 addi a0,a5,-1884 # 30068a4 + 30043a0: 3afd jal ra,3003d9e + 30043a2: a001 j 30043a2 + /* Enables or disables EFC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30043a4: 040007b7 lui a5,0x4000 + 30043a8: 4947a783 lw a5,1172(a5) # 4000494 + 30043ac: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 30043b0: fdc42783 lw a5,-36(s0) + 30043b4: 279e lhu a5,8(a5) + 30043b6: 873e mv a4,a5 + 30043b8: fec42783 lw a5,-20(s0) + 30043bc: 97ba add a5,a5,a4 + 30043be: fef42423 sw a5,-24(s0) + p->BIT.eflash_cken = (enable & IP_CLK_ENABLE) ? BASE_CFG_SET : BASE_CFG_UNSET; + 30043c2: fd842783 lw a5,-40(s0) + 30043c6: 8b85 andi a5,a5,1 + 30043c8: 0ff7f693 andi a3,a5,255 + 30043cc: fe842703 lw a4,-24(s0) + 30043d0: 431c lw a5,0(a4) + 30043d2: 8a85 andi a3,a3,1 + 30043d4: 9bf9 andi a5,a5,-2 + 30043d6: 8fd5 or a5,a5,a3 + 30043d8: c31c sw a5,0(a4) +} + 30043da: 0001 nop + 30043dc: 50b2 lw ra,44(sp) + 30043de: 5422 lw s0,40(sp) + 30043e0: 6145 addi sp,sp,48 + 30043e2: 8082 ret + +030043e4 : + * @brief Disable Clock of EFC + * @param matchInfo EFC match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_EfcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30043e4: 7179 addi sp,sp,-48 + 30043e6: d606 sw ra,44(sp) + 30043e8: d422 sw s0,40(sp) + 30043ea: 1800 addi s0,sp,48 + 30043ec: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30043f0: fdc42783 lw a5,-36(s0) + 30043f4: eb89 bnez a5,3004406 + 30043f6: 43000593 li a1,1072 + 30043fa: 030077b7 lui a5,0x3007 + 30043fe: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004402: 3a71 jal ra,3003d9e + 3004404: a001 j 3004404 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004406: 040007b7 lui a5,0x4000 + 300440a: 4947a783 lw a5,1172(a5) # 4000494 + 300440e: eb89 bnez a5,3004420 + 3004410: 43100593 li a1,1073 + 3004414: 030077b7 lui a5,0x3007 + 3004418: 8a478513 addi a0,a5,-1884 # 30068a4 + 300441c: 3249 jal ra,3003d9e + 300441e: a001 j 300441e + /* Get the value of the EFC register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3004420: 040007b7 lui a5,0x4000 + 3004424: 4947a783 lw a5,1172(a5) # 4000494 + 3004428: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 300442c: fdc42783 lw a5,-36(s0) + 3004430: 279e lhu a5,8(a5) + 3004432: 873e mv a4,a5 + 3004434: fec42783 lw a5,-20(s0) + 3004438: 97ba add a5,a5,a4 + 300443a: fef42423 sw a5,-24(s0) + return p->BIT.eflash_cken; + 300443e: fe842783 lw a5,-24(s0) + 3004442: 439c lw a5,0(a5) + 3004444: 8b85 andi a5,a5,1 + 3004446: 9f81 uxtb a5 +} + 3004448: 853e mv a0,a5 + 300444a: 50b2 lw ra,44(sp) + 300444c: 5422 lw s0,40(sp) + 300444e: 6145 addi sp,sp,48 + 3004450: 8082 ret + +03004452 : + * @brief Enable Clock of ANA + * @param matchInfo ANA match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_AnaEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3004452: 7179 addi sp,sp,-48 + 3004454: d606 sw ra,44(sp) + 3004456: d422 sw s0,40(sp) + 3004458: 1800 addi s0,sp,48 + 300445a: fca42e23 sw a0,-36(s0) + 300445e: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004462: fdc42783 lw a5,-36(s0) + 3004466: eb89 bnez a5,3004478 + 3004468: 44000593 li a1,1088 + 300446c: 030077b7 lui a5,0x3007 + 3004470: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004474: 322d jal ra,3003d9e + 3004476: a001 j 3004476 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004478: 040007b7 lui a5,0x4000 + 300447c: 4947a783 lw a5,1172(a5) # 4000494 + 3004480: eb89 bnez a5,3004492 + 3004482: 44100593 li a1,1089 + 3004486: 030077b7 lui a5,0x3007 + 300448a: 8a478513 addi a0,a5,-1884 # 30068a4 + 300448e: 3a01 jal ra,3003d9e + 3004490: a001 j 3004490 + CRG_PARAM_CHECK_NO_RET(enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE); + 3004492: fd842703 lw a4,-40(s0) + 3004496: 4785 li a5,1 + 3004498: 00f70d63 beq a4,a5,30044b2 + 300449c: fd842783 lw a5,-40(s0) + 30044a0: cb89 beqz a5,30044b2 + 30044a2: 44200593 li a1,1090 + 30044a6: 030077b7 lui a5,0x3007 + 30044aa: 8a478513 addi a0,a5,-1884 # 30068a4 + 30044ae: 38c5 jal ra,3003d9e + 30044b0: a20d j 30045d2 + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30044b2: 040007b7 lui a5,0x4000 + 30044b6: 4947a783 lw a5,1172(a5) # 4000494 + 30044ba: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 30044be: fdc42783 lw a5,-36(s0) + 30044c2: 279e lhu a5,8(a5) + 30044c4: 873e mv a4,a5 + 30044c6: fec42783 lw a5,-20(s0) + 30044ca: 97ba add a5,a5,a4 + 30044cc: fdc42703 lw a4,-36(s0) + 30044d0: 2738 lbu a4,10(a4) + 30044d2: 97ba add a5,a5,a4 + 30044d4: fef42423 sw a5,-24(s0) + + if ((enable == IP_CLK_ENABLE) && (p->BIT.ip_srst_req == BASE_CFG_SET)) { + 30044d8: fd842703 lw a4,-40(s0) + 30044dc: 4785 li a5,1 + 30044de: 02f71f63 bne a4,a5,300451c + 30044e2: fe842783 lw a5,-24(s0) + 30044e6: 439c lw a5,0(a5) + 30044e8: 83c1 srli a5,a5,0x10 + 30044ea: 8b85 andi a5,a5,1 + 30044ec: 0ff7f713 andi a4,a5,255 + 30044f0: 4785 li a5,1 + 30044f2: 02f71563 bne a4,a5,300451c + p->BIT.ip_srst_req = BASE_CFG_UNSET; + 30044f6: fe842703 lw a4,-24(s0) + 30044fa: 431c lw a5,0(a4) + 30044fc: 76c1 lui a3,0xffff0 + 30044fe: 16fd addi a3,a3,-1 # fffeffff + 3004500: 8ff5 and a5,a5,a3 + 3004502: c31c sw a5,0(a4) + g_anaEnableFlag++; /* count enable analog IP number */ + 3004504: 040007b7 lui a5,0x4000 + 3004508: 4987c783 lbu a5,1176(a5) # 4000498 + 300450c: 0785 addi a5,a5,1 + 300450e: 0ff7f713 andi a4,a5,255 + 3004512: 040007b7 lui a5,0x4000 + 3004516: 48e78c23 sb a4,1176(a5) # 4000498 + 300451a: a089 j 300455c + } else if ((enable == IP_CLK_DISABLE) && (p->BIT.ip_srst_req == BASE_CFG_UNSET)) { + 300451c: fd842783 lw a5,-40(s0) + 3004520: ef95 bnez a5,300455c + 3004522: fe842783 lw a5,-24(s0) + 3004526: 439c lw a5,0(a5) + 3004528: 83c1 srli a5,a5,0x10 + 300452a: 8b85 andi a5,a5,1 + 300452c: 9f81 uxtb a5 + 300452e: e79d bnez a5,300455c + p->BIT.ip_srst_req = BASE_CFG_SET; + 3004530: fe842703 lw a4,-24(s0) + 3004534: 431c lw a5,0(a4) + 3004536: 66c1 lui a3,0x10 + 3004538: 8fd5 or a5,a5,a3 + 300453a: c31c sw a5,0(a4) + if (g_anaEnableFlag > 0) { + 300453c: 040007b7 lui a5,0x4000 + 3004540: 4987c783 lbu a5,1176(a5) # 4000498 + 3004544: cf81 beqz a5,300455c + g_anaEnableFlag--; /* Decreasing the count to enable the analog IP number. */ + 3004546: 040007b7 lui a5,0x4000 + 300454a: 4987c783 lbu a5,1176(a5) # 4000498 + 300454e: 17fd addi a5,a5,-1 + 3004550: 0ff7f713 andi a4,a5,255 + 3004554: 040007b7 lui a5,0x4000 + 3004558: 48e78c23 sb a4,1176(a5) # 4000498 + } + } + + if ((g_anaEnableFlag == 0) && (enable == IP_CLK_DISABLE)) { /* all analog clock disable */ + 300455c: 040007b7 lui a5,0x4000 + 3004560: 4987c783 lbu a5,1176(a5) # 4000498 + 3004564: eb85 bnez a5,3004594 + 3004566: fd842783 lw a5,-40(s0) + 300456a: e78d bnez a5,3004594 + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_UNSET; + 300456c: 10000737 lui a4,0x10000 + 3004570: 6785 lui a5,0x1 + 3004572: 973e add a4,a4,a5 + 3004574: a5072783 lw a5,-1456(a4) # ffffa50 + 3004578: 9bf9 andi a5,a5,-2 + 300457a: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_SET; + 300457e: 10000737 lui a4,0x10000 + 3004582: 6785 lui a5,0x1 + 3004584: 973e add a4,a4,a5 + 3004586: a5072783 lw a5,-1456(a4) # ffffa50 + 300458a: 66c1 lui a3,0x10 + 300458c: 8fd5 or a5,a5,a3 + 300458e: a4f72823 sw a5,-1456(a4) + 3004592: a081 j 30045d2 + } else if ((g_anaEnableFlag > 0) && (enable == IP_CLK_ENABLE)) { /* all analog clock enable */ + 3004594: 040007b7 lui a5,0x4000 + 3004598: 4987c783 lbu a5,1176(a5) # 4000498 + 300459c: cb9d beqz a5,30045d2 + 300459e: fd842703 lw a4,-40(s0) + 30045a2: 4785 li a5,1 + 30045a4: 02f71763 bne a4,a5,30045d2 + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_UNSET; + 30045a8: 10000737 lui a4,0x10000 + 30045ac: 6785 lui a5,0x1 + 30045ae: 973e add a4,a4,a5 + 30045b0: a5072783 lw a5,-1456(a4) # ffffa50 + 30045b4: 76c1 lui a3,0xffff0 + 30045b6: 16fd addi a3,a3,-1 # fffeffff + 30045b8: 8ff5 and a5,a5,a3 + 30045ba: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_SET; + 30045be: 10000737 lui a4,0x10000 + 30045c2: 6785 lui a5,0x1 + 30045c4: 973e add a4,a4,a5 + 30045c6: a5072783 lw a5,-1456(a4) # ffffa50 + 30045ca: 0017e793 ori a5,a5,1 + 30045ce: a4f72823 sw a5,-1456(a4) + } +} + 30045d2: 50b2 lw ra,44(sp) + 30045d4: 5422 lw s0,40(sp) + 30045d6: 6145 addi sp,sp,48 + 30045d8: 8082 ret + +030045da : + * @brief Get Clock of ANA + * @param matchInfo ANA match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_AnaEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30045da: 7179 addi sp,sp,-48 + 30045dc: d606 sw ra,44(sp) + 30045de: d422 sw s0,40(sp) + 30045e0: 1800 addi s0,sp,48 + 30045e2: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30045e6: fdc42783 lw a5,-36(s0) + 30045ea: eb91 bnez a5,30045fe + 30045ec: 46200593 li a1,1122 + 30045f0: 030077b7 lui a5,0x3007 + 30045f4: 8a478513 addi a0,a5,-1884 # 30068a4 + 30045f8: beffd0ef jal ra,30021e6 + 30045fc: a001 j 30045fc + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30045fe: 040007b7 lui a5,0x4000 + 3004602: 4947a783 lw a5,1172(a5) # 4000494 + 3004606: eb91 bnez a5,300461a + 3004608: 46300593 li a1,1123 + 300460c: 030077b7 lui a5,0x3007 + 3004610: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004614: bd3fd0ef jal ra,30021e6 + 3004618: a001 j 3004618 + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300461a: 040007b7 lui a5,0x4000 + 300461e: 4947a783 lw a5,1172(a5) # 4000494 + 3004622: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 3004626: fdc42783 lw a5,-36(s0) + 300462a: 279e lhu a5,8(a5) + 300462c: 873e mv a4,a5 + 300462e: fec42783 lw a5,-20(s0) + 3004632: 97ba add a5,a5,a4 + 3004634: fdc42703 lw a4,-36(s0) + 3004638: 2738 lbu a4,10(a4) + 300463a: 97ba add a5,a5,a4 + 300463c: fef42423 sw a5,-24(s0) + /* The clock is enabled based on the IP reset status. */ + return (p->BIT.ip_srst_req) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3004640: fe842783 lw a5,-24(s0) + 3004644: 439c lw a5,0(a5) + 3004646: 83c1 srli a5,a5,0x10 + 3004648: 8b85 andi a5,a5,1 + 300464a: 9f81 uxtb a5 + 300464c: 0017c793 xori a5,a5,1 + 3004650: 9f81 uxtb a5 +} + 3004652: 853e mv a0,a5 + 3004654: 50b2 lw ra,44(sp) + 3004656: 5422 lw s0,40(sp) + 3004658: 6145 addi sp,sp,48 + 300465a: 8082 ret + +0300465c : + * @brief Write a character to the UART port. + * @param ch The int promotion of the character to be written. + * @retval None. + */ +static void DBG_PrintCh(unsigned int ch) +{ + 300465c: 1101 addi sp,sp,-32 + 300465e: ce22 sw s0,28(sp) + 3004660: 1000 addi s0,sp,32 + 3004662: fea42623 sw a0,-20(s0) + while (DBG_PRINTF_UART_PORT->UART_FR.BIT.txff == 1) { + 3004666: 0001 nop + 3004668: 140007b7 lui a5,0x14000 + 300466c: 4f9c lw a5,24(a5) + 300466e: 8395 srli a5,a5,0x5 + 3004670: 8b85 andi a5,a5,1 + 3004672: 0ff7f713 andi a4,a5,255 + 3004676: 4785 li a5,1 + 3004678: fef708e3 beq a4,a5,3004668 + ; + } + DBG_PRINTF_UART_PORT->UART_DR.BIT.data = (unsigned char)ch; + 300467c: 14000737 lui a4,0x14000 + 3004680: fec42783 lw a5,-20(s0) + 3004684: 0ff7f693 andi a3,a5,255 + 3004688: 431c lw a5,0(a4) + 300468a: 0ff6f693 andi a3,a3,255 + 300468e: f007f793 andi a5,a5,-256 + 3004692: 8fd5 or a5,a5,a3 + 3004694: c31c sw a5,0(a4) +} + 3004696: 0001 nop + 3004698: 4472 lw s0,28(sp) + 300469a: 6105 addi sp,sp,32 + 300469c: 8082 ret + +0300469e : + * @param str The string to be printed. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, a BASE_STATUS_ERROR is returned. + */ +static int DBG_PrintStr(const char *str) +{ + 300469e: 7179 addi sp,sp,-48 + 30046a0: d606 sw ra,44(sp) + 30046a2: d422 sw s0,40(sp) + 30046a4: 1800 addi s0,sp,48 + 30046a6: fca42e23 sw a0,-36(s0) + DEBUG_ASSERT_PARAM(str != NULL); + int cnt = 0; + 30046aa: fe042623 sw zero,-20(s0) + while (*str != '\0') { + 30046ae: a00d j 30046d0 + DBG_PrintCh(*str); + 30046b0: fdc42783 lw a5,-36(s0) + 30046b4: 00078783 lb a5,0(a5) # 14000000 + 30046b8: 853e mv a0,a5 + 30046ba: 374d jal ra,300465c + str++; + 30046bc: fdc42783 lw a5,-36(s0) + 30046c0: 0785 addi a5,a5,1 + 30046c2: fcf42e23 sw a5,-36(s0) + cnt++; + 30046c6: fec42783 lw a5,-20(s0) + 30046ca: 0785 addi a5,a5,1 + 30046cc: fef42623 sw a5,-20(s0) + while (*str != '\0') { + 30046d0: fdc42783 lw a5,-36(s0) + 30046d4: 00078783 lb a5,0(a5) + 30046d8: ffe1 bnez a5,30046b0 + } + return cnt; + 30046da: fec42783 lw a5,-20(s0) +} + 30046de: 853e mv a0,a5 + 30046e0: 50b2 lw ra,44(sp) + 30046e2: 5422 lw s0,40(sp) + 30046e4: 6145 addi sp,sp,48 + 30046e6: 8082 ret + +030046e8 : + * @param base Base value. + * @param exponent Exponent value. + * @retval unsigned long The result of raising base to the power exponent. + */ +static unsigned long DBG_Pow(unsigned int base, unsigned int exponent) +{ + 30046e8: 7179 addi sp,sp,-48 + 30046ea: d622 sw s0,44(sp) + 30046ec: 1800 addi s0,sp,48 + 30046ee: fca42e23 sw a0,-36(s0) + 30046f2: fcb42c23 sw a1,-40(s0) + unsigned long ret = 1; + 30046f6: 4785 li a5,1 + 30046f8: fef42623 sw a5,-20(s0) + while (exponent--) { + 30046fc: a809 j 300470e + ret *= base; + 30046fe: fec42703 lw a4,-20(s0) + 3004702: fdc42783 lw a5,-36(s0) + 3004706: 02f707b3 mul a5,a4,a5 + 300470a: fef42623 sw a5,-20(s0) + while (exponent--) { + 300470e: fd842783 lw a5,-40(s0) + 3004712: fff78713 addi a4,a5,-1 + 3004716: fce42c23 sw a4,-40(s0) + 300471a: f3f5 bnez a5,30046fe + } + return ret; /* ret = base ^ exponent */ + 300471c: fec42783 lw a5,-20(s0) +} + 3004720: 853e mv a0,a5 + 3004722: 5432 lw s0,44(sp) + 3004724: 6145 addi sp,sp,48 + 3004726: 8082 ret + +03004728 : + * @param num The number to be counted. + * @param base The number base of num. + * @retval unsigned int The number of digits. + */ +static unsigned int DBG_CountDigits(int num, NumBase base) +{ + 3004728: 7179 addi sp,sp,-48 + 300472a: d622 sw s0,44(sp) + 300472c: 1800 addi s0,sp,48 + 300472e: fca42e23 sw a0,-36(s0) + 3004732: fcb42c23 sw a1,-40(s0) + unsigned int cnt = 0; + 3004736: fe042623 sw zero,-20(s0) + if (base == 0) { + 300473a: fd842783 lw a5,-40(s0) + 300473e: e78d bnez a5,3004768 + return 0; + 3004740: 4781 li a5,0 + 3004742: a099 j 3004788 + } + while (num != 0) { + cnt++; + 3004744: fec42783 lw a5,-20(s0) + 3004748: 0785 addi a5,a5,1 + 300474a: fef42623 sw a5,-20(s0) + if (cnt > MAX_DIV_TIMES) { + 300474e: fec42703 lw a4,-20(s0) + 3004752: 47fd li a5,31 + 3004754: 00e7ee63 bltu a5,a4,3004770 + break; + } + num /= base; + 3004758: fdc42703 lw a4,-36(s0) + 300475c: fd842783 lw a5,-40(s0) + 3004760: 02f757b3 divu a5,a4,a5 + 3004764: fcf42e23 sw a5,-36(s0) + while (num != 0) { + 3004768: fdc42783 lw a5,-36(s0) + 300476c: ffe1 bnez a5,3004744 + 300476e: a011 j 3004772 + break; + 3004770: 0001 nop + } + cnt = (cnt == 0) ? 1 : cnt; + 3004772: fec42783 lw a5,-20(s0) + 3004776: c781 beqz a5,300477e + 3004778: fec42783 lw a5,-20(s0) + 300477c: a011 j 3004780 + 300477e: 4785 li a5,1 + 3004780: fef42623 sw a5,-20(s0) + return cnt; + 3004784: fec42783 lw a5,-20(s0) +} + 3004788: 853e mv a0,a5 + 300478a: 5432 lw s0,44(sp) + 300478c: 6145 addi sp,sp,48 + 300478e: 8082 ret + +03004790 : + * @param num The unsigned number to be printed. + * @param base The number base of num. + * @param digits The digits of num. + */ +static void DBG_PutUnsignedNum(unsigned int num, NumBase base, unsigned int digits) +{ + 3004790: 7179 addi sp,sp,-48 + 3004792: d606 sw ra,44(sp) + 3004794: d422 sw s0,40(sp) + 3004796: 1800 addi s0,sp,48 + 3004798: fca42e23 sw a0,-36(s0) + 300479c: fcb42c23 sw a1,-40(s0) + 30047a0: fcc42a23 sw a2,-44(s0) + unsigned char ch; + while (digits != 0) { + 30047a4: a069 j 300482e + ch = num / DBG_Pow(base, digits - 1); + 30047a6: fd442783 lw a5,-44(s0) + 30047aa: 17fd addi a5,a5,-1 + 30047ac: 85be mv a1,a5 + 30047ae: fd842503 lw a0,-40(s0) + 30047b2: 3f1d jal ra,30046e8 + 30047b4: 872a mv a4,a0 + 30047b6: fdc42783 lw a5,-36(s0) + 30047ba: 02e7d7b3 divu a5,a5,a4 + 30047be: fef407a3 sb a5,-17(s0) + num %= DBG_Pow(base, digits - 1); + 30047c2: fd442783 lw a5,-44(s0) + 30047c6: 17fd addi a5,a5,-1 + 30047c8: 85be mv a1,a5 + 30047ca: fd842503 lw a0,-40(s0) + 30047ce: 3f29 jal ra,30046e8 + 30047d0: 872a mv a4,a0 + 30047d2: fdc42783 lw a5,-36(s0) + 30047d6: 02e7f7b3 remu a5,a5,a4 + 30047da: fcf42e23 sw a5,-36(s0) + if (base == DECIMAL) { + 30047de: fd842703 lw a4,-40(s0) + 30047e2: 47a9 li a5,10 + 30047e4: 00f71963 bne a4,a5,30047f6 + DBG_PrintCh(ch + '0'); + 30047e8: fef44783 lbu a5,-17(s0) + 30047ec: 03078793 addi a5,a5,48 + 30047f0: 853e mv a0,a5 + 30047f2: 35ad jal ra,300465c + 30047f4: a805 j 3004824 + } else if (base == HEXADECIMAL) { + 30047f6: fd842703 lw a4,-40(s0) + 30047fa: 47c1 li a5,16 + 30047fc: 02f71d63 bne a4,a5,3004836 + if (ch < DECIMAL_BASE) { + 3004800: fef44703 lbu a4,-17(s0) + 3004804: 47a5 li a5,9 + 3004806: 00e7e963 bltu a5,a4,3004818 + DBG_PrintCh(ch + '0'); + 300480a: fef44783 lbu a5,-17(s0) + 300480e: 03078793 addi a5,a5,48 + 3004812: 853e mv a0,a5 + 3004814: 35a1 jal ra,300465c + 3004816: a039 j 3004824 + } else { + DBG_PrintCh(ch - DECIMAL_BASE + 'A'); + 3004818: fef44783 lbu a5,-17(s0) + 300481c: 03778793 addi a5,a5,55 + 3004820: 853e mv a0,a5 + 3004822: 3d2d jal ra,300465c + } + } else { + break; + } + digits--; + 3004824: fd442783 lw a5,-44(s0) + 3004828: 17fd addi a5,a5,-1 + 300482a: fcf42a23 sw a5,-44(s0) + while (digits != 0) { + 300482e: fd442783 lw a5,-44(s0) + 3004832: fbb5 bnez a5,30047a6 + } +} + 3004834: a011 j 3004838 + break; + 3004836: 0001 nop +} + 3004838: 0001 nop + 300483a: 50b2 lw ra,44(sp) + 300483c: 5422 lw s0,40(sp) + 300483e: 6145 addi sp,sp,48 + 3004840: 8082 ret + +03004842 : + * @brief Print decimal number through UART port. + * @param intNum The decimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintInt(int intNum) +{ + 3004842: 7179 addi sp,sp,-48 + 3004844: d606 sw ra,44(sp) + 3004846: d422 sw s0,40(sp) + 3004848: 1800 addi s0,sp,48 + 300484a: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (intNum == 0) { + 300484e: fdc42783 lw a5,-36(s0) + 3004852: e791 bnez a5,300485e + DBG_PrintCh('0'); + 3004854: 03000513 li a0,48 + 3004858: 3511 jal ra,300465c + return 1; + 300485a: 4785 li a5,1 + 300485c: a82d j 3004896 + } + if (intNum < 0) { + 300485e: fdc42783 lw a5,-36(s0) + 3004862: 0007db63 bgez a5,3004878 + DBG_PrintCh('-'); + 3004866: 02d00513 li a0,45 + 300486a: 3bcd jal ra,300465c + intNum = -intNum; + 300486c: fdc42783 lw a5,-36(s0) + 3004870: 40f007b3 neg a5,a5 + 3004874: fcf42e23 sw a5,-36(s0) + } + cnt = DBG_CountDigits(intNum, DECIMAL); + 3004878: 45a9 li a1,10 + 300487a: fdc42503 lw a0,-36(s0) + 300487e: 356d jal ra,3004728 + 3004880: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(intNum, DECIMAL, cnt); + 3004884: fdc42783 lw a5,-36(s0) + 3004888: fec42603 lw a2,-20(s0) + 300488c: 45a9 li a1,10 + 300488e: 853e mv a0,a5 + 3004890: 3701 jal ra,3004790 + return cnt; + 3004892: fec42783 lw a5,-20(s0) +} + 3004896: 853e mv a0,a5 + 3004898: 50b2 lw ra,44(sp) + 300489a: 5422 lw s0,40(sp) + 300489c: 6145 addi sp,sp,48 + 300489e: 8082 ret + +030048a0 : + * @brief Print hexadecimal number through UART port. + * @param hexNum The hexadecimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintHex(unsigned int hexNum) +{ + 30048a0: 7179 addi sp,sp,-48 + 30048a2: d606 sw ra,44(sp) + 30048a4: d422 sw s0,40(sp) + 30048a6: 1800 addi s0,sp,48 + 30048a8: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (hexNum == 0) { + 30048ac: fdc42783 lw a5,-36(s0) + 30048b0: e791 bnez a5,30048bc + DBG_PrintCh('0'); + 30048b2: 03000513 li a0,48 + 30048b6: 335d jal ra,300465c + return 1; + 30048b8: 4785 li a5,1 + 30048ba: a005 j 30048da + } + cnt = DBG_CountDigits(hexNum, HEXADECIMAL); + 30048bc: fdc42783 lw a5,-36(s0) + 30048c0: 45c1 li a1,16 + 30048c2: 853e mv a0,a5 + 30048c4: 3595 jal ra,3004728 + 30048c6: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(hexNum, HEXADECIMAL, cnt); + 30048ca: fec42603 lw a2,-20(s0) + 30048ce: 45c1 li a1,16 + 30048d0: fdc42503 lw a0,-36(s0) + 30048d4: 3d75 jal ra,3004790 + return cnt; + 30048d6: fec42783 lw a5,-20(s0) +} + 30048da: 853e mv a0,a5 + 30048dc: 50b2 lw ra,44(sp) + 30048de: 5422 lw s0,40(sp) + 30048e0: 6145 addi sp,sp,48 + 30048e2: 8082 ret + +030048e4 : + * @brief Print floating-point number through UART port. + * @param fltNum The floating-point number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintFlt(float fltNum, unsigned int precision) +{ + 30048e4: 7139 addi sp,sp,-64 + 30048e6: de06 sw ra,60(sp) + 30048e8: dc22 sw s0,56(sp) + 30048ea: 0080 addi s0,sp,64 + 30048ec: fca42627 fsw fa0,-52(s0) + 30048f0: fca42423 sw a0,-56(s0) + unsigned int cnt = 0; + 30048f4: fe042623 sw zero,-20(s0) + unsigned int floatScale; + + if (fltNum < 0) { + 30048f8: fcc42787 flw fa5,-52(s0) + 30048fc: f0000753 fmv.w.x fa4,zero + 3004900: a0e797d3 flt.s a5,fa5,fa4 + 3004904: cf99 beqz a5,3004922 + DBG_PrintCh('-'); + 3004906: 02d00513 li a0,45 + 300490a: 3b89 jal ra,300465c + cnt += 1; + 300490c: fec42783 lw a5,-20(s0) + 3004910: 0785 addi a5,a5,1 + 3004912: fef42623 sw a5,-20(s0) + fltNum = -fltNum; + 3004916: fcc42787 flw fa5,-52(s0) + 300491a: 20f797d3 fneg.s fa5,fa5 + 300491e: fcf42627 fsw fa5,-52(s0) + } + int integerVal = (int)fltNum; + 3004922: fcc42787 flw fa5,-52(s0) + 3004926: c00797d3 fcvt.w.s a5,fa5,rtz + 300492a: fef42023 sw a5,-32(s0) + floatScale = DBG_Pow(10, (precision + 1)); /* 10: decimal */ + 300492e: fc842783 lw a5,-56(s0) + 3004932: 0785 addi a5,a5,1 + 3004934: 85be mv a1,a5 + 3004936: 4529 li a0,10 + 3004938: 3b45 jal ra,30046e8 + 300493a: fca42e23 sw a0,-36(s0) + int floatVal = (long)(floatScale * (fltNum - integerVal)); + 300493e: fdc42783 lw a5,-36(s0) + 3004942: d017f753 fcvt.s.wu fa4,a5 + 3004946: fe042783 lw a5,-32(s0) + 300494a: d007f7d3 fcvt.s.w fa5,a5 + 300494e: fcc42687 flw fa3,-52(s0) + 3004952: 08f6f7d3 fsub.s fa5,fa3,fa5 + 3004956: 10f777d3 fmul.s fa5,fa4,fa5 + 300495a: c00797d3 fcvt.w.s a5,fa5,rtz + 300495e: fef42423 sw a5,-24(s0) + /* Half-adjust: round up or round down */ + if (floatVal % DECIMAL_BASE >= HALF_ADJUST_BOUNDARY) { + 3004962: fe842703 lw a4,-24(s0) + 3004966: 47a9 li a5,10 + 3004968: 02f77733 remu a4,a4,a5 + 300496c: 4791 li a5,4 + 300496e: 00e7fb63 bgeu a5,a4,3004984 + floatVal = floatVal / DECIMAL_BASE + 1; + 3004972: fe842703 lw a4,-24(s0) + 3004976: 47a9 li a5,10 + 3004978: 02f757b3 divu a5,a4,a5 + 300497c: 0785 addi a5,a5,1 + 300497e: fef42423 sw a5,-24(s0) + 3004982: a801 j 3004992 + } else { + floatVal = floatVal / DECIMAL_BASE; + 3004984: fe842703 lw a4,-24(s0) + 3004988: 47a9 li a5,10 + 300498a: 02f757b3 divu a5,a4,a5 + 300498e: fef42423 sw a5,-24(s0) + } + cnt += DBG_PrintInt(integerVal); + 3004992: fe042503 lw a0,-32(s0) + 3004996: 3575 jal ra,3004842 + 3004998: 872a mv a4,a0 + 300499a: fec42783 lw a5,-20(s0) + 300499e: 97ba add a5,a5,a4 + 30049a0: fef42623 sw a5,-20(s0) + DBG_PrintCh('.'); + 30049a4: 02e00513 li a0,46 + 30049a8: 3955 jal ra,300465c + cnt += 1; + 30049aa: fec42783 lw a5,-20(s0) + 30049ae: 0785 addi a5,a5,1 + 30049b0: fef42623 sw a5,-20(s0) + /* Pad 0 in float part */ + unsigned int fltCnt = DBG_CountDigits(floatVal, DECIMAL); + 30049b4: 45a9 li a1,10 + 30049b6: fe842503 lw a0,-24(s0) + 30049ba: 33bd jal ra,3004728 + 30049bc: fca42c23 sw a0,-40(s0) + if (precision > fltCnt) { + 30049c0: fc842703 lw a4,-56(s0) + 30049c4: fd842783 lw a5,-40(s0) + 30049c8: 02e7f763 bgeu a5,a4,30049f6 + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 30049cc: fe042223 sw zero,-28(s0) + 30049d0: a809 j 30049e2 + DBG_PrintCh('0'); /* add '0' */ + 30049d2: 03000513 li a0,48 + 30049d6: 3159 jal ra,300465c + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 30049d8: fe442783 lw a5,-28(s0) + 30049dc: 0785 addi a5,a5,1 + 30049de: fef42223 sw a5,-28(s0) + 30049e2: fc842703 lw a4,-56(s0) + 30049e6: fd842783 lw a5,-40(s0) + 30049ea: 40f707b3 sub a5,a4,a5 + 30049ee: fe442703 lw a4,-28(s0) + 30049f2: fef760e3 bltu a4,a5,30049d2 + } + } + DBG_PutUnsignedNum(floatVal, DECIMAL, fltCnt); /* print unsigned number */ + 30049f6: fe842783 lw a5,-24(s0) + 30049fa: fd842603 lw a2,-40(s0) + 30049fe: 45a9 li a1,10 + 3004a00: 853e mv a0,a5 + 3004a02: 3379 jal ra,3004790 + cnt += precision; + 3004a04: fec42703 lw a4,-20(s0) + 3004a08: fc842783 lw a5,-56(s0) + 3004a0c: 97ba add a5,a5,a4 + 3004a0e: fef42623 sw a5,-20(s0) + return cnt; + 3004a12: fec42783 lw a5,-20(s0) +} + 3004a16: 853e mv a0,a5 + 3004a18: 50f2 lw ra,60(sp) + 3004a1a: 5462 lw s0,56(sp) + 3004a1c: 6121 addi sp,sp,64 + 3004a1e: 8082 ret + +03004a20 : + * @param ch The format specifier. + * @param paramList The pointer of the variable parameter list. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int ParseSpecifier(const char ch, va_list *paramList) +{ + 3004a20: 7139 addi sp,sp,-64 + 3004a22: de06 sw ra,60(sp) + 3004a24: dc22 sw s0,56(sp) + 3004a26: 0080 addi s0,sp,64 + 3004a28: 87aa mv a5,a0 + 3004a2a: fcb42423 sw a1,-56(s0) + 3004a2e: fcf407a3 sb a5,-49(s0) + unsigned int cnt = 0; + 3004a32: fe042623 sw zero,-20(s0) + unsigned int tmpCnt; + char chVal = 0; + 3004a36: fe0405a3 sb zero,-21(s0) + const char *strVal = NULL; + 3004a3a: fe042223 sw zero,-28(s0) + int intVal = 0; + 3004a3e: fe042023 sw zero,-32(s0) + unsigned int unsignedVal = 0; + 3004a42: fc042e23 sw zero,-36(s0) + unsigned int hexVal = 0; + 3004a46: fc042c23 sw zero,-40(s0) + float fltVal = 0; + 3004a4a: fc042a23 sw zero,-44(s0) + switch (ch) { + 3004a4e: fcf40783 lb a5,-49(s0) + 3004a52: fa878793 addi a5,a5,-88 + 3004a56: 02000713 li a4,32 + 3004a5a: 14f76063 bltu a4,a5,3004b9a + 3004a5e: 00279713 slli a4,a5,0x2 + 3004a62: 030077b7 lui a5,0x3007 + 3004a66: 8f878793 addi a5,a5,-1800 # 30068f8 + 3004a6a: 97ba add a5,a5,a4 + 3004a6c: 439c lw a5,0(a5) + 3004a6e: 8782 jr a5 + case 'c': /* Character format data. */ + chVal = VA_ARG(*paramList, int); /* Use type int because of byte alignment */ + 3004a70: fc842783 lw a5,-56(s0) + 3004a74: 439c lw a5,0(a5) + 3004a76: 00478693 addi a3,a5,4 + 3004a7a: fc842703 lw a4,-56(s0) + 3004a7e: c314 sw a3,0(a4) + 3004a80: 439c lw a5,0(a5) + 3004a82: fef405a3 sb a5,-21(s0) + DBG_PrintCh(chVal); + 3004a86: feb40783 lb a5,-21(s0) + 3004a8a: 853e mv a0,a5 + 3004a8c: 3ec1 jal ra,300465c + cnt += 1; + 3004a8e: fec42783 lw a5,-20(s0) + 3004a92: 0785 addi a5,a5,1 + 3004a94: fef42623 sw a5,-20(s0) + break; + 3004a98: aa19 j 3004bae + case 's': /* String format data. */ + strVal = VA_ARG(*paramList, const char *); + 3004a9a: fc842783 lw a5,-56(s0) + 3004a9e: 439c lw a5,0(a5) + 3004aa0: 00478693 addi a3,a5,4 + 3004aa4: fc842703 lw a4,-56(s0) + 3004aa8: c314 sw a3,0(a4) + 3004aaa: 439c lw a5,0(a5) + 3004aac: fef42223 sw a5,-28(s0) + cnt += DBG_PrintStr(strVal); + 3004ab0: fe442503 lw a0,-28(s0) + 3004ab4: 36ed jal ra,300469e + 3004ab6: 87aa mv a5,a0 + 3004ab8: 873e mv a4,a5 + 3004aba: fec42783 lw a5,-20(s0) + 3004abe: 97ba add a5,a5,a4 + 3004ac0: fef42623 sw a5,-20(s0) + break; + 3004ac4: a0ed j 3004bae + case 'd': /* Integer decimal data. */ + intVal = VA_ARG(*paramList, int); + 3004ac6: fc842783 lw a5,-56(s0) + 3004aca: 439c lw a5,0(a5) + 3004acc: 00478693 addi a3,a5,4 + 3004ad0: fc842703 lw a4,-56(s0) + 3004ad4: c314 sw a3,0(a4) + 3004ad6: 439c lw a5,0(a5) + 3004ad8: fef42023 sw a5,-32(s0) + cnt += DBG_PrintInt(intVal); + 3004adc: fe042503 lw a0,-32(s0) + 3004ae0: 338d jal ra,3004842 + 3004ae2: 872a mv a4,a0 + 3004ae4: fec42783 lw a5,-20(s0) + 3004ae8: 97ba add a5,a5,a4 + 3004aea: fef42623 sw a5,-20(s0) + break; + 3004aee: a0c1 j 3004bae + case 'u': /* Unsigned decimal data. */ + unsignedVal = VA_ARG(*paramList, unsigned int); + 3004af0: fc842783 lw a5,-56(s0) + 3004af4: 439c lw a5,0(a5) + 3004af6: 00478693 addi a3,a5,4 + 3004afa: fc842703 lw a4,-56(s0) + 3004afe: c314 sw a3,0(a4) + 3004b00: 439c lw a5,0(a5) + 3004b02: fcf42e23 sw a5,-36(s0) + tmpCnt = DBG_CountDigits(unsignedVal, DECIMAL); + 3004b06: fdc42783 lw a5,-36(s0) + 3004b0a: 45a9 li a1,10 + 3004b0c: 853e mv a0,a5 + 3004b0e: 3929 jal ra,3004728 + 3004b10: fca42823 sw a0,-48(s0) + DBG_PutUnsignedNum(unsignedVal, DECIMAL, tmpCnt); + 3004b14: fd042603 lw a2,-48(s0) + 3004b18: 45a9 li a1,10 + 3004b1a: fdc42503 lw a0,-36(s0) + 3004b1e: 398d jal ra,3004790 + cnt += tmpCnt; + 3004b20: fec42703 lw a4,-20(s0) + 3004b24: fd042783 lw a5,-48(s0) + 3004b28: 97ba add a5,a5,a4 + 3004b2a: fef42623 sw a5,-20(s0) + break; + 3004b2e: a041 j 3004bae + case 'x': /* Hexadecimal data. */ + case 'X': + case 'p': /* Address data. */ + hexVal = VA_ARG(*paramList, unsigned int); + 3004b30: fc842783 lw a5,-56(s0) + 3004b34: 439c lw a5,0(a5) + 3004b36: 00478693 addi a3,a5,4 + 3004b3a: fc842703 lw a4,-56(s0) + 3004b3e: c314 sw a3,0(a4) + 3004b40: 439c lw a5,0(a5) + 3004b42: fcf42c23 sw a5,-40(s0) + cnt += DBG_PrintHex(hexVal); + 3004b46: fd842503 lw a0,-40(s0) + 3004b4a: 3b99 jal ra,30048a0 + 3004b4c: 872a mv a4,a0 + 3004b4e: fec42783 lw a5,-20(s0) + 3004b52: 97ba add a5,a5,a4 + 3004b54: fef42623 sw a5,-20(s0) + break; + 3004b58: a899 j 3004bae + case 'f': /* Floating-point data. */ + fltVal = VA_ARG(*paramList, double); + 3004b5a: fc842783 lw a5,-56(s0) + 3004b5e: 439c lw a5,0(a5) + 3004b60: 079d addi a5,a5,7 + 3004b62: 9be1 andi a5,a5,-8 + 3004b64: 00878693 addi a3,a5,8 + 3004b68: fc842703 lw a4,-56(s0) + 3004b6c: c314 sw a3,0(a4) + 3004b6e: 0047a803 lw a6,4(a5) + 3004b72: 439c lw a5,0(a5) + 3004b74: 853e mv a0,a5 + 3004b76: 85c2 mv a1,a6 + 3004b78: 7b0010ef jal ra,3006328 <__truncdfsf2> + 3004b7c: 20a507d3 fmv.s fa5,fa0 + 3004b80: fcf42a27 fsw fa5,-44(s0) + cnt += DBG_PrintFlt(fltVal, 5); /* default precision: 5 */ + 3004b84: 4515 li a0,5 + 3004b86: fd442507 flw fa0,-44(s0) + 3004b8a: 3ba9 jal ra,30048e4 + 3004b8c: 872a mv a4,a0 + 3004b8e: fec42783 lw a5,-20(s0) + 3004b92: 97ba add a5,a5,a4 + 3004b94: fef42623 sw a5,-20(s0) + break; + 3004b98: a819 j 3004bae + default: + DBG_PrintCh(ch); + 3004b9a: fcf40783 lb a5,-49(s0) + 3004b9e: 853e mv a0,a5 + 3004ba0: 3c75 jal ra,300465c + cnt += 1; + 3004ba2: fec42783 lw a5,-20(s0) + 3004ba6: 0785 addi a5,a5,1 + 3004ba8: fef42623 sw a5,-20(s0) + break; + 3004bac: 0001 nop + } + return cnt; + 3004bae: fec42783 lw a5,-20(s0) +} + 3004bb2: 853e mv a0,a5 + 3004bb4: 50f2 lw ra,60(sp) + 3004bb6: 5462 lw s0,56(sp) + 3004bb8: 6121 addi sp,sp,64 + 3004bba: 8082 ret + +03004bbc : + * @param intNum The decimal number to be printed. + * @param fieldWidth Field width. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintIntWithField(int intNum, int fieldWidth) +{ + 3004bbc: 7139 addi sp,sp,-64 + 3004bbe: de06 sw ra,60(sp) + 3004bc0: dc22 sw s0,56(sp) + 3004bc2: 0080 addi s0,sp,64 + 3004bc4: fca42623 sw a0,-52(s0) + 3004bc8: fcb42423 sw a1,-56(s0) + int zeroCnt = 0; + 3004bcc: fc042e23 sw zero,-36(s0) + int digitsCnt = 0; + 3004bd0: fe042623 sw zero,-20(s0) + unsigned int cnt = 0; + 3004bd4: fe042423 sw zero,-24(s0) + + if (intNum == 0) { + 3004bd8: fcc42783 lw a5,-52(s0) + 3004bdc: e791 bnez a5,3004be8 + DBG_PrintCh('0'); + 3004bde: 03000513 li a0,48 + 3004be2: 3cad jal ra,300465c + return 1; + 3004be4: 4785 li a5,1 + 3004be6: a0dd j 3004ccc + } + if (intNum < 0) { + 3004be8: fcc42783 lw a5,-52(s0) + 3004bec: 0607dd63 bgez a5,3004c66 + DBG_PrintCh('-'); /* add symbol */ + 3004bf0: 02d00513 li a0,45 + 3004bf4: 34a5 jal ra,300465c + cnt++; + 3004bf6: fe842783 lw a5,-24(s0) + 3004bfa: 0785 addi a5,a5,1 + 3004bfc: fef42423 sw a5,-24(s0) + intNum = -intNum; + 3004c00: fcc42783 lw a5,-52(s0) + 3004c04: 40f007b3 neg a5,a5 + 3004c08: fcf42623 sw a5,-52(s0) + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 3004c0c: 45a9 li a1,10 + 3004c0e: fcc42503 lw a0,-52(s0) + 3004c12: 3e19 jal ra,3004728 + 3004c14: 87aa mv a5,a0 + 3004c16: fef42623 sw a5,-20(s0) + zeroCnt = fieldWidth - digitsCnt; + 3004c1a: fc842703 lw a4,-56(s0) + 3004c1e: fec42783 lw a5,-20(s0) + 3004c22: 40f707b3 sub a5,a4,a5 + 3004c26: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004c2a: fe042223 sw zero,-28(s0) + 3004c2e: a831 j 3004c4a + DBG_PrintCh('0'); /* add '0' */ + 3004c30: 03000513 li a0,48 + 3004c34: 3425 jal ra,300465c + cnt++; + 3004c36: fe842783 lw a5,-24(s0) + 3004c3a: 0785 addi a5,a5,1 + 3004c3c: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004c40: fe442783 lw a5,-28(s0) + 3004c44: 0785 addi a5,a5,1 + 3004c46: fef42223 sw a5,-28(s0) + 3004c4a: fe442703 lw a4,-28(s0) + 3004c4e: fdc42783 lw a5,-36(s0) + 3004c52: fcf74fe3 blt a4,a5,3004c30 + } + cnt += digitsCnt; + 3004c56: fec42783 lw a5,-20(s0) + 3004c5a: fe842703 lw a4,-24(s0) + 3004c5e: 97ba add a5,a5,a4 + 3004c60: fef42423 sw a5,-24(s0) + 3004c64: a891 j 3004cb8 + } else { + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 3004c66: 45a9 li a1,10 + 3004c68: fcc42503 lw a0,-52(s0) + 3004c6c: 3c75 jal ra,3004728 + 3004c6e: 87aa mv a5,a0 + 3004c70: fef42623 sw a5,-20(s0) + cnt = digitsCnt; + 3004c74: fec42783 lw a5,-20(s0) + 3004c78: fef42423 sw a5,-24(s0) + zeroCnt = fieldWidth - digitsCnt; + 3004c7c: fc842703 lw a4,-56(s0) + 3004c80: fec42783 lw a5,-20(s0) + 3004c84: 40f707b3 sub a5,a4,a5 + 3004c88: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004c8c: fe042023 sw zero,-32(s0) + 3004c90: a831 j 3004cac + DBG_PrintCh('0'); /* add '0' */ + 3004c92: 03000513 li a0,48 + 3004c96: 32d9 jal ra,300465c + cnt++; + 3004c98: fe842783 lw a5,-24(s0) + 3004c9c: 0785 addi a5,a5,1 + 3004c9e: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004ca2: fe042783 lw a5,-32(s0) + 3004ca6: 0785 addi a5,a5,1 + 3004ca8: fef42023 sw a5,-32(s0) + 3004cac: fe042703 lw a4,-32(s0) + 3004cb0: fdc42783 lw a5,-36(s0) + 3004cb4: fcf74fe3 blt a4,a5,3004c92 + } + } + DBG_PutUnsignedNum(intNum, DECIMAL, digitsCnt); + 3004cb8: fcc42783 lw a5,-52(s0) + 3004cbc: fec42703 lw a4,-20(s0) + 3004cc0: 863a mv a2,a4 + 3004cc2: 45a9 li a1,10 + 3004cc4: 853e mv a0,a5 + 3004cc6: 34e9 jal ra,3004790 + return cnt; + 3004cc8: fe842783 lw a5,-24(s0) +} + 3004ccc: 853e mv a0,a5 + 3004cce: 50f2 lw ra,60(sp) + 3004cd0: 5462 lw s0,56(sp) + 3004cd2: 6121 addi sp,sp,64 + 3004cd4: 8082 ret + +03004cd6 : + +static int DBG_Atoi(const char **s) +{ + 3004cd6: 7179 addi sp,sp,-48 + 3004cd8: d622 sw s0,44(sp) + 3004cda: 1800 addi s0,sp,48 + 3004cdc: fca42e23 sw a0,-36(s0) + int i, c; + + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 3004ce0: fe042623 sw zero,-20(s0) + 3004ce4: a02d j 3004d0e + i = i * 10 + c - '0'; /* 10: decimal */ + 3004ce6: fec42703 lw a4,-20(s0) + 3004cea: 47a9 li a5,10 + 3004cec: 02f70733 mul a4,a4,a5 + 3004cf0: fe842783 lw a5,-24(s0) + 3004cf4: 97ba add a5,a5,a4 + 3004cf6: fd078793 addi a5,a5,-48 + 3004cfa: fef42623 sw a5,-20(s0) + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 3004cfe: fdc42783 lw a5,-36(s0) + 3004d02: 439c lw a5,0(a5) + 3004d04: 00178713 addi a4,a5,1 + 3004d08: fdc42783 lw a5,-36(s0) + 3004d0c: c398 sw a4,0(a5) + 3004d0e: fdc42783 lw a5,-36(s0) + 3004d12: 439c lw a5,0(a5) + 3004d14: 00078783 lb a5,0(a5) + 3004d18: fef42423 sw a5,-24(s0) + 3004d1c: fe842703 lw a4,-24(s0) + 3004d20: 02f00793 li a5,47 + 3004d24: 00e7d863 bge a5,a4,3004d34 + 3004d28: fe842703 lw a4,-24(s0) + 3004d2c: 03900793 li a5,57 + 3004d30: fae7dbe3 bge a5,a4,3004ce6 + } + return i; + 3004d34: fec42783 lw a5,-20(s0) +} + 3004d38: 853e mv a0,a5 + 3004d3a: 5432 lw s0,44(sp) + 3004d3c: 6145 addi sp,sp,48 + 3004d3e: 8082 ret + +03004d40 : + * @param ... Variable parameter list. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, return BASE_STATUS_ERROR. + */ +int DBG_UartPrintf(const char *format, ...) +{ + 3004d40: 711d addi sp,sp,-96 + 3004d42: de06 sw ra,60(sp) + 3004d44: dc22 sw s0,56(sp) + 3004d46: 0080 addi s0,sp,64 + 3004d48: fca42623 sw a0,-52(s0) + 3004d4c: c04c sw a1,4(s0) + 3004d4e: c410 sw a2,8(s0) + 3004d50: c454 sw a3,12(s0) + 3004d52: c818 sw a4,16(s0) + 3004d54: c85c sw a5,20(s0) + 3004d56: 01042c23 sw a6,24(s0) + 3004d5a: 01142e23 sw a7,28(s0) + DEBUG_ASSERT_PARAM(format != NULL); + int cnt = 0; + 3004d5e: fe042623 sw zero,-20(s0) + int fieldWidth = 0; + 3004d62: fe042423 sw zero,-24(s0) + int floatPrecision = 0; + 3004d66: fe042223 sw zero,-28(s0) + float fltVal = 0; + 3004d6a: fe042023 sw zero,-32(s0) + int intVal = 0; + 3004d6e: fc042e23 sw zero,-36(s0) + va_list paramList; + VA_START(paramList, format); + 3004d72: 02040793 addi a5,s0,32 + 3004d76: 1791 addi a5,a5,-28 + 3004d78: fcf42c23 sw a5,-40(s0) + + while (*format != '\0') { + 3004d7c: aa09 j 3004e8e + if (*format != '%') { + 3004d7e: fcc42783 lw a5,-52(s0) + 3004d82: 00078703 lb a4,0(a5) + 3004d86: 02500793 li a5,37 + 3004d8a: 00f70e63 beq a4,a5,3004da6 + DBG_PrintCh(*format); + 3004d8e: fcc42783 lw a5,-52(s0) + 3004d92: 00078783 lb a5,0(a5) + 3004d96: 853e mv a0,a5 + 3004d98: 30d1 jal ra,300465c + cnt += 1; + 3004d9a: fec42783 lw a5,-20(s0) + 3004d9e: 0785 addi a5,a5,1 + 3004da0: fef42623 sw a5,-20(s0) + 3004da4: a0c5 j 3004e84 + } else { + format++; + 3004da6: fcc42783 lw a5,-52(s0) + 3004daa: 0785 addi a5,a5,1 + 3004dac: fcf42623 sw a5,-52(s0) + if (*format == '0') { + 3004db0: fcc42783 lw a5,-52(s0) + 3004db4: 00078703 lb a4,0(a5) + 3004db8: 03000793 li a5,48 + 3004dbc: 04f71263 bne a4,a5,3004e00 + format++; + 3004dc0: fcc42783 lw a5,-52(s0) + 3004dc4: 0785 addi a5,a5,1 + 3004dc6: fcf42623 sw a5,-52(s0) + fieldWidth = DBG_Atoi(&format); + 3004dca: fcc40793 addi a5,s0,-52 + 3004dce: 853e mv a0,a5 + 3004dd0: 3719 jal ra,3004cd6 + 3004dd2: fea42423 sw a0,-24(s0) + intVal = VA_ARG(paramList, int); + 3004dd6: fd842783 lw a5,-40(s0) + 3004dda: 00478713 addi a4,a5,4 + 3004dde: fce42c23 sw a4,-40(s0) + 3004de2: 439c lw a5,0(a5) + 3004de4: fcf42e23 sw a5,-36(s0) + cnt += DBG_PrintIntWithField(intVal, fieldWidth); + 3004de8: fe842583 lw a1,-24(s0) + 3004dec: fdc42503 lw a0,-36(s0) + 3004df0: 33f1 jal ra,3004bbc + 3004df2: 872a mv a4,a0 + 3004df4: fec42783 lw a5,-20(s0) + 3004df8: 97ba add a5,a5,a4 + 3004dfa: fef42623 sw a5,-20(s0) + 3004dfe: a059 j 3004e84 + } else if (*format == '.') { + 3004e00: fcc42783 lw a5,-52(s0) + 3004e04: 00078703 lb a4,0(a5) + 3004e08: 02e00793 li a5,46 + 3004e0c: 04f71d63 bne a4,a5,3004e66 + format++; + 3004e10: fcc42783 lw a5,-52(s0) + 3004e14: 0785 addi a5,a5,1 + 3004e16: fcf42623 sw a5,-52(s0) + floatPrecision = DBG_Atoi(&format); + 3004e1a: fcc40793 addi a5,s0,-52 + 3004e1e: 853e mv a0,a5 + 3004e20: 3d5d jal ra,3004cd6 + 3004e22: fea42223 sw a0,-28(s0) + fltVal = VA_ARG(paramList, double); + 3004e26: fd842783 lw a5,-40(s0) + 3004e2a: 079d addi a5,a5,7 + 3004e2c: 9be1 andi a5,a5,-8 + 3004e2e: 00878713 addi a4,a5,8 + 3004e32: fce42c23 sw a4,-40(s0) + 3004e36: 0047a803 lw a6,4(a5) + 3004e3a: 439c lw a5,0(a5) + 3004e3c: 853e mv a0,a5 + 3004e3e: 85c2 mv a1,a6 + 3004e40: 4e8010ef jal ra,3006328 <__truncdfsf2> + 3004e44: 20a507d3 fmv.s fa5,fa0 + 3004e48: fef42027 fsw fa5,-32(s0) + cnt += DBG_PrintFlt(fltVal, floatPrecision); + 3004e4c: fe442783 lw a5,-28(s0) + 3004e50: 853e mv a0,a5 + 3004e52: fe042507 flw fa0,-32(s0) + 3004e56: 3479 jal ra,30048e4 + 3004e58: 872a mv a4,a0 + 3004e5a: fec42783 lw a5,-20(s0) + 3004e5e: 97ba add a5,a5,a4 + 3004e60: fef42623 sw a5,-20(s0) + 3004e64: a005 j 3004e84 + } else { + cnt += ParseSpecifier(*format, ¶mList); + 3004e66: fcc42783 lw a5,-52(s0) + 3004e6a: 00078783 lb a5,0(a5) + 3004e6e: fd840713 addi a4,s0,-40 + 3004e72: 85ba mv a1,a4 + 3004e74: 853e mv a0,a5 + 3004e76: 366d jal ra,3004a20 + 3004e78: 872a mv a4,a0 + 3004e7a: fec42783 lw a5,-20(s0) + 3004e7e: 97ba add a5,a5,a4 + 3004e80: fef42623 sw a5,-20(s0) + } + } + format++; + 3004e84: fcc42783 lw a5,-52(s0) + 3004e88: 0785 addi a5,a5,1 + 3004e8a: fcf42623 sw a5,-52(s0) + while (*format != '\0') { + 3004e8e: fcc42783 lw a5,-52(s0) + 3004e92: 00078783 lb a5,0(a5) + 3004e96: ee0794e3 bnez a5,3004d7e + } + VA_END(paramList); + return cnt; + 3004e9a: fec42783 lw a5,-20(s0) +} + 3004e9e: 853e mv a0,a5 + 3004ea0: 50f2 lw ra,60(sp) + 3004ea2: 5462 lw s0,56(sp) + 3004ea4: 6125 addi sp,sp,96 + 3004ea6: 8082 ret + +03004ea8 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param regValue value of @ref IOCMG_REG. + * @retval None. + */ +static inline void DCL_IOCMG_SetRegValue(IOCMG_REG *iocmgRegx, unsigned int regValue) +{ + 3004ea8: 1101 addi sp,sp,-32 + 3004eaa: ce06 sw ra,28(sp) + 3004eac: cc22 sw s0,24(sp) + 3004eae: 1000 addi s0,sp,32 + 3004eb0: fea42623 sw a0,-20(s0) + 3004eb4: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004eb8: fec42703 lw a4,-20(s0) + 3004ebc: 77c1 lui a5,0xffff0 + 3004ebe: 8f7d and a4,a4,a5 + 3004ec0: 147f07b7 lui a5,0x147f0 + 3004ec4: 00f70a63 beq a4,a5,3004ed8 + 3004ec8: 08b00593 li a1,139 + 3004ecc: 030077b7 lui a5,0x3007 + 3004ed0: 97c78513 addi a0,a5,-1668 # 300697c + 3004ed4: 2df1 jal ra,30055b0 + 3004ed6: a001 j 3004ed6 + iocmgRegx->reg = regValue; + 3004ed8: fec42783 lw a5,-20(s0) + 3004edc: fe842703 lw a4,-24(s0) + 3004ee0: c398 sw a4,0(a5) +} + 3004ee2: 0001 nop + 3004ee4: 40f2 lw ra,28(sp) + 3004ee6: 4462 lw s0,24(sp) + 3004ee8: 6105 addi sp,sp,32 + 3004eea: 8082 ret + +03004eec : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param driveRate value of @ref IOCMG_DriveRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetDriveRate(IOCMG_REG *iocmgRegx, IOCMG_DriveRate driveRate) +{ + 3004eec: 1101 addi sp,sp,-32 + 3004eee: ce06 sw ra,28(sp) + 3004ef0: cc22 sw s0,24(sp) + 3004ef2: 1000 addi s0,sp,32 + 3004ef4: fea42623 sw a0,-20(s0) + 3004ef8: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004efc: fec42703 lw a4,-20(s0) + 3004f00: 77c1 lui a5,0xffff0 + 3004f02: 8f7d and a4,a4,a5 + 3004f04: 147f07b7 lui a5,0x147f0 + 3004f08: 00f70a63 beq a4,a5,3004f1c + 3004f0c: 0ba00593 li a1,186 + 3004f10: 030077b7 lui a5,0x3007 + 3004f14: 97c78513 addi a0,a5,-1668 # 300697c + 3004f18: 2d61 jal ra,30055b0 + 3004f1a: a001 j 3004f1a + IOCMG_PARAM_CHECK_NO_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4); + 3004f1c: fe842703 lw a4,-24(s0) + 3004f20: 478d li a5,3 + 3004f22: 00e7fa63 bgeu a5,a4,3004f36 + 3004f26: 0bb00593 li a1,187 + 3004f2a: 030077b7 lui a5,0x3007 + 3004f2e: 97c78513 addi a0,a5,-1668 # 300697c + 3004f32: 2dbd jal ra,30055b0 + 3004f34: a839 j 3004f52 + iocmgRegx->BIT.ds = driveRate; + 3004f36: fe842783 lw a5,-24(s0) + 3004f3a: 8b8d andi a5,a5,3 + 3004f3c: 0ff7f693 andi a3,a5,255 + 3004f40: fec42703 lw a4,-20(s0) + 3004f44: 431c lw a5,0(a4) + 3004f46: 8a8d andi a3,a3,3 + 3004f48: 0692 slli a3,a3,0x4 + 3004f4a: fcf7f793 andi a5,a5,-49 + 3004f4e: 8fd5 or a5,a5,a3 + 3004f50: c31c sw a5,0(a4) +} + 3004f52: 40f2 lw ra,28(sp) + 3004f54: 4462 lw s0,24(sp) + 3004f56: 6105 addi sp,sp,32 + 3004f58: 8082 ret + +03004f5a : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param pullMode value of @ref IOCMG_PullMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetPullMode(IOCMG_REG *iocmgRegx, IOCMG_PullMode pullMode) +{ + 3004f5a: 1101 addi sp,sp,-32 + 3004f5c: ce06 sw ra,28(sp) + 3004f5e: cc22 sw s0,24(sp) + 3004f60: 1000 addi s0,sp,32 + 3004f62: fea42623 sw a0,-20(s0) + 3004f66: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004f6a: fec42703 lw a4,-20(s0) + 3004f6e: 77c1 lui a5,0xffff0 + 3004f70: 8f7d and a4,a4,a5 + 3004f72: 147f07b7 lui a5,0x147f0 + 3004f76: 00f70a63 beq a4,a5,3004f8a + 3004f7a: 0d200593 li a1,210 + 3004f7e: 030077b7 lui a5,0x3007 + 3004f82: 97c78513 addi a0,a5,-1668 # 300697c + 3004f86: 252d jal ra,30055b0 + 3004f88: a001 j 3004f88 + IOCMG_PARAM_CHECK_NO_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE); + 3004f8a: fe842703 lw a4,-24(s0) + 3004f8e: 478d li a5,3 + 3004f90: 00e7fa63 bgeu a5,a4,3004fa4 + 3004f94: 0d300593 li a1,211 + 3004f98: 030077b7 lui a5,0x3007 + 3004f9c: 97c78513 addi a0,a5,-1668 # 300697c + 3004fa0: 2d01 jal ra,30055b0 + 3004fa2: a835 j 3004fde + iocmgRegx->BIT.pu = (pullMode & 0x02) >> 1; /* 10b: pull up mode */ + 3004fa4: fe842783 lw a5,-24(s0) + 3004fa8: 8385 srli a5,a5,0x1 + 3004faa: 8b85 andi a5,a5,1 + 3004fac: 0ff7f693 andi a3,a5,255 + 3004fb0: fec42703 lw a4,-20(s0) + 3004fb4: 431c lw a5,0(a4) + 3004fb6: 8a85 andi a3,a3,1 + 3004fb8: 06a2 slli a3,a3,0x8 + 3004fba: eff7f793 andi a5,a5,-257 + 3004fbe: 8fd5 or a5,a5,a3 + 3004fc0: c31c sw a5,0(a4) + iocmgRegx->BIT.pd = pullMode & 0x01; /* 01b: pull down mode */ + 3004fc2: fe842783 lw a5,-24(s0) + 3004fc6: 8b85 andi a5,a5,1 + 3004fc8: 0ff7f693 andi a3,a5,255 + 3004fcc: fec42703 lw a4,-20(s0) + 3004fd0: 431c lw a5,0(a4) + 3004fd2: 8a85 andi a3,a3,1 + 3004fd4: 069e slli a3,a3,0x7 + 3004fd6: f7f7f793 andi a5,a5,-129 + 3004fda: 8fd5 or a5,a5,a3 + 3004fdc: c31c sw a5,0(a4) +} + 3004fde: 40f2 lw ra,28(sp) + 3004fe0: 4462 lw s0,24(sp) + 3004fe2: 6105 addi sp,sp,32 + 3004fe4: 8082 ret + +03004fe6 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param levelShiftRate value of @ref IOCMG_LevelShiftRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetLevelShiftRate(IOCMG_REG *iocmgRegx, IOCMG_LevelShiftRate levelShiftRate) +{ + 3004fe6: 1101 addi sp,sp,-32 + 3004fe8: ce06 sw ra,28(sp) + 3004fea: cc22 sw s0,24(sp) + 3004fec: 1000 addi s0,sp,32 + 3004fee: fea42623 sw a0,-20(s0) + 3004ff2: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004ff6: fec42703 lw a4,-20(s0) + 3004ffa: 77c1 lui a5,0xffff0 + 3004ffc: 8f7d and a4,a4,a5 + 3004ffe: 147f07b7 lui a5,0x147f0 + 3005002: 00f70a63 beq a4,a5,3005016 + 3005006: 0ed00593 li a1,237 + 300500a: 030077b7 lui a5,0x3007 + 300500e: 97c78513 addi a0,a5,-1668 # 300697c + 3005012: 2b79 jal ra,30055b0 + 3005014: a001 j 3005014 + IOCMG_PARAM_CHECK_NO_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX && levelShiftRate >= LEVEL_SHIFT_RATE_FAST); + 3005016: fe842703 lw a4,-24(s0) + 300501a: 4785 li a5,1 + 300501c: 00e7fa63 bgeu a5,a4,3005030 + 3005020: 0ee00593 li a1,238 + 3005024: 030077b7 lui a5,0x3007 + 3005028: 97c78513 addi a0,a5,-1668 # 300697c + 300502c: 2351 jal ra,30055b0 + 300502e: a839 j 300504c + iocmgRegx->BIT.sr = levelShiftRate; + 3005030: fe842783 lw a5,-24(s0) + 3005034: 8b85 andi a5,a5,1 + 3005036: 0ff7f693 andi a3,a5,255 + 300503a: fec42703 lw a4,-20(s0) + 300503e: 431c lw a5,0(a4) + 3005040: 8a85 andi a3,a3,1 + 3005042: 06a6 slli a3,a3,0x9 + 3005044: dff7f793 andi a5,a5,-513 + 3005048: 8fd5 or a5,a5,a3 + 300504a: c31c sw a5,0(a4) +} + 300504c: 40f2 lw ra,28(sp) + 300504e: 4462 lw s0,24(sp) + 3005050: 6105 addi sp,sp,32 + 3005052: 8082 ret + +03005054 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param schmidtMode value of @ref IOCMG_SchmidtMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetSchmidtMode(IOCMG_REG *iocmgRegx, IOCMG_SchmidtMode schmidtMode) +{ + 3005054: 1101 addi sp,sp,-32 + 3005056: ce06 sw ra,28(sp) + 3005058: cc22 sw s0,24(sp) + 300505a: 1000 addi s0,sp,32 + 300505c: fea42623 sw a0,-20(s0) + 3005060: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3005064: fec42703 lw a4,-20(s0) + 3005068: 77c1 lui a5,0xffff0 + 300506a: 8f7d and a4,a4,a5 + 300506c: 147f07b7 lui a5,0x147f0 + 3005070: 00f70a63 beq a4,a5,3005084 + 3005074: 10500593 li a1,261 + 3005078: 030077b7 lui a5,0x3007 + 300507c: 97c78513 addi a0,a5,-1668 # 300697c + 3005080: 2b05 jal ra,30055b0 + 3005082: a001 j 3005082 + IOCMG_PARAM_CHECK_NO_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE); + 3005084: fe842703 lw a4,-24(s0) + 3005088: 4785 li a5,1 + 300508a: 00e7fa63 bgeu a5,a4,300509e + 300508e: 10600593 li a1,262 + 3005092: 030077b7 lui a5,0x3007 + 3005096: 97c78513 addi a0,a5,-1668 # 300697c + 300509a: 2b19 jal ra,30055b0 + 300509c: a839 j 30050ba + iocmgRegx->BIT.se = schmidtMode; + 300509e: fe842783 lw a5,-24(s0) + 30050a2: 8b85 andi a5,a5,1 + 30050a4: 0ff7f693 andi a3,a5,255 + 30050a8: fec42703 lw a4,-20(s0) + 30050ac: 431c lw a5,0(a4) + 30050ae: 8a85 andi a3,a3,1 + 30050b0: 06aa slli a3,a3,0xa + 30050b2: bff7f793 andi a5,a5,-1025 + 30050b6: 8fd5 or a5,a5,a3 + 30050b8: c31c sw a5,0(a4) +} + 30050ba: 40f2 lw ra,28(sp) + 30050bc: 4462 lw s0,24(sp) + 30050be: 6105 addi sp,sp,32 + 30050c0: 8082 ret + +030050c2 : + * @brief Get pins iocmg reg address + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_REG iocmg reg address. + */ +static IOCMG_REG* IOCMG_GetRegAddr(unsigned int pinTypedef) +{ + 30050c2: 7179 addi sp,sp,-48 + 30050c4: d622 sw s0,44(sp) + 30050c6: 1800 addi s0,sp,48 + 30050c8: fca42e23 sw a0,-36(s0) + /* decode pin's iocmg reg offset address in base address, and conver value to point address */ + unsigned int iocmgBaseAddrValue = (uintptr_t)IOCMG_BASE; + 30050cc: 147f07b7 lui a5,0x147f0 + 30050d0: fef42623 sw a5,-20(s0) + unsigned int iocmgRegOffsetAddrValue = (pinTypedef >> 16) & 0x00000FFF; /* 16 : shift 16 bit */ + 30050d4: fdc42783 lw a5,-36(s0) + 30050d8: 0107d713 srli a4,a5,0x10 + 30050dc: 6785 lui a5,0x1 + 30050de: 17fd addi a5,a5,-1 # fff + 30050e0: 8ff9 and a5,a5,a4 + 30050e2: fef42423 sw a5,-24(s0) + IOCMG_REG* iocmgRegxAddr = (IOCMG_REG*)(void*)(iocmgBaseAddrValue + iocmgRegOffsetAddrValue); + 30050e6: fec42703 lw a4,-20(s0) + 30050ea: fe842783 lw a5,-24(s0) + 30050ee: 97ba add a5,a5,a4 + 30050f0: fef42223 sw a5,-28(s0) + if (!IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegxAddr & IOCMG_BASE_ADDR_MASK))) { + 30050f4: fe442703 lw a4,-28(s0) + 30050f8: 77c1 lui a5,0xffff0 + 30050fa: 8f7d and a4,a4,a5 + 30050fc: 147f07b7 lui a5,0x147f0 + 3005100: 00f70463 beq a4,a5,3005108 + return NULL; + 3005104: 4781 li a5,0 + 3005106: a019 j 300510c + } + return iocmgRegxAddr; + 3005108: fe442783 lw a5,-28(s0) +} + 300510c: 853e mv a0,a5 + 300510e: 5432 lw s0,44(sp) + 3005110: 6145 addi sp,sp,48 + 3005112: 8082 ret + +03005114 : + * @brief Set pins as function mode + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinAltFuncMode(unsigned int pinTypedef) +{ + 3005114: 7179 addi sp,sp,-48 + 3005116: d606 sw ra,44(sp) + 3005118: d422 sw s0,40(sp) + 300511a: 1800 addi s0,sp,48 + 300511c: fca42e23 sw a0,-36(s0) + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3005120: fdc42503 lw a0,-36(s0) + 3005124: 3f79 jal ra,30050c2 + 3005126: fea42623 sw a0,-20(s0) + /* get iocmg reg default value */ + unsigned int regValue = pinTypedef & IOCMG_REG_VALUE_MASK; + 300512a: fdc42703 lw a4,-36(s0) + 300512e: 67c1 lui a5,0x10 + 3005130: 17fd addi a5,a5,-1 # ffff + 3005132: 8ff9 and a5,a5,a4 + 3005134: fef42423 sw a5,-24(s0) + DCL_IOCMG_SetRegValue(iocmgRegx, regValue); + 3005138: fe842583 lw a1,-24(s0) + 300513c: fec42503 lw a0,-20(s0) + 3005140: 33a5 jal ra,3004ea8 + return IOCMG_STATUS_OK; + 3005142: 4781 li a5,0 +} + 3005144: 853e mv a0,a5 + 3005146: 50b2 lw ra,44(sp) + 3005148: 5422 lw s0,40(sp) + 300514a: 6145 addi sp,sp,48 + 300514c: 8082 ret + +0300514e : + * @param pinTypedef the pin type defined in iomap.h + * @param pullMode function define as @ref IOCMG_PullMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinPullMode(unsigned int pinTypedef, IOCMG_PullMode pullMode) +{ + 300514e: 7179 addi sp,sp,-48 + 3005150: d606 sw ra,44(sp) + 3005152: d422 sw s0,40(sp) + 3005154: 1800 addi s0,sp,48 + 3005156: fca42e23 sw a0,-36(s0) + 300515a: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE, IOCMG_PARAM_ERROR); + 300515e: fd842703 lw a4,-40(s0) + 3005162: 478d li a5,3 + 3005164: 00e7fb63 bgeu a5,a4,300517a + 3005168: 07800593 li a1,120 + 300516c: 030077b7 lui a5,0x3007 + 3005170: 99c78513 addi a0,a5,-1636 # 300699c + 3005174: 2935 jal ra,30055b0 + 3005176: 4791 li a5,4 + 3005178: a821 j 3005190 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 300517a: fdc42503 lw a0,-36(s0) + 300517e: 3791 jal ra,30050c2 + 3005180: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetPullMode(iocmgRegx, pullMode); + 3005184: fd842583 lw a1,-40(s0) + 3005188: fec42503 lw a0,-20(s0) + 300518c: 33f9 jal ra,3004f5a + return IOCMG_STATUS_OK; + 300518e: 4781 li a5,0 +} + 3005190: 853e mv a0,a5 + 3005192: 50b2 lw ra,44(sp) + 3005194: 5422 lw s0,40(sp) + 3005196: 6145 addi sp,sp,48 + 3005198: 8082 ret + +0300519a : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinSchmidtMode(unsigned int pinTypedef, IOCMG_SchmidtMode schmidtMode) +{ + 300519a: 7179 addi sp,sp,-48 + 300519c: d606 sw ra,44(sp) + 300519e: d422 sw s0,40(sp) + 30051a0: 1800 addi s0,sp,48 + 30051a2: fca42e23 sw a0,-36(s0) + 30051a6: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE, IOCMG_PARAM_ERROR); + 30051aa: fd842703 lw a4,-40(s0) + 30051ae: 4785 li a5,1 + 30051b0: 00e7fb63 bgeu a5,a4,30051c6 + 30051b4: 09300593 li a1,147 + 30051b8: 030077b7 lui a5,0x3007 + 30051bc: 99c78513 addi a0,a5,-1636 # 300699c + 30051c0: 2ec5 jal ra,30055b0 + 30051c2: 4791 li a5,4 + 30051c4: a821 j 30051dc + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 30051c6: fdc42503 lw a0,-36(s0) + 30051ca: 3de5 jal ra,30050c2 + 30051cc: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetSchmidtMode(iocmgRegx, schmidtMode); + 30051d0: fd842583 lw a1,-40(s0) + 30051d4: fec42503 lw a0,-20(s0) + 30051d8: 3db5 jal ra,3005054 + return IOCMG_STATUS_OK; + 30051da: 4781 li a5,0 +} + 30051dc: 853e mv a0,a5 + 30051de: 50b2 lw ra,44(sp) + 30051e0: 5422 lw s0,40(sp) + 30051e2: 6145 addi sp,sp,48 + 30051e4: 8082 ret + +030051e6 : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinLevelShiftRate(unsigned int pinTypedef, IOCMG_LevelShiftRate levelShiftRate) +{ + 30051e6: 7179 addi sp,sp,-48 + 30051e8: d606 sw ra,44(sp) + 30051ea: d422 sw s0,40(sp) + 30051ec: 1800 addi s0,sp,48 + 30051ee: fca42e23 sw a0,-36(s0) + 30051f2: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX, IOCMG_PARAM_ERROR); + 30051f6: fd842703 lw a4,-40(s0) + 30051fa: 4785 li a5,1 + 30051fc: 00e7fb63 bgeu a5,a4,3005212 + 3005200: 0ae00593 li a1,174 + 3005204: 030077b7 lui a5,0x3007 + 3005208: 99c78513 addi a0,a5,-1636 # 300699c + 300520c: 2655 jal ra,30055b0 + 300520e: 4791 li a5,4 + 3005210: a821 j 3005228 + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate >= LEVEL_SHIFT_RATE_FAST, IOCMG_PARAM_ERROR); + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3005212: fdc42503 lw a0,-36(s0) + 3005216: 3575 jal ra,30050c2 + 3005218: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetLevelShiftRate(iocmgRegx, levelShiftRate); + 300521c: fd842583 lw a1,-40(s0) + 3005220: fec42503 lw a0,-20(s0) + 3005224: 33c9 jal ra,3004fe6 + return IOCMG_STATUS_OK; + 3005226: 4781 li a5,0 +} + 3005228: 853e mv a0,a5 + 300522a: 50b2 lw ra,44(sp) + 300522c: 5422 lw s0,40(sp) + 300522e: 6145 addi sp,sp,48 + 3005230: 8082 ret + +03005232 : + * @param pinTypedef the pin type defined in iomap.h + * @param driveRate function define as @ref IOCMG_DriveRate + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinDriveRate(unsigned int pinTypedef, IOCMG_DriveRate driveRate) +{ + 3005232: 7179 addi sp,sp,-48 + 3005234: d606 sw ra,44(sp) + 3005236: d422 sw s0,40(sp) + 3005238: 1800 addi s0,sp,48 + 300523a: fca42e23 sw a0,-36(s0) + 300523e: fcb42c23 sw a1,-40(s0) + /* get iocmg reg address */ + IOCMG_PARAM_CHECK_WITH_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4, IOCMG_PARAM_ERROR); + 3005242: fd842703 lw a4,-40(s0) + 3005246: 478d li a5,3 + 3005248: 00e7fb63 bgeu a5,a4,300525e + 300524c: 0cb00593 li a1,203 + 3005250: 030077b7 lui a5,0x3007 + 3005254: 99c78513 addi a0,a5,-1636 # 300699c + 3005258: 2ea1 jal ra,30055b0 + 300525a: 4791 li a5,4 + 300525c: a821 j 3005274 + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 300525e: fdc42503 lw a0,-36(s0) + 3005262: 3585 jal ra,30050c2 + 3005264: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetDriveRate(iocmgRegx, driveRate); + 3005268: fd842583 lw a1,-40(s0) + 300526c: fec42503 lw a0,-20(s0) + 3005270: 39b5 jal ra,3004eec + return IOCMG_STATUS_OK; + 3005272: 4781 li a5,0 +} + 3005274: 853e mv a0,a5 + 3005276: 50b2 lw ra,44(sp) + 3005278: 5422 lw s0,40(sp) + 300527a: 6145 addi sp,sp,48 + 300527c: 8082 ret + +0300527e : + * @param mode Timer Mode, @ref TIMER_Mode + * @retval true + * @retval false + */ +static inline bool IsTimerMode(TIMER_Mode mode) +{ + 300527e: 1101 addi sp,sp,-32 + 3005280: ce22 sw s0,28(sp) + 3005282: 1000 addi s0,sp,32 + 3005284: fea42623 sw a0,-20(s0) + return (((mode) == TIMER_MODE_RUN_FREE) || + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3005288: fec42783 lw a5,-20(s0) + 300528c: cb99 beqz a5,30052a2 + return (((mode) == TIMER_MODE_RUN_FREE) || + 300528e: fec42703 lw a4,-20(s0) + 3005292: 4785 li a5,1 + 3005294: 00f70763 beq a4,a5,30052a2 + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3005298: fec42703 lw a4,-20(s0) + 300529c: 4789 li a5,2 + 300529e: 00f71463 bne a4,a5,30052a6 + 30052a2: 4785 li a5,1 + 30052a4: a011 j 30052a8 + 30052a6: 4781 li a5,0 + 30052a8: 8b85 andi a5,a5,1 + 30052aa: 9f81 uxtb a5 + ((mode) == TIMER_MODE_RUN_ONTSHOT)); +} + 30052ac: 853e mv a0,a5 + 30052ae: 4472 lw s0,28(sp) + 30052b0: 6105 addi sp,sp,32 + 30052b2: 8082 ret + +030052b4 : + * @param mode Timer Interrupt Type, @ref TIMER_InterruptType + * @retval true + * @retval false + */ +static inline bool IsTimerInterruptType(TIMER_InterruptType interruptType) +{ + 30052b4: 1101 addi sp,sp,-32 + 30052b6: ce22 sw s0,28(sp) + 30052b8: 1000 addi s0,sp,32 + 30052ba: fea42623 sw a0,-20(s0) + return (((interruptType) == TIMER_PERIOD_FIN) || + 30052be: fec42783 lw a5,-20(s0) + 30052c2: c791 beqz a5,30052ce + 30052c4: fec42703 lw a4,-20(s0) + 30052c8: 4785 li a5,1 + 30052ca: 00f71463 bne a4,a5,30052d2 + 30052ce: 4785 li a5,1 + 30052d0: a011 j 30052d4 + 30052d2: 4781 li a5,0 + 30052d4: 8b85 andi a5,a5,1 + 30052d6: 9f81 uxtb a5 + ((interruptType) == TIMER_OVER_FLOW)); +} + 30052d8: 853e mv a0,a5 + 30052da: 4472 lw s0,28(sp) + 30052dc: 6105 addi sp,sp,32 + 30052de: 8082 ret + +030052e0 : + * @param size Timer Size, @ref TIMER_Size + * @retval true + * @retval false + */ +static inline bool IsTimerSize(TIMER_Size size) +{ + 30052e0: 1101 addi sp,sp,-32 + 30052e2: ce22 sw s0,28(sp) + 30052e4: 1000 addi s0,sp,32 + 30052e6: fea42623 sw a0,-20(s0) + return (((size) == TIMER_SIZE_16BIT) || + 30052ea: fec42783 lw a5,-20(s0) + 30052ee: c791 beqz a5,30052fa + 30052f0: fec42703 lw a4,-20(s0) + 30052f4: 4785 li a5,1 + 30052f6: 00f71463 bne a4,a5,30052fe + 30052fa: 4785 li a5,1 + 30052fc: a011 j 3005300 + 30052fe: 4781 li a5,0 + 3005300: 8b85 andi a5,a5,1 + 3005302: 9f81 uxtb a5 + ((size) == TIMER_SIZE_32BIT)); +} + 3005304: 853e mv a0,a5 + 3005306: 4472 lw s0,28(sp) + 3005308: 6105 addi sp,sp,32 + 300530a: 8082 ret + +0300530c : + * @param period + * @retval true + * @retval false + */ +static inline bool IsTimerPeriod(unsigned int period) +{ + 300530c: 1101 addi sp,sp,-32 + 300530e: ce22 sw s0,28(sp) + 3005310: 1000 addi s0,sp,32 + 3005312: fea42623 sw a0,-20(s0) + return ((period) >= PERIOD_MIN_VALUE); + 3005316: fec42783 lw a5,-20(s0) + 300531a: 00f037b3 snez a5,a5 + 300531e: 9f81 uxtb a5 +} + 3005320: 853e mv a0,a5 + 3005322: 4472 lw s0,28(sp) + 3005324: 6105 addi sp,sp,32 + 3005326: 8082 ret + +03005328 : + * @param div @see TIMER_PrescalerFactor + * @retval true + * @retval false + */ +static inline bool IsTimerDiv(TIMER_PrescalerFactor div) +{ + 3005328: 1101 addi sp,sp,-32 + 300532a: ce22 sw s0,28(sp) + 300532c: 1000 addi s0,sp,32 + 300532e: fea42623 sw a0,-20(s0) + return (((div) == TIMERPRESCALER_NO_DIV) || + ((div) == TIMERPRESCALER_DIV_16) || + 3005332: fec42783 lw a5,-20(s0) + 3005336: cb99 beqz a5,300534c + return (((div) == TIMERPRESCALER_NO_DIV) || + 3005338: fec42703 lw a4,-20(s0) + 300533c: 4785 li a5,1 + 300533e: 00f70763 beq a4,a5,300534c + ((div) == TIMERPRESCALER_DIV_16) || + 3005342: fec42703 lw a4,-20(s0) + 3005346: 4789 li a5,2 + 3005348: 00f71463 bne a4,a5,3005350 + 300534c: 4785 li a5,1 + 300534e: a011 j 3005352 + 3005350: 4781 li a5,0 + 3005352: 8b85 andi a5,a5,1 + 3005354: 9f81 uxtb a5 + ((div) == TIMERPRESCALER_DIV_256)); +} + 3005356: 853e mv a0,a5 + 3005358: 4472 lw s0,28(sp) + 300535a: 6105 addi sp,sp,32 + 300535c: 8082 ret + +0300535e : + * @param handle Timer Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR parameter check fail + */ +BASE_StatusType HAL_TIMER_Init(TIMER_Handle *handle) +{ + 300535e: 1101 addi sp,sp,-32 + 3005360: ce06 sw ra,28(sp) + 3005362: cc22 sw s0,24(sp) + 3005364: 1000 addi s0,sp,32 + 3005366: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 300536a: fec42783 lw a5,-20(s0) + 300536e: eb89 bnez a5,3005380 + 3005370: 02800593 li a1,40 + 3005374: 030077b7 lui a5,0x3007 + 3005378: 9dc78513 addi a0,a5,-1572 # 30069dc + 300537c: 2c15 jal ra,30055b0 + 300537e: a001 j 300537e + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 3005380: fec42783 lw a5,-20(s0) + 3005384: 4398 lw a4,0(a5) + 3005386: 143007b7 lui a5,0x14300 + 300538a: 02f70f63 beq a4,a5,30053c8 + 300538e: fec42783 lw a5,-20(s0) + 3005392: 4398 lw a4,0(a5) + 3005394: 143017b7 lui a5,0x14301 + 3005398: 02f70863 beq a4,a5,30053c8 + 300539c: fec42783 lw a5,-20(s0) + 30053a0: 4398 lw a4,0(a5) + 30053a2: 143027b7 lui a5,0x14302 + 30053a6: 02f70163 beq a4,a5,30053c8 + 30053aa: fec42783 lw a5,-20(s0) + 30053ae: 4398 lw a4,0(a5) + 30053b0: 143037b7 lui a5,0x14303 + 30053b4: 00f70a63 beq a4,a5,30053c8 + 30053b8: 02900593 li a1,41 + 30053bc: 030077b7 lui a5,0x3007 + 30053c0: 9dc78513 addi a0,a5,-1572 # 30069dc + 30053c4: 22f5 jal ra,30055b0 + 30053c6: a001 j 30053c6 + + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->load), BASE_STATUS_ERROR); + 30053c8: fec42783 lw a5,-20(s0) + 30053cc: 4bdc lw a5,20(a5) + 30053ce: 853e mv a0,a5 + 30053d0: 3f35 jal ra,300530c + 30053d2: 87aa mv a5,a0 + 30053d4: 0017c793 xori a5,a5,1 + 30053d8: 9f81 uxtb a5 + 30053da: cb91 beqz a5,30053ee + 30053dc: 02b00593 li a1,43 + 30053e0: 030077b7 lui a5,0x3007 + 30053e4: 9dc78513 addi a0,a5,-1572 # 30069dc + 30053e8: 22e1 jal ra,30055b0 + 30053ea: 4785 li a5,1 + 30053ec: aa6d j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->bgLoad), BASE_STATUS_ERROR); + 30053ee: fec42783 lw a5,-20(s0) + 30053f2: 4f9c lw a5,24(a5) + 30053f4: 853e mv a0,a5 + 30053f6: 3f19 jal ra,300530c + 30053f8: 87aa mv a5,a0 + 30053fa: 0017c793 xori a5,a5,1 + 30053fe: 9f81 uxtb a5 + 3005400: cb91 beqz a5,3005414 + 3005402: 02c00593 li a1,44 + 3005406: 030077b7 lui a5,0x3007 + 300540a: 9dc78513 addi a0,a5,-1572 # 30069dc + 300540e: 224d jal ra,30055b0 + 3005410: 4785 li a5,1 + 3005412: aa51 j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerMode(handle->mode), BASE_STATUS_ERROR); + 3005414: fec42783 lw a5,-20(s0) + 3005418: 479c lw a5,8(a5) + 300541a: 853e mv a0,a5 + 300541c: 358d jal ra,300527e + 300541e: 87aa mv a5,a0 + 3005420: 0017c793 xori a5,a5,1 + 3005424: 9f81 uxtb a5 + 3005426: cb91 beqz a5,300543a + 3005428: 02d00593 li a1,45 + 300542c: 030077b7 lui a5,0x3007 + 3005430: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005434: 2ab5 jal ra,30055b0 + 3005436: 4785 li a5,1 + 3005438: a2bd j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerSize(handle->size), BASE_STATUS_ERROR); + 300543a: fec42783 lw a5,-20(s0) + 300543e: 4b9c lw a5,16(a5) + 3005440: 853e mv a0,a5 + 3005442: 3d79 jal ra,30052e0 + 3005444: 87aa mv a5,a0 + 3005446: 0017c793 xori a5,a5,1 + 300544a: 9f81 uxtb a5 + 300544c: cb91 beqz a5,3005460 + 300544e: 02e00593 li a1,46 + 3005452: 030077b7 lui a5,0x3007 + 3005456: 9dc78513 addi a0,a5,-1572 # 30069dc + 300545a: 2a99 jal ra,30055b0 + 300545c: 4785 li a5,1 + 300545e: a2a1 j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerDiv(handle->prescaler), BASE_STATUS_ERROR); + 3005460: fec42783 lw a5,-20(s0) + 3005464: 47dc lw a5,12(a5) + 3005466: 853e mv a0,a5 + 3005468: 35c1 jal ra,3005328 + 300546a: 87aa mv a5,a0 + 300546c: 0017c793 xori a5,a5,1 + 3005470: 9f81 uxtb a5 + 3005472: cb91 beqz a5,3005486 + 3005474: 02f00593 li a1,47 + 3005478: 030077b7 lui a5,0x3007 + 300547c: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005480: 2a05 jal ra,30055b0 + 3005482: 4785 li a5,1 + 3005484: a20d j 30055a6 + + /* Initialize the configuration parameters of the timer */ + handle->baseAddress->timer_intclr = BASE_CFG_SET; /* Writing to this register clears interrupt output of timer */ + 3005486: fec42783 lw a5,-20(s0) + 300548a: 439c lw a5,0(a5) + 300548c: 4705 li a4,1 + 300548e: c7d8 sw a4,12(a5) + handle->baseAddress->timer_load = handle->load; + 3005490: fec42783 lw a5,-20(s0) + 3005494: 439c lw a5,0(a5) + 3005496: fec42703 lw a4,-20(s0) + 300549a: 4b58 lw a4,20(a4) + 300549c: c398 sw a4,0(a5) + handle->baseAddress->timerbgload = handle->bgLoad; + 300549e: fec42783 lw a5,-20(s0) + 30054a2: 439c lw a5,0(a5) + 30054a4: fec42703 lw a4,-20(s0) + 30054a8: 4f18 lw a4,24(a4) + 30054aa: cf98 sw a4,24(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_DISABLE; + 30054ac: fec42783 lw a5,-20(s0) + 30054b0: 4398 lw a4,0(a5) + 30054b2: 471c lw a5,8(a4) + 30054b4: f7f7f793 andi a5,a5,-129 + 30054b8: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timerintenable = handle->interruptEn; + 30054ba: fec42783 lw a5,-20(s0) + 30054be: 4398 lw a4,0(a5) + 30054c0: fec42783 lw a5,-20(s0) + 30054c4: 2fd4 lbu a3,28(a5) + 30054c6: 471c lw a5,8(a4) + 30054c8: 8a85 andi a3,a3,1 + 30054ca: 0696 slli a3,a3,0x5 + 30054cc: fdf7f793 andi a5,a5,-33 + 30054d0: 8fd5 or a5,a5,a3 + 30054d2: c71c sw a5,8(a4) + + /* Sets the frequency divider and size of the timer module. */ + handle->baseAddress->TIMERx_CONTROL.BIT.timerpre = handle->prescaler; + 30054d4: fec42783 lw a5,-20(s0) + 30054d8: 47d4 lw a3,12(a5) + 30054da: fec42783 lw a5,-20(s0) + 30054de: 4398 lw a4,0(a5) + 30054e0: 87b6 mv a5,a3 + 30054e2: 8b8d andi a5,a5,3 + 30054e4: 0ff7f693 andi a3,a5,255 + 30054e8: 471c lw a5,8(a4) + 30054ea: 8a8d andi a3,a3,3 + 30054ec: 068a slli a3,a3,0x2 + 30054ee: 9bcd andi a5,a5,-13 + 30054f0: 8fd5 or a5,a5,a3 + 30054f2: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timersize = handle->size; + 30054f4: fec42783 lw a5,-20(s0) + 30054f8: 4b94 lw a3,16(a5) + 30054fa: fec42783 lw a5,-20(s0) + 30054fe: 4398 lw a4,0(a5) + 3005500: 87b6 mv a5,a3 + 3005502: 8b85 andi a5,a5,1 + 3005504: 0ff7f693 andi a3,a5,255 + 3005508: 471c lw a5,8(a4) + 300550a: 8a85 andi a3,a3,1 + 300550c: 0686 slli a3,a3,0x1 + 300550e: 9bf5 andi a5,a5,-3 + 3005510: 8fd5 or a5,a5,a3 + 3005512: c71c sw a5,8(a4) + + /* Sets the running mode of the timer. */ + if (handle->mode == TIMER_MODE_RUN_ONTSHOT) { + 3005514: fec42783 lw a5,-20(s0) + 3005518: 4798 lw a4,8(a5) + 300551a: 4789 li a5,2 + 300551c: 00f71a63 bne a4,a5,3005530 + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_SET; + 3005520: fec42783 lw a5,-20(s0) + 3005524: 4398 lw a4,0(a5) + 3005526: 471c lw a5,8(a4) + 3005528: 0017e793 ori a5,a5,1 + 300552c: c71c sw a5,8(a4) + 300552e: a805 j 300555e + } else { + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_UNSET; + 3005530: fec42783 lw a5,-20(s0) + 3005534: 4398 lw a4,0(a5) + 3005536: 471c lw a5,8(a4) + 3005538: 9bf9 andi a5,a5,-2 + 300553a: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 300553c: fec42783 lw a5,-20(s0) + 3005540: 479c lw a5,8(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005542: fec42703 lw a4,-20(s0) + 3005546: 4318 lw a4,0(a4) + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005548: 00f037b3 snez a5,a5 + 300554c: 0ff7f693 andi a3,a5,255 + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005550: 471c lw a5,8(a4) + 3005552: 8a85 andi a3,a3,1 + 3005554: 069a slli a3,a3,0x6 + 3005556: fbf7f793 andi a5,a5,-65 + 300555a: 8fd5 or a5,a5,a3 + 300555c: c71c sw a5,8(a4) + } + + /* Request for setting the DMA and ADC. */ + handle->baseAddress->TIMERx_CONTROLB.BIT.dmasreqen = handle->dmaReqEnable; + 300555e: fec42783 lw a5,-20(s0) + 3005562: 4398 lw a4,0(a5) + 3005564: fec42783 lw a5,-20(s0) + 3005568: 2ff4 lbu a3,30(a5) + 300556a: 4f5c lw a5,28(a4) + 300556c: 8a85 andi a3,a3,1 + 300556e: 0686 slli a3,a3,0x1 + 3005570: 9bf5 andi a5,a5,-3 + 3005572: 8fd5 or a5,a5,a3 + 3005574: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.dmabreqen = handle->dmaReqEnable; + 3005576: fec42783 lw a5,-20(s0) + 300557a: 4398 lw a4,0(a5) + 300557c: fec42783 lw a5,-20(s0) + 3005580: 2ff4 lbu a3,30(a5) + 3005582: 4f5c lw a5,28(a4) + 3005584: 8a85 andi a3,a3,1 + 3005586: 9bf9 andi a5,a5,-2 + 3005588: 8fd5 or a5,a5,a3 + 300558a: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.socen = handle->adcSocReqEnable; + 300558c: fec42783 lw a5,-20(s0) + 3005590: 4398 lw a4,0(a5) + 3005592: fec42783 lw a5,-20(s0) + 3005596: 3fd4 lbu a3,29(a5) + 3005598: 4f5c lw a5,28(a4) + 300559a: 8a85 andi a3,a3,1 + 300559c: 068a slli a3,a3,0x2 + 300559e: 9bed andi a5,a5,-5 + 30055a0: 8fd5 or a5,a5,a3 + 30055a2: cf5c sw a5,28(a4) + return BASE_STATUS_OK; + 30055a4: 4781 li a5,0 +} + 30055a6: 853e mv a0,a5 + 30055a8: 40f2 lw ra,28(sp) + 30055aa: 4462 lw s0,24(sp) + 30055ac: 6105 addi sp,sp,32 + 30055ae: 8082 ret + +030055b0 : + 30055b0: c37fc06f j 30021e6 + +030055b4 : + * @brief Start timer. + * @param handle Timer Handle + * @retval None + */ +void HAL_TIMER_Start(TIMER_Handle *handle) +{ + 30055b4: 1101 addi sp,sp,-32 + 30055b6: ce06 sw ra,28(sp) + 30055b8: cc22 sw s0,24(sp) + 30055ba: 1000 addi s0,sp,32 + 30055bc: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 30055c0: fec42783 lw a5,-20(s0) + 30055c4: eb89 bnez a5,30055d6 + 30055c6: 0bc00593 li a1,188 + 30055ca: 030077b7 lui a5,0x3007 + 30055ce: 9dc78513 addi a0,a5,-1572 # 30069dc + 30055d2: 3ff9 jal ra,30055b0 + 30055d4: a001 j 30055d4 + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 30055d6: fec42783 lw a5,-20(s0) + 30055da: 4398 lw a4,0(a5) + 30055dc: 143007b7 lui a5,0x14300 + 30055e0: 02f70f63 beq a4,a5,300561e + 30055e4: fec42783 lw a5,-20(s0) + 30055e8: 4398 lw a4,0(a5) + 30055ea: 143017b7 lui a5,0x14301 + 30055ee: 02f70863 beq a4,a5,300561e + 30055f2: fec42783 lw a5,-20(s0) + 30055f6: 4398 lw a4,0(a5) + 30055f8: 143027b7 lui a5,0x14302 + 30055fc: 02f70163 beq a4,a5,300561e + 3005600: fec42783 lw a5,-20(s0) + 3005604: 4398 lw a4,0(a5) + 3005606: 143037b7 lui a5,0x14303 + 300560a: 00f70a63 beq a4,a5,300561e + 300560e: 0bd00593 li a1,189 + 3005612: 030077b7 lui a5,0x3007 + 3005616: 9dc78513 addi a0,a5,-1572 # 30069dc + 300561a: 3f59 jal ra,30055b0 + 300561c: a001 j 300561c + /* Enable timer */ + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_SET; + 300561e: fec42783 lw a5,-20(s0) + 3005622: 4398 lw a4,0(a5) + 3005624: 471c lw a5,8(a4) + 3005626: 0807e793 ori a5,a5,128 + 300562a: c71c sw a5,8(a4) +} + 300562c: 0001 nop + 300562e: 40f2 lw ra,28(sp) + 3005630: 4462 lw s0,24(sp) + 3005632: 6105 addi sp,sp,32 + 3005634: 8082 ret + +03005636 : + * @brief GPT Interrupt service processing function. + * @param handle TIMER Handle + * @retval None + */ +void HAL_TIMER_IrqHandler(void *handle) +{ + 3005636: 7179 addi sp,sp,-48 + 3005638: d606 sw ra,44(sp) + 300563a: d422 sw s0,40(sp) + 300563c: 1800 addi s0,sp,48 + 300563e: fca42e23 sw a0,-36(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005642: fdc42783 lw a5,-36(s0) + 3005646: eb89 bnez a5,3005658 + 3005648: 0d800593 li a1,216 + 300564c: 030077b7 lui a5,0x3007 + 3005650: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005654: 3fb1 jal ra,30055b0 + 3005656: a001 j 3005656 + TIMER_Handle *timerHandle = (TIMER_Handle *)handle; + 3005658: fdc42783 lw a5,-36(s0) + 300565c: fef42623 sw a5,-20(s0) + TIMER_ASSERT_PARAM(IsTIMERInstance(timerHandle->baseAddress)); + 3005660: fec42783 lw a5,-20(s0) + 3005664: 4398 lw a4,0(a5) + 3005666: 143007b7 lui a5,0x14300 + 300566a: 02f70f63 beq a4,a5,30056a8 + 300566e: fec42783 lw a5,-20(s0) + 3005672: 4398 lw a4,0(a5) + 3005674: 143017b7 lui a5,0x14301 + 3005678: 02f70863 beq a4,a5,30056a8 + 300567c: fec42783 lw a5,-20(s0) + 3005680: 4398 lw a4,0(a5) + 3005682: 143027b7 lui a5,0x14302 + 3005686: 02f70163 beq a4,a5,30056a8 + 300568a: fec42783 lw a5,-20(s0) + 300568e: 4398 lw a4,0(a5) + 3005690: 143037b7 lui a5,0x14303 + 3005694: 00f70a63 beq a4,a5,30056a8 + 3005698: 0da00593 li a1,218 + 300569c: 030077b7 lui a5,0x3007 + 30056a0: 9dc78513 addi a0,a5,-1572 # 30069dc + 30056a4: 3731 jal ra,30055b0 + 30056a6: a001 j 30056a6 + /* Check interrupt type */ + if (timerHandle->baseAddress->TIMERx_MIS.dmaovmis == BASE_CFG_ENABLE) { + 30056a8: fec42783 lw a5,-20(s0) + 30056ac: 439c lw a5,0(a5) + 30056ae: 4bdc lw a5,20(a5) + 30056b0: 8385 srli a5,a5,0x1 + 30056b2: 8b85 andi a5,a5,1 + 30056b4: 0ff7f713 andi a4,a5,255 + 30056b8: 4785 li a5,1 + 30056ba: 02f71363 bne a4,a5,30056e0 + /* DMA overflow interrupt */ + timerHandle->baseAddress->DMAOV_INTCLR.BIT.dmaov_intclr = BASE_CFG_ENABLE; + 30056be: fec42783 lw a5,-20(s0) + 30056c2: 4398 lw a4,0(a5) + 30056c4: 531c lw a5,32(a4) + 30056c6: 0017e793 ori a5,a5,1 + 30056ca: d31c sw a5,32(a4) + /* Call the timer DMA request overflow callback function of the user. */ + if (timerHandle->userCallBack.TimerOverFlowCallBack != NULL) { + 30056cc: fec42783 lw a5,-20(s0) + 30056d0: 53dc lw a5,36(a5) + 30056d2: c799 beqz a5,30056e0 + timerHandle->userCallBack.TimerOverFlowCallBack(timerHandle); + 30056d4: fec42783 lw a5,-20(s0) + 30056d8: 53dc lw a5,36(a5) + 30056da: fec42503 lw a0,-20(s0) + 30056de: 9782 jalr a5 + } + } + if (timerHandle->baseAddress->TIMERx_MIS.timermis == BASE_CFG_ENABLE) { + 30056e0: fec42783 lw a5,-20(s0) + 30056e4: 439c lw a5,0(a5) + 30056e6: 4bdc lw a5,20(a5) + 30056e8: 8b85 andi a5,a5,1 + 30056ea: 0ff7f713 andi a4,a5,255 + 30056ee: 4785 li a5,1 + 30056f0: 02f71263 bne a4,a5,3005714 + /* TIMER Interrupt */ + timerHandle->baseAddress->timer_intclr = BASE_CFG_ENABLE; + 30056f4: fec42783 lw a5,-20(s0) + 30056f8: 439c lw a5,0(a5) + 30056fa: 4705 li a4,1 + 30056fc: c7d8 sw a4,12(a5) + /* Call the period finish callback function of the user. */ + if (timerHandle->userCallBack.TimerPeriodFinCallBack != NULL) { + 30056fe: fec42783 lw a5,-20(s0) + 3005702: 539c lw a5,32(a5) + 3005704: cb81 beqz a5,3005714 + timerHandle->userCallBack.TimerPeriodFinCallBack(timerHandle); + 3005706: fec42783 lw a5,-20(s0) + 300570a: 539c lw a5,32(a5) + 300570c: fec42503 lw a0,-20(s0) + 3005710: 9782 jalr a5 + } + } + return; + 3005712: 0001 nop + 3005714: 0001 nop +} + 3005716: 50b2 lw ra,44(sp) + 3005718: 5422 lw s0,40(sp) + 300571a: 6145 addi sp,sp,48 + 300571c: 8082 ret + +0300571e : + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_TIMER_RegisterCallback(TIMER_Handle *handle, TIMER_InterruptType typeID, + TIMER_CallBackFunc callBackFunc) +{ + 300571e: 1101 addi sp,sp,-32 + 3005720: ce06 sw ra,28(sp) + 3005722: cc22 sw s0,24(sp) + 3005724: 1000 addi s0,sp,32 + 3005726: fea42623 sw a0,-20(s0) + 300572a: feb42423 sw a1,-24(s0) + 300572e: fec42223 sw a2,-28(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005732: fec42783 lw a5,-20(s0) + 3005736: eb89 bnez a5,3005748 + 3005738: 0fa00593 li a1,250 + 300573c: 030077b7 lui a5,0x3007 + 3005740: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005744: 35b5 jal ra,30055b0 + 3005746: a001 j 3005746 + TIMER_ASSERT_PARAM(callBackFunc != NULL); + 3005748: fe442783 lw a5,-28(s0) + 300574c: eb89 bnez a5,300575e + 300574e: 0fb00593 li a1,251 + 3005752: 030077b7 lui a5,0x3007 + 3005756: 9dc78513 addi a0,a5,-1572 # 30069dc + 300575a: 3d99 jal ra,30055b0 + 300575c: a001 j 300575c + TIMER_ASSERT_PARAM(IsTimerInterruptType(typeID)); + 300575e: fe842503 lw a0,-24(s0) + 3005762: 3e89 jal ra,30052b4 + 3005764: 87aa mv a5,a0 + 3005766: 0017c793 xori a5,a5,1 + 300576a: 9f81 uxtb a5 + 300576c: cb89 beqz a5,300577e + 300576e: 0fc00593 li a1,252 + 3005772: 030077b7 lui a5,0x3007 + 3005776: 9dc78513 addi a0,a5,-1572 # 30069dc + 300577a: 3d1d jal ra,30055b0 + 300577c: a001 j 300577c + + /* Registers the user callback function. */ + switch (typeID) { + 300577e: fe842783 lw a5,-24(s0) + 3005782: cb91 beqz a5,3005796 + 3005784: 4705 li a4,1 + 3005786: 00e79e63 bne a5,a4,30057a2 + case TIMER_OVER_FLOW: + handle->userCallBack.TimerOverFlowCallBack = callBackFunc; /* User DMA request overflow function */ + 300578a: fec42783 lw a5,-20(s0) + 300578e: fe442703 lw a4,-28(s0) + 3005792: d3d8 sw a4,36(a5) + break; + 3005794: a809 j 30057a6 + case TIMER_PERIOD_FIN: + handle->userCallBack.TimerPeriodFinCallBack = callBackFunc; /* User timer period finish call back. */ + 3005796: fec42783 lw a5,-20(s0) + 300579a: fe442703 lw a4,-28(s0) + 300579e: d398 sw a4,32(a5) + break; + 30057a0: a019 j 30057a6 + default: + return BASE_STATUS_ERROR; + 30057a2: 4785 li a5,1 + 30057a4: a011 j 30057a8 + } + return BASE_STATUS_OK; + 30057a6: 4781 li a5,0 +} + 30057a8: 853e mv a0,a5 + 30057aa: 40f2 lw ra,28(sp) + 30057ac: 4462 lw s0,24(sp) + 30057ae: 6105 addi sp,sp,32 + 30057b0: 8082 ret + +030057b2 : + * @brief Check UART datalength parameter. + * @param datalength The number of data bits in a frame, @ref UART_DataLength + * @retval bool + */ +static inline bool IsUartDatalength(UART_DataLength datalength) +{ + 30057b2: 1101 addi sp,sp,-32 + 30057b4: ce22 sw s0,28(sp) + 30057b6: 1000 addi s0,sp,32 + 30057b8: fea42623 sw a0,-20(s0) + return (datalength >= UART_DATALENGTH_5BIT) && (datalength <= UART_DATALENGTH_8BIT); + 30057bc: fec42783 lw a5,-20(s0) + 30057c0: 0047b793 sltiu a5,a5,4 + 30057c4: 9f81 uxtb a5 +} + 30057c6: 853e mv a0,a5 + 30057c8: 4472 lw s0,28(sp) + 30057ca: 6105 addi sp,sp,32 + 30057cc: 8082 ret + +030057ce : + * @brief Check UART stopbits parameter. + * @param stopbits The number of stop bits in a frame, @ref UART_StopBits + * @retval bool + */ +static inline bool IsUartStopbits(UART_StopBits stopbits) +{ + 30057ce: 1101 addi sp,sp,-32 + 30057d0: ce22 sw s0,28(sp) + 30057d2: 1000 addi s0,sp,32 + 30057d4: fea42623 sw a0,-20(s0) + return (stopbits == UART_STOPBITS_ONE) || (stopbits == UART_STOPBITS_TWO); + 30057d8: fec42783 lw a5,-20(s0) + 30057dc: c791 beqz a5,30057e8 + 30057de: fec42703 lw a4,-20(s0) + 30057e2: 4785 li a5,1 + 30057e4: 00f71463 bne a4,a5,30057ec + 30057e8: 4785 li a5,1 + 30057ea: a011 j 30057ee + 30057ec: 4781 li a5,0 + 30057ee: 8b85 andi a5,a5,1 + 30057f0: 9f81 uxtb a5 +} + 30057f2: 853e mv a0,a5 + 30057f4: 4472 lw s0,28(sp) + 30057f6: 6105 addi sp,sp,32 + 30057f8: 8082 ret + +030057fa : + * @brief Check UART paritymode parameter. + * @param paritymode UART parity check mode, @ref UART_Parity_Mode + * @retval bool + */ +static inline bool IsUartParitymode(UART_Parity_Mode paritymode) +{ + 30057fa: 1101 addi sp,sp,-32 + 30057fc: ce22 sw s0,28(sp) + 30057fe: 1000 addi s0,sp,32 + 3005800: fea42623 sw a0,-20(s0) + if ((paritymode >= UART_PARITY_ODD) && (paritymode <= UART_PARITY_NONE)) { + 3005804: fec42703 lw a4,-20(s0) + 3005808: 4791 li a5,4 + 300580a: 00e7e463 bltu a5,a4,3005812 + return true; + 300580e: 4785 li a5,1 + 3005810: a011 j 3005814 + } + return false; + 3005812: 4781 li a5,0 +} + 3005814: 853e mv a0,a5 + 3005816: 4472 lw s0,28(sp) + 3005818: 6105 addi sp,sp,32 + 300581a: 8082 ret + +0300581c : + * @brief Check UART transmode parameter. + * @param transmode Transmit mode, @ref UART_Transmit_Mode + * @retval bool + */ +static inline bool IsUartTransmode(UART_Transmit_Mode transmode) +{ + 300581c: 1101 addi sp,sp,-32 + 300581e: ce22 sw s0,28(sp) + 3005820: 1000 addi s0,sp,32 + 3005822: fea42623 sw a0,-20(s0) + if ((transmode == UART_MODE_BLOCKING) || + 3005826: fec42783 lw a5,-20(s0) + 300582a: c385 beqz a5,300584a + 300582c: fec42703 lw a4,-20(s0) + 3005830: 4785 li a5,1 + 3005832: 00f70c63 beq a4,a5,300584a + (transmode == UART_MODE_INTERRUPT) || + 3005836: fec42703 lw a4,-20(s0) + 300583a: 4789 li a5,2 + 300583c: 00f70763 beq a4,a5,300584a + (transmode == UART_MODE_DMA) || + 3005840: fec42703 lw a4,-20(s0) + 3005844: 478d li a5,3 + 3005846: 00f71463 bne a4,a5,300584e + (transmode == UART_MODE_DISABLE)) { + return true; + 300584a: 4785 li a5,1 + 300584c: a011 j 3005850 + } + return false; + 300584e: 4781 li a5,0 +} + 3005850: 853e mv a0,a5 + 3005852: 4472 lw s0,28(sp) + 3005854: 6105 addi sp,sp,32 + 3005856: 8082 ret + +03005858 : + * @brief Check UART fifoThreshold parameter. + * @param fifoThreshold UART TX/RX FIFO line interrupt threshold, @ref UART_FIFO_Threshold + * @retval bool + */ +static inline bool IsUartFIFOThreshold(UART_FIFO_Threshold fifoThreshold) +{ + 3005858: 1101 addi sp,sp,-32 + 300585a: ce22 sw s0,28(sp) + 300585c: 1000 addi s0,sp,32 + 300585e: fea42623 sw a0,-20(s0) + return (fifoThreshold >= UART_FIFODEPTH_SIZE0) && (fifoThreshold <= UART_FIFODEPTH_SIZE15); + 3005862: fec42783 lw a5,-20(s0) + 3005866: 0107b793 sltiu a5,a5,16 + 300586a: 9f81 uxtb a5 +} + 300586c: 853e mv a0,a5 + 300586e: 4472 lw s0,28(sp) + 3005870: 6105 addi sp,sp,32 + 3005872: 8082 ret + +03005874 : + * @brief Check UART Oversampling multiple. + * @param multiple Oversampling multiple, @ref UART_OversampleMultiple + * @retval bool + */ +static inline bool IsUartOversampleMultiple(UART_OversampleMultiple multiple) +{ + 3005874: 1101 addi sp,sp,-32 + 3005876: ce22 sw s0,28(sp) + 3005878: 1000 addi s0,sp,32 + 300587a: fea42623 sw a0,-20(s0) + return (multiple >= UART_OVERSAMPLING_16X) && (multiple <= UART_OVERSAMPLING_12X); + 300587e: fec42783 lw a5,-20(s0) + 3005882: 0057b793 sltiu a5,a5,5 + 3005886: 9f81 uxtb a5 +} + 3005888: 853e mv a0,a5 + 300588a: 4472 lw s0,28(sp) + 300588c: 6105 addi sp,sp,32 + 300588e: 8082 ret + +03005890 : +#define PARITY_EVEN 0x6 +#define PARITY_MARK 0x82 +#define PARITY_SPACE 0x86 + +static unsigned int DivClosest(unsigned int x, unsigned int divisor) +{ + 3005890: 7179 addi sp,sp,-48 + 3005892: d622 sw s0,44(sp) + 3005894: 1800 addi s0,sp,48 + 3005896: fca42e23 sw a0,-36(s0) + 300589a: fcb42c23 sw a1,-40(s0) + unsigned int ret; + if (divisor == 0) { + 300589e: fd842783 lw a5,-40(s0) + 30058a2: e399 bnez a5,30058a8 + return 0; + 30058a4: 4781 li a5,0 + 30058a6: a005 j 30058c6 + } + ret = (((x) + ((divisor) / 2)) / (divisor)); /* Round up the result, add 1/2 */ + 30058a8: fd842783 lw a5,-40(s0) + 30058ac: 0017d713 srli a4,a5,0x1 + 30058b0: fdc42783 lw a5,-36(s0) + 30058b4: 973e add a4,a4,a5 + 30058b6: fd842783 lw a5,-40(s0) + 30058ba: 02f757b3 divu a5,a4,a5 + 30058be: fef42623 sw a5,-20(s0) + return ret; + 30058c2: fec42783 lw a5,-20(s0) +} + 30058c6: 853e mv a0,a5 + 30058c8: 5432 lw s0,44(sp) + 30058ca: 6145 addi sp,sp,48 + 30058cc: 8082 ret + +030058ce : + * @brief Sets the parity bit of the UART. + * @param uartHandle UART handle. + * @retval None. + */ +static void UART_SetParityBit(UART_Handle *uartHandle) +{ + 30058ce: 1101 addi sp,sp,-32 + 30058d0: ce22 sw s0,28(sp) + 30058d2: 1000 addi s0,sp,32 + 30058d4: fea42623 sw a0,-20(s0) + /* Sets the UART check mode. */ + switch (uartHandle->parity) { + 30058d8: fec42783 lw a5,-20(s0) + 30058dc: 4b9c lw a5,16(a5) + 30058de: 4711 li a4,4 + 30058e0: 06f76e63 bltu a4,a5,300595c + 30058e4: 00279713 slli a4,a5,0x2 + 30058e8: 030077b7 lui a5,0x3007 + 30058ec: 9fc78793 addi a5,a5,-1540 # 30069fc + 30058f0: 97ba add a5,a5,a4 + 30058f2: 439c lw a5,0(a5) + 30058f4: 8782 jr a5 + case UART_PARITY_ODD: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_ODD; /* Odd parity. */ + 30058f6: fec42783 lw a5,-20(s0) + 30058fa: 439c lw a5,0(a5) + 30058fc: 57d8 lw a4,44(a5) + 30058fe: fec42783 lw a5,-20(s0) + 3005902: 439c lw a5,0(a5) + 3005904: 00276713 ori a4,a4,2 + 3005908: d7d8 sw a4,44(a5) + break; + 300590a: a891 j 300595e + case UART_PARITY_EVEN: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_EVEN; /* Even parity. */ + 300590c: fec42783 lw a5,-20(s0) + 3005910: 439c lw a5,0(a5) + 3005912: 57d8 lw a4,44(a5) + 3005914: fec42783 lw a5,-20(s0) + 3005918: 439c lw a5,0(a5) + 300591a: 00676713 ori a4,a4,6 + 300591e: d7d8 sw a4,44(a5) + break; + 3005920: a83d j 300595e + case UART_PARITY_MARK: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_MARK; /* Marking parity */ + 3005922: fec42783 lw a5,-20(s0) + 3005926: 439c lw a5,0(a5) + 3005928: 57d8 lw a4,44(a5) + 300592a: fec42783 lw a5,-20(s0) + 300592e: 439c lw a5,0(a5) + 3005930: 08276713 ori a4,a4,130 + 3005934: d7d8 sw a4,44(a5) + break; + 3005936: a025 j 300595e + case UART_PARITY_SPACE: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_SPACE; /* space parity */ + 3005938: fec42783 lw a5,-20(s0) + 300593c: 439c lw a5,0(a5) + 300593e: 57d8 lw a4,44(a5) + 3005940: fec42783 lw a5,-20(s0) + 3005944: 439c lw a5,0(a5) + 3005946: 08676713 ori a4,a4,134 + 300594a: d7d8 sw a4,44(a5) + break; + 300594c: a809 j 300595e + case UART_PARITY_NONE: + uartHandle->baseAddress->UART_LCR_H.BIT.pen = BASE_CFG_DISABLE; /* No parity */ + 300594e: fec42783 lw a5,-20(s0) + 3005952: 4398 lw a4,0(a5) + 3005954: 575c lw a5,44(a4) + 3005956: 9bf5 andi a5,a5,-3 + 3005958: d75c sw a5,44(a4) + break; + 300595a: a011 j 300595e + default: + return; + 300595c: 0001 nop + } +} + 300595e: 4472 lw s0,28(sp) + 3005960: 6105 addi sp,sp,32 + 3005962: 8082 ret + +03005964 : + * @brief Initialize the UART hardware configuration and configure parameters based on the specified handle. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_Init(UART_Handle *uartHandle) +{ + 3005964: 7179 addi sp,sp,-48 + 3005966: d606 sw ra,44(sp) + 3005968: d422 sw s0,40(sp) + 300596a: 1800 addi s0,sp,48 + 300596c: fca42e23 sw a0,-36(s0) + UART_ASSERT_PARAM(uartHandle != NULL); + 3005970: fdc42783 lw a5,-36(s0) + 3005974: eb89 bnez a5,3005986 + 3005976: 09700593 li a1,151 + 300597a: 030077b7 lui a5,0x3007 + 300597e: a1078513 addi a0,a5,-1520 # 3006a10 + 3005982: 313d jal ra,30055b0 + 3005984: a001 j 3005984 + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + 3005986: fdc42783 lw a5,-36(s0) + 300598a: 4398 lw a4,0(a5) + 300598c: 140007b7 lui a5,0x14000 + 3005990: 02f70f63 beq a4,a5,30059ce + 3005994: fdc42783 lw a5,-36(s0) + 3005998: 4398 lw a4,0(a5) + 300599a: 140017b7 lui a5,0x14001 + 300599e: 02f70863 beq a4,a5,30059ce + 30059a2: fdc42783 lw a5,-36(s0) + 30059a6: 4398 lw a4,0(a5) + 30059a8: 140027b7 lui a5,0x14002 + 30059ac: 02f70163 beq a4,a5,30059ce + 30059b0: fdc42783 lw a5,-36(s0) + 30059b4: 4398 lw a4,0(a5) + 30059b6: 140037b7 lui a5,0x14003 + 30059ba: 00f70a63 beq a4,a5,30059ce + 30059be: 09800593 li a1,152 + 30059c2: 030077b7 lui a5,0x3007 + 30059c6: a1078513 addi a0,a5,-1520 # 3006a10 + 30059ca: 36dd jal ra,30055b0 + 30059cc: a001 j 30059cc + UART_PARAM_CHECK_WITH_RET(uartHandle->txState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 30059ce: fdc42783 lw a5,-36(s0) + 30059d2: 47bc lw a5,72(a5) + 30059d4: cb91 beqz a5,30059e8 + 30059d6: 09900593 li a1,153 + 30059da: 030077b7 lui a5,0x3007 + 30059de: a1078513 addi a0,a5,-1520 # 3006a10 + 30059e2: 36f9 jal ra,30055b0 + 30059e4: 4785 li a5,1 + 30059e6: ae0d j 3005d18 + UART_PARAM_CHECK_WITH_RET(uartHandle->rxState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 30059e8: fdc42783 lw a5,-36(s0) + 30059ec: 47fc lw a5,76(a5) + 30059ee: cb91 beqz a5,3005a02 + 30059f0: 09a00593 li a1,154 + 30059f4: 030077b7 lui a5,0x3007 + 30059f8: a1078513 addi a0,a5,-1520 # 3006a10 + 30059fc: 3e55 jal ra,30055b0 + 30059fe: 4785 li a5,1 + 3005a00: ae21 j 3005d18 + unsigned int uartClock, quot; + UART_PARAM_CHECK_WITH_RET(IsUartDatalength(uartHandle->dataLength), BASE_STATUS_ERROR); + 3005a02: fdc42783 lw a5,-36(s0) + 3005a06: 479c lw a5,8(a5) + 3005a08: 853e mv a0,a5 + 3005a0a: 3365 jal ra,30057b2 + 3005a0c: 87aa mv a5,a0 + 3005a0e: 0017c793 xori a5,a5,1 + 3005a12: 9f81 uxtb a5 + 3005a14: cb91 beqz a5,3005a28 + 3005a16: 09c00593 li a1,156 + 3005a1a: 030077b7 lui a5,0x3007 + 3005a1e: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a22: 3679 jal ra,30055b0 + 3005a24: 4785 li a5,1 + 3005a26: accd j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartStopbits(uartHandle->stopBits), BASE_STATUS_ERROR); + 3005a28: fdc42783 lw a5,-36(s0) + 3005a2c: 47dc lw a5,12(a5) + 3005a2e: 853e mv a0,a5 + 3005a30: 3b79 jal ra,30057ce + 3005a32: 87aa mv a5,a0 + 3005a34: 0017c793 xori a5,a5,1 + 3005a38: 9f81 uxtb a5 + 3005a3a: cb91 beqz a5,3005a4e + 3005a3c: 09d00593 li a1,157 + 3005a40: 030077b7 lui a5,0x3007 + 3005a44: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a48: 36a5 jal ra,30055b0 + 3005a4a: 4785 li a5,1 + 3005a4c: a4f1 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartParitymode(uartHandle->parity), BASE_STATUS_ERROR); + 3005a4e: fdc42783 lw a5,-36(s0) + 3005a52: 4b9c lw a5,16(a5) + 3005a54: 853e mv a0,a5 + 3005a56: 3355 jal ra,30057fa + 3005a58: 87aa mv a5,a0 + 3005a5a: 0017c793 xori a5,a5,1 + 3005a5e: 9f81 uxtb a5 + 3005a60: cb91 beqz a5,3005a74 + 3005a62: 09e00593 li a1,158 + 3005a66: 030077b7 lui a5,0x3007 + 3005a6a: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a6e: 3689 jal ra,30055b0 + 3005a70: 4785 li a5,1 + 3005a72: a45d j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->txMode), BASE_STATUS_ERROR); + 3005a74: fdc42783 lw a5,-36(s0) + 3005a78: 4bdc lw a5,20(a5) + 3005a7a: 853e mv a0,a5 + 3005a7c: 3345 jal ra,300581c + 3005a7e: 87aa mv a5,a0 + 3005a80: 0017c793 xori a5,a5,1 + 3005a84: 9f81 uxtb a5 + 3005a86: cb91 beqz a5,3005a9a + 3005a88: 09f00593 li a1,159 + 3005a8c: 030077b7 lui a5,0x3007 + 3005a90: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a94: 3e31 jal ra,30055b0 + 3005a96: 4785 li a5,1 + 3005a98: a441 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->rxMode), BASE_STATUS_ERROR); + 3005a9a: fdc42783 lw a5,-36(s0) + 3005a9e: 4f9c lw a5,24(a5) + 3005aa0: 853e mv a0,a5 + 3005aa2: 3bad jal ra,300581c + 3005aa4: 87aa mv a5,a0 + 3005aa6: 0017c793 xori a5,a5,1 + 3005aaa: 9f81 uxtb a5 + 3005aac: cb91 beqz a5,3005ac0 + 3005aae: 0a000593 li a1,160 + 3005ab2: 030077b7 lui a5,0x3007 + 3005ab6: a1078513 addi a0,a5,-1520 # 3006a10 + 3005aba: 3cdd jal ra,30055b0 + 3005abc: 4785 li a5,1 + 3005abe: aca9 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoTxThr), BASE_STATUS_ERROR); + 3005ac0: fdc42783 lw a5,-36(s0) + 3005ac4: 5b9c lw a5,48(a5) + 3005ac6: 853e mv a0,a5 + 3005ac8: 3b41 jal ra,3005858 + 3005aca: 87aa mv a5,a0 + 3005acc: 0017c793 xori a5,a5,1 + 3005ad0: 9f81 uxtb a5 + 3005ad2: cb91 beqz a5,3005ae6 + 3005ad4: 0a100593 li a1,161 + 3005ad8: 030077b7 lui a5,0x3007 + 3005adc: a1078513 addi a0,a5,-1520 # 3006a10 + 3005ae0: 3cc1 jal ra,30055b0 + 3005ae2: 4785 li a5,1 + 3005ae4: ac15 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoRxThr), BASE_STATUS_ERROR); + 3005ae6: fdc42783 lw a5,-36(s0) + 3005aea: 5bdc lw a5,52(a5) + 3005aec: 853e mv a0,a5 + 3005aee: 33ad jal ra,3005858 + 3005af0: 87aa mv a5,a0 + 3005af2: 0017c793 xori a5,a5,1 + 3005af6: 9f81 uxtb a5 + 3005af8: cb91 beqz a5,3005b0c + 3005afa: 0a200593 li a1,162 + 3005afe: 030077b7 lui a5,0x3007 + 3005b02: a1078513 addi a0,a5,-1520 # 3006a10 + 3005b06: 346d jal ra,30055b0 + 3005b08: 4785 li a5,1 + 3005b0a: a439 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartOversampleMultiple(uartHandle->handleEx.overSampleMultiple), BASE_STATUS_ERROR); + 3005b0c: fdc42783 lw a5,-36(s0) + 3005b10: 5fbc lw a5,120(a5) + 3005b12: 853e mv a0,a5 + 3005b14: 3385 jal ra,3005874 + 3005b16: 87aa mv a5,a0 + 3005b18: 0017c793 xori a5,a5,1 + 3005b1c: 9f81 uxtb a5 + 3005b1e: cb91 beqz a5,3005b32 + 3005b20: 0a300593 li a1,163 + 3005b24: 030077b7 lui a5,0x3007 + 3005b28: a1078513 addi a0,a5,-1520 # 3006a10 + 3005b2c: 3451 jal ra,30055b0 + 3005b2e: 4785 li a5,1 + 3005b30: a2e5 j 3005d18 + + uartHandle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; + 3005b32: fdc42783 lw a5,-36(s0) + 3005b36: 4398 lw a4,0(a5) + 3005b38: 5b1c lw a5,48(a4) + 3005b3a: 9bf9 andi a5,a5,-2 + 3005b3c: db1c sw a5,48(a4) + while (uartHandle->baseAddress->UART_FR.BIT.busy == 0x01) { + 3005b3e: 0001 nop + 3005b40: fdc42783 lw a5,-36(s0) + 3005b44: 439c lw a5,0(a5) + 3005b46: 4f9c lw a5,24(a5) + 3005b48: 838d srli a5,a5,0x3 + 3005b4a: 8b85 andi a5,a5,1 + 3005b4c: 0ff7f713 andi a4,a5,255 + 3005b50: 4785 li a5,1 + 3005b52: fef707e3 beq a4,a5,3005b40 + ; + } + + uartClock = HAL_CRG_GetIpFreq((void *)uartHandle->baseAddress); + 3005b56: fdc42783 lw a5,-36(s0) + 3005b5a: 439c lw a5,0(a5) + 3005b5c: 853e mv a0,a5 + 3005b5e: 9f1fd0ef jal ra,300354e + 3005b62: fea42623 sw a0,-20(s0) + + /* DCL OverSample Multiple check */ + uartHandle->baseAddress->UART_SPCFG.BIT.spcfg = uartHandle->handleEx.overSampleMultiple; + 3005b66: fdc42783 lw a5,-36(s0) + 3005b6a: 5fb4 lw a3,120(a5) + 3005b6c: fdc42783 lw a5,-36(s0) + 3005b70: 4398 lw a4,0(a5) + 3005b72: 87b6 mv a5,a3 + 3005b74: 8bbd andi a5,a5,15 + 3005b76: 0ff7f693 andi a3,a5,255 + 3005b7a: 4f3c lw a5,88(a4) + 3005b7c: 8abd andi a3,a3,15 + 3005b7e: 9bc1 andi a5,a5,-16 + 3005b80: 8fd5 or a5,a5,a3 + 3005b82: cf3c sw a5,88(a4) + + /* DCL sequences setting */ + uartHandle->baseAddress->UART_DS.BIT.msbfirst = uartHandle->handleEx.msbFirst; + 3005b84: fdc42783 lw a5,-36(s0) + 3005b88: 4398 lw a4,0(a5) + 3005b8a: fdc42783 lw a5,-36(s0) + 3005b8e: 07c7c683 lbu a3,124(a5) + 3005b92: 4b3c lw a5,80(a4) + 3005b94: 8a85 andi a3,a3,1 + 3005b96: 9bf9 andi a5,a5,-2 + 3005b98: 8fd5 or a5,a5,a3 + 3005b9a: cb3c sw a5,80(a4) + + /* The baud rate divider(BRD) based on the baud rate and clock frequency, calculation formula */ + unsigned int oversample = uartHandle->baseAddress->UART_SPCFG.reg; + 3005b9c: fdc42783 lw a5,-36(s0) + 3005ba0: 439c lw a5,0(a5) + 3005ba2: 4fbc lw a5,88(a5) + 3005ba4: fef42423 sw a5,-24(s0) + if (uartHandle->baudRate > (uartClock / (OVERSAMPLING_PARAM - oversample))) { + 3005ba8: fdc42783 lw a5,-36(s0) + 3005bac: 43d8 lw a4,4(a5) + 3005bae: 46c1 li a3,16 + 3005bb0: fe842783 lw a5,-24(s0) + 3005bb4: 40f687b3 sub a5,a3,a5 + 3005bb8: fec42683 lw a3,-20(s0) + 3005bbc: 02f6d7b3 divu a5,a3,a5 + 3005bc0: 00e7f463 bgeu a5,a4,3005bc8 + return BASE_STATUS_ERROR; + 3005bc4: 4785 li a5,1 + 3005bc6: aa89 j 3005d18 + } else { + unsigned int tmpClock = uartClock / (OVERSAMPLING_PARAM - oversample) * 64; /* 64 is for decimal parts */ + 3005bc8: 4741 li a4,16 + 3005bca: fe842783 lw a5,-24(s0) + 3005bce: 40f707b3 sub a5,a4,a5 + 3005bd2: fec42703 lw a4,-20(s0) + 3005bd6: 02f757b3 divu a5,a4,a5 + 3005bda: 079a slli a5,a5,0x6 + 3005bdc: fef42223 sw a5,-28(s0) + quot = DivClosest(tmpClock, uartHandle->baudRate); + 3005be0: fdc42783 lw a5,-36(s0) + 3005be4: 43dc lw a5,4(a5) + 3005be6: 85be mv a1,a5 + 3005be8: fe442503 lw a0,-28(s0) + 3005bec: 3155 jal ra,3005890 + 3005bee: fea42023 sw a0,-32(s0) + } + /* Clear the baud rate divider register */ + uartHandle->baseAddress->UART_FBRD.reg = 0; + 3005bf2: fdc42783 lw a5,-36(s0) + 3005bf6: 439c lw a5,0(a5) + 3005bf8: 0207a423 sw zero,40(a5) + uartHandle->baseAddress->UART_IBRD.reg = 0; + 3005bfc: fdc42783 lw a5,-36(s0) + 3005c00: 439c lw a5,0(a5) + 3005c02: 0207a223 sw zero,36(a5) + /* The fractional baud rate divider value is stored to the lower 6 bits of the FBRD */ + uartHandle->baseAddress->UART_FBRD.reg = (quot & 0x3F); + 3005c06: fdc42783 lw a5,-36(s0) + 3005c0a: 439c lw a5,0(a5) + 3005c0c: fe042703 lw a4,-32(s0) + 3005c10: 03f77713 andi a4,a4,63 + 3005c14: d798 sw a4,40(a5) + /* Right shift 6 bits is the integer baud rate divider value, is stored to IBRD */ + uartHandle->baseAddress->UART_IBRD.reg = (quot >> 6); + 3005c16: fdc42783 lw a5,-36(s0) + 3005c1a: 439c lw a5,0(a5) + 3005c1c: fe042703 lw a4,-32(s0) + 3005c20: 8319 srli a4,a4,0x6 + 3005c22: d3d8 sw a4,36(a5) + uartHandle->baseAddress->UART_LCR_H.reg = 0; + 3005c24: fdc42783 lw a5,-36(s0) + 3005c28: 439c lw a5,0(a5) + 3005c2a: 0207a623 sw zero,44(a5) + uartHandle->baseAddress->UART_LCR_H.BIT.wlen = uartHandle->dataLength; /* Frame length seting */ + 3005c2e: fdc42783 lw a5,-36(s0) + 3005c32: 4794 lw a3,8(a5) + 3005c34: fdc42783 lw a5,-36(s0) + 3005c38: 4398 lw a4,0(a5) + 3005c3a: 87b6 mv a5,a3 + 3005c3c: 8b8d andi a5,a5,3 + 3005c3e: 0ff7f693 andi a3,a5,255 + 3005c42: 575c lw a5,44(a4) + 3005c44: 8a8d andi a3,a3,3 + 3005c46: 0696 slli a3,a3,0x5 + 3005c48: f9f7f793 andi a5,a5,-97 + 3005c4c: 8fd5 or a5,a5,a3 + 3005c4e: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_LCR_H.BIT.stp2 = uartHandle->stopBits; /* Stop bit seting */ + 3005c50: fdc42783 lw a5,-36(s0) + 3005c54: 47d4 lw a3,12(a5) + 3005c56: fdc42783 lw a5,-36(s0) + 3005c5a: 4398 lw a4,0(a5) + 3005c5c: 87b6 mv a5,a3 + 3005c5e: 8b85 andi a5,a5,1 + 3005c60: 0ff7f693 andi a3,a5,255 + 3005c64: 575c lw a5,44(a4) + 3005c66: 8a85 andi a3,a3,1 + 3005c68: 068e slli a3,a3,0x3 + 3005c6a: 9bdd andi a5,a5,-9 + 3005c6c: 8fd5 or a5,a5,a3 + 3005c6e: d75c sw a5,44(a4) + UART_SetParityBit(uartHandle); + 3005c70: fdc42503 lw a0,-36(s0) + 3005c74: 39a9 jal ra,30058ce + if (uartHandle->fifoMode == true) { /* FIFO threshold setting */ + 3005c76: fdc42783 lw a5,-36(s0) + 3005c7a: 02c7c783 lbu a5,44(a5) + 3005c7e: cbb1 beqz a5,3005cd2 + uartHandle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_ENABLE; + 3005c80: fdc42783 lw a5,-36(s0) + 3005c84: 4398 lw a4,0(a5) + 3005c86: 575c lw a5,44(a4) + 3005c88: 0107e793 ori a5,a5,16 + 3005c8c: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_IFLS.BIT.rxiflsel = uartHandle->fifoRxThr; + 3005c8e: fdc42783 lw a5,-36(s0) + 3005c92: 5bd4 lw a3,52(a5) + 3005c94: fdc42783 lw a5,-36(s0) + 3005c98: 4398 lw a4,0(a5) + 3005c9a: 87b6 mv a5,a3 + 3005c9c: 8bbd andi a5,a5,15 + 3005c9e: 0ff7f693 andi a3,a5,255 + 3005ca2: 5b5c lw a5,52(a4) + 3005ca4: 8abd andi a3,a3,15 + 3005ca6: 06a2 slli a3,a3,0x8 + 3005ca8: 767d lui a2,0xfffff + 3005caa: 0ff60613 addi a2,a2,255 # fffff0ff + 3005cae: 8ff1 and a5,a5,a2 + 3005cb0: 8fd5 or a5,a5,a3 + 3005cb2: db5c sw a5,52(a4) + uartHandle->baseAddress->UART_IFLS.BIT.txiflsel = uartHandle->fifoTxThr; + 3005cb4: fdc42783 lw a5,-36(s0) + 3005cb8: 5b94 lw a3,48(a5) + 3005cba: fdc42783 lw a5,-36(s0) + 3005cbe: 4398 lw a4,0(a5) + 3005cc0: 87b6 mv a5,a3 + 3005cc2: 8bbd andi a5,a5,15 + 3005cc4: 0ff7f693 andi a3,a5,255 + 3005cc8: 5b5c lw a5,52(a4) + 3005cca: 8abd andi a3,a3,15 + 3005ccc: 9bc1 andi a5,a5,-16 + 3005cce: 8fd5 or a5,a5,a3 + 3005cd0: db5c sw a5,52(a4) + } + if (uartHandle->hwFlowCtr == UART_HW_FLOWCTR_ENABLE) { /* Hardwarer flow control setting */ + 3005cd2: fdc42783 lw a5,-36(s0) + 3005cd6: 5f98 lw a4,56(a5) + 3005cd8: 4785 li a5,1 + 3005cda: 00f71c63 bne a4,a5,3005cf2 + uartHandle->baseAddress->UART_CR.reg |= 0xC000; + 3005cde: fdc42783 lw a5,-36(s0) + 3005ce2: 439c lw a5,0(a5) + 3005ce4: 5b94 lw a3,48(a5) + 3005ce6: fdc42783 lw a5,-36(s0) + 3005cea: 439c lw a5,0(a5) + 3005cec: 6731 lui a4,0xc + 3005cee: 8f55 or a4,a4,a3 + 3005cf0: db98 sw a4,48(a5) + } + uartHandle->baseAddress->UART_CR.reg |= 0x301; /* Enable bit use 0x301 is to set txe/rxe/uarten */ + 3005cf2: fdc42783 lw a5,-36(s0) + 3005cf6: 439c lw a5,0(a5) + 3005cf8: 5b98 lw a4,48(a5) + 3005cfa: fdc42783 lw a5,-36(s0) + 3005cfe: 439c lw a5,0(a5) + 3005d00: 30176713 ori a4,a4,769 + 3005d04: db98 sw a4,48(a5) + uartHandle->txState = UART_STATE_READY; + 3005d06: fdc42783 lw a5,-36(s0) + 3005d0a: 4705 li a4,1 + 3005d0c: c7b8 sw a4,72(a5) + uartHandle->rxState = UART_STATE_READY; + 3005d0e: fdc42783 lw a5,-36(s0) + 3005d12: 4705 li a4,1 + 3005d14: c7f8 sw a4,76(a5) + return BASE_STATUS_OK; + 3005d16: 4781 li a5,0 +} + 3005d18: 853e mv a0,a5 + 3005d1a: 50b2 lw ra,44(sp) + 3005d1c: 5422 lw s0,40(sp) + 3005d1e: 6145 addi sp,sp,48 + 3005d20: 8082 ret + +03005d22
: +/* USER CODE BEGIN 1 */ +/* 建议用户定义全局变量、结构体、宏定义或函数声明等 */ +/* USER CODE END 1 */ + +int main(void) +{ + 3005d22: 1141 addi sp,sp,-16 + 3005d24: c606 sw ra,12(sp) + 3005d26: c422 sw s0,8(sp) + 3005d28: 0800 addi s0,sp,16 + /* USER CODE BEGIN 2 */ + /* 建议用户放置初始化代码或启动代码等 */ + /* USER CODE END 2 */ + SystemInit(); + 3005d2a: 2ee5 jal ra,3006122 + /* USER CODE BEGIN 3 */ + /* 建议用户放置初始配置代码 */ + /* USER CODE END 3 */ + while (1) { + 3005d2c: a001 j 3005d2c + +03005d2e : +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + 3005d2e: 715d addi sp,sp,-80 + 3005d30: c686 sw ra,76(sp) + 3005d32: c4a2 sw s0,72(sp) + 3005d34: 0880 addi s0,sp,80 + 3005d36: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3005d3a: 100007b7 lui a5,0x10000 + 3005d3e: fcf42423 sw a5,-56(s0) + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + 3005d42: fc042623 sw zero,-52(s0) + crg.pllPreDiv = CRG_PLL_PREDIV_4; + 3005d46: 478d li a5,3 + 3005d48: fcf42823 sw a5,-48(s0) + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + 3005d4c: 03000793 li a5,48 + 3005d50: fcf42a23 sw a5,-44(s0) + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + 3005d54: 4785 li a5,1 + 3005d56: fcf42c23 sw a5,-40(s0) + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + 3005d5a: 4789 li a5,2 + 3005d5c: fef42023 sw a5,-32(s0) + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + 3005d60: 4789 li a5,2 + 3005d62: fef42223 sw a5,-28(s0) + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + 3005d66: fe042423 sw zero,-24(s0) + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + 3005d6a: 47e1 li a5,24 + 3005d6c: fef42623 sw a5,-20(s0) + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + 3005d70: fc840793 addi a5,s0,-56 + 3005d74: 853e mv a0,a5 + 3005d76: aecfd0ef jal ra,3003062 + 3005d7a: 87aa mv a5,a0 + 3005d7c: c399 beqz a5,3005d82 + return BASE_STATUS_ERROR; + 3005d7e: 4785 li a5,1 + 3005d80: a039 j 3005d8e + } + *coreClkSelect = crg.coreClkSelect; + 3005d82: fe042703 lw a4,-32(s0) + 3005d86: fbc42783 lw a5,-68(s0) + 3005d8a: c398 sw a4,0(a5) + return BASE_STATUS_OK; + 3005d8c: 4781 li a5,0 +} + 3005d8e: 853e mv a0,a5 + 3005d90: 40b6 lw ra,76(sp) + 3005d92: 4426 lw s0,72(sp) + 3005d94: 6161 addi sp,sp,80 + 3005d96: 8082 ret + +03005d98 : + +__weak void ADC0Interrupt2Callback(ADC_Handle *handle) +{ + 3005d98: 1101 addi sp,sp,-32 + 3005d9a: ce22 sw s0,28(sp) + 3005d9c: 1000 addi s0,sp,32 + 3005d9e: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ADC0_CALLBACK_INT2 */ + /* USER CODE END ADC0_CALLBACK_INT2 */ +} + 3005da2: 0001 nop + 3005da4: 4472 lw s0,28(sp) + 3005da6: 6105 addi sp,sp,32 + 3005da8: 8082 ret + +03005daa : + +static void ADC0_Init(void) +{ + 3005daa: 7179 addi sp,sp,-48 + 3005dac: d606 sw ra,44(sp) + 3005dae: d422 sw s0,40(sp) + 3005db0: 1800 addi s0,sp,48 + HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); + 3005db2: 4585 li a1,1 + 3005db4: 18000537 lui a0,0x18000 + 3005db8: 2c49 jal ra,300604a + HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); + 3005dba: 4589 li a1,2 + 3005dbc: 18000537 lui a0,0x18000 + 3005dc0: 94bfd0ef jal ra,300370a + HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_1); + 3005dc4: 4581 li a1,0 + 3005dc6: 18000537 lui a0,0x18000 + 3005dca: 9f7fd0ef jal ra,30037c0 + + g_adc0.baseAddress = ADC0; + 3005dce: 040007b7 lui a5,0x4000 + 3005dd2: 54478793 addi a5,a5,1348 # 4000544 + 3005dd6: 18000737 lui a4,0x18000 + 3005dda: c398 sw a4,0(a5) + g_adc0.socPriority = ADC_PRIMODE_ALL_ROUND; + 3005ddc: 040007b7 lui a5,0x4000 + 3005de0: 54478793 addi a5,a5,1348 # 4000544 + 3005de4: 0007a223 sw zero,4(a5) + + HAL_ADC_Init(&g_adc0); + 3005de8: 040007b7 lui a5,0x4000 + 3005dec: 54478513 addi a0,a5,1348 # 4000544 + 3005df0: c97fb0ef jal ra,3001a86 + + SOC_Param socParam = {0}; + 3005df4: fc042e23 sw zero,-36(s0) + 3005df8: fe042023 sw zero,-32(s0) + 3005dfc: fe042223 sw zero,-28(s0) + 3005e00: fe042423 sw zero,-24(s0) + 3005e04: fe042623 sw zero,-20(s0) + socParam.adcInput = ADC_CH_ADCINA6; /* PIN4(ADC AIN6) */ + 3005e08: 4799 li a5,6 + 3005e0a: fcf42e23 sw a5,-36(s0) + socParam.sampleTotalTime = ADC_SOCSAMPLE_10CLK; /* adc sample total time 10 adc_clk */ + 3005e0e: 4789 li a5,2 + 3005e10: fef42023 sw a5,-32(s0) + socParam.trigSource = ADC_TRIGSOC_SOFT; + 3005e14: fe042223 sw zero,-28(s0) + socParam.continueMode = BASE_CFG_ENABLE; + 3005e18: 4785 li a5,1 + 3005e1a: fef40423 sb a5,-24(s0) + socParam.finishMode = ADC_SOCFINISH_INT2; + 3005e1e: 4795 li a5,5 + 3005e20: fef42623 sw a5,-20(s0) + HAL_ADC_ConfigureSoc(&g_adc0, ADC_SOC_NUM1, &socParam); + 3005e24: fdc40793 addi a5,s0,-36 + 3005e28: 863e mv a2,a5 + 3005e2a: 4585 li a1,1 + 3005e2c: 040007b7 lui a5,0x4000 + 3005e30: 54478513 addi a0,a5,1348 # 4000544 + 3005e34: d09fb0ef jal ra,3001b3c + HAL_ADC_RegisterCallBack(&g_adc0, ADC_CALLBACK_INT2, (ADC_CallbackType)ADC0Interrupt2Callback); + 3005e38: 030067b7 lui a5,0x3006 + 3005e3c: d9878613 addi a2,a5,-616 # 3005d98 + 3005e40: 4589 li a1,2 + 3005e42: 040007b7 lui a5,0x4000 + 3005e46: 54478513 addi a0,a5,1348 # 4000544 + 3005e4a: ab6fc0ef jal ra,3002100 + IRQ_Register(IRQ_ADC0_INT2, HAL_ADC_IrqHandlerInt2, &g_adc0); + 3005e4e: 040007b7 lui a5,0x4000 + 3005e52: 54478613 addi a2,a5,1348 # 4000544 + 3005e56: 030027b7 lui a5,0x3002 + 3005e5a: 03678593 addi a1,a5,54 # 3002036 + 3005e5e: 05f00513 li a0,95 + 3005e62: d88fc0ef jal ra,30023ea + IRQ_SetPriority(IRQ_ADC0_INT2, 1); /* 1 is priority value */ + 3005e66: 4585 li a1,1 + 3005e68: 05f00513 li a0,95 + 3005e6c: d53fc0ef jal ra,3002bbe + IRQ_EnableN(IRQ_ADC0_INT2); + 3005e70: 05f00513 li a0,95 + 3005e74: dfcfc0ef jal ra,3002470 +} + 3005e78: 0001 nop + 3005e7a: 50b2 lw ra,44(sp) + 3005e7c: 5422 lw s0,40(sp) + 3005e7e: 6145 addi sp,sp,48 + 3005e80: 8082 ret + +03005e82 : + /* USER CODE BEGIN TIMER3_InterruptProcess */ + /* USER CODE END TIMER3_InterruptProcess */ +} + +static void TIMER3_Init(void) +{ + 3005e82: 1101 addi sp,sp,-32 + 3005e84: ce06 sw ra,28(sp) + 3005e86: cc22 sw s0,24(sp) + 3005e88: 1000 addi s0,sp,32 + HAL_CRG_IpEnableSet(TIMER3_BASE, IP_CLK_ENABLE); /* TIMER3 clock enable. */ + 3005e8a: 4585 li a1,1 + 3005e8c: 14303537 lui a0,0x14303 + 3005e90: 2a6d jal ra,300604a + unsigned int load = (HAL_CRG_GetIpFreq((void *)TIMER3) / (1u << (TIMERPRESCALER_NO_DIV * 4)) / 1000000u) * 10; + 3005e92: 14303537 lui a0,0x14303 + 3005e96: eb8fd0ef jal ra,300354e + 3005e9a: 872a mv a4,a0 + 3005e9c: 000f47b7 lui a5,0xf4 + 3005ea0: 24078793 addi a5,a5,576 # f4240 + 3005ea4: 02f75733 divu a4,a4,a5 + 3005ea8: 47a9 li a5,10 + 3005eaa: 02f707b3 mul a5,a4,a5 + 3005eae: fef42623 sw a5,-20(s0) + + g_timer3.baseAddress = TIMER3; + 3005eb2: 040007b7 lui a5,0x4000 + 3005eb6: 49c78793 addi a5,a5,1180 # 400049c + 3005eba: 14303737 lui a4,0x14303 + 3005ebe: c398 sw a4,0(a5) + g_timer3.load = load - 1; /* Set timer value immediately */ + 3005ec0: fec42783 lw a5,-20(s0) + 3005ec4: fff78713 addi a4,a5,-1 + 3005ec8: 040007b7 lui a5,0x4000 + 3005ecc: 49c78793 addi a5,a5,1180 # 400049c + 3005ed0: cbd8 sw a4,20(a5) + g_timer3.bgLoad = load - 1; /* Set timer value */ + 3005ed2: fec42783 lw a5,-20(s0) + 3005ed6: fff78713 addi a4,a5,-1 + 3005eda: 040007b7 lui a5,0x4000 + 3005ede: 49c78793 addi a5,a5,1180 # 400049c + 3005ee2: cf98 sw a4,24(a5) + g_timer3.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ + 3005ee4: 040007b7 lui a5,0x4000 + 3005ee8: 49c78793 addi a5,a5,1180 # 400049c + 3005eec: 4705 li a4,1 + 3005eee: c798 sw a4,8(a5) + g_timer3.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ + 3005ef0: 040007b7 lui a5,0x4000 + 3005ef4: 49c78793 addi a5,a5,1180 # 400049c + 3005ef8: 0007a623 sw zero,12(a5) + g_timer3.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ + 3005efc: 040007b7 lui a5,0x4000 + 3005f00: 49c78793 addi a5,a5,1180 # 400049c + 3005f04: 4705 li a4,1 + 3005f06: cb98 sw a4,16(a5) + g_timer3.interruptEn = BASE_CFG_ENABLE; + 3005f08: 040007b7 lui a5,0x4000 + 3005f0c: 49c78793 addi a5,a5,1180 # 400049c + 3005f10: 4705 li a4,1 + 3005f12: afd8 sb a4,28(a5) + g_timer3.adcSocReqEnable = BASE_CFG_DISABLE; + 3005f14: 040007b7 lui a5,0x4000 + 3005f18: 49c78793 addi a5,a5,1180 # 400049c + 3005f1c: 00078ea3 sb zero,29(a5) + g_timer3.dmaReqEnable = BASE_CFG_DISABLE; + 3005f20: 040007b7 lui a5,0x4000 + 3005f24: 49c78793 addi a5,a5,1180 # 400049c + 3005f28: 00078f23 sb zero,30(a5) + HAL_TIMER_Init(&g_timer3); + 3005f2c: 040007b7 lui a5,0x4000 + 3005f30: 49c78513 addi a0,a5,1180 # 400049c + 3005f34: c2aff0ef jal ra,300535e + IRQ_Register(IRQ_TIMER3, HAL_TIMER_IrqHandler, &g_timer3); + 3005f38: 040007b7 lui a5,0x4000 + 3005f3c: 49c78613 addi a2,a5,1180 # 400049c + 3005f40: 030057b7 lui a5,0x3005 + 3005f44: 63678593 addi a1,a5,1590 # 3005636 + 3005f48: 02300513 li a0,35 + 3005f4c: c9efc0ef jal ra,30023ea + + HAL_TIMER_RegisterCallback(&g_timer3, TIMER_PERIOD_FIN, TIMER3_InterruptProcess); + 3005f50: 030067b7 lui a5,0x3006 + 3005f54: 16278613 addi a2,a5,354 # 3006162 + 3005f58: 4581 li a1,0 + 3005f5a: 040007b7 lui a5,0x4000 + 3005f5e: 49c78513 addi a0,a5,1180 # 400049c + 3005f62: fbcff0ef jal ra,300571e + IRQ_SetPriority(IRQ_TIMER3, 1); /* 1 is priority value */ + 3005f66: 4585 li a1,1 + 3005f68: 02300513 li a0,35 + 3005f6c: c53fc0ef jal ra,3002bbe + IRQ_EnableN(IRQ_TIMER3); + 3005f70: 02300513 li a0,35 + 3005f74: cfcfc0ef jal ra,3002470 +} + 3005f78: 0001 nop + 3005f7a: 40f2 lw ra,28(sp) + 3005f7c: 4462 lw s0,24(sp) + 3005f7e: 6105 addi sp,sp,32 + 3005f80: 8082 ret + +03005f82 : + +static void UART0_Init(void) +{ + 3005f82: 1141 addi sp,sp,-16 + 3005f84: c606 sw ra,12(sp) + 3005f86: c422 sw s0,8(sp) + 3005f88: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + 3005f8a: 4585 li a1,1 + 3005f8c: 14000537 lui a0,0x14000 + 3005f90: 286d jal ra,300604a + g_uart0.baseAddress = UART0; + 3005f92: 040007b7 lui a5,0x4000 + 3005f96: 4c478793 addi a5,a5,1220 # 40004c4 + 3005f9a: 14000737 lui a4,0x14000 + 3005f9e: c398 sw a4,0(a5) + + g_uart0.baudRate = UART0_BAND_RATE; + 3005fa0: 040007b7 lui a5,0x4000 + 3005fa4: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fa8: 6771 lui a4,0x1c + 3005faa: 20070713 addi a4,a4,512 # 1c200 + 3005fae: c3d8 sw a4,4(a5) + g_uart0.dataLength = UART_DATALENGTH_8BIT; + 3005fb0: 040007b7 lui a5,0x4000 + 3005fb4: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fb8: 470d li a4,3 + 3005fba: c798 sw a4,8(a5) + g_uart0.stopBits = UART_STOPBITS_ONE; + 3005fbc: 040007b7 lui a5,0x4000 + 3005fc0: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fc4: 0007a623 sw zero,12(a5) + g_uart0.parity = UART_PARITY_NONE; + 3005fc8: 040007b7 lui a5,0x4000 + 3005fcc: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fd0: 4711 li a4,4 + 3005fd2: cb98 sw a4,16(a5) + g_uart0.txMode = UART_MODE_BLOCKING; + 3005fd4: 040007b7 lui a5,0x4000 + 3005fd8: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fdc: 0007aa23 sw zero,20(a5) + g_uart0.rxMode = UART_MODE_BLOCKING; + 3005fe0: 040007b7 lui a5,0x4000 + 3005fe4: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fe8: 0007ac23 sw zero,24(a5) + g_uart0.fifoMode = BASE_CFG_ENABLE; + 3005fec: 040007b7 lui a5,0x4000 + 3005ff0: 4c478793 addi a5,a5,1220 # 40004c4 + 3005ff4: 4705 li a4,1 + 3005ff6: 02e78623 sb a4,44(a5) + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + 3005ffa: 040007b7 lui a5,0x4000 + 3005ffe: 4c478793 addi a5,a5,1220 # 40004c4 + 3006002: 4721 li a4,8 + 3006004: db98 sw a4,48(a5) + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + 3006006: 040007b7 lui a5,0x4000 + 300600a: 4c478793 addi a5,a5,1220 # 40004c4 + 300600e: 4721 li a4,8 + 3006010: dbd8 sw a4,52(a5) + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + 3006012: 040007b7 lui a5,0x4000 + 3006016: 4c478793 addi a5,a5,1220 # 40004c4 + 300601a: 0207ac23 sw zero,56(a5) + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + 300601e: 040007b7 lui a5,0x4000 + 3006022: 4c478793 addi a5,a5,1220 # 40004c4 + 3006026: 0607ac23 sw zero,120(a5) + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + 300602a: 040007b7 lui a5,0x4000 + 300602e: 4c478793 addi a5,a5,1220 # 40004c4 + 3006032: 06078e23 sb zero,124(a5) + HAL_UART_Init(&g_uart0); + 3006036: 040007b7 lui a5,0x4000 + 300603a: 4c478513 addi a0,a5,1220 # 40004c4 + 300603e: 321d jal ra,3005964 +} + 3006040: 0001 nop + 3006042: 40b2 lw ra,12(sp) + 3006044: 4422 lw s0,8(sp) + 3006046: 0141 addi sp,sp,16 + 3006048: 8082 ret + +0300604a : + 300604a: de8fd06f j 3003632 + +0300604e : + +static void IOConfig(void) +{ + 300604e: 1141 addi sp,sp,-16 + 3006050: c606 sw ra,12(sp) + 3006052: c422 sw s0,8(sp) + 3006054: 0800 addi s0,sp,16 + /* Config PIN4 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_ADC_AIN6); /* Check function selection */ + 3006056: 010c07b7 lui a5,0x10c0 + 300605a: 23c78513 addi a0,a5,572 # 10c023c + 300605e: 20c1 jal ra,300611e + HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_ADC_AIN6, PULL_NONE); /* Pull-up and Pull-down */ + 3006060: 4581 li a1,0 + 3006062: 010c07b7 lui a5,0x10c0 + 3006066: 23c78513 addi a0,a5,572 # 10c023c + 300606a: 2845 jal ra,300611a + HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_ADC_AIN6, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 300606c: 4581 li a1,0 + 300606e: 010c07b7 lui a5,0x10c0 + 3006072: 23c78513 addi a0,a5,572 # 10c023c + 3006076: 2045 jal ra,3006116 + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_ADC_AIN6, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3006078: 4585 li a1,1 + 300607a: 010c07b7 lui a5,0x10c0 + 300607e: 23c78513 addi a0,a5,572 # 10c023c + 3006082: 2841 jal ra,3006112 + HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_ADC_AIN6, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3006084: 4589 li a1,2 + 3006086: 010c07b7 lui a5,0x10c0 + 300608a: 23c78513 addi a0,a5,572 # 10c023c + 300608e: 2041 jal ra,300610e + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + 3006090: 019007b7 lui a5,0x1900 + 3006094: 23378513 addi a0,a5,563 # 1900233 + 3006098: 2059 jal ra,300611e + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + 300609a: 4581 li a1,0 + 300609c: 019007b7 lui a5,0x1900 + 30060a0: 23378513 addi a0,a5,563 # 1900233 + 30060a4: 289d jal ra,300611a + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 30060a6: 4581 li a1,0 + 30060a8: 019007b7 lui a5,0x1900 + 30060ac: 23378513 addi a0,a5,563 # 1900233 + 30060b0: 209d jal ra,3006116 + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 30060b2: 4585 li a1,1 + 30060b4: 019007b7 lui a5,0x1900 + 30060b8: 23378513 addi a0,a5,563 # 1900233 + 30060bc: 2899 jal ra,3006112 + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 30060be: 4589 li a1,2 + 30060c0: 019007b7 lui a5,0x1900 + 30060c4: 23378513 addi a0,a5,563 # 1900233 + 30060c8: 2099 jal ra,300610e + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + 30060ca: 019407b7 lui a5,0x1940 + 30060ce: 23378513 addi a0,a5,563 # 1940233 + 30060d2: 20b1 jal ra,300611e + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + 30060d4: 4589 li a1,2 + 30060d6: 019407b7 lui a5,0x1940 + 30060da: 23378513 addi a0,a5,563 # 1940233 + 30060de: 2835 jal ra,300611a + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 30060e0: 4581 li a1,0 + 30060e2: 019407b7 lui a5,0x1940 + 30060e6: 23378513 addi a0,a5,563 # 1940233 + 30060ea: 2035 jal ra,3006116 + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 30060ec: 4585 li a1,1 + 30060ee: 019407b7 lui a5,0x1940 + 30060f2: 23378513 addi a0,a5,563 # 1940233 + 30060f6: 2831 jal ra,3006112 + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 30060f8: 4589 li a1,2 + 30060fa: 019407b7 lui a5,0x1940 + 30060fe: 23378513 addi a0,a5,563 # 1940233 + 3006102: 2031 jal ra,300610e +} + 3006104: 0001 nop + 3006106: 40b2 lw ra,12(sp) + 3006108: 4422 lw s0,8(sp) + 300610a: 0141 addi sp,sp,16 + 300610c: 8082 ret + +0300610e : + 300610e: 924ff06f j 3005232 + +03006112 : + 3006112: 8d4ff06f j 30051e6 + +03006116 : + 3006116: 884ff06f j 300519a + +0300611a : + 300611a: 834ff06f j 300514e + +0300611e : + 300611e: ff7fe06f j 3005114 + +03006122 : + +void SystemInit(void) +{ + 3006122: 1141 addi sp,sp,-16 + 3006124: c606 sw ra,12(sp) + 3006126: c422 sw s0,8(sp) + 3006128: 0800 addi s0,sp,16 + IOConfig(); + 300612a: 3715 jal ra,300604e + UART0_Init(); + 300612c: 3d99 jal ra,3005f82 + ADC0_Init(); + 300612e: 39b5 jal ra,3005daa + TIMER3_Init(); + 3006130: 3b89 jal ra,3005e82 + + /* USER CODE BEGIN system_init */ + HAL_TIMER_Start(&g_timer3); + 3006132: 040007b7 lui a5,0x4000 + 3006136: 49c78513 addi a0,a5,1180 # 400049c + 300613a: c7aff0ef jal ra,30055b4 + HAL_ADC_StartIt(&g_adc0); + 300613e: 040007b7 lui a5,0x4000 + 3006142: 54478513 addi a0,a5,1348 # 4000544 + 3006146: ba9fb0ef jal ra,3001cee + HAL_ADC_SoftTrigSample(&g_adc0, ADC_SOC_NUM1); + 300614a: 4585 li a1,1 + 300614c: 040007b7 lui a5,0x4000 + 3006150: 54478513 addi a0,a5,1348 # 4000544 + 3006154: cc7fb0ef jal ra,3001e1a + /* USER CODE END system_init */ + 3006158: 0001 nop + 300615a: 40b2 lw ra,12(sp) + 300615c: 4422 lw s0,8(sp) + 300615e: 0141 addi sp,sp,16 + 3006160: 8082 ret + +03006162 : +float adc_num[adc_shownum]={0}; +unsigned int i=0; + + +void TIMER3_InterruptProcess(void *handle) +{ + 3006162: 7179 addi sp,sp,-48 + 3006164: d606 sw ra,44(sp) + 3006166: d422 sw s0,40(sp) + 3006168: 1800 addi s0,sp,48 + 300616a: fca42e23 sw a0,-36(s0) + unsigned int ret = HAL_ADC_GetConvResult(&g_adc0, ADC_SOC_NUM1); + 300616e: 4585 li a1,1 + 3006170: 040007b7 lui a5,0x4000 + 3006174: 54478513 addi a0,a5,1348 # 4000544 + 3006178: d25fb0ef jal ra,3001e9c + 300617c: fea42623 sw a0,-20(s0) + + + adc_num[i] = (float)ret / (float)4096 * 3.3; + 3006180: fec42783 lw a5,-20(s0) + 3006184: d017f753 fcvt.s.wu fa4,a5 + 3006188: 030077b7 lui a5,0x3007 + 300618c: a347a787 flw fa5,-1484(a5) # 3006a34 + 3006190: 18f77753 fdiv.s fa4,fa4,fa5 + 3006194: 040027b7 lui a5,0x4002 + 3006198: 2047a783 lw a5,516(a5) # 4002204 + 300619c: 03007737 lui a4,0x3007 + 30061a0: a3872787 flw fa5,-1480(a4) # 3006a38 + 30061a4: 10f777d3 fmul.s fa5,fa4,fa5 + 30061a8: 04000737 lui a4,0x4000 + 30061ac: 5e470713 addi a4,a4,1508 # 40005e4 + 30061b0: 078a slli a5,a5,0x2 + 30061b2: 97ba add a5,a5,a4 + 30061b4: e39c fsw fa5,0(a5) + i++; + 30061b6: 040027b7 lui a5,0x4002 + 30061ba: 2047a783 lw a5,516(a5) # 4002204 + 30061be: 00178713 addi a4,a5,1 + 30061c2: 040027b7 lui a5,0x4002 + 30061c6: 20e7a223 sw a4,516(a5) # 4002204 + if(i>adc_shownum){ + 30061ca: 040027b7 lui a5,0x4002 + 30061ce: 2047a703 lw a4,516(a5) # 4002204 + 30061d2: 70800793 li a5,1800 + 30061d6: 06e7f563 bgeu a5,a4,3006240 + for(i=0;i + 30061e2: a099 j 3006228 + { + DBG_PRINTF("%.2f\r\n", adc_num[i]); + 30061e4: 040027b7 lui a5,0x4002 + 30061e8: 2047a783 lw a5,516(a5) # 4002204 + 30061ec: 04000737 lui a4,0x4000 + 30061f0: 5e470713 addi a4,a4,1508 # 40005e4 + 30061f4: 078a slli a5,a5,0x2 + 30061f6: 97ba add a5,a5,a4 + 30061f8: 639c flw fa5,0(a5) + 30061fa: 20f78553 fmv.s fa0,fa5 + 30061fe: 20b1 jal ra,300624a <__extendsfdf2> + 3006200: 87aa mv a5,a0 + 3006202: 882e mv a6,a1 + 3006204: 863e mv a2,a5 + 3006206: 86c2 mv a3,a6 + 3006208: 030077b7 lui a5,0x3007 + 300620c: a2c78513 addi a0,a5,-1492 # 3006a2c + 3006210: b31fe0ef jal ra,3004d40 + for(i=0;i + 300621c: 00178713 addi a4,a5,1 + 3006220: 040027b7 lui a5,0x4002 + 3006224: 20e7a223 sw a4,516(a5) # 4002204 + 3006228: 040027b7 lui a5,0x4002 + 300622c: 2047a703 lw a4,516(a5) # 4002204 + 3006230: 70700793 li a5,1799 + 3006234: fae7f8e3 bgeu a5,a4,30061e4 + } + i=0; + 3006238: 040027b7 lui a5,0x4002 + 300623c: 2007a223 sw zero,516(a5) # 4002204 + } + +} + 3006240: 0001 nop + 3006242: 50b2 lw ra,44(sp) + 3006244: 5422 lw s0,40(sp) + 3006246: 6145 addi sp,sp,48 + 3006248: 8082 ret + +0300624a <__extendsfdf2>: + 300624a: 1141 addi sp,sp,-16 + 300624c: c606 sw ra,12(sp) + 300624e: c422 sw s0,8(sp) + 3006250: c226 sw s1,4(sp) + 3006252: e00506d3 fmv.x.w a3,fa0 + 3006256: 002027f3 frrm a5 + 300625a: 0176d513 srli a0,a3,0x17 + 300625e: 0ff57513 andi a0,a0,255 + 3006262: 00800437 lui s0,0x800 + 3006266: 00150793 addi a5,a0,1 # 14000001 + 300626a: 147d addi s0,s0,-1 # 7fffff + 300626c: 0ff7f793 andi a5,a5,255 + 3006270: 4705 li a4,1 + 3006272: 8c75 and s0,s0,a3 + 3006274: 01f6d493 srli s1,a3,0x1f + 3006278: 00f75963 bge a4,a5,300628a <__extendsfdf2+0x40> + 300627c: 00345793 srli a5,s0,0x3 + 3006280: 38050513 addi a0,a0,896 + 3006284: 0476 slli s0,s0,0x1d + 3006286: 4701 li a4,0 + 3006288: a891 j 30062dc <__extendsfdf2+0x92> + 300628a: e915 bnez a0,30062be <__extendsfdf2+0x74> + 300628c: c459 beqz s0,300631a <__extendsfdf2+0xd0> + 300628e: 8522 mv a0,s0 + 3006290: 2c6d jal ra,300654a <__clzsi2> + 3006292: 47a9 li a5,10 + 3006294: 00a7cf63 blt a5,a0,30062b2 <__extendsfdf2+0x68> + 3006298: 47ad li a5,11 + 300629a: 8f89 sub a5,a5,a0 + 300629c: 01550713 addi a4,a0,21 + 30062a0: 00f457b3 srl a5,s0,a5 + 30062a4: 00e41433 sll s0,s0,a4 + 30062a8: 38900713 li a4,905 + 30062ac: 40a70533 sub a0,a4,a0 + 30062b0: bfd9 j 3006286 <__extendsfdf2+0x3c> + 30062b2: ff550793 addi a5,a0,-11 + 30062b6: 00f417b3 sll a5,s0,a5 + 30062ba: 4401 li s0,0 + 30062bc: b7f5 j 30062a8 <__extendsfdf2+0x5e> + 30062be: c02d beqz s0,3006320 <__extendsfdf2+0xd6> + 30062c0: 00400737 lui a4,0x400 + 30062c4: 8f61 and a4,a4,s0 + 30062c6: 00345793 srli a5,s0,0x3 + 30062ca: 00173713 seqz a4,a4 + 30062ce: 000806b7 lui a3,0x80 + 30062d2: 0712 slli a4,a4,0x4 + 30062d4: 0476 slli s0,s0,0x1d + 30062d6: 8fd5 or a5,a5,a3 + 30062d8: 7ff00513 li a0,2047 + 30062dc: 00100637 lui a2,0x100 + 30062e0: 167d addi a2,a2,-1 # fffff + 30062e2: 8ff1 and a5,a5,a2 + 30062e4: 80100637 lui a2,0x80100 + 30062e8: 167d addi a2,a2,-1 # 800fffff + 30062ea: 7ff57513 andi a0,a0,2047 + 30062ee: 0552 slli a0,a0,0x14 + 30062f0: 8ff1 and a5,a5,a2 + 30062f2: 80000637 lui a2,0x80000 + 30062f6: 8fc9 or a5,a5,a0 + 30062f8: fff64613 not a2,a2 + 30062fc: 01f49693 slli a3,s1,0x1f + 3006300: 8ff1 and a5,a5,a2 + 3006302: 00d7e633 or a2,a5,a3 + 3006306: 8522 mv a0,s0 + 3006308: 85b2 mv a1,a2 + 300630a: c319 beqz a4,3006310 <__extendsfdf2+0xc6> + 300630c: 00172073 csrs fflags,a4 + 3006310: 40b2 lw ra,12(sp) + 3006312: 4422 lw s0,8(sp) + 3006314: 4492 lw s1,4(sp) + 3006316: 0141 addi sp,sp,16 + 3006318: 8082 ret + 300631a: 4781 li a5,0 + 300631c: 4501 li a0,0 + 300631e: b7a5 j 3006286 <__extendsfdf2+0x3c> + 3006320: 4781 li a5,0 + 3006322: 7ff00513 li a0,2047 + 3006326: b785 j 3006286 <__extendsfdf2+0x3c> + +03006328 <__truncdfsf2>: + 3006328: 00202873 frrm a6 + 300632c: 001006b7 lui a3,0x100 + 3006330: 16fd addi a3,a3,-1 # fffff + 3006332: 8eed and a3,a3,a1 + 3006334: 0145d893 srli a7,a1,0x14 + 3006338: 00369793 slli a5,a3,0x3 + 300633c: 7ff8f893 andi a7,a7,2047 + 3006340: 01d55693 srli a3,a0,0x1d + 3006344: 8edd or a3,a3,a5 + 3006346: 00188793 addi a5,a7,1 + 300634a: 7ff7f793 andi a5,a5,2047 + 300634e: 4705 li a4,1 + 3006350: 81fd srli a1,a1,0x1f + 3006352: 00351613 slli a2,a0,0x3 + 3006356: 16f75b63 bge a4,a5,30064cc <__truncdfsf2+0x1a4> + 300635a: c8088713 addi a4,a7,-896 + 300635e: 0fe00793 li a5,254 + 3006362: 0ae7d063 bge a5,a4,3006402 <__truncdfsf2+0xda> + 3006366: 04080063 beqz a6,30063a6 <__truncdfsf2+0x7e> + 300636a: 478d li a5,3 + 300636c: 02f81963 bne a6,a5,300639e <__truncdfsf2+0x76> + 3006370: c99d beqz a1,30063a6 <__truncdfsf2+0x7e> + 3006372: 57fd li a5,-1 + 3006374: 0fe00713 li a4,254 + 3006378: 4681 li a3,0 + 300637a: 4615 li a2,5 + 300637c: 4509 li a0,2 + 300637e: 00166613 ori a2,a2,1 + 3006382: 1aa80063 beq a6,a0,3006522 <__truncdfsf2+0x1fa> + 3006386: 450d li a0,3 + 3006388: 18a80a63 beq a6,a0,300651c <__truncdfsf2+0x1f4> + 300638c: 12081763 bnez a6,30064ba <__truncdfsf2+0x192> + 3006390: 00f7f513 andi a0,a5,15 + 3006394: 4891 li a7,4 + 3006396: 13150263 beq a0,a7,30064ba <__truncdfsf2+0x192> + 300639a: 0791 addi a5,a5,4 + 300639c: aa39 j 30064ba <__truncdfsf2+0x192> + 300639e: 4789 li a5,2 + 30063a0: fcf819e3 bne a6,a5,3006372 <__truncdfsf2+0x4a> + 30063a4: d5f9 beqz a1,3006372 <__truncdfsf2+0x4a> + 30063a6: 4781 li a5,0 + 30063a8: 0ff00713 li a4,255 + 30063ac: 4615 li a2,5 + 30063ae: 00579693 slli a3,a5,0x5 + 30063b2: 0006db63 bgez a3,30063c8 <__truncdfsf2+0xa0> + 30063b6: 0705 addi a4,a4,1 # 400001 + 30063b8: 0ff00693 li a3,255 + 30063bc: 16d70563 beq a4,a3,3006526 <__truncdfsf2+0x1fe> + 30063c0: fc0006b7 lui a3,0xfc000 + 30063c4: 16fd addi a3,a3,-1 # fbffffff + 30063c6: 8ff5 and a5,a5,a3 + 30063c8: 0ff00693 li a3,255 + 30063cc: 838d srli a5,a5,0x3 + 30063ce: 00d71663 bne a4,a3,30063da <__truncdfsf2+0xb2> + 30063d2: c781 beqz a5,30063da <__truncdfsf2+0xb2> + 30063d4: 004007b7 lui a5,0x400 + 30063d8: 4581 li a1,0 + 30063da: 008006b7 lui a3,0x800 + 30063de: 16fd addi a3,a3,-1 # 7fffff + 30063e0: 8ff5 and a5,a5,a3 + 30063e2: 808006b7 lui a3,0x80800 + 30063e6: 0ff77713 andi a4,a4,255 + 30063ea: 16fd addi a3,a3,-1 # 807fffff + 30063ec: 075e slli a4,a4,0x17 + 30063ee: 8ff5 and a5,a5,a3 + 30063f0: 05fe slli a1,a1,0x1f + 30063f2: 8fd9 or a5,a5,a4 + 30063f4: 8fcd or a5,a5,a1 + 30063f6: c219 beqz a2,30063fc <__truncdfsf2+0xd4> + 30063f8: 00162073 csrs fflags,a2 + 30063fc: f0078553 fmv.w.x fa0,a5 + 3006400: 8082 ret + 3006402: 08e04e63 bgtz a4,300649e <__truncdfsf2+0x176> + 3006406: 57a5 li a5,-23 + 3006408: 0ef74d63 blt a4,a5,3006502 <__truncdfsf2+0x1da> + 300640c: 008007b7 lui a5,0x800 + 3006410: 4379 li t1,30 + 3006412: 8edd or a3,a3,a5 + 3006414: 40e30333 sub t1,t1,a4 + 3006418: 47fd li a5,31 + 300641a: 0467ce63 blt a5,t1,3006476 <__truncdfsf2+0x14e> + 300641e: c8288893 addi a7,a7,-894 + 3006422: 011617b3 sll a5,a2,a7 + 3006426: 00f037b3 snez a5,a5 + 300642a: 011696b3 sll a3,a3,a7 + 300642e: 00665333 srl t1,a2,t1 + 3006432: 8edd or a3,a3,a5 + 3006434: 00d367b3 or a5,t1,a3 + 3006438: 4701 li a4,0 + 300643a: cff9 beqz a5,3006518 <__truncdfsf2+0x1f0> + 300643c: 00179713 slli a4,a5,0x1 + 3006440: 00777693 andi a3,a4,7 + 3006444: 4601 li a2,0 + 3006446: c28d beqz a3,3006468 <__truncdfsf2+0x140> + 3006448: 4689 li a3,2 + 300644a: 0cd80263 beq a6,a3,300650e <__truncdfsf2+0x1e6> + 300644e: 468d li a3,3 + 3006450: 0ad80b63 beq a6,a3,3006506 <__truncdfsf2+0x1de> + 3006454: 4605 li a2,1 + 3006456: 00081963 bnez a6,3006468 <__truncdfsf2+0x140> + 300645a: 00f77693 andi a3,a4,15 + 300645e: 4511 li a0,4 + 3006460: 4605 li a2,1 + 3006462: 00a68363 beq a3,a0,3006468 <__truncdfsf2+0x140> + 3006466: 0711 addi a4,a4,4 + 3006468: 01b75693 srli a3,a4,0x1b + 300646c: 0016c693 xori a3,a3,1 + 3006470: 8a85 andi a3,a3,1 + 3006472: 4701 li a4,0 + 3006474: a83d j 30064b2 <__truncdfsf2+0x18a> + 3006476: 57f9 li a5,-2 + 3006478: 40e78733 sub a4,a5,a4 + 300647c: 02000793 li a5,32 + 3006480: 00e6d733 srl a4,a3,a4 + 3006484: 4501 li a0,0 + 3006486: 00f30663 beq t1,a5,3006492 <__truncdfsf2+0x16a> + 300648a: ca288893 addi a7,a7,-862 + 300648e: 01169533 sll a0,a3,a7 + 3006492: 00c567b3 or a5,a0,a2 + 3006496: 00f037b3 snez a5,a5 + 300649a: 8fd9 or a5,a5,a4 + 300649c: bf71 j 3006438 <__truncdfsf2+0x110> + 300649e: 051a slli a0,a0,0x6 + 30064a0: 00a037b3 snez a5,a0 + 30064a4: 068e slli a3,a3,0x3 + 30064a6: 8275 srli a2,a2,0x1d + 30064a8: 8edd or a3,a3,a5 + 30064aa: 00c6e7b3 or a5,a3,a2 + 30064ae: 4681 li a3,0 + 30064b0: 4601 li a2,0 + 30064b2: 0077f513 andi a0,a5,7 + 30064b6: ec0513e3 bnez a0,300637c <__truncdfsf2+0x54> + 30064ba: ee068ae3 beqz a3,30063ae <__truncdfsf2+0x86> + 30064be: 00167693 andi a3,a2,1 + 30064c2: ee0686e3 beqz a3,30063ae <__truncdfsf2+0x86> + 30064c6: 00266613 ori a2,a2,2 + 30064ca: b5d5 j 30063ae <__truncdfsf2+0x86> + 30064cc: 00c6e7b3 or a5,a3,a2 + 30064d0: 00089563 bnez a7,30064da <__truncdfsf2+0x1b2> + 30064d4: 00f037b3 snez a5,a5 + 30064d8: b785 j 3006438 <__truncdfsf2+0x110> + 30064da: cf8d beqz a5,3006514 <__truncdfsf2+0x1ec> + 30064dc: 7ff00793 li a5,2047 + 30064e0: 4601 li a2,0 + 30064e2: 00f89863 bne a7,a5,30064f2 <__truncdfsf2+0x1ca> + 30064e6: 00400637 lui a2,0x400 + 30064ea: 8e75 and a2,a2,a3 + 30064ec: 00163613 seqz a2,a2 + 30064f0: 0612 slli a2,a2,0x4 + 30064f2: 068e slli a3,a3,0x3 + 30064f4: 020007b7 lui a5,0x2000 + 30064f8: 8fd5 or a5,a5,a3 + 30064fa: 0ff00713 li a4,255 + 30064fe: 4681 li a3,0 + 3006500: bf4d j 30064b2 <__truncdfsf2+0x18a> + 3006502: 4785 li a5,1 + 3006504: bf25 j 300643c <__truncdfsf2+0x114> + 3006506: 4605 li a2,1 + 3006508: f1a5 bnez a1,3006468 <__truncdfsf2+0x140> + 300650a: 0721 addi a4,a4,8 + 300650c: bfb1 j 3006468 <__truncdfsf2+0x140> + 300650e: 4605 li a2,1 + 3006510: dda1 beqz a1,3006468 <__truncdfsf2+0x140> + 3006512: bfe5 j 300650a <__truncdfsf2+0x1e2> + 3006514: 0ff00713 li a4,255 + 3006518: 4601 li a2,0 + 300651a: bd51 j 30063ae <__truncdfsf2+0x86> + 300651c: fdd9 bnez a1,30064ba <__truncdfsf2+0x192> + 300651e: 07a1 addi a5,a5,8 # 2000008 + 3006520: bf69 j 30064ba <__truncdfsf2+0x192> + 3006522: ddc1 beqz a1,30064ba <__truncdfsf2+0x192> + 3006524: bfed j 300651e <__truncdfsf2+0x1f6> + 3006526: 4781 li a5,0 + 3006528: 00080e63 beqz a6,3006544 <__truncdfsf2+0x21c> + 300652c: 468d li a3,3 + 300652e: 00d81763 bne a6,a3,300653c <__truncdfsf2+0x214> + 3006532: c989 beqz a1,3006544 <__truncdfsf2+0x21c> + 3006534: 57fd li a5,-1 + 3006536: 0fe00713 li a4,254 + 300653a: a029 j 3006544 <__truncdfsf2+0x21c> + 300653c: 4689 li a3,2 + 300653e: fed81be3 bne a6,a3,3006534 <__truncdfsf2+0x20c> + 3006542: d9ed beqz a1,3006534 <__truncdfsf2+0x20c> + 3006544: 00566613 ori a2,a2,5 + 3006548: b541 j 30063c8 <__truncdfsf2+0xa0> + +0300654a <__clzsi2>: + 300654a: 67c1 lui a5,0x10 + 300654c: 02f57663 bgeu a0,a5,3006578 <__clzsi2+0x2e> + 3006550: 0ff00793 li a5,255 + 3006554: 00a7b7b3 sltu a5,a5,a0 + 3006558: 078e slli a5,a5,0x3 + 300655a: 02000713 li a4,32 + 300655e: 8f1d sub a4,a4,a5 + 3006560: 00f557b3 srl a5,a0,a5 + 3006564: 00000517 auipc a0,0x0 + 3006568: 5dc52503 lw a0,1500(a0) # 3006b40 <_GLOBAL_OFFSET_TABLE_+0x4> + 300656c: 97aa add a5,a5,a0 + 300656e: 0007c503 lbu a0,0(a5) # 10000 + 3006572: 40a70533 sub a0,a4,a0 + 3006576: 8082 ret + 3006578: 01000737 lui a4,0x1000 + 300657c: 47c1 li a5,16 + 300657e: fce56ee3 bltu a0,a4,300655a <__clzsi2+0x10> + 3006582: 47e1 li a5,24 + 3006584: bfd9 j 300655a <__clzsi2+0x10> + ... + +03006588 <__rodata_start>: + 3006588: 9680 pop {ra,s0-s6},384 + 300658a: 4b18 lw a4,16(a4) + +0300658c : + 300658c: 0000 1400 0000 0000 0140 0000 1000 1400 ........@....... + 300659c: 0000 0000 0144 0000 2000 1400 0000 0000 ....D.... ...... + 30065ac: 0148 0000 3000 1400 0000 0000 014c 0000 H....0......L... + 30065bc: 0000 1430 0000 0000 0240 0000 1000 1430 ..0.....@.....0. + 30065cc: 0000 0000 0244 0000 2000 1430 0000 0000 ....D.... 0..... + 30065dc: 0248 0000 3000 1430 0000 0000 024c 0000 H....00.....L... + 30065ec: 0000 1438 0000 0000 0040 0000 0000 1420 ..8.....@..... . + 30065fc: 0000 0000 0180 0000 1000 1420 0000 0000 .......... ..... + 300660c: 0184 0000 0000 1410 0000 0000 01c0 0000 ................ + 300661c: 1000 1410 0000 0000 01c4 0000 0000 1460 ..............`. + 300662c: 0001 0000 02c0 0000 0000 1470 0000 0000 ..........p..... + 300663c: 0440 0000 1000 1470 0000 0000 0444 0000 @.....p.....D... + 300664c: 2000 1470 0000 0000 0448 0000 3000 1470 . p.....H....0p. + 300665c: 0000 0000 044c 0000 0000 1440 0000 0000 ....L.....@..... + 300666c: 0200 0000 0000 14b0 0000 0000 0280 0000 ................ + 300667c: 1000 14b0 0000 0000 0284 0000 2000 14b0 ............. .. + 300668c: 0000 0000 0288 0000 0000 1c00 0000 0000 ................ + 300669c: 0300 0000 0000 1450 0000 0000 0480 0000 ......P......... + 30066ac: 1000 1450 0000 0000 0484 0000 2000 1450 ..P.......... P. + 30066bc: 0000 0000 0488 0000 3000 1450 0000 0000 .........0P..... + 30066cc: 048c 0000 4000 1450 0000 0000 0490 0000 .....@P......... + 30066dc: 5000 1450 0000 0000 0494 0000 1000 1440 .PP...........@. + 30066ec: 0004 0000 03c0 0000 0000 14c0 0000 0000 ................ + 30066fc: 04c0 0000 1000 14c0 0000 0000 04c4 0000 ................ + 300670c: 0000 147d 0000 0000 0b00 0000 0000 1480 ..}............. + 300671c: 0000 0000 0380 0000 0000 14a0 0000 0000 ................ + 300672c: 0400 0000 1000 14a0 0000 0000 0404 0000 ................ + 300673c: 2000 14a0 0000 0000 0408 0000 3000 14a0 . ...........0.. + 300674c: 0000 0000 040c 0000 0000 1001 0000 0000 ................ + 300675c: 0340 0000 0000 1810 0005 0000 0a60 0000 @...........`... + 300676c: 0000 1830 0005 0000 0a70 0000 0000 1840 ..0.....p.....@. + 300677c: 0005 0000 0a80 0000 0000 1820 0005 0000 .......... ..... + 300678c: 0a90 0000 1000 1820 0005 0000 0a90 0004 ...... ......... + 300679c: 0000 1800 0002 0000 0a00 0000 0000 1471 ..............q. + 30067ac: 0003 0000 0500 0000 2e2e 642f 6972 6576 ........../drive + 30067bc: 7372 612f 6364 692f 636e 612f 6364 695f rs/adc/inc/adc_i + 30067cc: 2e70 0068 2e2e 642f 6972 6576 7372 612f p.h.../drivers/a + 30067dc: 6364 732f 6372 612f 6364 632e 0000 0000 dc/src/adc.c.... + 30067ec: 0000 3f80 0000 4480 5547 4055 0000 4580 ...?...DGUU@...E + 30067fc: 6666 4026 51ec 4068 2160 0300 216c 0300 ff&@.Qh@`!..l!.. + 300680c: 2178 0300 2184 0300 2190 0300 219c 0300 x!...!...!...!.. + 300681c: 21a8 0300 21b4 0300 21c0 0300 2e2e 642f .!...!...!..../d + 300682c: 6972 6576 7372 622f 7361 2f65 7273 2f63 rivers/base/src/ + 300683c: 6e69 6574 7272 7075 2e74 0063 2640 0300 interrupt.c.@&.. + 300684c: 2692 0300 26e4 0300 2736 0300 2788 0300 .&...&..6'...'.. + 300685c: 27da 0300 282c 0300 287e 0300 2914 0300 .'..,(..~(...).. + 300686c: 2966 0300 29b8 0300 2a0a 0300 2a5c 0300 f)...)...*..\*.. + 300687c: 2aae 0300 2b00 0300 2b52 0300 2e2e 642f .*...+..R+..../d + 300688c: 6972 6576 7372 632f 6772 692f 636e 632f rivers/crg/inc/c + 300689c: 6772 695f 2e70 0068 2e2e 642f 6972 6576 rg_ip.h.../drive + 30068ac: 7372 632f 6772 732f 6372 632f 6772 632e rs/crg/src/crg.c + ... + 30068c4: 0001 0000 0002 0000 0003 0000 0004 0000 ................ + 30068d4: 0005 0000 0006 0000 0007 0000 35d4 0300 .............5.. + 30068e4: 35de 0300 35f6 0300 35d4 0300 3612 0300 .5...5...5...6.. + 30068f4: 35d4 0300 4b30 0300 4b9a 0300 4b9a 0300 .5..0K...K...K.. + 3006904: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006914: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006924: 4a70 0300 4ac6 0300 4b9a 0300 4b5a 0300 pJ...J...K..ZK.. + 3006934: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006944: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006954: 4b9a 0300 4b30 0300 4b9a 0300 4b9a 0300 .K..0K...K...K.. + 3006964: 4a9a 0300 4b9a 0300 4af0 0300 4b9a 0300 .J...K...J...K.. + 3006974: 4b9a 0300 4b30 0300 2e2e 642f 6972 6576 .K..0K..../drive + 3006984: 7372 692f 636f 676d 692f 636e 692f 636f rs/iocmg/inc/ioc + 3006994: 676d 695f 2e70 0068 2e2e 642f 6972 6576 mg_ip.h.../drive + 30069a4: 7372 692f 636f 676d 732f 6372 692f 636f rs/iocmg/src/ioc + 30069b4: 676d 632e 0000 0000 2e2e 642f 6972 6576 mg.c....../drive + 30069c4: 7372 742f 6d69 7265 692f 636e 742f 6d69 rs/timer/inc/tim + 30069d4: 7265 695f 2e70 0068 2e2e 642f 6972 6576 er_ip.h.../drive + 30069e4: 7372 742f 6d69 7265 732f 6372 742f 6d69 rs/timer/src/tim + 30069f4: 7265 632e 0000 0000 58f6 0300 590c 0300 er.c.....X...Y.. + 3006a04: 5922 0300 5938 0300 594e 0300 2e2e 642f "Y..8Y..NY..../d + 3006a14: 6972 6576 7372 752f 7261 2f74 7273 2f63 rivers/uart/src/ + 3006a24: 6175 7472 632e 0000 2e25 6632 0a0d 0000 uart.c..%.2f.... + 3006a34: 0000 4580 3333 4053 ...E33S@ + +03006a3c <__clz_tab>: + 3006a3c: 0100 0202 0303 0303 0404 0404 0404 0404 ................ + 3006a4c: 0505 0505 0505 0505 0505 0505 0505 0505 ................ + 3006a5c: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 3006a6c: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 3006a7c: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006a8c: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006a9c: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006aac: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006abc: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006acc: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006adc: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006aec: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006afc: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b0c: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b1c: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b2c: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + +03006b3c <_GLOBAL_OFFSET_TABLE_>: + 3006b3c: 0000 0000 6a3c 0300 ffff ffff 0000 0000 ....: + + .section .text.entry + .global _start + .option norvc +_start: + j handle_reset + 3000004: 4fc0006f j 3000500 + +03000008 : +.endm + +/* The interrupt vector table must be aligned with 4 bytes */ +.align 2 +TrapHandler: + j TrapVector /* trap and INT 0 */ + 3000008: 4680006f j 3000470 + j TrapVector /* INT 1 */ + 300000c: 4640006f j 3000470 + j TrapVector /* INT 2 */ + 3000010: 4600006f j 3000470 + j TrapVector /* INT 3 */ + 3000014: 45c0006f j 3000470 + j TrapVector /* INT 4 */ + 3000018: 4580006f j 3000470 + j TrapVector /* INT 5 */ + 300001c: 4540006f j 3000470 + j TrapVector /* INT 6 */ + 3000020: 4500006f j 3000470 + j TrapVector /* INT 7 */ + 3000024: 44c0006f j 3000470 + j TrapVector /* INT 8 */ + 3000028: 4480006f j 3000470 + j TrapVector /* INT 9 */ + 300002c: 4440006f j 3000470 + j TrapVector /* INT 10 */ + 3000030: 4400006f j 3000470 + j TrapVector /* INT 11 */ + 3000034: 43c0006f j 3000470 + j TrapVector /* INT 12 */ + 3000038: 4380006f j 3000470 + j TrapVector /* INT 13 */ + 300003c: 4340006f j 3000470 + j TrapVector /* INT 14 */ + 3000040: 4300006f j 3000470 + j TrapVector /* INT 15 */ + 3000044: 42c0006f j 3000470 + j TrapVector /* INT 16 */ + 3000048: 4280006f j 3000470 + j TrapVector /* INT 17 */ + 300004c: 4240006f j 3000470 + j TrapVector /* INT 18 */ + 3000050: 4200006f j 3000470 + j TrapVector /* INT 19 */ + 3000054: 41c0006f j 3000470 + j TrapVector /* INT 20 */ + 3000058: 4180006f j 3000470 + j TrapVector /* INT 21 */ + 300005c: 4140006f j 3000470 + j TrapVector /* INT 22 */ + 3000060: 4100006f j 3000470 + j TrapVector /* INT 23 */ + 3000064: 40c0006f j 3000470 + j TrapVector /* INT 24 */ + 3000068: 4080006f j 3000470 + j TrapVector /* INT 25 */ + 300006c: 4040006f j 3000470 + + j IntHandler /* INT 26 */ + 3000070: 2640006f j 30002d4 + j IntHandler /* INT 27 */ + 3000074: 2600006f j 30002d4 + j IntHandler /* INT 28 */ + 3000078: 25c0006f j 30002d4 + j IntHandler /* INT 29 */ + 300007c: 2580006f j 30002d4 + j IntHandler /* INT 30 */ + 3000080: 2540006f j 30002d4 + j IntHandler /* INT 31 */ + 3000084: 2500006f j 30002d4 + j IntHandler /* INT 32 */ + 3000088: 24c0006f j 30002d4 + j IntHandler /* INT 33 */ + 300008c: 2480006f j 30002d4 + j IntHandler /* INT 34 */ + 3000090: 2440006f j 30002d4 + j IntHandler /* INT 35 */ + 3000094: 2400006f j 30002d4 + j IntHandler /* INT 36 */ + 3000098: 23c0006f j 30002d4 + j IntHandler /* INT 37 */ + 300009c: 2380006f j 30002d4 + j IntHandler /* INT 38 */ + 30000a0: 2340006f j 30002d4 + j IntHandler /* INT 39 */ + 30000a4: 2300006f j 30002d4 + j IntHandler /* INT 40 */ + 30000a8: 22c0006f j 30002d4 + j IntHandler /* INT 41 */ + 30000ac: 2280006f j 30002d4 + j IntHandler /* INT 42 */ + 30000b0: 2240006f j 30002d4 + j IntHandler /* INT 43 */ + 30000b4: 2200006f j 30002d4 + j IntHandler /* INT 44 */ + 30000b8: 21c0006f j 30002d4 + j IntHandler /* INT 45 */ + 30000bc: 2180006f j 30002d4 + j IntHandler /* INT 46 */ + 30000c0: 2140006f j 30002d4 + j IntHandler /* INT 47 */ + 30000c4: 2100006f j 30002d4 + j IntHandler /* INT 48 */ + 30000c8: 20c0006f j 30002d4 + j IntHandler /* INT 49 */ + 30000cc: 2080006f j 30002d4 + j IntHandler /* INT 50 */ + 30000d0: 2040006f j 30002d4 + j IntHandler /* INT 51 */ + 30000d4: 2000006f j 30002d4 + j IntHandler /* INT 52 */ + 30000d8: 1fc0006f j 30002d4 + j IntHandler /* INT 53 */ + 30000dc: 1f80006f j 30002d4 + j IntHandler /* INT 54 */ + 30000e0: 1f40006f j 30002d4 + j IntHandler /* INT 55 */ + 30000e4: 1f00006f j 30002d4 + j IntHandler /* INT 56 */ + 30000e8: 1ec0006f j 30002d4 + j IntHandler /* INT 57 */ + 30000ec: 1e80006f j 30002d4 + j IntHandler /* INT 58 */ + 30000f0: 1e40006f j 30002d4 + j IntHandler /* INT 59 */ + 30000f4: 1e00006f j 30002d4 + j IntHandler /* INT 60 */ + 30000f8: 1dc0006f j 30002d4 + j IntHandler /* INT 61 */ + 30000fc: 1d80006f j 30002d4 + j IntHandler /* INT 62 */ + 3000100: 1d40006f j 30002d4 + j IntHandler /* INT 63 */ + 3000104: 1d00006f j 30002d4 + j IntHandler /* INT 64 */ + 3000108: 1cc0006f j 30002d4 + j IntHandler /* INT 65 */ + 300010c: 1c80006f j 30002d4 + j IntHandler /* INT 66 */ + 3000110: 1c40006f j 30002d4 + j IntHandler /* INT 67 */ + 3000114: 1c00006f j 30002d4 + j IntHandler /* INT 68 */ + 3000118: 1bc0006f j 30002d4 + j IntHandler /* INT 69 */ + 300011c: 1b80006f j 30002d4 + j IntHandler /* INT 70 */ + 3000120: 1b40006f j 30002d4 + j IntHandler /* INT 71 */ + 3000124: 1b00006f j 30002d4 + j IntHandler /* INT 72 */ + 3000128: 1ac0006f j 30002d4 + j IntHandler /* INT 73 */ + 300012c: 1a80006f j 30002d4 + j IntHandler /* INT 74 */ + 3000130: 1a40006f j 30002d4 + j IntHandler /* INT 75 */ + 3000134: 1a00006f j 30002d4 + j IntHandler /* INT 76 */ + 3000138: 19c0006f j 30002d4 + j IntHandler /* INT 77 */ + 300013c: 1980006f j 30002d4 + j IntHandler /* INT 78 */ + 3000140: 1940006f j 30002d4 + j IntHandler /* INT 79 */ + 3000144: 1900006f j 30002d4 + j IntHandler /* INT 80 */ + 3000148: 18c0006f j 30002d4 + j IntHandler /* INT 81 */ + 300014c: 1880006f j 30002d4 + j IntHandler /* INT 82 */ + 3000150: 1840006f j 30002d4 + j IntHandler /* INT 83 */ + 3000154: 1800006f j 30002d4 + j IntHandler /* INT 84 */ + 3000158: 17c0006f j 30002d4 + j IntHandler /* INT 85 */ + 300015c: 1780006f j 30002d4 + j IntHandler /* INT 86 */ + 3000160: 1740006f j 30002d4 + j IntHandler /* INT 87 */ + 3000164: 1700006f j 30002d4 + j IntHandler /* INT 88 */ + 3000168: 16c0006f j 30002d4 + j IntHandler /* INT 89 */ + 300016c: 1680006f j 30002d4 + j IntHandler /* INT 90 */ + 3000170: 1640006f j 30002d4 + j IntHandler /* INT 91 */ + 3000174: 1600006f j 30002d4 + j IntHandler /* INT 92 */ + 3000178: 15c0006f j 30002d4 + j IntHandler /* INT 93 */ + 300017c: 1580006f j 30002d4 + j IntHandler /* INT 94 */ + 3000180: 1540006f j 30002d4 + j IntHandler /* INT 95 */ + 3000184: 1500006f j 30002d4 + j IntHandler /* INT 96 */ + 3000188: 14c0006f j 30002d4 + j IntHandler /* INT 97 */ + 300018c: 1480006f j 30002d4 + j IntHandler /* INT 98 */ + 3000190: 1440006f j 30002d4 + j IntHandler /* INT 99 */ + 3000194: 1400006f j 30002d4 + j IntHandler /* INT 100 */ + 3000198: 13c0006f j 30002d4 + j IntHandler /* INT 101 */ + 300019c: 1380006f j 30002d4 + j IntHandler /* INT 102 */ + 30001a0: 1340006f j 30002d4 + j IntHandler /* INT 103 */ + 30001a4: 1300006f j 30002d4 + j IntHandler /* INT 104 */ + 30001a8: 12c0006f j 30002d4 + j IntHandler /* INT 105 */ + 30001ac: 1280006f j 30002d4 + j IntHandler /* INT 106 */ + 30001b0: 1240006f j 30002d4 + j IntHandler /* INT 107 */ + 30001b4: 1200006f j 30002d4 + j IntHandler /* INT 108 */ + 30001b8: 11c0006f j 30002d4 + j IntHandler /* INT 109 */ + 30001bc: 1180006f j 30002d4 + j IntHandler /* INT 110 */ + 30001c0: 1140006f j 30002d4 + j IntHandler /* INT 111 */ + 30001c4: 1100006f j 30002d4 + j IntHandler /* INT 112 */ + 30001c8: 10c0006f j 30002d4 + j IntHandler /* INT 113 */ + 30001cc: 1080006f j 30002d4 + j IntHandler /* INT 114 */ + 30001d0: 1040006f j 30002d4 + j IntHandler /* INT 115 */ + 30001d4: 1000006f j 30002d4 + j IntHandler /* INT 116 */ + 30001d8: 0fc0006f j 30002d4 + j IntHandler /* INT 117 */ + 30001dc: 0f80006f j 30002d4 + j IntHandler /* INT 118 */ + 30001e0: 0f40006f j 30002d4 + j IntHandler /* INT 119 */ + 30001e4: 0f00006f j 30002d4 + j IntHandler /* INT 120 */ + 30001e8: 0ec0006f j 30002d4 + j IntHandler /* INT 121 */ + 30001ec: 0e80006f j 30002d4 + +030001f0 : + +.align 2 +NmiEntry: + SAVE_SYSERR_REGS + 30001f0: f9010113 addi sp,sp,-112 + 30001f4: 04812023 sw s0,64(sp) + 30001f8: 04912223 sw s1,68(sp) + 30001fc: 05212423 sw s2,72(sp) + 3000200: 05312623 sw s3,76(sp) + 3000204: 05412823 sw s4,80(sp) + 3000208: 05512a23 sw s5,84(sp) + 300020c: 05612c23 sw s6,88(sp) + 3000210: 05712e23 sw s7,92(sp) + 3000214: 07812023 sw s8,96(sp) + 3000218: 07912223 sw s9,100(sp) + 300021c: 07a12423 sw s10,104(sp) + 3000220: 07b12623 sw s11,108(sp) + 3000224: 11010593 addi a1,sp,272 + 3000228: 06b12823 sw a1,112(sp) + 300022c: 06312a23 sw gp,116(sp) + 3000230: 06412c23 sw tp,120(sp) + 3000234: 34102573 csrr a0,mepc + 3000238: 300025f3 csrr a1,mstatus + 300023c: 34302673 csrr a2,mtval + 3000240: 342026f3 csrr a3,mcause + 3000244: 06a12e23 sw a0,124(sp) + 3000248: 08b12023 sw a1,128(sp) + 300024c: 08c12223 sw a2,132(sp) + 3000250: 08d12423 sw a3,136(sp) + 3000254: 00010513 mv a0,sp + call SysErrNmiEntry + 3000258: 384020ef jal ra,30025dc + +0300025c : +deadLoop1: + tail deadLoop1 + 300025c: a001 j 300025c + nop + 300025e: 00000013 nop + +03000262 : + +.align 2 +TrapEntry: + SAVE_SYSERR_REGS + 3000262: f9010113 addi sp,sp,-112 + 3000266: 04812023 sw s0,64(sp) + 300026a: 04912223 sw s1,68(sp) + 300026e: 05212423 sw s2,72(sp) + 3000272: 05312623 sw s3,76(sp) + 3000276: 05412823 sw s4,80(sp) + 300027a: 05512a23 sw s5,84(sp) + 300027e: 05612c23 sw s6,88(sp) + 3000282: 05712e23 sw s7,92(sp) + 3000286: 07812023 sw s8,96(sp) + 300028a: 07912223 sw s9,100(sp) + 300028e: 07a12423 sw s10,104(sp) + 3000292: 07b12623 sw s11,108(sp) + 3000296: 11010593 addi a1,sp,272 + 300029a: 06b12823 sw a1,112(sp) + 300029e: 06312a23 sw gp,116(sp) + 30002a2: 06412c23 sw tp,120(sp) + 30002a6: 34102573 csrr a0,mepc + 30002aa: 300025f3 csrr a1,mstatus + 30002ae: 34302673 csrr a2,mtval + 30002b2: 342026f3 csrr a3,mcause + 30002b6: 06a12e23 sw a0,124(sp) + 30002ba: 08b12023 sw a1,128(sp) + 30002be: 08c12223 sw a2,132(sp) + 30002c2: 08d12423 sw a3,136(sp) + 30002c6: 00010513 mv a0,sp + /* Exception run with interrupts masked */ + csrc mstatus, MSTATUS_MIE + 30002ca: 30047073 csrci mstatus,8 + call SysErrExcEntry + 30002ce: 2f0020ef jal ra,30025be + +030002d2 : +deadLoop2: + tail deadLoop2 + 30002d2: a001 j 30002d2 + +030002d4 : + +.align 2 +IntHandler: + addi sp, sp, -(TOTAL_INT_SIZE_ON_STACK) + 30002d4: f6010113 addi sp,sp,-160 + + SREG a0, 3 * REGBYTES(sp) + 30002d8: 00a12623 sw a0,12(sp) + SREG a1, 4 * REGBYTES(sp) + 30002dc: 00b12823 sw a1,16(sp) +#endif + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + csrr a0, mcause +#else + csrr a0, cipri + 30002e0: 7ed02573 csrr a0,0x7ed + csrr a1, prithd + 30002e4: bfe025f3 csrr a1,0xbfe + csrw prithd, a0 /* read prithd */ + 30002e8: bfe51073 csrw 0xbfe,a0 + SREG a1, 6 * REGBYTES(sp) /* save prithd */ + 30002ec: 00b12c23 sw a1,24(sp) + csrr a1, mstatus /* read mstatus */ + 30002f0: 300025f3 csrr a1,mstatus + SREG a1, 7 * REGBYTES(sp) /* save mstatus */ + 30002f4: 00b12e23 sw a1,28(sp) + csrr a1, mepc /* read mepc */ + 30002f8: 341025f3 csrr a1,mepc + SREG a1, 8 * REGBYTES(sp) /* save mepc */ + 30002fc: 02b12023 sw a1,32(sp) + + csrr a0, mcause + 3000300: 34202573 csrr a0,mcause + + li a1, (3<<11) + 3000304: 000025b7 lui a1,0x2 + 3000308: 80058593 addi a1,a1,-2048 # 1800 + csrs mstatus, a1 + 300030c: 3005a073 csrs mstatus,a1 + la a1, custom_nested_irq_main_handler_entry + 3000310: 00000597 auipc a1,0x0 + 3000314: 01058593 addi a1,a1,16 # 3000320 + csrw mepc, a1 + 3000318: 34159073 csrw mepc,a1 + mret + 300031c: 30200073 mret + +03000320 : +#endif + +.align 2 +custom_nested_irq_main_handler_entry: + SREG t0, 0 * REGBYTES(sp) + 3000320: 00512023 sw t0,0(sp) + SREG t1, 1 * REGBYTES(sp) + 3000324: 00612223 sw t1,4(sp) + SREG t2, 2 * REGBYTES(sp) + 3000328: 00712423 sw t2,8(sp) + SREG a2, 5 * REGBYTES(sp) + 300032c: 00c12a23 sw a2,20(sp) + SREG ra, 9 * REGBYTES(sp) + 3000330: 02112223 sw ra,36(sp) + SREG a3, 10 * REGBYTES(sp) + 3000334: 02d12423 sw a3,40(sp) + SREG a4, 11 * REGBYTES(sp) + 3000338: 02e12623 sw a4,44(sp) + SREG a5, 12 * REGBYTES(sp) + 300033c: 02f12823 sw a5,48(sp) + SREG a6, 13 * REGBYTES(sp) + 3000340: 03012a23 sw a6,52(sp) + SREG a7, 14 * REGBYTES(sp) + 3000344: 03112c23 sw a7,56(sp) + SREG t3, 15 * REGBYTES(sp) + 3000348: 03c12e23 sw t3,60(sp) + SREG t4, 16 * REGBYTES(sp) + 300034c: 05d12023 sw t4,64(sp) + SREG t5, 17 * REGBYTES(sp) + 3000350: 05e12223 sw t5,68(sp) + SREG t6, 18 * REGBYTES(sp) + 3000354: 05f12423 sw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FSREG f0, 19 * REGBYTES(sp) + 3000358: 04012627 fsw ft0,76(sp) + FSREG f1, 20 * REGBYTES(sp) + 300035c: 04112827 fsw ft1,80(sp) + FSREG f2, 21 * REGBYTES(sp) + 3000360: 04212a27 fsw ft2,84(sp) + FSREG f3, 22 * REGBYTES(sp) + 3000364: 04312c27 fsw ft3,88(sp) + FSREG f4, 23 * REGBYTES(sp) + 3000368: 04412e27 fsw ft4,92(sp) + FSREG f5, 24 * REGBYTES(sp) + 300036c: 06512027 fsw ft5,96(sp) + FSREG f6, 25 * REGBYTES(sp) + 3000370: 06612227 fsw ft6,100(sp) + FSREG f7, 26 * REGBYTES(sp) + 3000374: 06712427 fsw ft7,104(sp) + FSREG f10, 27 * REGBYTES(sp) + 3000378: 06a12627 fsw fa0,108(sp) + FSREG f11, 28 * REGBYTES(sp) + 300037c: 06b12827 fsw fa1,112(sp) + FSREG f12, 29 * REGBYTES(sp) + 3000380: 06c12a27 fsw fa2,116(sp) + FSREG f13, 30 * REGBYTES(sp) + 3000384: 06d12c27 fsw fa3,120(sp) + FSREG f14, 31 * REGBYTES(sp) + 3000388: 06e12e27 fsw fa4,124(sp) + FSREG f15, 32 * REGBYTES(sp) + 300038c: 08f12027 fsw fa5,128(sp) + FSREG f16, 33 * REGBYTES(sp) + 3000390: 09012227 fsw fa6,132(sp) + FSREG f17, 34 * REGBYTES(sp) + 3000394: 09112427 fsw fa7,136(sp) + FSREG f28, 35 * REGBYTES(sp) + 3000398: 09c12627 fsw ft8,140(sp) + FSREG f29, 36 * REGBYTES(sp) + 300039c: 09d12827 fsw ft9,144(sp) + FSREG f30, 37 * REGBYTES(sp) + 30003a0: 09e12a27 fsw ft10,148(sp) + FSREG f31, 38 * REGBYTES(sp) + 30003a4: 09f12c27 fsw ft11,152(sp) +#endif + + andi a0, a0, MCAUSE_MASK_INT_NUM + 30003a8: 0ff57513 andi a0,a0,255 + call InterruptEntry + 30003ac: 7a3010ef jal ra,300234e + + LREG t1, 1 * REGBYTES(sp) + 30003b0: 00412303 lw t1,4(sp) + LREG t2, 2 * REGBYTES(sp) + 30003b4: 00812383 lw t2,8(sp) + LREG a2, 5 * REGBYTES(sp) + 30003b8: 01412603 lw a2,20(sp) + LREG ra, 9 * REGBYTES(sp) + 30003bc: 02412083 lw ra,36(sp) + LREG a3, 10 * REGBYTES(sp) + 30003c0: 02812683 lw a3,40(sp) + LREG a4, 11 * REGBYTES(sp) + 30003c4: 02c12703 lw a4,44(sp) + LREG a5, 12 * REGBYTES(sp) + 30003c8: 03012783 lw a5,48(sp) + LREG a6, 13 * REGBYTES(sp) + 30003cc: 03412803 lw a6,52(sp) + LREG a7, 14 * REGBYTES(sp) + 30003d0: 03812883 lw a7,56(sp) + LREG t3, 15 * REGBYTES(sp) + 30003d4: 03c12e03 lw t3,60(sp) + LREG t4, 16 * REGBYTES(sp) + 30003d8: 04012e83 lw t4,64(sp) + LREG t5, 17 * REGBYTES(sp) + 30003dc: 04412f03 lw t5,68(sp) + LREG t6, 18 * REGBYTES(sp) + 30003e0: 04812f83 lw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FLREG f0, 19 * REGBYTES(sp) + 30003e4: 04c12007 flw ft0,76(sp) + FLREG f1, 20 * REGBYTES(sp) + 30003e8: 05012087 flw ft1,80(sp) + FLREG f2, 21 * REGBYTES(sp) + 30003ec: 05412107 flw ft2,84(sp) + FLREG f3, 22 * REGBYTES(sp) + 30003f0: 05812187 flw ft3,88(sp) + FLREG f4, 23 * REGBYTES(sp) + 30003f4: 05c12207 flw ft4,92(sp) + FLREG f5, 24 * REGBYTES(sp) + 30003f8: 06012287 flw ft5,96(sp) + FLREG f6, 25 * REGBYTES(sp) + 30003fc: 06412307 flw ft6,100(sp) + FLREG f7, 26 * REGBYTES(sp) + 3000400: 06812387 flw ft7,104(sp) + FLREG f10, 27 * REGBYTES(sp) + 3000404: 06c12507 flw fa0,108(sp) + FLREG f11, 28 * REGBYTES(sp) + 3000408: 07012587 flw fa1,112(sp) + FLREG f12, 29 * REGBYTES(sp) + 300040c: 07412607 flw fa2,116(sp) + FLREG f13, 30 * REGBYTES(sp) + 3000410: 07812687 flw fa3,120(sp) + FLREG f14, 31 * REGBYTES(sp) + 3000414: 07c12707 flw fa4,124(sp) + FLREG f15, 32 * REGBYTES(sp) + 3000418: 08012787 flw fa5,128(sp) + FLREG f16, 33 * REGBYTES(sp) + 300041c: 08412807 flw fa6,132(sp) + FLREG f17, 34 * REGBYTES(sp) + 3000420: 08812887 flw fa7,136(sp) + FLREG f28, 35 * REGBYTES(sp) + 3000424: 08c12e07 flw ft8,140(sp) + FLREG f29, 36 * REGBYTES(sp) + 3000428: 09012e87 flw ft9,144(sp) + FLREG f30, 37 * REGBYTES(sp) + 300042c: 09412f07 flw ft10,148(sp) + FLREG f31, 38 * REGBYTES(sp) + 3000430: 09812f87 flw ft11,152(sp) + +03000434 : + */ + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + LREG t0, 0 * REGBYTES(sp) +#else + LREG a0, 7 * REGBYTES(sp) /* load mstatus */ + 3000434: 01c12503 lw a0,28(sp) + csrr t0, mstatus + 3000438: 300022f3 csrr t0,mstatus + LREG a1, 8 * REGBYTES(sp) /* load mepc */ + 300043c: 02012583 lw a1,32(sp) + andi t0, t0, MSTATUS_MIE + 3000440: 0082f293 andi t0,t0,8 + bnei t0, 0, restore_mstatus + 3000444: 0002923b bnei t0,0,300044c + andi a0, a0, ~(MSTATUS_MIE | MSTATUS_MPIE) + 3000448: f7757513 andi a0,a0,-137 + +0300044c : +restore_mstatus: + csrw mstatus, a0 + 300044c: 30051073 csrw mstatus,a0 + + LREG t0, 0 * REGBYTES(sp) + 3000450: 00012283 lw t0,0(sp) + csrw mepc, a1 + 3000454: 34159073 csrw mepc,a1 + LREG a0, 6 * REGBYTES(sp) /* load prithd */ + 3000458: 01812503 lw a0,24(sp) + csrw prithd, a0 + 300045c: bfe51073 csrw 0xbfe,a0 + lw a1, (a0) + addi a1, a1, -1 + sw a1, (a0) +#endif + + LREG a1, 4 * REGBYTES(sp) /* 2 consecutive csrw instructions will have a bubble */ + 3000460: 01012583 lw a1,16(sp) + + LREG a0, 3 * REGBYTES(sp) + 3000464: 00c12503 lw a0,12(sp) + + addi sp, sp, TOTAL_INT_SIZE_ON_STACK + 3000468: 0a010113 addi sp,sp,160 + + mret + 300046c: 30200073 mret + +03000470 : + +.align 2 +TrapVector: + push_reg + 3000470: f6010113 addi sp,sp,-160 + 3000474: fff11f8b stmia {ra,t0-t6,a0-a7},(sp) + 3000478: f6010113 addi sp,sp,-160 + csrr a0, mcause + 300047c: 34202573 csrr a0,mcause + li t1, MCAUSE_ECALL_FROM_MMODE + 3000480: 00b00313 li t1,11 +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + beq a0, t1, switch_to_umode +#else + beq a0, t1, switch_to_mmode + 3000484: 02650c63 beq a0,t1,30004bc +#endif + li t1, MCAUSE_ECALL_FROM_UMODE + 3000488: 00800313 li t1,8 + beq a0, t1, switch_to_mmode + 300048c: 02650863 beq a0,t1,30004bc + + li a1, MCAUSE_MASK_INT_BIT + 3000490: 800005b7 lui a1,0x80000 + li a2, MCAUSE_MASK_INT_NUM + 3000494: 0ff00613 li a2,255 + and a1, a0, a1 + 3000498: 00b575b3 and a1,a0,a1 + and a0, a0, a2 + 300049c: 00c57533 and a0,a0,a2 + + li a2, 0xc + 30004a0: 00c00613 li a2,12 + beq a0, a2, NmiEntry + 30004a4: d4c506e3 beq a0,a2,30001f0 + beqz a1, TrapEntry + 30004a8: da058de3 beqz a1,3000262 + pop_reg + 30004ac: 0a010113 addi sp,sp,160 + 30004b0: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004b4: 0a010113 addi sp,sp,160 + mret + 30004b8: 30200073 mret + +030004bc : + mret +#endif + +.align 2 +switch_to_mmode: + li t2, MSTATUS_MPP_MACHINE + 30004bc: 000023b7 lui t2,0x2 + 30004c0: 80038393 addi t2,t2,-2048 # 1800 + csrs mstatus, t2 + 30004c4: 3003a073 csrs mstatus,t2 + csrr t0, mepc + 30004c8: 341022f3 csrr t0,mepc + addi t0, t0, 4 + 30004cc: 00428293 addi t0,t0,4 + csrw mepc, t0 + 30004d0: 34129073 csrw mepc,t0 + pop_reg + 30004d4: 0a010113 addi sp,sp,160 + 30004d8: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004dc: 0a010113 addi sp,sp,160 + mret + 30004e0: 30200073 mret + +030004e4 : + +.align 2 +mem_cpy: + bge t0, t2, cpy_done + 30004e4: 0072dc63 bge t0,t2,30004fc + lw t3, (t1) + 30004e8: 00032e03 lw t3,0(t1) + sw t3, (t0) + 30004ec: 01c2a023 sw t3,0(t0) + addi t0, t0, 4 + 30004f0: 00428293 addi t0,t0,4 + addi t1, t1, 4 + 30004f4: 00430313 addi t1,t1,4 + j mem_cpy + 30004f8: fedff06f j 30004e4 + +030004fc : +cpy_done: + ret + 30004fc: 00008067 ret + +03000500 : + +.align 2 +handle_reset: + csrwi mstatus, 0 + 3000500: 30005073 csrwi mstatus,0 + csrwi mie, 0 + 3000504: 30405073 csrwi mie,0 + csrci mstatus, 0x08 + 3000508: 30047073 csrci mstatus,8 + la t0, TrapHandler + 300050c: 00000297 auipc t0,0x0 + 3000510: afc28293 addi t0,t0,-1284 # 3000008 + addi t0, t0, 1 + 3000514: 00128293 addi t0,t0,1 + csrw mtvec, t0 + 3000518: 30529073 csrw mtvec,t0 + csrwi 0x7EF, 0x1 /* lock mtvec */ + 300051c: 7ef0d073 csrwi 0x7ef,1 + +03000520 : + csrwi 0x7C8, 0x1 /* enable hardware nest interrupt support */ +#endif + +flash_init: +/* eflash prefetch enable */ + li t0, EFC_BASE_ADDR + 3000520: 147102b7 lui t0,0x14710 + lw t1, 0x120(t0) + 3000524: 1202a303 lw t1,288(t0) # 14710120 + ori t1, t1, 1 + 3000528: 00136313 ori t1,t1,1 + sw t1, 0x120(t0) + 300052c: 1262a023 sw t1,288(t0) + +/* eflash cache enable */ + lw t1, 0x124(t0) + 3000530: 1242a303 lw t1,292(t0) + ori t1, t1, 1 + 3000534: 00136313 ori t1,t1,1 + sw t1, 0x124(t0) + 3000538: 1262a223 sw t1,292(t0) + +/* enable flash cmd */ + li t0, EFC_MAGIC_NUMBER + 300053c: fedcc2b7 lui t0,0xfedcc + 3000540: a9828293 addi t0,t0,-1384 # fedcba98 + li t1, EFC_MAGIC_LOCK_RW + 3000544: 14710337 lui t1,0x14710 + 3000548: 20030313 addi t1,t1,512 # 14710200 + sw t0, (t1) + 300054c: 00532023 sw t0,0(t1) + +/* initialize global pointer */ + .option push + .option norelax + la gp, __global_pointer$ + 3000550: 01001197 auipc gp,0x1001 + 3000554: bc418193 addi gp,gp,-1084 # 4001114 <__global_pointer$> + .option pop + +/* initialize stack pointer */ + la sp, __stack_top + 3000558: 01007117 auipc sp,0x1007 + 300055c: 6a810113 addi sp,sp,1704 # 4007c00 <__INTERRUPT_STACK_BEGIN__> + +/* timer0 interrupt enable */ + li t0, TIMER0_CONTROL + 3000560: 143002b7 lui t0,0x14300 + 3000564: 00828293 addi t0,t0,8 # 14300008 + lw t1, (t0) + 3000568: 0002a303 lw t1,0(t0) + andi t1, t1, TIMER0_INTENABLE + 300056c: 02037313 andi t1,t1,32 + sw t1, (t0) + 3000570: 0062a023 sw t1,0(t0) + +/* uart0 deinit */ + li t0, 0x14000000 + 3000574: 140002b7 lui t0,0x14000 + li t1, 0 + 3000578: 00000313 li t1,0 + sw t1, IBRD_OFFSET(t0) + 300057c: 0262a223 sw t1,36(t0) # 14000024 + sw t1, FBRD_OFFSET(t0) + 3000580: 0262a423 sw t1,40(t0) + sw t1, LCR_H_OFFSET(t0) + 3000584: 0262a623 sw t1,44(t0) + sw t1, CR_OFFSET(t0) + 3000588: 0262a823 sw t1,48(t0) + sw t1, DMACR_OFFSET(t0) + 300058c: 0462a423 sw t1,72(t0) + +03000590 : + +/* perform the rest of initialization in C */ +clear_sram: + /* clear sysram parity error */ + li t0, SYSRAM_ERROR + 3000590: 101082b7 lui t0,0x10108 + 3000594: 30028293 addi t0,t0,768 # 10108300 + lw t1, (t0) + 3000598: 0002a303 lw t1,0(t0) + ori t1, t1, 1 + 300059c: 00136313 ori t1,t1,1 + sw t1, (t0) + 30005a0: 0062a023 sw t1,0(t0) + + la t0, SRAM_START + 30005a4: 01000297 auipc t0,0x1000 + 30005a8: a5c28293 addi t0,t0,-1444 # 4000000 + la t1, SRAM_END + 30005ac: 01008317 auipc t1,0x1008 + 30005b0: a5430313 addi t1,t1,-1452 # 4008000 + li t2, 0 + 30005b4: 00000393 li t2,0 + +030005b8 : + +clear_sram_loop: + sw t2, (t0) /* clear all sram */ + 30005b8: 0072a023 sw t2,0(t0) + addi t0, t0, 4 /* increment clear index pointer */ + 30005bc: 00428293 addi t0,t0,4 + blt t0, t1, clear_sram_loop /* are we at the end yet, if not , contiue till the end */ + 30005c0: fe62cce3 blt t0,t1,30005b8 + +030005c4 : + +start_coderom_code_copy: + la t0, __sram_code_start_addr /* SRAM addr */ + 30005c4: ff000297 auipc t0,0xff000 + 30005c8: a3c28293 addi t0,t0,-1476 # 2000000 + la t1, __sram_code_load_addr /* ROM addr */ + 30005cc: 00000317 auipc t1,0x0 + 30005d0: 13830313 addi t1,t1,312 # 3000704 + la t2, __sram_code_end_addr + 30005d4: ff000397 auipc t2,0xff000 + 30005d8: a2c38393 addi t2,t2,-1492 # 2000000 + jal mem_cpy + 30005dc: f09ff0ef jal ra,30004e4 + +030005e0 : + +start_reserved_data_copy: + la t0, __reserved_code_start_addr /* SRAM addr */ + 30005e0: 01000297 auipc t0,0x1000 + 30005e4: a2028293 addi t0,t0,-1504 # 4000000 + la t1, __reserved_code_load_addr /* ROM addr */ + 30005e8: 00000317 auipc t1,0x0 + 30005ec: 11c30313 addi t1,t1,284 # 3000704 + la t2, __reserved_code_end_addr + 30005f0: 01000397 auipc t2,0x1000 + 30005f4: a1038393 addi t2,t2,-1520 # 4000000 + jal mem_cpy + 30005f8: eedff0ef jal ra,30004e4 + +030005fc : + +start_coderom_data_copy: + la t0, __data_start /* SRAM addr */ + 30005fc: 01000297 auipc t0,0x1000 + 3000600: a2428293 addi t0,t0,-1500 # 4000020 + la t1, __data_load /* ROM addr */ + 3000604: 00006317 auipc t1,0x6 + 3000608: 54c30313 addi t1,t1,1356 # 3006b50 <__data_load> + la t2, __data_end + 300060c: 01000397 auipc t2,0x1000 + 3000610: af038393 addi t2,t2,-1296 # 40000fc + jal mem_cpy + 3000614: ed1ff0ef jal ra,30004e4 + +03000618 : + +pmp_init: + li t0, 0xB00 + 3000618: 000012b7 lui t0,0x1 + 300061c: b0028293 addi t0,t0,-1280 # b00 + csrw pmpaddr0, t0 + 3000620: 3b029073 csrw pmpaddr0,t0 + li t0, 0x400400 /* 0x2C00~0x1000FFF, BOOTROM, enable R+X */ + 3000624: 004002b7 lui t0,0x400 + 3000628: 40028293 addi t0,t0,1024 # 400400 + csrw pmpaddr1, t0 + 300062c: 3b129073 csrw pmpaddr1,t0 + li t0, 0x800000 /* 0x1001000~0x1FFFFFF, Reserved: diable R+X+W */ + 3000630: 008002b7 lui t0,0x800 + csrw pmpaddr2, t0 + 3000634: 3b229073 csrw pmpaddr2,t0 + li t0, 0x802000 /* 0x2000000~0x2007FFF, SYSRAM_ITCM */ + 3000638: 008022b7 lui t0,0x802 + csrw pmpaddr3, t0 + 300063c: 3b329073 csrw pmpaddr3,t0 + li t0, 0xC00000 /* 0x2008000 ~ 0x2FFFFFF, Reserved: disable R+X+W */ + 3000640: 00c002b7 lui t0,0xc00 + csrw pmpaddr4, t0 + 3000644: 3b429073 csrw pmpaddr4,t0 + li t0, 0x1000000 /* 0x3000000 ~ 0x03FFFFFF: EFLASH: enable R+X */ + 3000648: 010002b7 lui t0,0x1000 + csrw pmpaddr5, t0 + 300064c: 3b529073 csrw pmpaddr5,t0 + li t0, 0x1002000 /* 0x4000000 ~ 0x04007FFF: SYSTEM_DTCM enable R+W */ + 3000650: 010022b7 lui t0,0x1002 + csrw pmpaddr6, t0 + 3000654: 3b629073 csrw pmpaddr6,t0 + li t0,0x7000400 /* 0x4008000 ~ 0x01C000FFF: REGISTER R+W */ + 3000658: 070002b7 lui t0,0x7000 + 300065c: 40028293 addi t0,t0,1024 # 7000400 + csrw pmpaddr7, t0 + 3000660: 3b729073 csrw pmpaddr7,t0 + + li t0,0xf3333333 /* register TOR-R-W */ + 3000664: f33332b7 lui t0,0xf3333 + 3000668: 33328293 addi t0,t0,819 # f3333333 + csrw 0x7d8,t0 + 300066c: 7d829073 csrw 0x7d8,t0 + li t0,0x0d080d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + csrw pmpcfg0,t0 + li t0,0x0b0b0d08 + csrw pmpcfg1,t0 +#else + li t0,0x8d888d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + 3000670: 8d8892b7 lui t0,0x8d889 + 3000674: d8b28293 addi t0,t0,-629 # 8d888d8b + csrw pmpcfg0,t0 + 3000678: 3a029073 csrw pmpcfg0,t0 + li t0,0x8b8b8d88 + 300067c: 8b8b92b7 lui t0,0x8b8b9 + 3000680: d8828293 addi t0,t0,-632 # 8b8b8d88 + csrw pmpcfg1,t0 + 3000684: 3a129073 csrw pmpcfg1,t0 +#endif + +/* disable Icache */ + csrwi 0x7C0, 0x0 /* disable ICACHE */ + 3000688: 7c005073 csrwi 0x7c0,0 + fence + 300068c: 0ff0000f fence + +/* disable Dcache */ + csrwi 0x7C1, 0x0 /* disable DCACHE */ + 3000690: 7c105073 csrwi 0x7c1,0 + fence + 3000694: 0ff0000f fence + +/* support float and mie */ + li t0,0x2008 + 3000698: 000022b7 lui t0,0x2 + 300069c: 00828293 addi t0,t0,8 # 2008 + csrs mstatus,t0 + 30006a0: 3002a073 csrs mstatus,t0 + li t0,0x20 + 30006a4: 02000293 li t0,32 + csrs misa,t0 + 30006a8: 3012a073 csrs misa,t0 + +/* Interrupt set default priority = 1*/ + li t0, 0x11111111 + 30006ac: 111112b7 lui t0,0x11111 + 30006b0: 11128293 addi t0,t0,273 # 11111111 + csrw locipri0, t0 + 30006b4: bc029073 csrw 0xbc0,t0 + csrw locipri1, t0 + 30006b8: bc129073 csrw 0xbc1,t0 + csrw locipri2, t0 + 30006bc: bc229073 csrw 0xbc2,t0 + csrw locipri3, t0 + 30006c0: bc329073 csrw 0xbc3,t0 + csrw locipri4, t0 + 30006c4: bc429073 csrw 0xbc4,t0 + csrw locipri5, t0 + 30006c8: bc529073 csrw 0xbc5,t0 + csrw locipri6, t0 + 30006cc: bc629073 csrw 0xbc6,t0 + csrw locipri7, t0 + 30006d0: bc729073 csrw 0xbc7,t0 + csrw locipri8, t0 + 30006d4: bc829073 csrw 0xbc8,t0 + csrw locipri9, t0 + 30006d8: bc929073 csrw 0xbc9,t0 + csrw locipri10, t0 + 30006dc: bca29073 csrw 0xbca,t0 + csrw locipri11, t0 + 30006e0: bcb29073 csrw 0xbcb,t0 + csrw locipri12, t0 + 30006e4: bcc29073 csrw 0xbcc,t0 + csrw locipri13, t0 + 30006e8: bcd29073 csrw 0xbcd,t0 + csrw locipri14, t0 + 30006ec: bce29073 csrw 0xbce,t0 + csrw locipri15, t0 + 30006f0: bcf29073 csrw 0xbcf,t0 + + ecall + 30006f4: 00000073 ecall + jal Chip_Init + 30006f8: 014000ef jal ra,300070c + +/* jump to C func. */ + jal main + 30006fc: 626050ef jal ra,3005d22
+ +03000700 : + +dead_loop: + j dead_loop + 3000700: 0000006f j 3000700 + +Disassembly of section .text: + +03000704 : + * @brief Chip Init Fail Process, deadloop if Chip Init fail + * @param None + * @retval None + */ +static inline void Chip_InitFail(void) +{ + 3000704: 1141 addi sp,sp,-16 + 3000706: c622 sw s0,12(sp) + 3000708: 0800 addi s0,sp,16 + while (1) { + 300070a: a001 j 300070a + +0300070c : + * @brief Chip Init + * @param None + * @retval None + */ +void Chip_Init(void) +{ + 300070c: 1101 addi sp,sp,-32 + 300070e: ce06 sw ra,28(sp) + 3000710: cc22 sw s0,24(sp) + 3000712: 1000 addi s0,sp,32 + CRG_CoreClkSelect coreClkSelect; + /* Config CRG */ + if (CRG_Config(&coreClkSelect) != BASE_STATUS_OK) { + 3000714: fec40793 addi a5,s0,-20 + 3000718: 853e mv a0,a5 + 300071a: 614050ef jal ra,3005d2e + 300071e: 87aa mv a5,a0 + 3000720: c391 beqz a5,3000724 + Chip_InitFail(); + 3000722: 37cd jal ra,3000704 + } + + /* Config FLASH Clock */ + FLASH_ClockConfig(coreClkSelect); + 3000724: fec42783 lw a5,-20(s0) + 3000728: 853e mv a0,a5 + 300072a: 796000ef jal ra,3000ec0 + SYSTICK_Init(); + 300072e: 057000ef jal ra,3000f84 + /* Set CoreClock Select after FLASH Config Done */ + CRG_SetCoreClockSelect(coreClkSelect); + 3000732: fec42783 lw a5,-20(s0) + 3000736: 853e mv a0,a5 + 3000738: 25b1 jal ra,3000d84 + + IRQ_Init(); + 300073a: 459010ef jal ra,3002392 + ANAVREF_Init(); + 300073e: 23e5 jal ra,3000d26 + ANATRIM_Entry(); + 3000740: 2b51 jal ra,3000cd4 + /* User Add Code Here */ + 3000742: 0001 nop + 3000744: 40f2 lw ra,28(sp) + 3000746: 4462 lw s0,24(sp) + 3000748: 6105 addi sp,sp,32 + 300074a: 8082 ret + +0300074c : + * @brief Calculate the conversion gain of the tsensor. + * @param data, original data. + * @retval None + */ +static void CalculateGain(unsigned int data) +{ + 300074c: 1101 addi sp,sp,-32 + 300074e: ce22 sw s0,28(sp) + 3000750: 1000 addi s0,sp,32 + 3000752: fea42623 sw a0,-20(s0) + g_tsensorGain = ((float)(data) / 10000000.0f); + 3000756: fec42783 lw a5,-20(s0) + 300075a: d017f753 fcvt.s.wu fa4,a5 + 300075e: 030067b7 lui a5,0x3006 + 3000762: 5887a787 flw fa5,1416(a5) # 3006588 <__rodata_start> + 3000766: 18f777d3 fdiv.s fa5,fa4,fa5 + 300076a: 040007b7 lui a5,0x4000 + 300076e: 02f7a027 fsw fa5,32(a5) # 4000020 +} + 3000772: 0001 nop + 3000774: 4472 lw s0,28(sp) + 3000776: 6105 addi sp,sp,32 + 3000778: 8082 ret + +0300077a : + * @brief Obtains the chip ID. + * @param None + * @retval None + */ +static bool CHIP_GetInfo(void) +{ + 300077a: 7179 addi sp,sp,-48 + 300077c: d606 sw ra,44(sp) + 300077e: d422 sw s0,40(sp) + 3000780: 1800 addi s0,sp,48 + FOTP_INFO_RGN0_NUMBER_4 emptyData; + FOTP_INFO_RGN0_NUMBER_2 idData; + FOTP_InfoGet(FOTP_INFO_RNG0, 4U, (void *)&emptyData.comData); /* 4 is the number of fotp_empty_flag in otp */ + 3000782: fe040793 addi a5,s0,-32 + 3000786: 863e mv a2,a5 + 3000788: 4591 li a1,4 + 300078a: 4501 li a0,0 + 300078c: 2391 jal ra,3000cd0 + FOTP_InfoGet(FOTP_INFO_RNG0, 2U, (void *)&idData.comData); /* 2 is the number of idData in otp */ + 300078e: fd040793 addi a5,s0,-48 + 3000792: 863e mv a2,a5 + 3000794: 4589 li a1,2 + 3000796: 4501 li a0,0 + 3000798: 2b25 jal ra,3000cd0 + if (emptyData.REG.fotp_empty_flag != 0x5AA59669 || idData.REG.chip_id == 0xFFFFFFFF) { + 300079a: fe042703 lw a4,-32(s0) + 300079e: 5aa597b7 lui a5,0x5aa59 + 30007a2: 66978793 addi a5,a5,1641 # 5aa59669 + 30007a6: 00f71763 bne a4,a5,30007b4 + 30007aa: fd042703 lw a4,-48(s0) + 30007ae: 57fd li a5,-1 + 30007b0: 00f71463 bne a4,a5,30007b8 + return false; + 30007b4: 4781 li a5,0 + 30007b6: a011 j 30007ba + } + return true; + 30007b8: 4785 li a5,1 +} + 30007ba: 853e mv a0,a5 + 30007bc: 50b2 lw ra,44(sp) + 30007be: 5422 lw s0,40(sp) + 30007c0: 6145 addi sp,sp,48 + 30007c2: 8082 ret + +030007c4 : + * @brief Analog module trim. + * @param None + * @retval None + */ +static void CHIP_AnalogTrim(void) +{ + 30007c4: 711d addi sp,sp,-96 + 30007c6: ce86 sw ra,92(sp) + 30007c8: cca2 sw s0,88(sp) + 30007ca: 1080 addi s0,sp,96 + FOTP_INFO_RGN0_NUMBER_20 trimData20; + FOTP_InfoGet(FOTP_INFO_RNG0, 20U, (void *)&trimData20.comData); /* 20 is the number of trim data in otp */ + 30007cc: fdc40793 addi a5,s0,-36 + 30007d0: 863e mv a2,a5 + 30007d2: 45d1 li a1,20 + 30007d4: 4501 li a0,0 + 30007d6: 29ed jal ra,3000cd0 + /* VREF */ + VREF->VREF_TRIM0.BIT.da_iref_trim = trimData20.REG.data0.da_iref_trim; + 30007d8: 18100737 lui a4,0x18100 + 30007dc: fdc42783 lw a5,-36(s0) + 30007e0: 83c1 srli a5,a5,0x10 + 30007e2: 9bfd andi a5,a5,-1 + 30007e4: 0ff7f693 andi a3,a5,255 + 30007e8: 433c lw a5,64(a4) + 30007ea: 0ff6f693 andi a3,a3,255 + 30007ee: f007f793 andi a5,a5,-256 + 30007f2: 8fd5 or a5,a5,a3 + 30007f4: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vref_trim = trimData20.REG.data0.da_ref_vref_trim; + 30007f6: 18100737 lui a4,0x18100 + 30007fa: fdc42783 lw a5,-36(s0) + 30007fe: 83a1 srli a5,a5,0x8 + 3000800: 9bfd andi a5,a5,-1 + 3000802: 0ff7f693 andi a3,a5,255 + 3000806: 433c lw a5,64(a4) + 3000808: 0ff6f693 andi a3,a3,255 + 300080c: 06a2 slli a3,a3,0x8 + 300080e: 7641 lui a2,0xffff0 + 3000810: 0ff60613 addi a2,a2,255 # ffff00ff + 3000814: 8ff1 and a5,a5,a2 + 3000816: 8fd5 or a5,a5,a3 + 3000818: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vbg_trim = trimData20.REG.data0.da_ref_vbg_trim; + 300081a: 18100737 lui a4,0x18100 + 300081e: fdc42783 lw a5,-36(s0) + 3000822: 0ff7f693 andi a3,a5,255 + 3000826: 433c lw a5,64(a4) + 3000828: 0ff6f693 andi a3,a3,255 + 300082c: 06c2 slli a3,a3,0x10 + 300082e: ff010637 lui a2,0xff010 + 3000832: 167d addi a2,a2,-1 # ff00ffff + 3000834: 8ff1 and a5,a5,a2 + 3000836: 8fd5 or a5,a5,a3 + 3000838: c33c sw a5,64(a4) + unsigned int value = trimData20.REG.data1.da_ref_temp_trim3; + 300083a: fe042783 lw a5,-32(s0) + 300083e: 83c1 srli a5,a5,0x10 + 3000840: 9bfd andi a5,a5,-1 + 3000842: 9f81 uxtb a5 + 3000844: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim2 << 8U); /* Shift left by 8 bits */ + 3000848: fe042783 lw a5,-32(s0) + 300084c: 83a1 srli a5,a5,0x8 + 300084e: 9bfd andi a5,a5,-1 + 3000850: 9f81 uxtb a5 + 3000852: 07a2 slli a5,a5,0x8 + 3000854: 873e mv a4,a5 + 3000856: fec42783 lw a5,-20(s0) + 300085a: 8fd9 or a5,a5,a4 + 300085c: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim1 << 16U); /* Shift left by 16 bits */ + 3000860: fe042783 lw a5,-32(s0) + 3000864: 9f81 uxtb a5 + 3000866: 07c2 slli a5,a5,0x10 + 3000868: 873e mv a4,a5 + 300086a: fec42783 lw a5,-20(s0) + 300086e: 8fd9 or a5,a5,a4 + 3000870: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data0.da_ref_temp_trim0 << 24U); /* Shift left by 24 bits */ + 3000874: fdc42783 lw a5,-36(s0) + 3000878: 83e1 srli a5,a5,0x18 + 300087a: 9f81 uxtb a5 + 300087c: 07e2 slli a5,a5,0x18 + 300087e: 873e mv a4,a5 + 3000880: fec42783 lw a5,-20(s0) + 3000884: 8fd9 or a5,a5,a4 + 3000886: fef42623 sw a5,-20(s0) + VREF->VREF_TRIM1.reg = value; + 300088a: 181007b7 lui a5,0x18100 + 300088e: fec42703 lw a4,-20(s0) + 3000892: c3f8 sw a4,68(a5) + + FOTP_INFO_RGN0_NUMBER_21 trimData21; + FOTP_InfoGet(FOTP_INFO_RNG0, 21U, (void *)&trimData21.comData); /* 21 is the number of trim data in otp */ + 3000894: fcc40793 addi a5,s0,-52 + 3000898: 863e mv a2,a5 + 300089a: 45d5 li a1,21 + 300089c: 4501 li a0,0 + 300089e: 290d jal ra,3000cd0 + /* ADC */ + ADC0->ADC_OEGE_TRIM.BIT.cfg_gain_cali_trim = trimData21.REG.data1.saradc_gain; + 30008a0: 18000737 lui a4,0x18000 + 30008a4: fd042783 lw a5,-48(s0) + 30008a8: 86be mv a3,a5 + 30008aa: 6789 lui a5,0x2 + 30008ac: 17fd addi a5,a5,-1 # 1fff + 30008ae: 8ff5 and a5,a5,a3 + 30008b0: 01079613 slli a2,a5,0x10 + 30008b4: 8241 srli a2,a2,0x10 + 30008b6: 6785 lui a5,0x1 + 30008b8: 973e add a4,a4,a5 + 30008ba: 80872783 lw a5,-2040(a4) # 17fff808 + 30008be: 6689 lui a3,0x2 + 30008c0: 16fd addi a3,a3,-1 # 1fff + 30008c2: 8ef1 and a3,a3,a2 + 30008c4: 06c2 slli a3,a3,0x10 + 30008c6: e0010637 lui a2,0xe0010 + 30008ca: 167d addi a2,a2,-1 # e000ffff + 30008cc: 8ff1 and a5,a5,a2 + 30008ce: 8fd5 or a5,a5,a3 + 30008d0: 80f72423 sw a5,-2040(a4) + ADC0->ADC_OEGE_TRIM.BIT.cfg_ofst_cali_trim = trimData21.REG.data1.saradc_offset; + 30008d4: 18000737 lui a4,0x18000 + 30008d8: fd042783 lw a5,-48(s0) + 30008dc: 83c1 srli a5,a5,0x10 + 30008de: 86be mv a3,a5 + 30008e0: 6785 lui a5,0x1 + 30008e2: 17fd addi a5,a5,-1 # fff + 30008e4: 8ff5 and a5,a5,a3 + 30008e6: 01079613 slli a2,a5,0x10 + 30008ea: 8241 srli a2,a2,0x10 + 30008ec: 6785 lui a5,0x1 + 30008ee: 973e add a4,a4,a5 + 30008f0: 80872783 lw a5,-2040(a4) # 17fff808 + 30008f4: 6685 lui a3,0x1 + 30008f6: 16fd addi a3,a3,-1 # fff + 30008f8: 8ef1 and a3,a3,a2 + 30008fa: 767d lui a2,0xfffff + 30008fc: 8ff1 and a5,a5,a2 + 30008fe: 8fd5 or a5,a5,a3 + 3000900: 80f72423 sw a5,-2040(a4) + + /* TSENSOR */ + TSENSOR->TSENSOR_TRIM.reg = trimData20.REG.data1.da_ref_vptat_trim; + 3000904: fe042783 lw a5,-32(s0) + 3000908: 83e1 srli a5,a5,0x18 + 300090a: 0ff7f713 andi a4,a5,255 + 300090e: 185007b7 lui a5,0x18500 + 3000912: cb98 sw a4,16(a5) + ADC0->ADC_TSENSOR_TRIM.BIT.cfg_tsensor_ofst_trim = trimData21.REG.data2.ts_offset; + 3000914: 18000737 lui a4,0x18000 + 3000918: fd442783 lw a5,-44(s0) + 300091c: 86be mv a3,a5 + 300091e: 6785 lui a5,0x1 + 3000920: 17fd addi a5,a5,-1 # fff + 3000922: 8ff5 and a5,a5,a3 + 3000924: 01079613 slli a2,a5,0x10 + 3000928: 8241 srli a2,a2,0x10 + 300092a: 6785 lui a5,0x1 + 300092c: 973e add a4,a4,a5 + 300092e: 80472783 lw a5,-2044(a4) # 17fff804 + 3000932: 6685 lui a3,0x1 + 3000934: 16fd addi a3,a3,-1 # fff + 3000936: 8ef1 and a3,a3,a2 + 3000938: 767d lui a2,0xfffff + 300093a: 8ff1 and a5,a5,a2 + 300093c: 8fd5 or a5,a5,a3 + 300093e: 80f72223 sw a5,-2044(a4) + CalculateGain(trimData21.REG.data3.ts_gain); + 3000942: fd842783 lw a5,-40(s0) + 3000946: 83a5 srli a5,a5,0x9 + 3000948: 853e mv a0,a5 + 300094a: 3509 jal ra,300074c + + /* PGA */ + PGA0->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga0_vos_trim; + 300094c: 18200737 lui a4,0x18200 + 3000950: fcc42783 lw a5,-52(s0) + 3000954: 1ff7f793 andi a5,a5,511 + 3000958: 01079693 slli a3,a5,0x10 + 300095c: 82c1 srli a3,a3,0x10 + 300095e: 531c lw a5,32(a4) + 3000960: 1ff6f693 andi a3,a3,511 + 3000964: e007f793 andi a5,a5,-512 + 3000968: 8fd5 or a5,a5,a3 + 300096a: d31c sw a5,32(a4) + PGA1->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga1_vos_trim; + 300096c: 18201737 lui a4,0x18201 + 3000970: fcc42783 lw a5,-52(s0) + 3000974: 83c1 srli a5,a5,0x10 + 3000976: 1ff7f793 andi a5,a5,511 + 300097a: 01079693 slli a3,a5,0x10 + 300097e: 82c1 srli a3,a3,0x10 + 3000980: 531c lw a5,32(a4) + 3000982: 1ff6f693 andi a3,a3,511 + 3000986: e007f793 andi a5,a5,-512 + 300098a: 8fd5 or a5,a5,a3 + 300098c: d31c sw a5,32(a4) + + FOTP_INFO_RGN0_NUMBER_22 trimData22; + FOTP_InfoGet(FOTP_INFO_RNG0, 22U, (void *)&trimData22.comData); /* 22 is the number of trim data in otp */ + 300098e: fbc40793 addi a5,s0,-68 + 3000992: 863e mv a2,a5 + 3000994: 45d9 li a1,22 + 3000996: 4501 li a0,0 + 3000998: 257d jal ra,3001046 + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_gain_trim2 = trimData22.REG.data0.pga0_gain2; + 300099a: 18000737 lui a4,0x18000 + 300099e: fbc42783 lw a5,-68(s0) + 30009a2: 86be mv a3,a5 + 30009a4: 6789 lui a5,0x2 + 30009a6: 17fd addi a5,a5,-1 # 1fff + 30009a8: 8ff5 and a5,a5,a3 + 30009aa: 01079613 slli a2,a5,0x10 + 30009ae: 8241 srli a2,a2,0x10 + 30009b0: 6785 lui a5,0x1 + 30009b2: 973e add a4,a4,a5 + 30009b4: 81472783 lw a5,-2028(a4) # 17fff814 + 30009b8: 6689 lui a3,0x2 + 30009ba: 16fd addi a3,a3,-1 # 1fff + 30009bc: 8ef1 and a3,a3,a2 + 30009be: 06c2 slli a3,a3,0x10 + 30009c0: e0010637 lui a2,0xe0010 + 30009c4: 167d addi a2,a2,-1 # e000ffff + 30009c6: 8ff1 and a5,a5,a2 + 30009c8: 8fd5 or a5,a5,a3 + 30009ca: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_ofst_trim2 = trimData22.REG.data0.pga0_offset2; + 30009ce: 18000737 lui a4,0x18000 + 30009d2: fbc42783 lw a5,-68(s0) + 30009d6: 83c1 srli a5,a5,0x10 + 30009d8: 86be mv a3,a5 + 30009da: 6785 lui a5,0x1 + 30009dc: 17fd addi a5,a5,-1 # fff + 30009de: 8ff5 and a5,a5,a3 + 30009e0: 01079613 slli a2,a5,0x10 + 30009e4: 8241 srli a2,a2,0x10 + 30009e6: 6785 lui a5,0x1 + 30009e8: 973e add a4,a4,a5 + 30009ea: 81472783 lw a5,-2028(a4) # 17fff814 + 30009ee: 6685 lui a3,0x1 + 30009f0: 16fd addi a3,a3,-1 # fff + 30009f2: 8ef1 and a3,a3,a2 + 30009f4: 767d lui a2,0xfffff + 30009f6: 8ff1 and a5,a5,a2 + 30009f8: 8fd5 or a5,a5,a3 + 30009fa: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_gain_trim4 = trimData22.REG.data1.pga0_gain4; + 30009fe: 18000737 lui a4,0x18000 + 3000a02: fc042783 lw a5,-64(s0) + 3000a06: 86be mv a3,a5 + 3000a08: 6789 lui a5,0x2 + 3000a0a: 17fd addi a5,a5,-1 # 1fff + 3000a0c: 8ff5 and a5,a5,a3 + 3000a0e: 01079613 slli a2,a5,0x10 + 3000a12: 8241 srli a2,a2,0x10 + 3000a14: 6785 lui a5,0x1 + 3000a16: 973e add a4,a4,a5 + 3000a18: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a1c: 6689 lui a3,0x2 + 3000a1e: 16fd addi a3,a3,-1 # 1fff + 3000a20: 8ef1 and a3,a3,a2 + 3000a22: 06c2 slli a3,a3,0x10 + 3000a24: e0010637 lui a2,0xe0010 + 3000a28: 167d addi a2,a2,-1 # e000ffff + 3000a2a: 8ff1 and a5,a5,a2 + 3000a2c: 8fd5 or a5,a5,a3 + 3000a2e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_ofst_trim4 = trimData22.REG.data1.pga0_offset4; + 3000a32: 18000737 lui a4,0x18000 + 3000a36: fc042783 lw a5,-64(s0) + 3000a3a: 83c1 srli a5,a5,0x10 + 3000a3c: 86be mv a3,a5 + 3000a3e: 6785 lui a5,0x1 + 3000a40: 17fd addi a5,a5,-1 # fff + 3000a42: 8ff5 and a5,a5,a3 + 3000a44: 01079613 slli a2,a5,0x10 + 3000a48: 8241 srli a2,a2,0x10 + 3000a4a: 6785 lui a5,0x1 + 3000a4c: 973e add a4,a4,a5 + 3000a4e: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a52: 6685 lui a3,0x1 + 3000a54: 16fd addi a3,a3,-1 # fff + 3000a56: 8ef1 and a3,a3,a2 + 3000a58: 767d lui a2,0xfffff + 3000a5a: 8ff1 and a5,a5,a2 + 3000a5c: 8fd5 or a5,a5,a3 + 3000a5e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_gain_trim8 = trimData22.REG.data2.pga0_gain8; + 3000a62: 18000737 lui a4,0x18000 + 3000a66: fc442783 lw a5,-60(s0) + 3000a6a: 86be mv a3,a5 + 3000a6c: 6789 lui a5,0x2 + 3000a6e: 17fd addi a5,a5,-1 # 1fff + 3000a70: 8ff5 and a5,a5,a3 + 3000a72: 01079613 slli a2,a5,0x10 + 3000a76: 8241 srli a2,a2,0x10 + 3000a78: 6785 lui a5,0x1 + 3000a7a: 973e add a4,a4,a5 + 3000a7c: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000a80: 6689 lui a3,0x2 + 3000a82: 16fd addi a3,a3,-1 # 1fff + 3000a84: 8ef1 and a3,a3,a2 + 3000a86: 06c2 slli a3,a3,0x10 + 3000a88: e0010637 lui a2,0xe0010 + 3000a8c: 167d addi a2,a2,-1 # e000ffff + 3000a8e: 8ff1 and a5,a5,a2 + 3000a90: 8fd5 or a5,a5,a3 + 3000a92: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_ofst_trim8 = trimData22.REG.data2.pga0_offset8; + 3000a96: 18000737 lui a4,0x18000 + 3000a9a: fc442783 lw a5,-60(s0) + 3000a9e: 83c1 srli a5,a5,0x10 + 3000aa0: 86be mv a3,a5 + 3000aa2: 6785 lui a5,0x1 + 3000aa4: 17fd addi a5,a5,-1 # fff + 3000aa6: 8ff5 and a5,a5,a3 + 3000aa8: 01079613 slli a2,a5,0x10 + 3000aac: 8241 srli a2,a2,0x10 + 3000aae: 6785 lui a5,0x1 + 3000ab0: 973e add a4,a4,a5 + 3000ab2: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000ab6: 6685 lui a3,0x1 + 3000ab8: 16fd addi a3,a3,-1 # fff + 3000aba: 8ef1 and a3,a3,a2 + 3000abc: 767d lui a2,0xfffff + 3000abe: 8ff1 and a5,a5,a2 + 3000ac0: 8fd5 or a5,a5,a3 + 3000ac2: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_gain_trim16 = trimData22.REG.data3.pga0_gain16; + 3000ac6: 18000737 lui a4,0x18000 + 3000aca: fc842783 lw a5,-56(s0) + 3000ace: 86be mv a3,a5 + 3000ad0: 6789 lui a5,0x2 + 3000ad2: 17fd addi a5,a5,-1 # 1fff + 3000ad4: 8ff5 and a5,a5,a3 + 3000ad6: 01079613 slli a2,a5,0x10 + 3000ada: 8241 srli a2,a2,0x10 + 3000adc: 6785 lui a5,0x1 + 3000ade: 973e add a4,a4,a5 + 3000ae0: 82072783 lw a5,-2016(a4) # 17fff820 + 3000ae4: 6689 lui a3,0x2 + 3000ae6: 16fd addi a3,a3,-1 # 1fff + 3000ae8: 8ef1 and a3,a3,a2 + 3000aea: 06c2 slli a3,a3,0x10 + 3000aec: e0010637 lui a2,0xe0010 + 3000af0: 167d addi a2,a2,-1 # e000ffff + 3000af2: 8ff1 and a5,a5,a2 + 3000af4: 8fd5 or a5,a5,a3 + 3000af6: 82f72023 sw a5,-2016(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_ofst_trim16 = trimData22.REG.data3.pga0_offset16; + 3000afa: 18000737 lui a4,0x18000 + 3000afe: fc842783 lw a5,-56(s0) + 3000b02: 83c1 srli a5,a5,0x10 + 3000b04: 86be mv a3,a5 + 3000b06: 6785 lui a5,0x1 + 3000b08: 17fd addi a5,a5,-1 # fff + 3000b0a: 8ff5 and a5,a5,a3 + 3000b0c: 01079613 slli a2,a5,0x10 + 3000b10: 8241 srli a2,a2,0x10 + 3000b12: 6785 lui a5,0x1 + 3000b14: 973e add a4,a4,a5 + 3000b16: 82072783 lw a5,-2016(a4) # 17fff820 + 3000b1a: 6685 lui a3,0x1 + 3000b1c: 16fd addi a3,a3,-1 # fff + 3000b1e: 8ef1 and a3,a3,a2 + 3000b20: 767d lui a2,0xfffff + 3000b22: 8ff1 and a5,a5,a2 + 3000b24: 8fd5 or a5,a5,a3 + 3000b26: 82f72023 sw a5,-2016(a4) + + FOTP_INFO_RGN0_NUMBER_23 trimData23; + FOTP_InfoGet(FOTP_INFO_RNG0, 23U, (void *)&trimData23.comData); /* 23 is the number of trim data in otp */ + 3000b2a: fac40793 addi a5,s0,-84 + 3000b2e: 863e mv a2,a5 + 3000b30: 45dd li a1,23 + 3000b32: 4501 li a0,0 + 3000b34: 2b09 jal ra,3001046 + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_gain_trim2 = trimData23.REG.data0.pga1_gain2; + 3000b36: 18000737 lui a4,0x18000 + 3000b3a: fac42783 lw a5,-84(s0) + 3000b3e: 86be mv a3,a5 + 3000b40: 6789 lui a5,0x2 + 3000b42: 17fd addi a5,a5,-1 # 1fff + 3000b44: 8ff5 and a5,a5,a3 + 3000b46: 01079613 slli a2,a5,0x10 + 3000b4a: 8241 srli a2,a2,0x10 + 3000b4c: 6785 lui a5,0x1 + 3000b4e: 973e add a4,a4,a5 + 3000b50: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b54: 6689 lui a3,0x2 + 3000b56: 16fd addi a3,a3,-1 # 1fff + 3000b58: 8ef1 and a3,a3,a2 + 3000b5a: 06c2 slli a3,a3,0x10 + 3000b5c: e0010637 lui a2,0xe0010 + 3000b60: 167d addi a2,a2,-1 # e000ffff + 3000b62: 8ff1 and a5,a5,a2 + 3000b64: 8fd5 or a5,a5,a3 + 3000b66: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_ofst_trim2 = trimData23.REG.data0.pga1_offset2; + 3000b6a: 18000737 lui a4,0x18000 + 3000b6e: fac42783 lw a5,-84(s0) + 3000b72: 83c1 srli a5,a5,0x10 + 3000b74: 86be mv a3,a5 + 3000b76: 6785 lui a5,0x1 + 3000b78: 17fd addi a5,a5,-1 # fff + 3000b7a: 8ff5 and a5,a5,a3 + 3000b7c: 01079613 slli a2,a5,0x10 + 3000b80: 8241 srli a2,a2,0x10 + 3000b82: 6785 lui a5,0x1 + 3000b84: 973e add a4,a4,a5 + 3000b86: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b8a: 6685 lui a3,0x1 + 3000b8c: 16fd addi a3,a3,-1 # fff + 3000b8e: 8ef1 and a3,a3,a2 + 3000b90: 767d lui a2,0xfffff + 3000b92: 8ff1 and a5,a5,a2 + 3000b94: 8fd5 or a5,a5,a3 + 3000b96: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_gain_trim4 = trimData23.REG.data1.pga1_gain4; + 3000b9a: 18000737 lui a4,0x18000 + 3000b9e: fb042783 lw a5,-80(s0) + 3000ba2: 86be mv a3,a5 + 3000ba4: 6789 lui a5,0x2 + 3000ba6: 17fd addi a5,a5,-1 # 1fff + 3000ba8: 8ff5 and a5,a5,a3 + 3000baa: 01079613 slli a2,a5,0x10 + 3000bae: 8241 srli a2,a2,0x10 + 3000bb0: 6785 lui a5,0x1 + 3000bb2: 973e add a4,a4,a5 + 3000bb4: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bb8: 6689 lui a3,0x2 + 3000bba: 16fd addi a3,a3,-1 # 1fff + 3000bbc: 8ef1 and a3,a3,a2 + 3000bbe: 06c2 slli a3,a3,0x10 + 3000bc0: e0010637 lui a2,0xe0010 + 3000bc4: 167d addi a2,a2,-1 # e000ffff + 3000bc6: 8ff1 and a5,a5,a2 + 3000bc8: 8fd5 or a5,a5,a3 + 3000bca: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_ofst_trim4 = trimData23.REG.data1.pga1_offset4; + 3000bce: 18000737 lui a4,0x18000 + 3000bd2: fb042783 lw a5,-80(s0) + 3000bd6: 83c1 srli a5,a5,0x10 + 3000bd8: 86be mv a3,a5 + 3000bda: 6785 lui a5,0x1 + 3000bdc: 17fd addi a5,a5,-1 # fff + 3000bde: 8ff5 and a5,a5,a3 + 3000be0: 01079613 slli a2,a5,0x10 + 3000be4: 8241 srli a2,a2,0x10 + 3000be6: 6785 lui a5,0x1 + 3000be8: 973e add a4,a4,a5 + 3000bea: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bee: 6685 lui a3,0x1 + 3000bf0: 16fd addi a3,a3,-1 # fff + 3000bf2: 8ef1 and a3,a3,a2 + 3000bf4: 767d lui a2,0xfffff + 3000bf6: 8ff1 and a5,a5,a2 + 3000bf8: 8fd5 or a5,a5,a3 + 3000bfa: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_gain_trim8 = trimData23.REG.data2.pga1_gain8; + 3000bfe: 18000737 lui a4,0x18000 + 3000c02: fb442783 lw a5,-76(s0) + 3000c06: 86be mv a3,a5 + 3000c08: 6789 lui a5,0x2 + 3000c0a: 17fd addi a5,a5,-1 # 1fff + 3000c0c: 8ff5 and a5,a5,a3 + 3000c0e: 01079613 slli a2,a5,0x10 + 3000c12: 8241 srli a2,a2,0x10 + 3000c14: 6785 lui a5,0x1 + 3000c16: 973e add a4,a4,a5 + 3000c18: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c1c: 6689 lui a3,0x2 + 3000c1e: 16fd addi a3,a3,-1 # 1fff + 3000c20: 8ef1 and a3,a3,a2 + 3000c22: 06c2 slli a3,a3,0x10 + 3000c24: e0010637 lui a2,0xe0010 + 3000c28: 167d addi a2,a2,-1 # e000ffff + 3000c2a: 8ff1 and a5,a5,a2 + 3000c2c: 8fd5 or a5,a5,a3 + 3000c2e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_ofst_trim8 = trimData23.REG.data2.pga1_offset8; + 3000c32: 18000737 lui a4,0x18000 + 3000c36: fb442783 lw a5,-76(s0) + 3000c3a: 83c1 srli a5,a5,0x10 + 3000c3c: 86be mv a3,a5 + 3000c3e: 6785 lui a5,0x1 + 3000c40: 17fd addi a5,a5,-1 # fff + 3000c42: 8ff5 and a5,a5,a3 + 3000c44: 01079613 slli a2,a5,0x10 + 3000c48: 8241 srli a2,a2,0x10 + 3000c4a: 6785 lui a5,0x1 + 3000c4c: 973e add a4,a4,a5 + 3000c4e: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c52: 6685 lui a3,0x1 + 3000c54: 16fd addi a3,a3,-1 # fff + 3000c56: 8ef1 and a3,a3,a2 + 3000c58: 767d lui a2,0xfffff + 3000c5a: 8ff1 and a5,a5,a2 + 3000c5c: 8fd5 or a5,a5,a3 + 3000c5e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_gain_trim16 = trimData23.REG.data3.pga1_gain16; + 3000c62: 18000737 lui a4,0x18000 + 3000c66: fb842783 lw a5,-72(s0) + 3000c6a: 86be mv a3,a5 + 3000c6c: 6789 lui a5,0x2 + 3000c6e: 17fd addi a5,a5,-1 # 1fff + 3000c70: 8ff5 and a5,a5,a3 + 3000c72: 01079613 slli a2,a5,0x10 + 3000c76: 8241 srli a2,a2,0x10 + 3000c78: 6785 lui a5,0x1 + 3000c7a: 973e add a4,a4,a5 + 3000c7c: 83072783 lw a5,-2000(a4) # 17fff830 + 3000c80: 6689 lui a3,0x2 + 3000c82: 16fd addi a3,a3,-1 # 1fff + 3000c84: 8ef1 and a3,a3,a2 + 3000c86: 06c2 slli a3,a3,0x10 + 3000c88: e0010637 lui a2,0xe0010 + 3000c8c: 167d addi a2,a2,-1 # e000ffff + 3000c8e: 8ff1 and a5,a5,a2 + 3000c90: 8fd5 or a5,a5,a3 + 3000c92: 82f72823 sw a5,-2000(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_ofst_trim16 = trimData23.REG.data3.pga1_offset16; + 3000c96: 18000737 lui a4,0x18000 + 3000c9a: fb842783 lw a5,-72(s0) + 3000c9e: 83c1 srli a5,a5,0x10 + 3000ca0: 86be mv a3,a5 + 3000ca2: 6785 lui a5,0x1 + 3000ca4: 17fd addi a5,a5,-1 # fff + 3000ca6: 8ff5 and a5,a5,a3 + 3000ca8: 01079613 slli a2,a5,0x10 + 3000cac: 8241 srli a2,a2,0x10 + 3000cae: 6785 lui a5,0x1 + 3000cb0: 973e add a4,a4,a5 + 3000cb2: 83072783 lw a5,-2000(a4) # 17fff830 + 3000cb6: 6685 lui a3,0x1 + 3000cb8: 16fd addi a3,a3,-1 # fff + 3000cba: 8ef1 and a3,a3,a2 + 3000cbc: 767d lui a2,0xfffff + 3000cbe: 8ff1 and a5,a5,a2 + 3000cc0: 8fd5 or a5,a5,a3 + 3000cc2: 82f72823 sw a5,-2000(a4) +} + 3000cc6: 0001 nop + 3000cc8: 40f6 lw ra,92(sp) + 3000cca: 4466 lw s0,88(sp) + 3000ccc: 6125 addi sp,sp,96 + 3000cce: 8082 ret + +03000cd0 : + 3000cd0: 3760006f j 3001046 + +03000cd4 : + * @brief Parameter calibration entry of the analog module. + * @param None + * @retval None + */ +void ANATRIM_Entry(void) +{ + 3000cd4: 1141 addi sp,sp,-16 + 3000cd6: c606 sw ra,12(sp) + 3000cd8: c422 sw s0,8(sp) + 3000cda: 0800 addi s0,sp,16 + if (CHIP_GetInfo() == false) { /* If the chip information is incorrect, calibration is not performed */ + 3000cdc: 3c79 jal ra,300077a + 3000cde: 87aa mv a5,a0 + 3000ce0: 0017c793 xori a5,a5,1 + 3000ce4: 9f81 uxtb a5 + 3000ce6: eb9d bnez a5,3000d1c + return; + } + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_ENABLE); /* Enable the clock for calibration */ + 3000ce8: 4585 li a1,1 + 3000cea: 18000537 lui a0,0x18000 + 3000cee: 2849 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_ENABLE); + 3000cf0: 4585 li a1,1 + 3000cf2: 18200537 lui a0,0x18200 + 3000cf6: 2069 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_ENABLE); + 3000cf8: 4585 li a1,1 + 3000cfa: 18201537 lui a0,0x18201 + 3000cfe: 2049 jal ra,3000d80 + CHIP_AnalogTrim(); + 3000d00: 34d1 jal ra,30007c4 + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_DISABLE); /* The clock is disabled after calibration */ + 3000d02: 4581 li a1,0 + 3000d04: 18000537 lui a0,0x18000 + 3000d08: 28a5 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_DISABLE); + 3000d0a: 4581 li a1,0 + 3000d0c: 18200537 lui a0,0x18200 + 3000d10: 2885 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_DISABLE); + 3000d12: 4581 li a1,0 + 3000d14: 18201537 lui a0,0x18201 + 3000d18: 20a5 jal ra,3000d80 + 3000d1a: a011 j 3000d1e + return; + 3000d1c: 0001 nop + 3000d1e: 40b2 lw ra,12(sp) + 3000d20: 4422 lw s0,8(sp) + 3000d22: 0141 addi sp,sp,16 + 3000d24: 8082 ret + +03000d26 : + * @brief Set Crg Core clock select + * @param None + * @retval None + */ +void ANAVREF_Init(void) +{ + 3000d26: 1141 addi sp,sp,-16 + 3000d28: c606 sw ra,12(sp) + 3000d2a: c422 sw s0,8(sp) + 3000d2c: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(VREF_BASE, IP_CLK_ENABLE); + 3000d2e: 4585 li a1,1 + 3000d30: 18100537 lui a0,0x18100 + 3000d34: 20b1 jal ra,3000d80 + VREF->VREF_CTRL1.BIT.da_ref_temp_trim_enh = 0x1; + 3000d36: 18100737 lui a4,0x18100 + 3000d3a: 531c lw a5,32(a4) + 3000d3c: 66c1 lui a3,0x10 + 3000d3e: 8fd5 or a5,a5,a3 + 3000d40: d31c sw a5,32(a4) + VREF->VREF_CTRL0.BIT.da_ref_enh = BASE_CFG_ENABLE; + 3000d42: 18100737 lui a4,0x18100 + 3000d46: 431c lw a5,0(a4) + 3000d48: 0017e793 ori a5,a5,1 + 3000d4c: c31c sw a5,0(a4) + BASE_FUNC_DELAY_US(200); /* delay 200us */ + 3000d4e: 000f47b7 lui a5,0xf4 + 3000d52: 24078593 addi a1,a5,576 # f4240 + 3000d56: 0c800513 li a0,200 + 3000d5a: 20b5 jal ra,3000dc6 + VREF->VREF_CTRL1.BIT.da_ref_chop_enh = BASE_CFG_ENABLE; + 3000d5c: 18100737 lui a4,0x18100 + 3000d60: 531c lw a5,32(a4) + 3000d62: 0017e793 ori a5,a5,1 + 3000d66: d31c sw a5,32(a4) + BASE_FUNC_DELAY_US(40); /* delay 40us */ + 3000d68: 000f47b7 lui a5,0xf4 + 3000d6c: 24078593 addi a1,a5,576 # f4240 + 3000d70: 02800513 li a0,40 + 3000d74: 2889 jal ra,3000dc6 + 3000d76: 0001 nop + 3000d78: 40b2 lw ra,12(sp) + 3000d7a: 4422 lw s0,8(sp) + 3000d7c: 0141 addi sp,sp,16 + 3000d7e: 8082 ret + +03000d80 : + 3000d80: 0b30206f j 3003632 + +03000d84 : + * @brief Set Crg Core clock select + * @param coreClkSelect Input core clock select value + * @retval None + */ +void CRG_SetCoreClockSelect(CRG_CoreClkSelect coreClkSelect) +{ + 3000d84: 715d addi sp,sp,-80 + 3000d86: c686 sw ra,76(sp) + 3000d88: c4a2 sw s0,72(sp) + 3000d8a: 0880 addi s0,sp,80 + 3000d8c: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3000d90: 100007b7 lui a5,0x10000 + 3000d94: fcf42423 sw a5,-56(s0) + crg.coreClkSelect = coreClkSelect; + 3000d98: fbc42783 lw a5,-68(s0) + 3000d9c: fef42023 sw a5,-32(s0) + if (crg.coreClkSelect == CRG_CORE_CLK_SELECT_TCXO) { /* If an external crystal oscillator is selected. */ + 3000da0: fe042703 lw a4,-32(s0) + 3000da4: 4785 li a5,1 + 3000da6: 00f71663 bne a4,a5,3000db2 + BASE_FUNC_DELAY_MS(10); /* 10: delay 10ms, wait clokc stable. */ + 3000daa: 3e800593 li a1,1000 + 3000dae: 4529 li a0,10 + 3000db0: 2819 jal ra,3000dc6 + } + HAL_CRG_SetCoreClockSelect(&crg); + 3000db2: fc840793 addi a5,s0,-56 + 3000db6: 853e mv a0,a5 + 3000db8: 572020ef jal ra,300332a + 3000dbc: 0001 nop + 3000dbe: 40b6 lw ra,76(sp) + 3000dc0: 4426 lw s0,72(sp) + 3000dc2: 6161 addi sp,sp,80 + 3000dc4: 8082 ret + +03000dc6 : + 3000dc6: 5160106f j 30022dc + +03000dca : + * @param frequence frequnce + * @param div Output Divison + * @retval None + */ +static void SetFlashDiv(unsigned int frequency, unsigned int *nreadDiv) +{ + 3000dca: 7179 addi sp,sp,-48 + 3000dcc: d622 sw s0,44(sp) + 3000dce: 1800 addi s0,sp,48 + 3000dd0: fca42e23 sw a0,-36(s0) + 3000dd4: fcb42c23 sw a1,-40(s0) + unsigned int div; + unsigned int freq = frequency; + 3000dd8: fdc42783 lw a5,-36(s0) + 3000ddc: fef42423 sw a5,-24(s0) + /* Get frequency divider of flash. */ + if (freq < FLASH_BASE_FREQ) { + 3000de0: fe842703 lw a4,-24(s0) + 3000de4: 023c37b7 lui a5,0x23c3 + 3000de8: 45f78793 addi a5,a5,1119 # 23c345f + 3000dec: 00e7e863 bltu a5,a4,3000dfc + freq = FLASH_BASE_FREQ; + 3000df0: 023c37b7 lui a5,0x23c3 + 3000df4: 46078793 addi a5,a5,1120 # 23c3460 + 3000df8: fef42423 sw a5,-24(s0) + } + /* Get the flash frequency division based on the frequency. */ + if ((freq % FLASH_BASE_FREQ) == 0) { + 3000dfc: fe842703 lw a4,-24(s0) + 3000e00: 023c37b7 lui a5,0x23c3 + 3000e04: 46078793 addi a5,a5,1120 # 23c3460 + 3000e08: 02f777b3 remu a5,a4,a5 + 3000e0c: ef81 bnez a5,3000e24 + div = freq / FLASH_BASE_FREQ; + 3000e0e: fe842703 lw a4,-24(s0) + 3000e12: 023c37b7 lui a5,0x23c3 + 3000e16: 46078793 addi a5,a5,1120 # 23c3460 + 3000e1a: 02f757b3 divu a5,a4,a5 + 3000e1e: fef42623 sw a5,-20(s0) + 3000e22: a821 j 3000e3a + } else { + div = (freq / FLASH_BASE_FREQ) + 1; + 3000e24: fe842703 lw a4,-24(s0) + 3000e28: 023c37b7 lui a5,0x23c3 + 3000e2c: 46078793 addi a5,a5,1120 # 23c3460 + 3000e30: 02f757b3 divu a5,a4,a5 + 3000e34: 0785 addi a5,a5,1 + 3000e36: fef42623 sw a5,-20(s0) + } + /* Ensure the flash frequency division is valid. */ + if (div > FLASH_MAX_DIV) { + 3000e3a: fec42703 lw a4,-20(s0) + 3000e3e: 4791 li a5,4 + 3000e40: 00e7f563 bgeu a5,a4,3000e4a + div = FLASH_MAX_DIV; + 3000e44: 4791 li a5,4 + 3000e46: fef42623 sw a5,-20(s0) + } + *nreadDiv = div; + 3000e4a: fd842783 lw a5,-40(s0) + 3000e4e: fec42703 lw a4,-20(s0) + 3000e52: c398 sw a4,0(a5) +} + 3000e54: 0001 nop + 3000e56: 5432 lw s0,44(sp) + 3000e58: 6145 addi sp,sp,48 + 3000e5a: 8082 ret + +03000e5c : + * @brief Get the Rounding up value + * @param coreClkSelect Core Clock select + * @retval Frequency of Flash + */ +static unsigned int GetFlashFreq(CRG_CoreClkSelect coreClkSelect) +{ + 3000e5c: 7179 addi sp,sp,-48 + 3000e5e: d606 sw ra,44(sp) + 3000e60: d422 sw s0,40(sp) + 3000e62: 1800 addi s0,sp,48 + 3000e64: fca42e23 sw a0,-36(s0) + unsigned int hclk; + /* Get frequency of flash. */ + switch (coreClkSelect) { + 3000e68: fdc42783 lw a5,-36(s0) + 3000e6c: 4705 li a4,1 + 3000e6e: 02e78063 beq a5,a4,3000e8e + 3000e72: 4705 li a4,1 + 3000e74: 00e7e663 bltu a5,a4,3000e80 + 3000e78: 4709 li a4,2 + 3000e7a: 02e78163 beq a5,a4,3000e9c + 3000e7e: a025 j 3000ea6 + case CRG_CORE_CLK_SELECT_HOSC: + hclk = HOSC_FREQ; + 3000e80: 017d87b7 lui a5,0x17d8 + 3000e84: 84078793 addi a5,a5,-1984 # 17d7840 + 3000e88: fef42623 sw a5,-20(s0) + break; + 3000e8c: a01d j 3000eb2 + case CRG_CORE_CLK_SELECT_TCXO: + hclk = XTRAIL_FREQ; + 3000e8e: 01c9c7b7 lui a5,0x1c9c + 3000e92: 38078793 addi a5,a5,896 # 1c9c380 + 3000e96: fef42623 sw a5,-20(s0) + break; + 3000e9a: a821 j 3000eb2 + case CRG_CORE_CLK_SELECT_PLL: + hclk = HAL_CRG_GetPllFreq(); + 3000e9c: 5b0020ef jal ra,300344c + 3000ea0: fea42623 sw a0,-20(s0) + break; + 3000ea4: a039 j 3000eb2 + default: + hclk = LOSC_FREQ; + 3000ea6: 67a1 lui a5,0x8 + 3000ea8: d0078793 addi a5,a5,-768 # 7d00 + 3000eac: fef42623 sw a5,-20(s0) + break; + 3000eb0: 0001 nop + } + return hclk; + 3000eb2: fec42783 lw a5,-20(s0) +} + 3000eb6: 853e mv a0,a5 + 3000eb8: 50b2 lw ra,44(sp) + 3000eba: 5422 lw s0,40(sp) + 3000ebc: 6145 addi sp,sp,48 + 3000ebe: 8082 ret + +03000ec0 : + * @brief Set flash clock frequence base on hclk + * @param coreClkSelect core clock select + * @retval None + */ +void FLASH_ClockConfig(CRG_CoreClkSelect coreClkSelect) +{ + 3000ec0: 7179 addi sp,sp,-48 + 3000ec2: d606 sw ra,44(sp) + 3000ec4: d422 sw s0,40(sp) + 3000ec6: 1800 addi s0,sp,48 + 3000ec8: fca42e23 sw a0,-36(s0) + EFC_RegStruct *efc = EFC; + 3000ecc: 147107b7 lui a5,0x14710 + 3000ed0: fef42623 sw a5,-20(s0) + EFLASH_CLK_CFG_REG cfg; + unsigned int hclk; + unsigned int nreadDiv; + + /* Step 1: Set nread_div */ + hclk = GetFlashFreq(coreClkSelect); + 3000ed4: fdc42503 lw a0,-36(s0) + 3000ed8: 3751 jal ra,3000e5c + 3000eda: fea42423 sw a0,-24(s0) + cfg.reg = efc->EFLASH_CLK_CFG.reg; + 3000ede: fec42703 lw a4,-20(s0) + 3000ee2: 6785 lui a5,0x1 + 3000ee4: 97ba add a5,a5,a4 + 3000ee6: 9407a783 lw a5,-1728(a5) # 940 + 3000eea: fef42223 sw a5,-28(s0) + SetFlashDiv(hclk, &nreadDiv); + 3000eee: fe040793 addi a5,s0,-32 + 3000ef2: 85be mv a1,a5 + 3000ef4: fe842503 lw a0,-24(s0) + 3000ef8: 3dc9 jal ra,3000dca + cfg.BIT.nread_div = nreadDiv; + 3000efa: fe042783 lw a5,-32(s0) + 3000efe: 8bbd andi a5,a5,15 + 3000f00: 0ff7f713 andi a4,a5,255 + 3000f04: fe442783 lw a5,-28(s0) + 3000f08: 8b3d andi a4,a4,15 + 3000f0a: 0712 slli a4,a4,0x4 + 3000f0c: f0f7f793 andi a5,a5,-241 + 3000f10: 8fd9 or a5,a5,a4 + 3000f12: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f16: fe442783 lw a5,-28(s0) + 3000f1a: 00100737 lui a4,0x100 + 3000f1e: 8fd9 or a5,a5,a4 + 3000f20: fef42223 sw a5,-28(s0) + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f24: fe442783 lw a5,-28(s0) + 3000f28: 00400737 lui a4,0x400 + 3000f2c: 8fd9 or a5,a5,a4 + 3000f2e: fef42223 sw a5,-28(s0) + + /* Step 2: Wait Busclk_sw_req */ + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f32: fe442783 lw a5,-28(s0) + 3000f36: 00400737 lui a4,0x400 + 3000f3a: 8fd9 or a5,a5,a4 + 3000f3c: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f40: fe442783 lw a5,-28(s0) + 3000f44: 00100737 lui a4,0x100 + 3000f48: 8fd9 or a5,a5,a4 + 3000f4a: fef42223 sw a5,-28(s0) + efc->EFLASH_CLK_CFG.reg = cfg.reg; + 3000f4e: fe442703 lw a4,-28(s0) + 3000f52: fec42683 lw a3,-20(s0) + 3000f56: 6785 lui a5,0x1 + 3000f58: 97b6 add a5,a5,a3 + 3000f5a: 94e7a023 sw a4,-1728(a5) # 940 + while (efc->EFLASH_CLK_CFG.BIT.busclk_sw_req == BASE_CFG_SET) { + 3000f5e: 0001 nop + 3000f60: fec42703 lw a4,-20(s0) + 3000f64: 6785 lui a5,0x1 + 3000f66: 97ba add a5,a5,a4 + 3000f68: 9407a783 lw a5,-1728(a5) # 940 + 3000f6c: 83d1 srli a5,a5,0x14 + 3000f6e: 8b85 andi a5,a5,1 + 3000f70: 0ff7f713 andi a4,a5,255 + 3000f74: 4785 li a5,1 + 3000f76: fef705e3 beq a4,a5,3000f60 + ; + } + 3000f7a: 0001 nop + 3000f7c: 50b2 lw ra,44(sp) + 3000f7e: 5422 lw s0,40(sp) + 3000f80: 6145 addi sp,sp,48 + 3000f82: 8082 ret + +03000f84 : + * @brief Init the systick + * @param None + * @retval None + */ +void SYSTICK_Init(void) +{ + 3000f84: 1141 addi sp,sp,-16 + 3000f86: c622 sw s0,12(sp) + 3000f88: 0800 addi s0,sp,16 + SYSTICK->TIMER_CTRL.reg = 0; + 3000f8a: 143807b7 lui a5,0x14380 + 3000f8e: 0007a023 sw zero,0(a5) # 14380000 + SYSTICK->TIMER_CTRL.BIT.enable = 1; + 3000f92: 14380737 lui a4,0x14380 + 3000f96: 431c lw a5,0(a4) + 3000f98: 0017e793 ori a5,a5,1 + 3000f9c: c31c sw a5,0(a4) +} + 3000f9e: 0001 nop + 3000fa0: 4432 lw s0,12(sp) + 3000fa2: 0141 addi sp,sp,16 + 3000fa4: 8082 ret + +03000fa6 : + * @brief Get the Systick frep(Hz) + * @param None + * @retval Clock frep of systick(Hz) + */ +unsigned int SYSTICK_GetCRGHZ(void) +{ + 3000fa6: 1141 addi sp,sp,-16 + 3000fa8: c606 sw ra,12(sp) + 3000faa: c422 sw s0,8(sp) + 3000fac: 0800 addi s0,sp,16 + /* Get the Systick IP */ + return HAL_CRG_GetIpFreq(SYSTICK_BASE); + 3000fae: 14380537 lui a0,0x14380 + 3000fb2: 59c020ef jal ra,300354e + 3000fb6: 87aa mv a5,a0 + 3000fb8: 853e mv a0,a5 + 3000fba: 40b2 lw ra,12(sp) + 3000fbc: 4422 lw s0,8(sp) + 3000fbe: 0141 addi sp,sp,16 + 3000fc0: 8082 ret + +03000fc2 : + * @param efc Flash control register base address + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +static unsigned int FOTP_CheckReadStatus(EFC_RegStruct *efc) +{ + 3000fc2: 1101 addi sp,sp,-32 + 3000fc4: ce22 sw s0,28(sp) + 3000fc6: 1000 addi s0,sp,32 + 3000fc8: fea42623 sw a0,-20(s0) + /* Check for errors in the flash reading process. */ + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fcc: fec42783 lw a5,-20(s0) + 3000fd0: 1007a783 lw a5,256(a5) + 3000fd4: 83c1 srli a5,a5,0x10 + 3000fd6: 8b85 andi a5,a5,1 + 3000fd8: 9f81 uxtb a5 + 3000fda: e38d bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000fdc: fec42783 lw a5,-20(s0) + 3000fe0: 1007a783 lw a5,256(a5) + 3000fe4: 83cd srli a5,a5,0x13 + 3000fe6: 8b85 andi a5,a5,1 + 3000fe8: 9f81 uxtb a5 + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fea: eb89 bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_chk) { + 3000fec: fec42783 lw a5,-20(s0) + 3000ff0: 1007a783 lw a5,256(a5) + 3000ff4: 83d1 srli a5,a5,0x14 + 3000ff6: 8b85 andi a5,a5,1 + 3000ff8: 9f81 uxtb a5 + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000ffa: c3a9 beqz a5,300103c + efc->INT_CLEAR.BIT.int_clr_err_ecc_corr = BASE_CFG_SET; + 3000ffc: fec42703 lw a4,-20(s0) + 3001000: 10c72783 lw a5,268(a4) # 1438010c + 3001004: 000806b7 lui a3,0x80 + 3001008: 8fd5 or a5,a5,a3 + 300100a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_illegal = BASE_CFG_SET; + 300100e: fec42703 lw a4,-20(s0) + 3001012: 10c72783 lw a5,268(a4) + 3001016: 66c1 lui a3,0x10 + 3001018: 8fd5 or a5,a5,a3 + 300101a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_ecc_chk = BASE_CFG_SET; + 300101e: fec42703 lw a4,-20(s0) + 3001022: 10c72783 lw a5,268(a4) + 3001026: 001006b7 lui a3,0x100 + 300102a: 8fd5 or a5,a5,a3 + 300102c: 10f72623 sw a5,268(a4) + efc->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001030: fec42783 lw a5,-20(s0) + 3001034: 2007a023 sw zero,512(a5) + return BASE_STATUS_ERROR; + 3001038: 4785 li a5,1 + 300103a: a011 j 300103e + } + return BASE_STATUS_OK; + 300103c: 4781 li a5,0 +} + 300103e: 853e mv a0,a5 + 3001040: 4472 lw s0,28(sp) + 3001042: 6105 addi sp,sp,32 + 3001044: 8082 ret + +03001046 : + * @param buf Buffer of read data + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +unsigned int FOTP_InfoGet(FOTP_InfoRngType type, unsigned int index, FOTP_CommonData *buf) +{ + 3001046: 7179 addi sp,sp,-48 + 3001048: d606 sw ra,44(sp) + 300104a: d422 sw s0,40(sp) + 300104c: 1800 addi s0,sp,48 + 300104e: fca42e23 sw a0,-36(s0) + 3001052: fcb42c23 sw a1,-40(s0) + 3001056: fcc42a23 sw a2,-44(s0) + EFC_RegStruct *p = EFC; + 300105a: 147107b7 lui a5,0x14710 + 300105e: fef42423 sw a5,-24(s0) + unsigned int addr; + + if (buf == NULL) { + 3001062: fd442783 lw a5,-44(s0) + 3001066: e399 bnez a5,300106c + return BASE_STATUS_ERROR; + 3001068: 4785 li a5,1 + 300106a: aa15 j 300119e + } + + if ((type >= FOTP_INFO_MAXTYPE) || (index > FOTP_INFO_REG_MAX_ID)) { + 300106c: fdc42703 lw a4,-36(s0) + 3001070: 4785 li a5,1 + 3001072: 00e7e763 bltu a5,a4,3001080 + 3001076: fd842703 lw a4,-40(s0) + 300107a: 47e5 li a5,25 + 300107c: 00e7f463 bgeu a5,a4,3001084 + return BASE_STATUS_ERROR; + 3001080: 4785 li a5,1 + 3001082: aa31 j 300119e + } + + /* If there is a read command, return */ + if (p->EFLASH_CMD.BIT.cmd_start) { + 3001084: fe842783 lw a5,-24(s0) + 3001088: 439c lw a5,0(a5) + 300108a: 8b85 andi a5,a5,1 + 300108c: 9f81 uxtb a5 + 300108e: c399 beqz a5,3001094 + return BASE_STATUS_ERROR; + 3001090: 4785 li a5,1 + 3001092: a231 j 300119e + } + + p->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; + 3001094: fe842783 lw a5,-24(s0) + 3001098: fedcc737 lui a4,0xfedcc + 300109c: a9870713 addi a4,a4,-1384 # fedcba98 + 30010a0: 20e7a023 sw a4,512(a5) # 14710200 + + /* Configure the read command parameters and start the read command */ + addr = (type == FOTP_INFO_RNG0) ? FOTP_INFO_RNG0_BASEADDR : FOTP_INFO_RNG1_BASEADDR; + 30010a4: fdc42783 lw a5,-36(s0) + 30010a8: e781 bnez a5,30010b0 + 30010aa: 008007b7 lui a5,0x800 + 30010ae: a019 j 30010b4 + 30010b0: 008017b7 lui a5,0x801 + 30010b4: fef42223 sw a5,-28(s0) + addr += index * REG_WORDS_NUM; + 30010b8: fd842783 lw a5,-40(s0) + 30010bc: 0792 slli a5,a5,0x4 + 30010be: fe442703 lw a4,-28(s0) + 30010c2: 97ba add a5,a5,a4 + 30010c4: fef42223 sw a5,-28(s0) + p->EFLASH_ADDR.BIT.cmd_addr = addr >> 2; /* Right shift 2 bit change to word */ + 30010c8: fe442783 lw a5,-28(s0) + 30010cc: 0027d713 srli a4,a5,0x2 + 30010d0: 004007b7 lui a5,0x400 + 30010d4: 17fd addi a5,a5,-1 # 3fffff + 30010d6: 00f77633 and a2,a4,a5 + 30010da: fe842703 lw a4,-24(s0) + 30010de: 435c lw a5,4(a4) + 30010e0: 004006b7 lui a3,0x400 + 30010e4: 16fd addi a3,a3,-1 # 3fffff + 30010e6: 8ef1 and a3,a3,a2 + 30010e8: 068a slli a3,a3,0x2 + 30010ea: ff000637 lui a2,0xff000 + 30010ee: 060d addi a2,a2,3 # ff000003 + 30010f0: 8ff1 and a5,a5,a2 + 30010f2: 8fd5 or a5,a5,a3 + 30010f4: c35c sw a5,4(a4) + p->EFLASH_CMD.BIT.cmd_code = FLASH_OPERATION_READ; + 30010f6: fe842703 lw a4,-24(s0) + 30010fa: 431c lw a5,0(a4) + 30010fc: 8ff7f793 andi a5,a5,-1793 + 3001100: 1007e793 ori a5,a5,256 + 3001104: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_read_size = FLASH_READ_128BIT; + 3001106: fe842703 lw a4,-24(s0) + 300110a: 431c lw a5,0(a4) + 300110c: d00006b7 lui a3,0xd0000 + 3001110: 16fd addi a3,a3,-1 # cfffffff + 3001112: 8efd and a3,a3,a5 + 3001114: 100007b7 lui a5,0x10000 + 3001118: 8fd5 or a5,a5,a3 + 300111a: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_start = BASE_CFG_SET; + 300111c: fe842703 lw a4,-24(s0) + 3001120: 431c lw a5,0(a4) + 3001122: 0017e793 ori a5,a5,1 + 3001126: c31c sw a5,0(a4) + + while (p->EFLASH_CMD.BIT.cmd_start) { + 3001128: 0001 nop + 300112a: fe842783 lw a5,-24(s0) + 300112e: 439c lw a5,0(a5) + 3001130: 8b85 andi a5,a5,1 + 3001132: 9f81 uxtb a5 + 3001134: fbfd bnez a5,300112a + ; + } + while (p->EFLASH_CMD.BIT.exec_state) { + 3001136: 0001 nop + 3001138: fe842783 lw a5,-24(s0) + 300113c: 439c lw a5,0(a5) + 300113e: 8399 srli a5,a5,0x6 + 3001140: 8b8d andi a5,a5,3 + 3001142: 9f81 uxtb a5 + 3001144: fbf5 bnez a5,3001138 + ; + } + /* read error, clear interrupt and return */ + if (FOTP_CheckReadStatus(p) != BASE_STATUS_OK) { + 3001146: fe842503 lw a0,-24(s0) + 300114a: 3da5 jal ra,3000fc2 + 300114c: 87aa mv a5,a0 + 300114e: c399 beqz a5,3001154 + return BASE_STATUS_ERROR; + 3001150: 4785 li a5,1 + 3001152: a0b1 j 300119e + } + /* Read data from FIFO to buffer */ + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001154: fe042623 sw zero,-20(s0) + 3001158: a00d j 300117a + buf->data[i] = p->FLASH_RDATA; + 300115a: fe842783 lw a5,-24(s0) + 300115e: 6007a703 lw a4,1536(a5) # 10000600 + 3001162: fd442683 lw a3,-44(s0) + 3001166: fec42783 lw a5,-20(s0) + 300116a: 078a slli a5,a5,0x2 + 300116c: 97b6 add a5,a5,a3 + 300116e: c398 sw a4,0(a5) + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001170: fec42783 lw a5,-20(s0) + 3001174: 0785 addi a5,a5,1 + 3001176: fef42623 sw a5,-20(s0) + 300117a: fec42703 lw a4,-20(s0) + 300117e: 478d li a5,3 + 3001180: fce7fde3 bgeu a5,a4,300115a + } + p->INT_CLEAR.BIT.int_clr_finish = BASE_CFG_SET; + 3001184: fe842703 lw a4,-24(s0) + 3001188: 10c72783 lw a5,268(a4) + 300118c: 0107e793 ori a5,a5,16 + 3001190: 10f72623 sw a5,268(a4) + p->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001194: fe842783 lw a5,-24(s0) + 3001198: 2007a023 sw zero,512(a5) + return BASE_STATUS_OK; + 300119c: 4781 li a5,0 + 300119e: 853e mv a0,a5 + 30011a0: 50b2 lw ra,44(sp) + 30011a2: 5422 lw s0,40(sp) + 30011a4: 6145 addi sp,sp,48 + 30011a6: 8082 ret + +030011a8 : + * @param baseAddr The ip base address + * @retval The Address(offset) in g_crgIpMatch if match success + * @retval 0 if match fail + */ +CHIP_CrgIpMatchInfo *GetCrgIpMatchInfo(const void *baseAddr) +{ + 30011a8: 7179 addi sp,sp,-48 + 30011aa: d622 sw s0,44(sp) + 30011ac: 1800 addi s0,sp,48 + 30011ae: fca42e23 sw a0,-36(s0) + unsigned int i; + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011b2: fe042623 sw zero,-20(s0) + 30011b6: a081 j 30011f6 + if (baseAddr == g_crgIpMatch[i].ipBaseAddr) { + 30011b8: 030067b7 lui a5,0x3006 + 30011bc: 58c78713 addi a4,a5,1420 # 300658c + 30011c0: fec42683 lw a3,-20(s0) + 30011c4: 47b1 li a5,12 + 30011c6: 02f687b3 mul a5,a3,a5 + 30011ca: 97ba add a5,a5,a4 + 30011cc: 439c lw a5,0(a5) + 30011ce: fdc42703 lw a4,-36(s0) + 30011d2: 00f71d63 bne a4,a5,30011ec + return (CHIP_CrgIpMatchInfo *)&g_crgIpMatch[i]; + 30011d6: fec42703 lw a4,-20(s0) + 30011da: 47b1 li a5,12 + 30011dc: 02f70733 mul a4,a4,a5 + 30011e0: 030067b7 lui a5,0x3006 + 30011e4: 58c78793 addi a5,a5,1420 # 300658c + 30011e8: 97ba add a5,a5,a4 + 30011ea: a829 j 3001204 + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011ec: fec42783 lw a5,-20(s0) + 30011f0: 0785 addi a5,a5,1 + 30011f2: fef42623 sw a5,-20(s0) + 30011f6: fec42703 lw a4,-20(s0) + 30011fa: 02d00793 li a5,45 + 30011fe: fae7fde3 bgeu a5,a4,30011b8 + } + } + return (CHIP_CrgIpMatchInfo *)0; /* The base address does not match, return 0. */ + 3001202: 4781 li a5,0 +} + 3001204: 853e mv a0,a5 + 3001206: 5432 lw s0,44(sp) + 3001208: 6145 addi sp,sp,48 + 300120a: 8082 ret + +0300120c : + * @brief Check ADC sample input. + * @param input Number of input. + * @retval bool + */ +static inline bool IsADCSampleChannel(ADC_Input input) +{ + 300120c: 1101 addi sp,sp,-32 + 300120e: ce22 sw s0,28(sp) + 3001210: 1000 addi s0,sp,32 + 3001212: fea42623 sw a0,-20(s0) + return (input >= ADC_CH_ADCINA0) && (input <= ADC_CH_ADCINA19); + 3001216: fec42783 lw a5,-20(s0) + 300121a: 0147b793 sltiu a5,a5,20 + 300121e: 9f81 uxtb a5 +} + 3001220: 853e mv a0,a5 + 3001222: 4472 lw s0,28(sp) + 3001224: 6105 addi sp,sp,32 + 3001226: 8082 ret + +03001228 : + * are configured through the SOC. + * @param soc Number of SOC. + * @retval bool + */ +static inline bool IsADCSOCx(ADC_SOCNumber soc) +{ + 3001228: 1101 addi sp,sp,-32 + 300122a: ce22 sw s0,28(sp) + 300122c: 1000 addi s0,sp,32 + 300122e: fea42623 sw a0,-20(s0) + return (soc >= ADC_SOC_NUM0) && (soc <= ADC_SOC_NUM15); + 3001232: fec42783 lw a5,-20(s0) + 3001236: 0107b793 sltiu a5,a5,16 + 300123a: 9f81 uxtb a5 +} + 300123c: 853e mv a0,a5 + 300123e: 4472 lw s0,28(sp) + 3001240: 6105 addi sp,sp,32 + 3001242: 8082 ret + +03001244 : + * @brief Check ADC interrupt parameter. + * @param intx Number of interrupt. + * @retval bool + */ +static inline bool IsADCIntx(ADC_IntNumber intx) +{ + 3001244: 1101 addi sp,sp,-32 + 3001246: ce22 sw s0,28(sp) + 3001248: 1000 addi s0,sp,32 + 300124a: fea42623 sw a0,-20(s0) + return (intx >= ADC_INT_NUMBER0) && (intx <= ADC_INT_NUMBER3); + 300124e: fec42783 lw a5,-20(s0) + 3001252: 0047b793 sltiu a5,a5,4 + 3001256: 9f81 uxtb a5 +} + 3001258: 853e mv a0,a5 + 300125a: 4472 lw s0,28(sp) + 300125c: 6105 addi sp,sp,32 + 300125e: 8082 ret + +03001260 : + * @brief Check SOC trigger source. + * @param trig Type of trigger source. + * @retval bool + */ +static inline bool IsADCTrigSource(ADC_TrigSource trig) +{ + 3001260: 1101 addi sp,sp,-32 + 3001262: ce22 sw s0,28(sp) + 3001264: 1000 addi s0,sp,32 + 3001266: fea42623 sw a0,-20(s0) + return (trig >= ADC_TRIGSOC_SOFT) && (trig <= ADC_TRIGSOC_GPIOPF1); + 300126a: fec42783 lw a5,-20(s0) + 300126e: 0157b793 sltiu a5,a5,21 + 3001272: 9f81 uxtb a5 +} + 3001274: 853e mv a0,a5 + 3001276: 4472 lw s0,28(sp) + 3001278: 6105 addi sp,sp,32 + 300127a: 8082 ret + +0300127c : + * @brief Check mode of completion of SOC sample + * @param mode Type of completion. + * @retval bool + */ +static inline bool IsADCFinishMode(ADC_SOCFinishMode mode) +{ + 300127c: 1101 addi sp,sp,-32 + 300127e: ce22 sw s0,28(sp) + 3001280: 1000 addi s0,sp,32 + 3001282: fea42623 sw a0,-20(s0) + return (mode >= ADC_SOCFINISH_NONE) && (mode <= ADC_SOCFINISH_INT3); + 3001286: fec42783 lw a5,-20(s0) + 300128a: cb81 beqz a5,300129a + 300128c: fec42703 lw a4,-20(s0) + 3001290: 4799 li a5,6 + 3001292: 00e7e463 bltu a5,a4,300129a + 3001296: 4785 li a5,1 + 3001298: a011 j 300129c + 300129a: 4781 li a5,0 + 300129c: 8b85 andi a5,a5,1 + 300129e: 9f81 uxtb a5 +} + 30012a0: 853e mv a0,a5 + 30012a2: 4472 lw s0,28(sp) + 30012a4: 6105 addi sp,sp,32 + 30012a6: 8082 ret + +030012a8 : + * @brief Check ADC sample priority parameter. + * @param mode Priority mode of SOC. + * @retval bool + */ +static inline bool IsADCPriorityMode(ADC_PriorityMode mode) +{ + 30012a8: 1101 addi sp,sp,-32 + 30012aa: ce22 sw s0,28(sp) + 30012ac: 1000 addi s0,sp,32 + 30012ae: fea42623 sw a0,-20(s0) + return (mode >= ADC_PRIMODE_ALL_ROUND) && (mode <= ADC_PRIMODE_ALL_PRIORITY); + 30012b2: fec42703 lw a4,-20(s0) + 30012b6: 67c1 lui a5,0x10 + 30012b8: 00f737b3 sltu a5,a4,a5 + 30012bc: 9f81 uxtb a5 +} + 30012be: 853e mv a0,a5 + 30012c0: 4472 lw s0,28(sp) + 30012c2: 6105 addi sp,sp,32 + 30012c4: 8082 ret + +030012c6 : + * @brief Check time of total ADC sampling time. + * @param acqps Time of total ADC sampling time. + * @retval bool + */ +static inline bool IsADCTotalTime(unsigned int acqps) +{ + 30012c6: 1101 addi sp,sp,-32 + 30012c8: ce22 sw s0,28(sp) + 30012ca: 1000 addi s0,sp,32 + 30012cc: fea42623 sw a0,-20(s0) + return (acqps <= ADC_SOCSAMPLE_500CLK); + 30012d0: fec42783 lw a5,-20(s0) + 30012d4: 0107b793 sltiu a5,a5,16 + 30012d8: 9f81 uxtb a5 +} + 30012da: 853e mv a0,a5 + 30012dc: 4472 lw s0,28(sp) + 30012de: 6105 addi sp,sp,32 + 30012e0: 8082 ret + +030012e2 : + * @brief Enable AVDD/3 Channal. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_EnableAvddChannel(ADC_RegStruct * const adcx) +{ + 30012e2: 1101 addi sp,sp,-32 + 30012e4: ce06 sw ra,28(sp) + 30012e6: cc22 sw s0,24(sp) + 30012e8: 1000 addi s0,sp,32 + 30012ea: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30012ee: fec42703 lw a4,-20(s0) + 30012f2: 180007b7 lui a5,0x18000 + 30012f6: 00f70b63 beq a4,a5,300130c + 30012fa: 6785 lui a5,0x1 + 30012fc: 86278593 addi a1,a5,-1950 # 862 + 3001300: 030067b7 lui a5,0x3006 + 3001304: 7b478513 addi a0,a5,1972 # 30067b4 + 3001308: 2dad jal ra,3001982 + 300130a: a001 j 300130a + adcx->ADC_AVDD_EN.BIT.cfg_avdd_en = true; + 300130c: fec42703 lw a4,-20(s0) + 3001310: 65872783 lw a5,1624(a4) + 3001314: 0017e793 ori a5,a5,1 + 3001318: 64f72c23 sw a5,1624(a4) +} + 300131c: 0001 nop + 300131e: 40f2 lw ra,28(sp) + 3001320: 4462 lw s0,24(sp) + 3001322: 6105 addi sp,sp,32 + 3001324: 8082 ret + +03001326 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt0(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001326: 7179 addi sp,sp,-48 + 3001328: d606 sw ra,44(sp) + 300132a: d422 sw s0,40(sp) + 300132c: 1800 addi s0,sp,48 + 300132e: fca42e23 sw a0,-36(s0) + 3001332: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001336: fdc42703 lw a4,-36(s0) + 300133a: 180007b7 lui a5,0x18000 + 300133e: 00f70b63 beq a4,a5,3001354 + 3001342: 6785 lui a5,0x1 + 3001344: 87978593 addi a1,a5,-1927 # 879 + 3001348: 030067b7 lui a5,0x3006 + 300134c: 7b478513 addi a0,a5,1972 # 30067b4 + 3001350: 2d0d jal ra,3001982 + 3001352: a001 j 3001352 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 3001354: fd842503 lw a0,-40(s0) + 3001358: 3dc1 jal ra,3001228 + 300135a: 87aa mv a5,a0 + 300135c: 0017c793 xori a5,a5,1 + 3001360: 9f81 uxtb a5 + 3001362: cb91 beqz a5,3001376 + 3001364: 6785 lui a5,0x1 + 3001366: 87a78593 addi a1,a5,-1926 # 87a + 300136a: 030067b7 lui a5,0x3006 + 300136e: 7b478513 addi a0,a5,1972 # 30067b4 + 3001372: 2d01 jal ra,3001982 + 3001374: a01d j 300139a + unsigned int shiftBit = (unsigned int)socx; + 3001376: fd842783 lw a5,-40(s0) + 300137a: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 300137e: fdc42783 lw a5,-36(s0) + 3001382: 2b07a703 lw a4,688(a5) + 3001386: 4685 li a3,1 + 3001388: fec42783 lw a5,-20(s0) + 300138c: 00f697b3 sll a5,a3,a5 + 3001390: 8f5d or a4,a4,a5 + 3001392: fdc42783 lw a5,-36(s0) + 3001396: 2ae7a823 sw a4,688(a5) +} + 300139a: 50b2 lw ra,44(sp) + 300139c: 5422 lw s0,40(sp) + 300139e: 6145 addi sp,sp,48 + 30013a0: 8082 ret + +030013a2 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt1(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30013a2: 7179 addi sp,sp,-48 + 30013a4: d606 sw ra,44(sp) + 30013a6: d422 sw s0,40(sp) + 30013a8: 1800 addi s0,sp,48 + 30013aa: fca42e23 sw a0,-36(s0) + 30013ae: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30013b2: fdc42703 lw a4,-36(s0) + 30013b6: 180007b7 lui a5,0x18000 + 30013ba: 00f70b63 beq a4,a5,30013d0 + 30013be: 6785 lui a5,0x1 + 30013c0: 89478593 addi a1,a5,-1900 # 894 + 30013c4: 030067b7 lui a5,0x3006 + 30013c8: 7b478513 addi a0,a5,1972 # 30067b4 + 30013cc: 2b5d jal ra,3001982 + 30013ce: a001 j 30013ce + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30013d0: fd842503 lw a0,-40(s0) + 30013d4: 3d91 jal ra,3001228 + 30013d6: 87aa mv a5,a0 + 30013d8: 0017c793 xori a5,a5,1 + 30013dc: 9f81 uxtb a5 + 30013de: cb91 beqz a5,30013f2 + 30013e0: 6785 lui a5,0x1 + 30013e2: 89578593 addi a1,a5,-1899 # 895 + 30013e6: 030067b7 lui a5,0x3006 + 30013ea: 7b478513 addi a0,a5,1972 # 30067b4 + 30013ee: 2b51 jal ra,3001982 + 30013f0: a025 j 3001418 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30013f2: fd842783 lw a5,-40(s0) + 30013f6: 07c1 addi a5,a5,16 + 30013f8: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 30013fc: fdc42783 lw a5,-36(s0) + 3001400: 2b07a703 lw a4,688(a5) + 3001404: 4685 li a3,1 + 3001406: fec42783 lw a5,-20(s0) + 300140a: 00f697b3 sll a5,a3,a5 + 300140e: 8f5d or a4,a4,a5 + 3001410: fdc42783 lw a5,-36(s0) + 3001414: 2ae7a823 sw a4,688(a5) +} + 3001418: 50b2 lw ra,44(sp) + 300141a: 5422 lw s0,40(sp) + 300141c: 6145 addi sp,sp,48 + 300141e: 8082 ret + +03001420 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt2(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001420: 7179 addi sp,sp,-48 + 3001422: d606 sw ra,44(sp) + 3001424: d422 sw s0,40(sp) + 3001426: 1800 addi s0,sp,48 + 3001428: fca42e23 sw a0,-36(s0) + 300142c: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001430: fdc42703 lw a4,-36(s0) + 3001434: 180007b7 lui a5,0x18000 + 3001438: 00f70b63 beq a4,a5,300144e + 300143c: 6785 lui a5,0x1 + 300143e: 8af78593 addi a1,a5,-1873 # 8af + 3001442: 030067b7 lui a5,0x3006 + 3001446: 7b478513 addi a0,a5,1972 # 30067b4 + 300144a: 2b25 jal ra,3001982 + 300144c: a001 j 300144c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300144e: fd842503 lw a0,-40(s0) + 3001452: 3bd9 jal ra,3001228 + 3001454: 87aa mv a5,a0 + 3001456: 0017c793 xori a5,a5,1 + 300145a: 9f81 uxtb a5 + 300145c: cb91 beqz a5,3001470 + 300145e: 6785 lui a5,0x1 + 3001460: 8b078593 addi a1,a5,-1872 # 8b0 + 3001464: 030067b7 lui a5,0x3006 + 3001468: 7b478513 addi a0,a5,1972 # 30067b4 + 300146c: 2b19 jal ra,3001982 + 300146e: a01d j 3001494 + unsigned int shiftBit = (unsigned int)socx; + 3001470: fd842783 lw a5,-40(s0) + 3001474: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 3001478: fdc42783 lw a5,-36(s0) + 300147c: 2b47a703 lw a4,692(a5) + 3001480: 4685 li a3,1 + 3001482: fec42783 lw a5,-20(s0) + 3001486: 00f697b3 sll a5,a3,a5 + 300148a: 8f5d or a4,a4,a5 + 300148c: fdc42783 lw a5,-36(s0) + 3001490: 2ae7aa23 sw a4,692(a5) +} + 3001494: 50b2 lw ra,44(sp) + 3001496: 5422 lw s0,40(sp) + 3001498: 6145 addi sp,sp,48 + 300149a: 8082 ret + +0300149c : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt3(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300149c: 7179 addi sp,sp,-48 + 300149e: d606 sw ra,44(sp) + 30014a0: d422 sw s0,40(sp) + 30014a2: 1800 addi s0,sp,48 + 30014a4: fca42e23 sw a0,-36(s0) + 30014a8: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30014ac: fdc42703 lw a4,-36(s0) + 30014b0: 180007b7 lui a5,0x18000 + 30014b4: 00f70b63 beq a4,a5,30014ca + 30014b8: 6785 lui a5,0x1 + 30014ba: 8ca78593 addi a1,a5,-1846 # 8ca + 30014be: 030067b7 lui a5,0x3006 + 30014c2: 7b478513 addi a0,a5,1972 # 30067b4 + 30014c6: 2975 jal ra,3001982 + 30014c8: a001 j 30014c8 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30014ca: fd842503 lw a0,-40(s0) + 30014ce: 3ba9 jal ra,3001228 + 30014d0: 87aa mv a5,a0 + 30014d2: 0017c793 xori a5,a5,1 + 30014d6: 9f81 uxtb a5 + 30014d8: cb91 beqz a5,30014ec + 30014da: 6785 lui a5,0x1 + 30014dc: 8cb78593 addi a1,a5,-1845 # 8cb + 30014e0: 030067b7 lui a5,0x3006 + 30014e4: 7b478513 addi a0,a5,1972 # 30067b4 + 30014e8: 2969 jal ra,3001982 + 30014ea: a025 j 3001512 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30014ec: fd842783 lw a5,-40(s0) + 30014f0: 07c1 addi a5,a5,16 + 30014f2: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 30014f6: fdc42783 lw a5,-36(s0) + 30014fa: 2b47a703 lw a4,692(a5) + 30014fe: 4685 li a3,1 + 3001500: fec42783 lw a5,-20(s0) + 3001504: 00f697b3 sll a5,a3,a5 + 3001508: 8f5d or a4,a4,a5 + 300150a: fdc42783 lw a5,-36(s0) + 300150e: 2ae7aa23 sw a4,692(a5) +} + 3001512: 50b2 lw ra,44(sp) + 3001514: 5422 lw s0,40(sp) + 3001516: 6145 addi sp,sp,48 + 3001518: 8082 ret + +0300151a : + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + 300151a: 1101 addi sp,sp,-32 + 300151c: ce06 sw ra,28(sp) + 300151e: cc22 sw s0,24(sp) + 3001520: 1000 addi s0,sp,32 + 3001522: fea42623 sw a0,-20(s0) + 3001526: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300152a: fec42703 lw a4,-20(s0) + 300152e: 180007b7 lui a5,0x18000 + 3001532: 00f70b63 beq a4,a5,3001548 + 3001536: 6785 lui a5,0x1 + 3001538: 8e578593 addi a1,a5,-1819 # 8e5 + 300153c: 030067b7 lui a5,0x3006 + 3001540: 7b478513 addi a0,a5,1972 # 30067b4 + 3001544: 293d jal ra,3001982 + 3001546: a001 j 3001546 + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + 3001548: fe842503 lw a0,-24(s0) + 300154c: 39e5 jal ra,3001244 + 300154e: 87aa mv a5,a0 + 3001550: 0017c793 xori a5,a5,1 + 3001554: 9f81 uxtb a5 + 3001556: cb91 beqz a5,300156a + 3001558: 6785 lui a5,0x1 + 300155a: 8e678593 addi a1,a5,-1818 # 8e6 + 300155e: 030067b7 lui a5,0x3006 + 3001562: 7b478513 addi a0,a5,1972 # 30067b4 + 3001566: 2931 jal ra,3001982 + 3001568: a839 j 3001586 + adcx->ADC_DATA_FLAG_MASK.reg |= (1U << (unsigned int)intx); + 300156a: fec42783 lw a5,-20(s0) + 300156e: 2c07a703 lw a4,704(a5) + 3001572: 4685 li a3,1 + 3001574: fe842783 lw a5,-24(s0) + 3001578: 00f697b3 sll a5,a3,a5 + 300157c: 8f5d or a4,a4,a5 + 300157e: fec42783 lw a5,-20(s0) + 3001582: 2ce7a023 sw a4,704(a5) +} + 3001586: 40f2 lw ra,28(sp) + 3001588: 4462 lw s0,24(sp) + 300158a: 6105 addi sp,sp,32 + 300158c: 8082 ret + +0300158e : + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_ClearIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + 300158e: 1101 addi sp,sp,-32 + 3001590: ce06 sw ra,28(sp) + 3001592: cc22 sw s0,24(sp) + 3001594: 1000 addi s0,sp,32 + 3001596: fea42623 sw a0,-20(s0) + 300159a: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300159e: fec42703 lw a4,-20(s0) + 30015a2: 180007b7 lui a5,0x18000 + 30015a6: 00f70b63 beq a4,a5,30015bc + 30015aa: 6785 lui a5,0x1 + 30015ac: 8ff78593 addi a1,a5,-1793 # 8ff + 30015b0: 030067b7 lui a5,0x3006 + 30015b4: 7b478513 addi a0,a5,1972 # 30067b4 + 30015b8: 26e9 jal ra,3001982 + 30015ba: a001 j 30015ba + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + 30015bc: fe842503 lw a0,-24(s0) + 30015c0: 3151 jal ra,3001244 + 30015c2: 87aa mv a5,a0 + 30015c4: 0017c793 xori a5,a5,1 + 30015c8: 9f81 uxtb a5 + 30015ca: cb91 beqz a5,30015de + 30015cc: 6785 lui a5,0x1 + 30015ce: 90078593 addi a1,a5,-1792 # 900 + 30015d2: 030067b7 lui a5,0x3006 + 30015d6: 7b478513 addi a0,a5,1972 # 30067b4 + 30015da: 2665 jal ra,3001982 + 30015dc: a811 j 30015f0 + adcx->ADC_INT_DATA_FLAG.reg = (1U << (unsigned int)intx); + 30015de: 4705 li a4,1 + 30015e0: fe842783 lw a5,-24(s0) + 30015e4: 00f71733 sll a4,a4,a5 + 30015e8: fec42783 lw a5,-20(s0) + 30015ec: 2ae7ac23 sw a4,696(a5) +} + 30015f0: 40f2 lw ra,28(sp) + 30015f2: 4462 lw s0,24(sp) + 30015f4: 6105 addi sp,sp,32 + 30015f6: 8082 ret + +030015f8 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval addr, the base address of the SOC registers. + */ +static unsigned int ADC_GetCTRLAddr(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30015f8: 7179 addi sp,sp,-48 + 30015fa: d622 sw s0,44(sp) + 30015fc: 1800 addi s0,sp,48 + 30015fe: fca42e23 sw a0,-36(s0) + 3001602: fcb42c23 sw a1,-40(s0) + unsigned int addr; + addr = (uintptr_t)(void *)&(adcx->ADC_SOC0_CFG); + 3001606: fdc42783 lw a5,-36(s0) + 300160a: 10078793 addi a5,a5,256 + 300160e: fef42623 sw a5,-20(s0) + addr += ((unsigned int)socx * 4); /* Register base address difference 4 */ + 3001612: fd842783 lw a5,-40(s0) + 3001616: 078a slli a5,a5,0x2 + 3001618: fec42703 lw a4,-20(s0) + 300161c: 97ba add a5,a5,a4 + 300161e: fef42623 sw a5,-20(s0) + return addr; + 3001622: fec42783 lw a5,-20(s0) +} + 3001626: 853e mv a0,a5 + 3001628: 5432 lw s0,44(sp) + 300162a: 6145 addi sp,sp,48 + 300162c: 8082 ret + +0300162e : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param input ADC input, @ref ADC_Input. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelectChannel(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_Input input) +{ + 300162e: 7179 addi sp,sp,-48 + 3001630: d606 sw ra,44(sp) + 3001632: d422 sw s0,40(sp) + 3001634: 1800 addi s0,sp,48 + 3001636: fca42e23 sw a0,-36(s0) + 300163a: fcb42c23 sw a1,-40(s0) + 300163e: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001642: fdc42703 lw a4,-36(s0) + 3001646: 180007b7 lui a5,0x18000 + 300164a: 00f70b63 beq a4,a5,3001660 + 300164e: 6785 lui a5,0x1 + 3001650: 91c78593 addi a1,a5,-1764 # 91c + 3001654: 030067b7 lui a5,0x3006 + 3001658: 7b478513 addi a0,a5,1972 # 30067b4 + 300165c: 261d jal ra,3001982 + 300165e: a001 j 300165e + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCSampleChannel(input)); + 3001660: fd842503 lw a0,-40(s0) + 3001664: 36d1 jal ra,3001228 + 3001666: 87aa mv a5,a0 + 3001668: 0017c793 xori a5,a5,1 + 300166c: 9f81 uxtb a5 + 300166e: eb89 bnez a5,3001680 + 3001670: fd442503 lw a0,-44(s0) + 3001674: 3e61 jal ra,300120c + 3001676: 87aa mv a5,a0 + 3001678: 0017c793 xori a5,a5,1 + 300167c: 9f81 uxtb a5 + 300167e: cb91 beqz a5,3001692 + 3001680: 6785 lui a5,0x1 + 3001682: 91d78593 addi a1,a5,-1763 # 91d + 3001686: 030067b7 lui a5,0x3006 + 300168a: 7b478513 addi a0,a5,1972 # 30067b4 + 300168e: 2cd5 jal ra,3001982 + 3001690: a091 j 30016d4 + ADC_SOC0_CFG_REG *soc = NULL; + 3001692: fe042623 sw zero,-20(s0) + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Get the Address After Translation */ + 3001696: fd842583 lw a1,-40(s0) + 300169a: fdc42503 lw a0,-36(s0) + 300169e: 3fa9 jal ra,30015f8 + 30016a0: fea42423 sw a0,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30016a4: fe842783 lw a5,-24(s0) + 30016a8: fef42623 sw a5,-20(s0) + soc->BIT.cfg_soc0_ch_sel = (unsigned int)input; + 30016ac: fd442783 lw a5,-44(s0) + 30016b0: 8bfd andi a5,a5,31 + 30016b2: 0ff7f693 andi a3,a5,255 + 30016b6: fec42703 lw a4,-20(s0) + 30016ba: 431c lw a5,0(a4) + 30016bc: 8afd andi a3,a3,31 + 30016be: 9b81 andi a5,a5,-32 + 30016c0: 8fd5 or a5,a5,a3 + 30016c2: c31c sw a5,0(a4) + if (input == ADC_CH_ADCINA18) { + 30016c4: fd442703 lw a4,-44(s0) + 30016c8: 47c9 li a5,18 + 30016ca: 00f71563 bne a4,a5,30016d4 + DCL_ADC_EnableAvddChannel(adcx); + 30016ce: fdc42503 lw a0,-36(s0) + 30016d2: 3901 jal ra,30012e2 + } +} + 30016d4: 50b2 lw ra,44(sp) + 30016d6: 5422 lw s0,40(sp) + 30016d8: 6145 addi sp,sp,48 + 30016da: 8082 ret + +030016dc : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param trig Source of trigger, @ref ADC_TrigSource. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelcetTrigSource(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_TrigSource trig) +{ + 30016dc: 7179 addi sp,sp,-48 + 30016de: d606 sw ra,44(sp) + 30016e0: d422 sw s0,40(sp) + 30016e2: 1800 addi s0,sp,48 + 30016e4: fca42e23 sw a0,-36(s0) + 30016e8: fcb42c23 sw a1,-40(s0) + 30016ec: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30016f0: fdc42703 lw a4,-36(s0) + 30016f4: 180007b7 lui a5,0x18000 + 30016f8: 00f70b63 beq a4,a5,300170e + 30016fc: 6785 lui a5,0x1 + 30016fe: 93078593 addi a1,a5,-1744 # 930 + 3001702: 030067b7 lui a5,0x3006 + 3001706: 7b478513 addi a0,a5,1972 # 30067b4 + 300170a: 2ca5 jal ra,3001982 + 300170c: a001 j 300170c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCTrigSource(trig)); + 300170e: fd842503 lw a0,-40(s0) + 3001712: 3e19 jal ra,3001228 + 3001714: 87aa mv a5,a0 + 3001716: 0017c793 xori a5,a5,1 + 300171a: 9f81 uxtb a5 + 300171c: eb89 bnez a5,300172e + 300171e: fd442503 lw a0,-44(s0) + 3001722: 3e3d jal ra,3001260 + 3001724: 87aa mv a5,a0 + 3001726: 0017c793 xori a5,a5,1 + 300172a: 9f81 uxtb a5 + 300172c: cb91 beqz a5,3001740 + 300172e: 6785 lui a5,0x1 + 3001730: 93178593 addi a1,a5,-1743 # 931 + 3001734: 030067b7 lui a5,0x3006 + 3001738: 7b478513 addi a0,a5,1972 # 30067b4 + 300173c: 2499 jal ra,3001982 + 300173e: a835 j 300177a + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtaining the Address for Configuring the SOC */ + 3001740: fd842583 lw a1,-40(s0) + 3001744: fdc42503 lw a0,-36(s0) + 3001748: 3d45 jal ra,30015f8 + 300174a: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 300174e: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 3001752: fec42783 lw a5,-20(s0) + 3001756: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_trig_sel = (unsigned int)trig; + 300175a: fd442783 lw a5,-44(s0) + 300175e: 8bfd andi a5,a5,31 + 3001760: 0ff7f693 andi a3,a5,255 + 3001764: fe842703 lw a4,-24(s0) + 3001768: 431c lw a5,0(a4) + 300176a: 8afd andi a3,a3,31 + 300176c: 06a6 slli a3,a3,0x9 + 300176e: 7671 lui a2,0xffffc + 3001770: 1ff60613 addi a2,a2,511 # ffffc1ff + 3001774: 8ff1 and a5,a5,a2 + 3001776: 8fd5 or a5,a5,a3 + 3001778: c31c sw a5,0(a4) +} + 300177a: 50b2 lw ra,44(sp) + 300177c: 5422 lw s0,40(sp) + 300177e: 6145 addi sp,sp,48 + 3001780: 8082 ret + +03001782 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param acqps Capacitor charging time. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetAcqps(ADC_RegStruct * const adcx, ADC_SOCNumber socx, unsigned int acqps) +{ + 3001782: 7179 addi sp,sp,-48 + 3001784: d606 sw ra,44(sp) + 3001786: d422 sw s0,40(sp) + 3001788: 1800 addi s0,sp,48 + 300178a: fca42e23 sw a0,-36(s0) + 300178e: fcb42c23 sw a1,-40(s0) + 3001792: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001796: fdc42703 lw a4,-36(s0) + 300179a: 180007b7 lui a5,0x18000 + 300179e: 00f70b63 beq a4,a5,30017b4 + 30017a2: 6785 lui a5,0x1 + 30017a4: 94178593 addi a1,a5,-1727 # 941 + 30017a8: 030067b7 lui a5,0x3006 + 30017ac: 7b478513 addi a0,a5,1972 # 30067b4 + 30017b0: 2ac9 jal ra,3001982 + 30017b2: a001 j 30017b2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30017b4: fd842503 lw a0,-40(s0) + 30017b8: 3c85 jal ra,3001228 + 30017ba: 87aa mv a5,a0 + 30017bc: 0017c793 xori a5,a5,1 + 30017c0: 9f81 uxtb a5 + 30017c2: cb91 beqz a5,30017d6 + 30017c4: 6785 lui a5,0x1 + 30017c6: 94278593 addi a1,a5,-1726 # 942 + 30017ca: 030067b7 lui a5,0x3006 + 30017ce: 7b478513 addi a0,a5,1972 # 30067b4 + 30017d2: 2a45 jal ra,3001982 + 30017d4: a891 j 3001828 + ADC_PARAM_CHECK_NO_RET(acqps <= 15); /* The value of acqps ranges from 0 to 15 */ + 30017d6: fd442703 lw a4,-44(s0) + 30017da: 47bd li a5,15 + 30017dc: 00e7fb63 bgeu a5,a4,30017f2 + 30017e0: 6785 lui a5,0x1 + 30017e2: 94378593 addi a1,a5,-1725 # 943 + 30017e6: 030067b7 lui a5,0x3006 + 30017ea: 7b478513 addi a0,a5,1972 # 30067b4 + 30017ee: 2a51 jal ra,3001982 + 30017f0: a825 j 3001828 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); + 30017f2: fd842583 lw a1,-40(s0) + 30017f6: fdc42503 lw a0,-36(s0) + 30017fa: 3bfd jal ra,30015f8 + 30017fc: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 3001800: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 3001804: fec42783 lw a5,-20(s0) + 3001808: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_samptime_sel = acqps; + 300180c: fd442783 lw a5,-44(s0) + 3001810: 8bbd andi a5,a5,15 + 3001812: 0ff7f693 andi a3,a5,255 + 3001816: fe842703 lw a4,-24(s0) + 300181a: 431c lw a5,0(a4) + 300181c: 8abd andi a3,a3,15 + 300181e: 0696 slli a3,a3,0x5 + 3001820: e1f7f793 andi a5,a5,-481 + 3001824: 8fd5 or a5,a5,a3 + 3001826: c31c sw a5,0(a4) +} + 3001828: 50b2 lw ra,44(sp) + 300182a: 5422 lw s0,40(sp) + 300182c: 6145 addi sp,sp,48 + 300182e: 8082 ret + +03001830 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SOCxSoftTrigger(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001830: 1101 addi sp,sp,-32 + 3001832: ce06 sw ra,28(sp) + 3001834: cc22 sw s0,24(sp) + 3001836: 1000 addi s0,sp,32 + 3001838: fea42623 sw a0,-20(s0) + 300183c: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001840: fec42703 lw a4,-20(s0) + 3001844: 180007b7 lui a5,0x18000 + 3001848: 00f70b63 beq a4,a5,300185e + 300184c: 6785 lui a5,0x1 + 300184e: 95278593 addi a1,a5,-1710 # 952 + 3001852: 030067b7 lui a5,0x3006 + 3001856: 7b478513 addi a0,a5,1972 # 30067b4 + 300185a: 2225 jal ra,3001982 + 300185c: a001 j 300185c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300185e: fe842503 lw a0,-24(s0) + 3001862: 32d9 jal ra,3001228 + 3001864: 87aa mv a5,a0 + 3001866: 0017c793 xori a5,a5,1 + 300186a: 9f81 uxtb a5 + 300186c: cb91 beqz a5,3001880 + 300186e: 6785 lui a5,0x1 + 3001870: 95378593 addi a1,a5,-1709 # 953 + 3001874: 030067b7 lui a5,0x3006 + 3001878: 7b478513 addi a0,a5,1972 # 30067b4 + 300187c: 2219 jal ra,3001982 + 300187e: a839 j 300189c + adcx->ADC_SOFT_TRIG.reg |= (1U << (unsigned int)socx); + 3001880: fec42783 lw a5,-20(s0) + 3001884: 1607a703 lw a4,352(a5) + 3001888: 4685 li a3,1 + 300188a: fe842783 lw a5,-24(s0) + 300188e: 00f697b3 sll a5,a3,a5 + 3001892: 8f5d or a4,a4,a5 + 3001894: fec42783 lw a5,-20(s0) + 3001898: 16e7a023 sw a4,352(a5) +} + 300189c: 40f2 lw ra,28(sp) + 300189e: 4462 lw s0,24(sp) + 30018a0: 6105 addi sp,sp,32 + 30018a2: 8082 ret + +030018a4 : + * @param adcx ADC register base address. + * @param priorityMode Mode of SOC priority, @ref ADC_PriorityMode. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetPriority(ADC_RegStruct * const adcx, ADC_PriorityMode priorityMode) +{ + 30018a4: 1101 addi sp,sp,-32 + 30018a6: ce06 sw ra,28(sp) + 30018a8: cc22 sw s0,24(sp) + 30018aa: 1000 addi s0,sp,32 + 30018ac: fea42623 sw a0,-20(s0) + 30018b0: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30018b4: fec42703 lw a4,-20(s0) + 30018b8: 180007b7 lui a5,0x18000 + 30018bc: 00f70b63 beq a4,a5,30018d2 + 30018c0: 6785 lui a5,0x1 + 30018c2: 96c78593 addi a1,a5,-1684 # 96c + 30018c6: 030067b7 lui a5,0x3006 + 30018ca: 7b478513 addi a0,a5,1972 # 30067b4 + 30018ce: 2855 jal ra,3001982 + 30018d0: a001 j 30018d0 + ADC_PARAM_CHECK_NO_RET(IsADCPriorityMode(priorityMode)); + 30018d2: fe842503 lw a0,-24(s0) + 30018d6: 3ac9 jal ra,30012a8 + 30018d8: 87aa mv a5,a0 + 30018da: 0017c793 xori a5,a5,1 + 30018de: 9f81 uxtb a5 + 30018e0: cb91 beqz a5,30018f4 + 30018e2: 6785 lui a5,0x1 + 30018e4: 96d78593 addi a1,a5,-1683 # 96d + 30018e8: 030067b7 lui a5,0x3006 + 30018ec: 7b478513 addi a0,a5,1972 # 30067b4 + 30018f0: 2849 jal ra,3001982 + 30018f2: a039 j 3001900 + adcx->ADC_ARBT0.reg = priorityMode; + 30018f4: fec42783 lw a5,-20(s0) + 30018f8: fe842703 lw a4,-24(s0) + 30018fc: 20e7a023 sw a4,512(a5) +} + 3001900: 40f2 lw ra,28(sp) + 3001902: 4462 lw s0,24(sp) + 3001904: 6105 addi sp,sp,32 + 3001906: 8082 ret + +03001908 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval unsigned int, result. + */ +static inline unsigned int DCL_ADC_ReadSOCxResult(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001908: 7179 addi sp,sp,-48 + 300190a: d606 sw ra,44(sp) + 300190c: d422 sw s0,40(sp) + 300190e: 1800 addi s0,sp,48 + 3001910: fca42e23 sw a0,-36(s0) + 3001914: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001918: fdc42703 lw a4,-36(s0) + 300191c: 180007b7 lui a5,0x18000 + 3001920: 00f70b63 beq a4,a5,3001936 + 3001924: 6785 lui a5,0x1 + 3001926: a8778593 addi a1,a5,-1401 # a87 + 300192a: 030067b7 lui a5,0x3006 + 300192e: 7b478513 addi a0,a5,1972 # 30067b4 + 3001932: 2881 jal ra,3001982 + 3001934: a001 j 3001934 + ADC_ASSERT_PARAM(IsADCSOCx(socx)); + 3001936: fd842503 lw a0,-40(s0) + 300193a: 30fd jal ra,3001228 + 300193c: 87aa mv a5,a0 + 300193e: 0017c793 xori a5,a5,1 + 3001942: 9f81 uxtb a5 + 3001944: cb91 beqz a5,3001958 + 3001946: 6785 lui a5,0x1 + 3001948: a8878593 addi a1,a5,-1400 # a88 + 300194c: 030067b7 lui a5,0x3006 + 3001950: 7b478513 addi a0,a5,1972 # 30067b4 + 3001954: 203d jal ra,3001982 + 3001956: a001 j 3001956 + ADC_RESULT0_REG *result; + uintptr_t addr = (uintptr_t)(void *)adcx; + 3001958: fdc42783 lw a5,-36(s0) + 300195c: fef42623 sw a5,-20(s0) + /* The address interval of the result register is 4 */ + result = (ADC_RESULT0_REG *)(void *)(addr + 4 * (unsigned int)socx); + 3001960: fd842783 lw a5,-40(s0) + 3001964: 00279713 slli a4,a5,0x2 + 3001968: fec42783 lw a5,-20(s0) + 300196c: 97ba add a5,a5,a4 + 300196e: fef42423 sw a5,-24(s0) + return result->reg; + 3001972: fe842783 lw a5,-24(s0) + 3001976: 439c lw a5,0(a5) +} + 3001978: 853e mv a0,a5 + 300197a: 50b2 lw ra,44(sp) + 300197c: 5422 lw s0,40(sp) + 300197e: 6145 addi sp,sp,48 + 3001980: 8082 ret + +03001982 : + 3001982: 0650006f j 30021e6 + +03001986 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001986: 7179 addi sp,sp,-48 + 3001988: d606 sw ra,44(sp) + 300198a: d422 sw s0,40(sp) + 300198c: 1800 addi s0,sp,48 + 300198e: fca42e23 sw a0,-36(s0) + 3001992: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001996: fdc42703 lw a4,-36(s0) + 300199a: 180007b7 lui a5,0x18000 + 300199e: 00f70b63 beq a4,a5,30019b4 + 30019a2: 6785 lui a5,0x1 + 30019a4: b4678593 addi a1,a5,-1210 # b46 + 30019a8: 030067b7 lui a5,0x3006 + 30019ac: 7b478513 addi a0,a5,1972 # 30067b4 + 30019b0: 3fc9 jal ra,3001982 + 30019b2: a001 j 30019b2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30019b4: fd842503 lw a0,-40(s0) + 30019b8: 3885 jal ra,3001228 + 30019ba: 87aa mv a5,a0 + 30019bc: 0017c793 xori a5,a5,1 + 30019c0: 9f81 uxtb a5 + 30019c2: cb91 beqz a5,30019d6 + 30019c4: 6785 lui a5,0x1 + 30019c6: b4778593 addi a1,a5,-1209 # b47 + 30019ca: 030067b7 lui a5,0x3006 + 30019ce: 7b478513 addi a0,a5,1972 # 30067b4 + 30019d2: 3f45 jal ra,3001982 + 30019d4: a025 j 30019fc + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 30019d6: fd842583 lw a1,-40(s0) + 30019da: fdc42503 lw a0,-36(s0) + 30019de: 3929 jal ra,30015f8 + 30019e0: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 30019e4: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30019e8: fec42783 lw a5,-20(s0) + 30019ec: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_ENABLE; + 30019f0: fe842703 lw a4,-24(s0) + 30019f4: 431c lw a5,0(a4) + 30019f6: 6691 lui a3,0x4 + 30019f8: 8fd5 or a5,a5,a3 + 30019fa: c31c sw a5,0(a4) +} + 30019fc: 50b2 lw ra,44(sp) + 30019fe: 5422 lw s0,40(sp) + 3001a00: 6145 addi sp,sp,48 + 3001a02: 8082 ret + +03001a04 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_DisableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001a04: 7179 addi sp,sp,-48 + 3001a06: d606 sw ra,44(sp) + 3001a08: d422 sw s0,40(sp) + 3001a0a: 1800 addi s0,sp,48 + 3001a0c: fca42e23 sw a0,-36(s0) + 3001a10: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001a14: fdc42703 lw a4,-36(s0) + 3001a18: 180007b7 lui a5,0x18000 + 3001a1c: 00f70b63 beq a4,a5,3001a32 + 3001a20: 6785 lui a5,0x1 + 3001a22: b5678593 addi a1,a5,-1194 # b56 + 3001a26: 030067b7 lui a5,0x3006 + 3001a2a: 7b478513 addi a0,a5,1972 # 30067b4 + 3001a2e: 3f91 jal ra,3001982 + 3001a30: a001 j 3001a30 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 3001a32: fd842503 lw a0,-40(s0) + 3001a36: ff2ff0ef jal ra,3001228 + 3001a3a: 87aa mv a5,a0 + 3001a3c: 0017c793 xori a5,a5,1 + 3001a40: 9f81 uxtb a5 + 3001a42: cb91 beqz a5,3001a56 + 3001a44: 6785 lui a5,0x1 + 3001a46: b5778593 addi a1,a5,-1193 # b57 + 3001a4a: 030067b7 lui a5,0x3006 + 3001a4e: 7b478513 addi a0,a5,1972 # 30067b4 + 3001a52: 3f05 jal ra,3001982 + 3001a54: a02d j 3001a7e + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 3001a56: fd842583 lw a1,-40(s0) + 3001a5a: fdc42503 lw a0,-36(s0) + 3001a5e: 3e69 jal ra,30015f8 + 3001a60: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 3001a64: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 3001a68: fec42783 lw a5,-20(s0) + 3001a6c: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_DISABLE; + 3001a70: fe842703 lw a4,-24(s0) + 3001a74: 431c lw a5,0(a4) + 3001a76: 76f1 lui a3,0xffffc + 3001a78: 16fd addi a3,a3,-1 # ffffbfff + 3001a7a: 8ff5 and a5,a5,a3 + 3001a7c: c31c sw a5,0(a4) +} + 3001a7e: 50b2 lw ra,44(sp) + 3001a80: 5422 lw s0,40(sp) + 3001a82: 6145 addi sp,sp,48 + 3001a84: 8082 ret + +03001a86 : + * triggered at least 100 us later. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_Init(ADC_Handle *adcHandle) +{ + 3001a86: 1101 addi sp,sp,-32 + 3001a88: ce06 sw ra,28(sp) + 3001a8a: cc22 sw s0,24(sp) + 3001a8c: 1000 addi s0,sp,32 + 3001a8e: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001a92: fec42783 lw a5,-20(s0) + 3001a96: eb89 bnez a5,3001aa8 + 3001a98: 02c00593 li a1,44 + 3001a9c: 030067b7 lui a5,0x3006 + 3001aa0: 7d078513 addi a0,a5,2000 # 30067d0 + 3001aa4: 3df9 jal ra,3001982 + 3001aa6: a001 j 3001aa6 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001aa8: fec42783 lw a5,-20(s0) + 3001aac: 4398 lw a4,0(a5) + 3001aae: 180007b7 lui a5,0x18000 + 3001ab2: 00f70a63 beq a4,a5,3001ac6 + 3001ab6: 02d00593 li a1,45 + 3001aba: 030067b7 lui a5,0x3006 + 3001abe: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ac2: 35c1 jal ra,3001982 + 3001ac4: a001 j 3001ac4 + ADC_PARAM_CHECK_WITH_RET(IsADCPriorityMode(adcHandle->socPriority) == true, BASE_STATUS_ERROR); + 3001ac6: fec42783 lw a5,-20(s0) + 3001aca: 43dc lw a5,4(a5) + 3001acc: 853e mv a0,a5 + 3001ace: fdaff0ef jal ra,30012a8 + 3001ad2: 87aa mv a5,a0 + 3001ad4: 0017c793 xori a5,a5,1 + 3001ad8: 9f81 uxtb a5 + 3001ada: cb99 beqz a5,3001af0 + 3001adc: 02e00593 li a1,46 + 3001ae0: 030067b7 lui a5,0x3006 + 3001ae4: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ae8: 6fe000ef jal ra,30021e6 + 3001aec: 4785 li a5,1 + 3001aee: a091 j 3001b32 + DCL_ADC_SOCxSetPriority(adcHandle->baseAddress, adcHandle->socPriority); + 3001af0: fec42783 lw a5,-20(s0) + 3001af4: 4398 lw a4,0(a5) + 3001af6: fec42783 lw a5,-20(s0) + 3001afa: 43dc lw a5,4(a5) + 3001afc: 85be mv a1,a5 + 3001afe: 853a mv a0,a4 + 3001b00: 3355 jal ra,30018a4 + adcHandle->baseAddress->ADC_ANA_CTRL0.BIT.cfg_sar_samp_cap_sel = 0x4; /* Set the Number of Sampling Capacitors */ + 3001b02: fec42783 lw a5,-20(s0) + 3001b06: 4398 lw a4,0(a5) + 3001b08: 65472783 lw a5,1620(a4) + 3001b0c: 100006b7 lui a3,0x10000 + 3001b10: 16fd addi a3,a3,-1 # fffffff + 3001b12: 8efd and a3,a3,a5 + 3001b14: 400007b7 lui a5,0x40000 + 3001b18: 8fd5 or a5,a5,a3 + 3001b1a: 64f72a23 sw a5,1620(a4) + adcHandle->baseAddress->ADC_EN.reg = BASE_CFG_ENABLE; /* Enable ADC Controller */ + 3001b1e: fec42783 lw a5,-20(s0) + 3001b22: 439c lw a5,0(a5) + 3001b24: 4705 li a4,1 + 3001b26: 30e7a023 sw a4,768(a5) # 40000300 + BASE_FUNC_DelayUs(100); /* Wait for 100 us until the ADC controller is stable */ + 3001b2a: 06400513 li a0,100 + 3001b2e: 25cd jal ra,3002210 + return BASE_STATUS_OK; + 3001b30: 4781 li a5,0 +} + 3001b32: 853e mv a0,a5 + 3001b34: 40f2 lw ra,28(sp) + 3001b36: 4462 lw s0,24(sp) + 3001b38: 6105 addi sp,sp,32 + 3001b3a: 8082 ret + +03001b3c : + * @param soc ID of SOC(start of conversion), managing the specific sample inputs. + * @param socParam Param struct of SOC. This is related to the peripheral circuit design, @ref SOC_Param. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_ConfigureSoc(ADC_Handle *adcHandle, ADC_SOCNumber soc, SOC_Param *socParam) +{ + 3001b3c: 1101 addi sp,sp,-32 + 3001b3e: ce06 sw ra,28(sp) + 3001b40: cc22 sw s0,24(sp) + 3001b42: 1000 addi s0,sp,32 + 3001b44: fea42623 sw a0,-20(s0) + 3001b48: feb42423 sw a1,-24(s0) + 3001b4c: fec42223 sw a2,-28(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001b50: fec42783 lw a5,-20(s0) + 3001b54: eb89 bnez a5,3001b66 + 3001b56: 04c00593 li a1,76 + 3001b5a: 030067b7 lui a5,0x3006 + 3001b5e: 7d078513 addi a0,a5,2000 # 30067d0 + 3001b62: 2551 jal ra,30021e6 + 3001b64: a001 j 3001b64 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001b66: fec42783 lw a5,-20(s0) + 3001b6a: 4398 lw a4,0(a5) + 3001b6c: 180007b7 lui a5,0x18000 + 3001b70: 00f70a63 beq a4,a5,3001b84 + 3001b74: 04d00593 li a1,77 + 3001b78: 030067b7 lui a5,0x3006 + 3001b7c: 7d078513 addi a0,a5,2000 # 30067d0 + 3001b80: 259d jal ra,30021e6 + 3001b82: a001 j 3001b82 + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001b84: fe842503 lw a0,-24(s0) + 3001b88: ea0ff0ef jal ra,3001228 + 3001b8c: 87aa mv a5,a0 + 3001b8e: 0017c793 xori a5,a5,1 + 3001b92: 9f81 uxtb a5 + 3001b94: cb91 beqz a5,3001ba8 + 3001b96: 04e00593 li a1,78 + 3001b9a: 030067b7 lui a5,0x3006 + 3001b9e: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ba2: 2591 jal ra,30021e6 + 3001ba4: 4785 li a5,1 + 3001ba6: aa3d j 3001ce4 + ADC_ASSERT_PARAM(socParam != NULL); + 3001ba8: fe442783 lw a5,-28(s0) + 3001bac: eb89 bnez a5,3001bbe + 3001bae: 04f00593 li a1,79 + 3001bb2: 030067b7 lui a5,0x3006 + 3001bb6: 7d078513 addi a0,a5,2000 # 30067d0 + 3001bba: 2535 jal ra,30021e6 + 3001bbc: a001 j 3001bbc + ADC_PARAM_CHECK_WITH_RET(IsADCSampleChannel(socParam->adcInput) == true, BASE_STATUS_ERROR); + 3001bbe: fe442783 lw a5,-28(s0) + 3001bc2: 439c lw a5,0(a5) + 3001bc4: 853e mv a0,a5 + 3001bc6: e46ff0ef jal ra,300120c + 3001bca: 87aa mv a5,a0 + 3001bcc: 0017c793 xori a5,a5,1 + 3001bd0: 9f81 uxtb a5 + 3001bd2: cb91 beqz a5,3001be6 + 3001bd4: 05000593 li a1,80 + 3001bd8: 030067b7 lui a5,0x3006 + 3001bdc: 7d078513 addi a0,a5,2000 # 30067d0 + 3001be0: 2519 jal ra,30021e6 + 3001be2: 4785 li a5,1 + 3001be4: a201 j 3001ce4 + ADC_PARAM_CHECK_WITH_RET(IsADCTotalTime(socParam->sampleTotalTime) == true, BASE_STATUS_ERROR); + 3001be6: fe442783 lw a5,-28(s0) + 3001bea: 43dc lw a5,4(a5) + 3001bec: 853e mv a0,a5 + 3001bee: ed8ff0ef jal ra,30012c6 + 3001bf2: 87aa mv a5,a0 + 3001bf4: 0017c793 xori a5,a5,1 + 3001bf8: 9f81 uxtb a5 + 3001bfa: cb91 beqz a5,3001c0e + 3001bfc: 05100593 li a1,81 + 3001c00: 030067b7 lui a5,0x3006 + 3001c04: 7d078513 addi a0,a5,2000 # 30067d0 + 3001c08: 2bf9 jal ra,30021e6 + 3001c0a: 4785 li a5,1 + 3001c0c: a8e1 j 3001ce4 + ADC_PARAM_CHECK_WITH_RET(IsADCTrigSource(socParam->trigSource) == true, BASE_STATUS_ERROR); + 3001c0e: fe442783 lw a5,-28(s0) + 3001c12: 479c lw a5,8(a5) + 3001c14: 853e mv a0,a5 + 3001c16: e4aff0ef jal ra,3001260 + 3001c1a: 87aa mv a5,a0 + 3001c1c: 0017c793 xori a5,a5,1 + 3001c20: 9f81 uxtb a5 + 3001c22: cb91 beqz a5,3001c36 + 3001c24: 05200593 li a1,82 + 3001c28: 030067b7 lui a5,0x3006 + 3001c2c: 7d078513 addi a0,a5,2000 # 30067d0 + 3001c30: 2b5d jal ra,30021e6 + 3001c32: 4785 li a5,1 + 3001c34: a845 j 3001ce4 + ADC_PARAM_CHECK_WITH_RET(IsADCFinishMode(socParam->finishMode) == true, BASE_STATUS_ERROR); + 3001c36: fe442783 lw a5,-28(s0) + 3001c3a: 4b9c lw a5,16(a5) + 3001c3c: 853e mv a0,a5 + 3001c3e: e3eff0ef jal ra,300127c + 3001c42: 87aa mv a5,a0 + 3001c44: 0017c793 xori a5,a5,1 + 3001c48: 9f81 uxtb a5 + 3001c4a: cb91 beqz a5,3001c5e + 3001c4c: 05300593 li a1,83 + 3001c50: 030067b7 lui a5,0x3006 + 3001c54: 7d078513 addi a0,a5,2000 # 30067d0 + 3001c58: 2379 jal ra,30021e6 + 3001c5a: 4785 li a5,1 + 3001c5c: a061 j 3001ce4 + DCL_ADC_SOCxSelectChannel(adcHandle->baseAddress, soc, socParam->adcInput); /* Set channel */ + 3001c5e: fec42783 lw a5,-20(s0) + 3001c62: 4398 lw a4,0(a5) + 3001c64: fe442783 lw a5,-28(s0) + 3001c68: 439c lw a5,0(a5) + 3001c6a: 863e mv a2,a5 + 3001c6c: fe842583 lw a1,-24(s0) + 3001c70: 853a mv a0,a4 + 3001c72: 3a75 jal ra,300162e + DCL_ADC_SOCxSetAcqps(adcHandle->baseAddress, soc, socParam->sampleTotalTime); /* Set sampling time */ + 3001c74: fec42783 lw a5,-20(s0) + 3001c78: 4398 lw a4,0(a5) + 3001c7a: fe442783 lw a5,-28(s0) + 3001c7e: 43dc lw a5,4(a5) + 3001c80: 863e mv a2,a5 + 3001c82: fe842583 lw a1,-24(s0) + 3001c86: 853a mv a0,a4 + 3001c88: 3ced jal ra,3001782 + DCL_ADC_SOCxSelcetTrigSource(adcHandle->baseAddress, soc, socParam->trigSource); /* Set trigger source */ + 3001c8a: fec42783 lw a5,-20(s0) + 3001c8e: 4398 lw a4,0(a5) + 3001c90: fe442783 lw a5,-28(s0) + 3001c94: 479c lw a5,8(a5) + 3001c96: 863e mv a2,a5 + 3001c98: fe842583 lw a1,-24(s0) + 3001c9c: 853a mv a0,a4 + 3001c9e: 3c3d jal ra,30016dc + if (socParam->continueMode == true) { /* Continuous Mode Judgment */ + 3001ca0: fe442783 lw a5,-28(s0) + 3001ca4: 27dc lbu a5,12(a5) + 3001ca6: cb89 beqz a5,3001cb8 + DCL_ADC_EnableSOCxContinue(adcHandle->baseAddress, soc); + 3001ca8: fec42783 lw a5,-20(s0) + 3001cac: 439c lw a5,0(a5) + 3001cae: fe842583 lw a1,-24(s0) + 3001cb2: 853e mv a0,a5 + 3001cb4: 39c9 jal ra,3001986 + 3001cb6: a801 j 3001cc6 + } else { + DCL_ADC_DisableSOCxContinue(adcHandle->baseAddress, soc); + 3001cb8: fec42783 lw a5,-20(s0) + 3001cbc: 439c lw a5,0(a5) + 3001cbe: fe842583 lw a1,-24(s0) + 3001cc2: 853e mv a0,a5 + 3001cc4: 3381 jal ra,3001a04 + } + adcHandle->ADC_SOCxParam[soc].finishMode = socParam->finishMode; + 3001cc6: fe442783 lw a5,-28(s0) + 3001cca: 4b9c lw a5,16(a5) + 3001ccc: 01079713 slli a4,a5,0x10 + 3001cd0: 8341 srli a4,a4,0x10 + 3001cd2: fec42683 lw a3,-20(s0) + 3001cd6: fe842783 lw a5,-24(s0) + 3001cda: 07a1 addi a5,a5,8 + 3001cdc: 0786 slli a5,a5,0x1 + 3001cde: 97b6 add a5,a5,a3 + 3001ce0: a3da sh a4,4(a5) + return BASE_STATUS_OK; + 3001ce2: 4781 li a5,0 +} + 3001ce4: 853e mv a0,a5 + 3001ce6: 40f2 lw ra,28(sp) + 3001ce8: 4462 lw s0,24(sp) + 3001cea: 6105 addi sp,sp,32 + 3001cec: 8082 ret + +03001cee : + * interrupt is reported. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_StartIt(ADC_Handle *adcHandle) +{ + 3001cee: 7179 addi sp,sp,-48 + 3001cf0: d606 sw ra,44(sp) + 3001cf2: d422 sw s0,40(sp) + 3001cf4: 1800 addi s0,sp,48 + 3001cf6: fca42e23 sw a0,-36(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001cfa: fdc42783 lw a5,-36(s0) + 3001cfe: eb89 bnez a5,3001d10 + 3001d00: 0af00593 li a1,175 + 3001d04: 030067b7 lui a5,0x3006 + 3001d08: 7d078513 addi a0,a5,2000 # 30067d0 + 3001d0c: 29e9 jal ra,30021e6 + 3001d0e: a001 j 3001d0e + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001d10: fdc42783 lw a5,-36(s0) + 3001d14: 4398 lw a4,0(a5) + 3001d16: 180007b7 lui a5,0x18000 + 3001d1a: 00f70a63 beq a4,a5,3001d2e + 3001d1e: 0b000593 li a1,176 + 3001d22: 030067b7 lui a5,0x3006 + 3001d26: 7d078513 addi a0,a5,2000 # 30067d0 + 3001d2a: 2975 jal ra,30021e6 + 3001d2c: a001 j 3001d2c + unsigned int intVal = 0; + 3001d2e: fe042423 sw zero,-24(s0) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001d32: fe042623 sw zero,-20(s0) + 3001d36: a859 j 3001dcc + intVal = adcHandle->ADC_SOCxParam[i].finishMode; + 3001d38: fdc42703 lw a4,-36(s0) + 3001d3c: fec42783 lw a5,-20(s0) + 3001d40: 07a1 addi a5,a5,8 + 3001d42: 0786 slli a5,a5,0x1 + 3001d44: 97ba add a5,a5,a4 + 3001d46: 23de lhu a5,4(a5) + 3001d48: fef42423 sw a5,-24(s0) + switch (intVal) { + 3001d4c: fe842783 lw a5,-24(s0) + 3001d50: 4711 li a4,4 + 3001d52: 02e78a63 beq a5,a4,3001d86 + 3001d56: 4711 li a4,4 + 3001d58: 00f76663 bltu a4,a5,3001d64 + 3001d5c: 470d li a4,3 + 3001d5e: 00e78a63 beq a5,a4,3001d72 + break; + case ADC_SOCFINISH_INT3: + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + break; + default: + break; + 3001d62: a085 j 3001dc2 + switch (intVal) { + 3001d64: 4715 li a4,5 + 3001d66: 02e78a63 beq a5,a4,3001d9a + 3001d6a: 4719 li a4,6 + 3001d6c: 04e78163 beq a5,a4,3001dae + break; + 3001d70: a889 j 3001dc2 + DCL_ADC_SetSOCxBlindInt0(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 0 */ + 3001d72: fdc42783 lw a5,-36(s0) + 3001d76: 439c lw a5,0(a5) + 3001d78: fec42703 lw a4,-20(s0) + 3001d7c: 85ba mv a1,a4 + 3001d7e: 853e mv a0,a5 + 3001d80: da6ff0ef jal ra,3001326 + break; + 3001d84: a83d j 3001dc2 + DCL_ADC_SetSOCxBlindInt1(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 1 */ + 3001d86: fdc42783 lw a5,-36(s0) + 3001d8a: 439c lw a5,0(a5) + 3001d8c: fec42703 lw a4,-20(s0) + 3001d90: 85ba mv a1,a4 + 3001d92: 853e mv a0,a5 + 3001d94: e0eff0ef jal ra,30013a2 + break; + 3001d98: a02d j 3001dc2 + DCL_ADC_SetSOCxBlindInt2(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 2 */ + 3001d9a: fdc42783 lw a5,-36(s0) + 3001d9e: 439c lw a5,0(a5) + 3001da0: fec42703 lw a4,-20(s0) + 3001da4: 85ba mv a1,a4 + 3001da6: 853e mv a0,a5 + 3001da8: e78ff0ef jal ra,3001420 + break; + 3001dac: a819 j 3001dc2 + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + 3001dae: fdc42783 lw a5,-36(s0) + 3001db2: 439c lw a5,0(a5) + 3001db4: fec42703 lw a4,-20(s0) + 3001db8: 85ba mv a1,a4 + 3001dba: 853e mv a0,a5 + 3001dbc: ee0ff0ef jal ra,300149c + break; + 3001dc0: 0001 nop + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001dc2: fec42783 lw a5,-20(s0) + 3001dc6: 0785 addi a5,a5,1 + 3001dc8: fef42623 sw a5,-20(s0) + 3001dcc: fec42703 lw a4,-20(s0) + 3001dd0: 47bd li a5,15 + 3001dd2: f6e7d3e3 bge a5,a4,3001d38 + } + } /* Enable ADC Interrupt */ + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER0); + 3001dd6: fdc42783 lw a5,-36(s0) + 3001dda: 439c lw a5,0(a5) + 3001ddc: 4581 li a1,0 + 3001dde: 853e mv a0,a5 + 3001de0: f3aff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER1); + 3001de4: fdc42783 lw a5,-36(s0) + 3001de8: 439c lw a5,0(a5) + 3001dea: 4585 li a1,1 + 3001dec: 853e mv a0,a5 + 3001dee: f2cff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + 3001df2: fdc42783 lw a5,-36(s0) + 3001df6: 439c lw a5,0(a5) + 3001df8: 4589 li a1,2 + 3001dfa: 853e mv a0,a5 + 3001dfc: f1eff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER3); + 3001e00: fdc42783 lw a5,-36(s0) + 3001e04: 439c lw a5,0(a5) + 3001e06: 458d li a1,3 + 3001e08: 853e mv a0,a5 + 3001e0a: f10ff0ef jal ra,300151a + return BASE_STATUS_OK; + 3001e0e: 4781 li a5,0 +} + 3001e10: 853e mv a0,a5 + 3001e12: 50b2 lw ra,44(sp) + 3001e14: 5422 lw s0,40(sp) + 3001e16: 6145 addi sp,sp,48 + 3001e18: 8082 ret + +03001e1a : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_SoftTrigSample(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001e1a: 1101 addi sp,sp,-32 + 3001e1c: ce06 sw ra,28(sp) + 3001e1e: cc22 sw s0,24(sp) + 3001e20: 1000 addi s0,sp,32 + 3001e22: fea42623 sw a0,-20(s0) + 3001e26: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001e2a: fec42783 lw a5,-20(s0) + 3001e2e: eb89 bnez a5,3001e40 + 3001e30: 0e500593 li a1,229 + 3001e34: 030067b7 lui a5,0x3006 + 3001e38: 7d078513 addi a0,a5,2000 # 30067d0 + 3001e3c: 266d jal ra,30021e6 + 3001e3e: a001 j 3001e3e + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001e40: fec42783 lw a5,-20(s0) + 3001e44: 4398 lw a4,0(a5) + 3001e46: 180007b7 lui a5,0x18000 + 3001e4a: 00f70a63 beq a4,a5,3001e5e + 3001e4e: 0e600593 li a1,230 + 3001e52: 030067b7 lui a5,0x3006 + 3001e56: 7d078513 addi a0,a5,2000 # 30067d0 + 3001e5a: 2671 jal ra,30021e6 + 3001e5c: a001 j 3001e5c + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001e5e: fe842503 lw a0,-24(s0) + 3001e62: bc6ff0ef jal ra,3001228 + 3001e66: 87aa mv a5,a0 + 3001e68: 0017c793 xori a5,a5,1 + 3001e6c: 9f81 uxtb a5 + 3001e6e: cb91 beqz a5,3001e82 + 3001e70: 0e700593 li a1,231 + 3001e74: 030067b7 lui a5,0x3006 + 3001e78: 7d078513 addi a0,a5,2000 # 30067d0 + 3001e7c: 26ad jal ra,30021e6 + 3001e7e: 4785 li a5,1 + 3001e80: a809 j 3001e92 + DCL_ADC_SOCxSoftTrigger(adcHandle->baseAddress, soc); /* Software triggers a single SOC */ + 3001e82: fec42783 lw a5,-20(s0) + 3001e86: 439c lw a5,0(a5) + 3001e88: fe842583 lw a1,-24(s0) + 3001e8c: 853e mv a0,a5 + 3001e8e: 324d jal ra,3001830 + return BASE_STATUS_OK; + 3001e90: 4781 li a5,0 +} + 3001e92: 853e mv a0,a5 + 3001e94: 40f2 lw ra,28(sp) + 3001e96: 4462 lw s0,24(sp) + 3001e98: 6105 addi sp,sp,32 + 3001e9a: 8082 ret + +03001e9c : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval unsigned int value of ADC convert result. + */ +unsigned int HAL_ADC_GetConvResult(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001e9c: 1101 addi sp,sp,-32 + 3001e9e: ce06 sw ra,28(sp) + 3001ea0: cc22 sw s0,24(sp) + 3001ea2: 1000 addi s0,sp,32 + 3001ea4: fea42623 sw a0,-20(s0) + 3001ea8: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001eac: fec42783 lw a5,-20(s0) + 3001eb0: eb89 bnez a5,3001ec2 + 3001eb2: 0f400593 li a1,244 + 3001eb6: 030067b7 lui a5,0x3006 + 3001eba: 7d078513 addi a0,a5,2000 # 30067d0 + 3001ebe: 2625 jal ra,30021e6 + 3001ec0: a001 j 3001ec0 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001ec2: fec42783 lw a5,-20(s0) + 3001ec6: 4398 lw a4,0(a5) + 3001ec8: 180007b7 lui a5,0x18000 + 3001ecc: 00f70a63 beq a4,a5,3001ee0 + 3001ed0: 0f500593 li a1,245 + 3001ed4: 030067b7 lui a5,0x3006 + 3001ed8: 7d078513 addi a0,a5,2000 # 30067d0 + 3001edc: 2629 jal ra,30021e6 + 3001ede: a001 j 3001ede + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001ee0: fe842503 lw a0,-24(s0) + 3001ee4: b44ff0ef jal ra,3001228 + 3001ee8: 87aa mv a5,a0 + 3001eea: 0017c793 xori a5,a5,1 + 3001eee: 9f81 uxtb a5 + 3001ef0: cb91 beqz a5,3001f04 + 3001ef2: 0f600593 li a1,246 + 3001ef6: 030067b7 lui a5,0x3006 + 3001efa: 7d078513 addi a0,a5,2000 # 30067d0 + 3001efe: 24e5 jal ra,30021e6 + 3001f00: 4785 li a5,1 + 3001f02: a809 j 3001f14 + return DCL_ADC_ReadSOCxResult(adcHandle->baseAddress, soc); + 3001f04: fec42783 lw a5,-20(s0) + 3001f08: 439c lw a5,0(a5) + 3001f0a: fe842583 lw a1,-24(s0) + 3001f0e: 853e mv a0,a5 + 3001f10: 3ae5 jal ra,3001908 + 3001f12: 87aa mv a5,a0 +} + 3001f14: 853e mv a0,a5 + 3001f16: 40f2 lw ra,28(sp) + 3001f18: 4462 lw s0,24(sp) + 3001f1a: 6105 addi sp,sp,32 + 3001f1c: 8082 ret + +03001f1e : + * @param adcHandle ADC handle. + * @param intx ADC interrupt type number @ref ADC_IntNumber. + * @retval None. + */ +static void ADC_IntxClearEoc(ADC_Handle *adcHandle, unsigned int intx) +{ + 3001f1e: 7139 addi sp,sp,-64 + 3001f20: de22 sw s0,60(sp) + 3001f22: 0080 addi s0,sp,64 + 3001f24: fca42623 sw a0,-52(s0) + 3001f28: fcb42423 sw a1,-56(s0) + unsigned int eocFlag = adcHandle->baseAddress->ADC_EOC_FLAG.reg; + 3001f2c: fcc42783 lw a5,-52(s0) + 3001f30: 439c lw a5,0(a5) + 3001f32: 5bbc lw a5,112(a5) + 3001f34: fef42223 sw a5,-28(s0) + ADC_INT_DATA_0_REG intData0; + ADC_INT_DATA_1_REG intData1; + unsigned int eocMask = 0; + 3001f38: fe042623 sw zero,-20(s0) + switch (intx) { + 3001f3c: fc842783 lw a5,-56(s0) + 3001f40: 4705 li a4,1 + 3001f42: 02e78963 beq a5,a4,3001f74 + 3001f46: 4705 li a4,1 + 3001f48: 00e7e963 bltu a5,a4,3001f5a + 3001f4c: 4709 li a4,2 + 3001f4e: 04e78163 beq a5,a4,3001f90 + 3001f52: 470d li a4,3 + 3001f54: 04e78b63 beq a5,a4,3001faa + case ADC_INT_NUMBER3: /* Read Interrupt Configuration */ + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + eocMask = intData1.BIT.cfg_intr_data_sel3; + break; + default: + break; + 3001f58: a0bd j 3001fc6 + intData0.reg = adcHandle->baseAddress->ADC_INT_DATA_0.reg; + 3001f5a: fcc42783 lw a5,-52(s0) + 3001f5e: 439c lw a5,0(a5) + 3001f60: 2b07a783 lw a5,688(a5) + 3001f64: fcf42c23 sw a5,-40(s0) + eocMask = intData0.BIT.cfg_intr_data_sel0; + 3001f68: fd842783 lw a5,-40(s0) + 3001f6c: 9fa1 uxth a5 + 3001f6e: fef42623 sw a5,-20(s0) + break; + 3001f72: a891 j 3001fc6 + intData0.reg = adcHandle->baseAddress->ADC_INT_DATA_0.reg; + 3001f74: fcc42783 lw a5,-52(s0) + 3001f78: 439c lw a5,0(a5) + 3001f7a: 2b07a783 lw a5,688(a5) + 3001f7e: fcf42c23 sw a5,-40(s0) + eocMask = intData0.BIT.cfg_intr_data_sel1; + 3001f82: fd842783 lw a5,-40(s0) + 3001f86: 83c1 srli a5,a5,0x10 + 3001f88: 9fa1 uxth a5 + 3001f8a: fef42623 sw a5,-20(s0) + break; + 3001f8e: a825 j 3001fc6 + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + 3001f90: fcc42783 lw a5,-52(s0) + 3001f94: 439c lw a5,0(a5) + 3001f96: 2b47a783 lw a5,692(a5) + 3001f9a: fcf42a23 sw a5,-44(s0) + eocMask = intData1.BIT.cfg_intr_data_sel2; + 3001f9e: fd442783 lw a5,-44(s0) + 3001fa2: 9fa1 uxth a5 + 3001fa4: fef42623 sw a5,-20(s0) + break; + 3001fa8: a839 j 3001fc6 + intData1.reg = adcHandle->baseAddress->ADC_INT_DATA_1.reg; + 3001faa: fcc42783 lw a5,-52(s0) + 3001fae: 439c lw a5,0(a5) + 3001fb0: 2b47a783 lw a5,692(a5) + 3001fb4: fcf42a23 sw a5,-44(s0) + eocMask = intData1.BIT.cfg_intr_data_sel3; + 3001fb8: fd442783 lw a5,-44(s0) + 3001fbc: 83c1 srli a5,a5,0x10 + 3001fbe: 9fa1 uxth a5 + 3001fc0: fef42623 sw a5,-20(s0) + break; + 3001fc4: 0001 nop + } + unsigned int eoc = eocFlag & eocMask; + 3001fc6: fe442703 lw a4,-28(s0) + 3001fca: fec42783 lw a5,-20(s0) + 3001fce: 8ff9 and a5,a5,a4 + 3001fd0: fef42023 sw a5,-32(s0) + adcHandle->ADC_IntxParam[intx].socxFinish = eoc; + 3001fd4: fe042783 lw a5,-32(s0) + 3001fd8: 01079713 slli a4,a5,0x10 + 3001fdc: 8341 srli a4,a4,0x10 + 3001fde: fcc42683 lw a3,-52(s0) + 3001fe2: fc842783 lw a5,-56(s0) + 3001fe6: 07e1 addi a5,a5,24 + 3001fe8: 0786 slli a5,a5,0x1 + 3001fea: 97b6 add a5,a5,a3 + 3001fec: a3da sh a4,4(a5) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001fee: fe042423 sw zero,-24(s0) + 3001ff2: a80d j 3002024 + unsigned int val = (1 << i); + 3001ff4: 4705 li a4,1 + 3001ff6: fe842783 lw a5,-24(s0) + 3001ffa: 00f717b3 sll a5,a4,a5 + 3001ffe: fcf42e23 sw a5,-36(s0) + if (eoc & val) { + 3002002: fe042703 lw a4,-32(s0) + 3002006: fdc42783 lw a5,-36(s0) + 300200a: 8ff9 and a5,a5,a4 + 300200c: c799 beqz a5,300201a + adcHandle->baseAddress->ADC_EOC_FLAG.reg = val; /* Clear the EOC flag */ + 300200e: fcc42783 lw a5,-52(s0) + 3002012: 439c lw a5,0(a5) + 3002014: fdc42703 lw a4,-36(s0) + 3002018: dbb8 sw a4,112(a5) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 300201a: fe842783 lw a5,-24(s0) + 300201e: 0785 addi a5,a5,1 + 3002020: fef42423 sw a5,-24(s0) + 3002024: fe842703 lw a4,-24(s0) + 3002028: 47bd li a5,15 + 300202a: fce7d5e3 bge a5,a4,3001ff4 + } + } +} + 300202e: 0001 nop + 3002030: 5472 lw s0,60(sp) + 3002032: 6121 addi sp,sp,64 + 3002034: 8082 ret + +03002036 : + * @brief ADC Interrupt2 service processing function. + * @param handle ADC handle. + * @retval None. + */ +void HAL_ADC_IrqHandlerInt2(void *handle) +{ + 3002036: 7179 addi sp,sp,-48 + 3002038: d606 sw ra,44(sp) + 300203a: d422 sw s0,40(sp) + 300203c: 1800 addi s0,sp,48 + 300203e: fca42e23 sw a0,-36(s0) + ADC_ASSERT_PARAM(handle != NULL); + 3002042: fdc42783 lw a5,-36(s0) + 3002046: eb89 bnez a5,3002058 + 3002048: 17900593 li a1,377 + 300204c: 030067b7 lui a5,0x3006 + 3002050: 7d078513 addi a0,a5,2000 # 30067d0 + 3002054: 2a49 jal ra,30021e6 + 3002056: a001 j 3002056 + ADC_Handle *adcHandle = (ADC_Handle *)handle; + 3002058: fdc42783 lw a5,-36(s0) + 300205c: fef42623 sw a5,-20(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3002060: fec42783 lw a5,-20(s0) + 3002064: 4398 lw a4,0(a5) + 3002066: 180007b7 lui a5,0x18000 + 300206a: 00f70a63 beq a4,a5,300207e + 300206e: 17b00593 li a1,379 + 3002072: 030067b7 lui a5,0x3006 + 3002076: 7d078513 addi a0,a5,2000 # 30067d0 + 300207a: 22b5 jal ra,30021e6 + 300207c: a001 j 300207c + ADC_IntxClearEoc(adcHandle, ADC_INT_NUMBER2); /* Clear conversion completion flag */ + 300207e: 4589 li a1,2 + 3002080: fec42503 lw a0,-20(s0) + 3002084: 3d69 jal ra,3001f1e + DCL_ADC_ClearIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + 3002086: fec42783 lw a5,-20(s0) + 300208a: 439c lw a5,0(a5) + 300208c: 4589 li a1,2 + 300208e: 853e mv a0,a5 + 3002090: cfeff0ef jal ra,300158e + if (adcHandle->userCallBack.Int2FinishCallBack != NULL) { + 3002094: fec42783 lw a5,-20(s0) + 3002098: 43fc lw a5,68(a5) + 300209a: c799 beqz a5,30020a8 + adcHandle->userCallBack.Int2FinishCallBack(handle); + 300209c: fec42783 lw a5,-20(s0) + 30020a0: 43fc lw a5,68(a5) + 30020a2: fdc42503 lw a0,-36(s0) + 30020a6: 9782 jalr a5 + } +} + 30020a8: 0001 nop + 30020aa: 50b2 lw ra,44(sp) + 30020ac: 5422 lw s0,40(sp) + 30020ae: 6145 addi sp,sp,48 + 30020b0: 8082 ret + +030020b2 : + * @param typeID Id of callback function type. + * @param pCallback Pointer of the specified callbcak function. + * @retval None. + */ +static void ADC_RegieterEventCallBack(ADC_Handle *adcHandle, ADC_CallbackFunType typeID, ADC_CallbackType pCallback) +{ + 30020b2: 7179 addi sp,sp,-48 + 30020b4: d622 sw s0,44(sp) + 30020b6: 1800 addi s0,sp,48 + 30020b8: fca42e23 sw a0,-36(s0) + 30020bc: fcb42c23 sw a1,-40(s0) + 30020c0: fcc42a23 sw a2,-44(s0) + if (typeID > ADC_CALLBACK_EVENT_PPB3_ERROR || typeID < ADC_CALLBACK_EVENT_PPB0_ZERO) { + 30020c4: fd842703 lw a4,-40(s0) + 30020c8: 47fd li a5,31 + 30020ca: 02e7e763 bltu a5,a4,30020f8 + 30020ce: fd842703 lw a4,-40(s0) + 30020d2: 47bd li a5,15 + 30020d4: 02e7f263 bgeu a5,a4,30020f8 + return; + } + unsigned int index = ((unsigned int)typeID & 0xF); + 30020d8: fd842783 lw a5,-40(s0) + 30020dc: 8bbd andi a5,a5,15 + 30020de: fef42623 sw a5,-20(s0) + adcHandle->userCallBack.PPBEventCallBack[index] = pCallback; + 30020e2: fdc42703 lw a4,-36(s0) + 30020e6: fec42783 lw a5,-20(s0) + 30020ea: 07d1 addi a5,a5,20 + 30020ec: 078a slli a5,a5,0x2 + 30020ee: 97ba add a5,a5,a4 + 30020f0: fd442703 lw a4,-44(s0) + 30020f4: cb98 sw a4,16(a5) + 30020f6: a011 j 30020fa + return; + 30020f8: 0001 nop +} + 30020fa: 5432 lw s0,44(sp) + 30020fc: 6145 addi sp,sp,48 + 30020fe: 8082 ret + +03002100 : + * @param typeID Id of callback function type. + * @param pCallback Pointer of the specified callbcak function. + * @retval None. + */ +void HAL_ADC_RegisterCallBack(ADC_Handle *adcHandle, ADC_CallbackFunType typeID, ADC_CallbackType pCallback) +{ + 3002100: 1101 addi sp,sp,-32 + 3002102: ce06 sw ra,28(sp) + 3002104: cc22 sw s0,24(sp) + 3002106: 1000 addi s0,sp,32 + 3002108: fea42623 sw a0,-20(s0) + 300210c: feb42423 sw a1,-24(s0) + 3002110: fec42223 sw a2,-28(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3002114: fec42783 lw a5,-20(s0) + 3002118: eb89 bnez a5,300212a + 300211a: 1d900593 li a1,473 + 300211e: 030067b7 lui a5,0x3006 + 3002122: 7d078513 addi a0,a5,2000 # 30067d0 + 3002126: 20c1 jal ra,30021e6 + 3002128: a001 j 3002128 + ADC_ASSERT_PARAM(pCallback != NULL); + 300212a: fe442783 lw a5,-28(s0) + 300212e: eb89 bnez a5,3002140 + 3002130: 1da00593 li a1,474 + 3002134: 030067b7 lui a5,0x3006 + 3002138: 7d078513 addi a0,a5,2000 # 30067d0 + 300213c: 206d jal ra,30021e6 + 300213e: a001 j 300213e + switch (typeID) { /* Register the callback function based on the interrupt type */ + 3002140: fe842703 lw a4,-24(s0) + 3002144: 47a1 li a5,8 + 3002146: 08e7e363 bltu a5,a4,30021cc + 300214a: fe842783 lw a5,-24(s0) + 300214e: 00279713 slli a4,a5,0x2 + 3002152: 030077b7 lui a5,0x3007 + 3002156: 80478793 addi a5,a5,-2044 # 3006804 + 300215a: 97ba add a5,a5,a4 + 300215c: 439c lw a5,0(a5) + 300215e: 8782 jr a5 + case ADC_CALLBACK_INT0: + adcHandle->userCallBack.Int0FinishCallBack = pCallback; /* Sampling finsish interrupt 0 callback function */ + 3002160: fec42783 lw a5,-20(s0) + 3002164: fe442703 lw a4,-28(s0) + 3002168: dfd8 sw a4,60(a5) + break; + 300216a: a88d j 30021dc + case ADC_CALLBACK_INT1: + adcHandle->userCallBack.Int1FinishCallBack = pCallback; /* Sampling finsish interrupt 1 callback function */ + 300216c: fec42783 lw a5,-20(s0) + 3002170: fe442703 lw a4,-28(s0) + 3002174: c3b8 sw a4,64(a5) + break; + 3002176: a09d j 30021dc + case ADC_CALLBACK_INT2: + adcHandle->userCallBack.Int2FinishCallBack = pCallback; /* Sampling finsish interrupt 2 callback function */ + 3002178: fec42783 lw a5,-20(s0) + 300217c: fe442703 lw a4,-28(s0) + 3002180: c3f8 sw a4,68(a5) + break; + 3002182: a8a9 j 30021dc + case ADC_CALLBACK_INT3: + adcHandle->userCallBack.Int3FinishCallBack = pCallback; /* Sampling finsish interrupt 3 callback function */ + 3002184: fec42783 lw a5,-20(s0) + 3002188: fe442703 lw a4,-28(s0) + 300218c: c7b8 sw a4,72(a5) + break; + 300218e: a0b9 j 30021dc + case ADC_CALLBACK_DMA: + adcHandle->userCallBack.DmaFinishCallBack = pCallback; /* Dma transfer finish callback function */ + 3002190: fec42783 lw a5,-20(s0) + 3002194: fe442703 lw a4,-28(s0) + 3002198: c7f8 sw a4,76(a5) + break; + 300219a: a089 j 30021dc + case ADC_CALLBACK_DMAERROR: + adcHandle->userCallBack.DmaErrorCallBack = pCallback; /* Dma transfer error callback function */ + 300219c: fec42783 lw a5,-20(s0) + 30021a0: fe442703 lw a4,-28(s0) + 30021a4: cbf8 sw a4,84(a5) + break; + 30021a6: a81d j 30021dc + case ADC_CALLBACK_DMAOVER: + adcHandle->userCallBack.DmaOverCallBack = pCallback; /* Dma request over callback function */ + 30021a8: fec42783 lw a5,-20(s0) + 30021ac: fe442703 lw a4,-28(s0) + 30021b0: cfb8 sw a4,88(a5) + break; + 30021b2: a02d j 30021dc + case ADC_CALLBACK_TRIGOVER: + adcHandle->userCallBack.TrigOverCallBack = pCallback; /* trigger over callback function */ + 30021b4: fec42783 lw a5,-20(s0) + 30021b8: fe442703 lw a4,-28(s0) + 30021bc: cff8 sw a4,92(a5) + break; + 30021be: a839 j 30021dc + case ADC_CALLBACK_EVENT_OVERSAMPLING: /* Oversampling callback function */ + adcHandle->userCallBack.OverSamplingFinishCallBack = pCallback; + 30021c0: fec42783 lw a5,-20(s0) + 30021c4: fe442703 lw a4,-28(s0) + 30021c8: cbb8 sw a4,80(a5) + break; + 30021ca: a809 j 30021dc + default: + ADC_RegieterEventCallBack(adcHandle, typeID, pCallback); /* PPB Function Callback Function */ + 30021cc: fe442603 lw a2,-28(s0) + 30021d0: fe842583 lw a1,-24(s0) + 30021d4: fec42503 lw a0,-20(s0) + 30021d8: 3de9 jal ra,30020b2 + break; + 30021da: 0001 nop + } +} + 30021dc: 0001 nop + 30021de: 40f2 lw ra,28(sp) + 30021e0: 4462 lw s0,24(sp) + 30021e2: 6105 addi sp,sp,32 + 30021e4: 8082 ret + +030021e6 : + * @param file Pointer to the name of the file where the error occurs. + * @param line Number of the line where the error occurs. + * @retval None. + */ +__weak void AssertErrorLog(char *file, unsigned int line) +{ + 30021e6: 1101 addi sp,sp,-32 + 30021e8: ce22 sw s0,28(sp) + 30021ea: 1000 addi s0,sp,32 + 30021ec: fea42623 sw a0,-20(s0) + 30021f0: feb42423 sw a1,-24(s0) + /* Use only if the user apllication is not defined. */ + BASE_FUNC_UNUSED(file); + BASE_FUNC_UNUSED(line); + 30021f4: 0001 nop + 30021f6: 4472 lw s0,28(sp) + 30021f8: 6105 addi sp,sp,32 + 30021fa: 8082 ret + +030021fc : + * @brief Get the systick + * @param None + * @retval The SysTick Value + */ +static inline unsigned int DCL_SYSTICK_GetTick(void) +{ + 30021fc: 1141 addi sp,sp,-16 + 30021fe: c622 sw s0,12(sp) + 3002200: 0800 addi s0,sp,16 + return SYSTICK->MTIME; /* Systick value(Lower 32bit register) */ + 3002202: 143807b7 lui a5,0x14380 + 3002206: 479c lw a5,8(a5) +} + 3002208: 853e mv a0,a5 + 300220a: 4432 lw s0,12(sp) + 300220c: 0141 addi sp,sp,16 + 300220e: 8082 ret + +03002210 : + * @brief Delay number of us. + * @param us The number of us to delay. + * @retval None. + */ +void BASE_FUNC_DelayUs(unsigned int us) +{ + 3002210: 7179 addi sp,sp,-48 + 3002212: d606 sw ra,44(sp) + 3002214: d422 sw s0,40(sp) + 3002216: 1800 addi s0,sp,48 + 3002218: fca42e23 sw a0,-36(s0) + unsigned int preTick = DCL_SYSTICK_GetTick(); + 300221c: 37c5 jal ra,30021fc + 300221e: fea42623 sw a0,-20(s0) + unsigned int tickInUs = (SYSTICK_GetCRGHZ() / CRG_FREQ_1MHz) * us; + 3002222: d85fe0ef jal ra,3000fa6 + 3002226: 872a mv a4,a0 + 3002228: 000f47b7 lui a5,0xf4 + 300222c: 24078793 addi a5,a5,576 # f4240 + 3002230: 02f757b3 divu a5,a4,a5 + 3002234: fdc42703 lw a4,-36(s0) + 3002238: 02f707b3 mul a5,a4,a5 + 300223c: fef42423 sw a5,-24(s0) + unsigned int curTick; + unsigned int delta; + + /* Wait until the delta is greater than tickInUs */ + do { + curTick = DCL_SYSTICK_GetTick(); + 3002240: 3f75 jal ra,30021fc + 3002242: fea42223 sw a0,-28(s0) + delta = (curTick >= preTick) ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick + 1; + 3002246: fe442703 lw a4,-28(s0) + 300224a: fec42783 lw a5,-20(s0) + 300224e: 40f707b3 sub a5,a4,a5 + 3002252: fef42023 sw a5,-32(s0) + } while (delta < tickInUs); + 3002256: fe042703 lw a4,-32(s0) + 300225a: fe842783 lw a5,-24(s0) + 300225e: fef761e3 bltu a4,a5,3002240 +} + 3002262: 0001 nop + 3002264: 50b2 lw ra,44(sp) + 3002266: 5422 lw s0,40(sp) + 3002268: 6145 addi sp,sp,48 + 300226a: 8082 ret + +0300226c : + * @brief Delay number of ms. + * @param ms The number of ms to delay. + * @retval None. + */ +void BASE_FUNC_DelayMs(unsigned int ms) +{ + 300226c: 7179 addi sp,sp,-48 + 300226e: d606 sw ra,44(sp) + 3002270: d422 sw s0,40(sp) + 3002272: 1800 addi s0,sp,48 + 3002274: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < ms; ++i) { + 3002278: fe042623 sw zero,-20(s0) + 300227c: a809 j 300228e + BASE_FUNC_DelayUs(BASE_DEFINE_DELAY_US_IN_MS); + 300227e: 3e800513 li a0,1000 + 3002282: 3779 jal ra,3002210 + for (unsigned int i = 0; i < ms; ++i) { + 3002284: fec42783 lw a5,-20(s0) + 3002288: 0785 addi a5,a5,1 + 300228a: fef42623 sw a5,-20(s0) + 300228e: fec42703 lw a4,-20(s0) + 3002292: fdc42783 lw a5,-36(s0) + 3002296: fef764e3 bltu a4,a5,300227e + } +} + 300229a: 0001 nop + 300229c: 50b2 lw ra,44(sp) + 300229e: 5422 lw s0,40(sp) + 30022a0: 6145 addi sp,sp,48 + 30022a2: 8082 ret + +030022a4 : + * @brief Delay number of seconds. + * @param seconds The number of seconds to delay. + * @retval None. + */ +void BASE_FUNC_DelaySeconds(unsigned int seconds) +{ + 30022a4: 7179 addi sp,sp,-48 + 30022a6: d606 sw ra,44(sp) + 30022a8: d422 sw s0,40(sp) + 30022aa: 1800 addi s0,sp,48 + 30022ac: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < seconds; ++i) { + 30022b0: fe042623 sw zero,-20(s0) + 30022b4: a809 j 30022c6 + BASE_FUNC_DelayMs(BASE_DEFINE_DELAY_MS_IN_SEC); + 30022b6: 3e800513 li a0,1000 + 30022ba: 3f4d jal ra,300226c + for (unsigned int i = 0; i < seconds; ++i) { + 30022bc: fec42783 lw a5,-20(s0) + 30022c0: 0785 addi a5,a5,1 + 30022c2: fef42623 sw a5,-20(s0) + 30022c6: fec42703 lw a4,-20(s0) + 30022ca: fdc42783 lw a5,-36(s0) + 30022ce: fef764e3 bltu a4,a5,30022b6 + } +} + 30022d2: 0001 nop + 30022d4: 50b2 lw ra,44(sp) + 30022d6: 5422 lw s0,40(sp) + 30022d8: 6145 addi sp,sp,48 + 30022da: 8082 ret + +030022dc : + * @param delay The number of 'units' to delay. + * @param units Specifies the delay unit. + * @retval None. + */ +void BASE_FUNC_Delay(unsigned int delay, BASE_DelayUnit units) +{ + 30022dc: 1101 addi sp,sp,-32 + 30022de: ce06 sw ra,28(sp) + 30022e0: cc22 sw s0,24(sp) + 30022e2: 1000 addi s0,sp,32 + 30022e4: fea42623 sw a0,-20(s0) + 30022e8: feb42423 sw a1,-24(s0) + switch (units) { + 30022ec: fe842783 lw a5,-24(s0) + 30022f0: 3e800713 li a4,1000 + 30022f4: 02e78063 beq a5,a4,3002314 + 30022f8: 000f4737 lui a4,0xf4 + 30022fc: 24070713 addi a4,a4,576 # f4240 + 3002300: 00e78e63 beq a5,a4,300231c + 3002304: 4705 li a4,1 + 3002306: 00e78363 beq a5,a4,300230c + break; + case BASE_DEFINE_DELAY_MICROSECS: + BASE_FUNC_DelayUs(delay); + break; + default: + break; + 300230a: a829 j 3002324 + BASE_FUNC_DelaySeconds(delay); + 300230c: fec42503 lw a0,-20(s0) + 3002310: 3f51 jal ra,30022a4 + break; + 3002312: a809 j 3002324 + BASE_FUNC_DelayMs(delay); + 3002314: fec42503 lw a0,-20(s0) + 3002318: 3f91 jal ra,300226c + break; + 300231a: a029 j 3002324 + BASE_FUNC_DelayUs(delay); + 300231c: fec42503 lw a0,-20(s0) + 3002320: 3dc5 jal ra,3002210 + break; + 3002322: 0001 nop + } + return; + 3002324: 0001 nop + 3002326: 40f2 lw ra,28(sp) + 3002328: 4462 lw s0,24(sp) + 300232a: 6105 addi sp,sp,32 + 300232c: 8082 ret + +0300232e : + * @brief Clear external interrupt + * @param irqNum external interrupt number + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_NOT_CREATED + */ +static inline void IRQ_ClearN(unsigned int irqNum) +{ + 300232e: 1101 addi sp,sp,-32 + 3002330: ce22 sw s0,28(sp) + 3002332: 1000 addi s0,sp,32 + 3002334: fea42623 sw a0,-20(s0) + asm volatile("fence"); + 3002338: 0ff0000f fence + WRITE_CUSTOM_CSR_VAL(LOCIPCLR, irqNum); + 300233c: fec42783 lw a5,-20(s0) + 3002340: 82be mv t0,a5 + 3002342: bf029073 csrw 0xbf0,t0 +} + 3002346: 0001 nop + 3002348: 4472 lw s0,28(sp) + 300234a: 6105 addi sp,sp,32 + 300234c: 8082 ret + +0300234e : + * @brief Exception/Interrupt Handler Entry. + * @param irqNum external interrupt number. + * @retval None + */ +void InterruptEntry(unsigned int irqNum) +{ + 300234e: 1101 addi sp,sp,-32 + 3002350: ce06 sw ra,28(sp) + 3002352: cc22 sw s0,24(sp) + 3002354: 1000 addi s0,sp,32 + 3002356: fea42623 sw a0,-20(s0) + g_irqCallbackFunc[irqNum].pfnHandler(g_irqCallbackFunc[irqNum].param); + 300235a: 040007b7 lui a5,0x4000 + 300235e: 0fc78713 addi a4,a5,252 # 40000fc + 3002362: fec42783 lw a5,-20(s0) + 3002366: 078e slli a5,a5,0x3 + 3002368: 97ba add a5,a5,a4 + 300236a: 4394 lw a3,0(a5) + 300236c: 040007b7 lui a5,0x4000 + 3002370: 0fc78713 addi a4,a5,252 # 40000fc + 3002374: fec42783 lw a5,-20(s0) + 3002378: 078e slli a5,a5,0x3 + 300237a: 97ba add a5,a5,a4 + 300237c: 43dc lw a5,4(a5) + 300237e: 853e mv a0,a5 + 3002380: 9682 jalr a3 + IRQ_ClearN(irqNum); + 3002382: fec42503 lw a0,-20(s0) + 3002386: 3765 jal ra,300232e +} + 3002388: 0001 nop + 300238a: 40f2 lw ra,28(sp) + 300238c: 4462 lw s0,24(sp) + 300238e: 6105 addi sp,sp,32 + 3002390: 8082 ret + +03002392 : + * @brief Irq initialization. + * @param none. + * @retval None + */ +void IRQ_Init(void) +{ + 3002392: 1101 addi sp,sp,-32 + 3002394: ce22 sw s0,28(sp) + 3002396: 1000 addi s0,sp,32 + unsigned int index; + + for (index = 0; index < IRQ_MAX; index++) { + 3002398: fe042623 sw zero,-20(s0) + 300239c: a82d j 30023d6 + g_irqCallbackFunc[index].pfnHandler = IRQ_DummyHandler; + 300239e: 040007b7 lui a5,0x4000 + 30023a2: 0fc78713 addi a4,a5,252 # 40000fc + 30023a6: fec42783 lw a5,-20(s0) + 30023aa: 078e slli a5,a5,0x3 + 30023ac: 97ba add a5,a5,a4 + 30023ae: 03003737 lui a4,0x3003 + 30023b2: c3270713 addi a4,a4,-974 # 3002c32 + 30023b6: c398 sw a4,0(a5) + g_irqCallbackFunc[index].param = NULL; + 30023b8: 040007b7 lui a5,0x4000 + 30023bc: 0fc78713 addi a4,a5,252 # 40000fc + 30023c0: fec42783 lw a5,-20(s0) + 30023c4: 078e slli a5,a5,0x3 + 30023c6: 97ba add a5,a5,a4 + 30023c8: 0007a223 sw zero,4(a5) + for (index = 0; index < IRQ_MAX; index++) { + 30023cc: fec42783 lw a5,-20(s0) + 30023d0: 0785 addi a5,a5,1 + 30023d2: fef42623 sw a5,-20(s0) + 30023d6: fec42703 lw a4,-20(s0) + 30023da: 07200793 li a5,114 + 30023de: fce7f0e3 bgeu a5,a4,300239e + } +} + 30023e2: 0001 nop + 30023e4: 4472 lw s0,28(sp) + 30023e6: 6105 addi sp,sp,32 + 30023e8: 8082 ret + +030023ea : + * @note In the corresponding interrupt handler, manually clear the interrupt source and the corresponding interrupt + * flag bit (call the IRQ_ClearN function to clear the interrupt), otherwise the interrupt will always be + * triggered. + */ +unsigned int IRQ_Register(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 30023ea: 1101 addi sp,sp,-32 + 30023ec: ce06 sw ra,28(sp) + 30023ee: cc22 sw s0,24(sp) + 30023f0: 1000 addi s0,sp,32 + 30023f2: fea42623 sw a0,-20(s0) + 30023f6: feb42423 sw a1,-24(s0) + 30023fa: fec42223 sw a2,-28(s0) + INTERRUPT_ASSERT_PARAM(func != NULL); + 30023fe: fe842783 lw a5,-24(s0) + 3002402: eb89 bnez a5,3002414 + 3002404: 06300593 li a1,99 + 3002408: 030077b7 lui a5,0x3007 + 300240c: 82878513 addi a0,a5,-2008 # 3006828 + 3002410: 3bd9 jal ra,30021e6 + 3002412: a001 j 3002412 + INTERRUPT_PARAM_CHECK_WITH_RET(irqNum < IRQ_MAX, IRQ_ERRNO_NUM_INVALID); + 3002414: fec42703 lw a4,-20(s0) + 3002418: 07200793 li a5,114 + 300241c: 00e7fb63 bgeu a5,a4,3002432 + 3002420: 06400593 li a1,100 + 3002424: 030077b7 lui a5,0x3007 + 3002428: 82878513 addi a0,a5,-2008 # 3006828 + 300242c: 3b6d jal ra,30021e6 + 300242e: 4789 li a5,2 + 3002430: a81d j 3002466 + + if (g_irqCallbackFunc[irqNum].pfnHandler != IRQ_DummyHandler) { + 3002432: 040007b7 lui a5,0x4000 + 3002436: 0fc78713 addi a4,a5,252 # 40000fc + 300243a: fec42783 lw a5,-20(s0) + 300243e: 078e slli a5,a5,0x3 + 3002440: 97ba add a5,a5,a4 + 3002442: 4398 lw a4,0(a5) + 3002444: 030037b7 lui a5,0x3003 + 3002448: c3278793 addi a5,a5,-974 # 3002c32 + 300244c: 00f70463 beq a4,a5,3002454 + return IRQ_ERRNO_ALREADY_CREATED; + 3002450: 478d li a5,3 + 3002452: a811 j 3002466 + } + IRQ_SetCallBack(irqNum, func, arg); + 3002454: fe442603 lw a2,-28(s0) + 3002458: fe842583 lw a1,-24(s0) + 300245c: fec42503 lw a0,-20(s0) + 3002460: 7e4000ef jal ra,3002c44 + return BASE_STATUS_OK; + 3002464: 4781 li a5,0 +} + 3002466: 853e mv a0,a5 + 3002468: 40f2 lw ra,28(sp) + 300246a: 4462 lw s0,24(sp) + 300246c: 6105 addi sp,sp,32 + 300246e: 8082 ret + +03002470 : + * @brief Enable the specified interrupt. + * @param irqNum External interrupt number. + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID. + */ +unsigned int IRQ_EnableN(unsigned int irqNum) +{ + 3002470: 7139 addi sp,sp,-64 + 3002472: de06 sw ra,60(sp) + 3002474: dc22 sw s0,56(sp) + 3002476: 0080 addi s0,sp,64 + 3002478: fca42623 sw a0,-52(s0) + unsigned int locienVal; +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 300247c: fcc42703 lw a4,-52(s0) + 3002480: 47e5 li a5,25 + 3002482: 00e7f863 bgeu a5,a4,3002492 + 3002486: fcc42703 lw a4,-52(s0) + 300248a: 07200793 li a5,114 + 300248e: 00e7fb63 bgeu a5,a4,30024a4 + 3002492: 0c300593 li a1,195 + 3002496: 030077b7 lui a5,0x3007 + 300249a: 82878513 addi a0,a5,-2008 # 3006828 + 300249e: 33a1 jal ra,30021e6 + 30024a0: 4789 li a5,2 + 30024a2: a8cd j 3002594 + /* The interrupt enable bits that can be controlled in the mie register (32 bits), up to 32 + can be controlled, and each bit corresponds to an interrupt enable */ + + RISCV_PRIV_MODE_SWITCH(priv); + + if (irqNum < IRQ_MIE_TOTAL_CNT) { + 30024a4: fcc42703 lw a4,-52(s0) + 30024a8: 47fd li a5,31 + 30024aa: 02e7e063 bltu a5,a4,30024ca + irqOrder = 1U << irqNum; + 30024ae: 4705 li a4,1 + 30024b0: fcc42783 lw a5,-52(s0) + 30024b4: 00f717b3 sll a5,a4,a5 + 30024b8: fef42623 sw a5,-20(s0) + SET_CSR(mie, irqOrder); + 30024bc: fec42783 lw a5,-20(s0) + 30024c0: 3047a7f3 csrrs a5,mie,a5 + 30024c4: fcf42c23 sw a5,-40(s0) + 30024c8: a0e9 j 3002592 + } else if (irqNum < IRQ_LOCIEN1_OFFSET) { + 30024ca: fcc42703 lw a4,-52(s0) + 30024ce: 03f00793 li a5,63 + 30024d2: 02e7ef63 bltu a5,a4,3002510 + irqOrder = irqNum - IRQ_MIE_TOTAL_CNT; + 30024d6: fcc42783 lw a5,-52(s0) + 30024da: 1781 addi a5,a5,-32 + 30024dc: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN0); + 30024e0: be0027f3 csrr a5,0xbe0 + 30024e4: fcf42e23 sw a5,-36(s0) + 30024e8: fdc42783 lw a5,-36(s0) + 30024ec: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 30024f0: 4705 li a4,1 + 30024f2: fec42783 lw a5,-20(s0) + 30024f6: 00f717b3 sll a5,a4,a5 + 30024fa: fe442703 lw a4,-28(s0) + 30024fe: 8fd9 or a5,a5,a4 + 3002500: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN0, locienVal); + 3002504: fe442783 lw a5,-28(s0) + 3002508: 82be mv t0,a5 + 300250a: be029073 csrw 0xbe0,t0 + 300250e: a051 j 3002592 + } else if (irqNum < IRQ_LOCIEN2_OFFSET) { + 3002510: fcc42703 lw a4,-52(s0) + 3002514: 05f00793 li a5,95 + 3002518: 04e7e063 bltu a5,a4,3002558 + irqOrder = irqNum - IRQ_LOCIEN1_OFFSET; + 300251c: fcc42783 lw a5,-52(s0) + 3002520: fc078793 addi a5,a5,-64 + 3002524: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN1); + 3002528: be1027f3 csrr a5,0xbe1 + 300252c: fef42023 sw a5,-32(s0) + 3002530: fe042783 lw a5,-32(s0) + 3002534: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 3002538: 4705 li a4,1 + 300253a: fec42783 lw a5,-20(s0) + 300253e: 00f717b3 sll a5,a4,a5 + 3002542: fe442703 lw a4,-28(s0) + 3002546: 8fd9 or a5,a5,a4 + 3002548: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN1, locienVal); + 300254c: fe442783 lw a5,-28(s0) + 3002550: 82be mv t0,a5 + 3002552: be129073 csrw 0xbe1,t0 + 3002556: a835 j 3002592 + } else { + irqOrder = irqNum - IRQ_LOCIEN2_OFFSET; + 3002558: fcc42783 lw a5,-52(s0) + 300255c: fa078793 addi a5,a5,-96 + 3002560: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN2); + 3002564: be2027f3 csrr a5,0xbe2 + 3002568: fef42423 sw a5,-24(s0) + 300256c: fe842783 lw a5,-24(s0) + 3002570: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 3002574: 4705 li a4,1 + 3002576: fec42783 lw a5,-20(s0) + 300257a: 00f717b3 sll a5,a4,a5 + 300257e: fe442703 lw a4,-28(s0) + 3002582: 8fd9 or a5,a5,a4 + 3002584: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN2, locienVal); + 3002588: fe442783 lw a5,-28(s0) + 300258c: 82be mv t0,a5 + 300258e: be229073 csrw 0xbe2,t0 + } + + RISCV_PRIV_MODE_SWITCH(priv); + + return BASE_STATUS_OK; + 3002592: 4781 li a5,0 +} + 3002594: 853e mv a0,a5 + 3002596: 50f2 lw ra,60(sp) + 3002598: 5462 lw s0,56(sp) + 300259a: 6121 addi sp,sp,64 + 300259c: 8082 ret + +0300259e : + * @param context. + * @note The actual code is generated by IDE + * @retval None. + */ +__weak void SysErrPrint(const SyserrContext *context) +{ + 300259e: 1101 addi sp,sp,-32 + 30025a0: ce22 sw s0,28(sp) + 30025a2: 1000 addi s0,sp,32 + 30025a4: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(context); +} + 30025a8: 0001 nop + 30025aa: 4472 lw s0,28(sp) + 30025ac: 6105 addi sp,sp,32 + 30025ae: 8082 ret + +030025b0 : + * @brief System error completion processing + * @param None. + * @retval None. + */ +static void SysErrFinish(void) +{ + 30025b0: 1141 addi sp,sp,-16 + 30025b2: c622 sw s0,12(sp) + 30025b4: 0800 addi s0,sp,16 +} + 30025b6: 0001 nop + 30025b8: 4432 lw s0,12(sp) + 30025ba: 0141 addi sp,sp,16 + 30025bc: 8082 ret + +030025be : + * @brief Exception Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrExcEntry(const SyserrContext *context) +{ + 30025be: 1101 addi sp,sp,-32 + 30025c0: ce06 sw ra,28(sp) + 30025c2: cc22 sw s0,24(sp) + 30025c4: 1000 addi s0,sp,32 + 30025c6: fea42623 sw a0,-20(s0) + SysErrPrint(context); + 30025ca: fec42503 lw a0,-20(s0) + 30025ce: 3fc1 jal ra,300259e + SysErrFinish(); + 30025d0: 37c5 jal ra,30025b0 +} + 30025d2: 0001 nop + 30025d4: 40f2 lw ra,28(sp) + 30025d6: 4462 lw s0,24(sp) + 30025d8: 6105 addi sp,sp,32 + 30025da: 8082 ret + +030025dc : + * @brief NMI Interrupt Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrNmiEntry(const SyserrContext *context) +{ + 30025dc: 1101 addi sp,sp,-32 + 30025de: ce06 sw ra,28(sp) + 30025e0: cc22 sw s0,24(sp) + 30025e2: 1000 addi s0,sp,32 + 30025e4: fea42623 sw a0,-20(s0) + INTERRUPT_ASSERT_PARAM(context != NULL); + 30025e8: fec42783 lw a5,-20(s0) + 30025ec: eb89 bnez a5,30025fe + 30025ee: 12d00593 li a1,301 + 30025f2: 030077b7 lui a5,0x3007 + 30025f6: 82878513 addi a0,a5,-2008 # 3006828 + 30025fa: 36f5 jal ra,30021e6 + 30025fc: a001 j 30025fc + SysErrPrint(context); + 30025fe: fec42503 lw a0,-20(s0) + 3002602: 3f71 jal ra,300259e + SysErrFinish(); + 3002604: 3775 jal ra,30025b0 +} + 3002606: 0001 nop + 3002608: 40f2 lw ra,28(sp) + 300260a: 4462 lw s0,24(sp) + 300260c: 6105 addi sp,sp,32 + 300260e: 8082 ret + +03002610 : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior local int prioroty. + * @retval None + */ +static void SetLocalIntNumPri(unsigned int intNum, unsigned int interPriNum, unsigned int prior) +{ + 3002610: 711d addi sp,sp,-96 + 3002612: cea2 sw s0,92(sp) + 3002614: 1080 addi s0,sp,96 + 3002616: faa42623 sw a0,-84(s0) + 300261a: fab42423 sw a1,-88(s0) + 300261e: fac42223 sw a2,-92(s0) + switch (intNum) { + 3002622: fac42783 lw a5,-84(s0) + 3002626: 17e1 addi a5,a5,-8 + 3002628: 471d li a4,7 + 300262a: 2af76363 bltu a4,a5,30028d0 + 300262e: 00279713 slli a4,a5,0x2 + 3002632: 030077b7 lui a5,0x3007 + 3002636: 84878793 addi a5,a5,-1976 # 3006848 + 300263a: 97ba add a5,a5,a4 + 300263c: 439c lw a5,0(a5) + 300263e: 8782 jr a5 + case 8: /* GROUP8 */ + SET_LOCAL_INTER_NUM_PRI(8, interPriNum, prior); + 3002640: bc8027f3 csrr a5,0xbc8 + 3002644: faf42a23 sw a5,-76(s0) + 3002648: fb442783 lw a5,-76(s0) + 300264c: faf42823 sw a5,-80(s0) + 3002650: fa842783 lw a5,-88(s0) + 3002654: 078a slli a5,a5,0x2 + 3002656: 8bf1 andi a5,a5,28 + 3002658: 473d li a4,15 + 300265a: 00f717b3 sll a5,a4,a5 + 300265e: fff7c793 not a5,a5 + 3002662: fb042703 lw a4,-80(s0) + 3002666: 8ff9 and a5,a5,a4 + 3002668: faf42823 sw a5,-80(s0) + 300266c: fa842783 lw a5,-88(s0) + 3002670: 078a slli a5,a5,0x2 + 3002672: 8bf1 andi a5,a5,28 + 3002674: fa442703 lw a4,-92(s0) + 3002678: 00f717b3 sll a5,a4,a5 + 300267c: fb042703 lw a4,-80(s0) + 3002680: 8fd9 or a5,a5,a4 + 3002682: faf42823 sw a5,-80(s0) + 3002686: fb042783 lw a5,-80(s0) + 300268a: 82be mv t0,a5 + 300268c: bc829073 csrw 0xbc8,t0 + break; + 3002690: a489 j 30028d2 + case 9: /* GROUP9 */ + SET_LOCAL_INTER_NUM_PRI(9, interPriNum, prior); + 3002692: bc9027f3 csrr a5,0xbc9 + 3002696: faf42e23 sw a5,-68(s0) + 300269a: fbc42783 lw a5,-68(s0) + 300269e: faf42c23 sw a5,-72(s0) + 30026a2: fa842783 lw a5,-88(s0) + 30026a6: 078a slli a5,a5,0x2 + 30026a8: 8bf1 andi a5,a5,28 + 30026aa: 473d li a4,15 + 30026ac: 00f717b3 sll a5,a4,a5 + 30026b0: fff7c793 not a5,a5 + 30026b4: fb842703 lw a4,-72(s0) + 30026b8: 8ff9 and a5,a5,a4 + 30026ba: faf42c23 sw a5,-72(s0) + 30026be: fa842783 lw a5,-88(s0) + 30026c2: 078a slli a5,a5,0x2 + 30026c4: 8bf1 andi a5,a5,28 + 30026c6: fa442703 lw a4,-92(s0) + 30026ca: 00f717b3 sll a5,a4,a5 + 30026ce: fb842703 lw a4,-72(s0) + 30026d2: 8fd9 or a5,a5,a4 + 30026d4: faf42c23 sw a5,-72(s0) + 30026d8: fb842783 lw a5,-72(s0) + 30026dc: 82be mv t0,a5 + 30026de: bc929073 csrw 0xbc9,t0 + break; + 30026e2: aac5 j 30028d2 + case 10: /* GROUP10 */ + SET_LOCAL_INTER_NUM_PRI(10, interPriNum, prior); + 30026e4: bca027f3 csrr a5,0xbca + 30026e8: fcf42223 sw a5,-60(s0) + 30026ec: fc442783 lw a5,-60(s0) + 30026f0: fcf42023 sw a5,-64(s0) + 30026f4: fa842783 lw a5,-88(s0) + 30026f8: 078a slli a5,a5,0x2 + 30026fa: 8bf1 andi a5,a5,28 + 30026fc: 473d li a4,15 + 30026fe: 00f717b3 sll a5,a4,a5 + 3002702: fff7c793 not a5,a5 + 3002706: fc042703 lw a4,-64(s0) + 300270a: 8ff9 and a5,a5,a4 + 300270c: fcf42023 sw a5,-64(s0) + 3002710: fa842783 lw a5,-88(s0) + 3002714: 078a slli a5,a5,0x2 + 3002716: 8bf1 andi a5,a5,28 + 3002718: fa442703 lw a4,-92(s0) + 300271c: 00f717b3 sll a5,a4,a5 + 3002720: fc042703 lw a4,-64(s0) + 3002724: 8fd9 or a5,a5,a4 + 3002726: fcf42023 sw a5,-64(s0) + 300272a: fc042783 lw a5,-64(s0) + 300272e: 82be mv t0,a5 + 3002730: bca29073 csrw 0xbca,t0 + break; + 3002734: aa79 j 30028d2 + case 11: /* GROUP11 */ + SET_LOCAL_INTER_NUM_PRI(11, interPriNum, prior); + 3002736: bcb027f3 csrr a5,0xbcb + 300273a: fcf42623 sw a5,-52(s0) + 300273e: fcc42783 lw a5,-52(s0) + 3002742: fcf42423 sw a5,-56(s0) + 3002746: fa842783 lw a5,-88(s0) + 300274a: 078a slli a5,a5,0x2 + 300274c: 8bf1 andi a5,a5,28 + 300274e: 473d li a4,15 + 3002750: 00f717b3 sll a5,a4,a5 + 3002754: fff7c793 not a5,a5 + 3002758: fc842703 lw a4,-56(s0) + 300275c: 8ff9 and a5,a5,a4 + 300275e: fcf42423 sw a5,-56(s0) + 3002762: fa842783 lw a5,-88(s0) + 3002766: 078a slli a5,a5,0x2 + 3002768: 8bf1 andi a5,a5,28 + 300276a: fa442703 lw a4,-92(s0) + 300276e: 00f717b3 sll a5,a4,a5 + 3002772: fc842703 lw a4,-56(s0) + 3002776: 8fd9 or a5,a5,a4 + 3002778: fcf42423 sw a5,-56(s0) + 300277c: fc842783 lw a5,-56(s0) + 3002780: 82be mv t0,a5 + 3002782: bcb29073 csrw 0xbcb,t0 + break; + 3002786: a2b1 j 30028d2 + case 12: /* GROUP12 */ + SET_LOCAL_INTER_NUM_PRI(12, interPriNum, prior); + 3002788: bcc027f3 csrr a5,0xbcc + 300278c: fcf42a23 sw a5,-44(s0) + 3002790: fd442783 lw a5,-44(s0) + 3002794: fcf42823 sw a5,-48(s0) + 3002798: fa842783 lw a5,-88(s0) + 300279c: 078a slli a5,a5,0x2 + 300279e: 8bf1 andi a5,a5,28 + 30027a0: 473d li a4,15 + 30027a2: 00f717b3 sll a5,a4,a5 + 30027a6: fff7c793 not a5,a5 + 30027aa: fd042703 lw a4,-48(s0) + 30027ae: 8ff9 and a5,a5,a4 + 30027b0: fcf42823 sw a5,-48(s0) + 30027b4: fa842783 lw a5,-88(s0) + 30027b8: 078a slli a5,a5,0x2 + 30027ba: 8bf1 andi a5,a5,28 + 30027bc: fa442703 lw a4,-92(s0) + 30027c0: 00f717b3 sll a5,a4,a5 + 30027c4: fd042703 lw a4,-48(s0) + 30027c8: 8fd9 or a5,a5,a4 + 30027ca: fcf42823 sw a5,-48(s0) + 30027ce: fd042783 lw a5,-48(s0) + 30027d2: 82be mv t0,a5 + 30027d4: bcc29073 csrw 0xbcc,t0 + break; + 30027d8: a8ed j 30028d2 + case 13: /* GROUP13 */ + SET_LOCAL_INTER_NUM_PRI(13, interPriNum, prior); + 30027da: bcd027f3 csrr a5,0xbcd + 30027de: fcf42e23 sw a5,-36(s0) + 30027e2: fdc42783 lw a5,-36(s0) + 30027e6: fcf42c23 sw a5,-40(s0) + 30027ea: fa842783 lw a5,-88(s0) + 30027ee: 078a slli a5,a5,0x2 + 30027f0: 8bf1 andi a5,a5,28 + 30027f2: 473d li a4,15 + 30027f4: 00f717b3 sll a5,a4,a5 + 30027f8: fff7c793 not a5,a5 + 30027fc: fd842703 lw a4,-40(s0) + 3002800: 8ff9 and a5,a5,a4 + 3002802: fcf42c23 sw a5,-40(s0) + 3002806: fa842783 lw a5,-88(s0) + 300280a: 078a slli a5,a5,0x2 + 300280c: 8bf1 andi a5,a5,28 + 300280e: fa442703 lw a4,-92(s0) + 3002812: 00f717b3 sll a5,a4,a5 + 3002816: fd842703 lw a4,-40(s0) + 300281a: 8fd9 or a5,a5,a4 + 300281c: fcf42c23 sw a5,-40(s0) + 3002820: fd842783 lw a5,-40(s0) + 3002824: 82be mv t0,a5 + 3002826: bcd29073 csrw 0xbcd,t0 + break; + 300282a: a065 j 30028d2 + case 14: /* GROUP14 */ + SET_LOCAL_INTER_NUM_PRI(14, interPriNum, prior); + 300282c: bce027f3 csrr a5,0xbce + 3002830: fef42223 sw a5,-28(s0) + 3002834: fe442783 lw a5,-28(s0) + 3002838: fef42023 sw a5,-32(s0) + 300283c: fa842783 lw a5,-88(s0) + 3002840: 078a slli a5,a5,0x2 + 3002842: 8bf1 andi a5,a5,28 + 3002844: 473d li a4,15 + 3002846: 00f717b3 sll a5,a4,a5 + 300284a: fff7c793 not a5,a5 + 300284e: fe042703 lw a4,-32(s0) + 3002852: 8ff9 and a5,a5,a4 + 3002854: fef42023 sw a5,-32(s0) + 3002858: fa842783 lw a5,-88(s0) + 300285c: 078a slli a5,a5,0x2 + 300285e: 8bf1 andi a5,a5,28 + 3002860: fa442703 lw a4,-92(s0) + 3002864: 00f717b3 sll a5,a4,a5 + 3002868: fe042703 lw a4,-32(s0) + 300286c: 8fd9 or a5,a5,a4 + 300286e: fef42023 sw a5,-32(s0) + 3002872: fe042783 lw a5,-32(s0) + 3002876: 82be mv t0,a5 + 3002878: bce29073 csrw 0xbce,t0 + break; + 300287c: a899 j 30028d2 + case 15: /* GROUP15 */ + SET_LOCAL_INTER_NUM_PRI(15, interPriNum, prior); + 300287e: bcf027f3 csrr a5,0xbcf + 3002882: fef42623 sw a5,-20(s0) + 3002886: fec42783 lw a5,-20(s0) + 300288a: fef42423 sw a5,-24(s0) + 300288e: fa842783 lw a5,-88(s0) + 3002892: 078a slli a5,a5,0x2 + 3002894: 8bf1 andi a5,a5,28 + 3002896: 473d li a4,15 + 3002898: 00f717b3 sll a5,a4,a5 + 300289c: fff7c793 not a5,a5 + 30028a0: fe842703 lw a4,-24(s0) + 30028a4: 8ff9 and a5,a5,a4 + 30028a6: fef42423 sw a5,-24(s0) + 30028aa: fa842783 lw a5,-88(s0) + 30028ae: 078a slli a5,a5,0x2 + 30028b0: 8bf1 andi a5,a5,28 + 30028b2: fa442703 lw a4,-92(s0) + 30028b6: 00f717b3 sll a5,a4,a5 + 30028ba: fe842703 lw a4,-24(s0) + 30028be: 8fd9 or a5,a5,a4 + 30028c0: fef42423 sw a5,-24(s0) + 30028c4: fe842783 lw a5,-24(s0) + 30028c8: 82be mv t0,a5 + 30028ca: bcf29073 csrw 0xbcf,t0 + break; + 30028ce: a011 j 30028d2 + default: + break; + 30028d0: 0001 nop + } +} + 30028d2: 0001 nop + 30028d4: 4476 lw s0,92(sp) + 30028d6: 6125 addi sp,sp,96 + 30028d8: 8082 ret + +030028da : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior Priority of this local interrupt to be set. + * @retval None. + */ +static void IRQ_SetLocalPriority(unsigned int interPriNum, unsigned int prior) +{ + 30028da: 7159 addi sp,sp,-112 + 30028dc: d686 sw ra,108(sp) + 30028de: d4a2 sw s0,104(sp) + 30028e0: 1880 addi s0,sp,112 + 30028e2: f8a42e23 sw a0,-100(s0) + 30028e6: f8b42c23 sw a1,-104(s0) +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + RISCV_PRIV_MODE_SWITCH(priv); + unsigned int intNum = GET_LOCAL_INTER_CONFIGREG_NUM(interPriNum); + 30028ea: f9c42783 lw a5,-100(s0) + 30028ee: 838d srli a5,a5,0x3 + 30028f0: fef42623 sw a5,-20(s0) + switch (intNum) { + 30028f4: fec42703 lw a4,-20(s0) + 30028f8: 479d li a5,7 + 30028fa: 2ae7e563 bltu a5,a4,3002ba4 + 30028fe: fec42783 lw a5,-20(s0) + 3002902: 00279713 slli a4,a5,0x2 + 3002906: 030077b7 lui a5,0x3007 + 300290a: 86878793 addi a5,a5,-1944 # 3006868 + 300290e: 97ba add a5,a5,a4 + 3002910: 439c lw a5,0(a5) + 3002912: 8782 jr a5 + case 0: /* GROUP0 */ + SET_LOCAL_INTER_NUM_PRI(0, interPriNum, prior); + 3002914: bc0027f3 csrr a5,0xbc0 + 3002918: faf42823 sw a5,-80(s0) + 300291c: fb042783 lw a5,-80(s0) + 3002920: faf42623 sw a5,-84(s0) + 3002924: f9c42783 lw a5,-100(s0) + 3002928: 078a slli a5,a5,0x2 + 300292a: 8bf1 andi a5,a5,28 + 300292c: 473d li a4,15 + 300292e: 00f717b3 sll a5,a4,a5 + 3002932: fff7c793 not a5,a5 + 3002936: fac42703 lw a4,-84(s0) + 300293a: 8ff9 and a5,a5,a4 + 300293c: faf42623 sw a5,-84(s0) + 3002940: f9c42783 lw a5,-100(s0) + 3002944: 078a slli a5,a5,0x2 + 3002946: 8bf1 andi a5,a5,28 + 3002948: f9842703 lw a4,-104(s0) + 300294c: 00f717b3 sll a5,a4,a5 + 3002950: fac42703 lw a4,-84(s0) + 3002954: 8fd9 or a5,a5,a4 + 3002956: faf42623 sw a5,-84(s0) + 300295a: fac42783 lw a5,-84(s0) + 300295e: 82be mv t0,a5 + 3002960: bc029073 csrw 0xbc0,t0 + break; + 3002964: ac81 j 3002bb4 + case 1: /* GROUP1 */ + SET_LOCAL_INTER_NUM_PRI(1, interPriNum, prior); + 3002966: bc1027f3 csrr a5,0xbc1 + 300296a: faf42c23 sw a5,-72(s0) + 300296e: fb842783 lw a5,-72(s0) + 3002972: faf42a23 sw a5,-76(s0) + 3002976: f9c42783 lw a5,-100(s0) + 300297a: 078a slli a5,a5,0x2 + 300297c: 8bf1 andi a5,a5,28 + 300297e: 473d li a4,15 + 3002980: 00f717b3 sll a5,a4,a5 + 3002984: fff7c793 not a5,a5 + 3002988: fb442703 lw a4,-76(s0) + 300298c: 8ff9 and a5,a5,a4 + 300298e: faf42a23 sw a5,-76(s0) + 3002992: f9c42783 lw a5,-100(s0) + 3002996: 078a slli a5,a5,0x2 + 3002998: 8bf1 andi a5,a5,28 + 300299a: f9842703 lw a4,-104(s0) + 300299e: 00f717b3 sll a5,a4,a5 + 30029a2: fb442703 lw a4,-76(s0) + 30029a6: 8fd9 or a5,a5,a4 + 30029a8: faf42a23 sw a5,-76(s0) + 30029ac: fb442783 lw a5,-76(s0) + 30029b0: 82be mv t0,a5 + 30029b2: bc129073 csrw 0xbc1,t0 + break; + 30029b6: aafd j 3002bb4 + case 2: /* GROUP2 */ + SET_LOCAL_INTER_NUM_PRI(2, interPriNum, prior); + 30029b8: bc2027f3 csrr a5,0xbc2 + 30029bc: fcf42023 sw a5,-64(s0) + 30029c0: fc042783 lw a5,-64(s0) + 30029c4: faf42e23 sw a5,-68(s0) + 30029c8: f9c42783 lw a5,-100(s0) + 30029cc: 078a slli a5,a5,0x2 + 30029ce: 8bf1 andi a5,a5,28 + 30029d0: 473d li a4,15 + 30029d2: 00f717b3 sll a5,a4,a5 + 30029d6: fff7c793 not a5,a5 + 30029da: fbc42703 lw a4,-68(s0) + 30029de: 8ff9 and a5,a5,a4 + 30029e0: faf42e23 sw a5,-68(s0) + 30029e4: f9c42783 lw a5,-100(s0) + 30029e8: 078a slli a5,a5,0x2 + 30029ea: 8bf1 andi a5,a5,28 + 30029ec: f9842703 lw a4,-104(s0) + 30029f0: 00f717b3 sll a5,a4,a5 + 30029f4: fbc42703 lw a4,-68(s0) + 30029f8: 8fd9 or a5,a5,a4 + 30029fa: faf42e23 sw a5,-68(s0) + 30029fe: fbc42783 lw a5,-68(s0) + 3002a02: 82be mv t0,a5 + 3002a04: bc229073 csrw 0xbc2,t0 + break; + 3002a08: a275 j 3002bb4 + case 3: /* GROUP3 */ + SET_LOCAL_INTER_NUM_PRI(3, interPriNum, prior); + 3002a0a: bc3027f3 csrr a5,0xbc3 + 3002a0e: fcf42423 sw a5,-56(s0) + 3002a12: fc842783 lw a5,-56(s0) + 3002a16: fcf42223 sw a5,-60(s0) + 3002a1a: f9c42783 lw a5,-100(s0) + 3002a1e: 078a slli a5,a5,0x2 + 3002a20: 8bf1 andi a5,a5,28 + 3002a22: 473d li a4,15 + 3002a24: 00f717b3 sll a5,a4,a5 + 3002a28: fff7c793 not a5,a5 + 3002a2c: fc442703 lw a4,-60(s0) + 3002a30: 8ff9 and a5,a5,a4 + 3002a32: fcf42223 sw a5,-60(s0) + 3002a36: f9c42783 lw a5,-100(s0) + 3002a3a: 078a slli a5,a5,0x2 + 3002a3c: 8bf1 andi a5,a5,28 + 3002a3e: f9842703 lw a4,-104(s0) + 3002a42: 00f717b3 sll a5,a4,a5 + 3002a46: fc442703 lw a4,-60(s0) + 3002a4a: 8fd9 or a5,a5,a4 + 3002a4c: fcf42223 sw a5,-60(s0) + 3002a50: fc442783 lw a5,-60(s0) + 3002a54: 82be mv t0,a5 + 3002a56: bc329073 csrw 0xbc3,t0 + break; + 3002a5a: aaa9 j 3002bb4 + case 4: /* GROUP4 */ + SET_LOCAL_INTER_NUM_PRI(4, interPriNum, prior); + 3002a5c: bc4027f3 csrr a5,0xbc4 + 3002a60: fcf42823 sw a5,-48(s0) + 3002a64: fd042783 lw a5,-48(s0) + 3002a68: fcf42623 sw a5,-52(s0) + 3002a6c: f9c42783 lw a5,-100(s0) + 3002a70: 078a slli a5,a5,0x2 + 3002a72: 8bf1 andi a5,a5,28 + 3002a74: 473d li a4,15 + 3002a76: 00f717b3 sll a5,a4,a5 + 3002a7a: fff7c793 not a5,a5 + 3002a7e: fcc42703 lw a4,-52(s0) + 3002a82: 8ff9 and a5,a5,a4 + 3002a84: fcf42623 sw a5,-52(s0) + 3002a88: f9c42783 lw a5,-100(s0) + 3002a8c: 078a slli a5,a5,0x2 + 3002a8e: 8bf1 andi a5,a5,28 + 3002a90: f9842703 lw a4,-104(s0) + 3002a94: 00f717b3 sll a5,a4,a5 + 3002a98: fcc42703 lw a4,-52(s0) + 3002a9c: 8fd9 or a5,a5,a4 + 3002a9e: fcf42623 sw a5,-52(s0) + 3002aa2: fcc42783 lw a5,-52(s0) + 3002aa6: 82be mv t0,a5 + 3002aa8: bc429073 csrw 0xbc4,t0 + break; + 3002aac: a221 j 3002bb4 + case 5: /* GROUP5 */ + SET_LOCAL_INTER_NUM_PRI(5, interPriNum, prior); + 3002aae: bc5027f3 csrr a5,0xbc5 + 3002ab2: fcf42c23 sw a5,-40(s0) + 3002ab6: fd842783 lw a5,-40(s0) + 3002aba: fcf42a23 sw a5,-44(s0) + 3002abe: f9c42783 lw a5,-100(s0) + 3002ac2: 078a slli a5,a5,0x2 + 3002ac4: 8bf1 andi a5,a5,28 + 3002ac6: 473d li a4,15 + 3002ac8: 00f717b3 sll a5,a4,a5 + 3002acc: fff7c793 not a5,a5 + 3002ad0: fd442703 lw a4,-44(s0) + 3002ad4: 8ff9 and a5,a5,a4 + 3002ad6: fcf42a23 sw a5,-44(s0) + 3002ada: f9c42783 lw a5,-100(s0) + 3002ade: 078a slli a5,a5,0x2 + 3002ae0: 8bf1 andi a5,a5,28 + 3002ae2: f9842703 lw a4,-104(s0) + 3002ae6: 00f717b3 sll a5,a4,a5 + 3002aea: fd442703 lw a4,-44(s0) + 3002aee: 8fd9 or a5,a5,a4 + 3002af0: fcf42a23 sw a5,-44(s0) + 3002af4: fd442783 lw a5,-44(s0) + 3002af8: 82be mv t0,a5 + 3002afa: bc529073 csrw 0xbc5,t0 + break; + 3002afe: a85d j 3002bb4 + case 6: /* GROUP6 */ + SET_LOCAL_INTER_NUM_PRI(6, interPriNum, prior); + 3002b00: bc6027f3 csrr a5,0xbc6 + 3002b04: fef42023 sw a5,-32(s0) + 3002b08: fe042783 lw a5,-32(s0) + 3002b0c: fcf42e23 sw a5,-36(s0) + 3002b10: f9c42783 lw a5,-100(s0) + 3002b14: 078a slli a5,a5,0x2 + 3002b16: 8bf1 andi a5,a5,28 + 3002b18: 473d li a4,15 + 3002b1a: 00f717b3 sll a5,a4,a5 + 3002b1e: fff7c793 not a5,a5 + 3002b22: fdc42703 lw a4,-36(s0) + 3002b26: 8ff9 and a5,a5,a4 + 3002b28: fcf42e23 sw a5,-36(s0) + 3002b2c: f9c42783 lw a5,-100(s0) + 3002b30: 078a slli a5,a5,0x2 + 3002b32: 8bf1 andi a5,a5,28 + 3002b34: f9842703 lw a4,-104(s0) + 3002b38: 00f717b3 sll a5,a4,a5 + 3002b3c: fdc42703 lw a4,-36(s0) + 3002b40: 8fd9 or a5,a5,a4 + 3002b42: fcf42e23 sw a5,-36(s0) + 3002b46: fdc42783 lw a5,-36(s0) + 3002b4a: 82be mv t0,a5 + 3002b4c: bc629073 csrw 0xbc6,t0 + break; + 3002b50: a095 j 3002bb4 + case 7: /* GROUP7 */ + SET_LOCAL_INTER_NUM_PRI(7, interPriNum, prior); + 3002b52: bc7027f3 csrr a5,0xbc7 + 3002b56: fef42423 sw a5,-24(s0) + 3002b5a: fe842783 lw a5,-24(s0) + 3002b5e: fef42223 sw a5,-28(s0) + 3002b62: f9c42783 lw a5,-100(s0) + 3002b66: 078a slli a5,a5,0x2 + 3002b68: 8bf1 andi a5,a5,28 + 3002b6a: 473d li a4,15 + 3002b6c: 00f717b3 sll a5,a4,a5 + 3002b70: fff7c793 not a5,a5 + 3002b74: fe442703 lw a4,-28(s0) + 3002b78: 8ff9 and a5,a5,a4 + 3002b7a: fef42223 sw a5,-28(s0) + 3002b7e: f9c42783 lw a5,-100(s0) + 3002b82: 078a slli a5,a5,0x2 + 3002b84: 8bf1 andi a5,a5,28 + 3002b86: f9842703 lw a4,-104(s0) + 3002b8a: 00f717b3 sll a5,a4,a5 + 3002b8e: fe442703 lw a4,-28(s0) + 3002b92: 8fd9 or a5,a5,a4 + 3002b94: fef42223 sw a5,-28(s0) + 3002b98: fe442783 lw a5,-28(s0) + 3002b9c: 82be mv t0,a5 + 3002b9e: bc729073 csrw 0xbc7,t0 + break; + 3002ba2: a809 j 3002bb4 + default: + SetLocalIntNumPri(intNum, interPriNum, prior); + 3002ba4: f9842603 lw a2,-104(s0) + 3002ba8: f9c42583 lw a1,-100(s0) + 3002bac: fec42503 lw a0,-20(s0) + 3002bb0: 3485 jal ra,3002610 + break; + 3002bb2: 0001 nop + } + RISCV_PRIV_MODE_SWITCH(priv); +} + 3002bb4: 0001 nop + 3002bb6: 50b6 lw ra,108(sp) + 3002bb8: 5426 lw s0,104(sp) + 3002bba: 6165 addi sp,sp,112 + 3002bbc: 8082 ret + +03002bbe : + * @param irqNum External interrupt number. + * @param priority. + * @retval IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_PRIORITY_INVALID or BASE_STATUS_OK. + */ +unsigned int IRQ_SetPriority(unsigned int irqNum, unsigned int priority) +{ + 3002bbe: 1101 addi sp,sp,-32 + 3002bc0: ce06 sw ra,28(sp) + 3002bc2: cc22 sw s0,24(sp) + 3002bc4: 1000 addi s0,sp,32 + 3002bc6: fea42623 sw a0,-20(s0) + 3002bca: feb42423 sw a1,-24(s0) + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 3002bce: fec42703 lw a4,-20(s0) + 3002bd2: 47e5 li a5,25 + 3002bd4: 00e7f863 bgeu a5,a4,3002be4 + 3002bd8: fec42703 lw a4,-20(s0) + 3002bdc: 07200793 li a5,114 + 3002be0: 00e7fb63 bgeu a5,a4,3002bf6 + 3002be4: 18c00593 li a1,396 + 3002be8: 030077b7 lui a5,0x3007 + 3002bec: 82878513 addi a0,a5,-2008 # 3006828 + 3002bf0: 21bd jal ra,300305e + 3002bf2: 4789 li a5,2 + 3002bf4: a815 j 3002c28 + INTERRUPT_PARAM_CHECK_WITH_RET((priority >= IRQ_PRIO_LOWEST && priority <= IRQ_PRIO_HIGHEST), \ + 3002bf6: fe842783 lw a5,-24(s0) + 3002bfa: c791 beqz a5,3002c06 + 3002bfc: fe842703 lw a4,-24(s0) + 3002c00: 47bd li a5,15 + 3002c02: 00e7fb63 bgeu a5,a4,3002c18 + 3002c06: 18d00593 li a1,397 + 3002c0a: 030077b7 lui a5,0x3007 + 3002c0e: 82878513 addi a0,a5,-2008 # 3006828 + 3002c12: 21b1 jal ra,300305e + 3002c14: 4795 li a5,5 + 3002c16: a809 j 3002c28 + IRQ_ERRNO_PRIORITY_INVALID); + + /* The locipri register is specifically used to configure the priority of the + external non-standard interrupts of the CPU, so the number of internal + standard interrupts should be subtracted */ + IRQ_SetLocalPriority(irqNum - IRQ_VECTOR_CNT, priority); + 3002c18: fec42783 lw a5,-20(s0) + 3002c1c: 1799 addi a5,a5,-26 + 3002c1e: fe842583 lw a1,-24(s0) + 3002c22: 853e mv a0,a5 + 3002c24: 395d jal ra,30028da + + return BASE_STATUS_OK; + 3002c26: 4781 li a5,0 +} + 3002c28: 853e mv a0,a5 + 3002c2a: 40f2 lw ra,28(sp) + 3002c2c: 4462 lw s0,24(sp) + 3002c2e: 6105 addi sp,sp,32 + 3002c30: 8082 ret + +03002c32 : + * @brief Interrupt dummy handler + * @param arg Not used + * @retval None. + */ +static void IRQ_DummyHandler(void *arg) +{ + 3002c32: 1101 addi sp,sp,-32 + 3002c34: ce22 sw s0,28(sp) + 3002c36: 1000 addi s0,sp,32 + 3002c38: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(arg); +} + 3002c3c: 0001 nop + 3002c3e: 4472 lw s0,28(sp) + 3002c40: 6105 addi sp,sp,32 + 3002c42: 8082 ret + +03002c44 : + * @param func callback function + * @param arg callback arg + * @retval None. + */ +static inline void IRQ_SetCallBack(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 3002c44: 1101 addi sp,sp,-32 + 3002c46: ce22 sw s0,28(sp) + 3002c48: 1000 addi s0,sp,32 + 3002c4a: fea42623 sw a0,-20(s0) + 3002c4e: feb42423 sw a1,-24(s0) + 3002c52: fec42223 sw a2,-28(s0) + g_irqCallbackFunc[irqNum].param = arg; + 3002c56: 040007b7 lui a5,0x4000 + 3002c5a: 0fc78713 addi a4,a5,252 # 40000fc + 3002c5e: fec42783 lw a5,-20(s0) + 3002c62: 078e slli a5,a5,0x3 + 3002c64: 97ba add a5,a5,a4 + 3002c66: fe442703 lw a4,-28(s0) + 3002c6a: c3d8 sw a4,4(a5) + g_irqCallbackFunc[irqNum].pfnHandler = func; + 3002c6c: 040007b7 lui a5,0x4000 + 3002c70: 0fc78713 addi a4,a5,252 # 40000fc + 3002c74: fec42783 lw a5,-20(s0) + 3002c78: 078e slli a5,a5,0x3 + 3002c7a: 97ba add a5,a5,a4 + 3002c7c: fe842703 lw a4,-24(s0) + 3002c80: c398 sw a4,0(a5) +} + 3002c82: 0001 nop + 3002c84: 4472 lw s0,28(sp) + 3002c86: 6105 addi sp,sp,32 + 3002c88: 8082 ret + +03002c8a : + * @brief Set the write protection for CRG-related registers disable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionDisable(void) +{ + 3002c8a: 1141 addi sp,sp,-16 + 3002c8c: c622 sw s0,12(sp) + 3002c8e: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = (SYSCTRL0->SC_LOCKEN.reg & SC_LOCKEN_CRG_DISABLE_MASK) + SC_LOCKEN_VALID_HIGH_BIT; + 3002c90: 101007b7 lui a5,0x10100 + 3002c94: 43f8 lw a4,68(a5) + 3002c96: 67c1 lui a5,0x10 + 3002c98: 17f9 addi a5,a5,-2 # fffe + 3002c9a: 00f776b3 and a3,a4,a5 + 3002c9e: 101007b7 lui a5,0x10100 + 3002ca2: ea510737 lui a4,0xea510 + 3002ca6: 9736 add a4,a4,a3 + 3002ca8: c3f8 sw a4,68(a5) +} + 3002caa: 0001 nop + 3002cac: 4432 lw s0,12(sp) + 3002cae: 0141 addi sp,sp,16 + 3002cb0: 8082 ret + +03002cb2 : + * @brief Set the Set the write protection for CRG-related registers enable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionEnable(void) +{ + 3002cb2: 1141 addi sp,sp,-16 + 3002cb4: c622 sw s0,12(sp) + 3002cb6: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = ((SYSCTRL0->SC_LOCKEN.reg & SC_LOW_BIT_MASK) | SC_LOCKEN_CRG_ENABLE_MASK) + + 3002cb8: 101007b7 lui a5,0x10100 + 3002cbc: 43f8 lw a4,68(a5) + 3002cbe: 67c1 lui a5,0x10 + 3002cc0: 17fd addi a5,a5,-1 # ffff + 3002cc2: 8ff9 and a5,a5,a4 + 3002cc4: 0017e693 ori a3,a5,1 + 3002cc8: 101007b7 lui a5,0x10100 + 3002ccc: ea510737 lui a4,0xea510 + 3002cd0: 9736 add a4,a4,a3 + 3002cd2: c3f8 sw a4,68(a5) + SC_LOCKEN_VALID_HIGH_BIT; +} + 3002cd4: 0001 nop + 3002cd6: 4432 lw s0,12(sp) + 3002cd8: 0141 addi sp,sp,16 + 3002cda: 8082 ret + +03002cdc : + * @param clkSelect pll_ref_cksel + * @retval true + * @retval false + */ +static inline bool IsCrgPllRefClkSelect(CRG_PllRefClkSelect clkSelect) +{ + 3002cdc: 1101 addi sp,sp,-32 + 3002cde: ce22 sw s0,28(sp) + 3002ce0: 1000 addi s0,sp,32 + 3002ce2: fea42623 sw a0,-20(s0) + return ((clkSelect == CRG_PLL_REF_CLK_SELECT_HOSC) || + 3002ce6: fec42783 lw a5,-20(s0) + 3002cea: c791 beqz a5,3002cf6 + 3002cec: fec42703 lw a4,-20(s0) + 3002cf0: 4785 li a5,1 + 3002cf2: 00f71463 bne a4,a5,3002cfa + 3002cf6: 4785 li a5,1 + 3002cf8: a011 j 3002cfc + 3002cfa: 4781 li a5,0 + 3002cfc: 8b85 andi a5,a5,1 + 3002cfe: 9f81 uxtb a5 + (clkSelect == CRG_PLL_REF_CLK_SELECT_XTAL)); +} + 3002d00: 853e mv a0,a5 + 3002d02: 4472 lw s0,28(sp) + 3002d04: 6105 addi sp,sp,32 + 3002d06: 8082 ret + +03002d08 : + * @param preDiv pll prediv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPreDiv(CRG_PllPreDiv preDiv) +{ + 3002d08: 1101 addi sp,sp,-32 + 3002d0a: ce22 sw s0,28(sp) + 3002d0c: 1000 addi s0,sp,32 + 3002d0e: fea42623 sw a0,-20(s0) + return ((preDiv >= CRG_PLL_PREDIV_1) && + 3002d12: fec42783 lw a5,-20(s0) + 3002d16: 0087b793 sltiu a5,a5,8 + 3002d1a: 9f81 uxtb a5 + (preDiv <= CRG_PLL_PREDIV_8)); +} + 3002d1c: 853e mv a0,a5 + 3002d1e: 4472 lw s0,28(sp) + 3002d20: 6105 addi sp,sp,32 + 3002d22: 8082 ret + +03002d24 : + * @param postDiv pll_postdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv(CRG_PllPostDiv postDiv) +{ + 3002d24: 1101 addi sp,sp,-32 + 3002d26: ce22 sw s0,28(sp) + 3002d28: 1000 addi s0,sp,32 + 3002d2a: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV_1) && + 3002d2e: fec42783 lw a5,-20(s0) + 3002d32: 0087b793 sltiu a5,a5,8 + 3002d36: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV_8)); +} + 3002d38: 853e mv a0,a5 + 3002d3a: 4472 lw s0,28(sp) + 3002d3c: 6105 addi sp,sp,32 + 3002d3e: 8082 ret + +03002d40 : + * @param postDiv pll_postdiv2 value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv2(CRG_PllPostDiv2 postDiv) +{ + 3002d40: 1101 addi sp,sp,-32 + 3002d42: ce22 sw s0,28(sp) + 3002d44: 1000 addi s0,sp,32 + 3002d46: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV2_1) && + 3002d4a: fec42783 lw a5,-20(s0) + 3002d4e: 0087b793 sltiu a5,a5,8 + 3002d52: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV2_8_MAX)); +} + 3002d54: 853e mv a0,a5 + 3002d56: 4472 lw s0,28(sp) + 3002d58: 6105 addi sp,sp,32 + 3002d5a: 8082 ret + +03002d5c : + * @param fbDiv pll fbdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllFbDiv(unsigned int fbDiv) +{ + 3002d5c: 1101 addi sp,sp,-32 + 3002d5e: ce22 sw s0,28(sp) + 3002d60: 1000 addi s0,sp,32 + 3002d62: fea42623 sw a0,-20(s0) + return (fbDiv <= CRG_PLL_FBDIV_MAX); + 3002d66: fec42783 lw a5,-20(s0) + 3002d6a: 0807b793 sltiu a5,a5,128 + 3002d6e: 9f81 uxtb a5 +} + 3002d70: 853e mv a0,a5 + 3002d72: 4472 lw s0,28(sp) + 3002d74: 6105 addi sp,sp,32 + 3002d76: 8082 ret + +03002d78 : + * @param select core_cksel value + * @retval true + * @retval false + */ +static inline bool IsCrgCoreCkSel(CRG_CoreClkSelect select) +{ + 3002d78: 1101 addi sp,sp,-32 + 3002d7a: ce22 sw s0,28(sp) + 3002d7c: 1000 addi s0,sp,32 + 3002d7e: fea42623 sw a0,-20(s0) + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002d82: fec42783 lw a5,-20(s0) + 3002d86: cb99 beqz a5,3002d9c + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + 3002d88: fec42703 lw a4,-20(s0) + 3002d8c: 4785 li a5,1 + 3002d8e: 00f70763 beq a4,a5,3002d9c + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002d92: fec42703 lw a4,-20(s0) + 3002d96: 4789 li a5,2 + 3002d98: 00f71463 bne a4,a5,3002da0 + 3002d9c: 4785 li a5,1 + 3002d9e: a011 j 3002da2 + 3002da0: 4781 li a5,0 + 3002da2: 8b85 andi a5,a5,1 + 3002da4: 9f81 uxtb a5 + (select == CRG_CORE_CLK_SELECT_PLL)); +} + 3002da6: 853e mv a0,a5 + 3002da8: 4472 lw s0,28(sp) + 3002daa: 6105 addi sp,sp,32 + 3002dac: 8082 ret + +03002dae : + * @param select 1M clock selection + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkSel(CRG_1MClkSelect select) +{ + 3002dae: 1101 addi sp,sp,-32 + 3002db0: ce22 sw s0,28(sp) + 3002db2: 1000 addi s0,sp,32 + 3002db4: fea42623 sw a0,-20(s0) + return ((select == CRG_1M_CLK_SELECT_HOSC) || + 3002db8: fec42783 lw a5,-20(s0) + 3002dbc: c791 beqz a5,3002dc8 + 3002dbe: fec42703 lw a4,-20(s0) + 3002dc2: 4785 li a5,1 + 3002dc4: 00f71463 bne a4,a5,3002dcc + 3002dc8: 4785 li a5,1 + 3002dca: a011 j 3002dce + 3002dcc: 4781 li a5,0 + 3002dce: 8b85 andi a5,a5,1 + 3002dd0: 9f81 uxtb a5 + (select == CRG_1M_CLK_SELECT_TCXO)); +} + 3002dd2: 853e mv a0,a5 + 3002dd4: 4472 lw s0,28(sp) + 3002dd6: 6105 addi sp,sp,32 + 3002dd8: 8082 ret + +03002dda : + * @param div 1M clock ratio + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkDiv(unsigned int div) +{ + 3002dda: 1101 addi sp,sp,-32 + 3002ddc: ce22 sw s0,28(sp) + 3002dde: 1000 addi s0,sp,32 + 3002de0: fea42623 sw a0,-20(s0) + return (div <= CRG_1MHZ_CLK_MAX_DIV); + 3002de4: fec42783 lw a5,-20(s0) + 3002de8: 0407b793 sltiu a5,a5,64 + 3002dec: 9f81 uxtb a5 +} + 3002dee: 853e mv a0,a5 + 3002df0: 4472 lw s0,28(sp) + 3002df2: 6105 addi sp,sp,32 + 3002df4: 8082 ret + +03002df6 : + * @param preDiv PLL Previous Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPreDiv(unsigned int pllRefFreq, unsigned int preDiv) +{ + 3002df6: 7179 addi sp,sp,-48 + 3002df8: d622 sw s0,44(sp) + 3002dfa: 1800 addi s0,sp,48 + 3002dfc: fca42e23 sw a0,-36(s0) + 3002e00: fcb42c23 sw a1,-40(s0) + unsigned int freq = pllRefFreq; + 3002e04: fdc42783 lw a5,-36(s0) + 3002e08: fef42623 sw a5,-20(s0) + if (preDiv != 0) { + 3002e0c: fd842783 lw a5,-40(s0) + 3002e10: cb89 beqz a5,3002e22 + freq /= preDiv; + 3002e12: fec42703 lw a4,-20(s0) + 3002e16: fd842783 lw a5,-40(s0) + 3002e1a: 02f757b3 divu a5,a4,a5 + 3002e1e: fef42623 sw a5,-20(s0) + } + return (freq >= CRG_CLK_PFD_MIN_FREQ) && (freq <= CRG_CLK_PFD_MAX_FREQ); + 3002e22: fec42703 lw a4,-20(s0) + 3002e26: 003d17b7 lui a5,0x3d1 + 3002e2a: 8ff78793 addi a5,a5,-1793 # 3d08ff + 3002e2e: 00e7fc63 bgeu a5,a4,3002e46 + 3002e32: fec42703 lw a4,-20(s0) + 3002e36: 007277b7 lui a5,0x727 + 3002e3a: 0e078793 addi a5,a5,224 # 7270e0 + 3002e3e: 00e7e463 bltu a5,a4,3002e46 + 3002e42: 4785 li a5,1 + 3002e44: a011 j 3002e48 + 3002e46: 4781 li a5,0 + 3002e48: 8b85 andi a5,a5,1 + 3002e4a: 9f81 uxtb a5 +} + 3002e4c: 853e mv a0,a5 + 3002e4e: 5432 lw s0,44(sp) + 3002e50: 6145 addi sp,sp,48 + 3002e52: 8082 ret + +03002e54 : + * @param fdDiv PLL FD Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidFdDiv(unsigned int clkPfdFreq, unsigned int fdDiv) +{ + 3002e54: 7179 addi sp,sp,-48 + 3002e56: d622 sw s0,44(sp) + 3002e58: 1800 addi s0,sp,48 + 3002e5a: fca42e23 sw a0,-36(s0) + 3002e5e: fcb42c23 sw a1,-40(s0) + if (clkPfdFreq > 30000000U) { /* The maximum speed of the external clock source is 30000000U. */ + 3002e62: fdc42703 lw a4,-36(s0) + 3002e66: 01c9c7b7 lui a5,0x1c9c + 3002e6a: 38078793 addi a5,a5,896 # 1c9c380 + 3002e6e: 00e7f463 bgeu a5,a4,3002e76 + return false; + 3002e72: 4781 li a5,0 + 3002e74: a08d j 3002ed6 + } else if (fdDiv > CRG_PLL_FBDIV_MAX) { + 3002e76: fd842703 lw a4,-40(s0) + 3002e7a: 07f00793 li a5,127 + 3002e7e: 00e7f463 bgeu a5,a4,3002e86 + return false; + 3002e82: 4781 li a5,0 + 3002e84: a889 j 3002ed6 + } + + unsigned int freq = (fdDiv > 0x6) ? (clkPfdFreq * fdDiv) : (clkPfdFreq * 0x6); /* 0x0-0x6: divided by 0x6 */ + 3002e86: fd842703 lw a4,-40(s0) + 3002e8a: 4799 li a5,6 + 3002e8c: 00e7f963 bgeu a5,a4,3002e9e + 3002e90: fdc42703 lw a4,-36(s0) + 3002e94: fd842783 lw a5,-40(s0) + 3002e98: 02f707b3 mul a5,a4,a5 + 3002e9c: a031 j 3002ea8 + 3002e9e: fdc42703 lw a4,-36(s0) + 3002ea2: 4799 li a5,6 + 3002ea4: 02f707b3 mul a5,a4,a5 + 3002ea8: fef42623 sw a5,-20(s0) + return (freq >= CRG_CLK_VCO_MIN_FREQ) && (freq <= CRG_CLK_VCO_MAX_FREQ); + 3002eac: fec42703 lw a4,-20(s0) + 3002eb0: 05f5e7b7 lui a5,0x5f5e + 3002eb4: 0ff78793 addi a5,a5,255 # 5f5e0ff + 3002eb8: 00e7fc63 bgeu a5,a4,3002ed0 + 3002ebc: fec42703 lw a4,-20(s0) + 3002ec0: 11e1a7b7 lui a5,0x11e1a + 3002ec4: 30078793 addi a5,a5,768 # 11e1a300 + 3002ec8: 00e7e463 bltu a5,a4,3002ed0 + 3002ecc: 4785 li a5,1 + 3002ece: a011 j 3002ed2 + 3002ed0: 4781 li a5,0 + 3002ed2: 8b85 andi a5,a5,1 + 3002ed4: 9f81 uxtb a5 +} + 3002ed6: 853e mv a0,a5 + 3002ed8: 5432 lw s0,44(sp) + 3002eda: 6145 addi sp,sp,48 + 3002edc: 8082 ret + +03002ede : + * @param postDiv PLL Post Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv(unsigned int clkVcoFreq, unsigned int postDiv) +{ + 3002ede: 7179 addi sp,sp,-48 + 3002ee0: d622 sw s0,44(sp) + 3002ee2: 1800 addi s0,sp,48 + 3002ee4: fca42e23 sw a0,-36(s0) + 3002ee8: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002eec: fdc42783 lw a5,-36(s0) + 3002ef0: fef42623 sw a5,-20(s0) + if (postDiv != 0) { + 3002ef4: fd842783 lw a5,-40(s0) + 3002ef8: cb91 beqz a5,3002f0c + freq /= (postDiv + 1); + 3002efa: fd842783 lw a5,-40(s0) + 3002efe: 0785 addi a5,a5,1 + 3002f00: fec42703 lw a4,-20(s0) + 3002f04: 02f757b3 divu a5,a4,a5 + 3002f08: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_TARGET_MAX_FREQ); + 3002f0c: fec42703 lw a4,-20(s0) + 3002f10: 08f0d7b7 lui a5,0x8f0d + 3002f14: 18178793 addi a5,a5,385 # 8f0d181 + 3002f18: 00f737b3 sltu a5,a4,a5 + 3002f1c: 9f81 uxtb a5 +} + 3002f1e: 853e mv a0,a5 + 3002f20: 5432 lw s0,44(sp) + 3002f22: 6145 addi sp,sp,48 + 3002f24: 8082 ret + +03002f26 : + * @param postDiv2 PLL Post Divsion2 + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv2(unsigned int clkVcoFreq, unsigned int postDiv2) +{ + 3002f26: 7179 addi sp,sp,-48 + 3002f28: d622 sw s0,44(sp) + 3002f2a: 1800 addi s0,sp,48 + 3002f2c: fca42e23 sw a0,-36(s0) + 3002f30: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002f34: fdc42783 lw a5,-36(s0) + 3002f38: fef42623 sw a5,-20(s0) + if (postDiv2 != 0) { + 3002f3c: fd842783 lw a5,-40(s0) + 3002f40: cb91 beqz a5,3002f54 + freq /= (postDiv2 + 1); + 3002f42: fd842783 lw a5,-40(s0) + 3002f46: 0785 addi a5,a5,1 + 3002f48: fec42703 lw a4,-20(s0) + 3002f4c: 02f757b3 divu a5,a4,a5 + 3002f50: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_PST2_MAX_FREQ); + 3002f54: fec42703 lw a4,-20(s0) + 3002f58: 05f5e7b7 lui a5,0x5f5e + 3002f5c: 10178793 addi a5,a5,257 # 5f5e101 + 3002f60: 00f737b3 sltu a5,a4,a5 + 3002f64: 9f81 uxtb a5 +} + 3002f66: 853e mv a0,a5 + 3002f68: 5432 lw s0,44(sp) + 3002f6a: 6145 addi sp,sp,48 + 3002f6c: 8082 ret + +03002f6e : + * @param adcClkSelect the value of adc clock select + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkModeSelect(CRG_AdcClkSelect adcClkSelect) +{ + 3002f6e: 1101 addi sp,sp,-32 + 3002f70: ce22 sw s0,28(sp) + 3002f72: 1000 addi s0,sp,32 + 3002f74: fea42623 sw a0,-20(s0) + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002f78: fec42783 lw a5,-20(s0) + 3002f7c: c385 beqz a5,3002f9c + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + 3002f7e: fec42703 lw a4,-20(s0) + 3002f82: 4785 li a5,1 + 3002f84: 00f70c63 beq a4,a5,3002f9c + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + 3002f88: fec42703 lw a4,-20(s0) + 3002f8c: 4789 li a5,2 + 3002f8e: 00f70763 beq a4,a5,3002f9c + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002f92: fec42703 lw a4,-20(s0) + 3002f96: 478d li a5,3 + 3002f98: 00f71463 bne a4,a5,3002fa0 + 3002f9c: 4785 li a5,1 + 3002f9e: a011 j 3002fa2 + 3002fa0: 4781 li a5,0 + 3002fa2: 8b85 andi a5,a5,1 + 3002fa4: 9f81 uxtb a5 + adcClkSelect == CRG_ADC_CLK_SYN_CORE); +} + 3002fa6: 853e mv a0,a5 + 3002fa8: 4472 lw s0,28(sp) + 3002faa: 6105 addi sp,sp,32 + 3002fac: 8082 ret + +03002fae : + * @param div the value of adc clock div + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkDiv(CRG_AdcDiv div) +{ + 3002fae: 1101 addi sp,sp,-32 + 3002fb0: ce22 sw s0,28(sp) + 3002fb2: 1000 addi s0,sp,32 + 3002fb4: fea42623 sw a0,-20(s0) + return (div == CRG_ADC_DIV_1 || \ + div == CRG_ADC_DIV_2 || \ + div == CRG_ADC_DIV_3 || \ + 3002fb8: fec42783 lw a5,-20(s0) + 3002fbc: c385 beqz a5,3002fdc + return (div == CRG_ADC_DIV_1 || \ + 3002fbe: fec42703 lw a4,-20(s0) + 3002fc2: 4785 li a5,1 + 3002fc4: 00f70c63 beq a4,a5,3002fdc + div == CRG_ADC_DIV_2 || \ + 3002fc8: fec42703 lw a4,-20(s0) + 3002fcc: 4789 li a5,2 + 3002fce: 00f70763 beq a4,a5,3002fdc + div == CRG_ADC_DIV_3 || \ + 3002fd2: fec42703 lw a4,-20(s0) + 3002fd6: 478d li a5,3 + 3002fd8: 00f71463 bne a4,a5,3002fe0 + 3002fdc: 4785 li a5,1 + 3002fde: a011 j 3002fe2 + 3002fe0: 4781 li a5,0 + 3002fe2: 8b85 andi a5,a5,1 + 3002fe4: 9f81 uxtb a5 + div == CRG_ADC_DIV_4); +} + 3002fe6: 853e mv a0,a5 + 3002fe8: 4472 lw s0,28(sp) + 3002fea: 6105 addi sp,sp,32 + 3002fec: 8082 ret + +03002fee : + * @param clk Clock register base address + * @param select Core clock selection + * @retval None + */ +static inline void DCL_CRG_SetCoreClkSel(CRG_RegStruct *clk, CRG_CoreClkSelect select) +{ + 3002fee: 1101 addi sp,sp,-32 + 3002ff0: ce06 sw ra,28(sp) + 3002ff2: cc22 sw s0,24(sp) + 3002ff4: 1000 addi s0,sp,32 + 3002ff6: fea42623 sw a0,-20(s0) + 3002ffa: feb42423 sw a1,-24(s0) + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + 3002ffe: fec42703 lw a4,-20(s0) + 3003002: 100007b7 lui a5,0x10000 + 3003006: 00f70a63 beq a4,a5,300301a + 300300a: 64b00593 li a1,1611 + 300300e: 030077b7 lui a5,0x3007 + 3003012: 88878513 addi a0,a5,-1912 # 3006888 + 3003016: 20a1 jal ra,300305e + 3003018: a001 j 3003018 + CRG_PARAM_CHECK_NO_RET(IsCrgCoreCkSel(select)); + 300301a: fe842503 lw a0,-24(s0) + 300301e: 3ba9 jal ra,3002d78 + 3003020: 87aa mv a5,a0 + 3003022: 0017c793 xori a5,a5,1 + 3003026: 9f81 uxtb a5 + 3003028: cb89 beqz a5,300303a + 300302a: 64c00593 li a1,1612 + 300302e: 030077b7 lui a5,0x3007 + 3003032: 88878513 addi a0,a5,-1912 # 3006888 + 3003036: 2025 jal ra,300305e + 3003038: a839 j 3003056 + clk->PERI_CRG64.BIT.clk_pst1_sw_sel = select; + 300303a: fe842783 lw a5,-24(s0) + 300303e: 8b8d andi a5,a5,3 + 3003040: 0ff7f693 andi a3,a5,255 + 3003044: fec42703 lw a4,-20(s0) + 3003048: 10072783 lw a5,256(a4) # ea510100 + 300304c: 8a8d andi a3,a3,3 + 300304e: 9bf1 andi a5,a5,-4 + 3003050: 8fd5 or a5,a5,a3 + 3003052: 10f72023 sw a5,256(a4) +} + 3003056: 40f2 lw ra,28(sp) + 3003058: 4462 lw s0,24(sp) + 300305a: 6105 addi sp,sp,32 + 300305c: 8082 ret + +0300305e : + 300305e: 988ff06f j 30021e6 + +03003062 : + * @param handle CRG Handle + * @retval BASE_STATUS_ERROR Parameter Check fail + * @retval BASE_STATUS_OK Success + */ +BASE_StatusType HAL_CRG_Init(const CRG_Handle *handle) +{ + 3003062: 7179 addi sp,sp,-48 + 3003064: d606 sw ra,44(sp) + 3003066: d422 sw s0,40(sp) + 3003068: 1800 addi s0,sp,48 + 300306a: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != NULL); + 300306e: fdc42783 lw a5,-36(s0) + 3003072: eb89 bnez a5,3003084 + 3003074: 07100593 li a1,113 + 3003078: 030077b7 lui a5,0x3007 + 300307c: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003080: 3ff9 jal ra,300305e + 3003082: a001 j 3003082 + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3003084: fdc42783 lw a5,-36(s0) + 3003088: 4398 lw a4,0(a5) + 300308a: 100007b7 lui a5,0x10000 + 300308e: 00f70a63 beq a4,a5,30030a2 + 3003092: 07200593 li a1,114 + 3003096: 030077b7 lui a5,0x3007 + 300309a: 8a478513 addi a0,a5,-1884 # 30068a4 + 300309e: 37c1 jal ra,300305e + 30030a0: a001 j 30030a0 + /* Check the validity of PLL-related parameters. */ + CRG_PARAM_CHECK_WITH_RET(IsCrgPllRefClkSelect(handle->pllRefClkSelect), BASE_STATUS_ERROR); + 30030a2: fdc42783 lw a5,-36(s0) + 30030a6: 43dc lw a5,4(a5) + 30030a8: 853e mv a0,a5 + 30030aa: 390d jal ra,3002cdc + 30030ac: 87aa mv a5,a0 + 30030ae: 0017c793 xori a5,a5,1 + 30030b2: 9f81 uxtb a5 + 30030b4: cb91 beqz a5,30030c8 + 30030b6: 07400593 li a1,116 + 30030ba: 030077b7 lui a5,0x3007 + 30030be: 8a478513 addi a0,a5,-1884 # 30068a4 + 30030c2: 3f71 jal ra,300305e + 30030c4: 4785 li a5,1 + 30030c6: aca9 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPreDiv(handle->pllPreDiv), BASE_STATUS_ERROR); + 30030c8: fdc42783 lw a5,-36(s0) + 30030cc: 479c lw a5,8(a5) + 30030ce: 853e mv a0,a5 + 30030d0: 3925 jal ra,3002d08 + 30030d2: 87aa mv a5,a0 + 30030d4: 0017c793 xori a5,a5,1 + 30030d8: 9f81 uxtb a5 + 30030da: cb91 beqz a5,30030ee + 30030dc: 07500593 li a1,117 + 30030e0: 030077b7 lui a5,0x3007 + 30030e4: 8a478513 addi a0,a5,-1884 # 30068a4 + 30030e8: 3f9d jal ra,300305e + 30030ea: 4785 li a5,1 + 30030ec: ac15 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllFbDiv(handle->pllFbDiv), BASE_STATUS_ERROR); + 30030ee: fdc42783 lw a5,-36(s0) + 30030f2: 47dc lw a5,12(a5) + 30030f4: 853e mv a0,a5 + 30030f6: 319d jal ra,3002d5c + 30030f8: 87aa mv a5,a0 + 30030fa: 0017c793 xori a5,a5,1 + 30030fe: 9f81 uxtb a5 + 3003100: cb91 beqz a5,3003114 + 3003102: 07600593 li a1,118 + 3003106: 030077b7 lui a5,0x3007 + 300310a: 8a478513 addi a0,a5,-1884 # 30068a4 + 300310e: 3f81 jal ra,300305e + 3003110: 4785 li a5,1 + 3003112: a439 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv(handle->pllPostDiv), BASE_STATUS_ERROR); + 3003114: fdc42783 lw a5,-36(s0) + 3003118: 4b9c lw a5,16(a5) + 300311a: 853e mv a0,a5 + 300311c: 3121 jal ra,3002d24 + 300311e: 87aa mv a5,a0 + 3003120: 0017c793 xori a5,a5,1 + 3003124: 9f81 uxtb a5 + 3003126: cb91 beqz a5,300313a + 3003128: 07700593 li a1,119 + 300312c: 030077b7 lui a5,0x3007 + 3003130: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003134: 372d jal ra,300305e + 3003136: 4785 li a5,1 + 3003138: a2e5 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv2(handle->handleEx.pllPostDiv2), BASE_STATUS_ERROR); + 300313a: fdc42783 lw a5,-36(s0) + 300313e: 4fdc lw a5,28(a5) + 3003140: 853e mv a0,a5 + 3003142: 3efd jal ra,3002d40 + 3003144: 87aa mv a5,a0 + 3003146: 0017c793 xori a5,a5,1 + 300314a: 9f81 uxtb a5 + 300314c: cb91 beqz a5,3003160 + 300314e: 07800593 li a1,120 + 3003152: 030077b7 lui a5,0x3007 + 3003156: 8a478513 addi a0,a5,-1884 # 30068a4 + 300315a: 3711 jal ra,300305e + 300315c: 4785 li a5,1 + 300315e: a2c9 j 3003320 + /* Check the Clock Source and Frequency Divider of the 1 MHz Clock. */ + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkSel(handle->handleEx.clk1MSelect), BASE_STATUS_ERROR); + 3003160: fdc42783 lw a5,-36(s0) + 3003164: 539c lw a5,32(a5) + 3003166: 853e mv a0,a5 + 3003168: 3199 jal ra,3002dae + 300316a: 87aa mv a5,a0 + 300316c: 0017c793 xori a5,a5,1 + 3003170: 9f81 uxtb a5 + 3003172: cb91 beqz a5,3003186 + 3003174: 07a00593 li a1,122 + 3003178: 030077b7 lui a5,0x3007 + 300317c: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003180: 3df9 jal ra,300305e + 3003182: 4785 li a5,1 + 3003184: aa71 j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkDiv(handle->handleEx.clk1MDiv), BASE_STATUS_ERROR); + 3003186: fdc42783 lw a5,-36(s0) + 300318a: 53dc lw a5,36(a5) + 300318c: 853e mv a0,a5 + 300318e: 31b1 jal ra,3002dda + 3003190: 87aa mv a5,a0 + 3003192: 0017c793 xori a5,a5,1 + 3003196: 9f81 uxtb a5 + 3003198: cb91 beqz a5,30031ac + 300319a: 07b00593 li a1,123 + 300319e: 030077b7 lui a5,0x3007 + 30031a2: 8a478513 addi a0,a5,-1884 # 30068a4 + 30031a6: 3d65 jal ra,300305e + 30031a8: 4785 li a5,1 + 30031aa: aa9d j 3003320 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 30031ac: fdc42783 lw a5,-36(s0) + 30031b0: 4f9c lw a5,24(a5) + 30031b2: 853e mv a0,a5 + 30031b4: 36d1 jal ra,3002d78 + 30031b6: 87aa mv a5,a0 + 30031b8: 0017c793 xori a5,a5,1 + 30031bc: 9f81 uxtb a5 + 30031be: cb91 beqz a5,30031d2 + 30031c0: 07c00593 li a1,124 + 30031c4: 030077b7 lui a5,0x3007 + 30031c8: 8a478513 addi a0,a5,-1884 # 30068a4 + 30031cc: 3d49 jal ra,300305e + 30031ce: 4785 li a5,1 + 30031d0: aa81 j 3003320 + + *(unsigned int *)CRG_HOSC_CTRL2_ADDR = 0x306E; /* Optimized HOSC temperature drift performance parameter. */ + 30031d2: 100017b7 lui a5,0x10001 + 30031d6: f0478793 addi a5,a5,-252 # 10000f04 + 30031da: 670d lui a4,0x3 + 30031dc: 06e70713 addi a4,a4,110 # 306e + 30031e0: c398 sw a4,0(a5) + + CRG_RegStruct *reg = handle->baseAddress; + 30031e2: fdc42783 lw a5,-36(s0) + 30031e6: 439c lw a5,0(a5) + 30031e8: fef42623 sw a5,-20(s0) + g_crgBaseAddr = (void *)reg; + 30031ec: 040007b7 lui a5,0x4000 + 30031f0: fec42703 lw a4,-20(s0) + 30031f4: 48e7aa23 sw a4,1172(a5) # 4000494 + /* Check the validity of the PLL parameter configuration. */ + if (CRG_IsValidPllConfig(handle) != BASE_STATUS_OK) { + 30031f8: fdc42503 lw a0,-36(s0) + 30031fc: 7a4000ef jal ra,30039a0 + 3003200: 87aa mv a5,a0 + 3003202: c399 beqz a5,3003208 + return BASE_STATUS_ERROR; + 3003204: 4785 li a5,1 + 3003206: aa29 j 3003320 + } + /* Disable the write protection function of the CRG register. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3003208: 3449 jal ra,3002c8a + + reg->PERI_CRG0.BIT.pll_ref_cksel = handle->pllRefClkSelect; + 300320a: fdc42783 lw a5,-36(s0) + 300320e: 43dc lw a5,4(a5) + 3003210: 8b85 andi a5,a5,1 + 3003212: 0ff7f693 andi a3,a5,255 + 3003216: fec42703 lw a4,-20(s0) + 300321a: 431c lw a5,0(a4) + 300321c: 8a85 andi a3,a3,1 + 300321e: 9bf9 andi a5,a5,-2 + 3003220: 8fd5 or a5,a5,a3 + 3003222: c31c sw a5,0(a4) + reg->PERI_CRG1.BIT.pll_prediv = handle->pllPreDiv; + 3003224: fdc42783 lw a5,-36(s0) + 3003228: 479c lw a5,8(a5) + 300322a: 8bbd andi a5,a5,15 + 300322c: 0ff7f693 andi a3,a5,255 + 3003230: fec42703 lw a4,-20(s0) + 3003234: 435c lw a5,4(a4) + 3003236: 8abd andi a3,a3,15 + 3003238: 9bc1 andi a5,a5,-16 + 300323a: 8fd5 or a5,a5,a3 + 300323c: c35c sw a5,4(a4) + reg->PERI_CRG2.BIT.pll_fbdiv = handle->pllFbDiv; + 300323e: fdc42783 lw a5,-36(s0) + 3003242: 47dc lw a5,12(a5) + 3003244: 0ff7f693 andi a3,a5,255 + 3003248: fec42703 lw a4,-20(s0) + 300324c: 471c lw a5,8(a4) + 300324e: 0ff6f693 andi a3,a3,255 + 3003252: f007f793 andi a5,a5,-256 + 3003256: 8fd5 or a5,a5,a3 + 3003258: c71c sw a5,8(a4) + reg->PERI_CRG3.BIT.pll_postdiv1 = handle->pllPostDiv; + 300325a: fdc42783 lw a5,-36(s0) + 300325e: 4b9c lw a5,16(a5) + 3003260: 8bbd andi a5,a5,15 + 3003262: 0ff7f693 andi a3,a5,255 + 3003266: fec42703 lw a4,-20(s0) + 300326a: 475c lw a5,12(a4) + 300326c: 8abd andi a3,a3,15 + 300326e: 9bc1 andi a5,a5,-16 + 3003270: 8fd5 or a5,a5,a3 + 3003272: c75c sw a5,12(a4) + reg->PERI_CRG3.BIT.pll_postdiv2 = handle->handleEx.pllPostDiv2; + 3003274: fdc42783 lw a5,-36(s0) + 3003278: 4fdc lw a5,28(a5) + 300327a: 8bbd andi a5,a5,15 + 300327c: 0ff7f693 andi a3,a5,255 + 3003280: fec42703 lw a4,-20(s0) + 3003284: 475c lw a5,12(a4) + 3003286: 8abd andi a3,a3,15 + 3003288: 0692 slli a3,a3,0x4 + 300328a: f0f7f793 andi a5,a5,-241 + 300328e: 8fd5 or a5,a5,a3 + 3003290: c75c sw a5,12(a4) + reg->PERI_CRG4.BIT.pll_pd = BASE_CFG_UNSET; + 3003292: fec42703 lw a4,-20(s0) + 3003296: 4b1c lw a5,16(a4) + 3003298: 9bf9 andi a5,a5,-2 + 300329a: cb1c sw a5,16(a4) + + while (reg->PERI_CRG7.BIT.pll_lock != BASE_CFG_SET) { + 300329c: 0001 nop + 300329e: fec42783 lw a5,-20(s0) + 30032a2: 4fdc lw a5,28(a5) + 30032a4: 8b85 andi a5,a5,1 + 30032a6: 0ff7f713 andi a4,a5,255 + 30032aa: 4785 li a5,1 + 30032ac: fef719e3 bne a4,a5,300329e + ; /* Wait for PLL to lock */ + } + + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 30032b0: 3409 jal ra,3002cb2 + /* Check the 1MHz clock parameter configuration. */ + if (CRG_IsValid1MHzConfig(handle) != BASE_STATUS_OK) { + 30032b2: fdc42503 lw a0,-36(s0) + 30032b6: 7ac000ef jal ra,3003a62 + 30032ba: 87aa mv a5,a0 + 30032bc: c399 beqz a5,30032c2 + return BASE_STATUS_ERROR; + 30032be: 4785 li a5,1 + 30032c0: a085 j 3003320 + } + while (reg->HOSC_LOCK.BIT.hosc_lock != BASE_CFG_SET) { + 30032c2: 0001 nop + 30032c4: fec42703 lw a4,-20(s0) + 30032c8: 6785 lui a5,0x1 + 30032ca: 97ba add a5,a5,a4 + 30032cc: f107a783 lw a5,-240(a5) # f10 + 30032d0: 8b85 andi a5,a5,1 + 30032d2: 0ff7f713 andi a4,a5,255 + 30032d6: 4785 li a5,1 + 30032d8: fef716e3 bne a4,a5,30032c4 + ; /* Wait for HOSC to lock */ + } + /* Set the Clock Source and Frequency Divider of the 1 MHz Clock. */ + reg->PERI_CRG67.BIT.clk_1m_div = handle->handleEx.clk1MDiv; + 30032dc: fdc42783 lw a5,-36(s0) + 30032e0: 53dc lw a5,36(a5) + 30032e2: 03f7f793 andi a5,a5,63 + 30032e6: 0ff7f693 andi a3,a5,255 + 30032ea: fec42703 lw a4,-20(s0) + 30032ee: 10c72783 lw a5,268(a4) + 30032f2: 03f6f693 andi a3,a3,63 + 30032f6: fc07f793 andi a5,a5,-64 + 30032fa: 8fd5 or a5,a5,a3 + 30032fc: 10f72623 sw a5,268(a4) + reg->PERI_CRG66.BIT.clk_1m_ini_cksel = handle->handleEx.clk1MSelect; + 3003300: fdc42783 lw a5,-36(s0) + 3003304: 539c lw a5,32(a5) + 3003306: 8b85 andi a5,a5,1 + 3003308: 0ff7f693 andi a3,a5,255 + 300330c: fec42703 lw a4,-20(s0) + 3003310: 10872783 lw a5,264(a4) + 3003314: 8a85 andi a3,a3,1 + 3003316: 9bf9 andi a5,a5,-2 + 3003318: 8fd5 or a5,a5,a3 + 300331a: 10f72423 sw a5,264(a4) + return BASE_STATUS_OK; + 300331e: 4781 li a5,0 +} + 3003320: 853e mv a0,a5 + 3003322: 50b2 lw ra,44(sp) + 3003324: 5422 lw s0,40(sp) + 3003326: 6145 addi sp,sp,48 + 3003328: 8082 ret + +0300332a : + * @param handle CRG Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Paramter check fail + */ +BASE_StatusType HAL_CRG_SetCoreClockSelect(CRG_Handle *handle) +{ + 300332a: 7179 addi sp,sp,-48 + 300332c: d606 sw ra,44(sp) + 300332e: d422 sw s0,40(sp) + 3003330: 1800 addi s0,sp,48 + 3003332: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != 0); + 3003336: fdc42783 lw a5,-36(s0) + 300333a: eb89 bnez a5,300334c + 300333c: 10a00593 li a1,266 + 3003340: 030077b7 lui a5,0x3007 + 3003344: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003348: 3b19 jal ra,300305e + 300334a: a001 j 300334a + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 300334c: fdc42783 lw a5,-36(s0) + 3003350: 4398 lw a4,0(a5) + 3003352: 100007b7 lui a5,0x10000 + 3003356: 00f70a63 beq a4,a5,300336a + 300335a: 10b00593 li a1,267 + 300335e: 030077b7 lui a5,0x3007 + 3003362: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003366: 39e5 jal ra,300305e + 3003368: a001 j 3003368 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 300336a: fdc42783 lw a5,-36(s0) + 300336e: 4f9c lw a5,24(a5) + 3003370: 853e mv a0,a5 + 3003372: 3419 jal ra,3002d78 + 3003374: 87aa mv a5,a0 + 3003376: 0017c793 xori a5,a5,1 + 300337a: 9f81 uxtb a5 + 300337c: cb91 beqz a5,3003390 + 300337e: 10c00593 li a1,268 + 3003382: 030077b7 lui a5,0x3007 + 3003386: 8a478513 addi a0,a5,-1884 # 30068a4 + 300338a: 39d1 jal ra,300305e + 300338c: 4785 li a5,1 + 300338e: a005 j 30033ae + + CRG_RegStruct *reg = handle->baseAddress; + 3003390: fdc42783 lw a5,-36(s0) + 3003394: 439c lw a5,0(a5) + 3003396: fef42623 sw a5,-20(s0) + /* The write protection of the CRG register needs to be disabled. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 300339a: 38c5 jal ra,3002c8a + DCL_CRG_SetCoreClkSel(reg, handle->coreClkSelect); + 300339c: fdc42783 lw a5,-36(s0) + 30033a0: 4f9c lw a5,24(a5) + 30033a2: 85be mv a1,a5 + 30033a4: fec42503 lw a0,-20(s0) + 30033a8: 3199 jal ra,3002fee + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 30033aa: 3221 jal ra,3002cb2 + + return BASE_STATUS_OK; + 30033ac: 4781 li a5,0 +} + 30033ae: 853e mv a0,a5 + 30033b0: 50b2 lw ra,44(sp) + 30033b2: 5422 lw s0,40(sp) + 30033b4: 6145 addi sp,sp,48 + 30033b6: 8082 ret + +030033b8 : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +static inline unsigned int CRG_GetVcoFreq(void) +{ + 30033b8: 1101 addi sp,sp,-32 + 30033ba: ce06 sw ra,28(sp) + 30033bc: cc22 sw s0,24(sp) + 30033be: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int regFbdiv; + CRG_RegStruct *crg = g_crgBaseAddr; + 30033c0: 040007b7 lui a5,0x4000 + 30033c4: 4947a783 lw a5,1172(a5) # 4000494 + 30033c8: fef42623 sw a5,-20(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 30033cc: fec42703 lw a4,-20(s0) + 30033d0: 100007b7 lui a5,0x10000 + 30033d4: 00f70a63 beq a4,a5,30033e8 + 30033d8: 12200593 li a1,290 + 30033dc: 030077b7 lui a5,0x3007 + 30033e0: 8a478513 addi a0,a5,-1884 # 30068a4 + 30033e4: 39ad jal ra,300305e + 30033e6: a001 j 30033e6 + CRG_ASSERT_PARAM((XTRAIL_FREQ <= 30000000U)); /* The maximum of the external clock source is 30000000U. */ + + freq = CRG_GetPllRefIni(crg->PERI_CRG0.BIT.pll_ref_cksel); + 30033e8: fec42783 lw a5,-20(s0) + 30033ec: 439c lw a5,0(a5) + 30033ee: 8b85 andi a5,a5,1 + 30033f0: 9f81 uxtb a5 + 30033f2: 853e mv a0,a5 + 30033f4: 25c1 jal ra,3003ab4 + 30033f6: fea42423 sw a0,-24(s0) + freq /= CRG_GetPreDivValue(crg->PERI_CRG1.BIT.pll_prediv); + 30033fa: fec42783 lw a5,-20(s0) + 30033fe: 43dc lw a5,4(a5) + 3003400: 8bbd andi a5,a5,15 + 3003402: 9f81 uxtb a5 + 3003404: 853e mv a0,a5 + 3003406: 2de1 jal ra,3003ade + 3003408: 872a mv a4,a0 + 300340a: fe842783 lw a5,-24(s0) + 300340e: 02e7d7b3 divu a5,a5,a4 + 3003412: fef42423 sw a5,-24(s0) + regFbdiv = CRG_GetPllFbDivValue(crg->PERI_CRG2.BIT.pll_fbdiv); /* Get the value of the fbdiv register. */ + 3003416: fec42783 lw a5,-20(s0) + 300341a: 479c lw a5,8(a5) + 300341c: 9f81 uxtb a5 + 300341e: 853e mv a0,a5 + 3003420: 25f5 jal ra,3003b0c + 3003422: fea42223 sw a0,-28(s0) + freq *= (regFbdiv >= 0x06) ? regFbdiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 3003426: fe442783 lw a5,-28(s0) + 300342a: 4719 li a4,6 + 300342c: 00e7f363 bgeu a5,a4,3003432 + 3003430: 4799 li a5,6 + 3003432: fe842703 lw a4,-24(s0) + 3003436: 02f707b3 mul a5,a4,a5 + 300343a: fef42423 sw a5,-24(s0) + return freq; + 300343e: fe842783 lw a5,-24(s0) +} + 3003442: 853e mv a0,a5 + 3003444: 40f2 lw ra,28(sp) + 3003446: 4462 lw s0,24(sp) + 3003448: 6105 addi sp,sp,32 + 300344a: 8082 ret + +0300344c : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +unsigned int HAL_CRG_GetPllFreq(void) +{ + 300344c: 1101 addi sp,sp,-32 + 300344e: ce06 sw ra,28(sp) + 3003450: cc22 sw s0,24(sp) + 3003452: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int pllPostDivValue; + CRG_RegStruct *crg = g_crgBaseAddr; + 3003454: 040007b7 lui a5,0x4000 + 3003458: 4947a783 lw a5,1172(a5) # 4000494 + 300345c: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003460: fe842703 lw a4,-24(s0) + 3003464: 100007b7 lui a5,0x10000 + 3003468: 00f70a63 beq a4,a5,300347c + 300346c: 13700593 li a1,311 + 3003470: 030077b7 lui a5,0x3007 + 3003474: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003478: 36dd jal ra,300305e + 300347a: a001 j 300347a + freq = CRG_GetVcoFreq(); + 300347c: 3f35 jal ra,30033b8 + 300347e: fea42623 sw a0,-20(s0) + pllPostDivValue = CRG_GetPllPostDivValue((CRG_PllPostDiv)crg->PERI_CRG3.BIT.pll_postdiv1); + 3003482: fe842783 lw a5,-24(s0) + 3003486: 47dc lw a5,12(a5) + 3003488: 8bbd andi a5,a5,15 + 300348a: 9f81 uxtb a5 + 300348c: 853e mv a0,a5 + 300348e: 25c1 jal ra,3003b4e + 3003490: fea42223 sw a0,-28(s0) + /* Calculate the PLL output clock frequency based on the VCO clock frequency and post-division coefficient. */ + if (pllPostDivValue != 0) { + 3003494: fe442783 lw a5,-28(s0) + 3003498: cb89 beqz a5,30034aa + freq /= pllPostDivValue; + 300349a: fec42703 lw a4,-20(s0) + 300349e: fe442783 lw a5,-28(s0) + 30034a2: 02f757b3 divu a5,a4,a5 + 30034a6: fef42623 sw a5,-20(s0) + } + return freq; + 30034aa: fec42783 lw a5,-20(s0) +} + 30034ae: 853e mv a0,a5 + 30034b0: 40f2 lw ra,28(sp) + 30034b2: 4462 lw s0,24(sp) + 30034b4: 6105 addi sp,sp,32 + 30034b6: 8082 ret + +030034b8 : + * @brief Get Core Clock Frequence + * @param None + * @retval unsigned int Core clock frequency + */ +unsigned int HAL_CRG_GetCoreClkFreq(void) +{ + 30034b8: 1101 addi sp,sp,-32 + 30034ba: ce06 sw ra,28(sp) + 30034bc: cc22 sw s0,24(sp) + 30034be: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int coreClkSelect; + CRG_RegStruct *crg = g_crgBaseAddr; + 30034c0: 040007b7 lui a5,0x4000 + 30034c4: 4947a783 lw a5,1172(a5) # 4000494 + 30034c8: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 30034cc: fe842703 lw a4,-24(s0) + 30034d0: 100007b7 lui a5,0x10000 + 30034d4: 00f70a63 beq a4,a5,30034e8 + 30034d8: 14c00593 li a1,332 + 30034dc: 030077b7 lui a5,0x3007 + 30034e0: 8a478513 addi a0,a5,-1884 # 30068a4 + 30034e4: 3ead jal ra,300305e + 30034e6: a001 j 30034e6 + coreClkSelect = crg->PERI_CRG64.BIT.clk_pst1_sw_sel; + 30034e8: fe842783 lw a5,-24(s0) + 30034ec: 1007a783 lw a5,256(a5) + 30034f0: 8b8d andi a5,a5,3 + 30034f2: 9f81 uxtb a5 + 30034f4: fef42223 sw a5,-28(s0) + switch (coreClkSelect) { + 30034f8: fe442783 lw a5,-28(s0) + 30034fc: 4705 li a4,1 + 30034fe: 02e78063 beq a5,a4,300351e + 3003502: 4705 li a4,1 + 3003504: 00e7e663 bltu a5,a4,3003510 + 3003508: 4709 li a4,2 + 300350a: 02e78163 beq a5,a4,300352c + 300350e: a01d j 3003534 + case CRG_CORE_CLK_SELECT_HOSC: /* The clock source is an internal high-speed clock. */ + freq = HOSC_FREQ; + 3003510: 017d87b7 lui a5,0x17d8 + 3003514: 84078793 addi a5,a5,-1984 # 17d7840 + 3003518: fef42623 sw a5,-20(s0) + break; + 300351c: a015 j 3003540 + + case CRG_CORE_CLK_SELECT_TCXO: /* The clock source is the external crystal oscillator clock. */ + freq = XTRAIL_FREQ; + 300351e: 01c9c7b7 lui a5,0x1c9c + 3003522: 38078793 addi a5,a5,896 # 1c9c380 + 3003526: fef42623 sw a5,-20(s0) + break; + 300352a: a819 j 3003540 + + case CRG_CORE_CLK_SELECT_PLL: /* The clock source is the PLL. */ + freq = HAL_CRG_GetPllFreq(); + 300352c: 3705 jal ra,300344c + 300352e: fea42623 sw a0,-20(s0) + break; + 3003532: a039 j 3003540 + + default: + freq = LOSC_FREQ; + 3003534: 67a1 lui a5,0x8 + 3003536: d0078793 addi a5,a5,-768 # 7d00 + 300353a: fef42623 sw a5,-20(s0) + break; + 300353e: 0001 nop + } + return freq; + 3003540: fec42783 lw a5,-20(s0) +} + 3003544: 853e mv a0,a5 + 3003546: 40f2 lw ra,28(sp) + 3003548: 4462 lw s0,24(sp) + 300354a: 6105 addi sp,sp,32 + 300354c: 8082 ret + +0300354e : + * @brief Get Clock Frequence + * @param handle CRG Handle + * @retval Frequece of IP + */ +unsigned int HAL_CRG_GetIpFreq(const void *baseAddress) +{ + 300354e: 7179 addi sp,sp,-48 + 3003550: d606 sw ra,44(sp) + 3003552: d422 sw s0,40(sp) + 3003554: 1800 addi s0,sp,48 + 3003556: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 300355a: fdc42783 lw a5,-36(s0) + 300355e: eb89 bnez a5,3003570 + 3003560: 16900593 li a1,361 + 3003564: 030077b7 lui a5,0x3007 + 3003568: 8a478513 addi a0,a5,-1884 # 30068a4 + 300356c: 3ccd jal ra,300305e + 300356e: a001 j 300356e + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003570: 040007b7 lui a5,0x4000 + 3003574: 4947a703 lw a4,1172(a5) # 4000494 + 3003578: 100007b7 lui a5,0x10000 + 300357c: 00f70a63 beq a4,a5,3003590 + 3003580: 16a00593 li a1,362 + 3003584: 030077b7 lui a5,0x3007 + 3003588: 8a478513 addi a0,a5,-1884 # 30068a4 + 300358c: 3cc9 jal ra,300305e + 300358e: a001 j 300358e +#ifdef FPGA + /* Use this function to obtain the clock frequency during the FPGA phase. */ + return CHIP_GetIpFreqHz(baseAddress); +#else + unsigned int hclk = HAL_CRG_GetCoreClkFreq(); + 3003590: 3725 jal ra,30034b8 + 3003592: fea42423 sw a0,-24(s0) + unsigned int freq = LOSC_FREQ; + 3003596: 67a1 lui a5,0x8 + 3003598: d0078793 addi a5,a5,-768 # 7d00 + 300359c: fef42623 sw a5,-20(s0) + unsigned int coreClkFreq; + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 30035a0: fdc42503 lw a0,-36(s0) + 30035a4: 2cc9 jal ra,3003876 + 30035a6: fea42223 sw a0,-28(s0) + if (p == NULL) { + 30035aa: fe442783 lw a5,-28(s0) + 30035ae: e781 bnez a5,30035b6 + return freq; + 30035b0: fec42783 lw a5,-20(s0) + 30035b4: a895 j 3003628 + } + switch (p->type) { + 30035b6: fe442783 lw a5,-28(s0) + 30035ba: 43dc lw a5,4(a5) + 30035bc: 4715 li a4,5 + 30035be: 04f76a63 bltu a4,a5,3003612 + 30035c2: 00279713 slli a4,a5,0x2 + 30035c6: 030077b7 lui a5,0x3007 + 30035ca: 8e078793 addi a5,a5,-1824 # 30068e0 + 30035ce: 97ba add a5,a5,a4 + 30035d0: 439c lw a5,0(a5) + 30035d2: 8782 jr a5 + case CRG_IP_NONE_CLK_SEL: + case CRG_IP_EFC: + case CRG_IP_ANA: + freq = hclk; /* Returns the internal high speed clock frequency. */ + 30035d4: fe842783 lw a5,-24(s0) + 30035d8: fef42623 sw a5,-20(s0) + break; + 30035dc: a825 j 3003614 + + case CRG_IP_CAN: + freq = CRG_GetPllRefIni(g_crgBaseAddr->PERI_CRG0.BIT.pll_ref_cksel); + 30035de: 040007b7 lui a5,0x4000 + 30035e2: 4947a783 lw a5,1172(a5) # 4000494 + 30035e6: 439c lw a5,0(a5) + 30035e8: 8b85 andi a5,a5,1 + 30035ea: 9f81 uxtb a5 + 30035ec: 853e mv a0,a5 + 30035ee: 21d9 jal ra,3003ab4 + 30035f0: fea42623 sw a0,-20(s0) + break; + 30035f4: a005 j 3003614 + + case CRG_IP_ADC: + /* Get core clock frequence for calculating the ADC clock frequency. */ + coreClkFreq = HAL_CRG_GetCoreClkFreq(); + 30035f6: 35c9 jal ra,30034b8 + 30035f8: fea42023 sw a0,-32(s0) + freq = CRG_GetAdcIpFreq(p, CRG_GetVcoFreq(), coreClkFreq); + 30035fc: 3b75 jal ra,30033b8 + 30035fe: 87aa mv a5,a0 + 3003600: fe042603 lw a2,-32(s0) + 3003604: 85be mv a1,a5 + 3003606: fe442503 lw a0,-28(s0) + 300360a: 2c85 jal ra,300387a + 300360c: fea42623 sw a0,-20(s0) + break; + 3003610: a011 j 3003614 + + case CRG_IP_IWDG: /* The IWDG clock frequency is an internal low-speed clock. */ + default: + break; + 3003612: 0001 nop + } + if (freq == 0) { + 3003614: fec42783 lw a5,-20(s0) + 3003618: e791 bnez a5,3003624 + freq = LOSC_FREQ; + 300361a: 67a1 lui a5,0x8 + 300361c: d0078793 addi a5,a5,-768 # 7d00 + 3003620: fef42623 sw a5,-20(s0) + } + return freq; + 3003624: fec42783 lw a5,-20(s0) +#endif +} + 3003628: 853e mv a0,a5 + 300362a: 50b2 lw ra,44(sp) + 300362c: 5422 lw s0,40(sp) + 300362e: 6145 addi sp,sp,48 + 3003630: 8082 ret + +03003632 : + * @param enable enable mask + * @retval BASE_STATUS_ERROR Can't find the Match or operation is not support + * @retval BASE_STATUS_OK Operation Success + */ +BASE_StatusType HAL_CRG_IpEnableSet(const void *baseAddress, unsigned int enable) +{ + 3003632: 7179 addi sp,sp,-48 + 3003634: d606 sw ra,44(sp) + 3003636: d422 sw s0,40(sp) + 3003638: 1800 addi s0,sp,48 + 300363a: fca42e23 sw a0,-36(s0) + 300363e: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3003642: fdc42783 lw a5,-36(s0) + 3003646: eb89 bnez a5,3003658 + 3003648: 19c00593 li a1,412 + 300364c: 030077b7 lui a5,0x3007 + 3003650: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003654: 3429 jal ra,300305e + 3003656: a001 j 3003656 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003658: 040007b7 lui a5,0x4000 + 300365c: 4947a703 lw a4,1172(a5) # 4000494 + 3003660: 100007b7 lui a5,0x10000 + 3003664: 00f70a63 beq a4,a5,3003678 + 3003668: 19d00593 li a1,413 + 300366c: 030077b7 lui a5,0x3007 + 3003670: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003674: 32ed jal ra,300305e + 3003676: a001 j 3003676 + /* Check the validity of the input parameters. */ + CRG_PARAM_CHECK_WITH_RET((enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE), BASE_STATUS_ERROR); + 3003678: fd842703 lw a4,-40(s0) + 300367c: 4785 li a5,1 + 300367e: 00f70e63 beq a4,a5,300369a + 3003682: fd842783 lw a5,-40(s0) + 3003686: cb91 beqz a5,300369a + 3003688: 19f00593 li a1,415 + 300368c: 030077b7 lui a5,0x3007 + 3003690: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003694: 32e9 jal ra,300305e + 3003696: 4785 li a5,1 + 3003698: a0a5 j 3003700 + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 300369a: fdc42503 lw a0,-36(s0) + 300369e: 2ae1 jal ra,3003876 + 30036a0: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 30036a4: fec42783 lw a5,-20(s0) + 30036a8: c799 beqz a5,30036b6 + 30036aa: fec42783 lw a5,-20(s0) + 30036ae: 43d8 lw a4,4(a5) + 30036b0: 4795 li a5,5 + 30036b2: 00e7f463 bgeu a5,a4,30036ba + return BASE_STATUS_ERROR; + 30036b6: 4785 li a5,1 + 30036b8: a0a1 j 3003700 + } + if (g_ipClkProc[p->type].enableSet == NULL) { + 30036ba: fec42783 lw a5,-20(s0) + 30036be: 43d4 lw a3,4(a5) + 30036c0: 040007b7 lui a5,0x4000 + 30036c4: 02478713 addi a4,a5,36 # 4000024 + 30036c8: 02400793 li a5,36 + 30036cc: 02f687b3 mul a5,a3,a5 + 30036d0: 97ba add a5,a5,a4 + 30036d2: 479c lw a5,8(a5) + 30036d4: e399 bnez a5,30036da + return BASE_STATUS_ERROR; + 30036d6: 4785 li a5,1 + 30036d8: a025 j 3003700 + } + g_ipClkProc[p->type].enableSet(p, enable); + 30036da: fec42783 lw a5,-20(s0) + 30036de: 43d4 lw a3,4(a5) + 30036e0: 040007b7 lui a5,0x4000 + 30036e4: 02478713 addi a4,a5,36 # 4000024 + 30036e8: 02400793 li a5,36 + 30036ec: 02f687b3 mul a5,a3,a5 + 30036f0: 97ba add a5,a5,a4 + 30036f2: 479c lw a5,8(a5) + 30036f4: fd842583 lw a1,-40(s0) + 30036f8: fec42503 lw a0,-20(s0) + 30036fc: 9782 jalr a5 + return BASE_STATUS_OK; + 30036fe: 4781 li a5,0 +} + 3003700: 853e mv a0,a5 + 3003702: 50b2 lw ra,44(sp) + 3003704: 5422 lw s0,40(sp) + 3003706: 6145 addi sp,sp,48 + 3003708: 8082 ret + +0300370a : + * @param select clock select, @see CRG_APBLsClkSelect for ip in apb_ls_subsys or CRG_AdcClkSelect for adc + * @retval BASE_STATUS_OK success + * @retval BASE_STATUS_ERROR fail + */ +BASE_StatusType HAL_CRG_IpClkSelectSet(const void *baseAddress, unsigned int select) +{ + 300370a: 7179 addi sp,sp,-48 + 300370c: d606 sw ra,44(sp) + 300370e: d422 sw s0,40(sp) + 3003710: 1800 addi s0,sp,48 + 3003712: fca42e23 sw a0,-36(s0) + 3003716: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 300371a: fdc42783 lw a5,-36(s0) + 300371e: eb89 bnez a5,3003730 + 3003720: 1cd00593 li a1,461 + 3003724: 030077b7 lui a5,0x3007 + 3003728: 8a478513 addi a0,a5,-1884 # 30068a4 + 300372c: 2d8d jal ra,3003d9e + 300372e: a001 j 300372e + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003730: 040007b7 lui a5,0x4000 + 3003734: 4947a703 lw a4,1172(a5) # 4000494 + 3003738: 100007b7 lui a5,0x10000 + 300373c: 00f70a63 beq a4,a5,3003750 + 3003740: 1ce00593 li a1,462 + 3003744: 030077b7 lui a5,0x3007 + 3003748: 8a478513 addi a0,a5,-1884 # 30068a4 + 300374c: 2d89 jal ra,3003d9e + 300374e: a001 j 300374e + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003750: fdc42503 lw a0,-36(s0) + 3003754: 220d jal ra,3003876 + 3003756: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 300375a: fec42783 lw a5,-20(s0) + 300375e: c799 beqz a5,300376c + 3003760: fec42783 lw a5,-20(s0) + 3003764: 43d8 lw a4,4(a5) + 3003766: 4795 li a5,5 + 3003768: 00e7f463 bgeu a5,a4,3003770 + return BASE_STATUS_ERROR; + 300376c: 4785 li a5,1 + 300376e: a0a1 j 30037b6 + } + if (g_ipClkProc[p->type].clkSelSet == NULL) { + 3003770: fec42783 lw a5,-20(s0) + 3003774: 43d4 lw a3,4(a5) + 3003776: 040007b7 lui a5,0x4000 + 300377a: 02478713 addi a4,a5,36 # 4000024 + 300377e: 02400793 li a5,36 + 3003782: 02f687b3 mul a5,a3,a5 + 3003786: 97ba add a5,a5,a4 + 3003788: 47dc lw a5,12(a5) + 300378a: e399 bnez a5,3003790 + return BASE_STATUS_ERROR; + 300378c: 4785 li a5,1 + 300378e: a025 j 30037b6 + } + g_ipClkProc[p->type].clkSelSet(p, select); /* Clock selection of the configuration module. */ + 3003790: fec42783 lw a5,-20(s0) + 3003794: 43d4 lw a3,4(a5) + 3003796: 040007b7 lui a5,0x4000 + 300379a: 02478713 addi a4,a5,36 # 4000024 + 300379e: 02400793 li a5,36 + 30037a2: 02f687b3 mul a5,a3,a5 + 30037a6: 97ba add a5,a5,a4 + 30037a8: 47dc lw a5,12(a5) + 30037aa: fd842583 lw a1,-40(s0) + 30037ae: fec42503 lw a0,-20(s0) + 30037b2: 9782 jalr a5 + return BASE_STATUS_OK; + 30037b4: 4781 li a5,0 +} + 30037b6: 853e mv a0,a5 + 30037b8: 50b2 lw ra,44(sp) + 30037ba: 5422 lw s0,40(sp) + 30037bc: 6145 addi sp,sp,48 + 30037be: 8082 ret + +030037c0 : + * @param div set div value + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Match Fail or Not support + */ +BASE_StatusType HAL_CRG_IpClkDivSet(const void *baseAddress, unsigned int div) +{ + 30037c0: 7179 addi sp,sp,-48 + 30037c2: d606 sw ra,44(sp) + 30037c4: d422 sw s0,40(sp) + 30037c6: 1800 addi s0,sp,48 + 30037c8: fca42e23 sw a0,-36(s0) + 30037cc: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 30037d0: fdc42783 lw a5,-36(s0) + 30037d4: eb89 bnez a5,30037e6 + 30037d6: 22c00593 li a1,556 + 30037da: 030077b7 lui a5,0x3007 + 30037de: 8a478513 addi a0,a5,-1884 # 30068a4 + 30037e2: 2b75 jal ra,3003d9e + 30037e4: a001 j 30037e4 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30037e6: 040007b7 lui a5,0x4000 + 30037ea: 4947a703 lw a4,1172(a5) # 4000494 + 30037ee: 100007b7 lui a5,0x10000 + 30037f2: 00f70a63 beq a4,a5,3003806 + 30037f6: 22d00593 li a1,557 + 30037fa: 030077b7 lui a5,0x3007 + 30037fe: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003802: 2b71 jal ra,3003d9e + 3003804: a001 j 3003804 + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003806: fdc42503 lw a0,-36(s0) + 300380a: 20b5 jal ra,3003876 + 300380c: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 3003810: fec42783 lw a5,-20(s0) + 3003814: c799 beqz a5,3003822 + 3003816: fec42783 lw a5,-20(s0) + 300381a: 43d8 lw a4,4(a5) + 300381c: 4795 li a5,5 + 300381e: 00e7f463 bgeu a5,a4,3003826 + return BASE_STATUS_ERROR; + 3003822: 4785 li a5,1 + 3003824: a0a1 j 300386c + } + if (g_ipClkProc[p->type].clkDivSet == NULL) { + 3003826: fec42783 lw a5,-20(s0) + 300382a: 43d4 lw a3,4(a5) + 300382c: 040007b7 lui a5,0x4000 + 3003830: 02478713 addi a4,a5,36 # 4000024 + 3003834: 02400793 li a5,36 + 3003838: 02f687b3 mul a5,a3,a5 + 300383c: 97ba add a5,a5,a4 + 300383e: 4b9c lw a5,16(a5) + 3003840: e399 bnez a5,3003846 + return BASE_STATUS_ERROR; + 3003842: 4785 li a5,1 + 3003844: a025 j 300386c + } + g_ipClkProc[p->type].clkDivSet(p, div); /* Configure the clock frequency divider of the module. */ + 3003846: fec42783 lw a5,-20(s0) + 300384a: 43d4 lw a3,4(a5) + 300384c: 040007b7 lui a5,0x4000 + 3003850: 02478713 addi a4,a5,36 # 4000024 + 3003854: 02400793 li a5,36 + 3003858: 02f687b3 mul a5,a3,a5 + 300385c: 97ba add a5,a5,a4 + 300385e: 4b9c lw a5,16(a5) + 3003860: fd842583 lw a1,-40(s0) + 3003864: fec42503 lw a0,-20(s0) + 3003868: 9782 jalr a5 + return BASE_STATUS_OK; + 300386a: 4781 li a5,0 +} + 300386c: 853e mv a0,a5 + 300386e: 50b2 lw ra,44(sp) + 3003870: 5422 lw s0,40(sp) + 3003872: 6145 addi sp,sp,48 + 3003874: 8082 ret + +03003876 : + 3003876: 933fd06f j 30011a8 + +0300387a : + * @param coreClkFreq core clock rate + * @retval Ip Frequence + */ +static unsigned int CRG_GetAdcIpFreq(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int baseClkRate, + unsigned int coreClkFreq) +{ + 300387a: 7139 addi sp,sp,-64 + 300387c: de06 sw ra,60(sp) + 300387e: dc22 sw s0,56(sp) + 3003880: 0080 addi s0,sp,64 + 3003882: fca42623 sw a0,-52(s0) + 3003886: fcb42423 sw a1,-56(s0) + 300388a: fcc42223 sw a2,-60(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300388e: fcc42783 lw a5,-52(s0) + 3003892: eb89 bnez a5,30038a4 + 3003894: 2af00593 li a1,687 + 3003898: 030077b7 lui a5,0x3007 + 300389c: 8a478513 addi a0,a5,-1884 # 30068a4 + 30038a0: 29fd jal ra,3003d9e + 30038a2: a001 j 30038a2 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30038a4: 040007b7 lui a5,0x4000 + 30038a8: 4947a783 lw a5,1172(a5) # 4000494 + 30038ac: eb89 bnez a5,30038be + 30038ae: 2b000593 li a1,688 + 30038b2: 030077b7 lui a5,0x3007 + 30038b6: 8a478513 addi a0,a5,-1884 # 30068a4 + 30038ba: 21d5 jal ra,3003d9e + 30038bc: a001 j 30038bc + + unsigned int clkSel; + unsigned int clkDiv; + unsigned int pst2Div; + unsigned int freq = 0; + 30038be: fe042623 sw zero,-20(s0) + + /* Obtains the clock source selection of the ADC. */ + const CRG_IpProc *proc = &g_ipClkProc[matchInfo->type]; + 30038c2: fcc42783 lw a5,-52(s0) + 30038c6: 43d8 lw a4,4(a5) + 30038c8: 02400793 li a5,36 + 30038cc: 02f70733 mul a4,a4,a5 + 30038d0: 040007b7 lui a5,0x4000 + 30038d4: 02478793 addi a5,a5,36 # 4000024 + 30038d8: 97ba add a5,a5,a4 + 30038da: fef42423 sw a5,-24(s0) + if (proc->clkSelGet == NULL) { + 30038de: fe842783 lw a5,-24(s0) + 30038e2: 4fdc lw a5,28(a5) + 30038e4: e399 bnez a5,30038ea + return 0; + 30038e6: 4781 li a5,0 + 30038e8: a07d j 3003996 + } + clkSel = proc->clkSelGet(matchInfo); + 30038ea: fe842783 lw a5,-24(s0) + 30038ee: 4fdc lw a5,28(a5) + 30038f0: fcc42503 lw a0,-52(s0) + 30038f4: 9782 jalr a5 + 30038f6: fea42223 sw a0,-28(s0) + /* Calculate the frequency from the ADC's clock source. */ + if (clkSel == CRG_ADC_CLK_SYN_CORE) { + 30038fa: fe442703 lw a4,-28(s0) + 30038fe: 478d li a5,3 + 3003900: 00f71763 bne a4,a5,300390e + freq = coreClkFreq; + 3003904: fc442783 lw a5,-60(s0) + 3003908: fef42623 sw a5,-20(s0) + 300390c: a085 j 300396c + } else if (clkSel == CRG_ADC_CLK_ASYN_HOSC) { + 300390e: fe442783 lw a5,-28(s0) + 3003912: eb81 bnez a5,3003922 + freq = HOSC_FREQ; + 3003914: 017d87b7 lui a5,0x17d8 + 3003918: 84078793 addi a5,a5,-1984 # 17d7840 + 300391c: fef42623 sw a5,-20(s0) + 3003920: a0b1 j 300396c + } else if (clkSel == CRG_ADC_CLK_ASYN_TCXO) { + 3003922: fe442703 lw a4,-28(s0) + 3003926: 4785 li a5,1 + 3003928: 00f71963 bne a4,a5,300393a + /* The maximum speed of the external clock source is 30000000U. */ + freq = (XTRAIL_FREQ > 30000000U) ? 0 : XTRAIL_FREQ; + 300392c: 01c9c7b7 lui a5,0x1c9c + 3003930: 38078793 addi a5,a5,896 # 1c9c380 + 3003934: fef42623 sw a5,-20(s0) + 3003938: a815 j 300396c + } else if (clkSel == CRG_ADC_CLK_ASYN_PLL_DIV) { + 300393a: fe442703 lw a4,-28(s0) + 300393e: 4789 li a5,2 + 3003940: 02f71663 bne a4,a5,300396c + pst2Div = CRG_GetPllPostDivValue((CRG_PllPostDiv)g_crgBaseAddr->PERI_CRG3.BIT.pll_postdiv2); + 3003944: 040007b7 lui a5,0x4000 + 3003948: 4947a783 lw a5,1172(a5) # 4000494 + 300394c: 47dc lw a5,12(a5) + 300394e: 8391 srli a5,a5,0x4 + 3003950: 8bbd andi a5,a5,15 + 3003952: 9f81 uxtb a5 + 3003954: 853e mv a0,a5 + 3003956: 2ae5 jal ra,3003b4e + 3003958: fea42023 sw a0,-32(s0) + freq = baseClkRate / pst2Div; + 300395c: fc842703 lw a4,-56(s0) + 3003960: fe042783 lw a5,-32(s0) + 3003964: 02f757b3 divu a5,a4,a5 + 3003968: fef42623 sw a5,-20(s0) + } + + /* Obtain the frequency divider based on the ADC clock source. */ + if (proc->clkDivGet == NULL) { + 300396c: fe842783 lw a5,-24(s0) + 3003970: 539c lw a5,32(a5) + 3003972: e399 bnez a5,3003978 + return 0; + 3003974: 4781 li a5,0 + 3003976: a005 j 3003996 + } + clkDiv = proc->clkDivGet(matchInfo); + 3003978: fe842783 lw a5,-24(s0) + 300397c: 539c lw a5,32(a5) + 300397e: fcc42503 lw a0,-52(s0) + 3003982: 9782 jalr a5 + 3003984: fca42e23 sw a0,-36(s0) + /* Calculate the clock frequency of the ADC. */ + return (freq / (clkDiv + 1)); + 3003988: fdc42783 lw a5,-36(s0) + 300398c: 0785 addi a5,a5,1 + 300398e: fec42703 lw a4,-20(s0) + 3003992: 02f757b3 divu a5,a4,a5 +} + 3003996: 853e mv a0,a5 + 3003998: 50f2 lw ra,60(sp) + 300399a: 5462 lw s0,56(sp) + 300399c: 6121 addi sp,sp,64 + 300399e: 8082 ret + +030039a0 : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValidPllConfig(const CRG_Handle *handle) +{ + 30039a0: 7179 addi sp,sp,-48 + 30039a2: d606 sw ra,44(sp) + 30039a4: d422 sw s0,40(sp) + 30039a6: 1800 addi s0,sp,48 + 30039a8: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + unsigned int freq; + + freq = CRG_GetPllRefIni(handle->pllRefClkSelect); + 30039ac: fdc42783 lw a5,-36(s0) + 30039b0: 43dc lw a5,4(a5) + 30039b2: 853e mv a0,a5 + 30039b4: 2201 jal ra,3003ab4 + 30039b6: fea42623 sw a0,-20(s0) + preDiv = CRG_GetPreDivValue(handle->pllPreDiv); + 30039ba: fdc42783 lw a5,-36(s0) + 30039be: 479c lw a5,8(a5) + 30039c0: 853e mv a0,a5 + 30039c2: 2a31 jal ra,3003ade + 30039c4: fea42423 sw a0,-24(s0) + /* Check the validity of the prescaled clock frequency. */ + if (!IsCrgValidPreDiv(freq, preDiv)) { + 30039c8: fe842583 lw a1,-24(s0) + 30039cc: fec42503 lw a0,-20(s0) + 30039d0: c26ff0ef jal ra,3002df6 + 30039d4: 87aa mv a5,a0 + 30039d6: 0017c793 xori a5,a5,1 + 30039da: 9f81 uxtb a5 + 30039dc: c399 beqz a5,30039e2 + return BASE_STATUS_ERROR; + 30039de: 4785 li a5,1 + 30039e0: a8a5 j 3003a58 + } + freq /= preDiv; + 30039e2: fec42703 lw a4,-20(s0) + 30039e6: fe842783 lw a5,-24(s0) + 30039ea: 02f757b3 divu a5,a4,a5 + 30039ee: fef42623 sw a5,-20(s0) + /* Check the validity of the clock frequency after frequency multiplication. */ + if (!IsCrgValidFdDiv(freq, handle->pllFbDiv)) { + 30039f2: fdc42783 lw a5,-36(s0) + 30039f6: 47dc lw a5,12(a5) + 30039f8: 85be mv a1,a5 + 30039fa: fec42503 lw a0,-20(s0) + 30039fe: c56ff0ef jal ra,3002e54 + 3003a02: 87aa mv a5,a0 + 3003a04: 0017c793 xori a5,a5,1 + 3003a08: 9f81 uxtb a5 + 3003a0a: c399 beqz a5,3003a10 + return BASE_STATUS_ERROR; + 3003a0c: 4785 li a5,1 + 3003a0e: a0a9 j 3003a58 + } + freq *= (handle->pllFbDiv > 0x06) ? handle->pllFbDiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 3003a10: fdc42783 lw a5,-36(s0) + 3003a14: 47dc lw a5,12(a5) + 3003a16: 4719 li a4,6 + 3003a18: 00e7f363 bgeu a5,a4,3003a1e + 3003a1c: 4799 li a5,6 + 3003a1e: fec42703 lw a4,-20(s0) + 3003a22: 02f707b3 mul a5,a4,a5 + 3003a26: fef42623 sw a5,-20(s0) + /* Check whether the PLL output frequency is valid. */ + if (IsCrgValidPostDiv(freq, handle->pllPostDiv) && IsCrgValidPostDiv2(freq, handle->handleEx.pllPostDiv2)) { + 3003a2a: fdc42783 lw a5,-36(s0) + 3003a2e: 4b9c lw a5,16(a5) + 3003a30: 85be mv a1,a5 + 3003a32: fec42503 lw a0,-20(s0) + 3003a36: ca8ff0ef jal ra,3002ede + 3003a3a: 87aa mv a5,a0 + 3003a3c: cf89 beqz a5,3003a56 + 3003a3e: fdc42783 lw a5,-36(s0) + 3003a42: 4fdc lw a5,28(a5) + 3003a44: 85be mv a1,a5 + 3003a46: fec42503 lw a0,-20(s0) + 3003a4a: cdcff0ef jal ra,3002f26 + 3003a4e: 87aa mv a5,a0 + 3003a50: c399 beqz a5,3003a56 + return BASE_STATUS_OK; + 3003a52: 4781 li a5,0 + 3003a54: a011 j 3003a58 + } + return BASE_STATUS_ERROR; + 3003a56: 4785 li a5,1 +} + 3003a58: 853e mv a0,a5 + 3003a5a: 50b2 lw ra,44(sp) + 3003a5c: 5422 lw s0,40(sp) + 3003a5e: 6145 addi sp,sp,48 + 3003a60: 8082 ret + +03003a62 : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValid1MHzConfig(const CRG_Handle *handle) +{ + 3003a62: 7179 addi sp,sp,-48 + 3003a64: d622 sw s0,44(sp) + 3003a66: 1800 addi s0,sp,48 + 3003a68: fca42e23 sw a0,-36(s0) + unsigned int freq; + /* Get the ref frequency of the 1 MHz clock. */ + freq = (handle->handleEx.clk1MSelect == CRG_1M_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003a6c: fdc42783 lw a5,-36(s0) + 3003a70: 539c lw a5,32(a5) + 3003a72: e791 bnez a5,3003a7e + 3003a74: 017d87b7 lui a5,0x17d8 + 3003a78: 84078793 addi a5,a5,-1984 # 17d7840 + 3003a7c: a029 j 3003a86 + 3003a7e: 01c9c7b7 lui a5,0x1c9c + 3003a82: 38078793 addi a5,a5,896 # 1c9c380 + 3003a86: fef42623 sw a5,-20(s0) + /* Check whether the 1MHz output frequency is valid. */ + if ((freq / (handle->handleEx.clk1MDiv + 1)) == CRG_FREQ_1MHz) { + 3003a8a: fdc42783 lw a5,-36(s0) + 3003a8e: 53dc lw a5,36(a5) + 3003a90: 0785 addi a5,a5,1 + 3003a92: fec42703 lw a4,-20(s0) + 3003a96: 02f75733 divu a4,a4,a5 + 3003a9a: 000f47b7 lui a5,0xf4 + 3003a9e: 24078793 addi a5,a5,576 # f4240 + 3003aa2: 00f71463 bne a4,a5,3003aaa + return BASE_STATUS_OK; + 3003aa6: 4781 li a5,0 + 3003aa8: a011 j 3003aac + } + return BASE_STATUS_ERROR; + 3003aaa: 4785 li a5,1 +} + 3003aac: 853e mv a0,a5 + 3003aae: 5432 lw s0,44(sp) + 3003ab0: 6145 addi sp,sp,48 + 3003ab2: 8082 ret + +03003ab4 : + * @brief Get clock frequence + * @param crg CRG_RegStruct + * @retval The frequence fo clock + */ +static inline unsigned int CRG_GetPllRefIni(CRG_PllRefClkSelect pllRefClkSelect) +{ + 3003ab4: 1101 addi sp,sp,-32 + 3003ab6: ce22 sw s0,28(sp) + 3003ab8: 1000 addi s0,sp,32 + 3003aba: fea42623 sw a0,-20(s0) + /* The maximum speed of the external clock source is 30000000U. */ + if (pllRefClkSelect == CRG_PLL_REF_CLK_SELECT_XTAL && XTRAIL_FREQ > 30000000U) { + return 0; + } + return (pllRefClkSelect == (unsigned int)CRG_PLL_REF_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003abe: fec42783 lw a5,-20(s0) + 3003ac2: e791 bnez a5,3003ace + 3003ac4: 017d87b7 lui a5,0x17d8 + 3003ac8: 84078793 addi a5,a5,-1984 # 17d7840 + 3003acc: a029 j 3003ad6 + 3003ace: 01c9c7b7 lui a5,0x1c9c + 3003ad2: 38078793 addi a5,a5,896 # 1c9c380 +} + 3003ad6: 853e mv a0,a5 + 3003ad8: 4472 lw s0,28(sp) + 3003ada: 6105 addi sp,sp,32 + 3003adc: 8082 ret + +03003ade : + * @brief Get previous division Value before PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPreDivValue(CRG_PllPreDiv pllPredDiv) +{ + 3003ade: 7179 addi sp,sp,-48 + 3003ae0: d622 sw s0,44(sp) + 3003ae2: 1800 addi s0,sp,48 + 3003ae4: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + if (pllPredDiv <= CRG_PLL_PREDIV_1) { /* 0 or 1 returns PLL_PREDIV_OUT_1. */ + 3003ae8: fdc42783 lw a5,-36(s0) + 3003aec: e789 bnez a5,3003af6 + preDiv = PLL_PREDIV_OUT_1; + 3003aee: 4785 li a5,1 + 3003af0: fef42623 sw a5,-20(s0) + 3003af4: a031 j 3003b00 + } else { + preDiv = pllPredDiv + 1; + 3003af6: fdc42783 lw a5,-36(s0) + 3003afa: 0785 addi a5,a5,1 + 3003afc: fef42623 sw a5,-20(s0) + } + return preDiv; + 3003b00: fec42783 lw a5,-20(s0) +} + 3003b04: 853e mv a0,a5 + 3003b06: 5432 lw s0,44(sp) + 3003b08: 6145 addi sp,sp,48 + 3003b0a: 8082 ret + +03003b0c : + * @brief Get PLL loop divider ratio + * @param crg CRG_RegStruct + * @retval PLL loop divider ratio + */ +static inline unsigned int CRG_GetPllFbDivValue(unsigned int pllFbDiv) +{ + 3003b0c: 7179 addi sp,sp,-48 + 3003b0e: d622 sw s0,44(sp) + 3003b10: 1800 addi s0,sp,48 + 3003b12: fca42e23 sw a0,-36(s0) + unsigned int div = pllFbDiv; + 3003b16: fdc42783 lw a5,-36(s0) + 3003b1a: fef42623 sw a5,-20(s0) + /* Check the validity of the minimum frequency multiplication parameter. */ + if (div < CRG_PLL_FBDIV_MIN) { + 3003b1e: fec42703 lw a4,-20(s0) + 3003b22: 4795 li a5,5 + 3003b24: 00e7e563 bltu a5,a4,3003b2e + div = CRG_PLL_FBDIV_MIN; + 3003b28: 4799 li a5,6 + 3003b2a: fef42623 sw a5,-20(s0) + } + /* Check the validity of the maximum frequency multiplication parameter. */ + if (div > CRG_PLL_FBDIV_MAX) { + 3003b2e: fec42703 lw a4,-20(s0) + 3003b32: 07f00793 li a5,127 + 3003b36: 00e7f663 bgeu a5,a4,3003b42 + div = CRG_PLL_FBDIV_MAX; + 3003b3a: 07f00793 li a5,127 + 3003b3e: fef42623 sw a5,-20(s0) + } + return div; + 3003b42: fec42783 lw a5,-20(s0) +} + 3003b46: 853e mv a0,a5 + 3003b48: 5432 lw s0,44(sp) + 3003b4a: 6145 addi sp,sp,48 + 3003b4c: 8082 ret + +03003b4e : + * @brief Get post division Value after PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPllPostDivValue(unsigned int pllPostDiv) +{ + 3003b4e: 7179 addi sp,sp,-48 + 3003b50: d622 sw s0,44(sp) + 3003b52: 1800 addi s0,sp,48 + 3003b54: fca42e23 sw a0,-36(s0) + unsigned int div = pllPostDiv; + 3003b58: fdc42783 lw a5,-36(s0) + 3003b5c: fef42623 sw a5,-20(s0) + if (div > CRG_PLL_POSTDIV_8) { + 3003b60: fec42703 lw a4,-20(s0) + 3003b64: 479d li a5,7 + 3003b66: 00e7f663 bgeu a5,a4,3003b72 + div = (CRG_PLL_POSTDIV_8 + 1); /* If the postdiv is greater than 8, set this postdiv to 8. */ + 3003b6a: 47a1 li a5,8 + 3003b6c: fef42623 sw a5,-20(s0) + 3003b70: a031 j 3003b7c + } else { + div += 1; + 3003b72: fec42783 lw a5,-20(s0) + 3003b76: 0785 addi a5,a5,1 + 3003b78: fef42623 sw a5,-20(s0) + } + return div; + 3003b7c: fec42783 lw a5,-20(s0) +} + 3003b80: 853e mv a0,a5 + 3003b82: 5432 lw s0,44(sp) + 3003b84: 6145 addi sp,sp,48 + 3003b86: 8082 ret + +03003b88 : + * @param matchInfo IP without Clock select match info + * @param enable BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003b88: 7179 addi sp,sp,-48 + 3003b8a: d606 sw ra,44(sp) + 3003b8c: d422 sw s0,40(sp) + 3003b8e: 1800 addi s0,sp,48 + 3003b90: fca42e23 sw a0,-36(s0) + 3003b94: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003b98: fdc42783 lw a5,-36(s0) + 3003b9c: eb89 bnez a5,3003bae + 3003b9e: 34d00593 li a1,845 + 3003ba2: 030077b7 lui a5,0x3007 + 3003ba6: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003baa: 2ad5 jal ra,3003d9e + 3003bac: a001 j 3003bac + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003bae: 040007b7 lui a5,0x4000 + 3003bb2: 4947a783 lw a5,1172(a5) # 4000494 + 3003bb6: eb89 bnez a5,3003bc8 + 3003bb8: 34e00593 li a1,846 + 3003bbc: 030077b7 lui a5,0x3007 + 3003bc0: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003bc4: 2ae9 jal ra,3003d9e + 3003bc6: a001 j 3003bc6 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003bc8: 040007b7 lui a5,0x4000 + 3003bcc: 4947a783 lw a5,1172(a5) # 4000494 + 3003bd0: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003bd4: fdc42783 lw a5,-36(s0) + 3003bd8: 279e lhu a5,8(a5) + 3003bda: 873e mv a4,a5 + 3003bdc: fec42783 lw a5,-20(s0) + 3003be0: 97ba add a5,a5,a4 + 3003be2: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003be6: fe842783 lw a5,-24(s0) + 3003bea: 439c lw a5,0(a5) + 3003bec: fef42223 sw a5,-28(s0) + if (enable & IP_CLK_ENABLE) { /* Set enable of target ip. */ + 3003bf0: fd842783 lw a5,-40(s0) + 3003bf4: 8b85 andi a5,a5,1 + 3003bf6: c7c1 beqz a5,3003c7e + cfg.BIT.clkEnMask |= 1 << matchInfo->bitOffset; + 3003bf8: fe442783 lw a5,-28(s0) + 3003bfc: 9fa1 uxth a5 + 3003bfe: 01079713 slli a4,a5,0x10 + 3003c02: 8741 srai a4,a4,0x10 + 3003c04: fdc42783 lw a5,-36(s0) + 3003c08: 27bc lbu a5,10(a5) + 3003c0a: 86be mv a3,a5 + 3003c0c: 4785 li a5,1 + 3003c0e: 00d797b3 sll a5,a5,a3 + 3003c12: 07c2 slli a5,a5,0x10 + 3003c14: 87c1 srai a5,a5,0x10 + 3003c16: 8fd9 or a5,a5,a4 + 3003c18: 07c2 slli a5,a5,0x10 + 3003c1a: 87c1 srai a5,a5,0x10 + 3003c1c: 01079693 slli a3,a5,0x10 + 3003c20: 82c1 srli a3,a3,0x10 + 3003c22: fe442783 lw a5,-28(s0) + 3003c26: 6741 lui a4,0x10 + 3003c28: 177d addi a4,a4,-1 # ffff + 3003c2a: 8f75 and a4,a4,a3 + 3003c2c: 76c1 lui a3,0xffff0 + 3003c2e: 8ff5 and a5,a5,a3 + 3003c30: 8fd9 or a5,a5,a4 + 3003c32: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); + 3003c36: fe442783 lw a5,-28(s0) + 3003c3a: 83c1 srli a5,a5,0x10 + 3003c3c: 9fa1 uxth a5 + 3003c3e: 01079713 slli a4,a5,0x10 + 3003c42: 8741 srai a4,a4,0x10 + 3003c44: fdc42783 lw a5,-36(s0) + 3003c48: 27bc lbu a5,10(a5) + 3003c4a: 86be mv a3,a5 + 3003c4c: 4785 li a5,1 + 3003c4e: 00d797b3 sll a5,a5,a3 + 3003c52: 07c2 slli a5,a5,0x10 + 3003c54: 87c1 srai a5,a5,0x10 + 3003c56: fff7c793 not a5,a5 + 3003c5a: 07c2 slli a5,a5,0x10 + 3003c5c: 87c1 srai a5,a5,0x10 + 3003c5e: 8ff9 and a5,a5,a4 + 3003c60: 07c2 slli a5,a5,0x10 + 3003c62: 87c1 srai a5,a5,0x10 + 3003c64: 01079713 slli a4,a5,0x10 + 3003c68: 8341 srli a4,a4,0x10 + 3003c6a: fe442783 lw a5,-28(s0) + 3003c6e: 0742 slli a4,a4,0x10 + 3003c70: 66c1 lui a3,0x10 + 3003c72: 16fd addi a3,a3,-1 # ffff + 3003c74: 8ff5 and a5,a5,a3 + 3003c76: 8fd9 or a5,a5,a4 + 3003c78: fef42223 sw a5,-28(s0) + 3003c7c: a059 j 3003d02 + } else { + cfg.BIT.clkEnMask &= ~(1 << matchInfo->bitOffset); /* Disable of target ip. */ + 3003c7e: fe442783 lw a5,-28(s0) + 3003c82: 9fa1 uxth a5 + 3003c84: 01079713 slli a4,a5,0x10 + 3003c88: 8741 srai a4,a4,0x10 + 3003c8a: fdc42783 lw a5,-36(s0) + 3003c8e: 27bc lbu a5,10(a5) + 3003c90: 86be mv a3,a5 + 3003c92: 4785 li a5,1 + 3003c94: 00d797b3 sll a5,a5,a3 + 3003c98: 07c2 slli a5,a5,0x10 + 3003c9a: 87c1 srai a5,a5,0x10 + 3003c9c: fff7c793 not a5,a5 + 3003ca0: 07c2 slli a5,a5,0x10 + 3003ca2: 87c1 srai a5,a5,0x10 + 3003ca4: 8ff9 and a5,a5,a4 + 3003ca6: 07c2 slli a5,a5,0x10 + 3003ca8: 87c1 srai a5,a5,0x10 + 3003caa: 01079693 slli a3,a5,0x10 + 3003cae: 82c1 srli a3,a3,0x10 + 3003cb0: fe442783 lw a5,-28(s0) + 3003cb4: 6741 lui a4,0x10 + 3003cb6: 177d addi a4,a4,-1 # ffff + 3003cb8: 8f75 and a4,a4,a3 + 3003cba: 76c1 lui a3,0xffff0 + 3003cbc: 8ff5 and a5,a5,a3 + 3003cbe: 8fd9 or a5,a5,a4 + 3003cc0: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq |= (1 << matchInfo->bitOffset); + 3003cc4: fe442783 lw a5,-28(s0) + 3003cc8: 83c1 srli a5,a5,0x10 + 3003cca: 9fa1 uxth a5 + 3003ccc: 01079713 slli a4,a5,0x10 + 3003cd0: 8741 srai a4,a4,0x10 + 3003cd2: fdc42783 lw a5,-36(s0) + 3003cd6: 27bc lbu a5,10(a5) + 3003cd8: 86be mv a3,a5 + 3003cda: 4785 li a5,1 + 3003cdc: 00d797b3 sll a5,a5,a3 + 3003ce0: 07c2 slli a5,a5,0x10 + 3003ce2: 87c1 srai a5,a5,0x10 + 3003ce4: 8fd9 or a5,a5,a4 + 3003ce6: 07c2 slli a5,a5,0x10 + 3003ce8: 87c1 srai a5,a5,0x10 + 3003cea: 01079713 slli a4,a5,0x10 + 3003cee: 8341 srli a4,a4,0x10 + 3003cf0: fe442783 lw a5,-28(s0) + 3003cf4: 0742 slli a4,a4,0x10 + 3003cf6: 66c1 lui a3,0x10 + 3003cf8: 16fd addi a3,a3,-1 # ffff + 3003cfa: 8ff5 and a5,a5,a3 + 3003cfc: 8fd9 or a5,a5,a4 + 3003cfe: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3003d02: fe442703 lw a4,-28(s0) + 3003d06: fe842783 lw a5,-24(s0) + 3003d0a: c398 sw a4,0(a5) +} + 3003d0c: 0001 nop + 3003d0e: 50b2 lw ra,44(sp) + 3003d10: 5422 lw s0,40(sp) + 3003d12: 6145 addi sp,sp,48 + 3003d14: 8082 ret + +03003d16 : + * @brief Get Enable status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock Enable status + */ +static unsigned int CRG_IpWoClkSelEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003d16: 7179 addi sp,sp,-48 + 3003d18: d606 sw ra,44(sp) + 3003d1a: d422 sw s0,40(sp) + 3003d1c: 1800 addi s0,sp,48 + 3003d1e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003d22: fdc42783 lw a5,-36(s0) + 3003d26: eb89 bnez a5,3003d38 + 3003d28: 36500593 li a1,869 + 3003d2c: 030077b7 lui a5,0x3007 + 3003d30: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003d34: 20ad jal ra,3003d9e + 3003d36: a001 j 3003d36 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003d38: 040007b7 lui a5,0x4000 + 3003d3c: 4947a783 lw a5,1172(a5) # 4000494 + 3003d40: eb89 bnez a5,3003d52 + 3003d42: 36600593 li a1,870 + 3003d46: 030077b7 lui a5,0x3007 + 3003d4a: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003d4e: 2881 jal ra,3003d9e + 3003d50: a001 j 3003d50 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003d52: 040007b7 lui a5,0x4000 + 3003d56: 4947a783 lw a5,1172(a5) # 4000494 + 3003d5a: fef42623 sw a5,-20(s0) + /* Get enable status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003d5e: fdc42783 lw a5,-36(s0) + 3003d62: 279e lhu a5,8(a5) + 3003d64: 873e mv a4,a5 + 3003d66: fec42783 lw a5,-20(s0) + 3003d6a: 97ba add a5,a5,a4 + 3003d6c: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + + cfg.value = p->value; + 3003d70: fe842783 lw a5,-24(s0) + 3003d74: 439c lw a5,0(a5) + 3003d76: fef42223 sw a5,-28(s0) + return (cfg.BIT.clkEnMask & (1 << matchInfo->bitOffset)) == 0 ? false : true; + 3003d7a: fe442783 lw a5,-28(s0) + 3003d7e: 9fa1 uxth a5 + 3003d80: 873e mv a4,a5 + 3003d82: fdc42783 lw a5,-36(s0) + 3003d86: 27bc lbu a5,10(a5) + 3003d88: 40f757b3 sra a5,a4,a5 + 3003d8c: 8b85 andi a5,a5,1 + 3003d8e: 00f037b3 snez a5,a5 + 3003d92: 9f81 uxtb a5 +} + 3003d94: 853e mv a0,a5 + 3003d96: 50b2 lw ra,44(sp) + 3003d98: 5422 lw s0,40(sp) + 3003d9a: 6145 addi sp,sp,48 + 3003d9c: 8082 ret + +03003d9e : + 3003d9e: c48fe06f j 30021e6 + +03003da2 : + * @param matchInfo IP without Clock select match info + * @param reset BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelResetSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int reset) +{ + 3003da2: 7179 addi sp,sp,-48 + 3003da4: d606 sw ra,44(sp) + 3003da6: d422 sw s0,40(sp) + 3003da8: 1800 addi s0,sp,48 + 3003daa: fca42e23 sw a0,-36(s0) + 3003dae: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003db2: fdc42783 lw a5,-36(s0) + 3003db6: eb89 bnez a5,3003dc8 + 3003db8: 37900593 li a1,889 + 3003dbc: 030077b7 lui a5,0x3007 + 3003dc0: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003dc4: 3fe9 jal ra,3003d9e + 3003dc6: a001 j 3003dc6 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003dc8: 040007b7 lui a5,0x4000 + 3003dcc: 4947a783 lw a5,1172(a5) # 4000494 + 3003dd0: eb89 bnez a5,3003de2 + 3003dd2: 37a00593 li a1,890 + 3003dd6: 030077b7 lui a5,0x3007 + 3003dda: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003dde: 37c1 jal ra,3003d9e + 3003de0: a001 j 3003de0 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003de2: 040007b7 lui a5,0x4000 + 3003de6: 4947a783 lw a5,1172(a5) # 4000494 + 3003dea: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003dee: fdc42783 lw a5,-36(s0) + 3003df2: 279e lhu a5,8(a5) + 3003df4: 873e mv a4,a5 + 3003df6: fec42783 lw a5,-20(s0) + 3003dfa: 97ba add a5,a5,a4 + 3003dfc: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003e00: fe842783 lw a5,-24(s0) + 3003e04: 439c lw a5,0(a5) + 3003e06: fef42223 sw a5,-28(s0) + if (reset & BASE_CFG_SET) { + 3003e0a: fd842783 lw a5,-40(s0) + 3003e0e: 8b85 andi a5,a5,1 + 3003e10: c3a9 beqz a5,3003e52 + cfg.BIT.softResetReq |= 1 << matchInfo->bitOffset; /* reset of target ip. */ + 3003e12: fe442783 lw a5,-28(s0) + 3003e16: 83c1 srli a5,a5,0x10 + 3003e18: 9fa1 uxth a5 + 3003e1a: 01079713 slli a4,a5,0x10 + 3003e1e: 8741 srai a4,a4,0x10 + 3003e20: fdc42783 lw a5,-36(s0) + 3003e24: 27bc lbu a5,10(a5) + 3003e26: 86be mv a3,a5 + 3003e28: 4785 li a5,1 + 3003e2a: 00d797b3 sll a5,a5,a3 + 3003e2e: 07c2 slli a5,a5,0x10 + 3003e30: 87c1 srai a5,a5,0x10 + 3003e32: 8fd9 or a5,a5,a4 + 3003e34: 07c2 slli a5,a5,0x10 + 3003e36: 87c1 srai a5,a5,0x10 + 3003e38: 01079713 slli a4,a5,0x10 + 3003e3c: 8341 srli a4,a4,0x10 + 3003e3e: fe442783 lw a5,-28(s0) + 3003e42: 0742 slli a4,a4,0x10 + 3003e44: 66c1 lui a3,0x10 + 3003e46: 16fd addi a3,a3,-1 # ffff + 3003e48: 8ff5 and a5,a5,a3 + 3003e4a: 8fd9 or a5,a5,a4 + 3003e4c: fef42223 sw a5,-28(s0) + 3003e50: a0a1 j 3003e98 + } else { + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); /* Undo reset of target ip. */ + 3003e52: fe442783 lw a5,-28(s0) + 3003e56: 83c1 srli a5,a5,0x10 + 3003e58: 9fa1 uxth a5 + 3003e5a: 01079713 slli a4,a5,0x10 + 3003e5e: 8741 srai a4,a4,0x10 + 3003e60: fdc42783 lw a5,-36(s0) + 3003e64: 27bc lbu a5,10(a5) + 3003e66: 86be mv a3,a5 + 3003e68: 4785 li a5,1 + 3003e6a: 00d797b3 sll a5,a5,a3 + 3003e6e: 07c2 slli a5,a5,0x10 + 3003e70: 87c1 srai a5,a5,0x10 + 3003e72: fff7c793 not a5,a5 + 3003e76: 07c2 slli a5,a5,0x10 + 3003e78: 87c1 srai a5,a5,0x10 + 3003e7a: 8ff9 and a5,a5,a4 + 3003e7c: 07c2 slli a5,a5,0x10 + 3003e7e: 87c1 srai a5,a5,0x10 + 3003e80: 01079713 slli a4,a5,0x10 + 3003e84: 8341 srli a4,a4,0x10 + 3003e86: fe442783 lw a5,-28(s0) + 3003e8a: 0742 slli a4,a4,0x10 + 3003e8c: 66c1 lui a3,0x10 + 3003e8e: 16fd addi a3,a3,-1 # ffff + 3003e90: 8ff5 and a5,a5,a3 + 3003e92: 8fd9 or a5,a5,a4 + 3003e94: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3003e98: fe442703 lw a4,-28(s0) + 3003e9c: fe842783 lw a5,-24(s0) + 3003ea0: c398 sw a4,0(a5) +} + 3003ea2: 0001 nop + 3003ea4: 50b2 lw ra,44(sp) + 3003ea6: 5422 lw s0,40(sp) + 3003ea8: 6145 addi sp,sp,48 + 3003eaa: 8082 ret + +03003eac : + * @brief Get Reset status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock select reset status + */ +static unsigned int CRG_IpWoClkSelResetGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003eac: 7179 addi sp,sp,-48 + 3003eae: d606 sw ra,44(sp) + 3003eb0: d422 sw s0,40(sp) + 3003eb2: 1800 addi s0,sp,48 + 3003eb4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003eb8: fdc42783 lw a5,-36(s0) + 3003ebc: eb89 bnez a5,3003ece + 3003ebe: 38f00593 li a1,911 + 3003ec2: 030077b7 lui a5,0x3007 + 3003ec6: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003eca: 3dd1 jal ra,3003d9e + 3003ecc: a001 j 3003ecc + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003ece: 040007b7 lui a5,0x4000 + 3003ed2: 4947a783 lw a5,1172(a5) # 4000494 + 3003ed6: eb89 bnez a5,3003ee8 + 3003ed8: 39000593 li a1,912 + 3003edc: 030077b7 lui a5,0x3007 + 3003ee0: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003ee4: 3d6d jal ra,3003d9e + 3003ee6: a001 j 3003ee6 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003ee8: 040007b7 lui a5,0x4000 + 3003eec: 4947a783 lw a5,1172(a5) # 4000494 + 3003ef0: fef42623 sw a5,-20(s0) + /* Get the reset status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003ef4: fdc42783 lw a5,-36(s0) + 3003ef8: 279e lhu a5,8(a5) + 3003efa: 873e mv a4,a5 + 3003efc: fec42783 lw a5,-20(s0) + 3003f00: 97ba add a5,a5,a4 + 3003f02: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003f06: fe842783 lw a5,-24(s0) + 3003f0a: 439c lw a5,0(a5) + 3003f0c: fef42223 sw a5,-28(s0) + return (cfg.BIT.softResetReq & (1 << matchInfo->bitOffset)) ? BASE_CFG_SET : BASE_CFG_UNSET; + 3003f10: fe442783 lw a5,-28(s0) + 3003f14: 83c1 srli a5,a5,0x10 + 3003f16: 9fa1 uxth a5 + 3003f18: 873e mv a4,a5 + 3003f1a: fdc42783 lw a5,-36(s0) + 3003f1e: 27bc lbu a5,10(a5) + 3003f20: 40f757b3 sra a5,a4,a5 + 3003f24: 8b85 andi a5,a5,1 + 3003f26: 00f037b3 snez a5,a5 + 3003f2a: 9f81 uxtb a5 +} + 3003f2c: 853e mv a0,a5 + 3003f2e: 50b2 lw ra,44(sp) + 3003f30: 5422 lw s0,40(sp) + 3003f32: 6145 addi sp,sp,48 + 3003f34: 8082 ret + +03003f36 : + * @param matchInfo ADC match info + * @param enable IP_CLK_ENABLE + * @retval None + */ +static void CRG_AdcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003f36: 7179 addi sp,sp,-48 + 3003f38: d606 sw ra,44(sp) + 3003f3a: d422 sw s0,40(sp) + 3003f3c: 1800 addi s0,sp,48 + 3003f3e: fca42e23 sw a0,-36(s0) + 3003f42: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003f46: fdc42783 lw a5,-36(s0) + 3003f4a: eb89 bnez a5,3003f5c + 3003f4c: 3a200593 li a1,930 + 3003f50: 030077b7 lui a5,0x3007 + 3003f54: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003f58: 3599 jal ra,3003d9e + 3003f5a: a001 j 3003f5a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003f5c: 040007b7 lui a5,0x4000 + 3003f60: 4947a783 lw a5,1172(a5) # 4000494 + 3003f64: eb89 bnez a5,3003f76 + 3003f66: 3a300593 li a1,931 + 3003f6a: 030077b7 lui a5,0x3007 + 3003f6e: 8a478513 addi a0,a5,-1884 # 30068a4 + 3003f72: 3535 jal ra,3003d9e + 3003f74: a001 j 3003f74 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003f76: 040007b7 lui a5,0x4000 + 3003f7a: 4947a783 lw a5,1172(a5) # 4000494 + 3003f7e: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003f82: fdc42783 lw a5,-36(s0) + 3003f86: 279e lhu a5,8(a5) + 3003f88: 873e mv a4,a5 + 3003f8a: fec42783 lw a5,-20(s0) + 3003f8e: 97ba add a5,a5,a4 + 3003f90: fef42423 sw a5,-24(s0) + CRG_AdcIpCfg cfg; + cfg.value[1] = p->value[1]; + 3003f94: fe842783 lw a5,-24(s0) + 3003f98: 43dc lw a5,4(a5) + 3003f9a: fef42223 sw a5,-28(s0) + if (enable) { /* Enables and Deassert reset the ADC clock. */ + 3003f9e: fd842783 lw a5,-40(s0) + 3003fa2: cf99 beqz a5,3003fc0 + cfg.BIT.clk_adc_cken = BASE_CFG_SET; + 3003fa4: fe442783 lw a5,-28(s0) + 3003fa8: 0017e793 ori a5,a5,1 + 3003fac: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003fb0: fe442783 lw a5,-28(s0) + 3003fb4: 7741 lui a4,0xffff0 + 3003fb6: 177d addi a4,a4,-1 # fffeffff + 3003fb8: 8ff9 and a5,a5,a4 + 3003fba: fef42223 sw a5,-28(s0) + 3003fbe: a829 j 3003fd8 + } else { /* Disable and reset the ADC clock. */ + cfg.BIT.clk_adc_cken = BASE_CFG_UNSET; + 3003fc0: fe442783 lw a5,-28(s0) + 3003fc4: 9bf9 andi a5,a5,-2 + 3003fc6: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003fca: fe442783 lw a5,-28(s0) + 3003fce: 7741 lui a4,0xffff0 + 3003fd0: 177d addi a4,a4,-1 # fffeffff + 3003fd2: 8ff9 and a5,a5,a4 + 3003fd4: fef42223 sw a5,-28(s0) + } + p->value[1] = cfg.value[1]; + 3003fd8: fe442703 lw a4,-28(s0) + 3003fdc: fe842783 lw a5,-24(s0) + 3003fe0: c3d8 sw a4,4(a5) +} + 3003fe2: 0001 nop + 3003fe4: 50b2 lw ra,44(sp) + 3003fe6: 5422 lw s0,40(sp) + 3003fe8: 6145 addi sp,sp,48 + 3003fea: 8082 ret + +03003fec : + * @brief Get Enable status of ADC + * @param matchInfo ADC match info + * @retval Cken of ADC + */ +static unsigned int CRG_AdcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003fec: 7179 addi sp,sp,-48 + 3003fee: d606 sw ra,44(sp) + 3003ff0: d422 sw s0,40(sp) + 3003ff2: 1800 addi s0,sp,48 + 3003ff4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003ff8: fdc42783 lw a5,-36(s0) + 3003ffc: eb89 bnez a5,300400e + 3003ffe: 3ba00593 li a1,954 + 3004002: 030077b7 lui a5,0x3007 + 3004006: 8a478513 addi a0,a5,-1884 # 30068a4 + 300400a: 3b51 jal ra,3003d9e + 300400c: a001 j 300400c + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300400e: 040007b7 lui a5,0x4000 + 3004012: 4947a783 lw a5,1172(a5) # 4000494 + 3004016: eb89 bnez a5,3004028 + 3004018: 3bb00593 li a1,955 + 300401c: 030077b7 lui a5,0x3007 + 3004020: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004024: 3bad jal ra,3003d9e + 3004026: a001 j 3004026 + unsigned int enable; + /* Get the enable status of the ADC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3004028: 040007b7 lui a5,0x4000 + 300402c: 4947a783 lw a5,1172(a5) # 4000494 + 3004030: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004034: fdc42783 lw a5,-36(s0) + 3004038: 279e lhu a5,8(a5) + 300403a: 873e mv a4,a5 + 300403c: fec42783 lw a5,-20(s0) + 3004040: 97ba add a5,a5,a4 + 3004042: fef42423 sw a5,-24(s0) + enable = ((p->BIT.clk_adc_cken != 0)) ? IP_CLK_ENABLE : IP_CLK_DISABLE; + 3004046: fe842783 lw a5,-24(s0) + 300404a: 43dc lw a5,4(a5) + 300404c: 8b85 andi a5,a5,1 + 300404e: 9f81 uxtb a5 + 3004050: c399 beqz a5,3004056 + 3004052: 4785 li a5,1 + 3004054: a011 j 3004058 + 3004056: 4781 li a5,0 + 3004058: fef42223 sw a5,-28(s0) + return enable; + 300405c: fe442783 lw a5,-28(s0) +} + 3004060: 853e mv a0,a5 + 3004062: 50b2 lw ra,44(sp) + 3004064: 5422 lw s0,40(sp) + 3004066: 6145 addi sp,sp,48 + 3004068: 8082 ret + +0300406a : + * @param matchInfo ADC match info + * @param clkSelect @see CRG_AdcClkSelect + * @retval None + */ +static void CRG_AdcClkSelectSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int clkSelect) +{ + 300406a: 7179 addi sp,sp,-48 + 300406c: d606 sw ra,44(sp) + 300406e: d422 sw s0,40(sp) + 3004070: 1800 addi s0,sp,48 + 3004072: fca42e23 sw a0,-36(s0) + 3004076: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300407a: fdc42783 lw a5,-36(s0) + 300407e: eb89 bnez a5,3004090 + 3004080: 3cc00593 li a1,972 + 3004084: 030077b7 lui a5,0x3007 + 3004088: 8a478513 addi a0,a5,-1884 # 30068a4 + 300408c: 3b09 jal ra,3003d9e + 300408e: a001 j 300408e + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004090: 040007b7 lui a5,0x4000 + 3004094: 4947a783 lw a5,1172(a5) # 4000494 + 3004098: eb89 bnez a5,30040aa + 300409a: 3cd00593 li a1,973 + 300409e: 030077b7 lui a5,0x3007 + 30040a2: 8a478513 addi a0,a5,-1884 # 30068a4 + 30040a6: 39e5 jal ra,3003d9e + 30040a8: a001 j 30040a8 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30040aa: 040007b7 lui a5,0x4000 + 30040ae: 4947a703 lw a4,1172(a5) # 4000494 + 30040b2: 100007b7 lui a5,0x10000 + 30040b6: 00f70a63 beq a4,a5,30040ca + 30040ba: 3ce00593 li a1,974 + 30040be: 030077b7 lui a5,0x3007 + 30040c2: 8a478513 addi a0,a5,-1884 # 30068a4 + 30040c6: 39e1 jal ra,3003d9e + 30040c8: a001 j 30040c8 + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkModeSelect(clkSelect)); + 30040ca: fd842503 lw a0,-40(s0) + 30040ce: ea1fe0ef jal ra,3002f6e + 30040d2: 87aa mv a5,a0 + 30040d4: 0017c793 xori a5,a5,1 + 30040d8: 9f81 uxtb a5 + 30040da: cb89 beqz a5,30040ec + 30040dc: 3cf00593 li a1,975 + 30040e0: 030077b7 lui a5,0x3007 + 30040e4: 8a478513 addi a0,a5,-1884 # 30068a4 + 30040e8: 395d jal ra,3003d9e + 30040ea: a89d j 3004160 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30040ec: 040007b7 lui a5,0x4000 + 30040f0: 4947a783 lw a5,1172(a5) # 4000494 + 30040f4: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 30040f8: fdc42783 lw a5,-36(s0) + 30040fc: 279e lhu a5,8(a5) + 30040fe: 873e mv a4,a5 + 3004100: fec42783 lw a5,-20(s0) + 3004104: 97ba add a5,a5,a4 + 3004106: fef42423 sw a5,-24(s0) + if (clkSelect == CRG_ADC_CLK_SYN_CORE) { + 300410a: fd842703 lw a4,-40(s0) + 300410e: 478d li a5,3 + 3004110: 00f71a63 bne a4,a5,3004124 + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_SET; /* use sync clock */ + 3004114: fe842703 lw a4,-24(s0) + 3004118: 435c lw a5,4(a4) + 300411a: 010006b7 lui a3,0x1000 + 300411e: 8fd5 or a5,a5,a3 + 3004120: c35c sw a5,4(a4) + 3004122: a83d j 3004160 + } else { + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3004124: b67fe0ef jal ra,3002c8a + g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel = clkSelect; /* write clock selection */ + 3004128: 040007b7 lui a5,0x4000 + 300412c: 4947a703 lw a4,1172(a5) # 4000494 + 3004130: fd842783 lw a5,-40(s0) + 3004134: 8b8d andi a5,a5,3 + 3004136: 0ff7f693 andi a3,a5,255 + 300413a: 10072783 lw a5,256(a4) + 300413e: 8a8d andi a3,a3,3 + 3004140: 0692 slli a3,a3,0x4 + 3004142: fcf7f793 andi a5,a5,-49 + 3004146: 8fd5 or a5,a5,a3 + 3004148: 10f72023 sw a5,256(a4) + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 300414c: b67fe0ef jal ra,3002cb2 + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_UNSET; + 3004150: fe842703 lw a4,-24(s0) + 3004154: 435c lw a5,4(a4) + 3004156: ff0006b7 lui a3,0xff000 + 300415a: 16fd addi a3,a3,-1 # feffffff + 300415c: 8ff5 and a5,a5,a3 + 300415e: c35c sw a5,4(a4) + } +} + 3004160: 50b2 lw ra,44(sp) + 3004162: 5422 lw s0,40(sp) + 3004164: 6145 addi sp,sp,48 + 3004166: 8082 ret + +03004168 : + * @brief Get ADC Clock Select + * @param matchInfo ADC match info + * @retval Adc Clock select @see CRG_AdcClkSelect + */ +static unsigned int CRG_AdcClkSelectGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3004168: 7179 addi sp,sp,-48 + 300416a: d606 sw ra,44(sp) + 300416c: d422 sw s0,40(sp) + 300416e: 1800 addi s0,sp,48 + 3004170: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004174: fdc42783 lw a5,-36(s0) + 3004178: eb89 bnez a5,300418a + 300417a: 3e400593 li a1,996 + 300417e: 030077b7 lui a5,0x3007 + 3004182: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004186: 3921 jal ra,3003d9e + 3004188: a001 j 3004188 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300418a: 040007b7 lui a5,0x4000 + 300418e: 4947a783 lw a5,1172(a5) # 4000494 + 3004192: eb89 bnez a5,30041a4 + 3004194: 3e500593 li a1,997 + 3004198: 030077b7 lui a5,0x3007 + 300419c: 8a478513 addi a0,a5,-1884 # 30068a4 + 30041a0: 3efd jal ra,3003d9e + 30041a2: a001 j 30041a2 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30041a4: 040007b7 lui a5,0x4000 + 30041a8: 4947a783 lw a5,1172(a5) # 4000494 + 30041ac: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 30041b0: fdc42783 lw a5,-36(s0) + 30041b4: 279e lhu a5,8(a5) + 30041b6: 873e mv a4,a5 + 30041b8: fec42783 lw a5,-20(s0) + 30041bc: 97ba add a5,a5,a4 + 30041be: fef42423 sw a5,-24(s0) + if (p->BIT.cfg_adc_ckmode_sel == BASE_CFG_SET) { + 30041c2: fe842783 lw a5,-24(s0) + 30041c6: 43dc lw a5,4(a5) + 30041c8: 83e1 srli a5,a5,0x18 + 30041ca: 8b85 andi a5,a5,1 + 30041cc: 0ff7f713 andi a4,a5,255 + 30041d0: 4785 li a5,1 + 30041d2: 00f71463 bne a4,a5,30041da + return CRG_ADC_CLK_SYN_CORE; /* Synchronous clock signal */ + 30041d6: 478d li a5,3 + 30041d8: a811 j 30041ec + } + return g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel; /* asynchronous clock signal */ + 30041da: 040007b7 lui a5,0x4000 + 30041de: 4947a783 lw a5,1172(a5) # 4000494 + 30041e2: 1007a783 lw a5,256(a5) + 30041e6: 8391 srli a5,a5,0x4 + 30041e8: 8b8d andi a5,a5,3 + 30041ea: 9f81 uxtb a5 +} + 30041ec: 853e mv a0,a5 + 30041ee: 50b2 lw ra,44(sp) + 30041f0: 5422 lw s0,40(sp) + 30041f2: 6145 addi sp,sp,48 + 30041f4: 8082 ret + +030041f6 : + * @param matchInfo ADC match info + * @param div Adc clock division + * @retval None + */ +static void CRG_AdcDivSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int div) +{ + 30041f6: 7179 addi sp,sp,-48 + 30041f8: d606 sw ra,44(sp) + 30041fa: d422 sw s0,40(sp) + 30041fc: 1800 addi s0,sp,48 + 30041fe: fca42e23 sw a0,-36(s0) + 3004202: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004206: fdc42783 lw a5,-36(s0) + 300420a: eb89 bnez a5,300421c + 300420c: 3f700593 li a1,1015 + 3004210: 030077b7 lui a5,0x3007 + 3004214: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004218: 3659 jal ra,3003d9e + 300421a: a001 j 300421a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300421c: 040007b7 lui a5,0x4000 + 3004220: 4947a783 lw a5,1172(a5) # 4000494 + 3004224: eb89 bnez a5,3004236 + 3004226: 3f800593 li a1,1016 + 300422a: 030077b7 lui a5,0x3007 + 300422e: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004232: 36b5 jal ra,3003d9e + 3004234: a001 j 3004234 + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkDiv(div)); + 3004236: fd842503 lw a0,-40(s0) + 300423a: d75fe0ef jal ra,3002fae + 300423e: 87aa mv a5,a0 + 3004240: 0017c793 xori a5,a5,1 + 3004244: 9f81 uxtb a5 + 3004246: cb89 beqz a5,3004258 + 3004248: 3f900593 li a1,1017 + 300424c: 030077b7 lui a5,0x3007 + 3004250: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004254: 36a9 jal ra,3003d9e + 3004256: a885 j 30042c6 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3004258: 040007b7 lui a5,0x4000 + 300425c: 4947a783 lw a5,1172(a5) # 4000494 + 3004260: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004264: fdc42783 lw a5,-36(s0) + 3004268: 279e lhu a5,8(a5) + 300426a: 873e mv a4,a5 + 300426c: fec42783 lw a5,-20(s0) + 3004270: 97ba add a5,a5,a4 + 3004272: fef42423 sw a5,-24(s0) + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3004276: fe842783 lw a5,-24(s0) + 300427a: 43dc lw a5,4(a5) + 300427c: 83e1 srli a5,a5,0x18 + 300427e: 8b85 andi a5,a5,1 + 3004280: 9f81 uxtb a5 + 3004282: fef42223 sw a5,-28(s0) + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3004286: fe442703 lw a4,-28(s0) + 300428a: 4785 li a5,1 + 300428c: 02f71163 bne a4,a5,30042ae + p->BIT.clk_adc_div1 = div; /* write div to I1 */ + 3004290: fd842783 lw a5,-40(s0) + 3004294: 8b8d andi a5,a5,3 + 3004296: 0ff7f693 andi a3,a5,255 + 300429a: fe842703 lw a4,-24(s0) + 300429e: 431c lw a5,0(a4) + 30042a0: 8a8d andi a3,a3,3 + 30042a2: 06a2 slli a3,a3,0x8 + 30042a4: cff7f793 andi a5,a5,-769 + 30042a8: 8fd5 or a5,a5,a3 + 30042aa: c31c sw a5,0(a4) + 30042ac: a829 j 30042c6 + } else { + p->BIT.clk_adc_div0 = div; /* write div to I0 */ + 30042ae: fd842783 lw a5,-40(s0) + 30042b2: 8b8d andi a5,a5,3 + 30042b4: 0ff7f693 andi a3,a5,255 + 30042b8: fe842703 lw a4,-24(s0) + 30042bc: 431c lw a5,0(a4) + 30042be: 8a8d andi a3,a3,3 + 30042c0: 9bf1 andi a5,a5,-4 + 30042c2: 8fd5 or a5,a5,a3 + 30042c4: c31c sw a5,0(a4) + } +} + 30042c6: 50b2 lw ra,44(sp) + 30042c8: 5422 lw s0,40(sp) + 30042ca: 6145 addi sp,sp,48 + 30042cc: 8082 ret + +030042ce : + * @brief Get ADC clock division + * @param matchInfo ADC match info + * @retval Adc clock division + */ +static unsigned int CRG_AdcDivGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30042ce: 7179 addi sp,sp,-48 + 30042d0: d606 sw ra,44(sp) + 30042d2: d422 sw s0,40(sp) + 30042d4: 1800 addi s0,sp,48 + 30042d6: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30042da: fdc42783 lw a5,-36(s0) + 30042de: eb89 bnez a5,30042f0 + 30042e0: 40c00593 li a1,1036 + 30042e4: 030077b7 lui a5,0x3007 + 30042e8: 8a478513 addi a0,a5,-1884 # 30068a4 + 30042ec: 3c4d jal ra,3003d9e + 30042ee: a001 j 30042ee + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30042f0: 040007b7 lui a5,0x4000 + 30042f4: 4947a783 lw a5,1172(a5) # 4000494 + 30042f8: eb89 bnez a5,300430a + 30042fa: 40d00593 li a1,1037 + 30042fe: 030077b7 lui a5,0x3007 + 3004302: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004306: 3c61 jal ra,3003d9e + 3004308: a001 j 3004308 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300430a: 040007b7 lui a5,0x4000 + 300430e: 4947a783 lw a5,1172(a5) # 4000494 + 3004312: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004316: fdc42783 lw a5,-36(s0) + 300431a: 279e lhu a5,8(a5) + 300431c: 873e mv a4,a5 + 300431e: fec42783 lw a5,-20(s0) + 3004322: 97ba add a5,a5,a4 + 3004324: fef42423 sw a5,-24(s0) + + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3004328: fe842783 lw a5,-24(s0) + 300432c: 43dc lw a5,4(a5) + 300432e: 83e1 srli a5,a5,0x18 + 3004330: 8b85 andi a5,a5,1 + 3004332: 9f81 uxtb a5 + 3004334: fef42223 sw a5,-28(s0) + + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3004338: fe442703 lw a4,-28(s0) + 300433c: 4785 li a5,1 + 300433e: 00f71963 bne a4,a5,3004350 + return p->BIT.clk_adc_div1; /* return div value I1 */ + 3004342: fe842783 lw a5,-24(s0) + 3004346: 439c lw a5,0(a5) + 3004348: 83a1 srli a5,a5,0x8 + 300434a: 8b8d andi a5,a5,3 + 300434c: 9f81 uxtb a5 + 300434e: a031 j 300435a + } + return p->BIT.clk_adc_div0; /* return div valye I0 */ + 3004350: fe842783 lw a5,-24(s0) + 3004354: 439c lw a5,0(a5) + 3004356: 8b8d andi a5,a5,3 + 3004358: 9f81 uxtb a5 +} + 300435a: 853e mv a0,a5 + 300435c: 50b2 lw ra,44(sp) + 300435e: 5422 lw s0,40(sp) + 3004360: 6145 addi sp,sp,48 + 3004362: 8082 ret + +03004364 : + * @brief Enable Clock of EFC + * @param matchInfo EFC match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_EfcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3004364: 7179 addi sp,sp,-48 + 3004366: d606 sw ra,44(sp) + 3004368: d422 sw s0,40(sp) + 300436a: 1800 addi s0,sp,48 + 300436c: fca42e23 sw a0,-36(s0) + 3004370: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004374: fdc42783 lw a5,-36(s0) + 3004378: eb89 bnez a5,300438a + 300437a: 42100593 li a1,1057 + 300437e: 030077b7 lui a5,0x3007 + 3004382: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004386: 3c21 jal ra,3003d9e + 3004388: a001 j 3004388 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300438a: 040007b7 lui a5,0x4000 + 300438e: 4947a783 lw a5,1172(a5) # 4000494 + 3004392: eb89 bnez a5,30043a4 + 3004394: 42200593 li a1,1058 + 3004398: 030077b7 lui a5,0x3007 + 300439c: 8a478513 addi a0,a5,-1884 # 30068a4 + 30043a0: 3afd jal ra,3003d9e + 30043a2: a001 j 30043a2 + /* Enables or disables EFC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30043a4: 040007b7 lui a5,0x4000 + 30043a8: 4947a783 lw a5,1172(a5) # 4000494 + 30043ac: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 30043b0: fdc42783 lw a5,-36(s0) + 30043b4: 279e lhu a5,8(a5) + 30043b6: 873e mv a4,a5 + 30043b8: fec42783 lw a5,-20(s0) + 30043bc: 97ba add a5,a5,a4 + 30043be: fef42423 sw a5,-24(s0) + p->BIT.eflash_cken = (enable & IP_CLK_ENABLE) ? BASE_CFG_SET : BASE_CFG_UNSET; + 30043c2: fd842783 lw a5,-40(s0) + 30043c6: 8b85 andi a5,a5,1 + 30043c8: 0ff7f693 andi a3,a5,255 + 30043cc: fe842703 lw a4,-24(s0) + 30043d0: 431c lw a5,0(a4) + 30043d2: 8a85 andi a3,a3,1 + 30043d4: 9bf9 andi a5,a5,-2 + 30043d6: 8fd5 or a5,a5,a3 + 30043d8: c31c sw a5,0(a4) +} + 30043da: 0001 nop + 30043dc: 50b2 lw ra,44(sp) + 30043de: 5422 lw s0,40(sp) + 30043e0: 6145 addi sp,sp,48 + 30043e2: 8082 ret + +030043e4 : + * @brief Disable Clock of EFC + * @param matchInfo EFC match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_EfcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30043e4: 7179 addi sp,sp,-48 + 30043e6: d606 sw ra,44(sp) + 30043e8: d422 sw s0,40(sp) + 30043ea: 1800 addi s0,sp,48 + 30043ec: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30043f0: fdc42783 lw a5,-36(s0) + 30043f4: eb89 bnez a5,3004406 + 30043f6: 43000593 li a1,1072 + 30043fa: 030077b7 lui a5,0x3007 + 30043fe: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004402: 3a71 jal ra,3003d9e + 3004404: a001 j 3004404 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004406: 040007b7 lui a5,0x4000 + 300440a: 4947a783 lw a5,1172(a5) # 4000494 + 300440e: eb89 bnez a5,3004420 + 3004410: 43100593 li a1,1073 + 3004414: 030077b7 lui a5,0x3007 + 3004418: 8a478513 addi a0,a5,-1884 # 30068a4 + 300441c: 3249 jal ra,3003d9e + 300441e: a001 j 300441e + /* Get the value of the EFC register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3004420: 040007b7 lui a5,0x4000 + 3004424: 4947a783 lw a5,1172(a5) # 4000494 + 3004428: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 300442c: fdc42783 lw a5,-36(s0) + 3004430: 279e lhu a5,8(a5) + 3004432: 873e mv a4,a5 + 3004434: fec42783 lw a5,-20(s0) + 3004438: 97ba add a5,a5,a4 + 300443a: fef42423 sw a5,-24(s0) + return p->BIT.eflash_cken; + 300443e: fe842783 lw a5,-24(s0) + 3004442: 439c lw a5,0(a5) + 3004444: 8b85 andi a5,a5,1 + 3004446: 9f81 uxtb a5 +} + 3004448: 853e mv a0,a5 + 300444a: 50b2 lw ra,44(sp) + 300444c: 5422 lw s0,40(sp) + 300444e: 6145 addi sp,sp,48 + 3004450: 8082 ret + +03004452 : + * @brief Enable Clock of ANA + * @param matchInfo ANA match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_AnaEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3004452: 7179 addi sp,sp,-48 + 3004454: d606 sw ra,44(sp) + 3004456: d422 sw s0,40(sp) + 3004458: 1800 addi s0,sp,48 + 300445a: fca42e23 sw a0,-36(s0) + 300445e: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3004462: fdc42783 lw a5,-36(s0) + 3004466: eb89 bnez a5,3004478 + 3004468: 44000593 li a1,1088 + 300446c: 030077b7 lui a5,0x3007 + 3004470: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004474: 322d jal ra,3003d9e + 3004476: a001 j 3004476 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004478: 040007b7 lui a5,0x4000 + 300447c: 4947a783 lw a5,1172(a5) # 4000494 + 3004480: eb89 bnez a5,3004492 + 3004482: 44100593 li a1,1089 + 3004486: 030077b7 lui a5,0x3007 + 300448a: 8a478513 addi a0,a5,-1884 # 30068a4 + 300448e: 3a01 jal ra,3003d9e + 3004490: a001 j 3004490 + CRG_PARAM_CHECK_NO_RET(enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE); + 3004492: fd842703 lw a4,-40(s0) + 3004496: 4785 li a5,1 + 3004498: 00f70d63 beq a4,a5,30044b2 + 300449c: fd842783 lw a5,-40(s0) + 30044a0: cb89 beqz a5,30044b2 + 30044a2: 44200593 li a1,1090 + 30044a6: 030077b7 lui a5,0x3007 + 30044aa: 8a478513 addi a0,a5,-1884 # 30068a4 + 30044ae: 38c5 jal ra,3003d9e + 30044b0: a20d j 30045d2 + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30044b2: 040007b7 lui a5,0x4000 + 30044b6: 4947a783 lw a5,1172(a5) # 4000494 + 30044ba: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 30044be: fdc42783 lw a5,-36(s0) + 30044c2: 279e lhu a5,8(a5) + 30044c4: 873e mv a4,a5 + 30044c6: fec42783 lw a5,-20(s0) + 30044ca: 97ba add a5,a5,a4 + 30044cc: fdc42703 lw a4,-36(s0) + 30044d0: 2738 lbu a4,10(a4) + 30044d2: 97ba add a5,a5,a4 + 30044d4: fef42423 sw a5,-24(s0) + + if ((enable == IP_CLK_ENABLE) && (p->BIT.ip_srst_req == BASE_CFG_SET)) { + 30044d8: fd842703 lw a4,-40(s0) + 30044dc: 4785 li a5,1 + 30044de: 02f71f63 bne a4,a5,300451c + 30044e2: fe842783 lw a5,-24(s0) + 30044e6: 439c lw a5,0(a5) + 30044e8: 83c1 srli a5,a5,0x10 + 30044ea: 8b85 andi a5,a5,1 + 30044ec: 0ff7f713 andi a4,a5,255 + 30044f0: 4785 li a5,1 + 30044f2: 02f71563 bne a4,a5,300451c + p->BIT.ip_srst_req = BASE_CFG_UNSET; + 30044f6: fe842703 lw a4,-24(s0) + 30044fa: 431c lw a5,0(a4) + 30044fc: 76c1 lui a3,0xffff0 + 30044fe: 16fd addi a3,a3,-1 # fffeffff + 3004500: 8ff5 and a5,a5,a3 + 3004502: c31c sw a5,0(a4) + g_anaEnableFlag++; /* count enable analog IP number */ + 3004504: 040007b7 lui a5,0x4000 + 3004508: 4987c783 lbu a5,1176(a5) # 4000498 + 300450c: 0785 addi a5,a5,1 + 300450e: 0ff7f713 andi a4,a5,255 + 3004512: 040007b7 lui a5,0x4000 + 3004516: 48e78c23 sb a4,1176(a5) # 4000498 + 300451a: a089 j 300455c + } else if ((enable == IP_CLK_DISABLE) && (p->BIT.ip_srst_req == BASE_CFG_UNSET)) { + 300451c: fd842783 lw a5,-40(s0) + 3004520: ef95 bnez a5,300455c + 3004522: fe842783 lw a5,-24(s0) + 3004526: 439c lw a5,0(a5) + 3004528: 83c1 srli a5,a5,0x10 + 300452a: 8b85 andi a5,a5,1 + 300452c: 9f81 uxtb a5 + 300452e: e79d bnez a5,300455c + p->BIT.ip_srst_req = BASE_CFG_SET; + 3004530: fe842703 lw a4,-24(s0) + 3004534: 431c lw a5,0(a4) + 3004536: 66c1 lui a3,0x10 + 3004538: 8fd5 or a5,a5,a3 + 300453a: c31c sw a5,0(a4) + if (g_anaEnableFlag > 0) { + 300453c: 040007b7 lui a5,0x4000 + 3004540: 4987c783 lbu a5,1176(a5) # 4000498 + 3004544: cf81 beqz a5,300455c + g_anaEnableFlag--; /* Decreasing the count to enable the analog IP number. */ + 3004546: 040007b7 lui a5,0x4000 + 300454a: 4987c783 lbu a5,1176(a5) # 4000498 + 300454e: 17fd addi a5,a5,-1 + 3004550: 0ff7f713 andi a4,a5,255 + 3004554: 040007b7 lui a5,0x4000 + 3004558: 48e78c23 sb a4,1176(a5) # 4000498 + } + } + + if ((g_anaEnableFlag == 0) && (enable == IP_CLK_DISABLE)) { /* all analog clock disable */ + 300455c: 040007b7 lui a5,0x4000 + 3004560: 4987c783 lbu a5,1176(a5) # 4000498 + 3004564: eb85 bnez a5,3004594 + 3004566: fd842783 lw a5,-40(s0) + 300456a: e78d bnez a5,3004594 + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_UNSET; + 300456c: 10000737 lui a4,0x10000 + 3004570: 6785 lui a5,0x1 + 3004572: 973e add a4,a4,a5 + 3004574: a5072783 lw a5,-1456(a4) # ffffa50 + 3004578: 9bf9 andi a5,a5,-2 + 300457a: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_SET; + 300457e: 10000737 lui a4,0x10000 + 3004582: 6785 lui a5,0x1 + 3004584: 973e add a4,a4,a5 + 3004586: a5072783 lw a5,-1456(a4) # ffffa50 + 300458a: 66c1 lui a3,0x10 + 300458c: 8fd5 or a5,a5,a3 + 300458e: a4f72823 sw a5,-1456(a4) + 3004592: a081 j 30045d2 + } else if ((g_anaEnableFlag > 0) && (enable == IP_CLK_ENABLE)) { /* all analog clock enable */ + 3004594: 040007b7 lui a5,0x4000 + 3004598: 4987c783 lbu a5,1176(a5) # 4000498 + 300459c: cb9d beqz a5,30045d2 + 300459e: fd842703 lw a4,-40(s0) + 30045a2: 4785 li a5,1 + 30045a4: 02f71763 bne a4,a5,30045d2 + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_UNSET; + 30045a8: 10000737 lui a4,0x10000 + 30045ac: 6785 lui a5,0x1 + 30045ae: 973e add a4,a4,a5 + 30045b0: a5072783 lw a5,-1456(a4) # ffffa50 + 30045b4: 76c1 lui a3,0xffff0 + 30045b6: 16fd addi a3,a3,-1 # fffeffff + 30045b8: 8ff5 and a5,a5,a3 + 30045ba: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_SET; + 30045be: 10000737 lui a4,0x10000 + 30045c2: 6785 lui a5,0x1 + 30045c4: 973e add a4,a4,a5 + 30045c6: a5072783 lw a5,-1456(a4) # ffffa50 + 30045ca: 0017e793 ori a5,a5,1 + 30045ce: a4f72823 sw a5,-1456(a4) + } +} + 30045d2: 50b2 lw ra,44(sp) + 30045d4: 5422 lw s0,40(sp) + 30045d6: 6145 addi sp,sp,48 + 30045d8: 8082 ret + +030045da : + * @brief Get Clock of ANA + * @param matchInfo ANA match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_AnaEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30045da: 7179 addi sp,sp,-48 + 30045dc: d606 sw ra,44(sp) + 30045de: d422 sw s0,40(sp) + 30045e0: 1800 addi s0,sp,48 + 30045e2: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30045e6: fdc42783 lw a5,-36(s0) + 30045ea: eb91 bnez a5,30045fe + 30045ec: 46200593 li a1,1122 + 30045f0: 030077b7 lui a5,0x3007 + 30045f4: 8a478513 addi a0,a5,-1884 # 30068a4 + 30045f8: beffd0ef jal ra,30021e6 + 30045fc: a001 j 30045fc + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30045fe: 040007b7 lui a5,0x4000 + 3004602: 4947a783 lw a5,1172(a5) # 4000494 + 3004606: eb91 bnez a5,300461a + 3004608: 46300593 li a1,1123 + 300460c: 030077b7 lui a5,0x3007 + 3004610: 8a478513 addi a0,a5,-1884 # 30068a4 + 3004614: bd3fd0ef jal ra,30021e6 + 3004618: a001 j 3004618 + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300461a: 040007b7 lui a5,0x4000 + 300461e: 4947a783 lw a5,1172(a5) # 4000494 + 3004622: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 3004626: fdc42783 lw a5,-36(s0) + 300462a: 279e lhu a5,8(a5) + 300462c: 873e mv a4,a5 + 300462e: fec42783 lw a5,-20(s0) + 3004632: 97ba add a5,a5,a4 + 3004634: fdc42703 lw a4,-36(s0) + 3004638: 2738 lbu a4,10(a4) + 300463a: 97ba add a5,a5,a4 + 300463c: fef42423 sw a5,-24(s0) + /* The clock is enabled based on the IP reset status. */ + return (p->BIT.ip_srst_req) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3004640: fe842783 lw a5,-24(s0) + 3004644: 439c lw a5,0(a5) + 3004646: 83c1 srli a5,a5,0x10 + 3004648: 8b85 andi a5,a5,1 + 300464a: 9f81 uxtb a5 + 300464c: 0017c793 xori a5,a5,1 + 3004650: 9f81 uxtb a5 +} + 3004652: 853e mv a0,a5 + 3004654: 50b2 lw ra,44(sp) + 3004656: 5422 lw s0,40(sp) + 3004658: 6145 addi sp,sp,48 + 300465a: 8082 ret + +0300465c : + * @brief Write a character to the UART port. + * @param ch The int promotion of the character to be written. + * @retval None. + */ +static void DBG_PrintCh(unsigned int ch) +{ + 300465c: 1101 addi sp,sp,-32 + 300465e: ce22 sw s0,28(sp) + 3004660: 1000 addi s0,sp,32 + 3004662: fea42623 sw a0,-20(s0) + while (DBG_PRINTF_UART_PORT->UART_FR.BIT.txff == 1) { + 3004666: 0001 nop + 3004668: 140007b7 lui a5,0x14000 + 300466c: 4f9c lw a5,24(a5) + 300466e: 8395 srli a5,a5,0x5 + 3004670: 8b85 andi a5,a5,1 + 3004672: 0ff7f713 andi a4,a5,255 + 3004676: 4785 li a5,1 + 3004678: fef708e3 beq a4,a5,3004668 + ; + } + DBG_PRINTF_UART_PORT->UART_DR.BIT.data = (unsigned char)ch; + 300467c: 14000737 lui a4,0x14000 + 3004680: fec42783 lw a5,-20(s0) + 3004684: 0ff7f693 andi a3,a5,255 + 3004688: 431c lw a5,0(a4) + 300468a: 0ff6f693 andi a3,a3,255 + 300468e: f007f793 andi a5,a5,-256 + 3004692: 8fd5 or a5,a5,a3 + 3004694: c31c sw a5,0(a4) +} + 3004696: 0001 nop + 3004698: 4472 lw s0,28(sp) + 300469a: 6105 addi sp,sp,32 + 300469c: 8082 ret + +0300469e : + * @param str The string to be printed. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, a BASE_STATUS_ERROR is returned. + */ +static int DBG_PrintStr(const char *str) +{ + 300469e: 7179 addi sp,sp,-48 + 30046a0: d606 sw ra,44(sp) + 30046a2: d422 sw s0,40(sp) + 30046a4: 1800 addi s0,sp,48 + 30046a6: fca42e23 sw a0,-36(s0) + DEBUG_ASSERT_PARAM(str != NULL); + int cnt = 0; + 30046aa: fe042623 sw zero,-20(s0) + while (*str != '\0') { + 30046ae: a00d j 30046d0 + DBG_PrintCh(*str); + 30046b0: fdc42783 lw a5,-36(s0) + 30046b4: 00078783 lb a5,0(a5) # 14000000 + 30046b8: 853e mv a0,a5 + 30046ba: 374d jal ra,300465c + str++; + 30046bc: fdc42783 lw a5,-36(s0) + 30046c0: 0785 addi a5,a5,1 + 30046c2: fcf42e23 sw a5,-36(s0) + cnt++; + 30046c6: fec42783 lw a5,-20(s0) + 30046ca: 0785 addi a5,a5,1 + 30046cc: fef42623 sw a5,-20(s0) + while (*str != '\0') { + 30046d0: fdc42783 lw a5,-36(s0) + 30046d4: 00078783 lb a5,0(a5) + 30046d8: ffe1 bnez a5,30046b0 + } + return cnt; + 30046da: fec42783 lw a5,-20(s0) +} + 30046de: 853e mv a0,a5 + 30046e0: 50b2 lw ra,44(sp) + 30046e2: 5422 lw s0,40(sp) + 30046e4: 6145 addi sp,sp,48 + 30046e6: 8082 ret + +030046e8 : + * @param base Base value. + * @param exponent Exponent value. + * @retval unsigned long The result of raising base to the power exponent. + */ +static unsigned long DBG_Pow(unsigned int base, unsigned int exponent) +{ + 30046e8: 7179 addi sp,sp,-48 + 30046ea: d622 sw s0,44(sp) + 30046ec: 1800 addi s0,sp,48 + 30046ee: fca42e23 sw a0,-36(s0) + 30046f2: fcb42c23 sw a1,-40(s0) + unsigned long ret = 1; + 30046f6: 4785 li a5,1 + 30046f8: fef42623 sw a5,-20(s0) + while (exponent--) { + 30046fc: a809 j 300470e + ret *= base; + 30046fe: fec42703 lw a4,-20(s0) + 3004702: fdc42783 lw a5,-36(s0) + 3004706: 02f707b3 mul a5,a4,a5 + 300470a: fef42623 sw a5,-20(s0) + while (exponent--) { + 300470e: fd842783 lw a5,-40(s0) + 3004712: fff78713 addi a4,a5,-1 + 3004716: fce42c23 sw a4,-40(s0) + 300471a: f3f5 bnez a5,30046fe + } + return ret; /* ret = base ^ exponent */ + 300471c: fec42783 lw a5,-20(s0) +} + 3004720: 853e mv a0,a5 + 3004722: 5432 lw s0,44(sp) + 3004724: 6145 addi sp,sp,48 + 3004726: 8082 ret + +03004728 : + * @param num The number to be counted. + * @param base The number base of num. + * @retval unsigned int The number of digits. + */ +static unsigned int DBG_CountDigits(int num, NumBase base) +{ + 3004728: 7179 addi sp,sp,-48 + 300472a: d622 sw s0,44(sp) + 300472c: 1800 addi s0,sp,48 + 300472e: fca42e23 sw a0,-36(s0) + 3004732: fcb42c23 sw a1,-40(s0) + unsigned int cnt = 0; + 3004736: fe042623 sw zero,-20(s0) + if (base == 0) { + 300473a: fd842783 lw a5,-40(s0) + 300473e: e78d bnez a5,3004768 + return 0; + 3004740: 4781 li a5,0 + 3004742: a099 j 3004788 + } + while (num != 0) { + cnt++; + 3004744: fec42783 lw a5,-20(s0) + 3004748: 0785 addi a5,a5,1 + 300474a: fef42623 sw a5,-20(s0) + if (cnt > MAX_DIV_TIMES) { + 300474e: fec42703 lw a4,-20(s0) + 3004752: 47fd li a5,31 + 3004754: 00e7ee63 bltu a5,a4,3004770 + break; + } + num /= base; + 3004758: fdc42703 lw a4,-36(s0) + 300475c: fd842783 lw a5,-40(s0) + 3004760: 02f757b3 divu a5,a4,a5 + 3004764: fcf42e23 sw a5,-36(s0) + while (num != 0) { + 3004768: fdc42783 lw a5,-36(s0) + 300476c: ffe1 bnez a5,3004744 + 300476e: a011 j 3004772 + break; + 3004770: 0001 nop + } + cnt = (cnt == 0) ? 1 : cnt; + 3004772: fec42783 lw a5,-20(s0) + 3004776: c781 beqz a5,300477e + 3004778: fec42783 lw a5,-20(s0) + 300477c: a011 j 3004780 + 300477e: 4785 li a5,1 + 3004780: fef42623 sw a5,-20(s0) + return cnt; + 3004784: fec42783 lw a5,-20(s0) +} + 3004788: 853e mv a0,a5 + 300478a: 5432 lw s0,44(sp) + 300478c: 6145 addi sp,sp,48 + 300478e: 8082 ret + +03004790 : + * @param num The unsigned number to be printed. + * @param base The number base of num. + * @param digits The digits of num. + */ +static void DBG_PutUnsignedNum(unsigned int num, NumBase base, unsigned int digits) +{ + 3004790: 7179 addi sp,sp,-48 + 3004792: d606 sw ra,44(sp) + 3004794: d422 sw s0,40(sp) + 3004796: 1800 addi s0,sp,48 + 3004798: fca42e23 sw a0,-36(s0) + 300479c: fcb42c23 sw a1,-40(s0) + 30047a0: fcc42a23 sw a2,-44(s0) + unsigned char ch; + while (digits != 0) { + 30047a4: a069 j 300482e + ch = num / DBG_Pow(base, digits - 1); + 30047a6: fd442783 lw a5,-44(s0) + 30047aa: 17fd addi a5,a5,-1 + 30047ac: 85be mv a1,a5 + 30047ae: fd842503 lw a0,-40(s0) + 30047b2: 3f1d jal ra,30046e8 + 30047b4: 872a mv a4,a0 + 30047b6: fdc42783 lw a5,-36(s0) + 30047ba: 02e7d7b3 divu a5,a5,a4 + 30047be: fef407a3 sb a5,-17(s0) + num %= DBG_Pow(base, digits - 1); + 30047c2: fd442783 lw a5,-44(s0) + 30047c6: 17fd addi a5,a5,-1 + 30047c8: 85be mv a1,a5 + 30047ca: fd842503 lw a0,-40(s0) + 30047ce: 3f29 jal ra,30046e8 + 30047d0: 872a mv a4,a0 + 30047d2: fdc42783 lw a5,-36(s0) + 30047d6: 02e7f7b3 remu a5,a5,a4 + 30047da: fcf42e23 sw a5,-36(s0) + if (base == DECIMAL) { + 30047de: fd842703 lw a4,-40(s0) + 30047e2: 47a9 li a5,10 + 30047e4: 00f71963 bne a4,a5,30047f6 + DBG_PrintCh(ch + '0'); + 30047e8: fef44783 lbu a5,-17(s0) + 30047ec: 03078793 addi a5,a5,48 + 30047f0: 853e mv a0,a5 + 30047f2: 35ad jal ra,300465c + 30047f4: a805 j 3004824 + } else if (base == HEXADECIMAL) { + 30047f6: fd842703 lw a4,-40(s0) + 30047fa: 47c1 li a5,16 + 30047fc: 02f71d63 bne a4,a5,3004836 + if (ch < DECIMAL_BASE) { + 3004800: fef44703 lbu a4,-17(s0) + 3004804: 47a5 li a5,9 + 3004806: 00e7e963 bltu a5,a4,3004818 + DBG_PrintCh(ch + '0'); + 300480a: fef44783 lbu a5,-17(s0) + 300480e: 03078793 addi a5,a5,48 + 3004812: 853e mv a0,a5 + 3004814: 35a1 jal ra,300465c + 3004816: a039 j 3004824 + } else { + DBG_PrintCh(ch - DECIMAL_BASE + 'A'); + 3004818: fef44783 lbu a5,-17(s0) + 300481c: 03778793 addi a5,a5,55 + 3004820: 853e mv a0,a5 + 3004822: 3d2d jal ra,300465c + } + } else { + break; + } + digits--; + 3004824: fd442783 lw a5,-44(s0) + 3004828: 17fd addi a5,a5,-1 + 300482a: fcf42a23 sw a5,-44(s0) + while (digits != 0) { + 300482e: fd442783 lw a5,-44(s0) + 3004832: fbb5 bnez a5,30047a6 + } +} + 3004834: a011 j 3004838 + break; + 3004836: 0001 nop +} + 3004838: 0001 nop + 300483a: 50b2 lw ra,44(sp) + 300483c: 5422 lw s0,40(sp) + 300483e: 6145 addi sp,sp,48 + 3004840: 8082 ret + +03004842 : + * @brief Print decimal number through UART port. + * @param intNum The decimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintInt(int intNum) +{ + 3004842: 7179 addi sp,sp,-48 + 3004844: d606 sw ra,44(sp) + 3004846: d422 sw s0,40(sp) + 3004848: 1800 addi s0,sp,48 + 300484a: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (intNum == 0) { + 300484e: fdc42783 lw a5,-36(s0) + 3004852: e791 bnez a5,300485e + DBG_PrintCh('0'); + 3004854: 03000513 li a0,48 + 3004858: 3511 jal ra,300465c + return 1; + 300485a: 4785 li a5,1 + 300485c: a82d j 3004896 + } + if (intNum < 0) { + 300485e: fdc42783 lw a5,-36(s0) + 3004862: 0007db63 bgez a5,3004878 + DBG_PrintCh('-'); + 3004866: 02d00513 li a0,45 + 300486a: 3bcd jal ra,300465c + intNum = -intNum; + 300486c: fdc42783 lw a5,-36(s0) + 3004870: 40f007b3 neg a5,a5 + 3004874: fcf42e23 sw a5,-36(s0) + } + cnt = DBG_CountDigits(intNum, DECIMAL); + 3004878: 45a9 li a1,10 + 300487a: fdc42503 lw a0,-36(s0) + 300487e: 356d jal ra,3004728 + 3004880: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(intNum, DECIMAL, cnt); + 3004884: fdc42783 lw a5,-36(s0) + 3004888: fec42603 lw a2,-20(s0) + 300488c: 45a9 li a1,10 + 300488e: 853e mv a0,a5 + 3004890: 3701 jal ra,3004790 + return cnt; + 3004892: fec42783 lw a5,-20(s0) +} + 3004896: 853e mv a0,a5 + 3004898: 50b2 lw ra,44(sp) + 300489a: 5422 lw s0,40(sp) + 300489c: 6145 addi sp,sp,48 + 300489e: 8082 ret + +030048a0 : + * @brief Print hexadecimal number through UART port. + * @param hexNum The hexadecimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintHex(unsigned int hexNum) +{ + 30048a0: 7179 addi sp,sp,-48 + 30048a2: d606 sw ra,44(sp) + 30048a4: d422 sw s0,40(sp) + 30048a6: 1800 addi s0,sp,48 + 30048a8: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (hexNum == 0) { + 30048ac: fdc42783 lw a5,-36(s0) + 30048b0: e791 bnez a5,30048bc + DBG_PrintCh('0'); + 30048b2: 03000513 li a0,48 + 30048b6: 335d jal ra,300465c + return 1; + 30048b8: 4785 li a5,1 + 30048ba: a005 j 30048da + } + cnt = DBG_CountDigits(hexNum, HEXADECIMAL); + 30048bc: fdc42783 lw a5,-36(s0) + 30048c0: 45c1 li a1,16 + 30048c2: 853e mv a0,a5 + 30048c4: 3595 jal ra,3004728 + 30048c6: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(hexNum, HEXADECIMAL, cnt); + 30048ca: fec42603 lw a2,-20(s0) + 30048ce: 45c1 li a1,16 + 30048d0: fdc42503 lw a0,-36(s0) + 30048d4: 3d75 jal ra,3004790 + return cnt; + 30048d6: fec42783 lw a5,-20(s0) +} + 30048da: 853e mv a0,a5 + 30048dc: 50b2 lw ra,44(sp) + 30048de: 5422 lw s0,40(sp) + 30048e0: 6145 addi sp,sp,48 + 30048e2: 8082 ret + +030048e4 : + * @brief Print floating-point number through UART port. + * @param fltNum The floating-point number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintFlt(float fltNum, unsigned int precision) +{ + 30048e4: 7139 addi sp,sp,-64 + 30048e6: de06 sw ra,60(sp) + 30048e8: dc22 sw s0,56(sp) + 30048ea: 0080 addi s0,sp,64 + 30048ec: fca42627 fsw fa0,-52(s0) + 30048f0: fca42423 sw a0,-56(s0) + unsigned int cnt = 0; + 30048f4: fe042623 sw zero,-20(s0) + unsigned int floatScale; + + if (fltNum < 0) { + 30048f8: fcc42787 flw fa5,-52(s0) + 30048fc: f0000753 fmv.w.x fa4,zero + 3004900: a0e797d3 flt.s a5,fa5,fa4 + 3004904: cf99 beqz a5,3004922 + DBG_PrintCh('-'); + 3004906: 02d00513 li a0,45 + 300490a: 3b89 jal ra,300465c + cnt += 1; + 300490c: fec42783 lw a5,-20(s0) + 3004910: 0785 addi a5,a5,1 + 3004912: fef42623 sw a5,-20(s0) + fltNum = -fltNum; + 3004916: fcc42787 flw fa5,-52(s0) + 300491a: 20f797d3 fneg.s fa5,fa5 + 300491e: fcf42627 fsw fa5,-52(s0) + } + int integerVal = (int)fltNum; + 3004922: fcc42787 flw fa5,-52(s0) + 3004926: c00797d3 fcvt.w.s a5,fa5,rtz + 300492a: fef42023 sw a5,-32(s0) + floatScale = DBG_Pow(10, (precision + 1)); /* 10: decimal */ + 300492e: fc842783 lw a5,-56(s0) + 3004932: 0785 addi a5,a5,1 + 3004934: 85be mv a1,a5 + 3004936: 4529 li a0,10 + 3004938: 3b45 jal ra,30046e8 + 300493a: fca42e23 sw a0,-36(s0) + int floatVal = (long)(floatScale * (fltNum - integerVal)); + 300493e: fdc42783 lw a5,-36(s0) + 3004942: d017f753 fcvt.s.wu fa4,a5 + 3004946: fe042783 lw a5,-32(s0) + 300494a: d007f7d3 fcvt.s.w fa5,a5 + 300494e: fcc42687 flw fa3,-52(s0) + 3004952: 08f6f7d3 fsub.s fa5,fa3,fa5 + 3004956: 10f777d3 fmul.s fa5,fa4,fa5 + 300495a: c00797d3 fcvt.w.s a5,fa5,rtz + 300495e: fef42423 sw a5,-24(s0) + /* Half-adjust: round up or round down */ + if (floatVal % DECIMAL_BASE >= HALF_ADJUST_BOUNDARY) { + 3004962: fe842703 lw a4,-24(s0) + 3004966: 47a9 li a5,10 + 3004968: 02f77733 remu a4,a4,a5 + 300496c: 4791 li a5,4 + 300496e: 00e7fb63 bgeu a5,a4,3004984 + floatVal = floatVal / DECIMAL_BASE + 1; + 3004972: fe842703 lw a4,-24(s0) + 3004976: 47a9 li a5,10 + 3004978: 02f757b3 divu a5,a4,a5 + 300497c: 0785 addi a5,a5,1 + 300497e: fef42423 sw a5,-24(s0) + 3004982: a801 j 3004992 + } else { + floatVal = floatVal / DECIMAL_BASE; + 3004984: fe842703 lw a4,-24(s0) + 3004988: 47a9 li a5,10 + 300498a: 02f757b3 divu a5,a4,a5 + 300498e: fef42423 sw a5,-24(s0) + } + cnt += DBG_PrintInt(integerVal); + 3004992: fe042503 lw a0,-32(s0) + 3004996: 3575 jal ra,3004842 + 3004998: 872a mv a4,a0 + 300499a: fec42783 lw a5,-20(s0) + 300499e: 97ba add a5,a5,a4 + 30049a0: fef42623 sw a5,-20(s0) + DBG_PrintCh('.'); + 30049a4: 02e00513 li a0,46 + 30049a8: 3955 jal ra,300465c + cnt += 1; + 30049aa: fec42783 lw a5,-20(s0) + 30049ae: 0785 addi a5,a5,1 + 30049b0: fef42623 sw a5,-20(s0) + /* Pad 0 in float part */ + unsigned int fltCnt = DBG_CountDigits(floatVal, DECIMAL); + 30049b4: 45a9 li a1,10 + 30049b6: fe842503 lw a0,-24(s0) + 30049ba: 33bd jal ra,3004728 + 30049bc: fca42c23 sw a0,-40(s0) + if (precision > fltCnt) { + 30049c0: fc842703 lw a4,-56(s0) + 30049c4: fd842783 lw a5,-40(s0) + 30049c8: 02e7f763 bgeu a5,a4,30049f6 + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 30049cc: fe042223 sw zero,-28(s0) + 30049d0: a809 j 30049e2 + DBG_PrintCh('0'); /* add '0' */ + 30049d2: 03000513 li a0,48 + 30049d6: 3159 jal ra,300465c + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 30049d8: fe442783 lw a5,-28(s0) + 30049dc: 0785 addi a5,a5,1 + 30049de: fef42223 sw a5,-28(s0) + 30049e2: fc842703 lw a4,-56(s0) + 30049e6: fd842783 lw a5,-40(s0) + 30049ea: 40f707b3 sub a5,a4,a5 + 30049ee: fe442703 lw a4,-28(s0) + 30049f2: fef760e3 bltu a4,a5,30049d2 + } + } + DBG_PutUnsignedNum(floatVal, DECIMAL, fltCnt); /* print unsigned number */ + 30049f6: fe842783 lw a5,-24(s0) + 30049fa: fd842603 lw a2,-40(s0) + 30049fe: 45a9 li a1,10 + 3004a00: 853e mv a0,a5 + 3004a02: 3379 jal ra,3004790 + cnt += precision; + 3004a04: fec42703 lw a4,-20(s0) + 3004a08: fc842783 lw a5,-56(s0) + 3004a0c: 97ba add a5,a5,a4 + 3004a0e: fef42623 sw a5,-20(s0) + return cnt; + 3004a12: fec42783 lw a5,-20(s0) +} + 3004a16: 853e mv a0,a5 + 3004a18: 50f2 lw ra,60(sp) + 3004a1a: 5462 lw s0,56(sp) + 3004a1c: 6121 addi sp,sp,64 + 3004a1e: 8082 ret + +03004a20 : + * @param ch The format specifier. + * @param paramList The pointer of the variable parameter list. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int ParseSpecifier(const char ch, va_list *paramList) +{ + 3004a20: 7139 addi sp,sp,-64 + 3004a22: de06 sw ra,60(sp) + 3004a24: dc22 sw s0,56(sp) + 3004a26: 0080 addi s0,sp,64 + 3004a28: 87aa mv a5,a0 + 3004a2a: fcb42423 sw a1,-56(s0) + 3004a2e: fcf407a3 sb a5,-49(s0) + unsigned int cnt = 0; + 3004a32: fe042623 sw zero,-20(s0) + unsigned int tmpCnt; + char chVal = 0; + 3004a36: fe0405a3 sb zero,-21(s0) + const char *strVal = NULL; + 3004a3a: fe042223 sw zero,-28(s0) + int intVal = 0; + 3004a3e: fe042023 sw zero,-32(s0) + unsigned int unsignedVal = 0; + 3004a42: fc042e23 sw zero,-36(s0) + unsigned int hexVal = 0; + 3004a46: fc042c23 sw zero,-40(s0) + float fltVal = 0; + 3004a4a: fc042a23 sw zero,-44(s0) + switch (ch) { + 3004a4e: fcf40783 lb a5,-49(s0) + 3004a52: fa878793 addi a5,a5,-88 + 3004a56: 02000713 li a4,32 + 3004a5a: 14f76063 bltu a4,a5,3004b9a + 3004a5e: 00279713 slli a4,a5,0x2 + 3004a62: 030077b7 lui a5,0x3007 + 3004a66: 8f878793 addi a5,a5,-1800 # 30068f8 + 3004a6a: 97ba add a5,a5,a4 + 3004a6c: 439c lw a5,0(a5) + 3004a6e: 8782 jr a5 + case 'c': /* Character format data. */ + chVal = VA_ARG(*paramList, int); /* Use type int because of byte alignment */ + 3004a70: fc842783 lw a5,-56(s0) + 3004a74: 439c lw a5,0(a5) + 3004a76: 00478693 addi a3,a5,4 + 3004a7a: fc842703 lw a4,-56(s0) + 3004a7e: c314 sw a3,0(a4) + 3004a80: 439c lw a5,0(a5) + 3004a82: fef405a3 sb a5,-21(s0) + DBG_PrintCh(chVal); + 3004a86: feb40783 lb a5,-21(s0) + 3004a8a: 853e mv a0,a5 + 3004a8c: 3ec1 jal ra,300465c + cnt += 1; + 3004a8e: fec42783 lw a5,-20(s0) + 3004a92: 0785 addi a5,a5,1 + 3004a94: fef42623 sw a5,-20(s0) + break; + 3004a98: aa19 j 3004bae + case 's': /* String format data. */ + strVal = VA_ARG(*paramList, const char *); + 3004a9a: fc842783 lw a5,-56(s0) + 3004a9e: 439c lw a5,0(a5) + 3004aa0: 00478693 addi a3,a5,4 + 3004aa4: fc842703 lw a4,-56(s0) + 3004aa8: c314 sw a3,0(a4) + 3004aaa: 439c lw a5,0(a5) + 3004aac: fef42223 sw a5,-28(s0) + cnt += DBG_PrintStr(strVal); + 3004ab0: fe442503 lw a0,-28(s0) + 3004ab4: 36ed jal ra,300469e + 3004ab6: 87aa mv a5,a0 + 3004ab8: 873e mv a4,a5 + 3004aba: fec42783 lw a5,-20(s0) + 3004abe: 97ba add a5,a5,a4 + 3004ac0: fef42623 sw a5,-20(s0) + break; + 3004ac4: a0ed j 3004bae + case 'd': /* Integer decimal data. */ + intVal = VA_ARG(*paramList, int); + 3004ac6: fc842783 lw a5,-56(s0) + 3004aca: 439c lw a5,0(a5) + 3004acc: 00478693 addi a3,a5,4 + 3004ad0: fc842703 lw a4,-56(s0) + 3004ad4: c314 sw a3,0(a4) + 3004ad6: 439c lw a5,0(a5) + 3004ad8: fef42023 sw a5,-32(s0) + cnt += DBG_PrintInt(intVal); + 3004adc: fe042503 lw a0,-32(s0) + 3004ae0: 338d jal ra,3004842 + 3004ae2: 872a mv a4,a0 + 3004ae4: fec42783 lw a5,-20(s0) + 3004ae8: 97ba add a5,a5,a4 + 3004aea: fef42623 sw a5,-20(s0) + break; + 3004aee: a0c1 j 3004bae + case 'u': /* Unsigned decimal data. */ + unsignedVal = VA_ARG(*paramList, unsigned int); + 3004af0: fc842783 lw a5,-56(s0) + 3004af4: 439c lw a5,0(a5) + 3004af6: 00478693 addi a3,a5,4 + 3004afa: fc842703 lw a4,-56(s0) + 3004afe: c314 sw a3,0(a4) + 3004b00: 439c lw a5,0(a5) + 3004b02: fcf42e23 sw a5,-36(s0) + tmpCnt = DBG_CountDigits(unsignedVal, DECIMAL); + 3004b06: fdc42783 lw a5,-36(s0) + 3004b0a: 45a9 li a1,10 + 3004b0c: 853e mv a0,a5 + 3004b0e: 3929 jal ra,3004728 + 3004b10: fca42823 sw a0,-48(s0) + DBG_PutUnsignedNum(unsignedVal, DECIMAL, tmpCnt); + 3004b14: fd042603 lw a2,-48(s0) + 3004b18: 45a9 li a1,10 + 3004b1a: fdc42503 lw a0,-36(s0) + 3004b1e: 398d jal ra,3004790 + cnt += tmpCnt; + 3004b20: fec42703 lw a4,-20(s0) + 3004b24: fd042783 lw a5,-48(s0) + 3004b28: 97ba add a5,a5,a4 + 3004b2a: fef42623 sw a5,-20(s0) + break; + 3004b2e: a041 j 3004bae + case 'x': /* Hexadecimal data. */ + case 'X': + case 'p': /* Address data. */ + hexVal = VA_ARG(*paramList, unsigned int); + 3004b30: fc842783 lw a5,-56(s0) + 3004b34: 439c lw a5,0(a5) + 3004b36: 00478693 addi a3,a5,4 + 3004b3a: fc842703 lw a4,-56(s0) + 3004b3e: c314 sw a3,0(a4) + 3004b40: 439c lw a5,0(a5) + 3004b42: fcf42c23 sw a5,-40(s0) + cnt += DBG_PrintHex(hexVal); + 3004b46: fd842503 lw a0,-40(s0) + 3004b4a: 3b99 jal ra,30048a0 + 3004b4c: 872a mv a4,a0 + 3004b4e: fec42783 lw a5,-20(s0) + 3004b52: 97ba add a5,a5,a4 + 3004b54: fef42623 sw a5,-20(s0) + break; + 3004b58: a899 j 3004bae + case 'f': /* Floating-point data. */ + fltVal = VA_ARG(*paramList, double); + 3004b5a: fc842783 lw a5,-56(s0) + 3004b5e: 439c lw a5,0(a5) + 3004b60: 079d addi a5,a5,7 + 3004b62: 9be1 andi a5,a5,-8 + 3004b64: 00878693 addi a3,a5,8 + 3004b68: fc842703 lw a4,-56(s0) + 3004b6c: c314 sw a3,0(a4) + 3004b6e: 0047a803 lw a6,4(a5) + 3004b72: 439c lw a5,0(a5) + 3004b74: 853e mv a0,a5 + 3004b76: 85c2 mv a1,a6 + 3004b78: 7b0010ef jal ra,3006328 <__truncdfsf2> + 3004b7c: 20a507d3 fmv.s fa5,fa0 + 3004b80: fcf42a27 fsw fa5,-44(s0) + cnt += DBG_PrintFlt(fltVal, 5); /* default precision: 5 */ + 3004b84: 4515 li a0,5 + 3004b86: fd442507 flw fa0,-44(s0) + 3004b8a: 3ba9 jal ra,30048e4 + 3004b8c: 872a mv a4,a0 + 3004b8e: fec42783 lw a5,-20(s0) + 3004b92: 97ba add a5,a5,a4 + 3004b94: fef42623 sw a5,-20(s0) + break; + 3004b98: a819 j 3004bae + default: + DBG_PrintCh(ch); + 3004b9a: fcf40783 lb a5,-49(s0) + 3004b9e: 853e mv a0,a5 + 3004ba0: 3c75 jal ra,300465c + cnt += 1; + 3004ba2: fec42783 lw a5,-20(s0) + 3004ba6: 0785 addi a5,a5,1 + 3004ba8: fef42623 sw a5,-20(s0) + break; + 3004bac: 0001 nop + } + return cnt; + 3004bae: fec42783 lw a5,-20(s0) +} + 3004bb2: 853e mv a0,a5 + 3004bb4: 50f2 lw ra,60(sp) + 3004bb6: 5462 lw s0,56(sp) + 3004bb8: 6121 addi sp,sp,64 + 3004bba: 8082 ret + +03004bbc : + * @param intNum The decimal number to be printed. + * @param fieldWidth Field width. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintIntWithField(int intNum, int fieldWidth) +{ + 3004bbc: 7139 addi sp,sp,-64 + 3004bbe: de06 sw ra,60(sp) + 3004bc0: dc22 sw s0,56(sp) + 3004bc2: 0080 addi s0,sp,64 + 3004bc4: fca42623 sw a0,-52(s0) + 3004bc8: fcb42423 sw a1,-56(s0) + int zeroCnt = 0; + 3004bcc: fc042e23 sw zero,-36(s0) + int digitsCnt = 0; + 3004bd0: fe042623 sw zero,-20(s0) + unsigned int cnt = 0; + 3004bd4: fe042423 sw zero,-24(s0) + + if (intNum == 0) { + 3004bd8: fcc42783 lw a5,-52(s0) + 3004bdc: e791 bnez a5,3004be8 + DBG_PrintCh('0'); + 3004bde: 03000513 li a0,48 + 3004be2: 3cad jal ra,300465c + return 1; + 3004be4: 4785 li a5,1 + 3004be6: a0dd j 3004ccc + } + if (intNum < 0) { + 3004be8: fcc42783 lw a5,-52(s0) + 3004bec: 0607dd63 bgez a5,3004c66 + DBG_PrintCh('-'); /* add symbol */ + 3004bf0: 02d00513 li a0,45 + 3004bf4: 34a5 jal ra,300465c + cnt++; + 3004bf6: fe842783 lw a5,-24(s0) + 3004bfa: 0785 addi a5,a5,1 + 3004bfc: fef42423 sw a5,-24(s0) + intNum = -intNum; + 3004c00: fcc42783 lw a5,-52(s0) + 3004c04: 40f007b3 neg a5,a5 + 3004c08: fcf42623 sw a5,-52(s0) + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 3004c0c: 45a9 li a1,10 + 3004c0e: fcc42503 lw a0,-52(s0) + 3004c12: 3e19 jal ra,3004728 + 3004c14: 87aa mv a5,a0 + 3004c16: fef42623 sw a5,-20(s0) + zeroCnt = fieldWidth - digitsCnt; + 3004c1a: fc842703 lw a4,-56(s0) + 3004c1e: fec42783 lw a5,-20(s0) + 3004c22: 40f707b3 sub a5,a4,a5 + 3004c26: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004c2a: fe042223 sw zero,-28(s0) + 3004c2e: a831 j 3004c4a + DBG_PrintCh('0'); /* add '0' */ + 3004c30: 03000513 li a0,48 + 3004c34: 3425 jal ra,300465c + cnt++; + 3004c36: fe842783 lw a5,-24(s0) + 3004c3a: 0785 addi a5,a5,1 + 3004c3c: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004c40: fe442783 lw a5,-28(s0) + 3004c44: 0785 addi a5,a5,1 + 3004c46: fef42223 sw a5,-28(s0) + 3004c4a: fe442703 lw a4,-28(s0) + 3004c4e: fdc42783 lw a5,-36(s0) + 3004c52: fcf74fe3 blt a4,a5,3004c30 + } + cnt += digitsCnt; + 3004c56: fec42783 lw a5,-20(s0) + 3004c5a: fe842703 lw a4,-24(s0) + 3004c5e: 97ba add a5,a5,a4 + 3004c60: fef42423 sw a5,-24(s0) + 3004c64: a891 j 3004cb8 + } else { + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 3004c66: 45a9 li a1,10 + 3004c68: fcc42503 lw a0,-52(s0) + 3004c6c: 3c75 jal ra,3004728 + 3004c6e: 87aa mv a5,a0 + 3004c70: fef42623 sw a5,-20(s0) + cnt = digitsCnt; + 3004c74: fec42783 lw a5,-20(s0) + 3004c78: fef42423 sw a5,-24(s0) + zeroCnt = fieldWidth - digitsCnt; + 3004c7c: fc842703 lw a4,-56(s0) + 3004c80: fec42783 lw a5,-20(s0) + 3004c84: 40f707b3 sub a5,a4,a5 + 3004c88: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004c8c: fe042023 sw zero,-32(s0) + 3004c90: a831 j 3004cac + DBG_PrintCh('0'); /* add '0' */ + 3004c92: 03000513 li a0,48 + 3004c96: 32d9 jal ra,300465c + cnt++; + 3004c98: fe842783 lw a5,-24(s0) + 3004c9c: 0785 addi a5,a5,1 + 3004c9e: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004ca2: fe042783 lw a5,-32(s0) + 3004ca6: 0785 addi a5,a5,1 + 3004ca8: fef42023 sw a5,-32(s0) + 3004cac: fe042703 lw a4,-32(s0) + 3004cb0: fdc42783 lw a5,-36(s0) + 3004cb4: fcf74fe3 blt a4,a5,3004c92 + } + } + DBG_PutUnsignedNum(intNum, DECIMAL, digitsCnt); + 3004cb8: fcc42783 lw a5,-52(s0) + 3004cbc: fec42703 lw a4,-20(s0) + 3004cc0: 863a mv a2,a4 + 3004cc2: 45a9 li a1,10 + 3004cc4: 853e mv a0,a5 + 3004cc6: 34e9 jal ra,3004790 + return cnt; + 3004cc8: fe842783 lw a5,-24(s0) +} + 3004ccc: 853e mv a0,a5 + 3004cce: 50f2 lw ra,60(sp) + 3004cd0: 5462 lw s0,56(sp) + 3004cd2: 6121 addi sp,sp,64 + 3004cd4: 8082 ret + +03004cd6 : + +static int DBG_Atoi(const char **s) +{ + 3004cd6: 7179 addi sp,sp,-48 + 3004cd8: d622 sw s0,44(sp) + 3004cda: 1800 addi s0,sp,48 + 3004cdc: fca42e23 sw a0,-36(s0) + int i, c; + + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 3004ce0: fe042623 sw zero,-20(s0) + 3004ce4: a02d j 3004d0e + i = i * 10 + c - '0'; /* 10: decimal */ + 3004ce6: fec42703 lw a4,-20(s0) + 3004cea: 47a9 li a5,10 + 3004cec: 02f70733 mul a4,a4,a5 + 3004cf0: fe842783 lw a5,-24(s0) + 3004cf4: 97ba add a5,a5,a4 + 3004cf6: fd078793 addi a5,a5,-48 + 3004cfa: fef42623 sw a5,-20(s0) + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 3004cfe: fdc42783 lw a5,-36(s0) + 3004d02: 439c lw a5,0(a5) + 3004d04: 00178713 addi a4,a5,1 + 3004d08: fdc42783 lw a5,-36(s0) + 3004d0c: c398 sw a4,0(a5) + 3004d0e: fdc42783 lw a5,-36(s0) + 3004d12: 439c lw a5,0(a5) + 3004d14: 00078783 lb a5,0(a5) + 3004d18: fef42423 sw a5,-24(s0) + 3004d1c: fe842703 lw a4,-24(s0) + 3004d20: 02f00793 li a5,47 + 3004d24: 00e7d863 bge a5,a4,3004d34 + 3004d28: fe842703 lw a4,-24(s0) + 3004d2c: 03900793 li a5,57 + 3004d30: fae7dbe3 bge a5,a4,3004ce6 + } + return i; + 3004d34: fec42783 lw a5,-20(s0) +} + 3004d38: 853e mv a0,a5 + 3004d3a: 5432 lw s0,44(sp) + 3004d3c: 6145 addi sp,sp,48 + 3004d3e: 8082 ret + +03004d40 : + * @param ... Variable parameter list. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, return BASE_STATUS_ERROR. + */ +int DBG_UartPrintf(const char *format, ...) +{ + 3004d40: 711d addi sp,sp,-96 + 3004d42: de06 sw ra,60(sp) + 3004d44: dc22 sw s0,56(sp) + 3004d46: 0080 addi s0,sp,64 + 3004d48: fca42623 sw a0,-52(s0) + 3004d4c: c04c sw a1,4(s0) + 3004d4e: c410 sw a2,8(s0) + 3004d50: c454 sw a3,12(s0) + 3004d52: c818 sw a4,16(s0) + 3004d54: c85c sw a5,20(s0) + 3004d56: 01042c23 sw a6,24(s0) + 3004d5a: 01142e23 sw a7,28(s0) + DEBUG_ASSERT_PARAM(format != NULL); + int cnt = 0; + 3004d5e: fe042623 sw zero,-20(s0) + int fieldWidth = 0; + 3004d62: fe042423 sw zero,-24(s0) + int floatPrecision = 0; + 3004d66: fe042223 sw zero,-28(s0) + float fltVal = 0; + 3004d6a: fe042023 sw zero,-32(s0) + int intVal = 0; + 3004d6e: fc042e23 sw zero,-36(s0) + va_list paramList; + VA_START(paramList, format); + 3004d72: 02040793 addi a5,s0,32 + 3004d76: 1791 addi a5,a5,-28 + 3004d78: fcf42c23 sw a5,-40(s0) + + while (*format != '\0') { + 3004d7c: aa09 j 3004e8e + if (*format != '%') { + 3004d7e: fcc42783 lw a5,-52(s0) + 3004d82: 00078703 lb a4,0(a5) + 3004d86: 02500793 li a5,37 + 3004d8a: 00f70e63 beq a4,a5,3004da6 + DBG_PrintCh(*format); + 3004d8e: fcc42783 lw a5,-52(s0) + 3004d92: 00078783 lb a5,0(a5) + 3004d96: 853e mv a0,a5 + 3004d98: 30d1 jal ra,300465c + cnt += 1; + 3004d9a: fec42783 lw a5,-20(s0) + 3004d9e: 0785 addi a5,a5,1 + 3004da0: fef42623 sw a5,-20(s0) + 3004da4: a0c5 j 3004e84 + } else { + format++; + 3004da6: fcc42783 lw a5,-52(s0) + 3004daa: 0785 addi a5,a5,1 + 3004dac: fcf42623 sw a5,-52(s0) + if (*format == '0') { + 3004db0: fcc42783 lw a5,-52(s0) + 3004db4: 00078703 lb a4,0(a5) + 3004db8: 03000793 li a5,48 + 3004dbc: 04f71263 bne a4,a5,3004e00 + format++; + 3004dc0: fcc42783 lw a5,-52(s0) + 3004dc4: 0785 addi a5,a5,1 + 3004dc6: fcf42623 sw a5,-52(s0) + fieldWidth = DBG_Atoi(&format); + 3004dca: fcc40793 addi a5,s0,-52 + 3004dce: 853e mv a0,a5 + 3004dd0: 3719 jal ra,3004cd6 + 3004dd2: fea42423 sw a0,-24(s0) + intVal = VA_ARG(paramList, int); + 3004dd6: fd842783 lw a5,-40(s0) + 3004dda: 00478713 addi a4,a5,4 + 3004dde: fce42c23 sw a4,-40(s0) + 3004de2: 439c lw a5,0(a5) + 3004de4: fcf42e23 sw a5,-36(s0) + cnt += DBG_PrintIntWithField(intVal, fieldWidth); + 3004de8: fe842583 lw a1,-24(s0) + 3004dec: fdc42503 lw a0,-36(s0) + 3004df0: 33f1 jal ra,3004bbc + 3004df2: 872a mv a4,a0 + 3004df4: fec42783 lw a5,-20(s0) + 3004df8: 97ba add a5,a5,a4 + 3004dfa: fef42623 sw a5,-20(s0) + 3004dfe: a059 j 3004e84 + } else if (*format == '.') { + 3004e00: fcc42783 lw a5,-52(s0) + 3004e04: 00078703 lb a4,0(a5) + 3004e08: 02e00793 li a5,46 + 3004e0c: 04f71d63 bne a4,a5,3004e66 + format++; + 3004e10: fcc42783 lw a5,-52(s0) + 3004e14: 0785 addi a5,a5,1 + 3004e16: fcf42623 sw a5,-52(s0) + floatPrecision = DBG_Atoi(&format); + 3004e1a: fcc40793 addi a5,s0,-52 + 3004e1e: 853e mv a0,a5 + 3004e20: 3d5d jal ra,3004cd6 + 3004e22: fea42223 sw a0,-28(s0) + fltVal = VA_ARG(paramList, double); + 3004e26: fd842783 lw a5,-40(s0) + 3004e2a: 079d addi a5,a5,7 + 3004e2c: 9be1 andi a5,a5,-8 + 3004e2e: 00878713 addi a4,a5,8 + 3004e32: fce42c23 sw a4,-40(s0) + 3004e36: 0047a803 lw a6,4(a5) + 3004e3a: 439c lw a5,0(a5) + 3004e3c: 853e mv a0,a5 + 3004e3e: 85c2 mv a1,a6 + 3004e40: 4e8010ef jal ra,3006328 <__truncdfsf2> + 3004e44: 20a507d3 fmv.s fa5,fa0 + 3004e48: fef42027 fsw fa5,-32(s0) + cnt += DBG_PrintFlt(fltVal, floatPrecision); + 3004e4c: fe442783 lw a5,-28(s0) + 3004e50: 853e mv a0,a5 + 3004e52: fe042507 flw fa0,-32(s0) + 3004e56: 3479 jal ra,30048e4 + 3004e58: 872a mv a4,a0 + 3004e5a: fec42783 lw a5,-20(s0) + 3004e5e: 97ba add a5,a5,a4 + 3004e60: fef42623 sw a5,-20(s0) + 3004e64: a005 j 3004e84 + } else { + cnt += ParseSpecifier(*format, ¶mList); + 3004e66: fcc42783 lw a5,-52(s0) + 3004e6a: 00078783 lb a5,0(a5) + 3004e6e: fd840713 addi a4,s0,-40 + 3004e72: 85ba mv a1,a4 + 3004e74: 853e mv a0,a5 + 3004e76: 366d jal ra,3004a20 + 3004e78: 872a mv a4,a0 + 3004e7a: fec42783 lw a5,-20(s0) + 3004e7e: 97ba add a5,a5,a4 + 3004e80: fef42623 sw a5,-20(s0) + } + } + format++; + 3004e84: fcc42783 lw a5,-52(s0) + 3004e88: 0785 addi a5,a5,1 + 3004e8a: fcf42623 sw a5,-52(s0) + while (*format != '\0') { + 3004e8e: fcc42783 lw a5,-52(s0) + 3004e92: 00078783 lb a5,0(a5) + 3004e96: ee0794e3 bnez a5,3004d7e + } + VA_END(paramList); + return cnt; + 3004e9a: fec42783 lw a5,-20(s0) +} + 3004e9e: 853e mv a0,a5 + 3004ea0: 50f2 lw ra,60(sp) + 3004ea2: 5462 lw s0,56(sp) + 3004ea4: 6125 addi sp,sp,96 + 3004ea6: 8082 ret + +03004ea8 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param regValue value of @ref IOCMG_REG. + * @retval None. + */ +static inline void DCL_IOCMG_SetRegValue(IOCMG_REG *iocmgRegx, unsigned int regValue) +{ + 3004ea8: 1101 addi sp,sp,-32 + 3004eaa: ce06 sw ra,28(sp) + 3004eac: cc22 sw s0,24(sp) + 3004eae: 1000 addi s0,sp,32 + 3004eb0: fea42623 sw a0,-20(s0) + 3004eb4: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004eb8: fec42703 lw a4,-20(s0) + 3004ebc: 77c1 lui a5,0xffff0 + 3004ebe: 8f7d and a4,a4,a5 + 3004ec0: 147f07b7 lui a5,0x147f0 + 3004ec4: 00f70a63 beq a4,a5,3004ed8 + 3004ec8: 08b00593 li a1,139 + 3004ecc: 030077b7 lui a5,0x3007 + 3004ed0: 97c78513 addi a0,a5,-1668 # 300697c + 3004ed4: 2df1 jal ra,30055b0 + 3004ed6: a001 j 3004ed6 + iocmgRegx->reg = regValue; + 3004ed8: fec42783 lw a5,-20(s0) + 3004edc: fe842703 lw a4,-24(s0) + 3004ee0: c398 sw a4,0(a5) +} + 3004ee2: 0001 nop + 3004ee4: 40f2 lw ra,28(sp) + 3004ee6: 4462 lw s0,24(sp) + 3004ee8: 6105 addi sp,sp,32 + 3004eea: 8082 ret + +03004eec : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param driveRate value of @ref IOCMG_DriveRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetDriveRate(IOCMG_REG *iocmgRegx, IOCMG_DriveRate driveRate) +{ + 3004eec: 1101 addi sp,sp,-32 + 3004eee: ce06 sw ra,28(sp) + 3004ef0: cc22 sw s0,24(sp) + 3004ef2: 1000 addi s0,sp,32 + 3004ef4: fea42623 sw a0,-20(s0) + 3004ef8: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004efc: fec42703 lw a4,-20(s0) + 3004f00: 77c1 lui a5,0xffff0 + 3004f02: 8f7d and a4,a4,a5 + 3004f04: 147f07b7 lui a5,0x147f0 + 3004f08: 00f70a63 beq a4,a5,3004f1c + 3004f0c: 0ba00593 li a1,186 + 3004f10: 030077b7 lui a5,0x3007 + 3004f14: 97c78513 addi a0,a5,-1668 # 300697c + 3004f18: 2d61 jal ra,30055b0 + 3004f1a: a001 j 3004f1a + IOCMG_PARAM_CHECK_NO_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4); + 3004f1c: fe842703 lw a4,-24(s0) + 3004f20: 478d li a5,3 + 3004f22: 00e7fa63 bgeu a5,a4,3004f36 + 3004f26: 0bb00593 li a1,187 + 3004f2a: 030077b7 lui a5,0x3007 + 3004f2e: 97c78513 addi a0,a5,-1668 # 300697c + 3004f32: 2dbd jal ra,30055b0 + 3004f34: a839 j 3004f52 + iocmgRegx->BIT.ds = driveRate; + 3004f36: fe842783 lw a5,-24(s0) + 3004f3a: 8b8d andi a5,a5,3 + 3004f3c: 0ff7f693 andi a3,a5,255 + 3004f40: fec42703 lw a4,-20(s0) + 3004f44: 431c lw a5,0(a4) + 3004f46: 8a8d andi a3,a3,3 + 3004f48: 0692 slli a3,a3,0x4 + 3004f4a: fcf7f793 andi a5,a5,-49 + 3004f4e: 8fd5 or a5,a5,a3 + 3004f50: c31c sw a5,0(a4) +} + 3004f52: 40f2 lw ra,28(sp) + 3004f54: 4462 lw s0,24(sp) + 3004f56: 6105 addi sp,sp,32 + 3004f58: 8082 ret + +03004f5a : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param pullMode value of @ref IOCMG_PullMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetPullMode(IOCMG_REG *iocmgRegx, IOCMG_PullMode pullMode) +{ + 3004f5a: 1101 addi sp,sp,-32 + 3004f5c: ce06 sw ra,28(sp) + 3004f5e: cc22 sw s0,24(sp) + 3004f60: 1000 addi s0,sp,32 + 3004f62: fea42623 sw a0,-20(s0) + 3004f66: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004f6a: fec42703 lw a4,-20(s0) + 3004f6e: 77c1 lui a5,0xffff0 + 3004f70: 8f7d and a4,a4,a5 + 3004f72: 147f07b7 lui a5,0x147f0 + 3004f76: 00f70a63 beq a4,a5,3004f8a + 3004f7a: 0d200593 li a1,210 + 3004f7e: 030077b7 lui a5,0x3007 + 3004f82: 97c78513 addi a0,a5,-1668 # 300697c + 3004f86: 252d jal ra,30055b0 + 3004f88: a001 j 3004f88 + IOCMG_PARAM_CHECK_NO_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE); + 3004f8a: fe842703 lw a4,-24(s0) + 3004f8e: 478d li a5,3 + 3004f90: 00e7fa63 bgeu a5,a4,3004fa4 + 3004f94: 0d300593 li a1,211 + 3004f98: 030077b7 lui a5,0x3007 + 3004f9c: 97c78513 addi a0,a5,-1668 # 300697c + 3004fa0: 2d01 jal ra,30055b0 + 3004fa2: a835 j 3004fde + iocmgRegx->BIT.pu = (pullMode & 0x02) >> 1; /* 10b: pull up mode */ + 3004fa4: fe842783 lw a5,-24(s0) + 3004fa8: 8385 srli a5,a5,0x1 + 3004faa: 8b85 andi a5,a5,1 + 3004fac: 0ff7f693 andi a3,a5,255 + 3004fb0: fec42703 lw a4,-20(s0) + 3004fb4: 431c lw a5,0(a4) + 3004fb6: 8a85 andi a3,a3,1 + 3004fb8: 06a2 slli a3,a3,0x8 + 3004fba: eff7f793 andi a5,a5,-257 + 3004fbe: 8fd5 or a5,a5,a3 + 3004fc0: c31c sw a5,0(a4) + iocmgRegx->BIT.pd = pullMode & 0x01; /* 01b: pull down mode */ + 3004fc2: fe842783 lw a5,-24(s0) + 3004fc6: 8b85 andi a5,a5,1 + 3004fc8: 0ff7f693 andi a3,a5,255 + 3004fcc: fec42703 lw a4,-20(s0) + 3004fd0: 431c lw a5,0(a4) + 3004fd2: 8a85 andi a3,a3,1 + 3004fd4: 069e slli a3,a3,0x7 + 3004fd6: f7f7f793 andi a5,a5,-129 + 3004fda: 8fd5 or a5,a5,a3 + 3004fdc: c31c sw a5,0(a4) +} + 3004fde: 40f2 lw ra,28(sp) + 3004fe0: 4462 lw s0,24(sp) + 3004fe2: 6105 addi sp,sp,32 + 3004fe4: 8082 ret + +03004fe6 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param levelShiftRate value of @ref IOCMG_LevelShiftRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetLevelShiftRate(IOCMG_REG *iocmgRegx, IOCMG_LevelShiftRate levelShiftRate) +{ + 3004fe6: 1101 addi sp,sp,-32 + 3004fe8: ce06 sw ra,28(sp) + 3004fea: cc22 sw s0,24(sp) + 3004fec: 1000 addi s0,sp,32 + 3004fee: fea42623 sw a0,-20(s0) + 3004ff2: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004ff6: fec42703 lw a4,-20(s0) + 3004ffa: 77c1 lui a5,0xffff0 + 3004ffc: 8f7d and a4,a4,a5 + 3004ffe: 147f07b7 lui a5,0x147f0 + 3005002: 00f70a63 beq a4,a5,3005016 + 3005006: 0ed00593 li a1,237 + 300500a: 030077b7 lui a5,0x3007 + 300500e: 97c78513 addi a0,a5,-1668 # 300697c + 3005012: 2b79 jal ra,30055b0 + 3005014: a001 j 3005014 + IOCMG_PARAM_CHECK_NO_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX && levelShiftRate >= LEVEL_SHIFT_RATE_FAST); + 3005016: fe842703 lw a4,-24(s0) + 300501a: 4785 li a5,1 + 300501c: 00e7fa63 bgeu a5,a4,3005030 + 3005020: 0ee00593 li a1,238 + 3005024: 030077b7 lui a5,0x3007 + 3005028: 97c78513 addi a0,a5,-1668 # 300697c + 300502c: 2351 jal ra,30055b0 + 300502e: a839 j 300504c + iocmgRegx->BIT.sr = levelShiftRate; + 3005030: fe842783 lw a5,-24(s0) + 3005034: 8b85 andi a5,a5,1 + 3005036: 0ff7f693 andi a3,a5,255 + 300503a: fec42703 lw a4,-20(s0) + 300503e: 431c lw a5,0(a4) + 3005040: 8a85 andi a3,a3,1 + 3005042: 06a6 slli a3,a3,0x9 + 3005044: dff7f793 andi a5,a5,-513 + 3005048: 8fd5 or a5,a5,a3 + 300504a: c31c sw a5,0(a4) +} + 300504c: 40f2 lw ra,28(sp) + 300504e: 4462 lw s0,24(sp) + 3005050: 6105 addi sp,sp,32 + 3005052: 8082 ret + +03005054 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param schmidtMode value of @ref IOCMG_SchmidtMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetSchmidtMode(IOCMG_REG *iocmgRegx, IOCMG_SchmidtMode schmidtMode) +{ + 3005054: 1101 addi sp,sp,-32 + 3005056: ce06 sw ra,28(sp) + 3005058: cc22 sw s0,24(sp) + 300505a: 1000 addi s0,sp,32 + 300505c: fea42623 sw a0,-20(s0) + 3005060: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3005064: fec42703 lw a4,-20(s0) + 3005068: 77c1 lui a5,0xffff0 + 300506a: 8f7d and a4,a4,a5 + 300506c: 147f07b7 lui a5,0x147f0 + 3005070: 00f70a63 beq a4,a5,3005084 + 3005074: 10500593 li a1,261 + 3005078: 030077b7 lui a5,0x3007 + 300507c: 97c78513 addi a0,a5,-1668 # 300697c + 3005080: 2b05 jal ra,30055b0 + 3005082: a001 j 3005082 + IOCMG_PARAM_CHECK_NO_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE); + 3005084: fe842703 lw a4,-24(s0) + 3005088: 4785 li a5,1 + 300508a: 00e7fa63 bgeu a5,a4,300509e + 300508e: 10600593 li a1,262 + 3005092: 030077b7 lui a5,0x3007 + 3005096: 97c78513 addi a0,a5,-1668 # 300697c + 300509a: 2b19 jal ra,30055b0 + 300509c: a839 j 30050ba + iocmgRegx->BIT.se = schmidtMode; + 300509e: fe842783 lw a5,-24(s0) + 30050a2: 8b85 andi a5,a5,1 + 30050a4: 0ff7f693 andi a3,a5,255 + 30050a8: fec42703 lw a4,-20(s0) + 30050ac: 431c lw a5,0(a4) + 30050ae: 8a85 andi a3,a3,1 + 30050b0: 06aa slli a3,a3,0xa + 30050b2: bff7f793 andi a5,a5,-1025 + 30050b6: 8fd5 or a5,a5,a3 + 30050b8: c31c sw a5,0(a4) +} + 30050ba: 40f2 lw ra,28(sp) + 30050bc: 4462 lw s0,24(sp) + 30050be: 6105 addi sp,sp,32 + 30050c0: 8082 ret + +030050c2 : + * @brief Get pins iocmg reg address + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_REG iocmg reg address. + */ +static IOCMG_REG* IOCMG_GetRegAddr(unsigned int pinTypedef) +{ + 30050c2: 7179 addi sp,sp,-48 + 30050c4: d622 sw s0,44(sp) + 30050c6: 1800 addi s0,sp,48 + 30050c8: fca42e23 sw a0,-36(s0) + /* decode pin's iocmg reg offset address in base address, and conver value to point address */ + unsigned int iocmgBaseAddrValue = (uintptr_t)IOCMG_BASE; + 30050cc: 147f07b7 lui a5,0x147f0 + 30050d0: fef42623 sw a5,-20(s0) + unsigned int iocmgRegOffsetAddrValue = (pinTypedef >> 16) & 0x00000FFF; /* 16 : shift 16 bit */ + 30050d4: fdc42783 lw a5,-36(s0) + 30050d8: 0107d713 srli a4,a5,0x10 + 30050dc: 6785 lui a5,0x1 + 30050de: 17fd addi a5,a5,-1 # fff + 30050e0: 8ff9 and a5,a5,a4 + 30050e2: fef42423 sw a5,-24(s0) + IOCMG_REG* iocmgRegxAddr = (IOCMG_REG*)(void*)(iocmgBaseAddrValue + iocmgRegOffsetAddrValue); + 30050e6: fec42703 lw a4,-20(s0) + 30050ea: fe842783 lw a5,-24(s0) + 30050ee: 97ba add a5,a5,a4 + 30050f0: fef42223 sw a5,-28(s0) + if (!IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegxAddr & IOCMG_BASE_ADDR_MASK))) { + 30050f4: fe442703 lw a4,-28(s0) + 30050f8: 77c1 lui a5,0xffff0 + 30050fa: 8f7d and a4,a4,a5 + 30050fc: 147f07b7 lui a5,0x147f0 + 3005100: 00f70463 beq a4,a5,3005108 + return NULL; + 3005104: 4781 li a5,0 + 3005106: a019 j 300510c + } + return iocmgRegxAddr; + 3005108: fe442783 lw a5,-28(s0) +} + 300510c: 853e mv a0,a5 + 300510e: 5432 lw s0,44(sp) + 3005110: 6145 addi sp,sp,48 + 3005112: 8082 ret + +03005114 : + * @brief Set pins as function mode + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinAltFuncMode(unsigned int pinTypedef) +{ + 3005114: 7179 addi sp,sp,-48 + 3005116: d606 sw ra,44(sp) + 3005118: d422 sw s0,40(sp) + 300511a: 1800 addi s0,sp,48 + 300511c: fca42e23 sw a0,-36(s0) + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3005120: fdc42503 lw a0,-36(s0) + 3005124: 3f79 jal ra,30050c2 + 3005126: fea42623 sw a0,-20(s0) + /* get iocmg reg default value */ + unsigned int regValue = pinTypedef & IOCMG_REG_VALUE_MASK; + 300512a: fdc42703 lw a4,-36(s0) + 300512e: 67c1 lui a5,0x10 + 3005130: 17fd addi a5,a5,-1 # ffff + 3005132: 8ff9 and a5,a5,a4 + 3005134: fef42423 sw a5,-24(s0) + DCL_IOCMG_SetRegValue(iocmgRegx, regValue); + 3005138: fe842583 lw a1,-24(s0) + 300513c: fec42503 lw a0,-20(s0) + 3005140: 33a5 jal ra,3004ea8 + return IOCMG_STATUS_OK; + 3005142: 4781 li a5,0 +} + 3005144: 853e mv a0,a5 + 3005146: 50b2 lw ra,44(sp) + 3005148: 5422 lw s0,40(sp) + 300514a: 6145 addi sp,sp,48 + 300514c: 8082 ret + +0300514e : + * @param pinTypedef the pin type defined in iomap.h + * @param pullMode function define as @ref IOCMG_PullMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinPullMode(unsigned int pinTypedef, IOCMG_PullMode pullMode) +{ + 300514e: 7179 addi sp,sp,-48 + 3005150: d606 sw ra,44(sp) + 3005152: d422 sw s0,40(sp) + 3005154: 1800 addi s0,sp,48 + 3005156: fca42e23 sw a0,-36(s0) + 300515a: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE, IOCMG_PARAM_ERROR); + 300515e: fd842703 lw a4,-40(s0) + 3005162: 478d li a5,3 + 3005164: 00e7fb63 bgeu a5,a4,300517a + 3005168: 07800593 li a1,120 + 300516c: 030077b7 lui a5,0x3007 + 3005170: 99c78513 addi a0,a5,-1636 # 300699c + 3005174: 2935 jal ra,30055b0 + 3005176: 4791 li a5,4 + 3005178: a821 j 3005190 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 300517a: fdc42503 lw a0,-36(s0) + 300517e: 3791 jal ra,30050c2 + 3005180: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetPullMode(iocmgRegx, pullMode); + 3005184: fd842583 lw a1,-40(s0) + 3005188: fec42503 lw a0,-20(s0) + 300518c: 33f9 jal ra,3004f5a + return IOCMG_STATUS_OK; + 300518e: 4781 li a5,0 +} + 3005190: 853e mv a0,a5 + 3005192: 50b2 lw ra,44(sp) + 3005194: 5422 lw s0,40(sp) + 3005196: 6145 addi sp,sp,48 + 3005198: 8082 ret + +0300519a : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinSchmidtMode(unsigned int pinTypedef, IOCMG_SchmidtMode schmidtMode) +{ + 300519a: 7179 addi sp,sp,-48 + 300519c: d606 sw ra,44(sp) + 300519e: d422 sw s0,40(sp) + 30051a0: 1800 addi s0,sp,48 + 30051a2: fca42e23 sw a0,-36(s0) + 30051a6: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE, IOCMG_PARAM_ERROR); + 30051aa: fd842703 lw a4,-40(s0) + 30051ae: 4785 li a5,1 + 30051b0: 00e7fb63 bgeu a5,a4,30051c6 + 30051b4: 09300593 li a1,147 + 30051b8: 030077b7 lui a5,0x3007 + 30051bc: 99c78513 addi a0,a5,-1636 # 300699c + 30051c0: 2ec5 jal ra,30055b0 + 30051c2: 4791 li a5,4 + 30051c4: a821 j 30051dc + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 30051c6: fdc42503 lw a0,-36(s0) + 30051ca: 3de5 jal ra,30050c2 + 30051cc: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetSchmidtMode(iocmgRegx, schmidtMode); + 30051d0: fd842583 lw a1,-40(s0) + 30051d4: fec42503 lw a0,-20(s0) + 30051d8: 3db5 jal ra,3005054 + return IOCMG_STATUS_OK; + 30051da: 4781 li a5,0 +} + 30051dc: 853e mv a0,a5 + 30051de: 50b2 lw ra,44(sp) + 30051e0: 5422 lw s0,40(sp) + 30051e2: 6145 addi sp,sp,48 + 30051e4: 8082 ret + +030051e6 : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinLevelShiftRate(unsigned int pinTypedef, IOCMG_LevelShiftRate levelShiftRate) +{ + 30051e6: 7179 addi sp,sp,-48 + 30051e8: d606 sw ra,44(sp) + 30051ea: d422 sw s0,40(sp) + 30051ec: 1800 addi s0,sp,48 + 30051ee: fca42e23 sw a0,-36(s0) + 30051f2: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX, IOCMG_PARAM_ERROR); + 30051f6: fd842703 lw a4,-40(s0) + 30051fa: 4785 li a5,1 + 30051fc: 00e7fb63 bgeu a5,a4,3005212 + 3005200: 0ae00593 li a1,174 + 3005204: 030077b7 lui a5,0x3007 + 3005208: 99c78513 addi a0,a5,-1636 # 300699c + 300520c: 2655 jal ra,30055b0 + 300520e: 4791 li a5,4 + 3005210: a821 j 3005228 + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate >= LEVEL_SHIFT_RATE_FAST, IOCMG_PARAM_ERROR); + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3005212: fdc42503 lw a0,-36(s0) + 3005216: 3575 jal ra,30050c2 + 3005218: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetLevelShiftRate(iocmgRegx, levelShiftRate); + 300521c: fd842583 lw a1,-40(s0) + 3005220: fec42503 lw a0,-20(s0) + 3005224: 33c9 jal ra,3004fe6 + return IOCMG_STATUS_OK; + 3005226: 4781 li a5,0 +} + 3005228: 853e mv a0,a5 + 300522a: 50b2 lw ra,44(sp) + 300522c: 5422 lw s0,40(sp) + 300522e: 6145 addi sp,sp,48 + 3005230: 8082 ret + +03005232 : + * @param pinTypedef the pin type defined in iomap.h + * @param driveRate function define as @ref IOCMG_DriveRate + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinDriveRate(unsigned int pinTypedef, IOCMG_DriveRate driveRate) +{ + 3005232: 7179 addi sp,sp,-48 + 3005234: d606 sw ra,44(sp) + 3005236: d422 sw s0,40(sp) + 3005238: 1800 addi s0,sp,48 + 300523a: fca42e23 sw a0,-36(s0) + 300523e: fcb42c23 sw a1,-40(s0) + /* get iocmg reg address */ + IOCMG_PARAM_CHECK_WITH_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4, IOCMG_PARAM_ERROR); + 3005242: fd842703 lw a4,-40(s0) + 3005246: 478d li a5,3 + 3005248: 00e7fb63 bgeu a5,a4,300525e + 300524c: 0cb00593 li a1,203 + 3005250: 030077b7 lui a5,0x3007 + 3005254: 99c78513 addi a0,a5,-1636 # 300699c + 3005258: 2ea1 jal ra,30055b0 + 300525a: 4791 li a5,4 + 300525c: a821 j 3005274 + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 300525e: fdc42503 lw a0,-36(s0) + 3005262: 3585 jal ra,30050c2 + 3005264: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetDriveRate(iocmgRegx, driveRate); + 3005268: fd842583 lw a1,-40(s0) + 300526c: fec42503 lw a0,-20(s0) + 3005270: 39b5 jal ra,3004eec + return IOCMG_STATUS_OK; + 3005272: 4781 li a5,0 +} + 3005274: 853e mv a0,a5 + 3005276: 50b2 lw ra,44(sp) + 3005278: 5422 lw s0,40(sp) + 300527a: 6145 addi sp,sp,48 + 300527c: 8082 ret + +0300527e : + * @param mode Timer Mode, @ref TIMER_Mode + * @retval true + * @retval false + */ +static inline bool IsTimerMode(TIMER_Mode mode) +{ + 300527e: 1101 addi sp,sp,-32 + 3005280: ce22 sw s0,28(sp) + 3005282: 1000 addi s0,sp,32 + 3005284: fea42623 sw a0,-20(s0) + return (((mode) == TIMER_MODE_RUN_FREE) || + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3005288: fec42783 lw a5,-20(s0) + 300528c: cb99 beqz a5,30052a2 + return (((mode) == TIMER_MODE_RUN_FREE) || + 300528e: fec42703 lw a4,-20(s0) + 3005292: 4785 li a5,1 + 3005294: 00f70763 beq a4,a5,30052a2 + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3005298: fec42703 lw a4,-20(s0) + 300529c: 4789 li a5,2 + 300529e: 00f71463 bne a4,a5,30052a6 + 30052a2: 4785 li a5,1 + 30052a4: a011 j 30052a8 + 30052a6: 4781 li a5,0 + 30052a8: 8b85 andi a5,a5,1 + 30052aa: 9f81 uxtb a5 + ((mode) == TIMER_MODE_RUN_ONTSHOT)); +} + 30052ac: 853e mv a0,a5 + 30052ae: 4472 lw s0,28(sp) + 30052b0: 6105 addi sp,sp,32 + 30052b2: 8082 ret + +030052b4 : + * @param mode Timer Interrupt Type, @ref TIMER_InterruptType + * @retval true + * @retval false + */ +static inline bool IsTimerInterruptType(TIMER_InterruptType interruptType) +{ + 30052b4: 1101 addi sp,sp,-32 + 30052b6: ce22 sw s0,28(sp) + 30052b8: 1000 addi s0,sp,32 + 30052ba: fea42623 sw a0,-20(s0) + return (((interruptType) == TIMER_PERIOD_FIN) || + 30052be: fec42783 lw a5,-20(s0) + 30052c2: c791 beqz a5,30052ce + 30052c4: fec42703 lw a4,-20(s0) + 30052c8: 4785 li a5,1 + 30052ca: 00f71463 bne a4,a5,30052d2 + 30052ce: 4785 li a5,1 + 30052d0: a011 j 30052d4 + 30052d2: 4781 li a5,0 + 30052d4: 8b85 andi a5,a5,1 + 30052d6: 9f81 uxtb a5 + ((interruptType) == TIMER_OVER_FLOW)); +} + 30052d8: 853e mv a0,a5 + 30052da: 4472 lw s0,28(sp) + 30052dc: 6105 addi sp,sp,32 + 30052de: 8082 ret + +030052e0 : + * @param size Timer Size, @ref TIMER_Size + * @retval true + * @retval false + */ +static inline bool IsTimerSize(TIMER_Size size) +{ + 30052e0: 1101 addi sp,sp,-32 + 30052e2: ce22 sw s0,28(sp) + 30052e4: 1000 addi s0,sp,32 + 30052e6: fea42623 sw a0,-20(s0) + return (((size) == TIMER_SIZE_16BIT) || + 30052ea: fec42783 lw a5,-20(s0) + 30052ee: c791 beqz a5,30052fa + 30052f0: fec42703 lw a4,-20(s0) + 30052f4: 4785 li a5,1 + 30052f6: 00f71463 bne a4,a5,30052fe + 30052fa: 4785 li a5,1 + 30052fc: a011 j 3005300 + 30052fe: 4781 li a5,0 + 3005300: 8b85 andi a5,a5,1 + 3005302: 9f81 uxtb a5 + ((size) == TIMER_SIZE_32BIT)); +} + 3005304: 853e mv a0,a5 + 3005306: 4472 lw s0,28(sp) + 3005308: 6105 addi sp,sp,32 + 300530a: 8082 ret + +0300530c : + * @param period + * @retval true + * @retval false + */ +static inline bool IsTimerPeriod(unsigned int period) +{ + 300530c: 1101 addi sp,sp,-32 + 300530e: ce22 sw s0,28(sp) + 3005310: 1000 addi s0,sp,32 + 3005312: fea42623 sw a0,-20(s0) + return ((period) >= PERIOD_MIN_VALUE); + 3005316: fec42783 lw a5,-20(s0) + 300531a: 00f037b3 snez a5,a5 + 300531e: 9f81 uxtb a5 +} + 3005320: 853e mv a0,a5 + 3005322: 4472 lw s0,28(sp) + 3005324: 6105 addi sp,sp,32 + 3005326: 8082 ret + +03005328 : + * @param div @see TIMER_PrescalerFactor + * @retval true + * @retval false + */ +static inline bool IsTimerDiv(TIMER_PrescalerFactor div) +{ + 3005328: 1101 addi sp,sp,-32 + 300532a: ce22 sw s0,28(sp) + 300532c: 1000 addi s0,sp,32 + 300532e: fea42623 sw a0,-20(s0) + return (((div) == TIMERPRESCALER_NO_DIV) || + ((div) == TIMERPRESCALER_DIV_16) || + 3005332: fec42783 lw a5,-20(s0) + 3005336: cb99 beqz a5,300534c + return (((div) == TIMERPRESCALER_NO_DIV) || + 3005338: fec42703 lw a4,-20(s0) + 300533c: 4785 li a5,1 + 300533e: 00f70763 beq a4,a5,300534c + ((div) == TIMERPRESCALER_DIV_16) || + 3005342: fec42703 lw a4,-20(s0) + 3005346: 4789 li a5,2 + 3005348: 00f71463 bne a4,a5,3005350 + 300534c: 4785 li a5,1 + 300534e: a011 j 3005352 + 3005350: 4781 li a5,0 + 3005352: 8b85 andi a5,a5,1 + 3005354: 9f81 uxtb a5 + ((div) == TIMERPRESCALER_DIV_256)); +} + 3005356: 853e mv a0,a5 + 3005358: 4472 lw s0,28(sp) + 300535a: 6105 addi sp,sp,32 + 300535c: 8082 ret + +0300535e : + * @param handle Timer Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR parameter check fail + */ +BASE_StatusType HAL_TIMER_Init(TIMER_Handle *handle) +{ + 300535e: 1101 addi sp,sp,-32 + 3005360: ce06 sw ra,28(sp) + 3005362: cc22 sw s0,24(sp) + 3005364: 1000 addi s0,sp,32 + 3005366: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 300536a: fec42783 lw a5,-20(s0) + 300536e: eb89 bnez a5,3005380 + 3005370: 02800593 li a1,40 + 3005374: 030077b7 lui a5,0x3007 + 3005378: 9dc78513 addi a0,a5,-1572 # 30069dc + 300537c: 2c15 jal ra,30055b0 + 300537e: a001 j 300537e + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 3005380: fec42783 lw a5,-20(s0) + 3005384: 4398 lw a4,0(a5) + 3005386: 143007b7 lui a5,0x14300 + 300538a: 02f70f63 beq a4,a5,30053c8 + 300538e: fec42783 lw a5,-20(s0) + 3005392: 4398 lw a4,0(a5) + 3005394: 143017b7 lui a5,0x14301 + 3005398: 02f70863 beq a4,a5,30053c8 + 300539c: fec42783 lw a5,-20(s0) + 30053a0: 4398 lw a4,0(a5) + 30053a2: 143027b7 lui a5,0x14302 + 30053a6: 02f70163 beq a4,a5,30053c8 + 30053aa: fec42783 lw a5,-20(s0) + 30053ae: 4398 lw a4,0(a5) + 30053b0: 143037b7 lui a5,0x14303 + 30053b4: 00f70a63 beq a4,a5,30053c8 + 30053b8: 02900593 li a1,41 + 30053bc: 030077b7 lui a5,0x3007 + 30053c0: 9dc78513 addi a0,a5,-1572 # 30069dc + 30053c4: 22f5 jal ra,30055b0 + 30053c6: a001 j 30053c6 + + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->load), BASE_STATUS_ERROR); + 30053c8: fec42783 lw a5,-20(s0) + 30053cc: 4bdc lw a5,20(a5) + 30053ce: 853e mv a0,a5 + 30053d0: 3f35 jal ra,300530c + 30053d2: 87aa mv a5,a0 + 30053d4: 0017c793 xori a5,a5,1 + 30053d8: 9f81 uxtb a5 + 30053da: cb91 beqz a5,30053ee + 30053dc: 02b00593 li a1,43 + 30053e0: 030077b7 lui a5,0x3007 + 30053e4: 9dc78513 addi a0,a5,-1572 # 30069dc + 30053e8: 22e1 jal ra,30055b0 + 30053ea: 4785 li a5,1 + 30053ec: aa6d j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->bgLoad), BASE_STATUS_ERROR); + 30053ee: fec42783 lw a5,-20(s0) + 30053f2: 4f9c lw a5,24(a5) + 30053f4: 853e mv a0,a5 + 30053f6: 3f19 jal ra,300530c + 30053f8: 87aa mv a5,a0 + 30053fa: 0017c793 xori a5,a5,1 + 30053fe: 9f81 uxtb a5 + 3005400: cb91 beqz a5,3005414 + 3005402: 02c00593 li a1,44 + 3005406: 030077b7 lui a5,0x3007 + 300540a: 9dc78513 addi a0,a5,-1572 # 30069dc + 300540e: 224d jal ra,30055b0 + 3005410: 4785 li a5,1 + 3005412: aa51 j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerMode(handle->mode), BASE_STATUS_ERROR); + 3005414: fec42783 lw a5,-20(s0) + 3005418: 479c lw a5,8(a5) + 300541a: 853e mv a0,a5 + 300541c: 358d jal ra,300527e + 300541e: 87aa mv a5,a0 + 3005420: 0017c793 xori a5,a5,1 + 3005424: 9f81 uxtb a5 + 3005426: cb91 beqz a5,300543a + 3005428: 02d00593 li a1,45 + 300542c: 030077b7 lui a5,0x3007 + 3005430: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005434: 2ab5 jal ra,30055b0 + 3005436: 4785 li a5,1 + 3005438: a2bd j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerSize(handle->size), BASE_STATUS_ERROR); + 300543a: fec42783 lw a5,-20(s0) + 300543e: 4b9c lw a5,16(a5) + 3005440: 853e mv a0,a5 + 3005442: 3d79 jal ra,30052e0 + 3005444: 87aa mv a5,a0 + 3005446: 0017c793 xori a5,a5,1 + 300544a: 9f81 uxtb a5 + 300544c: cb91 beqz a5,3005460 + 300544e: 02e00593 li a1,46 + 3005452: 030077b7 lui a5,0x3007 + 3005456: 9dc78513 addi a0,a5,-1572 # 30069dc + 300545a: 2a99 jal ra,30055b0 + 300545c: 4785 li a5,1 + 300545e: a2a1 j 30055a6 + TIMER_PARAM_CHECK_WITH_RET(IsTimerDiv(handle->prescaler), BASE_STATUS_ERROR); + 3005460: fec42783 lw a5,-20(s0) + 3005464: 47dc lw a5,12(a5) + 3005466: 853e mv a0,a5 + 3005468: 35c1 jal ra,3005328 + 300546a: 87aa mv a5,a0 + 300546c: 0017c793 xori a5,a5,1 + 3005470: 9f81 uxtb a5 + 3005472: cb91 beqz a5,3005486 + 3005474: 02f00593 li a1,47 + 3005478: 030077b7 lui a5,0x3007 + 300547c: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005480: 2a05 jal ra,30055b0 + 3005482: 4785 li a5,1 + 3005484: a20d j 30055a6 + + /* Initialize the configuration parameters of the timer */ + handle->baseAddress->timer_intclr = BASE_CFG_SET; /* Writing to this register clears interrupt output of timer */ + 3005486: fec42783 lw a5,-20(s0) + 300548a: 439c lw a5,0(a5) + 300548c: 4705 li a4,1 + 300548e: c7d8 sw a4,12(a5) + handle->baseAddress->timer_load = handle->load; + 3005490: fec42783 lw a5,-20(s0) + 3005494: 439c lw a5,0(a5) + 3005496: fec42703 lw a4,-20(s0) + 300549a: 4b58 lw a4,20(a4) + 300549c: c398 sw a4,0(a5) + handle->baseAddress->timerbgload = handle->bgLoad; + 300549e: fec42783 lw a5,-20(s0) + 30054a2: 439c lw a5,0(a5) + 30054a4: fec42703 lw a4,-20(s0) + 30054a8: 4f18 lw a4,24(a4) + 30054aa: cf98 sw a4,24(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_DISABLE; + 30054ac: fec42783 lw a5,-20(s0) + 30054b0: 4398 lw a4,0(a5) + 30054b2: 471c lw a5,8(a4) + 30054b4: f7f7f793 andi a5,a5,-129 + 30054b8: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timerintenable = handle->interruptEn; + 30054ba: fec42783 lw a5,-20(s0) + 30054be: 4398 lw a4,0(a5) + 30054c0: fec42783 lw a5,-20(s0) + 30054c4: 2fd4 lbu a3,28(a5) + 30054c6: 471c lw a5,8(a4) + 30054c8: 8a85 andi a3,a3,1 + 30054ca: 0696 slli a3,a3,0x5 + 30054cc: fdf7f793 andi a5,a5,-33 + 30054d0: 8fd5 or a5,a5,a3 + 30054d2: c71c sw a5,8(a4) + + /* Sets the frequency divider and size of the timer module. */ + handle->baseAddress->TIMERx_CONTROL.BIT.timerpre = handle->prescaler; + 30054d4: fec42783 lw a5,-20(s0) + 30054d8: 47d4 lw a3,12(a5) + 30054da: fec42783 lw a5,-20(s0) + 30054de: 4398 lw a4,0(a5) + 30054e0: 87b6 mv a5,a3 + 30054e2: 8b8d andi a5,a5,3 + 30054e4: 0ff7f693 andi a3,a5,255 + 30054e8: 471c lw a5,8(a4) + 30054ea: 8a8d andi a3,a3,3 + 30054ec: 068a slli a3,a3,0x2 + 30054ee: 9bcd andi a5,a5,-13 + 30054f0: 8fd5 or a5,a5,a3 + 30054f2: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timersize = handle->size; + 30054f4: fec42783 lw a5,-20(s0) + 30054f8: 4b94 lw a3,16(a5) + 30054fa: fec42783 lw a5,-20(s0) + 30054fe: 4398 lw a4,0(a5) + 3005500: 87b6 mv a5,a3 + 3005502: 8b85 andi a5,a5,1 + 3005504: 0ff7f693 andi a3,a5,255 + 3005508: 471c lw a5,8(a4) + 300550a: 8a85 andi a3,a3,1 + 300550c: 0686 slli a3,a3,0x1 + 300550e: 9bf5 andi a5,a5,-3 + 3005510: 8fd5 or a5,a5,a3 + 3005512: c71c sw a5,8(a4) + + /* Sets the running mode of the timer. */ + if (handle->mode == TIMER_MODE_RUN_ONTSHOT) { + 3005514: fec42783 lw a5,-20(s0) + 3005518: 4798 lw a4,8(a5) + 300551a: 4789 li a5,2 + 300551c: 00f71a63 bne a4,a5,3005530 + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_SET; + 3005520: fec42783 lw a5,-20(s0) + 3005524: 4398 lw a4,0(a5) + 3005526: 471c lw a5,8(a4) + 3005528: 0017e793 ori a5,a5,1 + 300552c: c71c sw a5,8(a4) + 300552e: a805 j 300555e + } else { + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_UNSET; + 3005530: fec42783 lw a5,-20(s0) + 3005534: 4398 lw a4,0(a5) + 3005536: 471c lw a5,8(a4) + 3005538: 9bf9 andi a5,a5,-2 + 300553a: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 300553c: fec42783 lw a5,-20(s0) + 3005540: 479c lw a5,8(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005542: fec42703 lw a4,-20(s0) + 3005546: 4318 lw a4,0(a4) + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005548: 00f037b3 snez a5,a5 + 300554c: 0ff7f693 andi a3,a5,255 + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005550: 471c lw a5,8(a4) + 3005552: 8a85 andi a3,a3,1 + 3005554: 069a slli a3,a3,0x6 + 3005556: fbf7f793 andi a5,a5,-65 + 300555a: 8fd5 or a5,a5,a3 + 300555c: c71c sw a5,8(a4) + } + + /* Request for setting the DMA and ADC. */ + handle->baseAddress->TIMERx_CONTROLB.BIT.dmasreqen = handle->dmaReqEnable; + 300555e: fec42783 lw a5,-20(s0) + 3005562: 4398 lw a4,0(a5) + 3005564: fec42783 lw a5,-20(s0) + 3005568: 2ff4 lbu a3,30(a5) + 300556a: 4f5c lw a5,28(a4) + 300556c: 8a85 andi a3,a3,1 + 300556e: 0686 slli a3,a3,0x1 + 3005570: 9bf5 andi a5,a5,-3 + 3005572: 8fd5 or a5,a5,a3 + 3005574: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.dmabreqen = handle->dmaReqEnable; + 3005576: fec42783 lw a5,-20(s0) + 300557a: 4398 lw a4,0(a5) + 300557c: fec42783 lw a5,-20(s0) + 3005580: 2ff4 lbu a3,30(a5) + 3005582: 4f5c lw a5,28(a4) + 3005584: 8a85 andi a3,a3,1 + 3005586: 9bf9 andi a5,a5,-2 + 3005588: 8fd5 or a5,a5,a3 + 300558a: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.socen = handle->adcSocReqEnable; + 300558c: fec42783 lw a5,-20(s0) + 3005590: 4398 lw a4,0(a5) + 3005592: fec42783 lw a5,-20(s0) + 3005596: 3fd4 lbu a3,29(a5) + 3005598: 4f5c lw a5,28(a4) + 300559a: 8a85 andi a3,a3,1 + 300559c: 068a slli a3,a3,0x2 + 300559e: 9bed andi a5,a5,-5 + 30055a0: 8fd5 or a5,a5,a3 + 30055a2: cf5c sw a5,28(a4) + return BASE_STATUS_OK; + 30055a4: 4781 li a5,0 +} + 30055a6: 853e mv a0,a5 + 30055a8: 40f2 lw ra,28(sp) + 30055aa: 4462 lw s0,24(sp) + 30055ac: 6105 addi sp,sp,32 + 30055ae: 8082 ret + +030055b0 : + 30055b0: c37fc06f j 30021e6 + +030055b4 : + * @brief Start timer. + * @param handle Timer Handle + * @retval None + */ +void HAL_TIMER_Start(TIMER_Handle *handle) +{ + 30055b4: 1101 addi sp,sp,-32 + 30055b6: ce06 sw ra,28(sp) + 30055b8: cc22 sw s0,24(sp) + 30055ba: 1000 addi s0,sp,32 + 30055bc: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 30055c0: fec42783 lw a5,-20(s0) + 30055c4: eb89 bnez a5,30055d6 + 30055c6: 0bc00593 li a1,188 + 30055ca: 030077b7 lui a5,0x3007 + 30055ce: 9dc78513 addi a0,a5,-1572 # 30069dc + 30055d2: 3ff9 jal ra,30055b0 + 30055d4: a001 j 30055d4 + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 30055d6: fec42783 lw a5,-20(s0) + 30055da: 4398 lw a4,0(a5) + 30055dc: 143007b7 lui a5,0x14300 + 30055e0: 02f70f63 beq a4,a5,300561e + 30055e4: fec42783 lw a5,-20(s0) + 30055e8: 4398 lw a4,0(a5) + 30055ea: 143017b7 lui a5,0x14301 + 30055ee: 02f70863 beq a4,a5,300561e + 30055f2: fec42783 lw a5,-20(s0) + 30055f6: 4398 lw a4,0(a5) + 30055f8: 143027b7 lui a5,0x14302 + 30055fc: 02f70163 beq a4,a5,300561e + 3005600: fec42783 lw a5,-20(s0) + 3005604: 4398 lw a4,0(a5) + 3005606: 143037b7 lui a5,0x14303 + 300560a: 00f70a63 beq a4,a5,300561e + 300560e: 0bd00593 li a1,189 + 3005612: 030077b7 lui a5,0x3007 + 3005616: 9dc78513 addi a0,a5,-1572 # 30069dc + 300561a: 3f59 jal ra,30055b0 + 300561c: a001 j 300561c + /* Enable timer */ + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_SET; + 300561e: fec42783 lw a5,-20(s0) + 3005622: 4398 lw a4,0(a5) + 3005624: 471c lw a5,8(a4) + 3005626: 0807e793 ori a5,a5,128 + 300562a: c71c sw a5,8(a4) +} + 300562c: 0001 nop + 300562e: 40f2 lw ra,28(sp) + 3005630: 4462 lw s0,24(sp) + 3005632: 6105 addi sp,sp,32 + 3005634: 8082 ret + +03005636 : + * @brief GPT Interrupt service processing function. + * @param handle TIMER Handle + * @retval None + */ +void HAL_TIMER_IrqHandler(void *handle) +{ + 3005636: 7179 addi sp,sp,-48 + 3005638: d606 sw ra,44(sp) + 300563a: d422 sw s0,40(sp) + 300563c: 1800 addi s0,sp,48 + 300563e: fca42e23 sw a0,-36(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005642: fdc42783 lw a5,-36(s0) + 3005646: eb89 bnez a5,3005658 + 3005648: 0d800593 li a1,216 + 300564c: 030077b7 lui a5,0x3007 + 3005650: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005654: 3fb1 jal ra,30055b0 + 3005656: a001 j 3005656 + TIMER_Handle *timerHandle = (TIMER_Handle *)handle; + 3005658: fdc42783 lw a5,-36(s0) + 300565c: fef42623 sw a5,-20(s0) + TIMER_ASSERT_PARAM(IsTIMERInstance(timerHandle->baseAddress)); + 3005660: fec42783 lw a5,-20(s0) + 3005664: 4398 lw a4,0(a5) + 3005666: 143007b7 lui a5,0x14300 + 300566a: 02f70f63 beq a4,a5,30056a8 + 300566e: fec42783 lw a5,-20(s0) + 3005672: 4398 lw a4,0(a5) + 3005674: 143017b7 lui a5,0x14301 + 3005678: 02f70863 beq a4,a5,30056a8 + 300567c: fec42783 lw a5,-20(s0) + 3005680: 4398 lw a4,0(a5) + 3005682: 143027b7 lui a5,0x14302 + 3005686: 02f70163 beq a4,a5,30056a8 + 300568a: fec42783 lw a5,-20(s0) + 300568e: 4398 lw a4,0(a5) + 3005690: 143037b7 lui a5,0x14303 + 3005694: 00f70a63 beq a4,a5,30056a8 + 3005698: 0da00593 li a1,218 + 300569c: 030077b7 lui a5,0x3007 + 30056a0: 9dc78513 addi a0,a5,-1572 # 30069dc + 30056a4: 3731 jal ra,30055b0 + 30056a6: a001 j 30056a6 + /* Check interrupt type */ + if (timerHandle->baseAddress->TIMERx_MIS.dmaovmis == BASE_CFG_ENABLE) { + 30056a8: fec42783 lw a5,-20(s0) + 30056ac: 439c lw a5,0(a5) + 30056ae: 4bdc lw a5,20(a5) + 30056b0: 8385 srli a5,a5,0x1 + 30056b2: 8b85 andi a5,a5,1 + 30056b4: 0ff7f713 andi a4,a5,255 + 30056b8: 4785 li a5,1 + 30056ba: 02f71363 bne a4,a5,30056e0 + /* DMA overflow interrupt */ + timerHandle->baseAddress->DMAOV_INTCLR.BIT.dmaov_intclr = BASE_CFG_ENABLE; + 30056be: fec42783 lw a5,-20(s0) + 30056c2: 4398 lw a4,0(a5) + 30056c4: 531c lw a5,32(a4) + 30056c6: 0017e793 ori a5,a5,1 + 30056ca: d31c sw a5,32(a4) + /* Call the timer DMA request overflow callback function of the user. */ + if (timerHandle->userCallBack.TimerOverFlowCallBack != NULL) { + 30056cc: fec42783 lw a5,-20(s0) + 30056d0: 53dc lw a5,36(a5) + 30056d2: c799 beqz a5,30056e0 + timerHandle->userCallBack.TimerOverFlowCallBack(timerHandle); + 30056d4: fec42783 lw a5,-20(s0) + 30056d8: 53dc lw a5,36(a5) + 30056da: fec42503 lw a0,-20(s0) + 30056de: 9782 jalr a5 + } + } + if (timerHandle->baseAddress->TIMERx_MIS.timermis == BASE_CFG_ENABLE) { + 30056e0: fec42783 lw a5,-20(s0) + 30056e4: 439c lw a5,0(a5) + 30056e6: 4bdc lw a5,20(a5) + 30056e8: 8b85 andi a5,a5,1 + 30056ea: 0ff7f713 andi a4,a5,255 + 30056ee: 4785 li a5,1 + 30056f0: 02f71263 bne a4,a5,3005714 + /* TIMER Interrupt */ + timerHandle->baseAddress->timer_intclr = BASE_CFG_ENABLE; + 30056f4: fec42783 lw a5,-20(s0) + 30056f8: 439c lw a5,0(a5) + 30056fa: 4705 li a4,1 + 30056fc: c7d8 sw a4,12(a5) + /* Call the period finish callback function of the user. */ + if (timerHandle->userCallBack.TimerPeriodFinCallBack != NULL) { + 30056fe: fec42783 lw a5,-20(s0) + 3005702: 539c lw a5,32(a5) + 3005704: cb81 beqz a5,3005714 + timerHandle->userCallBack.TimerPeriodFinCallBack(timerHandle); + 3005706: fec42783 lw a5,-20(s0) + 300570a: 539c lw a5,32(a5) + 300570c: fec42503 lw a0,-20(s0) + 3005710: 9782 jalr a5 + } + } + return; + 3005712: 0001 nop + 3005714: 0001 nop +} + 3005716: 50b2 lw ra,44(sp) + 3005718: 5422 lw s0,40(sp) + 300571a: 6145 addi sp,sp,48 + 300571c: 8082 ret + +0300571e : + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_TIMER_RegisterCallback(TIMER_Handle *handle, TIMER_InterruptType typeID, + TIMER_CallBackFunc callBackFunc) +{ + 300571e: 1101 addi sp,sp,-32 + 3005720: ce06 sw ra,28(sp) + 3005722: cc22 sw s0,24(sp) + 3005724: 1000 addi s0,sp,32 + 3005726: fea42623 sw a0,-20(s0) + 300572a: feb42423 sw a1,-24(s0) + 300572e: fec42223 sw a2,-28(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005732: fec42783 lw a5,-20(s0) + 3005736: eb89 bnez a5,3005748 + 3005738: 0fa00593 li a1,250 + 300573c: 030077b7 lui a5,0x3007 + 3005740: 9dc78513 addi a0,a5,-1572 # 30069dc + 3005744: 35b5 jal ra,30055b0 + 3005746: a001 j 3005746 + TIMER_ASSERT_PARAM(callBackFunc != NULL); + 3005748: fe442783 lw a5,-28(s0) + 300574c: eb89 bnez a5,300575e + 300574e: 0fb00593 li a1,251 + 3005752: 030077b7 lui a5,0x3007 + 3005756: 9dc78513 addi a0,a5,-1572 # 30069dc + 300575a: 3d99 jal ra,30055b0 + 300575c: a001 j 300575c + TIMER_ASSERT_PARAM(IsTimerInterruptType(typeID)); + 300575e: fe842503 lw a0,-24(s0) + 3005762: 3e89 jal ra,30052b4 + 3005764: 87aa mv a5,a0 + 3005766: 0017c793 xori a5,a5,1 + 300576a: 9f81 uxtb a5 + 300576c: cb89 beqz a5,300577e + 300576e: 0fc00593 li a1,252 + 3005772: 030077b7 lui a5,0x3007 + 3005776: 9dc78513 addi a0,a5,-1572 # 30069dc + 300577a: 3d1d jal ra,30055b0 + 300577c: a001 j 300577c + + /* Registers the user callback function. */ + switch (typeID) { + 300577e: fe842783 lw a5,-24(s0) + 3005782: cb91 beqz a5,3005796 + 3005784: 4705 li a4,1 + 3005786: 00e79e63 bne a5,a4,30057a2 + case TIMER_OVER_FLOW: + handle->userCallBack.TimerOverFlowCallBack = callBackFunc; /* User DMA request overflow function */ + 300578a: fec42783 lw a5,-20(s0) + 300578e: fe442703 lw a4,-28(s0) + 3005792: d3d8 sw a4,36(a5) + break; + 3005794: a809 j 30057a6 + case TIMER_PERIOD_FIN: + handle->userCallBack.TimerPeriodFinCallBack = callBackFunc; /* User timer period finish call back. */ + 3005796: fec42783 lw a5,-20(s0) + 300579a: fe442703 lw a4,-28(s0) + 300579e: d398 sw a4,32(a5) + break; + 30057a0: a019 j 30057a6 + default: + return BASE_STATUS_ERROR; + 30057a2: 4785 li a5,1 + 30057a4: a011 j 30057a8 + } + return BASE_STATUS_OK; + 30057a6: 4781 li a5,0 +} + 30057a8: 853e mv a0,a5 + 30057aa: 40f2 lw ra,28(sp) + 30057ac: 4462 lw s0,24(sp) + 30057ae: 6105 addi sp,sp,32 + 30057b0: 8082 ret + +030057b2 : + * @brief Check UART datalength parameter. + * @param datalength The number of data bits in a frame, @ref UART_DataLength + * @retval bool + */ +static inline bool IsUartDatalength(UART_DataLength datalength) +{ + 30057b2: 1101 addi sp,sp,-32 + 30057b4: ce22 sw s0,28(sp) + 30057b6: 1000 addi s0,sp,32 + 30057b8: fea42623 sw a0,-20(s0) + return (datalength >= UART_DATALENGTH_5BIT) && (datalength <= UART_DATALENGTH_8BIT); + 30057bc: fec42783 lw a5,-20(s0) + 30057c0: 0047b793 sltiu a5,a5,4 + 30057c4: 9f81 uxtb a5 +} + 30057c6: 853e mv a0,a5 + 30057c8: 4472 lw s0,28(sp) + 30057ca: 6105 addi sp,sp,32 + 30057cc: 8082 ret + +030057ce : + * @brief Check UART stopbits parameter. + * @param stopbits The number of stop bits in a frame, @ref UART_StopBits + * @retval bool + */ +static inline bool IsUartStopbits(UART_StopBits stopbits) +{ + 30057ce: 1101 addi sp,sp,-32 + 30057d0: ce22 sw s0,28(sp) + 30057d2: 1000 addi s0,sp,32 + 30057d4: fea42623 sw a0,-20(s0) + return (stopbits == UART_STOPBITS_ONE) || (stopbits == UART_STOPBITS_TWO); + 30057d8: fec42783 lw a5,-20(s0) + 30057dc: c791 beqz a5,30057e8 + 30057de: fec42703 lw a4,-20(s0) + 30057e2: 4785 li a5,1 + 30057e4: 00f71463 bne a4,a5,30057ec + 30057e8: 4785 li a5,1 + 30057ea: a011 j 30057ee + 30057ec: 4781 li a5,0 + 30057ee: 8b85 andi a5,a5,1 + 30057f0: 9f81 uxtb a5 +} + 30057f2: 853e mv a0,a5 + 30057f4: 4472 lw s0,28(sp) + 30057f6: 6105 addi sp,sp,32 + 30057f8: 8082 ret + +030057fa : + * @brief Check UART paritymode parameter. + * @param paritymode UART parity check mode, @ref UART_Parity_Mode + * @retval bool + */ +static inline bool IsUartParitymode(UART_Parity_Mode paritymode) +{ + 30057fa: 1101 addi sp,sp,-32 + 30057fc: ce22 sw s0,28(sp) + 30057fe: 1000 addi s0,sp,32 + 3005800: fea42623 sw a0,-20(s0) + if ((paritymode >= UART_PARITY_ODD) && (paritymode <= UART_PARITY_NONE)) { + 3005804: fec42703 lw a4,-20(s0) + 3005808: 4791 li a5,4 + 300580a: 00e7e463 bltu a5,a4,3005812 + return true; + 300580e: 4785 li a5,1 + 3005810: a011 j 3005814 + } + return false; + 3005812: 4781 li a5,0 +} + 3005814: 853e mv a0,a5 + 3005816: 4472 lw s0,28(sp) + 3005818: 6105 addi sp,sp,32 + 300581a: 8082 ret + +0300581c : + * @brief Check UART transmode parameter. + * @param transmode Transmit mode, @ref UART_Transmit_Mode + * @retval bool + */ +static inline bool IsUartTransmode(UART_Transmit_Mode transmode) +{ + 300581c: 1101 addi sp,sp,-32 + 300581e: ce22 sw s0,28(sp) + 3005820: 1000 addi s0,sp,32 + 3005822: fea42623 sw a0,-20(s0) + if ((transmode == UART_MODE_BLOCKING) || + 3005826: fec42783 lw a5,-20(s0) + 300582a: c385 beqz a5,300584a + 300582c: fec42703 lw a4,-20(s0) + 3005830: 4785 li a5,1 + 3005832: 00f70c63 beq a4,a5,300584a + (transmode == UART_MODE_INTERRUPT) || + 3005836: fec42703 lw a4,-20(s0) + 300583a: 4789 li a5,2 + 300583c: 00f70763 beq a4,a5,300584a + (transmode == UART_MODE_DMA) || + 3005840: fec42703 lw a4,-20(s0) + 3005844: 478d li a5,3 + 3005846: 00f71463 bne a4,a5,300584e + (transmode == UART_MODE_DISABLE)) { + return true; + 300584a: 4785 li a5,1 + 300584c: a011 j 3005850 + } + return false; + 300584e: 4781 li a5,0 +} + 3005850: 853e mv a0,a5 + 3005852: 4472 lw s0,28(sp) + 3005854: 6105 addi sp,sp,32 + 3005856: 8082 ret + +03005858 : + * @brief Check UART fifoThreshold parameter. + * @param fifoThreshold UART TX/RX FIFO line interrupt threshold, @ref UART_FIFO_Threshold + * @retval bool + */ +static inline bool IsUartFIFOThreshold(UART_FIFO_Threshold fifoThreshold) +{ + 3005858: 1101 addi sp,sp,-32 + 300585a: ce22 sw s0,28(sp) + 300585c: 1000 addi s0,sp,32 + 300585e: fea42623 sw a0,-20(s0) + return (fifoThreshold >= UART_FIFODEPTH_SIZE0) && (fifoThreshold <= UART_FIFODEPTH_SIZE15); + 3005862: fec42783 lw a5,-20(s0) + 3005866: 0107b793 sltiu a5,a5,16 + 300586a: 9f81 uxtb a5 +} + 300586c: 853e mv a0,a5 + 300586e: 4472 lw s0,28(sp) + 3005870: 6105 addi sp,sp,32 + 3005872: 8082 ret + +03005874 : + * @brief Check UART Oversampling multiple. + * @param multiple Oversampling multiple, @ref UART_OversampleMultiple + * @retval bool + */ +static inline bool IsUartOversampleMultiple(UART_OversampleMultiple multiple) +{ + 3005874: 1101 addi sp,sp,-32 + 3005876: ce22 sw s0,28(sp) + 3005878: 1000 addi s0,sp,32 + 300587a: fea42623 sw a0,-20(s0) + return (multiple >= UART_OVERSAMPLING_16X) && (multiple <= UART_OVERSAMPLING_12X); + 300587e: fec42783 lw a5,-20(s0) + 3005882: 0057b793 sltiu a5,a5,5 + 3005886: 9f81 uxtb a5 +} + 3005888: 853e mv a0,a5 + 300588a: 4472 lw s0,28(sp) + 300588c: 6105 addi sp,sp,32 + 300588e: 8082 ret + +03005890 : +#define PARITY_EVEN 0x6 +#define PARITY_MARK 0x82 +#define PARITY_SPACE 0x86 + +static unsigned int DivClosest(unsigned int x, unsigned int divisor) +{ + 3005890: 7179 addi sp,sp,-48 + 3005892: d622 sw s0,44(sp) + 3005894: 1800 addi s0,sp,48 + 3005896: fca42e23 sw a0,-36(s0) + 300589a: fcb42c23 sw a1,-40(s0) + unsigned int ret; + if (divisor == 0) { + 300589e: fd842783 lw a5,-40(s0) + 30058a2: e399 bnez a5,30058a8 + return 0; + 30058a4: 4781 li a5,0 + 30058a6: a005 j 30058c6 + } + ret = (((x) + ((divisor) / 2)) / (divisor)); /* Round up the result, add 1/2 */ + 30058a8: fd842783 lw a5,-40(s0) + 30058ac: 0017d713 srli a4,a5,0x1 + 30058b0: fdc42783 lw a5,-36(s0) + 30058b4: 973e add a4,a4,a5 + 30058b6: fd842783 lw a5,-40(s0) + 30058ba: 02f757b3 divu a5,a4,a5 + 30058be: fef42623 sw a5,-20(s0) + return ret; + 30058c2: fec42783 lw a5,-20(s0) +} + 30058c6: 853e mv a0,a5 + 30058c8: 5432 lw s0,44(sp) + 30058ca: 6145 addi sp,sp,48 + 30058cc: 8082 ret + +030058ce : + * @brief Sets the parity bit of the UART. + * @param uartHandle UART handle. + * @retval None. + */ +static void UART_SetParityBit(UART_Handle *uartHandle) +{ + 30058ce: 1101 addi sp,sp,-32 + 30058d0: ce22 sw s0,28(sp) + 30058d2: 1000 addi s0,sp,32 + 30058d4: fea42623 sw a0,-20(s0) + /* Sets the UART check mode. */ + switch (uartHandle->parity) { + 30058d8: fec42783 lw a5,-20(s0) + 30058dc: 4b9c lw a5,16(a5) + 30058de: 4711 li a4,4 + 30058e0: 06f76e63 bltu a4,a5,300595c + 30058e4: 00279713 slli a4,a5,0x2 + 30058e8: 030077b7 lui a5,0x3007 + 30058ec: 9fc78793 addi a5,a5,-1540 # 30069fc + 30058f0: 97ba add a5,a5,a4 + 30058f2: 439c lw a5,0(a5) + 30058f4: 8782 jr a5 + case UART_PARITY_ODD: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_ODD; /* Odd parity. */ + 30058f6: fec42783 lw a5,-20(s0) + 30058fa: 439c lw a5,0(a5) + 30058fc: 57d8 lw a4,44(a5) + 30058fe: fec42783 lw a5,-20(s0) + 3005902: 439c lw a5,0(a5) + 3005904: 00276713 ori a4,a4,2 + 3005908: d7d8 sw a4,44(a5) + break; + 300590a: a891 j 300595e + case UART_PARITY_EVEN: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_EVEN; /* Even parity. */ + 300590c: fec42783 lw a5,-20(s0) + 3005910: 439c lw a5,0(a5) + 3005912: 57d8 lw a4,44(a5) + 3005914: fec42783 lw a5,-20(s0) + 3005918: 439c lw a5,0(a5) + 300591a: 00676713 ori a4,a4,6 + 300591e: d7d8 sw a4,44(a5) + break; + 3005920: a83d j 300595e + case UART_PARITY_MARK: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_MARK; /* Marking parity */ + 3005922: fec42783 lw a5,-20(s0) + 3005926: 439c lw a5,0(a5) + 3005928: 57d8 lw a4,44(a5) + 300592a: fec42783 lw a5,-20(s0) + 300592e: 439c lw a5,0(a5) + 3005930: 08276713 ori a4,a4,130 + 3005934: d7d8 sw a4,44(a5) + break; + 3005936: a025 j 300595e + case UART_PARITY_SPACE: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_SPACE; /* space parity */ + 3005938: fec42783 lw a5,-20(s0) + 300593c: 439c lw a5,0(a5) + 300593e: 57d8 lw a4,44(a5) + 3005940: fec42783 lw a5,-20(s0) + 3005944: 439c lw a5,0(a5) + 3005946: 08676713 ori a4,a4,134 + 300594a: d7d8 sw a4,44(a5) + break; + 300594c: a809 j 300595e + case UART_PARITY_NONE: + uartHandle->baseAddress->UART_LCR_H.BIT.pen = BASE_CFG_DISABLE; /* No parity */ + 300594e: fec42783 lw a5,-20(s0) + 3005952: 4398 lw a4,0(a5) + 3005954: 575c lw a5,44(a4) + 3005956: 9bf5 andi a5,a5,-3 + 3005958: d75c sw a5,44(a4) + break; + 300595a: a011 j 300595e + default: + return; + 300595c: 0001 nop + } +} + 300595e: 4472 lw s0,28(sp) + 3005960: 6105 addi sp,sp,32 + 3005962: 8082 ret + +03005964 : + * @brief Initialize the UART hardware configuration and configure parameters based on the specified handle. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_Init(UART_Handle *uartHandle) +{ + 3005964: 7179 addi sp,sp,-48 + 3005966: d606 sw ra,44(sp) + 3005968: d422 sw s0,40(sp) + 300596a: 1800 addi s0,sp,48 + 300596c: fca42e23 sw a0,-36(s0) + UART_ASSERT_PARAM(uartHandle != NULL); + 3005970: fdc42783 lw a5,-36(s0) + 3005974: eb89 bnez a5,3005986 + 3005976: 09700593 li a1,151 + 300597a: 030077b7 lui a5,0x3007 + 300597e: a1078513 addi a0,a5,-1520 # 3006a10 + 3005982: 313d jal ra,30055b0 + 3005984: a001 j 3005984 + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + 3005986: fdc42783 lw a5,-36(s0) + 300598a: 4398 lw a4,0(a5) + 300598c: 140007b7 lui a5,0x14000 + 3005990: 02f70f63 beq a4,a5,30059ce + 3005994: fdc42783 lw a5,-36(s0) + 3005998: 4398 lw a4,0(a5) + 300599a: 140017b7 lui a5,0x14001 + 300599e: 02f70863 beq a4,a5,30059ce + 30059a2: fdc42783 lw a5,-36(s0) + 30059a6: 4398 lw a4,0(a5) + 30059a8: 140027b7 lui a5,0x14002 + 30059ac: 02f70163 beq a4,a5,30059ce + 30059b0: fdc42783 lw a5,-36(s0) + 30059b4: 4398 lw a4,0(a5) + 30059b6: 140037b7 lui a5,0x14003 + 30059ba: 00f70a63 beq a4,a5,30059ce + 30059be: 09800593 li a1,152 + 30059c2: 030077b7 lui a5,0x3007 + 30059c6: a1078513 addi a0,a5,-1520 # 3006a10 + 30059ca: 36dd jal ra,30055b0 + 30059cc: a001 j 30059cc + UART_PARAM_CHECK_WITH_RET(uartHandle->txState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 30059ce: fdc42783 lw a5,-36(s0) + 30059d2: 47bc lw a5,72(a5) + 30059d4: cb91 beqz a5,30059e8 + 30059d6: 09900593 li a1,153 + 30059da: 030077b7 lui a5,0x3007 + 30059de: a1078513 addi a0,a5,-1520 # 3006a10 + 30059e2: 36f9 jal ra,30055b0 + 30059e4: 4785 li a5,1 + 30059e6: ae0d j 3005d18 + UART_PARAM_CHECK_WITH_RET(uartHandle->rxState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 30059e8: fdc42783 lw a5,-36(s0) + 30059ec: 47fc lw a5,76(a5) + 30059ee: cb91 beqz a5,3005a02 + 30059f0: 09a00593 li a1,154 + 30059f4: 030077b7 lui a5,0x3007 + 30059f8: a1078513 addi a0,a5,-1520 # 3006a10 + 30059fc: 3e55 jal ra,30055b0 + 30059fe: 4785 li a5,1 + 3005a00: ae21 j 3005d18 + unsigned int uartClock, quot; + UART_PARAM_CHECK_WITH_RET(IsUartDatalength(uartHandle->dataLength), BASE_STATUS_ERROR); + 3005a02: fdc42783 lw a5,-36(s0) + 3005a06: 479c lw a5,8(a5) + 3005a08: 853e mv a0,a5 + 3005a0a: 3365 jal ra,30057b2 + 3005a0c: 87aa mv a5,a0 + 3005a0e: 0017c793 xori a5,a5,1 + 3005a12: 9f81 uxtb a5 + 3005a14: cb91 beqz a5,3005a28 + 3005a16: 09c00593 li a1,156 + 3005a1a: 030077b7 lui a5,0x3007 + 3005a1e: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a22: 3679 jal ra,30055b0 + 3005a24: 4785 li a5,1 + 3005a26: accd j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartStopbits(uartHandle->stopBits), BASE_STATUS_ERROR); + 3005a28: fdc42783 lw a5,-36(s0) + 3005a2c: 47dc lw a5,12(a5) + 3005a2e: 853e mv a0,a5 + 3005a30: 3b79 jal ra,30057ce + 3005a32: 87aa mv a5,a0 + 3005a34: 0017c793 xori a5,a5,1 + 3005a38: 9f81 uxtb a5 + 3005a3a: cb91 beqz a5,3005a4e + 3005a3c: 09d00593 li a1,157 + 3005a40: 030077b7 lui a5,0x3007 + 3005a44: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a48: 36a5 jal ra,30055b0 + 3005a4a: 4785 li a5,1 + 3005a4c: a4f1 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartParitymode(uartHandle->parity), BASE_STATUS_ERROR); + 3005a4e: fdc42783 lw a5,-36(s0) + 3005a52: 4b9c lw a5,16(a5) + 3005a54: 853e mv a0,a5 + 3005a56: 3355 jal ra,30057fa + 3005a58: 87aa mv a5,a0 + 3005a5a: 0017c793 xori a5,a5,1 + 3005a5e: 9f81 uxtb a5 + 3005a60: cb91 beqz a5,3005a74 + 3005a62: 09e00593 li a1,158 + 3005a66: 030077b7 lui a5,0x3007 + 3005a6a: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a6e: 3689 jal ra,30055b0 + 3005a70: 4785 li a5,1 + 3005a72: a45d j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->txMode), BASE_STATUS_ERROR); + 3005a74: fdc42783 lw a5,-36(s0) + 3005a78: 4bdc lw a5,20(a5) + 3005a7a: 853e mv a0,a5 + 3005a7c: 3345 jal ra,300581c + 3005a7e: 87aa mv a5,a0 + 3005a80: 0017c793 xori a5,a5,1 + 3005a84: 9f81 uxtb a5 + 3005a86: cb91 beqz a5,3005a9a + 3005a88: 09f00593 li a1,159 + 3005a8c: 030077b7 lui a5,0x3007 + 3005a90: a1078513 addi a0,a5,-1520 # 3006a10 + 3005a94: 3e31 jal ra,30055b0 + 3005a96: 4785 li a5,1 + 3005a98: a441 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->rxMode), BASE_STATUS_ERROR); + 3005a9a: fdc42783 lw a5,-36(s0) + 3005a9e: 4f9c lw a5,24(a5) + 3005aa0: 853e mv a0,a5 + 3005aa2: 3bad jal ra,300581c + 3005aa4: 87aa mv a5,a0 + 3005aa6: 0017c793 xori a5,a5,1 + 3005aaa: 9f81 uxtb a5 + 3005aac: cb91 beqz a5,3005ac0 + 3005aae: 0a000593 li a1,160 + 3005ab2: 030077b7 lui a5,0x3007 + 3005ab6: a1078513 addi a0,a5,-1520 # 3006a10 + 3005aba: 3cdd jal ra,30055b0 + 3005abc: 4785 li a5,1 + 3005abe: aca9 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoTxThr), BASE_STATUS_ERROR); + 3005ac0: fdc42783 lw a5,-36(s0) + 3005ac4: 5b9c lw a5,48(a5) + 3005ac6: 853e mv a0,a5 + 3005ac8: 3b41 jal ra,3005858 + 3005aca: 87aa mv a5,a0 + 3005acc: 0017c793 xori a5,a5,1 + 3005ad0: 9f81 uxtb a5 + 3005ad2: cb91 beqz a5,3005ae6 + 3005ad4: 0a100593 li a1,161 + 3005ad8: 030077b7 lui a5,0x3007 + 3005adc: a1078513 addi a0,a5,-1520 # 3006a10 + 3005ae0: 3cc1 jal ra,30055b0 + 3005ae2: 4785 li a5,1 + 3005ae4: ac15 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoRxThr), BASE_STATUS_ERROR); + 3005ae6: fdc42783 lw a5,-36(s0) + 3005aea: 5bdc lw a5,52(a5) + 3005aec: 853e mv a0,a5 + 3005aee: 33ad jal ra,3005858 + 3005af0: 87aa mv a5,a0 + 3005af2: 0017c793 xori a5,a5,1 + 3005af6: 9f81 uxtb a5 + 3005af8: cb91 beqz a5,3005b0c + 3005afa: 0a200593 li a1,162 + 3005afe: 030077b7 lui a5,0x3007 + 3005b02: a1078513 addi a0,a5,-1520 # 3006a10 + 3005b06: 346d jal ra,30055b0 + 3005b08: 4785 li a5,1 + 3005b0a: a439 j 3005d18 + UART_PARAM_CHECK_WITH_RET(IsUartOversampleMultiple(uartHandle->handleEx.overSampleMultiple), BASE_STATUS_ERROR); + 3005b0c: fdc42783 lw a5,-36(s0) + 3005b10: 5fbc lw a5,120(a5) + 3005b12: 853e mv a0,a5 + 3005b14: 3385 jal ra,3005874 + 3005b16: 87aa mv a5,a0 + 3005b18: 0017c793 xori a5,a5,1 + 3005b1c: 9f81 uxtb a5 + 3005b1e: cb91 beqz a5,3005b32 + 3005b20: 0a300593 li a1,163 + 3005b24: 030077b7 lui a5,0x3007 + 3005b28: a1078513 addi a0,a5,-1520 # 3006a10 + 3005b2c: 3451 jal ra,30055b0 + 3005b2e: 4785 li a5,1 + 3005b30: a2e5 j 3005d18 + + uartHandle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; + 3005b32: fdc42783 lw a5,-36(s0) + 3005b36: 4398 lw a4,0(a5) + 3005b38: 5b1c lw a5,48(a4) + 3005b3a: 9bf9 andi a5,a5,-2 + 3005b3c: db1c sw a5,48(a4) + while (uartHandle->baseAddress->UART_FR.BIT.busy == 0x01) { + 3005b3e: 0001 nop + 3005b40: fdc42783 lw a5,-36(s0) + 3005b44: 439c lw a5,0(a5) + 3005b46: 4f9c lw a5,24(a5) + 3005b48: 838d srli a5,a5,0x3 + 3005b4a: 8b85 andi a5,a5,1 + 3005b4c: 0ff7f713 andi a4,a5,255 + 3005b50: 4785 li a5,1 + 3005b52: fef707e3 beq a4,a5,3005b40 + ; + } + + uartClock = HAL_CRG_GetIpFreq((void *)uartHandle->baseAddress); + 3005b56: fdc42783 lw a5,-36(s0) + 3005b5a: 439c lw a5,0(a5) + 3005b5c: 853e mv a0,a5 + 3005b5e: 9f1fd0ef jal ra,300354e + 3005b62: fea42623 sw a0,-20(s0) + + /* DCL OverSample Multiple check */ + uartHandle->baseAddress->UART_SPCFG.BIT.spcfg = uartHandle->handleEx.overSampleMultiple; + 3005b66: fdc42783 lw a5,-36(s0) + 3005b6a: 5fb4 lw a3,120(a5) + 3005b6c: fdc42783 lw a5,-36(s0) + 3005b70: 4398 lw a4,0(a5) + 3005b72: 87b6 mv a5,a3 + 3005b74: 8bbd andi a5,a5,15 + 3005b76: 0ff7f693 andi a3,a5,255 + 3005b7a: 4f3c lw a5,88(a4) + 3005b7c: 8abd andi a3,a3,15 + 3005b7e: 9bc1 andi a5,a5,-16 + 3005b80: 8fd5 or a5,a5,a3 + 3005b82: cf3c sw a5,88(a4) + + /* DCL sequences setting */ + uartHandle->baseAddress->UART_DS.BIT.msbfirst = uartHandle->handleEx.msbFirst; + 3005b84: fdc42783 lw a5,-36(s0) + 3005b88: 4398 lw a4,0(a5) + 3005b8a: fdc42783 lw a5,-36(s0) + 3005b8e: 07c7c683 lbu a3,124(a5) + 3005b92: 4b3c lw a5,80(a4) + 3005b94: 8a85 andi a3,a3,1 + 3005b96: 9bf9 andi a5,a5,-2 + 3005b98: 8fd5 or a5,a5,a3 + 3005b9a: cb3c sw a5,80(a4) + + /* The baud rate divider(BRD) based on the baud rate and clock frequency, calculation formula */ + unsigned int oversample = uartHandle->baseAddress->UART_SPCFG.reg; + 3005b9c: fdc42783 lw a5,-36(s0) + 3005ba0: 439c lw a5,0(a5) + 3005ba2: 4fbc lw a5,88(a5) + 3005ba4: fef42423 sw a5,-24(s0) + if (uartHandle->baudRate > (uartClock / (OVERSAMPLING_PARAM - oversample))) { + 3005ba8: fdc42783 lw a5,-36(s0) + 3005bac: 43d8 lw a4,4(a5) + 3005bae: 46c1 li a3,16 + 3005bb0: fe842783 lw a5,-24(s0) + 3005bb4: 40f687b3 sub a5,a3,a5 + 3005bb8: fec42683 lw a3,-20(s0) + 3005bbc: 02f6d7b3 divu a5,a3,a5 + 3005bc0: 00e7f463 bgeu a5,a4,3005bc8 + return BASE_STATUS_ERROR; + 3005bc4: 4785 li a5,1 + 3005bc6: aa89 j 3005d18 + } else { + unsigned int tmpClock = uartClock / (OVERSAMPLING_PARAM - oversample) * 64; /* 64 is for decimal parts */ + 3005bc8: 4741 li a4,16 + 3005bca: fe842783 lw a5,-24(s0) + 3005bce: 40f707b3 sub a5,a4,a5 + 3005bd2: fec42703 lw a4,-20(s0) + 3005bd6: 02f757b3 divu a5,a4,a5 + 3005bda: 079a slli a5,a5,0x6 + 3005bdc: fef42223 sw a5,-28(s0) + quot = DivClosest(tmpClock, uartHandle->baudRate); + 3005be0: fdc42783 lw a5,-36(s0) + 3005be4: 43dc lw a5,4(a5) + 3005be6: 85be mv a1,a5 + 3005be8: fe442503 lw a0,-28(s0) + 3005bec: 3155 jal ra,3005890 + 3005bee: fea42023 sw a0,-32(s0) + } + /* Clear the baud rate divider register */ + uartHandle->baseAddress->UART_FBRD.reg = 0; + 3005bf2: fdc42783 lw a5,-36(s0) + 3005bf6: 439c lw a5,0(a5) + 3005bf8: 0207a423 sw zero,40(a5) + uartHandle->baseAddress->UART_IBRD.reg = 0; + 3005bfc: fdc42783 lw a5,-36(s0) + 3005c00: 439c lw a5,0(a5) + 3005c02: 0207a223 sw zero,36(a5) + /* The fractional baud rate divider value is stored to the lower 6 bits of the FBRD */ + uartHandle->baseAddress->UART_FBRD.reg = (quot & 0x3F); + 3005c06: fdc42783 lw a5,-36(s0) + 3005c0a: 439c lw a5,0(a5) + 3005c0c: fe042703 lw a4,-32(s0) + 3005c10: 03f77713 andi a4,a4,63 + 3005c14: d798 sw a4,40(a5) + /* Right shift 6 bits is the integer baud rate divider value, is stored to IBRD */ + uartHandle->baseAddress->UART_IBRD.reg = (quot >> 6); + 3005c16: fdc42783 lw a5,-36(s0) + 3005c1a: 439c lw a5,0(a5) + 3005c1c: fe042703 lw a4,-32(s0) + 3005c20: 8319 srli a4,a4,0x6 + 3005c22: d3d8 sw a4,36(a5) + uartHandle->baseAddress->UART_LCR_H.reg = 0; + 3005c24: fdc42783 lw a5,-36(s0) + 3005c28: 439c lw a5,0(a5) + 3005c2a: 0207a623 sw zero,44(a5) + uartHandle->baseAddress->UART_LCR_H.BIT.wlen = uartHandle->dataLength; /* Frame length seting */ + 3005c2e: fdc42783 lw a5,-36(s0) + 3005c32: 4794 lw a3,8(a5) + 3005c34: fdc42783 lw a5,-36(s0) + 3005c38: 4398 lw a4,0(a5) + 3005c3a: 87b6 mv a5,a3 + 3005c3c: 8b8d andi a5,a5,3 + 3005c3e: 0ff7f693 andi a3,a5,255 + 3005c42: 575c lw a5,44(a4) + 3005c44: 8a8d andi a3,a3,3 + 3005c46: 0696 slli a3,a3,0x5 + 3005c48: f9f7f793 andi a5,a5,-97 + 3005c4c: 8fd5 or a5,a5,a3 + 3005c4e: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_LCR_H.BIT.stp2 = uartHandle->stopBits; /* Stop bit seting */ + 3005c50: fdc42783 lw a5,-36(s0) + 3005c54: 47d4 lw a3,12(a5) + 3005c56: fdc42783 lw a5,-36(s0) + 3005c5a: 4398 lw a4,0(a5) + 3005c5c: 87b6 mv a5,a3 + 3005c5e: 8b85 andi a5,a5,1 + 3005c60: 0ff7f693 andi a3,a5,255 + 3005c64: 575c lw a5,44(a4) + 3005c66: 8a85 andi a3,a3,1 + 3005c68: 068e slli a3,a3,0x3 + 3005c6a: 9bdd andi a5,a5,-9 + 3005c6c: 8fd5 or a5,a5,a3 + 3005c6e: d75c sw a5,44(a4) + UART_SetParityBit(uartHandle); + 3005c70: fdc42503 lw a0,-36(s0) + 3005c74: 39a9 jal ra,30058ce + if (uartHandle->fifoMode == true) { /* FIFO threshold setting */ + 3005c76: fdc42783 lw a5,-36(s0) + 3005c7a: 02c7c783 lbu a5,44(a5) + 3005c7e: cbb1 beqz a5,3005cd2 + uartHandle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_ENABLE; + 3005c80: fdc42783 lw a5,-36(s0) + 3005c84: 4398 lw a4,0(a5) + 3005c86: 575c lw a5,44(a4) + 3005c88: 0107e793 ori a5,a5,16 + 3005c8c: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_IFLS.BIT.rxiflsel = uartHandle->fifoRxThr; + 3005c8e: fdc42783 lw a5,-36(s0) + 3005c92: 5bd4 lw a3,52(a5) + 3005c94: fdc42783 lw a5,-36(s0) + 3005c98: 4398 lw a4,0(a5) + 3005c9a: 87b6 mv a5,a3 + 3005c9c: 8bbd andi a5,a5,15 + 3005c9e: 0ff7f693 andi a3,a5,255 + 3005ca2: 5b5c lw a5,52(a4) + 3005ca4: 8abd andi a3,a3,15 + 3005ca6: 06a2 slli a3,a3,0x8 + 3005ca8: 767d lui a2,0xfffff + 3005caa: 0ff60613 addi a2,a2,255 # fffff0ff + 3005cae: 8ff1 and a5,a5,a2 + 3005cb0: 8fd5 or a5,a5,a3 + 3005cb2: db5c sw a5,52(a4) + uartHandle->baseAddress->UART_IFLS.BIT.txiflsel = uartHandle->fifoTxThr; + 3005cb4: fdc42783 lw a5,-36(s0) + 3005cb8: 5b94 lw a3,48(a5) + 3005cba: fdc42783 lw a5,-36(s0) + 3005cbe: 4398 lw a4,0(a5) + 3005cc0: 87b6 mv a5,a3 + 3005cc2: 8bbd andi a5,a5,15 + 3005cc4: 0ff7f693 andi a3,a5,255 + 3005cc8: 5b5c lw a5,52(a4) + 3005cca: 8abd andi a3,a3,15 + 3005ccc: 9bc1 andi a5,a5,-16 + 3005cce: 8fd5 or a5,a5,a3 + 3005cd0: db5c sw a5,52(a4) + } + if (uartHandle->hwFlowCtr == UART_HW_FLOWCTR_ENABLE) { /* Hardwarer flow control setting */ + 3005cd2: fdc42783 lw a5,-36(s0) + 3005cd6: 5f98 lw a4,56(a5) + 3005cd8: 4785 li a5,1 + 3005cda: 00f71c63 bne a4,a5,3005cf2 + uartHandle->baseAddress->UART_CR.reg |= 0xC000; + 3005cde: fdc42783 lw a5,-36(s0) + 3005ce2: 439c lw a5,0(a5) + 3005ce4: 5b94 lw a3,48(a5) + 3005ce6: fdc42783 lw a5,-36(s0) + 3005cea: 439c lw a5,0(a5) + 3005cec: 6731 lui a4,0xc + 3005cee: 8f55 or a4,a4,a3 + 3005cf0: db98 sw a4,48(a5) + } + uartHandle->baseAddress->UART_CR.reg |= 0x301; /* Enable bit use 0x301 is to set txe/rxe/uarten */ + 3005cf2: fdc42783 lw a5,-36(s0) + 3005cf6: 439c lw a5,0(a5) + 3005cf8: 5b98 lw a4,48(a5) + 3005cfa: fdc42783 lw a5,-36(s0) + 3005cfe: 439c lw a5,0(a5) + 3005d00: 30176713 ori a4,a4,769 + 3005d04: db98 sw a4,48(a5) + uartHandle->txState = UART_STATE_READY; + 3005d06: fdc42783 lw a5,-36(s0) + 3005d0a: 4705 li a4,1 + 3005d0c: c7b8 sw a4,72(a5) + uartHandle->rxState = UART_STATE_READY; + 3005d0e: fdc42783 lw a5,-36(s0) + 3005d12: 4705 li a4,1 + 3005d14: c7f8 sw a4,76(a5) + return BASE_STATUS_OK; + 3005d16: 4781 li a5,0 +} + 3005d18: 853e mv a0,a5 + 3005d1a: 50b2 lw ra,44(sp) + 3005d1c: 5422 lw s0,40(sp) + 3005d1e: 6145 addi sp,sp,48 + 3005d20: 8082 ret + +03005d22
: +/* USER CODE BEGIN 1 */ +/* 建议用户定义全局变量、结构体、宏定义或函数声明等 */ +/* USER CODE END 1 */ + +int main(void) +{ + 3005d22: 1141 addi sp,sp,-16 + 3005d24: c606 sw ra,12(sp) + 3005d26: c422 sw s0,8(sp) + 3005d28: 0800 addi s0,sp,16 + /* USER CODE BEGIN 2 */ + /* 建议用户放置初始化代码或启动代码等 */ + /* USER CODE END 2 */ + SystemInit(); + 3005d2a: 2ee5 jal ra,3006122 + /* USER CODE BEGIN 3 */ + /* 建议用户放置初始配置代码 */ + /* USER CODE END 3 */ + while (1) { + 3005d2c: a001 j 3005d2c + +03005d2e : +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + 3005d2e: 715d addi sp,sp,-80 + 3005d30: c686 sw ra,76(sp) + 3005d32: c4a2 sw s0,72(sp) + 3005d34: 0880 addi s0,sp,80 + 3005d36: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3005d3a: 100007b7 lui a5,0x10000 + 3005d3e: fcf42423 sw a5,-56(s0) + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + 3005d42: fc042623 sw zero,-52(s0) + crg.pllPreDiv = CRG_PLL_PREDIV_4; + 3005d46: 478d li a5,3 + 3005d48: fcf42823 sw a5,-48(s0) + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + 3005d4c: 03000793 li a5,48 + 3005d50: fcf42a23 sw a5,-44(s0) + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + 3005d54: 4785 li a5,1 + 3005d56: fcf42c23 sw a5,-40(s0) + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + 3005d5a: 4789 li a5,2 + 3005d5c: fef42023 sw a5,-32(s0) + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + 3005d60: 4789 li a5,2 + 3005d62: fef42223 sw a5,-28(s0) + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + 3005d66: fe042423 sw zero,-24(s0) + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + 3005d6a: 47e1 li a5,24 + 3005d6c: fef42623 sw a5,-20(s0) + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + 3005d70: fc840793 addi a5,s0,-56 + 3005d74: 853e mv a0,a5 + 3005d76: aecfd0ef jal ra,3003062 + 3005d7a: 87aa mv a5,a0 + 3005d7c: c399 beqz a5,3005d82 + return BASE_STATUS_ERROR; + 3005d7e: 4785 li a5,1 + 3005d80: a039 j 3005d8e + } + *coreClkSelect = crg.coreClkSelect; + 3005d82: fe042703 lw a4,-32(s0) + 3005d86: fbc42783 lw a5,-68(s0) + 3005d8a: c398 sw a4,0(a5) + return BASE_STATUS_OK; + 3005d8c: 4781 li a5,0 +} + 3005d8e: 853e mv a0,a5 + 3005d90: 40b6 lw ra,76(sp) + 3005d92: 4426 lw s0,72(sp) + 3005d94: 6161 addi sp,sp,80 + 3005d96: 8082 ret + +03005d98 : + +__weak void ADC0Interrupt2Callback(ADC_Handle *handle) +{ + 3005d98: 1101 addi sp,sp,-32 + 3005d9a: ce22 sw s0,28(sp) + 3005d9c: 1000 addi s0,sp,32 + 3005d9e: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ADC0_CALLBACK_INT2 */ + /* USER CODE END ADC0_CALLBACK_INT2 */ +} + 3005da2: 0001 nop + 3005da4: 4472 lw s0,28(sp) + 3005da6: 6105 addi sp,sp,32 + 3005da8: 8082 ret + +03005daa : + +static void ADC0_Init(void) +{ + 3005daa: 7179 addi sp,sp,-48 + 3005dac: d606 sw ra,44(sp) + 3005dae: d422 sw s0,40(sp) + 3005db0: 1800 addi s0,sp,48 + HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); + 3005db2: 4585 li a1,1 + 3005db4: 18000537 lui a0,0x18000 + 3005db8: 2c49 jal ra,300604a + HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); + 3005dba: 4589 li a1,2 + 3005dbc: 18000537 lui a0,0x18000 + 3005dc0: 94bfd0ef jal ra,300370a + HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_1); + 3005dc4: 4581 li a1,0 + 3005dc6: 18000537 lui a0,0x18000 + 3005dca: 9f7fd0ef jal ra,30037c0 + + g_adc0.baseAddress = ADC0; + 3005dce: 040007b7 lui a5,0x4000 + 3005dd2: 54478793 addi a5,a5,1348 # 4000544 + 3005dd6: 18000737 lui a4,0x18000 + 3005dda: c398 sw a4,0(a5) + g_adc0.socPriority = ADC_PRIMODE_ALL_ROUND; + 3005ddc: 040007b7 lui a5,0x4000 + 3005de0: 54478793 addi a5,a5,1348 # 4000544 + 3005de4: 0007a223 sw zero,4(a5) + + HAL_ADC_Init(&g_adc0); + 3005de8: 040007b7 lui a5,0x4000 + 3005dec: 54478513 addi a0,a5,1348 # 4000544 + 3005df0: c97fb0ef jal ra,3001a86 + + SOC_Param socParam = {0}; + 3005df4: fc042e23 sw zero,-36(s0) + 3005df8: fe042023 sw zero,-32(s0) + 3005dfc: fe042223 sw zero,-28(s0) + 3005e00: fe042423 sw zero,-24(s0) + 3005e04: fe042623 sw zero,-20(s0) + socParam.adcInput = ADC_CH_ADCINA6; /* PIN4(ADC AIN6) */ + 3005e08: 4799 li a5,6 + 3005e0a: fcf42e23 sw a5,-36(s0) + socParam.sampleTotalTime = ADC_SOCSAMPLE_10CLK; /* adc sample total time 10 adc_clk */ + 3005e0e: 4789 li a5,2 + 3005e10: fef42023 sw a5,-32(s0) + socParam.trigSource = ADC_TRIGSOC_SOFT; + 3005e14: fe042223 sw zero,-28(s0) + socParam.continueMode = BASE_CFG_ENABLE; + 3005e18: 4785 li a5,1 + 3005e1a: fef40423 sb a5,-24(s0) + socParam.finishMode = ADC_SOCFINISH_INT2; + 3005e1e: 4795 li a5,5 + 3005e20: fef42623 sw a5,-20(s0) + HAL_ADC_ConfigureSoc(&g_adc0, ADC_SOC_NUM1, &socParam); + 3005e24: fdc40793 addi a5,s0,-36 + 3005e28: 863e mv a2,a5 + 3005e2a: 4585 li a1,1 + 3005e2c: 040007b7 lui a5,0x4000 + 3005e30: 54478513 addi a0,a5,1348 # 4000544 + 3005e34: d09fb0ef jal ra,3001b3c + HAL_ADC_RegisterCallBack(&g_adc0, ADC_CALLBACK_INT2, (ADC_CallbackType)ADC0Interrupt2Callback); + 3005e38: 030067b7 lui a5,0x3006 + 3005e3c: d9878613 addi a2,a5,-616 # 3005d98 + 3005e40: 4589 li a1,2 + 3005e42: 040007b7 lui a5,0x4000 + 3005e46: 54478513 addi a0,a5,1348 # 4000544 + 3005e4a: ab6fc0ef jal ra,3002100 + IRQ_Register(IRQ_ADC0_INT2, HAL_ADC_IrqHandlerInt2, &g_adc0); + 3005e4e: 040007b7 lui a5,0x4000 + 3005e52: 54478613 addi a2,a5,1348 # 4000544 + 3005e56: 030027b7 lui a5,0x3002 + 3005e5a: 03678593 addi a1,a5,54 # 3002036 + 3005e5e: 05f00513 li a0,95 + 3005e62: d88fc0ef jal ra,30023ea + IRQ_SetPriority(IRQ_ADC0_INT2, 1); /* 1 is priority value */ + 3005e66: 4585 li a1,1 + 3005e68: 05f00513 li a0,95 + 3005e6c: d53fc0ef jal ra,3002bbe + IRQ_EnableN(IRQ_ADC0_INT2); + 3005e70: 05f00513 li a0,95 + 3005e74: dfcfc0ef jal ra,3002470 +} + 3005e78: 0001 nop + 3005e7a: 50b2 lw ra,44(sp) + 3005e7c: 5422 lw s0,40(sp) + 3005e7e: 6145 addi sp,sp,48 + 3005e80: 8082 ret + +03005e82 : + /* USER CODE BEGIN TIMER3_InterruptProcess */ + /* USER CODE END TIMER3_InterruptProcess */ +} + +static void TIMER3_Init(void) +{ + 3005e82: 1101 addi sp,sp,-32 + 3005e84: ce06 sw ra,28(sp) + 3005e86: cc22 sw s0,24(sp) + 3005e88: 1000 addi s0,sp,32 + HAL_CRG_IpEnableSet(TIMER3_BASE, IP_CLK_ENABLE); /* TIMER3 clock enable. */ + 3005e8a: 4585 li a1,1 + 3005e8c: 14303537 lui a0,0x14303 + 3005e90: 2a6d jal ra,300604a + unsigned int load = (HAL_CRG_GetIpFreq((void *)TIMER3) / (1u << (TIMERPRESCALER_NO_DIV * 4)) / 1000000u) * 10; + 3005e92: 14303537 lui a0,0x14303 + 3005e96: eb8fd0ef jal ra,300354e + 3005e9a: 872a mv a4,a0 + 3005e9c: 000f47b7 lui a5,0xf4 + 3005ea0: 24078793 addi a5,a5,576 # f4240 + 3005ea4: 02f75733 divu a4,a4,a5 + 3005ea8: 47a9 li a5,10 + 3005eaa: 02f707b3 mul a5,a4,a5 + 3005eae: fef42623 sw a5,-20(s0) + + g_timer3.baseAddress = TIMER3; + 3005eb2: 040007b7 lui a5,0x4000 + 3005eb6: 49c78793 addi a5,a5,1180 # 400049c + 3005eba: 14303737 lui a4,0x14303 + 3005ebe: c398 sw a4,0(a5) + g_timer3.load = load - 1; /* Set timer value immediately */ + 3005ec0: fec42783 lw a5,-20(s0) + 3005ec4: fff78713 addi a4,a5,-1 + 3005ec8: 040007b7 lui a5,0x4000 + 3005ecc: 49c78793 addi a5,a5,1180 # 400049c + 3005ed0: cbd8 sw a4,20(a5) + g_timer3.bgLoad = load - 1; /* Set timer value */ + 3005ed2: fec42783 lw a5,-20(s0) + 3005ed6: fff78713 addi a4,a5,-1 + 3005eda: 040007b7 lui a5,0x4000 + 3005ede: 49c78793 addi a5,a5,1180 # 400049c + 3005ee2: cf98 sw a4,24(a5) + g_timer3.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ + 3005ee4: 040007b7 lui a5,0x4000 + 3005ee8: 49c78793 addi a5,a5,1180 # 400049c + 3005eec: 4705 li a4,1 + 3005eee: c798 sw a4,8(a5) + g_timer3.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ + 3005ef0: 040007b7 lui a5,0x4000 + 3005ef4: 49c78793 addi a5,a5,1180 # 400049c + 3005ef8: 0007a623 sw zero,12(a5) + g_timer3.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ + 3005efc: 040007b7 lui a5,0x4000 + 3005f00: 49c78793 addi a5,a5,1180 # 400049c + 3005f04: 4705 li a4,1 + 3005f06: cb98 sw a4,16(a5) + g_timer3.interruptEn = BASE_CFG_ENABLE; + 3005f08: 040007b7 lui a5,0x4000 + 3005f0c: 49c78793 addi a5,a5,1180 # 400049c + 3005f10: 4705 li a4,1 + 3005f12: afd8 sb a4,28(a5) + g_timer3.adcSocReqEnable = BASE_CFG_DISABLE; + 3005f14: 040007b7 lui a5,0x4000 + 3005f18: 49c78793 addi a5,a5,1180 # 400049c + 3005f1c: 00078ea3 sb zero,29(a5) + g_timer3.dmaReqEnable = BASE_CFG_DISABLE; + 3005f20: 040007b7 lui a5,0x4000 + 3005f24: 49c78793 addi a5,a5,1180 # 400049c + 3005f28: 00078f23 sb zero,30(a5) + HAL_TIMER_Init(&g_timer3); + 3005f2c: 040007b7 lui a5,0x4000 + 3005f30: 49c78513 addi a0,a5,1180 # 400049c + 3005f34: c2aff0ef jal ra,300535e + IRQ_Register(IRQ_TIMER3, HAL_TIMER_IrqHandler, &g_timer3); + 3005f38: 040007b7 lui a5,0x4000 + 3005f3c: 49c78613 addi a2,a5,1180 # 400049c + 3005f40: 030057b7 lui a5,0x3005 + 3005f44: 63678593 addi a1,a5,1590 # 3005636 + 3005f48: 02300513 li a0,35 + 3005f4c: c9efc0ef jal ra,30023ea + + HAL_TIMER_RegisterCallback(&g_timer3, TIMER_PERIOD_FIN, TIMER3_InterruptProcess); + 3005f50: 030067b7 lui a5,0x3006 + 3005f54: 16278613 addi a2,a5,354 # 3006162 + 3005f58: 4581 li a1,0 + 3005f5a: 040007b7 lui a5,0x4000 + 3005f5e: 49c78513 addi a0,a5,1180 # 400049c + 3005f62: fbcff0ef jal ra,300571e + IRQ_SetPriority(IRQ_TIMER3, 1); /* 1 is priority value */ + 3005f66: 4585 li a1,1 + 3005f68: 02300513 li a0,35 + 3005f6c: c53fc0ef jal ra,3002bbe + IRQ_EnableN(IRQ_TIMER3); + 3005f70: 02300513 li a0,35 + 3005f74: cfcfc0ef jal ra,3002470 +} + 3005f78: 0001 nop + 3005f7a: 40f2 lw ra,28(sp) + 3005f7c: 4462 lw s0,24(sp) + 3005f7e: 6105 addi sp,sp,32 + 3005f80: 8082 ret + +03005f82 : + +static void UART0_Init(void) +{ + 3005f82: 1141 addi sp,sp,-16 + 3005f84: c606 sw ra,12(sp) + 3005f86: c422 sw s0,8(sp) + 3005f88: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + 3005f8a: 4585 li a1,1 + 3005f8c: 14000537 lui a0,0x14000 + 3005f90: 286d jal ra,300604a + g_uart0.baseAddress = UART0; + 3005f92: 040007b7 lui a5,0x4000 + 3005f96: 4c478793 addi a5,a5,1220 # 40004c4 + 3005f9a: 14000737 lui a4,0x14000 + 3005f9e: c398 sw a4,0(a5) + + g_uart0.baudRate = UART0_BAND_RATE; + 3005fa0: 040007b7 lui a5,0x4000 + 3005fa4: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fa8: 6771 lui a4,0x1c + 3005faa: 20070713 addi a4,a4,512 # 1c200 + 3005fae: c3d8 sw a4,4(a5) + g_uart0.dataLength = UART_DATALENGTH_8BIT; + 3005fb0: 040007b7 lui a5,0x4000 + 3005fb4: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fb8: 470d li a4,3 + 3005fba: c798 sw a4,8(a5) + g_uart0.stopBits = UART_STOPBITS_ONE; + 3005fbc: 040007b7 lui a5,0x4000 + 3005fc0: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fc4: 0007a623 sw zero,12(a5) + g_uart0.parity = UART_PARITY_NONE; + 3005fc8: 040007b7 lui a5,0x4000 + 3005fcc: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fd0: 4711 li a4,4 + 3005fd2: cb98 sw a4,16(a5) + g_uart0.txMode = UART_MODE_BLOCKING; + 3005fd4: 040007b7 lui a5,0x4000 + 3005fd8: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fdc: 0007aa23 sw zero,20(a5) + g_uart0.rxMode = UART_MODE_BLOCKING; + 3005fe0: 040007b7 lui a5,0x4000 + 3005fe4: 4c478793 addi a5,a5,1220 # 40004c4 + 3005fe8: 0007ac23 sw zero,24(a5) + g_uart0.fifoMode = BASE_CFG_ENABLE; + 3005fec: 040007b7 lui a5,0x4000 + 3005ff0: 4c478793 addi a5,a5,1220 # 40004c4 + 3005ff4: 4705 li a4,1 + 3005ff6: 02e78623 sb a4,44(a5) + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + 3005ffa: 040007b7 lui a5,0x4000 + 3005ffe: 4c478793 addi a5,a5,1220 # 40004c4 + 3006002: 4721 li a4,8 + 3006004: db98 sw a4,48(a5) + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + 3006006: 040007b7 lui a5,0x4000 + 300600a: 4c478793 addi a5,a5,1220 # 40004c4 + 300600e: 4721 li a4,8 + 3006010: dbd8 sw a4,52(a5) + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + 3006012: 040007b7 lui a5,0x4000 + 3006016: 4c478793 addi a5,a5,1220 # 40004c4 + 300601a: 0207ac23 sw zero,56(a5) + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + 300601e: 040007b7 lui a5,0x4000 + 3006022: 4c478793 addi a5,a5,1220 # 40004c4 + 3006026: 0607ac23 sw zero,120(a5) + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + 300602a: 040007b7 lui a5,0x4000 + 300602e: 4c478793 addi a5,a5,1220 # 40004c4 + 3006032: 06078e23 sb zero,124(a5) + HAL_UART_Init(&g_uart0); + 3006036: 040007b7 lui a5,0x4000 + 300603a: 4c478513 addi a0,a5,1220 # 40004c4 + 300603e: 321d jal ra,3005964 +} + 3006040: 0001 nop + 3006042: 40b2 lw ra,12(sp) + 3006044: 4422 lw s0,8(sp) + 3006046: 0141 addi sp,sp,16 + 3006048: 8082 ret + +0300604a : + 300604a: de8fd06f j 3003632 + +0300604e : + +static void IOConfig(void) +{ + 300604e: 1141 addi sp,sp,-16 + 3006050: c606 sw ra,12(sp) + 3006052: c422 sw s0,8(sp) + 3006054: 0800 addi s0,sp,16 + /* Config PIN4 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_ADC_AIN6); /* Check function selection */ + 3006056: 010c07b7 lui a5,0x10c0 + 300605a: 23c78513 addi a0,a5,572 # 10c023c + 300605e: 20c1 jal ra,300611e + HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_ADC_AIN6, PULL_NONE); /* Pull-up and Pull-down */ + 3006060: 4581 li a1,0 + 3006062: 010c07b7 lui a5,0x10c0 + 3006066: 23c78513 addi a0,a5,572 # 10c023c + 300606a: 2845 jal ra,300611a + HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_ADC_AIN6, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 300606c: 4581 li a1,0 + 300606e: 010c07b7 lui a5,0x10c0 + 3006072: 23c78513 addi a0,a5,572 # 10c023c + 3006076: 2045 jal ra,3006116 + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_ADC_AIN6, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3006078: 4585 li a1,1 + 300607a: 010c07b7 lui a5,0x10c0 + 300607e: 23c78513 addi a0,a5,572 # 10c023c + 3006082: 2841 jal ra,3006112 + HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_ADC_AIN6, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3006084: 4589 li a1,2 + 3006086: 010c07b7 lui a5,0x10c0 + 300608a: 23c78513 addi a0,a5,572 # 10c023c + 300608e: 2041 jal ra,300610e + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + 3006090: 019007b7 lui a5,0x1900 + 3006094: 23378513 addi a0,a5,563 # 1900233 + 3006098: 2059 jal ra,300611e + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + 300609a: 4581 li a1,0 + 300609c: 019007b7 lui a5,0x1900 + 30060a0: 23378513 addi a0,a5,563 # 1900233 + 30060a4: 289d jal ra,300611a + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 30060a6: 4581 li a1,0 + 30060a8: 019007b7 lui a5,0x1900 + 30060ac: 23378513 addi a0,a5,563 # 1900233 + 30060b0: 209d jal ra,3006116 + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 30060b2: 4585 li a1,1 + 30060b4: 019007b7 lui a5,0x1900 + 30060b8: 23378513 addi a0,a5,563 # 1900233 + 30060bc: 2899 jal ra,3006112 + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 30060be: 4589 li a1,2 + 30060c0: 019007b7 lui a5,0x1900 + 30060c4: 23378513 addi a0,a5,563 # 1900233 + 30060c8: 2099 jal ra,300610e + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + 30060ca: 019407b7 lui a5,0x1940 + 30060ce: 23378513 addi a0,a5,563 # 1940233 + 30060d2: 20b1 jal ra,300611e + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + 30060d4: 4589 li a1,2 + 30060d6: 019407b7 lui a5,0x1940 + 30060da: 23378513 addi a0,a5,563 # 1940233 + 30060de: 2835 jal ra,300611a + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 30060e0: 4581 li a1,0 + 30060e2: 019407b7 lui a5,0x1940 + 30060e6: 23378513 addi a0,a5,563 # 1940233 + 30060ea: 2035 jal ra,3006116 + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 30060ec: 4585 li a1,1 + 30060ee: 019407b7 lui a5,0x1940 + 30060f2: 23378513 addi a0,a5,563 # 1940233 + 30060f6: 2831 jal ra,3006112 + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 30060f8: 4589 li a1,2 + 30060fa: 019407b7 lui a5,0x1940 + 30060fe: 23378513 addi a0,a5,563 # 1940233 + 3006102: 2031 jal ra,300610e +} + 3006104: 0001 nop + 3006106: 40b2 lw ra,12(sp) + 3006108: 4422 lw s0,8(sp) + 300610a: 0141 addi sp,sp,16 + 300610c: 8082 ret + +0300610e : + 300610e: 924ff06f j 3005232 + +03006112 : + 3006112: 8d4ff06f j 30051e6 + +03006116 : + 3006116: 884ff06f j 300519a + +0300611a : + 300611a: 834ff06f j 300514e + +0300611e : + 300611e: ff7fe06f j 3005114 + +03006122 : + +void SystemInit(void) +{ + 3006122: 1141 addi sp,sp,-16 + 3006124: c606 sw ra,12(sp) + 3006126: c422 sw s0,8(sp) + 3006128: 0800 addi s0,sp,16 + IOConfig(); + 300612a: 3715 jal ra,300604e + UART0_Init(); + 300612c: 3d99 jal ra,3005f82 + ADC0_Init(); + 300612e: 39b5 jal ra,3005daa + TIMER3_Init(); + 3006130: 3b89 jal ra,3005e82 + + /* USER CODE BEGIN system_init */ + HAL_TIMER_Start(&g_timer3); + 3006132: 040007b7 lui a5,0x4000 + 3006136: 49c78513 addi a0,a5,1180 # 400049c + 300613a: c7aff0ef jal ra,30055b4 + HAL_ADC_StartIt(&g_adc0); + 300613e: 040007b7 lui a5,0x4000 + 3006142: 54478513 addi a0,a5,1348 # 4000544 + 3006146: ba9fb0ef jal ra,3001cee + HAL_ADC_SoftTrigSample(&g_adc0, ADC_SOC_NUM1); + 300614a: 4585 li a1,1 + 300614c: 040007b7 lui a5,0x4000 + 3006150: 54478513 addi a0,a5,1348 # 4000544 + 3006154: cc7fb0ef jal ra,3001e1a + /* USER CODE END system_init */ + 3006158: 0001 nop + 300615a: 40b2 lw ra,12(sp) + 300615c: 4422 lw s0,8(sp) + 300615e: 0141 addi sp,sp,16 + 3006160: 8082 ret + +03006162 : +float adc_num[adc_shownum]={0}; +unsigned int i=0; + + +void TIMER3_InterruptProcess(void *handle) +{ + 3006162: 7179 addi sp,sp,-48 + 3006164: d606 sw ra,44(sp) + 3006166: d422 sw s0,40(sp) + 3006168: 1800 addi s0,sp,48 + 300616a: fca42e23 sw a0,-36(s0) + unsigned int ret = HAL_ADC_GetConvResult(&g_adc0, ADC_SOC_NUM1); + 300616e: 4585 li a1,1 + 3006170: 040007b7 lui a5,0x4000 + 3006174: 54478513 addi a0,a5,1348 # 4000544 + 3006178: d25fb0ef jal ra,3001e9c + 300617c: fea42623 sw a0,-20(s0) + + + adc_num[i] = (float)ret / (float)4096 * 3.3; + 3006180: fec42783 lw a5,-20(s0) + 3006184: d017f753 fcvt.s.wu fa4,a5 + 3006188: 030077b7 lui a5,0x3007 + 300618c: a387a787 flw fa5,-1480(a5) # 3006a38 + 3006190: 18f77753 fdiv.s fa4,fa4,fa5 + 3006194: 040027b7 lui a5,0x4002 + 3006198: 2047a783 lw a5,516(a5) # 4002204 + 300619c: 03007737 lui a4,0x3007 + 30061a0: a3c72787 flw fa5,-1476(a4) # 3006a3c + 30061a4: 10f777d3 fmul.s fa5,fa4,fa5 + 30061a8: 04000737 lui a4,0x4000 + 30061ac: 5e470713 addi a4,a4,1508 # 40005e4 + 30061b0: 078a slli a5,a5,0x2 + 30061b2: 97ba add a5,a5,a4 + 30061b4: e39c fsw fa5,0(a5) + i++; + 30061b6: 040027b7 lui a5,0x4002 + 30061ba: 2047a783 lw a5,516(a5) # 4002204 + 30061be: 00178713 addi a4,a5,1 + 30061c2: 040027b7 lui a5,0x4002 + 30061c6: 20e7a223 sw a4,516(a5) # 4002204 + if(i>adc_shownum){ + 30061ca: 040027b7 lui a5,0x4002 + 30061ce: 2047a703 lw a4,516(a5) # 4002204 + 30061d2: 70800793 li a5,1800 + 30061d6: 06e7f563 bgeu a5,a4,3006240 + for(i=0;i + 30061e2: a099 j 3006228 + { + DBG_PRINTF("V:%.2f\r\n", adc_num[i]); + 30061e4: 040027b7 lui a5,0x4002 + 30061e8: 2047a783 lw a5,516(a5) # 4002204 + 30061ec: 04000737 lui a4,0x4000 + 30061f0: 5e470713 addi a4,a4,1508 # 40005e4 + 30061f4: 078a slli a5,a5,0x2 + 30061f6: 97ba add a5,a5,a4 + 30061f8: 639c flw fa5,0(a5) + 30061fa: 20f78553 fmv.s fa0,fa5 + 30061fe: 20b1 jal ra,300624a <__extendsfdf2> + 3006200: 87aa mv a5,a0 + 3006202: 882e mv a6,a1 + 3006204: 863e mv a2,a5 + 3006206: 86c2 mv a3,a6 + 3006208: 030077b7 lui a5,0x3007 + 300620c: a2c78513 addi a0,a5,-1492 # 3006a2c + 3006210: b31fe0ef jal ra,3004d40 + for(i=0;i + 300621c: 00178713 addi a4,a5,1 + 3006220: 040027b7 lui a5,0x4002 + 3006224: 20e7a223 sw a4,516(a5) # 4002204 + 3006228: 040027b7 lui a5,0x4002 + 300622c: 2047a703 lw a4,516(a5) # 4002204 + 3006230: 70700793 li a5,1799 + 3006234: fae7f8e3 bgeu a5,a4,30061e4 + } + i=0; + 3006238: 040027b7 lui a5,0x4002 + 300623c: 2007a223 sw zero,516(a5) # 4002204 + } + +} + 3006240: 0001 nop + 3006242: 50b2 lw ra,44(sp) + 3006244: 5422 lw s0,40(sp) + 3006246: 6145 addi sp,sp,48 + 3006248: 8082 ret + +0300624a <__extendsfdf2>: + 300624a: 1141 addi sp,sp,-16 + 300624c: c606 sw ra,12(sp) + 300624e: c422 sw s0,8(sp) + 3006250: c226 sw s1,4(sp) + 3006252: e00506d3 fmv.x.w a3,fa0 + 3006256: 002027f3 frrm a5 + 300625a: 0176d513 srli a0,a3,0x17 + 300625e: 0ff57513 andi a0,a0,255 + 3006262: 00800437 lui s0,0x800 + 3006266: 00150793 addi a5,a0,1 # 14000001 + 300626a: 147d addi s0,s0,-1 # 7fffff + 300626c: 0ff7f793 andi a5,a5,255 + 3006270: 4705 li a4,1 + 3006272: 8c75 and s0,s0,a3 + 3006274: 01f6d493 srli s1,a3,0x1f + 3006278: 00f75963 bge a4,a5,300628a <__extendsfdf2+0x40> + 300627c: 00345793 srli a5,s0,0x3 + 3006280: 38050513 addi a0,a0,896 + 3006284: 0476 slli s0,s0,0x1d + 3006286: 4701 li a4,0 + 3006288: a891 j 30062dc <__extendsfdf2+0x92> + 300628a: e915 bnez a0,30062be <__extendsfdf2+0x74> + 300628c: c459 beqz s0,300631a <__extendsfdf2+0xd0> + 300628e: 8522 mv a0,s0 + 3006290: 2c6d jal ra,300654a <__clzsi2> + 3006292: 47a9 li a5,10 + 3006294: 00a7cf63 blt a5,a0,30062b2 <__extendsfdf2+0x68> + 3006298: 47ad li a5,11 + 300629a: 8f89 sub a5,a5,a0 + 300629c: 01550713 addi a4,a0,21 + 30062a0: 00f457b3 srl a5,s0,a5 + 30062a4: 00e41433 sll s0,s0,a4 + 30062a8: 38900713 li a4,905 + 30062ac: 40a70533 sub a0,a4,a0 + 30062b0: bfd9 j 3006286 <__extendsfdf2+0x3c> + 30062b2: ff550793 addi a5,a0,-11 + 30062b6: 00f417b3 sll a5,s0,a5 + 30062ba: 4401 li s0,0 + 30062bc: b7f5 j 30062a8 <__extendsfdf2+0x5e> + 30062be: c02d beqz s0,3006320 <__extendsfdf2+0xd6> + 30062c0: 00400737 lui a4,0x400 + 30062c4: 8f61 and a4,a4,s0 + 30062c6: 00345793 srli a5,s0,0x3 + 30062ca: 00173713 seqz a4,a4 + 30062ce: 000806b7 lui a3,0x80 + 30062d2: 0712 slli a4,a4,0x4 + 30062d4: 0476 slli s0,s0,0x1d + 30062d6: 8fd5 or a5,a5,a3 + 30062d8: 7ff00513 li a0,2047 + 30062dc: 00100637 lui a2,0x100 + 30062e0: 167d addi a2,a2,-1 # fffff + 30062e2: 8ff1 and a5,a5,a2 + 30062e4: 80100637 lui a2,0x80100 + 30062e8: 167d addi a2,a2,-1 # 800fffff + 30062ea: 7ff57513 andi a0,a0,2047 + 30062ee: 0552 slli a0,a0,0x14 + 30062f0: 8ff1 and a5,a5,a2 + 30062f2: 80000637 lui a2,0x80000 + 30062f6: 8fc9 or a5,a5,a0 + 30062f8: fff64613 not a2,a2 + 30062fc: 01f49693 slli a3,s1,0x1f + 3006300: 8ff1 and a5,a5,a2 + 3006302: 00d7e633 or a2,a5,a3 + 3006306: 8522 mv a0,s0 + 3006308: 85b2 mv a1,a2 + 300630a: c319 beqz a4,3006310 <__extendsfdf2+0xc6> + 300630c: 00172073 csrs fflags,a4 + 3006310: 40b2 lw ra,12(sp) + 3006312: 4422 lw s0,8(sp) + 3006314: 4492 lw s1,4(sp) + 3006316: 0141 addi sp,sp,16 + 3006318: 8082 ret + 300631a: 4781 li a5,0 + 300631c: 4501 li a0,0 + 300631e: b7a5 j 3006286 <__extendsfdf2+0x3c> + 3006320: 4781 li a5,0 + 3006322: 7ff00513 li a0,2047 + 3006326: b785 j 3006286 <__extendsfdf2+0x3c> + +03006328 <__truncdfsf2>: + 3006328: 00202873 frrm a6 + 300632c: 001006b7 lui a3,0x100 + 3006330: 16fd addi a3,a3,-1 # fffff + 3006332: 8eed and a3,a3,a1 + 3006334: 0145d893 srli a7,a1,0x14 + 3006338: 00369793 slli a5,a3,0x3 + 300633c: 7ff8f893 andi a7,a7,2047 + 3006340: 01d55693 srli a3,a0,0x1d + 3006344: 8edd or a3,a3,a5 + 3006346: 00188793 addi a5,a7,1 + 300634a: 7ff7f793 andi a5,a5,2047 + 300634e: 4705 li a4,1 + 3006350: 81fd srli a1,a1,0x1f + 3006352: 00351613 slli a2,a0,0x3 + 3006356: 16f75b63 bge a4,a5,30064cc <__truncdfsf2+0x1a4> + 300635a: c8088713 addi a4,a7,-896 + 300635e: 0fe00793 li a5,254 + 3006362: 0ae7d063 bge a5,a4,3006402 <__truncdfsf2+0xda> + 3006366: 04080063 beqz a6,30063a6 <__truncdfsf2+0x7e> + 300636a: 478d li a5,3 + 300636c: 02f81963 bne a6,a5,300639e <__truncdfsf2+0x76> + 3006370: c99d beqz a1,30063a6 <__truncdfsf2+0x7e> + 3006372: 57fd li a5,-1 + 3006374: 0fe00713 li a4,254 + 3006378: 4681 li a3,0 + 300637a: 4615 li a2,5 + 300637c: 4509 li a0,2 + 300637e: 00166613 ori a2,a2,1 + 3006382: 1aa80063 beq a6,a0,3006522 <__truncdfsf2+0x1fa> + 3006386: 450d li a0,3 + 3006388: 18a80a63 beq a6,a0,300651c <__truncdfsf2+0x1f4> + 300638c: 12081763 bnez a6,30064ba <__truncdfsf2+0x192> + 3006390: 00f7f513 andi a0,a5,15 + 3006394: 4891 li a7,4 + 3006396: 13150263 beq a0,a7,30064ba <__truncdfsf2+0x192> + 300639a: 0791 addi a5,a5,4 + 300639c: aa39 j 30064ba <__truncdfsf2+0x192> + 300639e: 4789 li a5,2 + 30063a0: fcf819e3 bne a6,a5,3006372 <__truncdfsf2+0x4a> + 30063a4: d5f9 beqz a1,3006372 <__truncdfsf2+0x4a> + 30063a6: 4781 li a5,0 + 30063a8: 0ff00713 li a4,255 + 30063ac: 4615 li a2,5 + 30063ae: 00579693 slli a3,a5,0x5 + 30063b2: 0006db63 bgez a3,30063c8 <__truncdfsf2+0xa0> + 30063b6: 0705 addi a4,a4,1 # 400001 + 30063b8: 0ff00693 li a3,255 + 30063bc: 16d70563 beq a4,a3,3006526 <__truncdfsf2+0x1fe> + 30063c0: fc0006b7 lui a3,0xfc000 + 30063c4: 16fd addi a3,a3,-1 # fbffffff + 30063c6: 8ff5 and a5,a5,a3 + 30063c8: 0ff00693 li a3,255 + 30063cc: 838d srli a5,a5,0x3 + 30063ce: 00d71663 bne a4,a3,30063da <__truncdfsf2+0xb2> + 30063d2: c781 beqz a5,30063da <__truncdfsf2+0xb2> + 30063d4: 004007b7 lui a5,0x400 + 30063d8: 4581 li a1,0 + 30063da: 008006b7 lui a3,0x800 + 30063de: 16fd addi a3,a3,-1 # 7fffff + 30063e0: 8ff5 and a5,a5,a3 + 30063e2: 808006b7 lui a3,0x80800 + 30063e6: 0ff77713 andi a4,a4,255 + 30063ea: 16fd addi a3,a3,-1 # 807fffff + 30063ec: 075e slli a4,a4,0x17 + 30063ee: 8ff5 and a5,a5,a3 + 30063f0: 05fe slli a1,a1,0x1f + 30063f2: 8fd9 or a5,a5,a4 + 30063f4: 8fcd or a5,a5,a1 + 30063f6: c219 beqz a2,30063fc <__truncdfsf2+0xd4> + 30063f8: 00162073 csrs fflags,a2 + 30063fc: f0078553 fmv.w.x fa0,a5 + 3006400: 8082 ret + 3006402: 08e04e63 bgtz a4,300649e <__truncdfsf2+0x176> + 3006406: 57a5 li a5,-23 + 3006408: 0ef74d63 blt a4,a5,3006502 <__truncdfsf2+0x1da> + 300640c: 008007b7 lui a5,0x800 + 3006410: 4379 li t1,30 + 3006412: 8edd or a3,a3,a5 + 3006414: 40e30333 sub t1,t1,a4 + 3006418: 47fd li a5,31 + 300641a: 0467ce63 blt a5,t1,3006476 <__truncdfsf2+0x14e> + 300641e: c8288893 addi a7,a7,-894 + 3006422: 011617b3 sll a5,a2,a7 + 3006426: 00f037b3 snez a5,a5 + 300642a: 011696b3 sll a3,a3,a7 + 300642e: 00665333 srl t1,a2,t1 + 3006432: 8edd or a3,a3,a5 + 3006434: 00d367b3 or a5,t1,a3 + 3006438: 4701 li a4,0 + 300643a: cff9 beqz a5,3006518 <__truncdfsf2+0x1f0> + 300643c: 00179713 slli a4,a5,0x1 + 3006440: 00777693 andi a3,a4,7 + 3006444: 4601 li a2,0 + 3006446: c28d beqz a3,3006468 <__truncdfsf2+0x140> + 3006448: 4689 li a3,2 + 300644a: 0cd80263 beq a6,a3,300650e <__truncdfsf2+0x1e6> + 300644e: 468d li a3,3 + 3006450: 0ad80b63 beq a6,a3,3006506 <__truncdfsf2+0x1de> + 3006454: 4605 li a2,1 + 3006456: 00081963 bnez a6,3006468 <__truncdfsf2+0x140> + 300645a: 00f77693 andi a3,a4,15 + 300645e: 4511 li a0,4 + 3006460: 4605 li a2,1 + 3006462: 00a68363 beq a3,a0,3006468 <__truncdfsf2+0x140> + 3006466: 0711 addi a4,a4,4 + 3006468: 01b75693 srli a3,a4,0x1b + 300646c: 0016c693 xori a3,a3,1 + 3006470: 8a85 andi a3,a3,1 + 3006472: 4701 li a4,0 + 3006474: a83d j 30064b2 <__truncdfsf2+0x18a> + 3006476: 57f9 li a5,-2 + 3006478: 40e78733 sub a4,a5,a4 + 300647c: 02000793 li a5,32 + 3006480: 00e6d733 srl a4,a3,a4 + 3006484: 4501 li a0,0 + 3006486: 00f30663 beq t1,a5,3006492 <__truncdfsf2+0x16a> + 300648a: ca288893 addi a7,a7,-862 + 300648e: 01169533 sll a0,a3,a7 + 3006492: 00c567b3 or a5,a0,a2 + 3006496: 00f037b3 snez a5,a5 + 300649a: 8fd9 or a5,a5,a4 + 300649c: bf71 j 3006438 <__truncdfsf2+0x110> + 300649e: 051a slli a0,a0,0x6 + 30064a0: 00a037b3 snez a5,a0 + 30064a4: 068e slli a3,a3,0x3 + 30064a6: 8275 srli a2,a2,0x1d + 30064a8: 8edd or a3,a3,a5 + 30064aa: 00c6e7b3 or a5,a3,a2 + 30064ae: 4681 li a3,0 + 30064b0: 4601 li a2,0 + 30064b2: 0077f513 andi a0,a5,7 + 30064b6: ec0513e3 bnez a0,300637c <__truncdfsf2+0x54> + 30064ba: ee068ae3 beqz a3,30063ae <__truncdfsf2+0x86> + 30064be: 00167693 andi a3,a2,1 + 30064c2: ee0686e3 beqz a3,30063ae <__truncdfsf2+0x86> + 30064c6: 00266613 ori a2,a2,2 + 30064ca: b5d5 j 30063ae <__truncdfsf2+0x86> + 30064cc: 00c6e7b3 or a5,a3,a2 + 30064d0: 00089563 bnez a7,30064da <__truncdfsf2+0x1b2> + 30064d4: 00f037b3 snez a5,a5 + 30064d8: b785 j 3006438 <__truncdfsf2+0x110> + 30064da: cf8d beqz a5,3006514 <__truncdfsf2+0x1ec> + 30064dc: 7ff00793 li a5,2047 + 30064e0: 4601 li a2,0 + 30064e2: 00f89863 bne a7,a5,30064f2 <__truncdfsf2+0x1ca> + 30064e6: 00400637 lui a2,0x400 + 30064ea: 8e75 and a2,a2,a3 + 30064ec: 00163613 seqz a2,a2 + 30064f0: 0612 slli a2,a2,0x4 + 30064f2: 068e slli a3,a3,0x3 + 30064f4: 020007b7 lui a5,0x2000 + 30064f8: 8fd5 or a5,a5,a3 + 30064fa: 0ff00713 li a4,255 + 30064fe: 4681 li a3,0 + 3006500: bf4d j 30064b2 <__truncdfsf2+0x18a> + 3006502: 4785 li a5,1 + 3006504: bf25 j 300643c <__truncdfsf2+0x114> + 3006506: 4605 li a2,1 + 3006508: f1a5 bnez a1,3006468 <__truncdfsf2+0x140> + 300650a: 0721 addi a4,a4,8 + 300650c: bfb1 j 3006468 <__truncdfsf2+0x140> + 300650e: 4605 li a2,1 + 3006510: dda1 beqz a1,3006468 <__truncdfsf2+0x140> + 3006512: bfe5 j 300650a <__truncdfsf2+0x1e2> + 3006514: 0ff00713 li a4,255 + 3006518: 4601 li a2,0 + 300651a: bd51 j 30063ae <__truncdfsf2+0x86> + 300651c: fdd9 bnez a1,30064ba <__truncdfsf2+0x192> + 300651e: 07a1 addi a5,a5,8 # 2000008 + 3006520: bf69 j 30064ba <__truncdfsf2+0x192> + 3006522: ddc1 beqz a1,30064ba <__truncdfsf2+0x192> + 3006524: bfed j 300651e <__truncdfsf2+0x1f6> + 3006526: 4781 li a5,0 + 3006528: 00080e63 beqz a6,3006544 <__truncdfsf2+0x21c> + 300652c: 468d li a3,3 + 300652e: 00d81763 bne a6,a3,300653c <__truncdfsf2+0x214> + 3006532: c989 beqz a1,3006544 <__truncdfsf2+0x21c> + 3006534: 57fd li a5,-1 + 3006536: 0fe00713 li a4,254 + 300653a: a029 j 3006544 <__truncdfsf2+0x21c> + 300653c: 4689 li a3,2 + 300653e: fed81be3 bne a6,a3,3006534 <__truncdfsf2+0x20c> + 3006542: d9ed beqz a1,3006534 <__truncdfsf2+0x20c> + 3006544: 00566613 ori a2,a2,5 + 3006548: b541 j 30063c8 <__truncdfsf2+0xa0> + +0300654a <__clzsi2>: + 300654a: 67c1 lui a5,0x10 + 300654c: 02f57663 bgeu a0,a5,3006578 <__clzsi2+0x2e> + 3006550: 0ff00793 li a5,255 + 3006554: 00a7b7b3 sltu a5,a5,a0 + 3006558: 078e slli a5,a5,0x3 + 300655a: 02000713 li a4,32 + 300655e: 8f1d sub a4,a4,a5 + 3006560: 00f557b3 srl a5,a0,a5 + 3006564: 00000517 auipc a0,0x0 + 3006568: 5e052503 lw a0,1504(a0) # 3006b44 <_GLOBAL_OFFSET_TABLE_+0x4> + 300656c: 97aa add a5,a5,a0 + 300656e: 0007c503 lbu a0,0(a5) # 10000 + 3006572: 40a70533 sub a0,a4,a0 + 3006576: 8082 ret + 3006578: 01000737 lui a4,0x1000 + 300657c: 47c1 li a5,16 + 300657e: fce56ee3 bltu a0,a4,300655a <__clzsi2+0x10> + 3006582: 47e1 li a5,24 + 3006584: bfd9 j 300655a <__clzsi2+0x10> + ... + +03006588 <__rodata_start>: + 3006588: 9680 pop {ra,s0-s6},384 + 300658a: 4b18 lw a4,16(a4) + +0300658c : + 300658c: 0000 1400 0000 0000 0140 0000 1000 1400 ........@....... + 300659c: 0000 0000 0144 0000 2000 1400 0000 0000 ....D.... ...... + 30065ac: 0148 0000 3000 1400 0000 0000 014c 0000 H....0......L... + 30065bc: 0000 1430 0000 0000 0240 0000 1000 1430 ..0.....@.....0. + 30065cc: 0000 0000 0244 0000 2000 1430 0000 0000 ....D.... 0..... + 30065dc: 0248 0000 3000 1430 0000 0000 024c 0000 H....00.....L... + 30065ec: 0000 1438 0000 0000 0040 0000 0000 1420 ..8.....@..... . + 30065fc: 0000 0000 0180 0000 1000 1420 0000 0000 .......... ..... + 300660c: 0184 0000 0000 1410 0000 0000 01c0 0000 ................ + 300661c: 1000 1410 0000 0000 01c4 0000 0000 1460 ..............`. + 300662c: 0001 0000 02c0 0000 0000 1470 0000 0000 ..........p..... + 300663c: 0440 0000 1000 1470 0000 0000 0444 0000 @.....p.....D... + 300664c: 2000 1470 0000 0000 0448 0000 3000 1470 . p.....H....0p. + 300665c: 0000 0000 044c 0000 0000 1440 0000 0000 ....L.....@..... + 300666c: 0200 0000 0000 14b0 0000 0000 0280 0000 ................ + 300667c: 1000 14b0 0000 0000 0284 0000 2000 14b0 ............. .. + 300668c: 0000 0000 0288 0000 0000 1c00 0000 0000 ................ + 300669c: 0300 0000 0000 1450 0000 0000 0480 0000 ......P......... + 30066ac: 1000 1450 0000 0000 0484 0000 2000 1450 ..P.......... P. + 30066bc: 0000 0000 0488 0000 3000 1450 0000 0000 .........0P..... + 30066cc: 048c 0000 4000 1450 0000 0000 0490 0000 .....@P......... + 30066dc: 5000 1450 0000 0000 0494 0000 1000 1440 .PP...........@. + 30066ec: 0004 0000 03c0 0000 0000 14c0 0000 0000 ................ + 30066fc: 04c0 0000 1000 14c0 0000 0000 04c4 0000 ................ + 300670c: 0000 147d 0000 0000 0b00 0000 0000 1480 ..}............. + 300671c: 0000 0000 0380 0000 0000 14a0 0000 0000 ................ + 300672c: 0400 0000 1000 14a0 0000 0000 0404 0000 ................ + 300673c: 2000 14a0 0000 0000 0408 0000 3000 14a0 . ...........0.. + 300674c: 0000 0000 040c 0000 0000 1001 0000 0000 ................ + 300675c: 0340 0000 0000 1810 0005 0000 0a60 0000 @...........`... + 300676c: 0000 1830 0005 0000 0a70 0000 0000 1840 ..0.....p.....@. + 300677c: 0005 0000 0a80 0000 0000 1820 0005 0000 .......... ..... + 300678c: 0a90 0000 1000 1820 0005 0000 0a90 0004 ...... ......... + 300679c: 0000 1800 0002 0000 0a00 0000 0000 1471 ..............q. + 30067ac: 0003 0000 0500 0000 2e2e 642f 6972 6576 ........../drive + 30067bc: 7372 612f 6364 692f 636e 612f 6364 695f rs/adc/inc/adc_i + 30067cc: 2e70 0068 2e2e 642f 6972 6576 7372 612f p.h.../drivers/a + 30067dc: 6364 732f 6372 612f 6364 632e 0000 0000 dc/src/adc.c.... + 30067ec: 0000 3f80 0000 4480 5547 4055 0000 4580 ...?...DGUU@...E + 30067fc: 6666 4026 51ec 4068 2160 0300 216c 0300 ff&@.Qh@`!..l!.. + 300680c: 2178 0300 2184 0300 2190 0300 219c 0300 x!...!...!...!.. + 300681c: 21a8 0300 21b4 0300 21c0 0300 2e2e 642f .!...!...!..../d + 300682c: 6972 6576 7372 622f 7361 2f65 7273 2f63 rivers/base/src/ + 300683c: 6e69 6574 7272 7075 2e74 0063 2640 0300 interrupt.c.@&.. + 300684c: 2692 0300 26e4 0300 2736 0300 2788 0300 .&...&..6'...'.. + 300685c: 27da 0300 282c 0300 287e 0300 2914 0300 .'..,(..~(...).. + 300686c: 2966 0300 29b8 0300 2a0a 0300 2a5c 0300 f)...)...*..\*.. + 300687c: 2aae 0300 2b00 0300 2b52 0300 2e2e 642f .*...+..R+..../d + 300688c: 6972 6576 7372 632f 6772 692f 636e 632f rivers/crg/inc/c + 300689c: 6772 695f 2e70 0068 2e2e 642f 6972 6576 rg_ip.h.../drive + 30068ac: 7372 632f 6772 732f 6372 632f 6772 632e rs/crg/src/crg.c + ... + 30068c4: 0001 0000 0002 0000 0003 0000 0004 0000 ................ + 30068d4: 0005 0000 0006 0000 0007 0000 35d4 0300 .............5.. + 30068e4: 35de 0300 35f6 0300 35d4 0300 3612 0300 .5...5...5...6.. + 30068f4: 35d4 0300 4b30 0300 4b9a 0300 4b9a 0300 .5..0K...K...K.. + 3006904: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006914: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006924: 4a70 0300 4ac6 0300 4b9a 0300 4b5a 0300 pJ...J...K..ZK.. + 3006934: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006944: 4b9a 0300 4b9a 0300 4b9a 0300 4b9a 0300 .K...K...K...K.. + 3006954: 4b9a 0300 4b30 0300 4b9a 0300 4b9a 0300 .K..0K...K...K.. + 3006964: 4a9a 0300 4b9a 0300 4af0 0300 4b9a 0300 .J...K...J...K.. + 3006974: 4b9a 0300 4b30 0300 2e2e 642f 6972 6576 .K..0K..../drive + 3006984: 7372 692f 636f 676d 692f 636e 692f 636f rs/iocmg/inc/ioc + 3006994: 676d 695f 2e70 0068 2e2e 642f 6972 6576 mg_ip.h.../drive + 30069a4: 7372 692f 636f 676d 732f 6372 692f 636f rs/iocmg/src/ioc + 30069b4: 676d 632e 0000 0000 2e2e 642f 6972 6576 mg.c....../drive + 30069c4: 7372 742f 6d69 7265 692f 636e 742f 6d69 rs/timer/inc/tim + 30069d4: 7265 695f 2e70 0068 2e2e 642f 6972 6576 er_ip.h.../drive + 30069e4: 7372 742f 6d69 7265 732f 6372 742f 6d69 rs/timer/src/tim + 30069f4: 7265 632e 0000 0000 58f6 0300 590c 0300 er.c.....X...Y.. + 3006a04: 5922 0300 5938 0300 594e 0300 2e2e 642f "Y..8Y..NY..../d + 3006a14: 6972 6576 7372 752f 7261 2f74 7273 2f63 rivers/uart/src/ + 3006a24: 6175 7472 632e 0000 3a56 2e25 6632 0a0d uart.c..V:%.2f.. + 3006a34: 0000 0000 0000 4580 3333 4053 .......E33S@ + +03006a40 <__clz_tab>: + 3006a40: 0100 0202 0303 0303 0404 0404 0404 0404 ................ + 3006a50: 0505 0505 0505 0505 0505 0505 0505 0505 ................ + 3006a60: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 3006a70: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 3006a80: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006a90: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006aa0: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006ab0: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006ac0: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006ad0: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006ae0: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006af0: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b00: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b10: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b20: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006b30: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + +03006b40 <_GLOBAL_OFFSET_TABLE_>: + 3006b40: 0000 0000 6a40 0300 ffff ffff 0000 0000 ....@j.......... + +out/bin/target.elf: file format elf32-littleriscv + + +Disassembly of section .text.entry: + +03000004 <_start>: + + .section .text.entry + .global _start + .option norvc +_start: + j handle_reset + 3000004: 4fc0006f j 3000500 + +03000008 : +.endm + +/* The interrupt vector table must be aligned with 4 bytes */ +.align 2 +TrapHandler: + j TrapVector /* trap and INT 0 */ + 3000008: 4680006f j 3000470 + j TrapVector /* INT 1 */ + 300000c: 4640006f j 3000470 + j TrapVector /* INT 2 */ + 3000010: 4600006f j 3000470 + j TrapVector /* INT 3 */ + 3000014: 45c0006f j 3000470 + j TrapVector /* INT 4 */ + 3000018: 4580006f j 3000470 + j TrapVector /* INT 5 */ + 300001c: 4540006f j 3000470 + j TrapVector /* INT 6 */ + 3000020: 4500006f j 3000470 + j TrapVector /* INT 7 */ + 3000024: 44c0006f j 3000470 + j TrapVector /* INT 8 */ + 3000028: 4480006f j 3000470 + j TrapVector /* INT 9 */ + 300002c: 4440006f j 3000470 + j TrapVector /* INT 10 */ + 3000030: 4400006f j 3000470 + j TrapVector /* INT 11 */ + 3000034: 43c0006f j 3000470 + j TrapVector /* INT 12 */ + 3000038: 4380006f j 3000470 + j TrapVector /* INT 13 */ + 300003c: 4340006f j 3000470 + j TrapVector /* INT 14 */ + 3000040: 4300006f j 3000470 + j TrapVector /* INT 15 */ + 3000044: 42c0006f j 3000470 + j TrapVector /* INT 16 */ + 3000048: 4280006f j 3000470 + j TrapVector /* INT 17 */ + 300004c: 4240006f j 3000470 + j TrapVector /* INT 18 */ + 3000050: 4200006f j 3000470 + j TrapVector /* INT 19 */ + 3000054: 41c0006f j 3000470 + j TrapVector /* INT 20 */ + 3000058: 4180006f j 3000470 + j TrapVector /* INT 21 */ + 300005c: 4140006f j 3000470 + j TrapVector /* INT 22 */ + 3000060: 4100006f j 3000470 + j TrapVector /* INT 23 */ + 3000064: 40c0006f j 3000470 + j TrapVector /* INT 24 */ + 3000068: 4080006f j 3000470 + j TrapVector /* INT 25 */ + 300006c: 4040006f j 3000470 + + j IntHandler /* INT 26 */ + 3000070: 2640006f j 30002d4 + j IntHandler /* INT 27 */ + 3000074: 2600006f j 30002d4 + j IntHandler /* INT 28 */ + 3000078: 25c0006f j 30002d4 + j IntHandler /* INT 29 */ + 300007c: 2580006f j 30002d4 + j IntHandler /* INT 30 */ + 3000080: 2540006f j 30002d4 + j IntHandler /* INT 31 */ + 3000084: 2500006f j 30002d4 + j IntHandler /* INT 32 */ + 3000088: 24c0006f j 30002d4 + j IntHandler /* INT 33 */ + 300008c: 2480006f j 30002d4 + j IntHandler /* INT 34 */ + 3000090: 2440006f j 30002d4 + j IntHandler /* INT 35 */ + 3000094: 2400006f j 30002d4 + j IntHandler /* INT 36 */ + 3000098: 23c0006f j 30002d4 + j IntHandler /* INT 37 */ + 300009c: 2380006f j 30002d4 + j IntHandler /* INT 38 */ + 30000a0: 2340006f j 30002d4 + j IntHandler /* INT 39 */ + 30000a4: 2300006f j 30002d4 + j IntHandler /* INT 40 */ + 30000a8: 22c0006f j 30002d4 + j IntHandler /* INT 41 */ + 30000ac: 2280006f j 30002d4 + j IntHandler /* INT 42 */ + 30000b0: 2240006f j 30002d4 + j IntHandler /* INT 43 */ + 30000b4: 2200006f j 30002d4 + j IntHandler /* INT 44 */ + 30000b8: 21c0006f j 30002d4 + j IntHandler /* INT 45 */ + 30000bc: 2180006f j 30002d4 + j IntHandler /* INT 46 */ + 30000c0: 2140006f j 30002d4 + j IntHandler /* INT 47 */ + 30000c4: 2100006f j 30002d4 + j IntHandler /* INT 48 */ + 30000c8: 20c0006f j 30002d4 + j IntHandler /* INT 49 */ + 30000cc: 2080006f j 30002d4 + j IntHandler /* INT 50 */ + 30000d0: 2040006f j 30002d4 + j IntHandler /* INT 51 */ + 30000d4: 2000006f j 30002d4 + j IntHandler /* INT 52 */ + 30000d8: 1fc0006f j 30002d4 + j IntHandler /* INT 53 */ + 30000dc: 1f80006f j 30002d4 + j IntHandler /* INT 54 */ + 30000e0: 1f40006f j 30002d4 + j IntHandler /* INT 55 */ + 30000e4: 1f00006f j 30002d4 + j IntHandler /* INT 56 */ + 30000e8: 1ec0006f j 30002d4 + j IntHandler /* INT 57 */ + 30000ec: 1e80006f j 30002d4 + j IntHandler /* INT 58 */ + 30000f0: 1e40006f j 30002d4 + j IntHandler /* INT 59 */ + 30000f4: 1e00006f j 30002d4 + j IntHandler /* INT 60 */ + 30000f8: 1dc0006f j 30002d4 + j IntHandler /* INT 61 */ + 30000fc: 1d80006f j 30002d4 + j IntHandler /* INT 62 */ + 3000100: 1d40006f j 30002d4 + j IntHandler /* INT 63 */ + 3000104: 1d00006f j 30002d4 + j IntHandler /* INT 64 */ + 3000108: 1cc0006f j 30002d4 + j IntHandler /* INT 65 */ + 300010c: 1c80006f j 30002d4 + j IntHandler /* INT 66 */ + 3000110: 1c40006f j 30002d4 + j IntHandler /* INT 67 */ + 3000114: 1c00006f j 30002d4 + j IntHandler /* INT 68 */ + 3000118: 1bc0006f j 30002d4 + j IntHandler /* INT 69 */ + 300011c: 1b80006f j 30002d4 + j IntHandler /* INT 70 */ + 3000120: 1b40006f j 30002d4 + j IntHandler /* INT 71 */ + 3000124: 1b00006f j 30002d4 + j IntHandler /* INT 72 */ + 3000128: 1ac0006f j 30002d4 + j IntHandler /* INT 73 */ + 300012c: 1a80006f j 30002d4 + j IntHandler /* INT 74 */ + 3000130: 1a40006f j 30002d4 + j IntHandler /* INT 75 */ + 3000134: 1a00006f j 30002d4 + j IntHandler /* INT 76 */ + 3000138: 19c0006f j 30002d4 + j IntHandler /* INT 77 */ + 300013c: 1980006f j 30002d4 + j IntHandler /* INT 78 */ + 3000140: 1940006f j 30002d4 + j IntHandler /* INT 79 */ + 3000144: 1900006f j 30002d4 + j IntHandler /* INT 80 */ + 3000148: 18c0006f j 30002d4 + j IntHandler /* INT 81 */ + 300014c: 1880006f j 30002d4 + j IntHandler /* INT 82 */ + 3000150: 1840006f j 30002d4 + j IntHandler /* INT 83 */ + 3000154: 1800006f j 30002d4 + j IntHandler /* INT 84 */ + 3000158: 17c0006f j 30002d4 + j IntHandler /* INT 85 */ + 300015c: 1780006f j 30002d4 + j IntHandler /* INT 86 */ + 3000160: 1740006f j 30002d4 + j IntHandler /* INT 87 */ + 3000164: 1700006f j 30002d4 + j IntHandler /* INT 88 */ + 3000168: 16c0006f j 30002d4 + j IntHandler /* INT 89 */ + 300016c: 1680006f j 30002d4 + j IntHandler /* INT 90 */ + 3000170: 1640006f j 30002d4 + j IntHandler /* INT 91 */ + 3000174: 1600006f j 30002d4 + j IntHandler /* INT 92 */ + 3000178: 15c0006f j 30002d4 + j IntHandler /* INT 93 */ + 300017c: 1580006f j 30002d4 + j IntHandler /* INT 94 */ + 3000180: 1540006f j 30002d4 + j IntHandler /* INT 95 */ + 3000184: 1500006f j 30002d4 + j IntHandler /* INT 96 */ + 3000188: 14c0006f j 30002d4 + j IntHandler /* INT 97 */ + 300018c: 1480006f j 30002d4 + j IntHandler /* INT 98 */ + 3000190: 1440006f j 30002d4 + j IntHandler /* INT 99 */ + 3000194: 1400006f j 30002d4 + j IntHandler /* INT 100 */ + 3000198: 13c0006f j 30002d4 + j IntHandler /* INT 101 */ + 300019c: 1380006f j 30002d4 + j IntHandler /* INT 102 */ + 30001a0: 1340006f j 30002d4 + j IntHandler /* INT 103 */ + 30001a4: 1300006f j 30002d4 + j IntHandler /* INT 104 */ + 30001a8: 12c0006f j 30002d4 + j IntHandler /* INT 105 */ + 30001ac: 1280006f j 30002d4 + j IntHandler /* INT 106 */ + 30001b0: 1240006f j 30002d4 + j IntHandler /* INT 107 */ + 30001b4: 1200006f j 30002d4 + j IntHandler /* INT 108 */ + 30001b8: 11c0006f j 30002d4 + j IntHandler /* INT 109 */ + 30001bc: 1180006f j 30002d4 + j IntHandler /* INT 110 */ + 30001c0: 1140006f j 30002d4 + j IntHandler /* INT 111 */ + 30001c4: 1100006f j 30002d4 + j IntHandler /* INT 112 */ + 30001c8: 10c0006f j 30002d4 + j IntHandler /* INT 113 */ + 30001cc: 1080006f j 30002d4 + j IntHandler /* INT 114 */ + 30001d0: 1040006f j 30002d4 + j IntHandler /* INT 115 */ + 30001d4: 1000006f j 30002d4 + j IntHandler /* INT 116 */ + 30001d8: 0fc0006f j 30002d4 + j IntHandler /* INT 117 */ + 30001dc: 0f80006f j 30002d4 + j IntHandler /* INT 118 */ + 30001e0: 0f40006f j 30002d4 + j IntHandler /* INT 119 */ + 30001e4: 0f00006f j 30002d4 + j IntHandler /* INT 120 */ + 30001e8: 0ec0006f j 30002d4 + j IntHandler /* INT 121 */ + 30001ec: 0e80006f j 30002d4 + +030001f0 : + +.align 2 +NmiEntry: + SAVE_SYSERR_REGS + 30001f0: f9010113 addi sp,sp,-112 + 30001f4: 04812023 sw s0,64(sp) + 30001f8: 04912223 sw s1,68(sp) + 30001fc: 05212423 sw s2,72(sp) + 3000200: 05312623 sw s3,76(sp) + 3000204: 05412823 sw s4,80(sp) + 3000208: 05512a23 sw s5,84(sp) + 300020c: 05612c23 sw s6,88(sp) + 3000210: 05712e23 sw s7,92(sp) + 3000214: 07812023 sw s8,96(sp) + 3000218: 07912223 sw s9,100(sp) + 300021c: 07a12423 sw s10,104(sp) + 3000220: 07b12623 sw s11,108(sp) + 3000224: 11010593 addi a1,sp,272 + 3000228: 06b12823 sw a1,112(sp) + 300022c: 06312a23 sw gp,116(sp) + 3000230: 06412c23 sw tp,120(sp) + 3000234: 34102573 csrr a0,mepc + 3000238: 300025f3 csrr a1,mstatus + 300023c: 34302673 csrr a2,mtval + 3000240: 342026f3 csrr a3,mcause + 3000244: 06a12e23 sw a0,124(sp) + 3000248: 08b12023 sw a1,128(sp) + 300024c: 08c12223 sw a2,132(sp) + 3000250: 08d12423 sw a3,136(sp) + 3000254: 00010513 mv a0,sp + call SysErrNmiEntry + 3000258: 04c020ef jal ra,30022a4 + +0300025c : +deadLoop1: + tail deadLoop1 + 300025c: a001 j 300025c + nop + 300025e: 00000013 nop + +03000262 : + +.align 2 +TrapEntry: + SAVE_SYSERR_REGS + 3000262: f9010113 addi sp,sp,-112 + 3000266: 04812023 sw s0,64(sp) + 300026a: 04912223 sw s1,68(sp) + 300026e: 05212423 sw s2,72(sp) + 3000272: 05312623 sw s3,76(sp) + 3000276: 05412823 sw s4,80(sp) + 300027a: 05512a23 sw s5,84(sp) + 300027e: 05612c23 sw s6,88(sp) + 3000282: 05712e23 sw s7,92(sp) + 3000286: 07812023 sw s8,96(sp) + 300028a: 07912223 sw s9,100(sp) + 300028e: 07a12423 sw s10,104(sp) + 3000292: 07b12623 sw s11,108(sp) + 3000296: 11010593 addi a1,sp,272 + 300029a: 06b12823 sw a1,112(sp) + 300029e: 06312a23 sw gp,116(sp) + 30002a2: 06412c23 sw tp,120(sp) + 30002a6: 34102573 csrr a0,mepc + 30002aa: 300025f3 csrr a1,mstatus + 30002ae: 34302673 csrr a2,mtval + 30002b2: 342026f3 csrr a3,mcause + 30002b6: 06a12e23 sw a0,124(sp) + 30002ba: 08b12023 sw a1,128(sp) + 30002be: 08c12223 sw a2,132(sp) + 30002c2: 08d12423 sw a3,136(sp) + 30002c6: 00010513 mv a0,sp + /* Exception run with interrupts masked */ + csrc mstatus, MSTATUS_MIE + 30002ca: 30047073 csrci mstatus,8 + call SysErrExcEntry + 30002ce: 7b9010ef jal ra,3002286 + +030002d2 : +deadLoop2: + tail deadLoop2 + 30002d2: a001 j 30002d2 + +030002d4 : + +.align 2 +IntHandler: + addi sp, sp, -(TOTAL_INT_SIZE_ON_STACK) + 30002d4: f6010113 addi sp,sp,-160 + + SREG a0, 3 * REGBYTES(sp) + 30002d8: 00a12623 sw a0,12(sp) + SREG a1, 4 * REGBYTES(sp) + 30002dc: 00b12823 sw a1,16(sp) +#endif + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + csrr a0, mcause +#else + csrr a0, cipri + 30002e0: 7ed02573 csrr a0,0x7ed + csrr a1, prithd + 30002e4: bfe025f3 csrr a1,0xbfe + csrw prithd, a0 /* read prithd */ + 30002e8: bfe51073 csrw 0xbfe,a0 + SREG a1, 6 * REGBYTES(sp) /* save prithd */ + 30002ec: 00b12c23 sw a1,24(sp) + csrr a1, mstatus /* read mstatus */ + 30002f0: 300025f3 csrr a1,mstatus + SREG a1, 7 * REGBYTES(sp) /* save mstatus */ + 30002f4: 00b12e23 sw a1,28(sp) + csrr a1, mepc /* read mepc */ + 30002f8: 341025f3 csrr a1,mepc + SREG a1, 8 * REGBYTES(sp) /* save mepc */ + 30002fc: 02b12023 sw a1,32(sp) + + csrr a0, mcause + 3000300: 34202573 csrr a0,mcause + + li a1, (3<<11) + 3000304: 000025b7 lui a1,0x2 + 3000308: 80058593 addi a1,a1,-2048 # 1800 + csrs mstatus, a1 + 300030c: 3005a073 csrs mstatus,a1 + la a1, custom_nested_irq_main_handler_entry + 3000310: 00000597 auipc a1,0x0 + 3000314: 01058593 addi a1,a1,16 # 3000320 + csrw mepc, a1 + 3000318: 34159073 csrw mepc,a1 + mret + 300031c: 30200073 mret + +03000320 : +#endif + +.align 2 +custom_nested_irq_main_handler_entry: + SREG t0, 0 * REGBYTES(sp) + 3000320: 00512023 sw t0,0(sp) + SREG t1, 1 * REGBYTES(sp) + 3000324: 00612223 sw t1,4(sp) + SREG t2, 2 * REGBYTES(sp) + 3000328: 00712423 sw t2,8(sp) + SREG a2, 5 * REGBYTES(sp) + 300032c: 00c12a23 sw a2,20(sp) + SREG ra, 9 * REGBYTES(sp) + 3000330: 02112223 sw ra,36(sp) + SREG a3, 10 * REGBYTES(sp) + 3000334: 02d12423 sw a3,40(sp) + SREG a4, 11 * REGBYTES(sp) + 3000338: 02e12623 sw a4,44(sp) + SREG a5, 12 * REGBYTES(sp) + 300033c: 02f12823 sw a5,48(sp) + SREG a6, 13 * REGBYTES(sp) + 3000340: 03012a23 sw a6,52(sp) + SREG a7, 14 * REGBYTES(sp) + 3000344: 03112c23 sw a7,56(sp) + SREG t3, 15 * REGBYTES(sp) + 3000348: 03c12e23 sw t3,60(sp) + SREG t4, 16 * REGBYTES(sp) + 300034c: 05d12023 sw t4,64(sp) + SREG t5, 17 * REGBYTES(sp) + 3000350: 05e12223 sw t5,68(sp) + SREG t6, 18 * REGBYTES(sp) + 3000354: 05f12423 sw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FSREG f0, 19 * REGBYTES(sp) + 3000358: 04012627 fsw ft0,76(sp) + FSREG f1, 20 * REGBYTES(sp) + 300035c: 04112827 fsw ft1,80(sp) + FSREG f2, 21 * REGBYTES(sp) + 3000360: 04212a27 fsw ft2,84(sp) + FSREG f3, 22 * REGBYTES(sp) + 3000364: 04312c27 fsw ft3,88(sp) + FSREG f4, 23 * REGBYTES(sp) + 3000368: 04412e27 fsw ft4,92(sp) + FSREG f5, 24 * REGBYTES(sp) + 300036c: 06512027 fsw ft5,96(sp) + FSREG f6, 25 * REGBYTES(sp) + 3000370: 06612227 fsw ft6,100(sp) + FSREG f7, 26 * REGBYTES(sp) + 3000374: 06712427 fsw ft7,104(sp) + FSREG f10, 27 * REGBYTES(sp) + 3000378: 06a12627 fsw fa0,108(sp) + FSREG f11, 28 * REGBYTES(sp) + 300037c: 06b12827 fsw fa1,112(sp) + FSREG f12, 29 * REGBYTES(sp) + 3000380: 06c12a27 fsw fa2,116(sp) + FSREG f13, 30 * REGBYTES(sp) + 3000384: 06d12c27 fsw fa3,120(sp) + FSREG f14, 31 * REGBYTES(sp) + 3000388: 06e12e27 fsw fa4,124(sp) + FSREG f15, 32 * REGBYTES(sp) + 300038c: 08f12027 fsw fa5,128(sp) + FSREG f16, 33 * REGBYTES(sp) + 3000390: 09012227 fsw fa6,132(sp) + FSREG f17, 34 * REGBYTES(sp) + 3000394: 09112427 fsw fa7,136(sp) + FSREG f28, 35 * REGBYTES(sp) + 3000398: 09c12627 fsw ft8,140(sp) + FSREG f29, 36 * REGBYTES(sp) + 300039c: 09d12827 fsw ft9,144(sp) + FSREG f30, 37 * REGBYTES(sp) + 30003a0: 09e12a27 fsw ft10,148(sp) + FSREG f31, 38 * REGBYTES(sp) + 30003a4: 09f12c27 fsw ft11,152(sp) +#endif + + andi a0, a0, MCAUSE_MASK_INT_NUM + 30003a8: 0ff57513 andi a0,a0,255 + call InterruptEntry + 30003ac: 46b010ef jal ra,3002016 + + LREG t1, 1 * REGBYTES(sp) + 30003b0: 00412303 lw t1,4(sp) + LREG t2, 2 * REGBYTES(sp) + 30003b4: 00812383 lw t2,8(sp) + LREG a2, 5 * REGBYTES(sp) + 30003b8: 01412603 lw a2,20(sp) + LREG ra, 9 * REGBYTES(sp) + 30003bc: 02412083 lw ra,36(sp) + LREG a3, 10 * REGBYTES(sp) + 30003c0: 02812683 lw a3,40(sp) + LREG a4, 11 * REGBYTES(sp) + 30003c4: 02c12703 lw a4,44(sp) + LREG a5, 12 * REGBYTES(sp) + 30003c8: 03012783 lw a5,48(sp) + LREG a6, 13 * REGBYTES(sp) + 30003cc: 03412803 lw a6,52(sp) + LREG a7, 14 * REGBYTES(sp) + 30003d0: 03812883 lw a7,56(sp) + LREG t3, 15 * REGBYTES(sp) + 30003d4: 03c12e03 lw t3,60(sp) + LREG t4, 16 * REGBYTES(sp) + 30003d8: 04012e83 lw t4,64(sp) + LREG t5, 17 * REGBYTES(sp) + 30003dc: 04412f03 lw t5,68(sp) + LREG t6, 18 * REGBYTES(sp) + 30003e0: 04812f83 lw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FLREG f0, 19 * REGBYTES(sp) + 30003e4: 04c12007 flw ft0,76(sp) + FLREG f1, 20 * REGBYTES(sp) + 30003e8: 05012087 flw ft1,80(sp) + FLREG f2, 21 * REGBYTES(sp) + 30003ec: 05412107 flw ft2,84(sp) + FLREG f3, 22 * REGBYTES(sp) + 30003f0: 05812187 flw ft3,88(sp) + FLREG f4, 23 * REGBYTES(sp) + 30003f4: 05c12207 flw ft4,92(sp) + FLREG f5, 24 * REGBYTES(sp) + 30003f8: 06012287 flw ft5,96(sp) + FLREG f6, 25 * REGBYTES(sp) + 30003fc: 06412307 flw ft6,100(sp) + FLREG f7, 26 * REGBYTES(sp) + 3000400: 06812387 flw ft7,104(sp) + FLREG f10, 27 * REGBYTES(sp) + 3000404: 06c12507 flw fa0,108(sp) + FLREG f11, 28 * REGBYTES(sp) + 3000408: 07012587 flw fa1,112(sp) + FLREG f12, 29 * REGBYTES(sp) + 300040c: 07412607 flw fa2,116(sp) + FLREG f13, 30 * REGBYTES(sp) + 3000410: 07812687 flw fa3,120(sp) + FLREG f14, 31 * REGBYTES(sp) + 3000414: 07c12707 flw fa4,124(sp) + FLREG f15, 32 * REGBYTES(sp) + 3000418: 08012787 flw fa5,128(sp) + FLREG f16, 33 * REGBYTES(sp) + 300041c: 08412807 flw fa6,132(sp) + FLREG f17, 34 * REGBYTES(sp) + 3000420: 08812887 flw fa7,136(sp) + FLREG f28, 35 * REGBYTES(sp) + 3000424: 08c12e07 flw ft8,140(sp) + FLREG f29, 36 * REGBYTES(sp) + 3000428: 09012e87 flw ft9,144(sp) + FLREG f30, 37 * REGBYTES(sp) + 300042c: 09412f07 flw ft10,148(sp) + FLREG f31, 38 * REGBYTES(sp) + 3000430: 09812f87 flw ft11,152(sp) + +03000434 : + */ + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + LREG t0, 0 * REGBYTES(sp) +#else + LREG a0, 7 * REGBYTES(sp) /* load mstatus */ + 3000434: 01c12503 lw a0,28(sp) + csrr t0, mstatus + 3000438: 300022f3 csrr t0,mstatus + LREG a1, 8 * REGBYTES(sp) /* load mepc */ + 300043c: 02012583 lw a1,32(sp) + andi t0, t0, MSTATUS_MIE + 3000440: 0082f293 andi t0,t0,8 + bnei t0, 0, restore_mstatus + 3000444: 0002923b bnei t0,0,300044c + andi a0, a0, ~(MSTATUS_MIE | MSTATUS_MPIE) + 3000448: f7757513 andi a0,a0,-137 + +0300044c : +restore_mstatus: + csrw mstatus, a0 + 300044c: 30051073 csrw mstatus,a0 + + LREG t0, 0 * REGBYTES(sp) + 3000450: 00012283 lw t0,0(sp) + csrw mepc, a1 + 3000454: 34159073 csrw mepc,a1 + LREG a0, 6 * REGBYTES(sp) /* load prithd */ + 3000458: 01812503 lw a0,24(sp) + csrw prithd, a0 + 300045c: bfe51073 csrw 0xbfe,a0 + lw a1, (a0) + addi a1, a1, -1 + sw a1, (a0) +#endif + + LREG a1, 4 * REGBYTES(sp) /* 2 consecutive csrw instructions will have a bubble */ + 3000460: 01012583 lw a1,16(sp) + + LREG a0, 3 * REGBYTES(sp) + 3000464: 00c12503 lw a0,12(sp) + + addi sp, sp, TOTAL_INT_SIZE_ON_STACK + 3000468: 0a010113 addi sp,sp,160 + + mret + 300046c: 30200073 mret + +03000470 : + +.align 2 +TrapVector: + push_reg + 3000470: f6010113 addi sp,sp,-160 + 3000474: fff11f8b stmia {ra,t0-t6,a0-a7},(sp) + 3000478: f6010113 addi sp,sp,-160 + csrr a0, mcause + 300047c: 34202573 csrr a0,mcause + li t1, MCAUSE_ECALL_FROM_MMODE + 3000480: 00b00313 li t1,11 +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + beq a0, t1, switch_to_umode +#else + beq a0, t1, switch_to_mmode + 3000484: 02650c63 beq a0,t1,30004bc +#endif + li t1, MCAUSE_ECALL_FROM_UMODE + 3000488: 00800313 li t1,8 + beq a0, t1, switch_to_mmode + 300048c: 02650863 beq a0,t1,30004bc + + li a1, MCAUSE_MASK_INT_BIT + 3000490: 800005b7 lui a1,0x80000 + li a2, MCAUSE_MASK_INT_NUM + 3000494: 0ff00613 li a2,255 + and a1, a0, a1 + 3000498: 00b575b3 and a1,a0,a1 + and a0, a0, a2 + 300049c: 00c57533 and a0,a0,a2 + + li a2, 0xc + 30004a0: 00c00613 li a2,12 + beq a0, a2, NmiEntry + 30004a4: d4c506e3 beq a0,a2,30001f0 + beqz a1, TrapEntry + 30004a8: da058de3 beqz a1,3000262 + pop_reg + 30004ac: 0a010113 addi sp,sp,160 + 30004b0: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004b4: 0a010113 addi sp,sp,160 + mret + 30004b8: 30200073 mret + +030004bc : + mret +#endif + +.align 2 +switch_to_mmode: + li t2, MSTATUS_MPP_MACHINE + 30004bc: 000023b7 lui t2,0x2 + 30004c0: 80038393 addi t2,t2,-2048 # 1800 + csrs mstatus, t2 + 30004c4: 3003a073 csrs mstatus,t2 + csrr t0, mepc + 30004c8: 341022f3 csrr t0,mepc + addi t0, t0, 4 + 30004cc: 00428293 addi t0,t0,4 + csrw mepc, t0 + 30004d0: 34129073 csrw mepc,t0 + pop_reg + 30004d4: 0a010113 addi sp,sp,160 + 30004d8: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004dc: 0a010113 addi sp,sp,160 + mret + 30004e0: 30200073 mret + +030004e4 : + +.align 2 +mem_cpy: + bge t0, t2, cpy_done + 30004e4: 0072dc63 bge t0,t2,30004fc + lw t3, (t1) + 30004e8: 00032e03 lw t3,0(t1) + sw t3, (t0) + 30004ec: 01c2a023 sw t3,0(t0) + addi t0, t0, 4 + 30004f0: 00428293 addi t0,t0,4 + addi t1, t1, 4 + 30004f4: 00430313 addi t1,t1,4 + j mem_cpy + 30004f8: fedff06f j 30004e4 + +030004fc : +cpy_done: + ret + 30004fc: 00008067 ret + +03000500 : + +.align 2 +handle_reset: + csrwi mstatus, 0 + 3000500: 30005073 csrwi mstatus,0 + csrwi mie, 0 + 3000504: 30405073 csrwi mie,0 + csrci mstatus, 0x08 + 3000508: 30047073 csrci mstatus,8 + la t0, TrapHandler + 300050c: 00000297 auipc t0,0x0 + 3000510: afc28293 addi t0,t0,-1284 # 3000008 + addi t0, t0, 1 + 3000514: 00128293 addi t0,t0,1 + csrw mtvec, t0 + 3000518: 30529073 csrw mtvec,t0 + csrwi 0x7EF, 0x1 /* lock mtvec */ + 300051c: 7ef0d073 csrwi 0x7ef,1 + +03000520 : + csrwi 0x7C8, 0x1 /* enable hardware nest interrupt support */ +#endif + +flash_init: +/* eflash prefetch enable */ + li t0, EFC_BASE_ADDR + 3000520: 147102b7 lui t0,0x14710 + lw t1, 0x120(t0) + 3000524: 1202a303 lw t1,288(t0) # 14710120 + ori t1, t1, 1 + 3000528: 00136313 ori t1,t1,1 + sw t1, 0x120(t0) + 300052c: 1262a023 sw t1,288(t0) + +/* eflash cache enable */ + lw t1, 0x124(t0) + 3000530: 1242a303 lw t1,292(t0) + ori t1, t1, 1 + 3000534: 00136313 ori t1,t1,1 + sw t1, 0x124(t0) + 3000538: 1262a223 sw t1,292(t0) + +/* enable flash cmd */ + li t0, EFC_MAGIC_NUMBER + 300053c: fedcc2b7 lui t0,0xfedcc + 3000540: a9828293 addi t0,t0,-1384 # fedcba98 + li t1, EFC_MAGIC_LOCK_RW + 3000544: 14710337 lui t1,0x14710 + 3000548: 20030313 addi t1,t1,512 # 14710200 + sw t0, (t1) + 300054c: 00532023 sw t0,0(t1) + +/* initialize global pointer */ + .option push + .option norelax + la gp, __global_pointer$ + 3000550: 01001197 auipc gp,0x1001 + 3000554: bc418193 addi gp,gp,-1084 # 4001114 <__global_pointer$> + .option pop + +/* initialize stack pointer */ + la sp, __stack_top + 3000558: 01007117 auipc sp,0x1007 + 300055c: 6a810113 addi sp,sp,1704 # 4007c00 <__INTERRUPT_STACK_BEGIN__> + +/* timer0 interrupt enable */ + li t0, TIMER0_CONTROL + 3000560: 143002b7 lui t0,0x14300 + 3000564: 00828293 addi t0,t0,8 # 14300008 + lw t1, (t0) + 3000568: 0002a303 lw t1,0(t0) + andi t1, t1, TIMER0_INTENABLE + 300056c: 02037313 andi t1,t1,32 + sw t1, (t0) + 3000570: 0062a023 sw t1,0(t0) + +/* uart0 deinit */ + li t0, 0x14000000 + 3000574: 140002b7 lui t0,0x14000 + li t1, 0 + 3000578: 00000313 li t1,0 + sw t1, IBRD_OFFSET(t0) + 300057c: 0262a223 sw t1,36(t0) # 14000024 + sw t1, FBRD_OFFSET(t0) + 3000580: 0262a423 sw t1,40(t0) + sw t1, LCR_H_OFFSET(t0) + 3000584: 0262a623 sw t1,44(t0) + sw t1, CR_OFFSET(t0) + 3000588: 0262a823 sw t1,48(t0) + sw t1, DMACR_OFFSET(t0) + 300058c: 0462a423 sw t1,72(t0) + +03000590 : + +/* perform the rest of initialization in C */ +clear_sram: + /* clear sysram parity error */ + li t0, SYSRAM_ERROR + 3000590: 101082b7 lui t0,0x10108 + 3000594: 30028293 addi t0,t0,768 # 10108300 + lw t1, (t0) + 3000598: 0002a303 lw t1,0(t0) + ori t1, t1, 1 + 300059c: 00136313 ori t1,t1,1 + sw t1, (t0) + 30005a0: 0062a023 sw t1,0(t0) + + la t0, SRAM_START + 30005a4: 01000297 auipc t0,0x1000 + 30005a8: a5c28293 addi t0,t0,-1444 # 4000000 + la t1, SRAM_END + 30005ac: 01008317 auipc t1,0x1008 + 30005b0: a5430313 addi t1,t1,-1452 # 4008000 + li t2, 0 + 30005b4: 00000393 li t2,0 + +030005b8 : + +clear_sram_loop: + sw t2, (t0) /* clear all sram */ + 30005b8: 0072a023 sw t2,0(t0) + addi t0, t0, 4 /* increment clear index pointer */ + 30005bc: 00428293 addi t0,t0,4 + blt t0, t1, clear_sram_loop /* are we at the end yet, if not , contiue till the end */ + 30005c0: fe62cce3 blt t0,t1,30005b8 + +030005c4 : + +start_coderom_code_copy: + la t0, __sram_code_start_addr /* SRAM addr */ + 30005c4: ff000297 auipc t0,0xff000 + 30005c8: a3c28293 addi t0,t0,-1476 # 2000000 + la t1, __sram_code_load_addr /* ROM addr */ + 30005cc: 00000317 auipc t1,0x0 + 30005d0: 13830313 addi t1,t1,312 # 3000704 + la t2, __sram_code_end_addr + 30005d4: ff000397 auipc t2,0xff000 + 30005d8: a2c38393 addi t2,t2,-1492 # 2000000 + jal mem_cpy + 30005dc: f09ff0ef jal ra,30004e4 + +030005e0 : + +start_reserved_data_copy: + la t0, __reserved_code_start_addr /* SRAM addr */ + 30005e0: 01000297 auipc t0,0x1000 + 30005e4: a2028293 addi t0,t0,-1504 # 4000000 + la t1, __reserved_code_load_addr /* ROM addr */ + 30005e8: 00000317 auipc t1,0x0 + 30005ec: 11c30313 addi t1,t1,284 # 3000704 + la t2, __reserved_code_end_addr + 30005f0: 01000397 auipc t2,0x1000 + 30005f4: a1038393 addi t2,t2,-1520 # 4000000 + jal mem_cpy + 30005f8: eedff0ef jal ra,30004e4 + +030005fc : + +start_coderom_data_copy: + la t0, __data_start /* SRAM addr */ + 30005fc: 01000297 auipc t0,0x1000 + 3000600: a2428293 addi t0,t0,-1500 # 4000020 + la t1, __data_load /* ROM addr */ + 3000604: 00006317 auipc t1,0x6 + 3000608: 19c30313 addi t1,t1,412 # 30067a0 <__data_load> + la t2, __data_end + 300060c: 01000397 auipc t2,0x1000 + 3000610: af038393 addi t2,t2,-1296 # 40000fc + jal mem_cpy + 3000614: ed1ff0ef jal ra,30004e4 + +03000618 : + +pmp_init: + li t0, 0xB00 + 3000618: 000012b7 lui t0,0x1 + 300061c: b0028293 addi t0,t0,-1280 # b00 + csrw pmpaddr0, t0 + 3000620: 3b029073 csrw pmpaddr0,t0 + li t0, 0x400400 /* 0x2C00~0x1000FFF, BOOTROM, enable R+X */ + 3000624: 004002b7 lui t0,0x400 + 3000628: 40028293 addi t0,t0,1024 # 400400 + csrw pmpaddr1, t0 + 300062c: 3b129073 csrw pmpaddr1,t0 + li t0, 0x800000 /* 0x1001000~0x1FFFFFF, Reserved: diable R+X+W */ + 3000630: 008002b7 lui t0,0x800 + csrw pmpaddr2, t0 + 3000634: 3b229073 csrw pmpaddr2,t0 + li t0, 0x802000 /* 0x2000000~0x2007FFF, SYSRAM_ITCM */ + 3000638: 008022b7 lui t0,0x802 + csrw pmpaddr3, t0 + 300063c: 3b329073 csrw pmpaddr3,t0 + li t0, 0xC00000 /* 0x2008000 ~ 0x2FFFFFF, Reserved: disable R+X+W */ + 3000640: 00c002b7 lui t0,0xc00 + csrw pmpaddr4, t0 + 3000644: 3b429073 csrw pmpaddr4,t0 + li t0, 0x1000000 /* 0x3000000 ~ 0x03FFFFFF: EFLASH: enable R+X */ + 3000648: 010002b7 lui t0,0x1000 + csrw pmpaddr5, t0 + 300064c: 3b529073 csrw pmpaddr5,t0 + li t0, 0x1002000 /* 0x4000000 ~ 0x04007FFF: SYSTEM_DTCM enable R+W */ + 3000650: 010022b7 lui t0,0x1002 + csrw pmpaddr6, t0 + 3000654: 3b629073 csrw pmpaddr6,t0 + li t0,0x7000400 /* 0x4008000 ~ 0x01C000FFF: REGISTER R+W */ + 3000658: 070002b7 lui t0,0x7000 + 300065c: 40028293 addi t0,t0,1024 # 7000400 + csrw pmpaddr7, t0 + 3000660: 3b729073 csrw pmpaddr7,t0 + + li t0,0xf3333333 /* register TOR-R-W */ + 3000664: f33332b7 lui t0,0xf3333 + 3000668: 33328293 addi t0,t0,819 # f3333333 + csrw 0x7d8,t0 + 300066c: 7d829073 csrw 0x7d8,t0 + li t0,0x0d080d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + csrw pmpcfg0,t0 + li t0,0x0b0b0d08 + csrw pmpcfg1,t0 +#else + li t0,0x8d888d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + 3000670: 8d8892b7 lui t0,0x8d889 + 3000674: d8b28293 addi t0,t0,-629 # 8d888d8b + csrw pmpcfg0,t0 + 3000678: 3a029073 csrw pmpcfg0,t0 + li t0,0x8b8b8d88 + 300067c: 8b8b92b7 lui t0,0x8b8b9 + 3000680: d8828293 addi t0,t0,-632 # 8b8b8d88 + csrw pmpcfg1,t0 + 3000684: 3a129073 csrw pmpcfg1,t0 +#endif + +/* disable Icache */ + csrwi 0x7C0, 0x0 /* disable ICACHE */ + 3000688: 7c005073 csrwi 0x7c0,0 + fence + 300068c: 0ff0000f fence + +/* disable Dcache */ + csrwi 0x7C1, 0x0 /* disable DCACHE */ + 3000690: 7c105073 csrwi 0x7c1,0 + fence + 3000694: 0ff0000f fence + +/* support float and mie */ + li t0,0x2008 + 3000698: 000022b7 lui t0,0x2 + 300069c: 00828293 addi t0,t0,8 # 2008 + csrs mstatus,t0 + 30006a0: 3002a073 csrs mstatus,t0 + li t0,0x20 + 30006a4: 02000293 li t0,32 + csrs misa,t0 + 30006a8: 3012a073 csrs misa,t0 + +/* Interrupt set default priority = 1*/ + li t0, 0x11111111 + 30006ac: 111112b7 lui t0,0x11111 + 30006b0: 11128293 addi t0,t0,273 # 11111111 + csrw locipri0, t0 + 30006b4: bc029073 csrw 0xbc0,t0 + csrw locipri1, t0 + 30006b8: bc129073 csrw 0xbc1,t0 + csrw locipri2, t0 + 30006bc: bc229073 csrw 0xbc2,t0 + csrw locipri3, t0 + 30006c0: bc329073 csrw 0xbc3,t0 + csrw locipri4, t0 + 30006c4: bc429073 csrw 0xbc4,t0 + csrw locipri5, t0 + 30006c8: bc529073 csrw 0xbc5,t0 + csrw locipri6, t0 + 30006cc: bc629073 csrw 0xbc6,t0 + csrw locipri7, t0 + 30006d0: bc729073 csrw 0xbc7,t0 + csrw locipri8, t0 + 30006d4: bc829073 csrw 0xbc8,t0 + csrw locipri9, t0 + 30006d8: bc929073 csrw 0xbc9,t0 + csrw locipri10, t0 + 30006dc: bca29073 csrw 0xbca,t0 + csrw locipri11, t0 + 30006e0: bcb29073 csrw 0xbcb,t0 + csrw locipri12, t0 + 30006e4: bcc29073 csrw 0xbcc,t0 + csrw locipri13, t0 + 30006e8: bcd29073 csrw 0xbcd,t0 + csrw locipri14, t0 + 30006ec: bce29073 csrw 0xbce,t0 + csrw locipri15, t0 + 30006f0: bcf29073 csrw 0xbcf,t0 + + ecall + 30006f4: 00000073 ecall + jal Chip_Init + 30006f8: 014000ef jal ra,300070c + +/* jump to C func. */ + jal main + 30006fc: 2ee050ef jal ra,30059ea
+ +03000700 : + +dead_loop: + j dead_loop + 3000700: 0000006f j 3000700 + +Disassembly of section .text: + +03000704 : + * @brief Chip Init Fail Process, deadloop if Chip Init fail + * @param None + * @retval None + */ +static inline void Chip_InitFail(void) +{ + 3000704: 1141 addi sp,sp,-16 + 3000706: c622 sw s0,12(sp) + 3000708: 0800 addi s0,sp,16 + while (1) { + 300070a: a001 j 300070a + +0300070c : + * @brief Chip Init + * @param None + * @retval None + */ +void Chip_Init(void) +{ + 300070c: 1101 addi sp,sp,-32 + 300070e: ce06 sw ra,28(sp) + 3000710: cc22 sw s0,24(sp) + 3000712: 1000 addi s0,sp,32 + CRG_CoreClkSelect coreClkSelect; + /* Config CRG */ + if (CRG_Config(&coreClkSelect) != BASE_STATUS_OK) { + 3000714: fec40793 addi a5,s0,-20 + 3000718: 853e mv a0,a5 + 300071a: 2dc050ef jal ra,30059f6 + 300071e: 87aa mv a5,a0 + 3000720: c391 beqz a5,3000724 + Chip_InitFail(); + 3000722: 37cd jal ra,3000704 + } + + /* Config FLASH Clock */ + FLASH_ClockConfig(coreClkSelect); + 3000724: fec42783 lw a5,-20(s0) + 3000728: 853e mv a0,a5 + 300072a: 796000ef jal ra,3000ec0 + SYSTICK_Init(); + 300072e: 057000ef jal ra,3000f84 + /* Set CoreClock Select after FLASH Config Done */ + CRG_SetCoreClockSelect(coreClkSelect); + 3000732: fec42783 lw a5,-20(s0) + 3000736: 853e mv a0,a5 + 3000738: 25b1 jal ra,3000d84 + + IRQ_Init(); + 300073a: 121010ef jal ra,300205a + ANAVREF_Init(); + 300073e: 23e5 jal ra,3000d26 + ANATRIM_Entry(); + 3000740: 2b51 jal ra,3000cd4 + /* User Add Code Here */ + 3000742: 0001 nop + 3000744: 40f2 lw ra,28(sp) + 3000746: 4462 lw s0,24(sp) + 3000748: 6105 addi sp,sp,32 + 300074a: 8082 ret + +0300074c : + * @brief Calculate the conversion gain of the tsensor. + * @param data, original data. + * @retval None + */ +static void CalculateGain(unsigned int data) +{ + 300074c: 1101 addi sp,sp,-32 + 300074e: ce22 sw s0,28(sp) + 3000750: 1000 addi s0,sp,32 + 3000752: fea42623 sw a0,-20(s0) + g_tsensorGain = ((float)(data) / 10000000.0f); + 3000756: fec42783 lw a5,-20(s0) + 300075a: d017f753 fcvt.s.wu fa4,a5 + 300075e: 030067b7 lui a5,0x3006 + 3000762: 1fc7a787 flw fa5,508(a5) # 30061fc <__rodata_start> + 3000766: 18f777d3 fdiv.s fa5,fa4,fa5 + 300076a: 040007b7 lui a5,0x4000 + 300076e: 02f7a027 fsw fa5,32(a5) # 4000020 +} + 3000772: 0001 nop + 3000774: 4472 lw s0,28(sp) + 3000776: 6105 addi sp,sp,32 + 3000778: 8082 ret + +0300077a : + * @brief Obtains the chip ID. + * @param None + * @retval None + */ +static bool CHIP_GetInfo(void) +{ + 300077a: 7179 addi sp,sp,-48 + 300077c: d606 sw ra,44(sp) + 300077e: d422 sw s0,40(sp) + 3000780: 1800 addi s0,sp,48 + FOTP_INFO_RGN0_NUMBER_4 emptyData; + FOTP_INFO_RGN0_NUMBER_2 idData; + FOTP_InfoGet(FOTP_INFO_RNG0, 4U, (void *)&emptyData.comData); /* 4 is the number of fotp_empty_flag in otp */ + 3000782: fe040793 addi a5,s0,-32 + 3000786: 863e mv a2,a5 + 3000788: 4591 li a1,4 + 300078a: 4501 li a0,0 + 300078c: 2391 jal ra,3000cd0 + FOTP_InfoGet(FOTP_INFO_RNG0, 2U, (void *)&idData.comData); /* 2 is the number of idData in otp */ + 300078e: fd040793 addi a5,s0,-48 + 3000792: 863e mv a2,a5 + 3000794: 4589 li a1,2 + 3000796: 4501 li a0,0 + 3000798: 2b25 jal ra,3000cd0 + if (emptyData.REG.fotp_empty_flag != 0x5AA59669 || idData.REG.chip_id == 0xFFFFFFFF) { + 300079a: fe042703 lw a4,-32(s0) + 300079e: 5aa597b7 lui a5,0x5aa59 + 30007a2: 66978793 addi a5,a5,1641 # 5aa59669 + 30007a6: 00f71763 bne a4,a5,30007b4 + 30007aa: fd042703 lw a4,-48(s0) + 30007ae: 57fd li a5,-1 + 30007b0: 00f71463 bne a4,a5,30007b8 + return false; + 30007b4: 4781 li a5,0 + 30007b6: a011 j 30007ba + } + return true; + 30007b8: 4785 li a5,1 +} + 30007ba: 853e mv a0,a5 + 30007bc: 50b2 lw ra,44(sp) + 30007be: 5422 lw s0,40(sp) + 30007c0: 6145 addi sp,sp,48 + 30007c2: 8082 ret + +030007c4 : + * @brief Analog module trim. + * @param None + * @retval None + */ +static void CHIP_AnalogTrim(void) +{ + 30007c4: 711d addi sp,sp,-96 + 30007c6: ce86 sw ra,92(sp) + 30007c8: cca2 sw s0,88(sp) + 30007ca: 1080 addi s0,sp,96 + FOTP_INFO_RGN0_NUMBER_20 trimData20; + FOTP_InfoGet(FOTP_INFO_RNG0, 20U, (void *)&trimData20.comData); /* 20 is the number of trim data in otp */ + 30007cc: fdc40793 addi a5,s0,-36 + 30007d0: 863e mv a2,a5 + 30007d2: 45d1 li a1,20 + 30007d4: 4501 li a0,0 + 30007d6: 29ed jal ra,3000cd0 + /* VREF */ + VREF->VREF_TRIM0.BIT.da_iref_trim = trimData20.REG.data0.da_iref_trim; + 30007d8: 18100737 lui a4,0x18100 + 30007dc: fdc42783 lw a5,-36(s0) + 30007e0: 83c1 srli a5,a5,0x10 + 30007e2: 9bfd andi a5,a5,-1 + 30007e4: 0ff7f693 andi a3,a5,255 + 30007e8: 433c lw a5,64(a4) + 30007ea: 0ff6f693 andi a3,a3,255 + 30007ee: f007f793 andi a5,a5,-256 + 30007f2: 8fd5 or a5,a5,a3 + 30007f4: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vref_trim = trimData20.REG.data0.da_ref_vref_trim; + 30007f6: 18100737 lui a4,0x18100 + 30007fa: fdc42783 lw a5,-36(s0) + 30007fe: 83a1 srli a5,a5,0x8 + 3000800: 9bfd andi a5,a5,-1 + 3000802: 0ff7f693 andi a3,a5,255 + 3000806: 433c lw a5,64(a4) + 3000808: 0ff6f693 andi a3,a3,255 + 300080c: 06a2 slli a3,a3,0x8 + 300080e: 7641 lui a2,0xffff0 + 3000810: 0ff60613 addi a2,a2,255 # ffff00ff + 3000814: 8ff1 and a5,a5,a2 + 3000816: 8fd5 or a5,a5,a3 + 3000818: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vbg_trim = trimData20.REG.data0.da_ref_vbg_trim; + 300081a: 18100737 lui a4,0x18100 + 300081e: fdc42783 lw a5,-36(s0) + 3000822: 0ff7f693 andi a3,a5,255 + 3000826: 433c lw a5,64(a4) + 3000828: 0ff6f693 andi a3,a3,255 + 300082c: 06c2 slli a3,a3,0x10 + 300082e: ff010637 lui a2,0xff010 + 3000832: 167d addi a2,a2,-1 # ff00ffff + 3000834: 8ff1 and a5,a5,a2 + 3000836: 8fd5 or a5,a5,a3 + 3000838: c33c sw a5,64(a4) + unsigned int value = trimData20.REG.data1.da_ref_temp_trim3; + 300083a: fe042783 lw a5,-32(s0) + 300083e: 83c1 srli a5,a5,0x10 + 3000840: 9bfd andi a5,a5,-1 + 3000842: 9f81 uxtb a5 + 3000844: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim2 << 8U); /* Shift left by 8 bits */ + 3000848: fe042783 lw a5,-32(s0) + 300084c: 83a1 srli a5,a5,0x8 + 300084e: 9bfd andi a5,a5,-1 + 3000850: 9f81 uxtb a5 + 3000852: 07a2 slli a5,a5,0x8 + 3000854: 873e mv a4,a5 + 3000856: fec42783 lw a5,-20(s0) + 300085a: 8fd9 or a5,a5,a4 + 300085c: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim1 << 16U); /* Shift left by 16 bits */ + 3000860: fe042783 lw a5,-32(s0) + 3000864: 9f81 uxtb a5 + 3000866: 07c2 slli a5,a5,0x10 + 3000868: 873e mv a4,a5 + 300086a: fec42783 lw a5,-20(s0) + 300086e: 8fd9 or a5,a5,a4 + 3000870: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data0.da_ref_temp_trim0 << 24U); /* Shift left by 24 bits */ + 3000874: fdc42783 lw a5,-36(s0) + 3000878: 83e1 srli a5,a5,0x18 + 300087a: 9f81 uxtb a5 + 300087c: 07e2 slli a5,a5,0x18 + 300087e: 873e mv a4,a5 + 3000880: fec42783 lw a5,-20(s0) + 3000884: 8fd9 or a5,a5,a4 + 3000886: fef42623 sw a5,-20(s0) + VREF->VREF_TRIM1.reg = value; + 300088a: 181007b7 lui a5,0x18100 + 300088e: fec42703 lw a4,-20(s0) + 3000892: c3f8 sw a4,68(a5) + + FOTP_INFO_RGN0_NUMBER_21 trimData21; + FOTP_InfoGet(FOTP_INFO_RNG0, 21U, (void *)&trimData21.comData); /* 21 is the number of trim data in otp */ + 3000894: fcc40793 addi a5,s0,-52 + 3000898: 863e mv a2,a5 + 300089a: 45d5 li a1,21 + 300089c: 4501 li a0,0 + 300089e: 290d jal ra,3000cd0 + /* ADC */ + ADC0->ADC_OEGE_TRIM.BIT.cfg_gain_cali_trim = trimData21.REG.data1.saradc_gain; + 30008a0: 18000737 lui a4,0x18000 + 30008a4: fd042783 lw a5,-48(s0) + 30008a8: 86be mv a3,a5 + 30008aa: 6789 lui a5,0x2 + 30008ac: 17fd addi a5,a5,-1 # 1fff + 30008ae: 8ff5 and a5,a5,a3 + 30008b0: 01079613 slli a2,a5,0x10 + 30008b4: 8241 srli a2,a2,0x10 + 30008b6: 6785 lui a5,0x1 + 30008b8: 973e add a4,a4,a5 + 30008ba: 80872783 lw a5,-2040(a4) # 17fff808 + 30008be: 6689 lui a3,0x2 + 30008c0: 16fd addi a3,a3,-1 # 1fff + 30008c2: 8ef1 and a3,a3,a2 + 30008c4: 06c2 slli a3,a3,0x10 + 30008c6: e0010637 lui a2,0xe0010 + 30008ca: 167d addi a2,a2,-1 # e000ffff + 30008cc: 8ff1 and a5,a5,a2 + 30008ce: 8fd5 or a5,a5,a3 + 30008d0: 80f72423 sw a5,-2040(a4) + ADC0->ADC_OEGE_TRIM.BIT.cfg_ofst_cali_trim = trimData21.REG.data1.saradc_offset; + 30008d4: 18000737 lui a4,0x18000 + 30008d8: fd042783 lw a5,-48(s0) + 30008dc: 83c1 srli a5,a5,0x10 + 30008de: 86be mv a3,a5 + 30008e0: 6785 lui a5,0x1 + 30008e2: 17fd addi a5,a5,-1 # fff + 30008e4: 8ff5 and a5,a5,a3 + 30008e6: 01079613 slli a2,a5,0x10 + 30008ea: 8241 srli a2,a2,0x10 + 30008ec: 6785 lui a5,0x1 + 30008ee: 973e add a4,a4,a5 + 30008f0: 80872783 lw a5,-2040(a4) # 17fff808 + 30008f4: 6685 lui a3,0x1 + 30008f6: 16fd addi a3,a3,-1 # fff + 30008f8: 8ef1 and a3,a3,a2 + 30008fa: 767d lui a2,0xfffff + 30008fc: 8ff1 and a5,a5,a2 + 30008fe: 8fd5 or a5,a5,a3 + 3000900: 80f72423 sw a5,-2040(a4) + + /* TSENSOR */ + TSENSOR->TSENSOR_TRIM.reg = trimData20.REG.data1.da_ref_vptat_trim; + 3000904: fe042783 lw a5,-32(s0) + 3000908: 83e1 srli a5,a5,0x18 + 300090a: 0ff7f713 andi a4,a5,255 + 300090e: 185007b7 lui a5,0x18500 + 3000912: cb98 sw a4,16(a5) + ADC0->ADC_TSENSOR_TRIM.BIT.cfg_tsensor_ofst_trim = trimData21.REG.data2.ts_offset; + 3000914: 18000737 lui a4,0x18000 + 3000918: fd442783 lw a5,-44(s0) + 300091c: 86be mv a3,a5 + 300091e: 6785 lui a5,0x1 + 3000920: 17fd addi a5,a5,-1 # fff + 3000922: 8ff5 and a5,a5,a3 + 3000924: 01079613 slli a2,a5,0x10 + 3000928: 8241 srli a2,a2,0x10 + 300092a: 6785 lui a5,0x1 + 300092c: 973e add a4,a4,a5 + 300092e: 80472783 lw a5,-2044(a4) # 17fff804 + 3000932: 6685 lui a3,0x1 + 3000934: 16fd addi a3,a3,-1 # fff + 3000936: 8ef1 and a3,a3,a2 + 3000938: 767d lui a2,0xfffff + 300093a: 8ff1 and a5,a5,a2 + 300093c: 8fd5 or a5,a5,a3 + 300093e: 80f72223 sw a5,-2044(a4) + CalculateGain(trimData21.REG.data3.ts_gain); + 3000942: fd842783 lw a5,-40(s0) + 3000946: 83a5 srli a5,a5,0x9 + 3000948: 853e mv a0,a5 + 300094a: 3509 jal ra,300074c + + /* PGA */ + PGA0->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga0_vos_trim; + 300094c: 18200737 lui a4,0x18200 + 3000950: fcc42783 lw a5,-52(s0) + 3000954: 1ff7f793 andi a5,a5,511 + 3000958: 01079693 slli a3,a5,0x10 + 300095c: 82c1 srli a3,a3,0x10 + 300095e: 531c lw a5,32(a4) + 3000960: 1ff6f693 andi a3,a3,511 + 3000964: e007f793 andi a5,a5,-512 + 3000968: 8fd5 or a5,a5,a3 + 300096a: d31c sw a5,32(a4) + PGA1->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga1_vos_trim; + 300096c: 18201737 lui a4,0x18201 + 3000970: fcc42783 lw a5,-52(s0) + 3000974: 83c1 srli a5,a5,0x10 + 3000976: 1ff7f793 andi a5,a5,511 + 300097a: 01079693 slli a3,a5,0x10 + 300097e: 82c1 srli a3,a3,0x10 + 3000980: 531c lw a5,32(a4) + 3000982: 1ff6f693 andi a3,a3,511 + 3000986: e007f793 andi a5,a5,-512 + 300098a: 8fd5 or a5,a5,a3 + 300098c: d31c sw a5,32(a4) + + FOTP_INFO_RGN0_NUMBER_22 trimData22; + FOTP_InfoGet(FOTP_INFO_RNG0, 22U, (void *)&trimData22.comData); /* 22 is the number of trim data in otp */ + 300098e: fbc40793 addi a5,s0,-68 + 3000992: 863e mv a2,a5 + 3000994: 45d9 li a1,22 + 3000996: 4501 li a0,0 + 3000998: 257d jal ra,3001046 + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_gain_trim2 = trimData22.REG.data0.pga0_gain2; + 300099a: 18000737 lui a4,0x18000 + 300099e: fbc42783 lw a5,-68(s0) + 30009a2: 86be mv a3,a5 + 30009a4: 6789 lui a5,0x2 + 30009a6: 17fd addi a5,a5,-1 # 1fff + 30009a8: 8ff5 and a5,a5,a3 + 30009aa: 01079613 slli a2,a5,0x10 + 30009ae: 8241 srli a2,a2,0x10 + 30009b0: 6785 lui a5,0x1 + 30009b2: 973e add a4,a4,a5 + 30009b4: 81472783 lw a5,-2028(a4) # 17fff814 + 30009b8: 6689 lui a3,0x2 + 30009ba: 16fd addi a3,a3,-1 # 1fff + 30009bc: 8ef1 and a3,a3,a2 + 30009be: 06c2 slli a3,a3,0x10 + 30009c0: e0010637 lui a2,0xe0010 + 30009c4: 167d addi a2,a2,-1 # e000ffff + 30009c6: 8ff1 and a5,a5,a2 + 30009c8: 8fd5 or a5,a5,a3 + 30009ca: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_ofst_trim2 = trimData22.REG.data0.pga0_offset2; + 30009ce: 18000737 lui a4,0x18000 + 30009d2: fbc42783 lw a5,-68(s0) + 30009d6: 83c1 srli a5,a5,0x10 + 30009d8: 86be mv a3,a5 + 30009da: 6785 lui a5,0x1 + 30009dc: 17fd addi a5,a5,-1 # fff + 30009de: 8ff5 and a5,a5,a3 + 30009e0: 01079613 slli a2,a5,0x10 + 30009e4: 8241 srli a2,a2,0x10 + 30009e6: 6785 lui a5,0x1 + 30009e8: 973e add a4,a4,a5 + 30009ea: 81472783 lw a5,-2028(a4) # 17fff814 + 30009ee: 6685 lui a3,0x1 + 30009f0: 16fd addi a3,a3,-1 # fff + 30009f2: 8ef1 and a3,a3,a2 + 30009f4: 767d lui a2,0xfffff + 30009f6: 8ff1 and a5,a5,a2 + 30009f8: 8fd5 or a5,a5,a3 + 30009fa: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_gain_trim4 = trimData22.REG.data1.pga0_gain4; + 30009fe: 18000737 lui a4,0x18000 + 3000a02: fc042783 lw a5,-64(s0) + 3000a06: 86be mv a3,a5 + 3000a08: 6789 lui a5,0x2 + 3000a0a: 17fd addi a5,a5,-1 # 1fff + 3000a0c: 8ff5 and a5,a5,a3 + 3000a0e: 01079613 slli a2,a5,0x10 + 3000a12: 8241 srli a2,a2,0x10 + 3000a14: 6785 lui a5,0x1 + 3000a16: 973e add a4,a4,a5 + 3000a18: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a1c: 6689 lui a3,0x2 + 3000a1e: 16fd addi a3,a3,-1 # 1fff + 3000a20: 8ef1 and a3,a3,a2 + 3000a22: 06c2 slli a3,a3,0x10 + 3000a24: e0010637 lui a2,0xe0010 + 3000a28: 167d addi a2,a2,-1 # e000ffff + 3000a2a: 8ff1 and a5,a5,a2 + 3000a2c: 8fd5 or a5,a5,a3 + 3000a2e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_ofst_trim4 = trimData22.REG.data1.pga0_offset4; + 3000a32: 18000737 lui a4,0x18000 + 3000a36: fc042783 lw a5,-64(s0) + 3000a3a: 83c1 srli a5,a5,0x10 + 3000a3c: 86be mv a3,a5 + 3000a3e: 6785 lui a5,0x1 + 3000a40: 17fd addi a5,a5,-1 # fff + 3000a42: 8ff5 and a5,a5,a3 + 3000a44: 01079613 slli a2,a5,0x10 + 3000a48: 8241 srli a2,a2,0x10 + 3000a4a: 6785 lui a5,0x1 + 3000a4c: 973e add a4,a4,a5 + 3000a4e: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a52: 6685 lui a3,0x1 + 3000a54: 16fd addi a3,a3,-1 # fff + 3000a56: 8ef1 and a3,a3,a2 + 3000a58: 767d lui a2,0xfffff + 3000a5a: 8ff1 and a5,a5,a2 + 3000a5c: 8fd5 or a5,a5,a3 + 3000a5e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_gain_trim8 = trimData22.REG.data2.pga0_gain8; + 3000a62: 18000737 lui a4,0x18000 + 3000a66: fc442783 lw a5,-60(s0) + 3000a6a: 86be mv a3,a5 + 3000a6c: 6789 lui a5,0x2 + 3000a6e: 17fd addi a5,a5,-1 # 1fff + 3000a70: 8ff5 and a5,a5,a3 + 3000a72: 01079613 slli a2,a5,0x10 + 3000a76: 8241 srli a2,a2,0x10 + 3000a78: 6785 lui a5,0x1 + 3000a7a: 973e add a4,a4,a5 + 3000a7c: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000a80: 6689 lui a3,0x2 + 3000a82: 16fd addi a3,a3,-1 # 1fff + 3000a84: 8ef1 and a3,a3,a2 + 3000a86: 06c2 slli a3,a3,0x10 + 3000a88: e0010637 lui a2,0xe0010 + 3000a8c: 167d addi a2,a2,-1 # e000ffff + 3000a8e: 8ff1 and a5,a5,a2 + 3000a90: 8fd5 or a5,a5,a3 + 3000a92: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_ofst_trim8 = trimData22.REG.data2.pga0_offset8; + 3000a96: 18000737 lui a4,0x18000 + 3000a9a: fc442783 lw a5,-60(s0) + 3000a9e: 83c1 srli a5,a5,0x10 + 3000aa0: 86be mv a3,a5 + 3000aa2: 6785 lui a5,0x1 + 3000aa4: 17fd addi a5,a5,-1 # fff + 3000aa6: 8ff5 and a5,a5,a3 + 3000aa8: 01079613 slli a2,a5,0x10 + 3000aac: 8241 srli a2,a2,0x10 + 3000aae: 6785 lui a5,0x1 + 3000ab0: 973e add a4,a4,a5 + 3000ab2: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000ab6: 6685 lui a3,0x1 + 3000ab8: 16fd addi a3,a3,-1 # fff + 3000aba: 8ef1 and a3,a3,a2 + 3000abc: 767d lui a2,0xfffff + 3000abe: 8ff1 and a5,a5,a2 + 3000ac0: 8fd5 or a5,a5,a3 + 3000ac2: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_gain_trim16 = trimData22.REG.data3.pga0_gain16; + 3000ac6: 18000737 lui a4,0x18000 + 3000aca: fc842783 lw a5,-56(s0) + 3000ace: 86be mv a3,a5 + 3000ad0: 6789 lui a5,0x2 + 3000ad2: 17fd addi a5,a5,-1 # 1fff + 3000ad4: 8ff5 and a5,a5,a3 + 3000ad6: 01079613 slli a2,a5,0x10 + 3000ada: 8241 srli a2,a2,0x10 + 3000adc: 6785 lui a5,0x1 + 3000ade: 973e add a4,a4,a5 + 3000ae0: 82072783 lw a5,-2016(a4) # 17fff820 + 3000ae4: 6689 lui a3,0x2 + 3000ae6: 16fd addi a3,a3,-1 # 1fff + 3000ae8: 8ef1 and a3,a3,a2 + 3000aea: 06c2 slli a3,a3,0x10 + 3000aec: e0010637 lui a2,0xe0010 + 3000af0: 167d addi a2,a2,-1 # e000ffff + 3000af2: 8ff1 and a5,a5,a2 + 3000af4: 8fd5 or a5,a5,a3 + 3000af6: 82f72023 sw a5,-2016(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_ofst_trim16 = trimData22.REG.data3.pga0_offset16; + 3000afa: 18000737 lui a4,0x18000 + 3000afe: fc842783 lw a5,-56(s0) + 3000b02: 83c1 srli a5,a5,0x10 + 3000b04: 86be mv a3,a5 + 3000b06: 6785 lui a5,0x1 + 3000b08: 17fd addi a5,a5,-1 # fff + 3000b0a: 8ff5 and a5,a5,a3 + 3000b0c: 01079613 slli a2,a5,0x10 + 3000b10: 8241 srli a2,a2,0x10 + 3000b12: 6785 lui a5,0x1 + 3000b14: 973e add a4,a4,a5 + 3000b16: 82072783 lw a5,-2016(a4) # 17fff820 + 3000b1a: 6685 lui a3,0x1 + 3000b1c: 16fd addi a3,a3,-1 # fff + 3000b1e: 8ef1 and a3,a3,a2 + 3000b20: 767d lui a2,0xfffff + 3000b22: 8ff1 and a5,a5,a2 + 3000b24: 8fd5 or a5,a5,a3 + 3000b26: 82f72023 sw a5,-2016(a4) + + FOTP_INFO_RGN0_NUMBER_23 trimData23; + FOTP_InfoGet(FOTP_INFO_RNG0, 23U, (void *)&trimData23.comData); /* 23 is the number of trim data in otp */ + 3000b2a: fac40793 addi a5,s0,-84 + 3000b2e: 863e mv a2,a5 + 3000b30: 45dd li a1,23 + 3000b32: 4501 li a0,0 + 3000b34: 2b09 jal ra,3001046 + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_gain_trim2 = trimData23.REG.data0.pga1_gain2; + 3000b36: 18000737 lui a4,0x18000 + 3000b3a: fac42783 lw a5,-84(s0) + 3000b3e: 86be mv a3,a5 + 3000b40: 6789 lui a5,0x2 + 3000b42: 17fd addi a5,a5,-1 # 1fff + 3000b44: 8ff5 and a5,a5,a3 + 3000b46: 01079613 slli a2,a5,0x10 + 3000b4a: 8241 srli a2,a2,0x10 + 3000b4c: 6785 lui a5,0x1 + 3000b4e: 973e add a4,a4,a5 + 3000b50: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b54: 6689 lui a3,0x2 + 3000b56: 16fd addi a3,a3,-1 # 1fff + 3000b58: 8ef1 and a3,a3,a2 + 3000b5a: 06c2 slli a3,a3,0x10 + 3000b5c: e0010637 lui a2,0xe0010 + 3000b60: 167d addi a2,a2,-1 # e000ffff + 3000b62: 8ff1 and a5,a5,a2 + 3000b64: 8fd5 or a5,a5,a3 + 3000b66: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_ofst_trim2 = trimData23.REG.data0.pga1_offset2; + 3000b6a: 18000737 lui a4,0x18000 + 3000b6e: fac42783 lw a5,-84(s0) + 3000b72: 83c1 srli a5,a5,0x10 + 3000b74: 86be mv a3,a5 + 3000b76: 6785 lui a5,0x1 + 3000b78: 17fd addi a5,a5,-1 # fff + 3000b7a: 8ff5 and a5,a5,a3 + 3000b7c: 01079613 slli a2,a5,0x10 + 3000b80: 8241 srli a2,a2,0x10 + 3000b82: 6785 lui a5,0x1 + 3000b84: 973e add a4,a4,a5 + 3000b86: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b8a: 6685 lui a3,0x1 + 3000b8c: 16fd addi a3,a3,-1 # fff + 3000b8e: 8ef1 and a3,a3,a2 + 3000b90: 767d lui a2,0xfffff + 3000b92: 8ff1 and a5,a5,a2 + 3000b94: 8fd5 or a5,a5,a3 + 3000b96: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_gain_trim4 = trimData23.REG.data1.pga1_gain4; + 3000b9a: 18000737 lui a4,0x18000 + 3000b9e: fb042783 lw a5,-80(s0) + 3000ba2: 86be mv a3,a5 + 3000ba4: 6789 lui a5,0x2 + 3000ba6: 17fd addi a5,a5,-1 # 1fff + 3000ba8: 8ff5 and a5,a5,a3 + 3000baa: 01079613 slli a2,a5,0x10 + 3000bae: 8241 srli a2,a2,0x10 + 3000bb0: 6785 lui a5,0x1 + 3000bb2: 973e add a4,a4,a5 + 3000bb4: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bb8: 6689 lui a3,0x2 + 3000bba: 16fd addi a3,a3,-1 # 1fff + 3000bbc: 8ef1 and a3,a3,a2 + 3000bbe: 06c2 slli a3,a3,0x10 + 3000bc0: e0010637 lui a2,0xe0010 + 3000bc4: 167d addi a2,a2,-1 # e000ffff + 3000bc6: 8ff1 and a5,a5,a2 + 3000bc8: 8fd5 or a5,a5,a3 + 3000bca: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_ofst_trim4 = trimData23.REG.data1.pga1_offset4; + 3000bce: 18000737 lui a4,0x18000 + 3000bd2: fb042783 lw a5,-80(s0) + 3000bd6: 83c1 srli a5,a5,0x10 + 3000bd8: 86be mv a3,a5 + 3000bda: 6785 lui a5,0x1 + 3000bdc: 17fd addi a5,a5,-1 # fff + 3000bde: 8ff5 and a5,a5,a3 + 3000be0: 01079613 slli a2,a5,0x10 + 3000be4: 8241 srli a2,a2,0x10 + 3000be6: 6785 lui a5,0x1 + 3000be8: 973e add a4,a4,a5 + 3000bea: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bee: 6685 lui a3,0x1 + 3000bf0: 16fd addi a3,a3,-1 # fff + 3000bf2: 8ef1 and a3,a3,a2 + 3000bf4: 767d lui a2,0xfffff + 3000bf6: 8ff1 and a5,a5,a2 + 3000bf8: 8fd5 or a5,a5,a3 + 3000bfa: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_gain_trim8 = trimData23.REG.data2.pga1_gain8; + 3000bfe: 18000737 lui a4,0x18000 + 3000c02: fb442783 lw a5,-76(s0) + 3000c06: 86be mv a3,a5 + 3000c08: 6789 lui a5,0x2 + 3000c0a: 17fd addi a5,a5,-1 # 1fff + 3000c0c: 8ff5 and a5,a5,a3 + 3000c0e: 01079613 slli a2,a5,0x10 + 3000c12: 8241 srli a2,a2,0x10 + 3000c14: 6785 lui a5,0x1 + 3000c16: 973e add a4,a4,a5 + 3000c18: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c1c: 6689 lui a3,0x2 + 3000c1e: 16fd addi a3,a3,-1 # 1fff + 3000c20: 8ef1 and a3,a3,a2 + 3000c22: 06c2 slli a3,a3,0x10 + 3000c24: e0010637 lui a2,0xe0010 + 3000c28: 167d addi a2,a2,-1 # e000ffff + 3000c2a: 8ff1 and a5,a5,a2 + 3000c2c: 8fd5 or a5,a5,a3 + 3000c2e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_ofst_trim8 = trimData23.REG.data2.pga1_offset8; + 3000c32: 18000737 lui a4,0x18000 + 3000c36: fb442783 lw a5,-76(s0) + 3000c3a: 83c1 srli a5,a5,0x10 + 3000c3c: 86be mv a3,a5 + 3000c3e: 6785 lui a5,0x1 + 3000c40: 17fd addi a5,a5,-1 # fff + 3000c42: 8ff5 and a5,a5,a3 + 3000c44: 01079613 slli a2,a5,0x10 + 3000c48: 8241 srli a2,a2,0x10 + 3000c4a: 6785 lui a5,0x1 + 3000c4c: 973e add a4,a4,a5 + 3000c4e: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c52: 6685 lui a3,0x1 + 3000c54: 16fd addi a3,a3,-1 # fff + 3000c56: 8ef1 and a3,a3,a2 + 3000c58: 767d lui a2,0xfffff + 3000c5a: 8ff1 and a5,a5,a2 + 3000c5c: 8fd5 or a5,a5,a3 + 3000c5e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_gain_trim16 = trimData23.REG.data3.pga1_gain16; + 3000c62: 18000737 lui a4,0x18000 + 3000c66: fb842783 lw a5,-72(s0) + 3000c6a: 86be mv a3,a5 + 3000c6c: 6789 lui a5,0x2 + 3000c6e: 17fd addi a5,a5,-1 # 1fff + 3000c70: 8ff5 and a5,a5,a3 + 3000c72: 01079613 slli a2,a5,0x10 + 3000c76: 8241 srli a2,a2,0x10 + 3000c78: 6785 lui a5,0x1 + 3000c7a: 973e add a4,a4,a5 + 3000c7c: 83072783 lw a5,-2000(a4) # 17fff830 + 3000c80: 6689 lui a3,0x2 + 3000c82: 16fd addi a3,a3,-1 # 1fff + 3000c84: 8ef1 and a3,a3,a2 + 3000c86: 06c2 slli a3,a3,0x10 + 3000c88: e0010637 lui a2,0xe0010 + 3000c8c: 167d addi a2,a2,-1 # e000ffff + 3000c8e: 8ff1 and a5,a5,a2 + 3000c90: 8fd5 or a5,a5,a3 + 3000c92: 82f72823 sw a5,-2000(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_ofst_trim16 = trimData23.REG.data3.pga1_offset16; + 3000c96: 18000737 lui a4,0x18000 + 3000c9a: fb842783 lw a5,-72(s0) + 3000c9e: 83c1 srli a5,a5,0x10 + 3000ca0: 86be mv a3,a5 + 3000ca2: 6785 lui a5,0x1 + 3000ca4: 17fd addi a5,a5,-1 # fff + 3000ca6: 8ff5 and a5,a5,a3 + 3000ca8: 01079613 slli a2,a5,0x10 + 3000cac: 8241 srli a2,a2,0x10 + 3000cae: 6785 lui a5,0x1 + 3000cb0: 973e add a4,a4,a5 + 3000cb2: 83072783 lw a5,-2000(a4) # 17fff830 + 3000cb6: 6685 lui a3,0x1 + 3000cb8: 16fd addi a3,a3,-1 # fff + 3000cba: 8ef1 and a3,a3,a2 + 3000cbc: 767d lui a2,0xfffff + 3000cbe: 8ff1 and a5,a5,a2 + 3000cc0: 8fd5 or a5,a5,a3 + 3000cc2: 82f72823 sw a5,-2000(a4) +} + 3000cc6: 0001 nop + 3000cc8: 40f6 lw ra,92(sp) + 3000cca: 4466 lw s0,88(sp) + 3000ccc: 6125 addi sp,sp,96 + 3000cce: 8082 ret + +03000cd0 : + 3000cd0: 3760006f j 3001046 + +03000cd4 : + * @brief Parameter calibration entry of the analog module. + * @param None + * @retval None + */ +void ANATRIM_Entry(void) +{ + 3000cd4: 1141 addi sp,sp,-16 + 3000cd6: c606 sw ra,12(sp) + 3000cd8: c422 sw s0,8(sp) + 3000cda: 0800 addi s0,sp,16 + if (CHIP_GetInfo() == false) { /* If the chip information is incorrect, calibration is not performed */ + 3000cdc: 3c79 jal ra,300077a + 3000cde: 87aa mv a5,a0 + 3000ce0: 0017c793 xori a5,a5,1 + 3000ce4: 9f81 uxtb a5 + 3000ce6: eb9d bnez a5,3000d1c + return; + } + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_ENABLE); /* Enable the clock for calibration */ + 3000ce8: 4585 li a1,1 + 3000cea: 18000537 lui a0,0x18000 + 3000cee: 2849 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_ENABLE); + 3000cf0: 4585 li a1,1 + 3000cf2: 18200537 lui a0,0x18200 + 3000cf6: 2069 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_ENABLE); + 3000cf8: 4585 li a1,1 + 3000cfa: 18201537 lui a0,0x18201 + 3000cfe: 2049 jal ra,3000d80 + CHIP_AnalogTrim(); + 3000d00: 34d1 jal ra,30007c4 + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_DISABLE); /* The clock is disabled after calibration */ + 3000d02: 4581 li a1,0 + 3000d04: 18000537 lui a0,0x18000 + 3000d08: 28a5 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_DISABLE); + 3000d0a: 4581 li a1,0 + 3000d0c: 18200537 lui a0,0x18200 + 3000d10: 2885 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_DISABLE); + 3000d12: 4581 li a1,0 + 3000d14: 18201537 lui a0,0x18201 + 3000d18: 20a5 jal ra,3000d80 + 3000d1a: a011 j 3000d1e + return; + 3000d1c: 0001 nop + 3000d1e: 40b2 lw ra,12(sp) + 3000d20: 4422 lw s0,8(sp) + 3000d22: 0141 addi sp,sp,16 + 3000d24: 8082 ret + +03000d26 : + * @brief Set Crg Core clock select + * @param None + * @retval None + */ +void ANAVREF_Init(void) +{ + 3000d26: 1141 addi sp,sp,-16 + 3000d28: c606 sw ra,12(sp) + 3000d2a: c422 sw s0,8(sp) + 3000d2c: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(VREF_BASE, IP_CLK_ENABLE); + 3000d2e: 4585 li a1,1 + 3000d30: 18100537 lui a0,0x18100 + 3000d34: 20b1 jal ra,3000d80 + VREF->VREF_CTRL1.BIT.da_ref_temp_trim_enh = 0x1; + 3000d36: 18100737 lui a4,0x18100 + 3000d3a: 531c lw a5,32(a4) + 3000d3c: 66c1 lui a3,0x10 + 3000d3e: 8fd5 or a5,a5,a3 + 3000d40: d31c sw a5,32(a4) + VREF->VREF_CTRL0.BIT.da_ref_enh = BASE_CFG_ENABLE; + 3000d42: 18100737 lui a4,0x18100 + 3000d46: 431c lw a5,0(a4) + 3000d48: 0017e793 ori a5,a5,1 + 3000d4c: c31c sw a5,0(a4) + BASE_FUNC_DELAY_US(200); /* delay 200us */ + 3000d4e: 000f47b7 lui a5,0xf4 + 3000d52: 24078593 addi a1,a5,576 # f4240 + 3000d56: 0c800513 li a0,200 + 3000d5a: 20b5 jal ra,3000dc6 + VREF->VREF_CTRL1.BIT.da_ref_chop_enh = BASE_CFG_ENABLE; + 3000d5c: 18100737 lui a4,0x18100 + 3000d60: 531c lw a5,32(a4) + 3000d62: 0017e793 ori a5,a5,1 + 3000d66: d31c sw a5,32(a4) + BASE_FUNC_DELAY_US(40); /* delay 40us */ + 3000d68: 000f47b7 lui a5,0xf4 + 3000d6c: 24078593 addi a1,a5,576 # f4240 + 3000d70: 02800513 li a0,40 + 3000d74: 2889 jal ra,3000dc6 + 3000d76: 0001 nop + 3000d78: 40b2 lw ra,12(sp) + 3000d7a: 4422 lw s0,8(sp) + 3000d7c: 0141 addi sp,sp,16 + 3000d7e: 8082 ret + +03000d80 : + 3000d80: 57a0206f j 30032fa + +03000d84 : + * @brief Set Crg Core clock select + * @param coreClkSelect Input core clock select value + * @retval None + */ +void CRG_SetCoreClockSelect(CRG_CoreClkSelect coreClkSelect) +{ + 3000d84: 715d addi sp,sp,-80 + 3000d86: c686 sw ra,76(sp) + 3000d88: c4a2 sw s0,72(sp) + 3000d8a: 0880 addi s0,sp,80 + 3000d8c: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3000d90: 100007b7 lui a5,0x10000 + 3000d94: fcf42423 sw a5,-56(s0) + crg.coreClkSelect = coreClkSelect; + 3000d98: fbc42783 lw a5,-68(s0) + 3000d9c: fef42023 sw a5,-32(s0) + if (crg.coreClkSelect == CRG_CORE_CLK_SELECT_TCXO) { /* If an external crystal oscillator is selected. */ + 3000da0: fe042703 lw a4,-32(s0) + 3000da4: 4785 li a5,1 + 3000da6: 00f71663 bne a4,a5,3000db2 + BASE_FUNC_DELAY_MS(10); /* 10: delay 10ms, wait clokc stable. */ + 3000daa: 3e800593 li a1,1000 + 3000dae: 4529 li a0,10 + 3000db0: 2819 jal ra,3000dc6 + } + HAL_CRG_SetCoreClockSelect(&crg); + 3000db2: fc840793 addi a5,s0,-56 + 3000db6: 853e mv a0,a5 + 3000db8: 23a020ef jal ra,3002ff2 + 3000dbc: 0001 nop + 3000dbe: 40b6 lw ra,76(sp) + 3000dc0: 4426 lw s0,72(sp) + 3000dc2: 6161 addi sp,sp,80 + 3000dc4: 8082 ret + +03000dc6 : + 3000dc6: 1de0106f j 3001fa4 + +03000dca : + * @param frequence frequnce + * @param div Output Divison + * @retval None + */ +static void SetFlashDiv(unsigned int frequency, unsigned int *nreadDiv) +{ + 3000dca: 7179 addi sp,sp,-48 + 3000dcc: d622 sw s0,44(sp) + 3000dce: 1800 addi s0,sp,48 + 3000dd0: fca42e23 sw a0,-36(s0) + 3000dd4: fcb42c23 sw a1,-40(s0) + unsigned int div; + unsigned int freq = frequency; + 3000dd8: fdc42783 lw a5,-36(s0) + 3000ddc: fef42423 sw a5,-24(s0) + /* Get frequency divider of flash. */ + if (freq < FLASH_BASE_FREQ) { + 3000de0: fe842703 lw a4,-24(s0) + 3000de4: 023c37b7 lui a5,0x23c3 + 3000de8: 45f78793 addi a5,a5,1119 # 23c345f + 3000dec: 00e7e863 bltu a5,a4,3000dfc + freq = FLASH_BASE_FREQ; + 3000df0: 023c37b7 lui a5,0x23c3 + 3000df4: 46078793 addi a5,a5,1120 # 23c3460 + 3000df8: fef42423 sw a5,-24(s0) + } + /* Get the flash frequency division based on the frequency. */ + if ((freq % FLASH_BASE_FREQ) == 0) { + 3000dfc: fe842703 lw a4,-24(s0) + 3000e00: 023c37b7 lui a5,0x23c3 + 3000e04: 46078793 addi a5,a5,1120 # 23c3460 + 3000e08: 02f777b3 remu a5,a4,a5 + 3000e0c: ef81 bnez a5,3000e24 + div = freq / FLASH_BASE_FREQ; + 3000e0e: fe842703 lw a4,-24(s0) + 3000e12: 023c37b7 lui a5,0x23c3 + 3000e16: 46078793 addi a5,a5,1120 # 23c3460 + 3000e1a: 02f757b3 divu a5,a4,a5 + 3000e1e: fef42623 sw a5,-20(s0) + 3000e22: a821 j 3000e3a + } else { + div = (freq / FLASH_BASE_FREQ) + 1; + 3000e24: fe842703 lw a4,-24(s0) + 3000e28: 023c37b7 lui a5,0x23c3 + 3000e2c: 46078793 addi a5,a5,1120 # 23c3460 + 3000e30: 02f757b3 divu a5,a4,a5 + 3000e34: 0785 addi a5,a5,1 + 3000e36: fef42623 sw a5,-20(s0) + } + /* Ensure the flash frequency division is valid. */ + if (div > FLASH_MAX_DIV) { + 3000e3a: fec42703 lw a4,-20(s0) + 3000e3e: 4791 li a5,4 + 3000e40: 00e7f563 bgeu a5,a4,3000e4a + div = FLASH_MAX_DIV; + 3000e44: 4791 li a5,4 + 3000e46: fef42623 sw a5,-20(s0) + } + *nreadDiv = div; + 3000e4a: fd842783 lw a5,-40(s0) + 3000e4e: fec42703 lw a4,-20(s0) + 3000e52: c398 sw a4,0(a5) +} + 3000e54: 0001 nop + 3000e56: 5432 lw s0,44(sp) + 3000e58: 6145 addi sp,sp,48 + 3000e5a: 8082 ret + +03000e5c : + * @brief Get the Rounding up value + * @param coreClkSelect Core Clock select + * @retval Frequency of Flash + */ +static unsigned int GetFlashFreq(CRG_CoreClkSelect coreClkSelect) +{ + 3000e5c: 7179 addi sp,sp,-48 + 3000e5e: d606 sw ra,44(sp) + 3000e60: d422 sw s0,40(sp) + 3000e62: 1800 addi s0,sp,48 + 3000e64: fca42e23 sw a0,-36(s0) + unsigned int hclk; + /* Get frequency of flash. */ + switch (coreClkSelect) { + 3000e68: fdc42783 lw a5,-36(s0) + 3000e6c: 4705 li a4,1 + 3000e6e: 02e78063 beq a5,a4,3000e8e + 3000e72: 4705 li a4,1 + 3000e74: 00e7e663 bltu a5,a4,3000e80 + 3000e78: 4709 li a4,2 + 3000e7a: 02e78163 beq a5,a4,3000e9c + 3000e7e: a025 j 3000ea6 + case CRG_CORE_CLK_SELECT_HOSC: + hclk = HOSC_FREQ; + 3000e80: 017d87b7 lui a5,0x17d8 + 3000e84: 84078793 addi a5,a5,-1984 # 17d7840 + 3000e88: fef42623 sw a5,-20(s0) + break; + 3000e8c: a01d j 3000eb2 + case CRG_CORE_CLK_SELECT_TCXO: + hclk = XTRAIL_FREQ; + 3000e8e: 01c9c7b7 lui a5,0x1c9c + 3000e92: 38078793 addi a5,a5,896 # 1c9c380 + 3000e96: fef42623 sw a5,-20(s0) + break; + 3000e9a: a821 j 3000eb2 + case CRG_CORE_CLK_SELECT_PLL: + hclk = HAL_CRG_GetPllFreq(); + 3000e9c: 278020ef jal ra,3003114 + 3000ea0: fea42623 sw a0,-20(s0) + break; + 3000ea4: a039 j 3000eb2 + default: + hclk = LOSC_FREQ; + 3000ea6: 67a1 lui a5,0x8 + 3000ea8: d0078793 addi a5,a5,-768 # 7d00 + 3000eac: fef42623 sw a5,-20(s0) + break; + 3000eb0: 0001 nop + } + return hclk; + 3000eb2: fec42783 lw a5,-20(s0) +} + 3000eb6: 853e mv a0,a5 + 3000eb8: 50b2 lw ra,44(sp) + 3000eba: 5422 lw s0,40(sp) + 3000ebc: 6145 addi sp,sp,48 + 3000ebe: 8082 ret + +03000ec0 : + * @brief Set flash clock frequence base on hclk + * @param coreClkSelect core clock select + * @retval None + */ +void FLASH_ClockConfig(CRG_CoreClkSelect coreClkSelect) +{ + 3000ec0: 7179 addi sp,sp,-48 + 3000ec2: d606 sw ra,44(sp) + 3000ec4: d422 sw s0,40(sp) + 3000ec6: 1800 addi s0,sp,48 + 3000ec8: fca42e23 sw a0,-36(s0) + EFC_RegStruct *efc = EFC; + 3000ecc: 147107b7 lui a5,0x14710 + 3000ed0: fef42623 sw a5,-20(s0) + EFLASH_CLK_CFG_REG cfg; + unsigned int hclk; + unsigned int nreadDiv; + + /* Step 1: Set nread_div */ + hclk = GetFlashFreq(coreClkSelect); + 3000ed4: fdc42503 lw a0,-36(s0) + 3000ed8: 3751 jal ra,3000e5c + 3000eda: fea42423 sw a0,-24(s0) + cfg.reg = efc->EFLASH_CLK_CFG.reg; + 3000ede: fec42703 lw a4,-20(s0) + 3000ee2: 6785 lui a5,0x1 + 3000ee4: 97ba add a5,a5,a4 + 3000ee6: 9407a783 lw a5,-1728(a5) # 940 + 3000eea: fef42223 sw a5,-28(s0) + SetFlashDiv(hclk, &nreadDiv); + 3000eee: fe040793 addi a5,s0,-32 + 3000ef2: 85be mv a1,a5 + 3000ef4: fe842503 lw a0,-24(s0) + 3000ef8: 3dc9 jal ra,3000dca + cfg.BIT.nread_div = nreadDiv; + 3000efa: fe042783 lw a5,-32(s0) + 3000efe: 8bbd andi a5,a5,15 + 3000f00: 0ff7f713 andi a4,a5,255 + 3000f04: fe442783 lw a5,-28(s0) + 3000f08: 8b3d andi a4,a4,15 + 3000f0a: 0712 slli a4,a4,0x4 + 3000f0c: f0f7f793 andi a5,a5,-241 + 3000f10: 8fd9 or a5,a5,a4 + 3000f12: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f16: fe442783 lw a5,-28(s0) + 3000f1a: 00100737 lui a4,0x100 + 3000f1e: 8fd9 or a5,a5,a4 + 3000f20: fef42223 sw a5,-28(s0) + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f24: fe442783 lw a5,-28(s0) + 3000f28: 00400737 lui a4,0x400 + 3000f2c: 8fd9 or a5,a5,a4 + 3000f2e: fef42223 sw a5,-28(s0) + + /* Step 2: Wait Busclk_sw_req */ + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f32: fe442783 lw a5,-28(s0) + 3000f36: 00400737 lui a4,0x400 + 3000f3a: 8fd9 or a5,a5,a4 + 3000f3c: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f40: fe442783 lw a5,-28(s0) + 3000f44: 00100737 lui a4,0x100 + 3000f48: 8fd9 or a5,a5,a4 + 3000f4a: fef42223 sw a5,-28(s0) + efc->EFLASH_CLK_CFG.reg = cfg.reg; + 3000f4e: fe442703 lw a4,-28(s0) + 3000f52: fec42683 lw a3,-20(s0) + 3000f56: 6785 lui a5,0x1 + 3000f58: 97b6 add a5,a5,a3 + 3000f5a: 94e7a023 sw a4,-1728(a5) # 940 + while (efc->EFLASH_CLK_CFG.BIT.busclk_sw_req == BASE_CFG_SET) { + 3000f5e: 0001 nop + 3000f60: fec42703 lw a4,-20(s0) + 3000f64: 6785 lui a5,0x1 + 3000f66: 97ba add a5,a5,a4 + 3000f68: 9407a783 lw a5,-1728(a5) # 940 + 3000f6c: 83d1 srli a5,a5,0x14 + 3000f6e: 8b85 andi a5,a5,1 + 3000f70: 0ff7f713 andi a4,a5,255 + 3000f74: 4785 li a5,1 + 3000f76: fef705e3 beq a4,a5,3000f60 + ; + } + 3000f7a: 0001 nop + 3000f7c: 50b2 lw ra,44(sp) + 3000f7e: 5422 lw s0,40(sp) + 3000f80: 6145 addi sp,sp,48 + 3000f82: 8082 ret + +03000f84 : + * @brief Init the systick + * @param None + * @retval None + */ +void SYSTICK_Init(void) +{ + 3000f84: 1141 addi sp,sp,-16 + 3000f86: c622 sw s0,12(sp) + 3000f88: 0800 addi s0,sp,16 + SYSTICK->TIMER_CTRL.reg = 0; + 3000f8a: 143807b7 lui a5,0x14380 + 3000f8e: 0007a023 sw zero,0(a5) # 14380000 + SYSTICK->TIMER_CTRL.BIT.enable = 1; + 3000f92: 14380737 lui a4,0x14380 + 3000f96: 431c lw a5,0(a4) + 3000f98: 0017e793 ori a5,a5,1 + 3000f9c: c31c sw a5,0(a4) +} + 3000f9e: 0001 nop + 3000fa0: 4432 lw s0,12(sp) + 3000fa2: 0141 addi sp,sp,16 + 3000fa4: 8082 ret + +03000fa6 : + * @brief Get the Systick frep(Hz) + * @param None + * @retval Clock frep of systick(Hz) + */ +unsigned int SYSTICK_GetCRGHZ(void) +{ + 3000fa6: 1141 addi sp,sp,-16 + 3000fa8: c606 sw ra,12(sp) + 3000faa: c422 sw s0,8(sp) + 3000fac: 0800 addi s0,sp,16 + /* Get the Systick IP */ + return HAL_CRG_GetIpFreq(SYSTICK_BASE); + 3000fae: 14380537 lui a0,0x14380 + 3000fb2: 264020ef jal ra,3003216 + 3000fb6: 87aa mv a5,a0 + 3000fb8: 853e mv a0,a5 + 3000fba: 40b2 lw ra,12(sp) + 3000fbc: 4422 lw s0,8(sp) + 3000fbe: 0141 addi sp,sp,16 + 3000fc0: 8082 ret + +03000fc2 : + * @param efc Flash control register base address + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +static unsigned int FOTP_CheckReadStatus(EFC_RegStruct *efc) +{ + 3000fc2: 1101 addi sp,sp,-32 + 3000fc4: ce22 sw s0,28(sp) + 3000fc6: 1000 addi s0,sp,32 + 3000fc8: fea42623 sw a0,-20(s0) + /* Check for errors in the flash reading process. */ + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fcc: fec42783 lw a5,-20(s0) + 3000fd0: 1007a783 lw a5,256(a5) + 3000fd4: 83c1 srli a5,a5,0x10 + 3000fd6: 8b85 andi a5,a5,1 + 3000fd8: 9f81 uxtb a5 + 3000fda: e38d bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000fdc: fec42783 lw a5,-20(s0) + 3000fe0: 1007a783 lw a5,256(a5) + 3000fe4: 83cd srli a5,a5,0x13 + 3000fe6: 8b85 andi a5,a5,1 + 3000fe8: 9f81 uxtb a5 + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fea: eb89 bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_chk) { + 3000fec: fec42783 lw a5,-20(s0) + 3000ff0: 1007a783 lw a5,256(a5) + 3000ff4: 83d1 srli a5,a5,0x14 + 3000ff6: 8b85 andi a5,a5,1 + 3000ff8: 9f81 uxtb a5 + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000ffa: c3a9 beqz a5,300103c + efc->INT_CLEAR.BIT.int_clr_err_ecc_corr = BASE_CFG_SET; + 3000ffc: fec42703 lw a4,-20(s0) + 3001000: 10c72783 lw a5,268(a4) # 1438010c + 3001004: 000806b7 lui a3,0x80 + 3001008: 8fd5 or a5,a5,a3 + 300100a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_illegal = BASE_CFG_SET; + 300100e: fec42703 lw a4,-20(s0) + 3001012: 10c72783 lw a5,268(a4) + 3001016: 66c1 lui a3,0x10 + 3001018: 8fd5 or a5,a5,a3 + 300101a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_ecc_chk = BASE_CFG_SET; + 300101e: fec42703 lw a4,-20(s0) + 3001022: 10c72783 lw a5,268(a4) + 3001026: 001006b7 lui a3,0x100 + 300102a: 8fd5 or a5,a5,a3 + 300102c: 10f72623 sw a5,268(a4) + efc->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001030: fec42783 lw a5,-20(s0) + 3001034: 2007a023 sw zero,512(a5) + return BASE_STATUS_ERROR; + 3001038: 4785 li a5,1 + 300103a: a011 j 300103e + } + return BASE_STATUS_OK; + 300103c: 4781 li a5,0 +} + 300103e: 853e mv a0,a5 + 3001040: 4472 lw s0,28(sp) + 3001042: 6105 addi sp,sp,32 + 3001044: 8082 ret + +03001046 : + * @param buf Buffer of read data + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +unsigned int FOTP_InfoGet(FOTP_InfoRngType type, unsigned int index, FOTP_CommonData *buf) +{ + 3001046: 7179 addi sp,sp,-48 + 3001048: d606 sw ra,44(sp) + 300104a: d422 sw s0,40(sp) + 300104c: 1800 addi s0,sp,48 + 300104e: fca42e23 sw a0,-36(s0) + 3001052: fcb42c23 sw a1,-40(s0) + 3001056: fcc42a23 sw a2,-44(s0) + EFC_RegStruct *p = EFC; + 300105a: 147107b7 lui a5,0x14710 + 300105e: fef42423 sw a5,-24(s0) + unsigned int addr; + + if (buf == NULL) { + 3001062: fd442783 lw a5,-44(s0) + 3001066: e399 bnez a5,300106c + return BASE_STATUS_ERROR; + 3001068: 4785 li a5,1 + 300106a: aa15 j 300119e + } + + if ((type >= FOTP_INFO_MAXTYPE) || (index > FOTP_INFO_REG_MAX_ID)) { + 300106c: fdc42703 lw a4,-36(s0) + 3001070: 4785 li a5,1 + 3001072: 00e7e763 bltu a5,a4,3001080 + 3001076: fd842703 lw a4,-40(s0) + 300107a: 47e5 li a5,25 + 300107c: 00e7f463 bgeu a5,a4,3001084 + return BASE_STATUS_ERROR; + 3001080: 4785 li a5,1 + 3001082: aa31 j 300119e + } + + /* If there is a read command, return */ + if (p->EFLASH_CMD.BIT.cmd_start) { + 3001084: fe842783 lw a5,-24(s0) + 3001088: 439c lw a5,0(a5) + 300108a: 8b85 andi a5,a5,1 + 300108c: 9f81 uxtb a5 + 300108e: c399 beqz a5,3001094 + return BASE_STATUS_ERROR; + 3001090: 4785 li a5,1 + 3001092: a231 j 300119e + } + + p->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; + 3001094: fe842783 lw a5,-24(s0) + 3001098: fedcc737 lui a4,0xfedcc + 300109c: a9870713 addi a4,a4,-1384 # fedcba98 + 30010a0: 20e7a023 sw a4,512(a5) # 14710200 + + /* Configure the read command parameters and start the read command */ + addr = (type == FOTP_INFO_RNG0) ? FOTP_INFO_RNG0_BASEADDR : FOTP_INFO_RNG1_BASEADDR; + 30010a4: fdc42783 lw a5,-36(s0) + 30010a8: e781 bnez a5,30010b0 + 30010aa: 008007b7 lui a5,0x800 + 30010ae: a019 j 30010b4 + 30010b0: 008017b7 lui a5,0x801 + 30010b4: fef42223 sw a5,-28(s0) + addr += index * REG_WORDS_NUM; + 30010b8: fd842783 lw a5,-40(s0) + 30010bc: 0792 slli a5,a5,0x4 + 30010be: fe442703 lw a4,-28(s0) + 30010c2: 97ba add a5,a5,a4 + 30010c4: fef42223 sw a5,-28(s0) + p->EFLASH_ADDR.BIT.cmd_addr = addr >> 2; /* Right shift 2 bit change to word */ + 30010c8: fe442783 lw a5,-28(s0) + 30010cc: 0027d713 srli a4,a5,0x2 + 30010d0: 004007b7 lui a5,0x400 + 30010d4: 17fd addi a5,a5,-1 # 3fffff + 30010d6: 00f77633 and a2,a4,a5 + 30010da: fe842703 lw a4,-24(s0) + 30010de: 435c lw a5,4(a4) + 30010e0: 004006b7 lui a3,0x400 + 30010e4: 16fd addi a3,a3,-1 # 3fffff + 30010e6: 8ef1 and a3,a3,a2 + 30010e8: 068a slli a3,a3,0x2 + 30010ea: ff000637 lui a2,0xff000 + 30010ee: 060d addi a2,a2,3 # ff000003 + 30010f0: 8ff1 and a5,a5,a2 + 30010f2: 8fd5 or a5,a5,a3 + 30010f4: c35c sw a5,4(a4) + p->EFLASH_CMD.BIT.cmd_code = FLASH_OPERATION_READ; + 30010f6: fe842703 lw a4,-24(s0) + 30010fa: 431c lw a5,0(a4) + 30010fc: 8ff7f793 andi a5,a5,-1793 + 3001100: 1007e793 ori a5,a5,256 + 3001104: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_read_size = FLASH_READ_128BIT; + 3001106: fe842703 lw a4,-24(s0) + 300110a: 431c lw a5,0(a4) + 300110c: d00006b7 lui a3,0xd0000 + 3001110: 16fd addi a3,a3,-1 # cfffffff + 3001112: 8efd and a3,a3,a5 + 3001114: 100007b7 lui a5,0x10000 + 3001118: 8fd5 or a5,a5,a3 + 300111a: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_start = BASE_CFG_SET; + 300111c: fe842703 lw a4,-24(s0) + 3001120: 431c lw a5,0(a4) + 3001122: 0017e793 ori a5,a5,1 + 3001126: c31c sw a5,0(a4) + + while (p->EFLASH_CMD.BIT.cmd_start) { + 3001128: 0001 nop + 300112a: fe842783 lw a5,-24(s0) + 300112e: 439c lw a5,0(a5) + 3001130: 8b85 andi a5,a5,1 + 3001132: 9f81 uxtb a5 + 3001134: fbfd bnez a5,300112a + ; + } + while (p->EFLASH_CMD.BIT.exec_state) { + 3001136: 0001 nop + 3001138: fe842783 lw a5,-24(s0) + 300113c: 439c lw a5,0(a5) + 300113e: 8399 srli a5,a5,0x6 + 3001140: 8b8d andi a5,a5,3 + 3001142: 9f81 uxtb a5 + 3001144: fbf5 bnez a5,3001138 + ; + } + /* read error, clear interrupt and return */ + if (FOTP_CheckReadStatus(p) != BASE_STATUS_OK) { + 3001146: fe842503 lw a0,-24(s0) + 300114a: 3da5 jal ra,3000fc2 + 300114c: 87aa mv a5,a0 + 300114e: c399 beqz a5,3001154 + return BASE_STATUS_ERROR; + 3001150: 4785 li a5,1 + 3001152: a0b1 j 300119e + } + /* Read data from FIFO to buffer */ + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001154: fe042623 sw zero,-20(s0) + 3001158: a00d j 300117a + buf->data[i] = p->FLASH_RDATA; + 300115a: fe842783 lw a5,-24(s0) + 300115e: 6007a703 lw a4,1536(a5) # 10000600 + 3001162: fd442683 lw a3,-44(s0) + 3001166: fec42783 lw a5,-20(s0) + 300116a: 078a slli a5,a5,0x2 + 300116c: 97b6 add a5,a5,a3 + 300116e: c398 sw a4,0(a5) + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001170: fec42783 lw a5,-20(s0) + 3001174: 0785 addi a5,a5,1 + 3001176: fef42623 sw a5,-20(s0) + 300117a: fec42703 lw a4,-20(s0) + 300117e: 478d li a5,3 + 3001180: fce7fde3 bgeu a5,a4,300115a + } + p->INT_CLEAR.BIT.int_clr_finish = BASE_CFG_SET; + 3001184: fe842703 lw a4,-24(s0) + 3001188: 10c72783 lw a5,268(a4) + 300118c: 0107e793 ori a5,a5,16 + 3001190: 10f72623 sw a5,268(a4) + p->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001194: fe842783 lw a5,-24(s0) + 3001198: 2007a023 sw zero,512(a5) + return BASE_STATUS_OK; + 300119c: 4781 li a5,0 + 300119e: 853e mv a0,a5 + 30011a0: 50b2 lw ra,44(sp) + 30011a2: 5422 lw s0,40(sp) + 30011a4: 6145 addi sp,sp,48 + 30011a6: 8082 ret + +030011a8 : + * @param baseAddr The ip base address + * @retval The Address(offset) in g_crgIpMatch if match success + * @retval 0 if match fail + */ +CHIP_CrgIpMatchInfo *GetCrgIpMatchInfo(const void *baseAddr) +{ + 30011a8: 7179 addi sp,sp,-48 + 30011aa: d622 sw s0,44(sp) + 30011ac: 1800 addi s0,sp,48 + 30011ae: fca42e23 sw a0,-36(s0) + unsigned int i; + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011b2: fe042623 sw zero,-20(s0) + 30011b6: a081 j 30011f6 + if (baseAddr == g_crgIpMatch[i].ipBaseAddr) { + 30011b8: 030067b7 lui a5,0x3006 + 30011bc: 20078713 addi a4,a5,512 # 3006200 + 30011c0: fec42683 lw a3,-20(s0) + 30011c4: 47b1 li a5,12 + 30011c6: 02f687b3 mul a5,a3,a5 + 30011ca: 97ba add a5,a5,a4 + 30011cc: 439c lw a5,0(a5) + 30011ce: fdc42703 lw a4,-36(s0) + 30011d2: 00f71d63 bne a4,a5,30011ec + return (CHIP_CrgIpMatchInfo *)&g_crgIpMatch[i]; + 30011d6: fec42703 lw a4,-20(s0) + 30011da: 47b1 li a5,12 + 30011dc: 02f70733 mul a4,a4,a5 + 30011e0: 030067b7 lui a5,0x3006 + 30011e4: 20078793 addi a5,a5,512 # 3006200 + 30011e8: 97ba add a5,a5,a4 + 30011ea: a829 j 3001204 + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011ec: fec42783 lw a5,-20(s0) + 30011f0: 0785 addi a5,a5,1 + 30011f2: fef42623 sw a5,-20(s0) + 30011f6: fec42703 lw a4,-20(s0) + 30011fa: 02d00793 li a5,45 + 30011fe: fae7fde3 bgeu a5,a4,30011b8 + } + } + return (CHIP_CrgIpMatchInfo *)0; /* The base address does not match, return 0. */ + 3001202: 4781 li a5,0 +} + 3001204: 853e mv a0,a5 + 3001206: 5432 lw s0,44(sp) + 3001208: 6145 addi sp,sp,48 + 300120a: 8082 ret + +0300120c : + * @brief Check ADC sample input. + * @param input Number of input. + * @retval bool + */ +static inline bool IsADCSampleChannel(ADC_Input input) +{ + 300120c: 1101 addi sp,sp,-32 + 300120e: ce22 sw s0,28(sp) + 3001210: 1000 addi s0,sp,32 + 3001212: fea42623 sw a0,-20(s0) + return (input >= ADC_CH_ADCINA0) && (input <= ADC_CH_ADCINA19); + 3001216: fec42783 lw a5,-20(s0) + 300121a: 0147b793 sltiu a5,a5,20 + 300121e: 9f81 uxtb a5 +} + 3001220: 853e mv a0,a5 + 3001222: 4472 lw s0,28(sp) + 3001224: 6105 addi sp,sp,32 + 3001226: 8082 ret + +03001228 : + * are configured through the SOC. + * @param soc Number of SOC. + * @retval bool + */ +static inline bool IsADCSOCx(ADC_SOCNumber soc) +{ + 3001228: 1101 addi sp,sp,-32 + 300122a: ce22 sw s0,28(sp) + 300122c: 1000 addi s0,sp,32 + 300122e: fea42623 sw a0,-20(s0) + return (soc >= ADC_SOC_NUM0) && (soc <= ADC_SOC_NUM15); + 3001232: fec42783 lw a5,-20(s0) + 3001236: 0107b793 sltiu a5,a5,16 + 300123a: 9f81 uxtb a5 +} + 300123c: 853e mv a0,a5 + 300123e: 4472 lw s0,28(sp) + 3001240: 6105 addi sp,sp,32 + 3001242: 8082 ret + +03001244 : + * @brief Check ADC interrupt parameter. + * @param intx Number of interrupt. + * @retval bool + */ +static inline bool IsADCIntx(ADC_IntNumber intx) +{ + 3001244: 1101 addi sp,sp,-32 + 3001246: ce22 sw s0,28(sp) + 3001248: 1000 addi s0,sp,32 + 300124a: fea42623 sw a0,-20(s0) + return (intx >= ADC_INT_NUMBER0) && (intx <= ADC_INT_NUMBER3); + 300124e: fec42783 lw a5,-20(s0) + 3001252: 0047b793 sltiu a5,a5,4 + 3001256: 9f81 uxtb a5 +} + 3001258: 853e mv a0,a5 + 300125a: 4472 lw s0,28(sp) + 300125c: 6105 addi sp,sp,32 + 300125e: 8082 ret + +03001260 : + * @brief Check SOC trigger source. + * @param trig Type of trigger source. + * @retval bool + */ +static inline bool IsADCTrigSource(ADC_TrigSource trig) +{ + 3001260: 1101 addi sp,sp,-32 + 3001262: ce22 sw s0,28(sp) + 3001264: 1000 addi s0,sp,32 + 3001266: fea42623 sw a0,-20(s0) + return (trig >= ADC_TRIGSOC_SOFT) && (trig <= ADC_TRIGSOC_GPIOPF1); + 300126a: fec42783 lw a5,-20(s0) + 300126e: 0157b793 sltiu a5,a5,21 + 3001272: 9f81 uxtb a5 +} + 3001274: 853e mv a0,a5 + 3001276: 4472 lw s0,28(sp) + 3001278: 6105 addi sp,sp,32 + 300127a: 8082 ret + +0300127c : + * @brief Check mode of completion of SOC sample + * @param mode Type of completion. + * @retval bool + */ +static inline bool IsADCFinishMode(ADC_SOCFinishMode mode) +{ + 300127c: 1101 addi sp,sp,-32 + 300127e: ce22 sw s0,28(sp) + 3001280: 1000 addi s0,sp,32 + 3001282: fea42623 sw a0,-20(s0) + return (mode >= ADC_SOCFINISH_NONE) && (mode <= ADC_SOCFINISH_INT3); + 3001286: fec42783 lw a5,-20(s0) + 300128a: cb81 beqz a5,300129a + 300128c: fec42703 lw a4,-20(s0) + 3001290: 4799 li a5,6 + 3001292: 00e7e463 bltu a5,a4,300129a + 3001296: 4785 li a5,1 + 3001298: a011 j 300129c + 300129a: 4781 li a5,0 + 300129c: 8b85 andi a5,a5,1 + 300129e: 9f81 uxtb a5 +} + 30012a0: 853e mv a0,a5 + 30012a2: 4472 lw s0,28(sp) + 30012a4: 6105 addi sp,sp,32 + 30012a6: 8082 ret + +030012a8 : + * @brief Check ADC sample priority parameter. + * @param mode Priority mode of SOC. + * @retval bool + */ +static inline bool IsADCPriorityMode(ADC_PriorityMode mode) +{ + 30012a8: 1101 addi sp,sp,-32 + 30012aa: ce22 sw s0,28(sp) + 30012ac: 1000 addi s0,sp,32 + 30012ae: fea42623 sw a0,-20(s0) + return (mode >= ADC_PRIMODE_ALL_ROUND) && (mode <= ADC_PRIMODE_ALL_PRIORITY); + 30012b2: fec42703 lw a4,-20(s0) + 30012b6: 67c1 lui a5,0x10 + 30012b8: 00f737b3 sltu a5,a4,a5 + 30012bc: 9f81 uxtb a5 +} + 30012be: 853e mv a0,a5 + 30012c0: 4472 lw s0,28(sp) + 30012c2: 6105 addi sp,sp,32 + 30012c4: 8082 ret + +030012c6 : + * @brief Check time of total ADC sampling time. + * @param acqps Time of total ADC sampling time. + * @retval bool + */ +static inline bool IsADCTotalTime(unsigned int acqps) +{ + 30012c6: 1101 addi sp,sp,-32 + 30012c8: ce22 sw s0,28(sp) + 30012ca: 1000 addi s0,sp,32 + 30012cc: fea42623 sw a0,-20(s0) + return (acqps <= ADC_SOCSAMPLE_500CLK); + 30012d0: fec42783 lw a5,-20(s0) + 30012d4: 0107b793 sltiu a5,a5,16 + 30012d8: 9f81 uxtb a5 +} + 30012da: 853e mv a0,a5 + 30012dc: 4472 lw s0,28(sp) + 30012de: 6105 addi sp,sp,32 + 30012e0: 8082 ret + +030012e2 : + * @brief Enable AVDD/3 Channal. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_EnableAvddChannel(ADC_RegStruct * const adcx) +{ + 30012e2: 1101 addi sp,sp,-32 + 30012e4: ce06 sw ra,28(sp) + 30012e6: cc22 sw s0,24(sp) + 30012e8: 1000 addi s0,sp,32 + 30012ea: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30012ee: fec42703 lw a4,-20(s0) + 30012f2: 180007b7 lui a5,0x18000 + 30012f6: 00f70b63 beq a4,a5,300130c + 30012fa: 6785 lui a5,0x1 + 30012fc: 86278593 addi a1,a5,-1950 # 862 + 3001300: 030067b7 lui a5,0x3006 + 3001304: 42878513 addi a0,a5,1064 # 3006428 + 3001308: 2b0d jal ra,300183a + 300130a: a001 j 300130a + adcx->ADC_AVDD_EN.BIT.cfg_avdd_en = true; + 300130c: fec42703 lw a4,-20(s0) + 3001310: 65872783 lw a5,1624(a4) + 3001314: 0017e793 ori a5,a5,1 + 3001318: 64f72c23 sw a5,1624(a4) +} + 300131c: 0001 nop + 300131e: 40f2 lw ra,28(sp) + 3001320: 4462 lw s0,24(sp) + 3001322: 6105 addi sp,sp,32 + 3001324: 8082 ret + +03001326 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt0(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001326: 7179 addi sp,sp,-48 + 3001328: d606 sw ra,44(sp) + 300132a: d422 sw s0,40(sp) + 300132c: 1800 addi s0,sp,48 + 300132e: fca42e23 sw a0,-36(s0) + 3001332: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001336: fdc42703 lw a4,-36(s0) + 300133a: 180007b7 lui a5,0x18000 + 300133e: 00f70b63 beq a4,a5,3001354 + 3001342: 6785 lui a5,0x1 + 3001344: 87978593 addi a1,a5,-1927 # 879 + 3001348: 030067b7 lui a5,0x3006 + 300134c: 42878513 addi a0,a5,1064 # 3006428 + 3001350: 21ed jal ra,300183a + 3001352: a001 j 3001352 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 3001354: fd842503 lw a0,-40(s0) + 3001358: 3dc1 jal ra,3001228 + 300135a: 87aa mv a5,a0 + 300135c: 0017c793 xori a5,a5,1 + 3001360: 9f81 uxtb a5 + 3001362: cb91 beqz a5,3001376 + 3001364: 6785 lui a5,0x1 + 3001366: 87a78593 addi a1,a5,-1926 # 87a + 300136a: 030067b7 lui a5,0x3006 + 300136e: 42878513 addi a0,a5,1064 # 3006428 + 3001372: 21e1 jal ra,300183a + 3001374: a01d j 300139a + unsigned int shiftBit = (unsigned int)socx; + 3001376: fd842783 lw a5,-40(s0) + 300137a: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 300137e: fdc42783 lw a5,-36(s0) + 3001382: 2b07a703 lw a4,688(a5) + 3001386: 4685 li a3,1 + 3001388: fec42783 lw a5,-20(s0) + 300138c: 00f697b3 sll a5,a3,a5 + 3001390: 8f5d or a4,a4,a5 + 3001392: fdc42783 lw a5,-36(s0) + 3001396: 2ae7a823 sw a4,688(a5) +} + 300139a: 50b2 lw ra,44(sp) + 300139c: 5422 lw s0,40(sp) + 300139e: 6145 addi sp,sp,48 + 30013a0: 8082 ret + +030013a2 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt1(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30013a2: 7179 addi sp,sp,-48 + 30013a4: d606 sw ra,44(sp) + 30013a6: d422 sw s0,40(sp) + 30013a8: 1800 addi s0,sp,48 + 30013aa: fca42e23 sw a0,-36(s0) + 30013ae: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30013b2: fdc42703 lw a4,-36(s0) + 30013b6: 180007b7 lui a5,0x18000 + 30013ba: 00f70b63 beq a4,a5,30013d0 + 30013be: 6785 lui a5,0x1 + 30013c0: 89478593 addi a1,a5,-1900 # 894 + 30013c4: 030067b7 lui a5,0x3006 + 30013c8: 42878513 addi a0,a5,1064 # 3006428 + 30013cc: 21bd jal ra,300183a + 30013ce: a001 j 30013ce + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30013d0: fd842503 lw a0,-40(s0) + 30013d4: 3d91 jal ra,3001228 + 30013d6: 87aa mv a5,a0 + 30013d8: 0017c793 xori a5,a5,1 + 30013dc: 9f81 uxtb a5 + 30013de: cb91 beqz a5,30013f2 + 30013e0: 6785 lui a5,0x1 + 30013e2: 89578593 addi a1,a5,-1899 # 895 + 30013e6: 030067b7 lui a5,0x3006 + 30013ea: 42878513 addi a0,a5,1064 # 3006428 + 30013ee: 21b1 jal ra,300183a + 30013f0: a025 j 3001418 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30013f2: fd842783 lw a5,-40(s0) + 30013f6: 07c1 addi a5,a5,16 + 30013f8: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 30013fc: fdc42783 lw a5,-36(s0) + 3001400: 2b07a703 lw a4,688(a5) + 3001404: 4685 li a3,1 + 3001406: fec42783 lw a5,-20(s0) + 300140a: 00f697b3 sll a5,a3,a5 + 300140e: 8f5d or a4,a4,a5 + 3001410: fdc42783 lw a5,-36(s0) + 3001414: 2ae7a823 sw a4,688(a5) +} + 3001418: 50b2 lw ra,44(sp) + 300141a: 5422 lw s0,40(sp) + 300141c: 6145 addi sp,sp,48 + 300141e: 8082 ret + +03001420 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt2(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001420: 7179 addi sp,sp,-48 + 3001422: d606 sw ra,44(sp) + 3001424: d422 sw s0,40(sp) + 3001426: 1800 addi s0,sp,48 + 3001428: fca42e23 sw a0,-36(s0) + 300142c: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001430: fdc42703 lw a4,-36(s0) + 3001434: 180007b7 lui a5,0x18000 + 3001438: 00f70b63 beq a4,a5,300144e + 300143c: 6785 lui a5,0x1 + 300143e: 8af78593 addi a1,a5,-1873 # 8af + 3001442: 030067b7 lui a5,0x3006 + 3001446: 42878513 addi a0,a5,1064 # 3006428 + 300144a: 2ec5 jal ra,300183a + 300144c: a001 j 300144c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300144e: fd842503 lw a0,-40(s0) + 3001452: 3bd9 jal ra,3001228 + 3001454: 87aa mv a5,a0 + 3001456: 0017c793 xori a5,a5,1 + 300145a: 9f81 uxtb a5 + 300145c: cb91 beqz a5,3001470 + 300145e: 6785 lui a5,0x1 + 3001460: 8b078593 addi a1,a5,-1872 # 8b0 + 3001464: 030067b7 lui a5,0x3006 + 3001468: 42878513 addi a0,a5,1064 # 3006428 + 300146c: 26f9 jal ra,300183a + 300146e: a01d j 3001494 + unsigned int shiftBit = (unsigned int)socx; + 3001470: fd842783 lw a5,-40(s0) + 3001474: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 3001478: fdc42783 lw a5,-36(s0) + 300147c: 2b47a703 lw a4,692(a5) + 3001480: 4685 li a3,1 + 3001482: fec42783 lw a5,-20(s0) + 3001486: 00f697b3 sll a5,a3,a5 + 300148a: 8f5d or a4,a4,a5 + 300148c: fdc42783 lw a5,-36(s0) + 3001490: 2ae7aa23 sw a4,692(a5) +} + 3001494: 50b2 lw ra,44(sp) + 3001496: 5422 lw s0,40(sp) + 3001498: 6145 addi sp,sp,48 + 300149a: 8082 ret + +0300149c : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt3(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300149c: 7179 addi sp,sp,-48 + 300149e: d606 sw ra,44(sp) + 30014a0: d422 sw s0,40(sp) + 30014a2: 1800 addi s0,sp,48 + 30014a4: fca42e23 sw a0,-36(s0) + 30014a8: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30014ac: fdc42703 lw a4,-36(s0) + 30014b0: 180007b7 lui a5,0x18000 + 30014b4: 00f70b63 beq a4,a5,30014ca + 30014b8: 6785 lui a5,0x1 + 30014ba: 8ca78593 addi a1,a5,-1846 # 8ca + 30014be: 030067b7 lui a5,0x3006 + 30014c2: 42878513 addi a0,a5,1064 # 3006428 + 30014c6: 2e95 jal ra,300183a + 30014c8: a001 j 30014c8 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30014ca: fd842503 lw a0,-40(s0) + 30014ce: 3ba9 jal ra,3001228 + 30014d0: 87aa mv a5,a0 + 30014d2: 0017c793 xori a5,a5,1 + 30014d6: 9f81 uxtb a5 + 30014d8: cb91 beqz a5,30014ec + 30014da: 6785 lui a5,0x1 + 30014dc: 8cb78593 addi a1,a5,-1845 # 8cb + 30014e0: 030067b7 lui a5,0x3006 + 30014e4: 42878513 addi a0,a5,1064 # 3006428 + 30014e8: 2e89 jal ra,300183a + 30014ea: a025 j 3001512 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30014ec: fd842783 lw a5,-40(s0) + 30014f0: 07c1 addi a5,a5,16 + 30014f2: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 30014f6: fdc42783 lw a5,-36(s0) + 30014fa: 2b47a703 lw a4,692(a5) + 30014fe: 4685 li a3,1 + 3001500: fec42783 lw a5,-20(s0) + 3001504: 00f697b3 sll a5,a3,a5 + 3001508: 8f5d or a4,a4,a5 + 300150a: fdc42783 lw a5,-36(s0) + 300150e: 2ae7aa23 sw a4,692(a5) +} + 3001512: 50b2 lw ra,44(sp) + 3001514: 5422 lw s0,40(sp) + 3001516: 6145 addi sp,sp,48 + 3001518: 8082 ret + +0300151a : + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + 300151a: 1101 addi sp,sp,-32 + 300151c: ce06 sw ra,28(sp) + 300151e: cc22 sw s0,24(sp) + 3001520: 1000 addi s0,sp,32 + 3001522: fea42623 sw a0,-20(s0) + 3001526: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300152a: fec42703 lw a4,-20(s0) + 300152e: 180007b7 lui a5,0x18000 + 3001532: 00f70b63 beq a4,a5,3001548 + 3001536: 6785 lui a5,0x1 + 3001538: 8e578593 addi a1,a5,-1819 # 8e5 + 300153c: 030067b7 lui a5,0x3006 + 3001540: 42878513 addi a0,a5,1064 # 3006428 + 3001544: 2cdd jal ra,300183a + 3001546: a001 j 3001546 + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + 3001548: fe842503 lw a0,-24(s0) + 300154c: 39e5 jal ra,3001244 + 300154e: 87aa mv a5,a0 + 3001550: 0017c793 xori a5,a5,1 + 3001554: 9f81 uxtb a5 + 3001556: cb91 beqz a5,300156a + 3001558: 6785 lui a5,0x1 + 300155a: 8e678593 addi a1,a5,-1818 # 8e6 + 300155e: 030067b7 lui a5,0x3006 + 3001562: 42878513 addi a0,a5,1064 # 3006428 + 3001566: 2cd1 jal ra,300183a + 3001568: a839 j 3001586 + adcx->ADC_DATA_FLAG_MASK.reg |= (1U << (unsigned int)intx); + 300156a: fec42783 lw a5,-20(s0) + 300156e: 2c07a703 lw a4,704(a5) + 3001572: 4685 li a3,1 + 3001574: fe842783 lw a5,-24(s0) + 3001578: 00f697b3 sll a5,a3,a5 + 300157c: 8f5d or a4,a4,a5 + 300157e: fec42783 lw a5,-20(s0) + 3001582: 2ce7a023 sw a4,704(a5) +} + 3001586: 40f2 lw ra,28(sp) + 3001588: 4462 lw s0,24(sp) + 300158a: 6105 addi sp,sp,32 + 300158c: 8082 ret + +0300158e : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval addr, the base address of the SOC registers. + */ +static unsigned int ADC_GetCTRLAddr(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300158e: 7179 addi sp,sp,-48 + 3001590: d622 sw s0,44(sp) + 3001592: 1800 addi s0,sp,48 + 3001594: fca42e23 sw a0,-36(s0) + 3001598: fcb42c23 sw a1,-40(s0) + unsigned int addr; + addr = (uintptr_t)(void *)&(adcx->ADC_SOC0_CFG); + 300159c: fdc42783 lw a5,-36(s0) + 30015a0: 10078793 addi a5,a5,256 + 30015a4: fef42623 sw a5,-20(s0) + addr += ((unsigned int)socx * 4); /* Register base address difference 4 */ + 30015a8: fd842783 lw a5,-40(s0) + 30015ac: 078a slli a5,a5,0x2 + 30015ae: fec42703 lw a4,-20(s0) + 30015b2: 97ba add a5,a5,a4 + 30015b4: fef42623 sw a5,-20(s0) + return addr; + 30015b8: fec42783 lw a5,-20(s0) +} + 30015bc: 853e mv a0,a5 + 30015be: 5432 lw s0,44(sp) + 30015c0: 6145 addi sp,sp,48 + 30015c2: 8082 ret + +030015c4 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param input ADC input, @ref ADC_Input. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelectChannel(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_Input input) +{ + 30015c4: 7179 addi sp,sp,-48 + 30015c6: d606 sw ra,44(sp) + 30015c8: d422 sw s0,40(sp) + 30015ca: 1800 addi s0,sp,48 + 30015cc: fca42e23 sw a0,-36(s0) + 30015d0: fcb42c23 sw a1,-40(s0) + 30015d4: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30015d8: fdc42703 lw a4,-36(s0) + 30015dc: 180007b7 lui a5,0x18000 + 30015e0: 00f70b63 beq a4,a5,30015f6 + 30015e4: 6785 lui a5,0x1 + 30015e6: 91c78593 addi a1,a5,-1764 # 91c + 30015ea: 030067b7 lui a5,0x3006 + 30015ee: 42878513 addi a0,a5,1064 # 3006428 + 30015f2: 24a1 jal ra,300183a + 30015f4: a001 j 30015f4 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCSampleChannel(input)); + 30015f6: fd842503 lw a0,-40(s0) + 30015fa: 313d jal ra,3001228 + 30015fc: 87aa mv a5,a0 + 30015fe: 0017c793 xori a5,a5,1 + 3001602: 9f81 uxtb a5 + 3001604: eb89 bnez a5,3001616 + 3001606: fd442503 lw a0,-44(s0) + 300160a: 3109 jal ra,300120c + 300160c: 87aa mv a5,a0 + 300160e: 0017c793 xori a5,a5,1 + 3001612: 9f81 uxtb a5 + 3001614: cb91 beqz a5,3001628 + 3001616: 6785 lui a5,0x1 + 3001618: 91d78593 addi a1,a5,-1763 # 91d + 300161c: 030067b7 lui a5,0x3006 + 3001620: 42878513 addi a0,a5,1064 # 3006428 + 3001624: 2c19 jal ra,300183a + 3001626: a091 j 300166a + ADC_SOC0_CFG_REG *soc = NULL; + 3001628: fe042623 sw zero,-20(s0) + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Get the Address After Translation */ + 300162c: fd842583 lw a1,-40(s0) + 3001630: fdc42503 lw a0,-36(s0) + 3001634: 3fa9 jal ra,300158e + 3001636: fea42423 sw a0,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 300163a: fe842783 lw a5,-24(s0) + 300163e: fef42623 sw a5,-20(s0) + soc->BIT.cfg_soc0_ch_sel = (unsigned int)input; + 3001642: fd442783 lw a5,-44(s0) + 3001646: 8bfd andi a5,a5,31 + 3001648: 0ff7f693 andi a3,a5,255 + 300164c: fec42703 lw a4,-20(s0) + 3001650: 431c lw a5,0(a4) + 3001652: 8afd andi a3,a3,31 + 3001654: 9b81 andi a5,a5,-32 + 3001656: 8fd5 or a5,a5,a3 + 3001658: c31c sw a5,0(a4) + if (input == ADC_CH_ADCINA18) { + 300165a: fd442703 lw a4,-44(s0) + 300165e: 47c9 li a5,18 + 3001660: 00f71563 bne a4,a5,300166a + DCL_ADC_EnableAvddChannel(adcx); + 3001664: fdc42503 lw a0,-36(s0) + 3001668: 39ad jal ra,30012e2 + } +} + 300166a: 50b2 lw ra,44(sp) + 300166c: 5422 lw s0,40(sp) + 300166e: 6145 addi sp,sp,48 + 3001670: 8082 ret + +03001672 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param trig Source of trigger, @ref ADC_TrigSource. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelcetTrigSource(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_TrigSource trig) +{ + 3001672: 7179 addi sp,sp,-48 + 3001674: d606 sw ra,44(sp) + 3001676: d422 sw s0,40(sp) + 3001678: 1800 addi s0,sp,48 + 300167a: fca42e23 sw a0,-36(s0) + 300167e: fcb42c23 sw a1,-40(s0) + 3001682: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001686: fdc42703 lw a4,-36(s0) + 300168a: 180007b7 lui a5,0x18000 + 300168e: 00f70b63 beq a4,a5,30016a4 + 3001692: 6785 lui a5,0x1 + 3001694: 93078593 addi a1,a5,-1744 # 930 + 3001698: 030067b7 lui a5,0x3006 + 300169c: 42878513 addi a0,a5,1064 # 3006428 + 30016a0: 2a69 jal ra,300183a + 30016a2: a001 j 30016a2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCTrigSource(trig)); + 30016a4: fd842503 lw a0,-40(s0) + 30016a8: 3641 jal ra,3001228 + 30016aa: 87aa mv a5,a0 + 30016ac: 0017c793 xori a5,a5,1 + 30016b0: 9f81 uxtb a5 + 30016b2: eb89 bnez a5,30016c4 + 30016b4: fd442503 lw a0,-44(s0) + 30016b8: 3665 jal ra,3001260 + 30016ba: 87aa mv a5,a0 + 30016bc: 0017c793 xori a5,a5,1 + 30016c0: 9f81 uxtb a5 + 30016c2: cb91 beqz a5,30016d6 + 30016c4: 6785 lui a5,0x1 + 30016c6: 93178593 addi a1,a5,-1743 # 931 + 30016ca: 030067b7 lui a5,0x3006 + 30016ce: 42878513 addi a0,a5,1064 # 3006428 + 30016d2: 22a5 jal ra,300183a + 30016d4: a835 j 3001710 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtaining the Address for Configuring the SOC */ + 30016d6: fd842583 lw a1,-40(s0) + 30016da: fdc42503 lw a0,-36(s0) + 30016de: 3d45 jal ra,300158e + 30016e0: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 30016e4: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30016e8: fec42783 lw a5,-20(s0) + 30016ec: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_trig_sel = (unsigned int)trig; + 30016f0: fd442783 lw a5,-44(s0) + 30016f4: 8bfd andi a5,a5,31 + 30016f6: 0ff7f693 andi a3,a5,255 + 30016fa: fe842703 lw a4,-24(s0) + 30016fe: 431c lw a5,0(a4) + 3001700: 8afd andi a3,a3,31 + 3001702: 06a6 slli a3,a3,0x9 + 3001704: 7671 lui a2,0xffffc + 3001706: 1ff60613 addi a2,a2,511 # ffffc1ff + 300170a: 8ff1 and a5,a5,a2 + 300170c: 8fd5 or a5,a5,a3 + 300170e: c31c sw a5,0(a4) +} + 3001710: 50b2 lw ra,44(sp) + 3001712: 5422 lw s0,40(sp) + 3001714: 6145 addi sp,sp,48 + 3001716: 8082 ret + +03001718 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param acqps Capacitor charging time. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetAcqps(ADC_RegStruct * const adcx, ADC_SOCNumber socx, unsigned int acqps) +{ + 3001718: 7179 addi sp,sp,-48 + 300171a: d606 sw ra,44(sp) + 300171c: d422 sw s0,40(sp) + 300171e: 1800 addi s0,sp,48 + 3001720: fca42e23 sw a0,-36(s0) + 3001724: fcb42c23 sw a1,-40(s0) + 3001728: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300172c: fdc42703 lw a4,-36(s0) + 3001730: 180007b7 lui a5,0x18000 + 3001734: 00f70b63 beq a4,a5,300174a + 3001738: 6785 lui a5,0x1 + 300173a: 94178593 addi a1,a5,-1727 # 941 + 300173e: 030067b7 lui a5,0x3006 + 3001742: 42878513 addi a0,a5,1064 # 3006428 + 3001746: 28d5 jal ra,300183a + 3001748: a001 j 3001748 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300174a: fd842503 lw a0,-40(s0) + 300174e: 3ce9 jal ra,3001228 + 3001750: 87aa mv a5,a0 + 3001752: 0017c793 xori a5,a5,1 + 3001756: 9f81 uxtb a5 + 3001758: cb91 beqz a5,300176c + 300175a: 6785 lui a5,0x1 + 300175c: 94278593 addi a1,a5,-1726 # 942 + 3001760: 030067b7 lui a5,0x3006 + 3001764: 42878513 addi a0,a5,1064 # 3006428 + 3001768: 28c9 jal ra,300183a + 300176a: a891 j 30017be + ADC_PARAM_CHECK_NO_RET(acqps <= 15); /* The value of acqps ranges from 0 to 15 */ + 300176c: fd442703 lw a4,-44(s0) + 3001770: 47bd li a5,15 + 3001772: 00e7fb63 bgeu a5,a4,3001788 + 3001776: 6785 lui a5,0x1 + 3001778: 94378593 addi a1,a5,-1725 # 943 + 300177c: 030067b7 lui a5,0x3006 + 3001780: 42878513 addi a0,a5,1064 # 3006428 + 3001784: 285d jal ra,300183a + 3001786: a825 j 30017be + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); + 3001788: fd842583 lw a1,-40(s0) + 300178c: fdc42503 lw a0,-36(s0) + 3001790: 3bfd jal ra,300158e + 3001792: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 3001796: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 300179a: fec42783 lw a5,-20(s0) + 300179e: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_samptime_sel = acqps; + 30017a2: fd442783 lw a5,-44(s0) + 30017a6: 8bbd andi a5,a5,15 + 30017a8: 0ff7f693 andi a3,a5,255 + 30017ac: fe842703 lw a4,-24(s0) + 30017b0: 431c lw a5,0(a4) + 30017b2: 8abd andi a3,a3,15 + 30017b4: 0696 slli a3,a3,0x5 + 30017b6: e1f7f793 andi a5,a5,-481 + 30017ba: 8fd5 or a5,a5,a3 + 30017bc: c31c sw a5,0(a4) +} + 30017be: 50b2 lw ra,44(sp) + 30017c0: 5422 lw s0,40(sp) + 30017c2: 6145 addi sp,sp,48 + 30017c4: 8082 ret + +030017c6 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SOCxSoftTrigger(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30017c6: 1101 addi sp,sp,-32 + 30017c8: ce06 sw ra,28(sp) + 30017ca: cc22 sw s0,24(sp) + 30017cc: 1000 addi s0,sp,32 + 30017ce: fea42623 sw a0,-20(s0) + 30017d2: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30017d6: fec42703 lw a4,-20(s0) + 30017da: 180007b7 lui a5,0x18000 + 30017de: 00f70b63 beq a4,a5,30017f4 + 30017e2: 6785 lui a5,0x1 + 30017e4: 95278593 addi a1,a5,-1710 # 952 + 30017e8: 030067b7 lui a5,0x3006 + 30017ec: 42878513 addi a0,a5,1064 # 3006428 + 30017f0: 20a9 jal ra,300183a + 30017f2: a001 j 30017f2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30017f4: fe842503 lw a0,-24(s0) + 30017f8: 3c05 jal ra,3001228 + 30017fa: 87aa mv a5,a0 + 30017fc: 0017c793 xori a5,a5,1 + 3001800: 9f81 uxtb a5 + 3001802: cb91 beqz a5,3001816 + 3001804: 6785 lui a5,0x1 + 3001806: 95378593 addi a1,a5,-1709 # 953 + 300180a: 030067b7 lui a5,0x3006 + 300180e: 42878513 addi a0,a5,1064 # 3006428 + 3001812: 2d71 jal ra,3001eae + 3001814: a839 j 3001832 + adcx->ADC_SOFT_TRIG.reg |= (1U << (unsigned int)socx); + 3001816: fec42783 lw a5,-20(s0) + 300181a: 1607a703 lw a4,352(a5) + 300181e: 4685 li a3,1 + 3001820: fe842783 lw a5,-24(s0) + 3001824: 00f697b3 sll a5,a3,a5 + 3001828: 8f5d or a4,a4,a5 + 300182a: fec42783 lw a5,-20(s0) + 300182e: 16e7a023 sw a4,352(a5) +} + 3001832: 40f2 lw ra,28(sp) + 3001834: 4462 lw s0,24(sp) + 3001836: 6105 addi sp,sp,32 + 3001838: 8082 ret + +0300183a : + 300183a: 6740006f j 3001eae + +0300183e : + * @param adcx ADC register base address. + * @param priorityMode Mode of SOC priority, @ref ADC_PriorityMode. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetPriority(ADC_RegStruct * const adcx, ADC_PriorityMode priorityMode) +{ + 300183e: 1101 addi sp,sp,-32 + 3001840: ce06 sw ra,28(sp) + 3001842: cc22 sw s0,24(sp) + 3001844: 1000 addi s0,sp,32 + 3001846: fea42623 sw a0,-20(s0) + 300184a: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300184e: fec42703 lw a4,-20(s0) + 3001852: 180007b7 lui a5,0x18000 + 3001856: 00f70b63 beq a4,a5,300186c + 300185a: 6785 lui a5,0x1 + 300185c: 96c78593 addi a1,a5,-1684 # 96c + 3001860: 030067b7 lui a5,0x3006 + 3001864: 42878513 addi a0,a5,1064 # 3006428 + 3001868: 2599 jal ra,3001eae + 300186a: a001 j 300186a + ADC_PARAM_CHECK_NO_RET(IsADCPriorityMode(priorityMode)); + 300186c: fe842503 lw a0,-24(s0) + 3001870: 3c25 jal ra,30012a8 + 3001872: 87aa mv a5,a0 + 3001874: 0017c793 xori a5,a5,1 + 3001878: 9f81 uxtb a5 + 300187a: cb91 beqz a5,300188e + 300187c: 6785 lui a5,0x1 + 300187e: 96d78593 addi a1,a5,-1683 # 96d + 3001882: 030067b7 lui a5,0x3006 + 3001886: 42878513 addi a0,a5,1064 # 3006428 + 300188a: 2515 jal ra,3001eae + 300188c: a039 j 300189a + adcx->ADC_ARBT0.reg = priorityMode; + 300188e: fec42783 lw a5,-20(s0) + 3001892: fe842703 lw a4,-24(s0) + 3001896: 20e7a023 sw a4,512(a5) +} + 300189a: 40f2 lw ra,28(sp) + 300189c: 4462 lw s0,24(sp) + 300189e: 6105 addi sp,sp,32 + 30018a0: 8082 ret + +030018a2 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval unsigned int, result. + */ +static inline unsigned int DCL_ADC_ReadSOCxResult(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30018a2: 7179 addi sp,sp,-48 + 30018a4: d606 sw ra,44(sp) + 30018a6: d422 sw s0,40(sp) + 30018a8: 1800 addi s0,sp,48 + 30018aa: fca42e23 sw a0,-36(s0) + 30018ae: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30018b2: fdc42703 lw a4,-36(s0) + 30018b6: 180007b7 lui a5,0x18000 + 30018ba: 00f70b63 beq a4,a5,30018d0 + 30018be: 6785 lui a5,0x1 + 30018c0: a8778593 addi a1,a5,-1401 # a87 + 30018c4: 030067b7 lui a5,0x3006 + 30018c8: 42878513 addi a0,a5,1064 # 3006428 + 30018cc: 23cd jal ra,3001eae + 30018ce: a001 j 30018ce + ADC_ASSERT_PARAM(IsADCSOCx(socx)); + 30018d0: fd842503 lw a0,-40(s0) + 30018d4: 3a91 jal ra,3001228 + 30018d6: 87aa mv a5,a0 + 30018d8: 0017c793 xori a5,a5,1 + 30018dc: 9f81 uxtb a5 + 30018de: cb91 beqz a5,30018f2 + 30018e0: 6785 lui a5,0x1 + 30018e2: a8878593 addi a1,a5,-1400 # a88 + 30018e6: 030067b7 lui a5,0x3006 + 30018ea: 42878513 addi a0,a5,1064 # 3006428 + 30018ee: 23c1 jal ra,3001eae + 30018f0: a001 j 30018f0 + ADC_RESULT0_REG *result; + uintptr_t addr = (uintptr_t)(void *)adcx; + 30018f2: fdc42783 lw a5,-36(s0) + 30018f6: fef42623 sw a5,-20(s0) + /* The address interval of the result register is 4 */ + result = (ADC_RESULT0_REG *)(void *)(addr + 4 * (unsigned int)socx); + 30018fa: fd842783 lw a5,-40(s0) + 30018fe: 00279713 slli a4,a5,0x2 + 3001902: fec42783 lw a5,-20(s0) + 3001906: 97ba add a5,a5,a4 + 3001908: fef42423 sw a5,-24(s0) + return result->reg; + 300190c: fe842783 lw a5,-24(s0) + 3001910: 439c lw a5,0(a5) +} + 3001912: 853e mv a0,a5 + 3001914: 50b2 lw ra,44(sp) + 3001916: 5422 lw s0,40(sp) + 3001918: 6145 addi sp,sp,48 + 300191a: 8082 ret + +0300191c : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300191c: 7179 addi sp,sp,-48 + 300191e: d606 sw ra,44(sp) + 3001920: d422 sw s0,40(sp) + 3001922: 1800 addi s0,sp,48 + 3001924: fca42e23 sw a0,-36(s0) + 3001928: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300192c: fdc42703 lw a4,-36(s0) + 3001930: 180007b7 lui a5,0x18000 + 3001934: 00f70b63 beq a4,a5,300194a + 3001938: 6785 lui a5,0x1 + 300193a: b4678593 addi a1,a5,-1210 # b46 + 300193e: 030067b7 lui a5,0x3006 + 3001942: 42878513 addi a0,a5,1064 # 3006428 + 3001946: 23a5 jal ra,3001eae + 3001948: a001 j 3001948 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300194a: fd842503 lw a0,-40(s0) + 300194e: 38e9 jal ra,3001228 + 3001950: 87aa mv a5,a0 + 3001952: 0017c793 xori a5,a5,1 + 3001956: 9f81 uxtb a5 + 3001958: cb91 beqz a5,300196c + 300195a: 6785 lui a5,0x1 + 300195c: b4778593 addi a1,a5,-1209 # b47 + 3001960: 030067b7 lui a5,0x3006 + 3001964: 42878513 addi a0,a5,1064 # 3006428 + 3001968: 2399 jal ra,3001eae + 300196a: a025 j 3001992 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 300196c: fd842583 lw a1,-40(s0) + 3001970: fdc42503 lw a0,-36(s0) + 3001974: 3929 jal ra,300158e + 3001976: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 300197a: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 300197e: fec42783 lw a5,-20(s0) + 3001982: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_ENABLE; + 3001986: fe842703 lw a4,-24(s0) + 300198a: 431c lw a5,0(a4) + 300198c: 6691 lui a3,0x4 + 300198e: 8fd5 or a5,a5,a3 + 3001990: c31c sw a5,0(a4) +} + 3001992: 50b2 lw ra,44(sp) + 3001994: 5422 lw s0,40(sp) + 3001996: 6145 addi sp,sp,48 + 3001998: 8082 ret + +0300199a : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_DisableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300199a: 7179 addi sp,sp,-48 + 300199c: d606 sw ra,44(sp) + 300199e: d422 sw s0,40(sp) + 30019a0: 1800 addi s0,sp,48 + 30019a2: fca42e23 sw a0,-36(s0) + 30019a6: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30019aa: fdc42703 lw a4,-36(s0) + 30019ae: 180007b7 lui a5,0x18000 + 30019b2: 00f70b63 beq a4,a5,30019c8 + 30019b6: 6785 lui a5,0x1 + 30019b8: b5678593 addi a1,a5,-1194 # b56 + 30019bc: 030067b7 lui a5,0x3006 + 30019c0: 42878513 addi a0,a5,1064 # 3006428 + 30019c4: 21ed jal ra,3001eae + 30019c6: a001 j 30019c6 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30019c8: fd842503 lw a0,-40(s0) + 30019cc: 38b1 jal ra,3001228 + 30019ce: 87aa mv a5,a0 + 30019d0: 0017c793 xori a5,a5,1 + 30019d4: 9f81 uxtb a5 + 30019d6: cb91 beqz a5,30019ea + 30019d8: 6785 lui a5,0x1 + 30019da: b5778593 addi a1,a5,-1193 # b57 + 30019de: 030067b7 lui a5,0x3006 + 30019e2: 42878513 addi a0,a5,1064 # 3006428 + 30019e6: 21e1 jal ra,3001eae + 30019e8: a02d j 3001a12 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 30019ea: fd842583 lw a1,-40(s0) + 30019ee: fdc42503 lw a0,-36(s0) + 30019f2: 3e71 jal ra,300158e + 30019f4: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 30019f8: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30019fc: fec42783 lw a5,-20(s0) + 3001a00: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_DISABLE; + 3001a04: fe842703 lw a4,-24(s0) + 3001a08: 431c lw a5,0(a4) + 3001a0a: 76f1 lui a3,0xffffc + 3001a0c: 16fd addi a3,a3,-1 # ffffbfff + 3001a0e: 8ff5 and a5,a5,a3 + 3001a10: c31c sw a5,0(a4) +} + 3001a12: 50b2 lw ra,44(sp) + 3001a14: 5422 lw s0,40(sp) + 3001a16: 6145 addi sp,sp,48 + 3001a18: 8082 ret + +03001a1a : + * triggered at least 100 us later. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_Init(ADC_Handle *adcHandle) +{ + 3001a1a: 1101 addi sp,sp,-32 + 3001a1c: ce06 sw ra,28(sp) + 3001a1e: cc22 sw s0,24(sp) + 3001a20: 1000 addi s0,sp,32 + 3001a22: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001a26: fec42783 lw a5,-20(s0) + 3001a2a: eb89 bnez a5,3001a3c + 3001a2c: 02c00593 li a1,44 + 3001a30: 030067b7 lui a5,0x3006 + 3001a34: 44478513 addi a0,a5,1092 # 3006444 + 3001a38: 299d jal ra,3001eae + 3001a3a: a001 j 3001a3a + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001a3c: fec42783 lw a5,-20(s0) + 3001a40: 4398 lw a4,0(a5) + 3001a42: 180007b7 lui a5,0x18000 + 3001a46: 00f70a63 beq a4,a5,3001a5a + 3001a4a: 02d00593 li a1,45 + 3001a4e: 030067b7 lui a5,0x3006 + 3001a52: 44478513 addi a0,a5,1092 # 3006444 + 3001a56: 29a1 jal ra,3001eae + 3001a58: a001 j 3001a58 + ADC_PARAM_CHECK_WITH_RET(IsADCPriorityMode(adcHandle->socPriority) == true, BASE_STATUS_ERROR); + 3001a5a: fec42783 lw a5,-20(s0) + 3001a5e: 43dc lw a5,4(a5) + 3001a60: 853e mv a0,a5 + 3001a62: 3099 jal ra,30012a8 + 3001a64: 87aa mv a5,a0 + 3001a66: 0017c793 xori a5,a5,1 + 3001a6a: 9f81 uxtb a5 + 3001a6c: cb91 beqz a5,3001a80 + 3001a6e: 02e00593 li a1,46 + 3001a72: 030067b7 lui a5,0x3006 + 3001a76: 44478513 addi a0,a5,1092 # 3006444 + 3001a7a: 2915 jal ra,3001eae + 3001a7c: 4785 li a5,1 + 3001a7e: a091 j 3001ac2 + DCL_ADC_SOCxSetPriority(adcHandle->baseAddress, adcHandle->socPriority); + 3001a80: fec42783 lw a5,-20(s0) + 3001a84: 4398 lw a4,0(a5) + 3001a86: fec42783 lw a5,-20(s0) + 3001a8a: 43dc lw a5,4(a5) + 3001a8c: 85be mv a1,a5 + 3001a8e: 853a mv a0,a4 + 3001a90: 337d jal ra,300183e + adcHandle->baseAddress->ADC_ANA_CTRL0.BIT.cfg_sar_samp_cap_sel = 0x4; /* Set the Number of Sampling Capacitors */ + 3001a92: fec42783 lw a5,-20(s0) + 3001a96: 4398 lw a4,0(a5) + 3001a98: 65472783 lw a5,1620(a4) + 3001a9c: 100006b7 lui a3,0x10000 + 3001aa0: 16fd addi a3,a3,-1 # fffffff + 3001aa2: 8efd and a3,a3,a5 + 3001aa4: 400007b7 lui a5,0x40000 + 3001aa8: 8fd5 or a5,a5,a3 + 3001aaa: 64f72a23 sw a5,1620(a4) + adcHandle->baseAddress->ADC_EN.reg = BASE_CFG_ENABLE; /* Enable ADC Controller */ + 3001aae: fec42783 lw a5,-20(s0) + 3001ab2: 439c lw a5,0(a5) + 3001ab4: 4705 li a4,1 + 3001ab6: 30e7a023 sw a4,768(a5) # 40000300 + BASE_FUNC_DelayUs(100); /* Wait for 100 us until the ADC controller is stable */ + 3001aba: 06400513 li a0,100 + 3001abe: 2929 jal ra,3001ed8 + return BASE_STATUS_OK; + 3001ac0: 4781 li a5,0 +} + 3001ac2: 853e mv a0,a5 + 3001ac4: 40f2 lw ra,28(sp) + 3001ac6: 4462 lw s0,24(sp) + 3001ac8: 6105 addi sp,sp,32 + 3001aca: 8082 ret + +03001acc : + * @param soc ID of SOC(start of conversion), managing the specific sample inputs. + * @param socParam Param struct of SOC. This is related to the peripheral circuit design, @ref SOC_Param. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_ConfigureSoc(ADC_Handle *adcHandle, ADC_SOCNumber soc, SOC_Param *socParam) +{ + 3001acc: 1101 addi sp,sp,-32 + 3001ace: ce06 sw ra,28(sp) + 3001ad0: cc22 sw s0,24(sp) + 3001ad2: 1000 addi s0,sp,32 + 3001ad4: fea42623 sw a0,-20(s0) + 3001ad8: feb42423 sw a1,-24(s0) + 3001adc: fec42223 sw a2,-28(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001ae0: fec42783 lw a5,-20(s0) + 3001ae4: eb89 bnez a5,3001af6 + 3001ae6: 04c00593 li a1,76 + 3001aea: 030067b7 lui a5,0x3006 + 3001aee: 44478513 addi a0,a5,1092 # 3006444 + 3001af2: 2e75 jal ra,3001eae + 3001af4: a001 j 3001af4 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001af6: fec42783 lw a5,-20(s0) + 3001afa: 4398 lw a4,0(a5) + 3001afc: 180007b7 lui a5,0x18000 + 3001b00: 00f70a63 beq a4,a5,3001b14 + 3001b04: 04d00593 li a1,77 + 3001b08: 030067b7 lui a5,0x3006 + 3001b0c: 44478513 addi a0,a5,1092 # 3006444 + 3001b10: 2e79 jal ra,3001eae + 3001b12: a001 j 3001b12 + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001b14: fe842503 lw a0,-24(s0) + 3001b18: f10ff0ef jal ra,3001228 + 3001b1c: 87aa mv a5,a0 + 3001b1e: 0017c793 xori a5,a5,1 + 3001b22: 9f81 uxtb a5 + 3001b24: cb91 beqz a5,3001b38 + 3001b26: 04e00593 li a1,78 + 3001b2a: 030067b7 lui a5,0x3006 + 3001b2e: 44478513 addi a0,a5,1092 # 3006444 + 3001b32: 2eb5 jal ra,3001eae + 3001b34: 4785 li a5,1 + 3001b36: aa3d j 3001c74 + ADC_ASSERT_PARAM(socParam != NULL); + 3001b38: fe442783 lw a5,-28(s0) + 3001b3c: eb89 bnez a5,3001b4e + 3001b3e: 04f00593 li a1,79 + 3001b42: 030067b7 lui a5,0x3006 + 3001b46: 44478513 addi a0,a5,1092 # 3006444 + 3001b4a: 2695 jal ra,3001eae + 3001b4c: a001 j 3001b4c + ADC_PARAM_CHECK_WITH_RET(IsADCSampleChannel(socParam->adcInput) == true, BASE_STATUS_ERROR); + 3001b4e: fe442783 lw a5,-28(s0) + 3001b52: 439c lw a5,0(a5) + 3001b54: 853e mv a0,a5 + 3001b56: eb6ff0ef jal ra,300120c + 3001b5a: 87aa mv a5,a0 + 3001b5c: 0017c793 xori a5,a5,1 + 3001b60: 9f81 uxtb a5 + 3001b62: cb91 beqz a5,3001b76 + 3001b64: 05000593 li a1,80 + 3001b68: 030067b7 lui a5,0x3006 + 3001b6c: 44478513 addi a0,a5,1092 # 3006444 + 3001b70: 2e3d jal ra,3001eae + 3001b72: 4785 li a5,1 + 3001b74: a201 j 3001c74 + ADC_PARAM_CHECK_WITH_RET(IsADCTotalTime(socParam->sampleTotalTime) == true, BASE_STATUS_ERROR); + 3001b76: fe442783 lw a5,-28(s0) + 3001b7a: 43dc lw a5,4(a5) + 3001b7c: 853e mv a0,a5 + 3001b7e: f48ff0ef jal ra,30012c6 + 3001b82: 87aa mv a5,a0 + 3001b84: 0017c793 xori a5,a5,1 + 3001b88: 9f81 uxtb a5 + 3001b8a: cb91 beqz a5,3001b9e + 3001b8c: 05100593 li a1,81 + 3001b90: 030067b7 lui a5,0x3006 + 3001b94: 44478513 addi a0,a5,1092 # 3006444 + 3001b98: 2e19 jal ra,3001eae + 3001b9a: 4785 li a5,1 + 3001b9c: a8e1 j 3001c74 + ADC_PARAM_CHECK_WITH_RET(IsADCTrigSource(socParam->trigSource) == true, BASE_STATUS_ERROR); + 3001b9e: fe442783 lw a5,-28(s0) + 3001ba2: 479c lw a5,8(a5) + 3001ba4: 853e mv a0,a5 + 3001ba6: ebaff0ef jal ra,3001260 + 3001baa: 87aa mv a5,a0 + 3001bac: 0017c793 xori a5,a5,1 + 3001bb0: 9f81 uxtb a5 + 3001bb2: cb91 beqz a5,3001bc6 + 3001bb4: 05200593 li a1,82 + 3001bb8: 030067b7 lui a5,0x3006 + 3001bbc: 44478513 addi a0,a5,1092 # 3006444 + 3001bc0: 24fd jal ra,3001eae + 3001bc2: 4785 li a5,1 + 3001bc4: a845 j 3001c74 + ADC_PARAM_CHECK_WITH_RET(IsADCFinishMode(socParam->finishMode) == true, BASE_STATUS_ERROR); + 3001bc6: fe442783 lw a5,-28(s0) + 3001bca: 4b9c lw a5,16(a5) + 3001bcc: 853e mv a0,a5 + 3001bce: eaeff0ef jal ra,300127c + 3001bd2: 87aa mv a5,a0 + 3001bd4: 0017c793 xori a5,a5,1 + 3001bd8: 9f81 uxtb a5 + 3001bda: cb91 beqz a5,3001bee + 3001bdc: 05300593 li a1,83 + 3001be0: 030067b7 lui a5,0x3006 + 3001be4: 44478513 addi a0,a5,1092 # 3006444 + 3001be8: 24d9 jal ra,3001eae + 3001bea: 4785 li a5,1 + 3001bec: a061 j 3001c74 + DCL_ADC_SOCxSelectChannel(adcHandle->baseAddress, soc, socParam->adcInput); /* Set channel */ + 3001bee: fec42783 lw a5,-20(s0) + 3001bf2: 4398 lw a4,0(a5) + 3001bf4: fe442783 lw a5,-28(s0) + 3001bf8: 439c lw a5,0(a5) + 3001bfa: 863e mv a2,a5 + 3001bfc: fe842583 lw a1,-24(s0) + 3001c00: 853a mv a0,a4 + 3001c02: 32c9 jal ra,30015c4 + DCL_ADC_SOCxSetAcqps(adcHandle->baseAddress, soc, socParam->sampleTotalTime); /* Set sampling time */ + 3001c04: fec42783 lw a5,-20(s0) + 3001c08: 4398 lw a4,0(a5) + 3001c0a: fe442783 lw a5,-28(s0) + 3001c0e: 43dc lw a5,4(a5) + 3001c10: 863e mv a2,a5 + 3001c12: fe842583 lw a1,-24(s0) + 3001c16: 853a mv a0,a4 + 3001c18: 3601 jal ra,3001718 + DCL_ADC_SOCxSelcetTrigSource(adcHandle->baseAddress, soc, socParam->trigSource); /* Set trigger source */ + 3001c1a: fec42783 lw a5,-20(s0) + 3001c1e: 4398 lw a4,0(a5) + 3001c20: fe442783 lw a5,-28(s0) + 3001c24: 479c lw a5,8(a5) + 3001c26: 863e mv a2,a5 + 3001c28: fe842583 lw a1,-24(s0) + 3001c2c: 853a mv a0,a4 + 3001c2e: 3491 jal ra,3001672 + if (socParam->continueMode == true) { /* Continuous Mode Judgment */ + 3001c30: fe442783 lw a5,-28(s0) + 3001c34: 27dc lbu a5,12(a5) + 3001c36: cb89 beqz a5,3001c48 + DCL_ADC_EnableSOCxContinue(adcHandle->baseAddress, soc); + 3001c38: fec42783 lw a5,-20(s0) + 3001c3c: 439c lw a5,0(a5) + 3001c3e: fe842583 lw a1,-24(s0) + 3001c42: 853e mv a0,a5 + 3001c44: 39e1 jal ra,300191c + 3001c46: a801 j 3001c56 + } else { + DCL_ADC_DisableSOCxContinue(adcHandle->baseAddress, soc); + 3001c48: fec42783 lw a5,-20(s0) + 3001c4c: 439c lw a5,0(a5) + 3001c4e: fe842583 lw a1,-24(s0) + 3001c52: 853e mv a0,a5 + 3001c54: 3399 jal ra,300199a + } + adcHandle->ADC_SOCxParam[soc].finishMode = socParam->finishMode; + 3001c56: fe442783 lw a5,-28(s0) + 3001c5a: 4b9c lw a5,16(a5) + 3001c5c: 01079713 slli a4,a5,0x10 + 3001c60: 8341 srli a4,a4,0x10 + 3001c62: fec42683 lw a3,-20(s0) + 3001c66: fe842783 lw a5,-24(s0) + 3001c6a: 07a1 addi a5,a5,8 + 3001c6c: 0786 slli a5,a5,0x1 + 3001c6e: 97b6 add a5,a5,a3 + 3001c70: a3da sh a4,4(a5) + return BASE_STATUS_OK; + 3001c72: 4781 li a5,0 +} + 3001c74: 853e mv a0,a5 + 3001c76: 40f2 lw ra,28(sp) + 3001c78: 4462 lw s0,24(sp) + 3001c7a: 6105 addi sp,sp,32 + 3001c7c: 8082 ret + +03001c7e : + * interrupt is reported. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_StartIt(ADC_Handle *adcHandle) +{ + 3001c7e: 7179 addi sp,sp,-48 + 3001c80: d606 sw ra,44(sp) + 3001c82: d422 sw s0,40(sp) + 3001c84: 1800 addi s0,sp,48 + 3001c86: fca42e23 sw a0,-36(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001c8a: fdc42783 lw a5,-36(s0) + 3001c8e: eb89 bnez a5,3001ca0 + 3001c90: 0af00593 li a1,175 + 3001c94: 030067b7 lui a5,0x3006 + 3001c98: 44478513 addi a0,a5,1092 # 3006444 + 3001c9c: 2c09 jal ra,3001eae + 3001c9e: a001 j 3001c9e + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001ca0: fdc42783 lw a5,-36(s0) + 3001ca4: 4398 lw a4,0(a5) + 3001ca6: 180007b7 lui a5,0x18000 + 3001caa: 00f70a63 beq a4,a5,3001cbe + 3001cae: 0b000593 li a1,176 + 3001cb2: 030067b7 lui a5,0x3006 + 3001cb6: 44478513 addi a0,a5,1092 # 3006444 + 3001cba: 2ad5 jal ra,3001eae + 3001cbc: a001 j 3001cbc + unsigned int intVal = 0; + 3001cbe: fe042423 sw zero,-24(s0) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001cc2: fe042623 sw zero,-20(s0) + 3001cc6: a859 j 3001d5c + intVal = adcHandle->ADC_SOCxParam[i].finishMode; + 3001cc8: fdc42703 lw a4,-36(s0) + 3001ccc: fec42783 lw a5,-20(s0) + 3001cd0: 07a1 addi a5,a5,8 + 3001cd2: 0786 slli a5,a5,0x1 + 3001cd4: 97ba add a5,a5,a4 + 3001cd6: 23de lhu a5,4(a5) + 3001cd8: fef42423 sw a5,-24(s0) + switch (intVal) { + 3001cdc: fe842783 lw a5,-24(s0) + 3001ce0: 4711 li a4,4 + 3001ce2: 02e78a63 beq a5,a4,3001d16 + 3001ce6: 4711 li a4,4 + 3001ce8: 00f76663 bltu a4,a5,3001cf4 + 3001cec: 470d li a4,3 + 3001cee: 00e78a63 beq a5,a4,3001d02 + break; + case ADC_SOCFINISH_INT3: + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + break; + default: + break; + 3001cf2: a085 j 3001d52 + switch (intVal) { + 3001cf4: 4715 li a4,5 + 3001cf6: 02e78a63 beq a5,a4,3001d2a + 3001cfa: 4719 li a4,6 + 3001cfc: 04e78163 beq a5,a4,3001d3e + break; + 3001d00: a889 j 3001d52 + DCL_ADC_SetSOCxBlindInt0(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 0 */ + 3001d02: fdc42783 lw a5,-36(s0) + 3001d06: 439c lw a5,0(a5) + 3001d08: fec42703 lw a4,-20(s0) + 3001d0c: 85ba mv a1,a4 + 3001d0e: 853e mv a0,a5 + 3001d10: e16ff0ef jal ra,3001326 + break; + 3001d14: a83d j 3001d52 + DCL_ADC_SetSOCxBlindInt1(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 1 */ + 3001d16: fdc42783 lw a5,-36(s0) + 3001d1a: 439c lw a5,0(a5) + 3001d1c: fec42703 lw a4,-20(s0) + 3001d20: 85ba mv a1,a4 + 3001d22: 853e mv a0,a5 + 3001d24: e7eff0ef jal ra,30013a2 + break; + 3001d28: a02d j 3001d52 + DCL_ADC_SetSOCxBlindInt2(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 2 */ + 3001d2a: fdc42783 lw a5,-36(s0) + 3001d2e: 439c lw a5,0(a5) + 3001d30: fec42703 lw a4,-20(s0) + 3001d34: 85ba mv a1,a4 + 3001d36: 853e mv a0,a5 + 3001d38: ee8ff0ef jal ra,3001420 + break; + 3001d3c: a819 j 3001d52 + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + 3001d3e: fdc42783 lw a5,-36(s0) + 3001d42: 439c lw a5,0(a5) + 3001d44: fec42703 lw a4,-20(s0) + 3001d48: 85ba mv a1,a4 + 3001d4a: 853e mv a0,a5 + 3001d4c: f50ff0ef jal ra,300149c + break; + 3001d50: 0001 nop + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001d52: fec42783 lw a5,-20(s0) + 3001d56: 0785 addi a5,a5,1 + 3001d58: fef42623 sw a5,-20(s0) + 3001d5c: fec42703 lw a4,-20(s0) + 3001d60: 47bd li a5,15 + 3001d62: f6e7d3e3 bge a5,a4,3001cc8 + } + } /* Enable ADC Interrupt */ + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER0); + 3001d66: fdc42783 lw a5,-36(s0) + 3001d6a: 439c lw a5,0(a5) + 3001d6c: 4581 li a1,0 + 3001d6e: 853e mv a0,a5 + 3001d70: faaff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER1); + 3001d74: fdc42783 lw a5,-36(s0) + 3001d78: 439c lw a5,0(a5) + 3001d7a: 4585 li a1,1 + 3001d7c: 853e mv a0,a5 + 3001d7e: f9cff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + 3001d82: fdc42783 lw a5,-36(s0) + 3001d86: 439c lw a5,0(a5) + 3001d88: 4589 li a1,2 + 3001d8a: 853e mv a0,a5 + 3001d8c: f8eff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER3); + 3001d90: fdc42783 lw a5,-36(s0) + 3001d94: 439c lw a5,0(a5) + 3001d96: 458d li a1,3 + 3001d98: 853e mv a0,a5 + 3001d9a: f80ff0ef jal ra,300151a + return BASE_STATUS_OK; + 3001d9e: 4781 li a5,0 +} + 3001da0: 853e mv a0,a5 + 3001da2: 50b2 lw ra,44(sp) + 3001da4: 5422 lw s0,40(sp) + 3001da6: 6145 addi sp,sp,48 + 3001da8: 8082 ret + +03001daa : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_SoftTrigSample(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001daa: 1101 addi sp,sp,-32 + 3001dac: ce06 sw ra,28(sp) + 3001dae: cc22 sw s0,24(sp) + 3001db0: 1000 addi s0,sp,32 + 3001db2: fea42623 sw a0,-20(s0) + 3001db6: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001dba: fec42783 lw a5,-20(s0) + 3001dbe: eb89 bnez a5,3001dd0 + 3001dc0: 0e500593 li a1,229 + 3001dc4: 030067b7 lui a5,0x3006 + 3001dc8: 44478513 addi a0,a5,1092 # 3006444 + 3001dcc: 20cd jal ra,3001eae + 3001dce: a001 j 3001dce + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001dd0: fec42783 lw a5,-20(s0) + 3001dd4: 4398 lw a4,0(a5) + 3001dd6: 180007b7 lui a5,0x18000 + 3001dda: 00f70a63 beq a4,a5,3001dee + 3001dde: 0e600593 li a1,230 + 3001de2: 030067b7 lui a5,0x3006 + 3001de6: 44478513 addi a0,a5,1092 # 3006444 + 3001dea: 20d1 jal ra,3001eae + 3001dec: a001 j 3001dec + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001dee: fe842503 lw a0,-24(s0) + 3001df2: c36ff0ef jal ra,3001228 + 3001df6: 87aa mv a5,a0 + 3001df8: 0017c793 xori a5,a5,1 + 3001dfc: 9f81 uxtb a5 + 3001dfe: cb91 beqz a5,3001e12 + 3001e00: 0e700593 li a1,231 + 3001e04: 030067b7 lui a5,0x3006 + 3001e08: 44478513 addi a0,a5,1092 # 3006444 + 3001e0c: 204d jal ra,3001eae + 3001e0e: 4785 li a5,1 + 3001e10: a809 j 3001e22 + DCL_ADC_SOCxSoftTrigger(adcHandle->baseAddress, soc); /* Software triggers a single SOC */ + 3001e12: fec42783 lw a5,-20(s0) + 3001e16: 439c lw a5,0(a5) + 3001e18: fe842583 lw a1,-24(s0) + 3001e1c: 853e mv a0,a5 + 3001e1e: 3265 jal ra,30017c6 + return BASE_STATUS_OK; + 3001e20: 4781 li a5,0 +} + 3001e22: 853e mv a0,a5 + 3001e24: 40f2 lw ra,28(sp) + 3001e26: 4462 lw s0,24(sp) + 3001e28: 6105 addi sp,sp,32 + 3001e2a: 8082 ret + +03001e2c : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval unsigned int value of ADC convert result. + */ +unsigned int HAL_ADC_GetConvResult(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001e2c: 1101 addi sp,sp,-32 + 3001e2e: ce06 sw ra,28(sp) + 3001e30: cc22 sw s0,24(sp) + 3001e32: 1000 addi s0,sp,32 + 3001e34: fea42623 sw a0,-20(s0) + 3001e38: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001e3c: fec42783 lw a5,-20(s0) + 3001e40: eb89 bnez a5,3001e52 + 3001e42: 0f400593 li a1,244 + 3001e46: 030067b7 lui a5,0x3006 + 3001e4a: 44478513 addi a0,a5,1092 # 3006444 + 3001e4e: 2085 jal ra,3001eae + 3001e50: a001 j 3001e50 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001e52: fec42783 lw a5,-20(s0) + 3001e56: 4398 lw a4,0(a5) + 3001e58: 180007b7 lui a5,0x18000 + 3001e5c: 00f70a63 beq a4,a5,3001e70 + 3001e60: 0f500593 li a1,245 + 3001e64: 030067b7 lui a5,0x3006 + 3001e68: 44478513 addi a0,a5,1092 # 3006444 + 3001e6c: 2089 jal ra,3001eae + 3001e6e: a001 j 3001e6e + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001e70: fe842503 lw a0,-24(s0) + 3001e74: bb4ff0ef jal ra,3001228 + 3001e78: 87aa mv a5,a0 + 3001e7a: 0017c793 xori a5,a5,1 + 3001e7e: 9f81 uxtb a5 + 3001e80: cb91 beqz a5,3001e94 + 3001e82: 0f600593 li a1,246 + 3001e86: 030067b7 lui a5,0x3006 + 3001e8a: 44478513 addi a0,a5,1092 # 3006444 + 3001e8e: 2005 jal ra,3001eae + 3001e90: 4785 li a5,1 + 3001e92: a809 j 3001ea4 + return DCL_ADC_ReadSOCxResult(adcHandle->baseAddress, soc); + 3001e94: fec42783 lw a5,-20(s0) + 3001e98: 439c lw a5,0(a5) + 3001e9a: fe842583 lw a1,-24(s0) + 3001e9e: 853e mv a0,a5 + 3001ea0: 3409 jal ra,30018a2 + 3001ea2: 87aa mv a5,a0 +} + 3001ea4: 853e mv a0,a5 + 3001ea6: 40f2 lw ra,28(sp) + 3001ea8: 4462 lw s0,24(sp) + 3001eaa: 6105 addi sp,sp,32 + 3001eac: 8082 ret + +03001eae : + * @param file Pointer to the name of the file where the error occurs. + * @param line Number of the line where the error occurs. + * @retval None. + */ +__weak void AssertErrorLog(char *file, unsigned int line) +{ + 3001eae: 1101 addi sp,sp,-32 + 3001eb0: ce22 sw s0,28(sp) + 3001eb2: 1000 addi s0,sp,32 + 3001eb4: fea42623 sw a0,-20(s0) + 3001eb8: feb42423 sw a1,-24(s0) + /* Use only if the user apllication is not defined. */ + BASE_FUNC_UNUSED(file); + BASE_FUNC_UNUSED(line); + 3001ebc: 0001 nop + 3001ebe: 4472 lw s0,28(sp) + 3001ec0: 6105 addi sp,sp,32 + 3001ec2: 8082 ret + +03001ec4 : + * @brief Get the systick + * @param None + * @retval The SysTick Value + */ +static inline unsigned int DCL_SYSTICK_GetTick(void) +{ + 3001ec4: 1141 addi sp,sp,-16 + 3001ec6: c622 sw s0,12(sp) + 3001ec8: 0800 addi s0,sp,16 + return SYSTICK->MTIME; /* Systick value(Lower 32bit register) */ + 3001eca: 143807b7 lui a5,0x14380 + 3001ece: 479c lw a5,8(a5) +} + 3001ed0: 853e mv a0,a5 + 3001ed2: 4432 lw s0,12(sp) + 3001ed4: 0141 addi sp,sp,16 + 3001ed6: 8082 ret + +03001ed8 : + * @brief Delay number of us. + * @param us The number of us to delay. + * @retval None. + */ +void BASE_FUNC_DelayUs(unsigned int us) +{ + 3001ed8: 7179 addi sp,sp,-48 + 3001eda: d606 sw ra,44(sp) + 3001edc: d422 sw s0,40(sp) + 3001ede: 1800 addi s0,sp,48 + 3001ee0: fca42e23 sw a0,-36(s0) + unsigned int preTick = DCL_SYSTICK_GetTick(); + 3001ee4: 37c5 jal ra,3001ec4 + 3001ee6: fea42623 sw a0,-20(s0) + unsigned int tickInUs = (SYSTICK_GetCRGHZ() / CRG_FREQ_1MHz) * us; + 3001eea: 8bcff0ef jal ra,3000fa6 + 3001eee: 872a mv a4,a0 + 3001ef0: 000f47b7 lui a5,0xf4 + 3001ef4: 24078793 addi a5,a5,576 # f4240 + 3001ef8: 02f757b3 divu a5,a4,a5 + 3001efc: fdc42703 lw a4,-36(s0) + 3001f00: 02f707b3 mul a5,a4,a5 + 3001f04: fef42423 sw a5,-24(s0) + unsigned int curTick; + unsigned int delta; + + /* Wait until the delta is greater than tickInUs */ + do { + curTick = DCL_SYSTICK_GetTick(); + 3001f08: 3f75 jal ra,3001ec4 + 3001f0a: fea42223 sw a0,-28(s0) + delta = (curTick >= preTick) ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick + 1; + 3001f0e: fe442703 lw a4,-28(s0) + 3001f12: fec42783 lw a5,-20(s0) + 3001f16: 40f707b3 sub a5,a4,a5 + 3001f1a: fef42023 sw a5,-32(s0) + } while (delta < tickInUs); + 3001f1e: fe042703 lw a4,-32(s0) + 3001f22: fe842783 lw a5,-24(s0) + 3001f26: fef761e3 bltu a4,a5,3001f08 +} + 3001f2a: 0001 nop + 3001f2c: 50b2 lw ra,44(sp) + 3001f2e: 5422 lw s0,40(sp) + 3001f30: 6145 addi sp,sp,48 + 3001f32: 8082 ret + +03001f34 : + * @brief Delay number of ms. + * @param ms The number of ms to delay. + * @retval None. + */ +void BASE_FUNC_DelayMs(unsigned int ms) +{ + 3001f34: 7179 addi sp,sp,-48 + 3001f36: d606 sw ra,44(sp) + 3001f38: d422 sw s0,40(sp) + 3001f3a: 1800 addi s0,sp,48 + 3001f3c: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < ms; ++i) { + 3001f40: fe042623 sw zero,-20(s0) + 3001f44: a809 j 3001f56 + BASE_FUNC_DelayUs(BASE_DEFINE_DELAY_US_IN_MS); + 3001f46: 3e800513 li a0,1000 + 3001f4a: 3779 jal ra,3001ed8 + for (unsigned int i = 0; i < ms; ++i) { + 3001f4c: fec42783 lw a5,-20(s0) + 3001f50: 0785 addi a5,a5,1 + 3001f52: fef42623 sw a5,-20(s0) + 3001f56: fec42703 lw a4,-20(s0) + 3001f5a: fdc42783 lw a5,-36(s0) + 3001f5e: fef764e3 bltu a4,a5,3001f46 + } +} + 3001f62: 0001 nop + 3001f64: 50b2 lw ra,44(sp) + 3001f66: 5422 lw s0,40(sp) + 3001f68: 6145 addi sp,sp,48 + 3001f6a: 8082 ret + +03001f6c : + * @brief Delay number of seconds. + * @param seconds The number of seconds to delay. + * @retval None. + */ +void BASE_FUNC_DelaySeconds(unsigned int seconds) +{ + 3001f6c: 7179 addi sp,sp,-48 + 3001f6e: d606 sw ra,44(sp) + 3001f70: d422 sw s0,40(sp) + 3001f72: 1800 addi s0,sp,48 + 3001f74: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < seconds; ++i) { + 3001f78: fe042623 sw zero,-20(s0) + 3001f7c: a809 j 3001f8e + BASE_FUNC_DelayMs(BASE_DEFINE_DELAY_MS_IN_SEC); + 3001f7e: 3e800513 li a0,1000 + 3001f82: 3f4d jal ra,3001f34 + for (unsigned int i = 0; i < seconds; ++i) { + 3001f84: fec42783 lw a5,-20(s0) + 3001f88: 0785 addi a5,a5,1 + 3001f8a: fef42623 sw a5,-20(s0) + 3001f8e: fec42703 lw a4,-20(s0) + 3001f92: fdc42783 lw a5,-36(s0) + 3001f96: fef764e3 bltu a4,a5,3001f7e + } +} + 3001f9a: 0001 nop + 3001f9c: 50b2 lw ra,44(sp) + 3001f9e: 5422 lw s0,40(sp) + 3001fa0: 6145 addi sp,sp,48 + 3001fa2: 8082 ret + +03001fa4 : + * @param delay The number of 'units' to delay. + * @param units Specifies the delay unit. + * @retval None. + */ +void BASE_FUNC_Delay(unsigned int delay, BASE_DelayUnit units) +{ + 3001fa4: 1101 addi sp,sp,-32 + 3001fa6: ce06 sw ra,28(sp) + 3001fa8: cc22 sw s0,24(sp) + 3001faa: 1000 addi s0,sp,32 + 3001fac: fea42623 sw a0,-20(s0) + 3001fb0: feb42423 sw a1,-24(s0) + switch (units) { + 3001fb4: fe842783 lw a5,-24(s0) + 3001fb8: 3e800713 li a4,1000 + 3001fbc: 02e78063 beq a5,a4,3001fdc + 3001fc0: 000f4737 lui a4,0xf4 + 3001fc4: 24070713 addi a4,a4,576 # f4240 + 3001fc8: 00e78e63 beq a5,a4,3001fe4 + 3001fcc: 4705 li a4,1 + 3001fce: 00e78363 beq a5,a4,3001fd4 + break; + case BASE_DEFINE_DELAY_MICROSECS: + BASE_FUNC_DelayUs(delay); + break; + default: + break; + 3001fd2: a829 j 3001fec + BASE_FUNC_DelaySeconds(delay); + 3001fd4: fec42503 lw a0,-20(s0) + 3001fd8: 3f51 jal ra,3001f6c + break; + 3001fda: a809 j 3001fec + BASE_FUNC_DelayMs(delay); + 3001fdc: fec42503 lw a0,-20(s0) + 3001fe0: 3f91 jal ra,3001f34 + break; + 3001fe2: a029 j 3001fec + BASE_FUNC_DelayUs(delay); + 3001fe4: fec42503 lw a0,-20(s0) + 3001fe8: 3dc5 jal ra,3001ed8 + break; + 3001fea: 0001 nop + } + return; + 3001fec: 0001 nop + 3001fee: 40f2 lw ra,28(sp) + 3001ff0: 4462 lw s0,24(sp) + 3001ff2: 6105 addi sp,sp,32 + 3001ff4: 8082 ret + +03001ff6 : + * @brief Clear external interrupt + * @param irqNum external interrupt number + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_NOT_CREATED + */ +static inline void IRQ_ClearN(unsigned int irqNum) +{ + 3001ff6: 1101 addi sp,sp,-32 + 3001ff8: ce22 sw s0,28(sp) + 3001ffa: 1000 addi s0,sp,32 + 3001ffc: fea42623 sw a0,-20(s0) + asm volatile("fence"); + 3002000: 0ff0000f fence + WRITE_CUSTOM_CSR_VAL(LOCIPCLR, irqNum); + 3002004: fec42783 lw a5,-20(s0) + 3002008: 82be mv t0,a5 + 300200a: bf029073 csrw 0xbf0,t0 +} + 300200e: 0001 nop + 3002010: 4472 lw s0,28(sp) + 3002012: 6105 addi sp,sp,32 + 3002014: 8082 ret + +03002016 : + * @brief Exception/Interrupt Handler Entry. + * @param irqNum external interrupt number. + * @retval None + */ +void InterruptEntry(unsigned int irqNum) +{ + 3002016: 1101 addi sp,sp,-32 + 3002018: ce06 sw ra,28(sp) + 300201a: cc22 sw s0,24(sp) + 300201c: 1000 addi s0,sp,32 + 300201e: fea42623 sw a0,-20(s0) + g_irqCallbackFunc[irqNum].pfnHandler(g_irqCallbackFunc[irqNum].param); + 3002022: 040007b7 lui a5,0x4000 + 3002026: 0fc78713 addi a4,a5,252 # 40000fc + 300202a: fec42783 lw a5,-20(s0) + 300202e: 078e slli a5,a5,0x3 + 3002030: 97ba add a5,a5,a4 + 3002032: 4394 lw a3,0(a5) + 3002034: 040007b7 lui a5,0x4000 + 3002038: 0fc78713 addi a4,a5,252 # 40000fc + 300203c: fec42783 lw a5,-20(s0) + 3002040: 078e slli a5,a5,0x3 + 3002042: 97ba add a5,a5,a4 + 3002044: 43dc lw a5,4(a5) + 3002046: 853e mv a0,a5 + 3002048: 9682 jalr a3 + IRQ_ClearN(irqNum); + 300204a: fec42503 lw a0,-20(s0) + 300204e: 3765 jal ra,3001ff6 +} + 3002050: 0001 nop + 3002052: 40f2 lw ra,28(sp) + 3002054: 4462 lw s0,24(sp) + 3002056: 6105 addi sp,sp,32 + 3002058: 8082 ret + +0300205a : + * @brief Irq initialization. + * @param none. + * @retval None + */ +void IRQ_Init(void) +{ + 300205a: 1101 addi sp,sp,-32 + 300205c: ce22 sw s0,28(sp) + 300205e: 1000 addi s0,sp,32 + unsigned int index; + + for (index = 0; index < IRQ_MAX; index++) { + 3002060: fe042623 sw zero,-20(s0) + 3002064: a82d j 300209e + g_irqCallbackFunc[index].pfnHandler = IRQ_DummyHandler; + 3002066: 040007b7 lui a5,0x4000 + 300206a: 0fc78713 addi a4,a5,252 # 40000fc + 300206e: fec42783 lw a5,-20(s0) + 3002072: 078e slli a5,a5,0x3 + 3002074: 97ba add a5,a5,a4 + 3002076: 03003737 lui a4,0x3003 + 300207a: 8fa70713 addi a4,a4,-1798 # 30028fa + 300207e: c398 sw a4,0(a5) + g_irqCallbackFunc[index].param = NULL; + 3002080: 040007b7 lui a5,0x4000 + 3002084: 0fc78713 addi a4,a5,252 # 40000fc + 3002088: fec42783 lw a5,-20(s0) + 300208c: 078e slli a5,a5,0x3 + 300208e: 97ba add a5,a5,a4 + 3002090: 0007a223 sw zero,4(a5) + for (index = 0; index < IRQ_MAX; index++) { + 3002094: fec42783 lw a5,-20(s0) + 3002098: 0785 addi a5,a5,1 + 300209a: fef42623 sw a5,-20(s0) + 300209e: fec42703 lw a4,-20(s0) + 30020a2: 07200793 li a5,114 + 30020a6: fce7f0e3 bgeu a5,a4,3002066 + } +} + 30020aa: 0001 nop + 30020ac: 4472 lw s0,28(sp) + 30020ae: 6105 addi sp,sp,32 + 30020b0: 8082 ret + +030020b2 : + * @note In the corresponding interrupt handler, manually clear the interrupt source and the corresponding interrupt + * flag bit (call the IRQ_ClearN function to clear the interrupt), otherwise the interrupt will always be + * triggered. + */ +unsigned int IRQ_Register(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 30020b2: 1101 addi sp,sp,-32 + 30020b4: ce06 sw ra,28(sp) + 30020b6: cc22 sw s0,24(sp) + 30020b8: 1000 addi s0,sp,32 + 30020ba: fea42623 sw a0,-20(s0) + 30020be: feb42423 sw a1,-24(s0) + 30020c2: fec42223 sw a2,-28(s0) + INTERRUPT_ASSERT_PARAM(func != NULL); + 30020c6: fe842783 lw a5,-24(s0) + 30020ca: eb89 bnez a5,30020dc + 30020cc: 06300593 li a1,99 + 30020d0: 030067b7 lui a5,0x3006 + 30020d4: 47878513 addi a0,a5,1144 # 3006478 + 30020d8: 3bd9 jal ra,3001eae + 30020da: a001 j 30020da + INTERRUPT_PARAM_CHECK_WITH_RET(irqNum < IRQ_MAX, IRQ_ERRNO_NUM_INVALID); + 30020dc: fec42703 lw a4,-20(s0) + 30020e0: 07200793 li a5,114 + 30020e4: 00e7fb63 bgeu a5,a4,30020fa + 30020e8: 06400593 li a1,100 + 30020ec: 030067b7 lui a5,0x3006 + 30020f0: 47878513 addi a0,a5,1144 # 3006478 + 30020f4: 3b6d jal ra,3001eae + 30020f6: 4789 li a5,2 + 30020f8: a81d j 300212e + + if (g_irqCallbackFunc[irqNum].pfnHandler != IRQ_DummyHandler) { + 30020fa: 040007b7 lui a5,0x4000 + 30020fe: 0fc78713 addi a4,a5,252 # 40000fc + 3002102: fec42783 lw a5,-20(s0) + 3002106: 078e slli a5,a5,0x3 + 3002108: 97ba add a5,a5,a4 + 300210a: 4398 lw a4,0(a5) + 300210c: 030037b7 lui a5,0x3003 + 3002110: 8fa78793 addi a5,a5,-1798 # 30028fa + 3002114: 00f70463 beq a4,a5,300211c + return IRQ_ERRNO_ALREADY_CREATED; + 3002118: 478d li a5,3 + 300211a: a811 j 300212e + } + IRQ_SetCallBack(irqNum, func, arg); + 300211c: fe442603 lw a2,-28(s0) + 3002120: fe842583 lw a1,-24(s0) + 3002124: fec42503 lw a0,-20(s0) + 3002128: 7e4000ef jal ra,300290c + return BASE_STATUS_OK; + 300212c: 4781 li a5,0 +} + 300212e: 853e mv a0,a5 + 3002130: 40f2 lw ra,28(sp) + 3002132: 4462 lw s0,24(sp) + 3002134: 6105 addi sp,sp,32 + 3002136: 8082 ret + +03002138 : + * @brief Enable the specified interrupt. + * @param irqNum External interrupt number. + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID. + */ +unsigned int IRQ_EnableN(unsigned int irqNum) +{ + 3002138: 7139 addi sp,sp,-64 + 300213a: de06 sw ra,60(sp) + 300213c: dc22 sw s0,56(sp) + 300213e: 0080 addi s0,sp,64 + 3002140: fca42623 sw a0,-52(s0) + unsigned int locienVal; +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 3002144: fcc42703 lw a4,-52(s0) + 3002148: 47e5 li a5,25 + 300214a: 00e7f863 bgeu a5,a4,300215a + 300214e: fcc42703 lw a4,-52(s0) + 3002152: 07200793 li a5,114 + 3002156: 00e7fb63 bgeu a5,a4,300216c + 300215a: 0c300593 li a1,195 + 300215e: 030067b7 lui a5,0x3006 + 3002162: 47878513 addi a0,a5,1144 # 3006478 + 3002166: 33a1 jal ra,3001eae + 3002168: 4789 li a5,2 + 300216a: a8cd j 300225c + /* The interrupt enable bits that can be controlled in the mie register (32 bits), up to 32 + can be controlled, and each bit corresponds to an interrupt enable */ + + RISCV_PRIV_MODE_SWITCH(priv); + + if (irqNum < IRQ_MIE_TOTAL_CNT) { + 300216c: fcc42703 lw a4,-52(s0) + 3002170: 47fd li a5,31 + 3002172: 02e7e063 bltu a5,a4,3002192 + irqOrder = 1U << irqNum; + 3002176: 4705 li a4,1 + 3002178: fcc42783 lw a5,-52(s0) + 300217c: 00f717b3 sll a5,a4,a5 + 3002180: fef42623 sw a5,-20(s0) + SET_CSR(mie, irqOrder); + 3002184: fec42783 lw a5,-20(s0) + 3002188: 3047a7f3 csrrs a5,mie,a5 + 300218c: fcf42c23 sw a5,-40(s0) + 3002190: a0e9 j 300225a + } else if (irqNum < IRQ_LOCIEN1_OFFSET) { + 3002192: fcc42703 lw a4,-52(s0) + 3002196: 03f00793 li a5,63 + 300219a: 02e7ef63 bltu a5,a4,30021d8 + irqOrder = irqNum - IRQ_MIE_TOTAL_CNT; + 300219e: fcc42783 lw a5,-52(s0) + 30021a2: 1781 addi a5,a5,-32 + 30021a4: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN0); + 30021a8: be0027f3 csrr a5,0xbe0 + 30021ac: fcf42e23 sw a5,-36(s0) + 30021b0: fdc42783 lw a5,-36(s0) + 30021b4: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 30021b8: 4705 li a4,1 + 30021ba: fec42783 lw a5,-20(s0) + 30021be: 00f717b3 sll a5,a4,a5 + 30021c2: fe442703 lw a4,-28(s0) + 30021c6: 8fd9 or a5,a5,a4 + 30021c8: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN0, locienVal); + 30021cc: fe442783 lw a5,-28(s0) + 30021d0: 82be mv t0,a5 + 30021d2: be029073 csrw 0xbe0,t0 + 30021d6: a051 j 300225a + } else if (irqNum < IRQ_LOCIEN2_OFFSET) { + 30021d8: fcc42703 lw a4,-52(s0) + 30021dc: 05f00793 li a5,95 + 30021e0: 04e7e063 bltu a5,a4,3002220 + irqOrder = irqNum - IRQ_LOCIEN1_OFFSET; + 30021e4: fcc42783 lw a5,-52(s0) + 30021e8: fc078793 addi a5,a5,-64 + 30021ec: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN1); + 30021f0: be1027f3 csrr a5,0xbe1 + 30021f4: fef42023 sw a5,-32(s0) + 30021f8: fe042783 lw a5,-32(s0) + 30021fc: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 3002200: 4705 li a4,1 + 3002202: fec42783 lw a5,-20(s0) + 3002206: 00f717b3 sll a5,a4,a5 + 300220a: fe442703 lw a4,-28(s0) + 300220e: 8fd9 or a5,a5,a4 + 3002210: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN1, locienVal); + 3002214: fe442783 lw a5,-28(s0) + 3002218: 82be mv t0,a5 + 300221a: be129073 csrw 0xbe1,t0 + 300221e: a835 j 300225a + } else { + irqOrder = irqNum - IRQ_LOCIEN2_OFFSET; + 3002220: fcc42783 lw a5,-52(s0) + 3002224: fa078793 addi a5,a5,-96 + 3002228: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN2); + 300222c: be2027f3 csrr a5,0xbe2 + 3002230: fef42423 sw a5,-24(s0) + 3002234: fe842783 lw a5,-24(s0) + 3002238: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 300223c: 4705 li a4,1 + 300223e: fec42783 lw a5,-20(s0) + 3002242: 00f717b3 sll a5,a4,a5 + 3002246: fe442703 lw a4,-28(s0) + 300224a: 8fd9 or a5,a5,a4 + 300224c: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN2, locienVal); + 3002250: fe442783 lw a5,-28(s0) + 3002254: 82be mv t0,a5 + 3002256: be229073 csrw 0xbe2,t0 + } + + RISCV_PRIV_MODE_SWITCH(priv); + + return BASE_STATUS_OK; + 300225a: 4781 li a5,0 +} + 300225c: 853e mv a0,a5 + 300225e: 50f2 lw ra,60(sp) + 3002260: 5462 lw s0,56(sp) + 3002262: 6121 addi sp,sp,64 + 3002264: 8082 ret + +03002266 : + * @param context. + * @note The actual code is generated by IDE + * @retval None. + */ +__weak void SysErrPrint(const SyserrContext *context) +{ + 3002266: 1101 addi sp,sp,-32 + 3002268: ce22 sw s0,28(sp) + 300226a: 1000 addi s0,sp,32 + 300226c: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(context); +} + 3002270: 0001 nop + 3002272: 4472 lw s0,28(sp) + 3002274: 6105 addi sp,sp,32 + 3002276: 8082 ret + +03002278 : + * @brief System error completion processing + * @param None. + * @retval None. + */ +static void SysErrFinish(void) +{ + 3002278: 1141 addi sp,sp,-16 + 300227a: c622 sw s0,12(sp) + 300227c: 0800 addi s0,sp,16 +} + 300227e: 0001 nop + 3002280: 4432 lw s0,12(sp) + 3002282: 0141 addi sp,sp,16 + 3002284: 8082 ret + +03002286 : + * @brief Exception Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrExcEntry(const SyserrContext *context) +{ + 3002286: 1101 addi sp,sp,-32 + 3002288: ce06 sw ra,28(sp) + 300228a: cc22 sw s0,24(sp) + 300228c: 1000 addi s0,sp,32 + 300228e: fea42623 sw a0,-20(s0) + SysErrPrint(context); + 3002292: fec42503 lw a0,-20(s0) + 3002296: 3fc1 jal ra,3002266 + SysErrFinish(); + 3002298: 37c5 jal ra,3002278 +} + 300229a: 0001 nop + 300229c: 40f2 lw ra,28(sp) + 300229e: 4462 lw s0,24(sp) + 30022a0: 6105 addi sp,sp,32 + 30022a2: 8082 ret + +030022a4 : + * @brief NMI Interrupt Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrNmiEntry(const SyserrContext *context) +{ + 30022a4: 1101 addi sp,sp,-32 + 30022a6: ce06 sw ra,28(sp) + 30022a8: cc22 sw s0,24(sp) + 30022aa: 1000 addi s0,sp,32 + 30022ac: fea42623 sw a0,-20(s0) + INTERRUPT_ASSERT_PARAM(context != NULL); + 30022b0: fec42783 lw a5,-20(s0) + 30022b4: eb89 bnez a5,30022c6 + 30022b6: 12d00593 li a1,301 + 30022ba: 030067b7 lui a5,0x3006 + 30022be: 47878513 addi a0,a5,1144 # 3006478 + 30022c2: 36f5 jal ra,3001eae + 30022c4: a001 j 30022c4 + SysErrPrint(context); + 30022c6: fec42503 lw a0,-20(s0) + 30022ca: 3f71 jal ra,3002266 + SysErrFinish(); + 30022cc: 3775 jal ra,3002278 +} + 30022ce: 0001 nop + 30022d0: 40f2 lw ra,28(sp) + 30022d2: 4462 lw s0,24(sp) + 30022d4: 6105 addi sp,sp,32 + 30022d6: 8082 ret + +030022d8 : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior local int prioroty. + * @retval None + */ +static void SetLocalIntNumPri(unsigned int intNum, unsigned int interPriNum, unsigned int prior) +{ + 30022d8: 711d addi sp,sp,-96 + 30022da: cea2 sw s0,92(sp) + 30022dc: 1080 addi s0,sp,96 + 30022de: faa42623 sw a0,-84(s0) + 30022e2: fab42423 sw a1,-88(s0) + 30022e6: fac42223 sw a2,-92(s0) + switch (intNum) { + 30022ea: fac42783 lw a5,-84(s0) + 30022ee: 17e1 addi a5,a5,-8 + 30022f0: 471d li a4,7 + 30022f2: 2af76363 bltu a4,a5,3002598 + 30022f6: 00279713 slli a4,a5,0x2 + 30022fa: 030067b7 lui a5,0x3006 + 30022fe: 49878793 addi a5,a5,1176 # 3006498 + 3002302: 97ba add a5,a5,a4 + 3002304: 439c lw a5,0(a5) + 3002306: 8782 jr a5 + case 8: /* GROUP8 */ + SET_LOCAL_INTER_NUM_PRI(8, interPriNum, prior); + 3002308: bc8027f3 csrr a5,0xbc8 + 300230c: faf42a23 sw a5,-76(s0) + 3002310: fb442783 lw a5,-76(s0) + 3002314: faf42823 sw a5,-80(s0) + 3002318: fa842783 lw a5,-88(s0) + 300231c: 078a slli a5,a5,0x2 + 300231e: 8bf1 andi a5,a5,28 + 3002320: 473d li a4,15 + 3002322: 00f717b3 sll a5,a4,a5 + 3002326: fff7c793 not a5,a5 + 300232a: fb042703 lw a4,-80(s0) + 300232e: 8ff9 and a5,a5,a4 + 3002330: faf42823 sw a5,-80(s0) + 3002334: fa842783 lw a5,-88(s0) + 3002338: 078a slli a5,a5,0x2 + 300233a: 8bf1 andi a5,a5,28 + 300233c: fa442703 lw a4,-92(s0) + 3002340: 00f717b3 sll a5,a4,a5 + 3002344: fb042703 lw a4,-80(s0) + 3002348: 8fd9 or a5,a5,a4 + 300234a: faf42823 sw a5,-80(s0) + 300234e: fb042783 lw a5,-80(s0) + 3002352: 82be mv t0,a5 + 3002354: bc829073 csrw 0xbc8,t0 + break; + 3002358: a489 j 300259a + case 9: /* GROUP9 */ + SET_LOCAL_INTER_NUM_PRI(9, interPriNum, prior); + 300235a: bc9027f3 csrr a5,0xbc9 + 300235e: faf42e23 sw a5,-68(s0) + 3002362: fbc42783 lw a5,-68(s0) + 3002366: faf42c23 sw a5,-72(s0) + 300236a: fa842783 lw a5,-88(s0) + 300236e: 078a slli a5,a5,0x2 + 3002370: 8bf1 andi a5,a5,28 + 3002372: 473d li a4,15 + 3002374: 00f717b3 sll a5,a4,a5 + 3002378: fff7c793 not a5,a5 + 300237c: fb842703 lw a4,-72(s0) + 3002380: 8ff9 and a5,a5,a4 + 3002382: faf42c23 sw a5,-72(s0) + 3002386: fa842783 lw a5,-88(s0) + 300238a: 078a slli a5,a5,0x2 + 300238c: 8bf1 andi a5,a5,28 + 300238e: fa442703 lw a4,-92(s0) + 3002392: 00f717b3 sll a5,a4,a5 + 3002396: fb842703 lw a4,-72(s0) + 300239a: 8fd9 or a5,a5,a4 + 300239c: faf42c23 sw a5,-72(s0) + 30023a0: fb842783 lw a5,-72(s0) + 30023a4: 82be mv t0,a5 + 30023a6: bc929073 csrw 0xbc9,t0 + break; + 30023aa: aac5 j 300259a + case 10: /* GROUP10 */ + SET_LOCAL_INTER_NUM_PRI(10, interPriNum, prior); + 30023ac: bca027f3 csrr a5,0xbca + 30023b0: fcf42223 sw a5,-60(s0) + 30023b4: fc442783 lw a5,-60(s0) + 30023b8: fcf42023 sw a5,-64(s0) + 30023bc: fa842783 lw a5,-88(s0) + 30023c0: 078a slli a5,a5,0x2 + 30023c2: 8bf1 andi a5,a5,28 + 30023c4: 473d li a4,15 + 30023c6: 00f717b3 sll a5,a4,a5 + 30023ca: fff7c793 not a5,a5 + 30023ce: fc042703 lw a4,-64(s0) + 30023d2: 8ff9 and a5,a5,a4 + 30023d4: fcf42023 sw a5,-64(s0) + 30023d8: fa842783 lw a5,-88(s0) + 30023dc: 078a slli a5,a5,0x2 + 30023de: 8bf1 andi a5,a5,28 + 30023e0: fa442703 lw a4,-92(s0) + 30023e4: 00f717b3 sll a5,a4,a5 + 30023e8: fc042703 lw a4,-64(s0) + 30023ec: 8fd9 or a5,a5,a4 + 30023ee: fcf42023 sw a5,-64(s0) + 30023f2: fc042783 lw a5,-64(s0) + 30023f6: 82be mv t0,a5 + 30023f8: bca29073 csrw 0xbca,t0 + break; + 30023fc: aa79 j 300259a + case 11: /* GROUP11 */ + SET_LOCAL_INTER_NUM_PRI(11, interPriNum, prior); + 30023fe: bcb027f3 csrr a5,0xbcb + 3002402: fcf42623 sw a5,-52(s0) + 3002406: fcc42783 lw a5,-52(s0) + 300240a: fcf42423 sw a5,-56(s0) + 300240e: fa842783 lw a5,-88(s0) + 3002412: 078a slli a5,a5,0x2 + 3002414: 8bf1 andi a5,a5,28 + 3002416: 473d li a4,15 + 3002418: 00f717b3 sll a5,a4,a5 + 300241c: fff7c793 not a5,a5 + 3002420: fc842703 lw a4,-56(s0) + 3002424: 8ff9 and a5,a5,a4 + 3002426: fcf42423 sw a5,-56(s0) + 300242a: fa842783 lw a5,-88(s0) + 300242e: 078a slli a5,a5,0x2 + 3002430: 8bf1 andi a5,a5,28 + 3002432: fa442703 lw a4,-92(s0) + 3002436: 00f717b3 sll a5,a4,a5 + 300243a: fc842703 lw a4,-56(s0) + 300243e: 8fd9 or a5,a5,a4 + 3002440: fcf42423 sw a5,-56(s0) + 3002444: fc842783 lw a5,-56(s0) + 3002448: 82be mv t0,a5 + 300244a: bcb29073 csrw 0xbcb,t0 + break; + 300244e: a2b1 j 300259a + case 12: /* GROUP12 */ + SET_LOCAL_INTER_NUM_PRI(12, interPriNum, prior); + 3002450: bcc027f3 csrr a5,0xbcc + 3002454: fcf42a23 sw a5,-44(s0) + 3002458: fd442783 lw a5,-44(s0) + 300245c: fcf42823 sw a5,-48(s0) + 3002460: fa842783 lw a5,-88(s0) + 3002464: 078a slli a5,a5,0x2 + 3002466: 8bf1 andi a5,a5,28 + 3002468: 473d li a4,15 + 300246a: 00f717b3 sll a5,a4,a5 + 300246e: fff7c793 not a5,a5 + 3002472: fd042703 lw a4,-48(s0) + 3002476: 8ff9 and a5,a5,a4 + 3002478: fcf42823 sw a5,-48(s0) + 300247c: fa842783 lw a5,-88(s0) + 3002480: 078a slli a5,a5,0x2 + 3002482: 8bf1 andi a5,a5,28 + 3002484: fa442703 lw a4,-92(s0) + 3002488: 00f717b3 sll a5,a4,a5 + 300248c: fd042703 lw a4,-48(s0) + 3002490: 8fd9 or a5,a5,a4 + 3002492: fcf42823 sw a5,-48(s0) + 3002496: fd042783 lw a5,-48(s0) + 300249a: 82be mv t0,a5 + 300249c: bcc29073 csrw 0xbcc,t0 + break; + 30024a0: a8ed j 300259a + case 13: /* GROUP13 */ + SET_LOCAL_INTER_NUM_PRI(13, interPriNum, prior); + 30024a2: bcd027f3 csrr a5,0xbcd + 30024a6: fcf42e23 sw a5,-36(s0) + 30024aa: fdc42783 lw a5,-36(s0) + 30024ae: fcf42c23 sw a5,-40(s0) + 30024b2: fa842783 lw a5,-88(s0) + 30024b6: 078a slli a5,a5,0x2 + 30024b8: 8bf1 andi a5,a5,28 + 30024ba: 473d li a4,15 + 30024bc: 00f717b3 sll a5,a4,a5 + 30024c0: fff7c793 not a5,a5 + 30024c4: fd842703 lw a4,-40(s0) + 30024c8: 8ff9 and a5,a5,a4 + 30024ca: fcf42c23 sw a5,-40(s0) + 30024ce: fa842783 lw a5,-88(s0) + 30024d2: 078a slli a5,a5,0x2 + 30024d4: 8bf1 andi a5,a5,28 + 30024d6: fa442703 lw a4,-92(s0) + 30024da: 00f717b3 sll a5,a4,a5 + 30024de: fd842703 lw a4,-40(s0) + 30024e2: 8fd9 or a5,a5,a4 + 30024e4: fcf42c23 sw a5,-40(s0) + 30024e8: fd842783 lw a5,-40(s0) + 30024ec: 82be mv t0,a5 + 30024ee: bcd29073 csrw 0xbcd,t0 + break; + 30024f2: a065 j 300259a + case 14: /* GROUP14 */ + SET_LOCAL_INTER_NUM_PRI(14, interPriNum, prior); + 30024f4: bce027f3 csrr a5,0xbce + 30024f8: fef42223 sw a5,-28(s0) + 30024fc: fe442783 lw a5,-28(s0) + 3002500: fef42023 sw a5,-32(s0) + 3002504: fa842783 lw a5,-88(s0) + 3002508: 078a slli a5,a5,0x2 + 300250a: 8bf1 andi a5,a5,28 + 300250c: 473d li a4,15 + 300250e: 00f717b3 sll a5,a4,a5 + 3002512: fff7c793 not a5,a5 + 3002516: fe042703 lw a4,-32(s0) + 300251a: 8ff9 and a5,a5,a4 + 300251c: fef42023 sw a5,-32(s0) + 3002520: fa842783 lw a5,-88(s0) + 3002524: 078a slli a5,a5,0x2 + 3002526: 8bf1 andi a5,a5,28 + 3002528: fa442703 lw a4,-92(s0) + 300252c: 00f717b3 sll a5,a4,a5 + 3002530: fe042703 lw a4,-32(s0) + 3002534: 8fd9 or a5,a5,a4 + 3002536: fef42023 sw a5,-32(s0) + 300253a: fe042783 lw a5,-32(s0) + 300253e: 82be mv t0,a5 + 3002540: bce29073 csrw 0xbce,t0 + break; + 3002544: a899 j 300259a + case 15: /* GROUP15 */ + SET_LOCAL_INTER_NUM_PRI(15, interPriNum, prior); + 3002546: bcf027f3 csrr a5,0xbcf + 300254a: fef42623 sw a5,-20(s0) + 300254e: fec42783 lw a5,-20(s0) + 3002552: fef42423 sw a5,-24(s0) + 3002556: fa842783 lw a5,-88(s0) + 300255a: 078a slli a5,a5,0x2 + 300255c: 8bf1 andi a5,a5,28 + 300255e: 473d li a4,15 + 3002560: 00f717b3 sll a5,a4,a5 + 3002564: fff7c793 not a5,a5 + 3002568: fe842703 lw a4,-24(s0) + 300256c: 8ff9 and a5,a5,a4 + 300256e: fef42423 sw a5,-24(s0) + 3002572: fa842783 lw a5,-88(s0) + 3002576: 078a slli a5,a5,0x2 + 3002578: 8bf1 andi a5,a5,28 + 300257a: fa442703 lw a4,-92(s0) + 300257e: 00f717b3 sll a5,a4,a5 + 3002582: fe842703 lw a4,-24(s0) + 3002586: 8fd9 or a5,a5,a4 + 3002588: fef42423 sw a5,-24(s0) + 300258c: fe842783 lw a5,-24(s0) + 3002590: 82be mv t0,a5 + 3002592: bcf29073 csrw 0xbcf,t0 + break; + 3002596: a011 j 300259a + default: + break; + 3002598: 0001 nop + } +} + 300259a: 0001 nop + 300259c: 4476 lw s0,92(sp) + 300259e: 6125 addi sp,sp,96 + 30025a0: 8082 ret + +030025a2 : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior Priority of this local interrupt to be set. + * @retval None. + */ +static void IRQ_SetLocalPriority(unsigned int interPriNum, unsigned int prior) +{ + 30025a2: 7159 addi sp,sp,-112 + 30025a4: d686 sw ra,108(sp) + 30025a6: d4a2 sw s0,104(sp) + 30025a8: 1880 addi s0,sp,112 + 30025aa: f8a42e23 sw a0,-100(s0) + 30025ae: f8b42c23 sw a1,-104(s0) +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + RISCV_PRIV_MODE_SWITCH(priv); + unsigned int intNum = GET_LOCAL_INTER_CONFIGREG_NUM(interPriNum); + 30025b2: f9c42783 lw a5,-100(s0) + 30025b6: 838d srli a5,a5,0x3 + 30025b8: fef42623 sw a5,-20(s0) + switch (intNum) { + 30025bc: fec42703 lw a4,-20(s0) + 30025c0: 479d li a5,7 + 30025c2: 2ae7e563 bltu a5,a4,300286c + 30025c6: fec42783 lw a5,-20(s0) + 30025ca: 00279713 slli a4,a5,0x2 + 30025ce: 030067b7 lui a5,0x3006 + 30025d2: 4b878793 addi a5,a5,1208 # 30064b8 + 30025d6: 97ba add a5,a5,a4 + 30025d8: 439c lw a5,0(a5) + 30025da: 8782 jr a5 + case 0: /* GROUP0 */ + SET_LOCAL_INTER_NUM_PRI(0, interPriNum, prior); + 30025dc: bc0027f3 csrr a5,0xbc0 + 30025e0: faf42823 sw a5,-80(s0) + 30025e4: fb042783 lw a5,-80(s0) + 30025e8: faf42623 sw a5,-84(s0) + 30025ec: f9c42783 lw a5,-100(s0) + 30025f0: 078a slli a5,a5,0x2 + 30025f2: 8bf1 andi a5,a5,28 + 30025f4: 473d li a4,15 + 30025f6: 00f717b3 sll a5,a4,a5 + 30025fa: fff7c793 not a5,a5 + 30025fe: fac42703 lw a4,-84(s0) + 3002602: 8ff9 and a5,a5,a4 + 3002604: faf42623 sw a5,-84(s0) + 3002608: f9c42783 lw a5,-100(s0) + 300260c: 078a slli a5,a5,0x2 + 300260e: 8bf1 andi a5,a5,28 + 3002610: f9842703 lw a4,-104(s0) + 3002614: 00f717b3 sll a5,a4,a5 + 3002618: fac42703 lw a4,-84(s0) + 300261c: 8fd9 or a5,a5,a4 + 300261e: faf42623 sw a5,-84(s0) + 3002622: fac42783 lw a5,-84(s0) + 3002626: 82be mv t0,a5 + 3002628: bc029073 csrw 0xbc0,t0 + break; + 300262c: ac81 j 300287c + case 1: /* GROUP1 */ + SET_LOCAL_INTER_NUM_PRI(1, interPriNum, prior); + 300262e: bc1027f3 csrr a5,0xbc1 + 3002632: faf42c23 sw a5,-72(s0) + 3002636: fb842783 lw a5,-72(s0) + 300263a: faf42a23 sw a5,-76(s0) + 300263e: f9c42783 lw a5,-100(s0) + 3002642: 078a slli a5,a5,0x2 + 3002644: 8bf1 andi a5,a5,28 + 3002646: 473d li a4,15 + 3002648: 00f717b3 sll a5,a4,a5 + 300264c: fff7c793 not a5,a5 + 3002650: fb442703 lw a4,-76(s0) + 3002654: 8ff9 and a5,a5,a4 + 3002656: faf42a23 sw a5,-76(s0) + 300265a: f9c42783 lw a5,-100(s0) + 300265e: 078a slli a5,a5,0x2 + 3002660: 8bf1 andi a5,a5,28 + 3002662: f9842703 lw a4,-104(s0) + 3002666: 00f717b3 sll a5,a4,a5 + 300266a: fb442703 lw a4,-76(s0) + 300266e: 8fd9 or a5,a5,a4 + 3002670: faf42a23 sw a5,-76(s0) + 3002674: fb442783 lw a5,-76(s0) + 3002678: 82be mv t0,a5 + 300267a: bc129073 csrw 0xbc1,t0 + break; + 300267e: aafd j 300287c + case 2: /* GROUP2 */ + SET_LOCAL_INTER_NUM_PRI(2, interPriNum, prior); + 3002680: bc2027f3 csrr a5,0xbc2 + 3002684: fcf42023 sw a5,-64(s0) + 3002688: fc042783 lw a5,-64(s0) + 300268c: faf42e23 sw a5,-68(s0) + 3002690: f9c42783 lw a5,-100(s0) + 3002694: 078a slli a5,a5,0x2 + 3002696: 8bf1 andi a5,a5,28 + 3002698: 473d li a4,15 + 300269a: 00f717b3 sll a5,a4,a5 + 300269e: fff7c793 not a5,a5 + 30026a2: fbc42703 lw a4,-68(s0) + 30026a6: 8ff9 and a5,a5,a4 + 30026a8: faf42e23 sw a5,-68(s0) + 30026ac: f9c42783 lw a5,-100(s0) + 30026b0: 078a slli a5,a5,0x2 + 30026b2: 8bf1 andi a5,a5,28 + 30026b4: f9842703 lw a4,-104(s0) + 30026b8: 00f717b3 sll a5,a4,a5 + 30026bc: fbc42703 lw a4,-68(s0) + 30026c0: 8fd9 or a5,a5,a4 + 30026c2: faf42e23 sw a5,-68(s0) + 30026c6: fbc42783 lw a5,-68(s0) + 30026ca: 82be mv t0,a5 + 30026cc: bc229073 csrw 0xbc2,t0 + break; + 30026d0: a275 j 300287c + case 3: /* GROUP3 */ + SET_LOCAL_INTER_NUM_PRI(3, interPriNum, prior); + 30026d2: bc3027f3 csrr a5,0xbc3 + 30026d6: fcf42423 sw a5,-56(s0) + 30026da: fc842783 lw a5,-56(s0) + 30026de: fcf42223 sw a5,-60(s0) + 30026e2: f9c42783 lw a5,-100(s0) + 30026e6: 078a slli a5,a5,0x2 + 30026e8: 8bf1 andi a5,a5,28 + 30026ea: 473d li a4,15 + 30026ec: 00f717b3 sll a5,a4,a5 + 30026f0: fff7c793 not a5,a5 + 30026f4: fc442703 lw a4,-60(s0) + 30026f8: 8ff9 and a5,a5,a4 + 30026fa: fcf42223 sw a5,-60(s0) + 30026fe: f9c42783 lw a5,-100(s0) + 3002702: 078a slli a5,a5,0x2 + 3002704: 8bf1 andi a5,a5,28 + 3002706: f9842703 lw a4,-104(s0) + 300270a: 00f717b3 sll a5,a4,a5 + 300270e: fc442703 lw a4,-60(s0) + 3002712: 8fd9 or a5,a5,a4 + 3002714: fcf42223 sw a5,-60(s0) + 3002718: fc442783 lw a5,-60(s0) + 300271c: 82be mv t0,a5 + 300271e: bc329073 csrw 0xbc3,t0 + break; + 3002722: aaa9 j 300287c + case 4: /* GROUP4 */ + SET_LOCAL_INTER_NUM_PRI(4, interPriNum, prior); + 3002724: bc4027f3 csrr a5,0xbc4 + 3002728: fcf42823 sw a5,-48(s0) + 300272c: fd042783 lw a5,-48(s0) + 3002730: fcf42623 sw a5,-52(s0) + 3002734: f9c42783 lw a5,-100(s0) + 3002738: 078a slli a5,a5,0x2 + 300273a: 8bf1 andi a5,a5,28 + 300273c: 473d li a4,15 + 300273e: 00f717b3 sll a5,a4,a5 + 3002742: fff7c793 not a5,a5 + 3002746: fcc42703 lw a4,-52(s0) + 300274a: 8ff9 and a5,a5,a4 + 300274c: fcf42623 sw a5,-52(s0) + 3002750: f9c42783 lw a5,-100(s0) + 3002754: 078a slli a5,a5,0x2 + 3002756: 8bf1 andi a5,a5,28 + 3002758: f9842703 lw a4,-104(s0) + 300275c: 00f717b3 sll a5,a4,a5 + 3002760: fcc42703 lw a4,-52(s0) + 3002764: 8fd9 or a5,a5,a4 + 3002766: fcf42623 sw a5,-52(s0) + 300276a: fcc42783 lw a5,-52(s0) + 300276e: 82be mv t0,a5 + 3002770: bc429073 csrw 0xbc4,t0 + break; + 3002774: a221 j 300287c + case 5: /* GROUP5 */ + SET_LOCAL_INTER_NUM_PRI(5, interPriNum, prior); + 3002776: bc5027f3 csrr a5,0xbc5 + 300277a: fcf42c23 sw a5,-40(s0) + 300277e: fd842783 lw a5,-40(s0) + 3002782: fcf42a23 sw a5,-44(s0) + 3002786: f9c42783 lw a5,-100(s0) + 300278a: 078a slli a5,a5,0x2 + 300278c: 8bf1 andi a5,a5,28 + 300278e: 473d li a4,15 + 3002790: 00f717b3 sll a5,a4,a5 + 3002794: fff7c793 not a5,a5 + 3002798: fd442703 lw a4,-44(s0) + 300279c: 8ff9 and a5,a5,a4 + 300279e: fcf42a23 sw a5,-44(s0) + 30027a2: f9c42783 lw a5,-100(s0) + 30027a6: 078a slli a5,a5,0x2 + 30027a8: 8bf1 andi a5,a5,28 + 30027aa: f9842703 lw a4,-104(s0) + 30027ae: 00f717b3 sll a5,a4,a5 + 30027b2: fd442703 lw a4,-44(s0) + 30027b6: 8fd9 or a5,a5,a4 + 30027b8: fcf42a23 sw a5,-44(s0) + 30027bc: fd442783 lw a5,-44(s0) + 30027c0: 82be mv t0,a5 + 30027c2: bc529073 csrw 0xbc5,t0 + break; + 30027c6: a85d j 300287c + case 6: /* GROUP6 */ + SET_LOCAL_INTER_NUM_PRI(6, interPriNum, prior); + 30027c8: bc6027f3 csrr a5,0xbc6 + 30027cc: fef42023 sw a5,-32(s0) + 30027d0: fe042783 lw a5,-32(s0) + 30027d4: fcf42e23 sw a5,-36(s0) + 30027d8: f9c42783 lw a5,-100(s0) + 30027dc: 078a slli a5,a5,0x2 + 30027de: 8bf1 andi a5,a5,28 + 30027e0: 473d li a4,15 + 30027e2: 00f717b3 sll a5,a4,a5 + 30027e6: fff7c793 not a5,a5 + 30027ea: fdc42703 lw a4,-36(s0) + 30027ee: 8ff9 and a5,a5,a4 + 30027f0: fcf42e23 sw a5,-36(s0) + 30027f4: f9c42783 lw a5,-100(s0) + 30027f8: 078a slli a5,a5,0x2 + 30027fa: 8bf1 andi a5,a5,28 + 30027fc: f9842703 lw a4,-104(s0) + 3002800: 00f717b3 sll a5,a4,a5 + 3002804: fdc42703 lw a4,-36(s0) + 3002808: 8fd9 or a5,a5,a4 + 300280a: fcf42e23 sw a5,-36(s0) + 300280e: fdc42783 lw a5,-36(s0) + 3002812: 82be mv t0,a5 + 3002814: bc629073 csrw 0xbc6,t0 + break; + 3002818: a095 j 300287c + case 7: /* GROUP7 */ + SET_LOCAL_INTER_NUM_PRI(7, interPriNum, prior); + 300281a: bc7027f3 csrr a5,0xbc7 + 300281e: fef42423 sw a5,-24(s0) + 3002822: fe842783 lw a5,-24(s0) + 3002826: fef42223 sw a5,-28(s0) + 300282a: f9c42783 lw a5,-100(s0) + 300282e: 078a slli a5,a5,0x2 + 3002830: 8bf1 andi a5,a5,28 + 3002832: 473d li a4,15 + 3002834: 00f717b3 sll a5,a4,a5 + 3002838: fff7c793 not a5,a5 + 300283c: fe442703 lw a4,-28(s0) + 3002840: 8ff9 and a5,a5,a4 + 3002842: fef42223 sw a5,-28(s0) + 3002846: f9c42783 lw a5,-100(s0) + 300284a: 078a slli a5,a5,0x2 + 300284c: 8bf1 andi a5,a5,28 + 300284e: f9842703 lw a4,-104(s0) + 3002852: 00f717b3 sll a5,a4,a5 + 3002856: fe442703 lw a4,-28(s0) + 300285a: 8fd9 or a5,a5,a4 + 300285c: fef42223 sw a5,-28(s0) + 3002860: fe442783 lw a5,-28(s0) + 3002864: 82be mv t0,a5 + 3002866: bc729073 csrw 0xbc7,t0 + break; + 300286a: a809 j 300287c + default: + SetLocalIntNumPri(intNum, interPriNum, prior); + 300286c: f9842603 lw a2,-104(s0) + 3002870: f9c42583 lw a1,-100(s0) + 3002874: fec42503 lw a0,-20(s0) + 3002878: 3485 jal ra,30022d8 + break; + 300287a: 0001 nop + } + RISCV_PRIV_MODE_SWITCH(priv); +} + 300287c: 0001 nop + 300287e: 50b6 lw ra,108(sp) + 3002880: 5426 lw s0,104(sp) + 3002882: 6165 addi sp,sp,112 + 3002884: 8082 ret + +03002886 : + * @param irqNum External interrupt number. + * @param priority. + * @retval IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_PRIORITY_INVALID or BASE_STATUS_OK. + */ +unsigned int IRQ_SetPriority(unsigned int irqNum, unsigned int priority) +{ + 3002886: 1101 addi sp,sp,-32 + 3002888: ce06 sw ra,28(sp) + 300288a: cc22 sw s0,24(sp) + 300288c: 1000 addi s0,sp,32 + 300288e: fea42623 sw a0,-20(s0) + 3002892: feb42423 sw a1,-24(s0) + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 3002896: fec42703 lw a4,-20(s0) + 300289a: 47e5 li a5,25 + 300289c: 00e7f863 bgeu a5,a4,30028ac + 30028a0: fec42703 lw a4,-20(s0) + 30028a4: 07200793 li a5,114 + 30028a8: 00e7fb63 bgeu a5,a4,30028be + 30028ac: 18c00593 li a1,396 + 30028b0: 030067b7 lui a5,0x3006 + 30028b4: 47878513 addi a0,a5,1144 # 3006478 + 30028b8: 21bd jal ra,3002d26 + 30028ba: 4789 li a5,2 + 30028bc: a815 j 30028f0 + INTERRUPT_PARAM_CHECK_WITH_RET((priority >= IRQ_PRIO_LOWEST && priority <= IRQ_PRIO_HIGHEST), \ + 30028be: fe842783 lw a5,-24(s0) + 30028c2: c791 beqz a5,30028ce + 30028c4: fe842703 lw a4,-24(s0) + 30028c8: 47bd li a5,15 + 30028ca: 00e7fb63 bgeu a5,a4,30028e0 + 30028ce: 18d00593 li a1,397 + 30028d2: 030067b7 lui a5,0x3006 + 30028d6: 47878513 addi a0,a5,1144 # 3006478 + 30028da: 21b1 jal ra,3002d26 + 30028dc: 4795 li a5,5 + 30028de: a809 j 30028f0 + IRQ_ERRNO_PRIORITY_INVALID); + + /* The locipri register is specifically used to configure the priority of the + external non-standard interrupts of the CPU, so the number of internal + standard interrupts should be subtracted */ + IRQ_SetLocalPriority(irqNum - IRQ_VECTOR_CNT, priority); + 30028e0: fec42783 lw a5,-20(s0) + 30028e4: 1799 addi a5,a5,-26 + 30028e6: fe842583 lw a1,-24(s0) + 30028ea: 853e mv a0,a5 + 30028ec: 395d jal ra,30025a2 + + return BASE_STATUS_OK; + 30028ee: 4781 li a5,0 +} + 30028f0: 853e mv a0,a5 + 30028f2: 40f2 lw ra,28(sp) + 30028f4: 4462 lw s0,24(sp) + 30028f6: 6105 addi sp,sp,32 + 30028f8: 8082 ret + +030028fa : + * @brief Interrupt dummy handler + * @param arg Not used + * @retval None. + */ +static void IRQ_DummyHandler(void *arg) +{ + 30028fa: 1101 addi sp,sp,-32 + 30028fc: ce22 sw s0,28(sp) + 30028fe: 1000 addi s0,sp,32 + 3002900: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(arg); +} + 3002904: 0001 nop + 3002906: 4472 lw s0,28(sp) + 3002908: 6105 addi sp,sp,32 + 300290a: 8082 ret + +0300290c : + * @param func callback function + * @param arg callback arg + * @retval None. + */ +static inline void IRQ_SetCallBack(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 300290c: 1101 addi sp,sp,-32 + 300290e: ce22 sw s0,28(sp) + 3002910: 1000 addi s0,sp,32 + 3002912: fea42623 sw a0,-20(s0) + 3002916: feb42423 sw a1,-24(s0) + 300291a: fec42223 sw a2,-28(s0) + g_irqCallbackFunc[irqNum].param = arg; + 300291e: 040007b7 lui a5,0x4000 + 3002922: 0fc78713 addi a4,a5,252 # 40000fc + 3002926: fec42783 lw a5,-20(s0) + 300292a: 078e slli a5,a5,0x3 + 300292c: 97ba add a5,a5,a4 + 300292e: fe442703 lw a4,-28(s0) + 3002932: c3d8 sw a4,4(a5) + g_irqCallbackFunc[irqNum].pfnHandler = func; + 3002934: 040007b7 lui a5,0x4000 + 3002938: 0fc78713 addi a4,a5,252 # 40000fc + 300293c: fec42783 lw a5,-20(s0) + 3002940: 078e slli a5,a5,0x3 + 3002942: 97ba add a5,a5,a4 + 3002944: fe842703 lw a4,-24(s0) + 3002948: c398 sw a4,0(a5) +} + 300294a: 0001 nop + 300294c: 4472 lw s0,28(sp) + 300294e: 6105 addi sp,sp,32 + 3002950: 8082 ret + +03002952 : + * @brief Set the write protection for CRG-related registers disable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionDisable(void) +{ + 3002952: 1141 addi sp,sp,-16 + 3002954: c622 sw s0,12(sp) + 3002956: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = (SYSCTRL0->SC_LOCKEN.reg & SC_LOCKEN_CRG_DISABLE_MASK) + SC_LOCKEN_VALID_HIGH_BIT; + 3002958: 101007b7 lui a5,0x10100 + 300295c: 43f8 lw a4,68(a5) + 300295e: 67c1 lui a5,0x10 + 3002960: 17f9 addi a5,a5,-2 # fffe + 3002962: 00f776b3 and a3,a4,a5 + 3002966: 101007b7 lui a5,0x10100 + 300296a: ea510737 lui a4,0xea510 + 300296e: 9736 add a4,a4,a3 + 3002970: c3f8 sw a4,68(a5) +} + 3002972: 0001 nop + 3002974: 4432 lw s0,12(sp) + 3002976: 0141 addi sp,sp,16 + 3002978: 8082 ret + +0300297a : + * @brief Set the Set the write protection for CRG-related registers enable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionEnable(void) +{ + 300297a: 1141 addi sp,sp,-16 + 300297c: c622 sw s0,12(sp) + 300297e: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = ((SYSCTRL0->SC_LOCKEN.reg & SC_LOW_BIT_MASK) | SC_LOCKEN_CRG_ENABLE_MASK) + + 3002980: 101007b7 lui a5,0x10100 + 3002984: 43f8 lw a4,68(a5) + 3002986: 67c1 lui a5,0x10 + 3002988: 17fd addi a5,a5,-1 # ffff + 300298a: 8ff9 and a5,a5,a4 + 300298c: 0017e693 ori a3,a5,1 + 3002990: 101007b7 lui a5,0x10100 + 3002994: ea510737 lui a4,0xea510 + 3002998: 9736 add a4,a4,a3 + 300299a: c3f8 sw a4,68(a5) + SC_LOCKEN_VALID_HIGH_BIT; +} + 300299c: 0001 nop + 300299e: 4432 lw s0,12(sp) + 30029a0: 0141 addi sp,sp,16 + 30029a2: 8082 ret + +030029a4 : + * @param clkSelect pll_ref_cksel + * @retval true + * @retval false + */ +static inline bool IsCrgPllRefClkSelect(CRG_PllRefClkSelect clkSelect) +{ + 30029a4: 1101 addi sp,sp,-32 + 30029a6: ce22 sw s0,28(sp) + 30029a8: 1000 addi s0,sp,32 + 30029aa: fea42623 sw a0,-20(s0) + return ((clkSelect == CRG_PLL_REF_CLK_SELECT_HOSC) || + 30029ae: fec42783 lw a5,-20(s0) + 30029b2: c791 beqz a5,30029be + 30029b4: fec42703 lw a4,-20(s0) + 30029b8: 4785 li a5,1 + 30029ba: 00f71463 bne a4,a5,30029c2 + 30029be: 4785 li a5,1 + 30029c0: a011 j 30029c4 + 30029c2: 4781 li a5,0 + 30029c4: 8b85 andi a5,a5,1 + 30029c6: 9f81 uxtb a5 + (clkSelect == CRG_PLL_REF_CLK_SELECT_XTAL)); +} + 30029c8: 853e mv a0,a5 + 30029ca: 4472 lw s0,28(sp) + 30029cc: 6105 addi sp,sp,32 + 30029ce: 8082 ret + +030029d0 : + * @param preDiv pll prediv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPreDiv(CRG_PllPreDiv preDiv) +{ + 30029d0: 1101 addi sp,sp,-32 + 30029d2: ce22 sw s0,28(sp) + 30029d4: 1000 addi s0,sp,32 + 30029d6: fea42623 sw a0,-20(s0) + return ((preDiv >= CRG_PLL_PREDIV_1) && + 30029da: fec42783 lw a5,-20(s0) + 30029de: 0087b793 sltiu a5,a5,8 + 30029e2: 9f81 uxtb a5 + (preDiv <= CRG_PLL_PREDIV_8)); +} + 30029e4: 853e mv a0,a5 + 30029e6: 4472 lw s0,28(sp) + 30029e8: 6105 addi sp,sp,32 + 30029ea: 8082 ret + +030029ec : + * @param postDiv pll_postdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv(CRG_PllPostDiv postDiv) +{ + 30029ec: 1101 addi sp,sp,-32 + 30029ee: ce22 sw s0,28(sp) + 30029f0: 1000 addi s0,sp,32 + 30029f2: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV_1) && + 30029f6: fec42783 lw a5,-20(s0) + 30029fa: 0087b793 sltiu a5,a5,8 + 30029fe: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV_8)); +} + 3002a00: 853e mv a0,a5 + 3002a02: 4472 lw s0,28(sp) + 3002a04: 6105 addi sp,sp,32 + 3002a06: 8082 ret + +03002a08 : + * @param postDiv pll_postdiv2 value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv2(CRG_PllPostDiv2 postDiv) +{ + 3002a08: 1101 addi sp,sp,-32 + 3002a0a: ce22 sw s0,28(sp) + 3002a0c: 1000 addi s0,sp,32 + 3002a0e: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV2_1) && + 3002a12: fec42783 lw a5,-20(s0) + 3002a16: 0087b793 sltiu a5,a5,8 + 3002a1a: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV2_8_MAX)); +} + 3002a1c: 853e mv a0,a5 + 3002a1e: 4472 lw s0,28(sp) + 3002a20: 6105 addi sp,sp,32 + 3002a22: 8082 ret + +03002a24 : + * @param fbDiv pll fbdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllFbDiv(unsigned int fbDiv) +{ + 3002a24: 1101 addi sp,sp,-32 + 3002a26: ce22 sw s0,28(sp) + 3002a28: 1000 addi s0,sp,32 + 3002a2a: fea42623 sw a0,-20(s0) + return (fbDiv <= CRG_PLL_FBDIV_MAX); + 3002a2e: fec42783 lw a5,-20(s0) + 3002a32: 0807b793 sltiu a5,a5,128 + 3002a36: 9f81 uxtb a5 +} + 3002a38: 853e mv a0,a5 + 3002a3a: 4472 lw s0,28(sp) + 3002a3c: 6105 addi sp,sp,32 + 3002a3e: 8082 ret + +03002a40 : + * @param select core_cksel value + * @retval true + * @retval false + */ +static inline bool IsCrgCoreCkSel(CRG_CoreClkSelect select) +{ + 3002a40: 1101 addi sp,sp,-32 + 3002a42: ce22 sw s0,28(sp) + 3002a44: 1000 addi s0,sp,32 + 3002a46: fea42623 sw a0,-20(s0) + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002a4a: fec42783 lw a5,-20(s0) + 3002a4e: cb99 beqz a5,3002a64 + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + 3002a50: fec42703 lw a4,-20(s0) + 3002a54: 4785 li a5,1 + 3002a56: 00f70763 beq a4,a5,3002a64 + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002a5a: fec42703 lw a4,-20(s0) + 3002a5e: 4789 li a5,2 + 3002a60: 00f71463 bne a4,a5,3002a68 + 3002a64: 4785 li a5,1 + 3002a66: a011 j 3002a6a + 3002a68: 4781 li a5,0 + 3002a6a: 8b85 andi a5,a5,1 + 3002a6c: 9f81 uxtb a5 + (select == CRG_CORE_CLK_SELECT_PLL)); +} + 3002a6e: 853e mv a0,a5 + 3002a70: 4472 lw s0,28(sp) + 3002a72: 6105 addi sp,sp,32 + 3002a74: 8082 ret + +03002a76 : + * @param select 1M clock selection + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkSel(CRG_1MClkSelect select) +{ + 3002a76: 1101 addi sp,sp,-32 + 3002a78: ce22 sw s0,28(sp) + 3002a7a: 1000 addi s0,sp,32 + 3002a7c: fea42623 sw a0,-20(s0) + return ((select == CRG_1M_CLK_SELECT_HOSC) || + 3002a80: fec42783 lw a5,-20(s0) + 3002a84: c791 beqz a5,3002a90 + 3002a86: fec42703 lw a4,-20(s0) + 3002a8a: 4785 li a5,1 + 3002a8c: 00f71463 bne a4,a5,3002a94 + 3002a90: 4785 li a5,1 + 3002a92: a011 j 3002a96 + 3002a94: 4781 li a5,0 + 3002a96: 8b85 andi a5,a5,1 + 3002a98: 9f81 uxtb a5 + (select == CRG_1M_CLK_SELECT_TCXO)); +} + 3002a9a: 853e mv a0,a5 + 3002a9c: 4472 lw s0,28(sp) + 3002a9e: 6105 addi sp,sp,32 + 3002aa0: 8082 ret + +03002aa2 : + * @param div 1M clock ratio + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkDiv(unsigned int div) +{ + 3002aa2: 1101 addi sp,sp,-32 + 3002aa4: ce22 sw s0,28(sp) + 3002aa6: 1000 addi s0,sp,32 + 3002aa8: fea42623 sw a0,-20(s0) + return (div <= CRG_1MHZ_CLK_MAX_DIV); + 3002aac: fec42783 lw a5,-20(s0) + 3002ab0: 0407b793 sltiu a5,a5,64 + 3002ab4: 9f81 uxtb a5 +} + 3002ab6: 853e mv a0,a5 + 3002ab8: 4472 lw s0,28(sp) + 3002aba: 6105 addi sp,sp,32 + 3002abc: 8082 ret + +03002abe : + * @param preDiv PLL Previous Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPreDiv(unsigned int pllRefFreq, unsigned int preDiv) +{ + 3002abe: 7179 addi sp,sp,-48 + 3002ac0: d622 sw s0,44(sp) + 3002ac2: 1800 addi s0,sp,48 + 3002ac4: fca42e23 sw a0,-36(s0) + 3002ac8: fcb42c23 sw a1,-40(s0) + unsigned int freq = pllRefFreq; + 3002acc: fdc42783 lw a5,-36(s0) + 3002ad0: fef42623 sw a5,-20(s0) + if (preDiv != 0) { + 3002ad4: fd842783 lw a5,-40(s0) + 3002ad8: cb89 beqz a5,3002aea + freq /= preDiv; + 3002ada: fec42703 lw a4,-20(s0) + 3002ade: fd842783 lw a5,-40(s0) + 3002ae2: 02f757b3 divu a5,a4,a5 + 3002ae6: fef42623 sw a5,-20(s0) + } + return (freq >= CRG_CLK_PFD_MIN_FREQ) && (freq <= CRG_CLK_PFD_MAX_FREQ); + 3002aea: fec42703 lw a4,-20(s0) + 3002aee: 003d17b7 lui a5,0x3d1 + 3002af2: 8ff78793 addi a5,a5,-1793 # 3d08ff + 3002af6: 00e7fc63 bgeu a5,a4,3002b0e + 3002afa: fec42703 lw a4,-20(s0) + 3002afe: 007277b7 lui a5,0x727 + 3002b02: 0e078793 addi a5,a5,224 # 7270e0 + 3002b06: 00e7e463 bltu a5,a4,3002b0e + 3002b0a: 4785 li a5,1 + 3002b0c: a011 j 3002b10 + 3002b0e: 4781 li a5,0 + 3002b10: 8b85 andi a5,a5,1 + 3002b12: 9f81 uxtb a5 +} + 3002b14: 853e mv a0,a5 + 3002b16: 5432 lw s0,44(sp) + 3002b18: 6145 addi sp,sp,48 + 3002b1a: 8082 ret + +03002b1c : + * @param fdDiv PLL FD Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidFdDiv(unsigned int clkPfdFreq, unsigned int fdDiv) +{ + 3002b1c: 7179 addi sp,sp,-48 + 3002b1e: d622 sw s0,44(sp) + 3002b20: 1800 addi s0,sp,48 + 3002b22: fca42e23 sw a0,-36(s0) + 3002b26: fcb42c23 sw a1,-40(s0) + if (clkPfdFreq > 30000000U) { /* The maximum speed of the external clock source is 30000000U. */ + 3002b2a: fdc42703 lw a4,-36(s0) + 3002b2e: 01c9c7b7 lui a5,0x1c9c + 3002b32: 38078793 addi a5,a5,896 # 1c9c380 + 3002b36: 00e7f463 bgeu a5,a4,3002b3e + return false; + 3002b3a: 4781 li a5,0 + 3002b3c: a08d j 3002b9e + } else if (fdDiv > CRG_PLL_FBDIV_MAX) { + 3002b3e: fd842703 lw a4,-40(s0) + 3002b42: 07f00793 li a5,127 + 3002b46: 00e7f463 bgeu a5,a4,3002b4e + return false; + 3002b4a: 4781 li a5,0 + 3002b4c: a889 j 3002b9e + } + + unsigned int freq = (fdDiv > 0x6) ? (clkPfdFreq * fdDiv) : (clkPfdFreq * 0x6); /* 0x0-0x6: divided by 0x6 */ + 3002b4e: fd842703 lw a4,-40(s0) + 3002b52: 4799 li a5,6 + 3002b54: 00e7f963 bgeu a5,a4,3002b66 + 3002b58: fdc42703 lw a4,-36(s0) + 3002b5c: fd842783 lw a5,-40(s0) + 3002b60: 02f707b3 mul a5,a4,a5 + 3002b64: a031 j 3002b70 + 3002b66: fdc42703 lw a4,-36(s0) + 3002b6a: 4799 li a5,6 + 3002b6c: 02f707b3 mul a5,a4,a5 + 3002b70: fef42623 sw a5,-20(s0) + return (freq >= CRG_CLK_VCO_MIN_FREQ) && (freq <= CRG_CLK_VCO_MAX_FREQ); + 3002b74: fec42703 lw a4,-20(s0) + 3002b78: 05f5e7b7 lui a5,0x5f5e + 3002b7c: 0ff78793 addi a5,a5,255 # 5f5e0ff + 3002b80: 00e7fc63 bgeu a5,a4,3002b98 + 3002b84: fec42703 lw a4,-20(s0) + 3002b88: 11e1a7b7 lui a5,0x11e1a + 3002b8c: 30078793 addi a5,a5,768 # 11e1a300 + 3002b90: 00e7e463 bltu a5,a4,3002b98 + 3002b94: 4785 li a5,1 + 3002b96: a011 j 3002b9a + 3002b98: 4781 li a5,0 + 3002b9a: 8b85 andi a5,a5,1 + 3002b9c: 9f81 uxtb a5 +} + 3002b9e: 853e mv a0,a5 + 3002ba0: 5432 lw s0,44(sp) + 3002ba2: 6145 addi sp,sp,48 + 3002ba4: 8082 ret + +03002ba6 : + * @param postDiv PLL Post Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv(unsigned int clkVcoFreq, unsigned int postDiv) +{ + 3002ba6: 7179 addi sp,sp,-48 + 3002ba8: d622 sw s0,44(sp) + 3002baa: 1800 addi s0,sp,48 + 3002bac: fca42e23 sw a0,-36(s0) + 3002bb0: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002bb4: fdc42783 lw a5,-36(s0) + 3002bb8: fef42623 sw a5,-20(s0) + if (postDiv != 0) { + 3002bbc: fd842783 lw a5,-40(s0) + 3002bc0: cb91 beqz a5,3002bd4 + freq /= (postDiv + 1); + 3002bc2: fd842783 lw a5,-40(s0) + 3002bc6: 0785 addi a5,a5,1 + 3002bc8: fec42703 lw a4,-20(s0) + 3002bcc: 02f757b3 divu a5,a4,a5 + 3002bd0: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_TARGET_MAX_FREQ); + 3002bd4: fec42703 lw a4,-20(s0) + 3002bd8: 08f0d7b7 lui a5,0x8f0d + 3002bdc: 18178793 addi a5,a5,385 # 8f0d181 + 3002be0: 00f737b3 sltu a5,a4,a5 + 3002be4: 9f81 uxtb a5 +} + 3002be6: 853e mv a0,a5 + 3002be8: 5432 lw s0,44(sp) + 3002bea: 6145 addi sp,sp,48 + 3002bec: 8082 ret + +03002bee : + * @param postDiv2 PLL Post Divsion2 + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv2(unsigned int clkVcoFreq, unsigned int postDiv2) +{ + 3002bee: 7179 addi sp,sp,-48 + 3002bf0: d622 sw s0,44(sp) + 3002bf2: 1800 addi s0,sp,48 + 3002bf4: fca42e23 sw a0,-36(s0) + 3002bf8: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002bfc: fdc42783 lw a5,-36(s0) + 3002c00: fef42623 sw a5,-20(s0) + if (postDiv2 != 0) { + 3002c04: fd842783 lw a5,-40(s0) + 3002c08: cb91 beqz a5,3002c1c + freq /= (postDiv2 + 1); + 3002c0a: fd842783 lw a5,-40(s0) + 3002c0e: 0785 addi a5,a5,1 + 3002c10: fec42703 lw a4,-20(s0) + 3002c14: 02f757b3 divu a5,a4,a5 + 3002c18: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_PST2_MAX_FREQ); + 3002c1c: fec42703 lw a4,-20(s0) + 3002c20: 05f5e7b7 lui a5,0x5f5e + 3002c24: 10178793 addi a5,a5,257 # 5f5e101 + 3002c28: 00f737b3 sltu a5,a4,a5 + 3002c2c: 9f81 uxtb a5 +} + 3002c2e: 853e mv a0,a5 + 3002c30: 5432 lw s0,44(sp) + 3002c32: 6145 addi sp,sp,48 + 3002c34: 8082 ret + +03002c36 : + * @param adcClkSelect the value of adc clock select + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkModeSelect(CRG_AdcClkSelect adcClkSelect) +{ + 3002c36: 1101 addi sp,sp,-32 + 3002c38: ce22 sw s0,28(sp) + 3002c3a: 1000 addi s0,sp,32 + 3002c3c: fea42623 sw a0,-20(s0) + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002c40: fec42783 lw a5,-20(s0) + 3002c44: c385 beqz a5,3002c64 + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + 3002c46: fec42703 lw a4,-20(s0) + 3002c4a: 4785 li a5,1 + 3002c4c: 00f70c63 beq a4,a5,3002c64 + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + 3002c50: fec42703 lw a4,-20(s0) + 3002c54: 4789 li a5,2 + 3002c56: 00f70763 beq a4,a5,3002c64 + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002c5a: fec42703 lw a4,-20(s0) + 3002c5e: 478d li a5,3 + 3002c60: 00f71463 bne a4,a5,3002c68 + 3002c64: 4785 li a5,1 + 3002c66: a011 j 3002c6a + 3002c68: 4781 li a5,0 + 3002c6a: 8b85 andi a5,a5,1 + 3002c6c: 9f81 uxtb a5 + adcClkSelect == CRG_ADC_CLK_SYN_CORE); +} + 3002c6e: 853e mv a0,a5 + 3002c70: 4472 lw s0,28(sp) + 3002c72: 6105 addi sp,sp,32 + 3002c74: 8082 ret + +03002c76 : + * @param div the value of adc clock div + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkDiv(CRG_AdcDiv div) +{ + 3002c76: 1101 addi sp,sp,-32 + 3002c78: ce22 sw s0,28(sp) + 3002c7a: 1000 addi s0,sp,32 + 3002c7c: fea42623 sw a0,-20(s0) + return (div == CRG_ADC_DIV_1 || \ + div == CRG_ADC_DIV_2 || \ + div == CRG_ADC_DIV_3 || \ + 3002c80: fec42783 lw a5,-20(s0) + 3002c84: c385 beqz a5,3002ca4 + return (div == CRG_ADC_DIV_1 || \ + 3002c86: fec42703 lw a4,-20(s0) + 3002c8a: 4785 li a5,1 + 3002c8c: 00f70c63 beq a4,a5,3002ca4 + div == CRG_ADC_DIV_2 || \ + 3002c90: fec42703 lw a4,-20(s0) + 3002c94: 4789 li a5,2 + 3002c96: 00f70763 beq a4,a5,3002ca4 + div == CRG_ADC_DIV_3 || \ + 3002c9a: fec42703 lw a4,-20(s0) + 3002c9e: 478d li a5,3 + 3002ca0: 00f71463 bne a4,a5,3002ca8 + 3002ca4: 4785 li a5,1 + 3002ca6: a011 j 3002caa + 3002ca8: 4781 li a5,0 + 3002caa: 8b85 andi a5,a5,1 + 3002cac: 9f81 uxtb a5 + div == CRG_ADC_DIV_4); +} + 3002cae: 853e mv a0,a5 + 3002cb0: 4472 lw s0,28(sp) + 3002cb2: 6105 addi sp,sp,32 + 3002cb4: 8082 ret + +03002cb6 : + * @param clk Clock register base address + * @param select Core clock selection + * @retval None + */ +static inline void DCL_CRG_SetCoreClkSel(CRG_RegStruct *clk, CRG_CoreClkSelect select) +{ + 3002cb6: 1101 addi sp,sp,-32 + 3002cb8: ce06 sw ra,28(sp) + 3002cba: cc22 sw s0,24(sp) + 3002cbc: 1000 addi s0,sp,32 + 3002cbe: fea42623 sw a0,-20(s0) + 3002cc2: feb42423 sw a1,-24(s0) + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + 3002cc6: fec42703 lw a4,-20(s0) + 3002cca: 100007b7 lui a5,0x10000 + 3002cce: 00f70a63 beq a4,a5,3002ce2 + 3002cd2: 64b00593 li a1,1611 + 3002cd6: 030067b7 lui a5,0x3006 + 3002cda: 4d878513 addi a0,a5,1240 # 30064d8 + 3002cde: 20a1 jal ra,3002d26 + 3002ce0: a001 j 3002ce0 + CRG_PARAM_CHECK_NO_RET(IsCrgCoreCkSel(select)); + 3002ce2: fe842503 lw a0,-24(s0) + 3002ce6: 3ba9 jal ra,3002a40 + 3002ce8: 87aa mv a5,a0 + 3002cea: 0017c793 xori a5,a5,1 + 3002cee: 9f81 uxtb a5 + 3002cf0: cb89 beqz a5,3002d02 + 3002cf2: 64c00593 li a1,1612 + 3002cf6: 030067b7 lui a5,0x3006 + 3002cfa: 4d878513 addi a0,a5,1240 # 30064d8 + 3002cfe: 2025 jal ra,3002d26 + 3002d00: a839 j 3002d1e + clk->PERI_CRG64.BIT.clk_pst1_sw_sel = select; + 3002d02: fe842783 lw a5,-24(s0) + 3002d06: 8b8d andi a5,a5,3 + 3002d08: 0ff7f693 andi a3,a5,255 + 3002d0c: fec42703 lw a4,-20(s0) + 3002d10: 10072783 lw a5,256(a4) # ea510100 + 3002d14: 8a8d andi a3,a3,3 + 3002d16: 9bf1 andi a5,a5,-4 + 3002d18: 8fd5 or a5,a5,a3 + 3002d1a: 10f72023 sw a5,256(a4) +} + 3002d1e: 40f2 lw ra,28(sp) + 3002d20: 4462 lw s0,24(sp) + 3002d22: 6105 addi sp,sp,32 + 3002d24: 8082 ret + +03002d26 : + 3002d26: 988ff06f j 3001eae + +03002d2a : + * @param handle CRG Handle + * @retval BASE_STATUS_ERROR Parameter Check fail + * @retval BASE_STATUS_OK Success + */ +BASE_StatusType HAL_CRG_Init(const CRG_Handle *handle) +{ + 3002d2a: 7179 addi sp,sp,-48 + 3002d2c: d606 sw ra,44(sp) + 3002d2e: d422 sw s0,40(sp) + 3002d30: 1800 addi s0,sp,48 + 3002d32: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != NULL); + 3002d36: fdc42783 lw a5,-36(s0) + 3002d3a: eb89 bnez a5,3002d4c + 3002d3c: 07100593 li a1,113 + 3002d40: 030067b7 lui a5,0x3006 + 3002d44: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d48: 3ff9 jal ra,3002d26 + 3002d4a: a001 j 3002d4a + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3002d4c: fdc42783 lw a5,-36(s0) + 3002d50: 4398 lw a4,0(a5) + 3002d52: 100007b7 lui a5,0x10000 + 3002d56: 00f70a63 beq a4,a5,3002d6a + 3002d5a: 07200593 li a1,114 + 3002d5e: 030067b7 lui a5,0x3006 + 3002d62: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d66: 37c1 jal ra,3002d26 + 3002d68: a001 j 3002d68 + /* Check the validity of PLL-related parameters. */ + CRG_PARAM_CHECK_WITH_RET(IsCrgPllRefClkSelect(handle->pllRefClkSelect), BASE_STATUS_ERROR); + 3002d6a: fdc42783 lw a5,-36(s0) + 3002d6e: 43dc lw a5,4(a5) + 3002d70: 853e mv a0,a5 + 3002d72: 390d jal ra,30029a4 + 3002d74: 87aa mv a5,a0 + 3002d76: 0017c793 xori a5,a5,1 + 3002d7a: 9f81 uxtb a5 + 3002d7c: cb91 beqz a5,3002d90 + 3002d7e: 07400593 li a1,116 + 3002d82: 030067b7 lui a5,0x3006 + 3002d86: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d8a: 3f71 jal ra,3002d26 + 3002d8c: 4785 li a5,1 + 3002d8e: aca9 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPreDiv(handle->pllPreDiv), BASE_STATUS_ERROR); + 3002d90: fdc42783 lw a5,-36(s0) + 3002d94: 479c lw a5,8(a5) + 3002d96: 853e mv a0,a5 + 3002d98: 3925 jal ra,30029d0 + 3002d9a: 87aa mv a5,a0 + 3002d9c: 0017c793 xori a5,a5,1 + 3002da0: 9f81 uxtb a5 + 3002da2: cb91 beqz a5,3002db6 + 3002da4: 07500593 li a1,117 + 3002da8: 030067b7 lui a5,0x3006 + 3002dac: 4f478513 addi a0,a5,1268 # 30064f4 + 3002db0: 3f9d jal ra,3002d26 + 3002db2: 4785 li a5,1 + 3002db4: ac15 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllFbDiv(handle->pllFbDiv), BASE_STATUS_ERROR); + 3002db6: fdc42783 lw a5,-36(s0) + 3002dba: 47dc lw a5,12(a5) + 3002dbc: 853e mv a0,a5 + 3002dbe: 319d jal ra,3002a24 + 3002dc0: 87aa mv a5,a0 + 3002dc2: 0017c793 xori a5,a5,1 + 3002dc6: 9f81 uxtb a5 + 3002dc8: cb91 beqz a5,3002ddc + 3002dca: 07600593 li a1,118 + 3002dce: 030067b7 lui a5,0x3006 + 3002dd2: 4f478513 addi a0,a5,1268 # 30064f4 + 3002dd6: 3f81 jal ra,3002d26 + 3002dd8: 4785 li a5,1 + 3002dda: a439 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv(handle->pllPostDiv), BASE_STATUS_ERROR); + 3002ddc: fdc42783 lw a5,-36(s0) + 3002de0: 4b9c lw a5,16(a5) + 3002de2: 853e mv a0,a5 + 3002de4: 3121 jal ra,30029ec + 3002de6: 87aa mv a5,a0 + 3002de8: 0017c793 xori a5,a5,1 + 3002dec: 9f81 uxtb a5 + 3002dee: cb91 beqz a5,3002e02 + 3002df0: 07700593 li a1,119 + 3002df4: 030067b7 lui a5,0x3006 + 3002df8: 4f478513 addi a0,a5,1268 # 30064f4 + 3002dfc: 372d jal ra,3002d26 + 3002dfe: 4785 li a5,1 + 3002e00: a2e5 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv2(handle->handleEx.pllPostDiv2), BASE_STATUS_ERROR); + 3002e02: fdc42783 lw a5,-36(s0) + 3002e06: 4fdc lw a5,28(a5) + 3002e08: 853e mv a0,a5 + 3002e0a: 3efd jal ra,3002a08 + 3002e0c: 87aa mv a5,a0 + 3002e0e: 0017c793 xori a5,a5,1 + 3002e12: 9f81 uxtb a5 + 3002e14: cb91 beqz a5,3002e28 + 3002e16: 07800593 li a1,120 + 3002e1a: 030067b7 lui a5,0x3006 + 3002e1e: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e22: 3711 jal ra,3002d26 + 3002e24: 4785 li a5,1 + 3002e26: a2c9 j 3002fe8 + /* Check the Clock Source and Frequency Divider of the 1 MHz Clock. */ + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkSel(handle->handleEx.clk1MSelect), BASE_STATUS_ERROR); + 3002e28: fdc42783 lw a5,-36(s0) + 3002e2c: 539c lw a5,32(a5) + 3002e2e: 853e mv a0,a5 + 3002e30: 3199 jal ra,3002a76 + 3002e32: 87aa mv a5,a0 + 3002e34: 0017c793 xori a5,a5,1 + 3002e38: 9f81 uxtb a5 + 3002e3a: cb91 beqz a5,3002e4e + 3002e3c: 07a00593 li a1,122 + 3002e40: 030067b7 lui a5,0x3006 + 3002e44: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e48: 3df9 jal ra,3002d26 + 3002e4a: 4785 li a5,1 + 3002e4c: aa71 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkDiv(handle->handleEx.clk1MDiv), BASE_STATUS_ERROR); + 3002e4e: fdc42783 lw a5,-36(s0) + 3002e52: 53dc lw a5,36(a5) + 3002e54: 853e mv a0,a5 + 3002e56: 31b1 jal ra,3002aa2 + 3002e58: 87aa mv a5,a0 + 3002e5a: 0017c793 xori a5,a5,1 + 3002e5e: 9f81 uxtb a5 + 3002e60: cb91 beqz a5,3002e74 + 3002e62: 07b00593 li a1,123 + 3002e66: 030067b7 lui a5,0x3006 + 3002e6a: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e6e: 3d65 jal ra,3002d26 + 3002e70: 4785 li a5,1 + 3002e72: aa9d j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 3002e74: fdc42783 lw a5,-36(s0) + 3002e78: 4f9c lw a5,24(a5) + 3002e7a: 853e mv a0,a5 + 3002e7c: 36d1 jal ra,3002a40 + 3002e7e: 87aa mv a5,a0 + 3002e80: 0017c793 xori a5,a5,1 + 3002e84: 9f81 uxtb a5 + 3002e86: cb91 beqz a5,3002e9a + 3002e88: 07c00593 li a1,124 + 3002e8c: 030067b7 lui a5,0x3006 + 3002e90: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e94: 3d49 jal ra,3002d26 + 3002e96: 4785 li a5,1 + 3002e98: aa81 j 3002fe8 + + *(unsigned int *)CRG_HOSC_CTRL2_ADDR = 0x306E; /* Optimized HOSC temperature drift performance parameter. */ + 3002e9a: 100017b7 lui a5,0x10001 + 3002e9e: f0478793 addi a5,a5,-252 # 10000f04 + 3002ea2: 670d lui a4,0x3 + 3002ea4: 06e70713 addi a4,a4,110 # 306e + 3002ea8: c398 sw a4,0(a5) + + CRG_RegStruct *reg = handle->baseAddress; + 3002eaa: fdc42783 lw a5,-36(s0) + 3002eae: 439c lw a5,0(a5) + 3002eb0: fef42623 sw a5,-20(s0) + g_crgBaseAddr = (void *)reg; + 3002eb4: 040007b7 lui a5,0x4000 + 3002eb8: fec42703 lw a4,-20(s0) + 3002ebc: 48e7aa23 sw a4,1172(a5) # 4000494 + /* Check the validity of the PLL parameter configuration. */ + if (CRG_IsValidPllConfig(handle) != BASE_STATUS_OK) { + 3002ec0: fdc42503 lw a0,-36(s0) + 3002ec4: 7a4000ef jal ra,3003668 + 3002ec8: 87aa mv a5,a0 + 3002eca: c399 beqz a5,3002ed0 + return BASE_STATUS_ERROR; + 3002ecc: 4785 li a5,1 + 3002ece: aa29 j 3002fe8 + } + /* Disable the write protection function of the CRG register. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3002ed0: 3449 jal ra,3002952 + + reg->PERI_CRG0.BIT.pll_ref_cksel = handle->pllRefClkSelect; + 3002ed2: fdc42783 lw a5,-36(s0) + 3002ed6: 43dc lw a5,4(a5) + 3002ed8: 8b85 andi a5,a5,1 + 3002eda: 0ff7f693 andi a3,a5,255 + 3002ede: fec42703 lw a4,-20(s0) + 3002ee2: 431c lw a5,0(a4) + 3002ee4: 8a85 andi a3,a3,1 + 3002ee6: 9bf9 andi a5,a5,-2 + 3002ee8: 8fd5 or a5,a5,a3 + 3002eea: c31c sw a5,0(a4) + reg->PERI_CRG1.BIT.pll_prediv = handle->pllPreDiv; + 3002eec: fdc42783 lw a5,-36(s0) + 3002ef0: 479c lw a5,8(a5) + 3002ef2: 8bbd andi a5,a5,15 + 3002ef4: 0ff7f693 andi a3,a5,255 + 3002ef8: fec42703 lw a4,-20(s0) + 3002efc: 435c lw a5,4(a4) + 3002efe: 8abd andi a3,a3,15 + 3002f00: 9bc1 andi a5,a5,-16 + 3002f02: 8fd5 or a5,a5,a3 + 3002f04: c35c sw a5,4(a4) + reg->PERI_CRG2.BIT.pll_fbdiv = handle->pllFbDiv; + 3002f06: fdc42783 lw a5,-36(s0) + 3002f0a: 47dc lw a5,12(a5) + 3002f0c: 0ff7f693 andi a3,a5,255 + 3002f10: fec42703 lw a4,-20(s0) + 3002f14: 471c lw a5,8(a4) + 3002f16: 0ff6f693 andi a3,a3,255 + 3002f1a: f007f793 andi a5,a5,-256 + 3002f1e: 8fd5 or a5,a5,a3 + 3002f20: c71c sw a5,8(a4) + reg->PERI_CRG3.BIT.pll_postdiv1 = handle->pllPostDiv; + 3002f22: fdc42783 lw a5,-36(s0) + 3002f26: 4b9c lw a5,16(a5) + 3002f28: 8bbd andi a5,a5,15 + 3002f2a: 0ff7f693 andi a3,a5,255 + 3002f2e: fec42703 lw a4,-20(s0) + 3002f32: 475c lw a5,12(a4) + 3002f34: 8abd andi a3,a3,15 + 3002f36: 9bc1 andi a5,a5,-16 + 3002f38: 8fd5 or a5,a5,a3 + 3002f3a: c75c sw a5,12(a4) + reg->PERI_CRG3.BIT.pll_postdiv2 = handle->handleEx.pllPostDiv2; + 3002f3c: fdc42783 lw a5,-36(s0) + 3002f40: 4fdc lw a5,28(a5) + 3002f42: 8bbd andi a5,a5,15 + 3002f44: 0ff7f693 andi a3,a5,255 + 3002f48: fec42703 lw a4,-20(s0) + 3002f4c: 475c lw a5,12(a4) + 3002f4e: 8abd andi a3,a3,15 + 3002f50: 0692 slli a3,a3,0x4 + 3002f52: f0f7f793 andi a5,a5,-241 + 3002f56: 8fd5 or a5,a5,a3 + 3002f58: c75c sw a5,12(a4) + reg->PERI_CRG4.BIT.pll_pd = BASE_CFG_UNSET; + 3002f5a: fec42703 lw a4,-20(s0) + 3002f5e: 4b1c lw a5,16(a4) + 3002f60: 9bf9 andi a5,a5,-2 + 3002f62: cb1c sw a5,16(a4) + + while (reg->PERI_CRG7.BIT.pll_lock != BASE_CFG_SET) { + 3002f64: 0001 nop + 3002f66: fec42783 lw a5,-20(s0) + 3002f6a: 4fdc lw a5,28(a5) + 3002f6c: 8b85 andi a5,a5,1 + 3002f6e: 0ff7f713 andi a4,a5,255 + 3002f72: 4785 li a5,1 + 3002f74: fef719e3 bne a4,a5,3002f66 + ; /* Wait for PLL to lock */ + } + + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3002f78: 3409 jal ra,300297a + /* Check the 1MHz clock parameter configuration. */ + if (CRG_IsValid1MHzConfig(handle) != BASE_STATUS_OK) { + 3002f7a: fdc42503 lw a0,-36(s0) + 3002f7e: 7ac000ef jal ra,300372a + 3002f82: 87aa mv a5,a0 + 3002f84: c399 beqz a5,3002f8a + return BASE_STATUS_ERROR; + 3002f86: 4785 li a5,1 + 3002f88: a085 j 3002fe8 + } + while (reg->HOSC_LOCK.BIT.hosc_lock != BASE_CFG_SET) { + 3002f8a: 0001 nop + 3002f8c: fec42703 lw a4,-20(s0) + 3002f90: 6785 lui a5,0x1 + 3002f92: 97ba add a5,a5,a4 + 3002f94: f107a783 lw a5,-240(a5) # f10 + 3002f98: 8b85 andi a5,a5,1 + 3002f9a: 0ff7f713 andi a4,a5,255 + 3002f9e: 4785 li a5,1 + 3002fa0: fef716e3 bne a4,a5,3002f8c + ; /* Wait for HOSC to lock */ + } + /* Set the Clock Source and Frequency Divider of the 1 MHz Clock. */ + reg->PERI_CRG67.BIT.clk_1m_div = handle->handleEx.clk1MDiv; + 3002fa4: fdc42783 lw a5,-36(s0) + 3002fa8: 53dc lw a5,36(a5) + 3002faa: 03f7f793 andi a5,a5,63 + 3002fae: 0ff7f693 andi a3,a5,255 + 3002fb2: fec42703 lw a4,-20(s0) + 3002fb6: 10c72783 lw a5,268(a4) + 3002fba: 03f6f693 andi a3,a3,63 + 3002fbe: fc07f793 andi a5,a5,-64 + 3002fc2: 8fd5 or a5,a5,a3 + 3002fc4: 10f72623 sw a5,268(a4) + reg->PERI_CRG66.BIT.clk_1m_ini_cksel = handle->handleEx.clk1MSelect; + 3002fc8: fdc42783 lw a5,-36(s0) + 3002fcc: 539c lw a5,32(a5) + 3002fce: 8b85 andi a5,a5,1 + 3002fd0: 0ff7f693 andi a3,a5,255 + 3002fd4: fec42703 lw a4,-20(s0) + 3002fd8: 10872783 lw a5,264(a4) + 3002fdc: 8a85 andi a3,a3,1 + 3002fde: 9bf9 andi a5,a5,-2 + 3002fe0: 8fd5 or a5,a5,a3 + 3002fe2: 10f72423 sw a5,264(a4) + return BASE_STATUS_OK; + 3002fe6: 4781 li a5,0 +} + 3002fe8: 853e mv a0,a5 + 3002fea: 50b2 lw ra,44(sp) + 3002fec: 5422 lw s0,40(sp) + 3002fee: 6145 addi sp,sp,48 + 3002ff0: 8082 ret + +03002ff2 : + * @param handle CRG Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Paramter check fail + */ +BASE_StatusType HAL_CRG_SetCoreClockSelect(CRG_Handle *handle) +{ + 3002ff2: 7179 addi sp,sp,-48 + 3002ff4: d606 sw ra,44(sp) + 3002ff6: d422 sw s0,40(sp) + 3002ff8: 1800 addi s0,sp,48 + 3002ffa: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != 0); + 3002ffe: fdc42783 lw a5,-36(s0) + 3003002: eb89 bnez a5,3003014 + 3003004: 10a00593 li a1,266 + 3003008: 030067b7 lui a5,0x3006 + 300300c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003010: 3b19 jal ra,3002d26 + 3003012: a001 j 3003012 + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3003014: fdc42783 lw a5,-36(s0) + 3003018: 4398 lw a4,0(a5) + 300301a: 100007b7 lui a5,0x10000 + 300301e: 00f70a63 beq a4,a5,3003032 + 3003022: 10b00593 li a1,267 + 3003026: 030067b7 lui a5,0x3006 + 300302a: 4f478513 addi a0,a5,1268 # 30064f4 + 300302e: 39e5 jal ra,3002d26 + 3003030: a001 j 3003030 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 3003032: fdc42783 lw a5,-36(s0) + 3003036: 4f9c lw a5,24(a5) + 3003038: 853e mv a0,a5 + 300303a: 3419 jal ra,3002a40 + 300303c: 87aa mv a5,a0 + 300303e: 0017c793 xori a5,a5,1 + 3003042: 9f81 uxtb a5 + 3003044: cb91 beqz a5,3003058 + 3003046: 10c00593 li a1,268 + 300304a: 030067b7 lui a5,0x3006 + 300304e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003052: 39d1 jal ra,3002d26 + 3003054: 4785 li a5,1 + 3003056: a005 j 3003076 + + CRG_RegStruct *reg = handle->baseAddress; + 3003058: fdc42783 lw a5,-36(s0) + 300305c: 439c lw a5,0(a5) + 300305e: fef42623 sw a5,-20(s0) + /* The write protection of the CRG register needs to be disabled. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3003062: 38c5 jal ra,3002952 + DCL_CRG_SetCoreClkSel(reg, handle->coreClkSelect); + 3003064: fdc42783 lw a5,-36(s0) + 3003068: 4f9c lw a5,24(a5) + 300306a: 85be mv a1,a5 + 300306c: fec42503 lw a0,-20(s0) + 3003070: 3199 jal ra,3002cb6 + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3003072: 3221 jal ra,300297a + + return BASE_STATUS_OK; + 3003074: 4781 li a5,0 +} + 3003076: 853e mv a0,a5 + 3003078: 50b2 lw ra,44(sp) + 300307a: 5422 lw s0,40(sp) + 300307c: 6145 addi sp,sp,48 + 300307e: 8082 ret + +03003080 : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +static inline unsigned int CRG_GetVcoFreq(void) +{ + 3003080: 1101 addi sp,sp,-32 + 3003082: ce06 sw ra,28(sp) + 3003084: cc22 sw s0,24(sp) + 3003086: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int regFbdiv; + CRG_RegStruct *crg = g_crgBaseAddr; + 3003088: 040007b7 lui a5,0x4000 + 300308c: 4947a783 lw a5,1172(a5) # 4000494 + 3003090: fef42623 sw a5,-20(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003094: fec42703 lw a4,-20(s0) + 3003098: 100007b7 lui a5,0x10000 + 300309c: 00f70a63 beq a4,a5,30030b0 + 30030a0: 12200593 li a1,290 + 30030a4: 030067b7 lui a5,0x3006 + 30030a8: 4f478513 addi a0,a5,1268 # 30064f4 + 30030ac: 39ad jal ra,3002d26 + 30030ae: a001 j 30030ae + CRG_ASSERT_PARAM((XTRAIL_FREQ <= 30000000U)); /* The maximum of the external clock source is 30000000U. */ + + freq = CRG_GetPllRefIni(crg->PERI_CRG0.BIT.pll_ref_cksel); + 30030b0: fec42783 lw a5,-20(s0) + 30030b4: 439c lw a5,0(a5) + 30030b6: 8b85 andi a5,a5,1 + 30030b8: 9f81 uxtb a5 + 30030ba: 853e mv a0,a5 + 30030bc: 25c1 jal ra,300377c + 30030be: fea42423 sw a0,-24(s0) + freq /= CRG_GetPreDivValue(crg->PERI_CRG1.BIT.pll_prediv); + 30030c2: fec42783 lw a5,-20(s0) + 30030c6: 43dc lw a5,4(a5) + 30030c8: 8bbd andi a5,a5,15 + 30030ca: 9f81 uxtb a5 + 30030cc: 853e mv a0,a5 + 30030ce: 2de1 jal ra,30037a6 + 30030d0: 872a mv a4,a0 + 30030d2: fe842783 lw a5,-24(s0) + 30030d6: 02e7d7b3 divu a5,a5,a4 + 30030da: fef42423 sw a5,-24(s0) + regFbdiv = CRG_GetPllFbDivValue(crg->PERI_CRG2.BIT.pll_fbdiv); /* Get the value of the fbdiv register. */ + 30030de: fec42783 lw a5,-20(s0) + 30030e2: 479c lw a5,8(a5) + 30030e4: 9f81 uxtb a5 + 30030e6: 853e mv a0,a5 + 30030e8: 25f5 jal ra,30037d4 + 30030ea: fea42223 sw a0,-28(s0) + freq *= (regFbdiv >= 0x06) ? regFbdiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 30030ee: fe442783 lw a5,-28(s0) + 30030f2: 4719 li a4,6 + 30030f4: 00e7f363 bgeu a5,a4,30030fa + 30030f8: 4799 li a5,6 + 30030fa: fe842703 lw a4,-24(s0) + 30030fe: 02f707b3 mul a5,a4,a5 + 3003102: fef42423 sw a5,-24(s0) + return freq; + 3003106: fe842783 lw a5,-24(s0) +} + 300310a: 853e mv a0,a5 + 300310c: 40f2 lw ra,28(sp) + 300310e: 4462 lw s0,24(sp) + 3003110: 6105 addi sp,sp,32 + 3003112: 8082 ret + +03003114 : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +unsigned int HAL_CRG_GetPllFreq(void) +{ + 3003114: 1101 addi sp,sp,-32 + 3003116: ce06 sw ra,28(sp) + 3003118: cc22 sw s0,24(sp) + 300311a: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int pllPostDivValue; + CRG_RegStruct *crg = g_crgBaseAddr; + 300311c: 040007b7 lui a5,0x4000 + 3003120: 4947a783 lw a5,1172(a5) # 4000494 + 3003124: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003128: fe842703 lw a4,-24(s0) + 300312c: 100007b7 lui a5,0x10000 + 3003130: 00f70a63 beq a4,a5,3003144 + 3003134: 13700593 li a1,311 + 3003138: 030067b7 lui a5,0x3006 + 300313c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003140: 36dd jal ra,3002d26 + 3003142: a001 j 3003142 + freq = CRG_GetVcoFreq(); + 3003144: 3f35 jal ra,3003080 + 3003146: fea42623 sw a0,-20(s0) + pllPostDivValue = CRG_GetPllPostDivValue((CRG_PllPostDiv)crg->PERI_CRG3.BIT.pll_postdiv1); + 300314a: fe842783 lw a5,-24(s0) + 300314e: 47dc lw a5,12(a5) + 3003150: 8bbd andi a5,a5,15 + 3003152: 9f81 uxtb a5 + 3003154: 853e mv a0,a5 + 3003156: 25c1 jal ra,3003816 + 3003158: fea42223 sw a0,-28(s0) + /* Calculate the PLL output clock frequency based on the VCO clock frequency and post-division coefficient. */ + if (pllPostDivValue != 0) { + 300315c: fe442783 lw a5,-28(s0) + 3003160: cb89 beqz a5,3003172 + freq /= pllPostDivValue; + 3003162: fec42703 lw a4,-20(s0) + 3003166: fe442783 lw a5,-28(s0) + 300316a: 02f757b3 divu a5,a4,a5 + 300316e: fef42623 sw a5,-20(s0) + } + return freq; + 3003172: fec42783 lw a5,-20(s0) +} + 3003176: 853e mv a0,a5 + 3003178: 40f2 lw ra,28(sp) + 300317a: 4462 lw s0,24(sp) + 300317c: 6105 addi sp,sp,32 + 300317e: 8082 ret + +03003180 : + * @brief Get Core Clock Frequence + * @param None + * @retval unsigned int Core clock frequency + */ +unsigned int HAL_CRG_GetCoreClkFreq(void) +{ + 3003180: 1101 addi sp,sp,-32 + 3003182: ce06 sw ra,28(sp) + 3003184: cc22 sw s0,24(sp) + 3003186: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int coreClkSelect; + CRG_RegStruct *crg = g_crgBaseAddr; + 3003188: 040007b7 lui a5,0x4000 + 300318c: 4947a783 lw a5,1172(a5) # 4000494 + 3003190: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003194: fe842703 lw a4,-24(s0) + 3003198: 100007b7 lui a5,0x10000 + 300319c: 00f70a63 beq a4,a5,30031b0 + 30031a0: 14c00593 li a1,332 + 30031a4: 030067b7 lui a5,0x3006 + 30031a8: 4f478513 addi a0,a5,1268 # 30064f4 + 30031ac: 3ead jal ra,3002d26 + 30031ae: a001 j 30031ae + coreClkSelect = crg->PERI_CRG64.BIT.clk_pst1_sw_sel; + 30031b0: fe842783 lw a5,-24(s0) + 30031b4: 1007a783 lw a5,256(a5) + 30031b8: 8b8d andi a5,a5,3 + 30031ba: 9f81 uxtb a5 + 30031bc: fef42223 sw a5,-28(s0) + switch (coreClkSelect) { + 30031c0: fe442783 lw a5,-28(s0) + 30031c4: 4705 li a4,1 + 30031c6: 02e78063 beq a5,a4,30031e6 + 30031ca: 4705 li a4,1 + 30031cc: 00e7e663 bltu a5,a4,30031d8 + 30031d0: 4709 li a4,2 + 30031d2: 02e78163 beq a5,a4,30031f4 + 30031d6: a01d j 30031fc + case CRG_CORE_CLK_SELECT_HOSC: /* The clock source is an internal high-speed clock. */ + freq = HOSC_FREQ; + 30031d8: 017d87b7 lui a5,0x17d8 + 30031dc: 84078793 addi a5,a5,-1984 # 17d7840 + 30031e0: fef42623 sw a5,-20(s0) + break; + 30031e4: a015 j 3003208 + + case CRG_CORE_CLK_SELECT_TCXO: /* The clock source is the external crystal oscillator clock. */ + freq = XTRAIL_FREQ; + 30031e6: 01c9c7b7 lui a5,0x1c9c + 30031ea: 38078793 addi a5,a5,896 # 1c9c380 + 30031ee: fef42623 sw a5,-20(s0) + break; + 30031f2: a819 j 3003208 + + case CRG_CORE_CLK_SELECT_PLL: /* The clock source is the PLL. */ + freq = HAL_CRG_GetPllFreq(); + 30031f4: 3705 jal ra,3003114 + 30031f6: fea42623 sw a0,-20(s0) + break; + 30031fa: a039 j 3003208 + + default: + freq = LOSC_FREQ; + 30031fc: 67a1 lui a5,0x8 + 30031fe: d0078793 addi a5,a5,-768 # 7d00 + 3003202: fef42623 sw a5,-20(s0) + break; + 3003206: 0001 nop + } + return freq; + 3003208: fec42783 lw a5,-20(s0) +} + 300320c: 853e mv a0,a5 + 300320e: 40f2 lw ra,28(sp) + 3003210: 4462 lw s0,24(sp) + 3003212: 6105 addi sp,sp,32 + 3003214: 8082 ret + +03003216 : + * @brief Get Clock Frequence + * @param handle CRG Handle + * @retval Frequece of IP + */ +unsigned int HAL_CRG_GetIpFreq(const void *baseAddress) +{ + 3003216: 7179 addi sp,sp,-48 + 3003218: d606 sw ra,44(sp) + 300321a: d422 sw s0,40(sp) + 300321c: 1800 addi s0,sp,48 + 300321e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3003222: fdc42783 lw a5,-36(s0) + 3003226: eb89 bnez a5,3003238 + 3003228: 16900593 li a1,361 + 300322c: 030067b7 lui a5,0x3006 + 3003230: 4f478513 addi a0,a5,1268 # 30064f4 + 3003234: 3ccd jal ra,3002d26 + 3003236: a001 j 3003236 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003238: 040007b7 lui a5,0x4000 + 300323c: 4947a703 lw a4,1172(a5) # 4000494 + 3003240: 100007b7 lui a5,0x10000 + 3003244: 00f70a63 beq a4,a5,3003258 + 3003248: 16a00593 li a1,362 + 300324c: 030067b7 lui a5,0x3006 + 3003250: 4f478513 addi a0,a5,1268 # 30064f4 + 3003254: 3cc9 jal ra,3002d26 + 3003256: a001 j 3003256 +#ifdef FPGA + /* Use this function to obtain the clock frequency during the FPGA phase. */ + return CHIP_GetIpFreqHz(baseAddress); +#else + unsigned int hclk = HAL_CRG_GetCoreClkFreq(); + 3003258: 3725 jal ra,3003180 + 300325a: fea42423 sw a0,-24(s0) + unsigned int freq = LOSC_FREQ; + 300325e: 67a1 lui a5,0x8 + 3003260: d0078793 addi a5,a5,-768 # 7d00 + 3003264: fef42623 sw a5,-20(s0) + unsigned int coreClkFreq; + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003268: fdc42503 lw a0,-36(s0) + 300326c: 2cc9 jal ra,300353e + 300326e: fea42223 sw a0,-28(s0) + if (p == NULL) { + 3003272: fe442783 lw a5,-28(s0) + 3003276: e781 bnez a5,300327e + return freq; + 3003278: fec42783 lw a5,-20(s0) + 300327c: a895 j 30032f0 + } + switch (p->type) { + 300327e: fe442783 lw a5,-28(s0) + 3003282: 43dc lw a5,4(a5) + 3003284: 4715 li a4,5 + 3003286: 04f76a63 bltu a4,a5,30032da + 300328a: 00279713 slli a4,a5,0x2 + 300328e: 030067b7 lui a5,0x3006 + 3003292: 53078793 addi a5,a5,1328 # 3006530 + 3003296: 97ba add a5,a5,a4 + 3003298: 439c lw a5,0(a5) + 300329a: 8782 jr a5 + case CRG_IP_NONE_CLK_SEL: + case CRG_IP_EFC: + case CRG_IP_ANA: + freq = hclk; /* Returns the internal high speed clock frequency. */ + 300329c: fe842783 lw a5,-24(s0) + 30032a0: fef42623 sw a5,-20(s0) + break; + 30032a4: a825 j 30032dc + + case CRG_IP_CAN: + freq = CRG_GetPllRefIni(g_crgBaseAddr->PERI_CRG0.BIT.pll_ref_cksel); + 30032a6: 040007b7 lui a5,0x4000 + 30032aa: 4947a783 lw a5,1172(a5) # 4000494 + 30032ae: 439c lw a5,0(a5) + 30032b0: 8b85 andi a5,a5,1 + 30032b2: 9f81 uxtb a5 + 30032b4: 853e mv a0,a5 + 30032b6: 21d9 jal ra,300377c + 30032b8: fea42623 sw a0,-20(s0) + break; + 30032bc: a005 j 30032dc + + case CRG_IP_ADC: + /* Get core clock frequence for calculating the ADC clock frequency. */ + coreClkFreq = HAL_CRG_GetCoreClkFreq(); + 30032be: 35c9 jal ra,3003180 + 30032c0: fea42023 sw a0,-32(s0) + freq = CRG_GetAdcIpFreq(p, CRG_GetVcoFreq(), coreClkFreq); + 30032c4: 3b75 jal ra,3003080 + 30032c6: 87aa mv a5,a0 + 30032c8: fe042603 lw a2,-32(s0) + 30032cc: 85be mv a1,a5 + 30032ce: fe442503 lw a0,-28(s0) + 30032d2: 2c85 jal ra,3003542 + 30032d4: fea42623 sw a0,-20(s0) + break; + 30032d8: a011 j 30032dc + + case CRG_IP_IWDG: /* The IWDG clock frequency is an internal low-speed clock. */ + default: + break; + 30032da: 0001 nop + } + if (freq == 0) { + 30032dc: fec42783 lw a5,-20(s0) + 30032e0: e791 bnez a5,30032ec + freq = LOSC_FREQ; + 30032e2: 67a1 lui a5,0x8 + 30032e4: d0078793 addi a5,a5,-768 # 7d00 + 30032e8: fef42623 sw a5,-20(s0) + } + return freq; + 30032ec: fec42783 lw a5,-20(s0) +#endif +} + 30032f0: 853e mv a0,a5 + 30032f2: 50b2 lw ra,44(sp) + 30032f4: 5422 lw s0,40(sp) + 30032f6: 6145 addi sp,sp,48 + 30032f8: 8082 ret + +030032fa : + * @param enable enable mask + * @retval BASE_STATUS_ERROR Can't find the Match or operation is not support + * @retval BASE_STATUS_OK Operation Success + */ +BASE_StatusType HAL_CRG_IpEnableSet(const void *baseAddress, unsigned int enable) +{ + 30032fa: 7179 addi sp,sp,-48 + 30032fc: d606 sw ra,44(sp) + 30032fe: d422 sw s0,40(sp) + 3003300: 1800 addi s0,sp,48 + 3003302: fca42e23 sw a0,-36(s0) + 3003306: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 300330a: fdc42783 lw a5,-36(s0) + 300330e: eb89 bnez a5,3003320 + 3003310: 19c00593 li a1,412 + 3003314: 030067b7 lui a5,0x3006 + 3003318: 4f478513 addi a0,a5,1268 # 30064f4 + 300331c: 3429 jal ra,3002d26 + 300331e: a001 j 300331e + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003320: 040007b7 lui a5,0x4000 + 3003324: 4947a703 lw a4,1172(a5) # 4000494 + 3003328: 100007b7 lui a5,0x10000 + 300332c: 00f70a63 beq a4,a5,3003340 + 3003330: 19d00593 li a1,413 + 3003334: 030067b7 lui a5,0x3006 + 3003338: 4f478513 addi a0,a5,1268 # 30064f4 + 300333c: 32ed jal ra,3002d26 + 300333e: a001 j 300333e + /* Check the validity of the input parameters. */ + CRG_PARAM_CHECK_WITH_RET((enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE), BASE_STATUS_ERROR); + 3003340: fd842703 lw a4,-40(s0) + 3003344: 4785 li a5,1 + 3003346: 00f70e63 beq a4,a5,3003362 + 300334a: fd842783 lw a5,-40(s0) + 300334e: cb91 beqz a5,3003362 + 3003350: 19f00593 li a1,415 + 3003354: 030067b7 lui a5,0x3006 + 3003358: 4f478513 addi a0,a5,1268 # 30064f4 + 300335c: 32e9 jal ra,3002d26 + 300335e: 4785 li a5,1 + 3003360: a0a5 j 30033c8 + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003362: fdc42503 lw a0,-36(s0) + 3003366: 2ae1 jal ra,300353e + 3003368: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 300336c: fec42783 lw a5,-20(s0) + 3003370: c799 beqz a5,300337e + 3003372: fec42783 lw a5,-20(s0) + 3003376: 43d8 lw a4,4(a5) + 3003378: 4795 li a5,5 + 300337a: 00e7f463 bgeu a5,a4,3003382 + return BASE_STATUS_ERROR; + 300337e: 4785 li a5,1 + 3003380: a0a1 j 30033c8 + } + if (g_ipClkProc[p->type].enableSet == NULL) { + 3003382: fec42783 lw a5,-20(s0) + 3003386: 43d4 lw a3,4(a5) + 3003388: 040007b7 lui a5,0x4000 + 300338c: 02478713 addi a4,a5,36 # 4000024 + 3003390: 02400793 li a5,36 + 3003394: 02f687b3 mul a5,a3,a5 + 3003398: 97ba add a5,a5,a4 + 300339a: 479c lw a5,8(a5) + 300339c: e399 bnez a5,30033a2 + return BASE_STATUS_ERROR; + 300339e: 4785 li a5,1 + 30033a0: a025 j 30033c8 + } + g_ipClkProc[p->type].enableSet(p, enable); + 30033a2: fec42783 lw a5,-20(s0) + 30033a6: 43d4 lw a3,4(a5) + 30033a8: 040007b7 lui a5,0x4000 + 30033ac: 02478713 addi a4,a5,36 # 4000024 + 30033b0: 02400793 li a5,36 + 30033b4: 02f687b3 mul a5,a3,a5 + 30033b8: 97ba add a5,a5,a4 + 30033ba: 479c lw a5,8(a5) + 30033bc: fd842583 lw a1,-40(s0) + 30033c0: fec42503 lw a0,-20(s0) + 30033c4: 9782 jalr a5 + return BASE_STATUS_OK; + 30033c6: 4781 li a5,0 +} + 30033c8: 853e mv a0,a5 + 30033ca: 50b2 lw ra,44(sp) + 30033cc: 5422 lw s0,40(sp) + 30033ce: 6145 addi sp,sp,48 + 30033d0: 8082 ret + +030033d2 : + * @param select clock select, @see CRG_APBLsClkSelect for ip in apb_ls_subsys or CRG_AdcClkSelect for adc + * @retval BASE_STATUS_OK success + * @retval BASE_STATUS_ERROR fail + */ +BASE_StatusType HAL_CRG_IpClkSelectSet(const void *baseAddress, unsigned int select) +{ + 30033d2: 7179 addi sp,sp,-48 + 30033d4: d606 sw ra,44(sp) + 30033d6: d422 sw s0,40(sp) + 30033d8: 1800 addi s0,sp,48 + 30033da: fca42e23 sw a0,-36(s0) + 30033de: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 30033e2: fdc42783 lw a5,-36(s0) + 30033e6: eb89 bnez a5,30033f8 + 30033e8: 1cd00593 li a1,461 + 30033ec: 030067b7 lui a5,0x3006 + 30033f0: 4f478513 addi a0,a5,1268 # 30064f4 + 30033f4: 2d8d jal ra,3003a66 + 30033f6: a001 j 30033f6 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30033f8: 040007b7 lui a5,0x4000 + 30033fc: 4947a703 lw a4,1172(a5) # 4000494 + 3003400: 100007b7 lui a5,0x10000 + 3003404: 00f70a63 beq a4,a5,3003418 + 3003408: 1ce00593 li a1,462 + 300340c: 030067b7 lui a5,0x3006 + 3003410: 4f478513 addi a0,a5,1268 # 30064f4 + 3003414: 2d89 jal ra,3003a66 + 3003416: a001 j 3003416 + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003418: fdc42503 lw a0,-36(s0) + 300341c: 220d jal ra,300353e + 300341e: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 3003422: fec42783 lw a5,-20(s0) + 3003426: c799 beqz a5,3003434 + 3003428: fec42783 lw a5,-20(s0) + 300342c: 43d8 lw a4,4(a5) + 300342e: 4795 li a5,5 + 3003430: 00e7f463 bgeu a5,a4,3003438 + return BASE_STATUS_ERROR; + 3003434: 4785 li a5,1 + 3003436: a0a1 j 300347e + } + if (g_ipClkProc[p->type].clkSelSet == NULL) { + 3003438: fec42783 lw a5,-20(s0) + 300343c: 43d4 lw a3,4(a5) + 300343e: 040007b7 lui a5,0x4000 + 3003442: 02478713 addi a4,a5,36 # 4000024 + 3003446: 02400793 li a5,36 + 300344a: 02f687b3 mul a5,a3,a5 + 300344e: 97ba add a5,a5,a4 + 3003450: 47dc lw a5,12(a5) + 3003452: e399 bnez a5,3003458 + return BASE_STATUS_ERROR; + 3003454: 4785 li a5,1 + 3003456: a025 j 300347e + } + g_ipClkProc[p->type].clkSelSet(p, select); /* Clock selection of the configuration module. */ + 3003458: fec42783 lw a5,-20(s0) + 300345c: 43d4 lw a3,4(a5) + 300345e: 040007b7 lui a5,0x4000 + 3003462: 02478713 addi a4,a5,36 # 4000024 + 3003466: 02400793 li a5,36 + 300346a: 02f687b3 mul a5,a3,a5 + 300346e: 97ba add a5,a5,a4 + 3003470: 47dc lw a5,12(a5) + 3003472: fd842583 lw a1,-40(s0) + 3003476: fec42503 lw a0,-20(s0) + 300347a: 9782 jalr a5 + return BASE_STATUS_OK; + 300347c: 4781 li a5,0 +} + 300347e: 853e mv a0,a5 + 3003480: 50b2 lw ra,44(sp) + 3003482: 5422 lw s0,40(sp) + 3003484: 6145 addi sp,sp,48 + 3003486: 8082 ret + +03003488 : + * @param div set div value + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Match Fail or Not support + */ +BASE_StatusType HAL_CRG_IpClkDivSet(const void *baseAddress, unsigned int div) +{ + 3003488: 7179 addi sp,sp,-48 + 300348a: d606 sw ra,44(sp) + 300348c: d422 sw s0,40(sp) + 300348e: 1800 addi s0,sp,48 + 3003490: fca42e23 sw a0,-36(s0) + 3003494: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3003498: fdc42783 lw a5,-36(s0) + 300349c: eb89 bnez a5,30034ae + 300349e: 22c00593 li a1,556 + 30034a2: 030067b7 lui a5,0x3006 + 30034a6: 4f478513 addi a0,a5,1268 # 30064f4 + 30034aa: 2b75 jal ra,3003a66 + 30034ac: a001 j 30034ac + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30034ae: 040007b7 lui a5,0x4000 + 30034b2: 4947a703 lw a4,1172(a5) # 4000494 + 30034b6: 100007b7 lui a5,0x10000 + 30034ba: 00f70a63 beq a4,a5,30034ce + 30034be: 22d00593 li a1,557 + 30034c2: 030067b7 lui a5,0x3006 + 30034c6: 4f478513 addi a0,a5,1268 # 30064f4 + 30034ca: 2b71 jal ra,3003a66 + 30034cc: a001 j 30034cc + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 30034ce: fdc42503 lw a0,-36(s0) + 30034d2: 20b5 jal ra,300353e + 30034d4: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 30034d8: fec42783 lw a5,-20(s0) + 30034dc: c799 beqz a5,30034ea + 30034de: fec42783 lw a5,-20(s0) + 30034e2: 43d8 lw a4,4(a5) + 30034e4: 4795 li a5,5 + 30034e6: 00e7f463 bgeu a5,a4,30034ee + return BASE_STATUS_ERROR; + 30034ea: 4785 li a5,1 + 30034ec: a0a1 j 3003534 + } + if (g_ipClkProc[p->type].clkDivSet == NULL) { + 30034ee: fec42783 lw a5,-20(s0) + 30034f2: 43d4 lw a3,4(a5) + 30034f4: 040007b7 lui a5,0x4000 + 30034f8: 02478713 addi a4,a5,36 # 4000024 + 30034fc: 02400793 li a5,36 + 3003500: 02f687b3 mul a5,a3,a5 + 3003504: 97ba add a5,a5,a4 + 3003506: 4b9c lw a5,16(a5) + 3003508: e399 bnez a5,300350e + return BASE_STATUS_ERROR; + 300350a: 4785 li a5,1 + 300350c: a025 j 3003534 + } + g_ipClkProc[p->type].clkDivSet(p, div); /* Configure the clock frequency divider of the module. */ + 300350e: fec42783 lw a5,-20(s0) + 3003512: 43d4 lw a3,4(a5) + 3003514: 040007b7 lui a5,0x4000 + 3003518: 02478713 addi a4,a5,36 # 4000024 + 300351c: 02400793 li a5,36 + 3003520: 02f687b3 mul a5,a3,a5 + 3003524: 97ba add a5,a5,a4 + 3003526: 4b9c lw a5,16(a5) + 3003528: fd842583 lw a1,-40(s0) + 300352c: fec42503 lw a0,-20(s0) + 3003530: 9782 jalr a5 + return BASE_STATUS_OK; + 3003532: 4781 li a5,0 +} + 3003534: 853e mv a0,a5 + 3003536: 50b2 lw ra,44(sp) + 3003538: 5422 lw s0,40(sp) + 300353a: 6145 addi sp,sp,48 + 300353c: 8082 ret + +0300353e : + 300353e: c6bfd06f j 30011a8 + +03003542 : + * @param coreClkFreq core clock rate + * @retval Ip Frequence + */ +static unsigned int CRG_GetAdcIpFreq(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int baseClkRate, + unsigned int coreClkFreq) +{ + 3003542: 7139 addi sp,sp,-64 + 3003544: de06 sw ra,60(sp) + 3003546: dc22 sw s0,56(sp) + 3003548: 0080 addi s0,sp,64 + 300354a: fca42623 sw a0,-52(s0) + 300354e: fcb42423 sw a1,-56(s0) + 3003552: fcc42223 sw a2,-60(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003556: fcc42783 lw a5,-52(s0) + 300355a: eb89 bnez a5,300356c + 300355c: 2af00593 li a1,687 + 3003560: 030067b7 lui a5,0x3006 + 3003564: 4f478513 addi a0,a5,1268 # 30064f4 + 3003568: 29fd jal ra,3003a66 + 300356a: a001 j 300356a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300356c: 040007b7 lui a5,0x4000 + 3003570: 4947a783 lw a5,1172(a5) # 4000494 + 3003574: eb89 bnez a5,3003586 + 3003576: 2b000593 li a1,688 + 300357a: 030067b7 lui a5,0x3006 + 300357e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003582: 21d5 jal ra,3003a66 + 3003584: a001 j 3003584 + + unsigned int clkSel; + unsigned int clkDiv; + unsigned int pst2Div; + unsigned int freq = 0; + 3003586: fe042623 sw zero,-20(s0) + + /* Obtains the clock source selection of the ADC. */ + const CRG_IpProc *proc = &g_ipClkProc[matchInfo->type]; + 300358a: fcc42783 lw a5,-52(s0) + 300358e: 43d8 lw a4,4(a5) + 3003590: 02400793 li a5,36 + 3003594: 02f70733 mul a4,a4,a5 + 3003598: 040007b7 lui a5,0x4000 + 300359c: 02478793 addi a5,a5,36 # 4000024 + 30035a0: 97ba add a5,a5,a4 + 30035a2: fef42423 sw a5,-24(s0) + if (proc->clkSelGet == NULL) { + 30035a6: fe842783 lw a5,-24(s0) + 30035aa: 4fdc lw a5,28(a5) + 30035ac: e399 bnez a5,30035b2 + return 0; + 30035ae: 4781 li a5,0 + 30035b0: a07d j 300365e + } + clkSel = proc->clkSelGet(matchInfo); + 30035b2: fe842783 lw a5,-24(s0) + 30035b6: 4fdc lw a5,28(a5) + 30035b8: fcc42503 lw a0,-52(s0) + 30035bc: 9782 jalr a5 + 30035be: fea42223 sw a0,-28(s0) + /* Calculate the frequency from the ADC's clock source. */ + if (clkSel == CRG_ADC_CLK_SYN_CORE) { + 30035c2: fe442703 lw a4,-28(s0) + 30035c6: 478d li a5,3 + 30035c8: 00f71763 bne a4,a5,30035d6 + freq = coreClkFreq; + 30035cc: fc442783 lw a5,-60(s0) + 30035d0: fef42623 sw a5,-20(s0) + 30035d4: a085 j 3003634 + } else if (clkSel == CRG_ADC_CLK_ASYN_HOSC) { + 30035d6: fe442783 lw a5,-28(s0) + 30035da: eb81 bnez a5,30035ea + freq = HOSC_FREQ; + 30035dc: 017d87b7 lui a5,0x17d8 + 30035e0: 84078793 addi a5,a5,-1984 # 17d7840 + 30035e4: fef42623 sw a5,-20(s0) + 30035e8: a0b1 j 3003634 + } else if (clkSel == CRG_ADC_CLK_ASYN_TCXO) { + 30035ea: fe442703 lw a4,-28(s0) + 30035ee: 4785 li a5,1 + 30035f0: 00f71963 bne a4,a5,3003602 + /* The maximum speed of the external clock source is 30000000U. */ + freq = (XTRAIL_FREQ > 30000000U) ? 0 : XTRAIL_FREQ; + 30035f4: 01c9c7b7 lui a5,0x1c9c + 30035f8: 38078793 addi a5,a5,896 # 1c9c380 + 30035fc: fef42623 sw a5,-20(s0) + 3003600: a815 j 3003634 + } else if (clkSel == CRG_ADC_CLK_ASYN_PLL_DIV) { + 3003602: fe442703 lw a4,-28(s0) + 3003606: 4789 li a5,2 + 3003608: 02f71663 bne a4,a5,3003634 + pst2Div = CRG_GetPllPostDivValue((CRG_PllPostDiv)g_crgBaseAddr->PERI_CRG3.BIT.pll_postdiv2); + 300360c: 040007b7 lui a5,0x4000 + 3003610: 4947a783 lw a5,1172(a5) # 4000494 + 3003614: 47dc lw a5,12(a5) + 3003616: 8391 srli a5,a5,0x4 + 3003618: 8bbd andi a5,a5,15 + 300361a: 9f81 uxtb a5 + 300361c: 853e mv a0,a5 + 300361e: 2ae5 jal ra,3003816 + 3003620: fea42023 sw a0,-32(s0) + freq = baseClkRate / pst2Div; + 3003624: fc842703 lw a4,-56(s0) + 3003628: fe042783 lw a5,-32(s0) + 300362c: 02f757b3 divu a5,a4,a5 + 3003630: fef42623 sw a5,-20(s0) + } + + /* Obtain the frequency divider based on the ADC clock source. */ + if (proc->clkDivGet == NULL) { + 3003634: fe842783 lw a5,-24(s0) + 3003638: 539c lw a5,32(a5) + 300363a: e399 bnez a5,3003640 + return 0; + 300363c: 4781 li a5,0 + 300363e: a005 j 300365e + } + clkDiv = proc->clkDivGet(matchInfo); + 3003640: fe842783 lw a5,-24(s0) + 3003644: 539c lw a5,32(a5) + 3003646: fcc42503 lw a0,-52(s0) + 300364a: 9782 jalr a5 + 300364c: fca42e23 sw a0,-36(s0) + /* Calculate the clock frequency of the ADC. */ + return (freq / (clkDiv + 1)); + 3003650: fdc42783 lw a5,-36(s0) + 3003654: 0785 addi a5,a5,1 + 3003656: fec42703 lw a4,-20(s0) + 300365a: 02f757b3 divu a5,a4,a5 +} + 300365e: 853e mv a0,a5 + 3003660: 50f2 lw ra,60(sp) + 3003662: 5462 lw s0,56(sp) + 3003664: 6121 addi sp,sp,64 + 3003666: 8082 ret + +03003668 : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValidPllConfig(const CRG_Handle *handle) +{ + 3003668: 7179 addi sp,sp,-48 + 300366a: d606 sw ra,44(sp) + 300366c: d422 sw s0,40(sp) + 300366e: 1800 addi s0,sp,48 + 3003670: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + unsigned int freq; + + freq = CRG_GetPllRefIni(handle->pllRefClkSelect); + 3003674: fdc42783 lw a5,-36(s0) + 3003678: 43dc lw a5,4(a5) + 300367a: 853e mv a0,a5 + 300367c: 2201 jal ra,300377c + 300367e: fea42623 sw a0,-20(s0) + preDiv = CRG_GetPreDivValue(handle->pllPreDiv); + 3003682: fdc42783 lw a5,-36(s0) + 3003686: 479c lw a5,8(a5) + 3003688: 853e mv a0,a5 + 300368a: 2a31 jal ra,30037a6 + 300368c: fea42423 sw a0,-24(s0) + /* Check the validity of the prescaled clock frequency. */ + if (!IsCrgValidPreDiv(freq, preDiv)) { + 3003690: fe842583 lw a1,-24(s0) + 3003694: fec42503 lw a0,-20(s0) + 3003698: c26ff0ef jal ra,3002abe + 300369c: 87aa mv a5,a0 + 300369e: 0017c793 xori a5,a5,1 + 30036a2: 9f81 uxtb a5 + 30036a4: c399 beqz a5,30036aa + return BASE_STATUS_ERROR; + 30036a6: 4785 li a5,1 + 30036a8: a8a5 j 3003720 + } + freq /= preDiv; + 30036aa: fec42703 lw a4,-20(s0) + 30036ae: fe842783 lw a5,-24(s0) + 30036b2: 02f757b3 divu a5,a4,a5 + 30036b6: fef42623 sw a5,-20(s0) + /* Check the validity of the clock frequency after frequency multiplication. */ + if (!IsCrgValidFdDiv(freq, handle->pllFbDiv)) { + 30036ba: fdc42783 lw a5,-36(s0) + 30036be: 47dc lw a5,12(a5) + 30036c0: 85be mv a1,a5 + 30036c2: fec42503 lw a0,-20(s0) + 30036c6: c56ff0ef jal ra,3002b1c + 30036ca: 87aa mv a5,a0 + 30036cc: 0017c793 xori a5,a5,1 + 30036d0: 9f81 uxtb a5 + 30036d2: c399 beqz a5,30036d8 + return BASE_STATUS_ERROR; + 30036d4: 4785 li a5,1 + 30036d6: a0a9 j 3003720 + } + freq *= (handle->pllFbDiv > 0x06) ? handle->pllFbDiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 30036d8: fdc42783 lw a5,-36(s0) + 30036dc: 47dc lw a5,12(a5) + 30036de: 4719 li a4,6 + 30036e0: 00e7f363 bgeu a5,a4,30036e6 + 30036e4: 4799 li a5,6 + 30036e6: fec42703 lw a4,-20(s0) + 30036ea: 02f707b3 mul a5,a4,a5 + 30036ee: fef42623 sw a5,-20(s0) + /* Check whether the PLL output frequency is valid. */ + if (IsCrgValidPostDiv(freq, handle->pllPostDiv) && IsCrgValidPostDiv2(freq, handle->handleEx.pllPostDiv2)) { + 30036f2: fdc42783 lw a5,-36(s0) + 30036f6: 4b9c lw a5,16(a5) + 30036f8: 85be mv a1,a5 + 30036fa: fec42503 lw a0,-20(s0) + 30036fe: ca8ff0ef jal ra,3002ba6 + 3003702: 87aa mv a5,a0 + 3003704: cf89 beqz a5,300371e + 3003706: fdc42783 lw a5,-36(s0) + 300370a: 4fdc lw a5,28(a5) + 300370c: 85be mv a1,a5 + 300370e: fec42503 lw a0,-20(s0) + 3003712: cdcff0ef jal ra,3002bee + 3003716: 87aa mv a5,a0 + 3003718: c399 beqz a5,300371e + return BASE_STATUS_OK; + 300371a: 4781 li a5,0 + 300371c: a011 j 3003720 + } + return BASE_STATUS_ERROR; + 300371e: 4785 li a5,1 +} + 3003720: 853e mv a0,a5 + 3003722: 50b2 lw ra,44(sp) + 3003724: 5422 lw s0,40(sp) + 3003726: 6145 addi sp,sp,48 + 3003728: 8082 ret + +0300372a : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValid1MHzConfig(const CRG_Handle *handle) +{ + 300372a: 7179 addi sp,sp,-48 + 300372c: d622 sw s0,44(sp) + 300372e: 1800 addi s0,sp,48 + 3003730: fca42e23 sw a0,-36(s0) + unsigned int freq; + /* Get the ref frequency of the 1 MHz clock. */ + freq = (handle->handleEx.clk1MSelect == CRG_1M_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003734: fdc42783 lw a5,-36(s0) + 3003738: 539c lw a5,32(a5) + 300373a: e791 bnez a5,3003746 + 300373c: 017d87b7 lui a5,0x17d8 + 3003740: 84078793 addi a5,a5,-1984 # 17d7840 + 3003744: a029 j 300374e + 3003746: 01c9c7b7 lui a5,0x1c9c + 300374a: 38078793 addi a5,a5,896 # 1c9c380 + 300374e: fef42623 sw a5,-20(s0) + /* Check whether the 1MHz output frequency is valid. */ + if ((freq / (handle->handleEx.clk1MDiv + 1)) == CRG_FREQ_1MHz) { + 3003752: fdc42783 lw a5,-36(s0) + 3003756: 53dc lw a5,36(a5) + 3003758: 0785 addi a5,a5,1 + 300375a: fec42703 lw a4,-20(s0) + 300375e: 02f75733 divu a4,a4,a5 + 3003762: 000f47b7 lui a5,0xf4 + 3003766: 24078793 addi a5,a5,576 # f4240 + 300376a: 00f71463 bne a4,a5,3003772 + return BASE_STATUS_OK; + 300376e: 4781 li a5,0 + 3003770: a011 j 3003774 + } + return BASE_STATUS_ERROR; + 3003772: 4785 li a5,1 +} + 3003774: 853e mv a0,a5 + 3003776: 5432 lw s0,44(sp) + 3003778: 6145 addi sp,sp,48 + 300377a: 8082 ret + +0300377c : + * @brief Get clock frequence + * @param crg CRG_RegStruct + * @retval The frequence fo clock + */ +static inline unsigned int CRG_GetPllRefIni(CRG_PllRefClkSelect pllRefClkSelect) +{ + 300377c: 1101 addi sp,sp,-32 + 300377e: ce22 sw s0,28(sp) + 3003780: 1000 addi s0,sp,32 + 3003782: fea42623 sw a0,-20(s0) + /* The maximum speed of the external clock source is 30000000U. */ + if (pllRefClkSelect == CRG_PLL_REF_CLK_SELECT_XTAL && XTRAIL_FREQ > 30000000U) { + return 0; + } + return (pllRefClkSelect == (unsigned int)CRG_PLL_REF_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003786: fec42783 lw a5,-20(s0) + 300378a: e791 bnez a5,3003796 + 300378c: 017d87b7 lui a5,0x17d8 + 3003790: 84078793 addi a5,a5,-1984 # 17d7840 + 3003794: a029 j 300379e + 3003796: 01c9c7b7 lui a5,0x1c9c + 300379a: 38078793 addi a5,a5,896 # 1c9c380 +} + 300379e: 853e mv a0,a5 + 30037a0: 4472 lw s0,28(sp) + 30037a2: 6105 addi sp,sp,32 + 30037a4: 8082 ret + +030037a6 : + * @brief Get previous division Value before PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPreDivValue(CRG_PllPreDiv pllPredDiv) +{ + 30037a6: 7179 addi sp,sp,-48 + 30037a8: d622 sw s0,44(sp) + 30037aa: 1800 addi s0,sp,48 + 30037ac: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + if (pllPredDiv <= CRG_PLL_PREDIV_1) { /* 0 or 1 returns PLL_PREDIV_OUT_1. */ + 30037b0: fdc42783 lw a5,-36(s0) + 30037b4: e789 bnez a5,30037be + preDiv = PLL_PREDIV_OUT_1; + 30037b6: 4785 li a5,1 + 30037b8: fef42623 sw a5,-20(s0) + 30037bc: a031 j 30037c8 + } else { + preDiv = pllPredDiv + 1; + 30037be: fdc42783 lw a5,-36(s0) + 30037c2: 0785 addi a5,a5,1 + 30037c4: fef42623 sw a5,-20(s0) + } + return preDiv; + 30037c8: fec42783 lw a5,-20(s0) +} + 30037cc: 853e mv a0,a5 + 30037ce: 5432 lw s0,44(sp) + 30037d0: 6145 addi sp,sp,48 + 30037d2: 8082 ret + +030037d4 : + * @brief Get PLL loop divider ratio + * @param crg CRG_RegStruct + * @retval PLL loop divider ratio + */ +static inline unsigned int CRG_GetPllFbDivValue(unsigned int pllFbDiv) +{ + 30037d4: 7179 addi sp,sp,-48 + 30037d6: d622 sw s0,44(sp) + 30037d8: 1800 addi s0,sp,48 + 30037da: fca42e23 sw a0,-36(s0) + unsigned int div = pllFbDiv; + 30037de: fdc42783 lw a5,-36(s0) + 30037e2: fef42623 sw a5,-20(s0) + /* Check the validity of the minimum frequency multiplication parameter. */ + if (div < CRG_PLL_FBDIV_MIN) { + 30037e6: fec42703 lw a4,-20(s0) + 30037ea: 4795 li a5,5 + 30037ec: 00e7e563 bltu a5,a4,30037f6 + div = CRG_PLL_FBDIV_MIN; + 30037f0: 4799 li a5,6 + 30037f2: fef42623 sw a5,-20(s0) + } + /* Check the validity of the maximum frequency multiplication parameter. */ + if (div > CRG_PLL_FBDIV_MAX) { + 30037f6: fec42703 lw a4,-20(s0) + 30037fa: 07f00793 li a5,127 + 30037fe: 00e7f663 bgeu a5,a4,300380a + div = CRG_PLL_FBDIV_MAX; + 3003802: 07f00793 li a5,127 + 3003806: fef42623 sw a5,-20(s0) + } + return div; + 300380a: fec42783 lw a5,-20(s0) +} + 300380e: 853e mv a0,a5 + 3003810: 5432 lw s0,44(sp) + 3003812: 6145 addi sp,sp,48 + 3003814: 8082 ret + +03003816 : + * @brief Get post division Value after PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPllPostDivValue(unsigned int pllPostDiv) +{ + 3003816: 7179 addi sp,sp,-48 + 3003818: d622 sw s0,44(sp) + 300381a: 1800 addi s0,sp,48 + 300381c: fca42e23 sw a0,-36(s0) + unsigned int div = pllPostDiv; + 3003820: fdc42783 lw a5,-36(s0) + 3003824: fef42623 sw a5,-20(s0) + if (div > CRG_PLL_POSTDIV_8) { + 3003828: fec42703 lw a4,-20(s0) + 300382c: 479d li a5,7 + 300382e: 00e7f663 bgeu a5,a4,300383a + div = (CRG_PLL_POSTDIV_8 + 1); /* If the postdiv is greater than 8, set this postdiv to 8. */ + 3003832: 47a1 li a5,8 + 3003834: fef42623 sw a5,-20(s0) + 3003838: a031 j 3003844 + } else { + div += 1; + 300383a: fec42783 lw a5,-20(s0) + 300383e: 0785 addi a5,a5,1 + 3003840: fef42623 sw a5,-20(s0) + } + return div; + 3003844: fec42783 lw a5,-20(s0) +} + 3003848: 853e mv a0,a5 + 300384a: 5432 lw s0,44(sp) + 300384c: 6145 addi sp,sp,48 + 300384e: 8082 ret + +03003850 : + * @param matchInfo IP without Clock select match info + * @param enable BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003850: 7179 addi sp,sp,-48 + 3003852: d606 sw ra,44(sp) + 3003854: d422 sw s0,40(sp) + 3003856: 1800 addi s0,sp,48 + 3003858: fca42e23 sw a0,-36(s0) + 300385c: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003860: fdc42783 lw a5,-36(s0) + 3003864: eb89 bnez a5,3003876 + 3003866: 34d00593 li a1,845 + 300386a: 030067b7 lui a5,0x3006 + 300386e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003872: 2ad5 jal ra,3003a66 + 3003874: a001 j 3003874 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003876: 040007b7 lui a5,0x4000 + 300387a: 4947a783 lw a5,1172(a5) # 4000494 + 300387e: eb89 bnez a5,3003890 + 3003880: 34e00593 li a1,846 + 3003884: 030067b7 lui a5,0x3006 + 3003888: 4f478513 addi a0,a5,1268 # 30064f4 + 300388c: 2ae9 jal ra,3003a66 + 300388e: a001 j 300388e + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003890: 040007b7 lui a5,0x4000 + 3003894: 4947a783 lw a5,1172(a5) # 4000494 + 3003898: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 300389c: fdc42783 lw a5,-36(s0) + 30038a0: 279e lhu a5,8(a5) + 30038a2: 873e mv a4,a5 + 30038a4: fec42783 lw a5,-20(s0) + 30038a8: 97ba add a5,a5,a4 + 30038aa: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 30038ae: fe842783 lw a5,-24(s0) + 30038b2: 439c lw a5,0(a5) + 30038b4: fef42223 sw a5,-28(s0) + if (enable & IP_CLK_ENABLE) { /* Set enable of target ip. */ + 30038b8: fd842783 lw a5,-40(s0) + 30038bc: 8b85 andi a5,a5,1 + 30038be: c7c1 beqz a5,3003946 + cfg.BIT.clkEnMask |= 1 << matchInfo->bitOffset; + 30038c0: fe442783 lw a5,-28(s0) + 30038c4: 9fa1 uxth a5 + 30038c6: 01079713 slli a4,a5,0x10 + 30038ca: 8741 srai a4,a4,0x10 + 30038cc: fdc42783 lw a5,-36(s0) + 30038d0: 27bc lbu a5,10(a5) + 30038d2: 86be mv a3,a5 + 30038d4: 4785 li a5,1 + 30038d6: 00d797b3 sll a5,a5,a3 + 30038da: 07c2 slli a5,a5,0x10 + 30038dc: 87c1 srai a5,a5,0x10 + 30038de: 8fd9 or a5,a5,a4 + 30038e0: 07c2 slli a5,a5,0x10 + 30038e2: 87c1 srai a5,a5,0x10 + 30038e4: 01079693 slli a3,a5,0x10 + 30038e8: 82c1 srli a3,a3,0x10 + 30038ea: fe442783 lw a5,-28(s0) + 30038ee: 6741 lui a4,0x10 + 30038f0: 177d addi a4,a4,-1 # ffff + 30038f2: 8f75 and a4,a4,a3 + 30038f4: 76c1 lui a3,0xffff0 + 30038f6: 8ff5 and a5,a5,a3 + 30038f8: 8fd9 or a5,a5,a4 + 30038fa: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); + 30038fe: fe442783 lw a5,-28(s0) + 3003902: 83c1 srli a5,a5,0x10 + 3003904: 9fa1 uxth a5 + 3003906: 01079713 slli a4,a5,0x10 + 300390a: 8741 srai a4,a4,0x10 + 300390c: fdc42783 lw a5,-36(s0) + 3003910: 27bc lbu a5,10(a5) + 3003912: 86be mv a3,a5 + 3003914: 4785 li a5,1 + 3003916: 00d797b3 sll a5,a5,a3 + 300391a: 07c2 slli a5,a5,0x10 + 300391c: 87c1 srai a5,a5,0x10 + 300391e: fff7c793 not a5,a5 + 3003922: 07c2 slli a5,a5,0x10 + 3003924: 87c1 srai a5,a5,0x10 + 3003926: 8ff9 and a5,a5,a4 + 3003928: 07c2 slli a5,a5,0x10 + 300392a: 87c1 srai a5,a5,0x10 + 300392c: 01079713 slli a4,a5,0x10 + 3003930: 8341 srli a4,a4,0x10 + 3003932: fe442783 lw a5,-28(s0) + 3003936: 0742 slli a4,a4,0x10 + 3003938: 66c1 lui a3,0x10 + 300393a: 16fd addi a3,a3,-1 # ffff + 300393c: 8ff5 and a5,a5,a3 + 300393e: 8fd9 or a5,a5,a4 + 3003940: fef42223 sw a5,-28(s0) + 3003944: a059 j 30039ca + } else { + cfg.BIT.clkEnMask &= ~(1 << matchInfo->bitOffset); /* Disable of target ip. */ + 3003946: fe442783 lw a5,-28(s0) + 300394a: 9fa1 uxth a5 + 300394c: 01079713 slli a4,a5,0x10 + 3003950: 8741 srai a4,a4,0x10 + 3003952: fdc42783 lw a5,-36(s0) + 3003956: 27bc lbu a5,10(a5) + 3003958: 86be mv a3,a5 + 300395a: 4785 li a5,1 + 300395c: 00d797b3 sll a5,a5,a3 + 3003960: 07c2 slli a5,a5,0x10 + 3003962: 87c1 srai a5,a5,0x10 + 3003964: fff7c793 not a5,a5 + 3003968: 07c2 slli a5,a5,0x10 + 300396a: 87c1 srai a5,a5,0x10 + 300396c: 8ff9 and a5,a5,a4 + 300396e: 07c2 slli a5,a5,0x10 + 3003970: 87c1 srai a5,a5,0x10 + 3003972: 01079693 slli a3,a5,0x10 + 3003976: 82c1 srli a3,a3,0x10 + 3003978: fe442783 lw a5,-28(s0) + 300397c: 6741 lui a4,0x10 + 300397e: 177d addi a4,a4,-1 # ffff + 3003980: 8f75 and a4,a4,a3 + 3003982: 76c1 lui a3,0xffff0 + 3003984: 8ff5 and a5,a5,a3 + 3003986: 8fd9 or a5,a5,a4 + 3003988: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq |= (1 << matchInfo->bitOffset); + 300398c: fe442783 lw a5,-28(s0) + 3003990: 83c1 srli a5,a5,0x10 + 3003992: 9fa1 uxth a5 + 3003994: 01079713 slli a4,a5,0x10 + 3003998: 8741 srai a4,a4,0x10 + 300399a: fdc42783 lw a5,-36(s0) + 300399e: 27bc lbu a5,10(a5) + 30039a0: 86be mv a3,a5 + 30039a2: 4785 li a5,1 + 30039a4: 00d797b3 sll a5,a5,a3 + 30039a8: 07c2 slli a5,a5,0x10 + 30039aa: 87c1 srai a5,a5,0x10 + 30039ac: 8fd9 or a5,a5,a4 + 30039ae: 07c2 slli a5,a5,0x10 + 30039b0: 87c1 srai a5,a5,0x10 + 30039b2: 01079713 slli a4,a5,0x10 + 30039b6: 8341 srli a4,a4,0x10 + 30039b8: fe442783 lw a5,-28(s0) + 30039bc: 0742 slli a4,a4,0x10 + 30039be: 66c1 lui a3,0x10 + 30039c0: 16fd addi a3,a3,-1 # ffff + 30039c2: 8ff5 and a5,a5,a3 + 30039c4: 8fd9 or a5,a5,a4 + 30039c6: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 30039ca: fe442703 lw a4,-28(s0) + 30039ce: fe842783 lw a5,-24(s0) + 30039d2: c398 sw a4,0(a5) +} + 30039d4: 0001 nop + 30039d6: 50b2 lw ra,44(sp) + 30039d8: 5422 lw s0,40(sp) + 30039da: 6145 addi sp,sp,48 + 30039dc: 8082 ret + +030039de : + * @brief Get Enable status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock Enable status + */ +static unsigned int CRG_IpWoClkSelEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30039de: 7179 addi sp,sp,-48 + 30039e0: d606 sw ra,44(sp) + 30039e2: d422 sw s0,40(sp) + 30039e4: 1800 addi s0,sp,48 + 30039e6: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30039ea: fdc42783 lw a5,-36(s0) + 30039ee: eb89 bnez a5,3003a00 + 30039f0: 36500593 li a1,869 + 30039f4: 030067b7 lui a5,0x3006 + 30039f8: 4f478513 addi a0,a5,1268 # 30064f4 + 30039fc: 20ad jal ra,3003a66 + 30039fe: a001 j 30039fe + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003a00: 040007b7 lui a5,0x4000 + 3003a04: 4947a783 lw a5,1172(a5) # 4000494 + 3003a08: eb89 bnez a5,3003a1a + 3003a0a: 36600593 li a1,870 + 3003a0e: 030067b7 lui a5,0x3006 + 3003a12: 4f478513 addi a0,a5,1268 # 30064f4 + 3003a16: 2881 jal ra,3003a66 + 3003a18: a001 j 3003a18 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003a1a: 040007b7 lui a5,0x4000 + 3003a1e: 4947a783 lw a5,1172(a5) # 4000494 + 3003a22: fef42623 sw a5,-20(s0) + /* Get enable status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003a26: fdc42783 lw a5,-36(s0) + 3003a2a: 279e lhu a5,8(a5) + 3003a2c: 873e mv a4,a5 + 3003a2e: fec42783 lw a5,-20(s0) + 3003a32: 97ba add a5,a5,a4 + 3003a34: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + + cfg.value = p->value; + 3003a38: fe842783 lw a5,-24(s0) + 3003a3c: 439c lw a5,0(a5) + 3003a3e: fef42223 sw a5,-28(s0) + return (cfg.BIT.clkEnMask & (1 << matchInfo->bitOffset)) == 0 ? false : true; + 3003a42: fe442783 lw a5,-28(s0) + 3003a46: 9fa1 uxth a5 + 3003a48: 873e mv a4,a5 + 3003a4a: fdc42783 lw a5,-36(s0) + 3003a4e: 27bc lbu a5,10(a5) + 3003a50: 40f757b3 sra a5,a4,a5 + 3003a54: 8b85 andi a5,a5,1 + 3003a56: 00f037b3 snez a5,a5 + 3003a5a: 9f81 uxtb a5 +} + 3003a5c: 853e mv a0,a5 + 3003a5e: 50b2 lw ra,44(sp) + 3003a60: 5422 lw s0,40(sp) + 3003a62: 6145 addi sp,sp,48 + 3003a64: 8082 ret + +03003a66 : + 3003a66: c48fe06f j 3001eae + +03003a6a : + * @param matchInfo IP without Clock select match info + * @param reset BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelResetSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int reset) +{ + 3003a6a: 7179 addi sp,sp,-48 + 3003a6c: d606 sw ra,44(sp) + 3003a6e: d422 sw s0,40(sp) + 3003a70: 1800 addi s0,sp,48 + 3003a72: fca42e23 sw a0,-36(s0) + 3003a76: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003a7a: fdc42783 lw a5,-36(s0) + 3003a7e: eb89 bnez a5,3003a90 + 3003a80: 37900593 li a1,889 + 3003a84: 030067b7 lui a5,0x3006 + 3003a88: 4f478513 addi a0,a5,1268 # 30064f4 + 3003a8c: 3fe9 jal ra,3003a66 + 3003a8e: a001 j 3003a8e + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003a90: 040007b7 lui a5,0x4000 + 3003a94: 4947a783 lw a5,1172(a5) # 4000494 + 3003a98: eb89 bnez a5,3003aaa + 3003a9a: 37a00593 li a1,890 + 3003a9e: 030067b7 lui a5,0x3006 + 3003aa2: 4f478513 addi a0,a5,1268 # 30064f4 + 3003aa6: 37c1 jal ra,3003a66 + 3003aa8: a001 j 3003aa8 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003aaa: 040007b7 lui a5,0x4000 + 3003aae: 4947a783 lw a5,1172(a5) # 4000494 + 3003ab2: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003ab6: fdc42783 lw a5,-36(s0) + 3003aba: 279e lhu a5,8(a5) + 3003abc: 873e mv a4,a5 + 3003abe: fec42783 lw a5,-20(s0) + 3003ac2: 97ba add a5,a5,a4 + 3003ac4: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003ac8: fe842783 lw a5,-24(s0) + 3003acc: 439c lw a5,0(a5) + 3003ace: fef42223 sw a5,-28(s0) + if (reset & BASE_CFG_SET) { + 3003ad2: fd842783 lw a5,-40(s0) + 3003ad6: 8b85 andi a5,a5,1 + 3003ad8: c3a9 beqz a5,3003b1a + cfg.BIT.softResetReq |= 1 << matchInfo->bitOffset; /* reset of target ip. */ + 3003ada: fe442783 lw a5,-28(s0) + 3003ade: 83c1 srli a5,a5,0x10 + 3003ae0: 9fa1 uxth a5 + 3003ae2: 01079713 slli a4,a5,0x10 + 3003ae6: 8741 srai a4,a4,0x10 + 3003ae8: fdc42783 lw a5,-36(s0) + 3003aec: 27bc lbu a5,10(a5) + 3003aee: 86be mv a3,a5 + 3003af0: 4785 li a5,1 + 3003af2: 00d797b3 sll a5,a5,a3 + 3003af6: 07c2 slli a5,a5,0x10 + 3003af8: 87c1 srai a5,a5,0x10 + 3003afa: 8fd9 or a5,a5,a4 + 3003afc: 07c2 slli a5,a5,0x10 + 3003afe: 87c1 srai a5,a5,0x10 + 3003b00: 01079713 slli a4,a5,0x10 + 3003b04: 8341 srli a4,a4,0x10 + 3003b06: fe442783 lw a5,-28(s0) + 3003b0a: 0742 slli a4,a4,0x10 + 3003b0c: 66c1 lui a3,0x10 + 3003b0e: 16fd addi a3,a3,-1 # ffff + 3003b10: 8ff5 and a5,a5,a3 + 3003b12: 8fd9 or a5,a5,a4 + 3003b14: fef42223 sw a5,-28(s0) + 3003b18: a0a1 j 3003b60 + } else { + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); /* Undo reset of target ip. */ + 3003b1a: fe442783 lw a5,-28(s0) + 3003b1e: 83c1 srli a5,a5,0x10 + 3003b20: 9fa1 uxth a5 + 3003b22: 01079713 slli a4,a5,0x10 + 3003b26: 8741 srai a4,a4,0x10 + 3003b28: fdc42783 lw a5,-36(s0) + 3003b2c: 27bc lbu a5,10(a5) + 3003b2e: 86be mv a3,a5 + 3003b30: 4785 li a5,1 + 3003b32: 00d797b3 sll a5,a5,a3 + 3003b36: 07c2 slli a5,a5,0x10 + 3003b38: 87c1 srai a5,a5,0x10 + 3003b3a: fff7c793 not a5,a5 + 3003b3e: 07c2 slli a5,a5,0x10 + 3003b40: 87c1 srai a5,a5,0x10 + 3003b42: 8ff9 and a5,a5,a4 + 3003b44: 07c2 slli a5,a5,0x10 + 3003b46: 87c1 srai a5,a5,0x10 + 3003b48: 01079713 slli a4,a5,0x10 + 3003b4c: 8341 srli a4,a4,0x10 + 3003b4e: fe442783 lw a5,-28(s0) + 3003b52: 0742 slli a4,a4,0x10 + 3003b54: 66c1 lui a3,0x10 + 3003b56: 16fd addi a3,a3,-1 # ffff + 3003b58: 8ff5 and a5,a5,a3 + 3003b5a: 8fd9 or a5,a5,a4 + 3003b5c: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3003b60: fe442703 lw a4,-28(s0) + 3003b64: fe842783 lw a5,-24(s0) + 3003b68: c398 sw a4,0(a5) +} + 3003b6a: 0001 nop + 3003b6c: 50b2 lw ra,44(sp) + 3003b6e: 5422 lw s0,40(sp) + 3003b70: 6145 addi sp,sp,48 + 3003b72: 8082 ret + +03003b74 : + * @brief Get Reset status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock select reset status + */ +static unsigned int CRG_IpWoClkSelResetGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003b74: 7179 addi sp,sp,-48 + 3003b76: d606 sw ra,44(sp) + 3003b78: d422 sw s0,40(sp) + 3003b7a: 1800 addi s0,sp,48 + 3003b7c: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003b80: fdc42783 lw a5,-36(s0) + 3003b84: eb89 bnez a5,3003b96 + 3003b86: 38f00593 li a1,911 + 3003b8a: 030067b7 lui a5,0x3006 + 3003b8e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003b92: 3dd1 jal ra,3003a66 + 3003b94: a001 j 3003b94 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003b96: 040007b7 lui a5,0x4000 + 3003b9a: 4947a783 lw a5,1172(a5) # 4000494 + 3003b9e: eb89 bnez a5,3003bb0 + 3003ba0: 39000593 li a1,912 + 3003ba4: 030067b7 lui a5,0x3006 + 3003ba8: 4f478513 addi a0,a5,1268 # 30064f4 + 3003bac: 3d6d jal ra,3003a66 + 3003bae: a001 j 3003bae + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003bb0: 040007b7 lui a5,0x4000 + 3003bb4: 4947a783 lw a5,1172(a5) # 4000494 + 3003bb8: fef42623 sw a5,-20(s0) + /* Get the reset status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003bbc: fdc42783 lw a5,-36(s0) + 3003bc0: 279e lhu a5,8(a5) + 3003bc2: 873e mv a4,a5 + 3003bc4: fec42783 lw a5,-20(s0) + 3003bc8: 97ba add a5,a5,a4 + 3003bca: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003bce: fe842783 lw a5,-24(s0) + 3003bd2: 439c lw a5,0(a5) + 3003bd4: fef42223 sw a5,-28(s0) + return (cfg.BIT.softResetReq & (1 << matchInfo->bitOffset)) ? BASE_CFG_SET : BASE_CFG_UNSET; + 3003bd8: fe442783 lw a5,-28(s0) + 3003bdc: 83c1 srli a5,a5,0x10 + 3003bde: 9fa1 uxth a5 + 3003be0: 873e mv a4,a5 + 3003be2: fdc42783 lw a5,-36(s0) + 3003be6: 27bc lbu a5,10(a5) + 3003be8: 40f757b3 sra a5,a4,a5 + 3003bec: 8b85 andi a5,a5,1 + 3003bee: 00f037b3 snez a5,a5 + 3003bf2: 9f81 uxtb a5 +} + 3003bf4: 853e mv a0,a5 + 3003bf6: 50b2 lw ra,44(sp) + 3003bf8: 5422 lw s0,40(sp) + 3003bfa: 6145 addi sp,sp,48 + 3003bfc: 8082 ret + +03003bfe : + * @param matchInfo ADC match info + * @param enable IP_CLK_ENABLE + * @retval None + */ +static void CRG_AdcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003bfe: 7179 addi sp,sp,-48 + 3003c00: d606 sw ra,44(sp) + 3003c02: d422 sw s0,40(sp) + 3003c04: 1800 addi s0,sp,48 + 3003c06: fca42e23 sw a0,-36(s0) + 3003c0a: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003c0e: fdc42783 lw a5,-36(s0) + 3003c12: eb89 bnez a5,3003c24 + 3003c14: 3a200593 li a1,930 + 3003c18: 030067b7 lui a5,0x3006 + 3003c1c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003c20: 3599 jal ra,3003a66 + 3003c22: a001 j 3003c22 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003c24: 040007b7 lui a5,0x4000 + 3003c28: 4947a783 lw a5,1172(a5) # 4000494 + 3003c2c: eb89 bnez a5,3003c3e + 3003c2e: 3a300593 li a1,931 + 3003c32: 030067b7 lui a5,0x3006 + 3003c36: 4f478513 addi a0,a5,1268 # 30064f4 + 3003c3a: 3535 jal ra,3003a66 + 3003c3c: a001 j 3003c3c + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003c3e: 040007b7 lui a5,0x4000 + 3003c42: 4947a783 lw a5,1172(a5) # 4000494 + 3003c46: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003c4a: fdc42783 lw a5,-36(s0) + 3003c4e: 279e lhu a5,8(a5) + 3003c50: 873e mv a4,a5 + 3003c52: fec42783 lw a5,-20(s0) + 3003c56: 97ba add a5,a5,a4 + 3003c58: fef42423 sw a5,-24(s0) + CRG_AdcIpCfg cfg; + cfg.value[1] = p->value[1]; + 3003c5c: fe842783 lw a5,-24(s0) + 3003c60: 43dc lw a5,4(a5) + 3003c62: fef42223 sw a5,-28(s0) + if (enable) { /* Enables and Deassert reset the ADC clock. */ + 3003c66: fd842783 lw a5,-40(s0) + 3003c6a: cf99 beqz a5,3003c88 + cfg.BIT.clk_adc_cken = BASE_CFG_SET; + 3003c6c: fe442783 lw a5,-28(s0) + 3003c70: 0017e793 ori a5,a5,1 + 3003c74: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003c78: fe442783 lw a5,-28(s0) + 3003c7c: 7741 lui a4,0xffff0 + 3003c7e: 177d addi a4,a4,-1 # fffeffff + 3003c80: 8ff9 and a5,a5,a4 + 3003c82: fef42223 sw a5,-28(s0) + 3003c86: a829 j 3003ca0 + } else { /* Disable and reset the ADC clock. */ + cfg.BIT.clk_adc_cken = BASE_CFG_UNSET; + 3003c88: fe442783 lw a5,-28(s0) + 3003c8c: 9bf9 andi a5,a5,-2 + 3003c8e: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003c92: fe442783 lw a5,-28(s0) + 3003c96: 7741 lui a4,0xffff0 + 3003c98: 177d addi a4,a4,-1 # fffeffff + 3003c9a: 8ff9 and a5,a5,a4 + 3003c9c: fef42223 sw a5,-28(s0) + } + p->value[1] = cfg.value[1]; + 3003ca0: fe442703 lw a4,-28(s0) + 3003ca4: fe842783 lw a5,-24(s0) + 3003ca8: c3d8 sw a4,4(a5) +} + 3003caa: 0001 nop + 3003cac: 50b2 lw ra,44(sp) + 3003cae: 5422 lw s0,40(sp) + 3003cb0: 6145 addi sp,sp,48 + 3003cb2: 8082 ret + +03003cb4 : + * @brief Get Enable status of ADC + * @param matchInfo ADC match info + * @retval Cken of ADC + */ +static unsigned int CRG_AdcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003cb4: 7179 addi sp,sp,-48 + 3003cb6: d606 sw ra,44(sp) + 3003cb8: d422 sw s0,40(sp) + 3003cba: 1800 addi s0,sp,48 + 3003cbc: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003cc0: fdc42783 lw a5,-36(s0) + 3003cc4: eb89 bnez a5,3003cd6 + 3003cc6: 3ba00593 li a1,954 + 3003cca: 030067b7 lui a5,0x3006 + 3003cce: 4f478513 addi a0,a5,1268 # 30064f4 + 3003cd2: 3b51 jal ra,3003a66 + 3003cd4: a001 j 3003cd4 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003cd6: 040007b7 lui a5,0x4000 + 3003cda: 4947a783 lw a5,1172(a5) # 4000494 + 3003cde: eb89 bnez a5,3003cf0 + 3003ce0: 3bb00593 li a1,955 + 3003ce4: 030067b7 lui a5,0x3006 + 3003ce8: 4f478513 addi a0,a5,1268 # 30064f4 + 3003cec: 3bad jal ra,3003a66 + 3003cee: a001 j 3003cee + unsigned int enable; + /* Get the enable status of the ADC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003cf0: 040007b7 lui a5,0x4000 + 3003cf4: 4947a783 lw a5,1172(a5) # 4000494 + 3003cf8: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003cfc: fdc42783 lw a5,-36(s0) + 3003d00: 279e lhu a5,8(a5) + 3003d02: 873e mv a4,a5 + 3003d04: fec42783 lw a5,-20(s0) + 3003d08: 97ba add a5,a5,a4 + 3003d0a: fef42423 sw a5,-24(s0) + enable = ((p->BIT.clk_adc_cken != 0)) ? IP_CLK_ENABLE : IP_CLK_DISABLE; + 3003d0e: fe842783 lw a5,-24(s0) + 3003d12: 43dc lw a5,4(a5) + 3003d14: 8b85 andi a5,a5,1 + 3003d16: 9f81 uxtb a5 + 3003d18: c399 beqz a5,3003d1e + 3003d1a: 4785 li a5,1 + 3003d1c: a011 j 3003d20 + 3003d1e: 4781 li a5,0 + 3003d20: fef42223 sw a5,-28(s0) + return enable; + 3003d24: fe442783 lw a5,-28(s0) +} + 3003d28: 853e mv a0,a5 + 3003d2a: 50b2 lw ra,44(sp) + 3003d2c: 5422 lw s0,40(sp) + 3003d2e: 6145 addi sp,sp,48 + 3003d30: 8082 ret + +03003d32 : + * @param matchInfo ADC match info + * @param clkSelect @see CRG_AdcClkSelect + * @retval None + */ +static void CRG_AdcClkSelectSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int clkSelect) +{ + 3003d32: 7179 addi sp,sp,-48 + 3003d34: d606 sw ra,44(sp) + 3003d36: d422 sw s0,40(sp) + 3003d38: 1800 addi s0,sp,48 + 3003d3a: fca42e23 sw a0,-36(s0) + 3003d3e: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003d42: fdc42783 lw a5,-36(s0) + 3003d46: eb89 bnez a5,3003d58 + 3003d48: 3cc00593 li a1,972 + 3003d4c: 030067b7 lui a5,0x3006 + 3003d50: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d54: 3b09 jal ra,3003a66 + 3003d56: a001 j 3003d56 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003d58: 040007b7 lui a5,0x4000 + 3003d5c: 4947a783 lw a5,1172(a5) # 4000494 + 3003d60: eb89 bnez a5,3003d72 + 3003d62: 3cd00593 li a1,973 + 3003d66: 030067b7 lui a5,0x3006 + 3003d6a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d6e: 39e5 jal ra,3003a66 + 3003d70: a001 j 3003d70 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003d72: 040007b7 lui a5,0x4000 + 3003d76: 4947a703 lw a4,1172(a5) # 4000494 + 3003d7a: 100007b7 lui a5,0x10000 + 3003d7e: 00f70a63 beq a4,a5,3003d92 + 3003d82: 3ce00593 li a1,974 + 3003d86: 030067b7 lui a5,0x3006 + 3003d8a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d8e: 39e1 jal ra,3003a66 + 3003d90: a001 j 3003d90 + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkModeSelect(clkSelect)); + 3003d92: fd842503 lw a0,-40(s0) + 3003d96: ea1fe0ef jal ra,3002c36 + 3003d9a: 87aa mv a5,a0 + 3003d9c: 0017c793 xori a5,a5,1 + 3003da0: 9f81 uxtb a5 + 3003da2: cb89 beqz a5,3003db4 + 3003da4: 3cf00593 li a1,975 + 3003da8: 030067b7 lui a5,0x3006 + 3003dac: 4f478513 addi a0,a5,1268 # 30064f4 + 3003db0: 395d jal ra,3003a66 + 3003db2: a89d j 3003e28 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003db4: 040007b7 lui a5,0x4000 + 3003db8: 4947a783 lw a5,1172(a5) # 4000494 + 3003dbc: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003dc0: fdc42783 lw a5,-36(s0) + 3003dc4: 279e lhu a5,8(a5) + 3003dc6: 873e mv a4,a5 + 3003dc8: fec42783 lw a5,-20(s0) + 3003dcc: 97ba add a5,a5,a4 + 3003dce: fef42423 sw a5,-24(s0) + if (clkSelect == CRG_ADC_CLK_SYN_CORE) { + 3003dd2: fd842703 lw a4,-40(s0) + 3003dd6: 478d li a5,3 + 3003dd8: 00f71a63 bne a4,a5,3003dec + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_SET; /* use sync clock */ + 3003ddc: fe842703 lw a4,-24(s0) + 3003de0: 435c lw a5,4(a4) + 3003de2: 010006b7 lui a3,0x1000 + 3003de6: 8fd5 or a5,a5,a3 + 3003de8: c35c sw a5,4(a4) + 3003dea: a83d j 3003e28 + } else { + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3003dec: b67fe0ef jal ra,3002952 + g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel = clkSelect; /* write clock selection */ + 3003df0: 040007b7 lui a5,0x4000 + 3003df4: 4947a703 lw a4,1172(a5) # 4000494 + 3003df8: fd842783 lw a5,-40(s0) + 3003dfc: 8b8d andi a5,a5,3 + 3003dfe: 0ff7f693 andi a3,a5,255 + 3003e02: 10072783 lw a5,256(a4) + 3003e06: 8a8d andi a3,a3,3 + 3003e08: 0692 slli a3,a3,0x4 + 3003e0a: fcf7f793 andi a5,a5,-49 + 3003e0e: 8fd5 or a5,a5,a3 + 3003e10: 10f72023 sw a5,256(a4) + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3003e14: b67fe0ef jal ra,300297a + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_UNSET; + 3003e18: fe842703 lw a4,-24(s0) + 3003e1c: 435c lw a5,4(a4) + 3003e1e: ff0006b7 lui a3,0xff000 + 3003e22: 16fd addi a3,a3,-1 # feffffff + 3003e24: 8ff5 and a5,a5,a3 + 3003e26: c35c sw a5,4(a4) + } +} + 3003e28: 50b2 lw ra,44(sp) + 3003e2a: 5422 lw s0,40(sp) + 3003e2c: 6145 addi sp,sp,48 + 3003e2e: 8082 ret + +03003e30 : + * @brief Get ADC Clock Select + * @param matchInfo ADC match info + * @retval Adc Clock select @see CRG_AdcClkSelect + */ +static unsigned int CRG_AdcClkSelectGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003e30: 7179 addi sp,sp,-48 + 3003e32: d606 sw ra,44(sp) + 3003e34: d422 sw s0,40(sp) + 3003e36: 1800 addi s0,sp,48 + 3003e38: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003e3c: fdc42783 lw a5,-36(s0) + 3003e40: eb89 bnez a5,3003e52 + 3003e42: 3e400593 li a1,996 + 3003e46: 030067b7 lui a5,0x3006 + 3003e4a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003e4e: 3921 jal ra,3003a66 + 3003e50: a001 j 3003e50 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003e52: 040007b7 lui a5,0x4000 + 3003e56: 4947a783 lw a5,1172(a5) # 4000494 + 3003e5a: eb89 bnez a5,3003e6c + 3003e5c: 3e500593 li a1,997 + 3003e60: 030067b7 lui a5,0x3006 + 3003e64: 4f478513 addi a0,a5,1268 # 30064f4 + 3003e68: 3efd jal ra,3003a66 + 3003e6a: a001 j 3003e6a + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003e6c: 040007b7 lui a5,0x4000 + 3003e70: 4947a783 lw a5,1172(a5) # 4000494 + 3003e74: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003e78: fdc42783 lw a5,-36(s0) + 3003e7c: 279e lhu a5,8(a5) + 3003e7e: 873e mv a4,a5 + 3003e80: fec42783 lw a5,-20(s0) + 3003e84: 97ba add a5,a5,a4 + 3003e86: fef42423 sw a5,-24(s0) + if (p->BIT.cfg_adc_ckmode_sel == BASE_CFG_SET) { + 3003e8a: fe842783 lw a5,-24(s0) + 3003e8e: 43dc lw a5,4(a5) + 3003e90: 83e1 srli a5,a5,0x18 + 3003e92: 8b85 andi a5,a5,1 + 3003e94: 0ff7f713 andi a4,a5,255 + 3003e98: 4785 li a5,1 + 3003e9a: 00f71463 bne a4,a5,3003ea2 + return CRG_ADC_CLK_SYN_CORE; /* Synchronous clock signal */ + 3003e9e: 478d li a5,3 + 3003ea0: a811 j 3003eb4 + } + return g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel; /* asynchronous clock signal */ + 3003ea2: 040007b7 lui a5,0x4000 + 3003ea6: 4947a783 lw a5,1172(a5) # 4000494 + 3003eaa: 1007a783 lw a5,256(a5) + 3003eae: 8391 srli a5,a5,0x4 + 3003eb0: 8b8d andi a5,a5,3 + 3003eb2: 9f81 uxtb a5 +} + 3003eb4: 853e mv a0,a5 + 3003eb6: 50b2 lw ra,44(sp) + 3003eb8: 5422 lw s0,40(sp) + 3003eba: 6145 addi sp,sp,48 + 3003ebc: 8082 ret + +03003ebe : + * @param matchInfo ADC match info + * @param div Adc clock division + * @retval None + */ +static void CRG_AdcDivSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int div) +{ + 3003ebe: 7179 addi sp,sp,-48 + 3003ec0: d606 sw ra,44(sp) + 3003ec2: d422 sw s0,40(sp) + 3003ec4: 1800 addi s0,sp,48 + 3003ec6: fca42e23 sw a0,-36(s0) + 3003eca: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003ece: fdc42783 lw a5,-36(s0) + 3003ed2: eb89 bnez a5,3003ee4 + 3003ed4: 3f700593 li a1,1015 + 3003ed8: 030067b7 lui a5,0x3006 + 3003edc: 4f478513 addi a0,a5,1268 # 30064f4 + 3003ee0: 3659 jal ra,3003a66 + 3003ee2: a001 j 3003ee2 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003ee4: 040007b7 lui a5,0x4000 + 3003ee8: 4947a783 lw a5,1172(a5) # 4000494 + 3003eec: eb89 bnez a5,3003efe + 3003eee: 3f800593 li a1,1016 + 3003ef2: 030067b7 lui a5,0x3006 + 3003ef6: 4f478513 addi a0,a5,1268 # 30064f4 + 3003efa: 36b5 jal ra,3003a66 + 3003efc: a001 j 3003efc + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkDiv(div)); + 3003efe: fd842503 lw a0,-40(s0) + 3003f02: d75fe0ef jal ra,3002c76 + 3003f06: 87aa mv a5,a0 + 3003f08: 0017c793 xori a5,a5,1 + 3003f0c: 9f81 uxtb a5 + 3003f0e: cb89 beqz a5,3003f20 + 3003f10: 3f900593 li a1,1017 + 3003f14: 030067b7 lui a5,0x3006 + 3003f18: 4f478513 addi a0,a5,1268 # 30064f4 + 3003f1c: 36a9 jal ra,3003a66 + 3003f1e: a885 j 3003f8e + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003f20: 040007b7 lui a5,0x4000 + 3003f24: 4947a783 lw a5,1172(a5) # 4000494 + 3003f28: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003f2c: fdc42783 lw a5,-36(s0) + 3003f30: 279e lhu a5,8(a5) + 3003f32: 873e mv a4,a5 + 3003f34: fec42783 lw a5,-20(s0) + 3003f38: 97ba add a5,a5,a4 + 3003f3a: fef42423 sw a5,-24(s0) + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3003f3e: fe842783 lw a5,-24(s0) + 3003f42: 43dc lw a5,4(a5) + 3003f44: 83e1 srli a5,a5,0x18 + 3003f46: 8b85 andi a5,a5,1 + 3003f48: 9f81 uxtb a5 + 3003f4a: fef42223 sw a5,-28(s0) + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3003f4e: fe442703 lw a4,-28(s0) + 3003f52: 4785 li a5,1 + 3003f54: 02f71163 bne a4,a5,3003f76 + p->BIT.clk_adc_div1 = div; /* write div to I1 */ + 3003f58: fd842783 lw a5,-40(s0) + 3003f5c: 8b8d andi a5,a5,3 + 3003f5e: 0ff7f693 andi a3,a5,255 + 3003f62: fe842703 lw a4,-24(s0) + 3003f66: 431c lw a5,0(a4) + 3003f68: 8a8d andi a3,a3,3 + 3003f6a: 06a2 slli a3,a3,0x8 + 3003f6c: cff7f793 andi a5,a5,-769 + 3003f70: 8fd5 or a5,a5,a3 + 3003f72: c31c sw a5,0(a4) + 3003f74: a829 j 3003f8e + } else { + p->BIT.clk_adc_div0 = div; /* write div to I0 */ + 3003f76: fd842783 lw a5,-40(s0) + 3003f7a: 8b8d andi a5,a5,3 + 3003f7c: 0ff7f693 andi a3,a5,255 + 3003f80: fe842703 lw a4,-24(s0) + 3003f84: 431c lw a5,0(a4) + 3003f86: 8a8d andi a3,a3,3 + 3003f88: 9bf1 andi a5,a5,-4 + 3003f8a: 8fd5 or a5,a5,a3 + 3003f8c: c31c sw a5,0(a4) + } +} + 3003f8e: 50b2 lw ra,44(sp) + 3003f90: 5422 lw s0,40(sp) + 3003f92: 6145 addi sp,sp,48 + 3003f94: 8082 ret + +03003f96 : + * @brief Get ADC clock division + * @param matchInfo ADC match info + * @retval Adc clock division + */ +static unsigned int CRG_AdcDivGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003f96: 7179 addi sp,sp,-48 + 3003f98: d606 sw ra,44(sp) + 3003f9a: d422 sw s0,40(sp) + 3003f9c: 1800 addi s0,sp,48 + 3003f9e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003fa2: fdc42783 lw a5,-36(s0) + 3003fa6: eb89 bnez a5,3003fb8 + 3003fa8: 40c00593 li a1,1036 + 3003fac: 030067b7 lui a5,0x3006 + 3003fb0: 4f478513 addi a0,a5,1268 # 30064f4 + 3003fb4: 3c4d jal ra,3003a66 + 3003fb6: a001 j 3003fb6 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003fb8: 040007b7 lui a5,0x4000 + 3003fbc: 4947a783 lw a5,1172(a5) # 4000494 + 3003fc0: eb89 bnez a5,3003fd2 + 3003fc2: 40d00593 li a1,1037 + 3003fc6: 030067b7 lui a5,0x3006 + 3003fca: 4f478513 addi a0,a5,1268 # 30064f4 + 3003fce: 3c61 jal ra,3003a66 + 3003fd0: a001 j 3003fd0 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003fd2: 040007b7 lui a5,0x4000 + 3003fd6: 4947a783 lw a5,1172(a5) # 4000494 + 3003fda: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003fde: fdc42783 lw a5,-36(s0) + 3003fe2: 279e lhu a5,8(a5) + 3003fe4: 873e mv a4,a5 + 3003fe6: fec42783 lw a5,-20(s0) + 3003fea: 97ba add a5,a5,a4 + 3003fec: fef42423 sw a5,-24(s0) + + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3003ff0: fe842783 lw a5,-24(s0) + 3003ff4: 43dc lw a5,4(a5) + 3003ff6: 83e1 srli a5,a5,0x18 + 3003ff8: 8b85 andi a5,a5,1 + 3003ffa: 9f81 uxtb a5 + 3003ffc: fef42223 sw a5,-28(s0) + + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3004000: fe442703 lw a4,-28(s0) + 3004004: 4785 li a5,1 + 3004006: 00f71963 bne a4,a5,3004018 + return p->BIT.clk_adc_div1; /* return div value I1 */ + 300400a: fe842783 lw a5,-24(s0) + 300400e: 439c lw a5,0(a5) + 3004010: 83a1 srli a5,a5,0x8 + 3004012: 8b8d andi a5,a5,3 + 3004014: 9f81 uxtb a5 + 3004016: a031 j 3004022 + } + return p->BIT.clk_adc_div0; /* return div valye I0 */ + 3004018: fe842783 lw a5,-24(s0) + 300401c: 439c lw a5,0(a5) + 300401e: 8b8d andi a5,a5,3 + 3004020: 9f81 uxtb a5 +} + 3004022: 853e mv a0,a5 + 3004024: 50b2 lw ra,44(sp) + 3004026: 5422 lw s0,40(sp) + 3004028: 6145 addi sp,sp,48 + 300402a: 8082 ret + +0300402c : + * @brief Enable Clock of EFC + * @param matchInfo EFC match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_EfcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 300402c: 7179 addi sp,sp,-48 + 300402e: d606 sw ra,44(sp) + 3004030: d422 sw s0,40(sp) + 3004032: 1800 addi s0,sp,48 + 3004034: fca42e23 sw a0,-36(s0) + 3004038: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300403c: fdc42783 lw a5,-36(s0) + 3004040: eb89 bnez a5,3004052 + 3004042: 42100593 li a1,1057 + 3004046: 030067b7 lui a5,0x3006 + 300404a: 4f478513 addi a0,a5,1268 # 30064f4 + 300404e: 3c21 jal ra,3003a66 + 3004050: a001 j 3004050 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004052: 040007b7 lui a5,0x4000 + 3004056: 4947a783 lw a5,1172(a5) # 4000494 + 300405a: eb89 bnez a5,300406c + 300405c: 42200593 li a1,1058 + 3004060: 030067b7 lui a5,0x3006 + 3004064: 4f478513 addi a0,a5,1268 # 30064f4 + 3004068: 3afd jal ra,3003a66 + 300406a: a001 j 300406a + /* Enables or disables EFC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300406c: 040007b7 lui a5,0x4000 + 3004070: 4947a783 lw a5,1172(a5) # 4000494 + 3004074: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004078: fdc42783 lw a5,-36(s0) + 300407c: 279e lhu a5,8(a5) + 300407e: 873e mv a4,a5 + 3004080: fec42783 lw a5,-20(s0) + 3004084: 97ba add a5,a5,a4 + 3004086: fef42423 sw a5,-24(s0) + p->BIT.eflash_cken = (enable & IP_CLK_ENABLE) ? BASE_CFG_SET : BASE_CFG_UNSET; + 300408a: fd842783 lw a5,-40(s0) + 300408e: 8b85 andi a5,a5,1 + 3004090: 0ff7f693 andi a3,a5,255 + 3004094: fe842703 lw a4,-24(s0) + 3004098: 431c lw a5,0(a4) + 300409a: 8a85 andi a3,a3,1 + 300409c: 9bf9 andi a5,a5,-2 + 300409e: 8fd5 or a5,a5,a3 + 30040a0: c31c sw a5,0(a4) +} + 30040a2: 0001 nop + 30040a4: 50b2 lw ra,44(sp) + 30040a6: 5422 lw s0,40(sp) + 30040a8: 6145 addi sp,sp,48 + 30040aa: 8082 ret + +030040ac : + * @brief Disable Clock of EFC + * @param matchInfo EFC match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_EfcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30040ac: 7179 addi sp,sp,-48 + 30040ae: d606 sw ra,44(sp) + 30040b0: d422 sw s0,40(sp) + 30040b2: 1800 addi s0,sp,48 + 30040b4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30040b8: fdc42783 lw a5,-36(s0) + 30040bc: eb89 bnez a5,30040ce + 30040be: 43000593 li a1,1072 + 30040c2: 030067b7 lui a5,0x3006 + 30040c6: 4f478513 addi a0,a5,1268 # 30064f4 + 30040ca: 3a71 jal ra,3003a66 + 30040cc: a001 j 30040cc + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30040ce: 040007b7 lui a5,0x4000 + 30040d2: 4947a783 lw a5,1172(a5) # 4000494 + 30040d6: eb89 bnez a5,30040e8 + 30040d8: 43100593 li a1,1073 + 30040dc: 030067b7 lui a5,0x3006 + 30040e0: 4f478513 addi a0,a5,1268 # 30064f4 + 30040e4: 3249 jal ra,3003a66 + 30040e6: a001 j 30040e6 + /* Get the value of the EFC register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30040e8: 040007b7 lui a5,0x4000 + 30040ec: 4947a783 lw a5,1172(a5) # 4000494 + 30040f0: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 30040f4: fdc42783 lw a5,-36(s0) + 30040f8: 279e lhu a5,8(a5) + 30040fa: 873e mv a4,a5 + 30040fc: fec42783 lw a5,-20(s0) + 3004100: 97ba add a5,a5,a4 + 3004102: fef42423 sw a5,-24(s0) + return p->BIT.eflash_cken; + 3004106: fe842783 lw a5,-24(s0) + 300410a: 439c lw a5,0(a5) + 300410c: 8b85 andi a5,a5,1 + 300410e: 9f81 uxtb a5 +} + 3004110: 853e mv a0,a5 + 3004112: 50b2 lw ra,44(sp) + 3004114: 5422 lw s0,40(sp) + 3004116: 6145 addi sp,sp,48 + 3004118: 8082 ret + +0300411a : + * @brief Enable Clock of ANA + * @param matchInfo ANA match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_AnaEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 300411a: 7179 addi sp,sp,-48 + 300411c: d606 sw ra,44(sp) + 300411e: d422 sw s0,40(sp) + 3004120: 1800 addi s0,sp,48 + 3004122: fca42e23 sw a0,-36(s0) + 3004126: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300412a: fdc42783 lw a5,-36(s0) + 300412e: eb89 bnez a5,3004140 + 3004130: 44000593 li a1,1088 + 3004134: 030067b7 lui a5,0x3006 + 3004138: 4f478513 addi a0,a5,1268 # 30064f4 + 300413c: 322d jal ra,3003a66 + 300413e: a001 j 300413e + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004140: 040007b7 lui a5,0x4000 + 3004144: 4947a783 lw a5,1172(a5) # 4000494 + 3004148: eb89 bnez a5,300415a + 300414a: 44100593 li a1,1089 + 300414e: 030067b7 lui a5,0x3006 + 3004152: 4f478513 addi a0,a5,1268 # 30064f4 + 3004156: 3a01 jal ra,3003a66 + 3004158: a001 j 3004158 + CRG_PARAM_CHECK_NO_RET(enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE); + 300415a: fd842703 lw a4,-40(s0) + 300415e: 4785 li a5,1 + 3004160: 00f70d63 beq a4,a5,300417a + 3004164: fd842783 lw a5,-40(s0) + 3004168: cb89 beqz a5,300417a + 300416a: 44200593 li a1,1090 + 300416e: 030067b7 lui a5,0x3006 + 3004172: 4f478513 addi a0,a5,1268 # 30064f4 + 3004176: 38c5 jal ra,3003a66 + 3004178: a20d j 300429a + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300417a: 040007b7 lui a5,0x4000 + 300417e: 4947a783 lw a5,1172(a5) # 4000494 + 3004182: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 3004186: fdc42783 lw a5,-36(s0) + 300418a: 279e lhu a5,8(a5) + 300418c: 873e mv a4,a5 + 300418e: fec42783 lw a5,-20(s0) + 3004192: 97ba add a5,a5,a4 + 3004194: fdc42703 lw a4,-36(s0) + 3004198: 2738 lbu a4,10(a4) + 300419a: 97ba add a5,a5,a4 + 300419c: fef42423 sw a5,-24(s0) + + if ((enable == IP_CLK_ENABLE) && (p->BIT.ip_srst_req == BASE_CFG_SET)) { + 30041a0: fd842703 lw a4,-40(s0) + 30041a4: 4785 li a5,1 + 30041a6: 02f71f63 bne a4,a5,30041e4 + 30041aa: fe842783 lw a5,-24(s0) + 30041ae: 439c lw a5,0(a5) + 30041b0: 83c1 srli a5,a5,0x10 + 30041b2: 8b85 andi a5,a5,1 + 30041b4: 0ff7f713 andi a4,a5,255 + 30041b8: 4785 li a5,1 + 30041ba: 02f71563 bne a4,a5,30041e4 + p->BIT.ip_srst_req = BASE_CFG_UNSET; + 30041be: fe842703 lw a4,-24(s0) + 30041c2: 431c lw a5,0(a4) + 30041c4: 76c1 lui a3,0xffff0 + 30041c6: 16fd addi a3,a3,-1 # fffeffff + 30041c8: 8ff5 and a5,a5,a3 + 30041ca: c31c sw a5,0(a4) + g_anaEnableFlag++; /* count enable analog IP number */ + 30041cc: 040007b7 lui a5,0x4000 + 30041d0: 4987c783 lbu a5,1176(a5) # 4000498 + 30041d4: 0785 addi a5,a5,1 + 30041d6: 0ff7f713 andi a4,a5,255 + 30041da: 040007b7 lui a5,0x4000 + 30041de: 48e78c23 sb a4,1176(a5) # 4000498 + 30041e2: a089 j 3004224 + } else if ((enable == IP_CLK_DISABLE) && (p->BIT.ip_srst_req == BASE_CFG_UNSET)) { + 30041e4: fd842783 lw a5,-40(s0) + 30041e8: ef95 bnez a5,3004224 + 30041ea: fe842783 lw a5,-24(s0) + 30041ee: 439c lw a5,0(a5) + 30041f0: 83c1 srli a5,a5,0x10 + 30041f2: 8b85 andi a5,a5,1 + 30041f4: 9f81 uxtb a5 + 30041f6: e79d bnez a5,3004224 + p->BIT.ip_srst_req = BASE_CFG_SET; + 30041f8: fe842703 lw a4,-24(s0) + 30041fc: 431c lw a5,0(a4) + 30041fe: 66c1 lui a3,0x10 + 3004200: 8fd5 or a5,a5,a3 + 3004202: c31c sw a5,0(a4) + if (g_anaEnableFlag > 0) { + 3004204: 040007b7 lui a5,0x4000 + 3004208: 4987c783 lbu a5,1176(a5) # 4000498 + 300420c: cf81 beqz a5,3004224 + g_anaEnableFlag--; /* Decreasing the count to enable the analog IP number. */ + 300420e: 040007b7 lui a5,0x4000 + 3004212: 4987c783 lbu a5,1176(a5) # 4000498 + 3004216: 17fd addi a5,a5,-1 + 3004218: 0ff7f713 andi a4,a5,255 + 300421c: 040007b7 lui a5,0x4000 + 3004220: 48e78c23 sb a4,1176(a5) # 4000498 + } + } + + if ((g_anaEnableFlag == 0) && (enable == IP_CLK_DISABLE)) { /* all analog clock disable */ + 3004224: 040007b7 lui a5,0x4000 + 3004228: 4987c783 lbu a5,1176(a5) # 4000498 + 300422c: eb85 bnez a5,300425c + 300422e: fd842783 lw a5,-40(s0) + 3004232: e78d bnez a5,300425c + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_UNSET; + 3004234: 10000737 lui a4,0x10000 + 3004238: 6785 lui a5,0x1 + 300423a: 973e add a4,a4,a5 + 300423c: a5072783 lw a5,-1456(a4) # ffffa50 + 3004240: 9bf9 andi a5,a5,-2 + 3004242: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_SET; + 3004246: 10000737 lui a4,0x10000 + 300424a: 6785 lui a5,0x1 + 300424c: 973e add a4,a4,a5 + 300424e: a5072783 lw a5,-1456(a4) # ffffa50 + 3004252: 66c1 lui a3,0x10 + 3004254: 8fd5 or a5,a5,a3 + 3004256: a4f72823 sw a5,-1456(a4) + 300425a: a081 j 300429a + } else if ((g_anaEnableFlag > 0) && (enable == IP_CLK_ENABLE)) { /* all analog clock enable */ + 300425c: 040007b7 lui a5,0x4000 + 3004260: 4987c783 lbu a5,1176(a5) # 4000498 + 3004264: cb9d beqz a5,300429a + 3004266: fd842703 lw a4,-40(s0) + 300426a: 4785 li a5,1 + 300426c: 02f71763 bne a4,a5,300429a + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_UNSET; + 3004270: 10000737 lui a4,0x10000 + 3004274: 6785 lui a5,0x1 + 3004276: 973e add a4,a4,a5 + 3004278: a5072783 lw a5,-1456(a4) # ffffa50 + 300427c: 76c1 lui a3,0xffff0 + 300427e: 16fd addi a3,a3,-1 # fffeffff + 3004280: 8ff5 and a5,a5,a3 + 3004282: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_SET; + 3004286: 10000737 lui a4,0x10000 + 300428a: 6785 lui a5,0x1 + 300428c: 973e add a4,a4,a5 + 300428e: a5072783 lw a5,-1456(a4) # ffffa50 + 3004292: 0017e793 ori a5,a5,1 + 3004296: a4f72823 sw a5,-1456(a4) + } +} + 300429a: 50b2 lw ra,44(sp) + 300429c: 5422 lw s0,40(sp) + 300429e: 6145 addi sp,sp,48 + 30042a0: 8082 ret + +030042a2 : + * @brief Get Clock of ANA + * @param matchInfo ANA match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_AnaEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30042a2: 7179 addi sp,sp,-48 + 30042a4: d606 sw ra,44(sp) + 30042a6: d422 sw s0,40(sp) + 30042a8: 1800 addi s0,sp,48 + 30042aa: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30042ae: fdc42783 lw a5,-36(s0) + 30042b2: eb91 bnez a5,30042c6 + 30042b4: 46200593 li a1,1122 + 30042b8: 030067b7 lui a5,0x3006 + 30042bc: 4f478513 addi a0,a5,1268 # 30064f4 + 30042c0: beffd0ef jal ra,3001eae + 30042c4: a001 j 30042c4 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30042c6: 040007b7 lui a5,0x4000 + 30042ca: 4947a783 lw a5,1172(a5) # 4000494 + 30042ce: eb91 bnez a5,30042e2 + 30042d0: 46300593 li a1,1123 + 30042d4: 030067b7 lui a5,0x3006 + 30042d8: 4f478513 addi a0,a5,1268 # 30064f4 + 30042dc: bd3fd0ef jal ra,3001eae + 30042e0: a001 j 30042e0 + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30042e2: 040007b7 lui a5,0x4000 + 30042e6: 4947a783 lw a5,1172(a5) # 4000494 + 30042ea: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 30042ee: fdc42783 lw a5,-36(s0) + 30042f2: 279e lhu a5,8(a5) + 30042f4: 873e mv a4,a5 + 30042f6: fec42783 lw a5,-20(s0) + 30042fa: 97ba add a5,a5,a4 + 30042fc: fdc42703 lw a4,-36(s0) + 3004300: 2738 lbu a4,10(a4) + 3004302: 97ba add a5,a5,a4 + 3004304: fef42423 sw a5,-24(s0) + /* The clock is enabled based on the IP reset status. */ + return (p->BIT.ip_srst_req) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3004308: fe842783 lw a5,-24(s0) + 300430c: 439c lw a5,0(a5) + 300430e: 83c1 srli a5,a5,0x10 + 3004310: 8b85 andi a5,a5,1 + 3004312: 9f81 uxtb a5 + 3004314: 0017c793 xori a5,a5,1 + 3004318: 9f81 uxtb a5 +} + 300431a: 853e mv a0,a5 + 300431c: 50b2 lw ra,44(sp) + 300431e: 5422 lw s0,40(sp) + 3004320: 6145 addi sp,sp,48 + 3004322: 8082 ret + +03004324 : + * @brief Write a character to the UART port. + * @param ch The int promotion of the character to be written. + * @retval None. + */ +static void DBG_PrintCh(unsigned int ch) +{ + 3004324: 1101 addi sp,sp,-32 + 3004326: ce22 sw s0,28(sp) + 3004328: 1000 addi s0,sp,32 + 300432a: fea42623 sw a0,-20(s0) + while (DBG_PRINTF_UART_PORT->UART_FR.BIT.txff == 1) { + 300432e: 0001 nop + 3004330: 140007b7 lui a5,0x14000 + 3004334: 4f9c lw a5,24(a5) + 3004336: 8395 srli a5,a5,0x5 + 3004338: 8b85 andi a5,a5,1 + 300433a: 0ff7f713 andi a4,a5,255 + 300433e: 4785 li a5,1 + 3004340: fef708e3 beq a4,a5,3004330 + ; + } + DBG_PRINTF_UART_PORT->UART_DR.BIT.data = (unsigned char)ch; + 3004344: 14000737 lui a4,0x14000 + 3004348: fec42783 lw a5,-20(s0) + 300434c: 0ff7f693 andi a3,a5,255 + 3004350: 431c lw a5,0(a4) + 3004352: 0ff6f693 andi a3,a3,255 + 3004356: f007f793 andi a5,a5,-256 + 300435a: 8fd5 or a5,a5,a3 + 300435c: c31c sw a5,0(a4) +} + 300435e: 0001 nop + 3004360: 4472 lw s0,28(sp) + 3004362: 6105 addi sp,sp,32 + 3004364: 8082 ret + +03004366 : + * @param str The string to be printed. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, a BASE_STATUS_ERROR is returned. + */ +static int DBG_PrintStr(const char *str) +{ + 3004366: 7179 addi sp,sp,-48 + 3004368: d606 sw ra,44(sp) + 300436a: d422 sw s0,40(sp) + 300436c: 1800 addi s0,sp,48 + 300436e: fca42e23 sw a0,-36(s0) + DEBUG_ASSERT_PARAM(str != NULL); + int cnt = 0; + 3004372: fe042623 sw zero,-20(s0) + while (*str != '\0') { + 3004376: a00d j 3004398 + DBG_PrintCh(*str); + 3004378: fdc42783 lw a5,-36(s0) + 300437c: 00078783 lb a5,0(a5) # 14000000 + 3004380: 853e mv a0,a5 + 3004382: 374d jal ra,3004324 + str++; + 3004384: fdc42783 lw a5,-36(s0) + 3004388: 0785 addi a5,a5,1 + 300438a: fcf42e23 sw a5,-36(s0) + cnt++; + 300438e: fec42783 lw a5,-20(s0) + 3004392: 0785 addi a5,a5,1 + 3004394: fef42623 sw a5,-20(s0) + while (*str != '\0') { + 3004398: fdc42783 lw a5,-36(s0) + 300439c: 00078783 lb a5,0(a5) + 30043a0: ffe1 bnez a5,3004378 + } + return cnt; + 30043a2: fec42783 lw a5,-20(s0) +} + 30043a6: 853e mv a0,a5 + 30043a8: 50b2 lw ra,44(sp) + 30043aa: 5422 lw s0,40(sp) + 30043ac: 6145 addi sp,sp,48 + 30043ae: 8082 ret + +030043b0 : + * @param base Base value. + * @param exponent Exponent value. + * @retval unsigned long The result of raising base to the power exponent. + */ +static unsigned long DBG_Pow(unsigned int base, unsigned int exponent) +{ + 30043b0: 7179 addi sp,sp,-48 + 30043b2: d622 sw s0,44(sp) + 30043b4: 1800 addi s0,sp,48 + 30043b6: fca42e23 sw a0,-36(s0) + 30043ba: fcb42c23 sw a1,-40(s0) + unsigned long ret = 1; + 30043be: 4785 li a5,1 + 30043c0: fef42623 sw a5,-20(s0) + while (exponent--) { + 30043c4: a809 j 30043d6 + ret *= base; + 30043c6: fec42703 lw a4,-20(s0) + 30043ca: fdc42783 lw a5,-36(s0) + 30043ce: 02f707b3 mul a5,a4,a5 + 30043d2: fef42623 sw a5,-20(s0) + while (exponent--) { + 30043d6: fd842783 lw a5,-40(s0) + 30043da: fff78713 addi a4,a5,-1 + 30043de: fce42c23 sw a4,-40(s0) + 30043e2: f3f5 bnez a5,30043c6 + } + return ret; /* ret = base ^ exponent */ + 30043e4: fec42783 lw a5,-20(s0) +} + 30043e8: 853e mv a0,a5 + 30043ea: 5432 lw s0,44(sp) + 30043ec: 6145 addi sp,sp,48 + 30043ee: 8082 ret + +030043f0 : + * @param num The number to be counted. + * @param base The number base of num. + * @retval unsigned int The number of digits. + */ +static unsigned int DBG_CountDigits(int num, NumBase base) +{ + 30043f0: 7179 addi sp,sp,-48 + 30043f2: d622 sw s0,44(sp) + 30043f4: 1800 addi s0,sp,48 + 30043f6: fca42e23 sw a0,-36(s0) + 30043fa: fcb42c23 sw a1,-40(s0) + unsigned int cnt = 0; + 30043fe: fe042623 sw zero,-20(s0) + if (base == 0) { + 3004402: fd842783 lw a5,-40(s0) + 3004406: e78d bnez a5,3004430 + return 0; + 3004408: 4781 li a5,0 + 300440a: a099 j 3004450 + } + while (num != 0) { + cnt++; + 300440c: fec42783 lw a5,-20(s0) + 3004410: 0785 addi a5,a5,1 + 3004412: fef42623 sw a5,-20(s0) + if (cnt > MAX_DIV_TIMES) { + 3004416: fec42703 lw a4,-20(s0) + 300441a: 47fd li a5,31 + 300441c: 00e7ee63 bltu a5,a4,3004438 + break; + } + num /= base; + 3004420: fdc42703 lw a4,-36(s0) + 3004424: fd842783 lw a5,-40(s0) + 3004428: 02f757b3 divu a5,a4,a5 + 300442c: fcf42e23 sw a5,-36(s0) + while (num != 0) { + 3004430: fdc42783 lw a5,-36(s0) + 3004434: ffe1 bnez a5,300440c + 3004436: a011 j 300443a + break; + 3004438: 0001 nop + } + cnt = (cnt == 0) ? 1 : cnt; + 300443a: fec42783 lw a5,-20(s0) + 300443e: c781 beqz a5,3004446 + 3004440: fec42783 lw a5,-20(s0) + 3004444: a011 j 3004448 + 3004446: 4785 li a5,1 + 3004448: fef42623 sw a5,-20(s0) + return cnt; + 300444c: fec42783 lw a5,-20(s0) +} + 3004450: 853e mv a0,a5 + 3004452: 5432 lw s0,44(sp) + 3004454: 6145 addi sp,sp,48 + 3004456: 8082 ret + +03004458 : + * @param num The unsigned number to be printed. + * @param base The number base of num. + * @param digits The digits of num. + */ +static void DBG_PutUnsignedNum(unsigned int num, NumBase base, unsigned int digits) +{ + 3004458: 7179 addi sp,sp,-48 + 300445a: d606 sw ra,44(sp) + 300445c: d422 sw s0,40(sp) + 300445e: 1800 addi s0,sp,48 + 3004460: fca42e23 sw a0,-36(s0) + 3004464: fcb42c23 sw a1,-40(s0) + 3004468: fcc42a23 sw a2,-44(s0) + unsigned char ch; + while (digits != 0) { + 300446c: a069 j 30044f6 + ch = num / DBG_Pow(base, digits - 1); + 300446e: fd442783 lw a5,-44(s0) + 3004472: 17fd addi a5,a5,-1 + 3004474: 85be mv a1,a5 + 3004476: fd842503 lw a0,-40(s0) + 300447a: 3f1d jal ra,30043b0 + 300447c: 872a mv a4,a0 + 300447e: fdc42783 lw a5,-36(s0) + 3004482: 02e7d7b3 divu a5,a5,a4 + 3004486: fef407a3 sb a5,-17(s0) + num %= DBG_Pow(base, digits - 1); + 300448a: fd442783 lw a5,-44(s0) + 300448e: 17fd addi a5,a5,-1 + 3004490: 85be mv a1,a5 + 3004492: fd842503 lw a0,-40(s0) + 3004496: 3f29 jal ra,30043b0 + 3004498: 872a mv a4,a0 + 300449a: fdc42783 lw a5,-36(s0) + 300449e: 02e7f7b3 remu a5,a5,a4 + 30044a2: fcf42e23 sw a5,-36(s0) + if (base == DECIMAL) { + 30044a6: fd842703 lw a4,-40(s0) + 30044aa: 47a9 li a5,10 + 30044ac: 00f71963 bne a4,a5,30044be + DBG_PrintCh(ch + '0'); + 30044b0: fef44783 lbu a5,-17(s0) + 30044b4: 03078793 addi a5,a5,48 + 30044b8: 853e mv a0,a5 + 30044ba: 35ad jal ra,3004324 + 30044bc: a805 j 30044ec + } else if (base == HEXADECIMAL) { + 30044be: fd842703 lw a4,-40(s0) + 30044c2: 47c1 li a5,16 + 30044c4: 02f71d63 bne a4,a5,30044fe + if (ch < DECIMAL_BASE) { + 30044c8: fef44703 lbu a4,-17(s0) + 30044cc: 47a5 li a5,9 + 30044ce: 00e7e963 bltu a5,a4,30044e0 + DBG_PrintCh(ch + '0'); + 30044d2: fef44783 lbu a5,-17(s0) + 30044d6: 03078793 addi a5,a5,48 + 30044da: 853e mv a0,a5 + 30044dc: 35a1 jal ra,3004324 + 30044de: a039 j 30044ec + } else { + DBG_PrintCh(ch - DECIMAL_BASE + 'A'); + 30044e0: fef44783 lbu a5,-17(s0) + 30044e4: 03778793 addi a5,a5,55 + 30044e8: 853e mv a0,a5 + 30044ea: 3d2d jal ra,3004324 + } + } else { + break; + } + digits--; + 30044ec: fd442783 lw a5,-44(s0) + 30044f0: 17fd addi a5,a5,-1 + 30044f2: fcf42a23 sw a5,-44(s0) + while (digits != 0) { + 30044f6: fd442783 lw a5,-44(s0) + 30044fa: fbb5 bnez a5,300446e + } +} + 30044fc: a011 j 3004500 + break; + 30044fe: 0001 nop +} + 3004500: 0001 nop + 3004502: 50b2 lw ra,44(sp) + 3004504: 5422 lw s0,40(sp) + 3004506: 6145 addi sp,sp,48 + 3004508: 8082 ret + +0300450a : + * @brief Print decimal number through UART port. + * @param intNum The decimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintInt(int intNum) +{ + 300450a: 7179 addi sp,sp,-48 + 300450c: d606 sw ra,44(sp) + 300450e: d422 sw s0,40(sp) + 3004510: 1800 addi s0,sp,48 + 3004512: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (intNum == 0) { + 3004516: fdc42783 lw a5,-36(s0) + 300451a: e791 bnez a5,3004526 + DBG_PrintCh('0'); + 300451c: 03000513 li a0,48 + 3004520: 3511 jal ra,3004324 + return 1; + 3004522: 4785 li a5,1 + 3004524: a82d j 300455e + } + if (intNum < 0) { + 3004526: fdc42783 lw a5,-36(s0) + 300452a: 0007db63 bgez a5,3004540 + DBG_PrintCh('-'); + 300452e: 02d00513 li a0,45 + 3004532: 3bcd jal ra,3004324 + intNum = -intNum; + 3004534: fdc42783 lw a5,-36(s0) + 3004538: 40f007b3 neg a5,a5 + 300453c: fcf42e23 sw a5,-36(s0) + } + cnt = DBG_CountDigits(intNum, DECIMAL); + 3004540: 45a9 li a1,10 + 3004542: fdc42503 lw a0,-36(s0) + 3004546: 356d jal ra,30043f0 + 3004548: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(intNum, DECIMAL, cnt); + 300454c: fdc42783 lw a5,-36(s0) + 3004550: fec42603 lw a2,-20(s0) + 3004554: 45a9 li a1,10 + 3004556: 853e mv a0,a5 + 3004558: 3701 jal ra,3004458 + return cnt; + 300455a: fec42783 lw a5,-20(s0) +} + 300455e: 853e mv a0,a5 + 3004560: 50b2 lw ra,44(sp) + 3004562: 5422 lw s0,40(sp) + 3004564: 6145 addi sp,sp,48 + 3004566: 8082 ret + +03004568 : + * @brief Print hexadecimal number through UART port. + * @param hexNum The hexadecimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintHex(unsigned int hexNum) +{ + 3004568: 7179 addi sp,sp,-48 + 300456a: d606 sw ra,44(sp) + 300456c: d422 sw s0,40(sp) + 300456e: 1800 addi s0,sp,48 + 3004570: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (hexNum == 0) { + 3004574: fdc42783 lw a5,-36(s0) + 3004578: e791 bnez a5,3004584 + DBG_PrintCh('0'); + 300457a: 03000513 li a0,48 + 300457e: 335d jal ra,3004324 + return 1; + 3004580: 4785 li a5,1 + 3004582: a005 j 30045a2 + } + cnt = DBG_CountDigits(hexNum, HEXADECIMAL); + 3004584: fdc42783 lw a5,-36(s0) + 3004588: 45c1 li a1,16 + 300458a: 853e mv a0,a5 + 300458c: 3595 jal ra,30043f0 + 300458e: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(hexNum, HEXADECIMAL, cnt); + 3004592: fec42603 lw a2,-20(s0) + 3004596: 45c1 li a1,16 + 3004598: fdc42503 lw a0,-36(s0) + 300459c: 3d75 jal ra,3004458 + return cnt; + 300459e: fec42783 lw a5,-20(s0) +} + 30045a2: 853e mv a0,a5 + 30045a4: 50b2 lw ra,44(sp) + 30045a6: 5422 lw s0,40(sp) + 30045a8: 6145 addi sp,sp,48 + 30045aa: 8082 ret + +030045ac : + * @brief Print floating-point number through UART port. + * @param fltNum The floating-point number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintFlt(float fltNum, unsigned int precision) +{ + 30045ac: 7139 addi sp,sp,-64 + 30045ae: de06 sw ra,60(sp) + 30045b0: dc22 sw s0,56(sp) + 30045b2: 0080 addi s0,sp,64 + 30045b4: fca42627 fsw fa0,-52(s0) + 30045b8: fca42423 sw a0,-56(s0) + unsigned int cnt = 0; + 30045bc: fe042623 sw zero,-20(s0) + unsigned int floatScale; + + if (fltNum < 0) { + 30045c0: fcc42787 flw fa5,-52(s0) + 30045c4: f0000753 fmv.w.x fa4,zero + 30045c8: a0e797d3 flt.s a5,fa5,fa4 + 30045cc: cf99 beqz a5,30045ea + DBG_PrintCh('-'); + 30045ce: 02d00513 li a0,45 + 30045d2: 3b89 jal ra,3004324 + cnt += 1; + 30045d4: fec42783 lw a5,-20(s0) + 30045d8: 0785 addi a5,a5,1 + 30045da: fef42623 sw a5,-20(s0) + fltNum = -fltNum; + 30045de: fcc42787 flw fa5,-52(s0) + 30045e2: 20f797d3 fneg.s fa5,fa5 + 30045e6: fcf42627 fsw fa5,-52(s0) + } + int integerVal = (int)fltNum; + 30045ea: fcc42787 flw fa5,-52(s0) + 30045ee: c00797d3 fcvt.w.s a5,fa5,rtz + 30045f2: fef42023 sw a5,-32(s0) + floatScale = DBG_Pow(10, (precision + 1)); /* 10: decimal */ + 30045f6: fc842783 lw a5,-56(s0) + 30045fa: 0785 addi a5,a5,1 + 30045fc: 85be mv a1,a5 + 30045fe: 4529 li a0,10 + 3004600: 3b45 jal ra,30043b0 + 3004602: fca42e23 sw a0,-36(s0) + int floatVal = (long)(floatScale * (fltNum - integerVal)); + 3004606: fdc42783 lw a5,-36(s0) + 300460a: d017f753 fcvt.s.wu fa4,a5 + 300460e: fe042783 lw a5,-32(s0) + 3004612: d007f7d3 fcvt.s.w fa5,a5 + 3004616: fcc42687 flw fa3,-52(s0) + 300461a: 08f6f7d3 fsub.s fa5,fa3,fa5 + 300461e: 10f777d3 fmul.s fa5,fa4,fa5 + 3004622: c00797d3 fcvt.w.s a5,fa5,rtz + 3004626: fef42423 sw a5,-24(s0) + /* Half-adjust: round up or round down */ + if (floatVal % DECIMAL_BASE >= HALF_ADJUST_BOUNDARY) { + 300462a: fe842703 lw a4,-24(s0) + 300462e: 47a9 li a5,10 + 3004630: 02f77733 remu a4,a4,a5 + 3004634: 4791 li a5,4 + 3004636: 00e7fb63 bgeu a5,a4,300464c + floatVal = floatVal / DECIMAL_BASE + 1; + 300463a: fe842703 lw a4,-24(s0) + 300463e: 47a9 li a5,10 + 3004640: 02f757b3 divu a5,a4,a5 + 3004644: 0785 addi a5,a5,1 + 3004646: fef42423 sw a5,-24(s0) + 300464a: a801 j 300465a + } else { + floatVal = floatVal / DECIMAL_BASE; + 300464c: fe842703 lw a4,-24(s0) + 3004650: 47a9 li a5,10 + 3004652: 02f757b3 divu a5,a4,a5 + 3004656: fef42423 sw a5,-24(s0) + } + cnt += DBG_PrintInt(integerVal); + 300465a: fe042503 lw a0,-32(s0) + 300465e: 3575 jal ra,300450a + 3004660: 872a mv a4,a0 + 3004662: fec42783 lw a5,-20(s0) + 3004666: 97ba add a5,a5,a4 + 3004668: fef42623 sw a5,-20(s0) + DBG_PrintCh('.'); + 300466c: 02e00513 li a0,46 + 3004670: 3955 jal ra,3004324 + cnt += 1; + 3004672: fec42783 lw a5,-20(s0) + 3004676: 0785 addi a5,a5,1 + 3004678: fef42623 sw a5,-20(s0) + /* Pad 0 in float part */ + unsigned int fltCnt = DBG_CountDigits(floatVal, DECIMAL); + 300467c: 45a9 li a1,10 + 300467e: fe842503 lw a0,-24(s0) + 3004682: 33bd jal ra,30043f0 + 3004684: fca42c23 sw a0,-40(s0) + if (precision > fltCnt) { + 3004688: fc842703 lw a4,-56(s0) + 300468c: fd842783 lw a5,-40(s0) + 3004690: 02e7f763 bgeu a5,a4,30046be + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 3004694: fe042223 sw zero,-28(s0) + 3004698: a809 j 30046aa + DBG_PrintCh('0'); /* add '0' */ + 300469a: 03000513 li a0,48 + 300469e: 3159 jal ra,3004324 + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 30046a0: fe442783 lw a5,-28(s0) + 30046a4: 0785 addi a5,a5,1 + 30046a6: fef42223 sw a5,-28(s0) + 30046aa: fc842703 lw a4,-56(s0) + 30046ae: fd842783 lw a5,-40(s0) + 30046b2: 40f707b3 sub a5,a4,a5 + 30046b6: fe442703 lw a4,-28(s0) + 30046ba: fef760e3 bltu a4,a5,300469a + } + } + DBG_PutUnsignedNum(floatVal, DECIMAL, fltCnt); /* print unsigned number */ + 30046be: fe842783 lw a5,-24(s0) + 30046c2: fd842603 lw a2,-40(s0) + 30046c6: 45a9 li a1,10 + 30046c8: 853e mv a0,a5 + 30046ca: 3379 jal ra,3004458 + cnt += precision; + 30046cc: fec42703 lw a4,-20(s0) + 30046d0: fc842783 lw a5,-56(s0) + 30046d4: 97ba add a5,a5,a4 + 30046d6: fef42623 sw a5,-20(s0) + return cnt; + 30046da: fec42783 lw a5,-20(s0) +} + 30046de: 853e mv a0,a5 + 30046e0: 50f2 lw ra,60(sp) + 30046e2: 5462 lw s0,56(sp) + 30046e4: 6121 addi sp,sp,64 + 30046e6: 8082 ret + +030046e8 : + * @param ch The format specifier. + * @param paramList The pointer of the variable parameter list. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int ParseSpecifier(const char ch, va_list *paramList) +{ + 30046e8: 7139 addi sp,sp,-64 + 30046ea: de06 sw ra,60(sp) + 30046ec: dc22 sw s0,56(sp) + 30046ee: 0080 addi s0,sp,64 + 30046f0: 87aa mv a5,a0 + 30046f2: fcb42423 sw a1,-56(s0) + 30046f6: fcf407a3 sb a5,-49(s0) + unsigned int cnt = 0; + 30046fa: fe042623 sw zero,-20(s0) + unsigned int tmpCnt; + char chVal = 0; + 30046fe: fe0405a3 sb zero,-21(s0) + const char *strVal = NULL; + 3004702: fe042223 sw zero,-28(s0) + int intVal = 0; + 3004706: fe042023 sw zero,-32(s0) + unsigned int unsignedVal = 0; + 300470a: fc042e23 sw zero,-36(s0) + unsigned int hexVal = 0; + 300470e: fc042c23 sw zero,-40(s0) + float fltVal = 0; + 3004712: fc042a23 sw zero,-44(s0) + switch (ch) { + 3004716: fcf40783 lb a5,-49(s0) + 300471a: fa878793 addi a5,a5,-88 + 300471e: 02000713 li a4,32 + 3004722: 14f76063 bltu a4,a5,3004862 + 3004726: 00279713 slli a4,a5,0x2 + 300472a: 030067b7 lui a5,0x3006 + 300472e: 54878793 addi a5,a5,1352 # 3006548 + 3004732: 97ba add a5,a5,a4 + 3004734: 439c lw a5,0(a5) + 3004736: 8782 jr a5 + case 'c': /* Character format data. */ + chVal = VA_ARG(*paramList, int); /* Use type int because of byte alignment */ + 3004738: fc842783 lw a5,-56(s0) + 300473c: 439c lw a5,0(a5) + 300473e: 00478693 addi a3,a5,4 + 3004742: fc842703 lw a4,-56(s0) + 3004746: c314 sw a3,0(a4) + 3004748: 439c lw a5,0(a5) + 300474a: fef405a3 sb a5,-21(s0) + DBG_PrintCh(chVal); + 300474e: feb40783 lb a5,-21(s0) + 3004752: 853e mv a0,a5 + 3004754: 3ec1 jal ra,3004324 + cnt += 1; + 3004756: fec42783 lw a5,-20(s0) + 300475a: 0785 addi a5,a5,1 + 300475c: fef42623 sw a5,-20(s0) + break; + 3004760: aa19 j 3004876 + case 's': /* String format data. */ + strVal = VA_ARG(*paramList, const char *); + 3004762: fc842783 lw a5,-56(s0) + 3004766: 439c lw a5,0(a5) + 3004768: 00478693 addi a3,a5,4 + 300476c: fc842703 lw a4,-56(s0) + 3004770: c314 sw a3,0(a4) + 3004772: 439c lw a5,0(a5) + 3004774: fef42223 sw a5,-28(s0) + cnt += DBG_PrintStr(strVal); + 3004778: fe442503 lw a0,-28(s0) + 300477c: 36ed jal ra,3004366 + 300477e: 87aa mv a5,a0 + 3004780: 873e mv a4,a5 + 3004782: fec42783 lw a5,-20(s0) + 3004786: 97ba add a5,a5,a4 + 3004788: fef42623 sw a5,-20(s0) + break; + 300478c: a0ed j 3004876 + case 'd': /* Integer decimal data. */ + intVal = VA_ARG(*paramList, int); + 300478e: fc842783 lw a5,-56(s0) + 3004792: 439c lw a5,0(a5) + 3004794: 00478693 addi a3,a5,4 + 3004798: fc842703 lw a4,-56(s0) + 300479c: c314 sw a3,0(a4) + 300479e: 439c lw a5,0(a5) + 30047a0: fef42023 sw a5,-32(s0) + cnt += DBG_PrintInt(intVal); + 30047a4: fe042503 lw a0,-32(s0) + 30047a8: 338d jal ra,300450a + 30047aa: 872a mv a4,a0 + 30047ac: fec42783 lw a5,-20(s0) + 30047b0: 97ba add a5,a5,a4 + 30047b2: fef42623 sw a5,-20(s0) + break; + 30047b6: a0c1 j 3004876 + case 'u': /* Unsigned decimal data. */ + unsignedVal = VA_ARG(*paramList, unsigned int); + 30047b8: fc842783 lw a5,-56(s0) + 30047bc: 439c lw a5,0(a5) + 30047be: 00478693 addi a3,a5,4 + 30047c2: fc842703 lw a4,-56(s0) + 30047c6: c314 sw a3,0(a4) + 30047c8: 439c lw a5,0(a5) + 30047ca: fcf42e23 sw a5,-36(s0) + tmpCnt = DBG_CountDigits(unsignedVal, DECIMAL); + 30047ce: fdc42783 lw a5,-36(s0) + 30047d2: 45a9 li a1,10 + 30047d4: 853e mv a0,a5 + 30047d6: 3929 jal ra,30043f0 + 30047d8: fca42823 sw a0,-48(s0) + DBG_PutUnsignedNum(unsignedVal, DECIMAL, tmpCnt); + 30047dc: fd042603 lw a2,-48(s0) + 30047e0: 45a9 li a1,10 + 30047e2: fdc42503 lw a0,-36(s0) + 30047e6: 398d jal ra,3004458 + cnt += tmpCnt; + 30047e8: fec42703 lw a4,-20(s0) + 30047ec: fd042783 lw a5,-48(s0) + 30047f0: 97ba add a5,a5,a4 + 30047f2: fef42623 sw a5,-20(s0) + break; + 30047f6: a041 j 3004876 + case 'x': /* Hexadecimal data. */ + case 'X': + case 'p': /* Address data. */ + hexVal = VA_ARG(*paramList, unsigned int); + 30047f8: fc842783 lw a5,-56(s0) + 30047fc: 439c lw a5,0(a5) + 30047fe: 00478693 addi a3,a5,4 + 3004802: fc842703 lw a4,-56(s0) + 3004806: c314 sw a3,0(a4) + 3004808: 439c lw a5,0(a5) + 300480a: fcf42c23 sw a5,-40(s0) + cnt += DBG_PrintHex(hexVal); + 300480e: fd842503 lw a0,-40(s0) + 3004812: 3b99 jal ra,3004568 + 3004814: 872a mv a4,a0 + 3004816: fec42783 lw a5,-20(s0) + 300481a: 97ba add a5,a5,a4 + 300481c: fef42623 sw a5,-20(s0) + break; + 3004820: a899 j 3004876 + case 'f': /* Floating-point data. */ + fltVal = VA_ARG(*paramList, double); + 3004822: fc842783 lw a5,-56(s0) + 3004826: 439c lw a5,0(a5) + 3004828: 079d addi a5,a5,7 + 300482a: 9be1 andi a5,a5,-8 + 300482c: 00878693 addi a3,a5,8 + 3004830: fc842703 lw a4,-56(s0) + 3004834: c314 sw a3,0(a4) + 3004836: 0047a803 lw a6,4(a5) + 300483a: 439c lw a5,0(a5) + 300483c: 853e mv a0,a5 + 300483e: 85c2 mv a1,a6 + 3004840: 75c010ef jal ra,3005f9c <__truncdfsf2> + 3004844: 20a507d3 fmv.s fa5,fa0 + 3004848: fcf42a27 fsw fa5,-44(s0) + cnt += DBG_PrintFlt(fltVal, 5); /* default precision: 5 */ + 300484c: 4515 li a0,5 + 300484e: fd442507 flw fa0,-44(s0) + 3004852: 3ba9 jal ra,30045ac + 3004854: 872a mv a4,a0 + 3004856: fec42783 lw a5,-20(s0) + 300485a: 97ba add a5,a5,a4 + 300485c: fef42623 sw a5,-20(s0) + break; + 3004860: a819 j 3004876 + default: + DBG_PrintCh(ch); + 3004862: fcf40783 lb a5,-49(s0) + 3004866: 853e mv a0,a5 + 3004868: 3c75 jal ra,3004324 + cnt += 1; + 300486a: fec42783 lw a5,-20(s0) + 300486e: 0785 addi a5,a5,1 + 3004870: fef42623 sw a5,-20(s0) + break; + 3004874: 0001 nop + } + return cnt; + 3004876: fec42783 lw a5,-20(s0) +} + 300487a: 853e mv a0,a5 + 300487c: 50f2 lw ra,60(sp) + 300487e: 5462 lw s0,56(sp) + 3004880: 6121 addi sp,sp,64 + 3004882: 8082 ret + +03004884 : + * @param intNum The decimal number to be printed. + * @param fieldWidth Field width. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintIntWithField(int intNum, int fieldWidth) +{ + 3004884: 7139 addi sp,sp,-64 + 3004886: de06 sw ra,60(sp) + 3004888: dc22 sw s0,56(sp) + 300488a: 0080 addi s0,sp,64 + 300488c: fca42623 sw a0,-52(s0) + 3004890: fcb42423 sw a1,-56(s0) + int zeroCnt = 0; + 3004894: fc042e23 sw zero,-36(s0) + int digitsCnt = 0; + 3004898: fe042623 sw zero,-20(s0) + unsigned int cnt = 0; + 300489c: fe042423 sw zero,-24(s0) + + if (intNum == 0) { + 30048a0: fcc42783 lw a5,-52(s0) + 30048a4: e791 bnez a5,30048b0 + DBG_PrintCh('0'); + 30048a6: 03000513 li a0,48 + 30048aa: 3cad jal ra,3004324 + return 1; + 30048ac: 4785 li a5,1 + 30048ae: a0dd j 3004994 + } + if (intNum < 0) { + 30048b0: fcc42783 lw a5,-52(s0) + 30048b4: 0607dd63 bgez a5,300492e + DBG_PrintCh('-'); /* add symbol */ + 30048b8: 02d00513 li a0,45 + 30048bc: 34a5 jal ra,3004324 + cnt++; + 30048be: fe842783 lw a5,-24(s0) + 30048c2: 0785 addi a5,a5,1 + 30048c4: fef42423 sw a5,-24(s0) + intNum = -intNum; + 30048c8: fcc42783 lw a5,-52(s0) + 30048cc: 40f007b3 neg a5,a5 + 30048d0: fcf42623 sw a5,-52(s0) + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 30048d4: 45a9 li a1,10 + 30048d6: fcc42503 lw a0,-52(s0) + 30048da: 3e19 jal ra,30043f0 + 30048dc: 87aa mv a5,a0 + 30048de: fef42623 sw a5,-20(s0) + zeroCnt = fieldWidth - digitsCnt; + 30048e2: fc842703 lw a4,-56(s0) + 30048e6: fec42783 lw a5,-20(s0) + 30048ea: 40f707b3 sub a5,a4,a5 + 30048ee: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 30048f2: fe042223 sw zero,-28(s0) + 30048f6: a831 j 3004912 + DBG_PrintCh('0'); /* add '0' */ + 30048f8: 03000513 li a0,48 + 30048fc: 3425 jal ra,3004324 + cnt++; + 30048fe: fe842783 lw a5,-24(s0) + 3004902: 0785 addi a5,a5,1 + 3004904: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004908: fe442783 lw a5,-28(s0) + 300490c: 0785 addi a5,a5,1 + 300490e: fef42223 sw a5,-28(s0) + 3004912: fe442703 lw a4,-28(s0) + 3004916: fdc42783 lw a5,-36(s0) + 300491a: fcf74fe3 blt a4,a5,30048f8 + } + cnt += digitsCnt; + 300491e: fec42783 lw a5,-20(s0) + 3004922: fe842703 lw a4,-24(s0) + 3004926: 97ba add a5,a5,a4 + 3004928: fef42423 sw a5,-24(s0) + 300492c: a891 j 3004980 + } else { + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 300492e: 45a9 li a1,10 + 3004930: fcc42503 lw a0,-52(s0) + 3004934: 3c75 jal ra,30043f0 + 3004936: 87aa mv a5,a0 + 3004938: fef42623 sw a5,-20(s0) + cnt = digitsCnt; + 300493c: fec42783 lw a5,-20(s0) + 3004940: fef42423 sw a5,-24(s0) + zeroCnt = fieldWidth - digitsCnt; + 3004944: fc842703 lw a4,-56(s0) + 3004948: fec42783 lw a5,-20(s0) + 300494c: 40f707b3 sub a5,a4,a5 + 3004950: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004954: fe042023 sw zero,-32(s0) + 3004958: a831 j 3004974 + DBG_PrintCh('0'); /* add '0' */ + 300495a: 03000513 li a0,48 + 300495e: 32d9 jal ra,3004324 + cnt++; + 3004960: fe842783 lw a5,-24(s0) + 3004964: 0785 addi a5,a5,1 + 3004966: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 300496a: fe042783 lw a5,-32(s0) + 300496e: 0785 addi a5,a5,1 + 3004970: fef42023 sw a5,-32(s0) + 3004974: fe042703 lw a4,-32(s0) + 3004978: fdc42783 lw a5,-36(s0) + 300497c: fcf74fe3 blt a4,a5,300495a + } + } + DBG_PutUnsignedNum(intNum, DECIMAL, digitsCnt); + 3004980: fcc42783 lw a5,-52(s0) + 3004984: fec42703 lw a4,-20(s0) + 3004988: 863a mv a2,a4 + 300498a: 45a9 li a1,10 + 300498c: 853e mv a0,a5 + 300498e: 34e9 jal ra,3004458 + return cnt; + 3004990: fe842783 lw a5,-24(s0) +} + 3004994: 853e mv a0,a5 + 3004996: 50f2 lw ra,60(sp) + 3004998: 5462 lw s0,56(sp) + 300499a: 6121 addi sp,sp,64 + 300499c: 8082 ret + +0300499e : + +static int DBG_Atoi(const char **s) +{ + 300499e: 7179 addi sp,sp,-48 + 30049a0: d622 sw s0,44(sp) + 30049a2: 1800 addi s0,sp,48 + 30049a4: fca42e23 sw a0,-36(s0) + int i, c; + + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 30049a8: fe042623 sw zero,-20(s0) + 30049ac: a02d j 30049d6 + i = i * 10 + c - '0'; /* 10: decimal */ + 30049ae: fec42703 lw a4,-20(s0) + 30049b2: 47a9 li a5,10 + 30049b4: 02f70733 mul a4,a4,a5 + 30049b8: fe842783 lw a5,-24(s0) + 30049bc: 97ba add a5,a5,a4 + 30049be: fd078793 addi a5,a5,-48 + 30049c2: fef42623 sw a5,-20(s0) + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 30049c6: fdc42783 lw a5,-36(s0) + 30049ca: 439c lw a5,0(a5) + 30049cc: 00178713 addi a4,a5,1 + 30049d0: fdc42783 lw a5,-36(s0) + 30049d4: c398 sw a4,0(a5) + 30049d6: fdc42783 lw a5,-36(s0) + 30049da: 439c lw a5,0(a5) + 30049dc: 00078783 lb a5,0(a5) + 30049e0: fef42423 sw a5,-24(s0) + 30049e4: fe842703 lw a4,-24(s0) + 30049e8: 02f00793 li a5,47 + 30049ec: 00e7d863 bge a5,a4,30049fc + 30049f0: fe842703 lw a4,-24(s0) + 30049f4: 03900793 li a5,57 + 30049f8: fae7dbe3 bge a5,a4,30049ae + } + return i; + 30049fc: fec42783 lw a5,-20(s0) +} + 3004a00: 853e mv a0,a5 + 3004a02: 5432 lw s0,44(sp) + 3004a04: 6145 addi sp,sp,48 + 3004a06: 8082 ret + +03004a08 : + * @param ... Variable parameter list. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, return BASE_STATUS_ERROR. + */ +int DBG_UartPrintf(const char *format, ...) +{ + 3004a08: 711d addi sp,sp,-96 + 3004a0a: de06 sw ra,60(sp) + 3004a0c: dc22 sw s0,56(sp) + 3004a0e: 0080 addi s0,sp,64 + 3004a10: fca42623 sw a0,-52(s0) + 3004a14: c04c sw a1,4(s0) + 3004a16: c410 sw a2,8(s0) + 3004a18: c454 sw a3,12(s0) + 3004a1a: c818 sw a4,16(s0) + 3004a1c: c85c sw a5,20(s0) + 3004a1e: 01042c23 sw a6,24(s0) + 3004a22: 01142e23 sw a7,28(s0) + DEBUG_ASSERT_PARAM(format != NULL); + int cnt = 0; + 3004a26: fe042623 sw zero,-20(s0) + int fieldWidth = 0; + 3004a2a: fe042423 sw zero,-24(s0) + int floatPrecision = 0; + 3004a2e: fe042223 sw zero,-28(s0) + float fltVal = 0; + 3004a32: fe042023 sw zero,-32(s0) + int intVal = 0; + 3004a36: fc042e23 sw zero,-36(s0) + va_list paramList; + VA_START(paramList, format); + 3004a3a: 02040793 addi a5,s0,32 + 3004a3e: 1791 addi a5,a5,-28 + 3004a40: fcf42c23 sw a5,-40(s0) + + while (*format != '\0') { + 3004a44: aa09 j 3004b56 + if (*format != '%') { + 3004a46: fcc42783 lw a5,-52(s0) + 3004a4a: 00078703 lb a4,0(a5) + 3004a4e: 02500793 li a5,37 + 3004a52: 00f70e63 beq a4,a5,3004a6e + DBG_PrintCh(*format); + 3004a56: fcc42783 lw a5,-52(s0) + 3004a5a: 00078783 lb a5,0(a5) + 3004a5e: 853e mv a0,a5 + 3004a60: 30d1 jal ra,3004324 + cnt += 1; + 3004a62: fec42783 lw a5,-20(s0) + 3004a66: 0785 addi a5,a5,1 + 3004a68: fef42623 sw a5,-20(s0) + 3004a6c: a0c5 j 3004b4c + } else { + format++; + 3004a6e: fcc42783 lw a5,-52(s0) + 3004a72: 0785 addi a5,a5,1 + 3004a74: fcf42623 sw a5,-52(s0) + if (*format == '0') { + 3004a78: fcc42783 lw a5,-52(s0) + 3004a7c: 00078703 lb a4,0(a5) + 3004a80: 03000793 li a5,48 + 3004a84: 04f71263 bne a4,a5,3004ac8 + format++; + 3004a88: fcc42783 lw a5,-52(s0) + 3004a8c: 0785 addi a5,a5,1 + 3004a8e: fcf42623 sw a5,-52(s0) + fieldWidth = DBG_Atoi(&format); + 3004a92: fcc40793 addi a5,s0,-52 + 3004a96: 853e mv a0,a5 + 3004a98: 3719 jal ra,300499e + 3004a9a: fea42423 sw a0,-24(s0) + intVal = VA_ARG(paramList, int); + 3004a9e: fd842783 lw a5,-40(s0) + 3004aa2: 00478713 addi a4,a5,4 + 3004aa6: fce42c23 sw a4,-40(s0) + 3004aaa: 439c lw a5,0(a5) + 3004aac: fcf42e23 sw a5,-36(s0) + cnt += DBG_PrintIntWithField(intVal, fieldWidth); + 3004ab0: fe842583 lw a1,-24(s0) + 3004ab4: fdc42503 lw a0,-36(s0) + 3004ab8: 33f1 jal ra,3004884 + 3004aba: 872a mv a4,a0 + 3004abc: fec42783 lw a5,-20(s0) + 3004ac0: 97ba add a5,a5,a4 + 3004ac2: fef42623 sw a5,-20(s0) + 3004ac6: a059 j 3004b4c + } else if (*format == '.') { + 3004ac8: fcc42783 lw a5,-52(s0) + 3004acc: 00078703 lb a4,0(a5) + 3004ad0: 02e00793 li a5,46 + 3004ad4: 04f71d63 bne a4,a5,3004b2e + format++; + 3004ad8: fcc42783 lw a5,-52(s0) + 3004adc: 0785 addi a5,a5,1 + 3004ade: fcf42623 sw a5,-52(s0) + floatPrecision = DBG_Atoi(&format); + 3004ae2: fcc40793 addi a5,s0,-52 + 3004ae6: 853e mv a0,a5 + 3004ae8: 3d5d jal ra,300499e + 3004aea: fea42223 sw a0,-28(s0) + fltVal = VA_ARG(paramList, double); + 3004aee: fd842783 lw a5,-40(s0) + 3004af2: 079d addi a5,a5,7 + 3004af4: 9be1 andi a5,a5,-8 + 3004af6: 00878713 addi a4,a5,8 + 3004afa: fce42c23 sw a4,-40(s0) + 3004afe: 0047a803 lw a6,4(a5) + 3004b02: 439c lw a5,0(a5) + 3004b04: 853e mv a0,a5 + 3004b06: 85c2 mv a1,a6 + 3004b08: 494010ef jal ra,3005f9c <__truncdfsf2> + 3004b0c: 20a507d3 fmv.s fa5,fa0 + 3004b10: fef42027 fsw fa5,-32(s0) + cnt += DBG_PrintFlt(fltVal, floatPrecision); + 3004b14: fe442783 lw a5,-28(s0) + 3004b18: 853e mv a0,a5 + 3004b1a: fe042507 flw fa0,-32(s0) + 3004b1e: 3479 jal ra,30045ac + 3004b20: 872a mv a4,a0 + 3004b22: fec42783 lw a5,-20(s0) + 3004b26: 97ba add a5,a5,a4 + 3004b28: fef42623 sw a5,-20(s0) + 3004b2c: a005 j 3004b4c + } else { + cnt += ParseSpecifier(*format, ¶mList); + 3004b2e: fcc42783 lw a5,-52(s0) + 3004b32: 00078783 lb a5,0(a5) + 3004b36: fd840713 addi a4,s0,-40 + 3004b3a: 85ba mv a1,a4 + 3004b3c: 853e mv a0,a5 + 3004b3e: 366d jal ra,30046e8 + 3004b40: 872a mv a4,a0 + 3004b42: fec42783 lw a5,-20(s0) + 3004b46: 97ba add a5,a5,a4 + 3004b48: fef42623 sw a5,-20(s0) + } + } + format++; + 3004b4c: fcc42783 lw a5,-52(s0) + 3004b50: 0785 addi a5,a5,1 + 3004b52: fcf42623 sw a5,-52(s0) + while (*format != '\0') { + 3004b56: fcc42783 lw a5,-52(s0) + 3004b5a: 00078783 lb a5,0(a5) + 3004b5e: ee0794e3 bnez a5,3004a46 + } + VA_END(paramList); + return cnt; + 3004b62: fec42783 lw a5,-20(s0) +} + 3004b66: 853e mv a0,a5 + 3004b68: 50f2 lw ra,60(sp) + 3004b6a: 5462 lw s0,56(sp) + 3004b6c: 6125 addi sp,sp,96 + 3004b6e: 8082 ret + +03004b70 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param regValue value of @ref IOCMG_REG. + * @retval None. + */ +static inline void DCL_IOCMG_SetRegValue(IOCMG_REG *iocmgRegx, unsigned int regValue) +{ + 3004b70: 1101 addi sp,sp,-32 + 3004b72: ce06 sw ra,28(sp) + 3004b74: cc22 sw s0,24(sp) + 3004b76: 1000 addi s0,sp,32 + 3004b78: fea42623 sw a0,-20(s0) + 3004b7c: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004b80: fec42703 lw a4,-20(s0) + 3004b84: 77c1 lui a5,0xffff0 + 3004b86: 8f7d and a4,a4,a5 + 3004b88: 147f07b7 lui a5,0x147f0 + 3004b8c: 00f70a63 beq a4,a5,3004ba0 + 3004b90: 08b00593 li a1,139 + 3004b94: 030067b7 lui a5,0x3006 + 3004b98: 5cc78513 addi a0,a5,1484 # 30065cc + 3004b9c: 2df1 jal ra,3005278 + 3004b9e: a001 j 3004b9e + iocmgRegx->reg = regValue; + 3004ba0: fec42783 lw a5,-20(s0) + 3004ba4: fe842703 lw a4,-24(s0) + 3004ba8: c398 sw a4,0(a5) +} + 3004baa: 0001 nop + 3004bac: 40f2 lw ra,28(sp) + 3004bae: 4462 lw s0,24(sp) + 3004bb0: 6105 addi sp,sp,32 + 3004bb2: 8082 ret + +03004bb4 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param driveRate value of @ref IOCMG_DriveRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetDriveRate(IOCMG_REG *iocmgRegx, IOCMG_DriveRate driveRate) +{ + 3004bb4: 1101 addi sp,sp,-32 + 3004bb6: ce06 sw ra,28(sp) + 3004bb8: cc22 sw s0,24(sp) + 3004bba: 1000 addi s0,sp,32 + 3004bbc: fea42623 sw a0,-20(s0) + 3004bc0: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004bc4: fec42703 lw a4,-20(s0) + 3004bc8: 77c1 lui a5,0xffff0 + 3004bca: 8f7d and a4,a4,a5 + 3004bcc: 147f07b7 lui a5,0x147f0 + 3004bd0: 00f70a63 beq a4,a5,3004be4 + 3004bd4: 0ba00593 li a1,186 + 3004bd8: 030067b7 lui a5,0x3006 + 3004bdc: 5cc78513 addi a0,a5,1484 # 30065cc + 3004be0: 2d61 jal ra,3005278 + 3004be2: a001 j 3004be2 + IOCMG_PARAM_CHECK_NO_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4); + 3004be4: fe842703 lw a4,-24(s0) + 3004be8: 478d li a5,3 + 3004bea: 00e7fa63 bgeu a5,a4,3004bfe + 3004bee: 0bb00593 li a1,187 + 3004bf2: 030067b7 lui a5,0x3006 + 3004bf6: 5cc78513 addi a0,a5,1484 # 30065cc + 3004bfa: 2dbd jal ra,3005278 + 3004bfc: a839 j 3004c1a + iocmgRegx->BIT.ds = driveRate; + 3004bfe: fe842783 lw a5,-24(s0) + 3004c02: 8b8d andi a5,a5,3 + 3004c04: 0ff7f693 andi a3,a5,255 + 3004c08: fec42703 lw a4,-20(s0) + 3004c0c: 431c lw a5,0(a4) + 3004c0e: 8a8d andi a3,a3,3 + 3004c10: 0692 slli a3,a3,0x4 + 3004c12: fcf7f793 andi a5,a5,-49 + 3004c16: 8fd5 or a5,a5,a3 + 3004c18: c31c sw a5,0(a4) +} + 3004c1a: 40f2 lw ra,28(sp) + 3004c1c: 4462 lw s0,24(sp) + 3004c1e: 6105 addi sp,sp,32 + 3004c20: 8082 ret + +03004c22 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param pullMode value of @ref IOCMG_PullMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetPullMode(IOCMG_REG *iocmgRegx, IOCMG_PullMode pullMode) +{ + 3004c22: 1101 addi sp,sp,-32 + 3004c24: ce06 sw ra,28(sp) + 3004c26: cc22 sw s0,24(sp) + 3004c28: 1000 addi s0,sp,32 + 3004c2a: fea42623 sw a0,-20(s0) + 3004c2e: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004c32: fec42703 lw a4,-20(s0) + 3004c36: 77c1 lui a5,0xffff0 + 3004c38: 8f7d and a4,a4,a5 + 3004c3a: 147f07b7 lui a5,0x147f0 + 3004c3e: 00f70a63 beq a4,a5,3004c52 + 3004c42: 0d200593 li a1,210 + 3004c46: 030067b7 lui a5,0x3006 + 3004c4a: 5cc78513 addi a0,a5,1484 # 30065cc + 3004c4e: 252d jal ra,3005278 + 3004c50: a001 j 3004c50 + IOCMG_PARAM_CHECK_NO_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE); + 3004c52: fe842703 lw a4,-24(s0) + 3004c56: 478d li a5,3 + 3004c58: 00e7fa63 bgeu a5,a4,3004c6c + 3004c5c: 0d300593 li a1,211 + 3004c60: 030067b7 lui a5,0x3006 + 3004c64: 5cc78513 addi a0,a5,1484 # 30065cc + 3004c68: 2d01 jal ra,3005278 + 3004c6a: a835 j 3004ca6 + iocmgRegx->BIT.pu = (pullMode & 0x02) >> 1; /* 10b: pull up mode */ + 3004c6c: fe842783 lw a5,-24(s0) + 3004c70: 8385 srli a5,a5,0x1 + 3004c72: 8b85 andi a5,a5,1 + 3004c74: 0ff7f693 andi a3,a5,255 + 3004c78: fec42703 lw a4,-20(s0) + 3004c7c: 431c lw a5,0(a4) + 3004c7e: 8a85 andi a3,a3,1 + 3004c80: 06a2 slli a3,a3,0x8 + 3004c82: eff7f793 andi a5,a5,-257 + 3004c86: 8fd5 or a5,a5,a3 + 3004c88: c31c sw a5,0(a4) + iocmgRegx->BIT.pd = pullMode & 0x01; /* 01b: pull down mode */ + 3004c8a: fe842783 lw a5,-24(s0) + 3004c8e: 8b85 andi a5,a5,1 + 3004c90: 0ff7f693 andi a3,a5,255 + 3004c94: fec42703 lw a4,-20(s0) + 3004c98: 431c lw a5,0(a4) + 3004c9a: 8a85 andi a3,a3,1 + 3004c9c: 069e slli a3,a3,0x7 + 3004c9e: f7f7f793 andi a5,a5,-129 + 3004ca2: 8fd5 or a5,a5,a3 + 3004ca4: c31c sw a5,0(a4) +} + 3004ca6: 40f2 lw ra,28(sp) + 3004ca8: 4462 lw s0,24(sp) + 3004caa: 6105 addi sp,sp,32 + 3004cac: 8082 ret + +03004cae : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param levelShiftRate value of @ref IOCMG_LevelShiftRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetLevelShiftRate(IOCMG_REG *iocmgRegx, IOCMG_LevelShiftRate levelShiftRate) +{ + 3004cae: 1101 addi sp,sp,-32 + 3004cb0: ce06 sw ra,28(sp) + 3004cb2: cc22 sw s0,24(sp) + 3004cb4: 1000 addi s0,sp,32 + 3004cb6: fea42623 sw a0,-20(s0) + 3004cba: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004cbe: fec42703 lw a4,-20(s0) + 3004cc2: 77c1 lui a5,0xffff0 + 3004cc4: 8f7d and a4,a4,a5 + 3004cc6: 147f07b7 lui a5,0x147f0 + 3004cca: 00f70a63 beq a4,a5,3004cde + 3004cce: 0ed00593 li a1,237 + 3004cd2: 030067b7 lui a5,0x3006 + 3004cd6: 5cc78513 addi a0,a5,1484 # 30065cc + 3004cda: 2b79 jal ra,3005278 + 3004cdc: a001 j 3004cdc + IOCMG_PARAM_CHECK_NO_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX && levelShiftRate >= LEVEL_SHIFT_RATE_FAST); + 3004cde: fe842703 lw a4,-24(s0) + 3004ce2: 4785 li a5,1 + 3004ce4: 00e7fa63 bgeu a5,a4,3004cf8 + 3004ce8: 0ee00593 li a1,238 + 3004cec: 030067b7 lui a5,0x3006 + 3004cf0: 5cc78513 addi a0,a5,1484 # 30065cc + 3004cf4: 2351 jal ra,3005278 + 3004cf6: a839 j 3004d14 + iocmgRegx->BIT.sr = levelShiftRate; + 3004cf8: fe842783 lw a5,-24(s0) + 3004cfc: 8b85 andi a5,a5,1 + 3004cfe: 0ff7f693 andi a3,a5,255 + 3004d02: fec42703 lw a4,-20(s0) + 3004d06: 431c lw a5,0(a4) + 3004d08: 8a85 andi a3,a3,1 + 3004d0a: 06a6 slli a3,a3,0x9 + 3004d0c: dff7f793 andi a5,a5,-513 + 3004d10: 8fd5 or a5,a5,a3 + 3004d12: c31c sw a5,0(a4) +} + 3004d14: 40f2 lw ra,28(sp) + 3004d16: 4462 lw s0,24(sp) + 3004d18: 6105 addi sp,sp,32 + 3004d1a: 8082 ret + +03004d1c : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param schmidtMode value of @ref IOCMG_SchmidtMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetSchmidtMode(IOCMG_REG *iocmgRegx, IOCMG_SchmidtMode schmidtMode) +{ + 3004d1c: 1101 addi sp,sp,-32 + 3004d1e: ce06 sw ra,28(sp) + 3004d20: cc22 sw s0,24(sp) + 3004d22: 1000 addi s0,sp,32 + 3004d24: fea42623 sw a0,-20(s0) + 3004d28: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004d2c: fec42703 lw a4,-20(s0) + 3004d30: 77c1 lui a5,0xffff0 + 3004d32: 8f7d and a4,a4,a5 + 3004d34: 147f07b7 lui a5,0x147f0 + 3004d38: 00f70a63 beq a4,a5,3004d4c + 3004d3c: 10500593 li a1,261 + 3004d40: 030067b7 lui a5,0x3006 + 3004d44: 5cc78513 addi a0,a5,1484 # 30065cc + 3004d48: 2b05 jal ra,3005278 + 3004d4a: a001 j 3004d4a + IOCMG_PARAM_CHECK_NO_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE); + 3004d4c: fe842703 lw a4,-24(s0) + 3004d50: 4785 li a5,1 + 3004d52: 00e7fa63 bgeu a5,a4,3004d66 + 3004d56: 10600593 li a1,262 + 3004d5a: 030067b7 lui a5,0x3006 + 3004d5e: 5cc78513 addi a0,a5,1484 # 30065cc + 3004d62: 2b19 jal ra,3005278 + 3004d64: a839 j 3004d82 + iocmgRegx->BIT.se = schmidtMode; + 3004d66: fe842783 lw a5,-24(s0) + 3004d6a: 8b85 andi a5,a5,1 + 3004d6c: 0ff7f693 andi a3,a5,255 + 3004d70: fec42703 lw a4,-20(s0) + 3004d74: 431c lw a5,0(a4) + 3004d76: 8a85 andi a3,a3,1 + 3004d78: 06aa slli a3,a3,0xa + 3004d7a: bff7f793 andi a5,a5,-1025 + 3004d7e: 8fd5 or a5,a5,a3 + 3004d80: c31c sw a5,0(a4) +} + 3004d82: 40f2 lw ra,28(sp) + 3004d84: 4462 lw s0,24(sp) + 3004d86: 6105 addi sp,sp,32 + 3004d88: 8082 ret + +03004d8a : + * @brief Get pins iocmg reg address + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_REG iocmg reg address. + */ +static IOCMG_REG* IOCMG_GetRegAddr(unsigned int pinTypedef) +{ + 3004d8a: 7179 addi sp,sp,-48 + 3004d8c: d622 sw s0,44(sp) + 3004d8e: 1800 addi s0,sp,48 + 3004d90: fca42e23 sw a0,-36(s0) + /* decode pin's iocmg reg offset address in base address, and conver value to point address */ + unsigned int iocmgBaseAddrValue = (uintptr_t)IOCMG_BASE; + 3004d94: 147f07b7 lui a5,0x147f0 + 3004d98: fef42623 sw a5,-20(s0) + unsigned int iocmgRegOffsetAddrValue = (pinTypedef >> 16) & 0x00000FFF; /* 16 : shift 16 bit */ + 3004d9c: fdc42783 lw a5,-36(s0) + 3004da0: 0107d713 srli a4,a5,0x10 + 3004da4: 6785 lui a5,0x1 + 3004da6: 17fd addi a5,a5,-1 # fff + 3004da8: 8ff9 and a5,a5,a4 + 3004daa: fef42423 sw a5,-24(s0) + IOCMG_REG* iocmgRegxAddr = (IOCMG_REG*)(void*)(iocmgBaseAddrValue + iocmgRegOffsetAddrValue); + 3004dae: fec42703 lw a4,-20(s0) + 3004db2: fe842783 lw a5,-24(s0) + 3004db6: 97ba add a5,a5,a4 + 3004db8: fef42223 sw a5,-28(s0) + if (!IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegxAddr & IOCMG_BASE_ADDR_MASK))) { + 3004dbc: fe442703 lw a4,-28(s0) + 3004dc0: 77c1 lui a5,0xffff0 + 3004dc2: 8f7d and a4,a4,a5 + 3004dc4: 147f07b7 lui a5,0x147f0 + 3004dc8: 00f70463 beq a4,a5,3004dd0 + return NULL; + 3004dcc: 4781 li a5,0 + 3004dce: a019 j 3004dd4 + } + return iocmgRegxAddr; + 3004dd0: fe442783 lw a5,-28(s0) +} + 3004dd4: 853e mv a0,a5 + 3004dd6: 5432 lw s0,44(sp) + 3004dd8: 6145 addi sp,sp,48 + 3004dda: 8082 ret + +03004ddc : + * @brief Set pins as function mode + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinAltFuncMode(unsigned int pinTypedef) +{ + 3004ddc: 7179 addi sp,sp,-48 + 3004dde: d606 sw ra,44(sp) + 3004de0: d422 sw s0,40(sp) + 3004de2: 1800 addi s0,sp,48 + 3004de4: fca42e23 sw a0,-36(s0) + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004de8: fdc42503 lw a0,-36(s0) + 3004dec: 3f79 jal ra,3004d8a + 3004dee: fea42623 sw a0,-20(s0) + /* get iocmg reg default value */ + unsigned int regValue = pinTypedef & IOCMG_REG_VALUE_MASK; + 3004df2: fdc42703 lw a4,-36(s0) + 3004df6: 67c1 lui a5,0x10 + 3004df8: 17fd addi a5,a5,-1 # ffff + 3004dfa: 8ff9 and a5,a5,a4 + 3004dfc: fef42423 sw a5,-24(s0) + DCL_IOCMG_SetRegValue(iocmgRegx, regValue); + 3004e00: fe842583 lw a1,-24(s0) + 3004e04: fec42503 lw a0,-20(s0) + 3004e08: 33a5 jal ra,3004b70 + return IOCMG_STATUS_OK; + 3004e0a: 4781 li a5,0 +} + 3004e0c: 853e mv a0,a5 + 3004e0e: 50b2 lw ra,44(sp) + 3004e10: 5422 lw s0,40(sp) + 3004e12: 6145 addi sp,sp,48 + 3004e14: 8082 ret + +03004e16 : + * @param pinTypedef the pin type defined in iomap.h + * @param pullMode function define as @ref IOCMG_PullMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinPullMode(unsigned int pinTypedef, IOCMG_PullMode pullMode) +{ + 3004e16: 7179 addi sp,sp,-48 + 3004e18: d606 sw ra,44(sp) + 3004e1a: d422 sw s0,40(sp) + 3004e1c: 1800 addi s0,sp,48 + 3004e1e: fca42e23 sw a0,-36(s0) + 3004e22: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE, IOCMG_PARAM_ERROR); + 3004e26: fd842703 lw a4,-40(s0) + 3004e2a: 478d li a5,3 + 3004e2c: 00e7fb63 bgeu a5,a4,3004e42 + 3004e30: 07800593 li a1,120 + 3004e34: 030067b7 lui a5,0x3006 + 3004e38: 5ec78513 addi a0,a5,1516 # 30065ec + 3004e3c: 2935 jal ra,3005278 + 3004e3e: 4791 li a5,4 + 3004e40: a821 j 3004e58 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004e42: fdc42503 lw a0,-36(s0) + 3004e46: 3791 jal ra,3004d8a + 3004e48: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetPullMode(iocmgRegx, pullMode); + 3004e4c: fd842583 lw a1,-40(s0) + 3004e50: fec42503 lw a0,-20(s0) + 3004e54: 33f9 jal ra,3004c22 + return IOCMG_STATUS_OK; + 3004e56: 4781 li a5,0 +} + 3004e58: 853e mv a0,a5 + 3004e5a: 50b2 lw ra,44(sp) + 3004e5c: 5422 lw s0,40(sp) + 3004e5e: 6145 addi sp,sp,48 + 3004e60: 8082 ret + +03004e62 : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinSchmidtMode(unsigned int pinTypedef, IOCMG_SchmidtMode schmidtMode) +{ + 3004e62: 7179 addi sp,sp,-48 + 3004e64: d606 sw ra,44(sp) + 3004e66: d422 sw s0,40(sp) + 3004e68: 1800 addi s0,sp,48 + 3004e6a: fca42e23 sw a0,-36(s0) + 3004e6e: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE, IOCMG_PARAM_ERROR); + 3004e72: fd842703 lw a4,-40(s0) + 3004e76: 4785 li a5,1 + 3004e78: 00e7fb63 bgeu a5,a4,3004e8e + 3004e7c: 09300593 li a1,147 + 3004e80: 030067b7 lui a5,0x3006 + 3004e84: 5ec78513 addi a0,a5,1516 # 30065ec + 3004e88: 2ec5 jal ra,3005278 + 3004e8a: 4791 li a5,4 + 3004e8c: a821 j 3004ea4 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004e8e: fdc42503 lw a0,-36(s0) + 3004e92: 3de5 jal ra,3004d8a + 3004e94: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetSchmidtMode(iocmgRegx, schmidtMode); + 3004e98: fd842583 lw a1,-40(s0) + 3004e9c: fec42503 lw a0,-20(s0) + 3004ea0: 3db5 jal ra,3004d1c + return IOCMG_STATUS_OK; + 3004ea2: 4781 li a5,0 +} + 3004ea4: 853e mv a0,a5 + 3004ea6: 50b2 lw ra,44(sp) + 3004ea8: 5422 lw s0,40(sp) + 3004eaa: 6145 addi sp,sp,48 + 3004eac: 8082 ret + +03004eae : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinLevelShiftRate(unsigned int pinTypedef, IOCMG_LevelShiftRate levelShiftRate) +{ + 3004eae: 7179 addi sp,sp,-48 + 3004eb0: d606 sw ra,44(sp) + 3004eb2: d422 sw s0,40(sp) + 3004eb4: 1800 addi s0,sp,48 + 3004eb6: fca42e23 sw a0,-36(s0) + 3004eba: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX, IOCMG_PARAM_ERROR); + 3004ebe: fd842703 lw a4,-40(s0) + 3004ec2: 4785 li a5,1 + 3004ec4: 00e7fb63 bgeu a5,a4,3004eda + 3004ec8: 0ae00593 li a1,174 + 3004ecc: 030067b7 lui a5,0x3006 + 3004ed0: 5ec78513 addi a0,a5,1516 # 30065ec + 3004ed4: 2655 jal ra,3005278 + 3004ed6: 4791 li a5,4 + 3004ed8: a821 j 3004ef0 + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate >= LEVEL_SHIFT_RATE_FAST, IOCMG_PARAM_ERROR); + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004eda: fdc42503 lw a0,-36(s0) + 3004ede: 3575 jal ra,3004d8a + 3004ee0: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetLevelShiftRate(iocmgRegx, levelShiftRate); + 3004ee4: fd842583 lw a1,-40(s0) + 3004ee8: fec42503 lw a0,-20(s0) + 3004eec: 33c9 jal ra,3004cae + return IOCMG_STATUS_OK; + 3004eee: 4781 li a5,0 +} + 3004ef0: 853e mv a0,a5 + 3004ef2: 50b2 lw ra,44(sp) + 3004ef4: 5422 lw s0,40(sp) + 3004ef6: 6145 addi sp,sp,48 + 3004ef8: 8082 ret + +03004efa : + * @param pinTypedef the pin type defined in iomap.h + * @param driveRate function define as @ref IOCMG_DriveRate + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinDriveRate(unsigned int pinTypedef, IOCMG_DriveRate driveRate) +{ + 3004efa: 7179 addi sp,sp,-48 + 3004efc: d606 sw ra,44(sp) + 3004efe: d422 sw s0,40(sp) + 3004f00: 1800 addi s0,sp,48 + 3004f02: fca42e23 sw a0,-36(s0) + 3004f06: fcb42c23 sw a1,-40(s0) + /* get iocmg reg address */ + IOCMG_PARAM_CHECK_WITH_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4, IOCMG_PARAM_ERROR); + 3004f0a: fd842703 lw a4,-40(s0) + 3004f0e: 478d li a5,3 + 3004f10: 00e7fb63 bgeu a5,a4,3004f26 + 3004f14: 0cb00593 li a1,203 + 3004f18: 030067b7 lui a5,0x3006 + 3004f1c: 5ec78513 addi a0,a5,1516 # 30065ec + 3004f20: 2ea1 jal ra,3005278 + 3004f22: 4791 li a5,4 + 3004f24: a821 j 3004f3c + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004f26: fdc42503 lw a0,-36(s0) + 3004f2a: 3585 jal ra,3004d8a + 3004f2c: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetDriveRate(iocmgRegx, driveRate); + 3004f30: fd842583 lw a1,-40(s0) + 3004f34: fec42503 lw a0,-20(s0) + 3004f38: 39b5 jal ra,3004bb4 + return IOCMG_STATUS_OK; + 3004f3a: 4781 li a5,0 +} + 3004f3c: 853e mv a0,a5 + 3004f3e: 50b2 lw ra,44(sp) + 3004f40: 5422 lw s0,40(sp) + 3004f42: 6145 addi sp,sp,48 + 3004f44: 8082 ret + +03004f46 : + * @param mode Timer Mode, @ref TIMER_Mode + * @retval true + * @retval false + */ +static inline bool IsTimerMode(TIMER_Mode mode) +{ + 3004f46: 1101 addi sp,sp,-32 + 3004f48: ce22 sw s0,28(sp) + 3004f4a: 1000 addi s0,sp,32 + 3004f4c: fea42623 sw a0,-20(s0) + return (((mode) == TIMER_MODE_RUN_FREE) || + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3004f50: fec42783 lw a5,-20(s0) + 3004f54: cb99 beqz a5,3004f6a + return (((mode) == TIMER_MODE_RUN_FREE) || + 3004f56: fec42703 lw a4,-20(s0) + 3004f5a: 4785 li a5,1 + 3004f5c: 00f70763 beq a4,a5,3004f6a + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3004f60: fec42703 lw a4,-20(s0) + 3004f64: 4789 li a5,2 + 3004f66: 00f71463 bne a4,a5,3004f6e + 3004f6a: 4785 li a5,1 + 3004f6c: a011 j 3004f70 + 3004f6e: 4781 li a5,0 + 3004f70: 8b85 andi a5,a5,1 + 3004f72: 9f81 uxtb a5 + ((mode) == TIMER_MODE_RUN_ONTSHOT)); +} + 3004f74: 853e mv a0,a5 + 3004f76: 4472 lw s0,28(sp) + 3004f78: 6105 addi sp,sp,32 + 3004f7a: 8082 ret + +03004f7c : + * @param mode Timer Interrupt Type, @ref TIMER_InterruptType + * @retval true + * @retval false + */ +static inline bool IsTimerInterruptType(TIMER_InterruptType interruptType) +{ + 3004f7c: 1101 addi sp,sp,-32 + 3004f7e: ce22 sw s0,28(sp) + 3004f80: 1000 addi s0,sp,32 + 3004f82: fea42623 sw a0,-20(s0) + return (((interruptType) == TIMER_PERIOD_FIN) || + 3004f86: fec42783 lw a5,-20(s0) + 3004f8a: c791 beqz a5,3004f96 + 3004f8c: fec42703 lw a4,-20(s0) + 3004f90: 4785 li a5,1 + 3004f92: 00f71463 bne a4,a5,3004f9a + 3004f96: 4785 li a5,1 + 3004f98: a011 j 3004f9c + 3004f9a: 4781 li a5,0 + 3004f9c: 8b85 andi a5,a5,1 + 3004f9e: 9f81 uxtb a5 + ((interruptType) == TIMER_OVER_FLOW)); +} + 3004fa0: 853e mv a0,a5 + 3004fa2: 4472 lw s0,28(sp) + 3004fa4: 6105 addi sp,sp,32 + 3004fa6: 8082 ret + +03004fa8 : + * @param size Timer Size, @ref TIMER_Size + * @retval true + * @retval false + */ +static inline bool IsTimerSize(TIMER_Size size) +{ + 3004fa8: 1101 addi sp,sp,-32 + 3004faa: ce22 sw s0,28(sp) + 3004fac: 1000 addi s0,sp,32 + 3004fae: fea42623 sw a0,-20(s0) + return (((size) == TIMER_SIZE_16BIT) || + 3004fb2: fec42783 lw a5,-20(s0) + 3004fb6: c791 beqz a5,3004fc2 + 3004fb8: fec42703 lw a4,-20(s0) + 3004fbc: 4785 li a5,1 + 3004fbe: 00f71463 bne a4,a5,3004fc6 + 3004fc2: 4785 li a5,1 + 3004fc4: a011 j 3004fc8 + 3004fc6: 4781 li a5,0 + 3004fc8: 8b85 andi a5,a5,1 + 3004fca: 9f81 uxtb a5 + ((size) == TIMER_SIZE_32BIT)); +} + 3004fcc: 853e mv a0,a5 + 3004fce: 4472 lw s0,28(sp) + 3004fd0: 6105 addi sp,sp,32 + 3004fd2: 8082 ret + +03004fd4 : + * @param period + * @retval true + * @retval false + */ +static inline bool IsTimerPeriod(unsigned int period) +{ + 3004fd4: 1101 addi sp,sp,-32 + 3004fd6: ce22 sw s0,28(sp) + 3004fd8: 1000 addi s0,sp,32 + 3004fda: fea42623 sw a0,-20(s0) + return ((period) >= PERIOD_MIN_VALUE); + 3004fde: fec42783 lw a5,-20(s0) + 3004fe2: 00f037b3 snez a5,a5 + 3004fe6: 9f81 uxtb a5 +} + 3004fe8: 853e mv a0,a5 + 3004fea: 4472 lw s0,28(sp) + 3004fec: 6105 addi sp,sp,32 + 3004fee: 8082 ret + +03004ff0 : + * @param div @see TIMER_PrescalerFactor + * @retval true + * @retval false + */ +static inline bool IsTimerDiv(TIMER_PrescalerFactor div) +{ + 3004ff0: 1101 addi sp,sp,-32 + 3004ff2: ce22 sw s0,28(sp) + 3004ff4: 1000 addi s0,sp,32 + 3004ff6: fea42623 sw a0,-20(s0) + return (((div) == TIMERPRESCALER_NO_DIV) || + ((div) == TIMERPRESCALER_DIV_16) || + 3004ffa: fec42783 lw a5,-20(s0) + 3004ffe: cb99 beqz a5,3005014 + return (((div) == TIMERPRESCALER_NO_DIV) || + 3005000: fec42703 lw a4,-20(s0) + 3005004: 4785 li a5,1 + 3005006: 00f70763 beq a4,a5,3005014 + ((div) == TIMERPRESCALER_DIV_16) || + 300500a: fec42703 lw a4,-20(s0) + 300500e: 4789 li a5,2 + 3005010: 00f71463 bne a4,a5,3005018 + 3005014: 4785 li a5,1 + 3005016: a011 j 300501a + 3005018: 4781 li a5,0 + 300501a: 8b85 andi a5,a5,1 + 300501c: 9f81 uxtb a5 + ((div) == TIMERPRESCALER_DIV_256)); +} + 300501e: 853e mv a0,a5 + 3005020: 4472 lw s0,28(sp) + 3005022: 6105 addi sp,sp,32 + 3005024: 8082 ret + +03005026 : + * @param handle Timer Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR parameter check fail + */ +BASE_StatusType HAL_TIMER_Init(TIMER_Handle *handle) +{ + 3005026: 1101 addi sp,sp,-32 + 3005028: ce06 sw ra,28(sp) + 300502a: cc22 sw s0,24(sp) + 300502c: 1000 addi s0,sp,32 + 300502e: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005032: fec42783 lw a5,-20(s0) + 3005036: eb89 bnez a5,3005048 + 3005038: 02800593 li a1,40 + 300503c: 030067b7 lui a5,0x3006 + 3005040: 62c78513 addi a0,a5,1580 # 300662c + 3005044: 2c15 jal ra,3005278 + 3005046: a001 j 3005046 + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 3005048: fec42783 lw a5,-20(s0) + 300504c: 4398 lw a4,0(a5) + 300504e: 143007b7 lui a5,0x14300 + 3005052: 02f70f63 beq a4,a5,3005090 + 3005056: fec42783 lw a5,-20(s0) + 300505a: 4398 lw a4,0(a5) + 300505c: 143017b7 lui a5,0x14301 + 3005060: 02f70863 beq a4,a5,3005090 + 3005064: fec42783 lw a5,-20(s0) + 3005068: 4398 lw a4,0(a5) + 300506a: 143027b7 lui a5,0x14302 + 300506e: 02f70163 beq a4,a5,3005090 + 3005072: fec42783 lw a5,-20(s0) + 3005076: 4398 lw a4,0(a5) + 3005078: 143037b7 lui a5,0x14303 + 300507c: 00f70a63 beq a4,a5,3005090 + 3005080: 02900593 li a1,41 + 3005084: 030067b7 lui a5,0x3006 + 3005088: 62c78513 addi a0,a5,1580 # 300662c + 300508c: 22f5 jal ra,3005278 + 300508e: a001 j 300508e + + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->load), BASE_STATUS_ERROR); + 3005090: fec42783 lw a5,-20(s0) + 3005094: 4bdc lw a5,20(a5) + 3005096: 853e mv a0,a5 + 3005098: 3f35 jal ra,3004fd4 + 300509a: 87aa mv a5,a0 + 300509c: 0017c793 xori a5,a5,1 + 30050a0: 9f81 uxtb a5 + 30050a2: cb91 beqz a5,30050b6 + 30050a4: 02b00593 li a1,43 + 30050a8: 030067b7 lui a5,0x3006 + 30050ac: 62c78513 addi a0,a5,1580 # 300662c + 30050b0: 22e1 jal ra,3005278 + 30050b2: 4785 li a5,1 + 30050b4: aa6d j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->bgLoad), BASE_STATUS_ERROR); + 30050b6: fec42783 lw a5,-20(s0) + 30050ba: 4f9c lw a5,24(a5) + 30050bc: 853e mv a0,a5 + 30050be: 3f19 jal ra,3004fd4 + 30050c0: 87aa mv a5,a0 + 30050c2: 0017c793 xori a5,a5,1 + 30050c6: 9f81 uxtb a5 + 30050c8: cb91 beqz a5,30050dc + 30050ca: 02c00593 li a1,44 + 30050ce: 030067b7 lui a5,0x3006 + 30050d2: 62c78513 addi a0,a5,1580 # 300662c + 30050d6: 224d jal ra,3005278 + 30050d8: 4785 li a5,1 + 30050da: aa51 j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerMode(handle->mode), BASE_STATUS_ERROR); + 30050dc: fec42783 lw a5,-20(s0) + 30050e0: 479c lw a5,8(a5) + 30050e2: 853e mv a0,a5 + 30050e4: 358d jal ra,3004f46 + 30050e6: 87aa mv a5,a0 + 30050e8: 0017c793 xori a5,a5,1 + 30050ec: 9f81 uxtb a5 + 30050ee: cb91 beqz a5,3005102 + 30050f0: 02d00593 li a1,45 + 30050f4: 030067b7 lui a5,0x3006 + 30050f8: 62c78513 addi a0,a5,1580 # 300662c + 30050fc: 2ab5 jal ra,3005278 + 30050fe: 4785 li a5,1 + 3005100: a2bd j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerSize(handle->size), BASE_STATUS_ERROR); + 3005102: fec42783 lw a5,-20(s0) + 3005106: 4b9c lw a5,16(a5) + 3005108: 853e mv a0,a5 + 300510a: 3d79 jal ra,3004fa8 + 300510c: 87aa mv a5,a0 + 300510e: 0017c793 xori a5,a5,1 + 3005112: 9f81 uxtb a5 + 3005114: cb91 beqz a5,3005128 + 3005116: 02e00593 li a1,46 + 300511a: 030067b7 lui a5,0x3006 + 300511e: 62c78513 addi a0,a5,1580 # 300662c + 3005122: 2a99 jal ra,3005278 + 3005124: 4785 li a5,1 + 3005126: a2a1 j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerDiv(handle->prescaler), BASE_STATUS_ERROR); + 3005128: fec42783 lw a5,-20(s0) + 300512c: 47dc lw a5,12(a5) + 300512e: 853e mv a0,a5 + 3005130: 35c1 jal ra,3004ff0 + 3005132: 87aa mv a5,a0 + 3005134: 0017c793 xori a5,a5,1 + 3005138: 9f81 uxtb a5 + 300513a: cb91 beqz a5,300514e + 300513c: 02f00593 li a1,47 + 3005140: 030067b7 lui a5,0x3006 + 3005144: 62c78513 addi a0,a5,1580 # 300662c + 3005148: 2a05 jal ra,3005278 + 300514a: 4785 li a5,1 + 300514c: a20d j 300526e + + /* Initialize the configuration parameters of the timer */ + handle->baseAddress->timer_intclr = BASE_CFG_SET; /* Writing to this register clears interrupt output of timer */ + 300514e: fec42783 lw a5,-20(s0) + 3005152: 439c lw a5,0(a5) + 3005154: 4705 li a4,1 + 3005156: c7d8 sw a4,12(a5) + handle->baseAddress->timer_load = handle->load; + 3005158: fec42783 lw a5,-20(s0) + 300515c: 439c lw a5,0(a5) + 300515e: fec42703 lw a4,-20(s0) + 3005162: 4b58 lw a4,20(a4) + 3005164: c398 sw a4,0(a5) + handle->baseAddress->timerbgload = handle->bgLoad; + 3005166: fec42783 lw a5,-20(s0) + 300516a: 439c lw a5,0(a5) + 300516c: fec42703 lw a4,-20(s0) + 3005170: 4f18 lw a4,24(a4) + 3005172: cf98 sw a4,24(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_DISABLE; + 3005174: fec42783 lw a5,-20(s0) + 3005178: 4398 lw a4,0(a5) + 300517a: 471c lw a5,8(a4) + 300517c: f7f7f793 andi a5,a5,-129 + 3005180: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timerintenable = handle->interruptEn; + 3005182: fec42783 lw a5,-20(s0) + 3005186: 4398 lw a4,0(a5) + 3005188: fec42783 lw a5,-20(s0) + 300518c: 2fd4 lbu a3,28(a5) + 300518e: 471c lw a5,8(a4) + 3005190: 8a85 andi a3,a3,1 + 3005192: 0696 slli a3,a3,0x5 + 3005194: fdf7f793 andi a5,a5,-33 + 3005198: 8fd5 or a5,a5,a3 + 300519a: c71c sw a5,8(a4) + + /* Sets the frequency divider and size of the timer module. */ + handle->baseAddress->TIMERx_CONTROL.BIT.timerpre = handle->prescaler; + 300519c: fec42783 lw a5,-20(s0) + 30051a0: 47d4 lw a3,12(a5) + 30051a2: fec42783 lw a5,-20(s0) + 30051a6: 4398 lw a4,0(a5) + 30051a8: 87b6 mv a5,a3 + 30051aa: 8b8d andi a5,a5,3 + 30051ac: 0ff7f693 andi a3,a5,255 + 30051b0: 471c lw a5,8(a4) + 30051b2: 8a8d andi a3,a3,3 + 30051b4: 068a slli a3,a3,0x2 + 30051b6: 9bcd andi a5,a5,-13 + 30051b8: 8fd5 or a5,a5,a3 + 30051ba: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timersize = handle->size; + 30051bc: fec42783 lw a5,-20(s0) + 30051c0: 4b94 lw a3,16(a5) + 30051c2: fec42783 lw a5,-20(s0) + 30051c6: 4398 lw a4,0(a5) + 30051c8: 87b6 mv a5,a3 + 30051ca: 8b85 andi a5,a5,1 + 30051cc: 0ff7f693 andi a3,a5,255 + 30051d0: 471c lw a5,8(a4) + 30051d2: 8a85 andi a3,a3,1 + 30051d4: 0686 slli a3,a3,0x1 + 30051d6: 9bf5 andi a5,a5,-3 + 30051d8: 8fd5 or a5,a5,a3 + 30051da: c71c sw a5,8(a4) + + /* Sets the running mode of the timer. */ + if (handle->mode == TIMER_MODE_RUN_ONTSHOT) { + 30051dc: fec42783 lw a5,-20(s0) + 30051e0: 4798 lw a4,8(a5) + 30051e2: 4789 li a5,2 + 30051e4: 00f71a63 bne a4,a5,30051f8 + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_SET; + 30051e8: fec42783 lw a5,-20(s0) + 30051ec: 4398 lw a4,0(a5) + 30051ee: 471c lw a5,8(a4) + 30051f0: 0017e793 ori a5,a5,1 + 30051f4: c71c sw a5,8(a4) + 30051f6: a805 j 3005226 + } else { + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_UNSET; + 30051f8: fec42783 lw a5,-20(s0) + 30051fc: 4398 lw a4,0(a5) + 30051fe: 471c lw a5,8(a4) + 3005200: 9bf9 andi a5,a5,-2 + 3005202: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005204: fec42783 lw a5,-20(s0) + 3005208: 479c lw a5,8(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 300520a: fec42703 lw a4,-20(s0) + 300520e: 4318 lw a4,0(a4) + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005210: 00f037b3 snez a5,a5 + 3005214: 0ff7f693 andi a3,a5,255 + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005218: 471c lw a5,8(a4) + 300521a: 8a85 andi a3,a3,1 + 300521c: 069a slli a3,a3,0x6 + 300521e: fbf7f793 andi a5,a5,-65 + 3005222: 8fd5 or a5,a5,a3 + 3005224: c71c sw a5,8(a4) + } + + /* Request for setting the DMA and ADC. */ + handle->baseAddress->TIMERx_CONTROLB.BIT.dmasreqen = handle->dmaReqEnable; + 3005226: fec42783 lw a5,-20(s0) + 300522a: 4398 lw a4,0(a5) + 300522c: fec42783 lw a5,-20(s0) + 3005230: 2ff4 lbu a3,30(a5) + 3005232: 4f5c lw a5,28(a4) + 3005234: 8a85 andi a3,a3,1 + 3005236: 0686 slli a3,a3,0x1 + 3005238: 9bf5 andi a5,a5,-3 + 300523a: 8fd5 or a5,a5,a3 + 300523c: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.dmabreqen = handle->dmaReqEnable; + 300523e: fec42783 lw a5,-20(s0) + 3005242: 4398 lw a4,0(a5) + 3005244: fec42783 lw a5,-20(s0) + 3005248: 2ff4 lbu a3,30(a5) + 300524a: 4f5c lw a5,28(a4) + 300524c: 8a85 andi a3,a3,1 + 300524e: 9bf9 andi a5,a5,-2 + 3005250: 8fd5 or a5,a5,a3 + 3005252: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.socen = handle->adcSocReqEnable; + 3005254: fec42783 lw a5,-20(s0) + 3005258: 4398 lw a4,0(a5) + 300525a: fec42783 lw a5,-20(s0) + 300525e: 3fd4 lbu a3,29(a5) + 3005260: 4f5c lw a5,28(a4) + 3005262: 8a85 andi a3,a3,1 + 3005264: 068a slli a3,a3,0x2 + 3005266: 9bed andi a5,a5,-5 + 3005268: 8fd5 or a5,a5,a3 + 300526a: cf5c sw a5,28(a4) + return BASE_STATUS_OK; + 300526c: 4781 li a5,0 +} + 300526e: 853e mv a0,a5 + 3005270: 40f2 lw ra,28(sp) + 3005272: 4462 lw s0,24(sp) + 3005274: 6105 addi sp,sp,32 + 3005276: 8082 ret + +03005278 : + 3005278: c37fc06f j 3001eae + +0300527c : + * @brief Start timer. + * @param handle Timer Handle + * @retval None + */ +void HAL_TIMER_Start(TIMER_Handle *handle) +{ + 300527c: 1101 addi sp,sp,-32 + 300527e: ce06 sw ra,28(sp) + 3005280: cc22 sw s0,24(sp) + 3005282: 1000 addi s0,sp,32 + 3005284: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005288: fec42783 lw a5,-20(s0) + 300528c: eb89 bnez a5,300529e + 300528e: 0bc00593 li a1,188 + 3005292: 030067b7 lui a5,0x3006 + 3005296: 62c78513 addi a0,a5,1580 # 300662c + 300529a: 3ff9 jal ra,3005278 + 300529c: a001 j 300529c + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 300529e: fec42783 lw a5,-20(s0) + 30052a2: 4398 lw a4,0(a5) + 30052a4: 143007b7 lui a5,0x14300 + 30052a8: 02f70f63 beq a4,a5,30052e6 + 30052ac: fec42783 lw a5,-20(s0) + 30052b0: 4398 lw a4,0(a5) + 30052b2: 143017b7 lui a5,0x14301 + 30052b6: 02f70863 beq a4,a5,30052e6 + 30052ba: fec42783 lw a5,-20(s0) + 30052be: 4398 lw a4,0(a5) + 30052c0: 143027b7 lui a5,0x14302 + 30052c4: 02f70163 beq a4,a5,30052e6 + 30052c8: fec42783 lw a5,-20(s0) + 30052cc: 4398 lw a4,0(a5) + 30052ce: 143037b7 lui a5,0x14303 + 30052d2: 00f70a63 beq a4,a5,30052e6 + 30052d6: 0bd00593 li a1,189 + 30052da: 030067b7 lui a5,0x3006 + 30052de: 62c78513 addi a0,a5,1580 # 300662c + 30052e2: 3f59 jal ra,3005278 + 30052e4: a001 j 30052e4 + /* Enable timer */ + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_SET; + 30052e6: fec42783 lw a5,-20(s0) + 30052ea: 4398 lw a4,0(a5) + 30052ec: 471c lw a5,8(a4) + 30052ee: 0807e793 ori a5,a5,128 + 30052f2: c71c sw a5,8(a4) +} + 30052f4: 0001 nop + 30052f6: 40f2 lw ra,28(sp) + 30052f8: 4462 lw s0,24(sp) + 30052fa: 6105 addi sp,sp,32 + 30052fc: 8082 ret + +030052fe : + * @brief GPT Interrupt service processing function. + * @param handle TIMER Handle + * @retval None + */ +void HAL_TIMER_IrqHandler(void *handle) +{ + 30052fe: 7179 addi sp,sp,-48 + 3005300: d606 sw ra,44(sp) + 3005302: d422 sw s0,40(sp) + 3005304: 1800 addi s0,sp,48 + 3005306: fca42e23 sw a0,-36(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 300530a: fdc42783 lw a5,-36(s0) + 300530e: eb89 bnez a5,3005320 + 3005310: 0d800593 li a1,216 + 3005314: 030067b7 lui a5,0x3006 + 3005318: 62c78513 addi a0,a5,1580 # 300662c + 300531c: 3fb1 jal ra,3005278 + 300531e: a001 j 300531e + TIMER_Handle *timerHandle = (TIMER_Handle *)handle; + 3005320: fdc42783 lw a5,-36(s0) + 3005324: fef42623 sw a5,-20(s0) + TIMER_ASSERT_PARAM(IsTIMERInstance(timerHandle->baseAddress)); + 3005328: fec42783 lw a5,-20(s0) + 300532c: 4398 lw a4,0(a5) + 300532e: 143007b7 lui a5,0x14300 + 3005332: 02f70f63 beq a4,a5,3005370 + 3005336: fec42783 lw a5,-20(s0) + 300533a: 4398 lw a4,0(a5) + 300533c: 143017b7 lui a5,0x14301 + 3005340: 02f70863 beq a4,a5,3005370 + 3005344: fec42783 lw a5,-20(s0) + 3005348: 4398 lw a4,0(a5) + 300534a: 143027b7 lui a5,0x14302 + 300534e: 02f70163 beq a4,a5,3005370 + 3005352: fec42783 lw a5,-20(s0) + 3005356: 4398 lw a4,0(a5) + 3005358: 143037b7 lui a5,0x14303 + 300535c: 00f70a63 beq a4,a5,3005370 + 3005360: 0da00593 li a1,218 + 3005364: 030067b7 lui a5,0x3006 + 3005368: 62c78513 addi a0,a5,1580 # 300662c + 300536c: 3731 jal ra,3005278 + 300536e: a001 j 300536e + /* Check interrupt type */ + if (timerHandle->baseAddress->TIMERx_MIS.dmaovmis == BASE_CFG_ENABLE) { + 3005370: fec42783 lw a5,-20(s0) + 3005374: 439c lw a5,0(a5) + 3005376: 4bdc lw a5,20(a5) + 3005378: 8385 srli a5,a5,0x1 + 300537a: 8b85 andi a5,a5,1 + 300537c: 0ff7f713 andi a4,a5,255 + 3005380: 4785 li a5,1 + 3005382: 02f71363 bne a4,a5,30053a8 + /* DMA overflow interrupt */ + timerHandle->baseAddress->DMAOV_INTCLR.BIT.dmaov_intclr = BASE_CFG_ENABLE; + 3005386: fec42783 lw a5,-20(s0) + 300538a: 4398 lw a4,0(a5) + 300538c: 531c lw a5,32(a4) + 300538e: 0017e793 ori a5,a5,1 + 3005392: d31c sw a5,32(a4) + /* Call the timer DMA request overflow callback function of the user. */ + if (timerHandle->userCallBack.TimerOverFlowCallBack != NULL) { + 3005394: fec42783 lw a5,-20(s0) + 3005398: 53dc lw a5,36(a5) + 300539a: c799 beqz a5,30053a8 + timerHandle->userCallBack.TimerOverFlowCallBack(timerHandle); + 300539c: fec42783 lw a5,-20(s0) + 30053a0: 53dc lw a5,36(a5) + 30053a2: fec42503 lw a0,-20(s0) + 30053a6: 9782 jalr a5 + } + } + if (timerHandle->baseAddress->TIMERx_MIS.timermis == BASE_CFG_ENABLE) { + 30053a8: fec42783 lw a5,-20(s0) + 30053ac: 439c lw a5,0(a5) + 30053ae: 4bdc lw a5,20(a5) + 30053b0: 8b85 andi a5,a5,1 + 30053b2: 0ff7f713 andi a4,a5,255 + 30053b6: 4785 li a5,1 + 30053b8: 02f71263 bne a4,a5,30053dc + /* TIMER Interrupt */ + timerHandle->baseAddress->timer_intclr = BASE_CFG_ENABLE; + 30053bc: fec42783 lw a5,-20(s0) + 30053c0: 439c lw a5,0(a5) + 30053c2: 4705 li a4,1 + 30053c4: c7d8 sw a4,12(a5) + /* Call the period finish callback function of the user. */ + if (timerHandle->userCallBack.TimerPeriodFinCallBack != NULL) { + 30053c6: fec42783 lw a5,-20(s0) + 30053ca: 539c lw a5,32(a5) + 30053cc: cb81 beqz a5,30053dc + timerHandle->userCallBack.TimerPeriodFinCallBack(timerHandle); + 30053ce: fec42783 lw a5,-20(s0) + 30053d2: 539c lw a5,32(a5) + 30053d4: fec42503 lw a0,-20(s0) + 30053d8: 9782 jalr a5 + } + } + return; + 30053da: 0001 nop + 30053dc: 0001 nop +} + 30053de: 50b2 lw ra,44(sp) + 30053e0: 5422 lw s0,40(sp) + 30053e2: 6145 addi sp,sp,48 + 30053e4: 8082 ret + +030053e6 : + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_TIMER_RegisterCallback(TIMER_Handle *handle, TIMER_InterruptType typeID, + TIMER_CallBackFunc callBackFunc) +{ + 30053e6: 1101 addi sp,sp,-32 + 30053e8: ce06 sw ra,28(sp) + 30053ea: cc22 sw s0,24(sp) + 30053ec: 1000 addi s0,sp,32 + 30053ee: fea42623 sw a0,-20(s0) + 30053f2: feb42423 sw a1,-24(s0) + 30053f6: fec42223 sw a2,-28(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 30053fa: fec42783 lw a5,-20(s0) + 30053fe: eb89 bnez a5,3005410 + 3005400: 0fa00593 li a1,250 + 3005404: 030067b7 lui a5,0x3006 + 3005408: 62c78513 addi a0,a5,1580 # 300662c + 300540c: 35b5 jal ra,3005278 + 300540e: a001 j 300540e + TIMER_ASSERT_PARAM(callBackFunc != NULL); + 3005410: fe442783 lw a5,-28(s0) + 3005414: eb89 bnez a5,3005426 + 3005416: 0fb00593 li a1,251 + 300541a: 030067b7 lui a5,0x3006 + 300541e: 62c78513 addi a0,a5,1580 # 300662c + 3005422: 3d99 jal ra,3005278 + 3005424: a001 j 3005424 + TIMER_ASSERT_PARAM(IsTimerInterruptType(typeID)); + 3005426: fe842503 lw a0,-24(s0) + 300542a: 3e89 jal ra,3004f7c + 300542c: 87aa mv a5,a0 + 300542e: 0017c793 xori a5,a5,1 + 3005432: 9f81 uxtb a5 + 3005434: cb89 beqz a5,3005446 + 3005436: 0fc00593 li a1,252 + 300543a: 030067b7 lui a5,0x3006 + 300543e: 62c78513 addi a0,a5,1580 # 300662c + 3005442: 3d1d jal ra,3005278 + 3005444: a001 j 3005444 + + /* Registers the user callback function. */ + switch (typeID) { + 3005446: fe842783 lw a5,-24(s0) + 300544a: cb91 beqz a5,300545e + 300544c: 4705 li a4,1 + 300544e: 00e79e63 bne a5,a4,300546a + case TIMER_OVER_FLOW: + handle->userCallBack.TimerOverFlowCallBack = callBackFunc; /* User DMA request overflow function */ + 3005452: fec42783 lw a5,-20(s0) + 3005456: fe442703 lw a4,-28(s0) + 300545a: d3d8 sw a4,36(a5) + break; + 300545c: a809 j 300546e + case TIMER_PERIOD_FIN: + handle->userCallBack.TimerPeriodFinCallBack = callBackFunc; /* User timer period finish call back. */ + 300545e: fec42783 lw a5,-20(s0) + 3005462: fe442703 lw a4,-28(s0) + 3005466: d398 sw a4,32(a5) + break; + 3005468: a019 j 300546e + default: + return BASE_STATUS_ERROR; + 300546a: 4785 li a5,1 + 300546c: a011 j 3005470 + } + return BASE_STATUS_OK; + 300546e: 4781 li a5,0 +} + 3005470: 853e mv a0,a5 + 3005472: 40f2 lw ra,28(sp) + 3005474: 4462 lw s0,24(sp) + 3005476: 6105 addi sp,sp,32 + 3005478: 8082 ret + +0300547a : + * @brief Check UART datalength parameter. + * @param datalength The number of data bits in a frame, @ref UART_DataLength + * @retval bool + */ +static inline bool IsUartDatalength(UART_DataLength datalength) +{ + 300547a: 1101 addi sp,sp,-32 + 300547c: ce22 sw s0,28(sp) + 300547e: 1000 addi s0,sp,32 + 3005480: fea42623 sw a0,-20(s0) + return (datalength >= UART_DATALENGTH_5BIT) && (datalength <= UART_DATALENGTH_8BIT); + 3005484: fec42783 lw a5,-20(s0) + 3005488: 0047b793 sltiu a5,a5,4 + 300548c: 9f81 uxtb a5 +} + 300548e: 853e mv a0,a5 + 3005490: 4472 lw s0,28(sp) + 3005492: 6105 addi sp,sp,32 + 3005494: 8082 ret + +03005496 : + * @brief Check UART stopbits parameter. + * @param stopbits The number of stop bits in a frame, @ref UART_StopBits + * @retval bool + */ +static inline bool IsUartStopbits(UART_StopBits stopbits) +{ + 3005496: 1101 addi sp,sp,-32 + 3005498: ce22 sw s0,28(sp) + 300549a: 1000 addi s0,sp,32 + 300549c: fea42623 sw a0,-20(s0) + return (stopbits == UART_STOPBITS_ONE) || (stopbits == UART_STOPBITS_TWO); + 30054a0: fec42783 lw a5,-20(s0) + 30054a4: c791 beqz a5,30054b0 + 30054a6: fec42703 lw a4,-20(s0) + 30054aa: 4785 li a5,1 + 30054ac: 00f71463 bne a4,a5,30054b4 + 30054b0: 4785 li a5,1 + 30054b2: a011 j 30054b6 + 30054b4: 4781 li a5,0 + 30054b6: 8b85 andi a5,a5,1 + 30054b8: 9f81 uxtb a5 +} + 30054ba: 853e mv a0,a5 + 30054bc: 4472 lw s0,28(sp) + 30054be: 6105 addi sp,sp,32 + 30054c0: 8082 ret + +030054c2 : + * @brief Check UART paritymode parameter. + * @param paritymode UART parity check mode, @ref UART_Parity_Mode + * @retval bool + */ +static inline bool IsUartParitymode(UART_Parity_Mode paritymode) +{ + 30054c2: 1101 addi sp,sp,-32 + 30054c4: ce22 sw s0,28(sp) + 30054c6: 1000 addi s0,sp,32 + 30054c8: fea42623 sw a0,-20(s0) + if ((paritymode >= UART_PARITY_ODD) && (paritymode <= UART_PARITY_NONE)) { + 30054cc: fec42703 lw a4,-20(s0) + 30054d0: 4791 li a5,4 + 30054d2: 00e7e463 bltu a5,a4,30054da + return true; + 30054d6: 4785 li a5,1 + 30054d8: a011 j 30054dc + } + return false; + 30054da: 4781 li a5,0 +} + 30054dc: 853e mv a0,a5 + 30054de: 4472 lw s0,28(sp) + 30054e0: 6105 addi sp,sp,32 + 30054e2: 8082 ret + +030054e4 : + * @brief Check UART transmode parameter. + * @param transmode Transmit mode, @ref UART_Transmit_Mode + * @retval bool + */ +static inline bool IsUartTransmode(UART_Transmit_Mode transmode) +{ + 30054e4: 1101 addi sp,sp,-32 + 30054e6: ce22 sw s0,28(sp) + 30054e8: 1000 addi s0,sp,32 + 30054ea: fea42623 sw a0,-20(s0) + if ((transmode == UART_MODE_BLOCKING) || + 30054ee: fec42783 lw a5,-20(s0) + 30054f2: c385 beqz a5,3005512 + 30054f4: fec42703 lw a4,-20(s0) + 30054f8: 4785 li a5,1 + 30054fa: 00f70c63 beq a4,a5,3005512 + (transmode == UART_MODE_INTERRUPT) || + 30054fe: fec42703 lw a4,-20(s0) + 3005502: 4789 li a5,2 + 3005504: 00f70763 beq a4,a5,3005512 + (transmode == UART_MODE_DMA) || + 3005508: fec42703 lw a4,-20(s0) + 300550c: 478d li a5,3 + 300550e: 00f71463 bne a4,a5,3005516 + (transmode == UART_MODE_DISABLE)) { + return true; + 3005512: 4785 li a5,1 + 3005514: a011 j 3005518 + } + return false; + 3005516: 4781 li a5,0 +} + 3005518: 853e mv a0,a5 + 300551a: 4472 lw s0,28(sp) + 300551c: 6105 addi sp,sp,32 + 300551e: 8082 ret + +03005520 : + * @brief Check UART fifoThreshold parameter. + * @param fifoThreshold UART TX/RX FIFO line interrupt threshold, @ref UART_FIFO_Threshold + * @retval bool + */ +static inline bool IsUartFIFOThreshold(UART_FIFO_Threshold fifoThreshold) +{ + 3005520: 1101 addi sp,sp,-32 + 3005522: ce22 sw s0,28(sp) + 3005524: 1000 addi s0,sp,32 + 3005526: fea42623 sw a0,-20(s0) + return (fifoThreshold >= UART_FIFODEPTH_SIZE0) && (fifoThreshold <= UART_FIFODEPTH_SIZE15); + 300552a: fec42783 lw a5,-20(s0) + 300552e: 0107b793 sltiu a5,a5,16 + 3005532: 9f81 uxtb a5 +} + 3005534: 853e mv a0,a5 + 3005536: 4472 lw s0,28(sp) + 3005538: 6105 addi sp,sp,32 + 300553a: 8082 ret + +0300553c : + * @brief Check UART Oversampling multiple. + * @param multiple Oversampling multiple, @ref UART_OversampleMultiple + * @retval bool + */ +static inline bool IsUartOversampleMultiple(UART_OversampleMultiple multiple) +{ + 300553c: 1101 addi sp,sp,-32 + 300553e: ce22 sw s0,28(sp) + 3005540: 1000 addi s0,sp,32 + 3005542: fea42623 sw a0,-20(s0) + return (multiple >= UART_OVERSAMPLING_16X) && (multiple <= UART_OVERSAMPLING_12X); + 3005546: fec42783 lw a5,-20(s0) + 300554a: 0057b793 sltiu a5,a5,5 + 300554e: 9f81 uxtb a5 +} + 3005550: 853e mv a0,a5 + 3005552: 4472 lw s0,28(sp) + 3005554: 6105 addi sp,sp,32 + 3005556: 8082 ret + +03005558 : +#define PARITY_EVEN 0x6 +#define PARITY_MARK 0x82 +#define PARITY_SPACE 0x86 + +static unsigned int DivClosest(unsigned int x, unsigned int divisor) +{ + 3005558: 7179 addi sp,sp,-48 + 300555a: d622 sw s0,44(sp) + 300555c: 1800 addi s0,sp,48 + 300555e: fca42e23 sw a0,-36(s0) + 3005562: fcb42c23 sw a1,-40(s0) + unsigned int ret; + if (divisor == 0) { + 3005566: fd842783 lw a5,-40(s0) + 300556a: e399 bnez a5,3005570 + return 0; + 300556c: 4781 li a5,0 + 300556e: a005 j 300558e + } + ret = (((x) + ((divisor) / 2)) / (divisor)); /* Round up the result, add 1/2 */ + 3005570: fd842783 lw a5,-40(s0) + 3005574: 0017d713 srli a4,a5,0x1 + 3005578: fdc42783 lw a5,-36(s0) + 300557c: 973e add a4,a4,a5 + 300557e: fd842783 lw a5,-40(s0) + 3005582: 02f757b3 divu a5,a4,a5 + 3005586: fef42623 sw a5,-20(s0) + return ret; + 300558a: fec42783 lw a5,-20(s0) +} + 300558e: 853e mv a0,a5 + 3005590: 5432 lw s0,44(sp) + 3005592: 6145 addi sp,sp,48 + 3005594: 8082 ret + +03005596 : + * @brief Sets the parity bit of the UART. + * @param uartHandle UART handle. + * @retval None. + */ +static void UART_SetParityBit(UART_Handle *uartHandle) +{ + 3005596: 1101 addi sp,sp,-32 + 3005598: ce22 sw s0,28(sp) + 300559a: 1000 addi s0,sp,32 + 300559c: fea42623 sw a0,-20(s0) + /* Sets the UART check mode. */ + switch (uartHandle->parity) { + 30055a0: fec42783 lw a5,-20(s0) + 30055a4: 4b9c lw a5,16(a5) + 30055a6: 4711 li a4,4 + 30055a8: 06f76e63 bltu a4,a5,3005624 + 30055ac: 00279713 slli a4,a5,0x2 + 30055b0: 030067b7 lui a5,0x3006 + 30055b4: 64c78793 addi a5,a5,1612 # 300664c + 30055b8: 97ba add a5,a5,a4 + 30055ba: 439c lw a5,0(a5) + 30055bc: 8782 jr a5 + case UART_PARITY_ODD: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_ODD; /* Odd parity. */ + 30055be: fec42783 lw a5,-20(s0) + 30055c2: 439c lw a5,0(a5) + 30055c4: 57d8 lw a4,44(a5) + 30055c6: fec42783 lw a5,-20(s0) + 30055ca: 439c lw a5,0(a5) + 30055cc: 00276713 ori a4,a4,2 + 30055d0: d7d8 sw a4,44(a5) + break; + 30055d2: a891 j 3005626 + case UART_PARITY_EVEN: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_EVEN; /* Even parity. */ + 30055d4: fec42783 lw a5,-20(s0) + 30055d8: 439c lw a5,0(a5) + 30055da: 57d8 lw a4,44(a5) + 30055dc: fec42783 lw a5,-20(s0) + 30055e0: 439c lw a5,0(a5) + 30055e2: 00676713 ori a4,a4,6 + 30055e6: d7d8 sw a4,44(a5) + break; + 30055e8: a83d j 3005626 + case UART_PARITY_MARK: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_MARK; /* Marking parity */ + 30055ea: fec42783 lw a5,-20(s0) + 30055ee: 439c lw a5,0(a5) + 30055f0: 57d8 lw a4,44(a5) + 30055f2: fec42783 lw a5,-20(s0) + 30055f6: 439c lw a5,0(a5) + 30055f8: 08276713 ori a4,a4,130 + 30055fc: d7d8 sw a4,44(a5) + break; + 30055fe: a025 j 3005626 + case UART_PARITY_SPACE: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_SPACE; /* space parity */ + 3005600: fec42783 lw a5,-20(s0) + 3005604: 439c lw a5,0(a5) + 3005606: 57d8 lw a4,44(a5) + 3005608: fec42783 lw a5,-20(s0) + 300560c: 439c lw a5,0(a5) + 300560e: 08676713 ori a4,a4,134 + 3005612: d7d8 sw a4,44(a5) + break; + 3005614: a809 j 3005626 + case UART_PARITY_NONE: + uartHandle->baseAddress->UART_LCR_H.BIT.pen = BASE_CFG_DISABLE; /* No parity */ + 3005616: fec42783 lw a5,-20(s0) + 300561a: 4398 lw a4,0(a5) + 300561c: 575c lw a5,44(a4) + 300561e: 9bf5 andi a5,a5,-3 + 3005620: d75c sw a5,44(a4) + break; + 3005622: a011 j 3005626 + default: + return; + 3005624: 0001 nop + } +} + 3005626: 4472 lw s0,28(sp) + 3005628: 6105 addi sp,sp,32 + 300562a: 8082 ret + +0300562c : + * @brief Initialize the UART hardware configuration and configure parameters based on the specified handle. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_Init(UART_Handle *uartHandle) +{ + 300562c: 7179 addi sp,sp,-48 + 300562e: d606 sw ra,44(sp) + 3005630: d422 sw s0,40(sp) + 3005632: 1800 addi s0,sp,48 + 3005634: fca42e23 sw a0,-36(s0) + UART_ASSERT_PARAM(uartHandle != NULL); + 3005638: fdc42783 lw a5,-36(s0) + 300563c: eb89 bnez a5,300564e + 300563e: 09700593 li a1,151 + 3005642: 030067b7 lui a5,0x3006 + 3005646: 66078513 addi a0,a5,1632 # 3006660 + 300564a: 313d jal ra,3005278 + 300564c: a001 j 300564c + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + 300564e: fdc42783 lw a5,-36(s0) + 3005652: 4398 lw a4,0(a5) + 3005654: 140007b7 lui a5,0x14000 + 3005658: 02f70f63 beq a4,a5,3005696 + 300565c: fdc42783 lw a5,-36(s0) + 3005660: 4398 lw a4,0(a5) + 3005662: 140017b7 lui a5,0x14001 + 3005666: 02f70863 beq a4,a5,3005696 + 300566a: fdc42783 lw a5,-36(s0) + 300566e: 4398 lw a4,0(a5) + 3005670: 140027b7 lui a5,0x14002 + 3005674: 02f70163 beq a4,a5,3005696 + 3005678: fdc42783 lw a5,-36(s0) + 300567c: 4398 lw a4,0(a5) + 300567e: 140037b7 lui a5,0x14003 + 3005682: 00f70a63 beq a4,a5,3005696 + 3005686: 09800593 li a1,152 + 300568a: 030067b7 lui a5,0x3006 + 300568e: 66078513 addi a0,a5,1632 # 3006660 + 3005692: 36dd jal ra,3005278 + 3005694: a001 j 3005694 + UART_PARAM_CHECK_WITH_RET(uartHandle->txState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 3005696: fdc42783 lw a5,-36(s0) + 300569a: 47bc lw a5,72(a5) + 300569c: cb91 beqz a5,30056b0 + 300569e: 09900593 li a1,153 + 30056a2: 030067b7 lui a5,0x3006 + 30056a6: 66078513 addi a0,a5,1632 # 3006660 + 30056aa: 36f9 jal ra,3005278 + 30056ac: 4785 li a5,1 + 30056ae: ae0d j 30059e0 + UART_PARAM_CHECK_WITH_RET(uartHandle->rxState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 30056b0: fdc42783 lw a5,-36(s0) + 30056b4: 47fc lw a5,76(a5) + 30056b6: cb91 beqz a5,30056ca + 30056b8: 09a00593 li a1,154 + 30056bc: 030067b7 lui a5,0x3006 + 30056c0: 66078513 addi a0,a5,1632 # 3006660 + 30056c4: 3e55 jal ra,3005278 + 30056c6: 4785 li a5,1 + 30056c8: ae21 j 30059e0 + unsigned int uartClock, quot; + UART_PARAM_CHECK_WITH_RET(IsUartDatalength(uartHandle->dataLength), BASE_STATUS_ERROR); + 30056ca: fdc42783 lw a5,-36(s0) + 30056ce: 479c lw a5,8(a5) + 30056d0: 853e mv a0,a5 + 30056d2: 3365 jal ra,300547a + 30056d4: 87aa mv a5,a0 + 30056d6: 0017c793 xori a5,a5,1 + 30056da: 9f81 uxtb a5 + 30056dc: cb91 beqz a5,30056f0 + 30056de: 09c00593 li a1,156 + 30056e2: 030067b7 lui a5,0x3006 + 30056e6: 66078513 addi a0,a5,1632 # 3006660 + 30056ea: 3679 jal ra,3005278 + 30056ec: 4785 li a5,1 + 30056ee: accd j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartStopbits(uartHandle->stopBits), BASE_STATUS_ERROR); + 30056f0: fdc42783 lw a5,-36(s0) + 30056f4: 47dc lw a5,12(a5) + 30056f6: 853e mv a0,a5 + 30056f8: 3b79 jal ra,3005496 + 30056fa: 87aa mv a5,a0 + 30056fc: 0017c793 xori a5,a5,1 + 3005700: 9f81 uxtb a5 + 3005702: cb91 beqz a5,3005716 + 3005704: 09d00593 li a1,157 + 3005708: 030067b7 lui a5,0x3006 + 300570c: 66078513 addi a0,a5,1632 # 3006660 + 3005710: 36a5 jal ra,3005278 + 3005712: 4785 li a5,1 + 3005714: a4f1 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartParitymode(uartHandle->parity), BASE_STATUS_ERROR); + 3005716: fdc42783 lw a5,-36(s0) + 300571a: 4b9c lw a5,16(a5) + 300571c: 853e mv a0,a5 + 300571e: 3355 jal ra,30054c2 + 3005720: 87aa mv a5,a0 + 3005722: 0017c793 xori a5,a5,1 + 3005726: 9f81 uxtb a5 + 3005728: cb91 beqz a5,300573c + 300572a: 09e00593 li a1,158 + 300572e: 030067b7 lui a5,0x3006 + 3005732: 66078513 addi a0,a5,1632 # 3006660 + 3005736: 3689 jal ra,3005278 + 3005738: 4785 li a5,1 + 300573a: a45d j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->txMode), BASE_STATUS_ERROR); + 300573c: fdc42783 lw a5,-36(s0) + 3005740: 4bdc lw a5,20(a5) + 3005742: 853e mv a0,a5 + 3005744: 3345 jal ra,30054e4 + 3005746: 87aa mv a5,a0 + 3005748: 0017c793 xori a5,a5,1 + 300574c: 9f81 uxtb a5 + 300574e: cb91 beqz a5,3005762 + 3005750: 09f00593 li a1,159 + 3005754: 030067b7 lui a5,0x3006 + 3005758: 66078513 addi a0,a5,1632 # 3006660 + 300575c: 3e31 jal ra,3005278 + 300575e: 4785 li a5,1 + 3005760: a441 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->rxMode), BASE_STATUS_ERROR); + 3005762: fdc42783 lw a5,-36(s0) + 3005766: 4f9c lw a5,24(a5) + 3005768: 853e mv a0,a5 + 300576a: 3bad jal ra,30054e4 + 300576c: 87aa mv a5,a0 + 300576e: 0017c793 xori a5,a5,1 + 3005772: 9f81 uxtb a5 + 3005774: cb91 beqz a5,3005788 + 3005776: 0a000593 li a1,160 + 300577a: 030067b7 lui a5,0x3006 + 300577e: 66078513 addi a0,a5,1632 # 3006660 + 3005782: 3cdd jal ra,3005278 + 3005784: 4785 li a5,1 + 3005786: aca9 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoTxThr), BASE_STATUS_ERROR); + 3005788: fdc42783 lw a5,-36(s0) + 300578c: 5b9c lw a5,48(a5) + 300578e: 853e mv a0,a5 + 3005790: 3b41 jal ra,3005520 + 3005792: 87aa mv a5,a0 + 3005794: 0017c793 xori a5,a5,1 + 3005798: 9f81 uxtb a5 + 300579a: cb91 beqz a5,30057ae + 300579c: 0a100593 li a1,161 + 30057a0: 030067b7 lui a5,0x3006 + 30057a4: 66078513 addi a0,a5,1632 # 3006660 + 30057a8: 3cc1 jal ra,3005278 + 30057aa: 4785 li a5,1 + 30057ac: ac15 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoRxThr), BASE_STATUS_ERROR); + 30057ae: fdc42783 lw a5,-36(s0) + 30057b2: 5bdc lw a5,52(a5) + 30057b4: 853e mv a0,a5 + 30057b6: 33ad jal ra,3005520 + 30057b8: 87aa mv a5,a0 + 30057ba: 0017c793 xori a5,a5,1 + 30057be: 9f81 uxtb a5 + 30057c0: cb91 beqz a5,30057d4 + 30057c2: 0a200593 li a1,162 + 30057c6: 030067b7 lui a5,0x3006 + 30057ca: 66078513 addi a0,a5,1632 # 3006660 + 30057ce: 346d jal ra,3005278 + 30057d0: 4785 li a5,1 + 30057d2: a439 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartOversampleMultiple(uartHandle->handleEx.overSampleMultiple), BASE_STATUS_ERROR); + 30057d4: fdc42783 lw a5,-36(s0) + 30057d8: 5fbc lw a5,120(a5) + 30057da: 853e mv a0,a5 + 30057dc: 3385 jal ra,300553c + 30057de: 87aa mv a5,a0 + 30057e0: 0017c793 xori a5,a5,1 + 30057e4: 9f81 uxtb a5 + 30057e6: cb91 beqz a5,30057fa + 30057e8: 0a300593 li a1,163 + 30057ec: 030067b7 lui a5,0x3006 + 30057f0: 66078513 addi a0,a5,1632 # 3006660 + 30057f4: 3451 jal ra,3005278 + 30057f6: 4785 li a5,1 + 30057f8: a2e5 j 30059e0 + + uartHandle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; + 30057fa: fdc42783 lw a5,-36(s0) + 30057fe: 4398 lw a4,0(a5) + 3005800: 5b1c lw a5,48(a4) + 3005802: 9bf9 andi a5,a5,-2 + 3005804: db1c sw a5,48(a4) + while (uartHandle->baseAddress->UART_FR.BIT.busy == 0x01) { + 3005806: 0001 nop + 3005808: fdc42783 lw a5,-36(s0) + 300580c: 439c lw a5,0(a5) + 300580e: 4f9c lw a5,24(a5) + 3005810: 838d srli a5,a5,0x3 + 3005812: 8b85 andi a5,a5,1 + 3005814: 0ff7f713 andi a4,a5,255 + 3005818: 4785 li a5,1 + 300581a: fef707e3 beq a4,a5,3005808 + ; + } + + uartClock = HAL_CRG_GetIpFreq((void *)uartHandle->baseAddress); + 300581e: fdc42783 lw a5,-36(s0) + 3005822: 439c lw a5,0(a5) + 3005824: 853e mv a0,a5 + 3005826: 9f1fd0ef jal ra,3003216 + 300582a: fea42623 sw a0,-20(s0) + + /* DCL OverSample Multiple check */ + uartHandle->baseAddress->UART_SPCFG.BIT.spcfg = uartHandle->handleEx.overSampleMultiple; + 300582e: fdc42783 lw a5,-36(s0) + 3005832: 5fb4 lw a3,120(a5) + 3005834: fdc42783 lw a5,-36(s0) + 3005838: 4398 lw a4,0(a5) + 300583a: 87b6 mv a5,a3 + 300583c: 8bbd andi a5,a5,15 + 300583e: 0ff7f693 andi a3,a5,255 + 3005842: 4f3c lw a5,88(a4) + 3005844: 8abd andi a3,a3,15 + 3005846: 9bc1 andi a5,a5,-16 + 3005848: 8fd5 or a5,a5,a3 + 300584a: cf3c sw a5,88(a4) + + /* DCL sequences setting */ + uartHandle->baseAddress->UART_DS.BIT.msbfirst = uartHandle->handleEx.msbFirst; + 300584c: fdc42783 lw a5,-36(s0) + 3005850: 4398 lw a4,0(a5) + 3005852: fdc42783 lw a5,-36(s0) + 3005856: 07c7c683 lbu a3,124(a5) + 300585a: 4b3c lw a5,80(a4) + 300585c: 8a85 andi a3,a3,1 + 300585e: 9bf9 andi a5,a5,-2 + 3005860: 8fd5 or a5,a5,a3 + 3005862: cb3c sw a5,80(a4) + + /* The baud rate divider(BRD) based on the baud rate and clock frequency, calculation formula */ + unsigned int oversample = uartHandle->baseAddress->UART_SPCFG.reg; + 3005864: fdc42783 lw a5,-36(s0) + 3005868: 439c lw a5,0(a5) + 300586a: 4fbc lw a5,88(a5) + 300586c: fef42423 sw a5,-24(s0) + if (uartHandle->baudRate > (uartClock / (OVERSAMPLING_PARAM - oversample))) { + 3005870: fdc42783 lw a5,-36(s0) + 3005874: 43d8 lw a4,4(a5) + 3005876: 46c1 li a3,16 + 3005878: fe842783 lw a5,-24(s0) + 300587c: 40f687b3 sub a5,a3,a5 + 3005880: fec42683 lw a3,-20(s0) + 3005884: 02f6d7b3 divu a5,a3,a5 + 3005888: 00e7f463 bgeu a5,a4,3005890 + return BASE_STATUS_ERROR; + 300588c: 4785 li a5,1 + 300588e: aa89 j 30059e0 + } else { + unsigned int tmpClock = uartClock / (OVERSAMPLING_PARAM - oversample) * 64; /* 64 is for decimal parts */ + 3005890: 4741 li a4,16 + 3005892: fe842783 lw a5,-24(s0) + 3005896: 40f707b3 sub a5,a4,a5 + 300589a: fec42703 lw a4,-20(s0) + 300589e: 02f757b3 divu a5,a4,a5 + 30058a2: 079a slli a5,a5,0x6 + 30058a4: fef42223 sw a5,-28(s0) + quot = DivClosest(tmpClock, uartHandle->baudRate); + 30058a8: fdc42783 lw a5,-36(s0) + 30058ac: 43dc lw a5,4(a5) + 30058ae: 85be mv a1,a5 + 30058b0: fe442503 lw a0,-28(s0) + 30058b4: 3155 jal ra,3005558 + 30058b6: fea42023 sw a0,-32(s0) + } + /* Clear the baud rate divider register */ + uartHandle->baseAddress->UART_FBRD.reg = 0; + 30058ba: fdc42783 lw a5,-36(s0) + 30058be: 439c lw a5,0(a5) + 30058c0: 0207a423 sw zero,40(a5) + uartHandle->baseAddress->UART_IBRD.reg = 0; + 30058c4: fdc42783 lw a5,-36(s0) + 30058c8: 439c lw a5,0(a5) + 30058ca: 0207a223 sw zero,36(a5) + /* The fractional baud rate divider value is stored to the lower 6 bits of the FBRD */ + uartHandle->baseAddress->UART_FBRD.reg = (quot & 0x3F); + 30058ce: fdc42783 lw a5,-36(s0) + 30058d2: 439c lw a5,0(a5) + 30058d4: fe042703 lw a4,-32(s0) + 30058d8: 03f77713 andi a4,a4,63 + 30058dc: d798 sw a4,40(a5) + /* Right shift 6 bits is the integer baud rate divider value, is stored to IBRD */ + uartHandle->baseAddress->UART_IBRD.reg = (quot >> 6); + 30058de: fdc42783 lw a5,-36(s0) + 30058e2: 439c lw a5,0(a5) + 30058e4: fe042703 lw a4,-32(s0) + 30058e8: 8319 srli a4,a4,0x6 + 30058ea: d3d8 sw a4,36(a5) + uartHandle->baseAddress->UART_LCR_H.reg = 0; + 30058ec: fdc42783 lw a5,-36(s0) + 30058f0: 439c lw a5,0(a5) + 30058f2: 0207a623 sw zero,44(a5) + uartHandle->baseAddress->UART_LCR_H.BIT.wlen = uartHandle->dataLength; /* Frame length seting */ + 30058f6: fdc42783 lw a5,-36(s0) + 30058fa: 4794 lw a3,8(a5) + 30058fc: fdc42783 lw a5,-36(s0) + 3005900: 4398 lw a4,0(a5) + 3005902: 87b6 mv a5,a3 + 3005904: 8b8d andi a5,a5,3 + 3005906: 0ff7f693 andi a3,a5,255 + 300590a: 575c lw a5,44(a4) + 300590c: 8a8d andi a3,a3,3 + 300590e: 0696 slli a3,a3,0x5 + 3005910: f9f7f793 andi a5,a5,-97 + 3005914: 8fd5 or a5,a5,a3 + 3005916: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_LCR_H.BIT.stp2 = uartHandle->stopBits; /* Stop bit seting */ + 3005918: fdc42783 lw a5,-36(s0) + 300591c: 47d4 lw a3,12(a5) + 300591e: fdc42783 lw a5,-36(s0) + 3005922: 4398 lw a4,0(a5) + 3005924: 87b6 mv a5,a3 + 3005926: 8b85 andi a5,a5,1 + 3005928: 0ff7f693 andi a3,a5,255 + 300592c: 575c lw a5,44(a4) + 300592e: 8a85 andi a3,a3,1 + 3005930: 068e slli a3,a3,0x3 + 3005932: 9bdd andi a5,a5,-9 + 3005934: 8fd5 or a5,a5,a3 + 3005936: d75c sw a5,44(a4) + UART_SetParityBit(uartHandle); + 3005938: fdc42503 lw a0,-36(s0) + 300593c: 39a9 jal ra,3005596 + if (uartHandle->fifoMode == true) { /* FIFO threshold setting */ + 300593e: fdc42783 lw a5,-36(s0) + 3005942: 02c7c783 lbu a5,44(a5) + 3005946: cbb1 beqz a5,300599a + uartHandle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_ENABLE; + 3005948: fdc42783 lw a5,-36(s0) + 300594c: 4398 lw a4,0(a5) + 300594e: 575c lw a5,44(a4) + 3005950: 0107e793 ori a5,a5,16 + 3005954: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_IFLS.BIT.rxiflsel = uartHandle->fifoRxThr; + 3005956: fdc42783 lw a5,-36(s0) + 300595a: 5bd4 lw a3,52(a5) + 300595c: fdc42783 lw a5,-36(s0) + 3005960: 4398 lw a4,0(a5) + 3005962: 87b6 mv a5,a3 + 3005964: 8bbd andi a5,a5,15 + 3005966: 0ff7f693 andi a3,a5,255 + 300596a: 5b5c lw a5,52(a4) + 300596c: 8abd andi a3,a3,15 + 300596e: 06a2 slli a3,a3,0x8 + 3005970: 767d lui a2,0xfffff + 3005972: 0ff60613 addi a2,a2,255 # fffff0ff + 3005976: 8ff1 and a5,a5,a2 + 3005978: 8fd5 or a5,a5,a3 + 300597a: db5c sw a5,52(a4) + uartHandle->baseAddress->UART_IFLS.BIT.txiflsel = uartHandle->fifoTxThr; + 300597c: fdc42783 lw a5,-36(s0) + 3005980: 5b94 lw a3,48(a5) + 3005982: fdc42783 lw a5,-36(s0) + 3005986: 4398 lw a4,0(a5) + 3005988: 87b6 mv a5,a3 + 300598a: 8bbd andi a5,a5,15 + 300598c: 0ff7f693 andi a3,a5,255 + 3005990: 5b5c lw a5,52(a4) + 3005992: 8abd andi a3,a3,15 + 3005994: 9bc1 andi a5,a5,-16 + 3005996: 8fd5 or a5,a5,a3 + 3005998: db5c sw a5,52(a4) + } + if (uartHandle->hwFlowCtr == UART_HW_FLOWCTR_ENABLE) { /* Hardwarer flow control setting */ + 300599a: fdc42783 lw a5,-36(s0) + 300599e: 5f98 lw a4,56(a5) + 30059a0: 4785 li a5,1 + 30059a2: 00f71c63 bne a4,a5,30059ba + uartHandle->baseAddress->UART_CR.reg |= 0xC000; + 30059a6: fdc42783 lw a5,-36(s0) + 30059aa: 439c lw a5,0(a5) + 30059ac: 5b94 lw a3,48(a5) + 30059ae: fdc42783 lw a5,-36(s0) + 30059b2: 439c lw a5,0(a5) + 30059b4: 6731 lui a4,0xc + 30059b6: 8f55 or a4,a4,a3 + 30059b8: db98 sw a4,48(a5) + } + uartHandle->baseAddress->UART_CR.reg |= 0x301; /* Enable bit use 0x301 is to set txe/rxe/uarten */ + 30059ba: fdc42783 lw a5,-36(s0) + 30059be: 439c lw a5,0(a5) + 30059c0: 5b98 lw a4,48(a5) + 30059c2: fdc42783 lw a5,-36(s0) + 30059c6: 439c lw a5,0(a5) + 30059c8: 30176713 ori a4,a4,769 + 30059cc: db98 sw a4,48(a5) + uartHandle->txState = UART_STATE_READY; + 30059ce: fdc42783 lw a5,-36(s0) + 30059d2: 4705 li a4,1 + 30059d4: c7b8 sw a4,72(a5) + uartHandle->rxState = UART_STATE_READY; + 30059d6: fdc42783 lw a5,-36(s0) + 30059da: 4705 li a4,1 + 30059dc: c7f8 sw a4,76(a5) + return BASE_STATUS_OK; + 30059de: 4781 li a5,0 +} + 30059e0: 853e mv a0,a5 + 30059e2: 50b2 lw ra,44(sp) + 30059e4: 5422 lw s0,40(sp) + 30059e6: 6145 addi sp,sp,48 + 30059e8: 8082 ret + +030059ea
: +/* USER CODE BEGIN 1 */ +/* 建议用户定义全局变量、结构体、宏定义或函数声明等 */ +/* USER CODE END 1 */ + +int main(void) +{ + 30059ea: 1141 addi sp,sp,-16 + 30059ec: c606 sw ra,12(sp) + 30059ee: c422 sw s0,8(sp) + 30059f0: 0800 addi s0,sp,16 + /* USER CODE BEGIN 2 */ + /* 建议用户放置初始化代码或启动代码等 */ + /* USER CODE END 2 */ + SystemInit(); + 30059f2: 2655 jal ra,3005d96 + /* USER CODE BEGIN 3 */ + /* 建议用户放置初始配置代码 */ + /* USER CODE END 3 */ + while (1) { + 30059f4: a001 j 30059f4 + +030059f6 : +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + 30059f6: 715d addi sp,sp,-80 + 30059f8: c686 sw ra,76(sp) + 30059fa: c4a2 sw s0,72(sp) + 30059fc: 0880 addi s0,sp,80 + 30059fe: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3005a02: 100007b7 lui a5,0x10000 + 3005a06: fcf42423 sw a5,-56(s0) + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + 3005a0a: fc042623 sw zero,-52(s0) + crg.pllPreDiv = CRG_PLL_PREDIV_4; + 3005a0e: 478d li a5,3 + 3005a10: fcf42823 sw a5,-48(s0) + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + 3005a14: 03000793 li a5,48 + 3005a18: fcf42a23 sw a5,-44(s0) + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + 3005a1c: 4785 li a5,1 + 3005a1e: fcf42c23 sw a5,-40(s0) + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + 3005a22: 4789 li a5,2 + 3005a24: fef42023 sw a5,-32(s0) + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + 3005a28: 4789 li a5,2 + 3005a2a: fef42223 sw a5,-28(s0) + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + 3005a2e: fe042423 sw zero,-24(s0) + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + 3005a32: 47e1 li a5,24 + 3005a34: fef42623 sw a5,-20(s0) + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + 3005a38: fc840793 addi a5,s0,-56 + 3005a3c: 853e mv a0,a5 + 3005a3e: aecfd0ef jal ra,3002d2a + 3005a42: 87aa mv a5,a0 + 3005a44: c399 beqz a5,3005a4a + return BASE_STATUS_ERROR; + 3005a46: 4785 li a5,1 + 3005a48: a039 j 3005a56 + } + *coreClkSelect = crg.coreClkSelect; + 3005a4a: fe042703 lw a4,-32(s0) + 3005a4e: fbc42783 lw a5,-68(s0) + 3005a52: c398 sw a4,0(a5) + return BASE_STATUS_OK; + 3005a54: 4781 li a5,0 +} + 3005a56: 853e mv a0,a5 + 3005a58: 40b6 lw ra,76(sp) + 3005a5a: 4426 lw s0,72(sp) + 3005a5c: 6161 addi sp,sp,80 + 3005a5e: 8082 ret + +03005a60 : + +static void ADC0_Init(void) +{ + 3005a60: 7179 addi sp,sp,-48 + 3005a62: d606 sw ra,44(sp) + 3005a64: d422 sw s0,40(sp) + 3005a66: 1800 addi s0,sp,48 + HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); + 3005a68: 4585 li a1,1 + 3005a6a: 18000537 lui a0,0x18000 + 3005a6e: 2c81 jal ra,3005cbe + HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); + 3005a70: 4589 li a1,2 + 3005a72: 18000537 lui a0,0x18000 + 3005a76: 95dfd0ef jal ra,30033d2 + HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_1); + 3005a7a: 4581 li a1,0 + 3005a7c: 18000537 lui a0,0x18000 + 3005a80: a09fd0ef jal ra,3003488 + + g_adc0.baseAddress = ADC0; + 3005a84: 040007b7 lui a5,0x4000 + 3005a88: 54478793 addi a5,a5,1348 # 4000544 + 3005a8c: 18000737 lui a4,0x18000 + 3005a90: c398 sw a4,0(a5) + g_adc0.socPriority = ADC_PRIMODE_ALL_ROUND; + 3005a92: 040007b7 lui a5,0x4000 + 3005a96: 54478793 addi a5,a5,1348 # 4000544 + 3005a9a: 0007a223 sw zero,4(a5) + + HAL_ADC_Init(&g_adc0); + 3005a9e: 040007b7 lui a5,0x4000 + 3005aa2: 54478513 addi a0,a5,1348 # 4000544 + 3005aa6: f75fb0ef jal ra,3001a1a + + SOC_Param socParam = {0}; + 3005aaa: fc042e23 sw zero,-36(s0) + 3005aae: fe042023 sw zero,-32(s0) + 3005ab2: fe042223 sw zero,-28(s0) + 3005ab6: fe042423 sw zero,-24(s0) + 3005aba: fe042623 sw zero,-20(s0) + socParam.adcInput = ADC_CH_ADCINA6; /* PIN4(ADC AIN6) */ + 3005abe: 4799 li a5,6 + 3005ac0: fcf42e23 sw a5,-36(s0) + socParam.sampleTotalTime = ADC_SOCSAMPLE_10CLK; /* adc sample total time 10 adc_clk */ + 3005ac4: 4789 li a5,2 + 3005ac6: fef42023 sw a5,-32(s0) + socParam.trigSource = ADC_TRIGSOC_SOFT; + 3005aca: fe042223 sw zero,-28(s0) + socParam.continueMode = BASE_CFG_ENABLE; + 3005ace: 4785 li a5,1 + 3005ad0: fef40423 sb a5,-24(s0) + socParam.finishMode = ADC_SOCFINISH_INT2; + 3005ad4: 4795 li a5,5 + 3005ad6: fef42623 sw a5,-20(s0) + HAL_ADC_ConfigureSoc(&g_adc0, ADC_SOC_NUM1, &socParam); + 3005ada: fdc40793 addi a5,s0,-36 + 3005ade: 863e mv a2,a5 + 3005ae0: 4585 li a1,1 + 3005ae2: 040007b7 lui a5,0x4000 + 3005ae6: 54478513 addi a0,a5,1348 # 4000544 + 3005aea: fe3fb0ef jal ra,3001acc +} + 3005aee: 0001 nop + 3005af0: 50b2 lw ra,44(sp) + 3005af2: 5422 lw s0,40(sp) + 3005af4: 6145 addi sp,sp,48 + 3005af6: 8082 ret + +03005af8 : + /* USER CODE BEGIN TIMER3_InterruptProcess */ + /* USER CODE END TIMER3_InterruptProcess */ +} + +static void TIMER3_Init(void) +{ + 3005af8: 1101 addi sp,sp,-32 + 3005afa: ce06 sw ra,28(sp) + 3005afc: cc22 sw s0,24(sp) + 3005afe: 1000 addi s0,sp,32 + HAL_CRG_IpEnableSet(TIMER3_BASE, IP_CLK_ENABLE); /* TIMER3 clock enable. */ + 3005b00: 4585 li a1,1 + 3005b02: 14303537 lui a0,0x14303 + 3005b06: 2a65 jal ra,3005cbe + unsigned int load = (HAL_CRG_GetIpFreq((void *)TIMER3) / (1u << (TIMERPRESCALER_NO_DIV * 4)) / 1000000u) * 10; + 3005b08: 14303537 lui a0,0x14303 + 3005b0c: f0afd0ef jal ra,3003216 + 3005b10: 872a mv a4,a0 + 3005b12: 000f47b7 lui a5,0xf4 + 3005b16: 24078793 addi a5,a5,576 # f4240 + 3005b1a: 02f75733 divu a4,a4,a5 + 3005b1e: 47a9 li a5,10 + 3005b20: 02f707b3 mul a5,a4,a5 + 3005b24: fef42623 sw a5,-20(s0) + + g_timer3.baseAddress = TIMER3; + 3005b28: 040007b7 lui a5,0x4000 + 3005b2c: 49c78793 addi a5,a5,1180 # 400049c + 3005b30: 14303737 lui a4,0x14303 + 3005b34: c398 sw a4,0(a5) + g_timer3.load = load - 1; /* Set timer value immediately */ + 3005b36: fec42783 lw a5,-20(s0) + 3005b3a: fff78713 addi a4,a5,-1 + 3005b3e: 040007b7 lui a5,0x4000 + 3005b42: 49c78793 addi a5,a5,1180 # 400049c + 3005b46: cbd8 sw a4,20(a5) + g_timer3.bgLoad = load - 1; /* Set timer value */ + 3005b48: fec42783 lw a5,-20(s0) + 3005b4c: fff78713 addi a4,a5,-1 + 3005b50: 040007b7 lui a5,0x4000 + 3005b54: 49c78793 addi a5,a5,1180 # 400049c + 3005b58: cf98 sw a4,24(a5) + g_timer3.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ + 3005b5a: 040007b7 lui a5,0x4000 + 3005b5e: 49c78793 addi a5,a5,1180 # 400049c + 3005b62: 4705 li a4,1 + 3005b64: c798 sw a4,8(a5) + g_timer3.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ + 3005b66: 040007b7 lui a5,0x4000 + 3005b6a: 49c78793 addi a5,a5,1180 # 400049c + 3005b6e: 0007a623 sw zero,12(a5) + g_timer3.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ + 3005b72: 040007b7 lui a5,0x4000 + 3005b76: 49c78793 addi a5,a5,1180 # 400049c + 3005b7a: 4705 li a4,1 + 3005b7c: cb98 sw a4,16(a5) + g_timer3.interruptEn = BASE_CFG_ENABLE; + 3005b7e: 040007b7 lui a5,0x4000 + 3005b82: 49c78793 addi a5,a5,1180 # 400049c + 3005b86: 4705 li a4,1 + 3005b88: afd8 sb a4,28(a5) + g_timer3.adcSocReqEnable = BASE_CFG_DISABLE; + 3005b8a: 040007b7 lui a5,0x4000 + 3005b8e: 49c78793 addi a5,a5,1180 # 400049c + 3005b92: 00078ea3 sb zero,29(a5) + g_timer3.dmaReqEnable = BASE_CFG_DISABLE; + 3005b96: 040007b7 lui a5,0x4000 + 3005b9a: 49c78793 addi a5,a5,1180 # 400049c + 3005b9e: 00078f23 sb zero,30(a5) + HAL_TIMER_Init(&g_timer3); + 3005ba2: 040007b7 lui a5,0x4000 + 3005ba6: 49c78513 addi a0,a5,1180 # 400049c + 3005baa: c7cff0ef jal ra,3005026 + IRQ_Register(IRQ_TIMER3, HAL_TIMER_IrqHandler, &g_timer3); + 3005bae: 040007b7 lui a5,0x4000 + 3005bb2: 49c78613 addi a2,a5,1180 # 400049c + 3005bb6: 030057b7 lui a5,0x3005 + 3005bba: 2fe78593 addi a1,a5,766 # 30052fe + 3005bbe: 02300513 li a0,35 + 3005bc2: cf0fc0ef jal ra,30020b2 + + HAL_TIMER_RegisterCallback(&g_timer3, TIMER_PERIOD_FIN, TIMER3_InterruptProcess); + 3005bc6: 030067b7 lui a5,0x3006 + 3005bca: dd678613 addi a2,a5,-554 # 3005dd6 + 3005bce: 4581 li a1,0 + 3005bd0: 040007b7 lui a5,0x4000 + 3005bd4: 49c78513 addi a0,a5,1180 # 400049c + 3005bd8: 3039 jal ra,30053e6 + IRQ_SetPriority(IRQ_TIMER3, 1); /* 1 is priority value */ + 3005bda: 4585 li a1,1 + 3005bdc: 02300513 li a0,35 + 3005be0: ca7fc0ef jal ra,3002886 + IRQ_EnableN(IRQ_TIMER3); + 3005be4: 02300513 li a0,35 + 3005be8: d50fc0ef jal ra,3002138 +} + 3005bec: 0001 nop + 3005bee: 40f2 lw ra,28(sp) + 3005bf0: 4462 lw s0,24(sp) + 3005bf2: 6105 addi sp,sp,32 + 3005bf4: 8082 ret + +03005bf6 : + +static void UART0_Init(void) +{ + 3005bf6: 1141 addi sp,sp,-16 + 3005bf8: c606 sw ra,12(sp) + 3005bfa: c422 sw s0,8(sp) + 3005bfc: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + 3005bfe: 4585 li a1,1 + 3005c00: 14000537 lui a0,0x14000 + 3005c04: 286d jal ra,3005cbe + g_uart0.baseAddress = UART0; + 3005c06: 040007b7 lui a5,0x4000 + 3005c0a: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c0e: 14000737 lui a4,0x14000 + 3005c12: c398 sw a4,0(a5) + + g_uart0.baudRate = UART0_BAND_RATE; + 3005c14: 040007b7 lui a5,0x4000 + 3005c18: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c1c: 6771 lui a4,0x1c + 3005c1e: 20070713 addi a4,a4,512 # 1c200 + 3005c22: c3d8 sw a4,4(a5) + g_uart0.dataLength = UART_DATALENGTH_8BIT; + 3005c24: 040007b7 lui a5,0x4000 + 3005c28: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c2c: 470d li a4,3 + 3005c2e: c798 sw a4,8(a5) + g_uart0.stopBits = UART_STOPBITS_ONE; + 3005c30: 040007b7 lui a5,0x4000 + 3005c34: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c38: 0007a623 sw zero,12(a5) + g_uart0.parity = UART_PARITY_NONE; + 3005c3c: 040007b7 lui a5,0x4000 + 3005c40: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c44: 4711 li a4,4 + 3005c46: cb98 sw a4,16(a5) + g_uart0.txMode = UART_MODE_BLOCKING; + 3005c48: 040007b7 lui a5,0x4000 + 3005c4c: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c50: 0007aa23 sw zero,20(a5) + g_uart0.rxMode = UART_MODE_BLOCKING; + 3005c54: 040007b7 lui a5,0x4000 + 3005c58: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c5c: 0007ac23 sw zero,24(a5) + g_uart0.fifoMode = BASE_CFG_ENABLE; + 3005c60: 040007b7 lui a5,0x4000 + 3005c64: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c68: 4705 li a4,1 + 3005c6a: 02e78623 sb a4,44(a5) + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + 3005c6e: 040007b7 lui a5,0x4000 + 3005c72: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c76: 4721 li a4,8 + 3005c78: db98 sw a4,48(a5) + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + 3005c7a: 040007b7 lui a5,0x4000 + 3005c7e: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c82: 4721 li a4,8 + 3005c84: dbd8 sw a4,52(a5) + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + 3005c86: 040007b7 lui a5,0x4000 + 3005c8a: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c8e: 0207ac23 sw zero,56(a5) + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + 3005c92: 040007b7 lui a5,0x4000 + 3005c96: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c9a: 0607ac23 sw zero,120(a5) + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + 3005c9e: 040007b7 lui a5,0x4000 + 3005ca2: 4c478793 addi a5,a5,1220 # 40004c4 + 3005ca6: 06078e23 sb zero,124(a5) + HAL_UART_Init(&g_uart0); + 3005caa: 040007b7 lui a5,0x4000 + 3005cae: 4c478513 addi a0,a5,1220 # 40004c4 + 3005cb2: 3aad jal ra,300562c +} + 3005cb4: 0001 nop + 3005cb6: 40b2 lw ra,12(sp) + 3005cb8: 4422 lw s0,8(sp) + 3005cba: 0141 addi sp,sp,16 + 3005cbc: 8082 ret + +03005cbe : + 3005cbe: e3cfd06f j 30032fa + +03005cc2 : + +static void IOConfig(void) +{ + 3005cc2: 1141 addi sp,sp,-16 + 3005cc4: c606 sw ra,12(sp) + 3005cc6: c422 sw s0,8(sp) + 3005cc8: 0800 addi s0,sp,16 + /* Config PIN4 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_ADC_AIN6); /* Check function selection */ + 3005cca: 010c07b7 lui a5,0x10c0 + 3005cce: 23c78513 addi a0,a5,572 # 10c023c + 3005cd2: 20c1 jal ra,3005d92 + HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_ADC_AIN6, PULL_NONE); /* Pull-up and Pull-down */ + 3005cd4: 4581 li a1,0 + 3005cd6: 010c07b7 lui a5,0x10c0 + 3005cda: 23c78513 addi a0,a5,572 # 10c023c + 3005cde: 2845 jal ra,3005d8e + HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_ADC_AIN6, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3005ce0: 4581 li a1,0 + 3005ce2: 010c07b7 lui a5,0x10c0 + 3005ce6: 23c78513 addi a0,a5,572 # 10c023c + 3005cea: 2045 jal ra,3005d8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_ADC_AIN6, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3005cec: 4585 li a1,1 + 3005cee: 010c07b7 lui a5,0x10c0 + 3005cf2: 23c78513 addi a0,a5,572 # 10c023c + 3005cf6: 2841 jal ra,3005d86 + HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_ADC_AIN6, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3005cf8: 4589 li a1,2 + 3005cfa: 010c07b7 lui a5,0x10c0 + 3005cfe: 23c78513 addi a0,a5,572 # 10c023c + 3005d02: 2041 jal ra,3005d82 + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + 3005d04: 019007b7 lui a5,0x1900 + 3005d08: 23378513 addi a0,a5,563 # 1900233 + 3005d0c: 2059 jal ra,3005d92 + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + 3005d0e: 4581 li a1,0 + 3005d10: 019007b7 lui a5,0x1900 + 3005d14: 23378513 addi a0,a5,563 # 1900233 + 3005d18: 289d jal ra,3005d8e + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3005d1a: 4581 li a1,0 + 3005d1c: 019007b7 lui a5,0x1900 + 3005d20: 23378513 addi a0,a5,563 # 1900233 + 3005d24: 209d jal ra,3005d8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3005d26: 4585 li a1,1 + 3005d28: 019007b7 lui a5,0x1900 + 3005d2c: 23378513 addi a0,a5,563 # 1900233 + 3005d30: 2899 jal ra,3005d86 + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3005d32: 4589 li a1,2 + 3005d34: 019007b7 lui a5,0x1900 + 3005d38: 23378513 addi a0,a5,563 # 1900233 + 3005d3c: 2099 jal ra,3005d82 + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + 3005d3e: 019407b7 lui a5,0x1940 + 3005d42: 23378513 addi a0,a5,563 # 1940233 + 3005d46: 20b1 jal ra,3005d92 + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + 3005d48: 4589 li a1,2 + 3005d4a: 019407b7 lui a5,0x1940 + 3005d4e: 23378513 addi a0,a5,563 # 1940233 + 3005d52: 2835 jal ra,3005d8e + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3005d54: 4581 li a1,0 + 3005d56: 019407b7 lui a5,0x1940 + 3005d5a: 23378513 addi a0,a5,563 # 1940233 + 3005d5e: 2035 jal ra,3005d8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3005d60: 4585 li a1,1 + 3005d62: 019407b7 lui a5,0x1940 + 3005d66: 23378513 addi a0,a5,563 # 1940233 + 3005d6a: 2831 jal ra,3005d86 + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3005d6c: 4589 li a1,2 + 3005d6e: 019407b7 lui a5,0x1940 + 3005d72: 23378513 addi a0,a5,563 # 1940233 + 3005d76: 2031 jal ra,3005d82 +} + 3005d78: 0001 nop + 3005d7a: 40b2 lw ra,12(sp) + 3005d7c: 4422 lw s0,8(sp) + 3005d7e: 0141 addi sp,sp,16 + 3005d80: 8082 ret + +03005d82 : + 3005d82: 978ff06f j 3004efa + +03005d86 : + 3005d86: 928ff06f j 3004eae + +03005d8a : + 3005d8a: 8d8ff06f j 3004e62 + +03005d8e : + 3005d8e: 888ff06f j 3004e16 + +03005d92 : + 3005d92: 84aff06f j 3004ddc + +03005d96 : + +void SystemInit(void) +{ + 3005d96: 1141 addi sp,sp,-16 + 3005d98: c606 sw ra,12(sp) + 3005d9a: c422 sw s0,8(sp) + 3005d9c: 0800 addi s0,sp,16 + IOConfig(); + 3005d9e: 3715 jal ra,3005cc2 + UART0_Init(); + 3005da0: 3d99 jal ra,3005bf6 + ADC0_Init(); + 3005da2: 397d jal ra,3005a60 + TIMER3_Init(); + 3005da4: 3b91 jal ra,3005af8 + + /* USER CODE BEGIN system_init */ + HAL_TIMER_Start(&g_timer3); + 3005da6: 040007b7 lui a5,0x4000 + 3005daa: 49c78513 addi a0,a5,1180 # 400049c + 3005dae: cceff0ef jal ra,300527c + HAL_ADC_StartIt(&g_adc0); + 3005db2: 040007b7 lui a5,0x4000 + 3005db6: 54478513 addi a0,a5,1348 # 4000544 + 3005dba: ec5fb0ef jal ra,3001c7e + HAL_ADC_SoftTrigSample(&g_adc0, ADC_SOC_NUM1); + 3005dbe: 4585 li a1,1 + 3005dc0: 040007b7 lui a5,0x4000 + 3005dc4: 54478513 addi a0,a5,1348 # 4000544 + 3005dc8: fe3fb0ef jal ra,3001daa + /* USER CODE END system_init */ + 3005dcc: 0001 nop + 3005dce: 40b2 lw ra,12(sp) + 3005dd0: 4422 lw s0,8(sp) + 3005dd2: 0141 addi sp,sp,16 + 3005dd4: 8082 ret + +03005dd6 : +float adc_num[adc_shownum]={0}; +unsigned int i=0; + + +void TIMER3_InterruptProcess(void *handle) +{ + 3005dd6: 7179 addi sp,sp,-48 + 3005dd8: d606 sw ra,44(sp) + 3005dda: d422 sw s0,40(sp) + 3005ddc: 1800 addi s0,sp,48 + 3005dde: fca42e23 sw a0,-36(s0) + unsigned int ret = HAL_ADC_GetConvResult(&g_adc0, ADC_SOC_NUM1); + 3005de2: 4585 li a1,1 + 3005de4: 040007b7 lui a5,0x4000 + 3005de8: 54478513 addi a0,a5,1348 # 4000544 + 3005dec: 840fc0ef jal ra,3001e2c + 3005df0: fea42623 sw a0,-20(s0) + + + adc_num[i] = (float)ret / (float)4096 * 3.3; + 3005df4: fec42783 lw a5,-20(s0) + 3005df8: d017f753 fcvt.s.wu fa4,a5 + 3005dfc: 030067b7 lui a5,0x3006 + 3005e00: 6887a787 flw fa5,1672(a5) # 3006688 + 3005e04: 18f77753 fdiv.s fa4,fa4,fa5 + 3005e08: 040027b7 lui a5,0x4002 + 3005e0c: 2047a783 lw a5,516(a5) # 4002204 + 3005e10: 03006737 lui a4,0x3006 + 3005e14: 68c72787 flw fa5,1676(a4) # 300668c + 3005e18: 10f777d3 fmul.s fa5,fa4,fa5 + 3005e1c: 04000737 lui a4,0x4000 + 3005e20: 5e470713 addi a4,a4,1508 # 40005e4 + 3005e24: 078a slli a5,a5,0x2 + 3005e26: 97ba add a5,a5,a4 + 3005e28: e39c fsw fa5,0(a5) + i++; + 3005e2a: 040027b7 lui a5,0x4002 + 3005e2e: 2047a783 lw a5,516(a5) # 4002204 + 3005e32: 00178713 addi a4,a5,1 + 3005e36: 040027b7 lui a5,0x4002 + 3005e3a: 20e7a223 sw a4,516(a5) # 4002204 + if(i>adc_shownum){ + 3005e3e: 040027b7 lui a5,0x4002 + 3005e42: 2047a703 lw a4,516(a5) # 4002204 + 3005e46: 70800793 li a5,1800 + 3005e4a: 06e7f563 bgeu a5,a4,3005eb4 + for(i=0;i + 3005e56: a099 j 3005e9c + { + DBG_PRINTF("V:%.2f\r\n", adc_num[i]); + 3005e58: 040027b7 lui a5,0x4002 + 3005e5c: 2047a783 lw a5,516(a5) # 4002204 + 3005e60: 04000737 lui a4,0x4000 + 3005e64: 5e470713 addi a4,a4,1508 # 40005e4 + 3005e68: 078a slli a5,a5,0x2 + 3005e6a: 97ba add a5,a5,a4 + 3005e6c: 639c flw fa5,0(a5) + 3005e6e: 20f78553 fmv.s fa0,fa5 + 3005e72: 20b1 jal ra,3005ebe <__extendsfdf2> + 3005e74: 87aa mv a5,a0 + 3005e76: 882e mv a6,a1 + 3005e78: 863e mv a2,a5 + 3005e7a: 86c2 mv a3,a6 + 3005e7c: 030067b7 lui a5,0x3006 + 3005e80: 67c78513 addi a0,a5,1660 # 300667c + 3005e84: b85fe0ef jal ra,3004a08 + for(i=0;i + 3005e90: 00178713 addi a4,a5,1 + 3005e94: 040027b7 lui a5,0x4002 + 3005e98: 20e7a223 sw a4,516(a5) # 4002204 + 3005e9c: 040027b7 lui a5,0x4002 + 3005ea0: 2047a703 lw a4,516(a5) # 4002204 + 3005ea4: 70700793 li a5,1799 + 3005ea8: fae7f8e3 bgeu a5,a4,3005e58 + } + i=0; + 3005eac: 040027b7 lui a5,0x4002 + 3005eb0: 2007a223 sw zero,516(a5) # 4002204 + } + +} + 3005eb4: 0001 nop + 3005eb6: 50b2 lw ra,44(sp) + 3005eb8: 5422 lw s0,40(sp) + 3005eba: 6145 addi sp,sp,48 + 3005ebc: 8082 ret + +03005ebe <__extendsfdf2>: + 3005ebe: 1141 addi sp,sp,-16 + 3005ec0: c606 sw ra,12(sp) + 3005ec2: c422 sw s0,8(sp) + 3005ec4: c226 sw s1,4(sp) + 3005ec6: e00506d3 fmv.x.w a3,fa0 + 3005eca: 002027f3 frrm a5 + 3005ece: 0176d513 srli a0,a3,0x17 + 3005ed2: 0ff57513 andi a0,a0,255 + 3005ed6: 00800437 lui s0,0x800 + 3005eda: 00150793 addi a5,a0,1 # 14000001 + 3005ede: 147d addi s0,s0,-1 # 7fffff + 3005ee0: 0ff7f793 andi a5,a5,255 + 3005ee4: 4705 li a4,1 + 3005ee6: 8c75 and s0,s0,a3 + 3005ee8: 01f6d493 srli s1,a3,0x1f + 3005eec: 00f75963 bge a4,a5,3005efe <__extendsfdf2+0x40> + 3005ef0: 00345793 srli a5,s0,0x3 + 3005ef4: 38050513 addi a0,a0,896 + 3005ef8: 0476 slli s0,s0,0x1d + 3005efa: 4701 li a4,0 + 3005efc: a891 j 3005f50 <__extendsfdf2+0x92> + 3005efe: e915 bnez a0,3005f32 <__extendsfdf2+0x74> + 3005f00: c459 beqz s0,3005f8e <__extendsfdf2+0xd0> + 3005f02: 8522 mv a0,s0 + 3005f04: 2c6d jal ra,30061be <__clzsi2> + 3005f06: 47a9 li a5,10 + 3005f08: 00a7cf63 blt a5,a0,3005f26 <__extendsfdf2+0x68> + 3005f0c: 47ad li a5,11 + 3005f0e: 8f89 sub a5,a5,a0 + 3005f10: 01550713 addi a4,a0,21 + 3005f14: 00f457b3 srl a5,s0,a5 + 3005f18: 00e41433 sll s0,s0,a4 + 3005f1c: 38900713 li a4,905 + 3005f20: 40a70533 sub a0,a4,a0 + 3005f24: bfd9 j 3005efa <__extendsfdf2+0x3c> + 3005f26: ff550793 addi a5,a0,-11 + 3005f2a: 00f417b3 sll a5,s0,a5 + 3005f2e: 4401 li s0,0 + 3005f30: b7f5 j 3005f1c <__extendsfdf2+0x5e> + 3005f32: c02d beqz s0,3005f94 <__extendsfdf2+0xd6> + 3005f34: 00400737 lui a4,0x400 + 3005f38: 8f61 and a4,a4,s0 + 3005f3a: 00345793 srli a5,s0,0x3 + 3005f3e: 00173713 seqz a4,a4 + 3005f42: 000806b7 lui a3,0x80 + 3005f46: 0712 slli a4,a4,0x4 + 3005f48: 0476 slli s0,s0,0x1d + 3005f4a: 8fd5 or a5,a5,a3 + 3005f4c: 7ff00513 li a0,2047 + 3005f50: 00100637 lui a2,0x100 + 3005f54: 167d addi a2,a2,-1 # fffff + 3005f56: 8ff1 and a5,a5,a2 + 3005f58: 80100637 lui a2,0x80100 + 3005f5c: 167d addi a2,a2,-1 # 800fffff + 3005f5e: 7ff57513 andi a0,a0,2047 + 3005f62: 0552 slli a0,a0,0x14 + 3005f64: 8ff1 and a5,a5,a2 + 3005f66: 80000637 lui a2,0x80000 + 3005f6a: 8fc9 or a5,a5,a0 + 3005f6c: fff64613 not a2,a2 + 3005f70: 01f49693 slli a3,s1,0x1f + 3005f74: 8ff1 and a5,a5,a2 + 3005f76: 00d7e633 or a2,a5,a3 + 3005f7a: 8522 mv a0,s0 + 3005f7c: 85b2 mv a1,a2 + 3005f7e: c319 beqz a4,3005f84 <__extendsfdf2+0xc6> + 3005f80: 00172073 csrs fflags,a4 + 3005f84: 40b2 lw ra,12(sp) + 3005f86: 4422 lw s0,8(sp) + 3005f88: 4492 lw s1,4(sp) + 3005f8a: 0141 addi sp,sp,16 + 3005f8c: 8082 ret + 3005f8e: 4781 li a5,0 + 3005f90: 4501 li a0,0 + 3005f92: b7a5 j 3005efa <__extendsfdf2+0x3c> + 3005f94: 4781 li a5,0 + 3005f96: 7ff00513 li a0,2047 + 3005f9a: b785 j 3005efa <__extendsfdf2+0x3c> + +03005f9c <__truncdfsf2>: + 3005f9c: 00202873 frrm a6 + 3005fa0: 001006b7 lui a3,0x100 + 3005fa4: 16fd addi a3,a3,-1 # fffff + 3005fa6: 8eed and a3,a3,a1 + 3005fa8: 0145d893 srli a7,a1,0x14 + 3005fac: 00369793 slli a5,a3,0x3 + 3005fb0: 7ff8f893 andi a7,a7,2047 + 3005fb4: 01d55693 srli a3,a0,0x1d + 3005fb8: 8edd or a3,a3,a5 + 3005fba: 00188793 addi a5,a7,1 + 3005fbe: 7ff7f793 andi a5,a5,2047 + 3005fc2: 4705 li a4,1 + 3005fc4: 81fd srli a1,a1,0x1f + 3005fc6: 00351613 slli a2,a0,0x3 + 3005fca: 16f75b63 bge a4,a5,3006140 <__truncdfsf2+0x1a4> + 3005fce: c8088713 addi a4,a7,-896 + 3005fd2: 0fe00793 li a5,254 + 3005fd6: 0ae7d063 bge a5,a4,3006076 <__truncdfsf2+0xda> + 3005fda: 04080063 beqz a6,300601a <__truncdfsf2+0x7e> + 3005fde: 478d li a5,3 + 3005fe0: 02f81963 bne a6,a5,3006012 <__truncdfsf2+0x76> + 3005fe4: c99d beqz a1,300601a <__truncdfsf2+0x7e> + 3005fe6: 57fd li a5,-1 + 3005fe8: 0fe00713 li a4,254 + 3005fec: 4681 li a3,0 + 3005fee: 4615 li a2,5 + 3005ff0: 4509 li a0,2 + 3005ff2: 00166613 ori a2,a2,1 + 3005ff6: 1aa80063 beq a6,a0,3006196 <__truncdfsf2+0x1fa> + 3005ffa: 450d li a0,3 + 3005ffc: 18a80a63 beq a6,a0,3006190 <__truncdfsf2+0x1f4> + 3006000: 12081763 bnez a6,300612e <__truncdfsf2+0x192> + 3006004: 00f7f513 andi a0,a5,15 + 3006008: 4891 li a7,4 + 300600a: 13150263 beq a0,a7,300612e <__truncdfsf2+0x192> + 300600e: 0791 addi a5,a5,4 + 3006010: aa39 j 300612e <__truncdfsf2+0x192> + 3006012: 4789 li a5,2 + 3006014: fcf819e3 bne a6,a5,3005fe6 <__truncdfsf2+0x4a> + 3006018: d5f9 beqz a1,3005fe6 <__truncdfsf2+0x4a> + 300601a: 4781 li a5,0 + 300601c: 0ff00713 li a4,255 + 3006020: 4615 li a2,5 + 3006022: 00579693 slli a3,a5,0x5 + 3006026: 0006db63 bgez a3,300603c <__truncdfsf2+0xa0> + 300602a: 0705 addi a4,a4,1 # 400001 + 300602c: 0ff00693 li a3,255 + 3006030: 16d70563 beq a4,a3,300619a <__truncdfsf2+0x1fe> + 3006034: fc0006b7 lui a3,0xfc000 + 3006038: 16fd addi a3,a3,-1 # fbffffff + 300603a: 8ff5 and a5,a5,a3 + 300603c: 0ff00693 li a3,255 + 3006040: 838d srli a5,a5,0x3 + 3006042: 00d71663 bne a4,a3,300604e <__truncdfsf2+0xb2> + 3006046: c781 beqz a5,300604e <__truncdfsf2+0xb2> + 3006048: 004007b7 lui a5,0x400 + 300604c: 4581 li a1,0 + 300604e: 008006b7 lui a3,0x800 + 3006052: 16fd addi a3,a3,-1 # 7fffff + 3006054: 8ff5 and a5,a5,a3 + 3006056: 808006b7 lui a3,0x80800 + 300605a: 0ff77713 andi a4,a4,255 + 300605e: 16fd addi a3,a3,-1 # 807fffff + 3006060: 075e slli a4,a4,0x17 + 3006062: 8ff5 and a5,a5,a3 + 3006064: 05fe slli a1,a1,0x1f + 3006066: 8fd9 or a5,a5,a4 + 3006068: 8fcd or a5,a5,a1 + 300606a: c219 beqz a2,3006070 <__truncdfsf2+0xd4> + 300606c: 00162073 csrs fflags,a2 + 3006070: f0078553 fmv.w.x fa0,a5 + 3006074: 8082 ret + 3006076: 08e04e63 bgtz a4,3006112 <__truncdfsf2+0x176> + 300607a: 57a5 li a5,-23 + 300607c: 0ef74d63 blt a4,a5,3006176 <__truncdfsf2+0x1da> + 3006080: 008007b7 lui a5,0x800 + 3006084: 4379 li t1,30 + 3006086: 8edd or a3,a3,a5 + 3006088: 40e30333 sub t1,t1,a4 + 300608c: 47fd li a5,31 + 300608e: 0467ce63 blt a5,t1,30060ea <__truncdfsf2+0x14e> + 3006092: c8288893 addi a7,a7,-894 + 3006096: 011617b3 sll a5,a2,a7 + 300609a: 00f037b3 snez a5,a5 + 300609e: 011696b3 sll a3,a3,a7 + 30060a2: 00665333 srl t1,a2,t1 + 30060a6: 8edd or a3,a3,a5 + 30060a8: 00d367b3 or a5,t1,a3 + 30060ac: 4701 li a4,0 + 30060ae: cff9 beqz a5,300618c <__truncdfsf2+0x1f0> + 30060b0: 00179713 slli a4,a5,0x1 + 30060b4: 00777693 andi a3,a4,7 + 30060b8: 4601 li a2,0 + 30060ba: c28d beqz a3,30060dc <__truncdfsf2+0x140> + 30060bc: 4689 li a3,2 + 30060be: 0cd80263 beq a6,a3,3006182 <__truncdfsf2+0x1e6> + 30060c2: 468d li a3,3 + 30060c4: 0ad80b63 beq a6,a3,300617a <__truncdfsf2+0x1de> + 30060c8: 4605 li a2,1 + 30060ca: 00081963 bnez a6,30060dc <__truncdfsf2+0x140> + 30060ce: 00f77693 andi a3,a4,15 + 30060d2: 4511 li a0,4 + 30060d4: 4605 li a2,1 + 30060d6: 00a68363 beq a3,a0,30060dc <__truncdfsf2+0x140> + 30060da: 0711 addi a4,a4,4 + 30060dc: 01b75693 srli a3,a4,0x1b + 30060e0: 0016c693 xori a3,a3,1 + 30060e4: 8a85 andi a3,a3,1 + 30060e6: 4701 li a4,0 + 30060e8: a83d j 3006126 <__truncdfsf2+0x18a> + 30060ea: 57f9 li a5,-2 + 30060ec: 40e78733 sub a4,a5,a4 + 30060f0: 02000793 li a5,32 + 30060f4: 00e6d733 srl a4,a3,a4 + 30060f8: 4501 li a0,0 + 30060fa: 00f30663 beq t1,a5,3006106 <__truncdfsf2+0x16a> + 30060fe: ca288893 addi a7,a7,-862 + 3006102: 01169533 sll a0,a3,a7 + 3006106: 00c567b3 or a5,a0,a2 + 300610a: 00f037b3 snez a5,a5 + 300610e: 8fd9 or a5,a5,a4 + 3006110: bf71 j 30060ac <__truncdfsf2+0x110> + 3006112: 051a slli a0,a0,0x6 + 3006114: 00a037b3 snez a5,a0 + 3006118: 068e slli a3,a3,0x3 + 300611a: 8275 srli a2,a2,0x1d + 300611c: 8edd or a3,a3,a5 + 300611e: 00c6e7b3 or a5,a3,a2 + 3006122: 4681 li a3,0 + 3006124: 4601 li a2,0 + 3006126: 0077f513 andi a0,a5,7 + 300612a: ec0513e3 bnez a0,3005ff0 <__truncdfsf2+0x54> + 300612e: ee068ae3 beqz a3,3006022 <__truncdfsf2+0x86> + 3006132: 00167693 andi a3,a2,1 + 3006136: ee0686e3 beqz a3,3006022 <__truncdfsf2+0x86> + 300613a: 00266613 ori a2,a2,2 + 300613e: b5d5 j 3006022 <__truncdfsf2+0x86> + 3006140: 00c6e7b3 or a5,a3,a2 + 3006144: 00089563 bnez a7,300614e <__truncdfsf2+0x1b2> + 3006148: 00f037b3 snez a5,a5 + 300614c: b785 j 30060ac <__truncdfsf2+0x110> + 300614e: cf8d beqz a5,3006188 <__truncdfsf2+0x1ec> + 3006150: 7ff00793 li a5,2047 + 3006154: 4601 li a2,0 + 3006156: 00f89863 bne a7,a5,3006166 <__truncdfsf2+0x1ca> + 300615a: 00400637 lui a2,0x400 + 300615e: 8e75 and a2,a2,a3 + 3006160: 00163613 seqz a2,a2 + 3006164: 0612 slli a2,a2,0x4 + 3006166: 068e slli a3,a3,0x3 + 3006168: 020007b7 lui a5,0x2000 + 300616c: 8fd5 or a5,a5,a3 + 300616e: 0ff00713 li a4,255 + 3006172: 4681 li a3,0 + 3006174: bf4d j 3006126 <__truncdfsf2+0x18a> + 3006176: 4785 li a5,1 + 3006178: bf25 j 30060b0 <__truncdfsf2+0x114> + 300617a: 4605 li a2,1 + 300617c: f1a5 bnez a1,30060dc <__truncdfsf2+0x140> + 300617e: 0721 addi a4,a4,8 + 3006180: bfb1 j 30060dc <__truncdfsf2+0x140> + 3006182: 4605 li a2,1 + 3006184: dda1 beqz a1,30060dc <__truncdfsf2+0x140> + 3006186: bfe5 j 300617e <__truncdfsf2+0x1e2> + 3006188: 0ff00713 li a4,255 + 300618c: 4601 li a2,0 + 300618e: bd51 j 3006022 <__truncdfsf2+0x86> + 3006190: fdd9 bnez a1,300612e <__truncdfsf2+0x192> + 3006192: 07a1 addi a5,a5,8 # 2000008 + 3006194: bf69 j 300612e <__truncdfsf2+0x192> + 3006196: ddc1 beqz a1,300612e <__truncdfsf2+0x192> + 3006198: bfed j 3006192 <__truncdfsf2+0x1f6> + 300619a: 4781 li a5,0 + 300619c: 00080e63 beqz a6,30061b8 <__truncdfsf2+0x21c> + 30061a0: 468d li a3,3 + 30061a2: 00d81763 bne a6,a3,30061b0 <__truncdfsf2+0x214> + 30061a6: c989 beqz a1,30061b8 <__truncdfsf2+0x21c> + 30061a8: 57fd li a5,-1 + 30061aa: 0fe00713 li a4,254 + 30061ae: a029 j 30061b8 <__truncdfsf2+0x21c> + 30061b0: 4689 li a3,2 + 30061b2: fed81be3 bne a6,a3,30061a8 <__truncdfsf2+0x20c> + 30061b6: d9ed beqz a1,30061a8 <__truncdfsf2+0x20c> + 30061b8: 00566613 ori a2,a2,5 + 30061bc: b541 j 300603c <__truncdfsf2+0xa0> + +030061be <__clzsi2>: + 30061be: 67c1 lui a5,0x10 + 30061c0: 02f57663 bgeu a0,a5,30061ec <__clzsi2+0x2e> + 30061c4: 0ff00793 li a5,255 + 30061c8: 00a7b7b3 sltu a5,a5,a0 + 30061cc: 078e slli a5,a5,0x3 + 30061ce: 02000713 li a4,32 + 30061d2: 8f1d sub a4,a4,a5 + 30061d4: 00f557b3 srl a5,a0,a5 + 30061d8: 00000517 auipc a0,0x0 + 30061dc: 5bc52503 lw a0,1468(a0) # 3006794 <_GLOBAL_OFFSET_TABLE_+0x4> + 30061e0: 97aa add a5,a5,a0 + 30061e2: 0007c503 lbu a0,0(a5) # 10000 + 30061e6: 40a70533 sub a0,a4,a0 + 30061ea: 8082 ret + 30061ec: 01000737 lui a4,0x1000 + 30061f0: 47c1 li a5,16 + 30061f2: fce56ee3 bltu a0,a4,30061ce <__clzsi2+0x10> + 30061f6: 47e1 li a5,24 + 30061f8: bfd9 j 30061ce <__clzsi2+0x10> + ... + +030061fc <__rodata_start>: + 30061fc: 9680 pop {ra,s0-s6},384 + 30061fe: 4b18 lw a4,16(a4) + +03006200 : + 3006200: 0000 1400 0000 0000 0140 0000 1000 1400 ........@....... + 3006210: 0000 0000 0144 0000 2000 1400 0000 0000 ....D.... ...... + 3006220: 0148 0000 3000 1400 0000 0000 014c 0000 H....0......L... + 3006230: 0000 1430 0000 0000 0240 0000 1000 1430 ..0.....@.....0. + 3006240: 0000 0000 0244 0000 2000 1430 0000 0000 ....D.... 0..... + 3006250: 0248 0000 3000 1430 0000 0000 024c 0000 H....00.....L... + 3006260: 0000 1438 0000 0000 0040 0000 0000 1420 ..8.....@..... . + 3006270: 0000 0000 0180 0000 1000 1420 0000 0000 .......... ..... + 3006280: 0184 0000 0000 1410 0000 0000 01c0 0000 ................ + 3006290: 1000 1410 0000 0000 01c4 0000 0000 1460 ..............`. + 30062a0: 0001 0000 02c0 0000 0000 1470 0000 0000 ..........p..... + 30062b0: 0440 0000 1000 1470 0000 0000 0444 0000 @.....p.....D... + 30062c0: 2000 1470 0000 0000 0448 0000 3000 1470 . p.....H....0p. + 30062d0: 0000 0000 044c 0000 0000 1440 0000 0000 ....L.....@..... + 30062e0: 0200 0000 0000 14b0 0000 0000 0280 0000 ................ + 30062f0: 1000 14b0 0000 0000 0284 0000 2000 14b0 ............. .. + 3006300: 0000 0000 0288 0000 0000 1c00 0000 0000 ................ + 3006310: 0300 0000 0000 1450 0000 0000 0480 0000 ......P......... + 3006320: 1000 1450 0000 0000 0484 0000 2000 1450 ..P.......... P. + 3006330: 0000 0000 0488 0000 3000 1450 0000 0000 .........0P..... + 3006340: 048c 0000 4000 1450 0000 0000 0490 0000 .....@P......... + 3006350: 5000 1450 0000 0000 0494 0000 1000 1440 .PP...........@. + 3006360: 0004 0000 03c0 0000 0000 14c0 0000 0000 ................ + 3006370: 04c0 0000 1000 14c0 0000 0000 04c4 0000 ................ + 3006380: 0000 147d 0000 0000 0b00 0000 0000 1480 ..}............. + 3006390: 0000 0000 0380 0000 0000 14a0 0000 0000 ................ + 30063a0: 0400 0000 1000 14a0 0000 0000 0404 0000 ................ + 30063b0: 2000 14a0 0000 0000 0408 0000 3000 14a0 . ...........0.. + 30063c0: 0000 0000 040c 0000 0000 1001 0000 0000 ................ + 30063d0: 0340 0000 0000 1810 0005 0000 0a60 0000 @...........`... + 30063e0: 0000 1830 0005 0000 0a70 0000 0000 1840 ..0.....p.....@. + 30063f0: 0005 0000 0a80 0000 0000 1820 0005 0000 .......... ..... + 3006400: 0a90 0000 1000 1820 0005 0000 0a90 0004 ...... ......... + 3006410: 0000 1800 0002 0000 0a00 0000 0000 1471 ..............q. + 3006420: 0003 0000 0500 0000 2e2e 642f 6972 6576 ........../drive + 3006430: 7372 612f 6364 692f 636e 612f 6364 695f rs/adc/inc/adc_i + 3006440: 2e70 0068 2e2e 642f 6972 6576 7372 612f p.h.../drivers/a + 3006450: 6364 732f 6372 612f 6364 632e 0000 0000 dc/src/adc.c.... + 3006460: 0000 3f80 0000 4480 5547 4055 0000 4580 ...?...DGUU@...E + 3006470: 6666 4026 51ec 4068 2e2e 642f 6972 6576 ff&@.Qh@../drive + 3006480: 7372 622f 7361 2f65 7273 2f63 6e69 6574 rs/base/src/inte + 3006490: 7272 7075 2e74 0063 2308 0300 235a 0300 rrupt.c..#..Z#.. + 30064a0: 23ac 0300 23fe 0300 2450 0300 24a2 0300 .#...#..P$...$.. + 30064b0: 24f4 0300 2546 0300 25dc 0300 262e 0300 .$..F%...%...&.. + 30064c0: 2680 0300 26d2 0300 2724 0300 2776 0300 .&...&..$'..v'.. + 30064d0: 27c8 0300 281a 0300 2e2e 642f 6972 6576 .'...(..../drive + 30064e0: 7372 632f 6772 692f 636e 632f 6772 695f rs/crg/inc/crg_i + 30064f0: 2e70 0068 2e2e 642f 6972 6576 7372 632f p.h.../drivers/c + 3006500: 6772 732f 6372 632f 6772 632e 0000 0000 rg/src/crg.c.... + 3006510: 0000 0000 0001 0000 0002 0000 0003 0000 ................ + 3006520: 0004 0000 0005 0000 0006 0000 0007 0000 ................ + 3006530: 329c 0300 32a6 0300 32be 0300 329c 0300 .2...2...2...2.. + 3006540: 32da 0300 329c 0300 47f8 0300 4862 0300 .2...2...G..bH.. + 3006550: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 3006560: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 3006570: 4862 0300 4738 0300 478e 0300 4862 0300 bH..8G...G..bH.. + 3006580: 4822 0300 4862 0300 4862 0300 4862 0300 "H..bH..bH..bH.. + 3006590: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 30065a0: 4862 0300 4862 0300 47f8 0300 4862 0300 bH..bH...G..bH.. + 30065b0: 4862 0300 4762 0300 4862 0300 47b8 0300 bH..bG..bH...G.. + 30065c0: 4862 0300 4862 0300 47f8 0300 2e2e 642f bH..bH...G..../d + 30065d0: 6972 6576 7372 692f 636f 676d 692f 636e rivers/iocmg/inc + 30065e0: 692f 636f 676d 695f 2e70 0068 2e2e 642f /iocmg_ip.h.../d + 30065f0: 6972 6576 7372 692f 636f 676d 732f 6372 rivers/iocmg/src + 3006600: 692f 636f 676d 632e 0000 0000 2e2e 642f /iocmg.c....../d + 3006610: 6972 6576 7372 742f 6d69 7265 692f 636e rivers/timer/inc + 3006620: 742f 6d69 7265 695f 2e70 0068 2e2e 642f /timer_ip.h.../d + 3006630: 6972 6576 7372 742f 6d69 7265 732f 6372 rivers/timer/src + 3006640: 742f 6d69 7265 632e 0000 0000 55be 0300 /timer.c.....U.. + 3006650: 55d4 0300 55ea 0300 5600 0300 5616 0300 .U...U...V...V.. + 3006660: 2e2e 642f 6972 6576 7372 752f 7261 2f74 ../drivers/uart/ + 3006670: 7273 2f63 6175 7472 632e 0000 3a56 2e25 src/uart.c..V:%. + 3006680: 6632 0a0d 0000 0000 0000 4580 3333 4053 2f.........E33S@ + +03006690 <__clz_tab>: + 3006690: 0100 0202 0303 0303 0404 0404 0404 0404 ................ + 30066a0: 0505 0505 0505 0505 0505 0505 0505 0505 ................ + 30066b0: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 30066c0: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 30066d0: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 30066e0: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 30066f0: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006700: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006710: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006720: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006730: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006740: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006750: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006760: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006770: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006780: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + +03006790 <_GLOBAL_OFFSET_TABLE_>: + 3006790: 0000 0000 6690 0300 ffff ffff 0000 0000 .....f.......... + +out/bin/target.elf: file format elf32-littleriscv + + +Disassembly of section .text.entry: + +03000004 <_start>: + + .section .text.entry + .global _start + .option norvc +_start: + j handle_reset + 3000004: 4fc0006f j 3000500 + +03000008 : +.endm + +/* The interrupt vector table must be aligned with 4 bytes */ +.align 2 +TrapHandler: + j TrapVector /* trap and INT 0 */ + 3000008: 4680006f j 3000470 + j TrapVector /* INT 1 */ + 300000c: 4640006f j 3000470 + j TrapVector /* INT 2 */ + 3000010: 4600006f j 3000470 + j TrapVector /* INT 3 */ + 3000014: 45c0006f j 3000470 + j TrapVector /* INT 4 */ + 3000018: 4580006f j 3000470 + j TrapVector /* INT 5 */ + 300001c: 4540006f j 3000470 + j TrapVector /* INT 6 */ + 3000020: 4500006f j 3000470 + j TrapVector /* INT 7 */ + 3000024: 44c0006f j 3000470 + j TrapVector /* INT 8 */ + 3000028: 4480006f j 3000470 + j TrapVector /* INT 9 */ + 300002c: 4440006f j 3000470 + j TrapVector /* INT 10 */ + 3000030: 4400006f j 3000470 + j TrapVector /* INT 11 */ + 3000034: 43c0006f j 3000470 + j TrapVector /* INT 12 */ + 3000038: 4380006f j 3000470 + j TrapVector /* INT 13 */ + 300003c: 4340006f j 3000470 + j TrapVector /* INT 14 */ + 3000040: 4300006f j 3000470 + j TrapVector /* INT 15 */ + 3000044: 42c0006f j 3000470 + j TrapVector /* INT 16 */ + 3000048: 4280006f j 3000470 + j TrapVector /* INT 17 */ + 300004c: 4240006f j 3000470 + j TrapVector /* INT 18 */ + 3000050: 4200006f j 3000470 + j TrapVector /* INT 19 */ + 3000054: 41c0006f j 3000470 + j TrapVector /* INT 20 */ + 3000058: 4180006f j 3000470 + j TrapVector /* INT 21 */ + 300005c: 4140006f j 3000470 + j TrapVector /* INT 22 */ + 3000060: 4100006f j 3000470 + j TrapVector /* INT 23 */ + 3000064: 40c0006f j 3000470 + j TrapVector /* INT 24 */ + 3000068: 4080006f j 3000470 + j TrapVector /* INT 25 */ + 300006c: 4040006f j 3000470 + + j IntHandler /* INT 26 */ + 3000070: 2640006f j 30002d4 + j IntHandler /* INT 27 */ + 3000074: 2600006f j 30002d4 + j IntHandler /* INT 28 */ + 3000078: 25c0006f j 30002d4 + j IntHandler /* INT 29 */ + 300007c: 2580006f j 30002d4 + j IntHandler /* INT 30 */ + 3000080: 2540006f j 30002d4 + j IntHandler /* INT 31 */ + 3000084: 2500006f j 30002d4 + j IntHandler /* INT 32 */ + 3000088: 24c0006f j 30002d4 + j IntHandler /* INT 33 */ + 300008c: 2480006f j 30002d4 + j IntHandler /* INT 34 */ + 3000090: 2440006f j 30002d4 + j IntHandler /* INT 35 */ + 3000094: 2400006f j 30002d4 + j IntHandler /* INT 36 */ + 3000098: 23c0006f j 30002d4 + j IntHandler /* INT 37 */ + 300009c: 2380006f j 30002d4 + j IntHandler /* INT 38 */ + 30000a0: 2340006f j 30002d4 + j IntHandler /* INT 39 */ + 30000a4: 2300006f j 30002d4 + j IntHandler /* INT 40 */ + 30000a8: 22c0006f j 30002d4 + j IntHandler /* INT 41 */ + 30000ac: 2280006f j 30002d4 + j IntHandler /* INT 42 */ + 30000b0: 2240006f j 30002d4 + j IntHandler /* INT 43 */ + 30000b4: 2200006f j 30002d4 + j IntHandler /* INT 44 */ + 30000b8: 21c0006f j 30002d4 + j IntHandler /* INT 45 */ + 30000bc: 2180006f j 30002d4 + j IntHandler /* INT 46 */ + 30000c0: 2140006f j 30002d4 + j IntHandler /* INT 47 */ + 30000c4: 2100006f j 30002d4 + j IntHandler /* INT 48 */ + 30000c8: 20c0006f j 30002d4 + j IntHandler /* INT 49 */ + 30000cc: 2080006f j 30002d4 + j IntHandler /* INT 50 */ + 30000d0: 2040006f j 30002d4 + j IntHandler /* INT 51 */ + 30000d4: 2000006f j 30002d4 + j IntHandler /* INT 52 */ + 30000d8: 1fc0006f j 30002d4 + j IntHandler /* INT 53 */ + 30000dc: 1f80006f j 30002d4 + j IntHandler /* INT 54 */ + 30000e0: 1f40006f j 30002d4 + j IntHandler /* INT 55 */ + 30000e4: 1f00006f j 30002d4 + j IntHandler /* INT 56 */ + 30000e8: 1ec0006f j 30002d4 + j IntHandler /* INT 57 */ + 30000ec: 1e80006f j 30002d4 + j IntHandler /* INT 58 */ + 30000f0: 1e40006f j 30002d4 + j IntHandler /* INT 59 */ + 30000f4: 1e00006f j 30002d4 + j IntHandler /* INT 60 */ + 30000f8: 1dc0006f j 30002d4 + j IntHandler /* INT 61 */ + 30000fc: 1d80006f j 30002d4 + j IntHandler /* INT 62 */ + 3000100: 1d40006f j 30002d4 + j IntHandler /* INT 63 */ + 3000104: 1d00006f j 30002d4 + j IntHandler /* INT 64 */ + 3000108: 1cc0006f j 30002d4 + j IntHandler /* INT 65 */ + 300010c: 1c80006f j 30002d4 + j IntHandler /* INT 66 */ + 3000110: 1c40006f j 30002d4 + j IntHandler /* INT 67 */ + 3000114: 1c00006f j 30002d4 + j IntHandler /* INT 68 */ + 3000118: 1bc0006f j 30002d4 + j IntHandler /* INT 69 */ + 300011c: 1b80006f j 30002d4 + j IntHandler /* INT 70 */ + 3000120: 1b40006f j 30002d4 + j IntHandler /* INT 71 */ + 3000124: 1b00006f j 30002d4 + j IntHandler /* INT 72 */ + 3000128: 1ac0006f j 30002d4 + j IntHandler /* INT 73 */ + 300012c: 1a80006f j 30002d4 + j IntHandler /* INT 74 */ + 3000130: 1a40006f j 30002d4 + j IntHandler /* INT 75 */ + 3000134: 1a00006f j 30002d4 + j IntHandler /* INT 76 */ + 3000138: 19c0006f j 30002d4 + j IntHandler /* INT 77 */ + 300013c: 1980006f j 30002d4 + j IntHandler /* INT 78 */ + 3000140: 1940006f j 30002d4 + j IntHandler /* INT 79 */ + 3000144: 1900006f j 30002d4 + j IntHandler /* INT 80 */ + 3000148: 18c0006f j 30002d4 + j IntHandler /* INT 81 */ + 300014c: 1880006f j 30002d4 + j IntHandler /* INT 82 */ + 3000150: 1840006f j 30002d4 + j IntHandler /* INT 83 */ + 3000154: 1800006f j 30002d4 + j IntHandler /* INT 84 */ + 3000158: 17c0006f j 30002d4 + j IntHandler /* INT 85 */ + 300015c: 1780006f j 30002d4 + j IntHandler /* INT 86 */ + 3000160: 1740006f j 30002d4 + j IntHandler /* INT 87 */ + 3000164: 1700006f j 30002d4 + j IntHandler /* INT 88 */ + 3000168: 16c0006f j 30002d4 + j IntHandler /* INT 89 */ + 300016c: 1680006f j 30002d4 + j IntHandler /* INT 90 */ + 3000170: 1640006f j 30002d4 + j IntHandler /* INT 91 */ + 3000174: 1600006f j 30002d4 + j IntHandler /* INT 92 */ + 3000178: 15c0006f j 30002d4 + j IntHandler /* INT 93 */ + 300017c: 1580006f j 30002d4 + j IntHandler /* INT 94 */ + 3000180: 1540006f j 30002d4 + j IntHandler /* INT 95 */ + 3000184: 1500006f j 30002d4 + j IntHandler /* INT 96 */ + 3000188: 14c0006f j 30002d4 + j IntHandler /* INT 97 */ + 300018c: 1480006f j 30002d4 + j IntHandler /* INT 98 */ + 3000190: 1440006f j 30002d4 + j IntHandler /* INT 99 */ + 3000194: 1400006f j 30002d4 + j IntHandler /* INT 100 */ + 3000198: 13c0006f j 30002d4 + j IntHandler /* INT 101 */ + 300019c: 1380006f j 30002d4 + j IntHandler /* INT 102 */ + 30001a0: 1340006f j 30002d4 + j IntHandler /* INT 103 */ + 30001a4: 1300006f j 30002d4 + j IntHandler /* INT 104 */ + 30001a8: 12c0006f j 30002d4 + j IntHandler /* INT 105 */ + 30001ac: 1280006f j 30002d4 + j IntHandler /* INT 106 */ + 30001b0: 1240006f j 30002d4 + j IntHandler /* INT 107 */ + 30001b4: 1200006f j 30002d4 + j IntHandler /* INT 108 */ + 30001b8: 11c0006f j 30002d4 + j IntHandler /* INT 109 */ + 30001bc: 1180006f j 30002d4 + j IntHandler /* INT 110 */ + 30001c0: 1140006f j 30002d4 + j IntHandler /* INT 111 */ + 30001c4: 1100006f j 30002d4 + j IntHandler /* INT 112 */ + 30001c8: 10c0006f j 30002d4 + j IntHandler /* INT 113 */ + 30001cc: 1080006f j 30002d4 + j IntHandler /* INT 114 */ + 30001d0: 1040006f j 30002d4 + j IntHandler /* INT 115 */ + 30001d4: 1000006f j 30002d4 + j IntHandler /* INT 116 */ + 30001d8: 0fc0006f j 30002d4 + j IntHandler /* INT 117 */ + 30001dc: 0f80006f j 30002d4 + j IntHandler /* INT 118 */ + 30001e0: 0f40006f j 30002d4 + j IntHandler /* INT 119 */ + 30001e4: 0f00006f j 30002d4 + j IntHandler /* INT 120 */ + 30001e8: 0ec0006f j 30002d4 + j IntHandler /* INT 121 */ + 30001ec: 0e80006f j 30002d4 + +030001f0 : + +.align 2 +NmiEntry: + SAVE_SYSERR_REGS + 30001f0: f9010113 addi sp,sp,-112 + 30001f4: 04812023 sw s0,64(sp) + 30001f8: 04912223 sw s1,68(sp) + 30001fc: 05212423 sw s2,72(sp) + 3000200: 05312623 sw s3,76(sp) + 3000204: 05412823 sw s4,80(sp) + 3000208: 05512a23 sw s5,84(sp) + 300020c: 05612c23 sw s6,88(sp) + 3000210: 05712e23 sw s7,92(sp) + 3000214: 07812023 sw s8,96(sp) + 3000218: 07912223 sw s9,100(sp) + 300021c: 07a12423 sw s10,104(sp) + 3000220: 07b12623 sw s11,108(sp) + 3000224: 11010593 addi a1,sp,272 + 3000228: 06b12823 sw a1,112(sp) + 300022c: 06312a23 sw gp,116(sp) + 3000230: 06412c23 sw tp,120(sp) + 3000234: 34102573 csrr a0,mepc + 3000238: 300025f3 csrr a1,mstatus + 300023c: 34302673 csrr a2,mtval + 3000240: 342026f3 csrr a3,mcause + 3000244: 06a12e23 sw a0,124(sp) + 3000248: 08b12023 sw a1,128(sp) + 300024c: 08c12223 sw a2,132(sp) + 3000250: 08d12423 sw a3,136(sp) + 3000254: 00010513 mv a0,sp + call SysErrNmiEntry + 3000258: 04c020ef jal ra,30022a4 + +0300025c : +deadLoop1: + tail deadLoop1 + 300025c: a001 j 300025c + nop + 300025e: 00000013 nop + +03000262 : + +.align 2 +TrapEntry: + SAVE_SYSERR_REGS + 3000262: f9010113 addi sp,sp,-112 + 3000266: 04812023 sw s0,64(sp) + 300026a: 04912223 sw s1,68(sp) + 300026e: 05212423 sw s2,72(sp) + 3000272: 05312623 sw s3,76(sp) + 3000276: 05412823 sw s4,80(sp) + 300027a: 05512a23 sw s5,84(sp) + 300027e: 05612c23 sw s6,88(sp) + 3000282: 05712e23 sw s7,92(sp) + 3000286: 07812023 sw s8,96(sp) + 300028a: 07912223 sw s9,100(sp) + 300028e: 07a12423 sw s10,104(sp) + 3000292: 07b12623 sw s11,108(sp) + 3000296: 11010593 addi a1,sp,272 + 300029a: 06b12823 sw a1,112(sp) + 300029e: 06312a23 sw gp,116(sp) + 30002a2: 06412c23 sw tp,120(sp) + 30002a6: 34102573 csrr a0,mepc + 30002aa: 300025f3 csrr a1,mstatus + 30002ae: 34302673 csrr a2,mtval + 30002b2: 342026f3 csrr a3,mcause + 30002b6: 06a12e23 sw a0,124(sp) + 30002ba: 08b12023 sw a1,128(sp) + 30002be: 08c12223 sw a2,132(sp) + 30002c2: 08d12423 sw a3,136(sp) + 30002c6: 00010513 mv a0,sp + /* Exception run with interrupts masked */ + csrc mstatus, MSTATUS_MIE + 30002ca: 30047073 csrci mstatus,8 + call SysErrExcEntry + 30002ce: 7b9010ef jal ra,3002286 + +030002d2 : +deadLoop2: + tail deadLoop2 + 30002d2: a001 j 30002d2 + +030002d4 : + +.align 2 +IntHandler: + addi sp, sp, -(TOTAL_INT_SIZE_ON_STACK) + 30002d4: f6010113 addi sp,sp,-160 + + SREG a0, 3 * REGBYTES(sp) + 30002d8: 00a12623 sw a0,12(sp) + SREG a1, 4 * REGBYTES(sp) + 30002dc: 00b12823 sw a1,16(sp) +#endif + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + csrr a0, mcause +#else + csrr a0, cipri + 30002e0: 7ed02573 csrr a0,0x7ed + csrr a1, prithd + 30002e4: bfe025f3 csrr a1,0xbfe + csrw prithd, a0 /* read prithd */ + 30002e8: bfe51073 csrw 0xbfe,a0 + SREG a1, 6 * REGBYTES(sp) /* save prithd */ + 30002ec: 00b12c23 sw a1,24(sp) + csrr a1, mstatus /* read mstatus */ + 30002f0: 300025f3 csrr a1,mstatus + SREG a1, 7 * REGBYTES(sp) /* save mstatus */ + 30002f4: 00b12e23 sw a1,28(sp) + csrr a1, mepc /* read mepc */ + 30002f8: 341025f3 csrr a1,mepc + SREG a1, 8 * REGBYTES(sp) /* save mepc */ + 30002fc: 02b12023 sw a1,32(sp) + + csrr a0, mcause + 3000300: 34202573 csrr a0,mcause + + li a1, (3<<11) + 3000304: 000025b7 lui a1,0x2 + 3000308: 80058593 addi a1,a1,-2048 # 1800 + csrs mstatus, a1 + 300030c: 3005a073 csrs mstatus,a1 + la a1, custom_nested_irq_main_handler_entry + 3000310: 00000597 auipc a1,0x0 + 3000314: 01058593 addi a1,a1,16 # 3000320 + csrw mepc, a1 + 3000318: 34159073 csrw mepc,a1 + mret + 300031c: 30200073 mret + +03000320 : +#endif + +.align 2 +custom_nested_irq_main_handler_entry: + SREG t0, 0 * REGBYTES(sp) + 3000320: 00512023 sw t0,0(sp) + SREG t1, 1 * REGBYTES(sp) + 3000324: 00612223 sw t1,4(sp) + SREG t2, 2 * REGBYTES(sp) + 3000328: 00712423 sw t2,8(sp) + SREG a2, 5 * REGBYTES(sp) + 300032c: 00c12a23 sw a2,20(sp) + SREG ra, 9 * REGBYTES(sp) + 3000330: 02112223 sw ra,36(sp) + SREG a3, 10 * REGBYTES(sp) + 3000334: 02d12423 sw a3,40(sp) + SREG a4, 11 * REGBYTES(sp) + 3000338: 02e12623 sw a4,44(sp) + SREG a5, 12 * REGBYTES(sp) + 300033c: 02f12823 sw a5,48(sp) + SREG a6, 13 * REGBYTES(sp) + 3000340: 03012a23 sw a6,52(sp) + SREG a7, 14 * REGBYTES(sp) + 3000344: 03112c23 sw a7,56(sp) + SREG t3, 15 * REGBYTES(sp) + 3000348: 03c12e23 sw t3,60(sp) + SREG t4, 16 * REGBYTES(sp) + 300034c: 05d12023 sw t4,64(sp) + SREG t5, 17 * REGBYTES(sp) + 3000350: 05e12223 sw t5,68(sp) + SREG t6, 18 * REGBYTES(sp) + 3000354: 05f12423 sw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FSREG f0, 19 * REGBYTES(sp) + 3000358: 04012627 fsw ft0,76(sp) + FSREG f1, 20 * REGBYTES(sp) + 300035c: 04112827 fsw ft1,80(sp) + FSREG f2, 21 * REGBYTES(sp) + 3000360: 04212a27 fsw ft2,84(sp) + FSREG f3, 22 * REGBYTES(sp) + 3000364: 04312c27 fsw ft3,88(sp) + FSREG f4, 23 * REGBYTES(sp) + 3000368: 04412e27 fsw ft4,92(sp) + FSREG f5, 24 * REGBYTES(sp) + 300036c: 06512027 fsw ft5,96(sp) + FSREG f6, 25 * REGBYTES(sp) + 3000370: 06612227 fsw ft6,100(sp) + FSREG f7, 26 * REGBYTES(sp) + 3000374: 06712427 fsw ft7,104(sp) + FSREG f10, 27 * REGBYTES(sp) + 3000378: 06a12627 fsw fa0,108(sp) + FSREG f11, 28 * REGBYTES(sp) + 300037c: 06b12827 fsw fa1,112(sp) + FSREG f12, 29 * REGBYTES(sp) + 3000380: 06c12a27 fsw fa2,116(sp) + FSREG f13, 30 * REGBYTES(sp) + 3000384: 06d12c27 fsw fa3,120(sp) + FSREG f14, 31 * REGBYTES(sp) + 3000388: 06e12e27 fsw fa4,124(sp) + FSREG f15, 32 * REGBYTES(sp) + 300038c: 08f12027 fsw fa5,128(sp) + FSREG f16, 33 * REGBYTES(sp) + 3000390: 09012227 fsw fa6,132(sp) + FSREG f17, 34 * REGBYTES(sp) + 3000394: 09112427 fsw fa7,136(sp) + FSREG f28, 35 * REGBYTES(sp) + 3000398: 09c12627 fsw ft8,140(sp) + FSREG f29, 36 * REGBYTES(sp) + 300039c: 09d12827 fsw ft9,144(sp) + FSREG f30, 37 * REGBYTES(sp) + 30003a0: 09e12a27 fsw ft10,148(sp) + FSREG f31, 38 * REGBYTES(sp) + 30003a4: 09f12c27 fsw ft11,152(sp) +#endif + + andi a0, a0, MCAUSE_MASK_INT_NUM + 30003a8: 0ff57513 andi a0,a0,255 + call InterruptEntry + 30003ac: 46b010ef jal ra,3002016 + + LREG t1, 1 * REGBYTES(sp) + 30003b0: 00412303 lw t1,4(sp) + LREG t2, 2 * REGBYTES(sp) + 30003b4: 00812383 lw t2,8(sp) + LREG a2, 5 * REGBYTES(sp) + 30003b8: 01412603 lw a2,20(sp) + LREG ra, 9 * REGBYTES(sp) + 30003bc: 02412083 lw ra,36(sp) + LREG a3, 10 * REGBYTES(sp) + 30003c0: 02812683 lw a3,40(sp) + LREG a4, 11 * REGBYTES(sp) + 30003c4: 02c12703 lw a4,44(sp) + LREG a5, 12 * REGBYTES(sp) + 30003c8: 03012783 lw a5,48(sp) + LREG a6, 13 * REGBYTES(sp) + 30003cc: 03412803 lw a6,52(sp) + LREG a7, 14 * REGBYTES(sp) + 30003d0: 03812883 lw a7,56(sp) + LREG t3, 15 * REGBYTES(sp) + 30003d4: 03c12e03 lw t3,60(sp) + LREG t4, 16 * REGBYTES(sp) + 30003d8: 04012e83 lw t4,64(sp) + LREG t5, 17 * REGBYTES(sp) + 30003dc: 04412f03 lw t5,68(sp) + LREG t6, 18 * REGBYTES(sp) + 30003e0: 04812f83 lw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FLREG f0, 19 * REGBYTES(sp) + 30003e4: 04c12007 flw ft0,76(sp) + FLREG f1, 20 * REGBYTES(sp) + 30003e8: 05012087 flw ft1,80(sp) + FLREG f2, 21 * REGBYTES(sp) + 30003ec: 05412107 flw ft2,84(sp) + FLREG f3, 22 * REGBYTES(sp) + 30003f0: 05812187 flw ft3,88(sp) + FLREG f4, 23 * REGBYTES(sp) + 30003f4: 05c12207 flw ft4,92(sp) + FLREG f5, 24 * REGBYTES(sp) + 30003f8: 06012287 flw ft5,96(sp) + FLREG f6, 25 * REGBYTES(sp) + 30003fc: 06412307 flw ft6,100(sp) + FLREG f7, 26 * REGBYTES(sp) + 3000400: 06812387 flw ft7,104(sp) + FLREG f10, 27 * REGBYTES(sp) + 3000404: 06c12507 flw fa0,108(sp) + FLREG f11, 28 * REGBYTES(sp) + 3000408: 07012587 flw fa1,112(sp) + FLREG f12, 29 * REGBYTES(sp) + 300040c: 07412607 flw fa2,116(sp) + FLREG f13, 30 * REGBYTES(sp) + 3000410: 07812687 flw fa3,120(sp) + FLREG f14, 31 * REGBYTES(sp) + 3000414: 07c12707 flw fa4,124(sp) + FLREG f15, 32 * REGBYTES(sp) + 3000418: 08012787 flw fa5,128(sp) + FLREG f16, 33 * REGBYTES(sp) + 300041c: 08412807 flw fa6,132(sp) + FLREG f17, 34 * REGBYTES(sp) + 3000420: 08812887 flw fa7,136(sp) + FLREG f28, 35 * REGBYTES(sp) + 3000424: 08c12e07 flw ft8,140(sp) + FLREG f29, 36 * REGBYTES(sp) + 3000428: 09012e87 flw ft9,144(sp) + FLREG f30, 37 * REGBYTES(sp) + 300042c: 09412f07 flw ft10,148(sp) + FLREG f31, 38 * REGBYTES(sp) + 3000430: 09812f87 flw ft11,152(sp) + +03000434 : + */ + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + LREG t0, 0 * REGBYTES(sp) +#else + LREG a0, 7 * REGBYTES(sp) /* load mstatus */ + 3000434: 01c12503 lw a0,28(sp) + csrr t0, mstatus + 3000438: 300022f3 csrr t0,mstatus + LREG a1, 8 * REGBYTES(sp) /* load mepc */ + 300043c: 02012583 lw a1,32(sp) + andi t0, t0, MSTATUS_MIE + 3000440: 0082f293 andi t0,t0,8 + bnei t0, 0, restore_mstatus + 3000444: 0002923b bnei t0,0,300044c + andi a0, a0, ~(MSTATUS_MIE | MSTATUS_MPIE) + 3000448: f7757513 andi a0,a0,-137 + +0300044c : +restore_mstatus: + csrw mstatus, a0 + 300044c: 30051073 csrw mstatus,a0 + + LREG t0, 0 * REGBYTES(sp) + 3000450: 00012283 lw t0,0(sp) + csrw mepc, a1 + 3000454: 34159073 csrw mepc,a1 + LREG a0, 6 * REGBYTES(sp) /* load prithd */ + 3000458: 01812503 lw a0,24(sp) + csrw prithd, a0 + 300045c: bfe51073 csrw 0xbfe,a0 + lw a1, (a0) + addi a1, a1, -1 + sw a1, (a0) +#endif + + LREG a1, 4 * REGBYTES(sp) /* 2 consecutive csrw instructions will have a bubble */ + 3000460: 01012583 lw a1,16(sp) + + LREG a0, 3 * REGBYTES(sp) + 3000464: 00c12503 lw a0,12(sp) + + addi sp, sp, TOTAL_INT_SIZE_ON_STACK + 3000468: 0a010113 addi sp,sp,160 + + mret + 300046c: 30200073 mret + +03000470 : + +.align 2 +TrapVector: + push_reg + 3000470: f6010113 addi sp,sp,-160 + 3000474: fff11f8b stmia {ra,t0-t6,a0-a7},(sp) + 3000478: f6010113 addi sp,sp,-160 + csrr a0, mcause + 300047c: 34202573 csrr a0,mcause + li t1, MCAUSE_ECALL_FROM_MMODE + 3000480: 00b00313 li t1,11 +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + beq a0, t1, switch_to_umode +#else + beq a0, t1, switch_to_mmode + 3000484: 02650c63 beq a0,t1,30004bc +#endif + li t1, MCAUSE_ECALL_FROM_UMODE + 3000488: 00800313 li t1,8 + beq a0, t1, switch_to_mmode + 300048c: 02650863 beq a0,t1,30004bc + + li a1, MCAUSE_MASK_INT_BIT + 3000490: 800005b7 lui a1,0x80000 + li a2, MCAUSE_MASK_INT_NUM + 3000494: 0ff00613 li a2,255 + and a1, a0, a1 + 3000498: 00b575b3 and a1,a0,a1 + and a0, a0, a2 + 300049c: 00c57533 and a0,a0,a2 + + li a2, 0xc + 30004a0: 00c00613 li a2,12 + beq a0, a2, NmiEntry + 30004a4: d4c506e3 beq a0,a2,30001f0 + beqz a1, TrapEntry + 30004a8: da058de3 beqz a1,3000262 + pop_reg + 30004ac: 0a010113 addi sp,sp,160 + 30004b0: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004b4: 0a010113 addi sp,sp,160 + mret + 30004b8: 30200073 mret + +030004bc : + mret +#endif + +.align 2 +switch_to_mmode: + li t2, MSTATUS_MPP_MACHINE + 30004bc: 000023b7 lui t2,0x2 + 30004c0: 80038393 addi t2,t2,-2048 # 1800 + csrs mstatus, t2 + 30004c4: 3003a073 csrs mstatus,t2 + csrr t0, mepc + 30004c8: 341022f3 csrr t0,mepc + addi t0, t0, 4 + 30004cc: 00428293 addi t0,t0,4 + csrw mepc, t0 + 30004d0: 34129073 csrw mepc,t0 + pop_reg + 30004d4: 0a010113 addi sp,sp,160 + 30004d8: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004dc: 0a010113 addi sp,sp,160 + mret + 30004e0: 30200073 mret + +030004e4 : + +.align 2 +mem_cpy: + bge t0, t2, cpy_done + 30004e4: 0072dc63 bge t0,t2,30004fc + lw t3, (t1) + 30004e8: 00032e03 lw t3,0(t1) + sw t3, (t0) + 30004ec: 01c2a023 sw t3,0(t0) + addi t0, t0, 4 + 30004f0: 00428293 addi t0,t0,4 + addi t1, t1, 4 + 30004f4: 00430313 addi t1,t1,4 + j mem_cpy + 30004f8: fedff06f j 30004e4 + +030004fc : +cpy_done: + ret + 30004fc: 00008067 ret + +03000500 : + +.align 2 +handle_reset: + csrwi mstatus, 0 + 3000500: 30005073 csrwi mstatus,0 + csrwi mie, 0 + 3000504: 30405073 csrwi mie,0 + csrci mstatus, 0x08 + 3000508: 30047073 csrci mstatus,8 + la t0, TrapHandler + 300050c: 00000297 auipc t0,0x0 + 3000510: afc28293 addi t0,t0,-1284 # 3000008 + addi t0, t0, 1 + 3000514: 00128293 addi t0,t0,1 + csrw mtvec, t0 + 3000518: 30529073 csrw mtvec,t0 + csrwi 0x7EF, 0x1 /* lock mtvec */ + 300051c: 7ef0d073 csrwi 0x7ef,1 + +03000520 : + csrwi 0x7C8, 0x1 /* enable hardware nest interrupt support */ +#endif + +flash_init: +/* eflash prefetch enable */ + li t0, EFC_BASE_ADDR + 3000520: 147102b7 lui t0,0x14710 + lw t1, 0x120(t0) + 3000524: 1202a303 lw t1,288(t0) # 14710120 + ori t1, t1, 1 + 3000528: 00136313 ori t1,t1,1 + sw t1, 0x120(t0) + 300052c: 1262a023 sw t1,288(t0) + +/* eflash cache enable */ + lw t1, 0x124(t0) + 3000530: 1242a303 lw t1,292(t0) + ori t1, t1, 1 + 3000534: 00136313 ori t1,t1,1 + sw t1, 0x124(t0) + 3000538: 1262a223 sw t1,292(t0) + +/* enable flash cmd */ + li t0, EFC_MAGIC_NUMBER + 300053c: fedcc2b7 lui t0,0xfedcc + 3000540: a9828293 addi t0,t0,-1384 # fedcba98 + li t1, EFC_MAGIC_LOCK_RW + 3000544: 14710337 lui t1,0x14710 + 3000548: 20030313 addi t1,t1,512 # 14710200 + sw t0, (t1) + 300054c: 00532023 sw t0,0(t1) + +/* initialize global pointer */ + .option push + .option norelax + la gp, __global_pointer$ + 3000550: 01001197 auipc gp,0x1001 + 3000554: bc418193 addi gp,gp,-1084 # 4001114 <__global_pointer$> + .option pop + +/* initialize stack pointer */ + la sp, __stack_top + 3000558: 01007117 auipc sp,0x1007 + 300055c: 6a810113 addi sp,sp,1704 # 4007c00 <__INTERRUPT_STACK_BEGIN__> + +/* timer0 interrupt enable */ + li t0, TIMER0_CONTROL + 3000560: 143002b7 lui t0,0x14300 + 3000564: 00828293 addi t0,t0,8 # 14300008 + lw t1, (t0) + 3000568: 0002a303 lw t1,0(t0) + andi t1, t1, TIMER0_INTENABLE + 300056c: 02037313 andi t1,t1,32 + sw t1, (t0) + 3000570: 0062a023 sw t1,0(t0) + +/* uart0 deinit */ + li t0, 0x14000000 + 3000574: 140002b7 lui t0,0x14000 + li t1, 0 + 3000578: 00000313 li t1,0 + sw t1, IBRD_OFFSET(t0) + 300057c: 0262a223 sw t1,36(t0) # 14000024 + sw t1, FBRD_OFFSET(t0) + 3000580: 0262a423 sw t1,40(t0) + sw t1, LCR_H_OFFSET(t0) + 3000584: 0262a623 sw t1,44(t0) + sw t1, CR_OFFSET(t0) + 3000588: 0262a823 sw t1,48(t0) + sw t1, DMACR_OFFSET(t0) + 300058c: 0462a423 sw t1,72(t0) + +03000590 : + +/* perform the rest of initialization in C */ +clear_sram: + /* clear sysram parity error */ + li t0, SYSRAM_ERROR + 3000590: 101082b7 lui t0,0x10108 + 3000594: 30028293 addi t0,t0,768 # 10108300 + lw t1, (t0) + 3000598: 0002a303 lw t1,0(t0) + ori t1, t1, 1 + 300059c: 00136313 ori t1,t1,1 + sw t1, (t0) + 30005a0: 0062a023 sw t1,0(t0) + + la t0, SRAM_START + 30005a4: 01000297 auipc t0,0x1000 + 30005a8: a5c28293 addi t0,t0,-1444 # 4000000 + la t1, SRAM_END + 30005ac: 01008317 auipc t1,0x1008 + 30005b0: a5430313 addi t1,t1,-1452 # 4008000 + li t2, 0 + 30005b4: 00000393 li t2,0 + +030005b8 : + +clear_sram_loop: + sw t2, (t0) /* clear all sram */ + 30005b8: 0072a023 sw t2,0(t0) + addi t0, t0, 4 /* increment clear index pointer */ + 30005bc: 00428293 addi t0,t0,4 + blt t0, t1, clear_sram_loop /* are we at the end yet, if not , contiue till the end */ + 30005c0: fe62cce3 blt t0,t1,30005b8 + +030005c4 : + +start_coderom_code_copy: + la t0, __sram_code_start_addr /* SRAM addr */ + 30005c4: ff000297 auipc t0,0xff000 + 30005c8: a3c28293 addi t0,t0,-1476 # 2000000 + la t1, __sram_code_load_addr /* ROM addr */ + 30005cc: 00000317 auipc t1,0x0 + 30005d0: 13830313 addi t1,t1,312 # 3000704 + la t2, __sram_code_end_addr + 30005d4: ff000397 auipc t2,0xff000 + 30005d8: a2c38393 addi t2,t2,-1492 # 2000000 + jal mem_cpy + 30005dc: f09ff0ef jal ra,30004e4 + +030005e0 : + +start_reserved_data_copy: + la t0, __reserved_code_start_addr /* SRAM addr */ + 30005e0: 01000297 auipc t0,0x1000 + 30005e4: a2028293 addi t0,t0,-1504 # 4000000 + la t1, __reserved_code_load_addr /* ROM addr */ + 30005e8: 00000317 auipc t1,0x0 + 30005ec: 11c30313 addi t1,t1,284 # 3000704 + la t2, __reserved_code_end_addr + 30005f0: 01000397 auipc t2,0x1000 + 30005f4: a1038393 addi t2,t2,-1520 # 4000000 + jal mem_cpy + 30005f8: eedff0ef jal ra,30004e4 + +030005fc : + +start_coderom_data_copy: + la t0, __data_start /* SRAM addr */ + 30005fc: 01000297 auipc t0,0x1000 + 3000600: a2428293 addi t0,t0,-1500 # 4000020 + la t1, __data_load /* ROM addr */ + 3000604: 00006317 auipc t1,0x6 + 3000608: 19c30313 addi t1,t1,412 # 30067a0 <__data_load> + la t2, __data_end + 300060c: 01000397 auipc t2,0x1000 + 3000610: af038393 addi t2,t2,-1296 # 40000fc + jal mem_cpy + 3000614: ed1ff0ef jal ra,30004e4 + +03000618 : + +pmp_init: + li t0, 0xB00 + 3000618: 000012b7 lui t0,0x1 + 300061c: b0028293 addi t0,t0,-1280 # b00 + csrw pmpaddr0, t0 + 3000620: 3b029073 csrw pmpaddr0,t0 + li t0, 0x400400 /* 0x2C00~0x1000FFF, BOOTROM, enable R+X */ + 3000624: 004002b7 lui t0,0x400 + 3000628: 40028293 addi t0,t0,1024 # 400400 + csrw pmpaddr1, t0 + 300062c: 3b129073 csrw pmpaddr1,t0 + li t0, 0x800000 /* 0x1001000~0x1FFFFFF, Reserved: diable R+X+W */ + 3000630: 008002b7 lui t0,0x800 + csrw pmpaddr2, t0 + 3000634: 3b229073 csrw pmpaddr2,t0 + li t0, 0x802000 /* 0x2000000~0x2007FFF, SYSRAM_ITCM */ + 3000638: 008022b7 lui t0,0x802 + csrw pmpaddr3, t0 + 300063c: 3b329073 csrw pmpaddr3,t0 + li t0, 0xC00000 /* 0x2008000 ~ 0x2FFFFFF, Reserved: disable R+X+W */ + 3000640: 00c002b7 lui t0,0xc00 + csrw pmpaddr4, t0 + 3000644: 3b429073 csrw pmpaddr4,t0 + li t0, 0x1000000 /* 0x3000000 ~ 0x03FFFFFF: EFLASH: enable R+X */ + 3000648: 010002b7 lui t0,0x1000 + csrw pmpaddr5, t0 + 300064c: 3b529073 csrw pmpaddr5,t0 + li t0, 0x1002000 /* 0x4000000 ~ 0x04007FFF: SYSTEM_DTCM enable R+W */ + 3000650: 010022b7 lui t0,0x1002 + csrw pmpaddr6, t0 + 3000654: 3b629073 csrw pmpaddr6,t0 + li t0,0x7000400 /* 0x4008000 ~ 0x01C000FFF: REGISTER R+W */ + 3000658: 070002b7 lui t0,0x7000 + 300065c: 40028293 addi t0,t0,1024 # 7000400 + csrw pmpaddr7, t0 + 3000660: 3b729073 csrw pmpaddr7,t0 + + li t0,0xf3333333 /* register TOR-R-W */ + 3000664: f33332b7 lui t0,0xf3333 + 3000668: 33328293 addi t0,t0,819 # f3333333 + csrw 0x7d8,t0 + 300066c: 7d829073 csrw 0x7d8,t0 + li t0,0x0d080d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + csrw pmpcfg0,t0 + li t0,0x0b0b0d08 + csrw pmpcfg1,t0 +#else + li t0,0x8d888d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + 3000670: 8d8892b7 lui t0,0x8d889 + 3000674: d8b28293 addi t0,t0,-629 # 8d888d8b + csrw pmpcfg0,t0 + 3000678: 3a029073 csrw pmpcfg0,t0 + li t0,0x8b8b8d88 + 300067c: 8b8b92b7 lui t0,0x8b8b9 + 3000680: d8828293 addi t0,t0,-632 # 8b8b8d88 + csrw pmpcfg1,t0 + 3000684: 3a129073 csrw pmpcfg1,t0 +#endif + +/* disable Icache */ + csrwi 0x7C0, 0x0 /* disable ICACHE */ + 3000688: 7c005073 csrwi 0x7c0,0 + fence + 300068c: 0ff0000f fence + +/* disable Dcache */ + csrwi 0x7C1, 0x0 /* disable DCACHE */ + 3000690: 7c105073 csrwi 0x7c1,0 + fence + 3000694: 0ff0000f fence + +/* support float and mie */ + li t0,0x2008 + 3000698: 000022b7 lui t0,0x2 + 300069c: 00828293 addi t0,t0,8 # 2008 + csrs mstatus,t0 + 30006a0: 3002a073 csrs mstatus,t0 + li t0,0x20 + 30006a4: 02000293 li t0,32 + csrs misa,t0 + 30006a8: 3012a073 csrs misa,t0 + +/* Interrupt set default priority = 1*/ + li t0, 0x11111111 + 30006ac: 111112b7 lui t0,0x11111 + 30006b0: 11128293 addi t0,t0,273 # 11111111 + csrw locipri0, t0 + 30006b4: bc029073 csrw 0xbc0,t0 + csrw locipri1, t0 + 30006b8: bc129073 csrw 0xbc1,t0 + csrw locipri2, t0 + 30006bc: bc229073 csrw 0xbc2,t0 + csrw locipri3, t0 + 30006c0: bc329073 csrw 0xbc3,t0 + csrw locipri4, t0 + 30006c4: bc429073 csrw 0xbc4,t0 + csrw locipri5, t0 + 30006c8: bc529073 csrw 0xbc5,t0 + csrw locipri6, t0 + 30006cc: bc629073 csrw 0xbc6,t0 + csrw locipri7, t0 + 30006d0: bc729073 csrw 0xbc7,t0 + csrw locipri8, t0 + 30006d4: bc829073 csrw 0xbc8,t0 + csrw locipri9, t0 + 30006d8: bc929073 csrw 0xbc9,t0 + csrw locipri10, t0 + 30006dc: bca29073 csrw 0xbca,t0 + csrw locipri11, t0 + 30006e0: bcb29073 csrw 0xbcb,t0 + csrw locipri12, t0 + 30006e4: bcc29073 csrw 0xbcc,t0 + csrw locipri13, t0 + 30006e8: bcd29073 csrw 0xbcd,t0 + csrw locipri14, t0 + 30006ec: bce29073 csrw 0xbce,t0 + csrw locipri15, t0 + 30006f0: bcf29073 csrw 0xbcf,t0 + + ecall + 30006f4: 00000073 ecall + jal Chip_Init + 30006f8: 014000ef jal ra,300070c + +/* jump to C func. */ + jal main + 30006fc: 2ee050ef jal ra,30059ea
+ +03000700 : + +dead_loop: + j dead_loop + 3000700: 0000006f j 3000700 + +Disassembly of section .text: + +03000704 : + * @brief Chip Init Fail Process, deadloop if Chip Init fail + * @param None + * @retval None + */ +static inline void Chip_InitFail(void) +{ + 3000704: 1141 addi sp,sp,-16 + 3000706: c622 sw s0,12(sp) + 3000708: 0800 addi s0,sp,16 + while (1) { + 300070a: a001 j 300070a + +0300070c : + * @brief Chip Init + * @param None + * @retval None + */ +void Chip_Init(void) +{ + 300070c: 1101 addi sp,sp,-32 + 300070e: ce06 sw ra,28(sp) + 3000710: cc22 sw s0,24(sp) + 3000712: 1000 addi s0,sp,32 + CRG_CoreClkSelect coreClkSelect; + /* Config CRG */ + if (CRG_Config(&coreClkSelect) != BASE_STATUS_OK) { + 3000714: fec40793 addi a5,s0,-20 + 3000718: 853e mv a0,a5 + 300071a: 2dc050ef jal ra,30059f6 + 300071e: 87aa mv a5,a0 + 3000720: c391 beqz a5,3000724 + Chip_InitFail(); + 3000722: 37cd jal ra,3000704 + } + + /* Config FLASH Clock */ + FLASH_ClockConfig(coreClkSelect); + 3000724: fec42783 lw a5,-20(s0) + 3000728: 853e mv a0,a5 + 300072a: 796000ef jal ra,3000ec0 + SYSTICK_Init(); + 300072e: 057000ef jal ra,3000f84 + /* Set CoreClock Select after FLASH Config Done */ + CRG_SetCoreClockSelect(coreClkSelect); + 3000732: fec42783 lw a5,-20(s0) + 3000736: 853e mv a0,a5 + 3000738: 25b1 jal ra,3000d84 + + IRQ_Init(); + 300073a: 121010ef jal ra,300205a + ANAVREF_Init(); + 300073e: 23e5 jal ra,3000d26 + ANATRIM_Entry(); + 3000740: 2b51 jal ra,3000cd4 + /* User Add Code Here */ + 3000742: 0001 nop + 3000744: 40f2 lw ra,28(sp) + 3000746: 4462 lw s0,24(sp) + 3000748: 6105 addi sp,sp,32 + 300074a: 8082 ret + +0300074c : + * @brief Calculate the conversion gain of the tsensor. + * @param data, original data. + * @retval None + */ +static void CalculateGain(unsigned int data) +{ + 300074c: 1101 addi sp,sp,-32 + 300074e: ce22 sw s0,28(sp) + 3000750: 1000 addi s0,sp,32 + 3000752: fea42623 sw a0,-20(s0) + g_tsensorGain = ((float)(data) / 10000000.0f); + 3000756: fec42783 lw a5,-20(s0) + 300075a: d017f753 fcvt.s.wu fa4,a5 + 300075e: 030067b7 lui a5,0x3006 + 3000762: 1fc7a787 flw fa5,508(a5) # 30061fc <__rodata_start> + 3000766: 18f777d3 fdiv.s fa5,fa4,fa5 + 300076a: 040007b7 lui a5,0x4000 + 300076e: 02f7a027 fsw fa5,32(a5) # 4000020 +} + 3000772: 0001 nop + 3000774: 4472 lw s0,28(sp) + 3000776: 6105 addi sp,sp,32 + 3000778: 8082 ret + +0300077a : + * @brief Obtains the chip ID. + * @param None + * @retval None + */ +static bool CHIP_GetInfo(void) +{ + 300077a: 7179 addi sp,sp,-48 + 300077c: d606 sw ra,44(sp) + 300077e: d422 sw s0,40(sp) + 3000780: 1800 addi s0,sp,48 + FOTP_INFO_RGN0_NUMBER_4 emptyData; + FOTP_INFO_RGN0_NUMBER_2 idData; + FOTP_InfoGet(FOTP_INFO_RNG0, 4U, (void *)&emptyData.comData); /* 4 is the number of fotp_empty_flag in otp */ + 3000782: fe040793 addi a5,s0,-32 + 3000786: 863e mv a2,a5 + 3000788: 4591 li a1,4 + 300078a: 4501 li a0,0 + 300078c: 2391 jal ra,3000cd0 + FOTP_InfoGet(FOTP_INFO_RNG0, 2U, (void *)&idData.comData); /* 2 is the number of idData in otp */ + 300078e: fd040793 addi a5,s0,-48 + 3000792: 863e mv a2,a5 + 3000794: 4589 li a1,2 + 3000796: 4501 li a0,0 + 3000798: 2b25 jal ra,3000cd0 + if (emptyData.REG.fotp_empty_flag != 0x5AA59669 || idData.REG.chip_id == 0xFFFFFFFF) { + 300079a: fe042703 lw a4,-32(s0) + 300079e: 5aa597b7 lui a5,0x5aa59 + 30007a2: 66978793 addi a5,a5,1641 # 5aa59669 + 30007a6: 00f71763 bne a4,a5,30007b4 + 30007aa: fd042703 lw a4,-48(s0) + 30007ae: 57fd li a5,-1 + 30007b0: 00f71463 bne a4,a5,30007b8 + return false; + 30007b4: 4781 li a5,0 + 30007b6: a011 j 30007ba + } + return true; + 30007b8: 4785 li a5,1 +} + 30007ba: 853e mv a0,a5 + 30007bc: 50b2 lw ra,44(sp) + 30007be: 5422 lw s0,40(sp) + 30007c0: 6145 addi sp,sp,48 + 30007c2: 8082 ret + +030007c4 : + * @brief Analog module trim. + * @param None + * @retval None + */ +static void CHIP_AnalogTrim(void) +{ + 30007c4: 711d addi sp,sp,-96 + 30007c6: ce86 sw ra,92(sp) + 30007c8: cca2 sw s0,88(sp) + 30007ca: 1080 addi s0,sp,96 + FOTP_INFO_RGN0_NUMBER_20 trimData20; + FOTP_InfoGet(FOTP_INFO_RNG0, 20U, (void *)&trimData20.comData); /* 20 is the number of trim data in otp */ + 30007cc: fdc40793 addi a5,s0,-36 + 30007d0: 863e mv a2,a5 + 30007d2: 45d1 li a1,20 + 30007d4: 4501 li a0,0 + 30007d6: 29ed jal ra,3000cd0 + /* VREF */ + VREF->VREF_TRIM0.BIT.da_iref_trim = trimData20.REG.data0.da_iref_trim; + 30007d8: 18100737 lui a4,0x18100 + 30007dc: fdc42783 lw a5,-36(s0) + 30007e0: 83c1 srli a5,a5,0x10 + 30007e2: 9bfd andi a5,a5,-1 + 30007e4: 0ff7f693 andi a3,a5,255 + 30007e8: 433c lw a5,64(a4) + 30007ea: 0ff6f693 andi a3,a3,255 + 30007ee: f007f793 andi a5,a5,-256 + 30007f2: 8fd5 or a5,a5,a3 + 30007f4: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vref_trim = trimData20.REG.data0.da_ref_vref_trim; + 30007f6: 18100737 lui a4,0x18100 + 30007fa: fdc42783 lw a5,-36(s0) + 30007fe: 83a1 srli a5,a5,0x8 + 3000800: 9bfd andi a5,a5,-1 + 3000802: 0ff7f693 andi a3,a5,255 + 3000806: 433c lw a5,64(a4) + 3000808: 0ff6f693 andi a3,a3,255 + 300080c: 06a2 slli a3,a3,0x8 + 300080e: 7641 lui a2,0xffff0 + 3000810: 0ff60613 addi a2,a2,255 # ffff00ff + 3000814: 8ff1 and a5,a5,a2 + 3000816: 8fd5 or a5,a5,a3 + 3000818: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vbg_trim = trimData20.REG.data0.da_ref_vbg_trim; + 300081a: 18100737 lui a4,0x18100 + 300081e: fdc42783 lw a5,-36(s0) + 3000822: 0ff7f693 andi a3,a5,255 + 3000826: 433c lw a5,64(a4) + 3000828: 0ff6f693 andi a3,a3,255 + 300082c: 06c2 slli a3,a3,0x10 + 300082e: ff010637 lui a2,0xff010 + 3000832: 167d addi a2,a2,-1 # ff00ffff + 3000834: 8ff1 and a5,a5,a2 + 3000836: 8fd5 or a5,a5,a3 + 3000838: c33c sw a5,64(a4) + unsigned int value = trimData20.REG.data1.da_ref_temp_trim3; + 300083a: fe042783 lw a5,-32(s0) + 300083e: 83c1 srli a5,a5,0x10 + 3000840: 9bfd andi a5,a5,-1 + 3000842: 9f81 uxtb a5 + 3000844: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim2 << 8U); /* Shift left by 8 bits */ + 3000848: fe042783 lw a5,-32(s0) + 300084c: 83a1 srli a5,a5,0x8 + 300084e: 9bfd andi a5,a5,-1 + 3000850: 9f81 uxtb a5 + 3000852: 07a2 slli a5,a5,0x8 + 3000854: 873e mv a4,a5 + 3000856: fec42783 lw a5,-20(s0) + 300085a: 8fd9 or a5,a5,a4 + 300085c: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim1 << 16U); /* Shift left by 16 bits */ + 3000860: fe042783 lw a5,-32(s0) + 3000864: 9f81 uxtb a5 + 3000866: 07c2 slli a5,a5,0x10 + 3000868: 873e mv a4,a5 + 300086a: fec42783 lw a5,-20(s0) + 300086e: 8fd9 or a5,a5,a4 + 3000870: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data0.da_ref_temp_trim0 << 24U); /* Shift left by 24 bits */ + 3000874: fdc42783 lw a5,-36(s0) + 3000878: 83e1 srli a5,a5,0x18 + 300087a: 9f81 uxtb a5 + 300087c: 07e2 slli a5,a5,0x18 + 300087e: 873e mv a4,a5 + 3000880: fec42783 lw a5,-20(s0) + 3000884: 8fd9 or a5,a5,a4 + 3000886: fef42623 sw a5,-20(s0) + VREF->VREF_TRIM1.reg = value; + 300088a: 181007b7 lui a5,0x18100 + 300088e: fec42703 lw a4,-20(s0) + 3000892: c3f8 sw a4,68(a5) + + FOTP_INFO_RGN0_NUMBER_21 trimData21; + FOTP_InfoGet(FOTP_INFO_RNG0, 21U, (void *)&trimData21.comData); /* 21 is the number of trim data in otp */ + 3000894: fcc40793 addi a5,s0,-52 + 3000898: 863e mv a2,a5 + 300089a: 45d5 li a1,21 + 300089c: 4501 li a0,0 + 300089e: 290d jal ra,3000cd0 + /* ADC */ + ADC0->ADC_OEGE_TRIM.BIT.cfg_gain_cali_trim = trimData21.REG.data1.saradc_gain; + 30008a0: 18000737 lui a4,0x18000 + 30008a4: fd042783 lw a5,-48(s0) + 30008a8: 86be mv a3,a5 + 30008aa: 6789 lui a5,0x2 + 30008ac: 17fd addi a5,a5,-1 # 1fff + 30008ae: 8ff5 and a5,a5,a3 + 30008b0: 01079613 slli a2,a5,0x10 + 30008b4: 8241 srli a2,a2,0x10 + 30008b6: 6785 lui a5,0x1 + 30008b8: 973e add a4,a4,a5 + 30008ba: 80872783 lw a5,-2040(a4) # 17fff808 + 30008be: 6689 lui a3,0x2 + 30008c0: 16fd addi a3,a3,-1 # 1fff + 30008c2: 8ef1 and a3,a3,a2 + 30008c4: 06c2 slli a3,a3,0x10 + 30008c6: e0010637 lui a2,0xe0010 + 30008ca: 167d addi a2,a2,-1 # e000ffff + 30008cc: 8ff1 and a5,a5,a2 + 30008ce: 8fd5 or a5,a5,a3 + 30008d0: 80f72423 sw a5,-2040(a4) + ADC0->ADC_OEGE_TRIM.BIT.cfg_ofst_cali_trim = trimData21.REG.data1.saradc_offset; + 30008d4: 18000737 lui a4,0x18000 + 30008d8: fd042783 lw a5,-48(s0) + 30008dc: 83c1 srli a5,a5,0x10 + 30008de: 86be mv a3,a5 + 30008e0: 6785 lui a5,0x1 + 30008e2: 17fd addi a5,a5,-1 # fff + 30008e4: 8ff5 and a5,a5,a3 + 30008e6: 01079613 slli a2,a5,0x10 + 30008ea: 8241 srli a2,a2,0x10 + 30008ec: 6785 lui a5,0x1 + 30008ee: 973e add a4,a4,a5 + 30008f0: 80872783 lw a5,-2040(a4) # 17fff808 + 30008f4: 6685 lui a3,0x1 + 30008f6: 16fd addi a3,a3,-1 # fff + 30008f8: 8ef1 and a3,a3,a2 + 30008fa: 767d lui a2,0xfffff + 30008fc: 8ff1 and a5,a5,a2 + 30008fe: 8fd5 or a5,a5,a3 + 3000900: 80f72423 sw a5,-2040(a4) + + /* TSENSOR */ + TSENSOR->TSENSOR_TRIM.reg = trimData20.REG.data1.da_ref_vptat_trim; + 3000904: fe042783 lw a5,-32(s0) + 3000908: 83e1 srli a5,a5,0x18 + 300090a: 0ff7f713 andi a4,a5,255 + 300090e: 185007b7 lui a5,0x18500 + 3000912: cb98 sw a4,16(a5) + ADC0->ADC_TSENSOR_TRIM.BIT.cfg_tsensor_ofst_trim = trimData21.REG.data2.ts_offset; + 3000914: 18000737 lui a4,0x18000 + 3000918: fd442783 lw a5,-44(s0) + 300091c: 86be mv a3,a5 + 300091e: 6785 lui a5,0x1 + 3000920: 17fd addi a5,a5,-1 # fff + 3000922: 8ff5 and a5,a5,a3 + 3000924: 01079613 slli a2,a5,0x10 + 3000928: 8241 srli a2,a2,0x10 + 300092a: 6785 lui a5,0x1 + 300092c: 973e add a4,a4,a5 + 300092e: 80472783 lw a5,-2044(a4) # 17fff804 + 3000932: 6685 lui a3,0x1 + 3000934: 16fd addi a3,a3,-1 # fff + 3000936: 8ef1 and a3,a3,a2 + 3000938: 767d lui a2,0xfffff + 300093a: 8ff1 and a5,a5,a2 + 300093c: 8fd5 or a5,a5,a3 + 300093e: 80f72223 sw a5,-2044(a4) + CalculateGain(trimData21.REG.data3.ts_gain); + 3000942: fd842783 lw a5,-40(s0) + 3000946: 83a5 srli a5,a5,0x9 + 3000948: 853e mv a0,a5 + 300094a: 3509 jal ra,300074c + + /* PGA */ + PGA0->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga0_vos_trim; + 300094c: 18200737 lui a4,0x18200 + 3000950: fcc42783 lw a5,-52(s0) + 3000954: 1ff7f793 andi a5,a5,511 + 3000958: 01079693 slli a3,a5,0x10 + 300095c: 82c1 srli a3,a3,0x10 + 300095e: 531c lw a5,32(a4) + 3000960: 1ff6f693 andi a3,a3,511 + 3000964: e007f793 andi a5,a5,-512 + 3000968: 8fd5 or a5,a5,a3 + 300096a: d31c sw a5,32(a4) + PGA1->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga1_vos_trim; + 300096c: 18201737 lui a4,0x18201 + 3000970: fcc42783 lw a5,-52(s0) + 3000974: 83c1 srli a5,a5,0x10 + 3000976: 1ff7f793 andi a5,a5,511 + 300097a: 01079693 slli a3,a5,0x10 + 300097e: 82c1 srli a3,a3,0x10 + 3000980: 531c lw a5,32(a4) + 3000982: 1ff6f693 andi a3,a3,511 + 3000986: e007f793 andi a5,a5,-512 + 300098a: 8fd5 or a5,a5,a3 + 300098c: d31c sw a5,32(a4) + + FOTP_INFO_RGN0_NUMBER_22 trimData22; + FOTP_InfoGet(FOTP_INFO_RNG0, 22U, (void *)&trimData22.comData); /* 22 is the number of trim data in otp */ + 300098e: fbc40793 addi a5,s0,-68 + 3000992: 863e mv a2,a5 + 3000994: 45d9 li a1,22 + 3000996: 4501 li a0,0 + 3000998: 257d jal ra,3001046 + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_gain_trim2 = trimData22.REG.data0.pga0_gain2; + 300099a: 18000737 lui a4,0x18000 + 300099e: fbc42783 lw a5,-68(s0) + 30009a2: 86be mv a3,a5 + 30009a4: 6789 lui a5,0x2 + 30009a6: 17fd addi a5,a5,-1 # 1fff + 30009a8: 8ff5 and a5,a5,a3 + 30009aa: 01079613 slli a2,a5,0x10 + 30009ae: 8241 srli a2,a2,0x10 + 30009b0: 6785 lui a5,0x1 + 30009b2: 973e add a4,a4,a5 + 30009b4: 81472783 lw a5,-2028(a4) # 17fff814 + 30009b8: 6689 lui a3,0x2 + 30009ba: 16fd addi a3,a3,-1 # 1fff + 30009bc: 8ef1 and a3,a3,a2 + 30009be: 06c2 slli a3,a3,0x10 + 30009c0: e0010637 lui a2,0xe0010 + 30009c4: 167d addi a2,a2,-1 # e000ffff + 30009c6: 8ff1 and a5,a5,a2 + 30009c8: 8fd5 or a5,a5,a3 + 30009ca: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_ofst_trim2 = trimData22.REG.data0.pga0_offset2; + 30009ce: 18000737 lui a4,0x18000 + 30009d2: fbc42783 lw a5,-68(s0) + 30009d6: 83c1 srli a5,a5,0x10 + 30009d8: 86be mv a3,a5 + 30009da: 6785 lui a5,0x1 + 30009dc: 17fd addi a5,a5,-1 # fff + 30009de: 8ff5 and a5,a5,a3 + 30009e0: 01079613 slli a2,a5,0x10 + 30009e4: 8241 srli a2,a2,0x10 + 30009e6: 6785 lui a5,0x1 + 30009e8: 973e add a4,a4,a5 + 30009ea: 81472783 lw a5,-2028(a4) # 17fff814 + 30009ee: 6685 lui a3,0x1 + 30009f0: 16fd addi a3,a3,-1 # fff + 30009f2: 8ef1 and a3,a3,a2 + 30009f4: 767d lui a2,0xfffff + 30009f6: 8ff1 and a5,a5,a2 + 30009f8: 8fd5 or a5,a5,a3 + 30009fa: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_gain_trim4 = trimData22.REG.data1.pga0_gain4; + 30009fe: 18000737 lui a4,0x18000 + 3000a02: fc042783 lw a5,-64(s0) + 3000a06: 86be mv a3,a5 + 3000a08: 6789 lui a5,0x2 + 3000a0a: 17fd addi a5,a5,-1 # 1fff + 3000a0c: 8ff5 and a5,a5,a3 + 3000a0e: 01079613 slli a2,a5,0x10 + 3000a12: 8241 srli a2,a2,0x10 + 3000a14: 6785 lui a5,0x1 + 3000a16: 973e add a4,a4,a5 + 3000a18: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a1c: 6689 lui a3,0x2 + 3000a1e: 16fd addi a3,a3,-1 # 1fff + 3000a20: 8ef1 and a3,a3,a2 + 3000a22: 06c2 slli a3,a3,0x10 + 3000a24: e0010637 lui a2,0xe0010 + 3000a28: 167d addi a2,a2,-1 # e000ffff + 3000a2a: 8ff1 and a5,a5,a2 + 3000a2c: 8fd5 or a5,a5,a3 + 3000a2e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_ofst_trim4 = trimData22.REG.data1.pga0_offset4; + 3000a32: 18000737 lui a4,0x18000 + 3000a36: fc042783 lw a5,-64(s0) + 3000a3a: 83c1 srli a5,a5,0x10 + 3000a3c: 86be mv a3,a5 + 3000a3e: 6785 lui a5,0x1 + 3000a40: 17fd addi a5,a5,-1 # fff + 3000a42: 8ff5 and a5,a5,a3 + 3000a44: 01079613 slli a2,a5,0x10 + 3000a48: 8241 srli a2,a2,0x10 + 3000a4a: 6785 lui a5,0x1 + 3000a4c: 973e add a4,a4,a5 + 3000a4e: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a52: 6685 lui a3,0x1 + 3000a54: 16fd addi a3,a3,-1 # fff + 3000a56: 8ef1 and a3,a3,a2 + 3000a58: 767d lui a2,0xfffff + 3000a5a: 8ff1 and a5,a5,a2 + 3000a5c: 8fd5 or a5,a5,a3 + 3000a5e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_gain_trim8 = trimData22.REG.data2.pga0_gain8; + 3000a62: 18000737 lui a4,0x18000 + 3000a66: fc442783 lw a5,-60(s0) + 3000a6a: 86be mv a3,a5 + 3000a6c: 6789 lui a5,0x2 + 3000a6e: 17fd addi a5,a5,-1 # 1fff + 3000a70: 8ff5 and a5,a5,a3 + 3000a72: 01079613 slli a2,a5,0x10 + 3000a76: 8241 srli a2,a2,0x10 + 3000a78: 6785 lui a5,0x1 + 3000a7a: 973e add a4,a4,a5 + 3000a7c: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000a80: 6689 lui a3,0x2 + 3000a82: 16fd addi a3,a3,-1 # 1fff + 3000a84: 8ef1 and a3,a3,a2 + 3000a86: 06c2 slli a3,a3,0x10 + 3000a88: e0010637 lui a2,0xe0010 + 3000a8c: 167d addi a2,a2,-1 # e000ffff + 3000a8e: 8ff1 and a5,a5,a2 + 3000a90: 8fd5 or a5,a5,a3 + 3000a92: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_ofst_trim8 = trimData22.REG.data2.pga0_offset8; + 3000a96: 18000737 lui a4,0x18000 + 3000a9a: fc442783 lw a5,-60(s0) + 3000a9e: 83c1 srli a5,a5,0x10 + 3000aa0: 86be mv a3,a5 + 3000aa2: 6785 lui a5,0x1 + 3000aa4: 17fd addi a5,a5,-1 # fff + 3000aa6: 8ff5 and a5,a5,a3 + 3000aa8: 01079613 slli a2,a5,0x10 + 3000aac: 8241 srli a2,a2,0x10 + 3000aae: 6785 lui a5,0x1 + 3000ab0: 973e add a4,a4,a5 + 3000ab2: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000ab6: 6685 lui a3,0x1 + 3000ab8: 16fd addi a3,a3,-1 # fff + 3000aba: 8ef1 and a3,a3,a2 + 3000abc: 767d lui a2,0xfffff + 3000abe: 8ff1 and a5,a5,a2 + 3000ac0: 8fd5 or a5,a5,a3 + 3000ac2: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_gain_trim16 = trimData22.REG.data3.pga0_gain16; + 3000ac6: 18000737 lui a4,0x18000 + 3000aca: fc842783 lw a5,-56(s0) + 3000ace: 86be mv a3,a5 + 3000ad0: 6789 lui a5,0x2 + 3000ad2: 17fd addi a5,a5,-1 # 1fff + 3000ad4: 8ff5 and a5,a5,a3 + 3000ad6: 01079613 slli a2,a5,0x10 + 3000ada: 8241 srli a2,a2,0x10 + 3000adc: 6785 lui a5,0x1 + 3000ade: 973e add a4,a4,a5 + 3000ae0: 82072783 lw a5,-2016(a4) # 17fff820 + 3000ae4: 6689 lui a3,0x2 + 3000ae6: 16fd addi a3,a3,-1 # 1fff + 3000ae8: 8ef1 and a3,a3,a2 + 3000aea: 06c2 slli a3,a3,0x10 + 3000aec: e0010637 lui a2,0xe0010 + 3000af0: 167d addi a2,a2,-1 # e000ffff + 3000af2: 8ff1 and a5,a5,a2 + 3000af4: 8fd5 or a5,a5,a3 + 3000af6: 82f72023 sw a5,-2016(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_ofst_trim16 = trimData22.REG.data3.pga0_offset16; + 3000afa: 18000737 lui a4,0x18000 + 3000afe: fc842783 lw a5,-56(s0) + 3000b02: 83c1 srli a5,a5,0x10 + 3000b04: 86be mv a3,a5 + 3000b06: 6785 lui a5,0x1 + 3000b08: 17fd addi a5,a5,-1 # fff + 3000b0a: 8ff5 and a5,a5,a3 + 3000b0c: 01079613 slli a2,a5,0x10 + 3000b10: 8241 srli a2,a2,0x10 + 3000b12: 6785 lui a5,0x1 + 3000b14: 973e add a4,a4,a5 + 3000b16: 82072783 lw a5,-2016(a4) # 17fff820 + 3000b1a: 6685 lui a3,0x1 + 3000b1c: 16fd addi a3,a3,-1 # fff + 3000b1e: 8ef1 and a3,a3,a2 + 3000b20: 767d lui a2,0xfffff + 3000b22: 8ff1 and a5,a5,a2 + 3000b24: 8fd5 or a5,a5,a3 + 3000b26: 82f72023 sw a5,-2016(a4) + + FOTP_INFO_RGN0_NUMBER_23 trimData23; + FOTP_InfoGet(FOTP_INFO_RNG0, 23U, (void *)&trimData23.comData); /* 23 is the number of trim data in otp */ + 3000b2a: fac40793 addi a5,s0,-84 + 3000b2e: 863e mv a2,a5 + 3000b30: 45dd li a1,23 + 3000b32: 4501 li a0,0 + 3000b34: 2b09 jal ra,3001046 + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_gain_trim2 = trimData23.REG.data0.pga1_gain2; + 3000b36: 18000737 lui a4,0x18000 + 3000b3a: fac42783 lw a5,-84(s0) + 3000b3e: 86be mv a3,a5 + 3000b40: 6789 lui a5,0x2 + 3000b42: 17fd addi a5,a5,-1 # 1fff + 3000b44: 8ff5 and a5,a5,a3 + 3000b46: 01079613 slli a2,a5,0x10 + 3000b4a: 8241 srli a2,a2,0x10 + 3000b4c: 6785 lui a5,0x1 + 3000b4e: 973e add a4,a4,a5 + 3000b50: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b54: 6689 lui a3,0x2 + 3000b56: 16fd addi a3,a3,-1 # 1fff + 3000b58: 8ef1 and a3,a3,a2 + 3000b5a: 06c2 slli a3,a3,0x10 + 3000b5c: e0010637 lui a2,0xe0010 + 3000b60: 167d addi a2,a2,-1 # e000ffff + 3000b62: 8ff1 and a5,a5,a2 + 3000b64: 8fd5 or a5,a5,a3 + 3000b66: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_ofst_trim2 = trimData23.REG.data0.pga1_offset2; + 3000b6a: 18000737 lui a4,0x18000 + 3000b6e: fac42783 lw a5,-84(s0) + 3000b72: 83c1 srli a5,a5,0x10 + 3000b74: 86be mv a3,a5 + 3000b76: 6785 lui a5,0x1 + 3000b78: 17fd addi a5,a5,-1 # fff + 3000b7a: 8ff5 and a5,a5,a3 + 3000b7c: 01079613 slli a2,a5,0x10 + 3000b80: 8241 srli a2,a2,0x10 + 3000b82: 6785 lui a5,0x1 + 3000b84: 973e add a4,a4,a5 + 3000b86: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b8a: 6685 lui a3,0x1 + 3000b8c: 16fd addi a3,a3,-1 # fff + 3000b8e: 8ef1 and a3,a3,a2 + 3000b90: 767d lui a2,0xfffff + 3000b92: 8ff1 and a5,a5,a2 + 3000b94: 8fd5 or a5,a5,a3 + 3000b96: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_gain_trim4 = trimData23.REG.data1.pga1_gain4; + 3000b9a: 18000737 lui a4,0x18000 + 3000b9e: fb042783 lw a5,-80(s0) + 3000ba2: 86be mv a3,a5 + 3000ba4: 6789 lui a5,0x2 + 3000ba6: 17fd addi a5,a5,-1 # 1fff + 3000ba8: 8ff5 and a5,a5,a3 + 3000baa: 01079613 slli a2,a5,0x10 + 3000bae: 8241 srli a2,a2,0x10 + 3000bb0: 6785 lui a5,0x1 + 3000bb2: 973e add a4,a4,a5 + 3000bb4: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bb8: 6689 lui a3,0x2 + 3000bba: 16fd addi a3,a3,-1 # 1fff + 3000bbc: 8ef1 and a3,a3,a2 + 3000bbe: 06c2 slli a3,a3,0x10 + 3000bc0: e0010637 lui a2,0xe0010 + 3000bc4: 167d addi a2,a2,-1 # e000ffff + 3000bc6: 8ff1 and a5,a5,a2 + 3000bc8: 8fd5 or a5,a5,a3 + 3000bca: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_ofst_trim4 = trimData23.REG.data1.pga1_offset4; + 3000bce: 18000737 lui a4,0x18000 + 3000bd2: fb042783 lw a5,-80(s0) + 3000bd6: 83c1 srli a5,a5,0x10 + 3000bd8: 86be mv a3,a5 + 3000bda: 6785 lui a5,0x1 + 3000bdc: 17fd addi a5,a5,-1 # fff + 3000bde: 8ff5 and a5,a5,a3 + 3000be0: 01079613 slli a2,a5,0x10 + 3000be4: 8241 srli a2,a2,0x10 + 3000be6: 6785 lui a5,0x1 + 3000be8: 973e add a4,a4,a5 + 3000bea: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bee: 6685 lui a3,0x1 + 3000bf0: 16fd addi a3,a3,-1 # fff + 3000bf2: 8ef1 and a3,a3,a2 + 3000bf4: 767d lui a2,0xfffff + 3000bf6: 8ff1 and a5,a5,a2 + 3000bf8: 8fd5 or a5,a5,a3 + 3000bfa: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_gain_trim8 = trimData23.REG.data2.pga1_gain8; + 3000bfe: 18000737 lui a4,0x18000 + 3000c02: fb442783 lw a5,-76(s0) + 3000c06: 86be mv a3,a5 + 3000c08: 6789 lui a5,0x2 + 3000c0a: 17fd addi a5,a5,-1 # 1fff + 3000c0c: 8ff5 and a5,a5,a3 + 3000c0e: 01079613 slli a2,a5,0x10 + 3000c12: 8241 srli a2,a2,0x10 + 3000c14: 6785 lui a5,0x1 + 3000c16: 973e add a4,a4,a5 + 3000c18: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c1c: 6689 lui a3,0x2 + 3000c1e: 16fd addi a3,a3,-1 # 1fff + 3000c20: 8ef1 and a3,a3,a2 + 3000c22: 06c2 slli a3,a3,0x10 + 3000c24: e0010637 lui a2,0xe0010 + 3000c28: 167d addi a2,a2,-1 # e000ffff + 3000c2a: 8ff1 and a5,a5,a2 + 3000c2c: 8fd5 or a5,a5,a3 + 3000c2e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_ofst_trim8 = trimData23.REG.data2.pga1_offset8; + 3000c32: 18000737 lui a4,0x18000 + 3000c36: fb442783 lw a5,-76(s0) + 3000c3a: 83c1 srli a5,a5,0x10 + 3000c3c: 86be mv a3,a5 + 3000c3e: 6785 lui a5,0x1 + 3000c40: 17fd addi a5,a5,-1 # fff + 3000c42: 8ff5 and a5,a5,a3 + 3000c44: 01079613 slli a2,a5,0x10 + 3000c48: 8241 srli a2,a2,0x10 + 3000c4a: 6785 lui a5,0x1 + 3000c4c: 973e add a4,a4,a5 + 3000c4e: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c52: 6685 lui a3,0x1 + 3000c54: 16fd addi a3,a3,-1 # fff + 3000c56: 8ef1 and a3,a3,a2 + 3000c58: 767d lui a2,0xfffff + 3000c5a: 8ff1 and a5,a5,a2 + 3000c5c: 8fd5 or a5,a5,a3 + 3000c5e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_gain_trim16 = trimData23.REG.data3.pga1_gain16; + 3000c62: 18000737 lui a4,0x18000 + 3000c66: fb842783 lw a5,-72(s0) + 3000c6a: 86be mv a3,a5 + 3000c6c: 6789 lui a5,0x2 + 3000c6e: 17fd addi a5,a5,-1 # 1fff + 3000c70: 8ff5 and a5,a5,a3 + 3000c72: 01079613 slli a2,a5,0x10 + 3000c76: 8241 srli a2,a2,0x10 + 3000c78: 6785 lui a5,0x1 + 3000c7a: 973e add a4,a4,a5 + 3000c7c: 83072783 lw a5,-2000(a4) # 17fff830 + 3000c80: 6689 lui a3,0x2 + 3000c82: 16fd addi a3,a3,-1 # 1fff + 3000c84: 8ef1 and a3,a3,a2 + 3000c86: 06c2 slli a3,a3,0x10 + 3000c88: e0010637 lui a2,0xe0010 + 3000c8c: 167d addi a2,a2,-1 # e000ffff + 3000c8e: 8ff1 and a5,a5,a2 + 3000c90: 8fd5 or a5,a5,a3 + 3000c92: 82f72823 sw a5,-2000(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_ofst_trim16 = trimData23.REG.data3.pga1_offset16; + 3000c96: 18000737 lui a4,0x18000 + 3000c9a: fb842783 lw a5,-72(s0) + 3000c9e: 83c1 srli a5,a5,0x10 + 3000ca0: 86be mv a3,a5 + 3000ca2: 6785 lui a5,0x1 + 3000ca4: 17fd addi a5,a5,-1 # fff + 3000ca6: 8ff5 and a5,a5,a3 + 3000ca8: 01079613 slli a2,a5,0x10 + 3000cac: 8241 srli a2,a2,0x10 + 3000cae: 6785 lui a5,0x1 + 3000cb0: 973e add a4,a4,a5 + 3000cb2: 83072783 lw a5,-2000(a4) # 17fff830 + 3000cb6: 6685 lui a3,0x1 + 3000cb8: 16fd addi a3,a3,-1 # fff + 3000cba: 8ef1 and a3,a3,a2 + 3000cbc: 767d lui a2,0xfffff + 3000cbe: 8ff1 and a5,a5,a2 + 3000cc0: 8fd5 or a5,a5,a3 + 3000cc2: 82f72823 sw a5,-2000(a4) +} + 3000cc6: 0001 nop + 3000cc8: 40f6 lw ra,92(sp) + 3000cca: 4466 lw s0,88(sp) + 3000ccc: 6125 addi sp,sp,96 + 3000cce: 8082 ret + +03000cd0 : + 3000cd0: 3760006f j 3001046 + +03000cd4 : + * @brief Parameter calibration entry of the analog module. + * @param None + * @retval None + */ +void ANATRIM_Entry(void) +{ + 3000cd4: 1141 addi sp,sp,-16 + 3000cd6: c606 sw ra,12(sp) + 3000cd8: c422 sw s0,8(sp) + 3000cda: 0800 addi s0,sp,16 + if (CHIP_GetInfo() == false) { /* If the chip information is incorrect, calibration is not performed */ + 3000cdc: 3c79 jal ra,300077a + 3000cde: 87aa mv a5,a0 + 3000ce0: 0017c793 xori a5,a5,1 + 3000ce4: 9f81 uxtb a5 + 3000ce6: eb9d bnez a5,3000d1c + return; + } + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_ENABLE); /* Enable the clock for calibration */ + 3000ce8: 4585 li a1,1 + 3000cea: 18000537 lui a0,0x18000 + 3000cee: 2849 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_ENABLE); + 3000cf0: 4585 li a1,1 + 3000cf2: 18200537 lui a0,0x18200 + 3000cf6: 2069 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_ENABLE); + 3000cf8: 4585 li a1,1 + 3000cfa: 18201537 lui a0,0x18201 + 3000cfe: 2049 jal ra,3000d80 + CHIP_AnalogTrim(); + 3000d00: 34d1 jal ra,30007c4 + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_DISABLE); /* The clock is disabled after calibration */ + 3000d02: 4581 li a1,0 + 3000d04: 18000537 lui a0,0x18000 + 3000d08: 28a5 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_DISABLE); + 3000d0a: 4581 li a1,0 + 3000d0c: 18200537 lui a0,0x18200 + 3000d10: 2885 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_DISABLE); + 3000d12: 4581 li a1,0 + 3000d14: 18201537 lui a0,0x18201 + 3000d18: 20a5 jal ra,3000d80 + 3000d1a: a011 j 3000d1e + return; + 3000d1c: 0001 nop + 3000d1e: 40b2 lw ra,12(sp) + 3000d20: 4422 lw s0,8(sp) + 3000d22: 0141 addi sp,sp,16 + 3000d24: 8082 ret + +03000d26 : + * @brief Set Crg Core clock select + * @param None + * @retval None + */ +void ANAVREF_Init(void) +{ + 3000d26: 1141 addi sp,sp,-16 + 3000d28: c606 sw ra,12(sp) + 3000d2a: c422 sw s0,8(sp) + 3000d2c: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(VREF_BASE, IP_CLK_ENABLE); + 3000d2e: 4585 li a1,1 + 3000d30: 18100537 lui a0,0x18100 + 3000d34: 20b1 jal ra,3000d80 + VREF->VREF_CTRL1.BIT.da_ref_temp_trim_enh = 0x1; + 3000d36: 18100737 lui a4,0x18100 + 3000d3a: 531c lw a5,32(a4) + 3000d3c: 66c1 lui a3,0x10 + 3000d3e: 8fd5 or a5,a5,a3 + 3000d40: d31c sw a5,32(a4) + VREF->VREF_CTRL0.BIT.da_ref_enh = BASE_CFG_ENABLE; + 3000d42: 18100737 lui a4,0x18100 + 3000d46: 431c lw a5,0(a4) + 3000d48: 0017e793 ori a5,a5,1 + 3000d4c: c31c sw a5,0(a4) + BASE_FUNC_DELAY_US(200); /* delay 200us */ + 3000d4e: 000f47b7 lui a5,0xf4 + 3000d52: 24078593 addi a1,a5,576 # f4240 + 3000d56: 0c800513 li a0,200 + 3000d5a: 20b5 jal ra,3000dc6 + VREF->VREF_CTRL1.BIT.da_ref_chop_enh = BASE_CFG_ENABLE; + 3000d5c: 18100737 lui a4,0x18100 + 3000d60: 531c lw a5,32(a4) + 3000d62: 0017e793 ori a5,a5,1 + 3000d66: d31c sw a5,32(a4) + BASE_FUNC_DELAY_US(40); /* delay 40us */ + 3000d68: 000f47b7 lui a5,0xf4 + 3000d6c: 24078593 addi a1,a5,576 # f4240 + 3000d70: 02800513 li a0,40 + 3000d74: 2889 jal ra,3000dc6 + 3000d76: 0001 nop + 3000d78: 40b2 lw ra,12(sp) + 3000d7a: 4422 lw s0,8(sp) + 3000d7c: 0141 addi sp,sp,16 + 3000d7e: 8082 ret + +03000d80 : + 3000d80: 57a0206f j 30032fa + +03000d84 : + * @brief Set Crg Core clock select + * @param coreClkSelect Input core clock select value + * @retval None + */ +void CRG_SetCoreClockSelect(CRG_CoreClkSelect coreClkSelect) +{ + 3000d84: 715d addi sp,sp,-80 + 3000d86: c686 sw ra,76(sp) + 3000d88: c4a2 sw s0,72(sp) + 3000d8a: 0880 addi s0,sp,80 + 3000d8c: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3000d90: 100007b7 lui a5,0x10000 + 3000d94: fcf42423 sw a5,-56(s0) + crg.coreClkSelect = coreClkSelect; + 3000d98: fbc42783 lw a5,-68(s0) + 3000d9c: fef42023 sw a5,-32(s0) + if (crg.coreClkSelect == CRG_CORE_CLK_SELECT_TCXO) { /* If an external crystal oscillator is selected. */ + 3000da0: fe042703 lw a4,-32(s0) + 3000da4: 4785 li a5,1 + 3000da6: 00f71663 bne a4,a5,3000db2 + BASE_FUNC_DELAY_MS(10); /* 10: delay 10ms, wait clokc stable. */ + 3000daa: 3e800593 li a1,1000 + 3000dae: 4529 li a0,10 + 3000db0: 2819 jal ra,3000dc6 + } + HAL_CRG_SetCoreClockSelect(&crg); + 3000db2: fc840793 addi a5,s0,-56 + 3000db6: 853e mv a0,a5 + 3000db8: 23a020ef jal ra,3002ff2 + 3000dbc: 0001 nop + 3000dbe: 40b6 lw ra,76(sp) + 3000dc0: 4426 lw s0,72(sp) + 3000dc2: 6161 addi sp,sp,80 + 3000dc4: 8082 ret + +03000dc6 : + 3000dc6: 1de0106f j 3001fa4 + +03000dca : + * @param frequence frequnce + * @param div Output Divison + * @retval None + */ +static void SetFlashDiv(unsigned int frequency, unsigned int *nreadDiv) +{ + 3000dca: 7179 addi sp,sp,-48 + 3000dcc: d622 sw s0,44(sp) + 3000dce: 1800 addi s0,sp,48 + 3000dd0: fca42e23 sw a0,-36(s0) + 3000dd4: fcb42c23 sw a1,-40(s0) + unsigned int div; + unsigned int freq = frequency; + 3000dd8: fdc42783 lw a5,-36(s0) + 3000ddc: fef42423 sw a5,-24(s0) + /* Get frequency divider of flash. */ + if (freq < FLASH_BASE_FREQ) { + 3000de0: fe842703 lw a4,-24(s0) + 3000de4: 023c37b7 lui a5,0x23c3 + 3000de8: 45f78793 addi a5,a5,1119 # 23c345f + 3000dec: 00e7e863 bltu a5,a4,3000dfc + freq = FLASH_BASE_FREQ; + 3000df0: 023c37b7 lui a5,0x23c3 + 3000df4: 46078793 addi a5,a5,1120 # 23c3460 + 3000df8: fef42423 sw a5,-24(s0) + } + /* Get the flash frequency division based on the frequency. */ + if ((freq % FLASH_BASE_FREQ) == 0) { + 3000dfc: fe842703 lw a4,-24(s0) + 3000e00: 023c37b7 lui a5,0x23c3 + 3000e04: 46078793 addi a5,a5,1120 # 23c3460 + 3000e08: 02f777b3 remu a5,a4,a5 + 3000e0c: ef81 bnez a5,3000e24 + div = freq / FLASH_BASE_FREQ; + 3000e0e: fe842703 lw a4,-24(s0) + 3000e12: 023c37b7 lui a5,0x23c3 + 3000e16: 46078793 addi a5,a5,1120 # 23c3460 + 3000e1a: 02f757b3 divu a5,a4,a5 + 3000e1e: fef42623 sw a5,-20(s0) + 3000e22: a821 j 3000e3a + } else { + div = (freq / FLASH_BASE_FREQ) + 1; + 3000e24: fe842703 lw a4,-24(s0) + 3000e28: 023c37b7 lui a5,0x23c3 + 3000e2c: 46078793 addi a5,a5,1120 # 23c3460 + 3000e30: 02f757b3 divu a5,a4,a5 + 3000e34: 0785 addi a5,a5,1 + 3000e36: fef42623 sw a5,-20(s0) + } + /* Ensure the flash frequency division is valid. */ + if (div > FLASH_MAX_DIV) { + 3000e3a: fec42703 lw a4,-20(s0) + 3000e3e: 4791 li a5,4 + 3000e40: 00e7f563 bgeu a5,a4,3000e4a + div = FLASH_MAX_DIV; + 3000e44: 4791 li a5,4 + 3000e46: fef42623 sw a5,-20(s0) + } + *nreadDiv = div; + 3000e4a: fd842783 lw a5,-40(s0) + 3000e4e: fec42703 lw a4,-20(s0) + 3000e52: c398 sw a4,0(a5) +} + 3000e54: 0001 nop + 3000e56: 5432 lw s0,44(sp) + 3000e58: 6145 addi sp,sp,48 + 3000e5a: 8082 ret + +03000e5c : + * @brief Get the Rounding up value + * @param coreClkSelect Core Clock select + * @retval Frequency of Flash + */ +static unsigned int GetFlashFreq(CRG_CoreClkSelect coreClkSelect) +{ + 3000e5c: 7179 addi sp,sp,-48 + 3000e5e: d606 sw ra,44(sp) + 3000e60: d422 sw s0,40(sp) + 3000e62: 1800 addi s0,sp,48 + 3000e64: fca42e23 sw a0,-36(s0) + unsigned int hclk; + /* Get frequency of flash. */ + switch (coreClkSelect) { + 3000e68: fdc42783 lw a5,-36(s0) + 3000e6c: 4705 li a4,1 + 3000e6e: 02e78063 beq a5,a4,3000e8e + 3000e72: 4705 li a4,1 + 3000e74: 00e7e663 bltu a5,a4,3000e80 + 3000e78: 4709 li a4,2 + 3000e7a: 02e78163 beq a5,a4,3000e9c + 3000e7e: a025 j 3000ea6 + case CRG_CORE_CLK_SELECT_HOSC: + hclk = HOSC_FREQ; + 3000e80: 017d87b7 lui a5,0x17d8 + 3000e84: 84078793 addi a5,a5,-1984 # 17d7840 + 3000e88: fef42623 sw a5,-20(s0) + break; + 3000e8c: a01d j 3000eb2 + case CRG_CORE_CLK_SELECT_TCXO: + hclk = XTRAIL_FREQ; + 3000e8e: 01c9c7b7 lui a5,0x1c9c + 3000e92: 38078793 addi a5,a5,896 # 1c9c380 + 3000e96: fef42623 sw a5,-20(s0) + break; + 3000e9a: a821 j 3000eb2 + case CRG_CORE_CLK_SELECT_PLL: + hclk = HAL_CRG_GetPllFreq(); + 3000e9c: 278020ef jal ra,3003114 + 3000ea0: fea42623 sw a0,-20(s0) + break; + 3000ea4: a039 j 3000eb2 + default: + hclk = LOSC_FREQ; + 3000ea6: 67a1 lui a5,0x8 + 3000ea8: d0078793 addi a5,a5,-768 # 7d00 + 3000eac: fef42623 sw a5,-20(s0) + break; + 3000eb0: 0001 nop + } + return hclk; + 3000eb2: fec42783 lw a5,-20(s0) +} + 3000eb6: 853e mv a0,a5 + 3000eb8: 50b2 lw ra,44(sp) + 3000eba: 5422 lw s0,40(sp) + 3000ebc: 6145 addi sp,sp,48 + 3000ebe: 8082 ret + +03000ec0 : + * @brief Set flash clock frequence base on hclk + * @param coreClkSelect core clock select + * @retval None + */ +void FLASH_ClockConfig(CRG_CoreClkSelect coreClkSelect) +{ + 3000ec0: 7179 addi sp,sp,-48 + 3000ec2: d606 sw ra,44(sp) + 3000ec4: d422 sw s0,40(sp) + 3000ec6: 1800 addi s0,sp,48 + 3000ec8: fca42e23 sw a0,-36(s0) + EFC_RegStruct *efc = EFC; + 3000ecc: 147107b7 lui a5,0x14710 + 3000ed0: fef42623 sw a5,-20(s0) + EFLASH_CLK_CFG_REG cfg; + unsigned int hclk; + unsigned int nreadDiv; + + /* Step 1: Set nread_div */ + hclk = GetFlashFreq(coreClkSelect); + 3000ed4: fdc42503 lw a0,-36(s0) + 3000ed8: 3751 jal ra,3000e5c + 3000eda: fea42423 sw a0,-24(s0) + cfg.reg = efc->EFLASH_CLK_CFG.reg; + 3000ede: fec42703 lw a4,-20(s0) + 3000ee2: 6785 lui a5,0x1 + 3000ee4: 97ba add a5,a5,a4 + 3000ee6: 9407a783 lw a5,-1728(a5) # 940 + 3000eea: fef42223 sw a5,-28(s0) + SetFlashDiv(hclk, &nreadDiv); + 3000eee: fe040793 addi a5,s0,-32 + 3000ef2: 85be mv a1,a5 + 3000ef4: fe842503 lw a0,-24(s0) + 3000ef8: 3dc9 jal ra,3000dca + cfg.BIT.nread_div = nreadDiv; + 3000efa: fe042783 lw a5,-32(s0) + 3000efe: 8bbd andi a5,a5,15 + 3000f00: 0ff7f713 andi a4,a5,255 + 3000f04: fe442783 lw a5,-28(s0) + 3000f08: 8b3d andi a4,a4,15 + 3000f0a: 0712 slli a4,a4,0x4 + 3000f0c: f0f7f793 andi a5,a5,-241 + 3000f10: 8fd9 or a5,a5,a4 + 3000f12: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f16: fe442783 lw a5,-28(s0) + 3000f1a: 00100737 lui a4,0x100 + 3000f1e: 8fd9 or a5,a5,a4 + 3000f20: fef42223 sw a5,-28(s0) + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f24: fe442783 lw a5,-28(s0) + 3000f28: 00400737 lui a4,0x400 + 3000f2c: 8fd9 or a5,a5,a4 + 3000f2e: fef42223 sw a5,-28(s0) + + /* Step 2: Wait Busclk_sw_req */ + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f32: fe442783 lw a5,-28(s0) + 3000f36: 00400737 lui a4,0x400 + 3000f3a: 8fd9 or a5,a5,a4 + 3000f3c: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f40: fe442783 lw a5,-28(s0) + 3000f44: 00100737 lui a4,0x100 + 3000f48: 8fd9 or a5,a5,a4 + 3000f4a: fef42223 sw a5,-28(s0) + efc->EFLASH_CLK_CFG.reg = cfg.reg; + 3000f4e: fe442703 lw a4,-28(s0) + 3000f52: fec42683 lw a3,-20(s0) + 3000f56: 6785 lui a5,0x1 + 3000f58: 97b6 add a5,a5,a3 + 3000f5a: 94e7a023 sw a4,-1728(a5) # 940 + while (efc->EFLASH_CLK_CFG.BIT.busclk_sw_req == BASE_CFG_SET) { + 3000f5e: 0001 nop + 3000f60: fec42703 lw a4,-20(s0) + 3000f64: 6785 lui a5,0x1 + 3000f66: 97ba add a5,a5,a4 + 3000f68: 9407a783 lw a5,-1728(a5) # 940 + 3000f6c: 83d1 srli a5,a5,0x14 + 3000f6e: 8b85 andi a5,a5,1 + 3000f70: 0ff7f713 andi a4,a5,255 + 3000f74: 4785 li a5,1 + 3000f76: fef705e3 beq a4,a5,3000f60 + ; + } + 3000f7a: 0001 nop + 3000f7c: 50b2 lw ra,44(sp) + 3000f7e: 5422 lw s0,40(sp) + 3000f80: 6145 addi sp,sp,48 + 3000f82: 8082 ret + +03000f84 : + * @brief Init the systick + * @param None + * @retval None + */ +void SYSTICK_Init(void) +{ + 3000f84: 1141 addi sp,sp,-16 + 3000f86: c622 sw s0,12(sp) + 3000f88: 0800 addi s0,sp,16 + SYSTICK->TIMER_CTRL.reg = 0; + 3000f8a: 143807b7 lui a5,0x14380 + 3000f8e: 0007a023 sw zero,0(a5) # 14380000 + SYSTICK->TIMER_CTRL.BIT.enable = 1; + 3000f92: 14380737 lui a4,0x14380 + 3000f96: 431c lw a5,0(a4) + 3000f98: 0017e793 ori a5,a5,1 + 3000f9c: c31c sw a5,0(a4) +} + 3000f9e: 0001 nop + 3000fa0: 4432 lw s0,12(sp) + 3000fa2: 0141 addi sp,sp,16 + 3000fa4: 8082 ret + +03000fa6 : + * @brief Get the Systick frep(Hz) + * @param None + * @retval Clock frep of systick(Hz) + */ +unsigned int SYSTICK_GetCRGHZ(void) +{ + 3000fa6: 1141 addi sp,sp,-16 + 3000fa8: c606 sw ra,12(sp) + 3000faa: c422 sw s0,8(sp) + 3000fac: 0800 addi s0,sp,16 + /* Get the Systick IP */ + return HAL_CRG_GetIpFreq(SYSTICK_BASE); + 3000fae: 14380537 lui a0,0x14380 + 3000fb2: 264020ef jal ra,3003216 + 3000fb6: 87aa mv a5,a0 + 3000fb8: 853e mv a0,a5 + 3000fba: 40b2 lw ra,12(sp) + 3000fbc: 4422 lw s0,8(sp) + 3000fbe: 0141 addi sp,sp,16 + 3000fc0: 8082 ret + +03000fc2 : + * @param efc Flash control register base address + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +static unsigned int FOTP_CheckReadStatus(EFC_RegStruct *efc) +{ + 3000fc2: 1101 addi sp,sp,-32 + 3000fc4: ce22 sw s0,28(sp) + 3000fc6: 1000 addi s0,sp,32 + 3000fc8: fea42623 sw a0,-20(s0) + /* Check for errors in the flash reading process. */ + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fcc: fec42783 lw a5,-20(s0) + 3000fd0: 1007a783 lw a5,256(a5) + 3000fd4: 83c1 srli a5,a5,0x10 + 3000fd6: 8b85 andi a5,a5,1 + 3000fd8: 9f81 uxtb a5 + 3000fda: e38d bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000fdc: fec42783 lw a5,-20(s0) + 3000fe0: 1007a783 lw a5,256(a5) + 3000fe4: 83cd srli a5,a5,0x13 + 3000fe6: 8b85 andi a5,a5,1 + 3000fe8: 9f81 uxtb a5 + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fea: eb89 bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_chk) { + 3000fec: fec42783 lw a5,-20(s0) + 3000ff0: 1007a783 lw a5,256(a5) + 3000ff4: 83d1 srli a5,a5,0x14 + 3000ff6: 8b85 andi a5,a5,1 + 3000ff8: 9f81 uxtb a5 + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000ffa: c3a9 beqz a5,300103c + efc->INT_CLEAR.BIT.int_clr_err_ecc_corr = BASE_CFG_SET; + 3000ffc: fec42703 lw a4,-20(s0) + 3001000: 10c72783 lw a5,268(a4) # 1438010c + 3001004: 000806b7 lui a3,0x80 + 3001008: 8fd5 or a5,a5,a3 + 300100a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_illegal = BASE_CFG_SET; + 300100e: fec42703 lw a4,-20(s0) + 3001012: 10c72783 lw a5,268(a4) + 3001016: 66c1 lui a3,0x10 + 3001018: 8fd5 or a5,a5,a3 + 300101a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_ecc_chk = BASE_CFG_SET; + 300101e: fec42703 lw a4,-20(s0) + 3001022: 10c72783 lw a5,268(a4) + 3001026: 001006b7 lui a3,0x100 + 300102a: 8fd5 or a5,a5,a3 + 300102c: 10f72623 sw a5,268(a4) + efc->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001030: fec42783 lw a5,-20(s0) + 3001034: 2007a023 sw zero,512(a5) + return BASE_STATUS_ERROR; + 3001038: 4785 li a5,1 + 300103a: a011 j 300103e + } + return BASE_STATUS_OK; + 300103c: 4781 li a5,0 +} + 300103e: 853e mv a0,a5 + 3001040: 4472 lw s0,28(sp) + 3001042: 6105 addi sp,sp,32 + 3001044: 8082 ret + +03001046 : + * @param buf Buffer of read data + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +unsigned int FOTP_InfoGet(FOTP_InfoRngType type, unsigned int index, FOTP_CommonData *buf) +{ + 3001046: 7179 addi sp,sp,-48 + 3001048: d606 sw ra,44(sp) + 300104a: d422 sw s0,40(sp) + 300104c: 1800 addi s0,sp,48 + 300104e: fca42e23 sw a0,-36(s0) + 3001052: fcb42c23 sw a1,-40(s0) + 3001056: fcc42a23 sw a2,-44(s0) + EFC_RegStruct *p = EFC; + 300105a: 147107b7 lui a5,0x14710 + 300105e: fef42423 sw a5,-24(s0) + unsigned int addr; + + if (buf == NULL) { + 3001062: fd442783 lw a5,-44(s0) + 3001066: e399 bnez a5,300106c + return BASE_STATUS_ERROR; + 3001068: 4785 li a5,1 + 300106a: aa15 j 300119e + } + + if ((type >= FOTP_INFO_MAXTYPE) || (index > FOTP_INFO_REG_MAX_ID)) { + 300106c: fdc42703 lw a4,-36(s0) + 3001070: 4785 li a5,1 + 3001072: 00e7e763 bltu a5,a4,3001080 + 3001076: fd842703 lw a4,-40(s0) + 300107a: 47e5 li a5,25 + 300107c: 00e7f463 bgeu a5,a4,3001084 + return BASE_STATUS_ERROR; + 3001080: 4785 li a5,1 + 3001082: aa31 j 300119e + } + + /* If there is a read command, return */ + if (p->EFLASH_CMD.BIT.cmd_start) { + 3001084: fe842783 lw a5,-24(s0) + 3001088: 439c lw a5,0(a5) + 300108a: 8b85 andi a5,a5,1 + 300108c: 9f81 uxtb a5 + 300108e: c399 beqz a5,3001094 + return BASE_STATUS_ERROR; + 3001090: 4785 li a5,1 + 3001092: a231 j 300119e + } + + p->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; + 3001094: fe842783 lw a5,-24(s0) + 3001098: fedcc737 lui a4,0xfedcc + 300109c: a9870713 addi a4,a4,-1384 # fedcba98 + 30010a0: 20e7a023 sw a4,512(a5) # 14710200 + + /* Configure the read command parameters and start the read command */ + addr = (type == FOTP_INFO_RNG0) ? FOTP_INFO_RNG0_BASEADDR : FOTP_INFO_RNG1_BASEADDR; + 30010a4: fdc42783 lw a5,-36(s0) + 30010a8: e781 bnez a5,30010b0 + 30010aa: 008007b7 lui a5,0x800 + 30010ae: a019 j 30010b4 + 30010b0: 008017b7 lui a5,0x801 + 30010b4: fef42223 sw a5,-28(s0) + addr += index * REG_WORDS_NUM; + 30010b8: fd842783 lw a5,-40(s0) + 30010bc: 0792 slli a5,a5,0x4 + 30010be: fe442703 lw a4,-28(s0) + 30010c2: 97ba add a5,a5,a4 + 30010c4: fef42223 sw a5,-28(s0) + p->EFLASH_ADDR.BIT.cmd_addr = addr >> 2; /* Right shift 2 bit change to word */ + 30010c8: fe442783 lw a5,-28(s0) + 30010cc: 0027d713 srli a4,a5,0x2 + 30010d0: 004007b7 lui a5,0x400 + 30010d4: 17fd addi a5,a5,-1 # 3fffff + 30010d6: 00f77633 and a2,a4,a5 + 30010da: fe842703 lw a4,-24(s0) + 30010de: 435c lw a5,4(a4) + 30010e0: 004006b7 lui a3,0x400 + 30010e4: 16fd addi a3,a3,-1 # 3fffff + 30010e6: 8ef1 and a3,a3,a2 + 30010e8: 068a slli a3,a3,0x2 + 30010ea: ff000637 lui a2,0xff000 + 30010ee: 060d addi a2,a2,3 # ff000003 + 30010f0: 8ff1 and a5,a5,a2 + 30010f2: 8fd5 or a5,a5,a3 + 30010f4: c35c sw a5,4(a4) + p->EFLASH_CMD.BIT.cmd_code = FLASH_OPERATION_READ; + 30010f6: fe842703 lw a4,-24(s0) + 30010fa: 431c lw a5,0(a4) + 30010fc: 8ff7f793 andi a5,a5,-1793 + 3001100: 1007e793 ori a5,a5,256 + 3001104: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_read_size = FLASH_READ_128BIT; + 3001106: fe842703 lw a4,-24(s0) + 300110a: 431c lw a5,0(a4) + 300110c: d00006b7 lui a3,0xd0000 + 3001110: 16fd addi a3,a3,-1 # cfffffff + 3001112: 8efd and a3,a3,a5 + 3001114: 100007b7 lui a5,0x10000 + 3001118: 8fd5 or a5,a5,a3 + 300111a: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_start = BASE_CFG_SET; + 300111c: fe842703 lw a4,-24(s0) + 3001120: 431c lw a5,0(a4) + 3001122: 0017e793 ori a5,a5,1 + 3001126: c31c sw a5,0(a4) + + while (p->EFLASH_CMD.BIT.cmd_start) { + 3001128: 0001 nop + 300112a: fe842783 lw a5,-24(s0) + 300112e: 439c lw a5,0(a5) + 3001130: 8b85 andi a5,a5,1 + 3001132: 9f81 uxtb a5 + 3001134: fbfd bnez a5,300112a + ; + } + while (p->EFLASH_CMD.BIT.exec_state) { + 3001136: 0001 nop + 3001138: fe842783 lw a5,-24(s0) + 300113c: 439c lw a5,0(a5) + 300113e: 8399 srli a5,a5,0x6 + 3001140: 8b8d andi a5,a5,3 + 3001142: 9f81 uxtb a5 + 3001144: fbf5 bnez a5,3001138 + ; + } + /* read error, clear interrupt and return */ + if (FOTP_CheckReadStatus(p) != BASE_STATUS_OK) { + 3001146: fe842503 lw a0,-24(s0) + 300114a: 3da5 jal ra,3000fc2 + 300114c: 87aa mv a5,a0 + 300114e: c399 beqz a5,3001154 + return BASE_STATUS_ERROR; + 3001150: 4785 li a5,1 + 3001152: a0b1 j 300119e + } + /* Read data from FIFO to buffer */ + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001154: fe042623 sw zero,-20(s0) + 3001158: a00d j 300117a + buf->data[i] = p->FLASH_RDATA; + 300115a: fe842783 lw a5,-24(s0) + 300115e: 6007a703 lw a4,1536(a5) # 10000600 + 3001162: fd442683 lw a3,-44(s0) + 3001166: fec42783 lw a5,-20(s0) + 300116a: 078a slli a5,a5,0x2 + 300116c: 97b6 add a5,a5,a3 + 300116e: c398 sw a4,0(a5) + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001170: fec42783 lw a5,-20(s0) + 3001174: 0785 addi a5,a5,1 + 3001176: fef42623 sw a5,-20(s0) + 300117a: fec42703 lw a4,-20(s0) + 300117e: 478d li a5,3 + 3001180: fce7fde3 bgeu a5,a4,300115a + } + p->INT_CLEAR.BIT.int_clr_finish = BASE_CFG_SET; + 3001184: fe842703 lw a4,-24(s0) + 3001188: 10c72783 lw a5,268(a4) + 300118c: 0107e793 ori a5,a5,16 + 3001190: 10f72623 sw a5,268(a4) + p->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001194: fe842783 lw a5,-24(s0) + 3001198: 2007a023 sw zero,512(a5) + return BASE_STATUS_OK; + 300119c: 4781 li a5,0 + 300119e: 853e mv a0,a5 + 30011a0: 50b2 lw ra,44(sp) + 30011a2: 5422 lw s0,40(sp) + 30011a4: 6145 addi sp,sp,48 + 30011a6: 8082 ret + +030011a8 : + * @param baseAddr The ip base address + * @retval The Address(offset) in g_crgIpMatch if match success + * @retval 0 if match fail + */ +CHIP_CrgIpMatchInfo *GetCrgIpMatchInfo(const void *baseAddr) +{ + 30011a8: 7179 addi sp,sp,-48 + 30011aa: d622 sw s0,44(sp) + 30011ac: 1800 addi s0,sp,48 + 30011ae: fca42e23 sw a0,-36(s0) + unsigned int i; + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011b2: fe042623 sw zero,-20(s0) + 30011b6: a081 j 30011f6 + if (baseAddr == g_crgIpMatch[i].ipBaseAddr) { + 30011b8: 030067b7 lui a5,0x3006 + 30011bc: 20078713 addi a4,a5,512 # 3006200 + 30011c0: fec42683 lw a3,-20(s0) + 30011c4: 47b1 li a5,12 + 30011c6: 02f687b3 mul a5,a3,a5 + 30011ca: 97ba add a5,a5,a4 + 30011cc: 439c lw a5,0(a5) + 30011ce: fdc42703 lw a4,-36(s0) + 30011d2: 00f71d63 bne a4,a5,30011ec + return (CHIP_CrgIpMatchInfo *)&g_crgIpMatch[i]; + 30011d6: fec42703 lw a4,-20(s0) + 30011da: 47b1 li a5,12 + 30011dc: 02f70733 mul a4,a4,a5 + 30011e0: 030067b7 lui a5,0x3006 + 30011e4: 20078793 addi a5,a5,512 # 3006200 + 30011e8: 97ba add a5,a5,a4 + 30011ea: a829 j 3001204 + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011ec: fec42783 lw a5,-20(s0) + 30011f0: 0785 addi a5,a5,1 + 30011f2: fef42623 sw a5,-20(s0) + 30011f6: fec42703 lw a4,-20(s0) + 30011fa: 02d00793 li a5,45 + 30011fe: fae7fde3 bgeu a5,a4,30011b8 + } + } + return (CHIP_CrgIpMatchInfo *)0; /* The base address does not match, return 0. */ + 3001202: 4781 li a5,0 +} + 3001204: 853e mv a0,a5 + 3001206: 5432 lw s0,44(sp) + 3001208: 6145 addi sp,sp,48 + 300120a: 8082 ret + +0300120c : + * @brief Check ADC sample input. + * @param input Number of input. + * @retval bool + */ +static inline bool IsADCSampleChannel(ADC_Input input) +{ + 300120c: 1101 addi sp,sp,-32 + 300120e: ce22 sw s0,28(sp) + 3001210: 1000 addi s0,sp,32 + 3001212: fea42623 sw a0,-20(s0) + return (input >= ADC_CH_ADCINA0) && (input <= ADC_CH_ADCINA19); + 3001216: fec42783 lw a5,-20(s0) + 300121a: 0147b793 sltiu a5,a5,20 + 300121e: 9f81 uxtb a5 +} + 3001220: 853e mv a0,a5 + 3001222: 4472 lw s0,28(sp) + 3001224: 6105 addi sp,sp,32 + 3001226: 8082 ret + +03001228 : + * are configured through the SOC. + * @param soc Number of SOC. + * @retval bool + */ +static inline bool IsADCSOCx(ADC_SOCNumber soc) +{ + 3001228: 1101 addi sp,sp,-32 + 300122a: ce22 sw s0,28(sp) + 300122c: 1000 addi s0,sp,32 + 300122e: fea42623 sw a0,-20(s0) + return (soc >= ADC_SOC_NUM0) && (soc <= ADC_SOC_NUM15); + 3001232: fec42783 lw a5,-20(s0) + 3001236: 0107b793 sltiu a5,a5,16 + 300123a: 9f81 uxtb a5 +} + 300123c: 853e mv a0,a5 + 300123e: 4472 lw s0,28(sp) + 3001240: 6105 addi sp,sp,32 + 3001242: 8082 ret + +03001244 : + * @brief Check ADC interrupt parameter. + * @param intx Number of interrupt. + * @retval bool + */ +static inline bool IsADCIntx(ADC_IntNumber intx) +{ + 3001244: 1101 addi sp,sp,-32 + 3001246: ce22 sw s0,28(sp) + 3001248: 1000 addi s0,sp,32 + 300124a: fea42623 sw a0,-20(s0) + return (intx >= ADC_INT_NUMBER0) && (intx <= ADC_INT_NUMBER3); + 300124e: fec42783 lw a5,-20(s0) + 3001252: 0047b793 sltiu a5,a5,4 + 3001256: 9f81 uxtb a5 +} + 3001258: 853e mv a0,a5 + 300125a: 4472 lw s0,28(sp) + 300125c: 6105 addi sp,sp,32 + 300125e: 8082 ret + +03001260 : + * @brief Check SOC trigger source. + * @param trig Type of trigger source. + * @retval bool + */ +static inline bool IsADCTrigSource(ADC_TrigSource trig) +{ + 3001260: 1101 addi sp,sp,-32 + 3001262: ce22 sw s0,28(sp) + 3001264: 1000 addi s0,sp,32 + 3001266: fea42623 sw a0,-20(s0) + return (trig >= ADC_TRIGSOC_SOFT) && (trig <= ADC_TRIGSOC_GPIOPF1); + 300126a: fec42783 lw a5,-20(s0) + 300126e: 0157b793 sltiu a5,a5,21 + 3001272: 9f81 uxtb a5 +} + 3001274: 853e mv a0,a5 + 3001276: 4472 lw s0,28(sp) + 3001278: 6105 addi sp,sp,32 + 300127a: 8082 ret + +0300127c : + * @brief Check mode of completion of SOC sample + * @param mode Type of completion. + * @retval bool + */ +static inline bool IsADCFinishMode(ADC_SOCFinishMode mode) +{ + 300127c: 1101 addi sp,sp,-32 + 300127e: ce22 sw s0,28(sp) + 3001280: 1000 addi s0,sp,32 + 3001282: fea42623 sw a0,-20(s0) + return (mode >= ADC_SOCFINISH_NONE) && (mode <= ADC_SOCFINISH_INT3); + 3001286: fec42783 lw a5,-20(s0) + 300128a: cb81 beqz a5,300129a + 300128c: fec42703 lw a4,-20(s0) + 3001290: 4799 li a5,6 + 3001292: 00e7e463 bltu a5,a4,300129a + 3001296: 4785 li a5,1 + 3001298: a011 j 300129c + 300129a: 4781 li a5,0 + 300129c: 8b85 andi a5,a5,1 + 300129e: 9f81 uxtb a5 +} + 30012a0: 853e mv a0,a5 + 30012a2: 4472 lw s0,28(sp) + 30012a4: 6105 addi sp,sp,32 + 30012a6: 8082 ret + +030012a8 : + * @brief Check ADC sample priority parameter. + * @param mode Priority mode of SOC. + * @retval bool + */ +static inline bool IsADCPriorityMode(ADC_PriorityMode mode) +{ + 30012a8: 1101 addi sp,sp,-32 + 30012aa: ce22 sw s0,28(sp) + 30012ac: 1000 addi s0,sp,32 + 30012ae: fea42623 sw a0,-20(s0) + return (mode >= ADC_PRIMODE_ALL_ROUND) && (mode <= ADC_PRIMODE_ALL_PRIORITY); + 30012b2: fec42703 lw a4,-20(s0) + 30012b6: 67c1 lui a5,0x10 + 30012b8: 00f737b3 sltu a5,a4,a5 + 30012bc: 9f81 uxtb a5 +} + 30012be: 853e mv a0,a5 + 30012c0: 4472 lw s0,28(sp) + 30012c2: 6105 addi sp,sp,32 + 30012c4: 8082 ret + +030012c6 : + * @brief Check time of total ADC sampling time. + * @param acqps Time of total ADC sampling time. + * @retval bool + */ +static inline bool IsADCTotalTime(unsigned int acqps) +{ + 30012c6: 1101 addi sp,sp,-32 + 30012c8: ce22 sw s0,28(sp) + 30012ca: 1000 addi s0,sp,32 + 30012cc: fea42623 sw a0,-20(s0) + return (acqps <= ADC_SOCSAMPLE_500CLK); + 30012d0: fec42783 lw a5,-20(s0) + 30012d4: 0107b793 sltiu a5,a5,16 + 30012d8: 9f81 uxtb a5 +} + 30012da: 853e mv a0,a5 + 30012dc: 4472 lw s0,28(sp) + 30012de: 6105 addi sp,sp,32 + 30012e0: 8082 ret + +030012e2 : + * @brief Enable AVDD/3 Channal. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_EnableAvddChannel(ADC_RegStruct * const adcx) +{ + 30012e2: 1101 addi sp,sp,-32 + 30012e4: ce06 sw ra,28(sp) + 30012e6: cc22 sw s0,24(sp) + 30012e8: 1000 addi s0,sp,32 + 30012ea: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30012ee: fec42703 lw a4,-20(s0) + 30012f2: 180007b7 lui a5,0x18000 + 30012f6: 00f70b63 beq a4,a5,300130c + 30012fa: 6785 lui a5,0x1 + 30012fc: 86278593 addi a1,a5,-1950 # 862 + 3001300: 030067b7 lui a5,0x3006 + 3001304: 42878513 addi a0,a5,1064 # 3006428 + 3001308: 2b0d jal ra,300183a + 300130a: a001 j 300130a + adcx->ADC_AVDD_EN.BIT.cfg_avdd_en = true; + 300130c: fec42703 lw a4,-20(s0) + 3001310: 65872783 lw a5,1624(a4) + 3001314: 0017e793 ori a5,a5,1 + 3001318: 64f72c23 sw a5,1624(a4) +} + 300131c: 0001 nop + 300131e: 40f2 lw ra,28(sp) + 3001320: 4462 lw s0,24(sp) + 3001322: 6105 addi sp,sp,32 + 3001324: 8082 ret + +03001326 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt0(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001326: 7179 addi sp,sp,-48 + 3001328: d606 sw ra,44(sp) + 300132a: d422 sw s0,40(sp) + 300132c: 1800 addi s0,sp,48 + 300132e: fca42e23 sw a0,-36(s0) + 3001332: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001336: fdc42703 lw a4,-36(s0) + 300133a: 180007b7 lui a5,0x18000 + 300133e: 00f70b63 beq a4,a5,3001354 + 3001342: 6785 lui a5,0x1 + 3001344: 87978593 addi a1,a5,-1927 # 879 + 3001348: 030067b7 lui a5,0x3006 + 300134c: 42878513 addi a0,a5,1064 # 3006428 + 3001350: 21ed jal ra,300183a + 3001352: a001 j 3001352 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 3001354: fd842503 lw a0,-40(s0) + 3001358: 3dc1 jal ra,3001228 + 300135a: 87aa mv a5,a0 + 300135c: 0017c793 xori a5,a5,1 + 3001360: 9f81 uxtb a5 + 3001362: cb91 beqz a5,3001376 + 3001364: 6785 lui a5,0x1 + 3001366: 87a78593 addi a1,a5,-1926 # 87a + 300136a: 030067b7 lui a5,0x3006 + 300136e: 42878513 addi a0,a5,1064 # 3006428 + 3001372: 21e1 jal ra,300183a + 3001374: a01d j 300139a + unsigned int shiftBit = (unsigned int)socx; + 3001376: fd842783 lw a5,-40(s0) + 300137a: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 300137e: fdc42783 lw a5,-36(s0) + 3001382: 2b07a703 lw a4,688(a5) + 3001386: 4685 li a3,1 + 3001388: fec42783 lw a5,-20(s0) + 300138c: 00f697b3 sll a5,a3,a5 + 3001390: 8f5d or a4,a4,a5 + 3001392: fdc42783 lw a5,-36(s0) + 3001396: 2ae7a823 sw a4,688(a5) +} + 300139a: 50b2 lw ra,44(sp) + 300139c: 5422 lw s0,40(sp) + 300139e: 6145 addi sp,sp,48 + 30013a0: 8082 ret + +030013a2 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt1(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30013a2: 7179 addi sp,sp,-48 + 30013a4: d606 sw ra,44(sp) + 30013a6: d422 sw s0,40(sp) + 30013a8: 1800 addi s0,sp,48 + 30013aa: fca42e23 sw a0,-36(s0) + 30013ae: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30013b2: fdc42703 lw a4,-36(s0) + 30013b6: 180007b7 lui a5,0x18000 + 30013ba: 00f70b63 beq a4,a5,30013d0 + 30013be: 6785 lui a5,0x1 + 30013c0: 89478593 addi a1,a5,-1900 # 894 + 30013c4: 030067b7 lui a5,0x3006 + 30013c8: 42878513 addi a0,a5,1064 # 3006428 + 30013cc: 21bd jal ra,300183a + 30013ce: a001 j 30013ce + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30013d0: fd842503 lw a0,-40(s0) + 30013d4: 3d91 jal ra,3001228 + 30013d6: 87aa mv a5,a0 + 30013d8: 0017c793 xori a5,a5,1 + 30013dc: 9f81 uxtb a5 + 30013de: cb91 beqz a5,30013f2 + 30013e0: 6785 lui a5,0x1 + 30013e2: 89578593 addi a1,a5,-1899 # 895 + 30013e6: 030067b7 lui a5,0x3006 + 30013ea: 42878513 addi a0,a5,1064 # 3006428 + 30013ee: 21b1 jal ra,300183a + 30013f0: a025 j 3001418 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30013f2: fd842783 lw a5,-40(s0) + 30013f6: 07c1 addi a5,a5,16 + 30013f8: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 30013fc: fdc42783 lw a5,-36(s0) + 3001400: 2b07a703 lw a4,688(a5) + 3001404: 4685 li a3,1 + 3001406: fec42783 lw a5,-20(s0) + 300140a: 00f697b3 sll a5,a3,a5 + 300140e: 8f5d or a4,a4,a5 + 3001410: fdc42783 lw a5,-36(s0) + 3001414: 2ae7a823 sw a4,688(a5) +} + 3001418: 50b2 lw ra,44(sp) + 300141a: 5422 lw s0,40(sp) + 300141c: 6145 addi sp,sp,48 + 300141e: 8082 ret + +03001420 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt2(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001420: 7179 addi sp,sp,-48 + 3001422: d606 sw ra,44(sp) + 3001424: d422 sw s0,40(sp) + 3001426: 1800 addi s0,sp,48 + 3001428: fca42e23 sw a0,-36(s0) + 300142c: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001430: fdc42703 lw a4,-36(s0) + 3001434: 180007b7 lui a5,0x18000 + 3001438: 00f70b63 beq a4,a5,300144e + 300143c: 6785 lui a5,0x1 + 300143e: 8af78593 addi a1,a5,-1873 # 8af + 3001442: 030067b7 lui a5,0x3006 + 3001446: 42878513 addi a0,a5,1064 # 3006428 + 300144a: 2ec5 jal ra,300183a + 300144c: a001 j 300144c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300144e: fd842503 lw a0,-40(s0) + 3001452: 3bd9 jal ra,3001228 + 3001454: 87aa mv a5,a0 + 3001456: 0017c793 xori a5,a5,1 + 300145a: 9f81 uxtb a5 + 300145c: cb91 beqz a5,3001470 + 300145e: 6785 lui a5,0x1 + 3001460: 8b078593 addi a1,a5,-1872 # 8b0 + 3001464: 030067b7 lui a5,0x3006 + 3001468: 42878513 addi a0,a5,1064 # 3006428 + 300146c: 26f9 jal ra,300183a + 300146e: a01d j 3001494 + unsigned int shiftBit = (unsigned int)socx; + 3001470: fd842783 lw a5,-40(s0) + 3001474: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 3001478: fdc42783 lw a5,-36(s0) + 300147c: 2b47a703 lw a4,692(a5) + 3001480: 4685 li a3,1 + 3001482: fec42783 lw a5,-20(s0) + 3001486: 00f697b3 sll a5,a3,a5 + 300148a: 8f5d or a4,a4,a5 + 300148c: fdc42783 lw a5,-36(s0) + 3001490: 2ae7aa23 sw a4,692(a5) +} + 3001494: 50b2 lw ra,44(sp) + 3001496: 5422 lw s0,40(sp) + 3001498: 6145 addi sp,sp,48 + 300149a: 8082 ret + +0300149c : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt3(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300149c: 7179 addi sp,sp,-48 + 300149e: d606 sw ra,44(sp) + 30014a0: d422 sw s0,40(sp) + 30014a2: 1800 addi s0,sp,48 + 30014a4: fca42e23 sw a0,-36(s0) + 30014a8: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30014ac: fdc42703 lw a4,-36(s0) + 30014b0: 180007b7 lui a5,0x18000 + 30014b4: 00f70b63 beq a4,a5,30014ca + 30014b8: 6785 lui a5,0x1 + 30014ba: 8ca78593 addi a1,a5,-1846 # 8ca + 30014be: 030067b7 lui a5,0x3006 + 30014c2: 42878513 addi a0,a5,1064 # 3006428 + 30014c6: 2e95 jal ra,300183a + 30014c8: a001 j 30014c8 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30014ca: fd842503 lw a0,-40(s0) + 30014ce: 3ba9 jal ra,3001228 + 30014d0: 87aa mv a5,a0 + 30014d2: 0017c793 xori a5,a5,1 + 30014d6: 9f81 uxtb a5 + 30014d8: cb91 beqz a5,30014ec + 30014da: 6785 lui a5,0x1 + 30014dc: 8cb78593 addi a1,a5,-1845 # 8cb + 30014e0: 030067b7 lui a5,0x3006 + 30014e4: 42878513 addi a0,a5,1064 # 3006428 + 30014e8: 2e89 jal ra,300183a + 30014ea: a025 j 3001512 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30014ec: fd842783 lw a5,-40(s0) + 30014f0: 07c1 addi a5,a5,16 + 30014f2: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 30014f6: fdc42783 lw a5,-36(s0) + 30014fa: 2b47a703 lw a4,692(a5) + 30014fe: 4685 li a3,1 + 3001500: fec42783 lw a5,-20(s0) + 3001504: 00f697b3 sll a5,a3,a5 + 3001508: 8f5d or a4,a4,a5 + 300150a: fdc42783 lw a5,-36(s0) + 300150e: 2ae7aa23 sw a4,692(a5) +} + 3001512: 50b2 lw ra,44(sp) + 3001514: 5422 lw s0,40(sp) + 3001516: 6145 addi sp,sp,48 + 3001518: 8082 ret + +0300151a : + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + 300151a: 1101 addi sp,sp,-32 + 300151c: ce06 sw ra,28(sp) + 300151e: cc22 sw s0,24(sp) + 3001520: 1000 addi s0,sp,32 + 3001522: fea42623 sw a0,-20(s0) + 3001526: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300152a: fec42703 lw a4,-20(s0) + 300152e: 180007b7 lui a5,0x18000 + 3001532: 00f70b63 beq a4,a5,3001548 + 3001536: 6785 lui a5,0x1 + 3001538: 8e578593 addi a1,a5,-1819 # 8e5 + 300153c: 030067b7 lui a5,0x3006 + 3001540: 42878513 addi a0,a5,1064 # 3006428 + 3001544: 2cdd jal ra,300183a + 3001546: a001 j 3001546 + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + 3001548: fe842503 lw a0,-24(s0) + 300154c: 39e5 jal ra,3001244 + 300154e: 87aa mv a5,a0 + 3001550: 0017c793 xori a5,a5,1 + 3001554: 9f81 uxtb a5 + 3001556: cb91 beqz a5,300156a + 3001558: 6785 lui a5,0x1 + 300155a: 8e678593 addi a1,a5,-1818 # 8e6 + 300155e: 030067b7 lui a5,0x3006 + 3001562: 42878513 addi a0,a5,1064 # 3006428 + 3001566: 2cd1 jal ra,300183a + 3001568: a839 j 3001586 + adcx->ADC_DATA_FLAG_MASK.reg |= (1U << (unsigned int)intx); + 300156a: fec42783 lw a5,-20(s0) + 300156e: 2c07a703 lw a4,704(a5) + 3001572: 4685 li a3,1 + 3001574: fe842783 lw a5,-24(s0) + 3001578: 00f697b3 sll a5,a3,a5 + 300157c: 8f5d or a4,a4,a5 + 300157e: fec42783 lw a5,-20(s0) + 3001582: 2ce7a023 sw a4,704(a5) +} + 3001586: 40f2 lw ra,28(sp) + 3001588: 4462 lw s0,24(sp) + 300158a: 6105 addi sp,sp,32 + 300158c: 8082 ret + +0300158e : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval addr, the base address of the SOC registers. + */ +static unsigned int ADC_GetCTRLAddr(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300158e: 7179 addi sp,sp,-48 + 3001590: d622 sw s0,44(sp) + 3001592: 1800 addi s0,sp,48 + 3001594: fca42e23 sw a0,-36(s0) + 3001598: fcb42c23 sw a1,-40(s0) + unsigned int addr; + addr = (uintptr_t)(void *)&(adcx->ADC_SOC0_CFG); + 300159c: fdc42783 lw a5,-36(s0) + 30015a0: 10078793 addi a5,a5,256 + 30015a4: fef42623 sw a5,-20(s0) + addr += ((unsigned int)socx * 4); /* Register base address difference 4 */ + 30015a8: fd842783 lw a5,-40(s0) + 30015ac: 078a slli a5,a5,0x2 + 30015ae: fec42703 lw a4,-20(s0) + 30015b2: 97ba add a5,a5,a4 + 30015b4: fef42623 sw a5,-20(s0) + return addr; + 30015b8: fec42783 lw a5,-20(s0) +} + 30015bc: 853e mv a0,a5 + 30015be: 5432 lw s0,44(sp) + 30015c0: 6145 addi sp,sp,48 + 30015c2: 8082 ret + +030015c4 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param input ADC input, @ref ADC_Input. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelectChannel(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_Input input) +{ + 30015c4: 7179 addi sp,sp,-48 + 30015c6: d606 sw ra,44(sp) + 30015c8: d422 sw s0,40(sp) + 30015ca: 1800 addi s0,sp,48 + 30015cc: fca42e23 sw a0,-36(s0) + 30015d0: fcb42c23 sw a1,-40(s0) + 30015d4: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30015d8: fdc42703 lw a4,-36(s0) + 30015dc: 180007b7 lui a5,0x18000 + 30015e0: 00f70b63 beq a4,a5,30015f6 + 30015e4: 6785 lui a5,0x1 + 30015e6: 91c78593 addi a1,a5,-1764 # 91c + 30015ea: 030067b7 lui a5,0x3006 + 30015ee: 42878513 addi a0,a5,1064 # 3006428 + 30015f2: 24a1 jal ra,300183a + 30015f4: a001 j 30015f4 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCSampleChannel(input)); + 30015f6: fd842503 lw a0,-40(s0) + 30015fa: 313d jal ra,3001228 + 30015fc: 87aa mv a5,a0 + 30015fe: 0017c793 xori a5,a5,1 + 3001602: 9f81 uxtb a5 + 3001604: eb89 bnez a5,3001616 + 3001606: fd442503 lw a0,-44(s0) + 300160a: 3109 jal ra,300120c + 300160c: 87aa mv a5,a0 + 300160e: 0017c793 xori a5,a5,1 + 3001612: 9f81 uxtb a5 + 3001614: cb91 beqz a5,3001628 + 3001616: 6785 lui a5,0x1 + 3001618: 91d78593 addi a1,a5,-1763 # 91d + 300161c: 030067b7 lui a5,0x3006 + 3001620: 42878513 addi a0,a5,1064 # 3006428 + 3001624: 2c19 jal ra,300183a + 3001626: a091 j 300166a + ADC_SOC0_CFG_REG *soc = NULL; + 3001628: fe042623 sw zero,-20(s0) + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Get the Address After Translation */ + 300162c: fd842583 lw a1,-40(s0) + 3001630: fdc42503 lw a0,-36(s0) + 3001634: 3fa9 jal ra,300158e + 3001636: fea42423 sw a0,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 300163a: fe842783 lw a5,-24(s0) + 300163e: fef42623 sw a5,-20(s0) + soc->BIT.cfg_soc0_ch_sel = (unsigned int)input; + 3001642: fd442783 lw a5,-44(s0) + 3001646: 8bfd andi a5,a5,31 + 3001648: 0ff7f693 andi a3,a5,255 + 300164c: fec42703 lw a4,-20(s0) + 3001650: 431c lw a5,0(a4) + 3001652: 8afd andi a3,a3,31 + 3001654: 9b81 andi a5,a5,-32 + 3001656: 8fd5 or a5,a5,a3 + 3001658: c31c sw a5,0(a4) + if (input == ADC_CH_ADCINA18) { + 300165a: fd442703 lw a4,-44(s0) + 300165e: 47c9 li a5,18 + 3001660: 00f71563 bne a4,a5,300166a + DCL_ADC_EnableAvddChannel(adcx); + 3001664: fdc42503 lw a0,-36(s0) + 3001668: 39ad jal ra,30012e2 + } +} + 300166a: 50b2 lw ra,44(sp) + 300166c: 5422 lw s0,40(sp) + 300166e: 6145 addi sp,sp,48 + 3001670: 8082 ret + +03001672 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param trig Source of trigger, @ref ADC_TrigSource. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelcetTrigSource(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_TrigSource trig) +{ + 3001672: 7179 addi sp,sp,-48 + 3001674: d606 sw ra,44(sp) + 3001676: d422 sw s0,40(sp) + 3001678: 1800 addi s0,sp,48 + 300167a: fca42e23 sw a0,-36(s0) + 300167e: fcb42c23 sw a1,-40(s0) + 3001682: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001686: fdc42703 lw a4,-36(s0) + 300168a: 180007b7 lui a5,0x18000 + 300168e: 00f70b63 beq a4,a5,30016a4 + 3001692: 6785 lui a5,0x1 + 3001694: 93078593 addi a1,a5,-1744 # 930 + 3001698: 030067b7 lui a5,0x3006 + 300169c: 42878513 addi a0,a5,1064 # 3006428 + 30016a0: 2a69 jal ra,300183a + 30016a2: a001 j 30016a2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCTrigSource(trig)); + 30016a4: fd842503 lw a0,-40(s0) + 30016a8: 3641 jal ra,3001228 + 30016aa: 87aa mv a5,a0 + 30016ac: 0017c793 xori a5,a5,1 + 30016b0: 9f81 uxtb a5 + 30016b2: eb89 bnez a5,30016c4 + 30016b4: fd442503 lw a0,-44(s0) + 30016b8: 3665 jal ra,3001260 + 30016ba: 87aa mv a5,a0 + 30016bc: 0017c793 xori a5,a5,1 + 30016c0: 9f81 uxtb a5 + 30016c2: cb91 beqz a5,30016d6 + 30016c4: 6785 lui a5,0x1 + 30016c6: 93178593 addi a1,a5,-1743 # 931 + 30016ca: 030067b7 lui a5,0x3006 + 30016ce: 42878513 addi a0,a5,1064 # 3006428 + 30016d2: 22a5 jal ra,300183a + 30016d4: a835 j 3001710 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtaining the Address for Configuring the SOC */ + 30016d6: fd842583 lw a1,-40(s0) + 30016da: fdc42503 lw a0,-36(s0) + 30016de: 3d45 jal ra,300158e + 30016e0: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 30016e4: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30016e8: fec42783 lw a5,-20(s0) + 30016ec: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_trig_sel = (unsigned int)trig; + 30016f0: fd442783 lw a5,-44(s0) + 30016f4: 8bfd andi a5,a5,31 + 30016f6: 0ff7f693 andi a3,a5,255 + 30016fa: fe842703 lw a4,-24(s0) + 30016fe: 431c lw a5,0(a4) + 3001700: 8afd andi a3,a3,31 + 3001702: 06a6 slli a3,a3,0x9 + 3001704: 7671 lui a2,0xffffc + 3001706: 1ff60613 addi a2,a2,511 # ffffc1ff + 300170a: 8ff1 and a5,a5,a2 + 300170c: 8fd5 or a5,a5,a3 + 300170e: c31c sw a5,0(a4) +} + 3001710: 50b2 lw ra,44(sp) + 3001712: 5422 lw s0,40(sp) + 3001714: 6145 addi sp,sp,48 + 3001716: 8082 ret + +03001718 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param acqps Capacitor charging time. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetAcqps(ADC_RegStruct * const adcx, ADC_SOCNumber socx, unsigned int acqps) +{ + 3001718: 7179 addi sp,sp,-48 + 300171a: d606 sw ra,44(sp) + 300171c: d422 sw s0,40(sp) + 300171e: 1800 addi s0,sp,48 + 3001720: fca42e23 sw a0,-36(s0) + 3001724: fcb42c23 sw a1,-40(s0) + 3001728: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300172c: fdc42703 lw a4,-36(s0) + 3001730: 180007b7 lui a5,0x18000 + 3001734: 00f70b63 beq a4,a5,300174a + 3001738: 6785 lui a5,0x1 + 300173a: 94178593 addi a1,a5,-1727 # 941 + 300173e: 030067b7 lui a5,0x3006 + 3001742: 42878513 addi a0,a5,1064 # 3006428 + 3001746: 28d5 jal ra,300183a + 3001748: a001 j 3001748 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300174a: fd842503 lw a0,-40(s0) + 300174e: 3ce9 jal ra,3001228 + 3001750: 87aa mv a5,a0 + 3001752: 0017c793 xori a5,a5,1 + 3001756: 9f81 uxtb a5 + 3001758: cb91 beqz a5,300176c + 300175a: 6785 lui a5,0x1 + 300175c: 94278593 addi a1,a5,-1726 # 942 + 3001760: 030067b7 lui a5,0x3006 + 3001764: 42878513 addi a0,a5,1064 # 3006428 + 3001768: 28c9 jal ra,300183a + 300176a: a891 j 30017be + ADC_PARAM_CHECK_NO_RET(acqps <= 15); /* The value of acqps ranges from 0 to 15 */ + 300176c: fd442703 lw a4,-44(s0) + 3001770: 47bd li a5,15 + 3001772: 00e7fb63 bgeu a5,a4,3001788 + 3001776: 6785 lui a5,0x1 + 3001778: 94378593 addi a1,a5,-1725 # 943 + 300177c: 030067b7 lui a5,0x3006 + 3001780: 42878513 addi a0,a5,1064 # 3006428 + 3001784: 285d jal ra,300183a + 3001786: a825 j 30017be + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); + 3001788: fd842583 lw a1,-40(s0) + 300178c: fdc42503 lw a0,-36(s0) + 3001790: 3bfd jal ra,300158e + 3001792: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 3001796: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 300179a: fec42783 lw a5,-20(s0) + 300179e: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_samptime_sel = acqps; + 30017a2: fd442783 lw a5,-44(s0) + 30017a6: 8bbd andi a5,a5,15 + 30017a8: 0ff7f693 andi a3,a5,255 + 30017ac: fe842703 lw a4,-24(s0) + 30017b0: 431c lw a5,0(a4) + 30017b2: 8abd andi a3,a3,15 + 30017b4: 0696 slli a3,a3,0x5 + 30017b6: e1f7f793 andi a5,a5,-481 + 30017ba: 8fd5 or a5,a5,a3 + 30017bc: c31c sw a5,0(a4) +} + 30017be: 50b2 lw ra,44(sp) + 30017c0: 5422 lw s0,40(sp) + 30017c2: 6145 addi sp,sp,48 + 30017c4: 8082 ret + +030017c6 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SOCxSoftTrigger(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30017c6: 1101 addi sp,sp,-32 + 30017c8: ce06 sw ra,28(sp) + 30017ca: cc22 sw s0,24(sp) + 30017cc: 1000 addi s0,sp,32 + 30017ce: fea42623 sw a0,-20(s0) + 30017d2: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30017d6: fec42703 lw a4,-20(s0) + 30017da: 180007b7 lui a5,0x18000 + 30017de: 00f70b63 beq a4,a5,30017f4 + 30017e2: 6785 lui a5,0x1 + 30017e4: 95278593 addi a1,a5,-1710 # 952 + 30017e8: 030067b7 lui a5,0x3006 + 30017ec: 42878513 addi a0,a5,1064 # 3006428 + 30017f0: 20a9 jal ra,300183a + 30017f2: a001 j 30017f2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30017f4: fe842503 lw a0,-24(s0) + 30017f8: 3c05 jal ra,3001228 + 30017fa: 87aa mv a5,a0 + 30017fc: 0017c793 xori a5,a5,1 + 3001800: 9f81 uxtb a5 + 3001802: cb91 beqz a5,3001816 + 3001804: 6785 lui a5,0x1 + 3001806: 95378593 addi a1,a5,-1709 # 953 + 300180a: 030067b7 lui a5,0x3006 + 300180e: 42878513 addi a0,a5,1064 # 3006428 + 3001812: 2d71 jal ra,3001eae + 3001814: a839 j 3001832 + adcx->ADC_SOFT_TRIG.reg |= (1U << (unsigned int)socx); + 3001816: fec42783 lw a5,-20(s0) + 300181a: 1607a703 lw a4,352(a5) + 300181e: 4685 li a3,1 + 3001820: fe842783 lw a5,-24(s0) + 3001824: 00f697b3 sll a5,a3,a5 + 3001828: 8f5d or a4,a4,a5 + 300182a: fec42783 lw a5,-20(s0) + 300182e: 16e7a023 sw a4,352(a5) +} + 3001832: 40f2 lw ra,28(sp) + 3001834: 4462 lw s0,24(sp) + 3001836: 6105 addi sp,sp,32 + 3001838: 8082 ret + +0300183a : + 300183a: 6740006f j 3001eae + +0300183e : + * @param adcx ADC register base address. + * @param priorityMode Mode of SOC priority, @ref ADC_PriorityMode. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetPriority(ADC_RegStruct * const adcx, ADC_PriorityMode priorityMode) +{ + 300183e: 1101 addi sp,sp,-32 + 3001840: ce06 sw ra,28(sp) + 3001842: cc22 sw s0,24(sp) + 3001844: 1000 addi s0,sp,32 + 3001846: fea42623 sw a0,-20(s0) + 300184a: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300184e: fec42703 lw a4,-20(s0) + 3001852: 180007b7 lui a5,0x18000 + 3001856: 00f70b63 beq a4,a5,300186c + 300185a: 6785 lui a5,0x1 + 300185c: 96c78593 addi a1,a5,-1684 # 96c + 3001860: 030067b7 lui a5,0x3006 + 3001864: 42878513 addi a0,a5,1064 # 3006428 + 3001868: 2599 jal ra,3001eae + 300186a: a001 j 300186a + ADC_PARAM_CHECK_NO_RET(IsADCPriorityMode(priorityMode)); + 300186c: fe842503 lw a0,-24(s0) + 3001870: 3c25 jal ra,30012a8 + 3001872: 87aa mv a5,a0 + 3001874: 0017c793 xori a5,a5,1 + 3001878: 9f81 uxtb a5 + 300187a: cb91 beqz a5,300188e + 300187c: 6785 lui a5,0x1 + 300187e: 96d78593 addi a1,a5,-1683 # 96d + 3001882: 030067b7 lui a5,0x3006 + 3001886: 42878513 addi a0,a5,1064 # 3006428 + 300188a: 2515 jal ra,3001eae + 300188c: a039 j 300189a + adcx->ADC_ARBT0.reg = priorityMode; + 300188e: fec42783 lw a5,-20(s0) + 3001892: fe842703 lw a4,-24(s0) + 3001896: 20e7a023 sw a4,512(a5) +} + 300189a: 40f2 lw ra,28(sp) + 300189c: 4462 lw s0,24(sp) + 300189e: 6105 addi sp,sp,32 + 30018a0: 8082 ret + +030018a2 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval unsigned int, result. + */ +static inline unsigned int DCL_ADC_ReadSOCxResult(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30018a2: 7179 addi sp,sp,-48 + 30018a4: d606 sw ra,44(sp) + 30018a6: d422 sw s0,40(sp) + 30018a8: 1800 addi s0,sp,48 + 30018aa: fca42e23 sw a0,-36(s0) + 30018ae: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30018b2: fdc42703 lw a4,-36(s0) + 30018b6: 180007b7 lui a5,0x18000 + 30018ba: 00f70b63 beq a4,a5,30018d0 + 30018be: 6785 lui a5,0x1 + 30018c0: a8778593 addi a1,a5,-1401 # a87 + 30018c4: 030067b7 lui a5,0x3006 + 30018c8: 42878513 addi a0,a5,1064 # 3006428 + 30018cc: 23cd jal ra,3001eae + 30018ce: a001 j 30018ce + ADC_ASSERT_PARAM(IsADCSOCx(socx)); + 30018d0: fd842503 lw a0,-40(s0) + 30018d4: 3a91 jal ra,3001228 + 30018d6: 87aa mv a5,a0 + 30018d8: 0017c793 xori a5,a5,1 + 30018dc: 9f81 uxtb a5 + 30018de: cb91 beqz a5,30018f2 + 30018e0: 6785 lui a5,0x1 + 30018e2: a8878593 addi a1,a5,-1400 # a88 + 30018e6: 030067b7 lui a5,0x3006 + 30018ea: 42878513 addi a0,a5,1064 # 3006428 + 30018ee: 23c1 jal ra,3001eae + 30018f0: a001 j 30018f0 + ADC_RESULT0_REG *result; + uintptr_t addr = (uintptr_t)(void *)adcx; + 30018f2: fdc42783 lw a5,-36(s0) + 30018f6: fef42623 sw a5,-20(s0) + /* The address interval of the result register is 4 */ + result = (ADC_RESULT0_REG *)(void *)(addr + 4 * (unsigned int)socx); + 30018fa: fd842783 lw a5,-40(s0) + 30018fe: 00279713 slli a4,a5,0x2 + 3001902: fec42783 lw a5,-20(s0) + 3001906: 97ba add a5,a5,a4 + 3001908: fef42423 sw a5,-24(s0) + return result->reg; + 300190c: fe842783 lw a5,-24(s0) + 3001910: 439c lw a5,0(a5) +} + 3001912: 853e mv a0,a5 + 3001914: 50b2 lw ra,44(sp) + 3001916: 5422 lw s0,40(sp) + 3001918: 6145 addi sp,sp,48 + 300191a: 8082 ret + +0300191c : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300191c: 7179 addi sp,sp,-48 + 300191e: d606 sw ra,44(sp) + 3001920: d422 sw s0,40(sp) + 3001922: 1800 addi s0,sp,48 + 3001924: fca42e23 sw a0,-36(s0) + 3001928: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300192c: fdc42703 lw a4,-36(s0) + 3001930: 180007b7 lui a5,0x18000 + 3001934: 00f70b63 beq a4,a5,300194a + 3001938: 6785 lui a5,0x1 + 300193a: b4678593 addi a1,a5,-1210 # b46 + 300193e: 030067b7 lui a5,0x3006 + 3001942: 42878513 addi a0,a5,1064 # 3006428 + 3001946: 23a5 jal ra,3001eae + 3001948: a001 j 3001948 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300194a: fd842503 lw a0,-40(s0) + 300194e: 38e9 jal ra,3001228 + 3001950: 87aa mv a5,a0 + 3001952: 0017c793 xori a5,a5,1 + 3001956: 9f81 uxtb a5 + 3001958: cb91 beqz a5,300196c + 300195a: 6785 lui a5,0x1 + 300195c: b4778593 addi a1,a5,-1209 # b47 + 3001960: 030067b7 lui a5,0x3006 + 3001964: 42878513 addi a0,a5,1064 # 3006428 + 3001968: 2399 jal ra,3001eae + 300196a: a025 j 3001992 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 300196c: fd842583 lw a1,-40(s0) + 3001970: fdc42503 lw a0,-36(s0) + 3001974: 3929 jal ra,300158e + 3001976: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 300197a: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 300197e: fec42783 lw a5,-20(s0) + 3001982: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_ENABLE; + 3001986: fe842703 lw a4,-24(s0) + 300198a: 431c lw a5,0(a4) + 300198c: 6691 lui a3,0x4 + 300198e: 8fd5 or a5,a5,a3 + 3001990: c31c sw a5,0(a4) +} + 3001992: 50b2 lw ra,44(sp) + 3001994: 5422 lw s0,40(sp) + 3001996: 6145 addi sp,sp,48 + 3001998: 8082 ret + +0300199a : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_DisableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300199a: 7179 addi sp,sp,-48 + 300199c: d606 sw ra,44(sp) + 300199e: d422 sw s0,40(sp) + 30019a0: 1800 addi s0,sp,48 + 30019a2: fca42e23 sw a0,-36(s0) + 30019a6: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30019aa: fdc42703 lw a4,-36(s0) + 30019ae: 180007b7 lui a5,0x18000 + 30019b2: 00f70b63 beq a4,a5,30019c8 + 30019b6: 6785 lui a5,0x1 + 30019b8: b5678593 addi a1,a5,-1194 # b56 + 30019bc: 030067b7 lui a5,0x3006 + 30019c0: 42878513 addi a0,a5,1064 # 3006428 + 30019c4: 21ed jal ra,3001eae + 30019c6: a001 j 30019c6 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30019c8: fd842503 lw a0,-40(s0) + 30019cc: 38b1 jal ra,3001228 + 30019ce: 87aa mv a5,a0 + 30019d0: 0017c793 xori a5,a5,1 + 30019d4: 9f81 uxtb a5 + 30019d6: cb91 beqz a5,30019ea + 30019d8: 6785 lui a5,0x1 + 30019da: b5778593 addi a1,a5,-1193 # b57 + 30019de: 030067b7 lui a5,0x3006 + 30019e2: 42878513 addi a0,a5,1064 # 3006428 + 30019e6: 21e1 jal ra,3001eae + 30019e8: a02d j 3001a12 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 30019ea: fd842583 lw a1,-40(s0) + 30019ee: fdc42503 lw a0,-36(s0) + 30019f2: 3e71 jal ra,300158e + 30019f4: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 30019f8: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30019fc: fec42783 lw a5,-20(s0) + 3001a00: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_DISABLE; + 3001a04: fe842703 lw a4,-24(s0) + 3001a08: 431c lw a5,0(a4) + 3001a0a: 76f1 lui a3,0xffffc + 3001a0c: 16fd addi a3,a3,-1 # ffffbfff + 3001a0e: 8ff5 and a5,a5,a3 + 3001a10: c31c sw a5,0(a4) +} + 3001a12: 50b2 lw ra,44(sp) + 3001a14: 5422 lw s0,40(sp) + 3001a16: 6145 addi sp,sp,48 + 3001a18: 8082 ret + +03001a1a : + * triggered at least 100 us later. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_Init(ADC_Handle *adcHandle) +{ + 3001a1a: 1101 addi sp,sp,-32 + 3001a1c: ce06 sw ra,28(sp) + 3001a1e: cc22 sw s0,24(sp) + 3001a20: 1000 addi s0,sp,32 + 3001a22: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001a26: fec42783 lw a5,-20(s0) + 3001a2a: eb89 bnez a5,3001a3c + 3001a2c: 02c00593 li a1,44 + 3001a30: 030067b7 lui a5,0x3006 + 3001a34: 44478513 addi a0,a5,1092 # 3006444 + 3001a38: 299d jal ra,3001eae + 3001a3a: a001 j 3001a3a + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001a3c: fec42783 lw a5,-20(s0) + 3001a40: 4398 lw a4,0(a5) + 3001a42: 180007b7 lui a5,0x18000 + 3001a46: 00f70a63 beq a4,a5,3001a5a + 3001a4a: 02d00593 li a1,45 + 3001a4e: 030067b7 lui a5,0x3006 + 3001a52: 44478513 addi a0,a5,1092 # 3006444 + 3001a56: 29a1 jal ra,3001eae + 3001a58: a001 j 3001a58 + ADC_PARAM_CHECK_WITH_RET(IsADCPriorityMode(adcHandle->socPriority) == true, BASE_STATUS_ERROR); + 3001a5a: fec42783 lw a5,-20(s0) + 3001a5e: 43dc lw a5,4(a5) + 3001a60: 853e mv a0,a5 + 3001a62: 3099 jal ra,30012a8 + 3001a64: 87aa mv a5,a0 + 3001a66: 0017c793 xori a5,a5,1 + 3001a6a: 9f81 uxtb a5 + 3001a6c: cb91 beqz a5,3001a80 + 3001a6e: 02e00593 li a1,46 + 3001a72: 030067b7 lui a5,0x3006 + 3001a76: 44478513 addi a0,a5,1092 # 3006444 + 3001a7a: 2915 jal ra,3001eae + 3001a7c: 4785 li a5,1 + 3001a7e: a091 j 3001ac2 + DCL_ADC_SOCxSetPriority(adcHandle->baseAddress, adcHandle->socPriority); + 3001a80: fec42783 lw a5,-20(s0) + 3001a84: 4398 lw a4,0(a5) + 3001a86: fec42783 lw a5,-20(s0) + 3001a8a: 43dc lw a5,4(a5) + 3001a8c: 85be mv a1,a5 + 3001a8e: 853a mv a0,a4 + 3001a90: 337d jal ra,300183e + adcHandle->baseAddress->ADC_ANA_CTRL0.BIT.cfg_sar_samp_cap_sel = 0x4; /* Set the Number of Sampling Capacitors */ + 3001a92: fec42783 lw a5,-20(s0) + 3001a96: 4398 lw a4,0(a5) + 3001a98: 65472783 lw a5,1620(a4) + 3001a9c: 100006b7 lui a3,0x10000 + 3001aa0: 16fd addi a3,a3,-1 # fffffff + 3001aa2: 8efd and a3,a3,a5 + 3001aa4: 400007b7 lui a5,0x40000 + 3001aa8: 8fd5 or a5,a5,a3 + 3001aaa: 64f72a23 sw a5,1620(a4) + adcHandle->baseAddress->ADC_EN.reg = BASE_CFG_ENABLE; /* Enable ADC Controller */ + 3001aae: fec42783 lw a5,-20(s0) + 3001ab2: 439c lw a5,0(a5) + 3001ab4: 4705 li a4,1 + 3001ab6: 30e7a023 sw a4,768(a5) # 40000300 + BASE_FUNC_DelayUs(100); /* Wait for 100 us until the ADC controller is stable */ + 3001aba: 06400513 li a0,100 + 3001abe: 2929 jal ra,3001ed8 + return BASE_STATUS_OK; + 3001ac0: 4781 li a5,0 +} + 3001ac2: 853e mv a0,a5 + 3001ac4: 40f2 lw ra,28(sp) + 3001ac6: 4462 lw s0,24(sp) + 3001ac8: 6105 addi sp,sp,32 + 3001aca: 8082 ret + +03001acc : + * @param soc ID of SOC(start of conversion), managing the specific sample inputs. + * @param socParam Param struct of SOC. This is related to the peripheral circuit design, @ref SOC_Param. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_ConfigureSoc(ADC_Handle *adcHandle, ADC_SOCNumber soc, SOC_Param *socParam) +{ + 3001acc: 1101 addi sp,sp,-32 + 3001ace: ce06 sw ra,28(sp) + 3001ad0: cc22 sw s0,24(sp) + 3001ad2: 1000 addi s0,sp,32 + 3001ad4: fea42623 sw a0,-20(s0) + 3001ad8: feb42423 sw a1,-24(s0) + 3001adc: fec42223 sw a2,-28(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001ae0: fec42783 lw a5,-20(s0) + 3001ae4: eb89 bnez a5,3001af6 + 3001ae6: 04c00593 li a1,76 + 3001aea: 030067b7 lui a5,0x3006 + 3001aee: 44478513 addi a0,a5,1092 # 3006444 + 3001af2: 2e75 jal ra,3001eae + 3001af4: a001 j 3001af4 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001af6: fec42783 lw a5,-20(s0) + 3001afa: 4398 lw a4,0(a5) + 3001afc: 180007b7 lui a5,0x18000 + 3001b00: 00f70a63 beq a4,a5,3001b14 + 3001b04: 04d00593 li a1,77 + 3001b08: 030067b7 lui a5,0x3006 + 3001b0c: 44478513 addi a0,a5,1092 # 3006444 + 3001b10: 2e79 jal ra,3001eae + 3001b12: a001 j 3001b12 + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001b14: fe842503 lw a0,-24(s0) + 3001b18: f10ff0ef jal ra,3001228 + 3001b1c: 87aa mv a5,a0 + 3001b1e: 0017c793 xori a5,a5,1 + 3001b22: 9f81 uxtb a5 + 3001b24: cb91 beqz a5,3001b38 + 3001b26: 04e00593 li a1,78 + 3001b2a: 030067b7 lui a5,0x3006 + 3001b2e: 44478513 addi a0,a5,1092 # 3006444 + 3001b32: 2eb5 jal ra,3001eae + 3001b34: 4785 li a5,1 + 3001b36: aa3d j 3001c74 + ADC_ASSERT_PARAM(socParam != NULL); + 3001b38: fe442783 lw a5,-28(s0) + 3001b3c: eb89 bnez a5,3001b4e + 3001b3e: 04f00593 li a1,79 + 3001b42: 030067b7 lui a5,0x3006 + 3001b46: 44478513 addi a0,a5,1092 # 3006444 + 3001b4a: 2695 jal ra,3001eae + 3001b4c: a001 j 3001b4c + ADC_PARAM_CHECK_WITH_RET(IsADCSampleChannel(socParam->adcInput) == true, BASE_STATUS_ERROR); + 3001b4e: fe442783 lw a5,-28(s0) + 3001b52: 439c lw a5,0(a5) + 3001b54: 853e mv a0,a5 + 3001b56: eb6ff0ef jal ra,300120c + 3001b5a: 87aa mv a5,a0 + 3001b5c: 0017c793 xori a5,a5,1 + 3001b60: 9f81 uxtb a5 + 3001b62: cb91 beqz a5,3001b76 + 3001b64: 05000593 li a1,80 + 3001b68: 030067b7 lui a5,0x3006 + 3001b6c: 44478513 addi a0,a5,1092 # 3006444 + 3001b70: 2e3d jal ra,3001eae + 3001b72: 4785 li a5,1 + 3001b74: a201 j 3001c74 + ADC_PARAM_CHECK_WITH_RET(IsADCTotalTime(socParam->sampleTotalTime) == true, BASE_STATUS_ERROR); + 3001b76: fe442783 lw a5,-28(s0) + 3001b7a: 43dc lw a5,4(a5) + 3001b7c: 853e mv a0,a5 + 3001b7e: f48ff0ef jal ra,30012c6 + 3001b82: 87aa mv a5,a0 + 3001b84: 0017c793 xori a5,a5,1 + 3001b88: 9f81 uxtb a5 + 3001b8a: cb91 beqz a5,3001b9e + 3001b8c: 05100593 li a1,81 + 3001b90: 030067b7 lui a5,0x3006 + 3001b94: 44478513 addi a0,a5,1092 # 3006444 + 3001b98: 2e19 jal ra,3001eae + 3001b9a: 4785 li a5,1 + 3001b9c: a8e1 j 3001c74 + ADC_PARAM_CHECK_WITH_RET(IsADCTrigSource(socParam->trigSource) == true, BASE_STATUS_ERROR); + 3001b9e: fe442783 lw a5,-28(s0) + 3001ba2: 479c lw a5,8(a5) + 3001ba4: 853e mv a0,a5 + 3001ba6: ebaff0ef jal ra,3001260 + 3001baa: 87aa mv a5,a0 + 3001bac: 0017c793 xori a5,a5,1 + 3001bb0: 9f81 uxtb a5 + 3001bb2: cb91 beqz a5,3001bc6 + 3001bb4: 05200593 li a1,82 + 3001bb8: 030067b7 lui a5,0x3006 + 3001bbc: 44478513 addi a0,a5,1092 # 3006444 + 3001bc0: 24fd jal ra,3001eae + 3001bc2: 4785 li a5,1 + 3001bc4: a845 j 3001c74 + ADC_PARAM_CHECK_WITH_RET(IsADCFinishMode(socParam->finishMode) == true, BASE_STATUS_ERROR); + 3001bc6: fe442783 lw a5,-28(s0) + 3001bca: 4b9c lw a5,16(a5) + 3001bcc: 853e mv a0,a5 + 3001bce: eaeff0ef jal ra,300127c + 3001bd2: 87aa mv a5,a0 + 3001bd4: 0017c793 xori a5,a5,1 + 3001bd8: 9f81 uxtb a5 + 3001bda: cb91 beqz a5,3001bee + 3001bdc: 05300593 li a1,83 + 3001be0: 030067b7 lui a5,0x3006 + 3001be4: 44478513 addi a0,a5,1092 # 3006444 + 3001be8: 24d9 jal ra,3001eae + 3001bea: 4785 li a5,1 + 3001bec: a061 j 3001c74 + DCL_ADC_SOCxSelectChannel(adcHandle->baseAddress, soc, socParam->adcInput); /* Set channel */ + 3001bee: fec42783 lw a5,-20(s0) + 3001bf2: 4398 lw a4,0(a5) + 3001bf4: fe442783 lw a5,-28(s0) + 3001bf8: 439c lw a5,0(a5) + 3001bfa: 863e mv a2,a5 + 3001bfc: fe842583 lw a1,-24(s0) + 3001c00: 853a mv a0,a4 + 3001c02: 32c9 jal ra,30015c4 + DCL_ADC_SOCxSetAcqps(adcHandle->baseAddress, soc, socParam->sampleTotalTime); /* Set sampling time */ + 3001c04: fec42783 lw a5,-20(s0) + 3001c08: 4398 lw a4,0(a5) + 3001c0a: fe442783 lw a5,-28(s0) + 3001c0e: 43dc lw a5,4(a5) + 3001c10: 863e mv a2,a5 + 3001c12: fe842583 lw a1,-24(s0) + 3001c16: 853a mv a0,a4 + 3001c18: 3601 jal ra,3001718 + DCL_ADC_SOCxSelcetTrigSource(adcHandle->baseAddress, soc, socParam->trigSource); /* Set trigger source */ + 3001c1a: fec42783 lw a5,-20(s0) + 3001c1e: 4398 lw a4,0(a5) + 3001c20: fe442783 lw a5,-28(s0) + 3001c24: 479c lw a5,8(a5) + 3001c26: 863e mv a2,a5 + 3001c28: fe842583 lw a1,-24(s0) + 3001c2c: 853a mv a0,a4 + 3001c2e: 3491 jal ra,3001672 + if (socParam->continueMode == true) { /* Continuous Mode Judgment */ + 3001c30: fe442783 lw a5,-28(s0) + 3001c34: 27dc lbu a5,12(a5) + 3001c36: cb89 beqz a5,3001c48 + DCL_ADC_EnableSOCxContinue(adcHandle->baseAddress, soc); + 3001c38: fec42783 lw a5,-20(s0) + 3001c3c: 439c lw a5,0(a5) + 3001c3e: fe842583 lw a1,-24(s0) + 3001c42: 853e mv a0,a5 + 3001c44: 39e1 jal ra,300191c + 3001c46: a801 j 3001c56 + } else { + DCL_ADC_DisableSOCxContinue(adcHandle->baseAddress, soc); + 3001c48: fec42783 lw a5,-20(s0) + 3001c4c: 439c lw a5,0(a5) + 3001c4e: fe842583 lw a1,-24(s0) + 3001c52: 853e mv a0,a5 + 3001c54: 3399 jal ra,300199a + } + adcHandle->ADC_SOCxParam[soc].finishMode = socParam->finishMode; + 3001c56: fe442783 lw a5,-28(s0) + 3001c5a: 4b9c lw a5,16(a5) + 3001c5c: 01079713 slli a4,a5,0x10 + 3001c60: 8341 srli a4,a4,0x10 + 3001c62: fec42683 lw a3,-20(s0) + 3001c66: fe842783 lw a5,-24(s0) + 3001c6a: 07a1 addi a5,a5,8 + 3001c6c: 0786 slli a5,a5,0x1 + 3001c6e: 97b6 add a5,a5,a3 + 3001c70: a3da sh a4,4(a5) + return BASE_STATUS_OK; + 3001c72: 4781 li a5,0 +} + 3001c74: 853e mv a0,a5 + 3001c76: 40f2 lw ra,28(sp) + 3001c78: 4462 lw s0,24(sp) + 3001c7a: 6105 addi sp,sp,32 + 3001c7c: 8082 ret + +03001c7e : + * interrupt is reported. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_StartIt(ADC_Handle *adcHandle) +{ + 3001c7e: 7179 addi sp,sp,-48 + 3001c80: d606 sw ra,44(sp) + 3001c82: d422 sw s0,40(sp) + 3001c84: 1800 addi s0,sp,48 + 3001c86: fca42e23 sw a0,-36(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001c8a: fdc42783 lw a5,-36(s0) + 3001c8e: eb89 bnez a5,3001ca0 + 3001c90: 0af00593 li a1,175 + 3001c94: 030067b7 lui a5,0x3006 + 3001c98: 44478513 addi a0,a5,1092 # 3006444 + 3001c9c: 2c09 jal ra,3001eae + 3001c9e: a001 j 3001c9e + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001ca0: fdc42783 lw a5,-36(s0) + 3001ca4: 4398 lw a4,0(a5) + 3001ca6: 180007b7 lui a5,0x18000 + 3001caa: 00f70a63 beq a4,a5,3001cbe + 3001cae: 0b000593 li a1,176 + 3001cb2: 030067b7 lui a5,0x3006 + 3001cb6: 44478513 addi a0,a5,1092 # 3006444 + 3001cba: 2ad5 jal ra,3001eae + 3001cbc: a001 j 3001cbc + unsigned int intVal = 0; + 3001cbe: fe042423 sw zero,-24(s0) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001cc2: fe042623 sw zero,-20(s0) + 3001cc6: a859 j 3001d5c + intVal = adcHandle->ADC_SOCxParam[i].finishMode; + 3001cc8: fdc42703 lw a4,-36(s0) + 3001ccc: fec42783 lw a5,-20(s0) + 3001cd0: 07a1 addi a5,a5,8 + 3001cd2: 0786 slli a5,a5,0x1 + 3001cd4: 97ba add a5,a5,a4 + 3001cd6: 23de lhu a5,4(a5) + 3001cd8: fef42423 sw a5,-24(s0) + switch (intVal) { + 3001cdc: fe842783 lw a5,-24(s0) + 3001ce0: 4711 li a4,4 + 3001ce2: 02e78a63 beq a5,a4,3001d16 + 3001ce6: 4711 li a4,4 + 3001ce8: 00f76663 bltu a4,a5,3001cf4 + 3001cec: 470d li a4,3 + 3001cee: 00e78a63 beq a5,a4,3001d02 + break; + case ADC_SOCFINISH_INT3: + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + break; + default: + break; + 3001cf2: a085 j 3001d52 + switch (intVal) { + 3001cf4: 4715 li a4,5 + 3001cf6: 02e78a63 beq a5,a4,3001d2a + 3001cfa: 4719 li a4,6 + 3001cfc: 04e78163 beq a5,a4,3001d3e + break; + 3001d00: a889 j 3001d52 + DCL_ADC_SetSOCxBlindInt0(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 0 */ + 3001d02: fdc42783 lw a5,-36(s0) + 3001d06: 439c lw a5,0(a5) + 3001d08: fec42703 lw a4,-20(s0) + 3001d0c: 85ba mv a1,a4 + 3001d0e: 853e mv a0,a5 + 3001d10: e16ff0ef jal ra,3001326 + break; + 3001d14: a83d j 3001d52 + DCL_ADC_SetSOCxBlindInt1(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 1 */ + 3001d16: fdc42783 lw a5,-36(s0) + 3001d1a: 439c lw a5,0(a5) + 3001d1c: fec42703 lw a4,-20(s0) + 3001d20: 85ba mv a1,a4 + 3001d22: 853e mv a0,a5 + 3001d24: e7eff0ef jal ra,30013a2 + break; + 3001d28: a02d j 3001d52 + DCL_ADC_SetSOCxBlindInt2(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 2 */ + 3001d2a: fdc42783 lw a5,-36(s0) + 3001d2e: 439c lw a5,0(a5) + 3001d30: fec42703 lw a4,-20(s0) + 3001d34: 85ba mv a1,a4 + 3001d36: 853e mv a0,a5 + 3001d38: ee8ff0ef jal ra,3001420 + break; + 3001d3c: a819 j 3001d52 + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + 3001d3e: fdc42783 lw a5,-36(s0) + 3001d42: 439c lw a5,0(a5) + 3001d44: fec42703 lw a4,-20(s0) + 3001d48: 85ba mv a1,a4 + 3001d4a: 853e mv a0,a5 + 3001d4c: f50ff0ef jal ra,300149c + break; + 3001d50: 0001 nop + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001d52: fec42783 lw a5,-20(s0) + 3001d56: 0785 addi a5,a5,1 + 3001d58: fef42623 sw a5,-20(s0) + 3001d5c: fec42703 lw a4,-20(s0) + 3001d60: 47bd li a5,15 + 3001d62: f6e7d3e3 bge a5,a4,3001cc8 + } + } /* Enable ADC Interrupt */ + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER0); + 3001d66: fdc42783 lw a5,-36(s0) + 3001d6a: 439c lw a5,0(a5) + 3001d6c: 4581 li a1,0 + 3001d6e: 853e mv a0,a5 + 3001d70: faaff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER1); + 3001d74: fdc42783 lw a5,-36(s0) + 3001d78: 439c lw a5,0(a5) + 3001d7a: 4585 li a1,1 + 3001d7c: 853e mv a0,a5 + 3001d7e: f9cff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + 3001d82: fdc42783 lw a5,-36(s0) + 3001d86: 439c lw a5,0(a5) + 3001d88: 4589 li a1,2 + 3001d8a: 853e mv a0,a5 + 3001d8c: f8eff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER3); + 3001d90: fdc42783 lw a5,-36(s0) + 3001d94: 439c lw a5,0(a5) + 3001d96: 458d li a1,3 + 3001d98: 853e mv a0,a5 + 3001d9a: f80ff0ef jal ra,300151a + return BASE_STATUS_OK; + 3001d9e: 4781 li a5,0 +} + 3001da0: 853e mv a0,a5 + 3001da2: 50b2 lw ra,44(sp) + 3001da4: 5422 lw s0,40(sp) + 3001da6: 6145 addi sp,sp,48 + 3001da8: 8082 ret + +03001daa : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_SoftTrigSample(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001daa: 1101 addi sp,sp,-32 + 3001dac: ce06 sw ra,28(sp) + 3001dae: cc22 sw s0,24(sp) + 3001db0: 1000 addi s0,sp,32 + 3001db2: fea42623 sw a0,-20(s0) + 3001db6: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001dba: fec42783 lw a5,-20(s0) + 3001dbe: eb89 bnez a5,3001dd0 + 3001dc0: 0e500593 li a1,229 + 3001dc4: 030067b7 lui a5,0x3006 + 3001dc8: 44478513 addi a0,a5,1092 # 3006444 + 3001dcc: 20cd jal ra,3001eae + 3001dce: a001 j 3001dce + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001dd0: fec42783 lw a5,-20(s0) + 3001dd4: 4398 lw a4,0(a5) + 3001dd6: 180007b7 lui a5,0x18000 + 3001dda: 00f70a63 beq a4,a5,3001dee + 3001dde: 0e600593 li a1,230 + 3001de2: 030067b7 lui a5,0x3006 + 3001de6: 44478513 addi a0,a5,1092 # 3006444 + 3001dea: 20d1 jal ra,3001eae + 3001dec: a001 j 3001dec + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001dee: fe842503 lw a0,-24(s0) + 3001df2: c36ff0ef jal ra,3001228 + 3001df6: 87aa mv a5,a0 + 3001df8: 0017c793 xori a5,a5,1 + 3001dfc: 9f81 uxtb a5 + 3001dfe: cb91 beqz a5,3001e12 + 3001e00: 0e700593 li a1,231 + 3001e04: 030067b7 lui a5,0x3006 + 3001e08: 44478513 addi a0,a5,1092 # 3006444 + 3001e0c: 204d jal ra,3001eae + 3001e0e: 4785 li a5,1 + 3001e10: a809 j 3001e22 + DCL_ADC_SOCxSoftTrigger(adcHandle->baseAddress, soc); /* Software triggers a single SOC */ + 3001e12: fec42783 lw a5,-20(s0) + 3001e16: 439c lw a5,0(a5) + 3001e18: fe842583 lw a1,-24(s0) + 3001e1c: 853e mv a0,a5 + 3001e1e: 3265 jal ra,30017c6 + return BASE_STATUS_OK; + 3001e20: 4781 li a5,0 +} + 3001e22: 853e mv a0,a5 + 3001e24: 40f2 lw ra,28(sp) + 3001e26: 4462 lw s0,24(sp) + 3001e28: 6105 addi sp,sp,32 + 3001e2a: 8082 ret + +03001e2c : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval unsigned int value of ADC convert result. + */ +unsigned int HAL_ADC_GetConvResult(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001e2c: 1101 addi sp,sp,-32 + 3001e2e: ce06 sw ra,28(sp) + 3001e30: cc22 sw s0,24(sp) + 3001e32: 1000 addi s0,sp,32 + 3001e34: fea42623 sw a0,-20(s0) + 3001e38: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001e3c: fec42783 lw a5,-20(s0) + 3001e40: eb89 bnez a5,3001e52 + 3001e42: 0f400593 li a1,244 + 3001e46: 030067b7 lui a5,0x3006 + 3001e4a: 44478513 addi a0,a5,1092 # 3006444 + 3001e4e: 2085 jal ra,3001eae + 3001e50: a001 j 3001e50 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001e52: fec42783 lw a5,-20(s0) + 3001e56: 4398 lw a4,0(a5) + 3001e58: 180007b7 lui a5,0x18000 + 3001e5c: 00f70a63 beq a4,a5,3001e70 + 3001e60: 0f500593 li a1,245 + 3001e64: 030067b7 lui a5,0x3006 + 3001e68: 44478513 addi a0,a5,1092 # 3006444 + 3001e6c: 2089 jal ra,3001eae + 3001e6e: a001 j 3001e6e + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001e70: fe842503 lw a0,-24(s0) + 3001e74: bb4ff0ef jal ra,3001228 + 3001e78: 87aa mv a5,a0 + 3001e7a: 0017c793 xori a5,a5,1 + 3001e7e: 9f81 uxtb a5 + 3001e80: cb91 beqz a5,3001e94 + 3001e82: 0f600593 li a1,246 + 3001e86: 030067b7 lui a5,0x3006 + 3001e8a: 44478513 addi a0,a5,1092 # 3006444 + 3001e8e: 2005 jal ra,3001eae + 3001e90: 4785 li a5,1 + 3001e92: a809 j 3001ea4 + return DCL_ADC_ReadSOCxResult(adcHandle->baseAddress, soc); + 3001e94: fec42783 lw a5,-20(s0) + 3001e98: 439c lw a5,0(a5) + 3001e9a: fe842583 lw a1,-24(s0) + 3001e9e: 853e mv a0,a5 + 3001ea0: 3409 jal ra,30018a2 + 3001ea2: 87aa mv a5,a0 +} + 3001ea4: 853e mv a0,a5 + 3001ea6: 40f2 lw ra,28(sp) + 3001ea8: 4462 lw s0,24(sp) + 3001eaa: 6105 addi sp,sp,32 + 3001eac: 8082 ret + +03001eae : + * @param file Pointer to the name of the file where the error occurs. + * @param line Number of the line where the error occurs. + * @retval None. + */ +__weak void AssertErrorLog(char *file, unsigned int line) +{ + 3001eae: 1101 addi sp,sp,-32 + 3001eb0: ce22 sw s0,28(sp) + 3001eb2: 1000 addi s0,sp,32 + 3001eb4: fea42623 sw a0,-20(s0) + 3001eb8: feb42423 sw a1,-24(s0) + /* Use only if the user apllication is not defined. */ + BASE_FUNC_UNUSED(file); + BASE_FUNC_UNUSED(line); + 3001ebc: 0001 nop + 3001ebe: 4472 lw s0,28(sp) + 3001ec0: 6105 addi sp,sp,32 + 3001ec2: 8082 ret + +03001ec4 : + * @brief Get the systick + * @param None + * @retval The SysTick Value + */ +static inline unsigned int DCL_SYSTICK_GetTick(void) +{ + 3001ec4: 1141 addi sp,sp,-16 + 3001ec6: c622 sw s0,12(sp) + 3001ec8: 0800 addi s0,sp,16 + return SYSTICK->MTIME; /* Systick value(Lower 32bit register) */ + 3001eca: 143807b7 lui a5,0x14380 + 3001ece: 479c lw a5,8(a5) +} + 3001ed0: 853e mv a0,a5 + 3001ed2: 4432 lw s0,12(sp) + 3001ed4: 0141 addi sp,sp,16 + 3001ed6: 8082 ret + +03001ed8 : + * @brief Delay number of us. + * @param us The number of us to delay. + * @retval None. + */ +void BASE_FUNC_DelayUs(unsigned int us) +{ + 3001ed8: 7179 addi sp,sp,-48 + 3001eda: d606 sw ra,44(sp) + 3001edc: d422 sw s0,40(sp) + 3001ede: 1800 addi s0,sp,48 + 3001ee0: fca42e23 sw a0,-36(s0) + unsigned int preTick = DCL_SYSTICK_GetTick(); + 3001ee4: 37c5 jal ra,3001ec4 + 3001ee6: fea42623 sw a0,-20(s0) + unsigned int tickInUs = (SYSTICK_GetCRGHZ() / CRG_FREQ_1MHz) * us; + 3001eea: 8bcff0ef jal ra,3000fa6 + 3001eee: 872a mv a4,a0 + 3001ef0: 000f47b7 lui a5,0xf4 + 3001ef4: 24078793 addi a5,a5,576 # f4240 + 3001ef8: 02f757b3 divu a5,a4,a5 + 3001efc: fdc42703 lw a4,-36(s0) + 3001f00: 02f707b3 mul a5,a4,a5 + 3001f04: fef42423 sw a5,-24(s0) + unsigned int curTick; + unsigned int delta; + + /* Wait until the delta is greater than tickInUs */ + do { + curTick = DCL_SYSTICK_GetTick(); + 3001f08: 3f75 jal ra,3001ec4 + 3001f0a: fea42223 sw a0,-28(s0) + delta = (curTick >= preTick) ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick + 1; + 3001f0e: fe442703 lw a4,-28(s0) + 3001f12: fec42783 lw a5,-20(s0) + 3001f16: 40f707b3 sub a5,a4,a5 + 3001f1a: fef42023 sw a5,-32(s0) + } while (delta < tickInUs); + 3001f1e: fe042703 lw a4,-32(s0) + 3001f22: fe842783 lw a5,-24(s0) + 3001f26: fef761e3 bltu a4,a5,3001f08 +} + 3001f2a: 0001 nop + 3001f2c: 50b2 lw ra,44(sp) + 3001f2e: 5422 lw s0,40(sp) + 3001f30: 6145 addi sp,sp,48 + 3001f32: 8082 ret + +03001f34 : + * @brief Delay number of ms. + * @param ms The number of ms to delay. + * @retval None. + */ +void BASE_FUNC_DelayMs(unsigned int ms) +{ + 3001f34: 7179 addi sp,sp,-48 + 3001f36: d606 sw ra,44(sp) + 3001f38: d422 sw s0,40(sp) + 3001f3a: 1800 addi s0,sp,48 + 3001f3c: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < ms; ++i) { + 3001f40: fe042623 sw zero,-20(s0) + 3001f44: a809 j 3001f56 + BASE_FUNC_DelayUs(BASE_DEFINE_DELAY_US_IN_MS); + 3001f46: 3e800513 li a0,1000 + 3001f4a: 3779 jal ra,3001ed8 + for (unsigned int i = 0; i < ms; ++i) { + 3001f4c: fec42783 lw a5,-20(s0) + 3001f50: 0785 addi a5,a5,1 + 3001f52: fef42623 sw a5,-20(s0) + 3001f56: fec42703 lw a4,-20(s0) + 3001f5a: fdc42783 lw a5,-36(s0) + 3001f5e: fef764e3 bltu a4,a5,3001f46 + } +} + 3001f62: 0001 nop + 3001f64: 50b2 lw ra,44(sp) + 3001f66: 5422 lw s0,40(sp) + 3001f68: 6145 addi sp,sp,48 + 3001f6a: 8082 ret + +03001f6c : + * @brief Delay number of seconds. + * @param seconds The number of seconds to delay. + * @retval None. + */ +void BASE_FUNC_DelaySeconds(unsigned int seconds) +{ + 3001f6c: 7179 addi sp,sp,-48 + 3001f6e: d606 sw ra,44(sp) + 3001f70: d422 sw s0,40(sp) + 3001f72: 1800 addi s0,sp,48 + 3001f74: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < seconds; ++i) { + 3001f78: fe042623 sw zero,-20(s0) + 3001f7c: a809 j 3001f8e + BASE_FUNC_DelayMs(BASE_DEFINE_DELAY_MS_IN_SEC); + 3001f7e: 3e800513 li a0,1000 + 3001f82: 3f4d jal ra,3001f34 + for (unsigned int i = 0; i < seconds; ++i) { + 3001f84: fec42783 lw a5,-20(s0) + 3001f88: 0785 addi a5,a5,1 + 3001f8a: fef42623 sw a5,-20(s0) + 3001f8e: fec42703 lw a4,-20(s0) + 3001f92: fdc42783 lw a5,-36(s0) + 3001f96: fef764e3 bltu a4,a5,3001f7e + } +} + 3001f9a: 0001 nop + 3001f9c: 50b2 lw ra,44(sp) + 3001f9e: 5422 lw s0,40(sp) + 3001fa0: 6145 addi sp,sp,48 + 3001fa2: 8082 ret + +03001fa4 : + * @param delay The number of 'units' to delay. + * @param units Specifies the delay unit. + * @retval None. + */ +void BASE_FUNC_Delay(unsigned int delay, BASE_DelayUnit units) +{ + 3001fa4: 1101 addi sp,sp,-32 + 3001fa6: ce06 sw ra,28(sp) + 3001fa8: cc22 sw s0,24(sp) + 3001faa: 1000 addi s0,sp,32 + 3001fac: fea42623 sw a0,-20(s0) + 3001fb0: feb42423 sw a1,-24(s0) + switch (units) { + 3001fb4: fe842783 lw a5,-24(s0) + 3001fb8: 3e800713 li a4,1000 + 3001fbc: 02e78063 beq a5,a4,3001fdc + 3001fc0: 000f4737 lui a4,0xf4 + 3001fc4: 24070713 addi a4,a4,576 # f4240 + 3001fc8: 00e78e63 beq a5,a4,3001fe4 + 3001fcc: 4705 li a4,1 + 3001fce: 00e78363 beq a5,a4,3001fd4 + break; + case BASE_DEFINE_DELAY_MICROSECS: + BASE_FUNC_DelayUs(delay); + break; + default: + break; + 3001fd2: a829 j 3001fec + BASE_FUNC_DelaySeconds(delay); + 3001fd4: fec42503 lw a0,-20(s0) + 3001fd8: 3f51 jal ra,3001f6c + break; + 3001fda: a809 j 3001fec + BASE_FUNC_DelayMs(delay); + 3001fdc: fec42503 lw a0,-20(s0) + 3001fe0: 3f91 jal ra,3001f34 + break; + 3001fe2: a029 j 3001fec + BASE_FUNC_DelayUs(delay); + 3001fe4: fec42503 lw a0,-20(s0) + 3001fe8: 3dc5 jal ra,3001ed8 + break; + 3001fea: 0001 nop + } + return; + 3001fec: 0001 nop + 3001fee: 40f2 lw ra,28(sp) + 3001ff0: 4462 lw s0,24(sp) + 3001ff2: 6105 addi sp,sp,32 + 3001ff4: 8082 ret + +03001ff6 : + * @brief Clear external interrupt + * @param irqNum external interrupt number + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_NOT_CREATED + */ +static inline void IRQ_ClearN(unsigned int irqNum) +{ + 3001ff6: 1101 addi sp,sp,-32 + 3001ff8: ce22 sw s0,28(sp) + 3001ffa: 1000 addi s0,sp,32 + 3001ffc: fea42623 sw a0,-20(s0) + asm volatile("fence"); + 3002000: 0ff0000f fence + WRITE_CUSTOM_CSR_VAL(LOCIPCLR, irqNum); + 3002004: fec42783 lw a5,-20(s0) + 3002008: 82be mv t0,a5 + 300200a: bf029073 csrw 0xbf0,t0 +} + 300200e: 0001 nop + 3002010: 4472 lw s0,28(sp) + 3002012: 6105 addi sp,sp,32 + 3002014: 8082 ret + +03002016 : + * @brief Exception/Interrupt Handler Entry. + * @param irqNum external interrupt number. + * @retval None + */ +void InterruptEntry(unsigned int irqNum) +{ + 3002016: 1101 addi sp,sp,-32 + 3002018: ce06 sw ra,28(sp) + 300201a: cc22 sw s0,24(sp) + 300201c: 1000 addi s0,sp,32 + 300201e: fea42623 sw a0,-20(s0) + g_irqCallbackFunc[irqNum].pfnHandler(g_irqCallbackFunc[irqNum].param); + 3002022: 040007b7 lui a5,0x4000 + 3002026: 0fc78713 addi a4,a5,252 # 40000fc + 300202a: fec42783 lw a5,-20(s0) + 300202e: 078e slli a5,a5,0x3 + 3002030: 97ba add a5,a5,a4 + 3002032: 4394 lw a3,0(a5) + 3002034: 040007b7 lui a5,0x4000 + 3002038: 0fc78713 addi a4,a5,252 # 40000fc + 300203c: fec42783 lw a5,-20(s0) + 3002040: 078e slli a5,a5,0x3 + 3002042: 97ba add a5,a5,a4 + 3002044: 43dc lw a5,4(a5) + 3002046: 853e mv a0,a5 + 3002048: 9682 jalr a3 + IRQ_ClearN(irqNum); + 300204a: fec42503 lw a0,-20(s0) + 300204e: 3765 jal ra,3001ff6 +} + 3002050: 0001 nop + 3002052: 40f2 lw ra,28(sp) + 3002054: 4462 lw s0,24(sp) + 3002056: 6105 addi sp,sp,32 + 3002058: 8082 ret + +0300205a : + * @brief Irq initialization. + * @param none. + * @retval None + */ +void IRQ_Init(void) +{ + 300205a: 1101 addi sp,sp,-32 + 300205c: ce22 sw s0,28(sp) + 300205e: 1000 addi s0,sp,32 + unsigned int index; + + for (index = 0; index < IRQ_MAX; index++) { + 3002060: fe042623 sw zero,-20(s0) + 3002064: a82d j 300209e + g_irqCallbackFunc[index].pfnHandler = IRQ_DummyHandler; + 3002066: 040007b7 lui a5,0x4000 + 300206a: 0fc78713 addi a4,a5,252 # 40000fc + 300206e: fec42783 lw a5,-20(s0) + 3002072: 078e slli a5,a5,0x3 + 3002074: 97ba add a5,a5,a4 + 3002076: 03003737 lui a4,0x3003 + 300207a: 8fa70713 addi a4,a4,-1798 # 30028fa + 300207e: c398 sw a4,0(a5) + g_irqCallbackFunc[index].param = NULL; + 3002080: 040007b7 lui a5,0x4000 + 3002084: 0fc78713 addi a4,a5,252 # 40000fc + 3002088: fec42783 lw a5,-20(s0) + 300208c: 078e slli a5,a5,0x3 + 300208e: 97ba add a5,a5,a4 + 3002090: 0007a223 sw zero,4(a5) + for (index = 0; index < IRQ_MAX; index++) { + 3002094: fec42783 lw a5,-20(s0) + 3002098: 0785 addi a5,a5,1 + 300209a: fef42623 sw a5,-20(s0) + 300209e: fec42703 lw a4,-20(s0) + 30020a2: 07200793 li a5,114 + 30020a6: fce7f0e3 bgeu a5,a4,3002066 + } +} + 30020aa: 0001 nop + 30020ac: 4472 lw s0,28(sp) + 30020ae: 6105 addi sp,sp,32 + 30020b0: 8082 ret + +030020b2 : + * @note In the corresponding interrupt handler, manually clear the interrupt source and the corresponding interrupt + * flag bit (call the IRQ_ClearN function to clear the interrupt), otherwise the interrupt will always be + * triggered. + */ +unsigned int IRQ_Register(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 30020b2: 1101 addi sp,sp,-32 + 30020b4: ce06 sw ra,28(sp) + 30020b6: cc22 sw s0,24(sp) + 30020b8: 1000 addi s0,sp,32 + 30020ba: fea42623 sw a0,-20(s0) + 30020be: feb42423 sw a1,-24(s0) + 30020c2: fec42223 sw a2,-28(s0) + INTERRUPT_ASSERT_PARAM(func != NULL); + 30020c6: fe842783 lw a5,-24(s0) + 30020ca: eb89 bnez a5,30020dc + 30020cc: 06300593 li a1,99 + 30020d0: 030067b7 lui a5,0x3006 + 30020d4: 47878513 addi a0,a5,1144 # 3006478 + 30020d8: 3bd9 jal ra,3001eae + 30020da: a001 j 30020da + INTERRUPT_PARAM_CHECK_WITH_RET(irqNum < IRQ_MAX, IRQ_ERRNO_NUM_INVALID); + 30020dc: fec42703 lw a4,-20(s0) + 30020e0: 07200793 li a5,114 + 30020e4: 00e7fb63 bgeu a5,a4,30020fa + 30020e8: 06400593 li a1,100 + 30020ec: 030067b7 lui a5,0x3006 + 30020f0: 47878513 addi a0,a5,1144 # 3006478 + 30020f4: 3b6d jal ra,3001eae + 30020f6: 4789 li a5,2 + 30020f8: a81d j 300212e + + if (g_irqCallbackFunc[irqNum].pfnHandler != IRQ_DummyHandler) { + 30020fa: 040007b7 lui a5,0x4000 + 30020fe: 0fc78713 addi a4,a5,252 # 40000fc + 3002102: fec42783 lw a5,-20(s0) + 3002106: 078e slli a5,a5,0x3 + 3002108: 97ba add a5,a5,a4 + 300210a: 4398 lw a4,0(a5) + 300210c: 030037b7 lui a5,0x3003 + 3002110: 8fa78793 addi a5,a5,-1798 # 30028fa + 3002114: 00f70463 beq a4,a5,300211c + return IRQ_ERRNO_ALREADY_CREATED; + 3002118: 478d li a5,3 + 300211a: a811 j 300212e + } + IRQ_SetCallBack(irqNum, func, arg); + 300211c: fe442603 lw a2,-28(s0) + 3002120: fe842583 lw a1,-24(s0) + 3002124: fec42503 lw a0,-20(s0) + 3002128: 7e4000ef jal ra,300290c + return BASE_STATUS_OK; + 300212c: 4781 li a5,0 +} + 300212e: 853e mv a0,a5 + 3002130: 40f2 lw ra,28(sp) + 3002132: 4462 lw s0,24(sp) + 3002134: 6105 addi sp,sp,32 + 3002136: 8082 ret + +03002138 : + * @brief Enable the specified interrupt. + * @param irqNum External interrupt number. + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID. + */ +unsigned int IRQ_EnableN(unsigned int irqNum) +{ + 3002138: 7139 addi sp,sp,-64 + 300213a: de06 sw ra,60(sp) + 300213c: dc22 sw s0,56(sp) + 300213e: 0080 addi s0,sp,64 + 3002140: fca42623 sw a0,-52(s0) + unsigned int locienVal; +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 3002144: fcc42703 lw a4,-52(s0) + 3002148: 47e5 li a5,25 + 300214a: 00e7f863 bgeu a5,a4,300215a + 300214e: fcc42703 lw a4,-52(s0) + 3002152: 07200793 li a5,114 + 3002156: 00e7fb63 bgeu a5,a4,300216c + 300215a: 0c300593 li a1,195 + 300215e: 030067b7 lui a5,0x3006 + 3002162: 47878513 addi a0,a5,1144 # 3006478 + 3002166: 33a1 jal ra,3001eae + 3002168: 4789 li a5,2 + 300216a: a8cd j 300225c + /* The interrupt enable bits that can be controlled in the mie register (32 bits), up to 32 + can be controlled, and each bit corresponds to an interrupt enable */ + + RISCV_PRIV_MODE_SWITCH(priv); + + if (irqNum < IRQ_MIE_TOTAL_CNT) { + 300216c: fcc42703 lw a4,-52(s0) + 3002170: 47fd li a5,31 + 3002172: 02e7e063 bltu a5,a4,3002192 + irqOrder = 1U << irqNum; + 3002176: 4705 li a4,1 + 3002178: fcc42783 lw a5,-52(s0) + 300217c: 00f717b3 sll a5,a4,a5 + 3002180: fef42623 sw a5,-20(s0) + SET_CSR(mie, irqOrder); + 3002184: fec42783 lw a5,-20(s0) + 3002188: 3047a7f3 csrrs a5,mie,a5 + 300218c: fcf42c23 sw a5,-40(s0) + 3002190: a0e9 j 300225a + } else if (irqNum < IRQ_LOCIEN1_OFFSET) { + 3002192: fcc42703 lw a4,-52(s0) + 3002196: 03f00793 li a5,63 + 300219a: 02e7ef63 bltu a5,a4,30021d8 + irqOrder = irqNum - IRQ_MIE_TOTAL_CNT; + 300219e: fcc42783 lw a5,-52(s0) + 30021a2: 1781 addi a5,a5,-32 + 30021a4: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN0); + 30021a8: be0027f3 csrr a5,0xbe0 + 30021ac: fcf42e23 sw a5,-36(s0) + 30021b0: fdc42783 lw a5,-36(s0) + 30021b4: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 30021b8: 4705 li a4,1 + 30021ba: fec42783 lw a5,-20(s0) + 30021be: 00f717b3 sll a5,a4,a5 + 30021c2: fe442703 lw a4,-28(s0) + 30021c6: 8fd9 or a5,a5,a4 + 30021c8: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN0, locienVal); + 30021cc: fe442783 lw a5,-28(s0) + 30021d0: 82be mv t0,a5 + 30021d2: be029073 csrw 0xbe0,t0 + 30021d6: a051 j 300225a + } else if (irqNum < IRQ_LOCIEN2_OFFSET) { + 30021d8: fcc42703 lw a4,-52(s0) + 30021dc: 05f00793 li a5,95 + 30021e0: 04e7e063 bltu a5,a4,3002220 + irqOrder = irqNum - IRQ_LOCIEN1_OFFSET; + 30021e4: fcc42783 lw a5,-52(s0) + 30021e8: fc078793 addi a5,a5,-64 + 30021ec: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN1); + 30021f0: be1027f3 csrr a5,0xbe1 + 30021f4: fef42023 sw a5,-32(s0) + 30021f8: fe042783 lw a5,-32(s0) + 30021fc: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 3002200: 4705 li a4,1 + 3002202: fec42783 lw a5,-20(s0) + 3002206: 00f717b3 sll a5,a4,a5 + 300220a: fe442703 lw a4,-28(s0) + 300220e: 8fd9 or a5,a5,a4 + 3002210: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN1, locienVal); + 3002214: fe442783 lw a5,-28(s0) + 3002218: 82be mv t0,a5 + 300221a: be129073 csrw 0xbe1,t0 + 300221e: a835 j 300225a + } else { + irqOrder = irqNum - IRQ_LOCIEN2_OFFSET; + 3002220: fcc42783 lw a5,-52(s0) + 3002224: fa078793 addi a5,a5,-96 + 3002228: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN2); + 300222c: be2027f3 csrr a5,0xbe2 + 3002230: fef42423 sw a5,-24(s0) + 3002234: fe842783 lw a5,-24(s0) + 3002238: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 300223c: 4705 li a4,1 + 300223e: fec42783 lw a5,-20(s0) + 3002242: 00f717b3 sll a5,a4,a5 + 3002246: fe442703 lw a4,-28(s0) + 300224a: 8fd9 or a5,a5,a4 + 300224c: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN2, locienVal); + 3002250: fe442783 lw a5,-28(s0) + 3002254: 82be mv t0,a5 + 3002256: be229073 csrw 0xbe2,t0 + } + + RISCV_PRIV_MODE_SWITCH(priv); + + return BASE_STATUS_OK; + 300225a: 4781 li a5,0 +} + 300225c: 853e mv a0,a5 + 300225e: 50f2 lw ra,60(sp) + 3002260: 5462 lw s0,56(sp) + 3002262: 6121 addi sp,sp,64 + 3002264: 8082 ret + +03002266 : + * @param context. + * @note The actual code is generated by IDE + * @retval None. + */ +__weak void SysErrPrint(const SyserrContext *context) +{ + 3002266: 1101 addi sp,sp,-32 + 3002268: ce22 sw s0,28(sp) + 300226a: 1000 addi s0,sp,32 + 300226c: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(context); +} + 3002270: 0001 nop + 3002272: 4472 lw s0,28(sp) + 3002274: 6105 addi sp,sp,32 + 3002276: 8082 ret + +03002278 : + * @brief System error completion processing + * @param None. + * @retval None. + */ +static void SysErrFinish(void) +{ + 3002278: 1141 addi sp,sp,-16 + 300227a: c622 sw s0,12(sp) + 300227c: 0800 addi s0,sp,16 +} + 300227e: 0001 nop + 3002280: 4432 lw s0,12(sp) + 3002282: 0141 addi sp,sp,16 + 3002284: 8082 ret + +03002286 : + * @brief Exception Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrExcEntry(const SyserrContext *context) +{ + 3002286: 1101 addi sp,sp,-32 + 3002288: ce06 sw ra,28(sp) + 300228a: cc22 sw s0,24(sp) + 300228c: 1000 addi s0,sp,32 + 300228e: fea42623 sw a0,-20(s0) + SysErrPrint(context); + 3002292: fec42503 lw a0,-20(s0) + 3002296: 3fc1 jal ra,3002266 + SysErrFinish(); + 3002298: 37c5 jal ra,3002278 +} + 300229a: 0001 nop + 300229c: 40f2 lw ra,28(sp) + 300229e: 4462 lw s0,24(sp) + 30022a0: 6105 addi sp,sp,32 + 30022a2: 8082 ret + +030022a4 : + * @brief NMI Interrupt Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrNmiEntry(const SyserrContext *context) +{ + 30022a4: 1101 addi sp,sp,-32 + 30022a6: ce06 sw ra,28(sp) + 30022a8: cc22 sw s0,24(sp) + 30022aa: 1000 addi s0,sp,32 + 30022ac: fea42623 sw a0,-20(s0) + INTERRUPT_ASSERT_PARAM(context != NULL); + 30022b0: fec42783 lw a5,-20(s0) + 30022b4: eb89 bnez a5,30022c6 + 30022b6: 12d00593 li a1,301 + 30022ba: 030067b7 lui a5,0x3006 + 30022be: 47878513 addi a0,a5,1144 # 3006478 + 30022c2: 36f5 jal ra,3001eae + 30022c4: a001 j 30022c4 + SysErrPrint(context); + 30022c6: fec42503 lw a0,-20(s0) + 30022ca: 3f71 jal ra,3002266 + SysErrFinish(); + 30022cc: 3775 jal ra,3002278 +} + 30022ce: 0001 nop + 30022d0: 40f2 lw ra,28(sp) + 30022d2: 4462 lw s0,24(sp) + 30022d4: 6105 addi sp,sp,32 + 30022d6: 8082 ret + +030022d8 : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior local int prioroty. + * @retval None + */ +static void SetLocalIntNumPri(unsigned int intNum, unsigned int interPriNum, unsigned int prior) +{ + 30022d8: 711d addi sp,sp,-96 + 30022da: cea2 sw s0,92(sp) + 30022dc: 1080 addi s0,sp,96 + 30022de: faa42623 sw a0,-84(s0) + 30022e2: fab42423 sw a1,-88(s0) + 30022e6: fac42223 sw a2,-92(s0) + switch (intNum) { + 30022ea: fac42783 lw a5,-84(s0) + 30022ee: 17e1 addi a5,a5,-8 + 30022f0: 471d li a4,7 + 30022f2: 2af76363 bltu a4,a5,3002598 + 30022f6: 00279713 slli a4,a5,0x2 + 30022fa: 030067b7 lui a5,0x3006 + 30022fe: 49878793 addi a5,a5,1176 # 3006498 + 3002302: 97ba add a5,a5,a4 + 3002304: 439c lw a5,0(a5) + 3002306: 8782 jr a5 + case 8: /* GROUP8 */ + SET_LOCAL_INTER_NUM_PRI(8, interPriNum, prior); + 3002308: bc8027f3 csrr a5,0xbc8 + 300230c: faf42a23 sw a5,-76(s0) + 3002310: fb442783 lw a5,-76(s0) + 3002314: faf42823 sw a5,-80(s0) + 3002318: fa842783 lw a5,-88(s0) + 300231c: 078a slli a5,a5,0x2 + 300231e: 8bf1 andi a5,a5,28 + 3002320: 473d li a4,15 + 3002322: 00f717b3 sll a5,a4,a5 + 3002326: fff7c793 not a5,a5 + 300232a: fb042703 lw a4,-80(s0) + 300232e: 8ff9 and a5,a5,a4 + 3002330: faf42823 sw a5,-80(s0) + 3002334: fa842783 lw a5,-88(s0) + 3002338: 078a slli a5,a5,0x2 + 300233a: 8bf1 andi a5,a5,28 + 300233c: fa442703 lw a4,-92(s0) + 3002340: 00f717b3 sll a5,a4,a5 + 3002344: fb042703 lw a4,-80(s0) + 3002348: 8fd9 or a5,a5,a4 + 300234a: faf42823 sw a5,-80(s0) + 300234e: fb042783 lw a5,-80(s0) + 3002352: 82be mv t0,a5 + 3002354: bc829073 csrw 0xbc8,t0 + break; + 3002358: a489 j 300259a + case 9: /* GROUP9 */ + SET_LOCAL_INTER_NUM_PRI(9, interPriNum, prior); + 300235a: bc9027f3 csrr a5,0xbc9 + 300235e: faf42e23 sw a5,-68(s0) + 3002362: fbc42783 lw a5,-68(s0) + 3002366: faf42c23 sw a5,-72(s0) + 300236a: fa842783 lw a5,-88(s0) + 300236e: 078a slli a5,a5,0x2 + 3002370: 8bf1 andi a5,a5,28 + 3002372: 473d li a4,15 + 3002374: 00f717b3 sll a5,a4,a5 + 3002378: fff7c793 not a5,a5 + 300237c: fb842703 lw a4,-72(s0) + 3002380: 8ff9 and a5,a5,a4 + 3002382: faf42c23 sw a5,-72(s0) + 3002386: fa842783 lw a5,-88(s0) + 300238a: 078a slli a5,a5,0x2 + 300238c: 8bf1 andi a5,a5,28 + 300238e: fa442703 lw a4,-92(s0) + 3002392: 00f717b3 sll a5,a4,a5 + 3002396: fb842703 lw a4,-72(s0) + 300239a: 8fd9 or a5,a5,a4 + 300239c: faf42c23 sw a5,-72(s0) + 30023a0: fb842783 lw a5,-72(s0) + 30023a4: 82be mv t0,a5 + 30023a6: bc929073 csrw 0xbc9,t0 + break; + 30023aa: aac5 j 300259a + case 10: /* GROUP10 */ + SET_LOCAL_INTER_NUM_PRI(10, interPriNum, prior); + 30023ac: bca027f3 csrr a5,0xbca + 30023b0: fcf42223 sw a5,-60(s0) + 30023b4: fc442783 lw a5,-60(s0) + 30023b8: fcf42023 sw a5,-64(s0) + 30023bc: fa842783 lw a5,-88(s0) + 30023c0: 078a slli a5,a5,0x2 + 30023c2: 8bf1 andi a5,a5,28 + 30023c4: 473d li a4,15 + 30023c6: 00f717b3 sll a5,a4,a5 + 30023ca: fff7c793 not a5,a5 + 30023ce: fc042703 lw a4,-64(s0) + 30023d2: 8ff9 and a5,a5,a4 + 30023d4: fcf42023 sw a5,-64(s0) + 30023d8: fa842783 lw a5,-88(s0) + 30023dc: 078a slli a5,a5,0x2 + 30023de: 8bf1 andi a5,a5,28 + 30023e0: fa442703 lw a4,-92(s0) + 30023e4: 00f717b3 sll a5,a4,a5 + 30023e8: fc042703 lw a4,-64(s0) + 30023ec: 8fd9 or a5,a5,a4 + 30023ee: fcf42023 sw a5,-64(s0) + 30023f2: fc042783 lw a5,-64(s0) + 30023f6: 82be mv t0,a5 + 30023f8: bca29073 csrw 0xbca,t0 + break; + 30023fc: aa79 j 300259a + case 11: /* GROUP11 */ + SET_LOCAL_INTER_NUM_PRI(11, interPriNum, prior); + 30023fe: bcb027f3 csrr a5,0xbcb + 3002402: fcf42623 sw a5,-52(s0) + 3002406: fcc42783 lw a5,-52(s0) + 300240a: fcf42423 sw a5,-56(s0) + 300240e: fa842783 lw a5,-88(s0) + 3002412: 078a slli a5,a5,0x2 + 3002414: 8bf1 andi a5,a5,28 + 3002416: 473d li a4,15 + 3002418: 00f717b3 sll a5,a4,a5 + 300241c: fff7c793 not a5,a5 + 3002420: fc842703 lw a4,-56(s0) + 3002424: 8ff9 and a5,a5,a4 + 3002426: fcf42423 sw a5,-56(s0) + 300242a: fa842783 lw a5,-88(s0) + 300242e: 078a slli a5,a5,0x2 + 3002430: 8bf1 andi a5,a5,28 + 3002432: fa442703 lw a4,-92(s0) + 3002436: 00f717b3 sll a5,a4,a5 + 300243a: fc842703 lw a4,-56(s0) + 300243e: 8fd9 or a5,a5,a4 + 3002440: fcf42423 sw a5,-56(s0) + 3002444: fc842783 lw a5,-56(s0) + 3002448: 82be mv t0,a5 + 300244a: bcb29073 csrw 0xbcb,t0 + break; + 300244e: a2b1 j 300259a + case 12: /* GROUP12 */ + SET_LOCAL_INTER_NUM_PRI(12, interPriNum, prior); + 3002450: bcc027f3 csrr a5,0xbcc + 3002454: fcf42a23 sw a5,-44(s0) + 3002458: fd442783 lw a5,-44(s0) + 300245c: fcf42823 sw a5,-48(s0) + 3002460: fa842783 lw a5,-88(s0) + 3002464: 078a slli a5,a5,0x2 + 3002466: 8bf1 andi a5,a5,28 + 3002468: 473d li a4,15 + 300246a: 00f717b3 sll a5,a4,a5 + 300246e: fff7c793 not a5,a5 + 3002472: fd042703 lw a4,-48(s0) + 3002476: 8ff9 and a5,a5,a4 + 3002478: fcf42823 sw a5,-48(s0) + 300247c: fa842783 lw a5,-88(s0) + 3002480: 078a slli a5,a5,0x2 + 3002482: 8bf1 andi a5,a5,28 + 3002484: fa442703 lw a4,-92(s0) + 3002488: 00f717b3 sll a5,a4,a5 + 300248c: fd042703 lw a4,-48(s0) + 3002490: 8fd9 or a5,a5,a4 + 3002492: fcf42823 sw a5,-48(s0) + 3002496: fd042783 lw a5,-48(s0) + 300249a: 82be mv t0,a5 + 300249c: bcc29073 csrw 0xbcc,t0 + break; + 30024a0: a8ed j 300259a + case 13: /* GROUP13 */ + SET_LOCAL_INTER_NUM_PRI(13, interPriNum, prior); + 30024a2: bcd027f3 csrr a5,0xbcd + 30024a6: fcf42e23 sw a5,-36(s0) + 30024aa: fdc42783 lw a5,-36(s0) + 30024ae: fcf42c23 sw a5,-40(s0) + 30024b2: fa842783 lw a5,-88(s0) + 30024b6: 078a slli a5,a5,0x2 + 30024b8: 8bf1 andi a5,a5,28 + 30024ba: 473d li a4,15 + 30024bc: 00f717b3 sll a5,a4,a5 + 30024c0: fff7c793 not a5,a5 + 30024c4: fd842703 lw a4,-40(s0) + 30024c8: 8ff9 and a5,a5,a4 + 30024ca: fcf42c23 sw a5,-40(s0) + 30024ce: fa842783 lw a5,-88(s0) + 30024d2: 078a slli a5,a5,0x2 + 30024d4: 8bf1 andi a5,a5,28 + 30024d6: fa442703 lw a4,-92(s0) + 30024da: 00f717b3 sll a5,a4,a5 + 30024de: fd842703 lw a4,-40(s0) + 30024e2: 8fd9 or a5,a5,a4 + 30024e4: fcf42c23 sw a5,-40(s0) + 30024e8: fd842783 lw a5,-40(s0) + 30024ec: 82be mv t0,a5 + 30024ee: bcd29073 csrw 0xbcd,t0 + break; + 30024f2: a065 j 300259a + case 14: /* GROUP14 */ + SET_LOCAL_INTER_NUM_PRI(14, interPriNum, prior); + 30024f4: bce027f3 csrr a5,0xbce + 30024f8: fef42223 sw a5,-28(s0) + 30024fc: fe442783 lw a5,-28(s0) + 3002500: fef42023 sw a5,-32(s0) + 3002504: fa842783 lw a5,-88(s0) + 3002508: 078a slli a5,a5,0x2 + 300250a: 8bf1 andi a5,a5,28 + 300250c: 473d li a4,15 + 300250e: 00f717b3 sll a5,a4,a5 + 3002512: fff7c793 not a5,a5 + 3002516: fe042703 lw a4,-32(s0) + 300251a: 8ff9 and a5,a5,a4 + 300251c: fef42023 sw a5,-32(s0) + 3002520: fa842783 lw a5,-88(s0) + 3002524: 078a slli a5,a5,0x2 + 3002526: 8bf1 andi a5,a5,28 + 3002528: fa442703 lw a4,-92(s0) + 300252c: 00f717b3 sll a5,a4,a5 + 3002530: fe042703 lw a4,-32(s0) + 3002534: 8fd9 or a5,a5,a4 + 3002536: fef42023 sw a5,-32(s0) + 300253a: fe042783 lw a5,-32(s0) + 300253e: 82be mv t0,a5 + 3002540: bce29073 csrw 0xbce,t0 + break; + 3002544: a899 j 300259a + case 15: /* GROUP15 */ + SET_LOCAL_INTER_NUM_PRI(15, interPriNum, prior); + 3002546: bcf027f3 csrr a5,0xbcf + 300254a: fef42623 sw a5,-20(s0) + 300254e: fec42783 lw a5,-20(s0) + 3002552: fef42423 sw a5,-24(s0) + 3002556: fa842783 lw a5,-88(s0) + 300255a: 078a slli a5,a5,0x2 + 300255c: 8bf1 andi a5,a5,28 + 300255e: 473d li a4,15 + 3002560: 00f717b3 sll a5,a4,a5 + 3002564: fff7c793 not a5,a5 + 3002568: fe842703 lw a4,-24(s0) + 300256c: 8ff9 and a5,a5,a4 + 300256e: fef42423 sw a5,-24(s0) + 3002572: fa842783 lw a5,-88(s0) + 3002576: 078a slli a5,a5,0x2 + 3002578: 8bf1 andi a5,a5,28 + 300257a: fa442703 lw a4,-92(s0) + 300257e: 00f717b3 sll a5,a4,a5 + 3002582: fe842703 lw a4,-24(s0) + 3002586: 8fd9 or a5,a5,a4 + 3002588: fef42423 sw a5,-24(s0) + 300258c: fe842783 lw a5,-24(s0) + 3002590: 82be mv t0,a5 + 3002592: bcf29073 csrw 0xbcf,t0 + break; + 3002596: a011 j 300259a + default: + break; + 3002598: 0001 nop + } +} + 300259a: 0001 nop + 300259c: 4476 lw s0,92(sp) + 300259e: 6125 addi sp,sp,96 + 30025a0: 8082 ret + +030025a2 : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior Priority of this local interrupt to be set. + * @retval None. + */ +static void IRQ_SetLocalPriority(unsigned int interPriNum, unsigned int prior) +{ + 30025a2: 7159 addi sp,sp,-112 + 30025a4: d686 sw ra,108(sp) + 30025a6: d4a2 sw s0,104(sp) + 30025a8: 1880 addi s0,sp,112 + 30025aa: f8a42e23 sw a0,-100(s0) + 30025ae: f8b42c23 sw a1,-104(s0) +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + RISCV_PRIV_MODE_SWITCH(priv); + unsigned int intNum = GET_LOCAL_INTER_CONFIGREG_NUM(interPriNum); + 30025b2: f9c42783 lw a5,-100(s0) + 30025b6: 838d srli a5,a5,0x3 + 30025b8: fef42623 sw a5,-20(s0) + switch (intNum) { + 30025bc: fec42703 lw a4,-20(s0) + 30025c0: 479d li a5,7 + 30025c2: 2ae7e563 bltu a5,a4,300286c + 30025c6: fec42783 lw a5,-20(s0) + 30025ca: 00279713 slli a4,a5,0x2 + 30025ce: 030067b7 lui a5,0x3006 + 30025d2: 4b878793 addi a5,a5,1208 # 30064b8 + 30025d6: 97ba add a5,a5,a4 + 30025d8: 439c lw a5,0(a5) + 30025da: 8782 jr a5 + case 0: /* GROUP0 */ + SET_LOCAL_INTER_NUM_PRI(0, interPriNum, prior); + 30025dc: bc0027f3 csrr a5,0xbc0 + 30025e0: faf42823 sw a5,-80(s0) + 30025e4: fb042783 lw a5,-80(s0) + 30025e8: faf42623 sw a5,-84(s0) + 30025ec: f9c42783 lw a5,-100(s0) + 30025f0: 078a slli a5,a5,0x2 + 30025f2: 8bf1 andi a5,a5,28 + 30025f4: 473d li a4,15 + 30025f6: 00f717b3 sll a5,a4,a5 + 30025fa: fff7c793 not a5,a5 + 30025fe: fac42703 lw a4,-84(s0) + 3002602: 8ff9 and a5,a5,a4 + 3002604: faf42623 sw a5,-84(s0) + 3002608: f9c42783 lw a5,-100(s0) + 300260c: 078a slli a5,a5,0x2 + 300260e: 8bf1 andi a5,a5,28 + 3002610: f9842703 lw a4,-104(s0) + 3002614: 00f717b3 sll a5,a4,a5 + 3002618: fac42703 lw a4,-84(s0) + 300261c: 8fd9 or a5,a5,a4 + 300261e: faf42623 sw a5,-84(s0) + 3002622: fac42783 lw a5,-84(s0) + 3002626: 82be mv t0,a5 + 3002628: bc029073 csrw 0xbc0,t0 + break; + 300262c: ac81 j 300287c + case 1: /* GROUP1 */ + SET_LOCAL_INTER_NUM_PRI(1, interPriNum, prior); + 300262e: bc1027f3 csrr a5,0xbc1 + 3002632: faf42c23 sw a5,-72(s0) + 3002636: fb842783 lw a5,-72(s0) + 300263a: faf42a23 sw a5,-76(s0) + 300263e: f9c42783 lw a5,-100(s0) + 3002642: 078a slli a5,a5,0x2 + 3002644: 8bf1 andi a5,a5,28 + 3002646: 473d li a4,15 + 3002648: 00f717b3 sll a5,a4,a5 + 300264c: fff7c793 not a5,a5 + 3002650: fb442703 lw a4,-76(s0) + 3002654: 8ff9 and a5,a5,a4 + 3002656: faf42a23 sw a5,-76(s0) + 300265a: f9c42783 lw a5,-100(s0) + 300265e: 078a slli a5,a5,0x2 + 3002660: 8bf1 andi a5,a5,28 + 3002662: f9842703 lw a4,-104(s0) + 3002666: 00f717b3 sll a5,a4,a5 + 300266a: fb442703 lw a4,-76(s0) + 300266e: 8fd9 or a5,a5,a4 + 3002670: faf42a23 sw a5,-76(s0) + 3002674: fb442783 lw a5,-76(s0) + 3002678: 82be mv t0,a5 + 300267a: bc129073 csrw 0xbc1,t0 + break; + 300267e: aafd j 300287c + case 2: /* GROUP2 */ + SET_LOCAL_INTER_NUM_PRI(2, interPriNum, prior); + 3002680: bc2027f3 csrr a5,0xbc2 + 3002684: fcf42023 sw a5,-64(s0) + 3002688: fc042783 lw a5,-64(s0) + 300268c: faf42e23 sw a5,-68(s0) + 3002690: f9c42783 lw a5,-100(s0) + 3002694: 078a slli a5,a5,0x2 + 3002696: 8bf1 andi a5,a5,28 + 3002698: 473d li a4,15 + 300269a: 00f717b3 sll a5,a4,a5 + 300269e: fff7c793 not a5,a5 + 30026a2: fbc42703 lw a4,-68(s0) + 30026a6: 8ff9 and a5,a5,a4 + 30026a8: faf42e23 sw a5,-68(s0) + 30026ac: f9c42783 lw a5,-100(s0) + 30026b0: 078a slli a5,a5,0x2 + 30026b2: 8bf1 andi a5,a5,28 + 30026b4: f9842703 lw a4,-104(s0) + 30026b8: 00f717b3 sll a5,a4,a5 + 30026bc: fbc42703 lw a4,-68(s0) + 30026c0: 8fd9 or a5,a5,a4 + 30026c2: faf42e23 sw a5,-68(s0) + 30026c6: fbc42783 lw a5,-68(s0) + 30026ca: 82be mv t0,a5 + 30026cc: bc229073 csrw 0xbc2,t0 + break; + 30026d0: a275 j 300287c + case 3: /* GROUP3 */ + SET_LOCAL_INTER_NUM_PRI(3, interPriNum, prior); + 30026d2: bc3027f3 csrr a5,0xbc3 + 30026d6: fcf42423 sw a5,-56(s0) + 30026da: fc842783 lw a5,-56(s0) + 30026de: fcf42223 sw a5,-60(s0) + 30026e2: f9c42783 lw a5,-100(s0) + 30026e6: 078a slli a5,a5,0x2 + 30026e8: 8bf1 andi a5,a5,28 + 30026ea: 473d li a4,15 + 30026ec: 00f717b3 sll a5,a4,a5 + 30026f0: fff7c793 not a5,a5 + 30026f4: fc442703 lw a4,-60(s0) + 30026f8: 8ff9 and a5,a5,a4 + 30026fa: fcf42223 sw a5,-60(s0) + 30026fe: f9c42783 lw a5,-100(s0) + 3002702: 078a slli a5,a5,0x2 + 3002704: 8bf1 andi a5,a5,28 + 3002706: f9842703 lw a4,-104(s0) + 300270a: 00f717b3 sll a5,a4,a5 + 300270e: fc442703 lw a4,-60(s0) + 3002712: 8fd9 or a5,a5,a4 + 3002714: fcf42223 sw a5,-60(s0) + 3002718: fc442783 lw a5,-60(s0) + 300271c: 82be mv t0,a5 + 300271e: bc329073 csrw 0xbc3,t0 + break; + 3002722: aaa9 j 300287c + case 4: /* GROUP4 */ + SET_LOCAL_INTER_NUM_PRI(4, interPriNum, prior); + 3002724: bc4027f3 csrr a5,0xbc4 + 3002728: fcf42823 sw a5,-48(s0) + 300272c: fd042783 lw a5,-48(s0) + 3002730: fcf42623 sw a5,-52(s0) + 3002734: f9c42783 lw a5,-100(s0) + 3002738: 078a slli a5,a5,0x2 + 300273a: 8bf1 andi a5,a5,28 + 300273c: 473d li a4,15 + 300273e: 00f717b3 sll a5,a4,a5 + 3002742: fff7c793 not a5,a5 + 3002746: fcc42703 lw a4,-52(s0) + 300274a: 8ff9 and a5,a5,a4 + 300274c: fcf42623 sw a5,-52(s0) + 3002750: f9c42783 lw a5,-100(s0) + 3002754: 078a slli a5,a5,0x2 + 3002756: 8bf1 andi a5,a5,28 + 3002758: f9842703 lw a4,-104(s0) + 300275c: 00f717b3 sll a5,a4,a5 + 3002760: fcc42703 lw a4,-52(s0) + 3002764: 8fd9 or a5,a5,a4 + 3002766: fcf42623 sw a5,-52(s0) + 300276a: fcc42783 lw a5,-52(s0) + 300276e: 82be mv t0,a5 + 3002770: bc429073 csrw 0xbc4,t0 + break; + 3002774: a221 j 300287c + case 5: /* GROUP5 */ + SET_LOCAL_INTER_NUM_PRI(5, interPriNum, prior); + 3002776: bc5027f3 csrr a5,0xbc5 + 300277a: fcf42c23 sw a5,-40(s0) + 300277e: fd842783 lw a5,-40(s0) + 3002782: fcf42a23 sw a5,-44(s0) + 3002786: f9c42783 lw a5,-100(s0) + 300278a: 078a slli a5,a5,0x2 + 300278c: 8bf1 andi a5,a5,28 + 300278e: 473d li a4,15 + 3002790: 00f717b3 sll a5,a4,a5 + 3002794: fff7c793 not a5,a5 + 3002798: fd442703 lw a4,-44(s0) + 300279c: 8ff9 and a5,a5,a4 + 300279e: fcf42a23 sw a5,-44(s0) + 30027a2: f9c42783 lw a5,-100(s0) + 30027a6: 078a slli a5,a5,0x2 + 30027a8: 8bf1 andi a5,a5,28 + 30027aa: f9842703 lw a4,-104(s0) + 30027ae: 00f717b3 sll a5,a4,a5 + 30027b2: fd442703 lw a4,-44(s0) + 30027b6: 8fd9 or a5,a5,a4 + 30027b8: fcf42a23 sw a5,-44(s0) + 30027bc: fd442783 lw a5,-44(s0) + 30027c0: 82be mv t0,a5 + 30027c2: bc529073 csrw 0xbc5,t0 + break; + 30027c6: a85d j 300287c + case 6: /* GROUP6 */ + SET_LOCAL_INTER_NUM_PRI(6, interPriNum, prior); + 30027c8: bc6027f3 csrr a5,0xbc6 + 30027cc: fef42023 sw a5,-32(s0) + 30027d0: fe042783 lw a5,-32(s0) + 30027d4: fcf42e23 sw a5,-36(s0) + 30027d8: f9c42783 lw a5,-100(s0) + 30027dc: 078a slli a5,a5,0x2 + 30027de: 8bf1 andi a5,a5,28 + 30027e0: 473d li a4,15 + 30027e2: 00f717b3 sll a5,a4,a5 + 30027e6: fff7c793 not a5,a5 + 30027ea: fdc42703 lw a4,-36(s0) + 30027ee: 8ff9 and a5,a5,a4 + 30027f0: fcf42e23 sw a5,-36(s0) + 30027f4: f9c42783 lw a5,-100(s0) + 30027f8: 078a slli a5,a5,0x2 + 30027fa: 8bf1 andi a5,a5,28 + 30027fc: f9842703 lw a4,-104(s0) + 3002800: 00f717b3 sll a5,a4,a5 + 3002804: fdc42703 lw a4,-36(s0) + 3002808: 8fd9 or a5,a5,a4 + 300280a: fcf42e23 sw a5,-36(s0) + 300280e: fdc42783 lw a5,-36(s0) + 3002812: 82be mv t0,a5 + 3002814: bc629073 csrw 0xbc6,t0 + break; + 3002818: a095 j 300287c + case 7: /* GROUP7 */ + SET_LOCAL_INTER_NUM_PRI(7, interPriNum, prior); + 300281a: bc7027f3 csrr a5,0xbc7 + 300281e: fef42423 sw a5,-24(s0) + 3002822: fe842783 lw a5,-24(s0) + 3002826: fef42223 sw a5,-28(s0) + 300282a: f9c42783 lw a5,-100(s0) + 300282e: 078a slli a5,a5,0x2 + 3002830: 8bf1 andi a5,a5,28 + 3002832: 473d li a4,15 + 3002834: 00f717b3 sll a5,a4,a5 + 3002838: fff7c793 not a5,a5 + 300283c: fe442703 lw a4,-28(s0) + 3002840: 8ff9 and a5,a5,a4 + 3002842: fef42223 sw a5,-28(s0) + 3002846: f9c42783 lw a5,-100(s0) + 300284a: 078a slli a5,a5,0x2 + 300284c: 8bf1 andi a5,a5,28 + 300284e: f9842703 lw a4,-104(s0) + 3002852: 00f717b3 sll a5,a4,a5 + 3002856: fe442703 lw a4,-28(s0) + 300285a: 8fd9 or a5,a5,a4 + 300285c: fef42223 sw a5,-28(s0) + 3002860: fe442783 lw a5,-28(s0) + 3002864: 82be mv t0,a5 + 3002866: bc729073 csrw 0xbc7,t0 + break; + 300286a: a809 j 300287c + default: + SetLocalIntNumPri(intNum, interPriNum, prior); + 300286c: f9842603 lw a2,-104(s0) + 3002870: f9c42583 lw a1,-100(s0) + 3002874: fec42503 lw a0,-20(s0) + 3002878: 3485 jal ra,30022d8 + break; + 300287a: 0001 nop + } + RISCV_PRIV_MODE_SWITCH(priv); +} + 300287c: 0001 nop + 300287e: 50b6 lw ra,108(sp) + 3002880: 5426 lw s0,104(sp) + 3002882: 6165 addi sp,sp,112 + 3002884: 8082 ret + +03002886 : + * @param irqNum External interrupt number. + * @param priority. + * @retval IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_PRIORITY_INVALID or BASE_STATUS_OK. + */ +unsigned int IRQ_SetPriority(unsigned int irqNum, unsigned int priority) +{ + 3002886: 1101 addi sp,sp,-32 + 3002888: ce06 sw ra,28(sp) + 300288a: cc22 sw s0,24(sp) + 300288c: 1000 addi s0,sp,32 + 300288e: fea42623 sw a0,-20(s0) + 3002892: feb42423 sw a1,-24(s0) + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 3002896: fec42703 lw a4,-20(s0) + 300289a: 47e5 li a5,25 + 300289c: 00e7f863 bgeu a5,a4,30028ac + 30028a0: fec42703 lw a4,-20(s0) + 30028a4: 07200793 li a5,114 + 30028a8: 00e7fb63 bgeu a5,a4,30028be + 30028ac: 18c00593 li a1,396 + 30028b0: 030067b7 lui a5,0x3006 + 30028b4: 47878513 addi a0,a5,1144 # 3006478 + 30028b8: 21bd jal ra,3002d26 + 30028ba: 4789 li a5,2 + 30028bc: a815 j 30028f0 + INTERRUPT_PARAM_CHECK_WITH_RET((priority >= IRQ_PRIO_LOWEST && priority <= IRQ_PRIO_HIGHEST), \ + 30028be: fe842783 lw a5,-24(s0) + 30028c2: c791 beqz a5,30028ce + 30028c4: fe842703 lw a4,-24(s0) + 30028c8: 47bd li a5,15 + 30028ca: 00e7fb63 bgeu a5,a4,30028e0 + 30028ce: 18d00593 li a1,397 + 30028d2: 030067b7 lui a5,0x3006 + 30028d6: 47878513 addi a0,a5,1144 # 3006478 + 30028da: 21b1 jal ra,3002d26 + 30028dc: 4795 li a5,5 + 30028de: a809 j 30028f0 + IRQ_ERRNO_PRIORITY_INVALID); + + /* The locipri register is specifically used to configure the priority of the + external non-standard interrupts of the CPU, so the number of internal + standard interrupts should be subtracted */ + IRQ_SetLocalPriority(irqNum - IRQ_VECTOR_CNT, priority); + 30028e0: fec42783 lw a5,-20(s0) + 30028e4: 1799 addi a5,a5,-26 + 30028e6: fe842583 lw a1,-24(s0) + 30028ea: 853e mv a0,a5 + 30028ec: 395d jal ra,30025a2 + + return BASE_STATUS_OK; + 30028ee: 4781 li a5,0 +} + 30028f0: 853e mv a0,a5 + 30028f2: 40f2 lw ra,28(sp) + 30028f4: 4462 lw s0,24(sp) + 30028f6: 6105 addi sp,sp,32 + 30028f8: 8082 ret + +030028fa : + * @brief Interrupt dummy handler + * @param arg Not used + * @retval None. + */ +static void IRQ_DummyHandler(void *arg) +{ + 30028fa: 1101 addi sp,sp,-32 + 30028fc: ce22 sw s0,28(sp) + 30028fe: 1000 addi s0,sp,32 + 3002900: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(arg); +} + 3002904: 0001 nop + 3002906: 4472 lw s0,28(sp) + 3002908: 6105 addi sp,sp,32 + 300290a: 8082 ret + +0300290c : + * @param func callback function + * @param arg callback arg + * @retval None. + */ +static inline void IRQ_SetCallBack(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 300290c: 1101 addi sp,sp,-32 + 300290e: ce22 sw s0,28(sp) + 3002910: 1000 addi s0,sp,32 + 3002912: fea42623 sw a0,-20(s0) + 3002916: feb42423 sw a1,-24(s0) + 300291a: fec42223 sw a2,-28(s0) + g_irqCallbackFunc[irqNum].param = arg; + 300291e: 040007b7 lui a5,0x4000 + 3002922: 0fc78713 addi a4,a5,252 # 40000fc + 3002926: fec42783 lw a5,-20(s0) + 300292a: 078e slli a5,a5,0x3 + 300292c: 97ba add a5,a5,a4 + 300292e: fe442703 lw a4,-28(s0) + 3002932: c3d8 sw a4,4(a5) + g_irqCallbackFunc[irqNum].pfnHandler = func; + 3002934: 040007b7 lui a5,0x4000 + 3002938: 0fc78713 addi a4,a5,252 # 40000fc + 300293c: fec42783 lw a5,-20(s0) + 3002940: 078e slli a5,a5,0x3 + 3002942: 97ba add a5,a5,a4 + 3002944: fe842703 lw a4,-24(s0) + 3002948: c398 sw a4,0(a5) +} + 300294a: 0001 nop + 300294c: 4472 lw s0,28(sp) + 300294e: 6105 addi sp,sp,32 + 3002950: 8082 ret + +03002952 : + * @brief Set the write protection for CRG-related registers disable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionDisable(void) +{ + 3002952: 1141 addi sp,sp,-16 + 3002954: c622 sw s0,12(sp) + 3002956: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = (SYSCTRL0->SC_LOCKEN.reg & SC_LOCKEN_CRG_DISABLE_MASK) + SC_LOCKEN_VALID_HIGH_BIT; + 3002958: 101007b7 lui a5,0x10100 + 300295c: 43f8 lw a4,68(a5) + 300295e: 67c1 lui a5,0x10 + 3002960: 17f9 addi a5,a5,-2 # fffe + 3002962: 00f776b3 and a3,a4,a5 + 3002966: 101007b7 lui a5,0x10100 + 300296a: ea510737 lui a4,0xea510 + 300296e: 9736 add a4,a4,a3 + 3002970: c3f8 sw a4,68(a5) +} + 3002972: 0001 nop + 3002974: 4432 lw s0,12(sp) + 3002976: 0141 addi sp,sp,16 + 3002978: 8082 ret + +0300297a : + * @brief Set the Set the write protection for CRG-related registers enable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionEnable(void) +{ + 300297a: 1141 addi sp,sp,-16 + 300297c: c622 sw s0,12(sp) + 300297e: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = ((SYSCTRL0->SC_LOCKEN.reg & SC_LOW_BIT_MASK) | SC_LOCKEN_CRG_ENABLE_MASK) + + 3002980: 101007b7 lui a5,0x10100 + 3002984: 43f8 lw a4,68(a5) + 3002986: 67c1 lui a5,0x10 + 3002988: 17fd addi a5,a5,-1 # ffff + 300298a: 8ff9 and a5,a5,a4 + 300298c: 0017e693 ori a3,a5,1 + 3002990: 101007b7 lui a5,0x10100 + 3002994: ea510737 lui a4,0xea510 + 3002998: 9736 add a4,a4,a3 + 300299a: c3f8 sw a4,68(a5) + SC_LOCKEN_VALID_HIGH_BIT; +} + 300299c: 0001 nop + 300299e: 4432 lw s0,12(sp) + 30029a0: 0141 addi sp,sp,16 + 30029a2: 8082 ret + +030029a4 : + * @param clkSelect pll_ref_cksel + * @retval true + * @retval false + */ +static inline bool IsCrgPllRefClkSelect(CRG_PllRefClkSelect clkSelect) +{ + 30029a4: 1101 addi sp,sp,-32 + 30029a6: ce22 sw s0,28(sp) + 30029a8: 1000 addi s0,sp,32 + 30029aa: fea42623 sw a0,-20(s0) + return ((clkSelect == CRG_PLL_REF_CLK_SELECT_HOSC) || + 30029ae: fec42783 lw a5,-20(s0) + 30029b2: c791 beqz a5,30029be + 30029b4: fec42703 lw a4,-20(s0) + 30029b8: 4785 li a5,1 + 30029ba: 00f71463 bne a4,a5,30029c2 + 30029be: 4785 li a5,1 + 30029c0: a011 j 30029c4 + 30029c2: 4781 li a5,0 + 30029c4: 8b85 andi a5,a5,1 + 30029c6: 9f81 uxtb a5 + (clkSelect == CRG_PLL_REF_CLK_SELECT_XTAL)); +} + 30029c8: 853e mv a0,a5 + 30029ca: 4472 lw s0,28(sp) + 30029cc: 6105 addi sp,sp,32 + 30029ce: 8082 ret + +030029d0 : + * @param preDiv pll prediv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPreDiv(CRG_PllPreDiv preDiv) +{ + 30029d0: 1101 addi sp,sp,-32 + 30029d2: ce22 sw s0,28(sp) + 30029d4: 1000 addi s0,sp,32 + 30029d6: fea42623 sw a0,-20(s0) + return ((preDiv >= CRG_PLL_PREDIV_1) && + 30029da: fec42783 lw a5,-20(s0) + 30029de: 0087b793 sltiu a5,a5,8 + 30029e2: 9f81 uxtb a5 + (preDiv <= CRG_PLL_PREDIV_8)); +} + 30029e4: 853e mv a0,a5 + 30029e6: 4472 lw s0,28(sp) + 30029e8: 6105 addi sp,sp,32 + 30029ea: 8082 ret + +030029ec : + * @param postDiv pll_postdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv(CRG_PllPostDiv postDiv) +{ + 30029ec: 1101 addi sp,sp,-32 + 30029ee: ce22 sw s0,28(sp) + 30029f0: 1000 addi s0,sp,32 + 30029f2: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV_1) && + 30029f6: fec42783 lw a5,-20(s0) + 30029fa: 0087b793 sltiu a5,a5,8 + 30029fe: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV_8)); +} + 3002a00: 853e mv a0,a5 + 3002a02: 4472 lw s0,28(sp) + 3002a04: 6105 addi sp,sp,32 + 3002a06: 8082 ret + +03002a08 : + * @param postDiv pll_postdiv2 value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv2(CRG_PllPostDiv2 postDiv) +{ + 3002a08: 1101 addi sp,sp,-32 + 3002a0a: ce22 sw s0,28(sp) + 3002a0c: 1000 addi s0,sp,32 + 3002a0e: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV2_1) && + 3002a12: fec42783 lw a5,-20(s0) + 3002a16: 0087b793 sltiu a5,a5,8 + 3002a1a: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV2_8_MAX)); +} + 3002a1c: 853e mv a0,a5 + 3002a1e: 4472 lw s0,28(sp) + 3002a20: 6105 addi sp,sp,32 + 3002a22: 8082 ret + +03002a24 : + * @param fbDiv pll fbdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllFbDiv(unsigned int fbDiv) +{ + 3002a24: 1101 addi sp,sp,-32 + 3002a26: ce22 sw s0,28(sp) + 3002a28: 1000 addi s0,sp,32 + 3002a2a: fea42623 sw a0,-20(s0) + return (fbDiv <= CRG_PLL_FBDIV_MAX); + 3002a2e: fec42783 lw a5,-20(s0) + 3002a32: 0807b793 sltiu a5,a5,128 + 3002a36: 9f81 uxtb a5 +} + 3002a38: 853e mv a0,a5 + 3002a3a: 4472 lw s0,28(sp) + 3002a3c: 6105 addi sp,sp,32 + 3002a3e: 8082 ret + +03002a40 : + * @param select core_cksel value + * @retval true + * @retval false + */ +static inline bool IsCrgCoreCkSel(CRG_CoreClkSelect select) +{ + 3002a40: 1101 addi sp,sp,-32 + 3002a42: ce22 sw s0,28(sp) + 3002a44: 1000 addi s0,sp,32 + 3002a46: fea42623 sw a0,-20(s0) + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002a4a: fec42783 lw a5,-20(s0) + 3002a4e: cb99 beqz a5,3002a64 + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + 3002a50: fec42703 lw a4,-20(s0) + 3002a54: 4785 li a5,1 + 3002a56: 00f70763 beq a4,a5,3002a64 + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002a5a: fec42703 lw a4,-20(s0) + 3002a5e: 4789 li a5,2 + 3002a60: 00f71463 bne a4,a5,3002a68 + 3002a64: 4785 li a5,1 + 3002a66: a011 j 3002a6a + 3002a68: 4781 li a5,0 + 3002a6a: 8b85 andi a5,a5,1 + 3002a6c: 9f81 uxtb a5 + (select == CRG_CORE_CLK_SELECT_PLL)); +} + 3002a6e: 853e mv a0,a5 + 3002a70: 4472 lw s0,28(sp) + 3002a72: 6105 addi sp,sp,32 + 3002a74: 8082 ret + +03002a76 : + * @param select 1M clock selection + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkSel(CRG_1MClkSelect select) +{ + 3002a76: 1101 addi sp,sp,-32 + 3002a78: ce22 sw s0,28(sp) + 3002a7a: 1000 addi s0,sp,32 + 3002a7c: fea42623 sw a0,-20(s0) + return ((select == CRG_1M_CLK_SELECT_HOSC) || + 3002a80: fec42783 lw a5,-20(s0) + 3002a84: c791 beqz a5,3002a90 + 3002a86: fec42703 lw a4,-20(s0) + 3002a8a: 4785 li a5,1 + 3002a8c: 00f71463 bne a4,a5,3002a94 + 3002a90: 4785 li a5,1 + 3002a92: a011 j 3002a96 + 3002a94: 4781 li a5,0 + 3002a96: 8b85 andi a5,a5,1 + 3002a98: 9f81 uxtb a5 + (select == CRG_1M_CLK_SELECT_TCXO)); +} + 3002a9a: 853e mv a0,a5 + 3002a9c: 4472 lw s0,28(sp) + 3002a9e: 6105 addi sp,sp,32 + 3002aa0: 8082 ret + +03002aa2 : + * @param div 1M clock ratio + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkDiv(unsigned int div) +{ + 3002aa2: 1101 addi sp,sp,-32 + 3002aa4: ce22 sw s0,28(sp) + 3002aa6: 1000 addi s0,sp,32 + 3002aa8: fea42623 sw a0,-20(s0) + return (div <= CRG_1MHZ_CLK_MAX_DIV); + 3002aac: fec42783 lw a5,-20(s0) + 3002ab0: 0407b793 sltiu a5,a5,64 + 3002ab4: 9f81 uxtb a5 +} + 3002ab6: 853e mv a0,a5 + 3002ab8: 4472 lw s0,28(sp) + 3002aba: 6105 addi sp,sp,32 + 3002abc: 8082 ret + +03002abe : + * @param preDiv PLL Previous Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPreDiv(unsigned int pllRefFreq, unsigned int preDiv) +{ + 3002abe: 7179 addi sp,sp,-48 + 3002ac0: d622 sw s0,44(sp) + 3002ac2: 1800 addi s0,sp,48 + 3002ac4: fca42e23 sw a0,-36(s0) + 3002ac8: fcb42c23 sw a1,-40(s0) + unsigned int freq = pllRefFreq; + 3002acc: fdc42783 lw a5,-36(s0) + 3002ad0: fef42623 sw a5,-20(s0) + if (preDiv != 0) { + 3002ad4: fd842783 lw a5,-40(s0) + 3002ad8: cb89 beqz a5,3002aea + freq /= preDiv; + 3002ada: fec42703 lw a4,-20(s0) + 3002ade: fd842783 lw a5,-40(s0) + 3002ae2: 02f757b3 divu a5,a4,a5 + 3002ae6: fef42623 sw a5,-20(s0) + } + return (freq >= CRG_CLK_PFD_MIN_FREQ) && (freq <= CRG_CLK_PFD_MAX_FREQ); + 3002aea: fec42703 lw a4,-20(s0) + 3002aee: 003d17b7 lui a5,0x3d1 + 3002af2: 8ff78793 addi a5,a5,-1793 # 3d08ff + 3002af6: 00e7fc63 bgeu a5,a4,3002b0e + 3002afa: fec42703 lw a4,-20(s0) + 3002afe: 007277b7 lui a5,0x727 + 3002b02: 0e078793 addi a5,a5,224 # 7270e0 + 3002b06: 00e7e463 bltu a5,a4,3002b0e + 3002b0a: 4785 li a5,1 + 3002b0c: a011 j 3002b10 + 3002b0e: 4781 li a5,0 + 3002b10: 8b85 andi a5,a5,1 + 3002b12: 9f81 uxtb a5 +} + 3002b14: 853e mv a0,a5 + 3002b16: 5432 lw s0,44(sp) + 3002b18: 6145 addi sp,sp,48 + 3002b1a: 8082 ret + +03002b1c : + * @param fdDiv PLL FD Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidFdDiv(unsigned int clkPfdFreq, unsigned int fdDiv) +{ + 3002b1c: 7179 addi sp,sp,-48 + 3002b1e: d622 sw s0,44(sp) + 3002b20: 1800 addi s0,sp,48 + 3002b22: fca42e23 sw a0,-36(s0) + 3002b26: fcb42c23 sw a1,-40(s0) + if (clkPfdFreq > 30000000U) { /* The maximum speed of the external clock source is 30000000U. */ + 3002b2a: fdc42703 lw a4,-36(s0) + 3002b2e: 01c9c7b7 lui a5,0x1c9c + 3002b32: 38078793 addi a5,a5,896 # 1c9c380 + 3002b36: 00e7f463 bgeu a5,a4,3002b3e + return false; + 3002b3a: 4781 li a5,0 + 3002b3c: a08d j 3002b9e + } else if (fdDiv > CRG_PLL_FBDIV_MAX) { + 3002b3e: fd842703 lw a4,-40(s0) + 3002b42: 07f00793 li a5,127 + 3002b46: 00e7f463 bgeu a5,a4,3002b4e + return false; + 3002b4a: 4781 li a5,0 + 3002b4c: a889 j 3002b9e + } + + unsigned int freq = (fdDiv > 0x6) ? (clkPfdFreq * fdDiv) : (clkPfdFreq * 0x6); /* 0x0-0x6: divided by 0x6 */ + 3002b4e: fd842703 lw a4,-40(s0) + 3002b52: 4799 li a5,6 + 3002b54: 00e7f963 bgeu a5,a4,3002b66 + 3002b58: fdc42703 lw a4,-36(s0) + 3002b5c: fd842783 lw a5,-40(s0) + 3002b60: 02f707b3 mul a5,a4,a5 + 3002b64: a031 j 3002b70 + 3002b66: fdc42703 lw a4,-36(s0) + 3002b6a: 4799 li a5,6 + 3002b6c: 02f707b3 mul a5,a4,a5 + 3002b70: fef42623 sw a5,-20(s0) + return (freq >= CRG_CLK_VCO_MIN_FREQ) && (freq <= CRG_CLK_VCO_MAX_FREQ); + 3002b74: fec42703 lw a4,-20(s0) + 3002b78: 05f5e7b7 lui a5,0x5f5e + 3002b7c: 0ff78793 addi a5,a5,255 # 5f5e0ff + 3002b80: 00e7fc63 bgeu a5,a4,3002b98 + 3002b84: fec42703 lw a4,-20(s0) + 3002b88: 11e1a7b7 lui a5,0x11e1a + 3002b8c: 30078793 addi a5,a5,768 # 11e1a300 + 3002b90: 00e7e463 bltu a5,a4,3002b98 + 3002b94: 4785 li a5,1 + 3002b96: a011 j 3002b9a + 3002b98: 4781 li a5,0 + 3002b9a: 8b85 andi a5,a5,1 + 3002b9c: 9f81 uxtb a5 +} + 3002b9e: 853e mv a0,a5 + 3002ba0: 5432 lw s0,44(sp) + 3002ba2: 6145 addi sp,sp,48 + 3002ba4: 8082 ret + +03002ba6 : + * @param postDiv PLL Post Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv(unsigned int clkVcoFreq, unsigned int postDiv) +{ + 3002ba6: 7179 addi sp,sp,-48 + 3002ba8: d622 sw s0,44(sp) + 3002baa: 1800 addi s0,sp,48 + 3002bac: fca42e23 sw a0,-36(s0) + 3002bb0: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002bb4: fdc42783 lw a5,-36(s0) + 3002bb8: fef42623 sw a5,-20(s0) + if (postDiv != 0) { + 3002bbc: fd842783 lw a5,-40(s0) + 3002bc0: cb91 beqz a5,3002bd4 + freq /= (postDiv + 1); + 3002bc2: fd842783 lw a5,-40(s0) + 3002bc6: 0785 addi a5,a5,1 + 3002bc8: fec42703 lw a4,-20(s0) + 3002bcc: 02f757b3 divu a5,a4,a5 + 3002bd0: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_TARGET_MAX_FREQ); + 3002bd4: fec42703 lw a4,-20(s0) + 3002bd8: 08f0d7b7 lui a5,0x8f0d + 3002bdc: 18178793 addi a5,a5,385 # 8f0d181 + 3002be0: 00f737b3 sltu a5,a4,a5 + 3002be4: 9f81 uxtb a5 +} + 3002be6: 853e mv a0,a5 + 3002be8: 5432 lw s0,44(sp) + 3002bea: 6145 addi sp,sp,48 + 3002bec: 8082 ret + +03002bee : + * @param postDiv2 PLL Post Divsion2 + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv2(unsigned int clkVcoFreq, unsigned int postDiv2) +{ + 3002bee: 7179 addi sp,sp,-48 + 3002bf0: d622 sw s0,44(sp) + 3002bf2: 1800 addi s0,sp,48 + 3002bf4: fca42e23 sw a0,-36(s0) + 3002bf8: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002bfc: fdc42783 lw a5,-36(s0) + 3002c00: fef42623 sw a5,-20(s0) + if (postDiv2 != 0) { + 3002c04: fd842783 lw a5,-40(s0) + 3002c08: cb91 beqz a5,3002c1c + freq /= (postDiv2 + 1); + 3002c0a: fd842783 lw a5,-40(s0) + 3002c0e: 0785 addi a5,a5,1 + 3002c10: fec42703 lw a4,-20(s0) + 3002c14: 02f757b3 divu a5,a4,a5 + 3002c18: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_PST2_MAX_FREQ); + 3002c1c: fec42703 lw a4,-20(s0) + 3002c20: 05f5e7b7 lui a5,0x5f5e + 3002c24: 10178793 addi a5,a5,257 # 5f5e101 + 3002c28: 00f737b3 sltu a5,a4,a5 + 3002c2c: 9f81 uxtb a5 +} + 3002c2e: 853e mv a0,a5 + 3002c30: 5432 lw s0,44(sp) + 3002c32: 6145 addi sp,sp,48 + 3002c34: 8082 ret + +03002c36 : + * @param adcClkSelect the value of adc clock select + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkModeSelect(CRG_AdcClkSelect adcClkSelect) +{ + 3002c36: 1101 addi sp,sp,-32 + 3002c38: ce22 sw s0,28(sp) + 3002c3a: 1000 addi s0,sp,32 + 3002c3c: fea42623 sw a0,-20(s0) + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002c40: fec42783 lw a5,-20(s0) + 3002c44: c385 beqz a5,3002c64 + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + 3002c46: fec42703 lw a4,-20(s0) + 3002c4a: 4785 li a5,1 + 3002c4c: 00f70c63 beq a4,a5,3002c64 + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + 3002c50: fec42703 lw a4,-20(s0) + 3002c54: 4789 li a5,2 + 3002c56: 00f70763 beq a4,a5,3002c64 + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002c5a: fec42703 lw a4,-20(s0) + 3002c5e: 478d li a5,3 + 3002c60: 00f71463 bne a4,a5,3002c68 + 3002c64: 4785 li a5,1 + 3002c66: a011 j 3002c6a + 3002c68: 4781 li a5,0 + 3002c6a: 8b85 andi a5,a5,1 + 3002c6c: 9f81 uxtb a5 + adcClkSelect == CRG_ADC_CLK_SYN_CORE); +} + 3002c6e: 853e mv a0,a5 + 3002c70: 4472 lw s0,28(sp) + 3002c72: 6105 addi sp,sp,32 + 3002c74: 8082 ret + +03002c76 : + * @param div the value of adc clock div + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkDiv(CRG_AdcDiv div) +{ + 3002c76: 1101 addi sp,sp,-32 + 3002c78: ce22 sw s0,28(sp) + 3002c7a: 1000 addi s0,sp,32 + 3002c7c: fea42623 sw a0,-20(s0) + return (div == CRG_ADC_DIV_1 || \ + div == CRG_ADC_DIV_2 || \ + div == CRG_ADC_DIV_3 || \ + 3002c80: fec42783 lw a5,-20(s0) + 3002c84: c385 beqz a5,3002ca4 + return (div == CRG_ADC_DIV_1 || \ + 3002c86: fec42703 lw a4,-20(s0) + 3002c8a: 4785 li a5,1 + 3002c8c: 00f70c63 beq a4,a5,3002ca4 + div == CRG_ADC_DIV_2 || \ + 3002c90: fec42703 lw a4,-20(s0) + 3002c94: 4789 li a5,2 + 3002c96: 00f70763 beq a4,a5,3002ca4 + div == CRG_ADC_DIV_3 || \ + 3002c9a: fec42703 lw a4,-20(s0) + 3002c9e: 478d li a5,3 + 3002ca0: 00f71463 bne a4,a5,3002ca8 + 3002ca4: 4785 li a5,1 + 3002ca6: a011 j 3002caa + 3002ca8: 4781 li a5,0 + 3002caa: 8b85 andi a5,a5,1 + 3002cac: 9f81 uxtb a5 + div == CRG_ADC_DIV_4); +} + 3002cae: 853e mv a0,a5 + 3002cb0: 4472 lw s0,28(sp) + 3002cb2: 6105 addi sp,sp,32 + 3002cb4: 8082 ret + +03002cb6 : + * @param clk Clock register base address + * @param select Core clock selection + * @retval None + */ +static inline void DCL_CRG_SetCoreClkSel(CRG_RegStruct *clk, CRG_CoreClkSelect select) +{ + 3002cb6: 1101 addi sp,sp,-32 + 3002cb8: ce06 sw ra,28(sp) + 3002cba: cc22 sw s0,24(sp) + 3002cbc: 1000 addi s0,sp,32 + 3002cbe: fea42623 sw a0,-20(s0) + 3002cc2: feb42423 sw a1,-24(s0) + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + 3002cc6: fec42703 lw a4,-20(s0) + 3002cca: 100007b7 lui a5,0x10000 + 3002cce: 00f70a63 beq a4,a5,3002ce2 + 3002cd2: 64b00593 li a1,1611 + 3002cd6: 030067b7 lui a5,0x3006 + 3002cda: 4d878513 addi a0,a5,1240 # 30064d8 + 3002cde: 20a1 jal ra,3002d26 + 3002ce0: a001 j 3002ce0 + CRG_PARAM_CHECK_NO_RET(IsCrgCoreCkSel(select)); + 3002ce2: fe842503 lw a0,-24(s0) + 3002ce6: 3ba9 jal ra,3002a40 + 3002ce8: 87aa mv a5,a0 + 3002cea: 0017c793 xori a5,a5,1 + 3002cee: 9f81 uxtb a5 + 3002cf0: cb89 beqz a5,3002d02 + 3002cf2: 64c00593 li a1,1612 + 3002cf6: 030067b7 lui a5,0x3006 + 3002cfa: 4d878513 addi a0,a5,1240 # 30064d8 + 3002cfe: 2025 jal ra,3002d26 + 3002d00: a839 j 3002d1e + clk->PERI_CRG64.BIT.clk_pst1_sw_sel = select; + 3002d02: fe842783 lw a5,-24(s0) + 3002d06: 8b8d andi a5,a5,3 + 3002d08: 0ff7f693 andi a3,a5,255 + 3002d0c: fec42703 lw a4,-20(s0) + 3002d10: 10072783 lw a5,256(a4) # ea510100 + 3002d14: 8a8d andi a3,a3,3 + 3002d16: 9bf1 andi a5,a5,-4 + 3002d18: 8fd5 or a5,a5,a3 + 3002d1a: 10f72023 sw a5,256(a4) +} + 3002d1e: 40f2 lw ra,28(sp) + 3002d20: 4462 lw s0,24(sp) + 3002d22: 6105 addi sp,sp,32 + 3002d24: 8082 ret + +03002d26 : + 3002d26: 988ff06f j 3001eae + +03002d2a : + * @param handle CRG Handle + * @retval BASE_STATUS_ERROR Parameter Check fail + * @retval BASE_STATUS_OK Success + */ +BASE_StatusType HAL_CRG_Init(const CRG_Handle *handle) +{ + 3002d2a: 7179 addi sp,sp,-48 + 3002d2c: d606 sw ra,44(sp) + 3002d2e: d422 sw s0,40(sp) + 3002d30: 1800 addi s0,sp,48 + 3002d32: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != NULL); + 3002d36: fdc42783 lw a5,-36(s0) + 3002d3a: eb89 bnez a5,3002d4c + 3002d3c: 07100593 li a1,113 + 3002d40: 030067b7 lui a5,0x3006 + 3002d44: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d48: 3ff9 jal ra,3002d26 + 3002d4a: a001 j 3002d4a + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3002d4c: fdc42783 lw a5,-36(s0) + 3002d50: 4398 lw a4,0(a5) + 3002d52: 100007b7 lui a5,0x10000 + 3002d56: 00f70a63 beq a4,a5,3002d6a + 3002d5a: 07200593 li a1,114 + 3002d5e: 030067b7 lui a5,0x3006 + 3002d62: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d66: 37c1 jal ra,3002d26 + 3002d68: a001 j 3002d68 + /* Check the validity of PLL-related parameters. */ + CRG_PARAM_CHECK_WITH_RET(IsCrgPllRefClkSelect(handle->pllRefClkSelect), BASE_STATUS_ERROR); + 3002d6a: fdc42783 lw a5,-36(s0) + 3002d6e: 43dc lw a5,4(a5) + 3002d70: 853e mv a0,a5 + 3002d72: 390d jal ra,30029a4 + 3002d74: 87aa mv a5,a0 + 3002d76: 0017c793 xori a5,a5,1 + 3002d7a: 9f81 uxtb a5 + 3002d7c: cb91 beqz a5,3002d90 + 3002d7e: 07400593 li a1,116 + 3002d82: 030067b7 lui a5,0x3006 + 3002d86: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d8a: 3f71 jal ra,3002d26 + 3002d8c: 4785 li a5,1 + 3002d8e: aca9 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPreDiv(handle->pllPreDiv), BASE_STATUS_ERROR); + 3002d90: fdc42783 lw a5,-36(s0) + 3002d94: 479c lw a5,8(a5) + 3002d96: 853e mv a0,a5 + 3002d98: 3925 jal ra,30029d0 + 3002d9a: 87aa mv a5,a0 + 3002d9c: 0017c793 xori a5,a5,1 + 3002da0: 9f81 uxtb a5 + 3002da2: cb91 beqz a5,3002db6 + 3002da4: 07500593 li a1,117 + 3002da8: 030067b7 lui a5,0x3006 + 3002dac: 4f478513 addi a0,a5,1268 # 30064f4 + 3002db0: 3f9d jal ra,3002d26 + 3002db2: 4785 li a5,1 + 3002db4: ac15 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllFbDiv(handle->pllFbDiv), BASE_STATUS_ERROR); + 3002db6: fdc42783 lw a5,-36(s0) + 3002dba: 47dc lw a5,12(a5) + 3002dbc: 853e mv a0,a5 + 3002dbe: 319d jal ra,3002a24 + 3002dc0: 87aa mv a5,a0 + 3002dc2: 0017c793 xori a5,a5,1 + 3002dc6: 9f81 uxtb a5 + 3002dc8: cb91 beqz a5,3002ddc + 3002dca: 07600593 li a1,118 + 3002dce: 030067b7 lui a5,0x3006 + 3002dd2: 4f478513 addi a0,a5,1268 # 30064f4 + 3002dd6: 3f81 jal ra,3002d26 + 3002dd8: 4785 li a5,1 + 3002dda: a439 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv(handle->pllPostDiv), BASE_STATUS_ERROR); + 3002ddc: fdc42783 lw a5,-36(s0) + 3002de0: 4b9c lw a5,16(a5) + 3002de2: 853e mv a0,a5 + 3002de4: 3121 jal ra,30029ec + 3002de6: 87aa mv a5,a0 + 3002de8: 0017c793 xori a5,a5,1 + 3002dec: 9f81 uxtb a5 + 3002dee: cb91 beqz a5,3002e02 + 3002df0: 07700593 li a1,119 + 3002df4: 030067b7 lui a5,0x3006 + 3002df8: 4f478513 addi a0,a5,1268 # 30064f4 + 3002dfc: 372d jal ra,3002d26 + 3002dfe: 4785 li a5,1 + 3002e00: a2e5 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv2(handle->handleEx.pllPostDiv2), BASE_STATUS_ERROR); + 3002e02: fdc42783 lw a5,-36(s0) + 3002e06: 4fdc lw a5,28(a5) + 3002e08: 853e mv a0,a5 + 3002e0a: 3efd jal ra,3002a08 + 3002e0c: 87aa mv a5,a0 + 3002e0e: 0017c793 xori a5,a5,1 + 3002e12: 9f81 uxtb a5 + 3002e14: cb91 beqz a5,3002e28 + 3002e16: 07800593 li a1,120 + 3002e1a: 030067b7 lui a5,0x3006 + 3002e1e: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e22: 3711 jal ra,3002d26 + 3002e24: 4785 li a5,1 + 3002e26: a2c9 j 3002fe8 + /* Check the Clock Source and Frequency Divider of the 1 MHz Clock. */ + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkSel(handle->handleEx.clk1MSelect), BASE_STATUS_ERROR); + 3002e28: fdc42783 lw a5,-36(s0) + 3002e2c: 539c lw a5,32(a5) + 3002e2e: 853e mv a0,a5 + 3002e30: 3199 jal ra,3002a76 + 3002e32: 87aa mv a5,a0 + 3002e34: 0017c793 xori a5,a5,1 + 3002e38: 9f81 uxtb a5 + 3002e3a: cb91 beqz a5,3002e4e + 3002e3c: 07a00593 li a1,122 + 3002e40: 030067b7 lui a5,0x3006 + 3002e44: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e48: 3df9 jal ra,3002d26 + 3002e4a: 4785 li a5,1 + 3002e4c: aa71 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkDiv(handle->handleEx.clk1MDiv), BASE_STATUS_ERROR); + 3002e4e: fdc42783 lw a5,-36(s0) + 3002e52: 53dc lw a5,36(a5) + 3002e54: 853e mv a0,a5 + 3002e56: 31b1 jal ra,3002aa2 + 3002e58: 87aa mv a5,a0 + 3002e5a: 0017c793 xori a5,a5,1 + 3002e5e: 9f81 uxtb a5 + 3002e60: cb91 beqz a5,3002e74 + 3002e62: 07b00593 li a1,123 + 3002e66: 030067b7 lui a5,0x3006 + 3002e6a: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e6e: 3d65 jal ra,3002d26 + 3002e70: 4785 li a5,1 + 3002e72: aa9d j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 3002e74: fdc42783 lw a5,-36(s0) + 3002e78: 4f9c lw a5,24(a5) + 3002e7a: 853e mv a0,a5 + 3002e7c: 36d1 jal ra,3002a40 + 3002e7e: 87aa mv a5,a0 + 3002e80: 0017c793 xori a5,a5,1 + 3002e84: 9f81 uxtb a5 + 3002e86: cb91 beqz a5,3002e9a + 3002e88: 07c00593 li a1,124 + 3002e8c: 030067b7 lui a5,0x3006 + 3002e90: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e94: 3d49 jal ra,3002d26 + 3002e96: 4785 li a5,1 + 3002e98: aa81 j 3002fe8 + + *(unsigned int *)CRG_HOSC_CTRL2_ADDR = 0x306E; /* Optimized HOSC temperature drift performance parameter. */ + 3002e9a: 100017b7 lui a5,0x10001 + 3002e9e: f0478793 addi a5,a5,-252 # 10000f04 + 3002ea2: 670d lui a4,0x3 + 3002ea4: 06e70713 addi a4,a4,110 # 306e + 3002ea8: c398 sw a4,0(a5) + + CRG_RegStruct *reg = handle->baseAddress; + 3002eaa: fdc42783 lw a5,-36(s0) + 3002eae: 439c lw a5,0(a5) + 3002eb0: fef42623 sw a5,-20(s0) + g_crgBaseAddr = (void *)reg; + 3002eb4: 040007b7 lui a5,0x4000 + 3002eb8: fec42703 lw a4,-20(s0) + 3002ebc: 48e7aa23 sw a4,1172(a5) # 4000494 + /* Check the validity of the PLL parameter configuration. */ + if (CRG_IsValidPllConfig(handle) != BASE_STATUS_OK) { + 3002ec0: fdc42503 lw a0,-36(s0) + 3002ec4: 7a4000ef jal ra,3003668 + 3002ec8: 87aa mv a5,a0 + 3002eca: c399 beqz a5,3002ed0 + return BASE_STATUS_ERROR; + 3002ecc: 4785 li a5,1 + 3002ece: aa29 j 3002fe8 + } + /* Disable the write protection function of the CRG register. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3002ed0: 3449 jal ra,3002952 + + reg->PERI_CRG0.BIT.pll_ref_cksel = handle->pllRefClkSelect; + 3002ed2: fdc42783 lw a5,-36(s0) + 3002ed6: 43dc lw a5,4(a5) + 3002ed8: 8b85 andi a5,a5,1 + 3002eda: 0ff7f693 andi a3,a5,255 + 3002ede: fec42703 lw a4,-20(s0) + 3002ee2: 431c lw a5,0(a4) + 3002ee4: 8a85 andi a3,a3,1 + 3002ee6: 9bf9 andi a5,a5,-2 + 3002ee8: 8fd5 or a5,a5,a3 + 3002eea: c31c sw a5,0(a4) + reg->PERI_CRG1.BIT.pll_prediv = handle->pllPreDiv; + 3002eec: fdc42783 lw a5,-36(s0) + 3002ef0: 479c lw a5,8(a5) + 3002ef2: 8bbd andi a5,a5,15 + 3002ef4: 0ff7f693 andi a3,a5,255 + 3002ef8: fec42703 lw a4,-20(s0) + 3002efc: 435c lw a5,4(a4) + 3002efe: 8abd andi a3,a3,15 + 3002f00: 9bc1 andi a5,a5,-16 + 3002f02: 8fd5 or a5,a5,a3 + 3002f04: c35c sw a5,4(a4) + reg->PERI_CRG2.BIT.pll_fbdiv = handle->pllFbDiv; + 3002f06: fdc42783 lw a5,-36(s0) + 3002f0a: 47dc lw a5,12(a5) + 3002f0c: 0ff7f693 andi a3,a5,255 + 3002f10: fec42703 lw a4,-20(s0) + 3002f14: 471c lw a5,8(a4) + 3002f16: 0ff6f693 andi a3,a3,255 + 3002f1a: f007f793 andi a5,a5,-256 + 3002f1e: 8fd5 or a5,a5,a3 + 3002f20: c71c sw a5,8(a4) + reg->PERI_CRG3.BIT.pll_postdiv1 = handle->pllPostDiv; + 3002f22: fdc42783 lw a5,-36(s0) + 3002f26: 4b9c lw a5,16(a5) + 3002f28: 8bbd andi a5,a5,15 + 3002f2a: 0ff7f693 andi a3,a5,255 + 3002f2e: fec42703 lw a4,-20(s0) + 3002f32: 475c lw a5,12(a4) + 3002f34: 8abd andi a3,a3,15 + 3002f36: 9bc1 andi a5,a5,-16 + 3002f38: 8fd5 or a5,a5,a3 + 3002f3a: c75c sw a5,12(a4) + reg->PERI_CRG3.BIT.pll_postdiv2 = handle->handleEx.pllPostDiv2; + 3002f3c: fdc42783 lw a5,-36(s0) + 3002f40: 4fdc lw a5,28(a5) + 3002f42: 8bbd andi a5,a5,15 + 3002f44: 0ff7f693 andi a3,a5,255 + 3002f48: fec42703 lw a4,-20(s0) + 3002f4c: 475c lw a5,12(a4) + 3002f4e: 8abd andi a3,a3,15 + 3002f50: 0692 slli a3,a3,0x4 + 3002f52: f0f7f793 andi a5,a5,-241 + 3002f56: 8fd5 or a5,a5,a3 + 3002f58: c75c sw a5,12(a4) + reg->PERI_CRG4.BIT.pll_pd = BASE_CFG_UNSET; + 3002f5a: fec42703 lw a4,-20(s0) + 3002f5e: 4b1c lw a5,16(a4) + 3002f60: 9bf9 andi a5,a5,-2 + 3002f62: cb1c sw a5,16(a4) + + while (reg->PERI_CRG7.BIT.pll_lock != BASE_CFG_SET) { + 3002f64: 0001 nop + 3002f66: fec42783 lw a5,-20(s0) + 3002f6a: 4fdc lw a5,28(a5) + 3002f6c: 8b85 andi a5,a5,1 + 3002f6e: 0ff7f713 andi a4,a5,255 + 3002f72: 4785 li a5,1 + 3002f74: fef719e3 bne a4,a5,3002f66 + ; /* Wait for PLL to lock */ + } + + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3002f78: 3409 jal ra,300297a + /* Check the 1MHz clock parameter configuration. */ + if (CRG_IsValid1MHzConfig(handle) != BASE_STATUS_OK) { + 3002f7a: fdc42503 lw a0,-36(s0) + 3002f7e: 7ac000ef jal ra,300372a + 3002f82: 87aa mv a5,a0 + 3002f84: c399 beqz a5,3002f8a + return BASE_STATUS_ERROR; + 3002f86: 4785 li a5,1 + 3002f88: a085 j 3002fe8 + } + while (reg->HOSC_LOCK.BIT.hosc_lock != BASE_CFG_SET) { + 3002f8a: 0001 nop + 3002f8c: fec42703 lw a4,-20(s0) + 3002f90: 6785 lui a5,0x1 + 3002f92: 97ba add a5,a5,a4 + 3002f94: f107a783 lw a5,-240(a5) # f10 + 3002f98: 8b85 andi a5,a5,1 + 3002f9a: 0ff7f713 andi a4,a5,255 + 3002f9e: 4785 li a5,1 + 3002fa0: fef716e3 bne a4,a5,3002f8c + ; /* Wait for HOSC to lock */ + } + /* Set the Clock Source and Frequency Divider of the 1 MHz Clock. */ + reg->PERI_CRG67.BIT.clk_1m_div = handle->handleEx.clk1MDiv; + 3002fa4: fdc42783 lw a5,-36(s0) + 3002fa8: 53dc lw a5,36(a5) + 3002faa: 03f7f793 andi a5,a5,63 + 3002fae: 0ff7f693 andi a3,a5,255 + 3002fb2: fec42703 lw a4,-20(s0) + 3002fb6: 10c72783 lw a5,268(a4) + 3002fba: 03f6f693 andi a3,a3,63 + 3002fbe: fc07f793 andi a5,a5,-64 + 3002fc2: 8fd5 or a5,a5,a3 + 3002fc4: 10f72623 sw a5,268(a4) + reg->PERI_CRG66.BIT.clk_1m_ini_cksel = handle->handleEx.clk1MSelect; + 3002fc8: fdc42783 lw a5,-36(s0) + 3002fcc: 539c lw a5,32(a5) + 3002fce: 8b85 andi a5,a5,1 + 3002fd0: 0ff7f693 andi a3,a5,255 + 3002fd4: fec42703 lw a4,-20(s0) + 3002fd8: 10872783 lw a5,264(a4) + 3002fdc: 8a85 andi a3,a3,1 + 3002fde: 9bf9 andi a5,a5,-2 + 3002fe0: 8fd5 or a5,a5,a3 + 3002fe2: 10f72423 sw a5,264(a4) + return BASE_STATUS_OK; + 3002fe6: 4781 li a5,0 +} + 3002fe8: 853e mv a0,a5 + 3002fea: 50b2 lw ra,44(sp) + 3002fec: 5422 lw s0,40(sp) + 3002fee: 6145 addi sp,sp,48 + 3002ff0: 8082 ret + +03002ff2 : + * @param handle CRG Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Paramter check fail + */ +BASE_StatusType HAL_CRG_SetCoreClockSelect(CRG_Handle *handle) +{ + 3002ff2: 7179 addi sp,sp,-48 + 3002ff4: d606 sw ra,44(sp) + 3002ff6: d422 sw s0,40(sp) + 3002ff8: 1800 addi s0,sp,48 + 3002ffa: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != 0); + 3002ffe: fdc42783 lw a5,-36(s0) + 3003002: eb89 bnez a5,3003014 + 3003004: 10a00593 li a1,266 + 3003008: 030067b7 lui a5,0x3006 + 300300c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003010: 3b19 jal ra,3002d26 + 3003012: a001 j 3003012 + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3003014: fdc42783 lw a5,-36(s0) + 3003018: 4398 lw a4,0(a5) + 300301a: 100007b7 lui a5,0x10000 + 300301e: 00f70a63 beq a4,a5,3003032 + 3003022: 10b00593 li a1,267 + 3003026: 030067b7 lui a5,0x3006 + 300302a: 4f478513 addi a0,a5,1268 # 30064f4 + 300302e: 39e5 jal ra,3002d26 + 3003030: a001 j 3003030 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 3003032: fdc42783 lw a5,-36(s0) + 3003036: 4f9c lw a5,24(a5) + 3003038: 853e mv a0,a5 + 300303a: 3419 jal ra,3002a40 + 300303c: 87aa mv a5,a0 + 300303e: 0017c793 xori a5,a5,1 + 3003042: 9f81 uxtb a5 + 3003044: cb91 beqz a5,3003058 + 3003046: 10c00593 li a1,268 + 300304a: 030067b7 lui a5,0x3006 + 300304e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003052: 39d1 jal ra,3002d26 + 3003054: 4785 li a5,1 + 3003056: a005 j 3003076 + + CRG_RegStruct *reg = handle->baseAddress; + 3003058: fdc42783 lw a5,-36(s0) + 300305c: 439c lw a5,0(a5) + 300305e: fef42623 sw a5,-20(s0) + /* The write protection of the CRG register needs to be disabled. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3003062: 38c5 jal ra,3002952 + DCL_CRG_SetCoreClkSel(reg, handle->coreClkSelect); + 3003064: fdc42783 lw a5,-36(s0) + 3003068: 4f9c lw a5,24(a5) + 300306a: 85be mv a1,a5 + 300306c: fec42503 lw a0,-20(s0) + 3003070: 3199 jal ra,3002cb6 + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3003072: 3221 jal ra,300297a + + return BASE_STATUS_OK; + 3003074: 4781 li a5,0 +} + 3003076: 853e mv a0,a5 + 3003078: 50b2 lw ra,44(sp) + 300307a: 5422 lw s0,40(sp) + 300307c: 6145 addi sp,sp,48 + 300307e: 8082 ret + +03003080 : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +static inline unsigned int CRG_GetVcoFreq(void) +{ + 3003080: 1101 addi sp,sp,-32 + 3003082: ce06 sw ra,28(sp) + 3003084: cc22 sw s0,24(sp) + 3003086: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int regFbdiv; + CRG_RegStruct *crg = g_crgBaseAddr; + 3003088: 040007b7 lui a5,0x4000 + 300308c: 4947a783 lw a5,1172(a5) # 4000494 + 3003090: fef42623 sw a5,-20(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003094: fec42703 lw a4,-20(s0) + 3003098: 100007b7 lui a5,0x10000 + 300309c: 00f70a63 beq a4,a5,30030b0 + 30030a0: 12200593 li a1,290 + 30030a4: 030067b7 lui a5,0x3006 + 30030a8: 4f478513 addi a0,a5,1268 # 30064f4 + 30030ac: 39ad jal ra,3002d26 + 30030ae: a001 j 30030ae + CRG_ASSERT_PARAM((XTRAIL_FREQ <= 30000000U)); /* The maximum of the external clock source is 30000000U. */ + + freq = CRG_GetPllRefIni(crg->PERI_CRG0.BIT.pll_ref_cksel); + 30030b0: fec42783 lw a5,-20(s0) + 30030b4: 439c lw a5,0(a5) + 30030b6: 8b85 andi a5,a5,1 + 30030b8: 9f81 uxtb a5 + 30030ba: 853e mv a0,a5 + 30030bc: 25c1 jal ra,300377c + 30030be: fea42423 sw a0,-24(s0) + freq /= CRG_GetPreDivValue(crg->PERI_CRG1.BIT.pll_prediv); + 30030c2: fec42783 lw a5,-20(s0) + 30030c6: 43dc lw a5,4(a5) + 30030c8: 8bbd andi a5,a5,15 + 30030ca: 9f81 uxtb a5 + 30030cc: 853e mv a0,a5 + 30030ce: 2de1 jal ra,30037a6 + 30030d0: 872a mv a4,a0 + 30030d2: fe842783 lw a5,-24(s0) + 30030d6: 02e7d7b3 divu a5,a5,a4 + 30030da: fef42423 sw a5,-24(s0) + regFbdiv = CRG_GetPllFbDivValue(crg->PERI_CRG2.BIT.pll_fbdiv); /* Get the value of the fbdiv register. */ + 30030de: fec42783 lw a5,-20(s0) + 30030e2: 479c lw a5,8(a5) + 30030e4: 9f81 uxtb a5 + 30030e6: 853e mv a0,a5 + 30030e8: 25f5 jal ra,30037d4 + 30030ea: fea42223 sw a0,-28(s0) + freq *= (regFbdiv >= 0x06) ? regFbdiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 30030ee: fe442783 lw a5,-28(s0) + 30030f2: 4719 li a4,6 + 30030f4: 00e7f363 bgeu a5,a4,30030fa + 30030f8: 4799 li a5,6 + 30030fa: fe842703 lw a4,-24(s0) + 30030fe: 02f707b3 mul a5,a4,a5 + 3003102: fef42423 sw a5,-24(s0) + return freq; + 3003106: fe842783 lw a5,-24(s0) +} + 300310a: 853e mv a0,a5 + 300310c: 40f2 lw ra,28(sp) + 300310e: 4462 lw s0,24(sp) + 3003110: 6105 addi sp,sp,32 + 3003112: 8082 ret + +03003114 : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +unsigned int HAL_CRG_GetPllFreq(void) +{ + 3003114: 1101 addi sp,sp,-32 + 3003116: ce06 sw ra,28(sp) + 3003118: cc22 sw s0,24(sp) + 300311a: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int pllPostDivValue; + CRG_RegStruct *crg = g_crgBaseAddr; + 300311c: 040007b7 lui a5,0x4000 + 3003120: 4947a783 lw a5,1172(a5) # 4000494 + 3003124: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003128: fe842703 lw a4,-24(s0) + 300312c: 100007b7 lui a5,0x10000 + 3003130: 00f70a63 beq a4,a5,3003144 + 3003134: 13700593 li a1,311 + 3003138: 030067b7 lui a5,0x3006 + 300313c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003140: 36dd jal ra,3002d26 + 3003142: a001 j 3003142 + freq = CRG_GetVcoFreq(); + 3003144: 3f35 jal ra,3003080 + 3003146: fea42623 sw a0,-20(s0) + pllPostDivValue = CRG_GetPllPostDivValue((CRG_PllPostDiv)crg->PERI_CRG3.BIT.pll_postdiv1); + 300314a: fe842783 lw a5,-24(s0) + 300314e: 47dc lw a5,12(a5) + 3003150: 8bbd andi a5,a5,15 + 3003152: 9f81 uxtb a5 + 3003154: 853e mv a0,a5 + 3003156: 25c1 jal ra,3003816 + 3003158: fea42223 sw a0,-28(s0) + /* Calculate the PLL output clock frequency based on the VCO clock frequency and post-division coefficient. */ + if (pllPostDivValue != 0) { + 300315c: fe442783 lw a5,-28(s0) + 3003160: cb89 beqz a5,3003172 + freq /= pllPostDivValue; + 3003162: fec42703 lw a4,-20(s0) + 3003166: fe442783 lw a5,-28(s0) + 300316a: 02f757b3 divu a5,a4,a5 + 300316e: fef42623 sw a5,-20(s0) + } + return freq; + 3003172: fec42783 lw a5,-20(s0) +} + 3003176: 853e mv a0,a5 + 3003178: 40f2 lw ra,28(sp) + 300317a: 4462 lw s0,24(sp) + 300317c: 6105 addi sp,sp,32 + 300317e: 8082 ret + +03003180 : + * @brief Get Core Clock Frequence + * @param None + * @retval unsigned int Core clock frequency + */ +unsigned int HAL_CRG_GetCoreClkFreq(void) +{ + 3003180: 1101 addi sp,sp,-32 + 3003182: ce06 sw ra,28(sp) + 3003184: cc22 sw s0,24(sp) + 3003186: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int coreClkSelect; + CRG_RegStruct *crg = g_crgBaseAddr; + 3003188: 040007b7 lui a5,0x4000 + 300318c: 4947a783 lw a5,1172(a5) # 4000494 + 3003190: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003194: fe842703 lw a4,-24(s0) + 3003198: 100007b7 lui a5,0x10000 + 300319c: 00f70a63 beq a4,a5,30031b0 + 30031a0: 14c00593 li a1,332 + 30031a4: 030067b7 lui a5,0x3006 + 30031a8: 4f478513 addi a0,a5,1268 # 30064f4 + 30031ac: 3ead jal ra,3002d26 + 30031ae: a001 j 30031ae + coreClkSelect = crg->PERI_CRG64.BIT.clk_pst1_sw_sel; + 30031b0: fe842783 lw a5,-24(s0) + 30031b4: 1007a783 lw a5,256(a5) + 30031b8: 8b8d andi a5,a5,3 + 30031ba: 9f81 uxtb a5 + 30031bc: fef42223 sw a5,-28(s0) + switch (coreClkSelect) { + 30031c0: fe442783 lw a5,-28(s0) + 30031c4: 4705 li a4,1 + 30031c6: 02e78063 beq a5,a4,30031e6 + 30031ca: 4705 li a4,1 + 30031cc: 00e7e663 bltu a5,a4,30031d8 + 30031d0: 4709 li a4,2 + 30031d2: 02e78163 beq a5,a4,30031f4 + 30031d6: a01d j 30031fc + case CRG_CORE_CLK_SELECT_HOSC: /* The clock source is an internal high-speed clock. */ + freq = HOSC_FREQ; + 30031d8: 017d87b7 lui a5,0x17d8 + 30031dc: 84078793 addi a5,a5,-1984 # 17d7840 + 30031e0: fef42623 sw a5,-20(s0) + break; + 30031e4: a015 j 3003208 + + case CRG_CORE_CLK_SELECT_TCXO: /* The clock source is the external crystal oscillator clock. */ + freq = XTRAIL_FREQ; + 30031e6: 01c9c7b7 lui a5,0x1c9c + 30031ea: 38078793 addi a5,a5,896 # 1c9c380 + 30031ee: fef42623 sw a5,-20(s0) + break; + 30031f2: a819 j 3003208 + + case CRG_CORE_CLK_SELECT_PLL: /* The clock source is the PLL. */ + freq = HAL_CRG_GetPllFreq(); + 30031f4: 3705 jal ra,3003114 + 30031f6: fea42623 sw a0,-20(s0) + break; + 30031fa: a039 j 3003208 + + default: + freq = LOSC_FREQ; + 30031fc: 67a1 lui a5,0x8 + 30031fe: d0078793 addi a5,a5,-768 # 7d00 + 3003202: fef42623 sw a5,-20(s0) + break; + 3003206: 0001 nop + } + return freq; + 3003208: fec42783 lw a5,-20(s0) +} + 300320c: 853e mv a0,a5 + 300320e: 40f2 lw ra,28(sp) + 3003210: 4462 lw s0,24(sp) + 3003212: 6105 addi sp,sp,32 + 3003214: 8082 ret + +03003216 : + * @brief Get Clock Frequence + * @param handle CRG Handle + * @retval Frequece of IP + */ +unsigned int HAL_CRG_GetIpFreq(const void *baseAddress) +{ + 3003216: 7179 addi sp,sp,-48 + 3003218: d606 sw ra,44(sp) + 300321a: d422 sw s0,40(sp) + 300321c: 1800 addi s0,sp,48 + 300321e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3003222: fdc42783 lw a5,-36(s0) + 3003226: eb89 bnez a5,3003238 + 3003228: 16900593 li a1,361 + 300322c: 030067b7 lui a5,0x3006 + 3003230: 4f478513 addi a0,a5,1268 # 30064f4 + 3003234: 3ccd jal ra,3002d26 + 3003236: a001 j 3003236 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003238: 040007b7 lui a5,0x4000 + 300323c: 4947a703 lw a4,1172(a5) # 4000494 + 3003240: 100007b7 lui a5,0x10000 + 3003244: 00f70a63 beq a4,a5,3003258 + 3003248: 16a00593 li a1,362 + 300324c: 030067b7 lui a5,0x3006 + 3003250: 4f478513 addi a0,a5,1268 # 30064f4 + 3003254: 3cc9 jal ra,3002d26 + 3003256: a001 j 3003256 +#ifdef FPGA + /* Use this function to obtain the clock frequency during the FPGA phase. */ + return CHIP_GetIpFreqHz(baseAddress); +#else + unsigned int hclk = HAL_CRG_GetCoreClkFreq(); + 3003258: 3725 jal ra,3003180 + 300325a: fea42423 sw a0,-24(s0) + unsigned int freq = LOSC_FREQ; + 300325e: 67a1 lui a5,0x8 + 3003260: d0078793 addi a5,a5,-768 # 7d00 + 3003264: fef42623 sw a5,-20(s0) + unsigned int coreClkFreq; + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003268: fdc42503 lw a0,-36(s0) + 300326c: 2cc9 jal ra,300353e + 300326e: fea42223 sw a0,-28(s0) + if (p == NULL) { + 3003272: fe442783 lw a5,-28(s0) + 3003276: e781 bnez a5,300327e + return freq; + 3003278: fec42783 lw a5,-20(s0) + 300327c: a895 j 30032f0 + } + switch (p->type) { + 300327e: fe442783 lw a5,-28(s0) + 3003282: 43dc lw a5,4(a5) + 3003284: 4715 li a4,5 + 3003286: 04f76a63 bltu a4,a5,30032da + 300328a: 00279713 slli a4,a5,0x2 + 300328e: 030067b7 lui a5,0x3006 + 3003292: 53078793 addi a5,a5,1328 # 3006530 + 3003296: 97ba add a5,a5,a4 + 3003298: 439c lw a5,0(a5) + 300329a: 8782 jr a5 + case CRG_IP_NONE_CLK_SEL: + case CRG_IP_EFC: + case CRG_IP_ANA: + freq = hclk; /* Returns the internal high speed clock frequency. */ + 300329c: fe842783 lw a5,-24(s0) + 30032a0: fef42623 sw a5,-20(s0) + break; + 30032a4: a825 j 30032dc + + case CRG_IP_CAN: + freq = CRG_GetPllRefIni(g_crgBaseAddr->PERI_CRG0.BIT.pll_ref_cksel); + 30032a6: 040007b7 lui a5,0x4000 + 30032aa: 4947a783 lw a5,1172(a5) # 4000494 + 30032ae: 439c lw a5,0(a5) + 30032b0: 8b85 andi a5,a5,1 + 30032b2: 9f81 uxtb a5 + 30032b4: 853e mv a0,a5 + 30032b6: 21d9 jal ra,300377c + 30032b8: fea42623 sw a0,-20(s0) + break; + 30032bc: a005 j 30032dc + + case CRG_IP_ADC: + /* Get core clock frequence for calculating the ADC clock frequency. */ + coreClkFreq = HAL_CRG_GetCoreClkFreq(); + 30032be: 35c9 jal ra,3003180 + 30032c0: fea42023 sw a0,-32(s0) + freq = CRG_GetAdcIpFreq(p, CRG_GetVcoFreq(), coreClkFreq); + 30032c4: 3b75 jal ra,3003080 + 30032c6: 87aa mv a5,a0 + 30032c8: fe042603 lw a2,-32(s0) + 30032cc: 85be mv a1,a5 + 30032ce: fe442503 lw a0,-28(s0) + 30032d2: 2c85 jal ra,3003542 + 30032d4: fea42623 sw a0,-20(s0) + break; + 30032d8: a011 j 30032dc + + case CRG_IP_IWDG: /* The IWDG clock frequency is an internal low-speed clock. */ + default: + break; + 30032da: 0001 nop + } + if (freq == 0) { + 30032dc: fec42783 lw a5,-20(s0) + 30032e0: e791 bnez a5,30032ec + freq = LOSC_FREQ; + 30032e2: 67a1 lui a5,0x8 + 30032e4: d0078793 addi a5,a5,-768 # 7d00 + 30032e8: fef42623 sw a5,-20(s0) + } + return freq; + 30032ec: fec42783 lw a5,-20(s0) +#endif +} + 30032f0: 853e mv a0,a5 + 30032f2: 50b2 lw ra,44(sp) + 30032f4: 5422 lw s0,40(sp) + 30032f6: 6145 addi sp,sp,48 + 30032f8: 8082 ret + +030032fa : + * @param enable enable mask + * @retval BASE_STATUS_ERROR Can't find the Match or operation is not support + * @retval BASE_STATUS_OK Operation Success + */ +BASE_StatusType HAL_CRG_IpEnableSet(const void *baseAddress, unsigned int enable) +{ + 30032fa: 7179 addi sp,sp,-48 + 30032fc: d606 sw ra,44(sp) + 30032fe: d422 sw s0,40(sp) + 3003300: 1800 addi s0,sp,48 + 3003302: fca42e23 sw a0,-36(s0) + 3003306: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 300330a: fdc42783 lw a5,-36(s0) + 300330e: eb89 bnez a5,3003320 + 3003310: 19c00593 li a1,412 + 3003314: 030067b7 lui a5,0x3006 + 3003318: 4f478513 addi a0,a5,1268 # 30064f4 + 300331c: 3429 jal ra,3002d26 + 300331e: a001 j 300331e + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003320: 040007b7 lui a5,0x4000 + 3003324: 4947a703 lw a4,1172(a5) # 4000494 + 3003328: 100007b7 lui a5,0x10000 + 300332c: 00f70a63 beq a4,a5,3003340 + 3003330: 19d00593 li a1,413 + 3003334: 030067b7 lui a5,0x3006 + 3003338: 4f478513 addi a0,a5,1268 # 30064f4 + 300333c: 32ed jal ra,3002d26 + 300333e: a001 j 300333e + /* Check the validity of the input parameters. */ + CRG_PARAM_CHECK_WITH_RET((enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE), BASE_STATUS_ERROR); + 3003340: fd842703 lw a4,-40(s0) + 3003344: 4785 li a5,1 + 3003346: 00f70e63 beq a4,a5,3003362 + 300334a: fd842783 lw a5,-40(s0) + 300334e: cb91 beqz a5,3003362 + 3003350: 19f00593 li a1,415 + 3003354: 030067b7 lui a5,0x3006 + 3003358: 4f478513 addi a0,a5,1268 # 30064f4 + 300335c: 32e9 jal ra,3002d26 + 300335e: 4785 li a5,1 + 3003360: a0a5 j 30033c8 + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003362: fdc42503 lw a0,-36(s0) + 3003366: 2ae1 jal ra,300353e + 3003368: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 300336c: fec42783 lw a5,-20(s0) + 3003370: c799 beqz a5,300337e + 3003372: fec42783 lw a5,-20(s0) + 3003376: 43d8 lw a4,4(a5) + 3003378: 4795 li a5,5 + 300337a: 00e7f463 bgeu a5,a4,3003382 + return BASE_STATUS_ERROR; + 300337e: 4785 li a5,1 + 3003380: a0a1 j 30033c8 + } + if (g_ipClkProc[p->type].enableSet == NULL) { + 3003382: fec42783 lw a5,-20(s0) + 3003386: 43d4 lw a3,4(a5) + 3003388: 040007b7 lui a5,0x4000 + 300338c: 02478713 addi a4,a5,36 # 4000024 + 3003390: 02400793 li a5,36 + 3003394: 02f687b3 mul a5,a3,a5 + 3003398: 97ba add a5,a5,a4 + 300339a: 479c lw a5,8(a5) + 300339c: e399 bnez a5,30033a2 + return BASE_STATUS_ERROR; + 300339e: 4785 li a5,1 + 30033a0: a025 j 30033c8 + } + g_ipClkProc[p->type].enableSet(p, enable); + 30033a2: fec42783 lw a5,-20(s0) + 30033a6: 43d4 lw a3,4(a5) + 30033a8: 040007b7 lui a5,0x4000 + 30033ac: 02478713 addi a4,a5,36 # 4000024 + 30033b0: 02400793 li a5,36 + 30033b4: 02f687b3 mul a5,a3,a5 + 30033b8: 97ba add a5,a5,a4 + 30033ba: 479c lw a5,8(a5) + 30033bc: fd842583 lw a1,-40(s0) + 30033c0: fec42503 lw a0,-20(s0) + 30033c4: 9782 jalr a5 + return BASE_STATUS_OK; + 30033c6: 4781 li a5,0 +} + 30033c8: 853e mv a0,a5 + 30033ca: 50b2 lw ra,44(sp) + 30033cc: 5422 lw s0,40(sp) + 30033ce: 6145 addi sp,sp,48 + 30033d0: 8082 ret + +030033d2 : + * @param select clock select, @see CRG_APBLsClkSelect for ip in apb_ls_subsys or CRG_AdcClkSelect for adc + * @retval BASE_STATUS_OK success + * @retval BASE_STATUS_ERROR fail + */ +BASE_StatusType HAL_CRG_IpClkSelectSet(const void *baseAddress, unsigned int select) +{ + 30033d2: 7179 addi sp,sp,-48 + 30033d4: d606 sw ra,44(sp) + 30033d6: d422 sw s0,40(sp) + 30033d8: 1800 addi s0,sp,48 + 30033da: fca42e23 sw a0,-36(s0) + 30033de: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 30033e2: fdc42783 lw a5,-36(s0) + 30033e6: eb89 bnez a5,30033f8 + 30033e8: 1cd00593 li a1,461 + 30033ec: 030067b7 lui a5,0x3006 + 30033f0: 4f478513 addi a0,a5,1268 # 30064f4 + 30033f4: 2d8d jal ra,3003a66 + 30033f6: a001 j 30033f6 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30033f8: 040007b7 lui a5,0x4000 + 30033fc: 4947a703 lw a4,1172(a5) # 4000494 + 3003400: 100007b7 lui a5,0x10000 + 3003404: 00f70a63 beq a4,a5,3003418 + 3003408: 1ce00593 li a1,462 + 300340c: 030067b7 lui a5,0x3006 + 3003410: 4f478513 addi a0,a5,1268 # 30064f4 + 3003414: 2d89 jal ra,3003a66 + 3003416: a001 j 3003416 + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003418: fdc42503 lw a0,-36(s0) + 300341c: 220d jal ra,300353e + 300341e: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 3003422: fec42783 lw a5,-20(s0) + 3003426: c799 beqz a5,3003434 + 3003428: fec42783 lw a5,-20(s0) + 300342c: 43d8 lw a4,4(a5) + 300342e: 4795 li a5,5 + 3003430: 00e7f463 bgeu a5,a4,3003438 + return BASE_STATUS_ERROR; + 3003434: 4785 li a5,1 + 3003436: a0a1 j 300347e + } + if (g_ipClkProc[p->type].clkSelSet == NULL) { + 3003438: fec42783 lw a5,-20(s0) + 300343c: 43d4 lw a3,4(a5) + 300343e: 040007b7 lui a5,0x4000 + 3003442: 02478713 addi a4,a5,36 # 4000024 + 3003446: 02400793 li a5,36 + 300344a: 02f687b3 mul a5,a3,a5 + 300344e: 97ba add a5,a5,a4 + 3003450: 47dc lw a5,12(a5) + 3003452: e399 bnez a5,3003458 + return BASE_STATUS_ERROR; + 3003454: 4785 li a5,1 + 3003456: a025 j 300347e + } + g_ipClkProc[p->type].clkSelSet(p, select); /* Clock selection of the configuration module. */ + 3003458: fec42783 lw a5,-20(s0) + 300345c: 43d4 lw a3,4(a5) + 300345e: 040007b7 lui a5,0x4000 + 3003462: 02478713 addi a4,a5,36 # 4000024 + 3003466: 02400793 li a5,36 + 300346a: 02f687b3 mul a5,a3,a5 + 300346e: 97ba add a5,a5,a4 + 3003470: 47dc lw a5,12(a5) + 3003472: fd842583 lw a1,-40(s0) + 3003476: fec42503 lw a0,-20(s0) + 300347a: 9782 jalr a5 + return BASE_STATUS_OK; + 300347c: 4781 li a5,0 +} + 300347e: 853e mv a0,a5 + 3003480: 50b2 lw ra,44(sp) + 3003482: 5422 lw s0,40(sp) + 3003484: 6145 addi sp,sp,48 + 3003486: 8082 ret + +03003488 : + * @param div set div value + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Match Fail or Not support + */ +BASE_StatusType HAL_CRG_IpClkDivSet(const void *baseAddress, unsigned int div) +{ + 3003488: 7179 addi sp,sp,-48 + 300348a: d606 sw ra,44(sp) + 300348c: d422 sw s0,40(sp) + 300348e: 1800 addi s0,sp,48 + 3003490: fca42e23 sw a0,-36(s0) + 3003494: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3003498: fdc42783 lw a5,-36(s0) + 300349c: eb89 bnez a5,30034ae + 300349e: 22c00593 li a1,556 + 30034a2: 030067b7 lui a5,0x3006 + 30034a6: 4f478513 addi a0,a5,1268 # 30064f4 + 30034aa: 2b75 jal ra,3003a66 + 30034ac: a001 j 30034ac + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30034ae: 040007b7 lui a5,0x4000 + 30034b2: 4947a703 lw a4,1172(a5) # 4000494 + 30034b6: 100007b7 lui a5,0x10000 + 30034ba: 00f70a63 beq a4,a5,30034ce + 30034be: 22d00593 li a1,557 + 30034c2: 030067b7 lui a5,0x3006 + 30034c6: 4f478513 addi a0,a5,1268 # 30064f4 + 30034ca: 2b71 jal ra,3003a66 + 30034cc: a001 j 30034cc + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 30034ce: fdc42503 lw a0,-36(s0) + 30034d2: 20b5 jal ra,300353e + 30034d4: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 30034d8: fec42783 lw a5,-20(s0) + 30034dc: c799 beqz a5,30034ea + 30034de: fec42783 lw a5,-20(s0) + 30034e2: 43d8 lw a4,4(a5) + 30034e4: 4795 li a5,5 + 30034e6: 00e7f463 bgeu a5,a4,30034ee + return BASE_STATUS_ERROR; + 30034ea: 4785 li a5,1 + 30034ec: a0a1 j 3003534 + } + if (g_ipClkProc[p->type].clkDivSet == NULL) { + 30034ee: fec42783 lw a5,-20(s0) + 30034f2: 43d4 lw a3,4(a5) + 30034f4: 040007b7 lui a5,0x4000 + 30034f8: 02478713 addi a4,a5,36 # 4000024 + 30034fc: 02400793 li a5,36 + 3003500: 02f687b3 mul a5,a3,a5 + 3003504: 97ba add a5,a5,a4 + 3003506: 4b9c lw a5,16(a5) + 3003508: e399 bnez a5,300350e + return BASE_STATUS_ERROR; + 300350a: 4785 li a5,1 + 300350c: a025 j 3003534 + } + g_ipClkProc[p->type].clkDivSet(p, div); /* Configure the clock frequency divider of the module. */ + 300350e: fec42783 lw a5,-20(s0) + 3003512: 43d4 lw a3,4(a5) + 3003514: 040007b7 lui a5,0x4000 + 3003518: 02478713 addi a4,a5,36 # 4000024 + 300351c: 02400793 li a5,36 + 3003520: 02f687b3 mul a5,a3,a5 + 3003524: 97ba add a5,a5,a4 + 3003526: 4b9c lw a5,16(a5) + 3003528: fd842583 lw a1,-40(s0) + 300352c: fec42503 lw a0,-20(s0) + 3003530: 9782 jalr a5 + return BASE_STATUS_OK; + 3003532: 4781 li a5,0 +} + 3003534: 853e mv a0,a5 + 3003536: 50b2 lw ra,44(sp) + 3003538: 5422 lw s0,40(sp) + 300353a: 6145 addi sp,sp,48 + 300353c: 8082 ret + +0300353e : + 300353e: c6bfd06f j 30011a8 + +03003542 : + * @param coreClkFreq core clock rate + * @retval Ip Frequence + */ +static unsigned int CRG_GetAdcIpFreq(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int baseClkRate, + unsigned int coreClkFreq) +{ + 3003542: 7139 addi sp,sp,-64 + 3003544: de06 sw ra,60(sp) + 3003546: dc22 sw s0,56(sp) + 3003548: 0080 addi s0,sp,64 + 300354a: fca42623 sw a0,-52(s0) + 300354e: fcb42423 sw a1,-56(s0) + 3003552: fcc42223 sw a2,-60(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003556: fcc42783 lw a5,-52(s0) + 300355a: eb89 bnez a5,300356c + 300355c: 2af00593 li a1,687 + 3003560: 030067b7 lui a5,0x3006 + 3003564: 4f478513 addi a0,a5,1268 # 30064f4 + 3003568: 29fd jal ra,3003a66 + 300356a: a001 j 300356a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300356c: 040007b7 lui a5,0x4000 + 3003570: 4947a783 lw a5,1172(a5) # 4000494 + 3003574: eb89 bnez a5,3003586 + 3003576: 2b000593 li a1,688 + 300357a: 030067b7 lui a5,0x3006 + 300357e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003582: 21d5 jal ra,3003a66 + 3003584: a001 j 3003584 + + unsigned int clkSel; + unsigned int clkDiv; + unsigned int pst2Div; + unsigned int freq = 0; + 3003586: fe042623 sw zero,-20(s0) + + /* Obtains the clock source selection of the ADC. */ + const CRG_IpProc *proc = &g_ipClkProc[matchInfo->type]; + 300358a: fcc42783 lw a5,-52(s0) + 300358e: 43d8 lw a4,4(a5) + 3003590: 02400793 li a5,36 + 3003594: 02f70733 mul a4,a4,a5 + 3003598: 040007b7 lui a5,0x4000 + 300359c: 02478793 addi a5,a5,36 # 4000024 + 30035a0: 97ba add a5,a5,a4 + 30035a2: fef42423 sw a5,-24(s0) + if (proc->clkSelGet == NULL) { + 30035a6: fe842783 lw a5,-24(s0) + 30035aa: 4fdc lw a5,28(a5) + 30035ac: e399 bnez a5,30035b2 + return 0; + 30035ae: 4781 li a5,0 + 30035b0: a07d j 300365e + } + clkSel = proc->clkSelGet(matchInfo); + 30035b2: fe842783 lw a5,-24(s0) + 30035b6: 4fdc lw a5,28(a5) + 30035b8: fcc42503 lw a0,-52(s0) + 30035bc: 9782 jalr a5 + 30035be: fea42223 sw a0,-28(s0) + /* Calculate the frequency from the ADC's clock source. */ + if (clkSel == CRG_ADC_CLK_SYN_CORE) { + 30035c2: fe442703 lw a4,-28(s0) + 30035c6: 478d li a5,3 + 30035c8: 00f71763 bne a4,a5,30035d6 + freq = coreClkFreq; + 30035cc: fc442783 lw a5,-60(s0) + 30035d0: fef42623 sw a5,-20(s0) + 30035d4: a085 j 3003634 + } else if (clkSel == CRG_ADC_CLK_ASYN_HOSC) { + 30035d6: fe442783 lw a5,-28(s0) + 30035da: eb81 bnez a5,30035ea + freq = HOSC_FREQ; + 30035dc: 017d87b7 lui a5,0x17d8 + 30035e0: 84078793 addi a5,a5,-1984 # 17d7840 + 30035e4: fef42623 sw a5,-20(s0) + 30035e8: a0b1 j 3003634 + } else if (clkSel == CRG_ADC_CLK_ASYN_TCXO) { + 30035ea: fe442703 lw a4,-28(s0) + 30035ee: 4785 li a5,1 + 30035f0: 00f71963 bne a4,a5,3003602 + /* The maximum speed of the external clock source is 30000000U. */ + freq = (XTRAIL_FREQ > 30000000U) ? 0 : XTRAIL_FREQ; + 30035f4: 01c9c7b7 lui a5,0x1c9c + 30035f8: 38078793 addi a5,a5,896 # 1c9c380 + 30035fc: fef42623 sw a5,-20(s0) + 3003600: a815 j 3003634 + } else if (clkSel == CRG_ADC_CLK_ASYN_PLL_DIV) { + 3003602: fe442703 lw a4,-28(s0) + 3003606: 4789 li a5,2 + 3003608: 02f71663 bne a4,a5,3003634 + pst2Div = CRG_GetPllPostDivValue((CRG_PllPostDiv)g_crgBaseAddr->PERI_CRG3.BIT.pll_postdiv2); + 300360c: 040007b7 lui a5,0x4000 + 3003610: 4947a783 lw a5,1172(a5) # 4000494 + 3003614: 47dc lw a5,12(a5) + 3003616: 8391 srli a5,a5,0x4 + 3003618: 8bbd andi a5,a5,15 + 300361a: 9f81 uxtb a5 + 300361c: 853e mv a0,a5 + 300361e: 2ae5 jal ra,3003816 + 3003620: fea42023 sw a0,-32(s0) + freq = baseClkRate / pst2Div; + 3003624: fc842703 lw a4,-56(s0) + 3003628: fe042783 lw a5,-32(s0) + 300362c: 02f757b3 divu a5,a4,a5 + 3003630: fef42623 sw a5,-20(s0) + } + + /* Obtain the frequency divider based on the ADC clock source. */ + if (proc->clkDivGet == NULL) { + 3003634: fe842783 lw a5,-24(s0) + 3003638: 539c lw a5,32(a5) + 300363a: e399 bnez a5,3003640 + return 0; + 300363c: 4781 li a5,0 + 300363e: a005 j 300365e + } + clkDiv = proc->clkDivGet(matchInfo); + 3003640: fe842783 lw a5,-24(s0) + 3003644: 539c lw a5,32(a5) + 3003646: fcc42503 lw a0,-52(s0) + 300364a: 9782 jalr a5 + 300364c: fca42e23 sw a0,-36(s0) + /* Calculate the clock frequency of the ADC. */ + return (freq / (clkDiv + 1)); + 3003650: fdc42783 lw a5,-36(s0) + 3003654: 0785 addi a5,a5,1 + 3003656: fec42703 lw a4,-20(s0) + 300365a: 02f757b3 divu a5,a4,a5 +} + 300365e: 853e mv a0,a5 + 3003660: 50f2 lw ra,60(sp) + 3003662: 5462 lw s0,56(sp) + 3003664: 6121 addi sp,sp,64 + 3003666: 8082 ret + +03003668 : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValidPllConfig(const CRG_Handle *handle) +{ + 3003668: 7179 addi sp,sp,-48 + 300366a: d606 sw ra,44(sp) + 300366c: d422 sw s0,40(sp) + 300366e: 1800 addi s0,sp,48 + 3003670: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + unsigned int freq; + + freq = CRG_GetPllRefIni(handle->pllRefClkSelect); + 3003674: fdc42783 lw a5,-36(s0) + 3003678: 43dc lw a5,4(a5) + 300367a: 853e mv a0,a5 + 300367c: 2201 jal ra,300377c + 300367e: fea42623 sw a0,-20(s0) + preDiv = CRG_GetPreDivValue(handle->pllPreDiv); + 3003682: fdc42783 lw a5,-36(s0) + 3003686: 479c lw a5,8(a5) + 3003688: 853e mv a0,a5 + 300368a: 2a31 jal ra,30037a6 + 300368c: fea42423 sw a0,-24(s0) + /* Check the validity of the prescaled clock frequency. */ + if (!IsCrgValidPreDiv(freq, preDiv)) { + 3003690: fe842583 lw a1,-24(s0) + 3003694: fec42503 lw a0,-20(s0) + 3003698: c26ff0ef jal ra,3002abe + 300369c: 87aa mv a5,a0 + 300369e: 0017c793 xori a5,a5,1 + 30036a2: 9f81 uxtb a5 + 30036a4: c399 beqz a5,30036aa + return BASE_STATUS_ERROR; + 30036a6: 4785 li a5,1 + 30036a8: a8a5 j 3003720 + } + freq /= preDiv; + 30036aa: fec42703 lw a4,-20(s0) + 30036ae: fe842783 lw a5,-24(s0) + 30036b2: 02f757b3 divu a5,a4,a5 + 30036b6: fef42623 sw a5,-20(s0) + /* Check the validity of the clock frequency after frequency multiplication. */ + if (!IsCrgValidFdDiv(freq, handle->pllFbDiv)) { + 30036ba: fdc42783 lw a5,-36(s0) + 30036be: 47dc lw a5,12(a5) + 30036c0: 85be mv a1,a5 + 30036c2: fec42503 lw a0,-20(s0) + 30036c6: c56ff0ef jal ra,3002b1c + 30036ca: 87aa mv a5,a0 + 30036cc: 0017c793 xori a5,a5,1 + 30036d0: 9f81 uxtb a5 + 30036d2: c399 beqz a5,30036d8 + return BASE_STATUS_ERROR; + 30036d4: 4785 li a5,1 + 30036d6: a0a9 j 3003720 + } + freq *= (handle->pllFbDiv > 0x06) ? handle->pllFbDiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 30036d8: fdc42783 lw a5,-36(s0) + 30036dc: 47dc lw a5,12(a5) + 30036de: 4719 li a4,6 + 30036e0: 00e7f363 bgeu a5,a4,30036e6 + 30036e4: 4799 li a5,6 + 30036e6: fec42703 lw a4,-20(s0) + 30036ea: 02f707b3 mul a5,a4,a5 + 30036ee: fef42623 sw a5,-20(s0) + /* Check whether the PLL output frequency is valid. */ + if (IsCrgValidPostDiv(freq, handle->pllPostDiv) && IsCrgValidPostDiv2(freq, handle->handleEx.pllPostDiv2)) { + 30036f2: fdc42783 lw a5,-36(s0) + 30036f6: 4b9c lw a5,16(a5) + 30036f8: 85be mv a1,a5 + 30036fa: fec42503 lw a0,-20(s0) + 30036fe: ca8ff0ef jal ra,3002ba6 + 3003702: 87aa mv a5,a0 + 3003704: cf89 beqz a5,300371e + 3003706: fdc42783 lw a5,-36(s0) + 300370a: 4fdc lw a5,28(a5) + 300370c: 85be mv a1,a5 + 300370e: fec42503 lw a0,-20(s0) + 3003712: cdcff0ef jal ra,3002bee + 3003716: 87aa mv a5,a0 + 3003718: c399 beqz a5,300371e + return BASE_STATUS_OK; + 300371a: 4781 li a5,0 + 300371c: a011 j 3003720 + } + return BASE_STATUS_ERROR; + 300371e: 4785 li a5,1 +} + 3003720: 853e mv a0,a5 + 3003722: 50b2 lw ra,44(sp) + 3003724: 5422 lw s0,40(sp) + 3003726: 6145 addi sp,sp,48 + 3003728: 8082 ret + +0300372a : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValid1MHzConfig(const CRG_Handle *handle) +{ + 300372a: 7179 addi sp,sp,-48 + 300372c: d622 sw s0,44(sp) + 300372e: 1800 addi s0,sp,48 + 3003730: fca42e23 sw a0,-36(s0) + unsigned int freq; + /* Get the ref frequency of the 1 MHz clock. */ + freq = (handle->handleEx.clk1MSelect == CRG_1M_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003734: fdc42783 lw a5,-36(s0) + 3003738: 539c lw a5,32(a5) + 300373a: e791 bnez a5,3003746 + 300373c: 017d87b7 lui a5,0x17d8 + 3003740: 84078793 addi a5,a5,-1984 # 17d7840 + 3003744: a029 j 300374e + 3003746: 01c9c7b7 lui a5,0x1c9c + 300374a: 38078793 addi a5,a5,896 # 1c9c380 + 300374e: fef42623 sw a5,-20(s0) + /* Check whether the 1MHz output frequency is valid. */ + if ((freq / (handle->handleEx.clk1MDiv + 1)) == CRG_FREQ_1MHz) { + 3003752: fdc42783 lw a5,-36(s0) + 3003756: 53dc lw a5,36(a5) + 3003758: 0785 addi a5,a5,1 + 300375a: fec42703 lw a4,-20(s0) + 300375e: 02f75733 divu a4,a4,a5 + 3003762: 000f47b7 lui a5,0xf4 + 3003766: 24078793 addi a5,a5,576 # f4240 + 300376a: 00f71463 bne a4,a5,3003772 + return BASE_STATUS_OK; + 300376e: 4781 li a5,0 + 3003770: a011 j 3003774 + } + return BASE_STATUS_ERROR; + 3003772: 4785 li a5,1 +} + 3003774: 853e mv a0,a5 + 3003776: 5432 lw s0,44(sp) + 3003778: 6145 addi sp,sp,48 + 300377a: 8082 ret + +0300377c : + * @brief Get clock frequence + * @param crg CRG_RegStruct + * @retval The frequence fo clock + */ +static inline unsigned int CRG_GetPllRefIni(CRG_PllRefClkSelect pllRefClkSelect) +{ + 300377c: 1101 addi sp,sp,-32 + 300377e: ce22 sw s0,28(sp) + 3003780: 1000 addi s0,sp,32 + 3003782: fea42623 sw a0,-20(s0) + /* The maximum speed of the external clock source is 30000000U. */ + if (pllRefClkSelect == CRG_PLL_REF_CLK_SELECT_XTAL && XTRAIL_FREQ > 30000000U) { + return 0; + } + return (pllRefClkSelect == (unsigned int)CRG_PLL_REF_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003786: fec42783 lw a5,-20(s0) + 300378a: e791 bnez a5,3003796 + 300378c: 017d87b7 lui a5,0x17d8 + 3003790: 84078793 addi a5,a5,-1984 # 17d7840 + 3003794: a029 j 300379e + 3003796: 01c9c7b7 lui a5,0x1c9c + 300379a: 38078793 addi a5,a5,896 # 1c9c380 +} + 300379e: 853e mv a0,a5 + 30037a0: 4472 lw s0,28(sp) + 30037a2: 6105 addi sp,sp,32 + 30037a4: 8082 ret + +030037a6 : + * @brief Get previous division Value before PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPreDivValue(CRG_PllPreDiv pllPredDiv) +{ + 30037a6: 7179 addi sp,sp,-48 + 30037a8: d622 sw s0,44(sp) + 30037aa: 1800 addi s0,sp,48 + 30037ac: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + if (pllPredDiv <= CRG_PLL_PREDIV_1) { /* 0 or 1 returns PLL_PREDIV_OUT_1. */ + 30037b0: fdc42783 lw a5,-36(s0) + 30037b4: e789 bnez a5,30037be + preDiv = PLL_PREDIV_OUT_1; + 30037b6: 4785 li a5,1 + 30037b8: fef42623 sw a5,-20(s0) + 30037bc: a031 j 30037c8 + } else { + preDiv = pllPredDiv + 1; + 30037be: fdc42783 lw a5,-36(s0) + 30037c2: 0785 addi a5,a5,1 + 30037c4: fef42623 sw a5,-20(s0) + } + return preDiv; + 30037c8: fec42783 lw a5,-20(s0) +} + 30037cc: 853e mv a0,a5 + 30037ce: 5432 lw s0,44(sp) + 30037d0: 6145 addi sp,sp,48 + 30037d2: 8082 ret + +030037d4 : + * @brief Get PLL loop divider ratio + * @param crg CRG_RegStruct + * @retval PLL loop divider ratio + */ +static inline unsigned int CRG_GetPllFbDivValue(unsigned int pllFbDiv) +{ + 30037d4: 7179 addi sp,sp,-48 + 30037d6: d622 sw s0,44(sp) + 30037d8: 1800 addi s0,sp,48 + 30037da: fca42e23 sw a0,-36(s0) + unsigned int div = pllFbDiv; + 30037de: fdc42783 lw a5,-36(s0) + 30037e2: fef42623 sw a5,-20(s0) + /* Check the validity of the minimum frequency multiplication parameter. */ + if (div < CRG_PLL_FBDIV_MIN) { + 30037e6: fec42703 lw a4,-20(s0) + 30037ea: 4795 li a5,5 + 30037ec: 00e7e563 bltu a5,a4,30037f6 + div = CRG_PLL_FBDIV_MIN; + 30037f0: 4799 li a5,6 + 30037f2: fef42623 sw a5,-20(s0) + } + /* Check the validity of the maximum frequency multiplication parameter. */ + if (div > CRG_PLL_FBDIV_MAX) { + 30037f6: fec42703 lw a4,-20(s0) + 30037fa: 07f00793 li a5,127 + 30037fe: 00e7f663 bgeu a5,a4,300380a + div = CRG_PLL_FBDIV_MAX; + 3003802: 07f00793 li a5,127 + 3003806: fef42623 sw a5,-20(s0) + } + return div; + 300380a: fec42783 lw a5,-20(s0) +} + 300380e: 853e mv a0,a5 + 3003810: 5432 lw s0,44(sp) + 3003812: 6145 addi sp,sp,48 + 3003814: 8082 ret + +03003816 : + * @brief Get post division Value after PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPllPostDivValue(unsigned int pllPostDiv) +{ + 3003816: 7179 addi sp,sp,-48 + 3003818: d622 sw s0,44(sp) + 300381a: 1800 addi s0,sp,48 + 300381c: fca42e23 sw a0,-36(s0) + unsigned int div = pllPostDiv; + 3003820: fdc42783 lw a5,-36(s0) + 3003824: fef42623 sw a5,-20(s0) + if (div > CRG_PLL_POSTDIV_8) { + 3003828: fec42703 lw a4,-20(s0) + 300382c: 479d li a5,7 + 300382e: 00e7f663 bgeu a5,a4,300383a + div = (CRG_PLL_POSTDIV_8 + 1); /* If the postdiv is greater than 8, set this postdiv to 8. */ + 3003832: 47a1 li a5,8 + 3003834: fef42623 sw a5,-20(s0) + 3003838: a031 j 3003844 + } else { + div += 1; + 300383a: fec42783 lw a5,-20(s0) + 300383e: 0785 addi a5,a5,1 + 3003840: fef42623 sw a5,-20(s0) + } + return div; + 3003844: fec42783 lw a5,-20(s0) +} + 3003848: 853e mv a0,a5 + 300384a: 5432 lw s0,44(sp) + 300384c: 6145 addi sp,sp,48 + 300384e: 8082 ret + +03003850 : + * @param matchInfo IP without Clock select match info + * @param enable BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003850: 7179 addi sp,sp,-48 + 3003852: d606 sw ra,44(sp) + 3003854: d422 sw s0,40(sp) + 3003856: 1800 addi s0,sp,48 + 3003858: fca42e23 sw a0,-36(s0) + 300385c: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003860: fdc42783 lw a5,-36(s0) + 3003864: eb89 bnez a5,3003876 + 3003866: 34d00593 li a1,845 + 300386a: 030067b7 lui a5,0x3006 + 300386e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003872: 2ad5 jal ra,3003a66 + 3003874: a001 j 3003874 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003876: 040007b7 lui a5,0x4000 + 300387a: 4947a783 lw a5,1172(a5) # 4000494 + 300387e: eb89 bnez a5,3003890 + 3003880: 34e00593 li a1,846 + 3003884: 030067b7 lui a5,0x3006 + 3003888: 4f478513 addi a0,a5,1268 # 30064f4 + 300388c: 2ae9 jal ra,3003a66 + 300388e: a001 j 300388e + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003890: 040007b7 lui a5,0x4000 + 3003894: 4947a783 lw a5,1172(a5) # 4000494 + 3003898: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 300389c: fdc42783 lw a5,-36(s0) + 30038a0: 279e lhu a5,8(a5) + 30038a2: 873e mv a4,a5 + 30038a4: fec42783 lw a5,-20(s0) + 30038a8: 97ba add a5,a5,a4 + 30038aa: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 30038ae: fe842783 lw a5,-24(s0) + 30038b2: 439c lw a5,0(a5) + 30038b4: fef42223 sw a5,-28(s0) + if (enable & IP_CLK_ENABLE) { /* Set enable of target ip. */ + 30038b8: fd842783 lw a5,-40(s0) + 30038bc: 8b85 andi a5,a5,1 + 30038be: c7c1 beqz a5,3003946 + cfg.BIT.clkEnMask |= 1 << matchInfo->bitOffset; + 30038c0: fe442783 lw a5,-28(s0) + 30038c4: 9fa1 uxth a5 + 30038c6: 01079713 slli a4,a5,0x10 + 30038ca: 8741 srai a4,a4,0x10 + 30038cc: fdc42783 lw a5,-36(s0) + 30038d0: 27bc lbu a5,10(a5) + 30038d2: 86be mv a3,a5 + 30038d4: 4785 li a5,1 + 30038d6: 00d797b3 sll a5,a5,a3 + 30038da: 07c2 slli a5,a5,0x10 + 30038dc: 87c1 srai a5,a5,0x10 + 30038de: 8fd9 or a5,a5,a4 + 30038e0: 07c2 slli a5,a5,0x10 + 30038e2: 87c1 srai a5,a5,0x10 + 30038e4: 01079693 slli a3,a5,0x10 + 30038e8: 82c1 srli a3,a3,0x10 + 30038ea: fe442783 lw a5,-28(s0) + 30038ee: 6741 lui a4,0x10 + 30038f0: 177d addi a4,a4,-1 # ffff + 30038f2: 8f75 and a4,a4,a3 + 30038f4: 76c1 lui a3,0xffff0 + 30038f6: 8ff5 and a5,a5,a3 + 30038f8: 8fd9 or a5,a5,a4 + 30038fa: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); + 30038fe: fe442783 lw a5,-28(s0) + 3003902: 83c1 srli a5,a5,0x10 + 3003904: 9fa1 uxth a5 + 3003906: 01079713 slli a4,a5,0x10 + 300390a: 8741 srai a4,a4,0x10 + 300390c: fdc42783 lw a5,-36(s0) + 3003910: 27bc lbu a5,10(a5) + 3003912: 86be mv a3,a5 + 3003914: 4785 li a5,1 + 3003916: 00d797b3 sll a5,a5,a3 + 300391a: 07c2 slli a5,a5,0x10 + 300391c: 87c1 srai a5,a5,0x10 + 300391e: fff7c793 not a5,a5 + 3003922: 07c2 slli a5,a5,0x10 + 3003924: 87c1 srai a5,a5,0x10 + 3003926: 8ff9 and a5,a5,a4 + 3003928: 07c2 slli a5,a5,0x10 + 300392a: 87c1 srai a5,a5,0x10 + 300392c: 01079713 slli a4,a5,0x10 + 3003930: 8341 srli a4,a4,0x10 + 3003932: fe442783 lw a5,-28(s0) + 3003936: 0742 slli a4,a4,0x10 + 3003938: 66c1 lui a3,0x10 + 300393a: 16fd addi a3,a3,-1 # ffff + 300393c: 8ff5 and a5,a5,a3 + 300393e: 8fd9 or a5,a5,a4 + 3003940: fef42223 sw a5,-28(s0) + 3003944: a059 j 30039ca + } else { + cfg.BIT.clkEnMask &= ~(1 << matchInfo->bitOffset); /* Disable of target ip. */ + 3003946: fe442783 lw a5,-28(s0) + 300394a: 9fa1 uxth a5 + 300394c: 01079713 slli a4,a5,0x10 + 3003950: 8741 srai a4,a4,0x10 + 3003952: fdc42783 lw a5,-36(s0) + 3003956: 27bc lbu a5,10(a5) + 3003958: 86be mv a3,a5 + 300395a: 4785 li a5,1 + 300395c: 00d797b3 sll a5,a5,a3 + 3003960: 07c2 slli a5,a5,0x10 + 3003962: 87c1 srai a5,a5,0x10 + 3003964: fff7c793 not a5,a5 + 3003968: 07c2 slli a5,a5,0x10 + 300396a: 87c1 srai a5,a5,0x10 + 300396c: 8ff9 and a5,a5,a4 + 300396e: 07c2 slli a5,a5,0x10 + 3003970: 87c1 srai a5,a5,0x10 + 3003972: 01079693 slli a3,a5,0x10 + 3003976: 82c1 srli a3,a3,0x10 + 3003978: fe442783 lw a5,-28(s0) + 300397c: 6741 lui a4,0x10 + 300397e: 177d addi a4,a4,-1 # ffff + 3003980: 8f75 and a4,a4,a3 + 3003982: 76c1 lui a3,0xffff0 + 3003984: 8ff5 and a5,a5,a3 + 3003986: 8fd9 or a5,a5,a4 + 3003988: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq |= (1 << matchInfo->bitOffset); + 300398c: fe442783 lw a5,-28(s0) + 3003990: 83c1 srli a5,a5,0x10 + 3003992: 9fa1 uxth a5 + 3003994: 01079713 slli a4,a5,0x10 + 3003998: 8741 srai a4,a4,0x10 + 300399a: fdc42783 lw a5,-36(s0) + 300399e: 27bc lbu a5,10(a5) + 30039a0: 86be mv a3,a5 + 30039a2: 4785 li a5,1 + 30039a4: 00d797b3 sll a5,a5,a3 + 30039a8: 07c2 slli a5,a5,0x10 + 30039aa: 87c1 srai a5,a5,0x10 + 30039ac: 8fd9 or a5,a5,a4 + 30039ae: 07c2 slli a5,a5,0x10 + 30039b0: 87c1 srai a5,a5,0x10 + 30039b2: 01079713 slli a4,a5,0x10 + 30039b6: 8341 srli a4,a4,0x10 + 30039b8: fe442783 lw a5,-28(s0) + 30039bc: 0742 slli a4,a4,0x10 + 30039be: 66c1 lui a3,0x10 + 30039c0: 16fd addi a3,a3,-1 # ffff + 30039c2: 8ff5 and a5,a5,a3 + 30039c4: 8fd9 or a5,a5,a4 + 30039c6: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 30039ca: fe442703 lw a4,-28(s0) + 30039ce: fe842783 lw a5,-24(s0) + 30039d2: c398 sw a4,0(a5) +} + 30039d4: 0001 nop + 30039d6: 50b2 lw ra,44(sp) + 30039d8: 5422 lw s0,40(sp) + 30039da: 6145 addi sp,sp,48 + 30039dc: 8082 ret + +030039de : + * @brief Get Enable status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock Enable status + */ +static unsigned int CRG_IpWoClkSelEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30039de: 7179 addi sp,sp,-48 + 30039e0: d606 sw ra,44(sp) + 30039e2: d422 sw s0,40(sp) + 30039e4: 1800 addi s0,sp,48 + 30039e6: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30039ea: fdc42783 lw a5,-36(s0) + 30039ee: eb89 bnez a5,3003a00 + 30039f0: 36500593 li a1,869 + 30039f4: 030067b7 lui a5,0x3006 + 30039f8: 4f478513 addi a0,a5,1268 # 30064f4 + 30039fc: 20ad jal ra,3003a66 + 30039fe: a001 j 30039fe + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003a00: 040007b7 lui a5,0x4000 + 3003a04: 4947a783 lw a5,1172(a5) # 4000494 + 3003a08: eb89 bnez a5,3003a1a + 3003a0a: 36600593 li a1,870 + 3003a0e: 030067b7 lui a5,0x3006 + 3003a12: 4f478513 addi a0,a5,1268 # 30064f4 + 3003a16: 2881 jal ra,3003a66 + 3003a18: a001 j 3003a18 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003a1a: 040007b7 lui a5,0x4000 + 3003a1e: 4947a783 lw a5,1172(a5) # 4000494 + 3003a22: fef42623 sw a5,-20(s0) + /* Get enable status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003a26: fdc42783 lw a5,-36(s0) + 3003a2a: 279e lhu a5,8(a5) + 3003a2c: 873e mv a4,a5 + 3003a2e: fec42783 lw a5,-20(s0) + 3003a32: 97ba add a5,a5,a4 + 3003a34: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + + cfg.value = p->value; + 3003a38: fe842783 lw a5,-24(s0) + 3003a3c: 439c lw a5,0(a5) + 3003a3e: fef42223 sw a5,-28(s0) + return (cfg.BIT.clkEnMask & (1 << matchInfo->bitOffset)) == 0 ? false : true; + 3003a42: fe442783 lw a5,-28(s0) + 3003a46: 9fa1 uxth a5 + 3003a48: 873e mv a4,a5 + 3003a4a: fdc42783 lw a5,-36(s0) + 3003a4e: 27bc lbu a5,10(a5) + 3003a50: 40f757b3 sra a5,a4,a5 + 3003a54: 8b85 andi a5,a5,1 + 3003a56: 00f037b3 snez a5,a5 + 3003a5a: 9f81 uxtb a5 +} + 3003a5c: 853e mv a0,a5 + 3003a5e: 50b2 lw ra,44(sp) + 3003a60: 5422 lw s0,40(sp) + 3003a62: 6145 addi sp,sp,48 + 3003a64: 8082 ret + +03003a66 : + 3003a66: c48fe06f j 3001eae + +03003a6a : + * @param matchInfo IP without Clock select match info + * @param reset BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelResetSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int reset) +{ + 3003a6a: 7179 addi sp,sp,-48 + 3003a6c: d606 sw ra,44(sp) + 3003a6e: d422 sw s0,40(sp) + 3003a70: 1800 addi s0,sp,48 + 3003a72: fca42e23 sw a0,-36(s0) + 3003a76: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003a7a: fdc42783 lw a5,-36(s0) + 3003a7e: eb89 bnez a5,3003a90 + 3003a80: 37900593 li a1,889 + 3003a84: 030067b7 lui a5,0x3006 + 3003a88: 4f478513 addi a0,a5,1268 # 30064f4 + 3003a8c: 3fe9 jal ra,3003a66 + 3003a8e: a001 j 3003a8e + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003a90: 040007b7 lui a5,0x4000 + 3003a94: 4947a783 lw a5,1172(a5) # 4000494 + 3003a98: eb89 bnez a5,3003aaa + 3003a9a: 37a00593 li a1,890 + 3003a9e: 030067b7 lui a5,0x3006 + 3003aa2: 4f478513 addi a0,a5,1268 # 30064f4 + 3003aa6: 37c1 jal ra,3003a66 + 3003aa8: a001 j 3003aa8 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003aaa: 040007b7 lui a5,0x4000 + 3003aae: 4947a783 lw a5,1172(a5) # 4000494 + 3003ab2: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003ab6: fdc42783 lw a5,-36(s0) + 3003aba: 279e lhu a5,8(a5) + 3003abc: 873e mv a4,a5 + 3003abe: fec42783 lw a5,-20(s0) + 3003ac2: 97ba add a5,a5,a4 + 3003ac4: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003ac8: fe842783 lw a5,-24(s0) + 3003acc: 439c lw a5,0(a5) + 3003ace: fef42223 sw a5,-28(s0) + if (reset & BASE_CFG_SET) { + 3003ad2: fd842783 lw a5,-40(s0) + 3003ad6: 8b85 andi a5,a5,1 + 3003ad8: c3a9 beqz a5,3003b1a + cfg.BIT.softResetReq |= 1 << matchInfo->bitOffset; /* reset of target ip. */ + 3003ada: fe442783 lw a5,-28(s0) + 3003ade: 83c1 srli a5,a5,0x10 + 3003ae0: 9fa1 uxth a5 + 3003ae2: 01079713 slli a4,a5,0x10 + 3003ae6: 8741 srai a4,a4,0x10 + 3003ae8: fdc42783 lw a5,-36(s0) + 3003aec: 27bc lbu a5,10(a5) + 3003aee: 86be mv a3,a5 + 3003af0: 4785 li a5,1 + 3003af2: 00d797b3 sll a5,a5,a3 + 3003af6: 07c2 slli a5,a5,0x10 + 3003af8: 87c1 srai a5,a5,0x10 + 3003afa: 8fd9 or a5,a5,a4 + 3003afc: 07c2 slli a5,a5,0x10 + 3003afe: 87c1 srai a5,a5,0x10 + 3003b00: 01079713 slli a4,a5,0x10 + 3003b04: 8341 srli a4,a4,0x10 + 3003b06: fe442783 lw a5,-28(s0) + 3003b0a: 0742 slli a4,a4,0x10 + 3003b0c: 66c1 lui a3,0x10 + 3003b0e: 16fd addi a3,a3,-1 # ffff + 3003b10: 8ff5 and a5,a5,a3 + 3003b12: 8fd9 or a5,a5,a4 + 3003b14: fef42223 sw a5,-28(s0) + 3003b18: a0a1 j 3003b60 + } else { + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); /* Undo reset of target ip. */ + 3003b1a: fe442783 lw a5,-28(s0) + 3003b1e: 83c1 srli a5,a5,0x10 + 3003b20: 9fa1 uxth a5 + 3003b22: 01079713 slli a4,a5,0x10 + 3003b26: 8741 srai a4,a4,0x10 + 3003b28: fdc42783 lw a5,-36(s0) + 3003b2c: 27bc lbu a5,10(a5) + 3003b2e: 86be mv a3,a5 + 3003b30: 4785 li a5,1 + 3003b32: 00d797b3 sll a5,a5,a3 + 3003b36: 07c2 slli a5,a5,0x10 + 3003b38: 87c1 srai a5,a5,0x10 + 3003b3a: fff7c793 not a5,a5 + 3003b3e: 07c2 slli a5,a5,0x10 + 3003b40: 87c1 srai a5,a5,0x10 + 3003b42: 8ff9 and a5,a5,a4 + 3003b44: 07c2 slli a5,a5,0x10 + 3003b46: 87c1 srai a5,a5,0x10 + 3003b48: 01079713 slli a4,a5,0x10 + 3003b4c: 8341 srli a4,a4,0x10 + 3003b4e: fe442783 lw a5,-28(s0) + 3003b52: 0742 slli a4,a4,0x10 + 3003b54: 66c1 lui a3,0x10 + 3003b56: 16fd addi a3,a3,-1 # ffff + 3003b58: 8ff5 and a5,a5,a3 + 3003b5a: 8fd9 or a5,a5,a4 + 3003b5c: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3003b60: fe442703 lw a4,-28(s0) + 3003b64: fe842783 lw a5,-24(s0) + 3003b68: c398 sw a4,0(a5) +} + 3003b6a: 0001 nop + 3003b6c: 50b2 lw ra,44(sp) + 3003b6e: 5422 lw s0,40(sp) + 3003b70: 6145 addi sp,sp,48 + 3003b72: 8082 ret + +03003b74 : + * @brief Get Reset status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock select reset status + */ +static unsigned int CRG_IpWoClkSelResetGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003b74: 7179 addi sp,sp,-48 + 3003b76: d606 sw ra,44(sp) + 3003b78: d422 sw s0,40(sp) + 3003b7a: 1800 addi s0,sp,48 + 3003b7c: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003b80: fdc42783 lw a5,-36(s0) + 3003b84: eb89 bnez a5,3003b96 + 3003b86: 38f00593 li a1,911 + 3003b8a: 030067b7 lui a5,0x3006 + 3003b8e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003b92: 3dd1 jal ra,3003a66 + 3003b94: a001 j 3003b94 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003b96: 040007b7 lui a5,0x4000 + 3003b9a: 4947a783 lw a5,1172(a5) # 4000494 + 3003b9e: eb89 bnez a5,3003bb0 + 3003ba0: 39000593 li a1,912 + 3003ba4: 030067b7 lui a5,0x3006 + 3003ba8: 4f478513 addi a0,a5,1268 # 30064f4 + 3003bac: 3d6d jal ra,3003a66 + 3003bae: a001 j 3003bae + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003bb0: 040007b7 lui a5,0x4000 + 3003bb4: 4947a783 lw a5,1172(a5) # 4000494 + 3003bb8: fef42623 sw a5,-20(s0) + /* Get the reset status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003bbc: fdc42783 lw a5,-36(s0) + 3003bc0: 279e lhu a5,8(a5) + 3003bc2: 873e mv a4,a5 + 3003bc4: fec42783 lw a5,-20(s0) + 3003bc8: 97ba add a5,a5,a4 + 3003bca: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003bce: fe842783 lw a5,-24(s0) + 3003bd2: 439c lw a5,0(a5) + 3003bd4: fef42223 sw a5,-28(s0) + return (cfg.BIT.softResetReq & (1 << matchInfo->bitOffset)) ? BASE_CFG_SET : BASE_CFG_UNSET; + 3003bd8: fe442783 lw a5,-28(s0) + 3003bdc: 83c1 srli a5,a5,0x10 + 3003bde: 9fa1 uxth a5 + 3003be0: 873e mv a4,a5 + 3003be2: fdc42783 lw a5,-36(s0) + 3003be6: 27bc lbu a5,10(a5) + 3003be8: 40f757b3 sra a5,a4,a5 + 3003bec: 8b85 andi a5,a5,1 + 3003bee: 00f037b3 snez a5,a5 + 3003bf2: 9f81 uxtb a5 +} + 3003bf4: 853e mv a0,a5 + 3003bf6: 50b2 lw ra,44(sp) + 3003bf8: 5422 lw s0,40(sp) + 3003bfa: 6145 addi sp,sp,48 + 3003bfc: 8082 ret + +03003bfe : + * @param matchInfo ADC match info + * @param enable IP_CLK_ENABLE + * @retval None + */ +static void CRG_AdcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003bfe: 7179 addi sp,sp,-48 + 3003c00: d606 sw ra,44(sp) + 3003c02: d422 sw s0,40(sp) + 3003c04: 1800 addi s0,sp,48 + 3003c06: fca42e23 sw a0,-36(s0) + 3003c0a: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003c0e: fdc42783 lw a5,-36(s0) + 3003c12: eb89 bnez a5,3003c24 + 3003c14: 3a200593 li a1,930 + 3003c18: 030067b7 lui a5,0x3006 + 3003c1c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003c20: 3599 jal ra,3003a66 + 3003c22: a001 j 3003c22 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003c24: 040007b7 lui a5,0x4000 + 3003c28: 4947a783 lw a5,1172(a5) # 4000494 + 3003c2c: eb89 bnez a5,3003c3e + 3003c2e: 3a300593 li a1,931 + 3003c32: 030067b7 lui a5,0x3006 + 3003c36: 4f478513 addi a0,a5,1268 # 30064f4 + 3003c3a: 3535 jal ra,3003a66 + 3003c3c: a001 j 3003c3c + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003c3e: 040007b7 lui a5,0x4000 + 3003c42: 4947a783 lw a5,1172(a5) # 4000494 + 3003c46: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003c4a: fdc42783 lw a5,-36(s0) + 3003c4e: 279e lhu a5,8(a5) + 3003c50: 873e mv a4,a5 + 3003c52: fec42783 lw a5,-20(s0) + 3003c56: 97ba add a5,a5,a4 + 3003c58: fef42423 sw a5,-24(s0) + CRG_AdcIpCfg cfg; + cfg.value[1] = p->value[1]; + 3003c5c: fe842783 lw a5,-24(s0) + 3003c60: 43dc lw a5,4(a5) + 3003c62: fef42223 sw a5,-28(s0) + if (enable) { /* Enables and Deassert reset the ADC clock. */ + 3003c66: fd842783 lw a5,-40(s0) + 3003c6a: cf99 beqz a5,3003c88 + cfg.BIT.clk_adc_cken = BASE_CFG_SET; + 3003c6c: fe442783 lw a5,-28(s0) + 3003c70: 0017e793 ori a5,a5,1 + 3003c74: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003c78: fe442783 lw a5,-28(s0) + 3003c7c: 7741 lui a4,0xffff0 + 3003c7e: 177d addi a4,a4,-1 # fffeffff + 3003c80: 8ff9 and a5,a5,a4 + 3003c82: fef42223 sw a5,-28(s0) + 3003c86: a829 j 3003ca0 + } else { /* Disable and reset the ADC clock. */ + cfg.BIT.clk_adc_cken = BASE_CFG_UNSET; + 3003c88: fe442783 lw a5,-28(s0) + 3003c8c: 9bf9 andi a5,a5,-2 + 3003c8e: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003c92: fe442783 lw a5,-28(s0) + 3003c96: 7741 lui a4,0xffff0 + 3003c98: 177d addi a4,a4,-1 # fffeffff + 3003c9a: 8ff9 and a5,a5,a4 + 3003c9c: fef42223 sw a5,-28(s0) + } + p->value[1] = cfg.value[1]; + 3003ca0: fe442703 lw a4,-28(s0) + 3003ca4: fe842783 lw a5,-24(s0) + 3003ca8: c3d8 sw a4,4(a5) +} + 3003caa: 0001 nop + 3003cac: 50b2 lw ra,44(sp) + 3003cae: 5422 lw s0,40(sp) + 3003cb0: 6145 addi sp,sp,48 + 3003cb2: 8082 ret + +03003cb4 : + * @brief Get Enable status of ADC + * @param matchInfo ADC match info + * @retval Cken of ADC + */ +static unsigned int CRG_AdcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003cb4: 7179 addi sp,sp,-48 + 3003cb6: d606 sw ra,44(sp) + 3003cb8: d422 sw s0,40(sp) + 3003cba: 1800 addi s0,sp,48 + 3003cbc: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003cc0: fdc42783 lw a5,-36(s0) + 3003cc4: eb89 bnez a5,3003cd6 + 3003cc6: 3ba00593 li a1,954 + 3003cca: 030067b7 lui a5,0x3006 + 3003cce: 4f478513 addi a0,a5,1268 # 30064f4 + 3003cd2: 3b51 jal ra,3003a66 + 3003cd4: a001 j 3003cd4 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003cd6: 040007b7 lui a5,0x4000 + 3003cda: 4947a783 lw a5,1172(a5) # 4000494 + 3003cde: eb89 bnez a5,3003cf0 + 3003ce0: 3bb00593 li a1,955 + 3003ce4: 030067b7 lui a5,0x3006 + 3003ce8: 4f478513 addi a0,a5,1268 # 30064f4 + 3003cec: 3bad jal ra,3003a66 + 3003cee: a001 j 3003cee + unsigned int enable; + /* Get the enable status of the ADC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003cf0: 040007b7 lui a5,0x4000 + 3003cf4: 4947a783 lw a5,1172(a5) # 4000494 + 3003cf8: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003cfc: fdc42783 lw a5,-36(s0) + 3003d00: 279e lhu a5,8(a5) + 3003d02: 873e mv a4,a5 + 3003d04: fec42783 lw a5,-20(s0) + 3003d08: 97ba add a5,a5,a4 + 3003d0a: fef42423 sw a5,-24(s0) + enable = ((p->BIT.clk_adc_cken != 0)) ? IP_CLK_ENABLE : IP_CLK_DISABLE; + 3003d0e: fe842783 lw a5,-24(s0) + 3003d12: 43dc lw a5,4(a5) + 3003d14: 8b85 andi a5,a5,1 + 3003d16: 9f81 uxtb a5 + 3003d18: c399 beqz a5,3003d1e + 3003d1a: 4785 li a5,1 + 3003d1c: a011 j 3003d20 + 3003d1e: 4781 li a5,0 + 3003d20: fef42223 sw a5,-28(s0) + return enable; + 3003d24: fe442783 lw a5,-28(s0) +} + 3003d28: 853e mv a0,a5 + 3003d2a: 50b2 lw ra,44(sp) + 3003d2c: 5422 lw s0,40(sp) + 3003d2e: 6145 addi sp,sp,48 + 3003d30: 8082 ret + +03003d32 : + * @param matchInfo ADC match info + * @param clkSelect @see CRG_AdcClkSelect + * @retval None + */ +static void CRG_AdcClkSelectSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int clkSelect) +{ + 3003d32: 7179 addi sp,sp,-48 + 3003d34: d606 sw ra,44(sp) + 3003d36: d422 sw s0,40(sp) + 3003d38: 1800 addi s0,sp,48 + 3003d3a: fca42e23 sw a0,-36(s0) + 3003d3e: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003d42: fdc42783 lw a5,-36(s0) + 3003d46: eb89 bnez a5,3003d58 + 3003d48: 3cc00593 li a1,972 + 3003d4c: 030067b7 lui a5,0x3006 + 3003d50: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d54: 3b09 jal ra,3003a66 + 3003d56: a001 j 3003d56 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003d58: 040007b7 lui a5,0x4000 + 3003d5c: 4947a783 lw a5,1172(a5) # 4000494 + 3003d60: eb89 bnez a5,3003d72 + 3003d62: 3cd00593 li a1,973 + 3003d66: 030067b7 lui a5,0x3006 + 3003d6a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d6e: 39e5 jal ra,3003a66 + 3003d70: a001 j 3003d70 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003d72: 040007b7 lui a5,0x4000 + 3003d76: 4947a703 lw a4,1172(a5) # 4000494 + 3003d7a: 100007b7 lui a5,0x10000 + 3003d7e: 00f70a63 beq a4,a5,3003d92 + 3003d82: 3ce00593 li a1,974 + 3003d86: 030067b7 lui a5,0x3006 + 3003d8a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d8e: 39e1 jal ra,3003a66 + 3003d90: a001 j 3003d90 + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkModeSelect(clkSelect)); + 3003d92: fd842503 lw a0,-40(s0) + 3003d96: ea1fe0ef jal ra,3002c36 + 3003d9a: 87aa mv a5,a0 + 3003d9c: 0017c793 xori a5,a5,1 + 3003da0: 9f81 uxtb a5 + 3003da2: cb89 beqz a5,3003db4 + 3003da4: 3cf00593 li a1,975 + 3003da8: 030067b7 lui a5,0x3006 + 3003dac: 4f478513 addi a0,a5,1268 # 30064f4 + 3003db0: 395d jal ra,3003a66 + 3003db2: a89d j 3003e28 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003db4: 040007b7 lui a5,0x4000 + 3003db8: 4947a783 lw a5,1172(a5) # 4000494 + 3003dbc: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003dc0: fdc42783 lw a5,-36(s0) + 3003dc4: 279e lhu a5,8(a5) + 3003dc6: 873e mv a4,a5 + 3003dc8: fec42783 lw a5,-20(s0) + 3003dcc: 97ba add a5,a5,a4 + 3003dce: fef42423 sw a5,-24(s0) + if (clkSelect == CRG_ADC_CLK_SYN_CORE) { + 3003dd2: fd842703 lw a4,-40(s0) + 3003dd6: 478d li a5,3 + 3003dd8: 00f71a63 bne a4,a5,3003dec + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_SET; /* use sync clock */ + 3003ddc: fe842703 lw a4,-24(s0) + 3003de0: 435c lw a5,4(a4) + 3003de2: 010006b7 lui a3,0x1000 + 3003de6: 8fd5 or a5,a5,a3 + 3003de8: c35c sw a5,4(a4) + 3003dea: a83d j 3003e28 + } else { + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3003dec: b67fe0ef jal ra,3002952 + g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel = clkSelect; /* write clock selection */ + 3003df0: 040007b7 lui a5,0x4000 + 3003df4: 4947a703 lw a4,1172(a5) # 4000494 + 3003df8: fd842783 lw a5,-40(s0) + 3003dfc: 8b8d andi a5,a5,3 + 3003dfe: 0ff7f693 andi a3,a5,255 + 3003e02: 10072783 lw a5,256(a4) + 3003e06: 8a8d andi a3,a3,3 + 3003e08: 0692 slli a3,a3,0x4 + 3003e0a: fcf7f793 andi a5,a5,-49 + 3003e0e: 8fd5 or a5,a5,a3 + 3003e10: 10f72023 sw a5,256(a4) + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3003e14: b67fe0ef jal ra,300297a + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_UNSET; + 3003e18: fe842703 lw a4,-24(s0) + 3003e1c: 435c lw a5,4(a4) + 3003e1e: ff0006b7 lui a3,0xff000 + 3003e22: 16fd addi a3,a3,-1 # feffffff + 3003e24: 8ff5 and a5,a5,a3 + 3003e26: c35c sw a5,4(a4) + } +} + 3003e28: 50b2 lw ra,44(sp) + 3003e2a: 5422 lw s0,40(sp) + 3003e2c: 6145 addi sp,sp,48 + 3003e2e: 8082 ret + +03003e30 : + * @brief Get ADC Clock Select + * @param matchInfo ADC match info + * @retval Adc Clock select @see CRG_AdcClkSelect + */ +static unsigned int CRG_AdcClkSelectGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003e30: 7179 addi sp,sp,-48 + 3003e32: d606 sw ra,44(sp) + 3003e34: d422 sw s0,40(sp) + 3003e36: 1800 addi s0,sp,48 + 3003e38: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003e3c: fdc42783 lw a5,-36(s0) + 3003e40: eb89 bnez a5,3003e52 + 3003e42: 3e400593 li a1,996 + 3003e46: 030067b7 lui a5,0x3006 + 3003e4a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003e4e: 3921 jal ra,3003a66 + 3003e50: a001 j 3003e50 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003e52: 040007b7 lui a5,0x4000 + 3003e56: 4947a783 lw a5,1172(a5) # 4000494 + 3003e5a: eb89 bnez a5,3003e6c + 3003e5c: 3e500593 li a1,997 + 3003e60: 030067b7 lui a5,0x3006 + 3003e64: 4f478513 addi a0,a5,1268 # 30064f4 + 3003e68: 3efd jal ra,3003a66 + 3003e6a: a001 j 3003e6a + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003e6c: 040007b7 lui a5,0x4000 + 3003e70: 4947a783 lw a5,1172(a5) # 4000494 + 3003e74: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003e78: fdc42783 lw a5,-36(s0) + 3003e7c: 279e lhu a5,8(a5) + 3003e7e: 873e mv a4,a5 + 3003e80: fec42783 lw a5,-20(s0) + 3003e84: 97ba add a5,a5,a4 + 3003e86: fef42423 sw a5,-24(s0) + if (p->BIT.cfg_adc_ckmode_sel == BASE_CFG_SET) { + 3003e8a: fe842783 lw a5,-24(s0) + 3003e8e: 43dc lw a5,4(a5) + 3003e90: 83e1 srli a5,a5,0x18 + 3003e92: 8b85 andi a5,a5,1 + 3003e94: 0ff7f713 andi a4,a5,255 + 3003e98: 4785 li a5,1 + 3003e9a: 00f71463 bne a4,a5,3003ea2 + return CRG_ADC_CLK_SYN_CORE; /* Synchronous clock signal */ + 3003e9e: 478d li a5,3 + 3003ea0: a811 j 3003eb4 + } + return g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel; /* asynchronous clock signal */ + 3003ea2: 040007b7 lui a5,0x4000 + 3003ea6: 4947a783 lw a5,1172(a5) # 4000494 + 3003eaa: 1007a783 lw a5,256(a5) + 3003eae: 8391 srli a5,a5,0x4 + 3003eb0: 8b8d andi a5,a5,3 + 3003eb2: 9f81 uxtb a5 +} + 3003eb4: 853e mv a0,a5 + 3003eb6: 50b2 lw ra,44(sp) + 3003eb8: 5422 lw s0,40(sp) + 3003eba: 6145 addi sp,sp,48 + 3003ebc: 8082 ret + +03003ebe : + * @param matchInfo ADC match info + * @param div Adc clock division + * @retval None + */ +static void CRG_AdcDivSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int div) +{ + 3003ebe: 7179 addi sp,sp,-48 + 3003ec0: d606 sw ra,44(sp) + 3003ec2: d422 sw s0,40(sp) + 3003ec4: 1800 addi s0,sp,48 + 3003ec6: fca42e23 sw a0,-36(s0) + 3003eca: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003ece: fdc42783 lw a5,-36(s0) + 3003ed2: eb89 bnez a5,3003ee4 + 3003ed4: 3f700593 li a1,1015 + 3003ed8: 030067b7 lui a5,0x3006 + 3003edc: 4f478513 addi a0,a5,1268 # 30064f4 + 3003ee0: 3659 jal ra,3003a66 + 3003ee2: a001 j 3003ee2 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003ee4: 040007b7 lui a5,0x4000 + 3003ee8: 4947a783 lw a5,1172(a5) # 4000494 + 3003eec: eb89 bnez a5,3003efe + 3003eee: 3f800593 li a1,1016 + 3003ef2: 030067b7 lui a5,0x3006 + 3003ef6: 4f478513 addi a0,a5,1268 # 30064f4 + 3003efa: 36b5 jal ra,3003a66 + 3003efc: a001 j 3003efc + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkDiv(div)); + 3003efe: fd842503 lw a0,-40(s0) + 3003f02: d75fe0ef jal ra,3002c76 + 3003f06: 87aa mv a5,a0 + 3003f08: 0017c793 xori a5,a5,1 + 3003f0c: 9f81 uxtb a5 + 3003f0e: cb89 beqz a5,3003f20 + 3003f10: 3f900593 li a1,1017 + 3003f14: 030067b7 lui a5,0x3006 + 3003f18: 4f478513 addi a0,a5,1268 # 30064f4 + 3003f1c: 36a9 jal ra,3003a66 + 3003f1e: a885 j 3003f8e + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003f20: 040007b7 lui a5,0x4000 + 3003f24: 4947a783 lw a5,1172(a5) # 4000494 + 3003f28: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003f2c: fdc42783 lw a5,-36(s0) + 3003f30: 279e lhu a5,8(a5) + 3003f32: 873e mv a4,a5 + 3003f34: fec42783 lw a5,-20(s0) + 3003f38: 97ba add a5,a5,a4 + 3003f3a: fef42423 sw a5,-24(s0) + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3003f3e: fe842783 lw a5,-24(s0) + 3003f42: 43dc lw a5,4(a5) + 3003f44: 83e1 srli a5,a5,0x18 + 3003f46: 8b85 andi a5,a5,1 + 3003f48: 9f81 uxtb a5 + 3003f4a: fef42223 sw a5,-28(s0) + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3003f4e: fe442703 lw a4,-28(s0) + 3003f52: 4785 li a5,1 + 3003f54: 02f71163 bne a4,a5,3003f76 + p->BIT.clk_adc_div1 = div; /* write div to I1 */ + 3003f58: fd842783 lw a5,-40(s0) + 3003f5c: 8b8d andi a5,a5,3 + 3003f5e: 0ff7f693 andi a3,a5,255 + 3003f62: fe842703 lw a4,-24(s0) + 3003f66: 431c lw a5,0(a4) + 3003f68: 8a8d andi a3,a3,3 + 3003f6a: 06a2 slli a3,a3,0x8 + 3003f6c: cff7f793 andi a5,a5,-769 + 3003f70: 8fd5 or a5,a5,a3 + 3003f72: c31c sw a5,0(a4) + 3003f74: a829 j 3003f8e + } else { + p->BIT.clk_adc_div0 = div; /* write div to I0 */ + 3003f76: fd842783 lw a5,-40(s0) + 3003f7a: 8b8d andi a5,a5,3 + 3003f7c: 0ff7f693 andi a3,a5,255 + 3003f80: fe842703 lw a4,-24(s0) + 3003f84: 431c lw a5,0(a4) + 3003f86: 8a8d andi a3,a3,3 + 3003f88: 9bf1 andi a5,a5,-4 + 3003f8a: 8fd5 or a5,a5,a3 + 3003f8c: c31c sw a5,0(a4) + } +} + 3003f8e: 50b2 lw ra,44(sp) + 3003f90: 5422 lw s0,40(sp) + 3003f92: 6145 addi sp,sp,48 + 3003f94: 8082 ret + +03003f96 : + * @brief Get ADC clock division + * @param matchInfo ADC match info + * @retval Adc clock division + */ +static unsigned int CRG_AdcDivGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003f96: 7179 addi sp,sp,-48 + 3003f98: d606 sw ra,44(sp) + 3003f9a: d422 sw s0,40(sp) + 3003f9c: 1800 addi s0,sp,48 + 3003f9e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003fa2: fdc42783 lw a5,-36(s0) + 3003fa6: eb89 bnez a5,3003fb8 + 3003fa8: 40c00593 li a1,1036 + 3003fac: 030067b7 lui a5,0x3006 + 3003fb0: 4f478513 addi a0,a5,1268 # 30064f4 + 3003fb4: 3c4d jal ra,3003a66 + 3003fb6: a001 j 3003fb6 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003fb8: 040007b7 lui a5,0x4000 + 3003fbc: 4947a783 lw a5,1172(a5) # 4000494 + 3003fc0: eb89 bnez a5,3003fd2 + 3003fc2: 40d00593 li a1,1037 + 3003fc6: 030067b7 lui a5,0x3006 + 3003fca: 4f478513 addi a0,a5,1268 # 30064f4 + 3003fce: 3c61 jal ra,3003a66 + 3003fd0: a001 j 3003fd0 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003fd2: 040007b7 lui a5,0x4000 + 3003fd6: 4947a783 lw a5,1172(a5) # 4000494 + 3003fda: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003fde: fdc42783 lw a5,-36(s0) + 3003fe2: 279e lhu a5,8(a5) + 3003fe4: 873e mv a4,a5 + 3003fe6: fec42783 lw a5,-20(s0) + 3003fea: 97ba add a5,a5,a4 + 3003fec: fef42423 sw a5,-24(s0) + + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3003ff0: fe842783 lw a5,-24(s0) + 3003ff4: 43dc lw a5,4(a5) + 3003ff6: 83e1 srli a5,a5,0x18 + 3003ff8: 8b85 andi a5,a5,1 + 3003ffa: 9f81 uxtb a5 + 3003ffc: fef42223 sw a5,-28(s0) + + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3004000: fe442703 lw a4,-28(s0) + 3004004: 4785 li a5,1 + 3004006: 00f71963 bne a4,a5,3004018 + return p->BIT.clk_adc_div1; /* return div value I1 */ + 300400a: fe842783 lw a5,-24(s0) + 300400e: 439c lw a5,0(a5) + 3004010: 83a1 srli a5,a5,0x8 + 3004012: 8b8d andi a5,a5,3 + 3004014: 9f81 uxtb a5 + 3004016: a031 j 3004022 + } + return p->BIT.clk_adc_div0; /* return div valye I0 */ + 3004018: fe842783 lw a5,-24(s0) + 300401c: 439c lw a5,0(a5) + 300401e: 8b8d andi a5,a5,3 + 3004020: 9f81 uxtb a5 +} + 3004022: 853e mv a0,a5 + 3004024: 50b2 lw ra,44(sp) + 3004026: 5422 lw s0,40(sp) + 3004028: 6145 addi sp,sp,48 + 300402a: 8082 ret + +0300402c : + * @brief Enable Clock of EFC + * @param matchInfo EFC match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_EfcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 300402c: 7179 addi sp,sp,-48 + 300402e: d606 sw ra,44(sp) + 3004030: d422 sw s0,40(sp) + 3004032: 1800 addi s0,sp,48 + 3004034: fca42e23 sw a0,-36(s0) + 3004038: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300403c: fdc42783 lw a5,-36(s0) + 3004040: eb89 bnez a5,3004052 + 3004042: 42100593 li a1,1057 + 3004046: 030067b7 lui a5,0x3006 + 300404a: 4f478513 addi a0,a5,1268 # 30064f4 + 300404e: 3c21 jal ra,3003a66 + 3004050: a001 j 3004050 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004052: 040007b7 lui a5,0x4000 + 3004056: 4947a783 lw a5,1172(a5) # 4000494 + 300405a: eb89 bnez a5,300406c + 300405c: 42200593 li a1,1058 + 3004060: 030067b7 lui a5,0x3006 + 3004064: 4f478513 addi a0,a5,1268 # 30064f4 + 3004068: 3afd jal ra,3003a66 + 300406a: a001 j 300406a + /* Enables or disables EFC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300406c: 040007b7 lui a5,0x4000 + 3004070: 4947a783 lw a5,1172(a5) # 4000494 + 3004074: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004078: fdc42783 lw a5,-36(s0) + 300407c: 279e lhu a5,8(a5) + 300407e: 873e mv a4,a5 + 3004080: fec42783 lw a5,-20(s0) + 3004084: 97ba add a5,a5,a4 + 3004086: fef42423 sw a5,-24(s0) + p->BIT.eflash_cken = (enable & IP_CLK_ENABLE) ? BASE_CFG_SET : BASE_CFG_UNSET; + 300408a: fd842783 lw a5,-40(s0) + 300408e: 8b85 andi a5,a5,1 + 3004090: 0ff7f693 andi a3,a5,255 + 3004094: fe842703 lw a4,-24(s0) + 3004098: 431c lw a5,0(a4) + 300409a: 8a85 andi a3,a3,1 + 300409c: 9bf9 andi a5,a5,-2 + 300409e: 8fd5 or a5,a5,a3 + 30040a0: c31c sw a5,0(a4) +} + 30040a2: 0001 nop + 30040a4: 50b2 lw ra,44(sp) + 30040a6: 5422 lw s0,40(sp) + 30040a8: 6145 addi sp,sp,48 + 30040aa: 8082 ret + +030040ac : + * @brief Disable Clock of EFC + * @param matchInfo EFC match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_EfcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30040ac: 7179 addi sp,sp,-48 + 30040ae: d606 sw ra,44(sp) + 30040b0: d422 sw s0,40(sp) + 30040b2: 1800 addi s0,sp,48 + 30040b4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30040b8: fdc42783 lw a5,-36(s0) + 30040bc: eb89 bnez a5,30040ce + 30040be: 43000593 li a1,1072 + 30040c2: 030067b7 lui a5,0x3006 + 30040c6: 4f478513 addi a0,a5,1268 # 30064f4 + 30040ca: 3a71 jal ra,3003a66 + 30040cc: a001 j 30040cc + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30040ce: 040007b7 lui a5,0x4000 + 30040d2: 4947a783 lw a5,1172(a5) # 4000494 + 30040d6: eb89 bnez a5,30040e8 + 30040d8: 43100593 li a1,1073 + 30040dc: 030067b7 lui a5,0x3006 + 30040e0: 4f478513 addi a0,a5,1268 # 30064f4 + 30040e4: 3249 jal ra,3003a66 + 30040e6: a001 j 30040e6 + /* Get the value of the EFC register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30040e8: 040007b7 lui a5,0x4000 + 30040ec: 4947a783 lw a5,1172(a5) # 4000494 + 30040f0: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 30040f4: fdc42783 lw a5,-36(s0) + 30040f8: 279e lhu a5,8(a5) + 30040fa: 873e mv a4,a5 + 30040fc: fec42783 lw a5,-20(s0) + 3004100: 97ba add a5,a5,a4 + 3004102: fef42423 sw a5,-24(s0) + return p->BIT.eflash_cken; + 3004106: fe842783 lw a5,-24(s0) + 300410a: 439c lw a5,0(a5) + 300410c: 8b85 andi a5,a5,1 + 300410e: 9f81 uxtb a5 +} + 3004110: 853e mv a0,a5 + 3004112: 50b2 lw ra,44(sp) + 3004114: 5422 lw s0,40(sp) + 3004116: 6145 addi sp,sp,48 + 3004118: 8082 ret + +0300411a : + * @brief Enable Clock of ANA + * @param matchInfo ANA match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_AnaEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 300411a: 7179 addi sp,sp,-48 + 300411c: d606 sw ra,44(sp) + 300411e: d422 sw s0,40(sp) + 3004120: 1800 addi s0,sp,48 + 3004122: fca42e23 sw a0,-36(s0) + 3004126: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300412a: fdc42783 lw a5,-36(s0) + 300412e: eb89 bnez a5,3004140 + 3004130: 44000593 li a1,1088 + 3004134: 030067b7 lui a5,0x3006 + 3004138: 4f478513 addi a0,a5,1268 # 30064f4 + 300413c: 322d jal ra,3003a66 + 300413e: a001 j 300413e + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004140: 040007b7 lui a5,0x4000 + 3004144: 4947a783 lw a5,1172(a5) # 4000494 + 3004148: eb89 bnez a5,300415a + 300414a: 44100593 li a1,1089 + 300414e: 030067b7 lui a5,0x3006 + 3004152: 4f478513 addi a0,a5,1268 # 30064f4 + 3004156: 3a01 jal ra,3003a66 + 3004158: a001 j 3004158 + CRG_PARAM_CHECK_NO_RET(enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE); + 300415a: fd842703 lw a4,-40(s0) + 300415e: 4785 li a5,1 + 3004160: 00f70d63 beq a4,a5,300417a + 3004164: fd842783 lw a5,-40(s0) + 3004168: cb89 beqz a5,300417a + 300416a: 44200593 li a1,1090 + 300416e: 030067b7 lui a5,0x3006 + 3004172: 4f478513 addi a0,a5,1268 # 30064f4 + 3004176: 38c5 jal ra,3003a66 + 3004178: a20d j 300429a + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300417a: 040007b7 lui a5,0x4000 + 300417e: 4947a783 lw a5,1172(a5) # 4000494 + 3004182: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 3004186: fdc42783 lw a5,-36(s0) + 300418a: 279e lhu a5,8(a5) + 300418c: 873e mv a4,a5 + 300418e: fec42783 lw a5,-20(s0) + 3004192: 97ba add a5,a5,a4 + 3004194: fdc42703 lw a4,-36(s0) + 3004198: 2738 lbu a4,10(a4) + 300419a: 97ba add a5,a5,a4 + 300419c: fef42423 sw a5,-24(s0) + + if ((enable == IP_CLK_ENABLE) && (p->BIT.ip_srst_req == BASE_CFG_SET)) { + 30041a0: fd842703 lw a4,-40(s0) + 30041a4: 4785 li a5,1 + 30041a6: 02f71f63 bne a4,a5,30041e4 + 30041aa: fe842783 lw a5,-24(s0) + 30041ae: 439c lw a5,0(a5) + 30041b0: 83c1 srli a5,a5,0x10 + 30041b2: 8b85 andi a5,a5,1 + 30041b4: 0ff7f713 andi a4,a5,255 + 30041b8: 4785 li a5,1 + 30041ba: 02f71563 bne a4,a5,30041e4 + p->BIT.ip_srst_req = BASE_CFG_UNSET; + 30041be: fe842703 lw a4,-24(s0) + 30041c2: 431c lw a5,0(a4) + 30041c4: 76c1 lui a3,0xffff0 + 30041c6: 16fd addi a3,a3,-1 # fffeffff + 30041c8: 8ff5 and a5,a5,a3 + 30041ca: c31c sw a5,0(a4) + g_anaEnableFlag++; /* count enable analog IP number */ + 30041cc: 040007b7 lui a5,0x4000 + 30041d0: 4987c783 lbu a5,1176(a5) # 4000498 + 30041d4: 0785 addi a5,a5,1 + 30041d6: 0ff7f713 andi a4,a5,255 + 30041da: 040007b7 lui a5,0x4000 + 30041de: 48e78c23 sb a4,1176(a5) # 4000498 + 30041e2: a089 j 3004224 + } else if ((enable == IP_CLK_DISABLE) && (p->BIT.ip_srst_req == BASE_CFG_UNSET)) { + 30041e4: fd842783 lw a5,-40(s0) + 30041e8: ef95 bnez a5,3004224 + 30041ea: fe842783 lw a5,-24(s0) + 30041ee: 439c lw a5,0(a5) + 30041f0: 83c1 srli a5,a5,0x10 + 30041f2: 8b85 andi a5,a5,1 + 30041f4: 9f81 uxtb a5 + 30041f6: e79d bnez a5,3004224 + p->BIT.ip_srst_req = BASE_CFG_SET; + 30041f8: fe842703 lw a4,-24(s0) + 30041fc: 431c lw a5,0(a4) + 30041fe: 66c1 lui a3,0x10 + 3004200: 8fd5 or a5,a5,a3 + 3004202: c31c sw a5,0(a4) + if (g_anaEnableFlag > 0) { + 3004204: 040007b7 lui a5,0x4000 + 3004208: 4987c783 lbu a5,1176(a5) # 4000498 + 300420c: cf81 beqz a5,3004224 + g_anaEnableFlag--; /* Decreasing the count to enable the analog IP number. */ + 300420e: 040007b7 lui a5,0x4000 + 3004212: 4987c783 lbu a5,1176(a5) # 4000498 + 3004216: 17fd addi a5,a5,-1 + 3004218: 0ff7f713 andi a4,a5,255 + 300421c: 040007b7 lui a5,0x4000 + 3004220: 48e78c23 sb a4,1176(a5) # 4000498 + } + } + + if ((g_anaEnableFlag == 0) && (enable == IP_CLK_DISABLE)) { /* all analog clock disable */ + 3004224: 040007b7 lui a5,0x4000 + 3004228: 4987c783 lbu a5,1176(a5) # 4000498 + 300422c: eb85 bnez a5,300425c + 300422e: fd842783 lw a5,-40(s0) + 3004232: e78d bnez a5,300425c + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_UNSET; + 3004234: 10000737 lui a4,0x10000 + 3004238: 6785 lui a5,0x1 + 300423a: 973e add a4,a4,a5 + 300423c: a5072783 lw a5,-1456(a4) # ffffa50 + 3004240: 9bf9 andi a5,a5,-2 + 3004242: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_SET; + 3004246: 10000737 lui a4,0x10000 + 300424a: 6785 lui a5,0x1 + 300424c: 973e add a4,a4,a5 + 300424e: a5072783 lw a5,-1456(a4) # ffffa50 + 3004252: 66c1 lui a3,0x10 + 3004254: 8fd5 or a5,a5,a3 + 3004256: a4f72823 sw a5,-1456(a4) + 300425a: a081 j 300429a + } else if ((g_anaEnableFlag > 0) && (enable == IP_CLK_ENABLE)) { /* all analog clock enable */ + 300425c: 040007b7 lui a5,0x4000 + 3004260: 4987c783 lbu a5,1176(a5) # 4000498 + 3004264: cb9d beqz a5,300429a + 3004266: fd842703 lw a4,-40(s0) + 300426a: 4785 li a5,1 + 300426c: 02f71763 bne a4,a5,300429a + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_UNSET; + 3004270: 10000737 lui a4,0x10000 + 3004274: 6785 lui a5,0x1 + 3004276: 973e add a4,a4,a5 + 3004278: a5072783 lw a5,-1456(a4) # ffffa50 + 300427c: 76c1 lui a3,0xffff0 + 300427e: 16fd addi a3,a3,-1 # fffeffff + 3004280: 8ff5 and a5,a5,a3 + 3004282: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_SET; + 3004286: 10000737 lui a4,0x10000 + 300428a: 6785 lui a5,0x1 + 300428c: 973e add a4,a4,a5 + 300428e: a5072783 lw a5,-1456(a4) # ffffa50 + 3004292: 0017e793 ori a5,a5,1 + 3004296: a4f72823 sw a5,-1456(a4) + } +} + 300429a: 50b2 lw ra,44(sp) + 300429c: 5422 lw s0,40(sp) + 300429e: 6145 addi sp,sp,48 + 30042a0: 8082 ret + +030042a2 : + * @brief Get Clock of ANA + * @param matchInfo ANA match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_AnaEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30042a2: 7179 addi sp,sp,-48 + 30042a4: d606 sw ra,44(sp) + 30042a6: d422 sw s0,40(sp) + 30042a8: 1800 addi s0,sp,48 + 30042aa: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30042ae: fdc42783 lw a5,-36(s0) + 30042b2: eb91 bnez a5,30042c6 + 30042b4: 46200593 li a1,1122 + 30042b8: 030067b7 lui a5,0x3006 + 30042bc: 4f478513 addi a0,a5,1268 # 30064f4 + 30042c0: beffd0ef jal ra,3001eae + 30042c4: a001 j 30042c4 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30042c6: 040007b7 lui a5,0x4000 + 30042ca: 4947a783 lw a5,1172(a5) # 4000494 + 30042ce: eb91 bnez a5,30042e2 + 30042d0: 46300593 li a1,1123 + 30042d4: 030067b7 lui a5,0x3006 + 30042d8: 4f478513 addi a0,a5,1268 # 30064f4 + 30042dc: bd3fd0ef jal ra,3001eae + 30042e0: a001 j 30042e0 + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30042e2: 040007b7 lui a5,0x4000 + 30042e6: 4947a783 lw a5,1172(a5) # 4000494 + 30042ea: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 30042ee: fdc42783 lw a5,-36(s0) + 30042f2: 279e lhu a5,8(a5) + 30042f4: 873e mv a4,a5 + 30042f6: fec42783 lw a5,-20(s0) + 30042fa: 97ba add a5,a5,a4 + 30042fc: fdc42703 lw a4,-36(s0) + 3004300: 2738 lbu a4,10(a4) + 3004302: 97ba add a5,a5,a4 + 3004304: fef42423 sw a5,-24(s0) + /* The clock is enabled based on the IP reset status. */ + return (p->BIT.ip_srst_req) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3004308: fe842783 lw a5,-24(s0) + 300430c: 439c lw a5,0(a5) + 300430e: 83c1 srli a5,a5,0x10 + 3004310: 8b85 andi a5,a5,1 + 3004312: 9f81 uxtb a5 + 3004314: 0017c793 xori a5,a5,1 + 3004318: 9f81 uxtb a5 +} + 300431a: 853e mv a0,a5 + 300431c: 50b2 lw ra,44(sp) + 300431e: 5422 lw s0,40(sp) + 3004320: 6145 addi sp,sp,48 + 3004322: 8082 ret + +03004324 : + * @brief Write a character to the UART port. + * @param ch The int promotion of the character to be written. + * @retval None. + */ +static void DBG_PrintCh(unsigned int ch) +{ + 3004324: 1101 addi sp,sp,-32 + 3004326: ce22 sw s0,28(sp) + 3004328: 1000 addi s0,sp,32 + 300432a: fea42623 sw a0,-20(s0) + while (DBG_PRINTF_UART_PORT->UART_FR.BIT.txff == 1) { + 300432e: 0001 nop + 3004330: 140007b7 lui a5,0x14000 + 3004334: 4f9c lw a5,24(a5) + 3004336: 8395 srli a5,a5,0x5 + 3004338: 8b85 andi a5,a5,1 + 300433a: 0ff7f713 andi a4,a5,255 + 300433e: 4785 li a5,1 + 3004340: fef708e3 beq a4,a5,3004330 + ; + } + DBG_PRINTF_UART_PORT->UART_DR.BIT.data = (unsigned char)ch; + 3004344: 14000737 lui a4,0x14000 + 3004348: fec42783 lw a5,-20(s0) + 300434c: 0ff7f693 andi a3,a5,255 + 3004350: 431c lw a5,0(a4) + 3004352: 0ff6f693 andi a3,a3,255 + 3004356: f007f793 andi a5,a5,-256 + 300435a: 8fd5 or a5,a5,a3 + 300435c: c31c sw a5,0(a4) +} + 300435e: 0001 nop + 3004360: 4472 lw s0,28(sp) + 3004362: 6105 addi sp,sp,32 + 3004364: 8082 ret + +03004366 : + * @param str The string to be printed. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, a BASE_STATUS_ERROR is returned. + */ +static int DBG_PrintStr(const char *str) +{ + 3004366: 7179 addi sp,sp,-48 + 3004368: d606 sw ra,44(sp) + 300436a: d422 sw s0,40(sp) + 300436c: 1800 addi s0,sp,48 + 300436e: fca42e23 sw a0,-36(s0) + DEBUG_ASSERT_PARAM(str != NULL); + int cnt = 0; + 3004372: fe042623 sw zero,-20(s0) + while (*str != '\0') { + 3004376: a00d j 3004398 + DBG_PrintCh(*str); + 3004378: fdc42783 lw a5,-36(s0) + 300437c: 00078783 lb a5,0(a5) # 14000000 + 3004380: 853e mv a0,a5 + 3004382: 374d jal ra,3004324 + str++; + 3004384: fdc42783 lw a5,-36(s0) + 3004388: 0785 addi a5,a5,1 + 300438a: fcf42e23 sw a5,-36(s0) + cnt++; + 300438e: fec42783 lw a5,-20(s0) + 3004392: 0785 addi a5,a5,1 + 3004394: fef42623 sw a5,-20(s0) + while (*str != '\0') { + 3004398: fdc42783 lw a5,-36(s0) + 300439c: 00078783 lb a5,0(a5) + 30043a0: ffe1 bnez a5,3004378 + } + return cnt; + 30043a2: fec42783 lw a5,-20(s0) +} + 30043a6: 853e mv a0,a5 + 30043a8: 50b2 lw ra,44(sp) + 30043aa: 5422 lw s0,40(sp) + 30043ac: 6145 addi sp,sp,48 + 30043ae: 8082 ret + +030043b0 : + * @param base Base value. + * @param exponent Exponent value. + * @retval unsigned long The result of raising base to the power exponent. + */ +static unsigned long DBG_Pow(unsigned int base, unsigned int exponent) +{ + 30043b0: 7179 addi sp,sp,-48 + 30043b2: d622 sw s0,44(sp) + 30043b4: 1800 addi s0,sp,48 + 30043b6: fca42e23 sw a0,-36(s0) + 30043ba: fcb42c23 sw a1,-40(s0) + unsigned long ret = 1; + 30043be: 4785 li a5,1 + 30043c0: fef42623 sw a5,-20(s0) + while (exponent--) { + 30043c4: a809 j 30043d6 + ret *= base; + 30043c6: fec42703 lw a4,-20(s0) + 30043ca: fdc42783 lw a5,-36(s0) + 30043ce: 02f707b3 mul a5,a4,a5 + 30043d2: fef42623 sw a5,-20(s0) + while (exponent--) { + 30043d6: fd842783 lw a5,-40(s0) + 30043da: fff78713 addi a4,a5,-1 + 30043de: fce42c23 sw a4,-40(s0) + 30043e2: f3f5 bnez a5,30043c6 + } + return ret; /* ret = base ^ exponent */ + 30043e4: fec42783 lw a5,-20(s0) +} + 30043e8: 853e mv a0,a5 + 30043ea: 5432 lw s0,44(sp) + 30043ec: 6145 addi sp,sp,48 + 30043ee: 8082 ret + +030043f0 : + * @param num The number to be counted. + * @param base The number base of num. + * @retval unsigned int The number of digits. + */ +static unsigned int DBG_CountDigits(int num, NumBase base) +{ + 30043f0: 7179 addi sp,sp,-48 + 30043f2: d622 sw s0,44(sp) + 30043f4: 1800 addi s0,sp,48 + 30043f6: fca42e23 sw a0,-36(s0) + 30043fa: fcb42c23 sw a1,-40(s0) + unsigned int cnt = 0; + 30043fe: fe042623 sw zero,-20(s0) + if (base == 0) { + 3004402: fd842783 lw a5,-40(s0) + 3004406: e78d bnez a5,3004430 + return 0; + 3004408: 4781 li a5,0 + 300440a: a099 j 3004450 + } + while (num != 0) { + cnt++; + 300440c: fec42783 lw a5,-20(s0) + 3004410: 0785 addi a5,a5,1 + 3004412: fef42623 sw a5,-20(s0) + if (cnt > MAX_DIV_TIMES) { + 3004416: fec42703 lw a4,-20(s0) + 300441a: 47fd li a5,31 + 300441c: 00e7ee63 bltu a5,a4,3004438 + break; + } + num /= base; + 3004420: fdc42703 lw a4,-36(s0) + 3004424: fd842783 lw a5,-40(s0) + 3004428: 02f757b3 divu a5,a4,a5 + 300442c: fcf42e23 sw a5,-36(s0) + while (num != 0) { + 3004430: fdc42783 lw a5,-36(s0) + 3004434: ffe1 bnez a5,300440c + 3004436: a011 j 300443a + break; + 3004438: 0001 nop + } + cnt = (cnt == 0) ? 1 : cnt; + 300443a: fec42783 lw a5,-20(s0) + 300443e: c781 beqz a5,3004446 + 3004440: fec42783 lw a5,-20(s0) + 3004444: a011 j 3004448 + 3004446: 4785 li a5,1 + 3004448: fef42623 sw a5,-20(s0) + return cnt; + 300444c: fec42783 lw a5,-20(s0) +} + 3004450: 853e mv a0,a5 + 3004452: 5432 lw s0,44(sp) + 3004454: 6145 addi sp,sp,48 + 3004456: 8082 ret + +03004458 : + * @param num The unsigned number to be printed. + * @param base The number base of num. + * @param digits The digits of num. + */ +static void DBG_PutUnsignedNum(unsigned int num, NumBase base, unsigned int digits) +{ + 3004458: 7179 addi sp,sp,-48 + 300445a: d606 sw ra,44(sp) + 300445c: d422 sw s0,40(sp) + 300445e: 1800 addi s0,sp,48 + 3004460: fca42e23 sw a0,-36(s0) + 3004464: fcb42c23 sw a1,-40(s0) + 3004468: fcc42a23 sw a2,-44(s0) + unsigned char ch; + while (digits != 0) { + 300446c: a069 j 30044f6 + ch = num / DBG_Pow(base, digits - 1); + 300446e: fd442783 lw a5,-44(s0) + 3004472: 17fd addi a5,a5,-1 + 3004474: 85be mv a1,a5 + 3004476: fd842503 lw a0,-40(s0) + 300447a: 3f1d jal ra,30043b0 + 300447c: 872a mv a4,a0 + 300447e: fdc42783 lw a5,-36(s0) + 3004482: 02e7d7b3 divu a5,a5,a4 + 3004486: fef407a3 sb a5,-17(s0) + num %= DBG_Pow(base, digits - 1); + 300448a: fd442783 lw a5,-44(s0) + 300448e: 17fd addi a5,a5,-1 + 3004490: 85be mv a1,a5 + 3004492: fd842503 lw a0,-40(s0) + 3004496: 3f29 jal ra,30043b0 + 3004498: 872a mv a4,a0 + 300449a: fdc42783 lw a5,-36(s0) + 300449e: 02e7f7b3 remu a5,a5,a4 + 30044a2: fcf42e23 sw a5,-36(s0) + if (base == DECIMAL) { + 30044a6: fd842703 lw a4,-40(s0) + 30044aa: 47a9 li a5,10 + 30044ac: 00f71963 bne a4,a5,30044be + DBG_PrintCh(ch + '0'); + 30044b0: fef44783 lbu a5,-17(s0) + 30044b4: 03078793 addi a5,a5,48 + 30044b8: 853e mv a0,a5 + 30044ba: 35ad jal ra,3004324 + 30044bc: a805 j 30044ec + } else if (base == HEXADECIMAL) { + 30044be: fd842703 lw a4,-40(s0) + 30044c2: 47c1 li a5,16 + 30044c4: 02f71d63 bne a4,a5,30044fe + if (ch < DECIMAL_BASE) { + 30044c8: fef44703 lbu a4,-17(s0) + 30044cc: 47a5 li a5,9 + 30044ce: 00e7e963 bltu a5,a4,30044e0 + DBG_PrintCh(ch + '0'); + 30044d2: fef44783 lbu a5,-17(s0) + 30044d6: 03078793 addi a5,a5,48 + 30044da: 853e mv a0,a5 + 30044dc: 35a1 jal ra,3004324 + 30044de: a039 j 30044ec + } else { + DBG_PrintCh(ch - DECIMAL_BASE + 'A'); + 30044e0: fef44783 lbu a5,-17(s0) + 30044e4: 03778793 addi a5,a5,55 + 30044e8: 853e mv a0,a5 + 30044ea: 3d2d jal ra,3004324 + } + } else { + break; + } + digits--; + 30044ec: fd442783 lw a5,-44(s0) + 30044f0: 17fd addi a5,a5,-1 + 30044f2: fcf42a23 sw a5,-44(s0) + while (digits != 0) { + 30044f6: fd442783 lw a5,-44(s0) + 30044fa: fbb5 bnez a5,300446e + } +} + 30044fc: a011 j 3004500 + break; + 30044fe: 0001 nop +} + 3004500: 0001 nop + 3004502: 50b2 lw ra,44(sp) + 3004504: 5422 lw s0,40(sp) + 3004506: 6145 addi sp,sp,48 + 3004508: 8082 ret + +0300450a : + * @brief Print decimal number through UART port. + * @param intNum The decimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintInt(int intNum) +{ + 300450a: 7179 addi sp,sp,-48 + 300450c: d606 sw ra,44(sp) + 300450e: d422 sw s0,40(sp) + 3004510: 1800 addi s0,sp,48 + 3004512: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (intNum == 0) { + 3004516: fdc42783 lw a5,-36(s0) + 300451a: e791 bnez a5,3004526 + DBG_PrintCh('0'); + 300451c: 03000513 li a0,48 + 3004520: 3511 jal ra,3004324 + return 1; + 3004522: 4785 li a5,1 + 3004524: a82d j 300455e + } + if (intNum < 0) { + 3004526: fdc42783 lw a5,-36(s0) + 300452a: 0007db63 bgez a5,3004540 + DBG_PrintCh('-'); + 300452e: 02d00513 li a0,45 + 3004532: 3bcd jal ra,3004324 + intNum = -intNum; + 3004534: fdc42783 lw a5,-36(s0) + 3004538: 40f007b3 neg a5,a5 + 300453c: fcf42e23 sw a5,-36(s0) + } + cnt = DBG_CountDigits(intNum, DECIMAL); + 3004540: 45a9 li a1,10 + 3004542: fdc42503 lw a0,-36(s0) + 3004546: 356d jal ra,30043f0 + 3004548: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(intNum, DECIMAL, cnt); + 300454c: fdc42783 lw a5,-36(s0) + 3004550: fec42603 lw a2,-20(s0) + 3004554: 45a9 li a1,10 + 3004556: 853e mv a0,a5 + 3004558: 3701 jal ra,3004458 + return cnt; + 300455a: fec42783 lw a5,-20(s0) +} + 300455e: 853e mv a0,a5 + 3004560: 50b2 lw ra,44(sp) + 3004562: 5422 lw s0,40(sp) + 3004564: 6145 addi sp,sp,48 + 3004566: 8082 ret + +03004568 : + * @brief Print hexadecimal number through UART port. + * @param hexNum The hexadecimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintHex(unsigned int hexNum) +{ + 3004568: 7179 addi sp,sp,-48 + 300456a: d606 sw ra,44(sp) + 300456c: d422 sw s0,40(sp) + 300456e: 1800 addi s0,sp,48 + 3004570: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (hexNum == 0) { + 3004574: fdc42783 lw a5,-36(s0) + 3004578: e791 bnez a5,3004584 + DBG_PrintCh('0'); + 300457a: 03000513 li a0,48 + 300457e: 335d jal ra,3004324 + return 1; + 3004580: 4785 li a5,1 + 3004582: a005 j 30045a2 + } + cnt = DBG_CountDigits(hexNum, HEXADECIMAL); + 3004584: fdc42783 lw a5,-36(s0) + 3004588: 45c1 li a1,16 + 300458a: 853e mv a0,a5 + 300458c: 3595 jal ra,30043f0 + 300458e: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(hexNum, HEXADECIMAL, cnt); + 3004592: fec42603 lw a2,-20(s0) + 3004596: 45c1 li a1,16 + 3004598: fdc42503 lw a0,-36(s0) + 300459c: 3d75 jal ra,3004458 + return cnt; + 300459e: fec42783 lw a5,-20(s0) +} + 30045a2: 853e mv a0,a5 + 30045a4: 50b2 lw ra,44(sp) + 30045a6: 5422 lw s0,40(sp) + 30045a8: 6145 addi sp,sp,48 + 30045aa: 8082 ret + +030045ac : + * @brief Print floating-point number through UART port. + * @param fltNum The floating-point number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintFlt(float fltNum, unsigned int precision) +{ + 30045ac: 7139 addi sp,sp,-64 + 30045ae: de06 sw ra,60(sp) + 30045b0: dc22 sw s0,56(sp) + 30045b2: 0080 addi s0,sp,64 + 30045b4: fca42627 fsw fa0,-52(s0) + 30045b8: fca42423 sw a0,-56(s0) + unsigned int cnt = 0; + 30045bc: fe042623 sw zero,-20(s0) + unsigned int floatScale; + + if (fltNum < 0) { + 30045c0: fcc42787 flw fa5,-52(s0) + 30045c4: f0000753 fmv.w.x fa4,zero + 30045c8: a0e797d3 flt.s a5,fa5,fa4 + 30045cc: cf99 beqz a5,30045ea + DBG_PrintCh('-'); + 30045ce: 02d00513 li a0,45 + 30045d2: 3b89 jal ra,3004324 + cnt += 1; + 30045d4: fec42783 lw a5,-20(s0) + 30045d8: 0785 addi a5,a5,1 + 30045da: fef42623 sw a5,-20(s0) + fltNum = -fltNum; + 30045de: fcc42787 flw fa5,-52(s0) + 30045e2: 20f797d3 fneg.s fa5,fa5 + 30045e6: fcf42627 fsw fa5,-52(s0) + } + int integerVal = (int)fltNum; + 30045ea: fcc42787 flw fa5,-52(s0) + 30045ee: c00797d3 fcvt.w.s a5,fa5,rtz + 30045f2: fef42023 sw a5,-32(s0) + floatScale = DBG_Pow(10, (precision + 1)); /* 10: decimal */ + 30045f6: fc842783 lw a5,-56(s0) + 30045fa: 0785 addi a5,a5,1 + 30045fc: 85be mv a1,a5 + 30045fe: 4529 li a0,10 + 3004600: 3b45 jal ra,30043b0 + 3004602: fca42e23 sw a0,-36(s0) + int floatVal = (long)(floatScale * (fltNum - integerVal)); + 3004606: fdc42783 lw a5,-36(s0) + 300460a: d017f753 fcvt.s.wu fa4,a5 + 300460e: fe042783 lw a5,-32(s0) + 3004612: d007f7d3 fcvt.s.w fa5,a5 + 3004616: fcc42687 flw fa3,-52(s0) + 300461a: 08f6f7d3 fsub.s fa5,fa3,fa5 + 300461e: 10f777d3 fmul.s fa5,fa4,fa5 + 3004622: c00797d3 fcvt.w.s a5,fa5,rtz + 3004626: fef42423 sw a5,-24(s0) + /* Half-adjust: round up or round down */ + if (floatVal % DECIMAL_BASE >= HALF_ADJUST_BOUNDARY) { + 300462a: fe842703 lw a4,-24(s0) + 300462e: 47a9 li a5,10 + 3004630: 02f77733 remu a4,a4,a5 + 3004634: 4791 li a5,4 + 3004636: 00e7fb63 bgeu a5,a4,300464c + floatVal = floatVal / DECIMAL_BASE + 1; + 300463a: fe842703 lw a4,-24(s0) + 300463e: 47a9 li a5,10 + 3004640: 02f757b3 divu a5,a4,a5 + 3004644: 0785 addi a5,a5,1 + 3004646: fef42423 sw a5,-24(s0) + 300464a: a801 j 300465a + } else { + floatVal = floatVal / DECIMAL_BASE; + 300464c: fe842703 lw a4,-24(s0) + 3004650: 47a9 li a5,10 + 3004652: 02f757b3 divu a5,a4,a5 + 3004656: fef42423 sw a5,-24(s0) + } + cnt += DBG_PrintInt(integerVal); + 300465a: fe042503 lw a0,-32(s0) + 300465e: 3575 jal ra,300450a + 3004660: 872a mv a4,a0 + 3004662: fec42783 lw a5,-20(s0) + 3004666: 97ba add a5,a5,a4 + 3004668: fef42623 sw a5,-20(s0) + DBG_PrintCh('.'); + 300466c: 02e00513 li a0,46 + 3004670: 3955 jal ra,3004324 + cnt += 1; + 3004672: fec42783 lw a5,-20(s0) + 3004676: 0785 addi a5,a5,1 + 3004678: fef42623 sw a5,-20(s0) + /* Pad 0 in float part */ + unsigned int fltCnt = DBG_CountDigits(floatVal, DECIMAL); + 300467c: 45a9 li a1,10 + 300467e: fe842503 lw a0,-24(s0) + 3004682: 33bd jal ra,30043f0 + 3004684: fca42c23 sw a0,-40(s0) + if (precision > fltCnt) { + 3004688: fc842703 lw a4,-56(s0) + 300468c: fd842783 lw a5,-40(s0) + 3004690: 02e7f763 bgeu a5,a4,30046be + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 3004694: fe042223 sw zero,-28(s0) + 3004698: a809 j 30046aa + DBG_PrintCh('0'); /* add '0' */ + 300469a: 03000513 li a0,48 + 300469e: 3159 jal ra,3004324 + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 30046a0: fe442783 lw a5,-28(s0) + 30046a4: 0785 addi a5,a5,1 + 30046a6: fef42223 sw a5,-28(s0) + 30046aa: fc842703 lw a4,-56(s0) + 30046ae: fd842783 lw a5,-40(s0) + 30046b2: 40f707b3 sub a5,a4,a5 + 30046b6: fe442703 lw a4,-28(s0) + 30046ba: fef760e3 bltu a4,a5,300469a + } + } + DBG_PutUnsignedNum(floatVal, DECIMAL, fltCnt); /* print unsigned number */ + 30046be: fe842783 lw a5,-24(s0) + 30046c2: fd842603 lw a2,-40(s0) + 30046c6: 45a9 li a1,10 + 30046c8: 853e mv a0,a5 + 30046ca: 3379 jal ra,3004458 + cnt += precision; + 30046cc: fec42703 lw a4,-20(s0) + 30046d0: fc842783 lw a5,-56(s0) + 30046d4: 97ba add a5,a5,a4 + 30046d6: fef42623 sw a5,-20(s0) + return cnt; + 30046da: fec42783 lw a5,-20(s0) +} + 30046de: 853e mv a0,a5 + 30046e0: 50f2 lw ra,60(sp) + 30046e2: 5462 lw s0,56(sp) + 30046e4: 6121 addi sp,sp,64 + 30046e6: 8082 ret + +030046e8 : + * @param ch The format specifier. + * @param paramList The pointer of the variable parameter list. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int ParseSpecifier(const char ch, va_list *paramList) +{ + 30046e8: 7139 addi sp,sp,-64 + 30046ea: de06 sw ra,60(sp) + 30046ec: dc22 sw s0,56(sp) + 30046ee: 0080 addi s0,sp,64 + 30046f0: 87aa mv a5,a0 + 30046f2: fcb42423 sw a1,-56(s0) + 30046f6: fcf407a3 sb a5,-49(s0) + unsigned int cnt = 0; + 30046fa: fe042623 sw zero,-20(s0) + unsigned int tmpCnt; + char chVal = 0; + 30046fe: fe0405a3 sb zero,-21(s0) + const char *strVal = NULL; + 3004702: fe042223 sw zero,-28(s0) + int intVal = 0; + 3004706: fe042023 sw zero,-32(s0) + unsigned int unsignedVal = 0; + 300470a: fc042e23 sw zero,-36(s0) + unsigned int hexVal = 0; + 300470e: fc042c23 sw zero,-40(s0) + float fltVal = 0; + 3004712: fc042a23 sw zero,-44(s0) + switch (ch) { + 3004716: fcf40783 lb a5,-49(s0) + 300471a: fa878793 addi a5,a5,-88 + 300471e: 02000713 li a4,32 + 3004722: 14f76063 bltu a4,a5,3004862 + 3004726: 00279713 slli a4,a5,0x2 + 300472a: 030067b7 lui a5,0x3006 + 300472e: 54878793 addi a5,a5,1352 # 3006548 + 3004732: 97ba add a5,a5,a4 + 3004734: 439c lw a5,0(a5) + 3004736: 8782 jr a5 + case 'c': /* Character format data. */ + chVal = VA_ARG(*paramList, int); /* Use type int because of byte alignment */ + 3004738: fc842783 lw a5,-56(s0) + 300473c: 439c lw a5,0(a5) + 300473e: 00478693 addi a3,a5,4 + 3004742: fc842703 lw a4,-56(s0) + 3004746: c314 sw a3,0(a4) + 3004748: 439c lw a5,0(a5) + 300474a: fef405a3 sb a5,-21(s0) + DBG_PrintCh(chVal); + 300474e: feb40783 lb a5,-21(s0) + 3004752: 853e mv a0,a5 + 3004754: 3ec1 jal ra,3004324 + cnt += 1; + 3004756: fec42783 lw a5,-20(s0) + 300475a: 0785 addi a5,a5,1 + 300475c: fef42623 sw a5,-20(s0) + break; + 3004760: aa19 j 3004876 + case 's': /* String format data. */ + strVal = VA_ARG(*paramList, const char *); + 3004762: fc842783 lw a5,-56(s0) + 3004766: 439c lw a5,0(a5) + 3004768: 00478693 addi a3,a5,4 + 300476c: fc842703 lw a4,-56(s0) + 3004770: c314 sw a3,0(a4) + 3004772: 439c lw a5,0(a5) + 3004774: fef42223 sw a5,-28(s0) + cnt += DBG_PrintStr(strVal); + 3004778: fe442503 lw a0,-28(s0) + 300477c: 36ed jal ra,3004366 + 300477e: 87aa mv a5,a0 + 3004780: 873e mv a4,a5 + 3004782: fec42783 lw a5,-20(s0) + 3004786: 97ba add a5,a5,a4 + 3004788: fef42623 sw a5,-20(s0) + break; + 300478c: a0ed j 3004876 + case 'd': /* Integer decimal data. */ + intVal = VA_ARG(*paramList, int); + 300478e: fc842783 lw a5,-56(s0) + 3004792: 439c lw a5,0(a5) + 3004794: 00478693 addi a3,a5,4 + 3004798: fc842703 lw a4,-56(s0) + 300479c: c314 sw a3,0(a4) + 300479e: 439c lw a5,0(a5) + 30047a0: fef42023 sw a5,-32(s0) + cnt += DBG_PrintInt(intVal); + 30047a4: fe042503 lw a0,-32(s0) + 30047a8: 338d jal ra,300450a + 30047aa: 872a mv a4,a0 + 30047ac: fec42783 lw a5,-20(s0) + 30047b0: 97ba add a5,a5,a4 + 30047b2: fef42623 sw a5,-20(s0) + break; + 30047b6: a0c1 j 3004876 + case 'u': /* Unsigned decimal data. */ + unsignedVal = VA_ARG(*paramList, unsigned int); + 30047b8: fc842783 lw a5,-56(s0) + 30047bc: 439c lw a5,0(a5) + 30047be: 00478693 addi a3,a5,4 + 30047c2: fc842703 lw a4,-56(s0) + 30047c6: c314 sw a3,0(a4) + 30047c8: 439c lw a5,0(a5) + 30047ca: fcf42e23 sw a5,-36(s0) + tmpCnt = DBG_CountDigits(unsignedVal, DECIMAL); + 30047ce: fdc42783 lw a5,-36(s0) + 30047d2: 45a9 li a1,10 + 30047d4: 853e mv a0,a5 + 30047d6: 3929 jal ra,30043f0 + 30047d8: fca42823 sw a0,-48(s0) + DBG_PutUnsignedNum(unsignedVal, DECIMAL, tmpCnt); + 30047dc: fd042603 lw a2,-48(s0) + 30047e0: 45a9 li a1,10 + 30047e2: fdc42503 lw a0,-36(s0) + 30047e6: 398d jal ra,3004458 + cnt += tmpCnt; + 30047e8: fec42703 lw a4,-20(s0) + 30047ec: fd042783 lw a5,-48(s0) + 30047f0: 97ba add a5,a5,a4 + 30047f2: fef42623 sw a5,-20(s0) + break; + 30047f6: a041 j 3004876 + case 'x': /* Hexadecimal data. */ + case 'X': + case 'p': /* Address data. */ + hexVal = VA_ARG(*paramList, unsigned int); + 30047f8: fc842783 lw a5,-56(s0) + 30047fc: 439c lw a5,0(a5) + 30047fe: 00478693 addi a3,a5,4 + 3004802: fc842703 lw a4,-56(s0) + 3004806: c314 sw a3,0(a4) + 3004808: 439c lw a5,0(a5) + 300480a: fcf42c23 sw a5,-40(s0) + cnt += DBG_PrintHex(hexVal); + 300480e: fd842503 lw a0,-40(s0) + 3004812: 3b99 jal ra,3004568 + 3004814: 872a mv a4,a0 + 3004816: fec42783 lw a5,-20(s0) + 300481a: 97ba add a5,a5,a4 + 300481c: fef42623 sw a5,-20(s0) + break; + 3004820: a899 j 3004876 + case 'f': /* Floating-point data. */ + fltVal = VA_ARG(*paramList, double); + 3004822: fc842783 lw a5,-56(s0) + 3004826: 439c lw a5,0(a5) + 3004828: 079d addi a5,a5,7 + 300482a: 9be1 andi a5,a5,-8 + 300482c: 00878693 addi a3,a5,8 + 3004830: fc842703 lw a4,-56(s0) + 3004834: c314 sw a3,0(a4) + 3004836: 0047a803 lw a6,4(a5) + 300483a: 439c lw a5,0(a5) + 300483c: 853e mv a0,a5 + 300483e: 85c2 mv a1,a6 + 3004840: 75c010ef jal ra,3005f9c <__truncdfsf2> + 3004844: 20a507d3 fmv.s fa5,fa0 + 3004848: fcf42a27 fsw fa5,-44(s0) + cnt += DBG_PrintFlt(fltVal, 5); /* default precision: 5 */ + 300484c: 4515 li a0,5 + 300484e: fd442507 flw fa0,-44(s0) + 3004852: 3ba9 jal ra,30045ac + 3004854: 872a mv a4,a0 + 3004856: fec42783 lw a5,-20(s0) + 300485a: 97ba add a5,a5,a4 + 300485c: fef42623 sw a5,-20(s0) + break; + 3004860: a819 j 3004876 + default: + DBG_PrintCh(ch); + 3004862: fcf40783 lb a5,-49(s0) + 3004866: 853e mv a0,a5 + 3004868: 3c75 jal ra,3004324 + cnt += 1; + 300486a: fec42783 lw a5,-20(s0) + 300486e: 0785 addi a5,a5,1 + 3004870: fef42623 sw a5,-20(s0) + break; + 3004874: 0001 nop + } + return cnt; + 3004876: fec42783 lw a5,-20(s0) +} + 300487a: 853e mv a0,a5 + 300487c: 50f2 lw ra,60(sp) + 300487e: 5462 lw s0,56(sp) + 3004880: 6121 addi sp,sp,64 + 3004882: 8082 ret + +03004884 : + * @param intNum The decimal number to be printed. + * @param fieldWidth Field width. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintIntWithField(int intNum, int fieldWidth) +{ + 3004884: 7139 addi sp,sp,-64 + 3004886: de06 sw ra,60(sp) + 3004888: dc22 sw s0,56(sp) + 300488a: 0080 addi s0,sp,64 + 300488c: fca42623 sw a0,-52(s0) + 3004890: fcb42423 sw a1,-56(s0) + int zeroCnt = 0; + 3004894: fc042e23 sw zero,-36(s0) + int digitsCnt = 0; + 3004898: fe042623 sw zero,-20(s0) + unsigned int cnt = 0; + 300489c: fe042423 sw zero,-24(s0) + + if (intNum == 0) { + 30048a0: fcc42783 lw a5,-52(s0) + 30048a4: e791 bnez a5,30048b0 + DBG_PrintCh('0'); + 30048a6: 03000513 li a0,48 + 30048aa: 3cad jal ra,3004324 + return 1; + 30048ac: 4785 li a5,1 + 30048ae: a0dd j 3004994 + } + if (intNum < 0) { + 30048b0: fcc42783 lw a5,-52(s0) + 30048b4: 0607dd63 bgez a5,300492e + DBG_PrintCh('-'); /* add symbol */ + 30048b8: 02d00513 li a0,45 + 30048bc: 34a5 jal ra,3004324 + cnt++; + 30048be: fe842783 lw a5,-24(s0) + 30048c2: 0785 addi a5,a5,1 + 30048c4: fef42423 sw a5,-24(s0) + intNum = -intNum; + 30048c8: fcc42783 lw a5,-52(s0) + 30048cc: 40f007b3 neg a5,a5 + 30048d0: fcf42623 sw a5,-52(s0) + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 30048d4: 45a9 li a1,10 + 30048d6: fcc42503 lw a0,-52(s0) + 30048da: 3e19 jal ra,30043f0 + 30048dc: 87aa mv a5,a0 + 30048de: fef42623 sw a5,-20(s0) + zeroCnt = fieldWidth - digitsCnt; + 30048e2: fc842703 lw a4,-56(s0) + 30048e6: fec42783 lw a5,-20(s0) + 30048ea: 40f707b3 sub a5,a4,a5 + 30048ee: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 30048f2: fe042223 sw zero,-28(s0) + 30048f6: a831 j 3004912 + DBG_PrintCh('0'); /* add '0' */ + 30048f8: 03000513 li a0,48 + 30048fc: 3425 jal ra,3004324 + cnt++; + 30048fe: fe842783 lw a5,-24(s0) + 3004902: 0785 addi a5,a5,1 + 3004904: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004908: fe442783 lw a5,-28(s0) + 300490c: 0785 addi a5,a5,1 + 300490e: fef42223 sw a5,-28(s0) + 3004912: fe442703 lw a4,-28(s0) + 3004916: fdc42783 lw a5,-36(s0) + 300491a: fcf74fe3 blt a4,a5,30048f8 + } + cnt += digitsCnt; + 300491e: fec42783 lw a5,-20(s0) + 3004922: fe842703 lw a4,-24(s0) + 3004926: 97ba add a5,a5,a4 + 3004928: fef42423 sw a5,-24(s0) + 300492c: a891 j 3004980 + } else { + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 300492e: 45a9 li a1,10 + 3004930: fcc42503 lw a0,-52(s0) + 3004934: 3c75 jal ra,30043f0 + 3004936: 87aa mv a5,a0 + 3004938: fef42623 sw a5,-20(s0) + cnt = digitsCnt; + 300493c: fec42783 lw a5,-20(s0) + 3004940: fef42423 sw a5,-24(s0) + zeroCnt = fieldWidth - digitsCnt; + 3004944: fc842703 lw a4,-56(s0) + 3004948: fec42783 lw a5,-20(s0) + 300494c: 40f707b3 sub a5,a4,a5 + 3004950: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004954: fe042023 sw zero,-32(s0) + 3004958: a831 j 3004974 + DBG_PrintCh('0'); /* add '0' */ + 300495a: 03000513 li a0,48 + 300495e: 32d9 jal ra,3004324 + cnt++; + 3004960: fe842783 lw a5,-24(s0) + 3004964: 0785 addi a5,a5,1 + 3004966: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 300496a: fe042783 lw a5,-32(s0) + 300496e: 0785 addi a5,a5,1 + 3004970: fef42023 sw a5,-32(s0) + 3004974: fe042703 lw a4,-32(s0) + 3004978: fdc42783 lw a5,-36(s0) + 300497c: fcf74fe3 blt a4,a5,300495a + } + } + DBG_PutUnsignedNum(intNum, DECIMAL, digitsCnt); + 3004980: fcc42783 lw a5,-52(s0) + 3004984: fec42703 lw a4,-20(s0) + 3004988: 863a mv a2,a4 + 300498a: 45a9 li a1,10 + 300498c: 853e mv a0,a5 + 300498e: 34e9 jal ra,3004458 + return cnt; + 3004990: fe842783 lw a5,-24(s0) +} + 3004994: 853e mv a0,a5 + 3004996: 50f2 lw ra,60(sp) + 3004998: 5462 lw s0,56(sp) + 300499a: 6121 addi sp,sp,64 + 300499c: 8082 ret + +0300499e : + +static int DBG_Atoi(const char **s) +{ + 300499e: 7179 addi sp,sp,-48 + 30049a0: d622 sw s0,44(sp) + 30049a2: 1800 addi s0,sp,48 + 30049a4: fca42e23 sw a0,-36(s0) + int i, c; + + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 30049a8: fe042623 sw zero,-20(s0) + 30049ac: a02d j 30049d6 + i = i * 10 + c - '0'; /* 10: decimal */ + 30049ae: fec42703 lw a4,-20(s0) + 30049b2: 47a9 li a5,10 + 30049b4: 02f70733 mul a4,a4,a5 + 30049b8: fe842783 lw a5,-24(s0) + 30049bc: 97ba add a5,a5,a4 + 30049be: fd078793 addi a5,a5,-48 + 30049c2: fef42623 sw a5,-20(s0) + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 30049c6: fdc42783 lw a5,-36(s0) + 30049ca: 439c lw a5,0(a5) + 30049cc: 00178713 addi a4,a5,1 + 30049d0: fdc42783 lw a5,-36(s0) + 30049d4: c398 sw a4,0(a5) + 30049d6: fdc42783 lw a5,-36(s0) + 30049da: 439c lw a5,0(a5) + 30049dc: 00078783 lb a5,0(a5) + 30049e0: fef42423 sw a5,-24(s0) + 30049e4: fe842703 lw a4,-24(s0) + 30049e8: 02f00793 li a5,47 + 30049ec: 00e7d863 bge a5,a4,30049fc + 30049f0: fe842703 lw a4,-24(s0) + 30049f4: 03900793 li a5,57 + 30049f8: fae7dbe3 bge a5,a4,30049ae + } + return i; + 30049fc: fec42783 lw a5,-20(s0) +} + 3004a00: 853e mv a0,a5 + 3004a02: 5432 lw s0,44(sp) + 3004a04: 6145 addi sp,sp,48 + 3004a06: 8082 ret + +03004a08 : + * @param ... Variable parameter list. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, return BASE_STATUS_ERROR. + */ +int DBG_UartPrintf(const char *format, ...) +{ + 3004a08: 711d addi sp,sp,-96 + 3004a0a: de06 sw ra,60(sp) + 3004a0c: dc22 sw s0,56(sp) + 3004a0e: 0080 addi s0,sp,64 + 3004a10: fca42623 sw a0,-52(s0) + 3004a14: c04c sw a1,4(s0) + 3004a16: c410 sw a2,8(s0) + 3004a18: c454 sw a3,12(s0) + 3004a1a: c818 sw a4,16(s0) + 3004a1c: c85c sw a5,20(s0) + 3004a1e: 01042c23 sw a6,24(s0) + 3004a22: 01142e23 sw a7,28(s0) + DEBUG_ASSERT_PARAM(format != NULL); + int cnt = 0; + 3004a26: fe042623 sw zero,-20(s0) + int fieldWidth = 0; + 3004a2a: fe042423 sw zero,-24(s0) + int floatPrecision = 0; + 3004a2e: fe042223 sw zero,-28(s0) + float fltVal = 0; + 3004a32: fe042023 sw zero,-32(s0) + int intVal = 0; + 3004a36: fc042e23 sw zero,-36(s0) + va_list paramList; + VA_START(paramList, format); + 3004a3a: 02040793 addi a5,s0,32 + 3004a3e: 1791 addi a5,a5,-28 + 3004a40: fcf42c23 sw a5,-40(s0) + + while (*format != '\0') { + 3004a44: aa09 j 3004b56 + if (*format != '%') { + 3004a46: fcc42783 lw a5,-52(s0) + 3004a4a: 00078703 lb a4,0(a5) + 3004a4e: 02500793 li a5,37 + 3004a52: 00f70e63 beq a4,a5,3004a6e + DBG_PrintCh(*format); + 3004a56: fcc42783 lw a5,-52(s0) + 3004a5a: 00078783 lb a5,0(a5) + 3004a5e: 853e mv a0,a5 + 3004a60: 30d1 jal ra,3004324 + cnt += 1; + 3004a62: fec42783 lw a5,-20(s0) + 3004a66: 0785 addi a5,a5,1 + 3004a68: fef42623 sw a5,-20(s0) + 3004a6c: a0c5 j 3004b4c + } else { + format++; + 3004a6e: fcc42783 lw a5,-52(s0) + 3004a72: 0785 addi a5,a5,1 + 3004a74: fcf42623 sw a5,-52(s0) + if (*format == '0') { + 3004a78: fcc42783 lw a5,-52(s0) + 3004a7c: 00078703 lb a4,0(a5) + 3004a80: 03000793 li a5,48 + 3004a84: 04f71263 bne a4,a5,3004ac8 + format++; + 3004a88: fcc42783 lw a5,-52(s0) + 3004a8c: 0785 addi a5,a5,1 + 3004a8e: fcf42623 sw a5,-52(s0) + fieldWidth = DBG_Atoi(&format); + 3004a92: fcc40793 addi a5,s0,-52 + 3004a96: 853e mv a0,a5 + 3004a98: 3719 jal ra,300499e + 3004a9a: fea42423 sw a0,-24(s0) + intVal = VA_ARG(paramList, int); + 3004a9e: fd842783 lw a5,-40(s0) + 3004aa2: 00478713 addi a4,a5,4 + 3004aa6: fce42c23 sw a4,-40(s0) + 3004aaa: 439c lw a5,0(a5) + 3004aac: fcf42e23 sw a5,-36(s0) + cnt += DBG_PrintIntWithField(intVal, fieldWidth); + 3004ab0: fe842583 lw a1,-24(s0) + 3004ab4: fdc42503 lw a0,-36(s0) + 3004ab8: 33f1 jal ra,3004884 + 3004aba: 872a mv a4,a0 + 3004abc: fec42783 lw a5,-20(s0) + 3004ac0: 97ba add a5,a5,a4 + 3004ac2: fef42623 sw a5,-20(s0) + 3004ac6: a059 j 3004b4c + } else if (*format == '.') { + 3004ac8: fcc42783 lw a5,-52(s0) + 3004acc: 00078703 lb a4,0(a5) + 3004ad0: 02e00793 li a5,46 + 3004ad4: 04f71d63 bne a4,a5,3004b2e + format++; + 3004ad8: fcc42783 lw a5,-52(s0) + 3004adc: 0785 addi a5,a5,1 + 3004ade: fcf42623 sw a5,-52(s0) + floatPrecision = DBG_Atoi(&format); + 3004ae2: fcc40793 addi a5,s0,-52 + 3004ae6: 853e mv a0,a5 + 3004ae8: 3d5d jal ra,300499e + 3004aea: fea42223 sw a0,-28(s0) + fltVal = VA_ARG(paramList, double); + 3004aee: fd842783 lw a5,-40(s0) + 3004af2: 079d addi a5,a5,7 + 3004af4: 9be1 andi a5,a5,-8 + 3004af6: 00878713 addi a4,a5,8 + 3004afa: fce42c23 sw a4,-40(s0) + 3004afe: 0047a803 lw a6,4(a5) + 3004b02: 439c lw a5,0(a5) + 3004b04: 853e mv a0,a5 + 3004b06: 85c2 mv a1,a6 + 3004b08: 494010ef jal ra,3005f9c <__truncdfsf2> + 3004b0c: 20a507d3 fmv.s fa5,fa0 + 3004b10: fef42027 fsw fa5,-32(s0) + cnt += DBG_PrintFlt(fltVal, floatPrecision); + 3004b14: fe442783 lw a5,-28(s0) + 3004b18: 853e mv a0,a5 + 3004b1a: fe042507 flw fa0,-32(s0) + 3004b1e: 3479 jal ra,30045ac + 3004b20: 872a mv a4,a0 + 3004b22: fec42783 lw a5,-20(s0) + 3004b26: 97ba add a5,a5,a4 + 3004b28: fef42623 sw a5,-20(s0) + 3004b2c: a005 j 3004b4c + } else { + cnt += ParseSpecifier(*format, ¶mList); + 3004b2e: fcc42783 lw a5,-52(s0) + 3004b32: 00078783 lb a5,0(a5) + 3004b36: fd840713 addi a4,s0,-40 + 3004b3a: 85ba mv a1,a4 + 3004b3c: 853e mv a0,a5 + 3004b3e: 366d jal ra,30046e8 + 3004b40: 872a mv a4,a0 + 3004b42: fec42783 lw a5,-20(s0) + 3004b46: 97ba add a5,a5,a4 + 3004b48: fef42623 sw a5,-20(s0) + } + } + format++; + 3004b4c: fcc42783 lw a5,-52(s0) + 3004b50: 0785 addi a5,a5,1 + 3004b52: fcf42623 sw a5,-52(s0) + while (*format != '\0') { + 3004b56: fcc42783 lw a5,-52(s0) + 3004b5a: 00078783 lb a5,0(a5) + 3004b5e: ee0794e3 bnez a5,3004a46 + } + VA_END(paramList); + return cnt; + 3004b62: fec42783 lw a5,-20(s0) +} + 3004b66: 853e mv a0,a5 + 3004b68: 50f2 lw ra,60(sp) + 3004b6a: 5462 lw s0,56(sp) + 3004b6c: 6125 addi sp,sp,96 + 3004b6e: 8082 ret + +03004b70 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param regValue value of @ref IOCMG_REG. + * @retval None. + */ +static inline void DCL_IOCMG_SetRegValue(IOCMG_REG *iocmgRegx, unsigned int regValue) +{ + 3004b70: 1101 addi sp,sp,-32 + 3004b72: ce06 sw ra,28(sp) + 3004b74: cc22 sw s0,24(sp) + 3004b76: 1000 addi s0,sp,32 + 3004b78: fea42623 sw a0,-20(s0) + 3004b7c: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004b80: fec42703 lw a4,-20(s0) + 3004b84: 77c1 lui a5,0xffff0 + 3004b86: 8f7d and a4,a4,a5 + 3004b88: 147f07b7 lui a5,0x147f0 + 3004b8c: 00f70a63 beq a4,a5,3004ba0 + 3004b90: 08b00593 li a1,139 + 3004b94: 030067b7 lui a5,0x3006 + 3004b98: 5cc78513 addi a0,a5,1484 # 30065cc + 3004b9c: 2df1 jal ra,3005278 + 3004b9e: a001 j 3004b9e + iocmgRegx->reg = regValue; + 3004ba0: fec42783 lw a5,-20(s0) + 3004ba4: fe842703 lw a4,-24(s0) + 3004ba8: c398 sw a4,0(a5) +} + 3004baa: 0001 nop + 3004bac: 40f2 lw ra,28(sp) + 3004bae: 4462 lw s0,24(sp) + 3004bb0: 6105 addi sp,sp,32 + 3004bb2: 8082 ret + +03004bb4 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param driveRate value of @ref IOCMG_DriveRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetDriveRate(IOCMG_REG *iocmgRegx, IOCMG_DriveRate driveRate) +{ + 3004bb4: 1101 addi sp,sp,-32 + 3004bb6: ce06 sw ra,28(sp) + 3004bb8: cc22 sw s0,24(sp) + 3004bba: 1000 addi s0,sp,32 + 3004bbc: fea42623 sw a0,-20(s0) + 3004bc0: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004bc4: fec42703 lw a4,-20(s0) + 3004bc8: 77c1 lui a5,0xffff0 + 3004bca: 8f7d and a4,a4,a5 + 3004bcc: 147f07b7 lui a5,0x147f0 + 3004bd0: 00f70a63 beq a4,a5,3004be4 + 3004bd4: 0ba00593 li a1,186 + 3004bd8: 030067b7 lui a5,0x3006 + 3004bdc: 5cc78513 addi a0,a5,1484 # 30065cc + 3004be0: 2d61 jal ra,3005278 + 3004be2: a001 j 3004be2 + IOCMG_PARAM_CHECK_NO_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4); + 3004be4: fe842703 lw a4,-24(s0) + 3004be8: 478d li a5,3 + 3004bea: 00e7fa63 bgeu a5,a4,3004bfe + 3004bee: 0bb00593 li a1,187 + 3004bf2: 030067b7 lui a5,0x3006 + 3004bf6: 5cc78513 addi a0,a5,1484 # 30065cc + 3004bfa: 2dbd jal ra,3005278 + 3004bfc: a839 j 3004c1a + iocmgRegx->BIT.ds = driveRate; + 3004bfe: fe842783 lw a5,-24(s0) + 3004c02: 8b8d andi a5,a5,3 + 3004c04: 0ff7f693 andi a3,a5,255 + 3004c08: fec42703 lw a4,-20(s0) + 3004c0c: 431c lw a5,0(a4) + 3004c0e: 8a8d andi a3,a3,3 + 3004c10: 0692 slli a3,a3,0x4 + 3004c12: fcf7f793 andi a5,a5,-49 + 3004c16: 8fd5 or a5,a5,a3 + 3004c18: c31c sw a5,0(a4) +} + 3004c1a: 40f2 lw ra,28(sp) + 3004c1c: 4462 lw s0,24(sp) + 3004c1e: 6105 addi sp,sp,32 + 3004c20: 8082 ret + +03004c22 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param pullMode value of @ref IOCMG_PullMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetPullMode(IOCMG_REG *iocmgRegx, IOCMG_PullMode pullMode) +{ + 3004c22: 1101 addi sp,sp,-32 + 3004c24: ce06 sw ra,28(sp) + 3004c26: cc22 sw s0,24(sp) + 3004c28: 1000 addi s0,sp,32 + 3004c2a: fea42623 sw a0,-20(s0) + 3004c2e: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004c32: fec42703 lw a4,-20(s0) + 3004c36: 77c1 lui a5,0xffff0 + 3004c38: 8f7d and a4,a4,a5 + 3004c3a: 147f07b7 lui a5,0x147f0 + 3004c3e: 00f70a63 beq a4,a5,3004c52 + 3004c42: 0d200593 li a1,210 + 3004c46: 030067b7 lui a5,0x3006 + 3004c4a: 5cc78513 addi a0,a5,1484 # 30065cc + 3004c4e: 252d jal ra,3005278 + 3004c50: a001 j 3004c50 + IOCMG_PARAM_CHECK_NO_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE); + 3004c52: fe842703 lw a4,-24(s0) + 3004c56: 478d li a5,3 + 3004c58: 00e7fa63 bgeu a5,a4,3004c6c + 3004c5c: 0d300593 li a1,211 + 3004c60: 030067b7 lui a5,0x3006 + 3004c64: 5cc78513 addi a0,a5,1484 # 30065cc + 3004c68: 2d01 jal ra,3005278 + 3004c6a: a835 j 3004ca6 + iocmgRegx->BIT.pu = (pullMode & 0x02) >> 1; /* 10b: pull up mode */ + 3004c6c: fe842783 lw a5,-24(s0) + 3004c70: 8385 srli a5,a5,0x1 + 3004c72: 8b85 andi a5,a5,1 + 3004c74: 0ff7f693 andi a3,a5,255 + 3004c78: fec42703 lw a4,-20(s0) + 3004c7c: 431c lw a5,0(a4) + 3004c7e: 8a85 andi a3,a3,1 + 3004c80: 06a2 slli a3,a3,0x8 + 3004c82: eff7f793 andi a5,a5,-257 + 3004c86: 8fd5 or a5,a5,a3 + 3004c88: c31c sw a5,0(a4) + iocmgRegx->BIT.pd = pullMode & 0x01; /* 01b: pull down mode */ + 3004c8a: fe842783 lw a5,-24(s0) + 3004c8e: 8b85 andi a5,a5,1 + 3004c90: 0ff7f693 andi a3,a5,255 + 3004c94: fec42703 lw a4,-20(s0) + 3004c98: 431c lw a5,0(a4) + 3004c9a: 8a85 andi a3,a3,1 + 3004c9c: 069e slli a3,a3,0x7 + 3004c9e: f7f7f793 andi a5,a5,-129 + 3004ca2: 8fd5 or a5,a5,a3 + 3004ca4: c31c sw a5,0(a4) +} + 3004ca6: 40f2 lw ra,28(sp) + 3004ca8: 4462 lw s0,24(sp) + 3004caa: 6105 addi sp,sp,32 + 3004cac: 8082 ret + +03004cae : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param levelShiftRate value of @ref IOCMG_LevelShiftRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetLevelShiftRate(IOCMG_REG *iocmgRegx, IOCMG_LevelShiftRate levelShiftRate) +{ + 3004cae: 1101 addi sp,sp,-32 + 3004cb0: ce06 sw ra,28(sp) + 3004cb2: cc22 sw s0,24(sp) + 3004cb4: 1000 addi s0,sp,32 + 3004cb6: fea42623 sw a0,-20(s0) + 3004cba: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004cbe: fec42703 lw a4,-20(s0) + 3004cc2: 77c1 lui a5,0xffff0 + 3004cc4: 8f7d and a4,a4,a5 + 3004cc6: 147f07b7 lui a5,0x147f0 + 3004cca: 00f70a63 beq a4,a5,3004cde + 3004cce: 0ed00593 li a1,237 + 3004cd2: 030067b7 lui a5,0x3006 + 3004cd6: 5cc78513 addi a0,a5,1484 # 30065cc + 3004cda: 2b79 jal ra,3005278 + 3004cdc: a001 j 3004cdc + IOCMG_PARAM_CHECK_NO_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX && levelShiftRate >= LEVEL_SHIFT_RATE_FAST); + 3004cde: fe842703 lw a4,-24(s0) + 3004ce2: 4785 li a5,1 + 3004ce4: 00e7fa63 bgeu a5,a4,3004cf8 + 3004ce8: 0ee00593 li a1,238 + 3004cec: 030067b7 lui a5,0x3006 + 3004cf0: 5cc78513 addi a0,a5,1484 # 30065cc + 3004cf4: 2351 jal ra,3005278 + 3004cf6: a839 j 3004d14 + iocmgRegx->BIT.sr = levelShiftRate; + 3004cf8: fe842783 lw a5,-24(s0) + 3004cfc: 8b85 andi a5,a5,1 + 3004cfe: 0ff7f693 andi a3,a5,255 + 3004d02: fec42703 lw a4,-20(s0) + 3004d06: 431c lw a5,0(a4) + 3004d08: 8a85 andi a3,a3,1 + 3004d0a: 06a6 slli a3,a3,0x9 + 3004d0c: dff7f793 andi a5,a5,-513 + 3004d10: 8fd5 or a5,a5,a3 + 3004d12: c31c sw a5,0(a4) +} + 3004d14: 40f2 lw ra,28(sp) + 3004d16: 4462 lw s0,24(sp) + 3004d18: 6105 addi sp,sp,32 + 3004d1a: 8082 ret + +03004d1c : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param schmidtMode value of @ref IOCMG_SchmidtMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetSchmidtMode(IOCMG_REG *iocmgRegx, IOCMG_SchmidtMode schmidtMode) +{ + 3004d1c: 1101 addi sp,sp,-32 + 3004d1e: ce06 sw ra,28(sp) + 3004d20: cc22 sw s0,24(sp) + 3004d22: 1000 addi s0,sp,32 + 3004d24: fea42623 sw a0,-20(s0) + 3004d28: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004d2c: fec42703 lw a4,-20(s0) + 3004d30: 77c1 lui a5,0xffff0 + 3004d32: 8f7d and a4,a4,a5 + 3004d34: 147f07b7 lui a5,0x147f0 + 3004d38: 00f70a63 beq a4,a5,3004d4c + 3004d3c: 10500593 li a1,261 + 3004d40: 030067b7 lui a5,0x3006 + 3004d44: 5cc78513 addi a0,a5,1484 # 30065cc + 3004d48: 2b05 jal ra,3005278 + 3004d4a: a001 j 3004d4a + IOCMG_PARAM_CHECK_NO_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE); + 3004d4c: fe842703 lw a4,-24(s0) + 3004d50: 4785 li a5,1 + 3004d52: 00e7fa63 bgeu a5,a4,3004d66 + 3004d56: 10600593 li a1,262 + 3004d5a: 030067b7 lui a5,0x3006 + 3004d5e: 5cc78513 addi a0,a5,1484 # 30065cc + 3004d62: 2b19 jal ra,3005278 + 3004d64: a839 j 3004d82 + iocmgRegx->BIT.se = schmidtMode; + 3004d66: fe842783 lw a5,-24(s0) + 3004d6a: 8b85 andi a5,a5,1 + 3004d6c: 0ff7f693 andi a3,a5,255 + 3004d70: fec42703 lw a4,-20(s0) + 3004d74: 431c lw a5,0(a4) + 3004d76: 8a85 andi a3,a3,1 + 3004d78: 06aa slli a3,a3,0xa + 3004d7a: bff7f793 andi a5,a5,-1025 + 3004d7e: 8fd5 or a5,a5,a3 + 3004d80: c31c sw a5,0(a4) +} + 3004d82: 40f2 lw ra,28(sp) + 3004d84: 4462 lw s0,24(sp) + 3004d86: 6105 addi sp,sp,32 + 3004d88: 8082 ret + +03004d8a : + * @brief Get pins iocmg reg address + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_REG iocmg reg address. + */ +static IOCMG_REG* IOCMG_GetRegAddr(unsigned int pinTypedef) +{ + 3004d8a: 7179 addi sp,sp,-48 + 3004d8c: d622 sw s0,44(sp) + 3004d8e: 1800 addi s0,sp,48 + 3004d90: fca42e23 sw a0,-36(s0) + /* decode pin's iocmg reg offset address in base address, and conver value to point address */ + unsigned int iocmgBaseAddrValue = (uintptr_t)IOCMG_BASE; + 3004d94: 147f07b7 lui a5,0x147f0 + 3004d98: fef42623 sw a5,-20(s0) + unsigned int iocmgRegOffsetAddrValue = (pinTypedef >> 16) & 0x00000FFF; /* 16 : shift 16 bit */ + 3004d9c: fdc42783 lw a5,-36(s0) + 3004da0: 0107d713 srli a4,a5,0x10 + 3004da4: 6785 lui a5,0x1 + 3004da6: 17fd addi a5,a5,-1 # fff + 3004da8: 8ff9 and a5,a5,a4 + 3004daa: fef42423 sw a5,-24(s0) + IOCMG_REG* iocmgRegxAddr = (IOCMG_REG*)(void*)(iocmgBaseAddrValue + iocmgRegOffsetAddrValue); + 3004dae: fec42703 lw a4,-20(s0) + 3004db2: fe842783 lw a5,-24(s0) + 3004db6: 97ba add a5,a5,a4 + 3004db8: fef42223 sw a5,-28(s0) + if (!IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegxAddr & IOCMG_BASE_ADDR_MASK))) { + 3004dbc: fe442703 lw a4,-28(s0) + 3004dc0: 77c1 lui a5,0xffff0 + 3004dc2: 8f7d and a4,a4,a5 + 3004dc4: 147f07b7 lui a5,0x147f0 + 3004dc8: 00f70463 beq a4,a5,3004dd0 + return NULL; + 3004dcc: 4781 li a5,0 + 3004dce: a019 j 3004dd4 + } + return iocmgRegxAddr; + 3004dd0: fe442783 lw a5,-28(s0) +} + 3004dd4: 853e mv a0,a5 + 3004dd6: 5432 lw s0,44(sp) + 3004dd8: 6145 addi sp,sp,48 + 3004dda: 8082 ret + +03004ddc : + * @brief Set pins as function mode + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinAltFuncMode(unsigned int pinTypedef) +{ + 3004ddc: 7179 addi sp,sp,-48 + 3004dde: d606 sw ra,44(sp) + 3004de0: d422 sw s0,40(sp) + 3004de2: 1800 addi s0,sp,48 + 3004de4: fca42e23 sw a0,-36(s0) + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004de8: fdc42503 lw a0,-36(s0) + 3004dec: 3f79 jal ra,3004d8a + 3004dee: fea42623 sw a0,-20(s0) + /* get iocmg reg default value */ + unsigned int regValue = pinTypedef & IOCMG_REG_VALUE_MASK; + 3004df2: fdc42703 lw a4,-36(s0) + 3004df6: 67c1 lui a5,0x10 + 3004df8: 17fd addi a5,a5,-1 # ffff + 3004dfa: 8ff9 and a5,a5,a4 + 3004dfc: fef42423 sw a5,-24(s0) + DCL_IOCMG_SetRegValue(iocmgRegx, regValue); + 3004e00: fe842583 lw a1,-24(s0) + 3004e04: fec42503 lw a0,-20(s0) + 3004e08: 33a5 jal ra,3004b70 + return IOCMG_STATUS_OK; + 3004e0a: 4781 li a5,0 +} + 3004e0c: 853e mv a0,a5 + 3004e0e: 50b2 lw ra,44(sp) + 3004e10: 5422 lw s0,40(sp) + 3004e12: 6145 addi sp,sp,48 + 3004e14: 8082 ret + +03004e16 : + * @param pinTypedef the pin type defined in iomap.h + * @param pullMode function define as @ref IOCMG_PullMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinPullMode(unsigned int pinTypedef, IOCMG_PullMode pullMode) +{ + 3004e16: 7179 addi sp,sp,-48 + 3004e18: d606 sw ra,44(sp) + 3004e1a: d422 sw s0,40(sp) + 3004e1c: 1800 addi s0,sp,48 + 3004e1e: fca42e23 sw a0,-36(s0) + 3004e22: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE, IOCMG_PARAM_ERROR); + 3004e26: fd842703 lw a4,-40(s0) + 3004e2a: 478d li a5,3 + 3004e2c: 00e7fb63 bgeu a5,a4,3004e42 + 3004e30: 07800593 li a1,120 + 3004e34: 030067b7 lui a5,0x3006 + 3004e38: 5ec78513 addi a0,a5,1516 # 30065ec + 3004e3c: 2935 jal ra,3005278 + 3004e3e: 4791 li a5,4 + 3004e40: a821 j 3004e58 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004e42: fdc42503 lw a0,-36(s0) + 3004e46: 3791 jal ra,3004d8a + 3004e48: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetPullMode(iocmgRegx, pullMode); + 3004e4c: fd842583 lw a1,-40(s0) + 3004e50: fec42503 lw a0,-20(s0) + 3004e54: 33f9 jal ra,3004c22 + return IOCMG_STATUS_OK; + 3004e56: 4781 li a5,0 +} + 3004e58: 853e mv a0,a5 + 3004e5a: 50b2 lw ra,44(sp) + 3004e5c: 5422 lw s0,40(sp) + 3004e5e: 6145 addi sp,sp,48 + 3004e60: 8082 ret + +03004e62 : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinSchmidtMode(unsigned int pinTypedef, IOCMG_SchmidtMode schmidtMode) +{ + 3004e62: 7179 addi sp,sp,-48 + 3004e64: d606 sw ra,44(sp) + 3004e66: d422 sw s0,40(sp) + 3004e68: 1800 addi s0,sp,48 + 3004e6a: fca42e23 sw a0,-36(s0) + 3004e6e: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE, IOCMG_PARAM_ERROR); + 3004e72: fd842703 lw a4,-40(s0) + 3004e76: 4785 li a5,1 + 3004e78: 00e7fb63 bgeu a5,a4,3004e8e + 3004e7c: 09300593 li a1,147 + 3004e80: 030067b7 lui a5,0x3006 + 3004e84: 5ec78513 addi a0,a5,1516 # 30065ec + 3004e88: 2ec5 jal ra,3005278 + 3004e8a: 4791 li a5,4 + 3004e8c: a821 j 3004ea4 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004e8e: fdc42503 lw a0,-36(s0) + 3004e92: 3de5 jal ra,3004d8a + 3004e94: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetSchmidtMode(iocmgRegx, schmidtMode); + 3004e98: fd842583 lw a1,-40(s0) + 3004e9c: fec42503 lw a0,-20(s0) + 3004ea0: 3db5 jal ra,3004d1c + return IOCMG_STATUS_OK; + 3004ea2: 4781 li a5,0 +} + 3004ea4: 853e mv a0,a5 + 3004ea6: 50b2 lw ra,44(sp) + 3004ea8: 5422 lw s0,40(sp) + 3004eaa: 6145 addi sp,sp,48 + 3004eac: 8082 ret + +03004eae : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinLevelShiftRate(unsigned int pinTypedef, IOCMG_LevelShiftRate levelShiftRate) +{ + 3004eae: 7179 addi sp,sp,-48 + 3004eb0: d606 sw ra,44(sp) + 3004eb2: d422 sw s0,40(sp) + 3004eb4: 1800 addi s0,sp,48 + 3004eb6: fca42e23 sw a0,-36(s0) + 3004eba: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX, IOCMG_PARAM_ERROR); + 3004ebe: fd842703 lw a4,-40(s0) + 3004ec2: 4785 li a5,1 + 3004ec4: 00e7fb63 bgeu a5,a4,3004eda + 3004ec8: 0ae00593 li a1,174 + 3004ecc: 030067b7 lui a5,0x3006 + 3004ed0: 5ec78513 addi a0,a5,1516 # 30065ec + 3004ed4: 2655 jal ra,3005278 + 3004ed6: 4791 li a5,4 + 3004ed8: a821 j 3004ef0 + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate >= LEVEL_SHIFT_RATE_FAST, IOCMG_PARAM_ERROR); + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004eda: fdc42503 lw a0,-36(s0) + 3004ede: 3575 jal ra,3004d8a + 3004ee0: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetLevelShiftRate(iocmgRegx, levelShiftRate); + 3004ee4: fd842583 lw a1,-40(s0) + 3004ee8: fec42503 lw a0,-20(s0) + 3004eec: 33c9 jal ra,3004cae + return IOCMG_STATUS_OK; + 3004eee: 4781 li a5,0 +} + 3004ef0: 853e mv a0,a5 + 3004ef2: 50b2 lw ra,44(sp) + 3004ef4: 5422 lw s0,40(sp) + 3004ef6: 6145 addi sp,sp,48 + 3004ef8: 8082 ret + +03004efa : + * @param pinTypedef the pin type defined in iomap.h + * @param driveRate function define as @ref IOCMG_DriveRate + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinDriveRate(unsigned int pinTypedef, IOCMG_DriveRate driveRate) +{ + 3004efa: 7179 addi sp,sp,-48 + 3004efc: d606 sw ra,44(sp) + 3004efe: d422 sw s0,40(sp) + 3004f00: 1800 addi s0,sp,48 + 3004f02: fca42e23 sw a0,-36(s0) + 3004f06: fcb42c23 sw a1,-40(s0) + /* get iocmg reg address */ + IOCMG_PARAM_CHECK_WITH_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4, IOCMG_PARAM_ERROR); + 3004f0a: fd842703 lw a4,-40(s0) + 3004f0e: 478d li a5,3 + 3004f10: 00e7fb63 bgeu a5,a4,3004f26 + 3004f14: 0cb00593 li a1,203 + 3004f18: 030067b7 lui a5,0x3006 + 3004f1c: 5ec78513 addi a0,a5,1516 # 30065ec + 3004f20: 2ea1 jal ra,3005278 + 3004f22: 4791 li a5,4 + 3004f24: a821 j 3004f3c + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004f26: fdc42503 lw a0,-36(s0) + 3004f2a: 3585 jal ra,3004d8a + 3004f2c: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetDriveRate(iocmgRegx, driveRate); + 3004f30: fd842583 lw a1,-40(s0) + 3004f34: fec42503 lw a0,-20(s0) + 3004f38: 39b5 jal ra,3004bb4 + return IOCMG_STATUS_OK; + 3004f3a: 4781 li a5,0 +} + 3004f3c: 853e mv a0,a5 + 3004f3e: 50b2 lw ra,44(sp) + 3004f40: 5422 lw s0,40(sp) + 3004f42: 6145 addi sp,sp,48 + 3004f44: 8082 ret + +03004f46 : + * @param mode Timer Mode, @ref TIMER_Mode + * @retval true + * @retval false + */ +static inline bool IsTimerMode(TIMER_Mode mode) +{ + 3004f46: 1101 addi sp,sp,-32 + 3004f48: ce22 sw s0,28(sp) + 3004f4a: 1000 addi s0,sp,32 + 3004f4c: fea42623 sw a0,-20(s0) + return (((mode) == TIMER_MODE_RUN_FREE) || + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3004f50: fec42783 lw a5,-20(s0) + 3004f54: cb99 beqz a5,3004f6a + return (((mode) == TIMER_MODE_RUN_FREE) || + 3004f56: fec42703 lw a4,-20(s0) + 3004f5a: 4785 li a5,1 + 3004f5c: 00f70763 beq a4,a5,3004f6a + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3004f60: fec42703 lw a4,-20(s0) + 3004f64: 4789 li a5,2 + 3004f66: 00f71463 bne a4,a5,3004f6e + 3004f6a: 4785 li a5,1 + 3004f6c: a011 j 3004f70 + 3004f6e: 4781 li a5,0 + 3004f70: 8b85 andi a5,a5,1 + 3004f72: 9f81 uxtb a5 + ((mode) == TIMER_MODE_RUN_ONTSHOT)); +} + 3004f74: 853e mv a0,a5 + 3004f76: 4472 lw s0,28(sp) + 3004f78: 6105 addi sp,sp,32 + 3004f7a: 8082 ret + +03004f7c : + * @param mode Timer Interrupt Type, @ref TIMER_InterruptType + * @retval true + * @retval false + */ +static inline bool IsTimerInterruptType(TIMER_InterruptType interruptType) +{ + 3004f7c: 1101 addi sp,sp,-32 + 3004f7e: ce22 sw s0,28(sp) + 3004f80: 1000 addi s0,sp,32 + 3004f82: fea42623 sw a0,-20(s0) + return (((interruptType) == TIMER_PERIOD_FIN) || + 3004f86: fec42783 lw a5,-20(s0) + 3004f8a: c791 beqz a5,3004f96 + 3004f8c: fec42703 lw a4,-20(s0) + 3004f90: 4785 li a5,1 + 3004f92: 00f71463 bne a4,a5,3004f9a + 3004f96: 4785 li a5,1 + 3004f98: a011 j 3004f9c + 3004f9a: 4781 li a5,0 + 3004f9c: 8b85 andi a5,a5,1 + 3004f9e: 9f81 uxtb a5 + ((interruptType) == TIMER_OVER_FLOW)); +} + 3004fa0: 853e mv a0,a5 + 3004fa2: 4472 lw s0,28(sp) + 3004fa4: 6105 addi sp,sp,32 + 3004fa6: 8082 ret + +03004fa8 : + * @param size Timer Size, @ref TIMER_Size + * @retval true + * @retval false + */ +static inline bool IsTimerSize(TIMER_Size size) +{ + 3004fa8: 1101 addi sp,sp,-32 + 3004faa: ce22 sw s0,28(sp) + 3004fac: 1000 addi s0,sp,32 + 3004fae: fea42623 sw a0,-20(s0) + return (((size) == TIMER_SIZE_16BIT) || + 3004fb2: fec42783 lw a5,-20(s0) + 3004fb6: c791 beqz a5,3004fc2 + 3004fb8: fec42703 lw a4,-20(s0) + 3004fbc: 4785 li a5,1 + 3004fbe: 00f71463 bne a4,a5,3004fc6 + 3004fc2: 4785 li a5,1 + 3004fc4: a011 j 3004fc8 + 3004fc6: 4781 li a5,0 + 3004fc8: 8b85 andi a5,a5,1 + 3004fca: 9f81 uxtb a5 + ((size) == TIMER_SIZE_32BIT)); +} + 3004fcc: 853e mv a0,a5 + 3004fce: 4472 lw s0,28(sp) + 3004fd0: 6105 addi sp,sp,32 + 3004fd2: 8082 ret + +03004fd4 : + * @param period + * @retval true + * @retval false + */ +static inline bool IsTimerPeriod(unsigned int period) +{ + 3004fd4: 1101 addi sp,sp,-32 + 3004fd6: ce22 sw s0,28(sp) + 3004fd8: 1000 addi s0,sp,32 + 3004fda: fea42623 sw a0,-20(s0) + return ((period) >= PERIOD_MIN_VALUE); + 3004fde: fec42783 lw a5,-20(s0) + 3004fe2: 00f037b3 snez a5,a5 + 3004fe6: 9f81 uxtb a5 +} + 3004fe8: 853e mv a0,a5 + 3004fea: 4472 lw s0,28(sp) + 3004fec: 6105 addi sp,sp,32 + 3004fee: 8082 ret + +03004ff0 : + * @param div @see TIMER_PrescalerFactor + * @retval true + * @retval false + */ +static inline bool IsTimerDiv(TIMER_PrescalerFactor div) +{ + 3004ff0: 1101 addi sp,sp,-32 + 3004ff2: ce22 sw s0,28(sp) + 3004ff4: 1000 addi s0,sp,32 + 3004ff6: fea42623 sw a0,-20(s0) + return (((div) == TIMERPRESCALER_NO_DIV) || + ((div) == TIMERPRESCALER_DIV_16) || + 3004ffa: fec42783 lw a5,-20(s0) + 3004ffe: cb99 beqz a5,3005014 + return (((div) == TIMERPRESCALER_NO_DIV) || + 3005000: fec42703 lw a4,-20(s0) + 3005004: 4785 li a5,1 + 3005006: 00f70763 beq a4,a5,3005014 + ((div) == TIMERPRESCALER_DIV_16) || + 300500a: fec42703 lw a4,-20(s0) + 300500e: 4789 li a5,2 + 3005010: 00f71463 bne a4,a5,3005018 + 3005014: 4785 li a5,1 + 3005016: a011 j 300501a + 3005018: 4781 li a5,0 + 300501a: 8b85 andi a5,a5,1 + 300501c: 9f81 uxtb a5 + ((div) == TIMERPRESCALER_DIV_256)); +} + 300501e: 853e mv a0,a5 + 3005020: 4472 lw s0,28(sp) + 3005022: 6105 addi sp,sp,32 + 3005024: 8082 ret + +03005026 : + * @param handle Timer Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR parameter check fail + */ +BASE_StatusType HAL_TIMER_Init(TIMER_Handle *handle) +{ + 3005026: 1101 addi sp,sp,-32 + 3005028: ce06 sw ra,28(sp) + 300502a: cc22 sw s0,24(sp) + 300502c: 1000 addi s0,sp,32 + 300502e: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005032: fec42783 lw a5,-20(s0) + 3005036: eb89 bnez a5,3005048 + 3005038: 02800593 li a1,40 + 300503c: 030067b7 lui a5,0x3006 + 3005040: 62c78513 addi a0,a5,1580 # 300662c + 3005044: 2c15 jal ra,3005278 + 3005046: a001 j 3005046 + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 3005048: fec42783 lw a5,-20(s0) + 300504c: 4398 lw a4,0(a5) + 300504e: 143007b7 lui a5,0x14300 + 3005052: 02f70f63 beq a4,a5,3005090 + 3005056: fec42783 lw a5,-20(s0) + 300505a: 4398 lw a4,0(a5) + 300505c: 143017b7 lui a5,0x14301 + 3005060: 02f70863 beq a4,a5,3005090 + 3005064: fec42783 lw a5,-20(s0) + 3005068: 4398 lw a4,0(a5) + 300506a: 143027b7 lui a5,0x14302 + 300506e: 02f70163 beq a4,a5,3005090 + 3005072: fec42783 lw a5,-20(s0) + 3005076: 4398 lw a4,0(a5) + 3005078: 143037b7 lui a5,0x14303 + 300507c: 00f70a63 beq a4,a5,3005090 + 3005080: 02900593 li a1,41 + 3005084: 030067b7 lui a5,0x3006 + 3005088: 62c78513 addi a0,a5,1580 # 300662c + 300508c: 22f5 jal ra,3005278 + 300508e: a001 j 300508e + + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->load), BASE_STATUS_ERROR); + 3005090: fec42783 lw a5,-20(s0) + 3005094: 4bdc lw a5,20(a5) + 3005096: 853e mv a0,a5 + 3005098: 3f35 jal ra,3004fd4 + 300509a: 87aa mv a5,a0 + 300509c: 0017c793 xori a5,a5,1 + 30050a0: 9f81 uxtb a5 + 30050a2: cb91 beqz a5,30050b6 + 30050a4: 02b00593 li a1,43 + 30050a8: 030067b7 lui a5,0x3006 + 30050ac: 62c78513 addi a0,a5,1580 # 300662c + 30050b0: 22e1 jal ra,3005278 + 30050b2: 4785 li a5,1 + 30050b4: aa6d j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->bgLoad), BASE_STATUS_ERROR); + 30050b6: fec42783 lw a5,-20(s0) + 30050ba: 4f9c lw a5,24(a5) + 30050bc: 853e mv a0,a5 + 30050be: 3f19 jal ra,3004fd4 + 30050c0: 87aa mv a5,a0 + 30050c2: 0017c793 xori a5,a5,1 + 30050c6: 9f81 uxtb a5 + 30050c8: cb91 beqz a5,30050dc + 30050ca: 02c00593 li a1,44 + 30050ce: 030067b7 lui a5,0x3006 + 30050d2: 62c78513 addi a0,a5,1580 # 300662c + 30050d6: 224d jal ra,3005278 + 30050d8: 4785 li a5,1 + 30050da: aa51 j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerMode(handle->mode), BASE_STATUS_ERROR); + 30050dc: fec42783 lw a5,-20(s0) + 30050e0: 479c lw a5,8(a5) + 30050e2: 853e mv a0,a5 + 30050e4: 358d jal ra,3004f46 + 30050e6: 87aa mv a5,a0 + 30050e8: 0017c793 xori a5,a5,1 + 30050ec: 9f81 uxtb a5 + 30050ee: cb91 beqz a5,3005102 + 30050f0: 02d00593 li a1,45 + 30050f4: 030067b7 lui a5,0x3006 + 30050f8: 62c78513 addi a0,a5,1580 # 300662c + 30050fc: 2ab5 jal ra,3005278 + 30050fe: 4785 li a5,1 + 3005100: a2bd j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerSize(handle->size), BASE_STATUS_ERROR); + 3005102: fec42783 lw a5,-20(s0) + 3005106: 4b9c lw a5,16(a5) + 3005108: 853e mv a0,a5 + 300510a: 3d79 jal ra,3004fa8 + 300510c: 87aa mv a5,a0 + 300510e: 0017c793 xori a5,a5,1 + 3005112: 9f81 uxtb a5 + 3005114: cb91 beqz a5,3005128 + 3005116: 02e00593 li a1,46 + 300511a: 030067b7 lui a5,0x3006 + 300511e: 62c78513 addi a0,a5,1580 # 300662c + 3005122: 2a99 jal ra,3005278 + 3005124: 4785 li a5,1 + 3005126: a2a1 j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerDiv(handle->prescaler), BASE_STATUS_ERROR); + 3005128: fec42783 lw a5,-20(s0) + 300512c: 47dc lw a5,12(a5) + 300512e: 853e mv a0,a5 + 3005130: 35c1 jal ra,3004ff0 + 3005132: 87aa mv a5,a0 + 3005134: 0017c793 xori a5,a5,1 + 3005138: 9f81 uxtb a5 + 300513a: cb91 beqz a5,300514e + 300513c: 02f00593 li a1,47 + 3005140: 030067b7 lui a5,0x3006 + 3005144: 62c78513 addi a0,a5,1580 # 300662c + 3005148: 2a05 jal ra,3005278 + 300514a: 4785 li a5,1 + 300514c: a20d j 300526e + + /* Initialize the configuration parameters of the timer */ + handle->baseAddress->timer_intclr = BASE_CFG_SET; /* Writing to this register clears interrupt output of timer */ + 300514e: fec42783 lw a5,-20(s0) + 3005152: 439c lw a5,0(a5) + 3005154: 4705 li a4,1 + 3005156: c7d8 sw a4,12(a5) + handle->baseAddress->timer_load = handle->load; + 3005158: fec42783 lw a5,-20(s0) + 300515c: 439c lw a5,0(a5) + 300515e: fec42703 lw a4,-20(s0) + 3005162: 4b58 lw a4,20(a4) + 3005164: c398 sw a4,0(a5) + handle->baseAddress->timerbgload = handle->bgLoad; + 3005166: fec42783 lw a5,-20(s0) + 300516a: 439c lw a5,0(a5) + 300516c: fec42703 lw a4,-20(s0) + 3005170: 4f18 lw a4,24(a4) + 3005172: cf98 sw a4,24(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_DISABLE; + 3005174: fec42783 lw a5,-20(s0) + 3005178: 4398 lw a4,0(a5) + 300517a: 471c lw a5,8(a4) + 300517c: f7f7f793 andi a5,a5,-129 + 3005180: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timerintenable = handle->interruptEn; + 3005182: fec42783 lw a5,-20(s0) + 3005186: 4398 lw a4,0(a5) + 3005188: fec42783 lw a5,-20(s0) + 300518c: 2fd4 lbu a3,28(a5) + 300518e: 471c lw a5,8(a4) + 3005190: 8a85 andi a3,a3,1 + 3005192: 0696 slli a3,a3,0x5 + 3005194: fdf7f793 andi a5,a5,-33 + 3005198: 8fd5 or a5,a5,a3 + 300519a: c71c sw a5,8(a4) + + /* Sets the frequency divider and size of the timer module. */ + handle->baseAddress->TIMERx_CONTROL.BIT.timerpre = handle->prescaler; + 300519c: fec42783 lw a5,-20(s0) + 30051a0: 47d4 lw a3,12(a5) + 30051a2: fec42783 lw a5,-20(s0) + 30051a6: 4398 lw a4,0(a5) + 30051a8: 87b6 mv a5,a3 + 30051aa: 8b8d andi a5,a5,3 + 30051ac: 0ff7f693 andi a3,a5,255 + 30051b0: 471c lw a5,8(a4) + 30051b2: 8a8d andi a3,a3,3 + 30051b4: 068a slli a3,a3,0x2 + 30051b6: 9bcd andi a5,a5,-13 + 30051b8: 8fd5 or a5,a5,a3 + 30051ba: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timersize = handle->size; + 30051bc: fec42783 lw a5,-20(s0) + 30051c0: 4b94 lw a3,16(a5) + 30051c2: fec42783 lw a5,-20(s0) + 30051c6: 4398 lw a4,0(a5) + 30051c8: 87b6 mv a5,a3 + 30051ca: 8b85 andi a5,a5,1 + 30051cc: 0ff7f693 andi a3,a5,255 + 30051d0: 471c lw a5,8(a4) + 30051d2: 8a85 andi a3,a3,1 + 30051d4: 0686 slli a3,a3,0x1 + 30051d6: 9bf5 andi a5,a5,-3 + 30051d8: 8fd5 or a5,a5,a3 + 30051da: c71c sw a5,8(a4) + + /* Sets the running mode of the timer. */ + if (handle->mode == TIMER_MODE_RUN_ONTSHOT) { + 30051dc: fec42783 lw a5,-20(s0) + 30051e0: 4798 lw a4,8(a5) + 30051e2: 4789 li a5,2 + 30051e4: 00f71a63 bne a4,a5,30051f8 + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_SET; + 30051e8: fec42783 lw a5,-20(s0) + 30051ec: 4398 lw a4,0(a5) + 30051ee: 471c lw a5,8(a4) + 30051f0: 0017e793 ori a5,a5,1 + 30051f4: c71c sw a5,8(a4) + 30051f6: a805 j 3005226 + } else { + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_UNSET; + 30051f8: fec42783 lw a5,-20(s0) + 30051fc: 4398 lw a4,0(a5) + 30051fe: 471c lw a5,8(a4) + 3005200: 9bf9 andi a5,a5,-2 + 3005202: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005204: fec42783 lw a5,-20(s0) + 3005208: 479c lw a5,8(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 300520a: fec42703 lw a4,-20(s0) + 300520e: 4318 lw a4,0(a4) + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005210: 00f037b3 snez a5,a5 + 3005214: 0ff7f693 andi a3,a5,255 + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005218: 471c lw a5,8(a4) + 300521a: 8a85 andi a3,a3,1 + 300521c: 069a slli a3,a3,0x6 + 300521e: fbf7f793 andi a5,a5,-65 + 3005222: 8fd5 or a5,a5,a3 + 3005224: c71c sw a5,8(a4) + } + + /* Request for setting the DMA and ADC. */ + handle->baseAddress->TIMERx_CONTROLB.BIT.dmasreqen = handle->dmaReqEnable; + 3005226: fec42783 lw a5,-20(s0) + 300522a: 4398 lw a4,0(a5) + 300522c: fec42783 lw a5,-20(s0) + 3005230: 2ff4 lbu a3,30(a5) + 3005232: 4f5c lw a5,28(a4) + 3005234: 8a85 andi a3,a3,1 + 3005236: 0686 slli a3,a3,0x1 + 3005238: 9bf5 andi a5,a5,-3 + 300523a: 8fd5 or a5,a5,a3 + 300523c: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.dmabreqen = handle->dmaReqEnable; + 300523e: fec42783 lw a5,-20(s0) + 3005242: 4398 lw a4,0(a5) + 3005244: fec42783 lw a5,-20(s0) + 3005248: 2ff4 lbu a3,30(a5) + 300524a: 4f5c lw a5,28(a4) + 300524c: 8a85 andi a3,a3,1 + 300524e: 9bf9 andi a5,a5,-2 + 3005250: 8fd5 or a5,a5,a3 + 3005252: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.socen = handle->adcSocReqEnable; + 3005254: fec42783 lw a5,-20(s0) + 3005258: 4398 lw a4,0(a5) + 300525a: fec42783 lw a5,-20(s0) + 300525e: 3fd4 lbu a3,29(a5) + 3005260: 4f5c lw a5,28(a4) + 3005262: 8a85 andi a3,a3,1 + 3005264: 068a slli a3,a3,0x2 + 3005266: 9bed andi a5,a5,-5 + 3005268: 8fd5 or a5,a5,a3 + 300526a: cf5c sw a5,28(a4) + return BASE_STATUS_OK; + 300526c: 4781 li a5,0 +} + 300526e: 853e mv a0,a5 + 3005270: 40f2 lw ra,28(sp) + 3005272: 4462 lw s0,24(sp) + 3005274: 6105 addi sp,sp,32 + 3005276: 8082 ret + +03005278 : + 3005278: c37fc06f j 3001eae + +0300527c : + * @brief Start timer. + * @param handle Timer Handle + * @retval None + */ +void HAL_TIMER_Start(TIMER_Handle *handle) +{ + 300527c: 1101 addi sp,sp,-32 + 300527e: ce06 sw ra,28(sp) + 3005280: cc22 sw s0,24(sp) + 3005282: 1000 addi s0,sp,32 + 3005284: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005288: fec42783 lw a5,-20(s0) + 300528c: eb89 bnez a5,300529e + 300528e: 0bc00593 li a1,188 + 3005292: 030067b7 lui a5,0x3006 + 3005296: 62c78513 addi a0,a5,1580 # 300662c + 300529a: 3ff9 jal ra,3005278 + 300529c: a001 j 300529c + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 300529e: fec42783 lw a5,-20(s0) + 30052a2: 4398 lw a4,0(a5) + 30052a4: 143007b7 lui a5,0x14300 + 30052a8: 02f70f63 beq a4,a5,30052e6 + 30052ac: fec42783 lw a5,-20(s0) + 30052b0: 4398 lw a4,0(a5) + 30052b2: 143017b7 lui a5,0x14301 + 30052b6: 02f70863 beq a4,a5,30052e6 + 30052ba: fec42783 lw a5,-20(s0) + 30052be: 4398 lw a4,0(a5) + 30052c0: 143027b7 lui a5,0x14302 + 30052c4: 02f70163 beq a4,a5,30052e6 + 30052c8: fec42783 lw a5,-20(s0) + 30052cc: 4398 lw a4,0(a5) + 30052ce: 143037b7 lui a5,0x14303 + 30052d2: 00f70a63 beq a4,a5,30052e6 + 30052d6: 0bd00593 li a1,189 + 30052da: 030067b7 lui a5,0x3006 + 30052de: 62c78513 addi a0,a5,1580 # 300662c + 30052e2: 3f59 jal ra,3005278 + 30052e4: a001 j 30052e4 + /* Enable timer */ + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_SET; + 30052e6: fec42783 lw a5,-20(s0) + 30052ea: 4398 lw a4,0(a5) + 30052ec: 471c lw a5,8(a4) + 30052ee: 0807e793 ori a5,a5,128 + 30052f2: c71c sw a5,8(a4) +} + 30052f4: 0001 nop + 30052f6: 40f2 lw ra,28(sp) + 30052f8: 4462 lw s0,24(sp) + 30052fa: 6105 addi sp,sp,32 + 30052fc: 8082 ret + +030052fe : + * @brief GPT Interrupt service processing function. + * @param handle TIMER Handle + * @retval None + */ +void HAL_TIMER_IrqHandler(void *handle) +{ + 30052fe: 7179 addi sp,sp,-48 + 3005300: d606 sw ra,44(sp) + 3005302: d422 sw s0,40(sp) + 3005304: 1800 addi s0,sp,48 + 3005306: fca42e23 sw a0,-36(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 300530a: fdc42783 lw a5,-36(s0) + 300530e: eb89 bnez a5,3005320 + 3005310: 0d800593 li a1,216 + 3005314: 030067b7 lui a5,0x3006 + 3005318: 62c78513 addi a0,a5,1580 # 300662c + 300531c: 3fb1 jal ra,3005278 + 300531e: a001 j 300531e + TIMER_Handle *timerHandle = (TIMER_Handle *)handle; + 3005320: fdc42783 lw a5,-36(s0) + 3005324: fef42623 sw a5,-20(s0) + TIMER_ASSERT_PARAM(IsTIMERInstance(timerHandle->baseAddress)); + 3005328: fec42783 lw a5,-20(s0) + 300532c: 4398 lw a4,0(a5) + 300532e: 143007b7 lui a5,0x14300 + 3005332: 02f70f63 beq a4,a5,3005370 + 3005336: fec42783 lw a5,-20(s0) + 300533a: 4398 lw a4,0(a5) + 300533c: 143017b7 lui a5,0x14301 + 3005340: 02f70863 beq a4,a5,3005370 + 3005344: fec42783 lw a5,-20(s0) + 3005348: 4398 lw a4,0(a5) + 300534a: 143027b7 lui a5,0x14302 + 300534e: 02f70163 beq a4,a5,3005370 + 3005352: fec42783 lw a5,-20(s0) + 3005356: 4398 lw a4,0(a5) + 3005358: 143037b7 lui a5,0x14303 + 300535c: 00f70a63 beq a4,a5,3005370 + 3005360: 0da00593 li a1,218 + 3005364: 030067b7 lui a5,0x3006 + 3005368: 62c78513 addi a0,a5,1580 # 300662c + 300536c: 3731 jal ra,3005278 + 300536e: a001 j 300536e + /* Check interrupt type */ + if (timerHandle->baseAddress->TIMERx_MIS.dmaovmis == BASE_CFG_ENABLE) { + 3005370: fec42783 lw a5,-20(s0) + 3005374: 439c lw a5,0(a5) + 3005376: 4bdc lw a5,20(a5) + 3005378: 8385 srli a5,a5,0x1 + 300537a: 8b85 andi a5,a5,1 + 300537c: 0ff7f713 andi a4,a5,255 + 3005380: 4785 li a5,1 + 3005382: 02f71363 bne a4,a5,30053a8 + /* DMA overflow interrupt */ + timerHandle->baseAddress->DMAOV_INTCLR.BIT.dmaov_intclr = BASE_CFG_ENABLE; + 3005386: fec42783 lw a5,-20(s0) + 300538a: 4398 lw a4,0(a5) + 300538c: 531c lw a5,32(a4) + 300538e: 0017e793 ori a5,a5,1 + 3005392: d31c sw a5,32(a4) + /* Call the timer DMA request overflow callback function of the user. */ + if (timerHandle->userCallBack.TimerOverFlowCallBack != NULL) { + 3005394: fec42783 lw a5,-20(s0) + 3005398: 53dc lw a5,36(a5) + 300539a: c799 beqz a5,30053a8 + timerHandle->userCallBack.TimerOverFlowCallBack(timerHandle); + 300539c: fec42783 lw a5,-20(s0) + 30053a0: 53dc lw a5,36(a5) + 30053a2: fec42503 lw a0,-20(s0) + 30053a6: 9782 jalr a5 + } + } + if (timerHandle->baseAddress->TIMERx_MIS.timermis == BASE_CFG_ENABLE) { + 30053a8: fec42783 lw a5,-20(s0) + 30053ac: 439c lw a5,0(a5) + 30053ae: 4bdc lw a5,20(a5) + 30053b0: 8b85 andi a5,a5,1 + 30053b2: 0ff7f713 andi a4,a5,255 + 30053b6: 4785 li a5,1 + 30053b8: 02f71263 bne a4,a5,30053dc + /* TIMER Interrupt */ + timerHandle->baseAddress->timer_intclr = BASE_CFG_ENABLE; + 30053bc: fec42783 lw a5,-20(s0) + 30053c0: 439c lw a5,0(a5) + 30053c2: 4705 li a4,1 + 30053c4: c7d8 sw a4,12(a5) + /* Call the period finish callback function of the user. */ + if (timerHandle->userCallBack.TimerPeriodFinCallBack != NULL) { + 30053c6: fec42783 lw a5,-20(s0) + 30053ca: 539c lw a5,32(a5) + 30053cc: cb81 beqz a5,30053dc + timerHandle->userCallBack.TimerPeriodFinCallBack(timerHandle); + 30053ce: fec42783 lw a5,-20(s0) + 30053d2: 539c lw a5,32(a5) + 30053d4: fec42503 lw a0,-20(s0) + 30053d8: 9782 jalr a5 + } + } + return; + 30053da: 0001 nop + 30053dc: 0001 nop +} + 30053de: 50b2 lw ra,44(sp) + 30053e0: 5422 lw s0,40(sp) + 30053e2: 6145 addi sp,sp,48 + 30053e4: 8082 ret + +030053e6 : + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_TIMER_RegisterCallback(TIMER_Handle *handle, TIMER_InterruptType typeID, + TIMER_CallBackFunc callBackFunc) +{ + 30053e6: 1101 addi sp,sp,-32 + 30053e8: ce06 sw ra,28(sp) + 30053ea: cc22 sw s0,24(sp) + 30053ec: 1000 addi s0,sp,32 + 30053ee: fea42623 sw a0,-20(s0) + 30053f2: feb42423 sw a1,-24(s0) + 30053f6: fec42223 sw a2,-28(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 30053fa: fec42783 lw a5,-20(s0) + 30053fe: eb89 bnez a5,3005410 + 3005400: 0fa00593 li a1,250 + 3005404: 030067b7 lui a5,0x3006 + 3005408: 62c78513 addi a0,a5,1580 # 300662c + 300540c: 35b5 jal ra,3005278 + 300540e: a001 j 300540e + TIMER_ASSERT_PARAM(callBackFunc != NULL); + 3005410: fe442783 lw a5,-28(s0) + 3005414: eb89 bnez a5,3005426 + 3005416: 0fb00593 li a1,251 + 300541a: 030067b7 lui a5,0x3006 + 300541e: 62c78513 addi a0,a5,1580 # 300662c + 3005422: 3d99 jal ra,3005278 + 3005424: a001 j 3005424 + TIMER_ASSERT_PARAM(IsTimerInterruptType(typeID)); + 3005426: fe842503 lw a0,-24(s0) + 300542a: 3e89 jal ra,3004f7c + 300542c: 87aa mv a5,a0 + 300542e: 0017c793 xori a5,a5,1 + 3005432: 9f81 uxtb a5 + 3005434: cb89 beqz a5,3005446 + 3005436: 0fc00593 li a1,252 + 300543a: 030067b7 lui a5,0x3006 + 300543e: 62c78513 addi a0,a5,1580 # 300662c + 3005442: 3d1d jal ra,3005278 + 3005444: a001 j 3005444 + + /* Registers the user callback function. */ + switch (typeID) { + 3005446: fe842783 lw a5,-24(s0) + 300544a: cb91 beqz a5,300545e + 300544c: 4705 li a4,1 + 300544e: 00e79e63 bne a5,a4,300546a + case TIMER_OVER_FLOW: + handle->userCallBack.TimerOverFlowCallBack = callBackFunc; /* User DMA request overflow function */ + 3005452: fec42783 lw a5,-20(s0) + 3005456: fe442703 lw a4,-28(s0) + 300545a: d3d8 sw a4,36(a5) + break; + 300545c: a809 j 300546e + case TIMER_PERIOD_FIN: + handle->userCallBack.TimerPeriodFinCallBack = callBackFunc; /* User timer period finish call back. */ + 300545e: fec42783 lw a5,-20(s0) + 3005462: fe442703 lw a4,-28(s0) + 3005466: d398 sw a4,32(a5) + break; + 3005468: a019 j 300546e + default: + return BASE_STATUS_ERROR; + 300546a: 4785 li a5,1 + 300546c: a011 j 3005470 + } + return BASE_STATUS_OK; + 300546e: 4781 li a5,0 +} + 3005470: 853e mv a0,a5 + 3005472: 40f2 lw ra,28(sp) + 3005474: 4462 lw s0,24(sp) + 3005476: 6105 addi sp,sp,32 + 3005478: 8082 ret + +0300547a : + * @brief Check UART datalength parameter. + * @param datalength The number of data bits in a frame, @ref UART_DataLength + * @retval bool + */ +static inline bool IsUartDatalength(UART_DataLength datalength) +{ + 300547a: 1101 addi sp,sp,-32 + 300547c: ce22 sw s0,28(sp) + 300547e: 1000 addi s0,sp,32 + 3005480: fea42623 sw a0,-20(s0) + return (datalength >= UART_DATALENGTH_5BIT) && (datalength <= UART_DATALENGTH_8BIT); + 3005484: fec42783 lw a5,-20(s0) + 3005488: 0047b793 sltiu a5,a5,4 + 300548c: 9f81 uxtb a5 +} + 300548e: 853e mv a0,a5 + 3005490: 4472 lw s0,28(sp) + 3005492: 6105 addi sp,sp,32 + 3005494: 8082 ret + +03005496 : + * @brief Check UART stopbits parameter. + * @param stopbits The number of stop bits in a frame, @ref UART_StopBits + * @retval bool + */ +static inline bool IsUartStopbits(UART_StopBits stopbits) +{ + 3005496: 1101 addi sp,sp,-32 + 3005498: ce22 sw s0,28(sp) + 300549a: 1000 addi s0,sp,32 + 300549c: fea42623 sw a0,-20(s0) + return (stopbits == UART_STOPBITS_ONE) || (stopbits == UART_STOPBITS_TWO); + 30054a0: fec42783 lw a5,-20(s0) + 30054a4: c791 beqz a5,30054b0 + 30054a6: fec42703 lw a4,-20(s0) + 30054aa: 4785 li a5,1 + 30054ac: 00f71463 bne a4,a5,30054b4 + 30054b0: 4785 li a5,1 + 30054b2: a011 j 30054b6 + 30054b4: 4781 li a5,0 + 30054b6: 8b85 andi a5,a5,1 + 30054b8: 9f81 uxtb a5 +} + 30054ba: 853e mv a0,a5 + 30054bc: 4472 lw s0,28(sp) + 30054be: 6105 addi sp,sp,32 + 30054c0: 8082 ret + +030054c2 : + * @brief Check UART paritymode parameter. + * @param paritymode UART parity check mode, @ref UART_Parity_Mode + * @retval bool + */ +static inline bool IsUartParitymode(UART_Parity_Mode paritymode) +{ + 30054c2: 1101 addi sp,sp,-32 + 30054c4: ce22 sw s0,28(sp) + 30054c6: 1000 addi s0,sp,32 + 30054c8: fea42623 sw a0,-20(s0) + if ((paritymode >= UART_PARITY_ODD) && (paritymode <= UART_PARITY_NONE)) { + 30054cc: fec42703 lw a4,-20(s0) + 30054d0: 4791 li a5,4 + 30054d2: 00e7e463 bltu a5,a4,30054da + return true; + 30054d6: 4785 li a5,1 + 30054d8: a011 j 30054dc + } + return false; + 30054da: 4781 li a5,0 +} + 30054dc: 853e mv a0,a5 + 30054de: 4472 lw s0,28(sp) + 30054e0: 6105 addi sp,sp,32 + 30054e2: 8082 ret + +030054e4 : + * @brief Check UART transmode parameter. + * @param transmode Transmit mode, @ref UART_Transmit_Mode + * @retval bool + */ +static inline bool IsUartTransmode(UART_Transmit_Mode transmode) +{ + 30054e4: 1101 addi sp,sp,-32 + 30054e6: ce22 sw s0,28(sp) + 30054e8: 1000 addi s0,sp,32 + 30054ea: fea42623 sw a0,-20(s0) + if ((transmode == UART_MODE_BLOCKING) || + 30054ee: fec42783 lw a5,-20(s0) + 30054f2: c385 beqz a5,3005512 + 30054f4: fec42703 lw a4,-20(s0) + 30054f8: 4785 li a5,1 + 30054fa: 00f70c63 beq a4,a5,3005512 + (transmode == UART_MODE_INTERRUPT) || + 30054fe: fec42703 lw a4,-20(s0) + 3005502: 4789 li a5,2 + 3005504: 00f70763 beq a4,a5,3005512 + (transmode == UART_MODE_DMA) || + 3005508: fec42703 lw a4,-20(s0) + 300550c: 478d li a5,3 + 300550e: 00f71463 bne a4,a5,3005516 + (transmode == UART_MODE_DISABLE)) { + return true; + 3005512: 4785 li a5,1 + 3005514: a011 j 3005518 + } + return false; + 3005516: 4781 li a5,0 +} + 3005518: 853e mv a0,a5 + 300551a: 4472 lw s0,28(sp) + 300551c: 6105 addi sp,sp,32 + 300551e: 8082 ret + +03005520 : + * @brief Check UART fifoThreshold parameter. + * @param fifoThreshold UART TX/RX FIFO line interrupt threshold, @ref UART_FIFO_Threshold + * @retval bool + */ +static inline bool IsUartFIFOThreshold(UART_FIFO_Threshold fifoThreshold) +{ + 3005520: 1101 addi sp,sp,-32 + 3005522: ce22 sw s0,28(sp) + 3005524: 1000 addi s0,sp,32 + 3005526: fea42623 sw a0,-20(s0) + return (fifoThreshold >= UART_FIFODEPTH_SIZE0) && (fifoThreshold <= UART_FIFODEPTH_SIZE15); + 300552a: fec42783 lw a5,-20(s0) + 300552e: 0107b793 sltiu a5,a5,16 + 3005532: 9f81 uxtb a5 +} + 3005534: 853e mv a0,a5 + 3005536: 4472 lw s0,28(sp) + 3005538: 6105 addi sp,sp,32 + 300553a: 8082 ret + +0300553c : + * @brief Check UART Oversampling multiple. + * @param multiple Oversampling multiple, @ref UART_OversampleMultiple + * @retval bool + */ +static inline bool IsUartOversampleMultiple(UART_OversampleMultiple multiple) +{ + 300553c: 1101 addi sp,sp,-32 + 300553e: ce22 sw s0,28(sp) + 3005540: 1000 addi s0,sp,32 + 3005542: fea42623 sw a0,-20(s0) + return (multiple >= UART_OVERSAMPLING_16X) && (multiple <= UART_OVERSAMPLING_12X); + 3005546: fec42783 lw a5,-20(s0) + 300554a: 0057b793 sltiu a5,a5,5 + 300554e: 9f81 uxtb a5 +} + 3005550: 853e mv a0,a5 + 3005552: 4472 lw s0,28(sp) + 3005554: 6105 addi sp,sp,32 + 3005556: 8082 ret + +03005558 : +#define PARITY_EVEN 0x6 +#define PARITY_MARK 0x82 +#define PARITY_SPACE 0x86 + +static unsigned int DivClosest(unsigned int x, unsigned int divisor) +{ + 3005558: 7179 addi sp,sp,-48 + 300555a: d622 sw s0,44(sp) + 300555c: 1800 addi s0,sp,48 + 300555e: fca42e23 sw a0,-36(s0) + 3005562: fcb42c23 sw a1,-40(s0) + unsigned int ret; + if (divisor == 0) { + 3005566: fd842783 lw a5,-40(s0) + 300556a: e399 bnez a5,3005570 + return 0; + 300556c: 4781 li a5,0 + 300556e: a005 j 300558e + } + ret = (((x) + ((divisor) / 2)) / (divisor)); /* Round up the result, add 1/2 */ + 3005570: fd842783 lw a5,-40(s0) + 3005574: 0017d713 srli a4,a5,0x1 + 3005578: fdc42783 lw a5,-36(s0) + 300557c: 973e add a4,a4,a5 + 300557e: fd842783 lw a5,-40(s0) + 3005582: 02f757b3 divu a5,a4,a5 + 3005586: fef42623 sw a5,-20(s0) + return ret; + 300558a: fec42783 lw a5,-20(s0) +} + 300558e: 853e mv a0,a5 + 3005590: 5432 lw s0,44(sp) + 3005592: 6145 addi sp,sp,48 + 3005594: 8082 ret + +03005596 : + * @brief Sets the parity bit of the UART. + * @param uartHandle UART handle. + * @retval None. + */ +static void UART_SetParityBit(UART_Handle *uartHandle) +{ + 3005596: 1101 addi sp,sp,-32 + 3005598: ce22 sw s0,28(sp) + 300559a: 1000 addi s0,sp,32 + 300559c: fea42623 sw a0,-20(s0) + /* Sets the UART check mode. */ + switch (uartHandle->parity) { + 30055a0: fec42783 lw a5,-20(s0) + 30055a4: 4b9c lw a5,16(a5) + 30055a6: 4711 li a4,4 + 30055a8: 06f76e63 bltu a4,a5,3005624 + 30055ac: 00279713 slli a4,a5,0x2 + 30055b0: 030067b7 lui a5,0x3006 + 30055b4: 64c78793 addi a5,a5,1612 # 300664c + 30055b8: 97ba add a5,a5,a4 + 30055ba: 439c lw a5,0(a5) + 30055bc: 8782 jr a5 + case UART_PARITY_ODD: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_ODD; /* Odd parity. */ + 30055be: fec42783 lw a5,-20(s0) + 30055c2: 439c lw a5,0(a5) + 30055c4: 57d8 lw a4,44(a5) + 30055c6: fec42783 lw a5,-20(s0) + 30055ca: 439c lw a5,0(a5) + 30055cc: 00276713 ori a4,a4,2 + 30055d0: d7d8 sw a4,44(a5) + break; + 30055d2: a891 j 3005626 + case UART_PARITY_EVEN: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_EVEN; /* Even parity. */ + 30055d4: fec42783 lw a5,-20(s0) + 30055d8: 439c lw a5,0(a5) + 30055da: 57d8 lw a4,44(a5) + 30055dc: fec42783 lw a5,-20(s0) + 30055e0: 439c lw a5,0(a5) + 30055e2: 00676713 ori a4,a4,6 + 30055e6: d7d8 sw a4,44(a5) + break; + 30055e8: a83d j 3005626 + case UART_PARITY_MARK: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_MARK; /* Marking parity */ + 30055ea: fec42783 lw a5,-20(s0) + 30055ee: 439c lw a5,0(a5) + 30055f0: 57d8 lw a4,44(a5) + 30055f2: fec42783 lw a5,-20(s0) + 30055f6: 439c lw a5,0(a5) + 30055f8: 08276713 ori a4,a4,130 + 30055fc: d7d8 sw a4,44(a5) + break; + 30055fe: a025 j 3005626 + case UART_PARITY_SPACE: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_SPACE; /* space parity */ + 3005600: fec42783 lw a5,-20(s0) + 3005604: 439c lw a5,0(a5) + 3005606: 57d8 lw a4,44(a5) + 3005608: fec42783 lw a5,-20(s0) + 300560c: 439c lw a5,0(a5) + 300560e: 08676713 ori a4,a4,134 + 3005612: d7d8 sw a4,44(a5) + break; + 3005614: a809 j 3005626 + case UART_PARITY_NONE: + uartHandle->baseAddress->UART_LCR_H.BIT.pen = BASE_CFG_DISABLE; /* No parity */ + 3005616: fec42783 lw a5,-20(s0) + 300561a: 4398 lw a4,0(a5) + 300561c: 575c lw a5,44(a4) + 300561e: 9bf5 andi a5,a5,-3 + 3005620: d75c sw a5,44(a4) + break; + 3005622: a011 j 3005626 + default: + return; + 3005624: 0001 nop + } +} + 3005626: 4472 lw s0,28(sp) + 3005628: 6105 addi sp,sp,32 + 300562a: 8082 ret + +0300562c : + * @brief Initialize the UART hardware configuration and configure parameters based on the specified handle. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_Init(UART_Handle *uartHandle) +{ + 300562c: 7179 addi sp,sp,-48 + 300562e: d606 sw ra,44(sp) + 3005630: d422 sw s0,40(sp) + 3005632: 1800 addi s0,sp,48 + 3005634: fca42e23 sw a0,-36(s0) + UART_ASSERT_PARAM(uartHandle != NULL); + 3005638: fdc42783 lw a5,-36(s0) + 300563c: eb89 bnez a5,300564e + 300563e: 09700593 li a1,151 + 3005642: 030067b7 lui a5,0x3006 + 3005646: 66078513 addi a0,a5,1632 # 3006660 + 300564a: 313d jal ra,3005278 + 300564c: a001 j 300564c + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + 300564e: fdc42783 lw a5,-36(s0) + 3005652: 4398 lw a4,0(a5) + 3005654: 140007b7 lui a5,0x14000 + 3005658: 02f70f63 beq a4,a5,3005696 + 300565c: fdc42783 lw a5,-36(s0) + 3005660: 4398 lw a4,0(a5) + 3005662: 140017b7 lui a5,0x14001 + 3005666: 02f70863 beq a4,a5,3005696 + 300566a: fdc42783 lw a5,-36(s0) + 300566e: 4398 lw a4,0(a5) + 3005670: 140027b7 lui a5,0x14002 + 3005674: 02f70163 beq a4,a5,3005696 + 3005678: fdc42783 lw a5,-36(s0) + 300567c: 4398 lw a4,0(a5) + 300567e: 140037b7 lui a5,0x14003 + 3005682: 00f70a63 beq a4,a5,3005696 + 3005686: 09800593 li a1,152 + 300568a: 030067b7 lui a5,0x3006 + 300568e: 66078513 addi a0,a5,1632 # 3006660 + 3005692: 36dd jal ra,3005278 + 3005694: a001 j 3005694 + UART_PARAM_CHECK_WITH_RET(uartHandle->txState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 3005696: fdc42783 lw a5,-36(s0) + 300569a: 47bc lw a5,72(a5) + 300569c: cb91 beqz a5,30056b0 + 300569e: 09900593 li a1,153 + 30056a2: 030067b7 lui a5,0x3006 + 30056a6: 66078513 addi a0,a5,1632 # 3006660 + 30056aa: 36f9 jal ra,3005278 + 30056ac: 4785 li a5,1 + 30056ae: ae0d j 30059e0 + UART_PARAM_CHECK_WITH_RET(uartHandle->rxState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 30056b0: fdc42783 lw a5,-36(s0) + 30056b4: 47fc lw a5,76(a5) + 30056b6: cb91 beqz a5,30056ca + 30056b8: 09a00593 li a1,154 + 30056bc: 030067b7 lui a5,0x3006 + 30056c0: 66078513 addi a0,a5,1632 # 3006660 + 30056c4: 3e55 jal ra,3005278 + 30056c6: 4785 li a5,1 + 30056c8: ae21 j 30059e0 + unsigned int uartClock, quot; + UART_PARAM_CHECK_WITH_RET(IsUartDatalength(uartHandle->dataLength), BASE_STATUS_ERROR); + 30056ca: fdc42783 lw a5,-36(s0) + 30056ce: 479c lw a5,8(a5) + 30056d0: 853e mv a0,a5 + 30056d2: 3365 jal ra,300547a + 30056d4: 87aa mv a5,a0 + 30056d6: 0017c793 xori a5,a5,1 + 30056da: 9f81 uxtb a5 + 30056dc: cb91 beqz a5,30056f0 + 30056de: 09c00593 li a1,156 + 30056e2: 030067b7 lui a5,0x3006 + 30056e6: 66078513 addi a0,a5,1632 # 3006660 + 30056ea: 3679 jal ra,3005278 + 30056ec: 4785 li a5,1 + 30056ee: accd j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartStopbits(uartHandle->stopBits), BASE_STATUS_ERROR); + 30056f0: fdc42783 lw a5,-36(s0) + 30056f4: 47dc lw a5,12(a5) + 30056f6: 853e mv a0,a5 + 30056f8: 3b79 jal ra,3005496 + 30056fa: 87aa mv a5,a0 + 30056fc: 0017c793 xori a5,a5,1 + 3005700: 9f81 uxtb a5 + 3005702: cb91 beqz a5,3005716 + 3005704: 09d00593 li a1,157 + 3005708: 030067b7 lui a5,0x3006 + 300570c: 66078513 addi a0,a5,1632 # 3006660 + 3005710: 36a5 jal ra,3005278 + 3005712: 4785 li a5,1 + 3005714: a4f1 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartParitymode(uartHandle->parity), BASE_STATUS_ERROR); + 3005716: fdc42783 lw a5,-36(s0) + 300571a: 4b9c lw a5,16(a5) + 300571c: 853e mv a0,a5 + 300571e: 3355 jal ra,30054c2 + 3005720: 87aa mv a5,a0 + 3005722: 0017c793 xori a5,a5,1 + 3005726: 9f81 uxtb a5 + 3005728: cb91 beqz a5,300573c + 300572a: 09e00593 li a1,158 + 300572e: 030067b7 lui a5,0x3006 + 3005732: 66078513 addi a0,a5,1632 # 3006660 + 3005736: 3689 jal ra,3005278 + 3005738: 4785 li a5,1 + 300573a: a45d j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->txMode), BASE_STATUS_ERROR); + 300573c: fdc42783 lw a5,-36(s0) + 3005740: 4bdc lw a5,20(a5) + 3005742: 853e mv a0,a5 + 3005744: 3345 jal ra,30054e4 + 3005746: 87aa mv a5,a0 + 3005748: 0017c793 xori a5,a5,1 + 300574c: 9f81 uxtb a5 + 300574e: cb91 beqz a5,3005762 + 3005750: 09f00593 li a1,159 + 3005754: 030067b7 lui a5,0x3006 + 3005758: 66078513 addi a0,a5,1632 # 3006660 + 300575c: 3e31 jal ra,3005278 + 300575e: 4785 li a5,1 + 3005760: a441 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->rxMode), BASE_STATUS_ERROR); + 3005762: fdc42783 lw a5,-36(s0) + 3005766: 4f9c lw a5,24(a5) + 3005768: 853e mv a0,a5 + 300576a: 3bad jal ra,30054e4 + 300576c: 87aa mv a5,a0 + 300576e: 0017c793 xori a5,a5,1 + 3005772: 9f81 uxtb a5 + 3005774: cb91 beqz a5,3005788 + 3005776: 0a000593 li a1,160 + 300577a: 030067b7 lui a5,0x3006 + 300577e: 66078513 addi a0,a5,1632 # 3006660 + 3005782: 3cdd jal ra,3005278 + 3005784: 4785 li a5,1 + 3005786: aca9 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoTxThr), BASE_STATUS_ERROR); + 3005788: fdc42783 lw a5,-36(s0) + 300578c: 5b9c lw a5,48(a5) + 300578e: 853e mv a0,a5 + 3005790: 3b41 jal ra,3005520 + 3005792: 87aa mv a5,a0 + 3005794: 0017c793 xori a5,a5,1 + 3005798: 9f81 uxtb a5 + 300579a: cb91 beqz a5,30057ae + 300579c: 0a100593 li a1,161 + 30057a0: 030067b7 lui a5,0x3006 + 30057a4: 66078513 addi a0,a5,1632 # 3006660 + 30057a8: 3cc1 jal ra,3005278 + 30057aa: 4785 li a5,1 + 30057ac: ac15 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoRxThr), BASE_STATUS_ERROR); + 30057ae: fdc42783 lw a5,-36(s0) + 30057b2: 5bdc lw a5,52(a5) + 30057b4: 853e mv a0,a5 + 30057b6: 33ad jal ra,3005520 + 30057b8: 87aa mv a5,a0 + 30057ba: 0017c793 xori a5,a5,1 + 30057be: 9f81 uxtb a5 + 30057c0: cb91 beqz a5,30057d4 + 30057c2: 0a200593 li a1,162 + 30057c6: 030067b7 lui a5,0x3006 + 30057ca: 66078513 addi a0,a5,1632 # 3006660 + 30057ce: 346d jal ra,3005278 + 30057d0: 4785 li a5,1 + 30057d2: a439 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartOversampleMultiple(uartHandle->handleEx.overSampleMultiple), BASE_STATUS_ERROR); + 30057d4: fdc42783 lw a5,-36(s0) + 30057d8: 5fbc lw a5,120(a5) + 30057da: 853e mv a0,a5 + 30057dc: 3385 jal ra,300553c + 30057de: 87aa mv a5,a0 + 30057e0: 0017c793 xori a5,a5,1 + 30057e4: 9f81 uxtb a5 + 30057e6: cb91 beqz a5,30057fa + 30057e8: 0a300593 li a1,163 + 30057ec: 030067b7 lui a5,0x3006 + 30057f0: 66078513 addi a0,a5,1632 # 3006660 + 30057f4: 3451 jal ra,3005278 + 30057f6: 4785 li a5,1 + 30057f8: a2e5 j 30059e0 + + uartHandle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; + 30057fa: fdc42783 lw a5,-36(s0) + 30057fe: 4398 lw a4,0(a5) + 3005800: 5b1c lw a5,48(a4) + 3005802: 9bf9 andi a5,a5,-2 + 3005804: db1c sw a5,48(a4) + while (uartHandle->baseAddress->UART_FR.BIT.busy == 0x01) { + 3005806: 0001 nop + 3005808: fdc42783 lw a5,-36(s0) + 300580c: 439c lw a5,0(a5) + 300580e: 4f9c lw a5,24(a5) + 3005810: 838d srli a5,a5,0x3 + 3005812: 8b85 andi a5,a5,1 + 3005814: 0ff7f713 andi a4,a5,255 + 3005818: 4785 li a5,1 + 300581a: fef707e3 beq a4,a5,3005808 + ; + } + + uartClock = HAL_CRG_GetIpFreq((void *)uartHandle->baseAddress); + 300581e: fdc42783 lw a5,-36(s0) + 3005822: 439c lw a5,0(a5) + 3005824: 853e mv a0,a5 + 3005826: 9f1fd0ef jal ra,3003216 + 300582a: fea42623 sw a0,-20(s0) + + /* DCL OverSample Multiple check */ + uartHandle->baseAddress->UART_SPCFG.BIT.spcfg = uartHandle->handleEx.overSampleMultiple; + 300582e: fdc42783 lw a5,-36(s0) + 3005832: 5fb4 lw a3,120(a5) + 3005834: fdc42783 lw a5,-36(s0) + 3005838: 4398 lw a4,0(a5) + 300583a: 87b6 mv a5,a3 + 300583c: 8bbd andi a5,a5,15 + 300583e: 0ff7f693 andi a3,a5,255 + 3005842: 4f3c lw a5,88(a4) + 3005844: 8abd andi a3,a3,15 + 3005846: 9bc1 andi a5,a5,-16 + 3005848: 8fd5 or a5,a5,a3 + 300584a: cf3c sw a5,88(a4) + + /* DCL sequences setting */ + uartHandle->baseAddress->UART_DS.BIT.msbfirst = uartHandle->handleEx.msbFirst; + 300584c: fdc42783 lw a5,-36(s0) + 3005850: 4398 lw a4,0(a5) + 3005852: fdc42783 lw a5,-36(s0) + 3005856: 07c7c683 lbu a3,124(a5) + 300585a: 4b3c lw a5,80(a4) + 300585c: 8a85 andi a3,a3,1 + 300585e: 9bf9 andi a5,a5,-2 + 3005860: 8fd5 or a5,a5,a3 + 3005862: cb3c sw a5,80(a4) + + /* The baud rate divider(BRD) based on the baud rate and clock frequency, calculation formula */ + unsigned int oversample = uartHandle->baseAddress->UART_SPCFG.reg; + 3005864: fdc42783 lw a5,-36(s0) + 3005868: 439c lw a5,0(a5) + 300586a: 4fbc lw a5,88(a5) + 300586c: fef42423 sw a5,-24(s0) + if (uartHandle->baudRate > (uartClock / (OVERSAMPLING_PARAM - oversample))) { + 3005870: fdc42783 lw a5,-36(s0) + 3005874: 43d8 lw a4,4(a5) + 3005876: 46c1 li a3,16 + 3005878: fe842783 lw a5,-24(s0) + 300587c: 40f687b3 sub a5,a3,a5 + 3005880: fec42683 lw a3,-20(s0) + 3005884: 02f6d7b3 divu a5,a3,a5 + 3005888: 00e7f463 bgeu a5,a4,3005890 + return BASE_STATUS_ERROR; + 300588c: 4785 li a5,1 + 300588e: aa89 j 30059e0 + } else { + unsigned int tmpClock = uartClock / (OVERSAMPLING_PARAM - oversample) * 64; /* 64 is for decimal parts */ + 3005890: 4741 li a4,16 + 3005892: fe842783 lw a5,-24(s0) + 3005896: 40f707b3 sub a5,a4,a5 + 300589a: fec42703 lw a4,-20(s0) + 300589e: 02f757b3 divu a5,a4,a5 + 30058a2: 079a slli a5,a5,0x6 + 30058a4: fef42223 sw a5,-28(s0) + quot = DivClosest(tmpClock, uartHandle->baudRate); + 30058a8: fdc42783 lw a5,-36(s0) + 30058ac: 43dc lw a5,4(a5) + 30058ae: 85be mv a1,a5 + 30058b0: fe442503 lw a0,-28(s0) + 30058b4: 3155 jal ra,3005558 + 30058b6: fea42023 sw a0,-32(s0) + } + /* Clear the baud rate divider register */ + uartHandle->baseAddress->UART_FBRD.reg = 0; + 30058ba: fdc42783 lw a5,-36(s0) + 30058be: 439c lw a5,0(a5) + 30058c0: 0207a423 sw zero,40(a5) + uartHandle->baseAddress->UART_IBRD.reg = 0; + 30058c4: fdc42783 lw a5,-36(s0) + 30058c8: 439c lw a5,0(a5) + 30058ca: 0207a223 sw zero,36(a5) + /* The fractional baud rate divider value is stored to the lower 6 bits of the FBRD */ + uartHandle->baseAddress->UART_FBRD.reg = (quot & 0x3F); + 30058ce: fdc42783 lw a5,-36(s0) + 30058d2: 439c lw a5,0(a5) + 30058d4: fe042703 lw a4,-32(s0) + 30058d8: 03f77713 andi a4,a4,63 + 30058dc: d798 sw a4,40(a5) + /* Right shift 6 bits is the integer baud rate divider value, is stored to IBRD */ + uartHandle->baseAddress->UART_IBRD.reg = (quot >> 6); + 30058de: fdc42783 lw a5,-36(s0) + 30058e2: 439c lw a5,0(a5) + 30058e4: fe042703 lw a4,-32(s0) + 30058e8: 8319 srli a4,a4,0x6 + 30058ea: d3d8 sw a4,36(a5) + uartHandle->baseAddress->UART_LCR_H.reg = 0; + 30058ec: fdc42783 lw a5,-36(s0) + 30058f0: 439c lw a5,0(a5) + 30058f2: 0207a623 sw zero,44(a5) + uartHandle->baseAddress->UART_LCR_H.BIT.wlen = uartHandle->dataLength; /* Frame length seting */ + 30058f6: fdc42783 lw a5,-36(s0) + 30058fa: 4794 lw a3,8(a5) + 30058fc: fdc42783 lw a5,-36(s0) + 3005900: 4398 lw a4,0(a5) + 3005902: 87b6 mv a5,a3 + 3005904: 8b8d andi a5,a5,3 + 3005906: 0ff7f693 andi a3,a5,255 + 300590a: 575c lw a5,44(a4) + 300590c: 8a8d andi a3,a3,3 + 300590e: 0696 slli a3,a3,0x5 + 3005910: f9f7f793 andi a5,a5,-97 + 3005914: 8fd5 or a5,a5,a3 + 3005916: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_LCR_H.BIT.stp2 = uartHandle->stopBits; /* Stop bit seting */ + 3005918: fdc42783 lw a5,-36(s0) + 300591c: 47d4 lw a3,12(a5) + 300591e: fdc42783 lw a5,-36(s0) + 3005922: 4398 lw a4,0(a5) + 3005924: 87b6 mv a5,a3 + 3005926: 8b85 andi a5,a5,1 + 3005928: 0ff7f693 andi a3,a5,255 + 300592c: 575c lw a5,44(a4) + 300592e: 8a85 andi a3,a3,1 + 3005930: 068e slli a3,a3,0x3 + 3005932: 9bdd andi a5,a5,-9 + 3005934: 8fd5 or a5,a5,a3 + 3005936: d75c sw a5,44(a4) + UART_SetParityBit(uartHandle); + 3005938: fdc42503 lw a0,-36(s0) + 300593c: 39a9 jal ra,3005596 + if (uartHandle->fifoMode == true) { /* FIFO threshold setting */ + 300593e: fdc42783 lw a5,-36(s0) + 3005942: 02c7c783 lbu a5,44(a5) + 3005946: cbb1 beqz a5,300599a + uartHandle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_ENABLE; + 3005948: fdc42783 lw a5,-36(s0) + 300594c: 4398 lw a4,0(a5) + 300594e: 575c lw a5,44(a4) + 3005950: 0107e793 ori a5,a5,16 + 3005954: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_IFLS.BIT.rxiflsel = uartHandle->fifoRxThr; + 3005956: fdc42783 lw a5,-36(s0) + 300595a: 5bd4 lw a3,52(a5) + 300595c: fdc42783 lw a5,-36(s0) + 3005960: 4398 lw a4,0(a5) + 3005962: 87b6 mv a5,a3 + 3005964: 8bbd andi a5,a5,15 + 3005966: 0ff7f693 andi a3,a5,255 + 300596a: 5b5c lw a5,52(a4) + 300596c: 8abd andi a3,a3,15 + 300596e: 06a2 slli a3,a3,0x8 + 3005970: 767d lui a2,0xfffff + 3005972: 0ff60613 addi a2,a2,255 # fffff0ff + 3005976: 8ff1 and a5,a5,a2 + 3005978: 8fd5 or a5,a5,a3 + 300597a: db5c sw a5,52(a4) + uartHandle->baseAddress->UART_IFLS.BIT.txiflsel = uartHandle->fifoTxThr; + 300597c: fdc42783 lw a5,-36(s0) + 3005980: 5b94 lw a3,48(a5) + 3005982: fdc42783 lw a5,-36(s0) + 3005986: 4398 lw a4,0(a5) + 3005988: 87b6 mv a5,a3 + 300598a: 8bbd andi a5,a5,15 + 300598c: 0ff7f693 andi a3,a5,255 + 3005990: 5b5c lw a5,52(a4) + 3005992: 8abd andi a3,a3,15 + 3005994: 9bc1 andi a5,a5,-16 + 3005996: 8fd5 or a5,a5,a3 + 3005998: db5c sw a5,52(a4) + } + if (uartHandle->hwFlowCtr == UART_HW_FLOWCTR_ENABLE) { /* Hardwarer flow control setting */ + 300599a: fdc42783 lw a5,-36(s0) + 300599e: 5f98 lw a4,56(a5) + 30059a0: 4785 li a5,1 + 30059a2: 00f71c63 bne a4,a5,30059ba + uartHandle->baseAddress->UART_CR.reg |= 0xC000; + 30059a6: fdc42783 lw a5,-36(s0) + 30059aa: 439c lw a5,0(a5) + 30059ac: 5b94 lw a3,48(a5) + 30059ae: fdc42783 lw a5,-36(s0) + 30059b2: 439c lw a5,0(a5) + 30059b4: 6731 lui a4,0xc + 30059b6: 8f55 or a4,a4,a3 + 30059b8: db98 sw a4,48(a5) + } + uartHandle->baseAddress->UART_CR.reg |= 0x301; /* Enable bit use 0x301 is to set txe/rxe/uarten */ + 30059ba: fdc42783 lw a5,-36(s0) + 30059be: 439c lw a5,0(a5) + 30059c0: 5b98 lw a4,48(a5) + 30059c2: fdc42783 lw a5,-36(s0) + 30059c6: 439c lw a5,0(a5) + 30059c8: 30176713 ori a4,a4,769 + 30059cc: db98 sw a4,48(a5) + uartHandle->txState = UART_STATE_READY; + 30059ce: fdc42783 lw a5,-36(s0) + 30059d2: 4705 li a4,1 + 30059d4: c7b8 sw a4,72(a5) + uartHandle->rxState = UART_STATE_READY; + 30059d6: fdc42783 lw a5,-36(s0) + 30059da: 4705 li a4,1 + 30059dc: c7f8 sw a4,76(a5) + return BASE_STATUS_OK; + 30059de: 4781 li a5,0 +} + 30059e0: 853e mv a0,a5 + 30059e2: 50b2 lw ra,44(sp) + 30059e4: 5422 lw s0,40(sp) + 30059e6: 6145 addi sp,sp,48 + 30059e8: 8082 ret + +030059ea
: +/* USER CODE BEGIN 1 */ +/* 建议用户定义全局变量、结构体、宏定义或函数声明等 */ +/* USER CODE END 1 */ + +int main(void) +{ + 30059ea: 1141 addi sp,sp,-16 + 30059ec: c606 sw ra,12(sp) + 30059ee: c422 sw s0,8(sp) + 30059f0: 0800 addi s0,sp,16 + /* USER CODE BEGIN 2 */ + /* 建议用户放置初始化代码或启动代码等 */ + /* USER CODE END 2 */ + SystemInit(); + 30059f2: 2655 jal ra,3005d96 + /* USER CODE BEGIN 3 */ + /* 建议用户放置初始配置代码 */ + /* USER CODE END 3 */ + while (1) { + 30059f4: a001 j 30059f4 + +030059f6 : +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + 30059f6: 715d addi sp,sp,-80 + 30059f8: c686 sw ra,76(sp) + 30059fa: c4a2 sw s0,72(sp) + 30059fc: 0880 addi s0,sp,80 + 30059fe: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3005a02: 100007b7 lui a5,0x10000 + 3005a06: fcf42423 sw a5,-56(s0) + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + 3005a0a: fc042623 sw zero,-52(s0) + crg.pllPreDiv = CRG_PLL_PREDIV_4; + 3005a0e: 478d li a5,3 + 3005a10: fcf42823 sw a5,-48(s0) + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + 3005a14: 03000793 li a5,48 + 3005a18: fcf42a23 sw a5,-44(s0) + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + 3005a1c: 4785 li a5,1 + 3005a1e: fcf42c23 sw a5,-40(s0) + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + 3005a22: 4789 li a5,2 + 3005a24: fef42023 sw a5,-32(s0) + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + 3005a28: 4789 li a5,2 + 3005a2a: fef42223 sw a5,-28(s0) + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + 3005a2e: fe042423 sw zero,-24(s0) + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + 3005a32: 47e1 li a5,24 + 3005a34: fef42623 sw a5,-20(s0) + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + 3005a38: fc840793 addi a5,s0,-56 + 3005a3c: 853e mv a0,a5 + 3005a3e: aecfd0ef jal ra,3002d2a + 3005a42: 87aa mv a5,a0 + 3005a44: c399 beqz a5,3005a4a + return BASE_STATUS_ERROR; + 3005a46: 4785 li a5,1 + 3005a48: a039 j 3005a56 + } + *coreClkSelect = crg.coreClkSelect; + 3005a4a: fe042703 lw a4,-32(s0) + 3005a4e: fbc42783 lw a5,-68(s0) + 3005a52: c398 sw a4,0(a5) + return BASE_STATUS_OK; + 3005a54: 4781 li a5,0 +} + 3005a56: 853e mv a0,a5 + 3005a58: 40b6 lw ra,76(sp) + 3005a5a: 4426 lw s0,72(sp) + 3005a5c: 6161 addi sp,sp,80 + 3005a5e: 8082 ret + +03005a60 : + +static void ADC0_Init(void) +{ + 3005a60: 7179 addi sp,sp,-48 + 3005a62: d606 sw ra,44(sp) + 3005a64: d422 sw s0,40(sp) + 3005a66: 1800 addi s0,sp,48 + HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); + 3005a68: 4585 li a1,1 + 3005a6a: 18000537 lui a0,0x18000 + 3005a6e: 2c81 jal ra,3005cbe + HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); + 3005a70: 4589 li a1,2 + 3005a72: 18000537 lui a0,0x18000 + 3005a76: 95dfd0ef jal ra,30033d2 + HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_1); + 3005a7a: 4581 li a1,0 + 3005a7c: 18000537 lui a0,0x18000 + 3005a80: a09fd0ef jal ra,3003488 + + g_adc0.baseAddress = ADC0; + 3005a84: 040007b7 lui a5,0x4000 + 3005a88: 54478793 addi a5,a5,1348 # 4000544 + 3005a8c: 18000737 lui a4,0x18000 + 3005a90: c398 sw a4,0(a5) + g_adc0.socPriority = ADC_PRIMODE_ALL_ROUND; + 3005a92: 040007b7 lui a5,0x4000 + 3005a96: 54478793 addi a5,a5,1348 # 4000544 + 3005a9a: 0007a223 sw zero,4(a5) + + HAL_ADC_Init(&g_adc0); + 3005a9e: 040007b7 lui a5,0x4000 + 3005aa2: 54478513 addi a0,a5,1348 # 4000544 + 3005aa6: f75fb0ef jal ra,3001a1a + + SOC_Param socParam = {0}; + 3005aaa: fc042e23 sw zero,-36(s0) + 3005aae: fe042023 sw zero,-32(s0) + 3005ab2: fe042223 sw zero,-28(s0) + 3005ab6: fe042423 sw zero,-24(s0) + 3005aba: fe042623 sw zero,-20(s0) + socParam.adcInput = ADC_CH_ADCINA6; /* PIN4(ADC AIN6) */ + 3005abe: 4799 li a5,6 + 3005ac0: fcf42e23 sw a5,-36(s0) + socParam.sampleTotalTime = ADC_SOCSAMPLE_10CLK; /* adc sample total time 10 adc_clk */ + 3005ac4: 4789 li a5,2 + 3005ac6: fef42023 sw a5,-32(s0) + socParam.trigSource = ADC_TRIGSOC_SOFT; + 3005aca: fe042223 sw zero,-28(s0) + socParam.continueMode = BASE_CFG_ENABLE; + 3005ace: 4785 li a5,1 + 3005ad0: fef40423 sb a5,-24(s0) + socParam.finishMode = ADC_SOCFINISH_NONE; + 3005ad4: 4785 li a5,1 + 3005ad6: fef42623 sw a5,-20(s0) + HAL_ADC_ConfigureSoc(&g_adc0, ADC_SOC_NUM1, &socParam); + 3005ada: fdc40793 addi a5,s0,-36 + 3005ade: 863e mv a2,a5 + 3005ae0: 4585 li a1,1 + 3005ae2: 040007b7 lui a5,0x4000 + 3005ae6: 54478513 addi a0,a5,1348 # 4000544 + 3005aea: fe3fb0ef jal ra,3001acc +} + 3005aee: 0001 nop + 3005af0: 50b2 lw ra,44(sp) + 3005af2: 5422 lw s0,40(sp) + 3005af4: 6145 addi sp,sp,48 + 3005af6: 8082 ret + +03005af8 : + /* USER CODE BEGIN TIMER3_InterruptProcess */ + /* USER CODE END TIMER3_InterruptProcess */ +} + +static void TIMER3_Init(void) +{ + 3005af8: 1101 addi sp,sp,-32 + 3005afa: ce06 sw ra,28(sp) + 3005afc: cc22 sw s0,24(sp) + 3005afe: 1000 addi s0,sp,32 + HAL_CRG_IpEnableSet(TIMER3_BASE, IP_CLK_ENABLE); /* TIMER3 clock enable. */ + 3005b00: 4585 li a1,1 + 3005b02: 14303537 lui a0,0x14303 + 3005b06: 2a65 jal ra,3005cbe + unsigned int load = (HAL_CRG_GetIpFreq((void *)TIMER3) / (1u << (TIMERPRESCALER_NO_DIV * 4)) / 1000000u) * 10; + 3005b08: 14303537 lui a0,0x14303 + 3005b0c: f0afd0ef jal ra,3003216 + 3005b10: 872a mv a4,a0 + 3005b12: 000f47b7 lui a5,0xf4 + 3005b16: 24078793 addi a5,a5,576 # f4240 + 3005b1a: 02f75733 divu a4,a4,a5 + 3005b1e: 47a9 li a5,10 + 3005b20: 02f707b3 mul a5,a4,a5 + 3005b24: fef42623 sw a5,-20(s0) + + g_timer3.baseAddress = TIMER3; + 3005b28: 040007b7 lui a5,0x4000 + 3005b2c: 49c78793 addi a5,a5,1180 # 400049c + 3005b30: 14303737 lui a4,0x14303 + 3005b34: c398 sw a4,0(a5) + g_timer3.load = load - 1; /* Set timer value immediately */ + 3005b36: fec42783 lw a5,-20(s0) + 3005b3a: fff78713 addi a4,a5,-1 + 3005b3e: 040007b7 lui a5,0x4000 + 3005b42: 49c78793 addi a5,a5,1180 # 400049c + 3005b46: cbd8 sw a4,20(a5) + g_timer3.bgLoad = load - 1; /* Set timer value */ + 3005b48: fec42783 lw a5,-20(s0) + 3005b4c: fff78713 addi a4,a5,-1 + 3005b50: 040007b7 lui a5,0x4000 + 3005b54: 49c78793 addi a5,a5,1180 # 400049c + 3005b58: cf98 sw a4,24(a5) + g_timer3.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ + 3005b5a: 040007b7 lui a5,0x4000 + 3005b5e: 49c78793 addi a5,a5,1180 # 400049c + 3005b62: 4705 li a4,1 + 3005b64: c798 sw a4,8(a5) + g_timer3.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ + 3005b66: 040007b7 lui a5,0x4000 + 3005b6a: 49c78793 addi a5,a5,1180 # 400049c + 3005b6e: 0007a623 sw zero,12(a5) + g_timer3.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ + 3005b72: 040007b7 lui a5,0x4000 + 3005b76: 49c78793 addi a5,a5,1180 # 400049c + 3005b7a: 4705 li a4,1 + 3005b7c: cb98 sw a4,16(a5) + g_timer3.interruptEn = BASE_CFG_ENABLE; + 3005b7e: 040007b7 lui a5,0x4000 + 3005b82: 49c78793 addi a5,a5,1180 # 400049c + 3005b86: 4705 li a4,1 + 3005b88: afd8 sb a4,28(a5) + g_timer3.adcSocReqEnable = BASE_CFG_DISABLE; + 3005b8a: 040007b7 lui a5,0x4000 + 3005b8e: 49c78793 addi a5,a5,1180 # 400049c + 3005b92: 00078ea3 sb zero,29(a5) + g_timer3.dmaReqEnable = BASE_CFG_DISABLE; + 3005b96: 040007b7 lui a5,0x4000 + 3005b9a: 49c78793 addi a5,a5,1180 # 400049c + 3005b9e: 00078f23 sb zero,30(a5) + HAL_TIMER_Init(&g_timer3); + 3005ba2: 040007b7 lui a5,0x4000 + 3005ba6: 49c78513 addi a0,a5,1180 # 400049c + 3005baa: c7cff0ef jal ra,3005026 + IRQ_Register(IRQ_TIMER3, HAL_TIMER_IrqHandler, &g_timer3); + 3005bae: 040007b7 lui a5,0x4000 + 3005bb2: 49c78613 addi a2,a5,1180 # 400049c + 3005bb6: 030057b7 lui a5,0x3005 + 3005bba: 2fe78593 addi a1,a5,766 # 30052fe + 3005bbe: 02300513 li a0,35 + 3005bc2: cf0fc0ef jal ra,30020b2 + + HAL_TIMER_RegisterCallback(&g_timer3, TIMER_PERIOD_FIN, TIMER3_InterruptProcess); + 3005bc6: 030067b7 lui a5,0x3006 + 3005bca: dd678613 addi a2,a5,-554 # 3005dd6 + 3005bce: 4581 li a1,0 + 3005bd0: 040007b7 lui a5,0x4000 + 3005bd4: 49c78513 addi a0,a5,1180 # 400049c + 3005bd8: 3039 jal ra,30053e6 + IRQ_SetPriority(IRQ_TIMER3, 1); /* 1 is priority value */ + 3005bda: 4585 li a1,1 + 3005bdc: 02300513 li a0,35 + 3005be0: ca7fc0ef jal ra,3002886 + IRQ_EnableN(IRQ_TIMER3); + 3005be4: 02300513 li a0,35 + 3005be8: d50fc0ef jal ra,3002138 +} + 3005bec: 0001 nop + 3005bee: 40f2 lw ra,28(sp) + 3005bf0: 4462 lw s0,24(sp) + 3005bf2: 6105 addi sp,sp,32 + 3005bf4: 8082 ret + +03005bf6 : + +static void UART0_Init(void) +{ + 3005bf6: 1141 addi sp,sp,-16 + 3005bf8: c606 sw ra,12(sp) + 3005bfa: c422 sw s0,8(sp) + 3005bfc: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + 3005bfe: 4585 li a1,1 + 3005c00: 14000537 lui a0,0x14000 + 3005c04: 286d jal ra,3005cbe + g_uart0.baseAddress = UART0; + 3005c06: 040007b7 lui a5,0x4000 + 3005c0a: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c0e: 14000737 lui a4,0x14000 + 3005c12: c398 sw a4,0(a5) + + g_uart0.baudRate = UART0_BAND_RATE; + 3005c14: 040007b7 lui a5,0x4000 + 3005c18: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c1c: 6771 lui a4,0x1c + 3005c1e: 20070713 addi a4,a4,512 # 1c200 + 3005c22: c3d8 sw a4,4(a5) + g_uart0.dataLength = UART_DATALENGTH_8BIT; + 3005c24: 040007b7 lui a5,0x4000 + 3005c28: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c2c: 470d li a4,3 + 3005c2e: c798 sw a4,8(a5) + g_uart0.stopBits = UART_STOPBITS_ONE; + 3005c30: 040007b7 lui a5,0x4000 + 3005c34: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c38: 0007a623 sw zero,12(a5) + g_uart0.parity = UART_PARITY_NONE; + 3005c3c: 040007b7 lui a5,0x4000 + 3005c40: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c44: 4711 li a4,4 + 3005c46: cb98 sw a4,16(a5) + g_uart0.txMode = UART_MODE_BLOCKING; + 3005c48: 040007b7 lui a5,0x4000 + 3005c4c: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c50: 0007aa23 sw zero,20(a5) + g_uart0.rxMode = UART_MODE_BLOCKING; + 3005c54: 040007b7 lui a5,0x4000 + 3005c58: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c5c: 0007ac23 sw zero,24(a5) + g_uart0.fifoMode = BASE_CFG_ENABLE; + 3005c60: 040007b7 lui a5,0x4000 + 3005c64: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c68: 4705 li a4,1 + 3005c6a: 02e78623 sb a4,44(a5) + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + 3005c6e: 040007b7 lui a5,0x4000 + 3005c72: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c76: 4721 li a4,8 + 3005c78: db98 sw a4,48(a5) + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + 3005c7a: 040007b7 lui a5,0x4000 + 3005c7e: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c82: 4721 li a4,8 + 3005c84: dbd8 sw a4,52(a5) + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + 3005c86: 040007b7 lui a5,0x4000 + 3005c8a: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c8e: 0207ac23 sw zero,56(a5) + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + 3005c92: 040007b7 lui a5,0x4000 + 3005c96: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c9a: 0607ac23 sw zero,120(a5) + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + 3005c9e: 040007b7 lui a5,0x4000 + 3005ca2: 4c478793 addi a5,a5,1220 # 40004c4 + 3005ca6: 06078e23 sb zero,124(a5) + HAL_UART_Init(&g_uart0); + 3005caa: 040007b7 lui a5,0x4000 + 3005cae: 4c478513 addi a0,a5,1220 # 40004c4 + 3005cb2: 3aad jal ra,300562c +} + 3005cb4: 0001 nop + 3005cb6: 40b2 lw ra,12(sp) + 3005cb8: 4422 lw s0,8(sp) + 3005cba: 0141 addi sp,sp,16 + 3005cbc: 8082 ret + +03005cbe : + 3005cbe: e3cfd06f j 30032fa + +03005cc2 : + +static void IOConfig(void) +{ + 3005cc2: 1141 addi sp,sp,-16 + 3005cc4: c606 sw ra,12(sp) + 3005cc6: c422 sw s0,8(sp) + 3005cc8: 0800 addi s0,sp,16 + /* Config PIN4 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_ADC_AIN6); /* Check function selection */ + 3005cca: 010c07b7 lui a5,0x10c0 + 3005cce: 23c78513 addi a0,a5,572 # 10c023c + 3005cd2: 20c1 jal ra,3005d92 + HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_ADC_AIN6, PULL_NONE); /* Pull-up and Pull-down */ + 3005cd4: 4581 li a1,0 + 3005cd6: 010c07b7 lui a5,0x10c0 + 3005cda: 23c78513 addi a0,a5,572 # 10c023c + 3005cde: 2845 jal ra,3005d8e + HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_ADC_AIN6, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3005ce0: 4581 li a1,0 + 3005ce2: 010c07b7 lui a5,0x10c0 + 3005ce6: 23c78513 addi a0,a5,572 # 10c023c + 3005cea: 2045 jal ra,3005d8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_ADC_AIN6, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3005cec: 4585 li a1,1 + 3005cee: 010c07b7 lui a5,0x10c0 + 3005cf2: 23c78513 addi a0,a5,572 # 10c023c + 3005cf6: 2841 jal ra,3005d86 + HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_ADC_AIN6, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3005cf8: 4589 li a1,2 + 3005cfa: 010c07b7 lui a5,0x10c0 + 3005cfe: 23c78513 addi a0,a5,572 # 10c023c + 3005d02: 2041 jal ra,3005d82 + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + 3005d04: 019007b7 lui a5,0x1900 + 3005d08: 23378513 addi a0,a5,563 # 1900233 + 3005d0c: 2059 jal ra,3005d92 + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + 3005d0e: 4581 li a1,0 + 3005d10: 019007b7 lui a5,0x1900 + 3005d14: 23378513 addi a0,a5,563 # 1900233 + 3005d18: 289d jal ra,3005d8e + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3005d1a: 4581 li a1,0 + 3005d1c: 019007b7 lui a5,0x1900 + 3005d20: 23378513 addi a0,a5,563 # 1900233 + 3005d24: 209d jal ra,3005d8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3005d26: 4585 li a1,1 + 3005d28: 019007b7 lui a5,0x1900 + 3005d2c: 23378513 addi a0,a5,563 # 1900233 + 3005d30: 2899 jal ra,3005d86 + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3005d32: 4589 li a1,2 + 3005d34: 019007b7 lui a5,0x1900 + 3005d38: 23378513 addi a0,a5,563 # 1900233 + 3005d3c: 2099 jal ra,3005d82 + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + 3005d3e: 019407b7 lui a5,0x1940 + 3005d42: 23378513 addi a0,a5,563 # 1940233 + 3005d46: 20b1 jal ra,3005d92 + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + 3005d48: 4589 li a1,2 + 3005d4a: 019407b7 lui a5,0x1940 + 3005d4e: 23378513 addi a0,a5,563 # 1940233 + 3005d52: 2835 jal ra,3005d8e + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3005d54: 4581 li a1,0 + 3005d56: 019407b7 lui a5,0x1940 + 3005d5a: 23378513 addi a0,a5,563 # 1940233 + 3005d5e: 2035 jal ra,3005d8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3005d60: 4585 li a1,1 + 3005d62: 019407b7 lui a5,0x1940 + 3005d66: 23378513 addi a0,a5,563 # 1940233 + 3005d6a: 2831 jal ra,3005d86 + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3005d6c: 4589 li a1,2 + 3005d6e: 019407b7 lui a5,0x1940 + 3005d72: 23378513 addi a0,a5,563 # 1940233 + 3005d76: 2031 jal ra,3005d82 +} + 3005d78: 0001 nop + 3005d7a: 40b2 lw ra,12(sp) + 3005d7c: 4422 lw s0,8(sp) + 3005d7e: 0141 addi sp,sp,16 + 3005d80: 8082 ret + +03005d82 : + 3005d82: 978ff06f j 3004efa + +03005d86 : + 3005d86: 928ff06f j 3004eae + +03005d8a : + 3005d8a: 8d8ff06f j 3004e62 + +03005d8e : + 3005d8e: 888ff06f j 3004e16 + +03005d92 : + 3005d92: 84aff06f j 3004ddc + +03005d96 : + +void SystemInit(void) +{ + 3005d96: 1141 addi sp,sp,-16 + 3005d98: c606 sw ra,12(sp) + 3005d9a: c422 sw s0,8(sp) + 3005d9c: 0800 addi s0,sp,16 + IOConfig(); + 3005d9e: 3715 jal ra,3005cc2 + UART0_Init(); + 3005da0: 3d99 jal ra,3005bf6 + ADC0_Init(); + 3005da2: 397d jal ra,3005a60 + TIMER3_Init(); + 3005da4: 3b91 jal ra,3005af8 + + /* USER CODE BEGIN system_init */ + HAL_TIMER_Start(&g_timer3); + 3005da6: 040007b7 lui a5,0x4000 + 3005daa: 49c78513 addi a0,a5,1180 # 400049c + 3005dae: cceff0ef jal ra,300527c + HAL_ADC_StartIt(&g_adc0); + 3005db2: 040007b7 lui a5,0x4000 + 3005db6: 54478513 addi a0,a5,1348 # 4000544 + 3005dba: ec5fb0ef jal ra,3001c7e + HAL_ADC_SoftTrigSample(&g_adc0, ADC_SOC_NUM1); + 3005dbe: 4585 li a1,1 + 3005dc0: 040007b7 lui a5,0x4000 + 3005dc4: 54478513 addi a0,a5,1348 # 4000544 + 3005dc8: fe3fb0ef jal ra,3001daa + /* USER CODE END system_init */ + 3005dcc: 0001 nop + 3005dce: 40b2 lw ra,12(sp) + 3005dd0: 4422 lw s0,8(sp) + 3005dd2: 0141 addi sp,sp,16 + 3005dd4: 8082 ret + +03005dd6 : +float adc_num[adc_shownum]={0}; +unsigned int i=0; + + +void TIMER3_InterruptProcess(void *handle) +{ + 3005dd6: 7179 addi sp,sp,-48 + 3005dd8: d606 sw ra,44(sp) + 3005dda: d422 sw s0,40(sp) + 3005ddc: 1800 addi s0,sp,48 + 3005dde: fca42e23 sw a0,-36(s0) + unsigned int ret = HAL_ADC_GetConvResult(&g_adc0, ADC_SOC_NUM1); + 3005de2: 4585 li a1,1 + 3005de4: 040007b7 lui a5,0x4000 + 3005de8: 54478513 addi a0,a5,1348 # 4000544 + 3005dec: 840fc0ef jal ra,3001e2c + 3005df0: fea42623 sw a0,-20(s0) + + + adc_num[i] = (float)ret / (float)4096 * 3.3; + 3005df4: fec42783 lw a5,-20(s0) + 3005df8: d017f753 fcvt.s.wu fa4,a5 + 3005dfc: 030067b7 lui a5,0x3006 + 3005e00: 6887a787 flw fa5,1672(a5) # 3006688 + 3005e04: 18f77753 fdiv.s fa4,fa4,fa5 + 3005e08: 040027b7 lui a5,0x4002 + 3005e0c: 2047a783 lw a5,516(a5) # 4002204 + 3005e10: 03006737 lui a4,0x3006 + 3005e14: 68c72787 flw fa5,1676(a4) # 300668c + 3005e18: 10f777d3 fmul.s fa5,fa4,fa5 + 3005e1c: 04000737 lui a4,0x4000 + 3005e20: 5e470713 addi a4,a4,1508 # 40005e4 + 3005e24: 078a slli a5,a5,0x2 + 3005e26: 97ba add a5,a5,a4 + 3005e28: e39c fsw fa5,0(a5) + i++; + 3005e2a: 040027b7 lui a5,0x4002 + 3005e2e: 2047a783 lw a5,516(a5) # 4002204 + 3005e32: 00178713 addi a4,a5,1 + 3005e36: 040027b7 lui a5,0x4002 + 3005e3a: 20e7a223 sw a4,516(a5) # 4002204 + if(i>adc_shownum){ + 3005e3e: 040027b7 lui a5,0x4002 + 3005e42: 2047a703 lw a4,516(a5) # 4002204 + 3005e46: 70800793 li a5,1800 + 3005e4a: 06e7f563 bgeu a5,a4,3005eb4 + for(i=0;i + 3005e56: a099 j 3005e9c + { + DBG_PRINTF("V:%.2f\r\n", adc_num[i]); + 3005e58: 040027b7 lui a5,0x4002 + 3005e5c: 2047a783 lw a5,516(a5) # 4002204 + 3005e60: 04000737 lui a4,0x4000 + 3005e64: 5e470713 addi a4,a4,1508 # 40005e4 + 3005e68: 078a slli a5,a5,0x2 + 3005e6a: 97ba add a5,a5,a4 + 3005e6c: 639c flw fa5,0(a5) + 3005e6e: 20f78553 fmv.s fa0,fa5 + 3005e72: 20b1 jal ra,3005ebe <__extendsfdf2> + 3005e74: 87aa mv a5,a0 + 3005e76: 882e mv a6,a1 + 3005e78: 863e mv a2,a5 + 3005e7a: 86c2 mv a3,a6 + 3005e7c: 030067b7 lui a5,0x3006 + 3005e80: 67c78513 addi a0,a5,1660 # 300667c + 3005e84: b85fe0ef jal ra,3004a08 + for(i=0;i + 3005e90: 00178713 addi a4,a5,1 + 3005e94: 040027b7 lui a5,0x4002 + 3005e98: 20e7a223 sw a4,516(a5) # 4002204 + 3005e9c: 040027b7 lui a5,0x4002 + 3005ea0: 2047a703 lw a4,516(a5) # 4002204 + 3005ea4: 70700793 li a5,1799 + 3005ea8: fae7f8e3 bgeu a5,a4,3005e58 + } + i=0; + 3005eac: 040027b7 lui a5,0x4002 + 3005eb0: 2007a223 sw zero,516(a5) # 4002204 + } + +} + 3005eb4: 0001 nop + 3005eb6: 50b2 lw ra,44(sp) + 3005eb8: 5422 lw s0,40(sp) + 3005eba: 6145 addi sp,sp,48 + 3005ebc: 8082 ret + +03005ebe <__extendsfdf2>: + 3005ebe: 1141 addi sp,sp,-16 + 3005ec0: c606 sw ra,12(sp) + 3005ec2: c422 sw s0,8(sp) + 3005ec4: c226 sw s1,4(sp) + 3005ec6: e00506d3 fmv.x.w a3,fa0 + 3005eca: 002027f3 frrm a5 + 3005ece: 0176d513 srli a0,a3,0x17 + 3005ed2: 0ff57513 andi a0,a0,255 + 3005ed6: 00800437 lui s0,0x800 + 3005eda: 00150793 addi a5,a0,1 # 14000001 + 3005ede: 147d addi s0,s0,-1 # 7fffff + 3005ee0: 0ff7f793 andi a5,a5,255 + 3005ee4: 4705 li a4,1 + 3005ee6: 8c75 and s0,s0,a3 + 3005ee8: 01f6d493 srli s1,a3,0x1f + 3005eec: 00f75963 bge a4,a5,3005efe <__extendsfdf2+0x40> + 3005ef0: 00345793 srli a5,s0,0x3 + 3005ef4: 38050513 addi a0,a0,896 + 3005ef8: 0476 slli s0,s0,0x1d + 3005efa: 4701 li a4,0 + 3005efc: a891 j 3005f50 <__extendsfdf2+0x92> + 3005efe: e915 bnez a0,3005f32 <__extendsfdf2+0x74> + 3005f00: c459 beqz s0,3005f8e <__extendsfdf2+0xd0> + 3005f02: 8522 mv a0,s0 + 3005f04: 2c6d jal ra,30061be <__clzsi2> + 3005f06: 47a9 li a5,10 + 3005f08: 00a7cf63 blt a5,a0,3005f26 <__extendsfdf2+0x68> + 3005f0c: 47ad li a5,11 + 3005f0e: 8f89 sub a5,a5,a0 + 3005f10: 01550713 addi a4,a0,21 + 3005f14: 00f457b3 srl a5,s0,a5 + 3005f18: 00e41433 sll s0,s0,a4 + 3005f1c: 38900713 li a4,905 + 3005f20: 40a70533 sub a0,a4,a0 + 3005f24: bfd9 j 3005efa <__extendsfdf2+0x3c> + 3005f26: ff550793 addi a5,a0,-11 + 3005f2a: 00f417b3 sll a5,s0,a5 + 3005f2e: 4401 li s0,0 + 3005f30: b7f5 j 3005f1c <__extendsfdf2+0x5e> + 3005f32: c02d beqz s0,3005f94 <__extendsfdf2+0xd6> + 3005f34: 00400737 lui a4,0x400 + 3005f38: 8f61 and a4,a4,s0 + 3005f3a: 00345793 srli a5,s0,0x3 + 3005f3e: 00173713 seqz a4,a4 + 3005f42: 000806b7 lui a3,0x80 + 3005f46: 0712 slli a4,a4,0x4 + 3005f48: 0476 slli s0,s0,0x1d + 3005f4a: 8fd5 or a5,a5,a3 + 3005f4c: 7ff00513 li a0,2047 + 3005f50: 00100637 lui a2,0x100 + 3005f54: 167d addi a2,a2,-1 # fffff + 3005f56: 8ff1 and a5,a5,a2 + 3005f58: 80100637 lui a2,0x80100 + 3005f5c: 167d addi a2,a2,-1 # 800fffff + 3005f5e: 7ff57513 andi a0,a0,2047 + 3005f62: 0552 slli a0,a0,0x14 + 3005f64: 8ff1 and a5,a5,a2 + 3005f66: 80000637 lui a2,0x80000 + 3005f6a: 8fc9 or a5,a5,a0 + 3005f6c: fff64613 not a2,a2 + 3005f70: 01f49693 slli a3,s1,0x1f + 3005f74: 8ff1 and a5,a5,a2 + 3005f76: 00d7e633 or a2,a5,a3 + 3005f7a: 8522 mv a0,s0 + 3005f7c: 85b2 mv a1,a2 + 3005f7e: c319 beqz a4,3005f84 <__extendsfdf2+0xc6> + 3005f80: 00172073 csrs fflags,a4 + 3005f84: 40b2 lw ra,12(sp) + 3005f86: 4422 lw s0,8(sp) + 3005f88: 4492 lw s1,4(sp) + 3005f8a: 0141 addi sp,sp,16 + 3005f8c: 8082 ret + 3005f8e: 4781 li a5,0 + 3005f90: 4501 li a0,0 + 3005f92: b7a5 j 3005efa <__extendsfdf2+0x3c> + 3005f94: 4781 li a5,0 + 3005f96: 7ff00513 li a0,2047 + 3005f9a: b785 j 3005efa <__extendsfdf2+0x3c> + +03005f9c <__truncdfsf2>: + 3005f9c: 00202873 frrm a6 + 3005fa0: 001006b7 lui a3,0x100 + 3005fa4: 16fd addi a3,a3,-1 # fffff + 3005fa6: 8eed and a3,a3,a1 + 3005fa8: 0145d893 srli a7,a1,0x14 + 3005fac: 00369793 slli a5,a3,0x3 + 3005fb0: 7ff8f893 andi a7,a7,2047 + 3005fb4: 01d55693 srli a3,a0,0x1d + 3005fb8: 8edd or a3,a3,a5 + 3005fba: 00188793 addi a5,a7,1 + 3005fbe: 7ff7f793 andi a5,a5,2047 + 3005fc2: 4705 li a4,1 + 3005fc4: 81fd srli a1,a1,0x1f + 3005fc6: 00351613 slli a2,a0,0x3 + 3005fca: 16f75b63 bge a4,a5,3006140 <__truncdfsf2+0x1a4> + 3005fce: c8088713 addi a4,a7,-896 + 3005fd2: 0fe00793 li a5,254 + 3005fd6: 0ae7d063 bge a5,a4,3006076 <__truncdfsf2+0xda> + 3005fda: 04080063 beqz a6,300601a <__truncdfsf2+0x7e> + 3005fde: 478d li a5,3 + 3005fe0: 02f81963 bne a6,a5,3006012 <__truncdfsf2+0x76> + 3005fe4: c99d beqz a1,300601a <__truncdfsf2+0x7e> + 3005fe6: 57fd li a5,-1 + 3005fe8: 0fe00713 li a4,254 + 3005fec: 4681 li a3,0 + 3005fee: 4615 li a2,5 + 3005ff0: 4509 li a0,2 + 3005ff2: 00166613 ori a2,a2,1 + 3005ff6: 1aa80063 beq a6,a0,3006196 <__truncdfsf2+0x1fa> + 3005ffa: 450d li a0,3 + 3005ffc: 18a80a63 beq a6,a0,3006190 <__truncdfsf2+0x1f4> + 3006000: 12081763 bnez a6,300612e <__truncdfsf2+0x192> + 3006004: 00f7f513 andi a0,a5,15 + 3006008: 4891 li a7,4 + 300600a: 13150263 beq a0,a7,300612e <__truncdfsf2+0x192> + 300600e: 0791 addi a5,a5,4 + 3006010: aa39 j 300612e <__truncdfsf2+0x192> + 3006012: 4789 li a5,2 + 3006014: fcf819e3 bne a6,a5,3005fe6 <__truncdfsf2+0x4a> + 3006018: d5f9 beqz a1,3005fe6 <__truncdfsf2+0x4a> + 300601a: 4781 li a5,0 + 300601c: 0ff00713 li a4,255 + 3006020: 4615 li a2,5 + 3006022: 00579693 slli a3,a5,0x5 + 3006026: 0006db63 bgez a3,300603c <__truncdfsf2+0xa0> + 300602a: 0705 addi a4,a4,1 # 400001 + 300602c: 0ff00693 li a3,255 + 3006030: 16d70563 beq a4,a3,300619a <__truncdfsf2+0x1fe> + 3006034: fc0006b7 lui a3,0xfc000 + 3006038: 16fd addi a3,a3,-1 # fbffffff + 300603a: 8ff5 and a5,a5,a3 + 300603c: 0ff00693 li a3,255 + 3006040: 838d srli a5,a5,0x3 + 3006042: 00d71663 bne a4,a3,300604e <__truncdfsf2+0xb2> + 3006046: c781 beqz a5,300604e <__truncdfsf2+0xb2> + 3006048: 004007b7 lui a5,0x400 + 300604c: 4581 li a1,0 + 300604e: 008006b7 lui a3,0x800 + 3006052: 16fd addi a3,a3,-1 # 7fffff + 3006054: 8ff5 and a5,a5,a3 + 3006056: 808006b7 lui a3,0x80800 + 300605a: 0ff77713 andi a4,a4,255 + 300605e: 16fd addi a3,a3,-1 # 807fffff + 3006060: 075e slli a4,a4,0x17 + 3006062: 8ff5 and a5,a5,a3 + 3006064: 05fe slli a1,a1,0x1f + 3006066: 8fd9 or a5,a5,a4 + 3006068: 8fcd or a5,a5,a1 + 300606a: c219 beqz a2,3006070 <__truncdfsf2+0xd4> + 300606c: 00162073 csrs fflags,a2 + 3006070: f0078553 fmv.w.x fa0,a5 + 3006074: 8082 ret + 3006076: 08e04e63 bgtz a4,3006112 <__truncdfsf2+0x176> + 300607a: 57a5 li a5,-23 + 300607c: 0ef74d63 blt a4,a5,3006176 <__truncdfsf2+0x1da> + 3006080: 008007b7 lui a5,0x800 + 3006084: 4379 li t1,30 + 3006086: 8edd or a3,a3,a5 + 3006088: 40e30333 sub t1,t1,a4 + 300608c: 47fd li a5,31 + 300608e: 0467ce63 blt a5,t1,30060ea <__truncdfsf2+0x14e> + 3006092: c8288893 addi a7,a7,-894 + 3006096: 011617b3 sll a5,a2,a7 + 300609a: 00f037b3 snez a5,a5 + 300609e: 011696b3 sll a3,a3,a7 + 30060a2: 00665333 srl t1,a2,t1 + 30060a6: 8edd or a3,a3,a5 + 30060a8: 00d367b3 or a5,t1,a3 + 30060ac: 4701 li a4,0 + 30060ae: cff9 beqz a5,300618c <__truncdfsf2+0x1f0> + 30060b0: 00179713 slli a4,a5,0x1 + 30060b4: 00777693 andi a3,a4,7 + 30060b8: 4601 li a2,0 + 30060ba: c28d beqz a3,30060dc <__truncdfsf2+0x140> + 30060bc: 4689 li a3,2 + 30060be: 0cd80263 beq a6,a3,3006182 <__truncdfsf2+0x1e6> + 30060c2: 468d li a3,3 + 30060c4: 0ad80b63 beq a6,a3,300617a <__truncdfsf2+0x1de> + 30060c8: 4605 li a2,1 + 30060ca: 00081963 bnez a6,30060dc <__truncdfsf2+0x140> + 30060ce: 00f77693 andi a3,a4,15 + 30060d2: 4511 li a0,4 + 30060d4: 4605 li a2,1 + 30060d6: 00a68363 beq a3,a0,30060dc <__truncdfsf2+0x140> + 30060da: 0711 addi a4,a4,4 + 30060dc: 01b75693 srli a3,a4,0x1b + 30060e0: 0016c693 xori a3,a3,1 + 30060e4: 8a85 andi a3,a3,1 + 30060e6: 4701 li a4,0 + 30060e8: a83d j 3006126 <__truncdfsf2+0x18a> + 30060ea: 57f9 li a5,-2 + 30060ec: 40e78733 sub a4,a5,a4 + 30060f0: 02000793 li a5,32 + 30060f4: 00e6d733 srl a4,a3,a4 + 30060f8: 4501 li a0,0 + 30060fa: 00f30663 beq t1,a5,3006106 <__truncdfsf2+0x16a> + 30060fe: ca288893 addi a7,a7,-862 + 3006102: 01169533 sll a0,a3,a7 + 3006106: 00c567b3 or a5,a0,a2 + 300610a: 00f037b3 snez a5,a5 + 300610e: 8fd9 or a5,a5,a4 + 3006110: bf71 j 30060ac <__truncdfsf2+0x110> + 3006112: 051a slli a0,a0,0x6 + 3006114: 00a037b3 snez a5,a0 + 3006118: 068e slli a3,a3,0x3 + 300611a: 8275 srli a2,a2,0x1d + 300611c: 8edd or a3,a3,a5 + 300611e: 00c6e7b3 or a5,a3,a2 + 3006122: 4681 li a3,0 + 3006124: 4601 li a2,0 + 3006126: 0077f513 andi a0,a5,7 + 300612a: ec0513e3 bnez a0,3005ff0 <__truncdfsf2+0x54> + 300612e: ee068ae3 beqz a3,3006022 <__truncdfsf2+0x86> + 3006132: 00167693 andi a3,a2,1 + 3006136: ee0686e3 beqz a3,3006022 <__truncdfsf2+0x86> + 300613a: 00266613 ori a2,a2,2 + 300613e: b5d5 j 3006022 <__truncdfsf2+0x86> + 3006140: 00c6e7b3 or a5,a3,a2 + 3006144: 00089563 bnez a7,300614e <__truncdfsf2+0x1b2> + 3006148: 00f037b3 snez a5,a5 + 300614c: b785 j 30060ac <__truncdfsf2+0x110> + 300614e: cf8d beqz a5,3006188 <__truncdfsf2+0x1ec> + 3006150: 7ff00793 li a5,2047 + 3006154: 4601 li a2,0 + 3006156: 00f89863 bne a7,a5,3006166 <__truncdfsf2+0x1ca> + 300615a: 00400637 lui a2,0x400 + 300615e: 8e75 and a2,a2,a3 + 3006160: 00163613 seqz a2,a2 + 3006164: 0612 slli a2,a2,0x4 + 3006166: 068e slli a3,a3,0x3 + 3006168: 020007b7 lui a5,0x2000 + 300616c: 8fd5 or a5,a5,a3 + 300616e: 0ff00713 li a4,255 + 3006172: 4681 li a3,0 + 3006174: bf4d j 3006126 <__truncdfsf2+0x18a> + 3006176: 4785 li a5,1 + 3006178: bf25 j 30060b0 <__truncdfsf2+0x114> + 300617a: 4605 li a2,1 + 300617c: f1a5 bnez a1,30060dc <__truncdfsf2+0x140> + 300617e: 0721 addi a4,a4,8 + 3006180: bfb1 j 30060dc <__truncdfsf2+0x140> + 3006182: 4605 li a2,1 + 3006184: dda1 beqz a1,30060dc <__truncdfsf2+0x140> + 3006186: bfe5 j 300617e <__truncdfsf2+0x1e2> + 3006188: 0ff00713 li a4,255 + 300618c: 4601 li a2,0 + 300618e: bd51 j 3006022 <__truncdfsf2+0x86> + 3006190: fdd9 bnez a1,300612e <__truncdfsf2+0x192> + 3006192: 07a1 addi a5,a5,8 # 2000008 + 3006194: bf69 j 300612e <__truncdfsf2+0x192> + 3006196: ddc1 beqz a1,300612e <__truncdfsf2+0x192> + 3006198: bfed j 3006192 <__truncdfsf2+0x1f6> + 300619a: 4781 li a5,0 + 300619c: 00080e63 beqz a6,30061b8 <__truncdfsf2+0x21c> + 30061a0: 468d li a3,3 + 30061a2: 00d81763 bne a6,a3,30061b0 <__truncdfsf2+0x214> + 30061a6: c989 beqz a1,30061b8 <__truncdfsf2+0x21c> + 30061a8: 57fd li a5,-1 + 30061aa: 0fe00713 li a4,254 + 30061ae: a029 j 30061b8 <__truncdfsf2+0x21c> + 30061b0: 4689 li a3,2 + 30061b2: fed81be3 bne a6,a3,30061a8 <__truncdfsf2+0x20c> + 30061b6: d9ed beqz a1,30061a8 <__truncdfsf2+0x20c> + 30061b8: 00566613 ori a2,a2,5 + 30061bc: b541 j 300603c <__truncdfsf2+0xa0> + +030061be <__clzsi2>: + 30061be: 67c1 lui a5,0x10 + 30061c0: 02f57663 bgeu a0,a5,30061ec <__clzsi2+0x2e> + 30061c4: 0ff00793 li a5,255 + 30061c8: 00a7b7b3 sltu a5,a5,a0 + 30061cc: 078e slli a5,a5,0x3 + 30061ce: 02000713 li a4,32 + 30061d2: 8f1d sub a4,a4,a5 + 30061d4: 00f557b3 srl a5,a0,a5 + 30061d8: 00000517 auipc a0,0x0 + 30061dc: 5bc52503 lw a0,1468(a0) # 3006794 <_GLOBAL_OFFSET_TABLE_+0x4> + 30061e0: 97aa add a5,a5,a0 + 30061e2: 0007c503 lbu a0,0(a5) # 10000 + 30061e6: 40a70533 sub a0,a4,a0 + 30061ea: 8082 ret + 30061ec: 01000737 lui a4,0x1000 + 30061f0: 47c1 li a5,16 + 30061f2: fce56ee3 bltu a0,a4,30061ce <__clzsi2+0x10> + 30061f6: 47e1 li a5,24 + 30061f8: bfd9 j 30061ce <__clzsi2+0x10> + ... + +030061fc <__rodata_start>: + 30061fc: 9680 pop {ra,s0-s6},384 + 30061fe: 4b18 lw a4,16(a4) + +03006200 : + 3006200: 0000 1400 0000 0000 0140 0000 1000 1400 ........@....... + 3006210: 0000 0000 0144 0000 2000 1400 0000 0000 ....D.... ...... + 3006220: 0148 0000 3000 1400 0000 0000 014c 0000 H....0......L... + 3006230: 0000 1430 0000 0000 0240 0000 1000 1430 ..0.....@.....0. + 3006240: 0000 0000 0244 0000 2000 1430 0000 0000 ....D.... 0..... + 3006250: 0248 0000 3000 1430 0000 0000 024c 0000 H....00.....L... + 3006260: 0000 1438 0000 0000 0040 0000 0000 1420 ..8.....@..... . + 3006270: 0000 0000 0180 0000 1000 1420 0000 0000 .......... ..... + 3006280: 0184 0000 0000 1410 0000 0000 01c0 0000 ................ + 3006290: 1000 1410 0000 0000 01c4 0000 0000 1460 ..............`. + 30062a0: 0001 0000 02c0 0000 0000 1470 0000 0000 ..........p..... + 30062b0: 0440 0000 1000 1470 0000 0000 0444 0000 @.....p.....D... + 30062c0: 2000 1470 0000 0000 0448 0000 3000 1470 . p.....H....0p. + 30062d0: 0000 0000 044c 0000 0000 1440 0000 0000 ....L.....@..... + 30062e0: 0200 0000 0000 14b0 0000 0000 0280 0000 ................ + 30062f0: 1000 14b0 0000 0000 0284 0000 2000 14b0 ............. .. + 3006300: 0000 0000 0288 0000 0000 1c00 0000 0000 ................ + 3006310: 0300 0000 0000 1450 0000 0000 0480 0000 ......P......... + 3006320: 1000 1450 0000 0000 0484 0000 2000 1450 ..P.......... P. + 3006330: 0000 0000 0488 0000 3000 1450 0000 0000 .........0P..... + 3006340: 048c 0000 4000 1450 0000 0000 0490 0000 .....@P......... + 3006350: 5000 1450 0000 0000 0494 0000 1000 1440 .PP...........@. + 3006360: 0004 0000 03c0 0000 0000 14c0 0000 0000 ................ + 3006370: 04c0 0000 1000 14c0 0000 0000 04c4 0000 ................ + 3006380: 0000 147d 0000 0000 0b00 0000 0000 1480 ..}............. + 3006390: 0000 0000 0380 0000 0000 14a0 0000 0000 ................ + 30063a0: 0400 0000 1000 14a0 0000 0000 0404 0000 ................ + 30063b0: 2000 14a0 0000 0000 0408 0000 3000 14a0 . ...........0.. + 30063c0: 0000 0000 040c 0000 0000 1001 0000 0000 ................ + 30063d0: 0340 0000 0000 1810 0005 0000 0a60 0000 @...........`... + 30063e0: 0000 1830 0005 0000 0a70 0000 0000 1840 ..0.....p.....@. + 30063f0: 0005 0000 0a80 0000 0000 1820 0005 0000 .......... ..... + 3006400: 0a90 0000 1000 1820 0005 0000 0a90 0004 ...... ......... + 3006410: 0000 1800 0002 0000 0a00 0000 0000 1471 ..............q. + 3006420: 0003 0000 0500 0000 2e2e 642f 6972 6576 ........../drive + 3006430: 7372 612f 6364 692f 636e 612f 6364 695f rs/adc/inc/adc_i + 3006440: 2e70 0068 2e2e 642f 6972 6576 7372 612f p.h.../drivers/a + 3006450: 6364 732f 6372 612f 6364 632e 0000 0000 dc/src/adc.c.... + 3006460: 0000 3f80 0000 4480 5547 4055 0000 4580 ...?...DGUU@...E + 3006470: 6666 4026 51ec 4068 2e2e 642f 6972 6576 ff&@.Qh@../drive + 3006480: 7372 622f 7361 2f65 7273 2f63 6e69 6574 rs/base/src/inte + 3006490: 7272 7075 2e74 0063 2308 0300 235a 0300 rrupt.c..#..Z#.. + 30064a0: 23ac 0300 23fe 0300 2450 0300 24a2 0300 .#...#..P$...$.. + 30064b0: 24f4 0300 2546 0300 25dc 0300 262e 0300 .$..F%...%...&.. + 30064c0: 2680 0300 26d2 0300 2724 0300 2776 0300 .&...&..$'..v'.. + 30064d0: 27c8 0300 281a 0300 2e2e 642f 6972 6576 .'...(..../drive + 30064e0: 7372 632f 6772 692f 636e 632f 6772 695f rs/crg/inc/crg_i + 30064f0: 2e70 0068 2e2e 642f 6972 6576 7372 632f p.h.../drivers/c + 3006500: 6772 732f 6372 632f 6772 632e 0000 0000 rg/src/crg.c.... + 3006510: 0000 0000 0001 0000 0002 0000 0003 0000 ................ + 3006520: 0004 0000 0005 0000 0006 0000 0007 0000 ................ + 3006530: 329c 0300 32a6 0300 32be 0300 329c 0300 .2...2...2...2.. + 3006540: 32da 0300 329c 0300 47f8 0300 4862 0300 .2...2...G..bH.. + 3006550: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 3006560: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 3006570: 4862 0300 4738 0300 478e 0300 4862 0300 bH..8G...G..bH.. + 3006580: 4822 0300 4862 0300 4862 0300 4862 0300 "H..bH..bH..bH.. + 3006590: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 30065a0: 4862 0300 4862 0300 47f8 0300 4862 0300 bH..bH...G..bH.. + 30065b0: 4862 0300 4762 0300 4862 0300 47b8 0300 bH..bG..bH...G.. + 30065c0: 4862 0300 4862 0300 47f8 0300 2e2e 642f bH..bH...G..../d + 30065d0: 6972 6576 7372 692f 636f 676d 692f 636e rivers/iocmg/inc + 30065e0: 692f 636f 676d 695f 2e70 0068 2e2e 642f /iocmg_ip.h.../d + 30065f0: 6972 6576 7372 692f 636f 676d 732f 6372 rivers/iocmg/src + 3006600: 692f 636f 676d 632e 0000 0000 2e2e 642f /iocmg.c....../d + 3006610: 6972 6576 7372 742f 6d69 7265 692f 636e rivers/timer/inc + 3006620: 742f 6d69 7265 695f 2e70 0068 2e2e 642f /timer_ip.h.../d + 3006630: 6972 6576 7372 742f 6d69 7265 732f 6372 rivers/timer/src + 3006640: 742f 6d69 7265 632e 0000 0000 55be 0300 /timer.c.....U.. + 3006650: 55d4 0300 55ea 0300 5600 0300 5616 0300 .U...U...V...V.. + 3006660: 2e2e 642f 6972 6576 7372 752f 7261 2f74 ../drivers/uart/ + 3006670: 7273 2f63 6175 7472 632e 0000 3a56 2e25 src/uart.c..V:%. + 3006680: 6632 0a0d 0000 0000 0000 4580 3333 4053 2f.........E33S@ + +03006690 <__clz_tab>: + 3006690: 0100 0202 0303 0303 0404 0404 0404 0404 ................ + 30066a0: 0505 0505 0505 0505 0505 0505 0505 0505 ................ + 30066b0: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 30066c0: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 30066d0: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 30066e0: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 30066f0: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006700: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006710: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006720: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006730: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006740: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006750: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006760: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006770: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006780: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + +03006790 <_GLOBAL_OFFSET_TABLE_>: + 3006790: 0000 0000 6690 0300 ffff ffff 0000 0000 .....f.......... + +out/bin/target.elf: file format elf32-littleriscv + + +Disassembly of section .text.entry: + +03000004 <_start>: + + .section .text.entry + .global _start + .option norvc +_start: + j handle_reset + 3000004: 4fc0006f j 3000500 + +03000008 : +.endm + +/* The interrupt vector table must be aligned with 4 bytes */ +.align 2 +TrapHandler: + j TrapVector /* trap and INT 0 */ + 3000008: 4680006f j 3000470 + j TrapVector /* INT 1 */ + 300000c: 4640006f j 3000470 + j TrapVector /* INT 2 */ + 3000010: 4600006f j 3000470 + j TrapVector /* INT 3 */ + 3000014: 45c0006f j 3000470 + j TrapVector /* INT 4 */ + 3000018: 4580006f j 3000470 + j TrapVector /* INT 5 */ + 300001c: 4540006f j 3000470 + j TrapVector /* INT 6 */ + 3000020: 4500006f j 3000470 + j TrapVector /* INT 7 */ + 3000024: 44c0006f j 3000470 + j TrapVector /* INT 8 */ + 3000028: 4480006f j 3000470 + j TrapVector /* INT 9 */ + 300002c: 4440006f j 3000470 + j TrapVector /* INT 10 */ + 3000030: 4400006f j 3000470 + j TrapVector /* INT 11 */ + 3000034: 43c0006f j 3000470 + j TrapVector /* INT 12 */ + 3000038: 4380006f j 3000470 + j TrapVector /* INT 13 */ + 300003c: 4340006f j 3000470 + j TrapVector /* INT 14 */ + 3000040: 4300006f j 3000470 + j TrapVector /* INT 15 */ + 3000044: 42c0006f j 3000470 + j TrapVector /* INT 16 */ + 3000048: 4280006f j 3000470 + j TrapVector /* INT 17 */ + 300004c: 4240006f j 3000470 + j TrapVector /* INT 18 */ + 3000050: 4200006f j 3000470 + j TrapVector /* INT 19 */ + 3000054: 41c0006f j 3000470 + j TrapVector /* INT 20 */ + 3000058: 4180006f j 3000470 + j TrapVector /* INT 21 */ + 300005c: 4140006f j 3000470 + j TrapVector /* INT 22 */ + 3000060: 4100006f j 3000470 + j TrapVector /* INT 23 */ + 3000064: 40c0006f j 3000470 + j TrapVector /* INT 24 */ + 3000068: 4080006f j 3000470 + j TrapVector /* INT 25 */ + 300006c: 4040006f j 3000470 + + j IntHandler /* INT 26 */ + 3000070: 2640006f j 30002d4 + j IntHandler /* INT 27 */ + 3000074: 2600006f j 30002d4 + j IntHandler /* INT 28 */ + 3000078: 25c0006f j 30002d4 + j IntHandler /* INT 29 */ + 300007c: 2580006f j 30002d4 + j IntHandler /* INT 30 */ + 3000080: 2540006f j 30002d4 + j IntHandler /* INT 31 */ + 3000084: 2500006f j 30002d4 + j IntHandler /* INT 32 */ + 3000088: 24c0006f j 30002d4 + j IntHandler /* INT 33 */ + 300008c: 2480006f j 30002d4 + j IntHandler /* INT 34 */ + 3000090: 2440006f j 30002d4 + j IntHandler /* INT 35 */ + 3000094: 2400006f j 30002d4 + j IntHandler /* INT 36 */ + 3000098: 23c0006f j 30002d4 + j IntHandler /* INT 37 */ + 300009c: 2380006f j 30002d4 + j IntHandler /* INT 38 */ + 30000a0: 2340006f j 30002d4 + j IntHandler /* INT 39 */ + 30000a4: 2300006f j 30002d4 + j IntHandler /* INT 40 */ + 30000a8: 22c0006f j 30002d4 + j IntHandler /* INT 41 */ + 30000ac: 2280006f j 30002d4 + j IntHandler /* INT 42 */ + 30000b0: 2240006f j 30002d4 + j IntHandler /* INT 43 */ + 30000b4: 2200006f j 30002d4 + j IntHandler /* INT 44 */ + 30000b8: 21c0006f j 30002d4 + j IntHandler /* INT 45 */ + 30000bc: 2180006f j 30002d4 + j IntHandler /* INT 46 */ + 30000c0: 2140006f j 30002d4 + j IntHandler /* INT 47 */ + 30000c4: 2100006f j 30002d4 + j IntHandler /* INT 48 */ + 30000c8: 20c0006f j 30002d4 + j IntHandler /* INT 49 */ + 30000cc: 2080006f j 30002d4 + j IntHandler /* INT 50 */ + 30000d0: 2040006f j 30002d4 + j IntHandler /* INT 51 */ + 30000d4: 2000006f j 30002d4 + j IntHandler /* INT 52 */ + 30000d8: 1fc0006f j 30002d4 + j IntHandler /* INT 53 */ + 30000dc: 1f80006f j 30002d4 + j IntHandler /* INT 54 */ + 30000e0: 1f40006f j 30002d4 + j IntHandler /* INT 55 */ + 30000e4: 1f00006f j 30002d4 + j IntHandler /* INT 56 */ + 30000e8: 1ec0006f j 30002d4 + j IntHandler /* INT 57 */ + 30000ec: 1e80006f j 30002d4 + j IntHandler /* INT 58 */ + 30000f0: 1e40006f j 30002d4 + j IntHandler /* INT 59 */ + 30000f4: 1e00006f j 30002d4 + j IntHandler /* INT 60 */ + 30000f8: 1dc0006f j 30002d4 + j IntHandler /* INT 61 */ + 30000fc: 1d80006f j 30002d4 + j IntHandler /* INT 62 */ + 3000100: 1d40006f j 30002d4 + j IntHandler /* INT 63 */ + 3000104: 1d00006f j 30002d4 + j IntHandler /* INT 64 */ + 3000108: 1cc0006f j 30002d4 + j IntHandler /* INT 65 */ + 300010c: 1c80006f j 30002d4 + j IntHandler /* INT 66 */ + 3000110: 1c40006f j 30002d4 + j IntHandler /* INT 67 */ + 3000114: 1c00006f j 30002d4 + j IntHandler /* INT 68 */ + 3000118: 1bc0006f j 30002d4 + j IntHandler /* INT 69 */ + 300011c: 1b80006f j 30002d4 + j IntHandler /* INT 70 */ + 3000120: 1b40006f j 30002d4 + j IntHandler /* INT 71 */ + 3000124: 1b00006f j 30002d4 + j IntHandler /* INT 72 */ + 3000128: 1ac0006f j 30002d4 + j IntHandler /* INT 73 */ + 300012c: 1a80006f j 30002d4 + j IntHandler /* INT 74 */ + 3000130: 1a40006f j 30002d4 + j IntHandler /* INT 75 */ + 3000134: 1a00006f j 30002d4 + j IntHandler /* INT 76 */ + 3000138: 19c0006f j 30002d4 + j IntHandler /* INT 77 */ + 300013c: 1980006f j 30002d4 + j IntHandler /* INT 78 */ + 3000140: 1940006f j 30002d4 + j IntHandler /* INT 79 */ + 3000144: 1900006f j 30002d4 + j IntHandler /* INT 80 */ + 3000148: 18c0006f j 30002d4 + j IntHandler /* INT 81 */ + 300014c: 1880006f j 30002d4 + j IntHandler /* INT 82 */ + 3000150: 1840006f j 30002d4 + j IntHandler /* INT 83 */ + 3000154: 1800006f j 30002d4 + j IntHandler /* INT 84 */ + 3000158: 17c0006f j 30002d4 + j IntHandler /* INT 85 */ + 300015c: 1780006f j 30002d4 + j IntHandler /* INT 86 */ + 3000160: 1740006f j 30002d4 + j IntHandler /* INT 87 */ + 3000164: 1700006f j 30002d4 + j IntHandler /* INT 88 */ + 3000168: 16c0006f j 30002d4 + j IntHandler /* INT 89 */ + 300016c: 1680006f j 30002d4 + j IntHandler /* INT 90 */ + 3000170: 1640006f j 30002d4 + j IntHandler /* INT 91 */ + 3000174: 1600006f j 30002d4 + j IntHandler /* INT 92 */ + 3000178: 15c0006f j 30002d4 + j IntHandler /* INT 93 */ + 300017c: 1580006f j 30002d4 + j IntHandler /* INT 94 */ + 3000180: 1540006f j 30002d4 + j IntHandler /* INT 95 */ + 3000184: 1500006f j 30002d4 + j IntHandler /* INT 96 */ + 3000188: 14c0006f j 30002d4 + j IntHandler /* INT 97 */ + 300018c: 1480006f j 30002d4 + j IntHandler /* INT 98 */ + 3000190: 1440006f j 30002d4 + j IntHandler /* INT 99 */ + 3000194: 1400006f j 30002d4 + j IntHandler /* INT 100 */ + 3000198: 13c0006f j 30002d4 + j IntHandler /* INT 101 */ + 300019c: 1380006f j 30002d4 + j IntHandler /* INT 102 */ + 30001a0: 1340006f j 30002d4 + j IntHandler /* INT 103 */ + 30001a4: 1300006f j 30002d4 + j IntHandler /* INT 104 */ + 30001a8: 12c0006f j 30002d4 + j IntHandler /* INT 105 */ + 30001ac: 1280006f j 30002d4 + j IntHandler /* INT 106 */ + 30001b0: 1240006f j 30002d4 + j IntHandler /* INT 107 */ + 30001b4: 1200006f j 30002d4 + j IntHandler /* INT 108 */ + 30001b8: 11c0006f j 30002d4 + j IntHandler /* INT 109 */ + 30001bc: 1180006f j 30002d4 + j IntHandler /* INT 110 */ + 30001c0: 1140006f j 30002d4 + j IntHandler /* INT 111 */ + 30001c4: 1100006f j 30002d4 + j IntHandler /* INT 112 */ + 30001c8: 10c0006f j 30002d4 + j IntHandler /* INT 113 */ + 30001cc: 1080006f j 30002d4 + j IntHandler /* INT 114 */ + 30001d0: 1040006f j 30002d4 + j IntHandler /* INT 115 */ + 30001d4: 1000006f j 30002d4 + j IntHandler /* INT 116 */ + 30001d8: 0fc0006f j 30002d4 + j IntHandler /* INT 117 */ + 30001dc: 0f80006f j 30002d4 + j IntHandler /* INT 118 */ + 30001e0: 0f40006f j 30002d4 + j IntHandler /* INT 119 */ + 30001e4: 0f00006f j 30002d4 + j IntHandler /* INT 120 */ + 30001e8: 0ec0006f j 30002d4 + j IntHandler /* INT 121 */ + 30001ec: 0e80006f j 30002d4 + +030001f0 : + +.align 2 +NmiEntry: + SAVE_SYSERR_REGS + 30001f0: f9010113 addi sp,sp,-112 + 30001f4: 04812023 sw s0,64(sp) + 30001f8: 04912223 sw s1,68(sp) + 30001fc: 05212423 sw s2,72(sp) + 3000200: 05312623 sw s3,76(sp) + 3000204: 05412823 sw s4,80(sp) + 3000208: 05512a23 sw s5,84(sp) + 300020c: 05612c23 sw s6,88(sp) + 3000210: 05712e23 sw s7,92(sp) + 3000214: 07812023 sw s8,96(sp) + 3000218: 07912223 sw s9,100(sp) + 300021c: 07a12423 sw s10,104(sp) + 3000220: 07b12623 sw s11,108(sp) + 3000224: 11010593 addi a1,sp,272 + 3000228: 06b12823 sw a1,112(sp) + 300022c: 06312a23 sw gp,116(sp) + 3000230: 06412c23 sw tp,120(sp) + 3000234: 34102573 csrr a0,mepc + 3000238: 300025f3 csrr a1,mstatus + 300023c: 34302673 csrr a2,mtval + 3000240: 342026f3 csrr a3,mcause + 3000244: 06a12e23 sw a0,124(sp) + 3000248: 08b12023 sw a1,128(sp) + 300024c: 08c12223 sw a2,132(sp) + 3000250: 08d12423 sw a3,136(sp) + 3000254: 00010513 mv a0,sp + call SysErrNmiEntry + 3000258: 04c020ef jal ra,30022a4 + +0300025c : +deadLoop1: + tail deadLoop1 + 300025c: a001 j 300025c + nop + 300025e: 00000013 nop + +03000262 : + +.align 2 +TrapEntry: + SAVE_SYSERR_REGS + 3000262: f9010113 addi sp,sp,-112 + 3000266: 04812023 sw s0,64(sp) + 300026a: 04912223 sw s1,68(sp) + 300026e: 05212423 sw s2,72(sp) + 3000272: 05312623 sw s3,76(sp) + 3000276: 05412823 sw s4,80(sp) + 300027a: 05512a23 sw s5,84(sp) + 300027e: 05612c23 sw s6,88(sp) + 3000282: 05712e23 sw s7,92(sp) + 3000286: 07812023 sw s8,96(sp) + 300028a: 07912223 sw s9,100(sp) + 300028e: 07a12423 sw s10,104(sp) + 3000292: 07b12623 sw s11,108(sp) + 3000296: 11010593 addi a1,sp,272 + 300029a: 06b12823 sw a1,112(sp) + 300029e: 06312a23 sw gp,116(sp) + 30002a2: 06412c23 sw tp,120(sp) + 30002a6: 34102573 csrr a0,mepc + 30002aa: 300025f3 csrr a1,mstatus + 30002ae: 34302673 csrr a2,mtval + 30002b2: 342026f3 csrr a3,mcause + 30002b6: 06a12e23 sw a0,124(sp) + 30002ba: 08b12023 sw a1,128(sp) + 30002be: 08c12223 sw a2,132(sp) + 30002c2: 08d12423 sw a3,136(sp) + 30002c6: 00010513 mv a0,sp + /* Exception run with interrupts masked */ + csrc mstatus, MSTATUS_MIE + 30002ca: 30047073 csrci mstatus,8 + call SysErrExcEntry + 30002ce: 7b9010ef jal ra,3002286 + +030002d2 : +deadLoop2: + tail deadLoop2 + 30002d2: a001 j 30002d2 + +030002d4 : + +.align 2 +IntHandler: + addi sp, sp, -(TOTAL_INT_SIZE_ON_STACK) + 30002d4: f6010113 addi sp,sp,-160 + + SREG a0, 3 * REGBYTES(sp) + 30002d8: 00a12623 sw a0,12(sp) + SREG a1, 4 * REGBYTES(sp) + 30002dc: 00b12823 sw a1,16(sp) +#endif + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + csrr a0, mcause +#else + csrr a0, cipri + 30002e0: 7ed02573 csrr a0,0x7ed + csrr a1, prithd + 30002e4: bfe025f3 csrr a1,0xbfe + csrw prithd, a0 /* read prithd */ + 30002e8: bfe51073 csrw 0xbfe,a0 + SREG a1, 6 * REGBYTES(sp) /* save prithd */ + 30002ec: 00b12c23 sw a1,24(sp) + csrr a1, mstatus /* read mstatus */ + 30002f0: 300025f3 csrr a1,mstatus + SREG a1, 7 * REGBYTES(sp) /* save mstatus */ + 30002f4: 00b12e23 sw a1,28(sp) + csrr a1, mepc /* read mepc */ + 30002f8: 341025f3 csrr a1,mepc + SREG a1, 8 * REGBYTES(sp) /* save mepc */ + 30002fc: 02b12023 sw a1,32(sp) + + csrr a0, mcause + 3000300: 34202573 csrr a0,mcause + + li a1, (3<<11) + 3000304: 000025b7 lui a1,0x2 + 3000308: 80058593 addi a1,a1,-2048 # 1800 + csrs mstatus, a1 + 300030c: 3005a073 csrs mstatus,a1 + la a1, custom_nested_irq_main_handler_entry + 3000310: 00000597 auipc a1,0x0 + 3000314: 01058593 addi a1,a1,16 # 3000320 + csrw mepc, a1 + 3000318: 34159073 csrw mepc,a1 + mret + 300031c: 30200073 mret + +03000320 : +#endif + +.align 2 +custom_nested_irq_main_handler_entry: + SREG t0, 0 * REGBYTES(sp) + 3000320: 00512023 sw t0,0(sp) + SREG t1, 1 * REGBYTES(sp) + 3000324: 00612223 sw t1,4(sp) + SREG t2, 2 * REGBYTES(sp) + 3000328: 00712423 sw t2,8(sp) + SREG a2, 5 * REGBYTES(sp) + 300032c: 00c12a23 sw a2,20(sp) + SREG ra, 9 * REGBYTES(sp) + 3000330: 02112223 sw ra,36(sp) + SREG a3, 10 * REGBYTES(sp) + 3000334: 02d12423 sw a3,40(sp) + SREG a4, 11 * REGBYTES(sp) + 3000338: 02e12623 sw a4,44(sp) + SREG a5, 12 * REGBYTES(sp) + 300033c: 02f12823 sw a5,48(sp) + SREG a6, 13 * REGBYTES(sp) + 3000340: 03012a23 sw a6,52(sp) + SREG a7, 14 * REGBYTES(sp) + 3000344: 03112c23 sw a7,56(sp) + SREG t3, 15 * REGBYTES(sp) + 3000348: 03c12e23 sw t3,60(sp) + SREG t4, 16 * REGBYTES(sp) + 300034c: 05d12023 sw t4,64(sp) + SREG t5, 17 * REGBYTES(sp) + 3000350: 05e12223 sw t5,68(sp) + SREG t6, 18 * REGBYTES(sp) + 3000354: 05f12423 sw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FSREG f0, 19 * REGBYTES(sp) + 3000358: 04012627 fsw ft0,76(sp) + FSREG f1, 20 * REGBYTES(sp) + 300035c: 04112827 fsw ft1,80(sp) + FSREG f2, 21 * REGBYTES(sp) + 3000360: 04212a27 fsw ft2,84(sp) + FSREG f3, 22 * REGBYTES(sp) + 3000364: 04312c27 fsw ft3,88(sp) + FSREG f4, 23 * REGBYTES(sp) + 3000368: 04412e27 fsw ft4,92(sp) + FSREG f5, 24 * REGBYTES(sp) + 300036c: 06512027 fsw ft5,96(sp) + FSREG f6, 25 * REGBYTES(sp) + 3000370: 06612227 fsw ft6,100(sp) + FSREG f7, 26 * REGBYTES(sp) + 3000374: 06712427 fsw ft7,104(sp) + FSREG f10, 27 * REGBYTES(sp) + 3000378: 06a12627 fsw fa0,108(sp) + FSREG f11, 28 * REGBYTES(sp) + 300037c: 06b12827 fsw fa1,112(sp) + FSREG f12, 29 * REGBYTES(sp) + 3000380: 06c12a27 fsw fa2,116(sp) + FSREG f13, 30 * REGBYTES(sp) + 3000384: 06d12c27 fsw fa3,120(sp) + FSREG f14, 31 * REGBYTES(sp) + 3000388: 06e12e27 fsw fa4,124(sp) + FSREG f15, 32 * REGBYTES(sp) + 300038c: 08f12027 fsw fa5,128(sp) + FSREG f16, 33 * REGBYTES(sp) + 3000390: 09012227 fsw fa6,132(sp) + FSREG f17, 34 * REGBYTES(sp) + 3000394: 09112427 fsw fa7,136(sp) + FSREG f28, 35 * REGBYTES(sp) + 3000398: 09c12627 fsw ft8,140(sp) + FSREG f29, 36 * REGBYTES(sp) + 300039c: 09d12827 fsw ft9,144(sp) + FSREG f30, 37 * REGBYTES(sp) + 30003a0: 09e12a27 fsw ft10,148(sp) + FSREG f31, 38 * REGBYTES(sp) + 30003a4: 09f12c27 fsw ft11,152(sp) +#endif + + andi a0, a0, MCAUSE_MASK_INT_NUM + 30003a8: 0ff57513 andi a0,a0,255 + call InterruptEntry + 30003ac: 46b010ef jal ra,3002016 + + LREG t1, 1 * REGBYTES(sp) + 30003b0: 00412303 lw t1,4(sp) + LREG t2, 2 * REGBYTES(sp) + 30003b4: 00812383 lw t2,8(sp) + LREG a2, 5 * REGBYTES(sp) + 30003b8: 01412603 lw a2,20(sp) + LREG ra, 9 * REGBYTES(sp) + 30003bc: 02412083 lw ra,36(sp) + LREG a3, 10 * REGBYTES(sp) + 30003c0: 02812683 lw a3,40(sp) + LREG a4, 11 * REGBYTES(sp) + 30003c4: 02c12703 lw a4,44(sp) + LREG a5, 12 * REGBYTES(sp) + 30003c8: 03012783 lw a5,48(sp) + LREG a6, 13 * REGBYTES(sp) + 30003cc: 03412803 lw a6,52(sp) + LREG a7, 14 * REGBYTES(sp) + 30003d0: 03812883 lw a7,56(sp) + LREG t3, 15 * REGBYTES(sp) + 30003d4: 03c12e03 lw t3,60(sp) + LREG t4, 16 * REGBYTES(sp) + 30003d8: 04012e83 lw t4,64(sp) + LREG t5, 17 * REGBYTES(sp) + 30003dc: 04412f03 lw t5,68(sp) + LREG t6, 18 * REGBYTES(sp) + 30003e0: 04812f83 lw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FLREG f0, 19 * REGBYTES(sp) + 30003e4: 04c12007 flw ft0,76(sp) + FLREG f1, 20 * REGBYTES(sp) + 30003e8: 05012087 flw ft1,80(sp) + FLREG f2, 21 * REGBYTES(sp) + 30003ec: 05412107 flw ft2,84(sp) + FLREG f3, 22 * REGBYTES(sp) + 30003f0: 05812187 flw ft3,88(sp) + FLREG f4, 23 * REGBYTES(sp) + 30003f4: 05c12207 flw ft4,92(sp) + FLREG f5, 24 * REGBYTES(sp) + 30003f8: 06012287 flw ft5,96(sp) + FLREG f6, 25 * REGBYTES(sp) + 30003fc: 06412307 flw ft6,100(sp) + FLREG f7, 26 * REGBYTES(sp) + 3000400: 06812387 flw ft7,104(sp) + FLREG f10, 27 * REGBYTES(sp) + 3000404: 06c12507 flw fa0,108(sp) + FLREG f11, 28 * REGBYTES(sp) + 3000408: 07012587 flw fa1,112(sp) + FLREG f12, 29 * REGBYTES(sp) + 300040c: 07412607 flw fa2,116(sp) + FLREG f13, 30 * REGBYTES(sp) + 3000410: 07812687 flw fa3,120(sp) + FLREG f14, 31 * REGBYTES(sp) + 3000414: 07c12707 flw fa4,124(sp) + FLREG f15, 32 * REGBYTES(sp) + 3000418: 08012787 flw fa5,128(sp) + FLREG f16, 33 * REGBYTES(sp) + 300041c: 08412807 flw fa6,132(sp) + FLREG f17, 34 * REGBYTES(sp) + 3000420: 08812887 flw fa7,136(sp) + FLREG f28, 35 * REGBYTES(sp) + 3000424: 08c12e07 flw ft8,140(sp) + FLREG f29, 36 * REGBYTES(sp) + 3000428: 09012e87 flw ft9,144(sp) + FLREG f30, 37 * REGBYTES(sp) + 300042c: 09412f07 flw ft10,148(sp) + FLREG f31, 38 * REGBYTES(sp) + 3000430: 09812f87 flw ft11,152(sp) + +03000434 : + */ + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + LREG t0, 0 * REGBYTES(sp) +#else + LREG a0, 7 * REGBYTES(sp) /* load mstatus */ + 3000434: 01c12503 lw a0,28(sp) + csrr t0, mstatus + 3000438: 300022f3 csrr t0,mstatus + LREG a1, 8 * REGBYTES(sp) /* load mepc */ + 300043c: 02012583 lw a1,32(sp) + andi t0, t0, MSTATUS_MIE + 3000440: 0082f293 andi t0,t0,8 + bnei t0, 0, restore_mstatus + 3000444: 0002923b bnei t0,0,300044c + andi a0, a0, ~(MSTATUS_MIE | MSTATUS_MPIE) + 3000448: f7757513 andi a0,a0,-137 + +0300044c : +restore_mstatus: + csrw mstatus, a0 + 300044c: 30051073 csrw mstatus,a0 + + LREG t0, 0 * REGBYTES(sp) + 3000450: 00012283 lw t0,0(sp) + csrw mepc, a1 + 3000454: 34159073 csrw mepc,a1 + LREG a0, 6 * REGBYTES(sp) /* load prithd */ + 3000458: 01812503 lw a0,24(sp) + csrw prithd, a0 + 300045c: bfe51073 csrw 0xbfe,a0 + lw a1, (a0) + addi a1, a1, -1 + sw a1, (a0) +#endif + + LREG a1, 4 * REGBYTES(sp) /* 2 consecutive csrw instructions will have a bubble */ + 3000460: 01012583 lw a1,16(sp) + + LREG a0, 3 * REGBYTES(sp) + 3000464: 00c12503 lw a0,12(sp) + + addi sp, sp, TOTAL_INT_SIZE_ON_STACK + 3000468: 0a010113 addi sp,sp,160 + + mret + 300046c: 30200073 mret + +03000470 : + +.align 2 +TrapVector: + push_reg + 3000470: f6010113 addi sp,sp,-160 + 3000474: fff11f8b stmia {ra,t0-t6,a0-a7},(sp) + 3000478: f6010113 addi sp,sp,-160 + csrr a0, mcause + 300047c: 34202573 csrr a0,mcause + li t1, MCAUSE_ECALL_FROM_MMODE + 3000480: 00b00313 li t1,11 +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + beq a0, t1, switch_to_umode +#else + beq a0, t1, switch_to_mmode + 3000484: 02650c63 beq a0,t1,30004bc +#endif + li t1, MCAUSE_ECALL_FROM_UMODE + 3000488: 00800313 li t1,8 + beq a0, t1, switch_to_mmode + 300048c: 02650863 beq a0,t1,30004bc + + li a1, MCAUSE_MASK_INT_BIT + 3000490: 800005b7 lui a1,0x80000 + li a2, MCAUSE_MASK_INT_NUM + 3000494: 0ff00613 li a2,255 + and a1, a0, a1 + 3000498: 00b575b3 and a1,a0,a1 + and a0, a0, a2 + 300049c: 00c57533 and a0,a0,a2 + + li a2, 0xc + 30004a0: 00c00613 li a2,12 + beq a0, a2, NmiEntry + 30004a4: d4c506e3 beq a0,a2,30001f0 + beqz a1, TrapEntry + 30004a8: da058de3 beqz a1,3000262 + pop_reg + 30004ac: 0a010113 addi sp,sp,160 + 30004b0: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004b4: 0a010113 addi sp,sp,160 + mret + 30004b8: 30200073 mret + +030004bc : + mret +#endif + +.align 2 +switch_to_mmode: + li t2, MSTATUS_MPP_MACHINE + 30004bc: 000023b7 lui t2,0x2 + 30004c0: 80038393 addi t2,t2,-2048 # 1800 + csrs mstatus, t2 + 30004c4: 3003a073 csrs mstatus,t2 + csrr t0, mepc + 30004c8: 341022f3 csrr t0,mepc + addi t0, t0, 4 + 30004cc: 00428293 addi t0,t0,4 + csrw mepc, t0 + 30004d0: 34129073 csrw mepc,t0 + pop_reg + 30004d4: 0a010113 addi sp,sp,160 + 30004d8: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004dc: 0a010113 addi sp,sp,160 + mret + 30004e0: 30200073 mret + +030004e4 : + +.align 2 +mem_cpy: + bge t0, t2, cpy_done + 30004e4: 0072dc63 bge t0,t2,30004fc + lw t3, (t1) + 30004e8: 00032e03 lw t3,0(t1) + sw t3, (t0) + 30004ec: 01c2a023 sw t3,0(t0) + addi t0, t0, 4 + 30004f0: 00428293 addi t0,t0,4 + addi t1, t1, 4 + 30004f4: 00430313 addi t1,t1,4 + j mem_cpy + 30004f8: fedff06f j 30004e4 + +030004fc : +cpy_done: + ret + 30004fc: 00008067 ret + +03000500 : + +.align 2 +handle_reset: + csrwi mstatus, 0 + 3000500: 30005073 csrwi mstatus,0 + csrwi mie, 0 + 3000504: 30405073 csrwi mie,0 + csrci mstatus, 0x08 + 3000508: 30047073 csrci mstatus,8 + la t0, TrapHandler + 300050c: 00000297 auipc t0,0x0 + 3000510: afc28293 addi t0,t0,-1284 # 3000008 + addi t0, t0, 1 + 3000514: 00128293 addi t0,t0,1 + csrw mtvec, t0 + 3000518: 30529073 csrw mtvec,t0 + csrwi 0x7EF, 0x1 /* lock mtvec */ + 300051c: 7ef0d073 csrwi 0x7ef,1 + +03000520 : + csrwi 0x7C8, 0x1 /* enable hardware nest interrupt support */ +#endif + +flash_init: +/* eflash prefetch enable */ + li t0, EFC_BASE_ADDR + 3000520: 147102b7 lui t0,0x14710 + lw t1, 0x120(t0) + 3000524: 1202a303 lw t1,288(t0) # 14710120 + ori t1, t1, 1 + 3000528: 00136313 ori t1,t1,1 + sw t1, 0x120(t0) + 300052c: 1262a023 sw t1,288(t0) + +/* eflash cache enable */ + lw t1, 0x124(t0) + 3000530: 1242a303 lw t1,292(t0) + ori t1, t1, 1 + 3000534: 00136313 ori t1,t1,1 + sw t1, 0x124(t0) + 3000538: 1262a223 sw t1,292(t0) + +/* enable flash cmd */ + li t0, EFC_MAGIC_NUMBER + 300053c: fedcc2b7 lui t0,0xfedcc + 3000540: a9828293 addi t0,t0,-1384 # fedcba98 + li t1, EFC_MAGIC_LOCK_RW + 3000544: 14710337 lui t1,0x14710 + 3000548: 20030313 addi t1,t1,512 # 14710200 + sw t0, (t1) + 300054c: 00532023 sw t0,0(t1) + +/* initialize global pointer */ + .option push + .option norelax + la gp, __global_pointer$ + 3000550: 01001197 auipc gp,0x1001 + 3000554: bc418193 addi gp,gp,-1084 # 4001114 <__global_pointer$> + .option pop + +/* initialize stack pointer */ + la sp, __stack_top + 3000558: 01007117 auipc sp,0x1007 + 300055c: 6a810113 addi sp,sp,1704 # 4007c00 <__INTERRUPT_STACK_BEGIN__> + +/* timer0 interrupt enable */ + li t0, TIMER0_CONTROL + 3000560: 143002b7 lui t0,0x14300 + 3000564: 00828293 addi t0,t0,8 # 14300008 + lw t1, (t0) + 3000568: 0002a303 lw t1,0(t0) + andi t1, t1, TIMER0_INTENABLE + 300056c: 02037313 andi t1,t1,32 + sw t1, (t0) + 3000570: 0062a023 sw t1,0(t0) + +/* uart0 deinit */ + li t0, 0x14000000 + 3000574: 140002b7 lui t0,0x14000 + li t1, 0 + 3000578: 00000313 li t1,0 + sw t1, IBRD_OFFSET(t0) + 300057c: 0262a223 sw t1,36(t0) # 14000024 + sw t1, FBRD_OFFSET(t0) + 3000580: 0262a423 sw t1,40(t0) + sw t1, LCR_H_OFFSET(t0) + 3000584: 0262a623 sw t1,44(t0) + sw t1, CR_OFFSET(t0) + 3000588: 0262a823 sw t1,48(t0) + sw t1, DMACR_OFFSET(t0) + 300058c: 0462a423 sw t1,72(t0) + +03000590 : + +/* perform the rest of initialization in C */ +clear_sram: + /* clear sysram parity error */ + li t0, SYSRAM_ERROR + 3000590: 101082b7 lui t0,0x10108 + 3000594: 30028293 addi t0,t0,768 # 10108300 + lw t1, (t0) + 3000598: 0002a303 lw t1,0(t0) + ori t1, t1, 1 + 300059c: 00136313 ori t1,t1,1 + sw t1, (t0) + 30005a0: 0062a023 sw t1,0(t0) + + la t0, SRAM_START + 30005a4: 01000297 auipc t0,0x1000 + 30005a8: a5c28293 addi t0,t0,-1444 # 4000000 + la t1, SRAM_END + 30005ac: 01008317 auipc t1,0x1008 + 30005b0: a5430313 addi t1,t1,-1452 # 4008000 + li t2, 0 + 30005b4: 00000393 li t2,0 + +030005b8 : + +clear_sram_loop: + sw t2, (t0) /* clear all sram */ + 30005b8: 0072a023 sw t2,0(t0) + addi t0, t0, 4 /* increment clear index pointer */ + 30005bc: 00428293 addi t0,t0,4 + blt t0, t1, clear_sram_loop /* are we at the end yet, if not , contiue till the end */ + 30005c0: fe62cce3 blt t0,t1,30005b8 + +030005c4 : + +start_coderom_code_copy: + la t0, __sram_code_start_addr /* SRAM addr */ + 30005c4: ff000297 auipc t0,0xff000 + 30005c8: a3c28293 addi t0,t0,-1476 # 2000000 + la t1, __sram_code_load_addr /* ROM addr */ + 30005cc: 00000317 auipc t1,0x0 + 30005d0: 13830313 addi t1,t1,312 # 3000704 + la t2, __sram_code_end_addr + 30005d4: ff000397 auipc t2,0xff000 + 30005d8: a2c38393 addi t2,t2,-1492 # 2000000 + jal mem_cpy + 30005dc: f09ff0ef jal ra,30004e4 + +030005e0 : + +start_reserved_data_copy: + la t0, __reserved_code_start_addr /* SRAM addr */ + 30005e0: 01000297 auipc t0,0x1000 + 30005e4: a2028293 addi t0,t0,-1504 # 4000000 + la t1, __reserved_code_load_addr /* ROM addr */ + 30005e8: 00000317 auipc t1,0x0 + 30005ec: 11c30313 addi t1,t1,284 # 3000704 + la t2, __reserved_code_end_addr + 30005f0: 01000397 auipc t2,0x1000 + 30005f4: a1038393 addi t2,t2,-1520 # 4000000 + jal mem_cpy + 30005f8: eedff0ef jal ra,30004e4 + +030005fc : + +start_coderom_data_copy: + la t0, __data_start /* SRAM addr */ + 30005fc: 01000297 auipc t0,0x1000 + 3000600: a2428293 addi t0,t0,-1500 # 4000020 + la t1, __data_load /* ROM addr */ + 3000604: 00006317 auipc t1,0x6 + 3000608: 19c30313 addi t1,t1,412 # 30067a0 <__data_load> + la t2, __data_end + 300060c: 01000397 auipc t2,0x1000 + 3000610: af038393 addi t2,t2,-1296 # 40000fc + jal mem_cpy + 3000614: ed1ff0ef jal ra,30004e4 + +03000618 : + +pmp_init: + li t0, 0xB00 + 3000618: 000012b7 lui t0,0x1 + 300061c: b0028293 addi t0,t0,-1280 # b00 + csrw pmpaddr0, t0 + 3000620: 3b029073 csrw pmpaddr0,t0 + li t0, 0x400400 /* 0x2C00~0x1000FFF, BOOTROM, enable R+X */ + 3000624: 004002b7 lui t0,0x400 + 3000628: 40028293 addi t0,t0,1024 # 400400 + csrw pmpaddr1, t0 + 300062c: 3b129073 csrw pmpaddr1,t0 + li t0, 0x800000 /* 0x1001000~0x1FFFFFF, Reserved: diable R+X+W */ + 3000630: 008002b7 lui t0,0x800 + csrw pmpaddr2, t0 + 3000634: 3b229073 csrw pmpaddr2,t0 + li t0, 0x802000 /* 0x2000000~0x2007FFF, SYSRAM_ITCM */ + 3000638: 008022b7 lui t0,0x802 + csrw pmpaddr3, t0 + 300063c: 3b329073 csrw pmpaddr3,t0 + li t0, 0xC00000 /* 0x2008000 ~ 0x2FFFFFF, Reserved: disable R+X+W */ + 3000640: 00c002b7 lui t0,0xc00 + csrw pmpaddr4, t0 + 3000644: 3b429073 csrw pmpaddr4,t0 + li t0, 0x1000000 /* 0x3000000 ~ 0x03FFFFFF: EFLASH: enable R+X */ + 3000648: 010002b7 lui t0,0x1000 + csrw pmpaddr5, t0 + 300064c: 3b529073 csrw pmpaddr5,t0 + li t0, 0x1002000 /* 0x4000000 ~ 0x04007FFF: SYSTEM_DTCM enable R+W */ + 3000650: 010022b7 lui t0,0x1002 + csrw pmpaddr6, t0 + 3000654: 3b629073 csrw pmpaddr6,t0 + li t0,0x7000400 /* 0x4008000 ~ 0x01C000FFF: REGISTER R+W */ + 3000658: 070002b7 lui t0,0x7000 + 300065c: 40028293 addi t0,t0,1024 # 7000400 + csrw pmpaddr7, t0 + 3000660: 3b729073 csrw pmpaddr7,t0 + + li t0,0xf3333333 /* register TOR-R-W */ + 3000664: f33332b7 lui t0,0xf3333 + 3000668: 33328293 addi t0,t0,819 # f3333333 + csrw 0x7d8,t0 + 300066c: 7d829073 csrw 0x7d8,t0 + li t0,0x0d080d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + csrw pmpcfg0,t0 + li t0,0x0b0b0d08 + csrw pmpcfg1,t0 +#else + li t0,0x8d888d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + 3000670: 8d8892b7 lui t0,0x8d889 + 3000674: d8b28293 addi t0,t0,-629 # 8d888d8b + csrw pmpcfg0,t0 + 3000678: 3a029073 csrw pmpcfg0,t0 + li t0,0x8b8b8d88 + 300067c: 8b8b92b7 lui t0,0x8b8b9 + 3000680: d8828293 addi t0,t0,-632 # 8b8b8d88 + csrw pmpcfg1,t0 + 3000684: 3a129073 csrw pmpcfg1,t0 +#endif + +/* disable Icache */ + csrwi 0x7C0, 0x0 /* disable ICACHE */ + 3000688: 7c005073 csrwi 0x7c0,0 + fence + 300068c: 0ff0000f fence + +/* disable Dcache */ + csrwi 0x7C1, 0x0 /* disable DCACHE */ + 3000690: 7c105073 csrwi 0x7c1,0 + fence + 3000694: 0ff0000f fence + +/* support float and mie */ + li t0,0x2008 + 3000698: 000022b7 lui t0,0x2 + 300069c: 00828293 addi t0,t0,8 # 2008 + csrs mstatus,t0 + 30006a0: 3002a073 csrs mstatus,t0 + li t0,0x20 + 30006a4: 02000293 li t0,32 + csrs misa,t0 + 30006a8: 3012a073 csrs misa,t0 + +/* Interrupt set default priority = 1*/ + li t0, 0x11111111 + 30006ac: 111112b7 lui t0,0x11111 + 30006b0: 11128293 addi t0,t0,273 # 11111111 + csrw locipri0, t0 + 30006b4: bc029073 csrw 0xbc0,t0 + csrw locipri1, t0 + 30006b8: bc129073 csrw 0xbc1,t0 + csrw locipri2, t0 + 30006bc: bc229073 csrw 0xbc2,t0 + csrw locipri3, t0 + 30006c0: bc329073 csrw 0xbc3,t0 + csrw locipri4, t0 + 30006c4: bc429073 csrw 0xbc4,t0 + csrw locipri5, t0 + 30006c8: bc529073 csrw 0xbc5,t0 + csrw locipri6, t0 + 30006cc: bc629073 csrw 0xbc6,t0 + csrw locipri7, t0 + 30006d0: bc729073 csrw 0xbc7,t0 + csrw locipri8, t0 + 30006d4: bc829073 csrw 0xbc8,t0 + csrw locipri9, t0 + 30006d8: bc929073 csrw 0xbc9,t0 + csrw locipri10, t0 + 30006dc: bca29073 csrw 0xbca,t0 + csrw locipri11, t0 + 30006e0: bcb29073 csrw 0xbcb,t0 + csrw locipri12, t0 + 30006e4: bcc29073 csrw 0xbcc,t0 + csrw locipri13, t0 + 30006e8: bcd29073 csrw 0xbcd,t0 + csrw locipri14, t0 + 30006ec: bce29073 csrw 0xbce,t0 + csrw locipri15, t0 + 30006f0: bcf29073 csrw 0xbcf,t0 + + ecall + 30006f4: 00000073 ecall + jal Chip_Init + 30006f8: 014000ef jal ra,300070c + +/* jump to C func. */ + jal main + 30006fc: 2ee050ef jal ra,30059ea
+ +03000700 : + +dead_loop: + j dead_loop + 3000700: 0000006f j 3000700 + +Disassembly of section .text: + +03000704 : + * @brief Chip Init Fail Process, deadloop if Chip Init fail + * @param None + * @retval None + */ +static inline void Chip_InitFail(void) +{ + 3000704: 1141 addi sp,sp,-16 + 3000706: c622 sw s0,12(sp) + 3000708: 0800 addi s0,sp,16 + while (1) { + 300070a: a001 j 300070a + +0300070c : + * @brief Chip Init + * @param None + * @retval None + */ +void Chip_Init(void) +{ + 300070c: 1101 addi sp,sp,-32 + 300070e: ce06 sw ra,28(sp) + 3000710: cc22 sw s0,24(sp) + 3000712: 1000 addi s0,sp,32 + CRG_CoreClkSelect coreClkSelect; + /* Config CRG */ + if (CRG_Config(&coreClkSelect) != BASE_STATUS_OK) { + 3000714: fec40793 addi a5,s0,-20 + 3000718: 853e mv a0,a5 + 300071a: 2dc050ef jal ra,30059f6 + 300071e: 87aa mv a5,a0 + 3000720: c391 beqz a5,3000724 + Chip_InitFail(); + 3000722: 37cd jal ra,3000704 + } + + /* Config FLASH Clock */ + FLASH_ClockConfig(coreClkSelect); + 3000724: fec42783 lw a5,-20(s0) + 3000728: 853e mv a0,a5 + 300072a: 796000ef jal ra,3000ec0 + SYSTICK_Init(); + 300072e: 057000ef jal ra,3000f84 + /* Set CoreClock Select after FLASH Config Done */ + CRG_SetCoreClockSelect(coreClkSelect); + 3000732: fec42783 lw a5,-20(s0) + 3000736: 853e mv a0,a5 + 3000738: 25b1 jal ra,3000d84 + + IRQ_Init(); + 300073a: 121010ef jal ra,300205a + ANAVREF_Init(); + 300073e: 23e5 jal ra,3000d26 + ANATRIM_Entry(); + 3000740: 2b51 jal ra,3000cd4 + /* User Add Code Here */ + 3000742: 0001 nop + 3000744: 40f2 lw ra,28(sp) + 3000746: 4462 lw s0,24(sp) + 3000748: 6105 addi sp,sp,32 + 300074a: 8082 ret + +0300074c : + * @brief Calculate the conversion gain of the tsensor. + * @param data, original data. + * @retval None + */ +static void CalculateGain(unsigned int data) +{ + 300074c: 1101 addi sp,sp,-32 + 300074e: ce22 sw s0,28(sp) + 3000750: 1000 addi s0,sp,32 + 3000752: fea42623 sw a0,-20(s0) + g_tsensorGain = ((float)(data) / 10000000.0f); + 3000756: fec42783 lw a5,-20(s0) + 300075a: d017f753 fcvt.s.wu fa4,a5 + 300075e: 030067b7 lui a5,0x3006 + 3000762: 1fc7a787 flw fa5,508(a5) # 30061fc <__rodata_start> + 3000766: 18f777d3 fdiv.s fa5,fa4,fa5 + 300076a: 040007b7 lui a5,0x4000 + 300076e: 02f7a027 fsw fa5,32(a5) # 4000020 +} + 3000772: 0001 nop + 3000774: 4472 lw s0,28(sp) + 3000776: 6105 addi sp,sp,32 + 3000778: 8082 ret + +0300077a : + * @brief Obtains the chip ID. + * @param None + * @retval None + */ +static bool CHIP_GetInfo(void) +{ + 300077a: 7179 addi sp,sp,-48 + 300077c: d606 sw ra,44(sp) + 300077e: d422 sw s0,40(sp) + 3000780: 1800 addi s0,sp,48 + FOTP_INFO_RGN0_NUMBER_4 emptyData; + FOTP_INFO_RGN0_NUMBER_2 idData; + FOTP_InfoGet(FOTP_INFO_RNG0, 4U, (void *)&emptyData.comData); /* 4 is the number of fotp_empty_flag in otp */ + 3000782: fe040793 addi a5,s0,-32 + 3000786: 863e mv a2,a5 + 3000788: 4591 li a1,4 + 300078a: 4501 li a0,0 + 300078c: 2391 jal ra,3000cd0 + FOTP_InfoGet(FOTP_INFO_RNG0, 2U, (void *)&idData.comData); /* 2 is the number of idData in otp */ + 300078e: fd040793 addi a5,s0,-48 + 3000792: 863e mv a2,a5 + 3000794: 4589 li a1,2 + 3000796: 4501 li a0,0 + 3000798: 2b25 jal ra,3000cd0 + if (emptyData.REG.fotp_empty_flag != 0x5AA59669 || idData.REG.chip_id == 0xFFFFFFFF) { + 300079a: fe042703 lw a4,-32(s0) + 300079e: 5aa597b7 lui a5,0x5aa59 + 30007a2: 66978793 addi a5,a5,1641 # 5aa59669 + 30007a6: 00f71763 bne a4,a5,30007b4 + 30007aa: fd042703 lw a4,-48(s0) + 30007ae: 57fd li a5,-1 + 30007b0: 00f71463 bne a4,a5,30007b8 + return false; + 30007b4: 4781 li a5,0 + 30007b6: a011 j 30007ba + } + return true; + 30007b8: 4785 li a5,1 +} + 30007ba: 853e mv a0,a5 + 30007bc: 50b2 lw ra,44(sp) + 30007be: 5422 lw s0,40(sp) + 30007c0: 6145 addi sp,sp,48 + 30007c2: 8082 ret + +030007c4 : + * @brief Analog module trim. + * @param None + * @retval None + */ +static void CHIP_AnalogTrim(void) +{ + 30007c4: 711d addi sp,sp,-96 + 30007c6: ce86 sw ra,92(sp) + 30007c8: cca2 sw s0,88(sp) + 30007ca: 1080 addi s0,sp,96 + FOTP_INFO_RGN0_NUMBER_20 trimData20; + FOTP_InfoGet(FOTP_INFO_RNG0, 20U, (void *)&trimData20.comData); /* 20 is the number of trim data in otp */ + 30007cc: fdc40793 addi a5,s0,-36 + 30007d0: 863e mv a2,a5 + 30007d2: 45d1 li a1,20 + 30007d4: 4501 li a0,0 + 30007d6: 29ed jal ra,3000cd0 + /* VREF */ + VREF->VREF_TRIM0.BIT.da_iref_trim = trimData20.REG.data0.da_iref_trim; + 30007d8: 18100737 lui a4,0x18100 + 30007dc: fdc42783 lw a5,-36(s0) + 30007e0: 83c1 srli a5,a5,0x10 + 30007e2: 9bfd andi a5,a5,-1 + 30007e4: 0ff7f693 andi a3,a5,255 + 30007e8: 433c lw a5,64(a4) + 30007ea: 0ff6f693 andi a3,a3,255 + 30007ee: f007f793 andi a5,a5,-256 + 30007f2: 8fd5 or a5,a5,a3 + 30007f4: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vref_trim = trimData20.REG.data0.da_ref_vref_trim; + 30007f6: 18100737 lui a4,0x18100 + 30007fa: fdc42783 lw a5,-36(s0) + 30007fe: 83a1 srli a5,a5,0x8 + 3000800: 9bfd andi a5,a5,-1 + 3000802: 0ff7f693 andi a3,a5,255 + 3000806: 433c lw a5,64(a4) + 3000808: 0ff6f693 andi a3,a3,255 + 300080c: 06a2 slli a3,a3,0x8 + 300080e: 7641 lui a2,0xffff0 + 3000810: 0ff60613 addi a2,a2,255 # ffff00ff + 3000814: 8ff1 and a5,a5,a2 + 3000816: 8fd5 or a5,a5,a3 + 3000818: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vbg_trim = trimData20.REG.data0.da_ref_vbg_trim; + 300081a: 18100737 lui a4,0x18100 + 300081e: fdc42783 lw a5,-36(s0) + 3000822: 0ff7f693 andi a3,a5,255 + 3000826: 433c lw a5,64(a4) + 3000828: 0ff6f693 andi a3,a3,255 + 300082c: 06c2 slli a3,a3,0x10 + 300082e: ff010637 lui a2,0xff010 + 3000832: 167d addi a2,a2,-1 # ff00ffff + 3000834: 8ff1 and a5,a5,a2 + 3000836: 8fd5 or a5,a5,a3 + 3000838: c33c sw a5,64(a4) + unsigned int value = trimData20.REG.data1.da_ref_temp_trim3; + 300083a: fe042783 lw a5,-32(s0) + 300083e: 83c1 srli a5,a5,0x10 + 3000840: 9bfd andi a5,a5,-1 + 3000842: 9f81 uxtb a5 + 3000844: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim2 << 8U); /* Shift left by 8 bits */ + 3000848: fe042783 lw a5,-32(s0) + 300084c: 83a1 srli a5,a5,0x8 + 300084e: 9bfd andi a5,a5,-1 + 3000850: 9f81 uxtb a5 + 3000852: 07a2 slli a5,a5,0x8 + 3000854: 873e mv a4,a5 + 3000856: fec42783 lw a5,-20(s0) + 300085a: 8fd9 or a5,a5,a4 + 300085c: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim1 << 16U); /* Shift left by 16 bits */ + 3000860: fe042783 lw a5,-32(s0) + 3000864: 9f81 uxtb a5 + 3000866: 07c2 slli a5,a5,0x10 + 3000868: 873e mv a4,a5 + 300086a: fec42783 lw a5,-20(s0) + 300086e: 8fd9 or a5,a5,a4 + 3000870: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data0.da_ref_temp_trim0 << 24U); /* Shift left by 24 bits */ + 3000874: fdc42783 lw a5,-36(s0) + 3000878: 83e1 srli a5,a5,0x18 + 300087a: 9f81 uxtb a5 + 300087c: 07e2 slli a5,a5,0x18 + 300087e: 873e mv a4,a5 + 3000880: fec42783 lw a5,-20(s0) + 3000884: 8fd9 or a5,a5,a4 + 3000886: fef42623 sw a5,-20(s0) + VREF->VREF_TRIM1.reg = value; + 300088a: 181007b7 lui a5,0x18100 + 300088e: fec42703 lw a4,-20(s0) + 3000892: c3f8 sw a4,68(a5) + + FOTP_INFO_RGN0_NUMBER_21 trimData21; + FOTP_InfoGet(FOTP_INFO_RNG0, 21U, (void *)&trimData21.comData); /* 21 is the number of trim data in otp */ + 3000894: fcc40793 addi a5,s0,-52 + 3000898: 863e mv a2,a5 + 300089a: 45d5 li a1,21 + 300089c: 4501 li a0,0 + 300089e: 290d jal ra,3000cd0 + /* ADC */ + ADC0->ADC_OEGE_TRIM.BIT.cfg_gain_cali_trim = trimData21.REG.data1.saradc_gain; + 30008a0: 18000737 lui a4,0x18000 + 30008a4: fd042783 lw a5,-48(s0) + 30008a8: 86be mv a3,a5 + 30008aa: 6789 lui a5,0x2 + 30008ac: 17fd addi a5,a5,-1 # 1fff + 30008ae: 8ff5 and a5,a5,a3 + 30008b0: 01079613 slli a2,a5,0x10 + 30008b4: 8241 srli a2,a2,0x10 + 30008b6: 6785 lui a5,0x1 + 30008b8: 973e add a4,a4,a5 + 30008ba: 80872783 lw a5,-2040(a4) # 17fff808 + 30008be: 6689 lui a3,0x2 + 30008c0: 16fd addi a3,a3,-1 # 1fff + 30008c2: 8ef1 and a3,a3,a2 + 30008c4: 06c2 slli a3,a3,0x10 + 30008c6: e0010637 lui a2,0xe0010 + 30008ca: 167d addi a2,a2,-1 # e000ffff + 30008cc: 8ff1 and a5,a5,a2 + 30008ce: 8fd5 or a5,a5,a3 + 30008d0: 80f72423 sw a5,-2040(a4) + ADC0->ADC_OEGE_TRIM.BIT.cfg_ofst_cali_trim = trimData21.REG.data1.saradc_offset; + 30008d4: 18000737 lui a4,0x18000 + 30008d8: fd042783 lw a5,-48(s0) + 30008dc: 83c1 srli a5,a5,0x10 + 30008de: 86be mv a3,a5 + 30008e0: 6785 lui a5,0x1 + 30008e2: 17fd addi a5,a5,-1 # fff + 30008e4: 8ff5 and a5,a5,a3 + 30008e6: 01079613 slli a2,a5,0x10 + 30008ea: 8241 srli a2,a2,0x10 + 30008ec: 6785 lui a5,0x1 + 30008ee: 973e add a4,a4,a5 + 30008f0: 80872783 lw a5,-2040(a4) # 17fff808 + 30008f4: 6685 lui a3,0x1 + 30008f6: 16fd addi a3,a3,-1 # fff + 30008f8: 8ef1 and a3,a3,a2 + 30008fa: 767d lui a2,0xfffff + 30008fc: 8ff1 and a5,a5,a2 + 30008fe: 8fd5 or a5,a5,a3 + 3000900: 80f72423 sw a5,-2040(a4) + + /* TSENSOR */ + TSENSOR->TSENSOR_TRIM.reg = trimData20.REG.data1.da_ref_vptat_trim; + 3000904: fe042783 lw a5,-32(s0) + 3000908: 83e1 srli a5,a5,0x18 + 300090a: 0ff7f713 andi a4,a5,255 + 300090e: 185007b7 lui a5,0x18500 + 3000912: cb98 sw a4,16(a5) + ADC0->ADC_TSENSOR_TRIM.BIT.cfg_tsensor_ofst_trim = trimData21.REG.data2.ts_offset; + 3000914: 18000737 lui a4,0x18000 + 3000918: fd442783 lw a5,-44(s0) + 300091c: 86be mv a3,a5 + 300091e: 6785 lui a5,0x1 + 3000920: 17fd addi a5,a5,-1 # fff + 3000922: 8ff5 and a5,a5,a3 + 3000924: 01079613 slli a2,a5,0x10 + 3000928: 8241 srli a2,a2,0x10 + 300092a: 6785 lui a5,0x1 + 300092c: 973e add a4,a4,a5 + 300092e: 80472783 lw a5,-2044(a4) # 17fff804 + 3000932: 6685 lui a3,0x1 + 3000934: 16fd addi a3,a3,-1 # fff + 3000936: 8ef1 and a3,a3,a2 + 3000938: 767d lui a2,0xfffff + 300093a: 8ff1 and a5,a5,a2 + 300093c: 8fd5 or a5,a5,a3 + 300093e: 80f72223 sw a5,-2044(a4) + CalculateGain(trimData21.REG.data3.ts_gain); + 3000942: fd842783 lw a5,-40(s0) + 3000946: 83a5 srli a5,a5,0x9 + 3000948: 853e mv a0,a5 + 300094a: 3509 jal ra,300074c + + /* PGA */ + PGA0->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga0_vos_trim; + 300094c: 18200737 lui a4,0x18200 + 3000950: fcc42783 lw a5,-52(s0) + 3000954: 1ff7f793 andi a5,a5,511 + 3000958: 01079693 slli a3,a5,0x10 + 300095c: 82c1 srli a3,a3,0x10 + 300095e: 531c lw a5,32(a4) + 3000960: 1ff6f693 andi a3,a3,511 + 3000964: e007f793 andi a5,a5,-512 + 3000968: 8fd5 or a5,a5,a3 + 300096a: d31c sw a5,32(a4) + PGA1->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga1_vos_trim; + 300096c: 18201737 lui a4,0x18201 + 3000970: fcc42783 lw a5,-52(s0) + 3000974: 83c1 srli a5,a5,0x10 + 3000976: 1ff7f793 andi a5,a5,511 + 300097a: 01079693 slli a3,a5,0x10 + 300097e: 82c1 srli a3,a3,0x10 + 3000980: 531c lw a5,32(a4) + 3000982: 1ff6f693 andi a3,a3,511 + 3000986: e007f793 andi a5,a5,-512 + 300098a: 8fd5 or a5,a5,a3 + 300098c: d31c sw a5,32(a4) + + FOTP_INFO_RGN0_NUMBER_22 trimData22; + FOTP_InfoGet(FOTP_INFO_RNG0, 22U, (void *)&trimData22.comData); /* 22 is the number of trim data in otp */ + 300098e: fbc40793 addi a5,s0,-68 + 3000992: 863e mv a2,a5 + 3000994: 45d9 li a1,22 + 3000996: 4501 li a0,0 + 3000998: 257d jal ra,3001046 + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_gain_trim2 = trimData22.REG.data0.pga0_gain2; + 300099a: 18000737 lui a4,0x18000 + 300099e: fbc42783 lw a5,-68(s0) + 30009a2: 86be mv a3,a5 + 30009a4: 6789 lui a5,0x2 + 30009a6: 17fd addi a5,a5,-1 # 1fff + 30009a8: 8ff5 and a5,a5,a3 + 30009aa: 01079613 slli a2,a5,0x10 + 30009ae: 8241 srli a2,a2,0x10 + 30009b0: 6785 lui a5,0x1 + 30009b2: 973e add a4,a4,a5 + 30009b4: 81472783 lw a5,-2028(a4) # 17fff814 + 30009b8: 6689 lui a3,0x2 + 30009ba: 16fd addi a3,a3,-1 # 1fff + 30009bc: 8ef1 and a3,a3,a2 + 30009be: 06c2 slli a3,a3,0x10 + 30009c0: e0010637 lui a2,0xe0010 + 30009c4: 167d addi a2,a2,-1 # e000ffff + 30009c6: 8ff1 and a5,a5,a2 + 30009c8: 8fd5 or a5,a5,a3 + 30009ca: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_ofst_trim2 = trimData22.REG.data0.pga0_offset2; + 30009ce: 18000737 lui a4,0x18000 + 30009d2: fbc42783 lw a5,-68(s0) + 30009d6: 83c1 srli a5,a5,0x10 + 30009d8: 86be mv a3,a5 + 30009da: 6785 lui a5,0x1 + 30009dc: 17fd addi a5,a5,-1 # fff + 30009de: 8ff5 and a5,a5,a3 + 30009e0: 01079613 slli a2,a5,0x10 + 30009e4: 8241 srli a2,a2,0x10 + 30009e6: 6785 lui a5,0x1 + 30009e8: 973e add a4,a4,a5 + 30009ea: 81472783 lw a5,-2028(a4) # 17fff814 + 30009ee: 6685 lui a3,0x1 + 30009f0: 16fd addi a3,a3,-1 # fff + 30009f2: 8ef1 and a3,a3,a2 + 30009f4: 767d lui a2,0xfffff + 30009f6: 8ff1 and a5,a5,a2 + 30009f8: 8fd5 or a5,a5,a3 + 30009fa: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_gain_trim4 = trimData22.REG.data1.pga0_gain4; + 30009fe: 18000737 lui a4,0x18000 + 3000a02: fc042783 lw a5,-64(s0) + 3000a06: 86be mv a3,a5 + 3000a08: 6789 lui a5,0x2 + 3000a0a: 17fd addi a5,a5,-1 # 1fff + 3000a0c: 8ff5 and a5,a5,a3 + 3000a0e: 01079613 slli a2,a5,0x10 + 3000a12: 8241 srli a2,a2,0x10 + 3000a14: 6785 lui a5,0x1 + 3000a16: 973e add a4,a4,a5 + 3000a18: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a1c: 6689 lui a3,0x2 + 3000a1e: 16fd addi a3,a3,-1 # 1fff + 3000a20: 8ef1 and a3,a3,a2 + 3000a22: 06c2 slli a3,a3,0x10 + 3000a24: e0010637 lui a2,0xe0010 + 3000a28: 167d addi a2,a2,-1 # e000ffff + 3000a2a: 8ff1 and a5,a5,a2 + 3000a2c: 8fd5 or a5,a5,a3 + 3000a2e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_ofst_trim4 = trimData22.REG.data1.pga0_offset4; + 3000a32: 18000737 lui a4,0x18000 + 3000a36: fc042783 lw a5,-64(s0) + 3000a3a: 83c1 srli a5,a5,0x10 + 3000a3c: 86be mv a3,a5 + 3000a3e: 6785 lui a5,0x1 + 3000a40: 17fd addi a5,a5,-1 # fff + 3000a42: 8ff5 and a5,a5,a3 + 3000a44: 01079613 slli a2,a5,0x10 + 3000a48: 8241 srli a2,a2,0x10 + 3000a4a: 6785 lui a5,0x1 + 3000a4c: 973e add a4,a4,a5 + 3000a4e: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a52: 6685 lui a3,0x1 + 3000a54: 16fd addi a3,a3,-1 # fff + 3000a56: 8ef1 and a3,a3,a2 + 3000a58: 767d lui a2,0xfffff + 3000a5a: 8ff1 and a5,a5,a2 + 3000a5c: 8fd5 or a5,a5,a3 + 3000a5e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_gain_trim8 = trimData22.REG.data2.pga0_gain8; + 3000a62: 18000737 lui a4,0x18000 + 3000a66: fc442783 lw a5,-60(s0) + 3000a6a: 86be mv a3,a5 + 3000a6c: 6789 lui a5,0x2 + 3000a6e: 17fd addi a5,a5,-1 # 1fff + 3000a70: 8ff5 and a5,a5,a3 + 3000a72: 01079613 slli a2,a5,0x10 + 3000a76: 8241 srli a2,a2,0x10 + 3000a78: 6785 lui a5,0x1 + 3000a7a: 973e add a4,a4,a5 + 3000a7c: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000a80: 6689 lui a3,0x2 + 3000a82: 16fd addi a3,a3,-1 # 1fff + 3000a84: 8ef1 and a3,a3,a2 + 3000a86: 06c2 slli a3,a3,0x10 + 3000a88: e0010637 lui a2,0xe0010 + 3000a8c: 167d addi a2,a2,-1 # e000ffff + 3000a8e: 8ff1 and a5,a5,a2 + 3000a90: 8fd5 or a5,a5,a3 + 3000a92: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_ofst_trim8 = trimData22.REG.data2.pga0_offset8; + 3000a96: 18000737 lui a4,0x18000 + 3000a9a: fc442783 lw a5,-60(s0) + 3000a9e: 83c1 srli a5,a5,0x10 + 3000aa0: 86be mv a3,a5 + 3000aa2: 6785 lui a5,0x1 + 3000aa4: 17fd addi a5,a5,-1 # fff + 3000aa6: 8ff5 and a5,a5,a3 + 3000aa8: 01079613 slli a2,a5,0x10 + 3000aac: 8241 srli a2,a2,0x10 + 3000aae: 6785 lui a5,0x1 + 3000ab0: 973e add a4,a4,a5 + 3000ab2: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000ab6: 6685 lui a3,0x1 + 3000ab8: 16fd addi a3,a3,-1 # fff + 3000aba: 8ef1 and a3,a3,a2 + 3000abc: 767d lui a2,0xfffff + 3000abe: 8ff1 and a5,a5,a2 + 3000ac0: 8fd5 or a5,a5,a3 + 3000ac2: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_gain_trim16 = trimData22.REG.data3.pga0_gain16; + 3000ac6: 18000737 lui a4,0x18000 + 3000aca: fc842783 lw a5,-56(s0) + 3000ace: 86be mv a3,a5 + 3000ad0: 6789 lui a5,0x2 + 3000ad2: 17fd addi a5,a5,-1 # 1fff + 3000ad4: 8ff5 and a5,a5,a3 + 3000ad6: 01079613 slli a2,a5,0x10 + 3000ada: 8241 srli a2,a2,0x10 + 3000adc: 6785 lui a5,0x1 + 3000ade: 973e add a4,a4,a5 + 3000ae0: 82072783 lw a5,-2016(a4) # 17fff820 + 3000ae4: 6689 lui a3,0x2 + 3000ae6: 16fd addi a3,a3,-1 # 1fff + 3000ae8: 8ef1 and a3,a3,a2 + 3000aea: 06c2 slli a3,a3,0x10 + 3000aec: e0010637 lui a2,0xe0010 + 3000af0: 167d addi a2,a2,-1 # e000ffff + 3000af2: 8ff1 and a5,a5,a2 + 3000af4: 8fd5 or a5,a5,a3 + 3000af6: 82f72023 sw a5,-2016(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_ofst_trim16 = trimData22.REG.data3.pga0_offset16; + 3000afa: 18000737 lui a4,0x18000 + 3000afe: fc842783 lw a5,-56(s0) + 3000b02: 83c1 srli a5,a5,0x10 + 3000b04: 86be mv a3,a5 + 3000b06: 6785 lui a5,0x1 + 3000b08: 17fd addi a5,a5,-1 # fff + 3000b0a: 8ff5 and a5,a5,a3 + 3000b0c: 01079613 slli a2,a5,0x10 + 3000b10: 8241 srli a2,a2,0x10 + 3000b12: 6785 lui a5,0x1 + 3000b14: 973e add a4,a4,a5 + 3000b16: 82072783 lw a5,-2016(a4) # 17fff820 + 3000b1a: 6685 lui a3,0x1 + 3000b1c: 16fd addi a3,a3,-1 # fff + 3000b1e: 8ef1 and a3,a3,a2 + 3000b20: 767d lui a2,0xfffff + 3000b22: 8ff1 and a5,a5,a2 + 3000b24: 8fd5 or a5,a5,a3 + 3000b26: 82f72023 sw a5,-2016(a4) + + FOTP_INFO_RGN0_NUMBER_23 trimData23; + FOTP_InfoGet(FOTP_INFO_RNG0, 23U, (void *)&trimData23.comData); /* 23 is the number of trim data in otp */ + 3000b2a: fac40793 addi a5,s0,-84 + 3000b2e: 863e mv a2,a5 + 3000b30: 45dd li a1,23 + 3000b32: 4501 li a0,0 + 3000b34: 2b09 jal ra,3001046 + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_gain_trim2 = trimData23.REG.data0.pga1_gain2; + 3000b36: 18000737 lui a4,0x18000 + 3000b3a: fac42783 lw a5,-84(s0) + 3000b3e: 86be mv a3,a5 + 3000b40: 6789 lui a5,0x2 + 3000b42: 17fd addi a5,a5,-1 # 1fff + 3000b44: 8ff5 and a5,a5,a3 + 3000b46: 01079613 slli a2,a5,0x10 + 3000b4a: 8241 srli a2,a2,0x10 + 3000b4c: 6785 lui a5,0x1 + 3000b4e: 973e add a4,a4,a5 + 3000b50: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b54: 6689 lui a3,0x2 + 3000b56: 16fd addi a3,a3,-1 # 1fff + 3000b58: 8ef1 and a3,a3,a2 + 3000b5a: 06c2 slli a3,a3,0x10 + 3000b5c: e0010637 lui a2,0xe0010 + 3000b60: 167d addi a2,a2,-1 # e000ffff + 3000b62: 8ff1 and a5,a5,a2 + 3000b64: 8fd5 or a5,a5,a3 + 3000b66: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_ofst_trim2 = trimData23.REG.data0.pga1_offset2; + 3000b6a: 18000737 lui a4,0x18000 + 3000b6e: fac42783 lw a5,-84(s0) + 3000b72: 83c1 srli a5,a5,0x10 + 3000b74: 86be mv a3,a5 + 3000b76: 6785 lui a5,0x1 + 3000b78: 17fd addi a5,a5,-1 # fff + 3000b7a: 8ff5 and a5,a5,a3 + 3000b7c: 01079613 slli a2,a5,0x10 + 3000b80: 8241 srli a2,a2,0x10 + 3000b82: 6785 lui a5,0x1 + 3000b84: 973e add a4,a4,a5 + 3000b86: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b8a: 6685 lui a3,0x1 + 3000b8c: 16fd addi a3,a3,-1 # fff + 3000b8e: 8ef1 and a3,a3,a2 + 3000b90: 767d lui a2,0xfffff + 3000b92: 8ff1 and a5,a5,a2 + 3000b94: 8fd5 or a5,a5,a3 + 3000b96: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_gain_trim4 = trimData23.REG.data1.pga1_gain4; + 3000b9a: 18000737 lui a4,0x18000 + 3000b9e: fb042783 lw a5,-80(s0) + 3000ba2: 86be mv a3,a5 + 3000ba4: 6789 lui a5,0x2 + 3000ba6: 17fd addi a5,a5,-1 # 1fff + 3000ba8: 8ff5 and a5,a5,a3 + 3000baa: 01079613 slli a2,a5,0x10 + 3000bae: 8241 srli a2,a2,0x10 + 3000bb0: 6785 lui a5,0x1 + 3000bb2: 973e add a4,a4,a5 + 3000bb4: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bb8: 6689 lui a3,0x2 + 3000bba: 16fd addi a3,a3,-1 # 1fff + 3000bbc: 8ef1 and a3,a3,a2 + 3000bbe: 06c2 slli a3,a3,0x10 + 3000bc0: e0010637 lui a2,0xe0010 + 3000bc4: 167d addi a2,a2,-1 # e000ffff + 3000bc6: 8ff1 and a5,a5,a2 + 3000bc8: 8fd5 or a5,a5,a3 + 3000bca: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_ofst_trim4 = trimData23.REG.data1.pga1_offset4; + 3000bce: 18000737 lui a4,0x18000 + 3000bd2: fb042783 lw a5,-80(s0) + 3000bd6: 83c1 srli a5,a5,0x10 + 3000bd8: 86be mv a3,a5 + 3000bda: 6785 lui a5,0x1 + 3000bdc: 17fd addi a5,a5,-1 # fff + 3000bde: 8ff5 and a5,a5,a3 + 3000be0: 01079613 slli a2,a5,0x10 + 3000be4: 8241 srli a2,a2,0x10 + 3000be6: 6785 lui a5,0x1 + 3000be8: 973e add a4,a4,a5 + 3000bea: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bee: 6685 lui a3,0x1 + 3000bf0: 16fd addi a3,a3,-1 # fff + 3000bf2: 8ef1 and a3,a3,a2 + 3000bf4: 767d lui a2,0xfffff + 3000bf6: 8ff1 and a5,a5,a2 + 3000bf8: 8fd5 or a5,a5,a3 + 3000bfa: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_gain_trim8 = trimData23.REG.data2.pga1_gain8; + 3000bfe: 18000737 lui a4,0x18000 + 3000c02: fb442783 lw a5,-76(s0) + 3000c06: 86be mv a3,a5 + 3000c08: 6789 lui a5,0x2 + 3000c0a: 17fd addi a5,a5,-1 # 1fff + 3000c0c: 8ff5 and a5,a5,a3 + 3000c0e: 01079613 slli a2,a5,0x10 + 3000c12: 8241 srli a2,a2,0x10 + 3000c14: 6785 lui a5,0x1 + 3000c16: 973e add a4,a4,a5 + 3000c18: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c1c: 6689 lui a3,0x2 + 3000c1e: 16fd addi a3,a3,-1 # 1fff + 3000c20: 8ef1 and a3,a3,a2 + 3000c22: 06c2 slli a3,a3,0x10 + 3000c24: e0010637 lui a2,0xe0010 + 3000c28: 167d addi a2,a2,-1 # e000ffff + 3000c2a: 8ff1 and a5,a5,a2 + 3000c2c: 8fd5 or a5,a5,a3 + 3000c2e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_ofst_trim8 = trimData23.REG.data2.pga1_offset8; + 3000c32: 18000737 lui a4,0x18000 + 3000c36: fb442783 lw a5,-76(s0) + 3000c3a: 83c1 srli a5,a5,0x10 + 3000c3c: 86be mv a3,a5 + 3000c3e: 6785 lui a5,0x1 + 3000c40: 17fd addi a5,a5,-1 # fff + 3000c42: 8ff5 and a5,a5,a3 + 3000c44: 01079613 slli a2,a5,0x10 + 3000c48: 8241 srli a2,a2,0x10 + 3000c4a: 6785 lui a5,0x1 + 3000c4c: 973e add a4,a4,a5 + 3000c4e: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c52: 6685 lui a3,0x1 + 3000c54: 16fd addi a3,a3,-1 # fff + 3000c56: 8ef1 and a3,a3,a2 + 3000c58: 767d lui a2,0xfffff + 3000c5a: 8ff1 and a5,a5,a2 + 3000c5c: 8fd5 or a5,a5,a3 + 3000c5e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_gain_trim16 = trimData23.REG.data3.pga1_gain16; + 3000c62: 18000737 lui a4,0x18000 + 3000c66: fb842783 lw a5,-72(s0) + 3000c6a: 86be mv a3,a5 + 3000c6c: 6789 lui a5,0x2 + 3000c6e: 17fd addi a5,a5,-1 # 1fff + 3000c70: 8ff5 and a5,a5,a3 + 3000c72: 01079613 slli a2,a5,0x10 + 3000c76: 8241 srli a2,a2,0x10 + 3000c78: 6785 lui a5,0x1 + 3000c7a: 973e add a4,a4,a5 + 3000c7c: 83072783 lw a5,-2000(a4) # 17fff830 + 3000c80: 6689 lui a3,0x2 + 3000c82: 16fd addi a3,a3,-1 # 1fff + 3000c84: 8ef1 and a3,a3,a2 + 3000c86: 06c2 slli a3,a3,0x10 + 3000c88: e0010637 lui a2,0xe0010 + 3000c8c: 167d addi a2,a2,-1 # e000ffff + 3000c8e: 8ff1 and a5,a5,a2 + 3000c90: 8fd5 or a5,a5,a3 + 3000c92: 82f72823 sw a5,-2000(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_ofst_trim16 = trimData23.REG.data3.pga1_offset16; + 3000c96: 18000737 lui a4,0x18000 + 3000c9a: fb842783 lw a5,-72(s0) + 3000c9e: 83c1 srli a5,a5,0x10 + 3000ca0: 86be mv a3,a5 + 3000ca2: 6785 lui a5,0x1 + 3000ca4: 17fd addi a5,a5,-1 # fff + 3000ca6: 8ff5 and a5,a5,a3 + 3000ca8: 01079613 slli a2,a5,0x10 + 3000cac: 8241 srli a2,a2,0x10 + 3000cae: 6785 lui a5,0x1 + 3000cb0: 973e add a4,a4,a5 + 3000cb2: 83072783 lw a5,-2000(a4) # 17fff830 + 3000cb6: 6685 lui a3,0x1 + 3000cb8: 16fd addi a3,a3,-1 # fff + 3000cba: 8ef1 and a3,a3,a2 + 3000cbc: 767d lui a2,0xfffff + 3000cbe: 8ff1 and a5,a5,a2 + 3000cc0: 8fd5 or a5,a5,a3 + 3000cc2: 82f72823 sw a5,-2000(a4) +} + 3000cc6: 0001 nop + 3000cc8: 40f6 lw ra,92(sp) + 3000cca: 4466 lw s0,88(sp) + 3000ccc: 6125 addi sp,sp,96 + 3000cce: 8082 ret + +03000cd0 : + 3000cd0: 3760006f j 3001046 + +03000cd4 : + * @brief Parameter calibration entry of the analog module. + * @param None + * @retval None + */ +void ANATRIM_Entry(void) +{ + 3000cd4: 1141 addi sp,sp,-16 + 3000cd6: c606 sw ra,12(sp) + 3000cd8: c422 sw s0,8(sp) + 3000cda: 0800 addi s0,sp,16 + if (CHIP_GetInfo() == false) { /* If the chip information is incorrect, calibration is not performed */ + 3000cdc: 3c79 jal ra,300077a + 3000cde: 87aa mv a5,a0 + 3000ce0: 0017c793 xori a5,a5,1 + 3000ce4: 9f81 uxtb a5 + 3000ce6: eb9d bnez a5,3000d1c + return; + } + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_ENABLE); /* Enable the clock for calibration */ + 3000ce8: 4585 li a1,1 + 3000cea: 18000537 lui a0,0x18000 + 3000cee: 2849 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_ENABLE); + 3000cf0: 4585 li a1,1 + 3000cf2: 18200537 lui a0,0x18200 + 3000cf6: 2069 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_ENABLE); + 3000cf8: 4585 li a1,1 + 3000cfa: 18201537 lui a0,0x18201 + 3000cfe: 2049 jal ra,3000d80 + CHIP_AnalogTrim(); + 3000d00: 34d1 jal ra,30007c4 + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_DISABLE); /* The clock is disabled after calibration */ + 3000d02: 4581 li a1,0 + 3000d04: 18000537 lui a0,0x18000 + 3000d08: 28a5 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_DISABLE); + 3000d0a: 4581 li a1,0 + 3000d0c: 18200537 lui a0,0x18200 + 3000d10: 2885 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_DISABLE); + 3000d12: 4581 li a1,0 + 3000d14: 18201537 lui a0,0x18201 + 3000d18: 20a5 jal ra,3000d80 + 3000d1a: a011 j 3000d1e + return; + 3000d1c: 0001 nop + 3000d1e: 40b2 lw ra,12(sp) + 3000d20: 4422 lw s0,8(sp) + 3000d22: 0141 addi sp,sp,16 + 3000d24: 8082 ret + +03000d26 : + * @brief Set Crg Core clock select + * @param None + * @retval None + */ +void ANAVREF_Init(void) +{ + 3000d26: 1141 addi sp,sp,-16 + 3000d28: c606 sw ra,12(sp) + 3000d2a: c422 sw s0,8(sp) + 3000d2c: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(VREF_BASE, IP_CLK_ENABLE); + 3000d2e: 4585 li a1,1 + 3000d30: 18100537 lui a0,0x18100 + 3000d34: 20b1 jal ra,3000d80 + VREF->VREF_CTRL1.BIT.da_ref_temp_trim_enh = 0x1; + 3000d36: 18100737 lui a4,0x18100 + 3000d3a: 531c lw a5,32(a4) + 3000d3c: 66c1 lui a3,0x10 + 3000d3e: 8fd5 or a5,a5,a3 + 3000d40: d31c sw a5,32(a4) + VREF->VREF_CTRL0.BIT.da_ref_enh = BASE_CFG_ENABLE; + 3000d42: 18100737 lui a4,0x18100 + 3000d46: 431c lw a5,0(a4) + 3000d48: 0017e793 ori a5,a5,1 + 3000d4c: c31c sw a5,0(a4) + BASE_FUNC_DELAY_US(200); /* delay 200us */ + 3000d4e: 000f47b7 lui a5,0xf4 + 3000d52: 24078593 addi a1,a5,576 # f4240 + 3000d56: 0c800513 li a0,200 + 3000d5a: 20b5 jal ra,3000dc6 + VREF->VREF_CTRL1.BIT.da_ref_chop_enh = BASE_CFG_ENABLE; + 3000d5c: 18100737 lui a4,0x18100 + 3000d60: 531c lw a5,32(a4) + 3000d62: 0017e793 ori a5,a5,1 + 3000d66: d31c sw a5,32(a4) + BASE_FUNC_DELAY_US(40); /* delay 40us */ + 3000d68: 000f47b7 lui a5,0xf4 + 3000d6c: 24078593 addi a1,a5,576 # f4240 + 3000d70: 02800513 li a0,40 + 3000d74: 2889 jal ra,3000dc6 + 3000d76: 0001 nop + 3000d78: 40b2 lw ra,12(sp) + 3000d7a: 4422 lw s0,8(sp) + 3000d7c: 0141 addi sp,sp,16 + 3000d7e: 8082 ret + +03000d80 : + 3000d80: 57a0206f j 30032fa + +03000d84 : + * @brief Set Crg Core clock select + * @param coreClkSelect Input core clock select value + * @retval None + */ +void CRG_SetCoreClockSelect(CRG_CoreClkSelect coreClkSelect) +{ + 3000d84: 715d addi sp,sp,-80 + 3000d86: c686 sw ra,76(sp) + 3000d88: c4a2 sw s0,72(sp) + 3000d8a: 0880 addi s0,sp,80 + 3000d8c: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3000d90: 100007b7 lui a5,0x10000 + 3000d94: fcf42423 sw a5,-56(s0) + crg.coreClkSelect = coreClkSelect; + 3000d98: fbc42783 lw a5,-68(s0) + 3000d9c: fef42023 sw a5,-32(s0) + if (crg.coreClkSelect == CRG_CORE_CLK_SELECT_TCXO) { /* If an external crystal oscillator is selected. */ + 3000da0: fe042703 lw a4,-32(s0) + 3000da4: 4785 li a5,1 + 3000da6: 00f71663 bne a4,a5,3000db2 + BASE_FUNC_DELAY_MS(10); /* 10: delay 10ms, wait clokc stable. */ + 3000daa: 3e800593 li a1,1000 + 3000dae: 4529 li a0,10 + 3000db0: 2819 jal ra,3000dc6 + } + HAL_CRG_SetCoreClockSelect(&crg); + 3000db2: fc840793 addi a5,s0,-56 + 3000db6: 853e mv a0,a5 + 3000db8: 23a020ef jal ra,3002ff2 + 3000dbc: 0001 nop + 3000dbe: 40b6 lw ra,76(sp) + 3000dc0: 4426 lw s0,72(sp) + 3000dc2: 6161 addi sp,sp,80 + 3000dc4: 8082 ret + +03000dc6 : + 3000dc6: 1de0106f j 3001fa4 + +03000dca : + * @param frequence frequnce + * @param div Output Divison + * @retval None + */ +static void SetFlashDiv(unsigned int frequency, unsigned int *nreadDiv) +{ + 3000dca: 7179 addi sp,sp,-48 + 3000dcc: d622 sw s0,44(sp) + 3000dce: 1800 addi s0,sp,48 + 3000dd0: fca42e23 sw a0,-36(s0) + 3000dd4: fcb42c23 sw a1,-40(s0) + unsigned int div; + unsigned int freq = frequency; + 3000dd8: fdc42783 lw a5,-36(s0) + 3000ddc: fef42423 sw a5,-24(s0) + /* Get frequency divider of flash. */ + if (freq < FLASH_BASE_FREQ) { + 3000de0: fe842703 lw a4,-24(s0) + 3000de4: 023c37b7 lui a5,0x23c3 + 3000de8: 45f78793 addi a5,a5,1119 # 23c345f + 3000dec: 00e7e863 bltu a5,a4,3000dfc + freq = FLASH_BASE_FREQ; + 3000df0: 023c37b7 lui a5,0x23c3 + 3000df4: 46078793 addi a5,a5,1120 # 23c3460 + 3000df8: fef42423 sw a5,-24(s0) + } + /* Get the flash frequency division based on the frequency. */ + if ((freq % FLASH_BASE_FREQ) == 0) { + 3000dfc: fe842703 lw a4,-24(s0) + 3000e00: 023c37b7 lui a5,0x23c3 + 3000e04: 46078793 addi a5,a5,1120 # 23c3460 + 3000e08: 02f777b3 remu a5,a4,a5 + 3000e0c: ef81 bnez a5,3000e24 + div = freq / FLASH_BASE_FREQ; + 3000e0e: fe842703 lw a4,-24(s0) + 3000e12: 023c37b7 lui a5,0x23c3 + 3000e16: 46078793 addi a5,a5,1120 # 23c3460 + 3000e1a: 02f757b3 divu a5,a4,a5 + 3000e1e: fef42623 sw a5,-20(s0) + 3000e22: a821 j 3000e3a + } else { + div = (freq / FLASH_BASE_FREQ) + 1; + 3000e24: fe842703 lw a4,-24(s0) + 3000e28: 023c37b7 lui a5,0x23c3 + 3000e2c: 46078793 addi a5,a5,1120 # 23c3460 + 3000e30: 02f757b3 divu a5,a4,a5 + 3000e34: 0785 addi a5,a5,1 + 3000e36: fef42623 sw a5,-20(s0) + } + /* Ensure the flash frequency division is valid. */ + if (div > FLASH_MAX_DIV) { + 3000e3a: fec42703 lw a4,-20(s0) + 3000e3e: 4791 li a5,4 + 3000e40: 00e7f563 bgeu a5,a4,3000e4a + div = FLASH_MAX_DIV; + 3000e44: 4791 li a5,4 + 3000e46: fef42623 sw a5,-20(s0) + } + *nreadDiv = div; + 3000e4a: fd842783 lw a5,-40(s0) + 3000e4e: fec42703 lw a4,-20(s0) + 3000e52: c398 sw a4,0(a5) +} + 3000e54: 0001 nop + 3000e56: 5432 lw s0,44(sp) + 3000e58: 6145 addi sp,sp,48 + 3000e5a: 8082 ret + +03000e5c : + * @brief Get the Rounding up value + * @param coreClkSelect Core Clock select + * @retval Frequency of Flash + */ +static unsigned int GetFlashFreq(CRG_CoreClkSelect coreClkSelect) +{ + 3000e5c: 7179 addi sp,sp,-48 + 3000e5e: d606 sw ra,44(sp) + 3000e60: d422 sw s0,40(sp) + 3000e62: 1800 addi s0,sp,48 + 3000e64: fca42e23 sw a0,-36(s0) + unsigned int hclk; + /* Get frequency of flash. */ + switch (coreClkSelect) { + 3000e68: fdc42783 lw a5,-36(s0) + 3000e6c: 4705 li a4,1 + 3000e6e: 02e78063 beq a5,a4,3000e8e + 3000e72: 4705 li a4,1 + 3000e74: 00e7e663 bltu a5,a4,3000e80 + 3000e78: 4709 li a4,2 + 3000e7a: 02e78163 beq a5,a4,3000e9c + 3000e7e: a025 j 3000ea6 + case CRG_CORE_CLK_SELECT_HOSC: + hclk = HOSC_FREQ; + 3000e80: 017d87b7 lui a5,0x17d8 + 3000e84: 84078793 addi a5,a5,-1984 # 17d7840 + 3000e88: fef42623 sw a5,-20(s0) + break; + 3000e8c: a01d j 3000eb2 + case CRG_CORE_CLK_SELECT_TCXO: + hclk = XTRAIL_FREQ; + 3000e8e: 01c9c7b7 lui a5,0x1c9c + 3000e92: 38078793 addi a5,a5,896 # 1c9c380 + 3000e96: fef42623 sw a5,-20(s0) + break; + 3000e9a: a821 j 3000eb2 + case CRG_CORE_CLK_SELECT_PLL: + hclk = HAL_CRG_GetPllFreq(); + 3000e9c: 278020ef jal ra,3003114 + 3000ea0: fea42623 sw a0,-20(s0) + break; + 3000ea4: a039 j 3000eb2 + default: + hclk = LOSC_FREQ; + 3000ea6: 67a1 lui a5,0x8 + 3000ea8: d0078793 addi a5,a5,-768 # 7d00 + 3000eac: fef42623 sw a5,-20(s0) + break; + 3000eb0: 0001 nop + } + return hclk; + 3000eb2: fec42783 lw a5,-20(s0) +} + 3000eb6: 853e mv a0,a5 + 3000eb8: 50b2 lw ra,44(sp) + 3000eba: 5422 lw s0,40(sp) + 3000ebc: 6145 addi sp,sp,48 + 3000ebe: 8082 ret + +03000ec0 : + * @brief Set flash clock frequence base on hclk + * @param coreClkSelect core clock select + * @retval None + */ +void FLASH_ClockConfig(CRG_CoreClkSelect coreClkSelect) +{ + 3000ec0: 7179 addi sp,sp,-48 + 3000ec2: d606 sw ra,44(sp) + 3000ec4: d422 sw s0,40(sp) + 3000ec6: 1800 addi s0,sp,48 + 3000ec8: fca42e23 sw a0,-36(s0) + EFC_RegStruct *efc = EFC; + 3000ecc: 147107b7 lui a5,0x14710 + 3000ed0: fef42623 sw a5,-20(s0) + EFLASH_CLK_CFG_REG cfg; + unsigned int hclk; + unsigned int nreadDiv; + + /* Step 1: Set nread_div */ + hclk = GetFlashFreq(coreClkSelect); + 3000ed4: fdc42503 lw a0,-36(s0) + 3000ed8: 3751 jal ra,3000e5c + 3000eda: fea42423 sw a0,-24(s0) + cfg.reg = efc->EFLASH_CLK_CFG.reg; + 3000ede: fec42703 lw a4,-20(s0) + 3000ee2: 6785 lui a5,0x1 + 3000ee4: 97ba add a5,a5,a4 + 3000ee6: 9407a783 lw a5,-1728(a5) # 940 + 3000eea: fef42223 sw a5,-28(s0) + SetFlashDiv(hclk, &nreadDiv); + 3000eee: fe040793 addi a5,s0,-32 + 3000ef2: 85be mv a1,a5 + 3000ef4: fe842503 lw a0,-24(s0) + 3000ef8: 3dc9 jal ra,3000dca + cfg.BIT.nread_div = nreadDiv; + 3000efa: fe042783 lw a5,-32(s0) + 3000efe: 8bbd andi a5,a5,15 + 3000f00: 0ff7f713 andi a4,a5,255 + 3000f04: fe442783 lw a5,-28(s0) + 3000f08: 8b3d andi a4,a4,15 + 3000f0a: 0712 slli a4,a4,0x4 + 3000f0c: f0f7f793 andi a5,a5,-241 + 3000f10: 8fd9 or a5,a5,a4 + 3000f12: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f16: fe442783 lw a5,-28(s0) + 3000f1a: 00100737 lui a4,0x100 + 3000f1e: 8fd9 or a5,a5,a4 + 3000f20: fef42223 sw a5,-28(s0) + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f24: fe442783 lw a5,-28(s0) + 3000f28: 00400737 lui a4,0x400 + 3000f2c: 8fd9 or a5,a5,a4 + 3000f2e: fef42223 sw a5,-28(s0) + + /* Step 2: Wait Busclk_sw_req */ + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f32: fe442783 lw a5,-28(s0) + 3000f36: 00400737 lui a4,0x400 + 3000f3a: 8fd9 or a5,a5,a4 + 3000f3c: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f40: fe442783 lw a5,-28(s0) + 3000f44: 00100737 lui a4,0x100 + 3000f48: 8fd9 or a5,a5,a4 + 3000f4a: fef42223 sw a5,-28(s0) + efc->EFLASH_CLK_CFG.reg = cfg.reg; + 3000f4e: fe442703 lw a4,-28(s0) + 3000f52: fec42683 lw a3,-20(s0) + 3000f56: 6785 lui a5,0x1 + 3000f58: 97b6 add a5,a5,a3 + 3000f5a: 94e7a023 sw a4,-1728(a5) # 940 + while (efc->EFLASH_CLK_CFG.BIT.busclk_sw_req == BASE_CFG_SET) { + 3000f5e: 0001 nop + 3000f60: fec42703 lw a4,-20(s0) + 3000f64: 6785 lui a5,0x1 + 3000f66: 97ba add a5,a5,a4 + 3000f68: 9407a783 lw a5,-1728(a5) # 940 + 3000f6c: 83d1 srli a5,a5,0x14 + 3000f6e: 8b85 andi a5,a5,1 + 3000f70: 0ff7f713 andi a4,a5,255 + 3000f74: 4785 li a5,1 + 3000f76: fef705e3 beq a4,a5,3000f60 + ; + } + 3000f7a: 0001 nop + 3000f7c: 50b2 lw ra,44(sp) + 3000f7e: 5422 lw s0,40(sp) + 3000f80: 6145 addi sp,sp,48 + 3000f82: 8082 ret + +03000f84 : + * @brief Init the systick + * @param None + * @retval None + */ +void SYSTICK_Init(void) +{ + 3000f84: 1141 addi sp,sp,-16 + 3000f86: c622 sw s0,12(sp) + 3000f88: 0800 addi s0,sp,16 + SYSTICK->TIMER_CTRL.reg = 0; + 3000f8a: 143807b7 lui a5,0x14380 + 3000f8e: 0007a023 sw zero,0(a5) # 14380000 + SYSTICK->TIMER_CTRL.BIT.enable = 1; + 3000f92: 14380737 lui a4,0x14380 + 3000f96: 431c lw a5,0(a4) + 3000f98: 0017e793 ori a5,a5,1 + 3000f9c: c31c sw a5,0(a4) +} + 3000f9e: 0001 nop + 3000fa0: 4432 lw s0,12(sp) + 3000fa2: 0141 addi sp,sp,16 + 3000fa4: 8082 ret + +03000fa6 : + * @brief Get the Systick frep(Hz) + * @param None + * @retval Clock frep of systick(Hz) + */ +unsigned int SYSTICK_GetCRGHZ(void) +{ + 3000fa6: 1141 addi sp,sp,-16 + 3000fa8: c606 sw ra,12(sp) + 3000faa: c422 sw s0,8(sp) + 3000fac: 0800 addi s0,sp,16 + /* Get the Systick IP */ + return HAL_CRG_GetIpFreq(SYSTICK_BASE); + 3000fae: 14380537 lui a0,0x14380 + 3000fb2: 264020ef jal ra,3003216 + 3000fb6: 87aa mv a5,a0 + 3000fb8: 853e mv a0,a5 + 3000fba: 40b2 lw ra,12(sp) + 3000fbc: 4422 lw s0,8(sp) + 3000fbe: 0141 addi sp,sp,16 + 3000fc0: 8082 ret + +03000fc2 : + * @param efc Flash control register base address + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +static unsigned int FOTP_CheckReadStatus(EFC_RegStruct *efc) +{ + 3000fc2: 1101 addi sp,sp,-32 + 3000fc4: ce22 sw s0,28(sp) + 3000fc6: 1000 addi s0,sp,32 + 3000fc8: fea42623 sw a0,-20(s0) + /* Check for errors in the flash reading process. */ + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fcc: fec42783 lw a5,-20(s0) + 3000fd0: 1007a783 lw a5,256(a5) + 3000fd4: 83c1 srli a5,a5,0x10 + 3000fd6: 8b85 andi a5,a5,1 + 3000fd8: 9f81 uxtb a5 + 3000fda: e38d bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000fdc: fec42783 lw a5,-20(s0) + 3000fe0: 1007a783 lw a5,256(a5) + 3000fe4: 83cd srli a5,a5,0x13 + 3000fe6: 8b85 andi a5,a5,1 + 3000fe8: 9f81 uxtb a5 + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fea: eb89 bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_chk) { + 3000fec: fec42783 lw a5,-20(s0) + 3000ff0: 1007a783 lw a5,256(a5) + 3000ff4: 83d1 srli a5,a5,0x14 + 3000ff6: 8b85 andi a5,a5,1 + 3000ff8: 9f81 uxtb a5 + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000ffa: c3a9 beqz a5,300103c + efc->INT_CLEAR.BIT.int_clr_err_ecc_corr = BASE_CFG_SET; + 3000ffc: fec42703 lw a4,-20(s0) + 3001000: 10c72783 lw a5,268(a4) # 1438010c + 3001004: 000806b7 lui a3,0x80 + 3001008: 8fd5 or a5,a5,a3 + 300100a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_illegal = BASE_CFG_SET; + 300100e: fec42703 lw a4,-20(s0) + 3001012: 10c72783 lw a5,268(a4) + 3001016: 66c1 lui a3,0x10 + 3001018: 8fd5 or a5,a5,a3 + 300101a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_ecc_chk = BASE_CFG_SET; + 300101e: fec42703 lw a4,-20(s0) + 3001022: 10c72783 lw a5,268(a4) + 3001026: 001006b7 lui a3,0x100 + 300102a: 8fd5 or a5,a5,a3 + 300102c: 10f72623 sw a5,268(a4) + efc->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001030: fec42783 lw a5,-20(s0) + 3001034: 2007a023 sw zero,512(a5) + return BASE_STATUS_ERROR; + 3001038: 4785 li a5,1 + 300103a: a011 j 300103e + } + return BASE_STATUS_OK; + 300103c: 4781 li a5,0 +} + 300103e: 853e mv a0,a5 + 3001040: 4472 lw s0,28(sp) + 3001042: 6105 addi sp,sp,32 + 3001044: 8082 ret + +03001046 : + * @param buf Buffer of read data + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +unsigned int FOTP_InfoGet(FOTP_InfoRngType type, unsigned int index, FOTP_CommonData *buf) +{ + 3001046: 7179 addi sp,sp,-48 + 3001048: d606 sw ra,44(sp) + 300104a: d422 sw s0,40(sp) + 300104c: 1800 addi s0,sp,48 + 300104e: fca42e23 sw a0,-36(s0) + 3001052: fcb42c23 sw a1,-40(s0) + 3001056: fcc42a23 sw a2,-44(s0) + EFC_RegStruct *p = EFC; + 300105a: 147107b7 lui a5,0x14710 + 300105e: fef42423 sw a5,-24(s0) + unsigned int addr; + + if (buf == NULL) { + 3001062: fd442783 lw a5,-44(s0) + 3001066: e399 bnez a5,300106c + return BASE_STATUS_ERROR; + 3001068: 4785 li a5,1 + 300106a: aa15 j 300119e + } + + if ((type >= FOTP_INFO_MAXTYPE) || (index > FOTP_INFO_REG_MAX_ID)) { + 300106c: fdc42703 lw a4,-36(s0) + 3001070: 4785 li a5,1 + 3001072: 00e7e763 bltu a5,a4,3001080 + 3001076: fd842703 lw a4,-40(s0) + 300107a: 47e5 li a5,25 + 300107c: 00e7f463 bgeu a5,a4,3001084 + return BASE_STATUS_ERROR; + 3001080: 4785 li a5,1 + 3001082: aa31 j 300119e + } + + /* If there is a read command, return */ + if (p->EFLASH_CMD.BIT.cmd_start) { + 3001084: fe842783 lw a5,-24(s0) + 3001088: 439c lw a5,0(a5) + 300108a: 8b85 andi a5,a5,1 + 300108c: 9f81 uxtb a5 + 300108e: c399 beqz a5,3001094 + return BASE_STATUS_ERROR; + 3001090: 4785 li a5,1 + 3001092: a231 j 300119e + } + + p->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; + 3001094: fe842783 lw a5,-24(s0) + 3001098: fedcc737 lui a4,0xfedcc + 300109c: a9870713 addi a4,a4,-1384 # fedcba98 + 30010a0: 20e7a023 sw a4,512(a5) # 14710200 + + /* Configure the read command parameters and start the read command */ + addr = (type == FOTP_INFO_RNG0) ? FOTP_INFO_RNG0_BASEADDR : FOTP_INFO_RNG1_BASEADDR; + 30010a4: fdc42783 lw a5,-36(s0) + 30010a8: e781 bnez a5,30010b0 + 30010aa: 008007b7 lui a5,0x800 + 30010ae: a019 j 30010b4 + 30010b0: 008017b7 lui a5,0x801 + 30010b4: fef42223 sw a5,-28(s0) + addr += index * REG_WORDS_NUM; + 30010b8: fd842783 lw a5,-40(s0) + 30010bc: 0792 slli a5,a5,0x4 + 30010be: fe442703 lw a4,-28(s0) + 30010c2: 97ba add a5,a5,a4 + 30010c4: fef42223 sw a5,-28(s0) + p->EFLASH_ADDR.BIT.cmd_addr = addr >> 2; /* Right shift 2 bit change to word */ + 30010c8: fe442783 lw a5,-28(s0) + 30010cc: 0027d713 srli a4,a5,0x2 + 30010d0: 004007b7 lui a5,0x400 + 30010d4: 17fd addi a5,a5,-1 # 3fffff + 30010d6: 00f77633 and a2,a4,a5 + 30010da: fe842703 lw a4,-24(s0) + 30010de: 435c lw a5,4(a4) + 30010e0: 004006b7 lui a3,0x400 + 30010e4: 16fd addi a3,a3,-1 # 3fffff + 30010e6: 8ef1 and a3,a3,a2 + 30010e8: 068a slli a3,a3,0x2 + 30010ea: ff000637 lui a2,0xff000 + 30010ee: 060d addi a2,a2,3 # ff000003 + 30010f0: 8ff1 and a5,a5,a2 + 30010f2: 8fd5 or a5,a5,a3 + 30010f4: c35c sw a5,4(a4) + p->EFLASH_CMD.BIT.cmd_code = FLASH_OPERATION_READ; + 30010f6: fe842703 lw a4,-24(s0) + 30010fa: 431c lw a5,0(a4) + 30010fc: 8ff7f793 andi a5,a5,-1793 + 3001100: 1007e793 ori a5,a5,256 + 3001104: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_read_size = FLASH_READ_128BIT; + 3001106: fe842703 lw a4,-24(s0) + 300110a: 431c lw a5,0(a4) + 300110c: d00006b7 lui a3,0xd0000 + 3001110: 16fd addi a3,a3,-1 # cfffffff + 3001112: 8efd and a3,a3,a5 + 3001114: 100007b7 lui a5,0x10000 + 3001118: 8fd5 or a5,a5,a3 + 300111a: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_start = BASE_CFG_SET; + 300111c: fe842703 lw a4,-24(s0) + 3001120: 431c lw a5,0(a4) + 3001122: 0017e793 ori a5,a5,1 + 3001126: c31c sw a5,0(a4) + + while (p->EFLASH_CMD.BIT.cmd_start) { + 3001128: 0001 nop + 300112a: fe842783 lw a5,-24(s0) + 300112e: 439c lw a5,0(a5) + 3001130: 8b85 andi a5,a5,1 + 3001132: 9f81 uxtb a5 + 3001134: fbfd bnez a5,300112a + ; + } + while (p->EFLASH_CMD.BIT.exec_state) { + 3001136: 0001 nop + 3001138: fe842783 lw a5,-24(s0) + 300113c: 439c lw a5,0(a5) + 300113e: 8399 srli a5,a5,0x6 + 3001140: 8b8d andi a5,a5,3 + 3001142: 9f81 uxtb a5 + 3001144: fbf5 bnez a5,3001138 + ; + } + /* read error, clear interrupt and return */ + if (FOTP_CheckReadStatus(p) != BASE_STATUS_OK) { + 3001146: fe842503 lw a0,-24(s0) + 300114a: 3da5 jal ra,3000fc2 + 300114c: 87aa mv a5,a0 + 300114e: c399 beqz a5,3001154 + return BASE_STATUS_ERROR; + 3001150: 4785 li a5,1 + 3001152: a0b1 j 300119e + } + /* Read data from FIFO to buffer */ + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001154: fe042623 sw zero,-20(s0) + 3001158: a00d j 300117a + buf->data[i] = p->FLASH_RDATA; + 300115a: fe842783 lw a5,-24(s0) + 300115e: 6007a703 lw a4,1536(a5) # 10000600 + 3001162: fd442683 lw a3,-44(s0) + 3001166: fec42783 lw a5,-20(s0) + 300116a: 078a slli a5,a5,0x2 + 300116c: 97b6 add a5,a5,a3 + 300116e: c398 sw a4,0(a5) + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001170: fec42783 lw a5,-20(s0) + 3001174: 0785 addi a5,a5,1 + 3001176: fef42623 sw a5,-20(s0) + 300117a: fec42703 lw a4,-20(s0) + 300117e: 478d li a5,3 + 3001180: fce7fde3 bgeu a5,a4,300115a + } + p->INT_CLEAR.BIT.int_clr_finish = BASE_CFG_SET; + 3001184: fe842703 lw a4,-24(s0) + 3001188: 10c72783 lw a5,268(a4) + 300118c: 0107e793 ori a5,a5,16 + 3001190: 10f72623 sw a5,268(a4) + p->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001194: fe842783 lw a5,-24(s0) + 3001198: 2007a023 sw zero,512(a5) + return BASE_STATUS_OK; + 300119c: 4781 li a5,0 + 300119e: 853e mv a0,a5 + 30011a0: 50b2 lw ra,44(sp) + 30011a2: 5422 lw s0,40(sp) + 30011a4: 6145 addi sp,sp,48 + 30011a6: 8082 ret + +030011a8 : + * @param baseAddr The ip base address + * @retval The Address(offset) in g_crgIpMatch if match success + * @retval 0 if match fail + */ +CHIP_CrgIpMatchInfo *GetCrgIpMatchInfo(const void *baseAddr) +{ + 30011a8: 7179 addi sp,sp,-48 + 30011aa: d622 sw s0,44(sp) + 30011ac: 1800 addi s0,sp,48 + 30011ae: fca42e23 sw a0,-36(s0) + unsigned int i; + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011b2: fe042623 sw zero,-20(s0) + 30011b6: a081 j 30011f6 + if (baseAddr == g_crgIpMatch[i].ipBaseAddr) { + 30011b8: 030067b7 lui a5,0x3006 + 30011bc: 20078713 addi a4,a5,512 # 3006200 + 30011c0: fec42683 lw a3,-20(s0) + 30011c4: 47b1 li a5,12 + 30011c6: 02f687b3 mul a5,a3,a5 + 30011ca: 97ba add a5,a5,a4 + 30011cc: 439c lw a5,0(a5) + 30011ce: fdc42703 lw a4,-36(s0) + 30011d2: 00f71d63 bne a4,a5,30011ec + return (CHIP_CrgIpMatchInfo *)&g_crgIpMatch[i]; + 30011d6: fec42703 lw a4,-20(s0) + 30011da: 47b1 li a5,12 + 30011dc: 02f70733 mul a4,a4,a5 + 30011e0: 030067b7 lui a5,0x3006 + 30011e4: 20078793 addi a5,a5,512 # 3006200 + 30011e8: 97ba add a5,a5,a4 + 30011ea: a829 j 3001204 + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011ec: fec42783 lw a5,-20(s0) + 30011f0: 0785 addi a5,a5,1 + 30011f2: fef42623 sw a5,-20(s0) + 30011f6: fec42703 lw a4,-20(s0) + 30011fa: 02d00793 li a5,45 + 30011fe: fae7fde3 bgeu a5,a4,30011b8 + } + } + return (CHIP_CrgIpMatchInfo *)0; /* The base address does not match, return 0. */ + 3001202: 4781 li a5,0 +} + 3001204: 853e mv a0,a5 + 3001206: 5432 lw s0,44(sp) + 3001208: 6145 addi sp,sp,48 + 300120a: 8082 ret + +0300120c : + * @brief Check ADC sample input. + * @param input Number of input. + * @retval bool + */ +static inline bool IsADCSampleChannel(ADC_Input input) +{ + 300120c: 1101 addi sp,sp,-32 + 300120e: ce22 sw s0,28(sp) + 3001210: 1000 addi s0,sp,32 + 3001212: fea42623 sw a0,-20(s0) + return (input >= ADC_CH_ADCINA0) && (input <= ADC_CH_ADCINA19); + 3001216: fec42783 lw a5,-20(s0) + 300121a: 0147b793 sltiu a5,a5,20 + 300121e: 9f81 uxtb a5 +} + 3001220: 853e mv a0,a5 + 3001222: 4472 lw s0,28(sp) + 3001224: 6105 addi sp,sp,32 + 3001226: 8082 ret + +03001228 : + * are configured through the SOC. + * @param soc Number of SOC. + * @retval bool + */ +static inline bool IsADCSOCx(ADC_SOCNumber soc) +{ + 3001228: 1101 addi sp,sp,-32 + 300122a: ce22 sw s0,28(sp) + 300122c: 1000 addi s0,sp,32 + 300122e: fea42623 sw a0,-20(s0) + return (soc >= ADC_SOC_NUM0) && (soc <= ADC_SOC_NUM15); + 3001232: fec42783 lw a5,-20(s0) + 3001236: 0107b793 sltiu a5,a5,16 + 300123a: 9f81 uxtb a5 +} + 300123c: 853e mv a0,a5 + 300123e: 4472 lw s0,28(sp) + 3001240: 6105 addi sp,sp,32 + 3001242: 8082 ret + +03001244 : + * @brief Check ADC interrupt parameter. + * @param intx Number of interrupt. + * @retval bool + */ +static inline bool IsADCIntx(ADC_IntNumber intx) +{ + 3001244: 1101 addi sp,sp,-32 + 3001246: ce22 sw s0,28(sp) + 3001248: 1000 addi s0,sp,32 + 300124a: fea42623 sw a0,-20(s0) + return (intx >= ADC_INT_NUMBER0) && (intx <= ADC_INT_NUMBER3); + 300124e: fec42783 lw a5,-20(s0) + 3001252: 0047b793 sltiu a5,a5,4 + 3001256: 9f81 uxtb a5 +} + 3001258: 853e mv a0,a5 + 300125a: 4472 lw s0,28(sp) + 300125c: 6105 addi sp,sp,32 + 300125e: 8082 ret + +03001260 : + * @brief Check SOC trigger source. + * @param trig Type of trigger source. + * @retval bool + */ +static inline bool IsADCTrigSource(ADC_TrigSource trig) +{ + 3001260: 1101 addi sp,sp,-32 + 3001262: ce22 sw s0,28(sp) + 3001264: 1000 addi s0,sp,32 + 3001266: fea42623 sw a0,-20(s0) + return (trig >= ADC_TRIGSOC_SOFT) && (trig <= ADC_TRIGSOC_GPIOPF1); + 300126a: fec42783 lw a5,-20(s0) + 300126e: 0157b793 sltiu a5,a5,21 + 3001272: 9f81 uxtb a5 +} + 3001274: 853e mv a0,a5 + 3001276: 4472 lw s0,28(sp) + 3001278: 6105 addi sp,sp,32 + 300127a: 8082 ret + +0300127c : + * @brief Check mode of completion of SOC sample + * @param mode Type of completion. + * @retval bool + */ +static inline bool IsADCFinishMode(ADC_SOCFinishMode mode) +{ + 300127c: 1101 addi sp,sp,-32 + 300127e: ce22 sw s0,28(sp) + 3001280: 1000 addi s0,sp,32 + 3001282: fea42623 sw a0,-20(s0) + return (mode >= ADC_SOCFINISH_NONE) && (mode <= ADC_SOCFINISH_INT3); + 3001286: fec42783 lw a5,-20(s0) + 300128a: cb81 beqz a5,300129a + 300128c: fec42703 lw a4,-20(s0) + 3001290: 4799 li a5,6 + 3001292: 00e7e463 bltu a5,a4,300129a + 3001296: 4785 li a5,1 + 3001298: a011 j 300129c + 300129a: 4781 li a5,0 + 300129c: 8b85 andi a5,a5,1 + 300129e: 9f81 uxtb a5 +} + 30012a0: 853e mv a0,a5 + 30012a2: 4472 lw s0,28(sp) + 30012a4: 6105 addi sp,sp,32 + 30012a6: 8082 ret + +030012a8 : + * @brief Check ADC sample priority parameter. + * @param mode Priority mode of SOC. + * @retval bool + */ +static inline bool IsADCPriorityMode(ADC_PriorityMode mode) +{ + 30012a8: 1101 addi sp,sp,-32 + 30012aa: ce22 sw s0,28(sp) + 30012ac: 1000 addi s0,sp,32 + 30012ae: fea42623 sw a0,-20(s0) + return (mode >= ADC_PRIMODE_ALL_ROUND) && (mode <= ADC_PRIMODE_ALL_PRIORITY); + 30012b2: fec42703 lw a4,-20(s0) + 30012b6: 67c1 lui a5,0x10 + 30012b8: 00f737b3 sltu a5,a4,a5 + 30012bc: 9f81 uxtb a5 +} + 30012be: 853e mv a0,a5 + 30012c0: 4472 lw s0,28(sp) + 30012c2: 6105 addi sp,sp,32 + 30012c4: 8082 ret + +030012c6 : + * @brief Check time of total ADC sampling time. + * @param acqps Time of total ADC sampling time. + * @retval bool + */ +static inline bool IsADCTotalTime(unsigned int acqps) +{ + 30012c6: 1101 addi sp,sp,-32 + 30012c8: ce22 sw s0,28(sp) + 30012ca: 1000 addi s0,sp,32 + 30012cc: fea42623 sw a0,-20(s0) + return (acqps <= ADC_SOCSAMPLE_500CLK); + 30012d0: fec42783 lw a5,-20(s0) + 30012d4: 0107b793 sltiu a5,a5,16 + 30012d8: 9f81 uxtb a5 +} + 30012da: 853e mv a0,a5 + 30012dc: 4472 lw s0,28(sp) + 30012de: 6105 addi sp,sp,32 + 30012e0: 8082 ret + +030012e2 : + * @brief Enable AVDD/3 Channal. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_EnableAvddChannel(ADC_RegStruct * const adcx) +{ + 30012e2: 1101 addi sp,sp,-32 + 30012e4: ce06 sw ra,28(sp) + 30012e6: cc22 sw s0,24(sp) + 30012e8: 1000 addi s0,sp,32 + 30012ea: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30012ee: fec42703 lw a4,-20(s0) + 30012f2: 180007b7 lui a5,0x18000 + 30012f6: 00f70b63 beq a4,a5,300130c + 30012fa: 6785 lui a5,0x1 + 30012fc: 86278593 addi a1,a5,-1950 # 862 + 3001300: 030067b7 lui a5,0x3006 + 3001304: 42878513 addi a0,a5,1064 # 3006428 + 3001308: 2b0d jal ra,300183a + 300130a: a001 j 300130a + adcx->ADC_AVDD_EN.BIT.cfg_avdd_en = true; + 300130c: fec42703 lw a4,-20(s0) + 3001310: 65872783 lw a5,1624(a4) + 3001314: 0017e793 ori a5,a5,1 + 3001318: 64f72c23 sw a5,1624(a4) +} + 300131c: 0001 nop + 300131e: 40f2 lw ra,28(sp) + 3001320: 4462 lw s0,24(sp) + 3001322: 6105 addi sp,sp,32 + 3001324: 8082 ret + +03001326 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt0(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001326: 7179 addi sp,sp,-48 + 3001328: d606 sw ra,44(sp) + 300132a: d422 sw s0,40(sp) + 300132c: 1800 addi s0,sp,48 + 300132e: fca42e23 sw a0,-36(s0) + 3001332: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001336: fdc42703 lw a4,-36(s0) + 300133a: 180007b7 lui a5,0x18000 + 300133e: 00f70b63 beq a4,a5,3001354 + 3001342: 6785 lui a5,0x1 + 3001344: 87978593 addi a1,a5,-1927 # 879 + 3001348: 030067b7 lui a5,0x3006 + 300134c: 42878513 addi a0,a5,1064 # 3006428 + 3001350: 21ed jal ra,300183a + 3001352: a001 j 3001352 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 3001354: fd842503 lw a0,-40(s0) + 3001358: 3dc1 jal ra,3001228 + 300135a: 87aa mv a5,a0 + 300135c: 0017c793 xori a5,a5,1 + 3001360: 9f81 uxtb a5 + 3001362: cb91 beqz a5,3001376 + 3001364: 6785 lui a5,0x1 + 3001366: 87a78593 addi a1,a5,-1926 # 87a + 300136a: 030067b7 lui a5,0x3006 + 300136e: 42878513 addi a0,a5,1064 # 3006428 + 3001372: 21e1 jal ra,300183a + 3001374: a01d j 300139a + unsigned int shiftBit = (unsigned int)socx; + 3001376: fd842783 lw a5,-40(s0) + 300137a: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 300137e: fdc42783 lw a5,-36(s0) + 3001382: 2b07a703 lw a4,688(a5) + 3001386: 4685 li a3,1 + 3001388: fec42783 lw a5,-20(s0) + 300138c: 00f697b3 sll a5,a3,a5 + 3001390: 8f5d or a4,a4,a5 + 3001392: fdc42783 lw a5,-36(s0) + 3001396: 2ae7a823 sw a4,688(a5) +} + 300139a: 50b2 lw ra,44(sp) + 300139c: 5422 lw s0,40(sp) + 300139e: 6145 addi sp,sp,48 + 30013a0: 8082 ret + +030013a2 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt1(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30013a2: 7179 addi sp,sp,-48 + 30013a4: d606 sw ra,44(sp) + 30013a6: d422 sw s0,40(sp) + 30013a8: 1800 addi s0,sp,48 + 30013aa: fca42e23 sw a0,-36(s0) + 30013ae: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30013b2: fdc42703 lw a4,-36(s0) + 30013b6: 180007b7 lui a5,0x18000 + 30013ba: 00f70b63 beq a4,a5,30013d0 + 30013be: 6785 lui a5,0x1 + 30013c0: 89478593 addi a1,a5,-1900 # 894 + 30013c4: 030067b7 lui a5,0x3006 + 30013c8: 42878513 addi a0,a5,1064 # 3006428 + 30013cc: 21bd jal ra,300183a + 30013ce: a001 j 30013ce + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30013d0: fd842503 lw a0,-40(s0) + 30013d4: 3d91 jal ra,3001228 + 30013d6: 87aa mv a5,a0 + 30013d8: 0017c793 xori a5,a5,1 + 30013dc: 9f81 uxtb a5 + 30013de: cb91 beqz a5,30013f2 + 30013e0: 6785 lui a5,0x1 + 30013e2: 89578593 addi a1,a5,-1899 # 895 + 30013e6: 030067b7 lui a5,0x3006 + 30013ea: 42878513 addi a0,a5,1064 # 3006428 + 30013ee: 21b1 jal ra,300183a + 30013f0: a025 j 3001418 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30013f2: fd842783 lw a5,-40(s0) + 30013f6: 07c1 addi a5,a5,16 + 30013f8: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 30013fc: fdc42783 lw a5,-36(s0) + 3001400: 2b07a703 lw a4,688(a5) + 3001404: 4685 li a3,1 + 3001406: fec42783 lw a5,-20(s0) + 300140a: 00f697b3 sll a5,a3,a5 + 300140e: 8f5d or a4,a4,a5 + 3001410: fdc42783 lw a5,-36(s0) + 3001414: 2ae7a823 sw a4,688(a5) +} + 3001418: 50b2 lw ra,44(sp) + 300141a: 5422 lw s0,40(sp) + 300141c: 6145 addi sp,sp,48 + 300141e: 8082 ret + +03001420 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt2(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001420: 7179 addi sp,sp,-48 + 3001422: d606 sw ra,44(sp) + 3001424: d422 sw s0,40(sp) + 3001426: 1800 addi s0,sp,48 + 3001428: fca42e23 sw a0,-36(s0) + 300142c: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001430: fdc42703 lw a4,-36(s0) + 3001434: 180007b7 lui a5,0x18000 + 3001438: 00f70b63 beq a4,a5,300144e + 300143c: 6785 lui a5,0x1 + 300143e: 8af78593 addi a1,a5,-1873 # 8af + 3001442: 030067b7 lui a5,0x3006 + 3001446: 42878513 addi a0,a5,1064 # 3006428 + 300144a: 2ec5 jal ra,300183a + 300144c: a001 j 300144c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300144e: fd842503 lw a0,-40(s0) + 3001452: 3bd9 jal ra,3001228 + 3001454: 87aa mv a5,a0 + 3001456: 0017c793 xori a5,a5,1 + 300145a: 9f81 uxtb a5 + 300145c: cb91 beqz a5,3001470 + 300145e: 6785 lui a5,0x1 + 3001460: 8b078593 addi a1,a5,-1872 # 8b0 + 3001464: 030067b7 lui a5,0x3006 + 3001468: 42878513 addi a0,a5,1064 # 3006428 + 300146c: 26f9 jal ra,300183a + 300146e: a01d j 3001494 + unsigned int shiftBit = (unsigned int)socx; + 3001470: fd842783 lw a5,-40(s0) + 3001474: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 3001478: fdc42783 lw a5,-36(s0) + 300147c: 2b47a703 lw a4,692(a5) + 3001480: 4685 li a3,1 + 3001482: fec42783 lw a5,-20(s0) + 3001486: 00f697b3 sll a5,a3,a5 + 300148a: 8f5d or a4,a4,a5 + 300148c: fdc42783 lw a5,-36(s0) + 3001490: 2ae7aa23 sw a4,692(a5) +} + 3001494: 50b2 lw ra,44(sp) + 3001496: 5422 lw s0,40(sp) + 3001498: 6145 addi sp,sp,48 + 300149a: 8082 ret + +0300149c : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt3(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300149c: 7179 addi sp,sp,-48 + 300149e: d606 sw ra,44(sp) + 30014a0: d422 sw s0,40(sp) + 30014a2: 1800 addi s0,sp,48 + 30014a4: fca42e23 sw a0,-36(s0) + 30014a8: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30014ac: fdc42703 lw a4,-36(s0) + 30014b0: 180007b7 lui a5,0x18000 + 30014b4: 00f70b63 beq a4,a5,30014ca + 30014b8: 6785 lui a5,0x1 + 30014ba: 8ca78593 addi a1,a5,-1846 # 8ca + 30014be: 030067b7 lui a5,0x3006 + 30014c2: 42878513 addi a0,a5,1064 # 3006428 + 30014c6: 2e95 jal ra,300183a + 30014c8: a001 j 30014c8 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30014ca: fd842503 lw a0,-40(s0) + 30014ce: 3ba9 jal ra,3001228 + 30014d0: 87aa mv a5,a0 + 30014d2: 0017c793 xori a5,a5,1 + 30014d6: 9f81 uxtb a5 + 30014d8: cb91 beqz a5,30014ec + 30014da: 6785 lui a5,0x1 + 30014dc: 8cb78593 addi a1,a5,-1845 # 8cb + 30014e0: 030067b7 lui a5,0x3006 + 30014e4: 42878513 addi a0,a5,1064 # 3006428 + 30014e8: 2e89 jal ra,300183a + 30014ea: a025 j 3001512 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30014ec: fd842783 lw a5,-40(s0) + 30014f0: 07c1 addi a5,a5,16 + 30014f2: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 30014f6: fdc42783 lw a5,-36(s0) + 30014fa: 2b47a703 lw a4,692(a5) + 30014fe: 4685 li a3,1 + 3001500: fec42783 lw a5,-20(s0) + 3001504: 00f697b3 sll a5,a3,a5 + 3001508: 8f5d or a4,a4,a5 + 300150a: fdc42783 lw a5,-36(s0) + 300150e: 2ae7aa23 sw a4,692(a5) +} + 3001512: 50b2 lw ra,44(sp) + 3001514: 5422 lw s0,40(sp) + 3001516: 6145 addi sp,sp,48 + 3001518: 8082 ret + +0300151a : + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + 300151a: 1101 addi sp,sp,-32 + 300151c: ce06 sw ra,28(sp) + 300151e: cc22 sw s0,24(sp) + 3001520: 1000 addi s0,sp,32 + 3001522: fea42623 sw a0,-20(s0) + 3001526: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300152a: fec42703 lw a4,-20(s0) + 300152e: 180007b7 lui a5,0x18000 + 3001532: 00f70b63 beq a4,a5,3001548 + 3001536: 6785 lui a5,0x1 + 3001538: 8e578593 addi a1,a5,-1819 # 8e5 + 300153c: 030067b7 lui a5,0x3006 + 3001540: 42878513 addi a0,a5,1064 # 3006428 + 3001544: 2cdd jal ra,300183a + 3001546: a001 j 3001546 + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + 3001548: fe842503 lw a0,-24(s0) + 300154c: 39e5 jal ra,3001244 + 300154e: 87aa mv a5,a0 + 3001550: 0017c793 xori a5,a5,1 + 3001554: 9f81 uxtb a5 + 3001556: cb91 beqz a5,300156a + 3001558: 6785 lui a5,0x1 + 300155a: 8e678593 addi a1,a5,-1818 # 8e6 + 300155e: 030067b7 lui a5,0x3006 + 3001562: 42878513 addi a0,a5,1064 # 3006428 + 3001566: 2cd1 jal ra,300183a + 3001568: a839 j 3001586 + adcx->ADC_DATA_FLAG_MASK.reg |= (1U << (unsigned int)intx); + 300156a: fec42783 lw a5,-20(s0) + 300156e: 2c07a703 lw a4,704(a5) + 3001572: 4685 li a3,1 + 3001574: fe842783 lw a5,-24(s0) + 3001578: 00f697b3 sll a5,a3,a5 + 300157c: 8f5d or a4,a4,a5 + 300157e: fec42783 lw a5,-20(s0) + 3001582: 2ce7a023 sw a4,704(a5) +} + 3001586: 40f2 lw ra,28(sp) + 3001588: 4462 lw s0,24(sp) + 300158a: 6105 addi sp,sp,32 + 300158c: 8082 ret + +0300158e : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval addr, the base address of the SOC registers. + */ +static unsigned int ADC_GetCTRLAddr(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300158e: 7179 addi sp,sp,-48 + 3001590: d622 sw s0,44(sp) + 3001592: 1800 addi s0,sp,48 + 3001594: fca42e23 sw a0,-36(s0) + 3001598: fcb42c23 sw a1,-40(s0) + unsigned int addr; + addr = (uintptr_t)(void *)&(adcx->ADC_SOC0_CFG); + 300159c: fdc42783 lw a5,-36(s0) + 30015a0: 10078793 addi a5,a5,256 + 30015a4: fef42623 sw a5,-20(s0) + addr += ((unsigned int)socx * 4); /* Register base address difference 4 */ + 30015a8: fd842783 lw a5,-40(s0) + 30015ac: 078a slli a5,a5,0x2 + 30015ae: fec42703 lw a4,-20(s0) + 30015b2: 97ba add a5,a5,a4 + 30015b4: fef42623 sw a5,-20(s0) + return addr; + 30015b8: fec42783 lw a5,-20(s0) +} + 30015bc: 853e mv a0,a5 + 30015be: 5432 lw s0,44(sp) + 30015c0: 6145 addi sp,sp,48 + 30015c2: 8082 ret + +030015c4 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param input ADC input, @ref ADC_Input. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelectChannel(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_Input input) +{ + 30015c4: 7179 addi sp,sp,-48 + 30015c6: d606 sw ra,44(sp) + 30015c8: d422 sw s0,40(sp) + 30015ca: 1800 addi s0,sp,48 + 30015cc: fca42e23 sw a0,-36(s0) + 30015d0: fcb42c23 sw a1,-40(s0) + 30015d4: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30015d8: fdc42703 lw a4,-36(s0) + 30015dc: 180007b7 lui a5,0x18000 + 30015e0: 00f70b63 beq a4,a5,30015f6 + 30015e4: 6785 lui a5,0x1 + 30015e6: 91c78593 addi a1,a5,-1764 # 91c + 30015ea: 030067b7 lui a5,0x3006 + 30015ee: 42878513 addi a0,a5,1064 # 3006428 + 30015f2: 24a1 jal ra,300183a + 30015f4: a001 j 30015f4 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCSampleChannel(input)); + 30015f6: fd842503 lw a0,-40(s0) + 30015fa: 313d jal ra,3001228 + 30015fc: 87aa mv a5,a0 + 30015fe: 0017c793 xori a5,a5,1 + 3001602: 9f81 uxtb a5 + 3001604: eb89 bnez a5,3001616 + 3001606: fd442503 lw a0,-44(s0) + 300160a: 3109 jal ra,300120c + 300160c: 87aa mv a5,a0 + 300160e: 0017c793 xori a5,a5,1 + 3001612: 9f81 uxtb a5 + 3001614: cb91 beqz a5,3001628 + 3001616: 6785 lui a5,0x1 + 3001618: 91d78593 addi a1,a5,-1763 # 91d + 300161c: 030067b7 lui a5,0x3006 + 3001620: 42878513 addi a0,a5,1064 # 3006428 + 3001624: 2c19 jal ra,300183a + 3001626: a091 j 300166a + ADC_SOC0_CFG_REG *soc = NULL; + 3001628: fe042623 sw zero,-20(s0) + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Get the Address After Translation */ + 300162c: fd842583 lw a1,-40(s0) + 3001630: fdc42503 lw a0,-36(s0) + 3001634: 3fa9 jal ra,300158e + 3001636: fea42423 sw a0,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 300163a: fe842783 lw a5,-24(s0) + 300163e: fef42623 sw a5,-20(s0) + soc->BIT.cfg_soc0_ch_sel = (unsigned int)input; + 3001642: fd442783 lw a5,-44(s0) + 3001646: 8bfd andi a5,a5,31 + 3001648: 0ff7f693 andi a3,a5,255 + 300164c: fec42703 lw a4,-20(s0) + 3001650: 431c lw a5,0(a4) + 3001652: 8afd andi a3,a3,31 + 3001654: 9b81 andi a5,a5,-32 + 3001656: 8fd5 or a5,a5,a3 + 3001658: c31c sw a5,0(a4) + if (input == ADC_CH_ADCINA18) { + 300165a: fd442703 lw a4,-44(s0) + 300165e: 47c9 li a5,18 + 3001660: 00f71563 bne a4,a5,300166a + DCL_ADC_EnableAvddChannel(adcx); + 3001664: fdc42503 lw a0,-36(s0) + 3001668: 39ad jal ra,30012e2 + } +} + 300166a: 50b2 lw ra,44(sp) + 300166c: 5422 lw s0,40(sp) + 300166e: 6145 addi sp,sp,48 + 3001670: 8082 ret + +03001672 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param trig Source of trigger, @ref ADC_TrigSource. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelcetTrigSource(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_TrigSource trig) +{ + 3001672: 7179 addi sp,sp,-48 + 3001674: d606 sw ra,44(sp) + 3001676: d422 sw s0,40(sp) + 3001678: 1800 addi s0,sp,48 + 300167a: fca42e23 sw a0,-36(s0) + 300167e: fcb42c23 sw a1,-40(s0) + 3001682: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001686: fdc42703 lw a4,-36(s0) + 300168a: 180007b7 lui a5,0x18000 + 300168e: 00f70b63 beq a4,a5,30016a4 + 3001692: 6785 lui a5,0x1 + 3001694: 93078593 addi a1,a5,-1744 # 930 + 3001698: 030067b7 lui a5,0x3006 + 300169c: 42878513 addi a0,a5,1064 # 3006428 + 30016a0: 2a69 jal ra,300183a + 30016a2: a001 j 30016a2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCTrigSource(trig)); + 30016a4: fd842503 lw a0,-40(s0) + 30016a8: 3641 jal ra,3001228 + 30016aa: 87aa mv a5,a0 + 30016ac: 0017c793 xori a5,a5,1 + 30016b0: 9f81 uxtb a5 + 30016b2: eb89 bnez a5,30016c4 + 30016b4: fd442503 lw a0,-44(s0) + 30016b8: 3665 jal ra,3001260 + 30016ba: 87aa mv a5,a0 + 30016bc: 0017c793 xori a5,a5,1 + 30016c0: 9f81 uxtb a5 + 30016c2: cb91 beqz a5,30016d6 + 30016c4: 6785 lui a5,0x1 + 30016c6: 93178593 addi a1,a5,-1743 # 931 + 30016ca: 030067b7 lui a5,0x3006 + 30016ce: 42878513 addi a0,a5,1064 # 3006428 + 30016d2: 22a5 jal ra,300183a + 30016d4: a835 j 3001710 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtaining the Address for Configuring the SOC */ + 30016d6: fd842583 lw a1,-40(s0) + 30016da: fdc42503 lw a0,-36(s0) + 30016de: 3d45 jal ra,300158e + 30016e0: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 30016e4: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30016e8: fec42783 lw a5,-20(s0) + 30016ec: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_trig_sel = (unsigned int)trig; + 30016f0: fd442783 lw a5,-44(s0) + 30016f4: 8bfd andi a5,a5,31 + 30016f6: 0ff7f693 andi a3,a5,255 + 30016fa: fe842703 lw a4,-24(s0) + 30016fe: 431c lw a5,0(a4) + 3001700: 8afd andi a3,a3,31 + 3001702: 06a6 slli a3,a3,0x9 + 3001704: 7671 lui a2,0xffffc + 3001706: 1ff60613 addi a2,a2,511 # ffffc1ff + 300170a: 8ff1 and a5,a5,a2 + 300170c: 8fd5 or a5,a5,a3 + 300170e: c31c sw a5,0(a4) +} + 3001710: 50b2 lw ra,44(sp) + 3001712: 5422 lw s0,40(sp) + 3001714: 6145 addi sp,sp,48 + 3001716: 8082 ret + +03001718 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param acqps Capacitor charging time. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetAcqps(ADC_RegStruct * const adcx, ADC_SOCNumber socx, unsigned int acqps) +{ + 3001718: 7179 addi sp,sp,-48 + 300171a: d606 sw ra,44(sp) + 300171c: d422 sw s0,40(sp) + 300171e: 1800 addi s0,sp,48 + 3001720: fca42e23 sw a0,-36(s0) + 3001724: fcb42c23 sw a1,-40(s0) + 3001728: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300172c: fdc42703 lw a4,-36(s0) + 3001730: 180007b7 lui a5,0x18000 + 3001734: 00f70b63 beq a4,a5,300174a + 3001738: 6785 lui a5,0x1 + 300173a: 94178593 addi a1,a5,-1727 # 941 + 300173e: 030067b7 lui a5,0x3006 + 3001742: 42878513 addi a0,a5,1064 # 3006428 + 3001746: 28d5 jal ra,300183a + 3001748: a001 j 3001748 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300174a: fd842503 lw a0,-40(s0) + 300174e: 3ce9 jal ra,3001228 + 3001750: 87aa mv a5,a0 + 3001752: 0017c793 xori a5,a5,1 + 3001756: 9f81 uxtb a5 + 3001758: cb91 beqz a5,300176c + 300175a: 6785 lui a5,0x1 + 300175c: 94278593 addi a1,a5,-1726 # 942 + 3001760: 030067b7 lui a5,0x3006 + 3001764: 42878513 addi a0,a5,1064 # 3006428 + 3001768: 28c9 jal ra,300183a + 300176a: a891 j 30017be + ADC_PARAM_CHECK_NO_RET(acqps <= 15); /* The value of acqps ranges from 0 to 15 */ + 300176c: fd442703 lw a4,-44(s0) + 3001770: 47bd li a5,15 + 3001772: 00e7fb63 bgeu a5,a4,3001788 + 3001776: 6785 lui a5,0x1 + 3001778: 94378593 addi a1,a5,-1725 # 943 + 300177c: 030067b7 lui a5,0x3006 + 3001780: 42878513 addi a0,a5,1064 # 3006428 + 3001784: 285d jal ra,300183a + 3001786: a825 j 30017be + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); + 3001788: fd842583 lw a1,-40(s0) + 300178c: fdc42503 lw a0,-36(s0) + 3001790: 3bfd jal ra,300158e + 3001792: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 3001796: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 300179a: fec42783 lw a5,-20(s0) + 300179e: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_samptime_sel = acqps; + 30017a2: fd442783 lw a5,-44(s0) + 30017a6: 8bbd andi a5,a5,15 + 30017a8: 0ff7f693 andi a3,a5,255 + 30017ac: fe842703 lw a4,-24(s0) + 30017b0: 431c lw a5,0(a4) + 30017b2: 8abd andi a3,a3,15 + 30017b4: 0696 slli a3,a3,0x5 + 30017b6: e1f7f793 andi a5,a5,-481 + 30017ba: 8fd5 or a5,a5,a3 + 30017bc: c31c sw a5,0(a4) +} + 30017be: 50b2 lw ra,44(sp) + 30017c0: 5422 lw s0,40(sp) + 30017c2: 6145 addi sp,sp,48 + 30017c4: 8082 ret + +030017c6 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SOCxSoftTrigger(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30017c6: 1101 addi sp,sp,-32 + 30017c8: ce06 sw ra,28(sp) + 30017ca: cc22 sw s0,24(sp) + 30017cc: 1000 addi s0,sp,32 + 30017ce: fea42623 sw a0,-20(s0) + 30017d2: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30017d6: fec42703 lw a4,-20(s0) + 30017da: 180007b7 lui a5,0x18000 + 30017de: 00f70b63 beq a4,a5,30017f4 + 30017e2: 6785 lui a5,0x1 + 30017e4: 95278593 addi a1,a5,-1710 # 952 + 30017e8: 030067b7 lui a5,0x3006 + 30017ec: 42878513 addi a0,a5,1064 # 3006428 + 30017f0: 20a9 jal ra,300183a + 30017f2: a001 j 30017f2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30017f4: fe842503 lw a0,-24(s0) + 30017f8: 3c05 jal ra,3001228 + 30017fa: 87aa mv a5,a0 + 30017fc: 0017c793 xori a5,a5,1 + 3001800: 9f81 uxtb a5 + 3001802: cb91 beqz a5,3001816 + 3001804: 6785 lui a5,0x1 + 3001806: 95378593 addi a1,a5,-1709 # 953 + 300180a: 030067b7 lui a5,0x3006 + 300180e: 42878513 addi a0,a5,1064 # 3006428 + 3001812: 2d71 jal ra,3001eae + 3001814: a839 j 3001832 + adcx->ADC_SOFT_TRIG.reg |= (1U << (unsigned int)socx); + 3001816: fec42783 lw a5,-20(s0) + 300181a: 1607a703 lw a4,352(a5) + 300181e: 4685 li a3,1 + 3001820: fe842783 lw a5,-24(s0) + 3001824: 00f697b3 sll a5,a3,a5 + 3001828: 8f5d or a4,a4,a5 + 300182a: fec42783 lw a5,-20(s0) + 300182e: 16e7a023 sw a4,352(a5) +} + 3001832: 40f2 lw ra,28(sp) + 3001834: 4462 lw s0,24(sp) + 3001836: 6105 addi sp,sp,32 + 3001838: 8082 ret + +0300183a : + 300183a: 6740006f j 3001eae + +0300183e : + * @param adcx ADC register base address. + * @param priorityMode Mode of SOC priority, @ref ADC_PriorityMode. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetPriority(ADC_RegStruct * const adcx, ADC_PriorityMode priorityMode) +{ + 300183e: 1101 addi sp,sp,-32 + 3001840: ce06 sw ra,28(sp) + 3001842: cc22 sw s0,24(sp) + 3001844: 1000 addi s0,sp,32 + 3001846: fea42623 sw a0,-20(s0) + 300184a: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300184e: fec42703 lw a4,-20(s0) + 3001852: 180007b7 lui a5,0x18000 + 3001856: 00f70b63 beq a4,a5,300186c + 300185a: 6785 lui a5,0x1 + 300185c: 96c78593 addi a1,a5,-1684 # 96c + 3001860: 030067b7 lui a5,0x3006 + 3001864: 42878513 addi a0,a5,1064 # 3006428 + 3001868: 2599 jal ra,3001eae + 300186a: a001 j 300186a + ADC_PARAM_CHECK_NO_RET(IsADCPriorityMode(priorityMode)); + 300186c: fe842503 lw a0,-24(s0) + 3001870: 3c25 jal ra,30012a8 + 3001872: 87aa mv a5,a0 + 3001874: 0017c793 xori a5,a5,1 + 3001878: 9f81 uxtb a5 + 300187a: cb91 beqz a5,300188e + 300187c: 6785 lui a5,0x1 + 300187e: 96d78593 addi a1,a5,-1683 # 96d + 3001882: 030067b7 lui a5,0x3006 + 3001886: 42878513 addi a0,a5,1064 # 3006428 + 300188a: 2515 jal ra,3001eae + 300188c: a039 j 300189a + adcx->ADC_ARBT0.reg = priorityMode; + 300188e: fec42783 lw a5,-20(s0) + 3001892: fe842703 lw a4,-24(s0) + 3001896: 20e7a023 sw a4,512(a5) +} + 300189a: 40f2 lw ra,28(sp) + 300189c: 4462 lw s0,24(sp) + 300189e: 6105 addi sp,sp,32 + 30018a0: 8082 ret + +030018a2 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval unsigned int, result. + */ +static inline unsigned int DCL_ADC_ReadSOCxResult(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30018a2: 7179 addi sp,sp,-48 + 30018a4: d606 sw ra,44(sp) + 30018a6: d422 sw s0,40(sp) + 30018a8: 1800 addi s0,sp,48 + 30018aa: fca42e23 sw a0,-36(s0) + 30018ae: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30018b2: fdc42703 lw a4,-36(s0) + 30018b6: 180007b7 lui a5,0x18000 + 30018ba: 00f70b63 beq a4,a5,30018d0 + 30018be: 6785 lui a5,0x1 + 30018c0: a8778593 addi a1,a5,-1401 # a87 + 30018c4: 030067b7 lui a5,0x3006 + 30018c8: 42878513 addi a0,a5,1064 # 3006428 + 30018cc: 23cd jal ra,3001eae + 30018ce: a001 j 30018ce + ADC_ASSERT_PARAM(IsADCSOCx(socx)); + 30018d0: fd842503 lw a0,-40(s0) + 30018d4: 3a91 jal ra,3001228 + 30018d6: 87aa mv a5,a0 + 30018d8: 0017c793 xori a5,a5,1 + 30018dc: 9f81 uxtb a5 + 30018de: cb91 beqz a5,30018f2 + 30018e0: 6785 lui a5,0x1 + 30018e2: a8878593 addi a1,a5,-1400 # a88 + 30018e6: 030067b7 lui a5,0x3006 + 30018ea: 42878513 addi a0,a5,1064 # 3006428 + 30018ee: 23c1 jal ra,3001eae + 30018f0: a001 j 30018f0 + ADC_RESULT0_REG *result; + uintptr_t addr = (uintptr_t)(void *)adcx; + 30018f2: fdc42783 lw a5,-36(s0) + 30018f6: fef42623 sw a5,-20(s0) + /* The address interval of the result register is 4 */ + result = (ADC_RESULT0_REG *)(void *)(addr + 4 * (unsigned int)socx); + 30018fa: fd842783 lw a5,-40(s0) + 30018fe: 00279713 slli a4,a5,0x2 + 3001902: fec42783 lw a5,-20(s0) + 3001906: 97ba add a5,a5,a4 + 3001908: fef42423 sw a5,-24(s0) + return result->reg; + 300190c: fe842783 lw a5,-24(s0) + 3001910: 439c lw a5,0(a5) +} + 3001912: 853e mv a0,a5 + 3001914: 50b2 lw ra,44(sp) + 3001916: 5422 lw s0,40(sp) + 3001918: 6145 addi sp,sp,48 + 300191a: 8082 ret + +0300191c : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300191c: 7179 addi sp,sp,-48 + 300191e: d606 sw ra,44(sp) + 3001920: d422 sw s0,40(sp) + 3001922: 1800 addi s0,sp,48 + 3001924: fca42e23 sw a0,-36(s0) + 3001928: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300192c: fdc42703 lw a4,-36(s0) + 3001930: 180007b7 lui a5,0x18000 + 3001934: 00f70b63 beq a4,a5,300194a + 3001938: 6785 lui a5,0x1 + 300193a: b4678593 addi a1,a5,-1210 # b46 + 300193e: 030067b7 lui a5,0x3006 + 3001942: 42878513 addi a0,a5,1064 # 3006428 + 3001946: 23a5 jal ra,3001eae + 3001948: a001 j 3001948 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300194a: fd842503 lw a0,-40(s0) + 300194e: 38e9 jal ra,3001228 + 3001950: 87aa mv a5,a0 + 3001952: 0017c793 xori a5,a5,1 + 3001956: 9f81 uxtb a5 + 3001958: cb91 beqz a5,300196c + 300195a: 6785 lui a5,0x1 + 300195c: b4778593 addi a1,a5,-1209 # b47 + 3001960: 030067b7 lui a5,0x3006 + 3001964: 42878513 addi a0,a5,1064 # 3006428 + 3001968: 2399 jal ra,3001eae + 300196a: a025 j 3001992 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 300196c: fd842583 lw a1,-40(s0) + 3001970: fdc42503 lw a0,-36(s0) + 3001974: 3929 jal ra,300158e + 3001976: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 300197a: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 300197e: fec42783 lw a5,-20(s0) + 3001982: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_ENABLE; + 3001986: fe842703 lw a4,-24(s0) + 300198a: 431c lw a5,0(a4) + 300198c: 6691 lui a3,0x4 + 300198e: 8fd5 or a5,a5,a3 + 3001990: c31c sw a5,0(a4) +} + 3001992: 50b2 lw ra,44(sp) + 3001994: 5422 lw s0,40(sp) + 3001996: 6145 addi sp,sp,48 + 3001998: 8082 ret + +0300199a : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_DisableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300199a: 7179 addi sp,sp,-48 + 300199c: d606 sw ra,44(sp) + 300199e: d422 sw s0,40(sp) + 30019a0: 1800 addi s0,sp,48 + 30019a2: fca42e23 sw a0,-36(s0) + 30019a6: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30019aa: fdc42703 lw a4,-36(s0) + 30019ae: 180007b7 lui a5,0x18000 + 30019b2: 00f70b63 beq a4,a5,30019c8 + 30019b6: 6785 lui a5,0x1 + 30019b8: b5678593 addi a1,a5,-1194 # b56 + 30019bc: 030067b7 lui a5,0x3006 + 30019c0: 42878513 addi a0,a5,1064 # 3006428 + 30019c4: 21ed jal ra,3001eae + 30019c6: a001 j 30019c6 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30019c8: fd842503 lw a0,-40(s0) + 30019cc: 38b1 jal ra,3001228 + 30019ce: 87aa mv a5,a0 + 30019d0: 0017c793 xori a5,a5,1 + 30019d4: 9f81 uxtb a5 + 30019d6: cb91 beqz a5,30019ea + 30019d8: 6785 lui a5,0x1 + 30019da: b5778593 addi a1,a5,-1193 # b57 + 30019de: 030067b7 lui a5,0x3006 + 30019e2: 42878513 addi a0,a5,1064 # 3006428 + 30019e6: 21e1 jal ra,3001eae + 30019e8: a02d j 3001a12 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 30019ea: fd842583 lw a1,-40(s0) + 30019ee: fdc42503 lw a0,-36(s0) + 30019f2: 3e71 jal ra,300158e + 30019f4: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 30019f8: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30019fc: fec42783 lw a5,-20(s0) + 3001a00: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_DISABLE; + 3001a04: fe842703 lw a4,-24(s0) + 3001a08: 431c lw a5,0(a4) + 3001a0a: 76f1 lui a3,0xffffc + 3001a0c: 16fd addi a3,a3,-1 # ffffbfff + 3001a0e: 8ff5 and a5,a5,a3 + 3001a10: c31c sw a5,0(a4) +} + 3001a12: 50b2 lw ra,44(sp) + 3001a14: 5422 lw s0,40(sp) + 3001a16: 6145 addi sp,sp,48 + 3001a18: 8082 ret + +03001a1a : + * triggered at least 100 us later. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_Init(ADC_Handle *adcHandle) +{ + 3001a1a: 1101 addi sp,sp,-32 + 3001a1c: ce06 sw ra,28(sp) + 3001a1e: cc22 sw s0,24(sp) + 3001a20: 1000 addi s0,sp,32 + 3001a22: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001a26: fec42783 lw a5,-20(s0) + 3001a2a: eb89 bnez a5,3001a3c + 3001a2c: 02c00593 li a1,44 + 3001a30: 030067b7 lui a5,0x3006 + 3001a34: 44478513 addi a0,a5,1092 # 3006444 + 3001a38: 299d jal ra,3001eae + 3001a3a: a001 j 3001a3a + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001a3c: fec42783 lw a5,-20(s0) + 3001a40: 4398 lw a4,0(a5) + 3001a42: 180007b7 lui a5,0x18000 + 3001a46: 00f70a63 beq a4,a5,3001a5a + 3001a4a: 02d00593 li a1,45 + 3001a4e: 030067b7 lui a5,0x3006 + 3001a52: 44478513 addi a0,a5,1092 # 3006444 + 3001a56: 29a1 jal ra,3001eae + 3001a58: a001 j 3001a58 + ADC_PARAM_CHECK_WITH_RET(IsADCPriorityMode(adcHandle->socPriority) == true, BASE_STATUS_ERROR); + 3001a5a: fec42783 lw a5,-20(s0) + 3001a5e: 43dc lw a5,4(a5) + 3001a60: 853e mv a0,a5 + 3001a62: 3099 jal ra,30012a8 + 3001a64: 87aa mv a5,a0 + 3001a66: 0017c793 xori a5,a5,1 + 3001a6a: 9f81 uxtb a5 + 3001a6c: cb91 beqz a5,3001a80 + 3001a6e: 02e00593 li a1,46 + 3001a72: 030067b7 lui a5,0x3006 + 3001a76: 44478513 addi a0,a5,1092 # 3006444 + 3001a7a: 2915 jal ra,3001eae + 3001a7c: 4785 li a5,1 + 3001a7e: a091 j 3001ac2 + DCL_ADC_SOCxSetPriority(adcHandle->baseAddress, adcHandle->socPriority); + 3001a80: fec42783 lw a5,-20(s0) + 3001a84: 4398 lw a4,0(a5) + 3001a86: fec42783 lw a5,-20(s0) + 3001a8a: 43dc lw a5,4(a5) + 3001a8c: 85be mv a1,a5 + 3001a8e: 853a mv a0,a4 + 3001a90: 337d jal ra,300183e + adcHandle->baseAddress->ADC_ANA_CTRL0.BIT.cfg_sar_samp_cap_sel = 0x4; /* Set the Number of Sampling Capacitors */ + 3001a92: fec42783 lw a5,-20(s0) + 3001a96: 4398 lw a4,0(a5) + 3001a98: 65472783 lw a5,1620(a4) + 3001a9c: 100006b7 lui a3,0x10000 + 3001aa0: 16fd addi a3,a3,-1 # fffffff + 3001aa2: 8efd and a3,a3,a5 + 3001aa4: 400007b7 lui a5,0x40000 + 3001aa8: 8fd5 or a5,a5,a3 + 3001aaa: 64f72a23 sw a5,1620(a4) + adcHandle->baseAddress->ADC_EN.reg = BASE_CFG_ENABLE; /* Enable ADC Controller */ + 3001aae: fec42783 lw a5,-20(s0) + 3001ab2: 439c lw a5,0(a5) + 3001ab4: 4705 li a4,1 + 3001ab6: 30e7a023 sw a4,768(a5) # 40000300 + BASE_FUNC_DelayUs(100); /* Wait for 100 us until the ADC controller is stable */ + 3001aba: 06400513 li a0,100 + 3001abe: 2929 jal ra,3001ed8 + return BASE_STATUS_OK; + 3001ac0: 4781 li a5,0 +} + 3001ac2: 853e mv a0,a5 + 3001ac4: 40f2 lw ra,28(sp) + 3001ac6: 4462 lw s0,24(sp) + 3001ac8: 6105 addi sp,sp,32 + 3001aca: 8082 ret + +03001acc : + * @param soc ID of SOC(start of conversion), managing the specific sample inputs. + * @param socParam Param struct of SOC. This is related to the peripheral circuit design, @ref SOC_Param. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_ConfigureSoc(ADC_Handle *adcHandle, ADC_SOCNumber soc, SOC_Param *socParam) +{ + 3001acc: 1101 addi sp,sp,-32 + 3001ace: ce06 sw ra,28(sp) + 3001ad0: cc22 sw s0,24(sp) + 3001ad2: 1000 addi s0,sp,32 + 3001ad4: fea42623 sw a0,-20(s0) + 3001ad8: feb42423 sw a1,-24(s0) + 3001adc: fec42223 sw a2,-28(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001ae0: fec42783 lw a5,-20(s0) + 3001ae4: eb89 bnez a5,3001af6 + 3001ae6: 04c00593 li a1,76 + 3001aea: 030067b7 lui a5,0x3006 + 3001aee: 44478513 addi a0,a5,1092 # 3006444 + 3001af2: 2e75 jal ra,3001eae + 3001af4: a001 j 3001af4 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001af6: fec42783 lw a5,-20(s0) + 3001afa: 4398 lw a4,0(a5) + 3001afc: 180007b7 lui a5,0x18000 + 3001b00: 00f70a63 beq a4,a5,3001b14 + 3001b04: 04d00593 li a1,77 + 3001b08: 030067b7 lui a5,0x3006 + 3001b0c: 44478513 addi a0,a5,1092 # 3006444 + 3001b10: 2e79 jal ra,3001eae + 3001b12: a001 j 3001b12 + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001b14: fe842503 lw a0,-24(s0) + 3001b18: f10ff0ef jal ra,3001228 + 3001b1c: 87aa mv a5,a0 + 3001b1e: 0017c793 xori a5,a5,1 + 3001b22: 9f81 uxtb a5 + 3001b24: cb91 beqz a5,3001b38 + 3001b26: 04e00593 li a1,78 + 3001b2a: 030067b7 lui a5,0x3006 + 3001b2e: 44478513 addi a0,a5,1092 # 3006444 + 3001b32: 2eb5 jal ra,3001eae + 3001b34: 4785 li a5,1 + 3001b36: aa3d j 3001c74 + ADC_ASSERT_PARAM(socParam != NULL); + 3001b38: fe442783 lw a5,-28(s0) + 3001b3c: eb89 bnez a5,3001b4e + 3001b3e: 04f00593 li a1,79 + 3001b42: 030067b7 lui a5,0x3006 + 3001b46: 44478513 addi a0,a5,1092 # 3006444 + 3001b4a: 2695 jal ra,3001eae + 3001b4c: a001 j 3001b4c + ADC_PARAM_CHECK_WITH_RET(IsADCSampleChannel(socParam->adcInput) == true, BASE_STATUS_ERROR); + 3001b4e: fe442783 lw a5,-28(s0) + 3001b52: 439c lw a5,0(a5) + 3001b54: 853e mv a0,a5 + 3001b56: eb6ff0ef jal ra,300120c + 3001b5a: 87aa mv a5,a0 + 3001b5c: 0017c793 xori a5,a5,1 + 3001b60: 9f81 uxtb a5 + 3001b62: cb91 beqz a5,3001b76 + 3001b64: 05000593 li a1,80 + 3001b68: 030067b7 lui a5,0x3006 + 3001b6c: 44478513 addi a0,a5,1092 # 3006444 + 3001b70: 2e3d jal ra,3001eae + 3001b72: 4785 li a5,1 + 3001b74: a201 j 3001c74 + ADC_PARAM_CHECK_WITH_RET(IsADCTotalTime(socParam->sampleTotalTime) == true, BASE_STATUS_ERROR); + 3001b76: fe442783 lw a5,-28(s0) + 3001b7a: 43dc lw a5,4(a5) + 3001b7c: 853e mv a0,a5 + 3001b7e: f48ff0ef jal ra,30012c6 + 3001b82: 87aa mv a5,a0 + 3001b84: 0017c793 xori a5,a5,1 + 3001b88: 9f81 uxtb a5 + 3001b8a: cb91 beqz a5,3001b9e + 3001b8c: 05100593 li a1,81 + 3001b90: 030067b7 lui a5,0x3006 + 3001b94: 44478513 addi a0,a5,1092 # 3006444 + 3001b98: 2e19 jal ra,3001eae + 3001b9a: 4785 li a5,1 + 3001b9c: a8e1 j 3001c74 + ADC_PARAM_CHECK_WITH_RET(IsADCTrigSource(socParam->trigSource) == true, BASE_STATUS_ERROR); + 3001b9e: fe442783 lw a5,-28(s0) + 3001ba2: 479c lw a5,8(a5) + 3001ba4: 853e mv a0,a5 + 3001ba6: ebaff0ef jal ra,3001260 + 3001baa: 87aa mv a5,a0 + 3001bac: 0017c793 xori a5,a5,1 + 3001bb0: 9f81 uxtb a5 + 3001bb2: cb91 beqz a5,3001bc6 + 3001bb4: 05200593 li a1,82 + 3001bb8: 030067b7 lui a5,0x3006 + 3001bbc: 44478513 addi a0,a5,1092 # 3006444 + 3001bc0: 24fd jal ra,3001eae + 3001bc2: 4785 li a5,1 + 3001bc4: a845 j 3001c74 + ADC_PARAM_CHECK_WITH_RET(IsADCFinishMode(socParam->finishMode) == true, BASE_STATUS_ERROR); + 3001bc6: fe442783 lw a5,-28(s0) + 3001bca: 4b9c lw a5,16(a5) + 3001bcc: 853e mv a0,a5 + 3001bce: eaeff0ef jal ra,300127c + 3001bd2: 87aa mv a5,a0 + 3001bd4: 0017c793 xori a5,a5,1 + 3001bd8: 9f81 uxtb a5 + 3001bda: cb91 beqz a5,3001bee + 3001bdc: 05300593 li a1,83 + 3001be0: 030067b7 lui a5,0x3006 + 3001be4: 44478513 addi a0,a5,1092 # 3006444 + 3001be8: 24d9 jal ra,3001eae + 3001bea: 4785 li a5,1 + 3001bec: a061 j 3001c74 + DCL_ADC_SOCxSelectChannel(adcHandle->baseAddress, soc, socParam->adcInput); /* Set channel */ + 3001bee: fec42783 lw a5,-20(s0) + 3001bf2: 4398 lw a4,0(a5) + 3001bf4: fe442783 lw a5,-28(s0) + 3001bf8: 439c lw a5,0(a5) + 3001bfa: 863e mv a2,a5 + 3001bfc: fe842583 lw a1,-24(s0) + 3001c00: 853a mv a0,a4 + 3001c02: 32c9 jal ra,30015c4 + DCL_ADC_SOCxSetAcqps(adcHandle->baseAddress, soc, socParam->sampleTotalTime); /* Set sampling time */ + 3001c04: fec42783 lw a5,-20(s0) + 3001c08: 4398 lw a4,0(a5) + 3001c0a: fe442783 lw a5,-28(s0) + 3001c0e: 43dc lw a5,4(a5) + 3001c10: 863e mv a2,a5 + 3001c12: fe842583 lw a1,-24(s0) + 3001c16: 853a mv a0,a4 + 3001c18: 3601 jal ra,3001718 + DCL_ADC_SOCxSelcetTrigSource(adcHandle->baseAddress, soc, socParam->trigSource); /* Set trigger source */ + 3001c1a: fec42783 lw a5,-20(s0) + 3001c1e: 4398 lw a4,0(a5) + 3001c20: fe442783 lw a5,-28(s0) + 3001c24: 479c lw a5,8(a5) + 3001c26: 863e mv a2,a5 + 3001c28: fe842583 lw a1,-24(s0) + 3001c2c: 853a mv a0,a4 + 3001c2e: 3491 jal ra,3001672 + if (socParam->continueMode == true) { /* Continuous Mode Judgment */ + 3001c30: fe442783 lw a5,-28(s0) + 3001c34: 27dc lbu a5,12(a5) + 3001c36: cb89 beqz a5,3001c48 + DCL_ADC_EnableSOCxContinue(adcHandle->baseAddress, soc); + 3001c38: fec42783 lw a5,-20(s0) + 3001c3c: 439c lw a5,0(a5) + 3001c3e: fe842583 lw a1,-24(s0) + 3001c42: 853e mv a0,a5 + 3001c44: 39e1 jal ra,300191c + 3001c46: a801 j 3001c56 + } else { + DCL_ADC_DisableSOCxContinue(adcHandle->baseAddress, soc); + 3001c48: fec42783 lw a5,-20(s0) + 3001c4c: 439c lw a5,0(a5) + 3001c4e: fe842583 lw a1,-24(s0) + 3001c52: 853e mv a0,a5 + 3001c54: 3399 jal ra,300199a + } + adcHandle->ADC_SOCxParam[soc].finishMode = socParam->finishMode; + 3001c56: fe442783 lw a5,-28(s0) + 3001c5a: 4b9c lw a5,16(a5) + 3001c5c: 01079713 slli a4,a5,0x10 + 3001c60: 8341 srli a4,a4,0x10 + 3001c62: fec42683 lw a3,-20(s0) + 3001c66: fe842783 lw a5,-24(s0) + 3001c6a: 07a1 addi a5,a5,8 + 3001c6c: 0786 slli a5,a5,0x1 + 3001c6e: 97b6 add a5,a5,a3 + 3001c70: a3da sh a4,4(a5) + return BASE_STATUS_OK; + 3001c72: 4781 li a5,0 +} + 3001c74: 853e mv a0,a5 + 3001c76: 40f2 lw ra,28(sp) + 3001c78: 4462 lw s0,24(sp) + 3001c7a: 6105 addi sp,sp,32 + 3001c7c: 8082 ret + +03001c7e : + * interrupt is reported. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_StartIt(ADC_Handle *adcHandle) +{ + 3001c7e: 7179 addi sp,sp,-48 + 3001c80: d606 sw ra,44(sp) + 3001c82: d422 sw s0,40(sp) + 3001c84: 1800 addi s0,sp,48 + 3001c86: fca42e23 sw a0,-36(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001c8a: fdc42783 lw a5,-36(s0) + 3001c8e: eb89 bnez a5,3001ca0 + 3001c90: 0af00593 li a1,175 + 3001c94: 030067b7 lui a5,0x3006 + 3001c98: 44478513 addi a0,a5,1092 # 3006444 + 3001c9c: 2c09 jal ra,3001eae + 3001c9e: a001 j 3001c9e + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001ca0: fdc42783 lw a5,-36(s0) + 3001ca4: 4398 lw a4,0(a5) + 3001ca6: 180007b7 lui a5,0x18000 + 3001caa: 00f70a63 beq a4,a5,3001cbe + 3001cae: 0b000593 li a1,176 + 3001cb2: 030067b7 lui a5,0x3006 + 3001cb6: 44478513 addi a0,a5,1092 # 3006444 + 3001cba: 2ad5 jal ra,3001eae + 3001cbc: a001 j 3001cbc + unsigned int intVal = 0; + 3001cbe: fe042423 sw zero,-24(s0) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001cc2: fe042623 sw zero,-20(s0) + 3001cc6: a859 j 3001d5c + intVal = adcHandle->ADC_SOCxParam[i].finishMode; + 3001cc8: fdc42703 lw a4,-36(s0) + 3001ccc: fec42783 lw a5,-20(s0) + 3001cd0: 07a1 addi a5,a5,8 + 3001cd2: 0786 slli a5,a5,0x1 + 3001cd4: 97ba add a5,a5,a4 + 3001cd6: 23de lhu a5,4(a5) + 3001cd8: fef42423 sw a5,-24(s0) + switch (intVal) { + 3001cdc: fe842783 lw a5,-24(s0) + 3001ce0: 4711 li a4,4 + 3001ce2: 02e78a63 beq a5,a4,3001d16 + 3001ce6: 4711 li a4,4 + 3001ce8: 00f76663 bltu a4,a5,3001cf4 + 3001cec: 470d li a4,3 + 3001cee: 00e78a63 beq a5,a4,3001d02 + break; + case ADC_SOCFINISH_INT3: + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + break; + default: + break; + 3001cf2: a085 j 3001d52 + switch (intVal) { + 3001cf4: 4715 li a4,5 + 3001cf6: 02e78a63 beq a5,a4,3001d2a + 3001cfa: 4719 li a4,6 + 3001cfc: 04e78163 beq a5,a4,3001d3e + break; + 3001d00: a889 j 3001d52 + DCL_ADC_SetSOCxBlindInt0(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 0 */ + 3001d02: fdc42783 lw a5,-36(s0) + 3001d06: 439c lw a5,0(a5) + 3001d08: fec42703 lw a4,-20(s0) + 3001d0c: 85ba mv a1,a4 + 3001d0e: 853e mv a0,a5 + 3001d10: e16ff0ef jal ra,3001326 + break; + 3001d14: a83d j 3001d52 + DCL_ADC_SetSOCxBlindInt1(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 1 */ + 3001d16: fdc42783 lw a5,-36(s0) + 3001d1a: 439c lw a5,0(a5) + 3001d1c: fec42703 lw a4,-20(s0) + 3001d20: 85ba mv a1,a4 + 3001d22: 853e mv a0,a5 + 3001d24: e7eff0ef jal ra,30013a2 + break; + 3001d28: a02d j 3001d52 + DCL_ADC_SetSOCxBlindInt2(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 2 */ + 3001d2a: fdc42783 lw a5,-36(s0) + 3001d2e: 439c lw a5,0(a5) + 3001d30: fec42703 lw a4,-20(s0) + 3001d34: 85ba mv a1,a4 + 3001d36: 853e mv a0,a5 + 3001d38: ee8ff0ef jal ra,3001420 + break; + 3001d3c: a819 j 3001d52 + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + 3001d3e: fdc42783 lw a5,-36(s0) + 3001d42: 439c lw a5,0(a5) + 3001d44: fec42703 lw a4,-20(s0) + 3001d48: 85ba mv a1,a4 + 3001d4a: 853e mv a0,a5 + 3001d4c: f50ff0ef jal ra,300149c + break; + 3001d50: 0001 nop + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001d52: fec42783 lw a5,-20(s0) + 3001d56: 0785 addi a5,a5,1 + 3001d58: fef42623 sw a5,-20(s0) + 3001d5c: fec42703 lw a4,-20(s0) + 3001d60: 47bd li a5,15 + 3001d62: f6e7d3e3 bge a5,a4,3001cc8 + } + } /* Enable ADC Interrupt */ + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER0); + 3001d66: fdc42783 lw a5,-36(s0) + 3001d6a: 439c lw a5,0(a5) + 3001d6c: 4581 li a1,0 + 3001d6e: 853e mv a0,a5 + 3001d70: faaff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER1); + 3001d74: fdc42783 lw a5,-36(s0) + 3001d78: 439c lw a5,0(a5) + 3001d7a: 4585 li a1,1 + 3001d7c: 853e mv a0,a5 + 3001d7e: f9cff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + 3001d82: fdc42783 lw a5,-36(s0) + 3001d86: 439c lw a5,0(a5) + 3001d88: 4589 li a1,2 + 3001d8a: 853e mv a0,a5 + 3001d8c: f8eff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER3); + 3001d90: fdc42783 lw a5,-36(s0) + 3001d94: 439c lw a5,0(a5) + 3001d96: 458d li a1,3 + 3001d98: 853e mv a0,a5 + 3001d9a: f80ff0ef jal ra,300151a + return BASE_STATUS_OK; + 3001d9e: 4781 li a5,0 +} + 3001da0: 853e mv a0,a5 + 3001da2: 50b2 lw ra,44(sp) + 3001da4: 5422 lw s0,40(sp) + 3001da6: 6145 addi sp,sp,48 + 3001da8: 8082 ret + +03001daa : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_SoftTrigSample(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001daa: 1101 addi sp,sp,-32 + 3001dac: ce06 sw ra,28(sp) + 3001dae: cc22 sw s0,24(sp) + 3001db0: 1000 addi s0,sp,32 + 3001db2: fea42623 sw a0,-20(s0) + 3001db6: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001dba: fec42783 lw a5,-20(s0) + 3001dbe: eb89 bnez a5,3001dd0 + 3001dc0: 0e500593 li a1,229 + 3001dc4: 030067b7 lui a5,0x3006 + 3001dc8: 44478513 addi a0,a5,1092 # 3006444 + 3001dcc: 20cd jal ra,3001eae + 3001dce: a001 j 3001dce + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001dd0: fec42783 lw a5,-20(s0) + 3001dd4: 4398 lw a4,0(a5) + 3001dd6: 180007b7 lui a5,0x18000 + 3001dda: 00f70a63 beq a4,a5,3001dee + 3001dde: 0e600593 li a1,230 + 3001de2: 030067b7 lui a5,0x3006 + 3001de6: 44478513 addi a0,a5,1092 # 3006444 + 3001dea: 20d1 jal ra,3001eae + 3001dec: a001 j 3001dec + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001dee: fe842503 lw a0,-24(s0) + 3001df2: c36ff0ef jal ra,3001228 + 3001df6: 87aa mv a5,a0 + 3001df8: 0017c793 xori a5,a5,1 + 3001dfc: 9f81 uxtb a5 + 3001dfe: cb91 beqz a5,3001e12 + 3001e00: 0e700593 li a1,231 + 3001e04: 030067b7 lui a5,0x3006 + 3001e08: 44478513 addi a0,a5,1092 # 3006444 + 3001e0c: 204d jal ra,3001eae + 3001e0e: 4785 li a5,1 + 3001e10: a809 j 3001e22 + DCL_ADC_SOCxSoftTrigger(adcHandle->baseAddress, soc); /* Software triggers a single SOC */ + 3001e12: fec42783 lw a5,-20(s0) + 3001e16: 439c lw a5,0(a5) + 3001e18: fe842583 lw a1,-24(s0) + 3001e1c: 853e mv a0,a5 + 3001e1e: 3265 jal ra,30017c6 + return BASE_STATUS_OK; + 3001e20: 4781 li a5,0 +} + 3001e22: 853e mv a0,a5 + 3001e24: 40f2 lw ra,28(sp) + 3001e26: 4462 lw s0,24(sp) + 3001e28: 6105 addi sp,sp,32 + 3001e2a: 8082 ret + +03001e2c : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval unsigned int value of ADC convert result. + */ +unsigned int HAL_ADC_GetConvResult(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001e2c: 1101 addi sp,sp,-32 + 3001e2e: ce06 sw ra,28(sp) + 3001e30: cc22 sw s0,24(sp) + 3001e32: 1000 addi s0,sp,32 + 3001e34: fea42623 sw a0,-20(s0) + 3001e38: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001e3c: fec42783 lw a5,-20(s0) + 3001e40: eb89 bnez a5,3001e52 + 3001e42: 0f400593 li a1,244 + 3001e46: 030067b7 lui a5,0x3006 + 3001e4a: 44478513 addi a0,a5,1092 # 3006444 + 3001e4e: 2085 jal ra,3001eae + 3001e50: a001 j 3001e50 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001e52: fec42783 lw a5,-20(s0) + 3001e56: 4398 lw a4,0(a5) + 3001e58: 180007b7 lui a5,0x18000 + 3001e5c: 00f70a63 beq a4,a5,3001e70 + 3001e60: 0f500593 li a1,245 + 3001e64: 030067b7 lui a5,0x3006 + 3001e68: 44478513 addi a0,a5,1092 # 3006444 + 3001e6c: 2089 jal ra,3001eae + 3001e6e: a001 j 3001e6e + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001e70: fe842503 lw a0,-24(s0) + 3001e74: bb4ff0ef jal ra,3001228 + 3001e78: 87aa mv a5,a0 + 3001e7a: 0017c793 xori a5,a5,1 + 3001e7e: 9f81 uxtb a5 + 3001e80: cb91 beqz a5,3001e94 + 3001e82: 0f600593 li a1,246 + 3001e86: 030067b7 lui a5,0x3006 + 3001e8a: 44478513 addi a0,a5,1092 # 3006444 + 3001e8e: 2005 jal ra,3001eae + 3001e90: 4785 li a5,1 + 3001e92: a809 j 3001ea4 + return DCL_ADC_ReadSOCxResult(adcHandle->baseAddress, soc); + 3001e94: fec42783 lw a5,-20(s0) + 3001e98: 439c lw a5,0(a5) + 3001e9a: fe842583 lw a1,-24(s0) + 3001e9e: 853e mv a0,a5 + 3001ea0: 3409 jal ra,30018a2 + 3001ea2: 87aa mv a5,a0 +} + 3001ea4: 853e mv a0,a5 + 3001ea6: 40f2 lw ra,28(sp) + 3001ea8: 4462 lw s0,24(sp) + 3001eaa: 6105 addi sp,sp,32 + 3001eac: 8082 ret + +03001eae : + * @param file Pointer to the name of the file where the error occurs. + * @param line Number of the line where the error occurs. + * @retval None. + */ +__weak void AssertErrorLog(char *file, unsigned int line) +{ + 3001eae: 1101 addi sp,sp,-32 + 3001eb0: ce22 sw s0,28(sp) + 3001eb2: 1000 addi s0,sp,32 + 3001eb4: fea42623 sw a0,-20(s0) + 3001eb8: feb42423 sw a1,-24(s0) + /* Use only if the user apllication is not defined. */ + BASE_FUNC_UNUSED(file); + BASE_FUNC_UNUSED(line); + 3001ebc: 0001 nop + 3001ebe: 4472 lw s0,28(sp) + 3001ec0: 6105 addi sp,sp,32 + 3001ec2: 8082 ret + +03001ec4 : + * @brief Get the systick + * @param None + * @retval The SysTick Value + */ +static inline unsigned int DCL_SYSTICK_GetTick(void) +{ + 3001ec4: 1141 addi sp,sp,-16 + 3001ec6: c622 sw s0,12(sp) + 3001ec8: 0800 addi s0,sp,16 + return SYSTICK->MTIME; /* Systick value(Lower 32bit register) */ + 3001eca: 143807b7 lui a5,0x14380 + 3001ece: 479c lw a5,8(a5) +} + 3001ed0: 853e mv a0,a5 + 3001ed2: 4432 lw s0,12(sp) + 3001ed4: 0141 addi sp,sp,16 + 3001ed6: 8082 ret + +03001ed8 : + * @brief Delay number of us. + * @param us The number of us to delay. + * @retval None. + */ +void BASE_FUNC_DelayUs(unsigned int us) +{ + 3001ed8: 7179 addi sp,sp,-48 + 3001eda: d606 sw ra,44(sp) + 3001edc: d422 sw s0,40(sp) + 3001ede: 1800 addi s0,sp,48 + 3001ee0: fca42e23 sw a0,-36(s0) + unsigned int preTick = DCL_SYSTICK_GetTick(); + 3001ee4: 37c5 jal ra,3001ec4 + 3001ee6: fea42623 sw a0,-20(s0) + unsigned int tickInUs = (SYSTICK_GetCRGHZ() / CRG_FREQ_1MHz) * us; + 3001eea: 8bcff0ef jal ra,3000fa6 + 3001eee: 872a mv a4,a0 + 3001ef0: 000f47b7 lui a5,0xf4 + 3001ef4: 24078793 addi a5,a5,576 # f4240 + 3001ef8: 02f757b3 divu a5,a4,a5 + 3001efc: fdc42703 lw a4,-36(s0) + 3001f00: 02f707b3 mul a5,a4,a5 + 3001f04: fef42423 sw a5,-24(s0) + unsigned int curTick; + unsigned int delta; + + /* Wait until the delta is greater than tickInUs */ + do { + curTick = DCL_SYSTICK_GetTick(); + 3001f08: 3f75 jal ra,3001ec4 + 3001f0a: fea42223 sw a0,-28(s0) + delta = (curTick >= preTick) ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick + 1; + 3001f0e: fe442703 lw a4,-28(s0) + 3001f12: fec42783 lw a5,-20(s0) + 3001f16: 40f707b3 sub a5,a4,a5 + 3001f1a: fef42023 sw a5,-32(s0) + } while (delta < tickInUs); + 3001f1e: fe042703 lw a4,-32(s0) + 3001f22: fe842783 lw a5,-24(s0) + 3001f26: fef761e3 bltu a4,a5,3001f08 +} + 3001f2a: 0001 nop + 3001f2c: 50b2 lw ra,44(sp) + 3001f2e: 5422 lw s0,40(sp) + 3001f30: 6145 addi sp,sp,48 + 3001f32: 8082 ret + +03001f34 : + * @brief Delay number of ms. + * @param ms The number of ms to delay. + * @retval None. + */ +void BASE_FUNC_DelayMs(unsigned int ms) +{ + 3001f34: 7179 addi sp,sp,-48 + 3001f36: d606 sw ra,44(sp) + 3001f38: d422 sw s0,40(sp) + 3001f3a: 1800 addi s0,sp,48 + 3001f3c: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < ms; ++i) { + 3001f40: fe042623 sw zero,-20(s0) + 3001f44: a809 j 3001f56 + BASE_FUNC_DelayUs(BASE_DEFINE_DELAY_US_IN_MS); + 3001f46: 3e800513 li a0,1000 + 3001f4a: 3779 jal ra,3001ed8 + for (unsigned int i = 0; i < ms; ++i) { + 3001f4c: fec42783 lw a5,-20(s0) + 3001f50: 0785 addi a5,a5,1 + 3001f52: fef42623 sw a5,-20(s0) + 3001f56: fec42703 lw a4,-20(s0) + 3001f5a: fdc42783 lw a5,-36(s0) + 3001f5e: fef764e3 bltu a4,a5,3001f46 + } +} + 3001f62: 0001 nop + 3001f64: 50b2 lw ra,44(sp) + 3001f66: 5422 lw s0,40(sp) + 3001f68: 6145 addi sp,sp,48 + 3001f6a: 8082 ret + +03001f6c : + * @brief Delay number of seconds. + * @param seconds The number of seconds to delay. + * @retval None. + */ +void BASE_FUNC_DelaySeconds(unsigned int seconds) +{ + 3001f6c: 7179 addi sp,sp,-48 + 3001f6e: d606 sw ra,44(sp) + 3001f70: d422 sw s0,40(sp) + 3001f72: 1800 addi s0,sp,48 + 3001f74: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < seconds; ++i) { + 3001f78: fe042623 sw zero,-20(s0) + 3001f7c: a809 j 3001f8e + BASE_FUNC_DelayMs(BASE_DEFINE_DELAY_MS_IN_SEC); + 3001f7e: 3e800513 li a0,1000 + 3001f82: 3f4d jal ra,3001f34 + for (unsigned int i = 0; i < seconds; ++i) { + 3001f84: fec42783 lw a5,-20(s0) + 3001f88: 0785 addi a5,a5,1 + 3001f8a: fef42623 sw a5,-20(s0) + 3001f8e: fec42703 lw a4,-20(s0) + 3001f92: fdc42783 lw a5,-36(s0) + 3001f96: fef764e3 bltu a4,a5,3001f7e + } +} + 3001f9a: 0001 nop + 3001f9c: 50b2 lw ra,44(sp) + 3001f9e: 5422 lw s0,40(sp) + 3001fa0: 6145 addi sp,sp,48 + 3001fa2: 8082 ret + +03001fa4 : + * @param delay The number of 'units' to delay. + * @param units Specifies the delay unit. + * @retval None. + */ +void BASE_FUNC_Delay(unsigned int delay, BASE_DelayUnit units) +{ + 3001fa4: 1101 addi sp,sp,-32 + 3001fa6: ce06 sw ra,28(sp) + 3001fa8: cc22 sw s0,24(sp) + 3001faa: 1000 addi s0,sp,32 + 3001fac: fea42623 sw a0,-20(s0) + 3001fb0: feb42423 sw a1,-24(s0) + switch (units) { + 3001fb4: fe842783 lw a5,-24(s0) + 3001fb8: 3e800713 li a4,1000 + 3001fbc: 02e78063 beq a5,a4,3001fdc + 3001fc0: 000f4737 lui a4,0xf4 + 3001fc4: 24070713 addi a4,a4,576 # f4240 + 3001fc8: 00e78e63 beq a5,a4,3001fe4 + 3001fcc: 4705 li a4,1 + 3001fce: 00e78363 beq a5,a4,3001fd4 + break; + case BASE_DEFINE_DELAY_MICROSECS: + BASE_FUNC_DelayUs(delay); + break; + default: + break; + 3001fd2: a829 j 3001fec + BASE_FUNC_DelaySeconds(delay); + 3001fd4: fec42503 lw a0,-20(s0) + 3001fd8: 3f51 jal ra,3001f6c + break; + 3001fda: a809 j 3001fec + BASE_FUNC_DelayMs(delay); + 3001fdc: fec42503 lw a0,-20(s0) + 3001fe0: 3f91 jal ra,3001f34 + break; + 3001fe2: a029 j 3001fec + BASE_FUNC_DelayUs(delay); + 3001fe4: fec42503 lw a0,-20(s0) + 3001fe8: 3dc5 jal ra,3001ed8 + break; + 3001fea: 0001 nop + } + return; + 3001fec: 0001 nop + 3001fee: 40f2 lw ra,28(sp) + 3001ff0: 4462 lw s0,24(sp) + 3001ff2: 6105 addi sp,sp,32 + 3001ff4: 8082 ret + +03001ff6 : + * @brief Clear external interrupt + * @param irqNum external interrupt number + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_NOT_CREATED + */ +static inline void IRQ_ClearN(unsigned int irqNum) +{ + 3001ff6: 1101 addi sp,sp,-32 + 3001ff8: ce22 sw s0,28(sp) + 3001ffa: 1000 addi s0,sp,32 + 3001ffc: fea42623 sw a0,-20(s0) + asm volatile("fence"); + 3002000: 0ff0000f fence + WRITE_CUSTOM_CSR_VAL(LOCIPCLR, irqNum); + 3002004: fec42783 lw a5,-20(s0) + 3002008: 82be mv t0,a5 + 300200a: bf029073 csrw 0xbf0,t0 +} + 300200e: 0001 nop + 3002010: 4472 lw s0,28(sp) + 3002012: 6105 addi sp,sp,32 + 3002014: 8082 ret + +03002016 : + * @brief Exception/Interrupt Handler Entry. + * @param irqNum external interrupt number. + * @retval None + */ +void InterruptEntry(unsigned int irqNum) +{ + 3002016: 1101 addi sp,sp,-32 + 3002018: ce06 sw ra,28(sp) + 300201a: cc22 sw s0,24(sp) + 300201c: 1000 addi s0,sp,32 + 300201e: fea42623 sw a0,-20(s0) + g_irqCallbackFunc[irqNum].pfnHandler(g_irqCallbackFunc[irqNum].param); + 3002022: 040007b7 lui a5,0x4000 + 3002026: 0fc78713 addi a4,a5,252 # 40000fc + 300202a: fec42783 lw a5,-20(s0) + 300202e: 078e slli a5,a5,0x3 + 3002030: 97ba add a5,a5,a4 + 3002032: 4394 lw a3,0(a5) + 3002034: 040007b7 lui a5,0x4000 + 3002038: 0fc78713 addi a4,a5,252 # 40000fc + 300203c: fec42783 lw a5,-20(s0) + 3002040: 078e slli a5,a5,0x3 + 3002042: 97ba add a5,a5,a4 + 3002044: 43dc lw a5,4(a5) + 3002046: 853e mv a0,a5 + 3002048: 9682 jalr a3 + IRQ_ClearN(irqNum); + 300204a: fec42503 lw a0,-20(s0) + 300204e: 3765 jal ra,3001ff6 +} + 3002050: 0001 nop + 3002052: 40f2 lw ra,28(sp) + 3002054: 4462 lw s0,24(sp) + 3002056: 6105 addi sp,sp,32 + 3002058: 8082 ret + +0300205a : + * @brief Irq initialization. + * @param none. + * @retval None + */ +void IRQ_Init(void) +{ + 300205a: 1101 addi sp,sp,-32 + 300205c: ce22 sw s0,28(sp) + 300205e: 1000 addi s0,sp,32 + unsigned int index; + + for (index = 0; index < IRQ_MAX; index++) { + 3002060: fe042623 sw zero,-20(s0) + 3002064: a82d j 300209e + g_irqCallbackFunc[index].pfnHandler = IRQ_DummyHandler; + 3002066: 040007b7 lui a5,0x4000 + 300206a: 0fc78713 addi a4,a5,252 # 40000fc + 300206e: fec42783 lw a5,-20(s0) + 3002072: 078e slli a5,a5,0x3 + 3002074: 97ba add a5,a5,a4 + 3002076: 03003737 lui a4,0x3003 + 300207a: 8fa70713 addi a4,a4,-1798 # 30028fa + 300207e: c398 sw a4,0(a5) + g_irqCallbackFunc[index].param = NULL; + 3002080: 040007b7 lui a5,0x4000 + 3002084: 0fc78713 addi a4,a5,252 # 40000fc + 3002088: fec42783 lw a5,-20(s0) + 300208c: 078e slli a5,a5,0x3 + 300208e: 97ba add a5,a5,a4 + 3002090: 0007a223 sw zero,4(a5) + for (index = 0; index < IRQ_MAX; index++) { + 3002094: fec42783 lw a5,-20(s0) + 3002098: 0785 addi a5,a5,1 + 300209a: fef42623 sw a5,-20(s0) + 300209e: fec42703 lw a4,-20(s0) + 30020a2: 07200793 li a5,114 + 30020a6: fce7f0e3 bgeu a5,a4,3002066 + } +} + 30020aa: 0001 nop + 30020ac: 4472 lw s0,28(sp) + 30020ae: 6105 addi sp,sp,32 + 30020b0: 8082 ret + +030020b2 : + * @note In the corresponding interrupt handler, manually clear the interrupt source and the corresponding interrupt + * flag bit (call the IRQ_ClearN function to clear the interrupt), otherwise the interrupt will always be + * triggered. + */ +unsigned int IRQ_Register(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 30020b2: 1101 addi sp,sp,-32 + 30020b4: ce06 sw ra,28(sp) + 30020b6: cc22 sw s0,24(sp) + 30020b8: 1000 addi s0,sp,32 + 30020ba: fea42623 sw a0,-20(s0) + 30020be: feb42423 sw a1,-24(s0) + 30020c2: fec42223 sw a2,-28(s0) + INTERRUPT_ASSERT_PARAM(func != NULL); + 30020c6: fe842783 lw a5,-24(s0) + 30020ca: eb89 bnez a5,30020dc + 30020cc: 06300593 li a1,99 + 30020d0: 030067b7 lui a5,0x3006 + 30020d4: 47878513 addi a0,a5,1144 # 3006478 + 30020d8: 3bd9 jal ra,3001eae + 30020da: a001 j 30020da + INTERRUPT_PARAM_CHECK_WITH_RET(irqNum < IRQ_MAX, IRQ_ERRNO_NUM_INVALID); + 30020dc: fec42703 lw a4,-20(s0) + 30020e0: 07200793 li a5,114 + 30020e4: 00e7fb63 bgeu a5,a4,30020fa + 30020e8: 06400593 li a1,100 + 30020ec: 030067b7 lui a5,0x3006 + 30020f0: 47878513 addi a0,a5,1144 # 3006478 + 30020f4: 3b6d jal ra,3001eae + 30020f6: 4789 li a5,2 + 30020f8: a81d j 300212e + + if (g_irqCallbackFunc[irqNum].pfnHandler != IRQ_DummyHandler) { + 30020fa: 040007b7 lui a5,0x4000 + 30020fe: 0fc78713 addi a4,a5,252 # 40000fc + 3002102: fec42783 lw a5,-20(s0) + 3002106: 078e slli a5,a5,0x3 + 3002108: 97ba add a5,a5,a4 + 300210a: 4398 lw a4,0(a5) + 300210c: 030037b7 lui a5,0x3003 + 3002110: 8fa78793 addi a5,a5,-1798 # 30028fa + 3002114: 00f70463 beq a4,a5,300211c + return IRQ_ERRNO_ALREADY_CREATED; + 3002118: 478d li a5,3 + 300211a: a811 j 300212e + } + IRQ_SetCallBack(irqNum, func, arg); + 300211c: fe442603 lw a2,-28(s0) + 3002120: fe842583 lw a1,-24(s0) + 3002124: fec42503 lw a0,-20(s0) + 3002128: 7e4000ef jal ra,300290c + return BASE_STATUS_OK; + 300212c: 4781 li a5,0 +} + 300212e: 853e mv a0,a5 + 3002130: 40f2 lw ra,28(sp) + 3002132: 4462 lw s0,24(sp) + 3002134: 6105 addi sp,sp,32 + 3002136: 8082 ret + +03002138 : + * @brief Enable the specified interrupt. + * @param irqNum External interrupt number. + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID. + */ +unsigned int IRQ_EnableN(unsigned int irqNum) +{ + 3002138: 7139 addi sp,sp,-64 + 300213a: de06 sw ra,60(sp) + 300213c: dc22 sw s0,56(sp) + 300213e: 0080 addi s0,sp,64 + 3002140: fca42623 sw a0,-52(s0) + unsigned int locienVal; +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 3002144: fcc42703 lw a4,-52(s0) + 3002148: 47e5 li a5,25 + 300214a: 00e7f863 bgeu a5,a4,300215a + 300214e: fcc42703 lw a4,-52(s0) + 3002152: 07200793 li a5,114 + 3002156: 00e7fb63 bgeu a5,a4,300216c + 300215a: 0c300593 li a1,195 + 300215e: 030067b7 lui a5,0x3006 + 3002162: 47878513 addi a0,a5,1144 # 3006478 + 3002166: 33a1 jal ra,3001eae + 3002168: 4789 li a5,2 + 300216a: a8cd j 300225c + /* The interrupt enable bits that can be controlled in the mie register (32 bits), up to 32 + can be controlled, and each bit corresponds to an interrupt enable */ + + RISCV_PRIV_MODE_SWITCH(priv); + + if (irqNum < IRQ_MIE_TOTAL_CNT) { + 300216c: fcc42703 lw a4,-52(s0) + 3002170: 47fd li a5,31 + 3002172: 02e7e063 bltu a5,a4,3002192 + irqOrder = 1U << irqNum; + 3002176: 4705 li a4,1 + 3002178: fcc42783 lw a5,-52(s0) + 300217c: 00f717b3 sll a5,a4,a5 + 3002180: fef42623 sw a5,-20(s0) + SET_CSR(mie, irqOrder); + 3002184: fec42783 lw a5,-20(s0) + 3002188: 3047a7f3 csrrs a5,mie,a5 + 300218c: fcf42c23 sw a5,-40(s0) + 3002190: a0e9 j 300225a + } else if (irqNum < IRQ_LOCIEN1_OFFSET) { + 3002192: fcc42703 lw a4,-52(s0) + 3002196: 03f00793 li a5,63 + 300219a: 02e7ef63 bltu a5,a4,30021d8 + irqOrder = irqNum - IRQ_MIE_TOTAL_CNT; + 300219e: fcc42783 lw a5,-52(s0) + 30021a2: 1781 addi a5,a5,-32 + 30021a4: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN0); + 30021a8: be0027f3 csrr a5,0xbe0 + 30021ac: fcf42e23 sw a5,-36(s0) + 30021b0: fdc42783 lw a5,-36(s0) + 30021b4: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 30021b8: 4705 li a4,1 + 30021ba: fec42783 lw a5,-20(s0) + 30021be: 00f717b3 sll a5,a4,a5 + 30021c2: fe442703 lw a4,-28(s0) + 30021c6: 8fd9 or a5,a5,a4 + 30021c8: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN0, locienVal); + 30021cc: fe442783 lw a5,-28(s0) + 30021d0: 82be mv t0,a5 + 30021d2: be029073 csrw 0xbe0,t0 + 30021d6: a051 j 300225a + } else if (irqNum < IRQ_LOCIEN2_OFFSET) { + 30021d8: fcc42703 lw a4,-52(s0) + 30021dc: 05f00793 li a5,95 + 30021e0: 04e7e063 bltu a5,a4,3002220 + irqOrder = irqNum - IRQ_LOCIEN1_OFFSET; + 30021e4: fcc42783 lw a5,-52(s0) + 30021e8: fc078793 addi a5,a5,-64 + 30021ec: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN1); + 30021f0: be1027f3 csrr a5,0xbe1 + 30021f4: fef42023 sw a5,-32(s0) + 30021f8: fe042783 lw a5,-32(s0) + 30021fc: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 3002200: 4705 li a4,1 + 3002202: fec42783 lw a5,-20(s0) + 3002206: 00f717b3 sll a5,a4,a5 + 300220a: fe442703 lw a4,-28(s0) + 300220e: 8fd9 or a5,a5,a4 + 3002210: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN1, locienVal); + 3002214: fe442783 lw a5,-28(s0) + 3002218: 82be mv t0,a5 + 300221a: be129073 csrw 0xbe1,t0 + 300221e: a835 j 300225a + } else { + irqOrder = irqNum - IRQ_LOCIEN2_OFFSET; + 3002220: fcc42783 lw a5,-52(s0) + 3002224: fa078793 addi a5,a5,-96 + 3002228: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN2); + 300222c: be2027f3 csrr a5,0xbe2 + 3002230: fef42423 sw a5,-24(s0) + 3002234: fe842783 lw a5,-24(s0) + 3002238: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 300223c: 4705 li a4,1 + 300223e: fec42783 lw a5,-20(s0) + 3002242: 00f717b3 sll a5,a4,a5 + 3002246: fe442703 lw a4,-28(s0) + 300224a: 8fd9 or a5,a5,a4 + 300224c: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN2, locienVal); + 3002250: fe442783 lw a5,-28(s0) + 3002254: 82be mv t0,a5 + 3002256: be229073 csrw 0xbe2,t0 + } + + RISCV_PRIV_MODE_SWITCH(priv); + + return BASE_STATUS_OK; + 300225a: 4781 li a5,0 +} + 300225c: 853e mv a0,a5 + 300225e: 50f2 lw ra,60(sp) + 3002260: 5462 lw s0,56(sp) + 3002262: 6121 addi sp,sp,64 + 3002264: 8082 ret + +03002266 : + * @param context. + * @note The actual code is generated by IDE + * @retval None. + */ +__weak void SysErrPrint(const SyserrContext *context) +{ + 3002266: 1101 addi sp,sp,-32 + 3002268: ce22 sw s0,28(sp) + 300226a: 1000 addi s0,sp,32 + 300226c: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(context); +} + 3002270: 0001 nop + 3002272: 4472 lw s0,28(sp) + 3002274: 6105 addi sp,sp,32 + 3002276: 8082 ret + +03002278 : + * @brief System error completion processing + * @param None. + * @retval None. + */ +static void SysErrFinish(void) +{ + 3002278: 1141 addi sp,sp,-16 + 300227a: c622 sw s0,12(sp) + 300227c: 0800 addi s0,sp,16 +} + 300227e: 0001 nop + 3002280: 4432 lw s0,12(sp) + 3002282: 0141 addi sp,sp,16 + 3002284: 8082 ret + +03002286 : + * @brief Exception Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrExcEntry(const SyserrContext *context) +{ + 3002286: 1101 addi sp,sp,-32 + 3002288: ce06 sw ra,28(sp) + 300228a: cc22 sw s0,24(sp) + 300228c: 1000 addi s0,sp,32 + 300228e: fea42623 sw a0,-20(s0) + SysErrPrint(context); + 3002292: fec42503 lw a0,-20(s0) + 3002296: 3fc1 jal ra,3002266 + SysErrFinish(); + 3002298: 37c5 jal ra,3002278 +} + 300229a: 0001 nop + 300229c: 40f2 lw ra,28(sp) + 300229e: 4462 lw s0,24(sp) + 30022a0: 6105 addi sp,sp,32 + 30022a2: 8082 ret + +030022a4 : + * @brief NMI Interrupt Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrNmiEntry(const SyserrContext *context) +{ + 30022a4: 1101 addi sp,sp,-32 + 30022a6: ce06 sw ra,28(sp) + 30022a8: cc22 sw s0,24(sp) + 30022aa: 1000 addi s0,sp,32 + 30022ac: fea42623 sw a0,-20(s0) + INTERRUPT_ASSERT_PARAM(context != NULL); + 30022b0: fec42783 lw a5,-20(s0) + 30022b4: eb89 bnez a5,30022c6 + 30022b6: 12d00593 li a1,301 + 30022ba: 030067b7 lui a5,0x3006 + 30022be: 47878513 addi a0,a5,1144 # 3006478 + 30022c2: 36f5 jal ra,3001eae + 30022c4: a001 j 30022c4 + SysErrPrint(context); + 30022c6: fec42503 lw a0,-20(s0) + 30022ca: 3f71 jal ra,3002266 + SysErrFinish(); + 30022cc: 3775 jal ra,3002278 +} + 30022ce: 0001 nop + 30022d0: 40f2 lw ra,28(sp) + 30022d2: 4462 lw s0,24(sp) + 30022d4: 6105 addi sp,sp,32 + 30022d6: 8082 ret + +030022d8 : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior local int prioroty. + * @retval None + */ +static void SetLocalIntNumPri(unsigned int intNum, unsigned int interPriNum, unsigned int prior) +{ + 30022d8: 711d addi sp,sp,-96 + 30022da: cea2 sw s0,92(sp) + 30022dc: 1080 addi s0,sp,96 + 30022de: faa42623 sw a0,-84(s0) + 30022e2: fab42423 sw a1,-88(s0) + 30022e6: fac42223 sw a2,-92(s0) + switch (intNum) { + 30022ea: fac42783 lw a5,-84(s0) + 30022ee: 17e1 addi a5,a5,-8 + 30022f0: 471d li a4,7 + 30022f2: 2af76363 bltu a4,a5,3002598 + 30022f6: 00279713 slli a4,a5,0x2 + 30022fa: 030067b7 lui a5,0x3006 + 30022fe: 49878793 addi a5,a5,1176 # 3006498 + 3002302: 97ba add a5,a5,a4 + 3002304: 439c lw a5,0(a5) + 3002306: 8782 jr a5 + case 8: /* GROUP8 */ + SET_LOCAL_INTER_NUM_PRI(8, interPriNum, prior); + 3002308: bc8027f3 csrr a5,0xbc8 + 300230c: faf42a23 sw a5,-76(s0) + 3002310: fb442783 lw a5,-76(s0) + 3002314: faf42823 sw a5,-80(s0) + 3002318: fa842783 lw a5,-88(s0) + 300231c: 078a slli a5,a5,0x2 + 300231e: 8bf1 andi a5,a5,28 + 3002320: 473d li a4,15 + 3002322: 00f717b3 sll a5,a4,a5 + 3002326: fff7c793 not a5,a5 + 300232a: fb042703 lw a4,-80(s0) + 300232e: 8ff9 and a5,a5,a4 + 3002330: faf42823 sw a5,-80(s0) + 3002334: fa842783 lw a5,-88(s0) + 3002338: 078a slli a5,a5,0x2 + 300233a: 8bf1 andi a5,a5,28 + 300233c: fa442703 lw a4,-92(s0) + 3002340: 00f717b3 sll a5,a4,a5 + 3002344: fb042703 lw a4,-80(s0) + 3002348: 8fd9 or a5,a5,a4 + 300234a: faf42823 sw a5,-80(s0) + 300234e: fb042783 lw a5,-80(s0) + 3002352: 82be mv t0,a5 + 3002354: bc829073 csrw 0xbc8,t0 + break; + 3002358: a489 j 300259a + case 9: /* GROUP9 */ + SET_LOCAL_INTER_NUM_PRI(9, interPriNum, prior); + 300235a: bc9027f3 csrr a5,0xbc9 + 300235e: faf42e23 sw a5,-68(s0) + 3002362: fbc42783 lw a5,-68(s0) + 3002366: faf42c23 sw a5,-72(s0) + 300236a: fa842783 lw a5,-88(s0) + 300236e: 078a slli a5,a5,0x2 + 3002370: 8bf1 andi a5,a5,28 + 3002372: 473d li a4,15 + 3002374: 00f717b3 sll a5,a4,a5 + 3002378: fff7c793 not a5,a5 + 300237c: fb842703 lw a4,-72(s0) + 3002380: 8ff9 and a5,a5,a4 + 3002382: faf42c23 sw a5,-72(s0) + 3002386: fa842783 lw a5,-88(s0) + 300238a: 078a slli a5,a5,0x2 + 300238c: 8bf1 andi a5,a5,28 + 300238e: fa442703 lw a4,-92(s0) + 3002392: 00f717b3 sll a5,a4,a5 + 3002396: fb842703 lw a4,-72(s0) + 300239a: 8fd9 or a5,a5,a4 + 300239c: faf42c23 sw a5,-72(s0) + 30023a0: fb842783 lw a5,-72(s0) + 30023a4: 82be mv t0,a5 + 30023a6: bc929073 csrw 0xbc9,t0 + break; + 30023aa: aac5 j 300259a + case 10: /* GROUP10 */ + SET_LOCAL_INTER_NUM_PRI(10, interPriNum, prior); + 30023ac: bca027f3 csrr a5,0xbca + 30023b0: fcf42223 sw a5,-60(s0) + 30023b4: fc442783 lw a5,-60(s0) + 30023b8: fcf42023 sw a5,-64(s0) + 30023bc: fa842783 lw a5,-88(s0) + 30023c0: 078a slli a5,a5,0x2 + 30023c2: 8bf1 andi a5,a5,28 + 30023c4: 473d li a4,15 + 30023c6: 00f717b3 sll a5,a4,a5 + 30023ca: fff7c793 not a5,a5 + 30023ce: fc042703 lw a4,-64(s0) + 30023d2: 8ff9 and a5,a5,a4 + 30023d4: fcf42023 sw a5,-64(s0) + 30023d8: fa842783 lw a5,-88(s0) + 30023dc: 078a slli a5,a5,0x2 + 30023de: 8bf1 andi a5,a5,28 + 30023e0: fa442703 lw a4,-92(s0) + 30023e4: 00f717b3 sll a5,a4,a5 + 30023e8: fc042703 lw a4,-64(s0) + 30023ec: 8fd9 or a5,a5,a4 + 30023ee: fcf42023 sw a5,-64(s0) + 30023f2: fc042783 lw a5,-64(s0) + 30023f6: 82be mv t0,a5 + 30023f8: bca29073 csrw 0xbca,t0 + break; + 30023fc: aa79 j 300259a + case 11: /* GROUP11 */ + SET_LOCAL_INTER_NUM_PRI(11, interPriNum, prior); + 30023fe: bcb027f3 csrr a5,0xbcb + 3002402: fcf42623 sw a5,-52(s0) + 3002406: fcc42783 lw a5,-52(s0) + 300240a: fcf42423 sw a5,-56(s0) + 300240e: fa842783 lw a5,-88(s0) + 3002412: 078a slli a5,a5,0x2 + 3002414: 8bf1 andi a5,a5,28 + 3002416: 473d li a4,15 + 3002418: 00f717b3 sll a5,a4,a5 + 300241c: fff7c793 not a5,a5 + 3002420: fc842703 lw a4,-56(s0) + 3002424: 8ff9 and a5,a5,a4 + 3002426: fcf42423 sw a5,-56(s0) + 300242a: fa842783 lw a5,-88(s0) + 300242e: 078a slli a5,a5,0x2 + 3002430: 8bf1 andi a5,a5,28 + 3002432: fa442703 lw a4,-92(s0) + 3002436: 00f717b3 sll a5,a4,a5 + 300243a: fc842703 lw a4,-56(s0) + 300243e: 8fd9 or a5,a5,a4 + 3002440: fcf42423 sw a5,-56(s0) + 3002444: fc842783 lw a5,-56(s0) + 3002448: 82be mv t0,a5 + 300244a: bcb29073 csrw 0xbcb,t0 + break; + 300244e: a2b1 j 300259a + case 12: /* GROUP12 */ + SET_LOCAL_INTER_NUM_PRI(12, interPriNum, prior); + 3002450: bcc027f3 csrr a5,0xbcc + 3002454: fcf42a23 sw a5,-44(s0) + 3002458: fd442783 lw a5,-44(s0) + 300245c: fcf42823 sw a5,-48(s0) + 3002460: fa842783 lw a5,-88(s0) + 3002464: 078a slli a5,a5,0x2 + 3002466: 8bf1 andi a5,a5,28 + 3002468: 473d li a4,15 + 300246a: 00f717b3 sll a5,a4,a5 + 300246e: fff7c793 not a5,a5 + 3002472: fd042703 lw a4,-48(s0) + 3002476: 8ff9 and a5,a5,a4 + 3002478: fcf42823 sw a5,-48(s0) + 300247c: fa842783 lw a5,-88(s0) + 3002480: 078a slli a5,a5,0x2 + 3002482: 8bf1 andi a5,a5,28 + 3002484: fa442703 lw a4,-92(s0) + 3002488: 00f717b3 sll a5,a4,a5 + 300248c: fd042703 lw a4,-48(s0) + 3002490: 8fd9 or a5,a5,a4 + 3002492: fcf42823 sw a5,-48(s0) + 3002496: fd042783 lw a5,-48(s0) + 300249a: 82be mv t0,a5 + 300249c: bcc29073 csrw 0xbcc,t0 + break; + 30024a0: a8ed j 300259a + case 13: /* GROUP13 */ + SET_LOCAL_INTER_NUM_PRI(13, interPriNum, prior); + 30024a2: bcd027f3 csrr a5,0xbcd + 30024a6: fcf42e23 sw a5,-36(s0) + 30024aa: fdc42783 lw a5,-36(s0) + 30024ae: fcf42c23 sw a5,-40(s0) + 30024b2: fa842783 lw a5,-88(s0) + 30024b6: 078a slli a5,a5,0x2 + 30024b8: 8bf1 andi a5,a5,28 + 30024ba: 473d li a4,15 + 30024bc: 00f717b3 sll a5,a4,a5 + 30024c0: fff7c793 not a5,a5 + 30024c4: fd842703 lw a4,-40(s0) + 30024c8: 8ff9 and a5,a5,a4 + 30024ca: fcf42c23 sw a5,-40(s0) + 30024ce: fa842783 lw a5,-88(s0) + 30024d2: 078a slli a5,a5,0x2 + 30024d4: 8bf1 andi a5,a5,28 + 30024d6: fa442703 lw a4,-92(s0) + 30024da: 00f717b3 sll a5,a4,a5 + 30024de: fd842703 lw a4,-40(s0) + 30024e2: 8fd9 or a5,a5,a4 + 30024e4: fcf42c23 sw a5,-40(s0) + 30024e8: fd842783 lw a5,-40(s0) + 30024ec: 82be mv t0,a5 + 30024ee: bcd29073 csrw 0xbcd,t0 + break; + 30024f2: a065 j 300259a + case 14: /* GROUP14 */ + SET_LOCAL_INTER_NUM_PRI(14, interPriNum, prior); + 30024f4: bce027f3 csrr a5,0xbce + 30024f8: fef42223 sw a5,-28(s0) + 30024fc: fe442783 lw a5,-28(s0) + 3002500: fef42023 sw a5,-32(s0) + 3002504: fa842783 lw a5,-88(s0) + 3002508: 078a slli a5,a5,0x2 + 300250a: 8bf1 andi a5,a5,28 + 300250c: 473d li a4,15 + 300250e: 00f717b3 sll a5,a4,a5 + 3002512: fff7c793 not a5,a5 + 3002516: fe042703 lw a4,-32(s0) + 300251a: 8ff9 and a5,a5,a4 + 300251c: fef42023 sw a5,-32(s0) + 3002520: fa842783 lw a5,-88(s0) + 3002524: 078a slli a5,a5,0x2 + 3002526: 8bf1 andi a5,a5,28 + 3002528: fa442703 lw a4,-92(s0) + 300252c: 00f717b3 sll a5,a4,a5 + 3002530: fe042703 lw a4,-32(s0) + 3002534: 8fd9 or a5,a5,a4 + 3002536: fef42023 sw a5,-32(s0) + 300253a: fe042783 lw a5,-32(s0) + 300253e: 82be mv t0,a5 + 3002540: bce29073 csrw 0xbce,t0 + break; + 3002544: a899 j 300259a + case 15: /* GROUP15 */ + SET_LOCAL_INTER_NUM_PRI(15, interPriNum, prior); + 3002546: bcf027f3 csrr a5,0xbcf + 300254a: fef42623 sw a5,-20(s0) + 300254e: fec42783 lw a5,-20(s0) + 3002552: fef42423 sw a5,-24(s0) + 3002556: fa842783 lw a5,-88(s0) + 300255a: 078a slli a5,a5,0x2 + 300255c: 8bf1 andi a5,a5,28 + 300255e: 473d li a4,15 + 3002560: 00f717b3 sll a5,a4,a5 + 3002564: fff7c793 not a5,a5 + 3002568: fe842703 lw a4,-24(s0) + 300256c: 8ff9 and a5,a5,a4 + 300256e: fef42423 sw a5,-24(s0) + 3002572: fa842783 lw a5,-88(s0) + 3002576: 078a slli a5,a5,0x2 + 3002578: 8bf1 andi a5,a5,28 + 300257a: fa442703 lw a4,-92(s0) + 300257e: 00f717b3 sll a5,a4,a5 + 3002582: fe842703 lw a4,-24(s0) + 3002586: 8fd9 or a5,a5,a4 + 3002588: fef42423 sw a5,-24(s0) + 300258c: fe842783 lw a5,-24(s0) + 3002590: 82be mv t0,a5 + 3002592: bcf29073 csrw 0xbcf,t0 + break; + 3002596: a011 j 300259a + default: + break; + 3002598: 0001 nop + } +} + 300259a: 0001 nop + 300259c: 4476 lw s0,92(sp) + 300259e: 6125 addi sp,sp,96 + 30025a0: 8082 ret + +030025a2 : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior Priority of this local interrupt to be set. + * @retval None. + */ +static void IRQ_SetLocalPriority(unsigned int interPriNum, unsigned int prior) +{ + 30025a2: 7159 addi sp,sp,-112 + 30025a4: d686 sw ra,108(sp) + 30025a6: d4a2 sw s0,104(sp) + 30025a8: 1880 addi s0,sp,112 + 30025aa: f8a42e23 sw a0,-100(s0) + 30025ae: f8b42c23 sw a1,-104(s0) +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + RISCV_PRIV_MODE_SWITCH(priv); + unsigned int intNum = GET_LOCAL_INTER_CONFIGREG_NUM(interPriNum); + 30025b2: f9c42783 lw a5,-100(s0) + 30025b6: 838d srli a5,a5,0x3 + 30025b8: fef42623 sw a5,-20(s0) + switch (intNum) { + 30025bc: fec42703 lw a4,-20(s0) + 30025c0: 479d li a5,7 + 30025c2: 2ae7e563 bltu a5,a4,300286c + 30025c6: fec42783 lw a5,-20(s0) + 30025ca: 00279713 slli a4,a5,0x2 + 30025ce: 030067b7 lui a5,0x3006 + 30025d2: 4b878793 addi a5,a5,1208 # 30064b8 + 30025d6: 97ba add a5,a5,a4 + 30025d8: 439c lw a5,0(a5) + 30025da: 8782 jr a5 + case 0: /* GROUP0 */ + SET_LOCAL_INTER_NUM_PRI(0, interPriNum, prior); + 30025dc: bc0027f3 csrr a5,0xbc0 + 30025e0: faf42823 sw a5,-80(s0) + 30025e4: fb042783 lw a5,-80(s0) + 30025e8: faf42623 sw a5,-84(s0) + 30025ec: f9c42783 lw a5,-100(s0) + 30025f0: 078a slli a5,a5,0x2 + 30025f2: 8bf1 andi a5,a5,28 + 30025f4: 473d li a4,15 + 30025f6: 00f717b3 sll a5,a4,a5 + 30025fa: fff7c793 not a5,a5 + 30025fe: fac42703 lw a4,-84(s0) + 3002602: 8ff9 and a5,a5,a4 + 3002604: faf42623 sw a5,-84(s0) + 3002608: f9c42783 lw a5,-100(s0) + 300260c: 078a slli a5,a5,0x2 + 300260e: 8bf1 andi a5,a5,28 + 3002610: f9842703 lw a4,-104(s0) + 3002614: 00f717b3 sll a5,a4,a5 + 3002618: fac42703 lw a4,-84(s0) + 300261c: 8fd9 or a5,a5,a4 + 300261e: faf42623 sw a5,-84(s0) + 3002622: fac42783 lw a5,-84(s0) + 3002626: 82be mv t0,a5 + 3002628: bc029073 csrw 0xbc0,t0 + break; + 300262c: ac81 j 300287c + case 1: /* GROUP1 */ + SET_LOCAL_INTER_NUM_PRI(1, interPriNum, prior); + 300262e: bc1027f3 csrr a5,0xbc1 + 3002632: faf42c23 sw a5,-72(s0) + 3002636: fb842783 lw a5,-72(s0) + 300263a: faf42a23 sw a5,-76(s0) + 300263e: f9c42783 lw a5,-100(s0) + 3002642: 078a slli a5,a5,0x2 + 3002644: 8bf1 andi a5,a5,28 + 3002646: 473d li a4,15 + 3002648: 00f717b3 sll a5,a4,a5 + 300264c: fff7c793 not a5,a5 + 3002650: fb442703 lw a4,-76(s0) + 3002654: 8ff9 and a5,a5,a4 + 3002656: faf42a23 sw a5,-76(s0) + 300265a: f9c42783 lw a5,-100(s0) + 300265e: 078a slli a5,a5,0x2 + 3002660: 8bf1 andi a5,a5,28 + 3002662: f9842703 lw a4,-104(s0) + 3002666: 00f717b3 sll a5,a4,a5 + 300266a: fb442703 lw a4,-76(s0) + 300266e: 8fd9 or a5,a5,a4 + 3002670: faf42a23 sw a5,-76(s0) + 3002674: fb442783 lw a5,-76(s0) + 3002678: 82be mv t0,a5 + 300267a: bc129073 csrw 0xbc1,t0 + break; + 300267e: aafd j 300287c + case 2: /* GROUP2 */ + SET_LOCAL_INTER_NUM_PRI(2, interPriNum, prior); + 3002680: bc2027f3 csrr a5,0xbc2 + 3002684: fcf42023 sw a5,-64(s0) + 3002688: fc042783 lw a5,-64(s0) + 300268c: faf42e23 sw a5,-68(s0) + 3002690: f9c42783 lw a5,-100(s0) + 3002694: 078a slli a5,a5,0x2 + 3002696: 8bf1 andi a5,a5,28 + 3002698: 473d li a4,15 + 300269a: 00f717b3 sll a5,a4,a5 + 300269e: fff7c793 not a5,a5 + 30026a2: fbc42703 lw a4,-68(s0) + 30026a6: 8ff9 and a5,a5,a4 + 30026a8: faf42e23 sw a5,-68(s0) + 30026ac: f9c42783 lw a5,-100(s0) + 30026b0: 078a slli a5,a5,0x2 + 30026b2: 8bf1 andi a5,a5,28 + 30026b4: f9842703 lw a4,-104(s0) + 30026b8: 00f717b3 sll a5,a4,a5 + 30026bc: fbc42703 lw a4,-68(s0) + 30026c0: 8fd9 or a5,a5,a4 + 30026c2: faf42e23 sw a5,-68(s0) + 30026c6: fbc42783 lw a5,-68(s0) + 30026ca: 82be mv t0,a5 + 30026cc: bc229073 csrw 0xbc2,t0 + break; + 30026d0: a275 j 300287c + case 3: /* GROUP3 */ + SET_LOCAL_INTER_NUM_PRI(3, interPriNum, prior); + 30026d2: bc3027f3 csrr a5,0xbc3 + 30026d6: fcf42423 sw a5,-56(s0) + 30026da: fc842783 lw a5,-56(s0) + 30026de: fcf42223 sw a5,-60(s0) + 30026e2: f9c42783 lw a5,-100(s0) + 30026e6: 078a slli a5,a5,0x2 + 30026e8: 8bf1 andi a5,a5,28 + 30026ea: 473d li a4,15 + 30026ec: 00f717b3 sll a5,a4,a5 + 30026f0: fff7c793 not a5,a5 + 30026f4: fc442703 lw a4,-60(s0) + 30026f8: 8ff9 and a5,a5,a4 + 30026fa: fcf42223 sw a5,-60(s0) + 30026fe: f9c42783 lw a5,-100(s0) + 3002702: 078a slli a5,a5,0x2 + 3002704: 8bf1 andi a5,a5,28 + 3002706: f9842703 lw a4,-104(s0) + 300270a: 00f717b3 sll a5,a4,a5 + 300270e: fc442703 lw a4,-60(s0) + 3002712: 8fd9 or a5,a5,a4 + 3002714: fcf42223 sw a5,-60(s0) + 3002718: fc442783 lw a5,-60(s0) + 300271c: 82be mv t0,a5 + 300271e: bc329073 csrw 0xbc3,t0 + break; + 3002722: aaa9 j 300287c + case 4: /* GROUP4 */ + SET_LOCAL_INTER_NUM_PRI(4, interPriNum, prior); + 3002724: bc4027f3 csrr a5,0xbc4 + 3002728: fcf42823 sw a5,-48(s0) + 300272c: fd042783 lw a5,-48(s0) + 3002730: fcf42623 sw a5,-52(s0) + 3002734: f9c42783 lw a5,-100(s0) + 3002738: 078a slli a5,a5,0x2 + 300273a: 8bf1 andi a5,a5,28 + 300273c: 473d li a4,15 + 300273e: 00f717b3 sll a5,a4,a5 + 3002742: fff7c793 not a5,a5 + 3002746: fcc42703 lw a4,-52(s0) + 300274a: 8ff9 and a5,a5,a4 + 300274c: fcf42623 sw a5,-52(s0) + 3002750: f9c42783 lw a5,-100(s0) + 3002754: 078a slli a5,a5,0x2 + 3002756: 8bf1 andi a5,a5,28 + 3002758: f9842703 lw a4,-104(s0) + 300275c: 00f717b3 sll a5,a4,a5 + 3002760: fcc42703 lw a4,-52(s0) + 3002764: 8fd9 or a5,a5,a4 + 3002766: fcf42623 sw a5,-52(s0) + 300276a: fcc42783 lw a5,-52(s0) + 300276e: 82be mv t0,a5 + 3002770: bc429073 csrw 0xbc4,t0 + break; + 3002774: a221 j 300287c + case 5: /* GROUP5 */ + SET_LOCAL_INTER_NUM_PRI(5, interPriNum, prior); + 3002776: bc5027f3 csrr a5,0xbc5 + 300277a: fcf42c23 sw a5,-40(s0) + 300277e: fd842783 lw a5,-40(s0) + 3002782: fcf42a23 sw a5,-44(s0) + 3002786: f9c42783 lw a5,-100(s0) + 300278a: 078a slli a5,a5,0x2 + 300278c: 8bf1 andi a5,a5,28 + 300278e: 473d li a4,15 + 3002790: 00f717b3 sll a5,a4,a5 + 3002794: fff7c793 not a5,a5 + 3002798: fd442703 lw a4,-44(s0) + 300279c: 8ff9 and a5,a5,a4 + 300279e: fcf42a23 sw a5,-44(s0) + 30027a2: f9c42783 lw a5,-100(s0) + 30027a6: 078a slli a5,a5,0x2 + 30027a8: 8bf1 andi a5,a5,28 + 30027aa: f9842703 lw a4,-104(s0) + 30027ae: 00f717b3 sll a5,a4,a5 + 30027b2: fd442703 lw a4,-44(s0) + 30027b6: 8fd9 or a5,a5,a4 + 30027b8: fcf42a23 sw a5,-44(s0) + 30027bc: fd442783 lw a5,-44(s0) + 30027c0: 82be mv t0,a5 + 30027c2: bc529073 csrw 0xbc5,t0 + break; + 30027c6: a85d j 300287c + case 6: /* GROUP6 */ + SET_LOCAL_INTER_NUM_PRI(6, interPriNum, prior); + 30027c8: bc6027f3 csrr a5,0xbc6 + 30027cc: fef42023 sw a5,-32(s0) + 30027d0: fe042783 lw a5,-32(s0) + 30027d4: fcf42e23 sw a5,-36(s0) + 30027d8: f9c42783 lw a5,-100(s0) + 30027dc: 078a slli a5,a5,0x2 + 30027de: 8bf1 andi a5,a5,28 + 30027e0: 473d li a4,15 + 30027e2: 00f717b3 sll a5,a4,a5 + 30027e6: fff7c793 not a5,a5 + 30027ea: fdc42703 lw a4,-36(s0) + 30027ee: 8ff9 and a5,a5,a4 + 30027f0: fcf42e23 sw a5,-36(s0) + 30027f4: f9c42783 lw a5,-100(s0) + 30027f8: 078a slli a5,a5,0x2 + 30027fa: 8bf1 andi a5,a5,28 + 30027fc: f9842703 lw a4,-104(s0) + 3002800: 00f717b3 sll a5,a4,a5 + 3002804: fdc42703 lw a4,-36(s0) + 3002808: 8fd9 or a5,a5,a4 + 300280a: fcf42e23 sw a5,-36(s0) + 300280e: fdc42783 lw a5,-36(s0) + 3002812: 82be mv t0,a5 + 3002814: bc629073 csrw 0xbc6,t0 + break; + 3002818: a095 j 300287c + case 7: /* GROUP7 */ + SET_LOCAL_INTER_NUM_PRI(7, interPriNum, prior); + 300281a: bc7027f3 csrr a5,0xbc7 + 300281e: fef42423 sw a5,-24(s0) + 3002822: fe842783 lw a5,-24(s0) + 3002826: fef42223 sw a5,-28(s0) + 300282a: f9c42783 lw a5,-100(s0) + 300282e: 078a slli a5,a5,0x2 + 3002830: 8bf1 andi a5,a5,28 + 3002832: 473d li a4,15 + 3002834: 00f717b3 sll a5,a4,a5 + 3002838: fff7c793 not a5,a5 + 300283c: fe442703 lw a4,-28(s0) + 3002840: 8ff9 and a5,a5,a4 + 3002842: fef42223 sw a5,-28(s0) + 3002846: f9c42783 lw a5,-100(s0) + 300284a: 078a slli a5,a5,0x2 + 300284c: 8bf1 andi a5,a5,28 + 300284e: f9842703 lw a4,-104(s0) + 3002852: 00f717b3 sll a5,a4,a5 + 3002856: fe442703 lw a4,-28(s0) + 300285a: 8fd9 or a5,a5,a4 + 300285c: fef42223 sw a5,-28(s0) + 3002860: fe442783 lw a5,-28(s0) + 3002864: 82be mv t0,a5 + 3002866: bc729073 csrw 0xbc7,t0 + break; + 300286a: a809 j 300287c + default: + SetLocalIntNumPri(intNum, interPriNum, prior); + 300286c: f9842603 lw a2,-104(s0) + 3002870: f9c42583 lw a1,-100(s0) + 3002874: fec42503 lw a0,-20(s0) + 3002878: 3485 jal ra,30022d8 + break; + 300287a: 0001 nop + } + RISCV_PRIV_MODE_SWITCH(priv); +} + 300287c: 0001 nop + 300287e: 50b6 lw ra,108(sp) + 3002880: 5426 lw s0,104(sp) + 3002882: 6165 addi sp,sp,112 + 3002884: 8082 ret + +03002886 : + * @param irqNum External interrupt number. + * @param priority. + * @retval IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_PRIORITY_INVALID or BASE_STATUS_OK. + */ +unsigned int IRQ_SetPriority(unsigned int irqNum, unsigned int priority) +{ + 3002886: 1101 addi sp,sp,-32 + 3002888: ce06 sw ra,28(sp) + 300288a: cc22 sw s0,24(sp) + 300288c: 1000 addi s0,sp,32 + 300288e: fea42623 sw a0,-20(s0) + 3002892: feb42423 sw a1,-24(s0) + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 3002896: fec42703 lw a4,-20(s0) + 300289a: 47e5 li a5,25 + 300289c: 00e7f863 bgeu a5,a4,30028ac + 30028a0: fec42703 lw a4,-20(s0) + 30028a4: 07200793 li a5,114 + 30028a8: 00e7fb63 bgeu a5,a4,30028be + 30028ac: 18c00593 li a1,396 + 30028b0: 030067b7 lui a5,0x3006 + 30028b4: 47878513 addi a0,a5,1144 # 3006478 + 30028b8: 21bd jal ra,3002d26 + 30028ba: 4789 li a5,2 + 30028bc: a815 j 30028f0 + INTERRUPT_PARAM_CHECK_WITH_RET((priority >= IRQ_PRIO_LOWEST && priority <= IRQ_PRIO_HIGHEST), \ + 30028be: fe842783 lw a5,-24(s0) + 30028c2: c791 beqz a5,30028ce + 30028c4: fe842703 lw a4,-24(s0) + 30028c8: 47bd li a5,15 + 30028ca: 00e7fb63 bgeu a5,a4,30028e0 + 30028ce: 18d00593 li a1,397 + 30028d2: 030067b7 lui a5,0x3006 + 30028d6: 47878513 addi a0,a5,1144 # 3006478 + 30028da: 21b1 jal ra,3002d26 + 30028dc: 4795 li a5,5 + 30028de: a809 j 30028f0 + IRQ_ERRNO_PRIORITY_INVALID); + + /* The locipri register is specifically used to configure the priority of the + external non-standard interrupts of the CPU, so the number of internal + standard interrupts should be subtracted */ + IRQ_SetLocalPriority(irqNum - IRQ_VECTOR_CNT, priority); + 30028e0: fec42783 lw a5,-20(s0) + 30028e4: 1799 addi a5,a5,-26 + 30028e6: fe842583 lw a1,-24(s0) + 30028ea: 853e mv a0,a5 + 30028ec: 395d jal ra,30025a2 + + return BASE_STATUS_OK; + 30028ee: 4781 li a5,0 +} + 30028f0: 853e mv a0,a5 + 30028f2: 40f2 lw ra,28(sp) + 30028f4: 4462 lw s0,24(sp) + 30028f6: 6105 addi sp,sp,32 + 30028f8: 8082 ret + +030028fa : + * @brief Interrupt dummy handler + * @param arg Not used + * @retval None. + */ +static void IRQ_DummyHandler(void *arg) +{ + 30028fa: 1101 addi sp,sp,-32 + 30028fc: ce22 sw s0,28(sp) + 30028fe: 1000 addi s0,sp,32 + 3002900: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(arg); +} + 3002904: 0001 nop + 3002906: 4472 lw s0,28(sp) + 3002908: 6105 addi sp,sp,32 + 300290a: 8082 ret + +0300290c : + * @param func callback function + * @param arg callback arg + * @retval None. + */ +static inline void IRQ_SetCallBack(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 300290c: 1101 addi sp,sp,-32 + 300290e: ce22 sw s0,28(sp) + 3002910: 1000 addi s0,sp,32 + 3002912: fea42623 sw a0,-20(s0) + 3002916: feb42423 sw a1,-24(s0) + 300291a: fec42223 sw a2,-28(s0) + g_irqCallbackFunc[irqNum].param = arg; + 300291e: 040007b7 lui a5,0x4000 + 3002922: 0fc78713 addi a4,a5,252 # 40000fc + 3002926: fec42783 lw a5,-20(s0) + 300292a: 078e slli a5,a5,0x3 + 300292c: 97ba add a5,a5,a4 + 300292e: fe442703 lw a4,-28(s0) + 3002932: c3d8 sw a4,4(a5) + g_irqCallbackFunc[irqNum].pfnHandler = func; + 3002934: 040007b7 lui a5,0x4000 + 3002938: 0fc78713 addi a4,a5,252 # 40000fc + 300293c: fec42783 lw a5,-20(s0) + 3002940: 078e slli a5,a5,0x3 + 3002942: 97ba add a5,a5,a4 + 3002944: fe842703 lw a4,-24(s0) + 3002948: c398 sw a4,0(a5) +} + 300294a: 0001 nop + 300294c: 4472 lw s0,28(sp) + 300294e: 6105 addi sp,sp,32 + 3002950: 8082 ret + +03002952 : + * @brief Set the write protection for CRG-related registers disable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionDisable(void) +{ + 3002952: 1141 addi sp,sp,-16 + 3002954: c622 sw s0,12(sp) + 3002956: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = (SYSCTRL0->SC_LOCKEN.reg & SC_LOCKEN_CRG_DISABLE_MASK) + SC_LOCKEN_VALID_HIGH_BIT; + 3002958: 101007b7 lui a5,0x10100 + 300295c: 43f8 lw a4,68(a5) + 300295e: 67c1 lui a5,0x10 + 3002960: 17f9 addi a5,a5,-2 # fffe + 3002962: 00f776b3 and a3,a4,a5 + 3002966: 101007b7 lui a5,0x10100 + 300296a: ea510737 lui a4,0xea510 + 300296e: 9736 add a4,a4,a3 + 3002970: c3f8 sw a4,68(a5) +} + 3002972: 0001 nop + 3002974: 4432 lw s0,12(sp) + 3002976: 0141 addi sp,sp,16 + 3002978: 8082 ret + +0300297a : + * @brief Set the Set the write protection for CRG-related registers enable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionEnable(void) +{ + 300297a: 1141 addi sp,sp,-16 + 300297c: c622 sw s0,12(sp) + 300297e: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = ((SYSCTRL0->SC_LOCKEN.reg & SC_LOW_BIT_MASK) | SC_LOCKEN_CRG_ENABLE_MASK) + + 3002980: 101007b7 lui a5,0x10100 + 3002984: 43f8 lw a4,68(a5) + 3002986: 67c1 lui a5,0x10 + 3002988: 17fd addi a5,a5,-1 # ffff + 300298a: 8ff9 and a5,a5,a4 + 300298c: 0017e693 ori a3,a5,1 + 3002990: 101007b7 lui a5,0x10100 + 3002994: ea510737 lui a4,0xea510 + 3002998: 9736 add a4,a4,a3 + 300299a: c3f8 sw a4,68(a5) + SC_LOCKEN_VALID_HIGH_BIT; +} + 300299c: 0001 nop + 300299e: 4432 lw s0,12(sp) + 30029a0: 0141 addi sp,sp,16 + 30029a2: 8082 ret + +030029a4 : + * @param clkSelect pll_ref_cksel + * @retval true + * @retval false + */ +static inline bool IsCrgPllRefClkSelect(CRG_PllRefClkSelect clkSelect) +{ + 30029a4: 1101 addi sp,sp,-32 + 30029a6: ce22 sw s0,28(sp) + 30029a8: 1000 addi s0,sp,32 + 30029aa: fea42623 sw a0,-20(s0) + return ((clkSelect == CRG_PLL_REF_CLK_SELECT_HOSC) || + 30029ae: fec42783 lw a5,-20(s0) + 30029b2: c791 beqz a5,30029be + 30029b4: fec42703 lw a4,-20(s0) + 30029b8: 4785 li a5,1 + 30029ba: 00f71463 bne a4,a5,30029c2 + 30029be: 4785 li a5,1 + 30029c0: a011 j 30029c4 + 30029c2: 4781 li a5,0 + 30029c4: 8b85 andi a5,a5,1 + 30029c6: 9f81 uxtb a5 + (clkSelect == CRG_PLL_REF_CLK_SELECT_XTAL)); +} + 30029c8: 853e mv a0,a5 + 30029ca: 4472 lw s0,28(sp) + 30029cc: 6105 addi sp,sp,32 + 30029ce: 8082 ret + +030029d0 : + * @param preDiv pll prediv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPreDiv(CRG_PllPreDiv preDiv) +{ + 30029d0: 1101 addi sp,sp,-32 + 30029d2: ce22 sw s0,28(sp) + 30029d4: 1000 addi s0,sp,32 + 30029d6: fea42623 sw a0,-20(s0) + return ((preDiv >= CRG_PLL_PREDIV_1) && + 30029da: fec42783 lw a5,-20(s0) + 30029de: 0087b793 sltiu a5,a5,8 + 30029e2: 9f81 uxtb a5 + (preDiv <= CRG_PLL_PREDIV_8)); +} + 30029e4: 853e mv a0,a5 + 30029e6: 4472 lw s0,28(sp) + 30029e8: 6105 addi sp,sp,32 + 30029ea: 8082 ret + +030029ec : + * @param postDiv pll_postdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv(CRG_PllPostDiv postDiv) +{ + 30029ec: 1101 addi sp,sp,-32 + 30029ee: ce22 sw s0,28(sp) + 30029f0: 1000 addi s0,sp,32 + 30029f2: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV_1) && + 30029f6: fec42783 lw a5,-20(s0) + 30029fa: 0087b793 sltiu a5,a5,8 + 30029fe: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV_8)); +} + 3002a00: 853e mv a0,a5 + 3002a02: 4472 lw s0,28(sp) + 3002a04: 6105 addi sp,sp,32 + 3002a06: 8082 ret + +03002a08 : + * @param postDiv pll_postdiv2 value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv2(CRG_PllPostDiv2 postDiv) +{ + 3002a08: 1101 addi sp,sp,-32 + 3002a0a: ce22 sw s0,28(sp) + 3002a0c: 1000 addi s0,sp,32 + 3002a0e: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV2_1) && + 3002a12: fec42783 lw a5,-20(s0) + 3002a16: 0087b793 sltiu a5,a5,8 + 3002a1a: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV2_8_MAX)); +} + 3002a1c: 853e mv a0,a5 + 3002a1e: 4472 lw s0,28(sp) + 3002a20: 6105 addi sp,sp,32 + 3002a22: 8082 ret + +03002a24 : + * @param fbDiv pll fbdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllFbDiv(unsigned int fbDiv) +{ + 3002a24: 1101 addi sp,sp,-32 + 3002a26: ce22 sw s0,28(sp) + 3002a28: 1000 addi s0,sp,32 + 3002a2a: fea42623 sw a0,-20(s0) + return (fbDiv <= CRG_PLL_FBDIV_MAX); + 3002a2e: fec42783 lw a5,-20(s0) + 3002a32: 0807b793 sltiu a5,a5,128 + 3002a36: 9f81 uxtb a5 +} + 3002a38: 853e mv a0,a5 + 3002a3a: 4472 lw s0,28(sp) + 3002a3c: 6105 addi sp,sp,32 + 3002a3e: 8082 ret + +03002a40 : + * @param select core_cksel value + * @retval true + * @retval false + */ +static inline bool IsCrgCoreCkSel(CRG_CoreClkSelect select) +{ + 3002a40: 1101 addi sp,sp,-32 + 3002a42: ce22 sw s0,28(sp) + 3002a44: 1000 addi s0,sp,32 + 3002a46: fea42623 sw a0,-20(s0) + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002a4a: fec42783 lw a5,-20(s0) + 3002a4e: cb99 beqz a5,3002a64 + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + 3002a50: fec42703 lw a4,-20(s0) + 3002a54: 4785 li a5,1 + 3002a56: 00f70763 beq a4,a5,3002a64 + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002a5a: fec42703 lw a4,-20(s0) + 3002a5e: 4789 li a5,2 + 3002a60: 00f71463 bne a4,a5,3002a68 + 3002a64: 4785 li a5,1 + 3002a66: a011 j 3002a6a + 3002a68: 4781 li a5,0 + 3002a6a: 8b85 andi a5,a5,1 + 3002a6c: 9f81 uxtb a5 + (select == CRG_CORE_CLK_SELECT_PLL)); +} + 3002a6e: 853e mv a0,a5 + 3002a70: 4472 lw s0,28(sp) + 3002a72: 6105 addi sp,sp,32 + 3002a74: 8082 ret + +03002a76 : + * @param select 1M clock selection + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkSel(CRG_1MClkSelect select) +{ + 3002a76: 1101 addi sp,sp,-32 + 3002a78: ce22 sw s0,28(sp) + 3002a7a: 1000 addi s0,sp,32 + 3002a7c: fea42623 sw a0,-20(s0) + return ((select == CRG_1M_CLK_SELECT_HOSC) || + 3002a80: fec42783 lw a5,-20(s0) + 3002a84: c791 beqz a5,3002a90 + 3002a86: fec42703 lw a4,-20(s0) + 3002a8a: 4785 li a5,1 + 3002a8c: 00f71463 bne a4,a5,3002a94 + 3002a90: 4785 li a5,1 + 3002a92: a011 j 3002a96 + 3002a94: 4781 li a5,0 + 3002a96: 8b85 andi a5,a5,1 + 3002a98: 9f81 uxtb a5 + (select == CRG_1M_CLK_SELECT_TCXO)); +} + 3002a9a: 853e mv a0,a5 + 3002a9c: 4472 lw s0,28(sp) + 3002a9e: 6105 addi sp,sp,32 + 3002aa0: 8082 ret + +03002aa2 : + * @param div 1M clock ratio + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkDiv(unsigned int div) +{ + 3002aa2: 1101 addi sp,sp,-32 + 3002aa4: ce22 sw s0,28(sp) + 3002aa6: 1000 addi s0,sp,32 + 3002aa8: fea42623 sw a0,-20(s0) + return (div <= CRG_1MHZ_CLK_MAX_DIV); + 3002aac: fec42783 lw a5,-20(s0) + 3002ab0: 0407b793 sltiu a5,a5,64 + 3002ab4: 9f81 uxtb a5 +} + 3002ab6: 853e mv a0,a5 + 3002ab8: 4472 lw s0,28(sp) + 3002aba: 6105 addi sp,sp,32 + 3002abc: 8082 ret + +03002abe : + * @param preDiv PLL Previous Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPreDiv(unsigned int pllRefFreq, unsigned int preDiv) +{ + 3002abe: 7179 addi sp,sp,-48 + 3002ac0: d622 sw s0,44(sp) + 3002ac2: 1800 addi s0,sp,48 + 3002ac4: fca42e23 sw a0,-36(s0) + 3002ac8: fcb42c23 sw a1,-40(s0) + unsigned int freq = pllRefFreq; + 3002acc: fdc42783 lw a5,-36(s0) + 3002ad0: fef42623 sw a5,-20(s0) + if (preDiv != 0) { + 3002ad4: fd842783 lw a5,-40(s0) + 3002ad8: cb89 beqz a5,3002aea + freq /= preDiv; + 3002ada: fec42703 lw a4,-20(s0) + 3002ade: fd842783 lw a5,-40(s0) + 3002ae2: 02f757b3 divu a5,a4,a5 + 3002ae6: fef42623 sw a5,-20(s0) + } + return (freq >= CRG_CLK_PFD_MIN_FREQ) && (freq <= CRG_CLK_PFD_MAX_FREQ); + 3002aea: fec42703 lw a4,-20(s0) + 3002aee: 003d17b7 lui a5,0x3d1 + 3002af2: 8ff78793 addi a5,a5,-1793 # 3d08ff + 3002af6: 00e7fc63 bgeu a5,a4,3002b0e + 3002afa: fec42703 lw a4,-20(s0) + 3002afe: 007277b7 lui a5,0x727 + 3002b02: 0e078793 addi a5,a5,224 # 7270e0 + 3002b06: 00e7e463 bltu a5,a4,3002b0e + 3002b0a: 4785 li a5,1 + 3002b0c: a011 j 3002b10 + 3002b0e: 4781 li a5,0 + 3002b10: 8b85 andi a5,a5,1 + 3002b12: 9f81 uxtb a5 +} + 3002b14: 853e mv a0,a5 + 3002b16: 5432 lw s0,44(sp) + 3002b18: 6145 addi sp,sp,48 + 3002b1a: 8082 ret + +03002b1c : + * @param fdDiv PLL FD Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidFdDiv(unsigned int clkPfdFreq, unsigned int fdDiv) +{ + 3002b1c: 7179 addi sp,sp,-48 + 3002b1e: d622 sw s0,44(sp) + 3002b20: 1800 addi s0,sp,48 + 3002b22: fca42e23 sw a0,-36(s0) + 3002b26: fcb42c23 sw a1,-40(s0) + if (clkPfdFreq > 30000000U) { /* The maximum speed of the external clock source is 30000000U. */ + 3002b2a: fdc42703 lw a4,-36(s0) + 3002b2e: 01c9c7b7 lui a5,0x1c9c + 3002b32: 38078793 addi a5,a5,896 # 1c9c380 + 3002b36: 00e7f463 bgeu a5,a4,3002b3e + return false; + 3002b3a: 4781 li a5,0 + 3002b3c: a08d j 3002b9e + } else if (fdDiv > CRG_PLL_FBDIV_MAX) { + 3002b3e: fd842703 lw a4,-40(s0) + 3002b42: 07f00793 li a5,127 + 3002b46: 00e7f463 bgeu a5,a4,3002b4e + return false; + 3002b4a: 4781 li a5,0 + 3002b4c: a889 j 3002b9e + } + + unsigned int freq = (fdDiv > 0x6) ? (clkPfdFreq * fdDiv) : (clkPfdFreq * 0x6); /* 0x0-0x6: divided by 0x6 */ + 3002b4e: fd842703 lw a4,-40(s0) + 3002b52: 4799 li a5,6 + 3002b54: 00e7f963 bgeu a5,a4,3002b66 + 3002b58: fdc42703 lw a4,-36(s0) + 3002b5c: fd842783 lw a5,-40(s0) + 3002b60: 02f707b3 mul a5,a4,a5 + 3002b64: a031 j 3002b70 + 3002b66: fdc42703 lw a4,-36(s0) + 3002b6a: 4799 li a5,6 + 3002b6c: 02f707b3 mul a5,a4,a5 + 3002b70: fef42623 sw a5,-20(s0) + return (freq >= CRG_CLK_VCO_MIN_FREQ) && (freq <= CRG_CLK_VCO_MAX_FREQ); + 3002b74: fec42703 lw a4,-20(s0) + 3002b78: 05f5e7b7 lui a5,0x5f5e + 3002b7c: 0ff78793 addi a5,a5,255 # 5f5e0ff + 3002b80: 00e7fc63 bgeu a5,a4,3002b98 + 3002b84: fec42703 lw a4,-20(s0) + 3002b88: 11e1a7b7 lui a5,0x11e1a + 3002b8c: 30078793 addi a5,a5,768 # 11e1a300 + 3002b90: 00e7e463 bltu a5,a4,3002b98 + 3002b94: 4785 li a5,1 + 3002b96: a011 j 3002b9a + 3002b98: 4781 li a5,0 + 3002b9a: 8b85 andi a5,a5,1 + 3002b9c: 9f81 uxtb a5 +} + 3002b9e: 853e mv a0,a5 + 3002ba0: 5432 lw s0,44(sp) + 3002ba2: 6145 addi sp,sp,48 + 3002ba4: 8082 ret + +03002ba6 : + * @param postDiv PLL Post Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv(unsigned int clkVcoFreq, unsigned int postDiv) +{ + 3002ba6: 7179 addi sp,sp,-48 + 3002ba8: d622 sw s0,44(sp) + 3002baa: 1800 addi s0,sp,48 + 3002bac: fca42e23 sw a0,-36(s0) + 3002bb0: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002bb4: fdc42783 lw a5,-36(s0) + 3002bb8: fef42623 sw a5,-20(s0) + if (postDiv != 0) { + 3002bbc: fd842783 lw a5,-40(s0) + 3002bc0: cb91 beqz a5,3002bd4 + freq /= (postDiv + 1); + 3002bc2: fd842783 lw a5,-40(s0) + 3002bc6: 0785 addi a5,a5,1 + 3002bc8: fec42703 lw a4,-20(s0) + 3002bcc: 02f757b3 divu a5,a4,a5 + 3002bd0: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_TARGET_MAX_FREQ); + 3002bd4: fec42703 lw a4,-20(s0) + 3002bd8: 08f0d7b7 lui a5,0x8f0d + 3002bdc: 18178793 addi a5,a5,385 # 8f0d181 + 3002be0: 00f737b3 sltu a5,a4,a5 + 3002be4: 9f81 uxtb a5 +} + 3002be6: 853e mv a0,a5 + 3002be8: 5432 lw s0,44(sp) + 3002bea: 6145 addi sp,sp,48 + 3002bec: 8082 ret + +03002bee : + * @param postDiv2 PLL Post Divsion2 + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv2(unsigned int clkVcoFreq, unsigned int postDiv2) +{ + 3002bee: 7179 addi sp,sp,-48 + 3002bf0: d622 sw s0,44(sp) + 3002bf2: 1800 addi s0,sp,48 + 3002bf4: fca42e23 sw a0,-36(s0) + 3002bf8: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002bfc: fdc42783 lw a5,-36(s0) + 3002c00: fef42623 sw a5,-20(s0) + if (postDiv2 != 0) { + 3002c04: fd842783 lw a5,-40(s0) + 3002c08: cb91 beqz a5,3002c1c + freq /= (postDiv2 + 1); + 3002c0a: fd842783 lw a5,-40(s0) + 3002c0e: 0785 addi a5,a5,1 + 3002c10: fec42703 lw a4,-20(s0) + 3002c14: 02f757b3 divu a5,a4,a5 + 3002c18: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_PST2_MAX_FREQ); + 3002c1c: fec42703 lw a4,-20(s0) + 3002c20: 05f5e7b7 lui a5,0x5f5e + 3002c24: 10178793 addi a5,a5,257 # 5f5e101 + 3002c28: 00f737b3 sltu a5,a4,a5 + 3002c2c: 9f81 uxtb a5 +} + 3002c2e: 853e mv a0,a5 + 3002c30: 5432 lw s0,44(sp) + 3002c32: 6145 addi sp,sp,48 + 3002c34: 8082 ret + +03002c36 : + * @param adcClkSelect the value of adc clock select + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkModeSelect(CRG_AdcClkSelect adcClkSelect) +{ + 3002c36: 1101 addi sp,sp,-32 + 3002c38: ce22 sw s0,28(sp) + 3002c3a: 1000 addi s0,sp,32 + 3002c3c: fea42623 sw a0,-20(s0) + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002c40: fec42783 lw a5,-20(s0) + 3002c44: c385 beqz a5,3002c64 + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + 3002c46: fec42703 lw a4,-20(s0) + 3002c4a: 4785 li a5,1 + 3002c4c: 00f70c63 beq a4,a5,3002c64 + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + 3002c50: fec42703 lw a4,-20(s0) + 3002c54: 4789 li a5,2 + 3002c56: 00f70763 beq a4,a5,3002c64 + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002c5a: fec42703 lw a4,-20(s0) + 3002c5e: 478d li a5,3 + 3002c60: 00f71463 bne a4,a5,3002c68 + 3002c64: 4785 li a5,1 + 3002c66: a011 j 3002c6a + 3002c68: 4781 li a5,0 + 3002c6a: 8b85 andi a5,a5,1 + 3002c6c: 9f81 uxtb a5 + adcClkSelect == CRG_ADC_CLK_SYN_CORE); +} + 3002c6e: 853e mv a0,a5 + 3002c70: 4472 lw s0,28(sp) + 3002c72: 6105 addi sp,sp,32 + 3002c74: 8082 ret + +03002c76 : + * @param div the value of adc clock div + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkDiv(CRG_AdcDiv div) +{ + 3002c76: 1101 addi sp,sp,-32 + 3002c78: ce22 sw s0,28(sp) + 3002c7a: 1000 addi s0,sp,32 + 3002c7c: fea42623 sw a0,-20(s0) + return (div == CRG_ADC_DIV_1 || \ + div == CRG_ADC_DIV_2 || \ + div == CRG_ADC_DIV_3 || \ + 3002c80: fec42783 lw a5,-20(s0) + 3002c84: c385 beqz a5,3002ca4 + return (div == CRG_ADC_DIV_1 || \ + 3002c86: fec42703 lw a4,-20(s0) + 3002c8a: 4785 li a5,1 + 3002c8c: 00f70c63 beq a4,a5,3002ca4 + div == CRG_ADC_DIV_2 || \ + 3002c90: fec42703 lw a4,-20(s0) + 3002c94: 4789 li a5,2 + 3002c96: 00f70763 beq a4,a5,3002ca4 + div == CRG_ADC_DIV_3 || \ + 3002c9a: fec42703 lw a4,-20(s0) + 3002c9e: 478d li a5,3 + 3002ca0: 00f71463 bne a4,a5,3002ca8 + 3002ca4: 4785 li a5,1 + 3002ca6: a011 j 3002caa + 3002ca8: 4781 li a5,0 + 3002caa: 8b85 andi a5,a5,1 + 3002cac: 9f81 uxtb a5 + div == CRG_ADC_DIV_4); +} + 3002cae: 853e mv a0,a5 + 3002cb0: 4472 lw s0,28(sp) + 3002cb2: 6105 addi sp,sp,32 + 3002cb4: 8082 ret + +03002cb6 : + * @param clk Clock register base address + * @param select Core clock selection + * @retval None + */ +static inline void DCL_CRG_SetCoreClkSel(CRG_RegStruct *clk, CRG_CoreClkSelect select) +{ + 3002cb6: 1101 addi sp,sp,-32 + 3002cb8: ce06 sw ra,28(sp) + 3002cba: cc22 sw s0,24(sp) + 3002cbc: 1000 addi s0,sp,32 + 3002cbe: fea42623 sw a0,-20(s0) + 3002cc2: feb42423 sw a1,-24(s0) + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + 3002cc6: fec42703 lw a4,-20(s0) + 3002cca: 100007b7 lui a5,0x10000 + 3002cce: 00f70a63 beq a4,a5,3002ce2 + 3002cd2: 64b00593 li a1,1611 + 3002cd6: 030067b7 lui a5,0x3006 + 3002cda: 4d878513 addi a0,a5,1240 # 30064d8 + 3002cde: 20a1 jal ra,3002d26 + 3002ce0: a001 j 3002ce0 + CRG_PARAM_CHECK_NO_RET(IsCrgCoreCkSel(select)); + 3002ce2: fe842503 lw a0,-24(s0) + 3002ce6: 3ba9 jal ra,3002a40 + 3002ce8: 87aa mv a5,a0 + 3002cea: 0017c793 xori a5,a5,1 + 3002cee: 9f81 uxtb a5 + 3002cf0: cb89 beqz a5,3002d02 + 3002cf2: 64c00593 li a1,1612 + 3002cf6: 030067b7 lui a5,0x3006 + 3002cfa: 4d878513 addi a0,a5,1240 # 30064d8 + 3002cfe: 2025 jal ra,3002d26 + 3002d00: a839 j 3002d1e + clk->PERI_CRG64.BIT.clk_pst1_sw_sel = select; + 3002d02: fe842783 lw a5,-24(s0) + 3002d06: 8b8d andi a5,a5,3 + 3002d08: 0ff7f693 andi a3,a5,255 + 3002d0c: fec42703 lw a4,-20(s0) + 3002d10: 10072783 lw a5,256(a4) # ea510100 + 3002d14: 8a8d andi a3,a3,3 + 3002d16: 9bf1 andi a5,a5,-4 + 3002d18: 8fd5 or a5,a5,a3 + 3002d1a: 10f72023 sw a5,256(a4) +} + 3002d1e: 40f2 lw ra,28(sp) + 3002d20: 4462 lw s0,24(sp) + 3002d22: 6105 addi sp,sp,32 + 3002d24: 8082 ret + +03002d26 : + 3002d26: 988ff06f j 3001eae + +03002d2a : + * @param handle CRG Handle + * @retval BASE_STATUS_ERROR Parameter Check fail + * @retval BASE_STATUS_OK Success + */ +BASE_StatusType HAL_CRG_Init(const CRG_Handle *handle) +{ + 3002d2a: 7179 addi sp,sp,-48 + 3002d2c: d606 sw ra,44(sp) + 3002d2e: d422 sw s0,40(sp) + 3002d30: 1800 addi s0,sp,48 + 3002d32: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != NULL); + 3002d36: fdc42783 lw a5,-36(s0) + 3002d3a: eb89 bnez a5,3002d4c + 3002d3c: 07100593 li a1,113 + 3002d40: 030067b7 lui a5,0x3006 + 3002d44: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d48: 3ff9 jal ra,3002d26 + 3002d4a: a001 j 3002d4a + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3002d4c: fdc42783 lw a5,-36(s0) + 3002d50: 4398 lw a4,0(a5) + 3002d52: 100007b7 lui a5,0x10000 + 3002d56: 00f70a63 beq a4,a5,3002d6a + 3002d5a: 07200593 li a1,114 + 3002d5e: 030067b7 lui a5,0x3006 + 3002d62: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d66: 37c1 jal ra,3002d26 + 3002d68: a001 j 3002d68 + /* Check the validity of PLL-related parameters. */ + CRG_PARAM_CHECK_WITH_RET(IsCrgPllRefClkSelect(handle->pllRefClkSelect), BASE_STATUS_ERROR); + 3002d6a: fdc42783 lw a5,-36(s0) + 3002d6e: 43dc lw a5,4(a5) + 3002d70: 853e mv a0,a5 + 3002d72: 390d jal ra,30029a4 + 3002d74: 87aa mv a5,a0 + 3002d76: 0017c793 xori a5,a5,1 + 3002d7a: 9f81 uxtb a5 + 3002d7c: cb91 beqz a5,3002d90 + 3002d7e: 07400593 li a1,116 + 3002d82: 030067b7 lui a5,0x3006 + 3002d86: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d8a: 3f71 jal ra,3002d26 + 3002d8c: 4785 li a5,1 + 3002d8e: aca9 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPreDiv(handle->pllPreDiv), BASE_STATUS_ERROR); + 3002d90: fdc42783 lw a5,-36(s0) + 3002d94: 479c lw a5,8(a5) + 3002d96: 853e mv a0,a5 + 3002d98: 3925 jal ra,30029d0 + 3002d9a: 87aa mv a5,a0 + 3002d9c: 0017c793 xori a5,a5,1 + 3002da0: 9f81 uxtb a5 + 3002da2: cb91 beqz a5,3002db6 + 3002da4: 07500593 li a1,117 + 3002da8: 030067b7 lui a5,0x3006 + 3002dac: 4f478513 addi a0,a5,1268 # 30064f4 + 3002db0: 3f9d jal ra,3002d26 + 3002db2: 4785 li a5,1 + 3002db4: ac15 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllFbDiv(handle->pllFbDiv), BASE_STATUS_ERROR); + 3002db6: fdc42783 lw a5,-36(s0) + 3002dba: 47dc lw a5,12(a5) + 3002dbc: 853e mv a0,a5 + 3002dbe: 319d jal ra,3002a24 + 3002dc0: 87aa mv a5,a0 + 3002dc2: 0017c793 xori a5,a5,1 + 3002dc6: 9f81 uxtb a5 + 3002dc8: cb91 beqz a5,3002ddc + 3002dca: 07600593 li a1,118 + 3002dce: 030067b7 lui a5,0x3006 + 3002dd2: 4f478513 addi a0,a5,1268 # 30064f4 + 3002dd6: 3f81 jal ra,3002d26 + 3002dd8: 4785 li a5,1 + 3002dda: a439 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv(handle->pllPostDiv), BASE_STATUS_ERROR); + 3002ddc: fdc42783 lw a5,-36(s0) + 3002de0: 4b9c lw a5,16(a5) + 3002de2: 853e mv a0,a5 + 3002de4: 3121 jal ra,30029ec + 3002de6: 87aa mv a5,a0 + 3002de8: 0017c793 xori a5,a5,1 + 3002dec: 9f81 uxtb a5 + 3002dee: cb91 beqz a5,3002e02 + 3002df0: 07700593 li a1,119 + 3002df4: 030067b7 lui a5,0x3006 + 3002df8: 4f478513 addi a0,a5,1268 # 30064f4 + 3002dfc: 372d jal ra,3002d26 + 3002dfe: 4785 li a5,1 + 3002e00: a2e5 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv2(handle->handleEx.pllPostDiv2), BASE_STATUS_ERROR); + 3002e02: fdc42783 lw a5,-36(s0) + 3002e06: 4fdc lw a5,28(a5) + 3002e08: 853e mv a0,a5 + 3002e0a: 3efd jal ra,3002a08 + 3002e0c: 87aa mv a5,a0 + 3002e0e: 0017c793 xori a5,a5,1 + 3002e12: 9f81 uxtb a5 + 3002e14: cb91 beqz a5,3002e28 + 3002e16: 07800593 li a1,120 + 3002e1a: 030067b7 lui a5,0x3006 + 3002e1e: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e22: 3711 jal ra,3002d26 + 3002e24: 4785 li a5,1 + 3002e26: a2c9 j 3002fe8 + /* Check the Clock Source and Frequency Divider of the 1 MHz Clock. */ + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkSel(handle->handleEx.clk1MSelect), BASE_STATUS_ERROR); + 3002e28: fdc42783 lw a5,-36(s0) + 3002e2c: 539c lw a5,32(a5) + 3002e2e: 853e mv a0,a5 + 3002e30: 3199 jal ra,3002a76 + 3002e32: 87aa mv a5,a0 + 3002e34: 0017c793 xori a5,a5,1 + 3002e38: 9f81 uxtb a5 + 3002e3a: cb91 beqz a5,3002e4e + 3002e3c: 07a00593 li a1,122 + 3002e40: 030067b7 lui a5,0x3006 + 3002e44: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e48: 3df9 jal ra,3002d26 + 3002e4a: 4785 li a5,1 + 3002e4c: aa71 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkDiv(handle->handleEx.clk1MDiv), BASE_STATUS_ERROR); + 3002e4e: fdc42783 lw a5,-36(s0) + 3002e52: 53dc lw a5,36(a5) + 3002e54: 853e mv a0,a5 + 3002e56: 31b1 jal ra,3002aa2 + 3002e58: 87aa mv a5,a0 + 3002e5a: 0017c793 xori a5,a5,1 + 3002e5e: 9f81 uxtb a5 + 3002e60: cb91 beqz a5,3002e74 + 3002e62: 07b00593 li a1,123 + 3002e66: 030067b7 lui a5,0x3006 + 3002e6a: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e6e: 3d65 jal ra,3002d26 + 3002e70: 4785 li a5,1 + 3002e72: aa9d j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 3002e74: fdc42783 lw a5,-36(s0) + 3002e78: 4f9c lw a5,24(a5) + 3002e7a: 853e mv a0,a5 + 3002e7c: 36d1 jal ra,3002a40 + 3002e7e: 87aa mv a5,a0 + 3002e80: 0017c793 xori a5,a5,1 + 3002e84: 9f81 uxtb a5 + 3002e86: cb91 beqz a5,3002e9a + 3002e88: 07c00593 li a1,124 + 3002e8c: 030067b7 lui a5,0x3006 + 3002e90: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e94: 3d49 jal ra,3002d26 + 3002e96: 4785 li a5,1 + 3002e98: aa81 j 3002fe8 + + *(unsigned int *)CRG_HOSC_CTRL2_ADDR = 0x306E; /* Optimized HOSC temperature drift performance parameter. */ + 3002e9a: 100017b7 lui a5,0x10001 + 3002e9e: f0478793 addi a5,a5,-252 # 10000f04 + 3002ea2: 670d lui a4,0x3 + 3002ea4: 06e70713 addi a4,a4,110 # 306e + 3002ea8: c398 sw a4,0(a5) + + CRG_RegStruct *reg = handle->baseAddress; + 3002eaa: fdc42783 lw a5,-36(s0) + 3002eae: 439c lw a5,0(a5) + 3002eb0: fef42623 sw a5,-20(s0) + g_crgBaseAddr = (void *)reg; + 3002eb4: 040007b7 lui a5,0x4000 + 3002eb8: fec42703 lw a4,-20(s0) + 3002ebc: 48e7aa23 sw a4,1172(a5) # 4000494 + /* Check the validity of the PLL parameter configuration. */ + if (CRG_IsValidPllConfig(handle) != BASE_STATUS_OK) { + 3002ec0: fdc42503 lw a0,-36(s0) + 3002ec4: 7a4000ef jal ra,3003668 + 3002ec8: 87aa mv a5,a0 + 3002eca: c399 beqz a5,3002ed0 + return BASE_STATUS_ERROR; + 3002ecc: 4785 li a5,1 + 3002ece: aa29 j 3002fe8 + } + /* Disable the write protection function of the CRG register. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3002ed0: 3449 jal ra,3002952 + + reg->PERI_CRG0.BIT.pll_ref_cksel = handle->pllRefClkSelect; + 3002ed2: fdc42783 lw a5,-36(s0) + 3002ed6: 43dc lw a5,4(a5) + 3002ed8: 8b85 andi a5,a5,1 + 3002eda: 0ff7f693 andi a3,a5,255 + 3002ede: fec42703 lw a4,-20(s0) + 3002ee2: 431c lw a5,0(a4) + 3002ee4: 8a85 andi a3,a3,1 + 3002ee6: 9bf9 andi a5,a5,-2 + 3002ee8: 8fd5 or a5,a5,a3 + 3002eea: c31c sw a5,0(a4) + reg->PERI_CRG1.BIT.pll_prediv = handle->pllPreDiv; + 3002eec: fdc42783 lw a5,-36(s0) + 3002ef0: 479c lw a5,8(a5) + 3002ef2: 8bbd andi a5,a5,15 + 3002ef4: 0ff7f693 andi a3,a5,255 + 3002ef8: fec42703 lw a4,-20(s0) + 3002efc: 435c lw a5,4(a4) + 3002efe: 8abd andi a3,a3,15 + 3002f00: 9bc1 andi a5,a5,-16 + 3002f02: 8fd5 or a5,a5,a3 + 3002f04: c35c sw a5,4(a4) + reg->PERI_CRG2.BIT.pll_fbdiv = handle->pllFbDiv; + 3002f06: fdc42783 lw a5,-36(s0) + 3002f0a: 47dc lw a5,12(a5) + 3002f0c: 0ff7f693 andi a3,a5,255 + 3002f10: fec42703 lw a4,-20(s0) + 3002f14: 471c lw a5,8(a4) + 3002f16: 0ff6f693 andi a3,a3,255 + 3002f1a: f007f793 andi a5,a5,-256 + 3002f1e: 8fd5 or a5,a5,a3 + 3002f20: c71c sw a5,8(a4) + reg->PERI_CRG3.BIT.pll_postdiv1 = handle->pllPostDiv; + 3002f22: fdc42783 lw a5,-36(s0) + 3002f26: 4b9c lw a5,16(a5) + 3002f28: 8bbd andi a5,a5,15 + 3002f2a: 0ff7f693 andi a3,a5,255 + 3002f2e: fec42703 lw a4,-20(s0) + 3002f32: 475c lw a5,12(a4) + 3002f34: 8abd andi a3,a3,15 + 3002f36: 9bc1 andi a5,a5,-16 + 3002f38: 8fd5 or a5,a5,a3 + 3002f3a: c75c sw a5,12(a4) + reg->PERI_CRG3.BIT.pll_postdiv2 = handle->handleEx.pllPostDiv2; + 3002f3c: fdc42783 lw a5,-36(s0) + 3002f40: 4fdc lw a5,28(a5) + 3002f42: 8bbd andi a5,a5,15 + 3002f44: 0ff7f693 andi a3,a5,255 + 3002f48: fec42703 lw a4,-20(s0) + 3002f4c: 475c lw a5,12(a4) + 3002f4e: 8abd andi a3,a3,15 + 3002f50: 0692 slli a3,a3,0x4 + 3002f52: f0f7f793 andi a5,a5,-241 + 3002f56: 8fd5 or a5,a5,a3 + 3002f58: c75c sw a5,12(a4) + reg->PERI_CRG4.BIT.pll_pd = BASE_CFG_UNSET; + 3002f5a: fec42703 lw a4,-20(s0) + 3002f5e: 4b1c lw a5,16(a4) + 3002f60: 9bf9 andi a5,a5,-2 + 3002f62: cb1c sw a5,16(a4) + + while (reg->PERI_CRG7.BIT.pll_lock != BASE_CFG_SET) { + 3002f64: 0001 nop + 3002f66: fec42783 lw a5,-20(s0) + 3002f6a: 4fdc lw a5,28(a5) + 3002f6c: 8b85 andi a5,a5,1 + 3002f6e: 0ff7f713 andi a4,a5,255 + 3002f72: 4785 li a5,1 + 3002f74: fef719e3 bne a4,a5,3002f66 + ; /* Wait for PLL to lock */ + } + + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3002f78: 3409 jal ra,300297a + /* Check the 1MHz clock parameter configuration. */ + if (CRG_IsValid1MHzConfig(handle) != BASE_STATUS_OK) { + 3002f7a: fdc42503 lw a0,-36(s0) + 3002f7e: 7ac000ef jal ra,300372a + 3002f82: 87aa mv a5,a0 + 3002f84: c399 beqz a5,3002f8a + return BASE_STATUS_ERROR; + 3002f86: 4785 li a5,1 + 3002f88: a085 j 3002fe8 + } + while (reg->HOSC_LOCK.BIT.hosc_lock != BASE_CFG_SET) { + 3002f8a: 0001 nop + 3002f8c: fec42703 lw a4,-20(s0) + 3002f90: 6785 lui a5,0x1 + 3002f92: 97ba add a5,a5,a4 + 3002f94: f107a783 lw a5,-240(a5) # f10 + 3002f98: 8b85 andi a5,a5,1 + 3002f9a: 0ff7f713 andi a4,a5,255 + 3002f9e: 4785 li a5,1 + 3002fa0: fef716e3 bne a4,a5,3002f8c + ; /* Wait for HOSC to lock */ + } + /* Set the Clock Source and Frequency Divider of the 1 MHz Clock. */ + reg->PERI_CRG67.BIT.clk_1m_div = handle->handleEx.clk1MDiv; + 3002fa4: fdc42783 lw a5,-36(s0) + 3002fa8: 53dc lw a5,36(a5) + 3002faa: 03f7f793 andi a5,a5,63 + 3002fae: 0ff7f693 andi a3,a5,255 + 3002fb2: fec42703 lw a4,-20(s0) + 3002fb6: 10c72783 lw a5,268(a4) + 3002fba: 03f6f693 andi a3,a3,63 + 3002fbe: fc07f793 andi a5,a5,-64 + 3002fc2: 8fd5 or a5,a5,a3 + 3002fc4: 10f72623 sw a5,268(a4) + reg->PERI_CRG66.BIT.clk_1m_ini_cksel = handle->handleEx.clk1MSelect; + 3002fc8: fdc42783 lw a5,-36(s0) + 3002fcc: 539c lw a5,32(a5) + 3002fce: 8b85 andi a5,a5,1 + 3002fd0: 0ff7f693 andi a3,a5,255 + 3002fd4: fec42703 lw a4,-20(s0) + 3002fd8: 10872783 lw a5,264(a4) + 3002fdc: 8a85 andi a3,a3,1 + 3002fde: 9bf9 andi a5,a5,-2 + 3002fe0: 8fd5 or a5,a5,a3 + 3002fe2: 10f72423 sw a5,264(a4) + return BASE_STATUS_OK; + 3002fe6: 4781 li a5,0 +} + 3002fe8: 853e mv a0,a5 + 3002fea: 50b2 lw ra,44(sp) + 3002fec: 5422 lw s0,40(sp) + 3002fee: 6145 addi sp,sp,48 + 3002ff0: 8082 ret + +03002ff2 : + * @param handle CRG Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Paramter check fail + */ +BASE_StatusType HAL_CRG_SetCoreClockSelect(CRG_Handle *handle) +{ + 3002ff2: 7179 addi sp,sp,-48 + 3002ff4: d606 sw ra,44(sp) + 3002ff6: d422 sw s0,40(sp) + 3002ff8: 1800 addi s0,sp,48 + 3002ffa: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != 0); + 3002ffe: fdc42783 lw a5,-36(s0) + 3003002: eb89 bnez a5,3003014 + 3003004: 10a00593 li a1,266 + 3003008: 030067b7 lui a5,0x3006 + 300300c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003010: 3b19 jal ra,3002d26 + 3003012: a001 j 3003012 + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3003014: fdc42783 lw a5,-36(s0) + 3003018: 4398 lw a4,0(a5) + 300301a: 100007b7 lui a5,0x10000 + 300301e: 00f70a63 beq a4,a5,3003032 + 3003022: 10b00593 li a1,267 + 3003026: 030067b7 lui a5,0x3006 + 300302a: 4f478513 addi a0,a5,1268 # 30064f4 + 300302e: 39e5 jal ra,3002d26 + 3003030: a001 j 3003030 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 3003032: fdc42783 lw a5,-36(s0) + 3003036: 4f9c lw a5,24(a5) + 3003038: 853e mv a0,a5 + 300303a: 3419 jal ra,3002a40 + 300303c: 87aa mv a5,a0 + 300303e: 0017c793 xori a5,a5,1 + 3003042: 9f81 uxtb a5 + 3003044: cb91 beqz a5,3003058 + 3003046: 10c00593 li a1,268 + 300304a: 030067b7 lui a5,0x3006 + 300304e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003052: 39d1 jal ra,3002d26 + 3003054: 4785 li a5,1 + 3003056: a005 j 3003076 + + CRG_RegStruct *reg = handle->baseAddress; + 3003058: fdc42783 lw a5,-36(s0) + 300305c: 439c lw a5,0(a5) + 300305e: fef42623 sw a5,-20(s0) + /* The write protection of the CRG register needs to be disabled. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3003062: 38c5 jal ra,3002952 + DCL_CRG_SetCoreClkSel(reg, handle->coreClkSelect); + 3003064: fdc42783 lw a5,-36(s0) + 3003068: 4f9c lw a5,24(a5) + 300306a: 85be mv a1,a5 + 300306c: fec42503 lw a0,-20(s0) + 3003070: 3199 jal ra,3002cb6 + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3003072: 3221 jal ra,300297a + + return BASE_STATUS_OK; + 3003074: 4781 li a5,0 +} + 3003076: 853e mv a0,a5 + 3003078: 50b2 lw ra,44(sp) + 300307a: 5422 lw s0,40(sp) + 300307c: 6145 addi sp,sp,48 + 300307e: 8082 ret + +03003080 : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +static inline unsigned int CRG_GetVcoFreq(void) +{ + 3003080: 1101 addi sp,sp,-32 + 3003082: ce06 sw ra,28(sp) + 3003084: cc22 sw s0,24(sp) + 3003086: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int regFbdiv; + CRG_RegStruct *crg = g_crgBaseAddr; + 3003088: 040007b7 lui a5,0x4000 + 300308c: 4947a783 lw a5,1172(a5) # 4000494 + 3003090: fef42623 sw a5,-20(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003094: fec42703 lw a4,-20(s0) + 3003098: 100007b7 lui a5,0x10000 + 300309c: 00f70a63 beq a4,a5,30030b0 + 30030a0: 12200593 li a1,290 + 30030a4: 030067b7 lui a5,0x3006 + 30030a8: 4f478513 addi a0,a5,1268 # 30064f4 + 30030ac: 39ad jal ra,3002d26 + 30030ae: a001 j 30030ae + CRG_ASSERT_PARAM((XTRAIL_FREQ <= 30000000U)); /* The maximum of the external clock source is 30000000U. */ + + freq = CRG_GetPllRefIni(crg->PERI_CRG0.BIT.pll_ref_cksel); + 30030b0: fec42783 lw a5,-20(s0) + 30030b4: 439c lw a5,0(a5) + 30030b6: 8b85 andi a5,a5,1 + 30030b8: 9f81 uxtb a5 + 30030ba: 853e mv a0,a5 + 30030bc: 25c1 jal ra,300377c + 30030be: fea42423 sw a0,-24(s0) + freq /= CRG_GetPreDivValue(crg->PERI_CRG1.BIT.pll_prediv); + 30030c2: fec42783 lw a5,-20(s0) + 30030c6: 43dc lw a5,4(a5) + 30030c8: 8bbd andi a5,a5,15 + 30030ca: 9f81 uxtb a5 + 30030cc: 853e mv a0,a5 + 30030ce: 2de1 jal ra,30037a6 + 30030d0: 872a mv a4,a0 + 30030d2: fe842783 lw a5,-24(s0) + 30030d6: 02e7d7b3 divu a5,a5,a4 + 30030da: fef42423 sw a5,-24(s0) + regFbdiv = CRG_GetPllFbDivValue(crg->PERI_CRG2.BIT.pll_fbdiv); /* Get the value of the fbdiv register. */ + 30030de: fec42783 lw a5,-20(s0) + 30030e2: 479c lw a5,8(a5) + 30030e4: 9f81 uxtb a5 + 30030e6: 853e mv a0,a5 + 30030e8: 25f5 jal ra,30037d4 + 30030ea: fea42223 sw a0,-28(s0) + freq *= (regFbdiv >= 0x06) ? regFbdiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 30030ee: fe442783 lw a5,-28(s0) + 30030f2: 4719 li a4,6 + 30030f4: 00e7f363 bgeu a5,a4,30030fa + 30030f8: 4799 li a5,6 + 30030fa: fe842703 lw a4,-24(s0) + 30030fe: 02f707b3 mul a5,a4,a5 + 3003102: fef42423 sw a5,-24(s0) + return freq; + 3003106: fe842783 lw a5,-24(s0) +} + 300310a: 853e mv a0,a5 + 300310c: 40f2 lw ra,28(sp) + 300310e: 4462 lw s0,24(sp) + 3003110: 6105 addi sp,sp,32 + 3003112: 8082 ret + +03003114 : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +unsigned int HAL_CRG_GetPllFreq(void) +{ + 3003114: 1101 addi sp,sp,-32 + 3003116: ce06 sw ra,28(sp) + 3003118: cc22 sw s0,24(sp) + 300311a: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int pllPostDivValue; + CRG_RegStruct *crg = g_crgBaseAddr; + 300311c: 040007b7 lui a5,0x4000 + 3003120: 4947a783 lw a5,1172(a5) # 4000494 + 3003124: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003128: fe842703 lw a4,-24(s0) + 300312c: 100007b7 lui a5,0x10000 + 3003130: 00f70a63 beq a4,a5,3003144 + 3003134: 13700593 li a1,311 + 3003138: 030067b7 lui a5,0x3006 + 300313c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003140: 36dd jal ra,3002d26 + 3003142: a001 j 3003142 + freq = CRG_GetVcoFreq(); + 3003144: 3f35 jal ra,3003080 + 3003146: fea42623 sw a0,-20(s0) + pllPostDivValue = CRG_GetPllPostDivValue((CRG_PllPostDiv)crg->PERI_CRG3.BIT.pll_postdiv1); + 300314a: fe842783 lw a5,-24(s0) + 300314e: 47dc lw a5,12(a5) + 3003150: 8bbd andi a5,a5,15 + 3003152: 9f81 uxtb a5 + 3003154: 853e mv a0,a5 + 3003156: 25c1 jal ra,3003816 + 3003158: fea42223 sw a0,-28(s0) + /* Calculate the PLL output clock frequency based on the VCO clock frequency and post-division coefficient. */ + if (pllPostDivValue != 0) { + 300315c: fe442783 lw a5,-28(s0) + 3003160: cb89 beqz a5,3003172 + freq /= pllPostDivValue; + 3003162: fec42703 lw a4,-20(s0) + 3003166: fe442783 lw a5,-28(s0) + 300316a: 02f757b3 divu a5,a4,a5 + 300316e: fef42623 sw a5,-20(s0) + } + return freq; + 3003172: fec42783 lw a5,-20(s0) +} + 3003176: 853e mv a0,a5 + 3003178: 40f2 lw ra,28(sp) + 300317a: 4462 lw s0,24(sp) + 300317c: 6105 addi sp,sp,32 + 300317e: 8082 ret + +03003180 : + * @brief Get Core Clock Frequence + * @param None + * @retval unsigned int Core clock frequency + */ +unsigned int HAL_CRG_GetCoreClkFreq(void) +{ + 3003180: 1101 addi sp,sp,-32 + 3003182: ce06 sw ra,28(sp) + 3003184: cc22 sw s0,24(sp) + 3003186: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int coreClkSelect; + CRG_RegStruct *crg = g_crgBaseAddr; + 3003188: 040007b7 lui a5,0x4000 + 300318c: 4947a783 lw a5,1172(a5) # 4000494 + 3003190: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003194: fe842703 lw a4,-24(s0) + 3003198: 100007b7 lui a5,0x10000 + 300319c: 00f70a63 beq a4,a5,30031b0 + 30031a0: 14c00593 li a1,332 + 30031a4: 030067b7 lui a5,0x3006 + 30031a8: 4f478513 addi a0,a5,1268 # 30064f4 + 30031ac: 3ead jal ra,3002d26 + 30031ae: a001 j 30031ae + coreClkSelect = crg->PERI_CRG64.BIT.clk_pst1_sw_sel; + 30031b0: fe842783 lw a5,-24(s0) + 30031b4: 1007a783 lw a5,256(a5) + 30031b8: 8b8d andi a5,a5,3 + 30031ba: 9f81 uxtb a5 + 30031bc: fef42223 sw a5,-28(s0) + switch (coreClkSelect) { + 30031c0: fe442783 lw a5,-28(s0) + 30031c4: 4705 li a4,1 + 30031c6: 02e78063 beq a5,a4,30031e6 + 30031ca: 4705 li a4,1 + 30031cc: 00e7e663 bltu a5,a4,30031d8 + 30031d0: 4709 li a4,2 + 30031d2: 02e78163 beq a5,a4,30031f4 + 30031d6: a01d j 30031fc + case CRG_CORE_CLK_SELECT_HOSC: /* The clock source is an internal high-speed clock. */ + freq = HOSC_FREQ; + 30031d8: 017d87b7 lui a5,0x17d8 + 30031dc: 84078793 addi a5,a5,-1984 # 17d7840 + 30031e0: fef42623 sw a5,-20(s0) + break; + 30031e4: a015 j 3003208 + + case CRG_CORE_CLK_SELECT_TCXO: /* The clock source is the external crystal oscillator clock. */ + freq = XTRAIL_FREQ; + 30031e6: 01c9c7b7 lui a5,0x1c9c + 30031ea: 38078793 addi a5,a5,896 # 1c9c380 + 30031ee: fef42623 sw a5,-20(s0) + break; + 30031f2: a819 j 3003208 + + case CRG_CORE_CLK_SELECT_PLL: /* The clock source is the PLL. */ + freq = HAL_CRG_GetPllFreq(); + 30031f4: 3705 jal ra,3003114 + 30031f6: fea42623 sw a0,-20(s0) + break; + 30031fa: a039 j 3003208 + + default: + freq = LOSC_FREQ; + 30031fc: 67a1 lui a5,0x8 + 30031fe: d0078793 addi a5,a5,-768 # 7d00 + 3003202: fef42623 sw a5,-20(s0) + break; + 3003206: 0001 nop + } + return freq; + 3003208: fec42783 lw a5,-20(s0) +} + 300320c: 853e mv a0,a5 + 300320e: 40f2 lw ra,28(sp) + 3003210: 4462 lw s0,24(sp) + 3003212: 6105 addi sp,sp,32 + 3003214: 8082 ret + +03003216 : + * @brief Get Clock Frequence + * @param handle CRG Handle + * @retval Frequece of IP + */ +unsigned int HAL_CRG_GetIpFreq(const void *baseAddress) +{ + 3003216: 7179 addi sp,sp,-48 + 3003218: d606 sw ra,44(sp) + 300321a: d422 sw s0,40(sp) + 300321c: 1800 addi s0,sp,48 + 300321e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3003222: fdc42783 lw a5,-36(s0) + 3003226: eb89 bnez a5,3003238 + 3003228: 16900593 li a1,361 + 300322c: 030067b7 lui a5,0x3006 + 3003230: 4f478513 addi a0,a5,1268 # 30064f4 + 3003234: 3ccd jal ra,3002d26 + 3003236: a001 j 3003236 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003238: 040007b7 lui a5,0x4000 + 300323c: 4947a703 lw a4,1172(a5) # 4000494 + 3003240: 100007b7 lui a5,0x10000 + 3003244: 00f70a63 beq a4,a5,3003258 + 3003248: 16a00593 li a1,362 + 300324c: 030067b7 lui a5,0x3006 + 3003250: 4f478513 addi a0,a5,1268 # 30064f4 + 3003254: 3cc9 jal ra,3002d26 + 3003256: a001 j 3003256 +#ifdef FPGA + /* Use this function to obtain the clock frequency during the FPGA phase. */ + return CHIP_GetIpFreqHz(baseAddress); +#else + unsigned int hclk = HAL_CRG_GetCoreClkFreq(); + 3003258: 3725 jal ra,3003180 + 300325a: fea42423 sw a0,-24(s0) + unsigned int freq = LOSC_FREQ; + 300325e: 67a1 lui a5,0x8 + 3003260: d0078793 addi a5,a5,-768 # 7d00 + 3003264: fef42623 sw a5,-20(s0) + unsigned int coreClkFreq; + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003268: fdc42503 lw a0,-36(s0) + 300326c: 2cc9 jal ra,300353e + 300326e: fea42223 sw a0,-28(s0) + if (p == NULL) { + 3003272: fe442783 lw a5,-28(s0) + 3003276: e781 bnez a5,300327e + return freq; + 3003278: fec42783 lw a5,-20(s0) + 300327c: a895 j 30032f0 + } + switch (p->type) { + 300327e: fe442783 lw a5,-28(s0) + 3003282: 43dc lw a5,4(a5) + 3003284: 4715 li a4,5 + 3003286: 04f76a63 bltu a4,a5,30032da + 300328a: 00279713 slli a4,a5,0x2 + 300328e: 030067b7 lui a5,0x3006 + 3003292: 53078793 addi a5,a5,1328 # 3006530 + 3003296: 97ba add a5,a5,a4 + 3003298: 439c lw a5,0(a5) + 300329a: 8782 jr a5 + case CRG_IP_NONE_CLK_SEL: + case CRG_IP_EFC: + case CRG_IP_ANA: + freq = hclk; /* Returns the internal high speed clock frequency. */ + 300329c: fe842783 lw a5,-24(s0) + 30032a0: fef42623 sw a5,-20(s0) + break; + 30032a4: a825 j 30032dc + + case CRG_IP_CAN: + freq = CRG_GetPllRefIni(g_crgBaseAddr->PERI_CRG0.BIT.pll_ref_cksel); + 30032a6: 040007b7 lui a5,0x4000 + 30032aa: 4947a783 lw a5,1172(a5) # 4000494 + 30032ae: 439c lw a5,0(a5) + 30032b0: 8b85 andi a5,a5,1 + 30032b2: 9f81 uxtb a5 + 30032b4: 853e mv a0,a5 + 30032b6: 21d9 jal ra,300377c + 30032b8: fea42623 sw a0,-20(s0) + break; + 30032bc: a005 j 30032dc + + case CRG_IP_ADC: + /* Get core clock frequence for calculating the ADC clock frequency. */ + coreClkFreq = HAL_CRG_GetCoreClkFreq(); + 30032be: 35c9 jal ra,3003180 + 30032c0: fea42023 sw a0,-32(s0) + freq = CRG_GetAdcIpFreq(p, CRG_GetVcoFreq(), coreClkFreq); + 30032c4: 3b75 jal ra,3003080 + 30032c6: 87aa mv a5,a0 + 30032c8: fe042603 lw a2,-32(s0) + 30032cc: 85be mv a1,a5 + 30032ce: fe442503 lw a0,-28(s0) + 30032d2: 2c85 jal ra,3003542 + 30032d4: fea42623 sw a0,-20(s0) + break; + 30032d8: a011 j 30032dc + + case CRG_IP_IWDG: /* The IWDG clock frequency is an internal low-speed clock. */ + default: + break; + 30032da: 0001 nop + } + if (freq == 0) { + 30032dc: fec42783 lw a5,-20(s0) + 30032e0: e791 bnez a5,30032ec + freq = LOSC_FREQ; + 30032e2: 67a1 lui a5,0x8 + 30032e4: d0078793 addi a5,a5,-768 # 7d00 + 30032e8: fef42623 sw a5,-20(s0) + } + return freq; + 30032ec: fec42783 lw a5,-20(s0) +#endif +} + 30032f0: 853e mv a0,a5 + 30032f2: 50b2 lw ra,44(sp) + 30032f4: 5422 lw s0,40(sp) + 30032f6: 6145 addi sp,sp,48 + 30032f8: 8082 ret + +030032fa : + * @param enable enable mask + * @retval BASE_STATUS_ERROR Can't find the Match or operation is not support + * @retval BASE_STATUS_OK Operation Success + */ +BASE_StatusType HAL_CRG_IpEnableSet(const void *baseAddress, unsigned int enable) +{ + 30032fa: 7179 addi sp,sp,-48 + 30032fc: d606 sw ra,44(sp) + 30032fe: d422 sw s0,40(sp) + 3003300: 1800 addi s0,sp,48 + 3003302: fca42e23 sw a0,-36(s0) + 3003306: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 300330a: fdc42783 lw a5,-36(s0) + 300330e: eb89 bnez a5,3003320 + 3003310: 19c00593 li a1,412 + 3003314: 030067b7 lui a5,0x3006 + 3003318: 4f478513 addi a0,a5,1268 # 30064f4 + 300331c: 3429 jal ra,3002d26 + 300331e: a001 j 300331e + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003320: 040007b7 lui a5,0x4000 + 3003324: 4947a703 lw a4,1172(a5) # 4000494 + 3003328: 100007b7 lui a5,0x10000 + 300332c: 00f70a63 beq a4,a5,3003340 + 3003330: 19d00593 li a1,413 + 3003334: 030067b7 lui a5,0x3006 + 3003338: 4f478513 addi a0,a5,1268 # 30064f4 + 300333c: 32ed jal ra,3002d26 + 300333e: a001 j 300333e + /* Check the validity of the input parameters. */ + CRG_PARAM_CHECK_WITH_RET((enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE), BASE_STATUS_ERROR); + 3003340: fd842703 lw a4,-40(s0) + 3003344: 4785 li a5,1 + 3003346: 00f70e63 beq a4,a5,3003362 + 300334a: fd842783 lw a5,-40(s0) + 300334e: cb91 beqz a5,3003362 + 3003350: 19f00593 li a1,415 + 3003354: 030067b7 lui a5,0x3006 + 3003358: 4f478513 addi a0,a5,1268 # 30064f4 + 300335c: 32e9 jal ra,3002d26 + 300335e: 4785 li a5,1 + 3003360: a0a5 j 30033c8 + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003362: fdc42503 lw a0,-36(s0) + 3003366: 2ae1 jal ra,300353e + 3003368: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 300336c: fec42783 lw a5,-20(s0) + 3003370: c799 beqz a5,300337e + 3003372: fec42783 lw a5,-20(s0) + 3003376: 43d8 lw a4,4(a5) + 3003378: 4795 li a5,5 + 300337a: 00e7f463 bgeu a5,a4,3003382 + return BASE_STATUS_ERROR; + 300337e: 4785 li a5,1 + 3003380: a0a1 j 30033c8 + } + if (g_ipClkProc[p->type].enableSet == NULL) { + 3003382: fec42783 lw a5,-20(s0) + 3003386: 43d4 lw a3,4(a5) + 3003388: 040007b7 lui a5,0x4000 + 300338c: 02478713 addi a4,a5,36 # 4000024 + 3003390: 02400793 li a5,36 + 3003394: 02f687b3 mul a5,a3,a5 + 3003398: 97ba add a5,a5,a4 + 300339a: 479c lw a5,8(a5) + 300339c: e399 bnez a5,30033a2 + return BASE_STATUS_ERROR; + 300339e: 4785 li a5,1 + 30033a0: a025 j 30033c8 + } + g_ipClkProc[p->type].enableSet(p, enable); + 30033a2: fec42783 lw a5,-20(s0) + 30033a6: 43d4 lw a3,4(a5) + 30033a8: 040007b7 lui a5,0x4000 + 30033ac: 02478713 addi a4,a5,36 # 4000024 + 30033b0: 02400793 li a5,36 + 30033b4: 02f687b3 mul a5,a3,a5 + 30033b8: 97ba add a5,a5,a4 + 30033ba: 479c lw a5,8(a5) + 30033bc: fd842583 lw a1,-40(s0) + 30033c0: fec42503 lw a0,-20(s0) + 30033c4: 9782 jalr a5 + return BASE_STATUS_OK; + 30033c6: 4781 li a5,0 +} + 30033c8: 853e mv a0,a5 + 30033ca: 50b2 lw ra,44(sp) + 30033cc: 5422 lw s0,40(sp) + 30033ce: 6145 addi sp,sp,48 + 30033d0: 8082 ret + +030033d2 : + * @param select clock select, @see CRG_APBLsClkSelect for ip in apb_ls_subsys or CRG_AdcClkSelect for adc + * @retval BASE_STATUS_OK success + * @retval BASE_STATUS_ERROR fail + */ +BASE_StatusType HAL_CRG_IpClkSelectSet(const void *baseAddress, unsigned int select) +{ + 30033d2: 7179 addi sp,sp,-48 + 30033d4: d606 sw ra,44(sp) + 30033d6: d422 sw s0,40(sp) + 30033d8: 1800 addi s0,sp,48 + 30033da: fca42e23 sw a0,-36(s0) + 30033de: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 30033e2: fdc42783 lw a5,-36(s0) + 30033e6: eb89 bnez a5,30033f8 + 30033e8: 1cd00593 li a1,461 + 30033ec: 030067b7 lui a5,0x3006 + 30033f0: 4f478513 addi a0,a5,1268 # 30064f4 + 30033f4: 2d8d jal ra,3003a66 + 30033f6: a001 j 30033f6 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30033f8: 040007b7 lui a5,0x4000 + 30033fc: 4947a703 lw a4,1172(a5) # 4000494 + 3003400: 100007b7 lui a5,0x10000 + 3003404: 00f70a63 beq a4,a5,3003418 + 3003408: 1ce00593 li a1,462 + 300340c: 030067b7 lui a5,0x3006 + 3003410: 4f478513 addi a0,a5,1268 # 30064f4 + 3003414: 2d89 jal ra,3003a66 + 3003416: a001 j 3003416 + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003418: fdc42503 lw a0,-36(s0) + 300341c: 220d jal ra,300353e + 300341e: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 3003422: fec42783 lw a5,-20(s0) + 3003426: c799 beqz a5,3003434 + 3003428: fec42783 lw a5,-20(s0) + 300342c: 43d8 lw a4,4(a5) + 300342e: 4795 li a5,5 + 3003430: 00e7f463 bgeu a5,a4,3003438 + return BASE_STATUS_ERROR; + 3003434: 4785 li a5,1 + 3003436: a0a1 j 300347e + } + if (g_ipClkProc[p->type].clkSelSet == NULL) { + 3003438: fec42783 lw a5,-20(s0) + 300343c: 43d4 lw a3,4(a5) + 300343e: 040007b7 lui a5,0x4000 + 3003442: 02478713 addi a4,a5,36 # 4000024 + 3003446: 02400793 li a5,36 + 300344a: 02f687b3 mul a5,a3,a5 + 300344e: 97ba add a5,a5,a4 + 3003450: 47dc lw a5,12(a5) + 3003452: e399 bnez a5,3003458 + return BASE_STATUS_ERROR; + 3003454: 4785 li a5,1 + 3003456: a025 j 300347e + } + g_ipClkProc[p->type].clkSelSet(p, select); /* Clock selection of the configuration module. */ + 3003458: fec42783 lw a5,-20(s0) + 300345c: 43d4 lw a3,4(a5) + 300345e: 040007b7 lui a5,0x4000 + 3003462: 02478713 addi a4,a5,36 # 4000024 + 3003466: 02400793 li a5,36 + 300346a: 02f687b3 mul a5,a3,a5 + 300346e: 97ba add a5,a5,a4 + 3003470: 47dc lw a5,12(a5) + 3003472: fd842583 lw a1,-40(s0) + 3003476: fec42503 lw a0,-20(s0) + 300347a: 9782 jalr a5 + return BASE_STATUS_OK; + 300347c: 4781 li a5,0 +} + 300347e: 853e mv a0,a5 + 3003480: 50b2 lw ra,44(sp) + 3003482: 5422 lw s0,40(sp) + 3003484: 6145 addi sp,sp,48 + 3003486: 8082 ret + +03003488 : + * @param div set div value + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Match Fail or Not support + */ +BASE_StatusType HAL_CRG_IpClkDivSet(const void *baseAddress, unsigned int div) +{ + 3003488: 7179 addi sp,sp,-48 + 300348a: d606 sw ra,44(sp) + 300348c: d422 sw s0,40(sp) + 300348e: 1800 addi s0,sp,48 + 3003490: fca42e23 sw a0,-36(s0) + 3003494: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3003498: fdc42783 lw a5,-36(s0) + 300349c: eb89 bnez a5,30034ae + 300349e: 22c00593 li a1,556 + 30034a2: 030067b7 lui a5,0x3006 + 30034a6: 4f478513 addi a0,a5,1268 # 30064f4 + 30034aa: 2b75 jal ra,3003a66 + 30034ac: a001 j 30034ac + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30034ae: 040007b7 lui a5,0x4000 + 30034b2: 4947a703 lw a4,1172(a5) # 4000494 + 30034b6: 100007b7 lui a5,0x10000 + 30034ba: 00f70a63 beq a4,a5,30034ce + 30034be: 22d00593 li a1,557 + 30034c2: 030067b7 lui a5,0x3006 + 30034c6: 4f478513 addi a0,a5,1268 # 30064f4 + 30034ca: 2b71 jal ra,3003a66 + 30034cc: a001 j 30034cc + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 30034ce: fdc42503 lw a0,-36(s0) + 30034d2: 20b5 jal ra,300353e + 30034d4: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 30034d8: fec42783 lw a5,-20(s0) + 30034dc: c799 beqz a5,30034ea + 30034de: fec42783 lw a5,-20(s0) + 30034e2: 43d8 lw a4,4(a5) + 30034e4: 4795 li a5,5 + 30034e6: 00e7f463 bgeu a5,a4,30034ee + return BASE_STATUS_ERROR; + 30034ea: 4785 li a5,1 + 30034ec: a0a1 j 3003534 + } + if (g_ipClkProc[p->type].clkDivSet == NULL) { + 30034ee: fec42783 lw a5,-20(s0) + 30034f2: 43d4 lw a3,4(a5) + 30034f4: 040007b7 lui a5,0x4000 + 30034f8: 02478713 addi a4,a5,36 # 4000024 + 30034fc: 02400793 li a5,36 + 3003500: 02f687b3 mul a5,a3,a5 + 3003504: 97ba add a5,a5,a4 + 3003506: 4b9c lw a5,16(a5) + 3003508: e399 bnez a5,300350e + return BASE_STATUS_ERROR; + 300350a: 4785 li a5,1 + 300350c: a025 j 3003534 + } + g_ipClkProc[p->type].clkDivSet(p, div); /* Configure the clock frequency divider of the module. */ + 300350e: fec42783 lw a5,-20(s0) + 3003512: 43d4 lw a3,4(a5) + 3003514: 040007b7 lui a5,0x4000 + 3003518: 02478713 addi a4,a5,36 # 4000024 + 300351c: 02400793 li a5,36 + 3003520: 02f687b3 mul a5,a3,a5 + 3003524: 97ba add a5,a5,a4 + 3003526: 4b9c lw a5,16(a5) + 3003528: fd842583 lw a1,-40(s0) + 300352c: fec42503 lw a0,-20(s0) + 3003530: 9782 jalr a5 + return BASE_STATUS_OK; + 3003532: 4781 li a5,0 +} + 3003534: 853e mv a0,a5 + 3003536: 50b2 lw ra,44(sp) + 3003538: 5422 lw s0,40(sp) + 300353a: 6145 addi sp,sp,48 + 300353c: 8082 ret + +0300353e : + 300353e: c6bfd06f j 30011a8 + +03003542 : + * @param coreClkFreq core clock rate + * @retval Ip Frequence + */ +static unsigned int CRG_GetAdcIpFreq(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int baseClkRate, + unsigned int coreClkFreq) +{ + 3003542: 7139 addi sp,sp,-64 + 3003544: de06 sw ra,60(sp) + 3003546: dc22 sw s0,56(sp) + 3003548: 0080 addi s0,sp,64 + 300354a: fca42623 sw a0,-52(s0) + 300354e: fcb42423 sw a1,-56(s0) + 3003552: fcc42223 sw a2,-60(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003556: fcc42783 lw a5,-52(s0) + 300355a: eb89 bnez a5,300356c + 300355c: 2af00593 li a1,687 + 3003560: 030067b7 lui a5,0x3006 + 3003564: 4f478513 addi a0,a5,1268 # 30064f4 + 3003568: 29fd jal ra,3003a66 + 300356a: a001 j 300356a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300356c: 040007b7 lui a5,0x4000 + 3003570: 4947a783 lw a5,1172(a5) # 4000494 + 3003574: eb89 bnez a5,3003586 + 3003576: 2b000593 li a1,688 + 300357a: 030067b7 lui a5,0x3006 + 300357e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003582: 21d5 jal ra,3003a66 + 3003584: a001 j 3003584 + + unsigned int clkSel; + unsigned int clkDiv; + unsigned int pst2Div; + unsigned int freq = 0; + 3003586: fe042623 sw zero,-20(s0) + + /* Obtains the clock source selection of the ADC. */ + const CRG_IpProc *proc = &g_ipClkProc[matchInfo->type]; + 300358a: fcc42783 lw a5,-52(s0) + 300358e: 43d8 lw a4,4(a5) + 3003590: 02400793 li a5,36 + 3003594: 02f70733 mul a4,a4,a5 + 3003598: 040007b7 lui a5,0x4000 + 300359c: 02478793 addi a5,a5,36 # 4000024 + 30035a0: 97ba add a5,a5,a4 + 30035a2: fef42423 sw a5,-24(s0) + if (proc->clkSelGet == NULL) { + 30035a6: fe842783 lw a5,-24(s0) + 30035aa: 4fdc lw a5,28(a5) + 30035ac: e399 bnez a5,30035b2 + return 0; + 30035ae: 4781 li a5,0 + 30035b0: a07d j 300365e + } + clkSel = proc->clkSelGet(matchInfo); + 30035b2: fe842783 lw a5,-24(s0) + 30035b6: 4fdc lw a5,28(a5) + 30035b8: fcc42503 lw a0,-52(s0) + 30035bc: 9782 jalr a5 + 30035be: fea42223 sw a0,-28(s0) + /* Calculate the frequency from the ADC's clock source. */ + if (clkSel == CRG_ADC_CLK_SYN_CORE) { + 30035c2: fe442703 lw a4,-28(s0) + 30035c6: 478d li a5,3 + 30035c8: 00f71763 bne a4,a5,30035d6 + freq = coreClkFreq; + 30035cc: fc442783 lw a5,-60(s0) + 30035d0: fef42623 sw a5,-20(s0) + 30035d4: a085 j 3003634 + } else if (clkSel == CRG_ADC_CLK_ASYN_HOSC) { + 30035d6: fe442783 lw a5,-28(s0) + 30035da: eb81 bnez a5,30035ea + freq = HOSC_FREQ; + 30035dc: 017d87b7 lui a5,0x17d8 + 30035e0: 84078793 addi a5,a5,-1984 # 17d7840 + 30035e4: fef42623 sw a5,-20(s0) + 30035e8: a0b1 j 3003634 + } else if (clkSel == CRG_ADC_CLK_ASYN_TCXO) { + 30035ea: fe442703 lw a4,-28(s0) + 30035ee: 4785 li a5,1 + 30035f0: 00f71963 bne a4,a5,3003602 + /* The maximum speed of the external clock source is 30000000U. */ + freq = (XTRAIL_FREQ > 30000000U) ? 0 : XTRAIL_FREQ; + 30035f4: 01c9c7b7 lui a5,0x1c9c + 30035f8: 38078793 addi a5,a5,896 # 1c9c380 + 30035fc: fef42623 sw a5,-20(s0) + 3003600: a815 j 3003634 + } else if (clkSel == CRG_ADC_CLK_ASYN_PLL_DIV) { + 3003602: fe442703 lw a4,-28(s0) + 3003606: 4789 li a5,2 + 3003608: 02f71663 bne a4,a5,3003634 + pst2Div = CRG_GetPllPostDivValue((CRG_PllPostDiv)g_crgBaseAddr->PERI_CRG3.BIT.pll_postdiv2); + 300360c: 040007b7 lui a5,0x4000 + 3003610: 4947a783 lw a5,1172(a5) # 4000494 + 3003614: 47dc lw a5,12(a5) + 3003616: 8391 srli a5,a5,0x4 + 3003618: 8bbd andi a5,a5,15 + 300361a: 9f81 uxtb a5 + 300361c: 853e mv a0,a5 + 300361e: 2ae5 jal ra,3003816 + 3003620: fea42023 sw a0,-32(s0) + freq = baseClkRate / pst2Div; + 3003624: fc842703 lw a4,-56(s0) + 3003628: fe042783 lw a5,-32(s0) + 300362c: 02f757b3 divu a5,a4,a5 + 3003630: fef42623 sw a5,-20(s0) + } + + /* Obtain the frequency divider based on the ADC clock source. */ + if (proc->clkDivGet == NULL) { + 3003634: fe842783 lw a5,-24(s0) + 3003638: 539c lw a5,32(a5) + 300363a: e399 bnez a5,3003640 + return 0; + 300363c: 4781 li a5,0 + 300363e: a005 j 300365e + } + clkDiv = proc->clkDivGet(matchInfo); + 3003640: fe842783 lw a5,-24(s0) + 3003644: 539c lw a5,32(a5) + 3003646: fcc42503 lw a0,-52(s0) + 300364a: 9782 jalr a5 + 300364c: fca42e23 sw a0,-36(s0) + /* Calculate the clock frequency of the ADC. */ + return (freq / (clkDiv + 1)); + 3003650: fdc42783 lw a5,-36(s0) + 3003654: 0785 addi a5,a5,1 + 3003656: fec42703 lw a4,-20(s0) + 300365a: 02f757b3 divu a5,a4,a5 +} + 300365e: 853e mv a0,a5 + 3003660: 50f2 lw ra,60(sp) + 3003662: 5462 lw s0,56(sp) + 3003664: 6121 addi sp,sp,64 + 3003666: 8082 ret + +03003668 : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValidPllConfig(const CRG_Handle *handle) +{ + 3003668: 7179 addi sp,sp,-48 + 300366a: d606 sw ra,44(sp) + 300366c: d422 sw s0,40(sp) + 300366e: 1800 addi s0,sp,48 + 3003670: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + unsigned int freq; + + freq = CRG_GetPllRefIni(handle->pllRefClkSelect); + 3003674: fdc42783 lw a5,-36(s0) + 3003678: 43dc lw a5,4(a5) + 300367a: 853e mv a0,a5 + 300367c: 2201 jal ra,300377c + 300367e: fea42623 sw a0,-20(s0) + preDiv = CRG_GetPreDivValue(handle->pllPreDiv); + 3003682: fdc42783 lw a5,-36(s0) + 3003686: 479c lw a5,8(a5) + 3003688: 853e mv a0,a5 + 300368a: 2a31 jal ra,30037a6 + 300368c: fea42423 sw a0,-24(s0) + /* Check the validity of the prescaled clock frequency. */ + if (!IsCrgValidPreDiv(freq, preDiv)) { + 3003690: fe842583 lw a1,-24(s0) + 3003694: fec42503 lw a0,-20(s0) + 3003698: c26ff0ef jal ra,3002abe + 300369c: 87aa mv a5,a0 + 300369e: 0017c793 xori a5,a5,1 + 30036a2: 9f81 uxtb a5 + 30036a4: c399 beqz a5,30036aa + return BASE_STATUS_ERROR; + 30036a6: 4785 li a5,1 + 30036a8: a8a5 j 3003720 + } + freq /= preDiv; + 30036aa: fec42703 lw a4,-20(s0) + 30036ae: fe842783 lw a5,-24(s0) + 30036b2: 02f757b3 divu a5,a4,a5 + 30036b6: fef42623 sw a5,-20(s0) + /* Check the validity of the clock frequency after frequency multiplication. */ + if (!IsCrgValidFdDiv(freq, handle->pllFbDiv)) { + 30036ba: fdc42783 lw a5,-36(s0) + 30036be: 47dc lw a5,12(a5) + 30036c0: 85be mv a1,a5 + 30036c2: fec42503 lw a0,-20(s0) + 30036c6: c56ff0ef jal ra,3002b1c + 30036ca: 87aa mv a5,a0 + 30036cc: 0017c793 xori a5,a5,1 + 30036d0: 9f81 uxtb a5 + 30036d2: c399 beqz a5,30036d8 + return BASE_STATUS_ERROR; + 30036d4: 4785 li a5,1 + 30036d6: a0a9 j 3003720 + } + freq *= (handle->pllFbDiv > 0x06) ? handle->pllFbDiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 30036d8: fdc42783 lw a5,-36(s0) + 30036dc: 47dc lw a5,12(a5) + 30036de: 4719 li a4,6 + 30036e0: 00e7f363 bgeu a5,a4,30036e6 + 30036e4: 4799 li a5,6 + 30036e6: fec42703 lw a4,-20(s0) + 30036ea: 02f707b3 mul a5,a4,a5 + 30036ee: fef42623 sw a5,-20(s0) + /* Check whether the PLL output frequency is valid. */ + if (IsCrgValidPostDiv(freq, handle->pllPostDiv) && IsCrgValidPostDiv2(freq, handle->handleEx.pllPostDiv2)) { + 30036f2: fdc42783 lw a5,-36(s0) + 30036f6: 4b9c lw a5,16(a5) + 30036f8: 85be mv a1,a5 + 30036fa: fec42503 lw a0,-20(s0) + 30036fe: ca8ff0ef jal ra,3002ba6 + 3003702: 87aa mv a5,a0 + 3003704: cf89 beqz a5,300371e + 3003706: fdc42783 lw a5,-36(s0) + 300370a: 4fdc lw a5,28(a5) + 300370c: 85be mv a1,a5 + 300370e: fec42503 lw a0,-20(s0) + 3003712: cdcff0ef jal ra,3002bee + 3003716: 87aa mv a5,a0 + 3003718: c399 beqz a5,300371e + return BASE_STATUS_OK; + 300371a: 4781 li a5,0 + 300371c: a011 j 3003720 + } + return BASE_STATUS_ERROR; + 300371e: 4785 li a5,1 +} + 3003720: 853e mv a0,a5 + 3003722: 50b2 lw ra,44(sp) + 3003724: 5422 lw s0,40(sp) + 3003726: 6145 addi sp,sp,48 + 3003728: 8082 ret + +0300372a : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValid1MHzConfig(const CRG_Handle *handle) +{ + 300372a: 7179 addi sp,sp,-48 + 300372c: d622 sw s0,44(sp) + 300372e: 1800 addi s0,sp,48 + 3003730: fca42e23 sw a0,-36(s0) + unsigned int freq; + /* Get the ref frequency of the 1 MHz clock. */ + freq = (handle->handleEx.clk1MSelect == CRG_1M_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003734: fdc42783 lw a5,-36(s0) + 3003738: 539c lw a5,32(a5) + 300373a: e791 bnez a5,3003746 + 300373c: 017d87b7 lui a5,0x17d8 + 3003740: 84078793 addi a5,a5,-1984 # 17d7840 + 3003744: a029 j 300374e + 3003746: 01c9c7b7 lui a5,0x1c9c + 300374a: 38078793 addi a5,a5,896 # 1c9c380 + 300374e: fef42623 sw a5,-20(s0) + /* Check whether the 1MHz output frequency is valid. */ + if ((freq / (handle->handleEx.clk1MDiv + 1)) == CRG_FREQ_1MHz) { + 3003752: fdc42783 lw a5,-36(s0) + 3003756: 53dc lw a5,36(a5) + 3003758: 0785 addi a5,a5,1 + 300375a: fec42703 lw a4,-20(s0) + 300375e: 02f75733 divu a4,a4,a5 + 3003762: 000f47b7 lui a5,0xf4 + 3003766: 24078793 addi a5,a5,576 # f4240 + 300376a: 00f71463 bne a4,a5,3003772 + return BASE_STATUS_OK; + 300376e: 4781 li a5,0 + 3003770: a011 j 3003774 + } + return BASE_STATUS_ERROR; + 3003772: 4785 li a5,1 +} + 3003774: 853e mv a0,a5 + 3003776: 5432 lw s0,44(sp) + 3003778: 6145 addi sp,sp,48 + 300377a: 8082 ret + +0300377c : + * @brief Get clock frequence + * @param crg CRG_RegStruct + * @retval The frequence fo clock + */ +static inline unsigned int CRG_GetPllRefIni(CRG_PllRefClkSelect pllRefClkSelect) +{ + 300377c: 1101 addi sp,sp,-32 + 300377e: ce22 sw s0,28(sp) + 3003780: 1000 addi s0,sp,32 + 3003782: fea42623 sw a0,-20(s0) + /* The maximum speed of the external clock source is 30000000U. */ + if (pllRefClkSelect == CRG_PLL_REF_CLK_SELECT_XTAL && XTRAIL_FREQ > 30000000U) { + return 0; + } + return (pllRefClkSelect == (unsigned int)CRG_PLL_REF_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003786: fec42783 lw a5,-20(s0) + 300378a: e791 bnez a5,3003796 + 300378c: 017d87b7 lui a5,0x17d8 + 3003790: 84078793 addi a5,a5,-1984 # 17d7840 + 3003794: a029 j 300379e + 3003796: 01c9c7b7 lui a5,0x1c9c + 300379a: 38078793 addi a5,a5,896 # 1c9c380 +} + 300379e: 853e mv a0,a5 + 30037a0: 4472 lw s0,28(sp) + 30037a2: 6105 addi sp,sp,32 + 30037a4: 8082 ret + +030037a6 : + * @brief Get previous division Value before PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPreDivValue(CRG_PllPreDiv pllPredDiv) +{ + 30037a6: 7179 addi sp,sp,-48 + 30037a8: d622 sw s0,44(sp) + 30037aa: 1800 addi s0,sp,48 + 30037ac: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + if (pllPredDiv <= CRG_PLL_PREDIV_1) { /* 0 or 1 returns PLL_PREDIV_OUT_1. */ + 30037b0: fdc42783 lw a5,-36(s0) + 30037b4: e789 bnez a5,30037be + preDiv = PLL_PREDIV_OUT_1; + 30037b6: 4785 li a5,1 + 30037b8: fef42623 sw a5,-20(s0) + 30037bc: a031 j 30037c8 + } else { + preDiv = pllPredDiv + 1; + 30037be: fdc42783 lw a5,-36(s0) + 30037c2: 0785 addi a5,a5,1 + 30037c4: fef42623 sw a5,-20(s0) + } + return preDiv; + 30037c8: fec42783 lw a5,-20(s0) +} + 30037cc: 853e mv a0,a5 + 30037ce: 5432 lw s0,44(sp) + 30037d0: 6145 addi sp,sp,48 + 30037d2: 8082 ret + +030037d4 : + * @brief Get PLL loop divider ratio + * @param crg CRG_RegStruct + * @retval PLL loop divider ratio + */ +static inline unsigned int CRG_GetPllFbDivValue(unsigned int pllFbDiv) +{ + 30037d4: 7179 addi sp,sp,-48 + 30037d6: d622 sw s0,44(sp) + 30037d8: 1800 addi s0,sp,48 + 30037da: fca42e23 sw a0,-36(s0) + unsigned int div = pllFbDiv; + 30037de: fdc42783 lw a5,-36(s0) + 30037e2: fef42623 sw a5,-20(s0) + /* Check the validity of the minimum frequency multiplication parameter. */ + if (div < CRG_PLL_FBDIV_MIN) { + 30037e6: fec42703 lw a4,-20(s0) + 30037ea: 4795 li a5,5 + 30037ec: 00e7e563 bltu a5,a4,30037f6 + div = CRG_PLL_FBDIV_MIN; + 30037f0: 4799 li a5,6 + 30037f2: fef42623 sw a5,-20(s0) + } + /* Check the validity of the maximum frequency multiplication parameter. */ + if (div > CRG_PLL_FBDIV_MAX) { + 30037f6: fec42703 lw a4,-20(s0) + 30037fa: 07f00793 li a5,127 + 30037fe: 00e7f663 bgeu a5,a4,300380a + div = CRG_PLL_FBDIV_MAX; + 3003802: 07f00793 li a5,127 + 3003806: fef42623 sw a5,-20(s0) + } + return div; + 300380a: fec42783 lw a5,-20(s0) +} + 300380e: 853e mv a0,a5 + 3003810: 5432 lw s0,44(sp) + 3003812: 6145 addi sp,sp,48 + 3003814: 8082 ret + +03003816 : + * @brief Get post division Value after PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPllPostDivValue(unsigned int pllPostDiv) +{ + 3003816: 7179 addi sp,sp,-48 + 3003818: d622 sw s0,44(sp) + 300381a: 1800 addi s0,sp,48 + 300381c: fca42e23 sw a0,-36(s0) + unsigned int div = pllPostDiv; + 3003820: fdc42783 lw a5,-36(s0) + 3003824: fef42623 sw a5,-20(s0) + if (div > CRG_PLL_POSTDIV_8) { + 3003828: fec42703 lw a4,-20(s0) + 300382c: 479d li a5,7 + 300382e: 00e7f663 bgeu a5,a4,300383a + div = (CRG_PLL_POSTDIV_8 + 1); /* If the postdiv is greater than 8, set this postdiv to 8. */ + 3003832: 47a1 li a5,8 + 3003834: fef42623 sw a5,-20(s0) + 3003838: a031 j 3003844 + } else { + div += 1; + 300383a: fec42783 lw a5,-20(s0) + 300383e: 0785 addi a5,a5,1 + 3003840: fef42623 sw a5,-20(s0) + } + return div; + 3003844: fec42783 lw a5,-20(s0) +} + 3003848: 853e mv a0,a5 + 300384a: 5432 lw s0,44(sp) + 300384c: 6145 addi sp,sp,48 + 300384e: 8082 ret + +03003850 : + * @param matchInfo IP without Clock select match info + * @param enable BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003850: 7179 addi sp,sp,-48 + 3003852: d606 sw ra,44(sp) + 3003854: d422 sw s0,40(sp) + 3003856: 1800 addi s0,sp,48 + 3003858: fca42e23 sw a0,-36(s0) + 300385c: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003860: fdc42783 lw a5,-36(s0) + 3003864: eb89 bnez a5,3003876 + 3003866: 34d00593 li a1,845 + 300386a: 030067b7 lui a5,0x3006 + 300386e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003872: 2ad5 jal ra,3003a66 + 3003874: a001 j 3003874 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003876: 040007b7 lui a5,0x4000 + 300387a: 4947a783 lw a5,1172(a5) # 4000494 + 300387e: eb89 bnez a5,3003890 + 3003880: 34e00593 li a1,846 + 3003884: 030067b7 lui a5,0x3006 + 3003888: 4f478513 addi a0,a5,1268 # 30064f4 + 300388c: 2ae9 jal ra,3003a66 + 300388e: a001 j 300388e + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003890: 040007b7 lui a5,0x4000 + 3003894: 4947a783 lw a5,1172(a5) # 4000494 + 3003898: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 300389c: fdc42783 lw a5,-36(s0) + 30038a0: 279e lhu a5,8(a5) + 30038a2: 873e mv a4,a5 + 30038a4: fec42783 lw a5,-20(s0) + 30038a8: 97ba add a5,a5,a4 + 30038aa: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 30038ae: fe842783 lw a5,-24(s0) + 30038b2: 439c lw a5,0(a5) + 30038b4: fef42223 sw a5,-28(s0) + if (enable & IP_CLK_ENABLE) { /* Set enable of target ip. */ + 30038b8: fd842783 lw a5,-40(s0) + 30038bc: 8b85 andi a5,a5,1 + 30038be: c7c1 beqz a5,3003946 + cfg.BIT.clkEnMask |= 1 << matchInfo->bitOffset; + 30038c0: fe442783 lw a5,-28(s0) + 30038c4: 9fa1 uxth a5 + 30038c6: 01079713 slli a4,a5,0x10 + 30038ca: 8741 srai a4,a4,0x10 + 30038cc: fdc42783 lw a5,-36(s0) + 30038d0: 27bc lbu a5,10(a5) + 30038d2: 86be mv a3,a5 + 30038d4: 4785 li a5,1 + 30038d6: 00d797b3 sll a5,a5,a3 + 30038da: 07c2 slli a5,a5,0x10 + 30038dc: 87c1 srai a5,a5,0x10 + 30038de: 8fd9 or a5,a5,a4 + 30038e0: 07c2 slli a5,a5,0x10 + 30038e2: 87c1 srai a5,a5,0x10 + 30038e4: 01079693 slli a3,a5,0x10 + 30038e8: 82c1 srli a3,a3,0x10 + 30038ea: fe442783 lw a5,-28(s0) + 30038ee: 6741 lui a4,0x10 + 30038f0: 177d addi a4,a4,-1 # ffff + 30038f2: 8f75 and a4,a4,a3 + 30038f4: 76c1 lui a3,0xffff0 + 30038f6: 8ff5 and a5,a5,a3 + 30038f8: 8fd9 or a5,a5,a4 + 30038fa: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); + 30038fe: fe442783 lw a5,-28(s0) + 3003902: 83c1 srli a5,a5,0x10 + 3003904: 9fa1 uxth a5 + 3003906: 01079713 slli a4,a5,0x10 + 300390a: 8741 srai a4,a4,0x10 + 300390c: fdc42783 lw a5,-36(s0) + 3003910: 27bc lbu a5,10(a5) + 3003912: 86be mv a3,a5 + 3003914: 4785 li a5,1 + 3003916: 00d797b3 sll a5,a5,a3 + 300391a: 07c2 slli a5,a5,0x10 + 300391c: 87c1 srai a5,a5,0x10 + 300391e: fff7c793 not a5,a5 + 3003922: 07c2 slli a5,a5,0x10 + 3003924: 87c1 srai a5,a5,0x10 + 3003926: 8ff9 and a5,a5,a4 + 3003928: 07c2 slli a5,a5,0x10 + 300392a: 87c1 srai a5,a5,0x10 + 300392c: 01079713 slli a4,a5,0x10 + 3003930: 8341 srli a4,a4,0x10 + 3003932: fe442783 lw a5,-28(s0) + 3003936: 0742 slli a4,a4,0x10 + 3003938: 66c1 lui a3,0x10 + 300393a: 16fd addi a3,a3,-1 # ffff + 300393c: 8ff5 and a5,a5,a3 + 300393e: 8fd9 or a5,a5,a4 + 3003940: fef42223 sw a5,-28(s0) + 3003944: a059 j 30039ca + } else { + cfg.BIT.clkEnMask &= ~(1 << matchInfo->bitOffset); /* Disable of target ip. */ + 3003946: fe442783 lw a5,-28(s0) + 300394a: 9fa1 uxth a5 + 300394c: 01079713 slli a4,a5,0x10 + 3003950: 8741 srai a4,a4,0x10 + 3003952: fdc42783 lw a5,-36(s0) + 3003956: 27bc lbu a5,10(a5) + 3003958: 86be mv a3,a5 + 300395a: 4785 li a5,1 + 300395c: 00d797b3 sll a5,a5,a3 + 3003960: 07c2 slli a5,a5,0x10 + 3003962: 87c1 srai a5,a5,0x10 + 3003964: fff7c793 not a5,a5 + 3003968: 07c2 slli a5,a5,0x10 + 300396a: 87c1 srai a5,a5,0x10 + 300396c: 8ff9 and a5,a5,a4 + 300396e: 07c2 slli a5,a5,0x10 + 3003970: 87c1 srai a5,a5,0x10 + 3003972: 01079693 slli a3,a5,0x10 + 3003976: 82c1 srli a3,a3,0x10 + 3003978: fe442783 lw a5,-28(s0) + 300397c: 6741 lui a4,0x10 + 300397e: 177d addi a4,a4,-1 # ffff + 3003980: 8f75 and a4,a4,a3 + 3003982: 76c1 lui a3,0xffff0 + 3003984: 8ff5 and a5,a5,a3 + 3003986: 8fd9 or a5,a5,a4 + 3003988: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq |= (1 << matchInfo->bitOffset); + 300398c: fe442783 lw a5,-28(s0) + 3003990: 83c1 srli a5,a5,0x10 + 3003992: 9fa1 uxth a5 + 3003994: 01079713 slli a4,a5,0x10 + 3003998: 8741 srai a4,a4,0x10 + 300399a: fdc42783 lw a5,-36(s0) + 300399e: 27bc lbu a5,10(a5) + 30039a0: 86be mv a3,a5 + 30039a2: 4785 li a5,1 + 30039a4: 00d797b3 sll a5,a5,a3 + 30039a8: 07c2 slli a5,a5,0x10 + 30039aa: 87c1 srai a5,a5,0x10 + 30039ac: 8fd9 or a5,a5,a4 + 30039ae: 07c2 slli a5,a5,0x10 + 30039b0: 87c1 srai a5,a5,0x10 + 30039b2: 01079713 slli a4,a5,0x10 + 30039b6: 8341 srli a4,a4,0x10 + 30039b8: fe442783 lw a5,-28(s0) + 30039bc: 0742 slli a4,a4,0x10 + 30039be: 66c1 lui a3,0x10 + 30039c0: 16fd addi a3,a3,-1 # ffff + 30039c2: 8ff5 and a5,a5,a3 + 30039c4: 8fd9 or a5,a5,a4 + 30039c6: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 30039ca: fe442703 lw a4,-28(s0) + 30039ce: fe842783 lw a5,-24(s0) + 30039d2: c398 sw a4,0(a5) +} + 30039d4: 0001 nop + 30039d6: 50b2 lw ra,44(sp) + 30039d8: 5422 lw s0,40(sp) + 30039da: 6145 addi sp,sp,48 + 30039dc: 8082 ret + +030039de : + * @brief Get Enable status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock Enable status + */ +static unsigned int CRG_IpWoClkSelEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30039de: 7179 addi sp,sp,-48 + 30039e0: d606 sw ra,44(sp) + 30039e2: d422 sw s0,40(sp) + 30039e4: 1800 addi s0,sp,48 + 30039e6: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30039ea: fdc42783 lw a5,-36(s0) + 30039ee: eb89 bnez a5,3003a00 + 30039f0: 36500593 li a1,869 + 30039f4: 030067b7 lui a5,0x3006 + 30039f8: 4f478513 addi a0,a5,1268 # 30064f4 + 30039fc: 20ad jal ra,3003a66 + 30039fe: a001 j 30039fe + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003a00: 040007b7 lui a5,0x4000 + 3003a04: 4947a783 lw a5,1172(a5) # 4000494 + 3003a08: eb89 bnez a5,3003a1a + 3003a0a: 36600593 li a1,870 + 3003a0e: 030067b7 lui a5,0x3006 + 3003a12: 4f478513 addi a0,a5,1268 # 30064f4 + 3003a16: 2881 jal ra,3003a66 + 3003a18: a001 j 3003a18 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003a1a: 040007b7 lui a5,0x4000 + 3003a1e: 4947a783 lw a5,1172(a5) # 4000494 + 3003a22: fef42623 sw a5,-20(s0) + /* Get enable status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003a26: fdc42783 lw a5,-36(s0) + 3003a2a: 279e lhu a5,8(a5) + 3003a2c: 873e mv a4,a5 + 3003a2e: fec42783 lw a5,-20(s0) + 3003a32: 97ba add a5,a5,a4 + 3003a34: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + + cfg.value = p->value; + 3003a38: fe842783 lw a5,-24(s0) + 3003a3c: 439c lw a5,0(a5) + 3003a3e: fef42223 sw a5,-28(s0) + return (cfg.BIT.clkEnMask & (1 << matchInfo->bitOffset)) == 0 ? false : true; + 3003a42: fe442783 lw a5,-28(s0) + 3003a46: 9fa1 uxth a5 + 3003a48: 873e mv a4,a5 + 3003a4a: fdc42783 lw a5,-36(s0) + 3003a4e: 27bc lbu a5,10(a5) + 3003a50: 40f757b3 sra a5,a4,a5 + 3003a54: 8b85 andi a5,a5,1 + 3003a56: 00f037b3 snez a5,a5 + 3003a5a: 9f81 uxtb a5 +} + 3003a5c: 853e mv a0,a5 + 3003a5e: 50b2 lw ra,44(sp) + 3003a60: 5422 lw s0,40(sp) + 3003a62: 6145 addi sp,sp,48 + 3003a64: 8082 ret + +03003a66 : + 3003a66: c48fe06f j 3001eae + +03003a6a : + * @param matchInfo IP without Clock select match info + * @param reset BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelResetSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int reset) +{ + 3003a6a: 7179 addi sp,sp,-48 + 3003a6c: d606 sw ra,44(sp) + 3003a6e: d422 sw s0,40(sp) + 3003a70: 1800 addi s0,sp,48 + 3003a72: fca42e23 sw a0,-36(s0) + 3003a76: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003a7a: fdc42783 lw a5,-36(s0) + 3003a7e: eb89 bnez a5,3003a90 + 3003a80: 37900593 li a1,889 + 3003a84: 030067b7 lui a5,0x3006 + 3003a88: 4f478513 addi a0,a5,1268 # 30064f4 + 3003a8c: 3fe9 jal ra,3003a66 + 3003a8e: a001 j 3003a8e + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003a90: 040007b7 lui a5,0x4000 + 3003a94: 4947a783 lw a5,1172(a5) # 4000494 + 3003a98: eb89 bnez a5,3003aaa + 3003a9a: 37a00593 li a1,890 + 3003a9e: 030067b7 lui a5,0x3006 + 3003aa2: 4f478513 addi a0,a5,1268 # 30064f4 + 3003aa6: 37c1 jal ra,3003a66 + 3003aa8: a001 j 3003aa8 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003aaa: 040007b7 lui a5,0x4000 + 3003aae: 4947a783 lw a5,1172(a5) # 4000494 + 3003ab2: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003ab6: fdc42783 lw a5,-36(s0) + 3003aba: 279e lhu a5,8(a5) + 3003abc: 873e mv a4,a5 + 3003abe: fec42783 lw a5,-20(s0) + 3003ac2: 97ba add a5,a5,a4 + 3003ac4: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003ac8: fe842783 lw a5,-24(s0) + 3003acc: 439c lw a5,0(a5) + 3003ace: fef42223 sw a5,-28(s0) + if (reset & BASE_CFG_SET) { + 3003ad2: fd842783 lw a5,-40(s0) + 3003ad6: 8b85 andi a5,a5,1 + 3003ad8: c3a9 beqz a5,3003b1a + cfg.BIT.softResetReq |= 1 << matchInfo->bitOffset; /* reset of target ip. */ + 3003ada: fe442783 lw a5,-28(s0) + 3003ade: 83c1 srli a5,a5,0x10 + 3003ae0: 9fa1 uxth a5 + 3003ae2: 01079713 slli a4,a5,0x10 + 3003ae6: 8741 srai a4,a4,0x10 + 3003ae8: fdc42783 lw a5,-36(s0) + 3003aec: 27bc lbu a5,10(a5) + 3003aee: 86be mv a3,a5 + 3003af0: 4785 li a5,1 + 3003af2: 00d797b3 sll a5,a5,a3 + 3003af6: 07c2 slli a5,a5,0x10 + 3003af8: 87c1 srai a5,a5,0x10 + 3003afa: 8fd9 or a5,a5,a4 + 3003afc: 07c2 slli a5,a5,0x10 + 3003afe: 87c1 srai a5,a5,0x10 + 3003b00: 01079713 slli a4,a5,0x10 + 3003b04: 8341 srli a4,a4,0x10 + 3003b06: fe442783 lw a5,-28(s0) + 3003b0a: 0742 slli a4,a4,0x10 + 3003b0c: 66c1 lui a3,0x10 + 3003b0e: 16fd addi a3,a3,-1 # ffff + 3003b10: 8ff5 and a5,a5,a3 + 3003b12: 8fd9 or a5,a5,a4 + 3003b14: fef42223 sw a5,-28(s0) + 3003b18: a0a1 j 3003b60 + } else { + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); /* Undo reset of target ip. */ + 3003b1a: fe442783 lw a5,-28(s0) + 3003b1e: 83c1 srli a5,a5,0x10 + 3003b20: 9fa1 uxth a5 + 3003b22: 01079713 slli a4,a5,0x10 + 3003b26: 8741 srai a4,a4,0x10 + 3003b28: fdc42783 lw a5,-36(s0) + 3003b2c: 27bc lbu a5,10(a5) + 3003b2e: 86be mv a3,a5 + 3003b30: 4785 li a5,1 + 3003b32: 00d797b3 sll a5,a5,a3 + 3003b36: 07c2 slli a5,a5,0x10 + 3003b38: 87c1 srai a5,a5,0x10 + 3003b3a: fff7c793 not a5,a5 + 3003b3e: 07c2 slli a5,a5,0x10 + 3003b40: 87c1 srai a5,a5,0x10 + 3003b42: 8ff9 and a5,a5,a4 + 3003b44: 07c2 slli a5,a5,0x10 + 3003b46: 87c1 srai a5,a5,0x10 + 3003b48: 01079713 slli a4,a5,0x10 + 3003b4c: 8341 srli a4,a4,0x10 + 3003b4e: fe442783 lw a5,-28(s0) + 3003b52: 0742 slli a4,a4,0x10 + 3003b54: 66c1 lui a3,0x10 + 3003b56: 16fd addi a3,a3,-1 # ffff + 3003b58: 8ff5 and a5,a5,a3 + 3003b5a: 8fd9 or a5,a5,a4 + 3003b5c: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3003b60: fe442703 lw a4,-28(s0) + 3003b64: fe842783 lw a5,-24(s0) + 3003b68: c398 sw a4,0(a5) +} + 3003b6a: 0001 nop + 3003b6c: 50b2 lw ra,44(sp) + 3003b6e: 5422 lw s0,40(sp) + 3003b70: 6145 addi sp,sp,48 + 3003b72: 8082 ret + +03003b74 : + * @brief Get Reset status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock select reset status + */ +static unsigned int CRG_IpWoClkSelResetGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003b74: 7179 addi sp,sp,-48 + 3003b76: d606 sw ra,44(sp) + 3003b78: d422 sw s0,40(sp) + 3003b7a: 1800 addi s0,sp,48 + 3003b7c: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003b80: fdc42783 lw a5,-36(s0) + 3003b84: eb89 bnez a5,3003b96 + 3003b86: 38f00593 li a1,911 + 3003b8a: 030067b7 lui a5,0x3006 + 3003b8e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003b92: 3dd1 jal ra,3003a66 + 3003b94: a001 j 3003b94 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003b96: 040007b7 lui a5,0x4000 + 3003b9a: 4947a783 lw a5,1172(a5) # 4000494 + 3003b9e: eb89 bnez a5,3003bb0 + 3003ba0: 39000593 li a1,912 + 3003ba4: 030067b7 lui a5,0x3006 + 3003ba8: 4f478513 addi a0,a5,1268 # 30064f4 + 3003bac: 3d6d jal ra,3003a66 + 3003bae: a001 j 3003bae + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003bb0: 040007b7 lui a5,0x4000 + 3003bb4: 4947a783 lw a5,1172(a5) # 4000494 + 3003bb8: fef42623 sw a5,-20(s0) + /* Get the reset status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003bbc: fdc42783 lw a5,-36(s0) + 3003bc0: 279e lhu a5,8(a5) + 3003bc2: 873e mv a4,a5 + 3003bc4: fec42783 lw a5,-20(s0) + 3003bc8: 97ba add a5,a5,a4 + 3003bca: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003bce: fe842783 lw a5,-24(s0) + 3003bd2: 439c lw a5,0(a5) + 3003bd4: fef42223 sw a5,-28(s0) + return (cfg.BIT.softResetReq & (1 << matchInfo->bitOffset)) ? BASE_CFG_SET : BASE_CFG_UNSET; + 3003bd8: fe442783 lw a5,-28(s0) + 3003bdc: 83c1 srli a5,a5,0x10 + 3003bde: 9fa1 uxth a5 + 3003be0: 873e mv a4,a5 + 3003be2: fdc42783 lw a5,-36(s0) + 3003be6: 27bc lbu a5,10(a5) + 3003be8: 40f757b3 sra a5,a4,a5 + 3003bec: 8b85 andi a5,a5,1 + 3003bee: 00f037b3 snez a5,a5 + 3003bf2: 9f81 uxtb a5 +} + 3003bf4: 853e mv a0,a5 + 3003bf6: 50b2 lw ra,44(sp) + 3003bf8: 5422 lw s0,40(sp) + 3003bfa: 6145 addi sp,sp,48 + 3003bfc: 8082 ret + +03003bfe : + * @param matchInfo ADC match info + * @param enable IP_CLK_ENABLE + * @retval None + */ +static void CRG_AdcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003bfe: 7179 addi sp,sp,-48 + 3003c00: d606 sw ra,44(sp) + 3003c02: d422 sw s0,40(sp) + 3003c04: 1800 addi s0,sp,48 + 3003c06: fca42e23 sw a0,-36(s0) + 3003c0a: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003c0e: fdc42783 lw a5,-36(s0) + 3003c12: eb89 bnez a5,3003c24 + 3003c14: 3a200593 li a1,930 + 3003c18: 030067b7 lui a5,0x3006 + 3003c1c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003c20: 3599 jal ra,3003a66 + 3003c22: a001 j 3003c22 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003c24: 040007b7 lui a5,0x4000 + 3003c28: 4947a783 lw a5,1172(a5) # 4000494 + 3003c2c: eb89 bnez a5,3003c3e + 3003c2e: 3a300593 li a1,931 + 3003c32: 030067b7 lui a5,0x3006 + 3003c36: 4f478513 addi a0,a5,1268 # 30064f4 + 3003c3a: 3535 jal ra,3003a66 + 3003c3c: a001 j 3003c3c + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003c3e: 040007b7 lui a5,0x4000 + 3003c42: 4947a783 lw a5,1172(a5) # 4000494 + 3003c46: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003c4a: fdc42783 lw a5,-36(s0) + 3003c4e: 279e lhu a5,8(a5) + 3003c50: 873e mv a4,a5 + 3003c52: fec42783 lw a5,-20(s0) + 3003c56: 97ba add a5,a5,a4 + 3003c58: fef42423 sw a5,-24(s0) + CRG_AdcIpCfg cfg; + cfg.value[1] = p->value[1]; + 3003c5c: fe842783 lw a5,-24(s0) + 3003c60: 43dc lw a5,4(a5) + 3003c62: fef42223 sw a5,-28(s0) + if (enable) { /* Enables and Deassert reset the ADC clock. */ + 3003c66: fd842783 lw a5,-40(s0) + 3003c6a: cf99 beqz a5,3003c88 + cfg.BIT.clk_adc_cken = BASE_CFG_SET; + 3003c6c: fe442783 lw a5,-28(s0) + 3003c70: 0017e793 ori a5,a5,1 + 3003c74: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003c78: fe442783 lw a5,-28(s0) + 3003c7c: 7741 lui a4,0xffff0 + 3003c7e: 177d addi a4,a4,-1 # fffeffff + 3003c80: 8ff9 and a5,a5,a4 + 3003c82: fef42223 sw a5,-28(s0) + 3003c86: a829 j 3003ca0 + } else { /* Disable and reset the ADC clock. */ + cfg.BIT.clk_adc_cken = BASE_CFG_UNSET; + 3003c88: fe442783 lw a5,-28(s0) + 3003c8c: 9bf9 andi a5,a5,-2 + 3003c8e: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003c92: fe442783 lw a5,-28(s0) + 3003c96: 7741 lui a4,0xffff0 + 3003c98: 177d addi a4,a4,-1 # fffeffff + 3003c9a: 8ff9 and a5,a5,a4 + 3003c9c: fef42223 sw a5,-28(s0) + } + p->value[1] = cfg.value[1]; + 3003ca0: fe442703 lw a4,-28(s0) + 3003ca4: fe842783 lw a5,-24(s0) + 3003ca8: c3d8 sw a4,4(a5) +} + 3003caa: 0001 nop + 3003cac: 50b2 lw ra,44(sp) + 3003cae: 5422 lw s0,40(sp) + 3003cb0: 6145 addi sp,sp,48 + 3003cb2: 8082 ret + +03003cb4 : + * @brief Get Enable status of ADC + * @param matchInfo ADC match info + * @retval Cken of ADC + */ +static unsigned int CRG_AdcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003cb4: 7179 addi sp,sp,-48 + 3003cb6: d606 sw ra,44(sp) + 3003cb8: d422 sw s0,40(sp) + 3003cba: 1800 addi s0,sp,48 + 3003cbc: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003cc0: fdc42783 lw a5,-36(s0) + 3003cc4: eb89 bnez a5,3003cd6 + 3003cc6: 3ba00593 li a1,954 + 3003cca: 030067b7 lui a5,0x3006 + 3003cce: 4f478513 addi a0,a5,1268 # 30064f4 + 3003cd2: 3b51 jal ra,3003a66 + 3003cd4: a001 j 3003cd4 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003cd6: 040007b7 lui a5,0x4000 + 3003cda: 4947a783 lw a5,1172(a5) # 4000494 + 3003cde: eb89 bnez a5,3003cf0 + 3003ce0: 3bb00593 li a1,955 + 3003ce4: 030067b7 lui a5,0x3006 + 3003ce8: 4f478513 addi a0,a5,1268 # 30064f4 + 3003cec: 3bad jal ra,3003a66 + 3003cee: a001 j 3003cee + unsigned int enable; + /* Get the enable status of the ADC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003cf0: 040007b7 lui a5,0x4000 + 3003cf4: 4947a783 lw a5,1172(a5) # 4000494 + 3003cf8: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003cfc: fdc42783 lw a5,-36(s0) + 3003d00: 279e lhu a5,8(a5) + 3003d02: 873e mv a4,a5 + 3003d04: fec42783 lw a5,-20(s0) + 3003d08: 97ba add a5,a5,a4 + 3003d0a: fef42423 sw a5,-24(s0) + enable = ((p->BIT.clk_adc_cken != 0)) ? IP_CLK_ENABLE : IP_CLK_DISABLE; + 3003d0e: fe842783 lw a5,-24(s0) + 3003d12: 43dc lw a5,4(a5) + 3003d14: 8b85 andi a5,a5,1 + 3003d16: 9f81 uxtb a5 + 3003d18: c399 beqz a5,3003d1e + 3003d1a: 4785 li a5,1 + 3003d1c: a011 j 3003d20 + 3003d1e: 4781 li a5,0 + 3003d20: fef42223 sw a5,-28(s0) + return enable; + 3003d24: fe442783 lw a5,-28(s0) +} + 3003d28: 853e mv a0,a5 + 3003d2a: 50b2 lw ra,44(sp) + 3003d2c: 5422 lw s0,40(sp) + 3003d2e: 6145 addi sp,sp,48 + 3003d30: 8082 ret + +03003d32 : + * @param matchInfo ADC match info + * @param clkSelect @see CRG_AdcClkSelect + * @retval None + */ +static void CRG_AdcClkSelectSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int clkSelect) +{ + 3003d32: 7179 addi sp,sp,-48 + 3003d34: d606 sw ra,44(sp) + 3003d36: d422 sw s0,40(sp) + 3003d38: 1800 addi s0,sp,48 + 3003d3a: fca42e23 sw a0,-36(s0) + 3003d3e: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003d42: fdc42783 lw a5,-36(s0) + 3003d46: eb89 bnez a5,3003d58 + 3003d48: 3cc00593 li a1,972 + 3003d4c: 030067b7 lui a5,0x3006 + 3003d50: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d54: 3b09 jal ra,3003a66 + 3003d56: a001 j 3003d56 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003d58: 040007b7 lui a5,0x4000 + 3003d5c: 4947a783 lw a5,1172(a5) # 4000494 + 3003d60: eb89 bnez a5,3003d72 + 3003d62: 3cd00593 li a1,973 + 3003d66: 030067b7 lui a5,0x3006 + 3003d6a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d6e: 39e5 jal ra,3003a66 + 3003d70: a001 j 3003d70 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003d72: 040007b7 lui a5,0x4000 + 3003d76: 4947a703 lw a4,1172(a5) # 4000494 + 3003d7a: 100007b7 lui a5,0x10000 + 3003d7e: 00f70a63 beq a4,a5,3003d92 + 3003d82: 3ce00593 li a1,974 + 3003d86: 030067b7 lui a5,0x3006 + 3003d8a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d8e: 39e1 jal ra,3003a66 + 3003d90: a001 j 3003d90 + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkModeSelect(clkSelect)); + 3003d92: fd842503 lw a0,-40(s0) + 3003d96: ea1fe0ef jal ra,3002c36 + 3003d9a: 87aa mv a5,a0 + 3003d9c: 0017c793 xori a5,a5,1 + 3003da0: 9f81 uxtb a5 + 3003da2: cb89 beqz a5,3003db4 + 3003da4: 3cf00593 li a1,975 + 3003da8: 030067b7 lui a5,0x3006 + 3003dac: 4f478513 addi a0,a5,1268 # 30064f4 + 3003db0: 395d jal ra,3003a66 + 3003db2: a89d j 3003e28 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003db4: 040007b7 lui a5,0x4000 + 3003db8: 4947a783 lw a5,1172(a5) # 4000494 + 3003dbc: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003dc0: fdc42783 lw a5,-36(s0) + 3003dc4: 279e lhu a5,8(a5) + 3003dc6: 873e mv a4,a5 + 3003dc8: fec42783 lw a5,-20(s0) + 3003dcc: 97ba add a5,a5,a4 + 3003dce: fef42423 sw a5,-24(s0) + if (clkSelect == CRG_ADC_CLK_SYN_CORE) { + 3003dd2: fd842703 lw a4,-40(s0) + 3003dd6: 478d li a5,3 + 3003dd8: 00f71a63 bne a4,a5,3003dec + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_SET; /* use sync clock */ + 3003ddc: fe842703 lw a4,-24(s0) + 3003de0: 435c lw a5,4(a4) + 3003de2: 010006b7 lui a3,0x1000 + 3003de6: 8fd5 or a5,a5,a3 + 3003de8: c35c sw a5,4(a4) + 3003dea: a83d j 3003e28 + } else { + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3003dec: b67fe0ef jal ra,3002952 + g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel = clkSelect; /* write clock selection */ + 3003df0: 040007b7 lui a5,0x4000 + 3003df4: 4947a703 lw a4,1172(a5) # 4000494 + 3003df8: fd842783 lw a5,-40(s0) + 3003dfc: 8b8d andi a5,a5,3 + 3003dfe: 0ff7f693 andi a3,a5,255 + 3003e02: 10072783 lw a5,256(a4) + 3003e06: 8a8d andi a3,a3,3 + 3003e08: 0692 slli a3,a3,0x4 + 3003e0a: fcf7f793 andi a5,a5,-49 + 3003e0e: 8fd5 or a5,a5,a3 + 3003e10: 10f72023 sw a5,256(a4) + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3003e14: b67fe0ef jal ra,300297a + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_UNSET; + 3003e18: fe842703 lw a4,-24(s0) + 3003e1c: 435c lw a5,4(a4) + 3003e1e: ff0006b7 lui a3,0xff000 + 3003e22: 16fd addi a3,a3,-1 # feffffff + 3003e24: 8ff5 and a5,a5,a3 + 3003e26: c35c sw a5,4(a4) + } +} + 3003e28: 50b2 lw ra,44(sp) + 3003e2a: 5422 lw s0,40(sp) + 3003e2c: 6145 addi sp,sp,48 + 3003e2e: 8082 ret + +03003e30 : + * @brief Get ADC Clock Select + * @param matchInfo ADC match info + * @retval Adc Clock select @see CRG_AdcClkSelect + */ +static unsigned int CRG_AdcClkSelectGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003e30: 7179 addi sp,sp,-48 + 3003e32: d606 sw ra,44(sp) + 3003e34: d422 sw s0,40(sp) + 3003e36: 1800 addi s0,sp,48 + 3003e38: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003e3c: fdc42783 lw a5,-36(s0) + 3003e40: eb89 bnez a5,3003e52 + 3003e42: 3e400593 li a1,996 + 3003e46: 030067b7 lui a5,0x3006 + 3003e4a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003e4e: 3921 jal ra,3003a66 + 3003e50: a001 j 3003e50 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003e52: 040007b7 lui a5,0x4000 + 3003e56: 4947a783 lw a5,1172(a5) # 4000494 + 3003e5a: eb89 bnez a5,3003e6c + 3003e5c: 3e500593 li a1,997 + 3003e60: 030067b7 lui a5,0x3006 + 3003e64: 4f478513 addi a0,a5,1268 # 30064f4 + 3003e68: 3efd jal ra,3003a66 + 3003e6a: a001 j 3003e6a + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003e6c: 040007b7 lui a5,0x4000 + 3003e70: 4947a783 lw a5,1172(a5) # 4000494 + 3003e74: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003e78: fdc42783 lw a5,-36(s0) + 3003e7c: 279e lhu a5,8(a5) + 3003e7e: 873e mv a4,a5 + 3003e80: fec42783 lw a5,-20(s0) + 3003e84: 97ba add a5,a5,a4 + 3003e86: fef42423 sw a5,-24(s0) + if (p->BIT.cfg_adc_ckmode_sel == BASE_CFG_SET) { + 3003e8a: fe842783 lw a5,-24(s0) + 3003e8e: 43dc lw a5,4(a5) + 3003e90: 83e1 srli a5,a5,0x18 + 3003e92: 8b85 andi a5,a5,1 + 3003e94: 0ff7f713 andi a4,a5,255 + 3003e98: 4785 li a5,1 + 3003e9a: 00f71463 bne a4,a5,3003ea2 + return CRG_ADC_CLK_SYN_CORE; /* Synchronous clock signal */ + 3003e9e: 478d li a5,3 + 3003ea0: a811 j 3003eb4 + } + return g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel; /* asynchronous clock signal */ + 3003ea2: 040007b7 lui a5,0x4000 + 3003ea6: 4947a783 lw a5,1172(a5) # 4000494 + 3003eaa: 1007a783 lw a5,256(a5) + 3003eae: 8391 srli a5,a5,0x4 + 3003eb0: 8b8d andi a5,a5,3 + 3003eb2: 9f81 uxtb a5 +} + 3003eb4: 853e mv a0,a5 + 3003eb6: 50b2 lw ra,44(sp) + 3003eb8: 5422 lw s0,40(sp) + 3003eba: 6145 addi sp,sp,48 + 3003ebc: 8082 ret + +03003ebe : + * @param matchInfo ADC match info + * @param div Adc clock division + * @retval None + */ +static void CRG_AdcDivSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int div) +{ + 3003ebe: 7179 addi sp,sp,-48 + 3003ec0: d606 sw ra,44(sp) + 3003ec2: d422 sw s0,40(sp) + 3003ec4: 1800 addi s0,sp,48 + 3003ec6: fca42e23 sw a0,-36(s0) + 3003eca: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003ece: fdc42783 lw a5,-36(s0) + 3003ed2: eb89 bnez a5,3003ee4 + 3003ed4: 3f700593 li a1,1015 + 3003ed8: 030067b7 lui a5,0x3006 + 3003edc: 4f478513 addi a0,a5,1268 # 30064f4 + 3003ee0: 3659 jal ra,3003a66 + 3003ee2: a001 j 3003ee2 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003ee4: 040007b7 lui a5,0x4000 + 3003ee8: 4947a783 lw a5,1172(a5) # 4000494 + 3003eec: eb89 bnez a5,3003efe + 3003eee: 3f800593 li a1,1016 + 3003ef2: 030067b7 lui a5,0x3006 + 3003ef6: 4f478513 addi a0,a5,1268 # 30064f4 + 3003efa: 36b5 jal ra,3003a66 + 3003efc: a001 j 3003efc + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkDiv(div)); + 3003efe: fd842503 lw a0,-40(s0) + 3003f02: d75fe0ef jal ra,3002c76 + 3003f06: 87aa mv a5,a0 + 3003f08: 0017c793 xori a5,a5,1 + 3003f0c: 9f81 uxtb a5 + 3003f0e: cb89 beqz a5,3003f20 + 3003f10: 3f900593 li a1,1017 + 3003f14: 030067b7 lui a5,0x3006 + 3003f18: 4f478513 addi a0,a5,1268 # 30064f4 + 3003f1c: 36a9 jal ra,3003a66 + 3003f1e: a885 j 3003f8e + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003f20: 040007b7 lui a5,0x4000 + 3003f24: 4947a783 lw a5,1172(a5) # 4000494 + 3003f28: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003f2c: fdc42783 lw a5,-36(s0) + 3003f30: 279e lhu a5,8(a5) + 3003f32: 873e mv a4,a5 + 3003f34: fec42783 lw a5,-20(s0) + 3003f38: 97ba add a5,a5,a4 + 3003f3a: fef42423 sw a5,-24(s0) + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3003f3e: fe842783 lw a5,-24(s0) + 3003f42: 43dc lw a5,4(a5) + 3003f44: 83e1 srli a5,a5,0x18 + 3003f46: 8b85 andi a5,a5,1 + 3003f48: 9f81 uxtb a5 + 3003f4a: fef42223 sw a5,-28(s0) + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3003f4e: fe442703 lw a4,-28(s0) + 3003f52: 4785 li a5,1 + 3003f54: 02f71163 bne a4,a5,3003f76 + p->BIT.clk_adc_div1 = div; /* write div to I1 */ + 3003f58: fd842783 lw a5,-40(s0) + 3003f5c: 8b8d andi a5,a5,3 + 3003f5e: 0ff7f693 andi a3,a5,255 + 3003f62: fe842703 lw a4,-24(s0) + 3003f66: 431c lw a5,0(a4) + 3003f68: 8a8d andi a3,a3,3 + 3003f6a: 06a2 slli a3,a3,0x8 + 3003f6c: cff7f793 andi a5,a5,-769 + 3003f70: 8fd5 or a5,a5,a3 + 3003f72: c31c sw a5,0(a4) + 3003f74: a829 j 3003f8e + } else { + p->BIT.clk_adc_div0 = div; /* write div to I0 */ + 3003f76: fd842783 lw a5,-40(s0) + 3003f7a: 8b8d andi a5,a5,3 + 3003f7c: 0ff7f693 andi a3,a5,255 + 3003f80: fe842703 lw a4,-24(s0) + 3003f84: 431c lw a5,0(a4) + 3003f86: 8a8d andi a3,a3,3 + 3003f88: 9bf1 andi a5,a5,-4 + 3003f8a: 8fd5 or a5,a5,a3 + 3003f8c: c31c sw a5,0(a4) + } +} + 3003f8e: 50b2 lw ra,44(sp) + 3003f90: 5422 lw s0,40(sp) + 3003f92: 6145 addi sp,sp,48 + 3003f94: 8082 ret + +03003f96 : + * @brief Get ADC clock division + * @param matchInfo ADC match info + * @retval Adc clock division + */ +static unsigned int CRG_AdcDivGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003f96: 7179 addi sp,sp,-48 + 3003f98: d606 sw ra,44(sp) + 3003f9a: d422 sw s0,40(sp) + 3003f9c: 1800 addi s0,sp,48 + 3003f9e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003fa2: fdc42783 lw a5,-36(s0) + 3003fa6: eb89 bnez a5,3003fb8 + 3003fa8: 40c00593 li a1,1036 + 3003fac: 030067b7 lui a5,0x3006 + 3003fb0: 4f478513 addi a0,a5,1268 # 30064f4 + 3003fb4: 3c4d jal ra,3003a66 + 3003fb6: a001 j 3003fb6 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003fb8: 040007b7 lui a5,0x4000 + 3003fbc: 4947a783 lw a5,1172(a5) # 4000494 + 3003fc0: eb89 bnez a5,3003fd2 + 3003fc2: 40d00593 li a1,1037 + 3003fc6: 030067b7 lui a5,0x3006 + 3003fca: 4f478513 addi a0,a5,1268 # 30064f4 + 3003fce: 3c61 jal ra,3003a66 + 3003fd0: a001 j 3003fd0 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003fd2: 040007b7 lui a5,0x4000 + 3003fd6: 4947a783 lw a5,1172(a5) # 4000494 + 3003fda: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003fde: fdc42783 lw a5,-36(s0) + 3003fe2: 279e lhu a5,8(a5) + 3003fe4: 873e mv a4,a5 + 3003fe6: fec42783 lw a5,-20(s0) + 3003fea: 97ba add a5,a5,a4 + 3003fec: fef42423 sw a5,-24(s0) + + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3003ff0: fe842783 lw a5,-24(s0) + 3003ff4: 43dc lw a5,4(a5) + 3003ff6: 83e1 srli a5,a5,0x18 + 3003ff8: 8b85 andi a5,a5,1 + 3003ffa: 9f81 uxtb a5 + 3003ffc: fef42223 sw a5,-28(s0) + + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3004000: fe442703 lw a4,-28(s0) + 3004004: 4785 li a5,1 + 3004006: 00f71963 bne a4,a5,3004018 + return p->BIT.clk_adc_div1; /* return div value I1 */ + 300400a: fe842783 lw a5,-24(s0) + 300400e: 439c lw a5,0(a5) + 3004010: 83a1 srli a5,a5,0x8 + 3004012: 8b8d andi a5,a5,3 + 3004014: 9f81 uxtb a5 + 3004016: a031 j 3004022 + } + return p->BIT.clk_adc_div0; /* return div valye I0 */ + 3004018: fe842783 lw a5,-24(s0) + 300401c: 439c lw a5,0(a5) + 300401e: 8b8d andi a5,a5,3 + 3004020: 9f81 uxtb a5 +} + 3004022: 853e mv a0,a5 + 3004024: 50b2 lw ra,44(sp) + 3004026: 5422 lw s0,40(sp) + 3004028: 6145 addi sp,sp,48 + 300402a: 8082 ret + +0300402c : + * @brief Enable Clock of EFC + * @param matchInfo EFC match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_EfcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 300402c: 7179 addi sp,sp,-48 + 300402e: d606 sw ra,44(sp) + 3004030: d422 sw s0,40(sp) + 3004032: 1800 addi s0,sp,48 + 3004034: fca42e23 sw a0,-36(s0) + 3004038: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300403c: fdc42783 lw a5,-36(s0) + 3004040: eb89 bnez a5,3004052 + 3004042: 42100593 li a1,1057 + 3004046: 030067b7 lui a5,0x3006 + 300404a: 4f478513 addi a0,a5,1268 # 30064f4 + 300404e: 3c21 jal ra,3003a66 + 3004050: a001 j 3004050 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004052: 040007b7 lui a5,0x4000 + 3004056: 4947a783 lw a5,1172(a5) # 4000494 + 300405a: eb89 bnez a5,300406c + 300405c: 42200593 li a1,1058 + 3004060: 030067b7 lui a5,0x3006 + 3004064: 4f478513 addi a0,a5,1268 # 30064f4 + 3004068: 3afd jal ra,3003a66 + 300406a: a001 j 300406a + /* Enables or disables EFC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300406c: 040007b7 lui a5,0x4000 + 3004070: 4947a783 lw a5,1172(a5) # 4000494 + 3004074: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004078: fdc42783 lw a5,-36(s0) + 300407c: 279e lhu a5,8(a5) + 300407e: 873e mv a4,a5 + 3004080: fec42783 lw a5,-20(s0) + 3004084: 97ba add a5,a5,a4 + 3004086: fef42423 sw a5,-24(s0) + p->BIT.eflash_cken = (enable & IP_CLK_ENABLE) ? BASE_CFG_SET : BASE_CFG_UNSET; + 300408a: fd842783 lw a5,-40(s0) + 300408e: 8b85 andi a5,a5,1 + 3004090: 0ff7f693 andi a3,a5,255 + 3004094: fe842703 lw a4,-24(s0) + 3004098: 431c lw a5,0(a4) + 300409a: 8a85 andi a3,a3,1 + 300409c: 9bf9 andi a5,a5,-2 + 300409e: 8fd5 or a5,a5,a3 + 30040a0: c31c sw a5,0(a4) +} + 30040a2: 0001 nop + 30040a4: 50b2 lw ra,44(sp) + 30040a6: 5422 lw s0,40(sp) + 30040a8: 6145 addi sp,sp,48 + 30040aa: 8082 ret + +030040ac : + * @brief Disable Clock of EFC + * @param matchInfo EFC match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_EfcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30040ac: 7179 addi sp,sp,-48 + 30040ae: d606 sw ra,44(sp) + 30040b0: d422 sw s0,40(sp) + 30040b2: 1800 addi s0,sp,48 + 30040b4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30040b8: fdc42783 lw a5,-36(s0) + 30040bc: eb89 bnez a5,30040ce + 30040be: 43000593 li a1,1072 + 30040c2: 030067b7 lui a5,0x3006 + 30040c6: 4f478513 addi a0,a5,1268 # 30064f4 + 30040ca: 3a71 jal ra,3003a66 + 30040cc: a001 j 30040cc + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30040ce: 040007b7 lui a5,0x4000 + 30040d2: 4947a783 lw a5,1172(a5) # 4000494 + 30040d6: eb89 bnez a5,30040e8 + 30040d8: 43100593 li a1,1073 + 30040dc: 030067b7 lui a5,0x3006 + 30040e0: 4f478513 addi a0,a5,1268 # 30064f4 + 30040e4: 3249 jal ra,3003a66 + 30040e6: a001 j 30040e6 + /* Get the value of the EFC register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30040e8: 040007b7 lui a5,0x4000 + 30040ec: 4947a783 lw a5,1172(a5) # 4000494 + 30040f0: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 30040f4: fdc42783 lw a5,-36(s0) + 30040f8: 279e lhu a5,8(a5) + 30040fa: 873e mv a4,a5 + 30040fc: fec42783 lw a5,-20(s0) + 3004100: 97ba add a5,a5,a4 + 3004102: fef42423 sw a5,-24(s0) + return p->BIT.eflash_cken; + 3004106: fe842783 lw a5,-24(s0) + 300410a: 439c lw a5,0(a5) + 300410c: 8b85 andi a5,a5,1 + 300410e: 9f81 uxtb a5 +} + 3004110: 853e mv a0,a5 + 3004112: 50b2 lw ra,44(sp) + 3004114: 5422 lw s0,40(sp) + 3004116: 6145 addi sp,sp,48 + 3004118: 8082 ret + +0300411a : + * @brief Enable Clock of ANA + * @param matchInfo ANA match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_AnaEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 300411a: 7179 addi sp,sp,-48 + 300411c: d606 sw ra,44(sp) + 300411e: d422 sw s0,40(sp) + 3004120: 1800 addi s0,sp,48 + 3004122: fca42e23 sw a0,-36(s0) + 3004126: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300412a: fdc42783 lw a5,-36(s0) + 300412e: eb89 bnez a5,3004140 + 3004130: 44000593 li a1,1088 + 3004134: 030067b7 lui a5,0x3006 + 3004138: 4f478513 addi a0,a5,1268 # 30064f4 + 300413c: 322d jal ra,3003a66 + 300413e: a001 j 300413e + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004140: 040007b7 lui a5,0x4000 + 3004144: 4947a783 lw a5,1172(a5) # 4000494 + 3004148: eb89 bnez a5,300415a + 300414a: 44100593 li a1,1089 + 300414e: 030067b7 lui a5,0x3006 + 3004152: 4f478513 addi a0,a5,1268 # 30064f4 + 3004156: 3a01 jal ra,3003a66 + 3004158: a001 j 3004158 + CRG_PARAM_CHECK_NO_RET(enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE); + 300415a: fd842703 lw a4,-40(s0) + 300415e: 4785 li a5,1 + 3004160: 00f70d63 beq a4,a5,300417a + 3004164: fd842783 lw a5,-40(s0) + 3004168: cb89 beqz a5,300417a + 300416a: 44200593 li a1,1090 + 300416e: 030067b7 lui a5,0x3006 + 3004172: 4f478513 addi a0,a5,1268 # 30064f4 + 3004176: 38c5 jal ra,3003a66 + 3004178: a20d j 300429a + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300417a: 040007b7 lui a5,0x4000 + 300417e: 4947a783 lw a5,1172(a5) # 4000494 + 3004182: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 3004186: fdc42783 lw a5,-36(s0) + 300418a: 279e lhu a5,8(a5) + 300418c: 873e mv a4,a5 + 300418e: fec42783 lw a5,-20(s0) + 3004192: 97ba add a5,a5,a4 + 3004194: fdc42703 lw a4,-36(s0) + 3004198: 2738 lbu a4,10(a4) + 300419a: 97ba add a5,a5,a4 + 300419c: fef42423 sw a5,-24(s0) + + if ((enable == IP_CLK_ENABLE) && (p->BIT.ip_srst_req == BASE_CFG_SET)) { + 30041a0: fd842703 lw a4,-40(s0) + 30041a4: 4785 li a5,1 + 30041a6: 02f71f63 bne a4,a5,30041e4 + 30041aa: fe842783 lw a5,-24(s0) + 30041ae: 439c lw a5,0(a5) + 30041b0: 83c1 srli a5,a5,0x10 + 30041b2: 8b85 andi a5,a5,1 + 30041b4: 0ff7f713 andi a4,a5,255 + 30041b8: 4785 li a5,1 + 30041ba: 02f71563 bne a4,a5,30041e4 + p->BIT.ip_srst_req = BASE_CFG_UNSET; + 30041be: fe842703 lw a4,-24(s0) + 30041c2: 431c lw a5,0(a4) + 30041c4: 76c1 lui a3,0xffff0 + 30041c6: 16fd addi a3,a3,-1 # fffeffff + 30041c8: 8ff5 and a5,a5,a3 + 30041ca: c31c sw a5,0(a4) + g_anaEnableFlag++; /* count enable analog IP number */ + 30041cc: 040007b7 lui a5,0x4000 + 30041d0: 4987c783 lbu a5,1176(a5) # 4000498 + 30041d4: 0785 addi a5,a5,1 + 30041d6: 0ff7f713 andi a4,a5,255 + 30041da: 040007b7 lui a5,0x4000 + 30041de: 48e78c23 sb a4,1176(a5) # 4000498 + 30041e2: a089 j 3004224 + } else if ((enable == IP_CLK_DISABLE) && (p->BIT.ip_srst_req == BASE_CFG_UNSET)) { + 30041e4: fd842783 lw a5,-40(s0) + 30041e8: ef95 bnez a5,3004224 + 30041ea: fe842783 lw a5,-24(s0) + 30041ee: 439c lw a5,0(a5) + 30041f0: 83c1 srli a5,a5,0x10 + 30041f2: 8b85 andi a5,a5,1 + 30041f4: 9f81 uxtb a5 + 30041f6: e79d bnez a5,3004224 + p->BIT.ip_srst_req = BASE_CFG_SET; + 30041f8: fe842703 lw a4,-24(s0) + 30041fc: 431c lw a5,0(a4) + 30041fe: 66c1 lui a3,0x10 + 3004200: 8fd5 or a5,a5,a3 + 3004202: c31c sw a5,0(a4) + if (g_anaEnableFlag > 0) { + 3004204: 040007b7 lui a5,0x4000 + 3004208: 4987c783 lbu a5,1176(a5) # 4000498 + 300420c: cf81 beqz a5,3004224 + g_anaEnableFlag--; /* Decreasing the count to enable the analog IP number. */ + 300420e: 040007b7 lui a5,0x4000 + 3004212: 4987c783 lbu a5,1176(a5) # 4000498 + 3004216: 17fd addi a5,a5,-1 + 3004218: 0ff7f713 andi a4,a5,255 + 300421c: 040007b7 lui a5,0x4000 + 3004220: 48e78c23 sb a4,1176(a5) # 4000498 + } + } + + if ((g_anaEnableFlag == 0) && (enable == IP_CLK_DISABLE)) { /* all analog clock disable */ + 3004224: 040007b7 lui a5,0x4000 + 3004228: 4987c783 lbu a5,1176(a5) # 4000498 + 300422c: eb85 bnez a5,300425c + 300422e: fd842783 lw a5,-40(s0) + 3004232: e78d bnez a5,300425c + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_UNSET; + 3004234: 10000737 lui a4,0x10000 + 3004238: 6785 lui a5,0x1 + 300423a: 973e add a4,a4,a5 + 300423c: a5072783 lw a5,-1456(a4) # ffffa50 + 3004240: 9bf9 andi a5,a5,-2 + 3004242: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_SET; + 3004246: 10000737 lui a4,0x10000 + 300424a: 6785 lui a5,0x1 + 300424c: 973e add a4,a4,a5 + 300424e: a5072783 lw a5,-1456(a4) # ffffa50 + 3004252: 66c1 lui a3,0x10 + 3004254: 8fd5 or a5,a5,a3 + 3004256: a4f72823 sw a5,-1456(a4) + 300425a: a081 j 300429a + } else if ((g_anaEnableFlag > 0) && (enable == IP_CLK_ENABLE)) { /* all analog clock enable */ + 300425c: 040007b7 lui a5,0x4000 + 3004260: 4987c783 lbu a5,1176(a5) # 4000498 + 3004264: cb9d beqz a5,300429a + 3004266: fd842703 lw a4,-40(s0) + 300426a: 4785 li a5,1 + 300426c: 02f71763 bne a4,a5,300429a + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_UNSET; + 3004270: 10000737 lui a4,0x10000 + 3004274: 6785 lui a5,0x1 + 3004276: 973e add a4,a4,a5 + 3004278: a5072783 lw a5,-1456(a4) # ffffa50 + 300427c: 76c1 lui a3,0xffff0 + 300427e: 16fd addi a3,a3,-1 # fffeffff + 3004280: 8ff5 and a5,a5,a3 + 3004282: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_SET; + 3004286: 10000737 lui a4,0x10000 + 300428a: 6785 lui a5,0x1 + 300428c: 973e add a4,a4,a5 + 300428e: a5072783 lw a5,-1456(a4) # ffffa50 + 3004292: 0017e793 ori a5,a5,1 + 3004296: a4f72823 sw a5,-1456(a4) + } +} + 300429a: 50b2 lw ra,44(sp) + 300429c: 5422 lw s0,40(sp) + 300429e: 6145 addi sp,sp,48 + 30042a0: 8082 ret + +030042a2 : + * @brief Get Clock of ANA + * @param matchInfo ANA match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_AnaEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30042a2: 7179 addi sp,sp,-48 + 30042a4: d606 sw ra,44(sp) + 30042a6: d422 sw s0,40(sp) + 30042a8: 1800 addi s0,sp,48 + 30042aa: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30042ae: fdc42783 lw a5,-36(s0) + 30042b2: eb91 bnez a5,30042c6 + 30042b4: 46200593 li a1,1122 + 30042b8: 030067b7 lui a5,0x3006 + 30042bc: 4f478513 addi a0,a5,1268 # 30064f4 + 30042c0: beffd0ef jal ra,3001eae + 30042c4: a001 j 30042c4 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30042c6: 040007b7 lui a5,0x4000 + 30042ca: 4947a783 lw a5,1172(a5) # 4000494 + 30042ce: eb91 bnez a5,30042e2 + 30042d0: 46300593 li a1,1123 + 30042d4: 030067b7 lui a5,0x3006 + 30042d8: 4f478513 addi a0,a5,1268 # 30064f4 + 30042dc: bd3fd0ef jal ra,3001eae + 30042e0: a001 j 30042e0 + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30042e2: 040007b7 lui a5,0x4000 + 30042e6: 4947a783 lw a5,1172(a5) # 4000494 + 30042ea: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 30042ee: fdc42783 lw a5,-36(s0) + 30042f2: 279e lhu a5,8(a5) + 30042f4: 873e mv a4,a5 + 30042f6: fec42783 lw a5,-20(s0) + 30042fa: 97ba add a5,a5,a4 + 30042fc: fdc42703 lw a4,-36(s0) + 3004300: 2738 lbu a4,10(a4) + 3004302: 97ba add a5,a5,a4 + 3004304: fef42423 sw a5,-24(s0) + /* The clock is enabled based on the IP reset status. */ + return (p->BIT.ip_srst_req) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3004308: fe842783 lw a5,-24(s0) + 300430c: 439c lw a5,0(a5) + 300430e: 83c1 srli a5,a5,0x10 + 3004310: 8b85 andi a5,a5,1 + 3004312: 9f81 uxtb a5 + 3004314: 0017c793 xori a5,a5,1 + 3004318: 9f81 uxtb a5 +} + 300431a: 853e mv a0,a5 + 300431c: 50b2 lw ra,44(sp) + 300431e: 5422 lw s0,40(sp) + 3004320: 6145 addi sp,sp,48 + 3004322: 8082 ret + +03004324 : + * @brief Write a character to the UART port. + * @param ch The int promotion of the character to be written. + * @retval None. + */ +static void DBG_PrintCh(unsigned int ch) +{ + 3004324: 1101 addi sp,sp,-32 + 3004326: ce22 sw s0,28(sp) + 3004328: 1000 addi s0,sp,32 + 300432a: fea42623 sw a0,-20(s0) + while (DBG_PRINTF_UART_PORT->UART_FR.BIT.txff == 1) { + 300432e: 0001 nop + 3004330: 140007b7 lui a5,0x14000 + 3004334: 4f9c lw a5,24(a5) + 3004336: 8395 srli a5,a5,0x5 + 3004338: 8b85 andi a5,a5,1 + 300433a: 0ff7f713 andi a4,a5,255 + 300433e: 4785 li a5,1 + 3004340: fef708e3 beq a4,a5,3004330 + ; + } + DBG_PRINTF_UART_PORT->UART_DR.BIT.data = (unsigned char)ch; + 3004344: 14000737 lui a4,0x14000 + 3004348: fec42783 lw a5,-20(s0) + 300434c: 0ff7f693 andi a3,a5,255 + 3004350: 431c lw a5,0(a4) + 3004352: 0ff6f693 andi a3,a3,255 + 3004356: f007f793 andi a5,a5,-256 + 300435a: 8fd5 or a5,a5,a3 + 300435c: c31c sw a5,0(a4) +} + 300435e: 0001 nop + 3004360: 4472 lw s0,28(sp) + 3004362: 6105 addi sp,sp,32 + 3004364: 8082 ret + +03004366 : + * @param str The string to be printed. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, a BASE_STATUS_ERROR is returned. + */ +static int DBG_PrintStr(const char *str) +{ + 3004366: 7179 addi sp,sp,-48 + 3004368: d606 sw ra,44(sp) + 300436a: d422 sw s0,40(sp) + 300436c: 1800 addi s0,sp,48 + 300436e: fca42e23 sw a0,-36(s0) + DEBUG_ASSERT_PARAM(str != NULL); + int cnt = 0; + 3004372: fe042623 sw zero,-20(s0) + while (*str != '\0') { + 3004376: a00d j 3004398 + DBG_PrintCh(*str); + 3004378: fdc42783 lw a5,-36(s0) + 300437c: 00078783 lb a5,0(a5) # 14000000 + 3004380: 853e mv a0,a5 + 3004382: 374d jal ra,3004324 + str++; + 3004384: fdc42783 lw a5,-36(s0) + 3004388: 0785 addi a5,a5,1 + 300438a: fcf42e23 sw a5,-36(s0) + cnt++; + 300438e: fec42783 lw a5,-20(s0) + 3004392: 0785 addi a5,a5,1 + 3004394: fef42623 sw a5,-20(s0) + while (*str != '\0') { + 3004398: fdc42783 lw a5,-36(s0) + 300439c: 00078783 lb a5,0(a5) + 30043a0: ffe1 bnez a5,3004378 + } + return cnt; + 30043a2: fec42783 lw a5,-20(s0) +} + 30043a6: 853e mv a0,a5 + 30043a8: 50b2 lw ra,44(sp) + 30043aa: 5422 lw s0,40(sp) + 30043ac: 6145 addi sp,sp,48 + 30043ae: 8082 ret + +030043b0 : + * @param base Base value. + * @param exponent Exponent value. + * @retval unsigned long The result of raising base to the power exponent. + */ +static unsigned long DBG_Pow(unsigned int base, unsigned int exponent) +{ + 30043b0: 7179 addi sp,sp,-48 + 30043b2: d622 sw s0,44(sp) + 30043b4: 1800 addi s0,sp,48 + 30043b6: fca42e23 sw a0,-36(s0) + 30043ba: fcb42c23 sw a1,-40(s0) + unsigned long ret = 1; + 30043be: 4785 li a5,1 + 30043c0: fef42623 sw a5,-20(s0) + while (exponent--) { + 30043c4: a809 j 30043d6 + ret *= base; + 30043c6: fec42703 lw a4,-20(s0) + 30043ca: fdc42783 lw a5,-36(s0) + 30043ce: 02f707b3 mul a5,a4,a5 + 30043d2: fef42623 sw a5,-20(s0) + while (exponent--) { + 30043d6: fd842783 lw a5,-40(s0) + 30043da: fff78713 addi a4,a5,-1 + 30043de: fce42c23 sw a4,-40(s0) + 30043e2: f3f5 bnez a5,30043c6 + } + return ret; /* ret = base ^ exponent */ + 30043e4: fec42783 lw a5,-20(s0) +} + 30043e8: 853e mv a0,a5 + 30043ea: 5432 lw s0,44(sp) + 30043ec: 6145 addi sp,sp,48 + 30043ee: 8082 ret + +030043f0 : + * @param num The number to be counted. + * @param base The number base of num. + * @retval unsigned int The number of digits. + */ +static unsigned int DBG_CountDigits(int num, NumBase base) +{ + 30043f0: 7179 addi sp,sp,-48 + 30043f2: d622 sw s0,44(sp) + 30043f4: 1800 addi s0,sp,48 + 30043f6: fca42e23 sw a0,-36(s0) + 30043fa: fcb42c23 sw a1,-40(s0) + unsigned int cnt = 0; + 30043fe: fe042623 sw zero,-20(s0) + if (base == 0) { + 3004402: fd842783 lw a5,-40(s0) + 3004406: e78d bnez a5,3004430 + return 0; + 3004408: 4781 li a5,0 + 300440a: a099 j 3004450 + } + while (num != 0) { + cnt++; + 300440c: fec42783 lw a5,-20(s0) + 3004410: 0785 addi a5,a5,1 + 3004412: fef42623 sw a5,-20(s0) + if (cnt > MAX_DIV_TIMES) { + 3004416: fec42703 lw a4,-20(s0) + 300441a: 47fd li a5,31 + 300441c: 00e7ee63 bltu a5,a4,3004438 + break; + } + num /= base; + 3004420: fdc42703 lw a4,-36(s0) + 3004424: fd842783 lw a5,-40(s0) + 3004428: 02f757b3 divu a5,a4,a5 + 300442c: fcf42e23 sw a5,-36(s0) + while (num != 0) { + 3004430: fdc42783 lw a5,-36(s0) + 3004434: ffe1 bnez a5,300440c + 3004436: a011 j 300443a + break; + 3004438: 0001 nop + } + cnt = (cnt == 0) ? 1 : cnt; + 300443a: fec42783 lw a5,-20(s0) + 300443e: c781 beqz a5,3004446 + 3004440: fec42783 lw a5,-20(s0) + 3004444: a011 j 3004448 + 3004446: 4785 li a5,1 + 3004448: fef42623 sw a5,-20(s0) + return cnt; + 300444c: fec42783 lw a5,-20(s0) +} + 3004450: 853e mv a0,a5 + 3004452: 5432 lw s0,44(sp) + 3004454: 6145 addi sp,sp,48 + 3004456: 8082 ret + +03004458 : + * @param num The unsigned number to be printed. + * @param base The number base of num. + * @param digits The digits of num. + */ +static void DBG_PutUnsignedNum(unsigned int num, NumBase base, unsigned int digits) +{ + 3004458: 7179 addi sp,sp,-48 + 300445a: d606 sw ra,44(sp) + 300445c: d422 sw s0,40(sp) + 300445e: 1800 addi s0,sp,48 + 3004460: fca42e23 sw a0,-36(s0) + 3004464: fcb42c23 sw a1,-40(s0) + 3004468: fcc42a23 sw a2,-44(s0) + unsigned char ch; + while (digits != 0) { + 300446c: a069 j 30044f6 + ch = num / DBG_Pow(base, digits - 1); + 300446e: fd442783 lw a5,-44(s0) + 3004472: 17fd addi a5,a5,-1 + 3004474: 85be mv a1,a5 + 3004476: fd842503 lw a0,-40(s0) + 300447a: 3f1d jal ra,30043b0 + 300447c: 872a mv a4,a0 + 300447e: fdc42783 lw a5,-36(s0) + 3004482: 02e7d7b3 divu a5,a5,a4 + 3004486: fef407a3 sb a5,-17(s0) + num %= DBG_Pow(base, digits - 1); + 300448a: fd442783 lw a5,-44(s0) + 300448e: 17fd addi a5,a5,-1 + 3004490: 85be mv a1,a5 + 3004492: fd842503 lw a0,-40(s0) + 3004496: 3f29 jal ra,30043b0 + 3004498: 872a mv a4,a0 + 300449a: fdc42783 lw a5,-36(s0) + 300449e: 02e7f7b3 remu a5,a5,a4 + 30044a2: fcf42e23 sw a5,-36(s0) + if (base == DECIMAL) { + 30044a6: fd842703 lw a4,-40(s0) + 30044aa: 47a9 li a5,10 + 30044ac: 00f71963 bne a4,a5,30044be + DBG_PrintCh(ch + '0'); + 30044b0: fef44783 lbu a5,-17(s0) + 30044b4: 03078793 addi a5,a5,48 + 30044b8: 853e mv a0,a5 + 30044ba: 35ad jal ra,3004324 + 30044bc: a805 j 30044ec + } else if (base == HEXADECIMAL) { + 30044be: fd842703 lw a4,-40(s0) + 30044c2: 47c1 li a5,16 + 30044c4: 02f71d63 bne a4,a5,30044fe + if (ch < DECIMAL_BASE) { + 30044c8: fef44703 lbu a4,-17(s0) + 30044cc: 47a5 li a5,9 + 30044ce: 00e7e963 bltu a5,a4,30044e0 + DBG_PrintCh(ch + '0'); + 30044d2: fef44783 lbu a5,-17(s0) + 30044d6: 03078793 addi a5,a5,48 + 30044da: 853e mv a0,a5 + 30044dc: 35a1 jal ra,3004324 + 30044de: a039 j 30044ec + } else { + DBG_PrintCh(ch - DECIMAL_BASE + 'A'); + 30044e0: fef44783 lbu a5,-17(s0) + 30044e4: 03778793 addi a5,a5,55 + 30044e8: 853e mv a0,a5 + 30044ea: 3d2d jal ra,3004324 + } + } else { + break; + } + digits--; + 30044ec: fd442783 lw a5,-44(s0) + 30044f0: 17fd addi a5,a5,-1 + 30044f2: fcf42a23 sw a5,-44(s0) + while (digits != 0) { + 30044f6: fd442783 lw a5,-44(s0) + 30044fa: fbb5 bnez a5,300446e + } +} + 30044fc: a011 j 3004500 + break; + 30044fe: 0001 nop +} + 3004500: 0001 nop + 3004502: 50b2 lw ra,44(sp) + 3004504: 5422 lw s0,40(sp) + 3004506: 6145 addi sp,sp,48 + 3004508: 8082 ret + +0300450a : + * @brief Print decimal number through UART port. + * @param intNum The decimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintInt(int intNum) +{ + 300450a: 7179 addi sp,sp,-48 + 300450c: d606 sw ra,44(sp) + 300450e: d422 sw s0,40(sp) + 3004510: 1800 addi s0,sp,48 + 3004512: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (intNum == 0) { + 3004516: fdc42783 lw a5,-36(s0) + 300451a: e791 bnez a5,3004526 + DBG_PrintCh('0'); + 300451c: 03000513 li a0,48 + 3004520: 3511 jal ra,3004324 + return 1; + 3004522: 4785 li a5,1 + 3004524: a82d j 300455e + } + if (intNum < 0) { + 3004526: fdc42783 lw a5,-36(s0) + 300452a: 0007db63 bgez a5,3004540 + DBG_PrintCh('-'); + 300452e: 02d00513 li a0,45 + 3004532: 3bcd jal ra,3004324 + intNum = -intNum; + 3004534: fdc42783 lw a5,-36(s0) + 3004538: 40f007b3 neg a5,a5 + 300453c: fcf42e23 sw a5,-36(s0) + } + cnt = DBG_CountDigits(intNum, DECIMAL); + 3004540: 45a9 li a1,10 + 3004542: fdc42503 lw a0,-36(s0) + 3004546: 356d jal ra,30043f0 + 3004548: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(intNum, DECIMAL, cnt); + 300454c: fdc42783 lw a5,-36(s0) + 3004550: fec42603 lw a2,-20(s0) + 3004554: 45a9 li a1,10 + 3004556: 853e mv a0,a5 + 3004558: 3701 jal ra,3004458 + return cnt; + 300455a: fec42783 lw a5,-20(s0) +} + 300455e: 853e mv a0,a5 + 3004560: 50b2 lw ra,44(sp) + 3004562: 5422 lw s0,40(sp) + 3004564: 6145 addi sp,sp,48 + 3004566: 8082 ret + +03004568 : + * @brief Print hexadecimal number through UART port. + * @param hexNum The hexadecimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintHex(unsigned int hexNum) +{ + 3004568: 7179 addi sp,sp,-48 + 300456a: d606 sw ra,44(sp) + 300456c: d422 sw s0,40(sp) + 300456e: 1800 addi s0,sp,48 + 3004570: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (hexNum == 0) { + 3004574: fdc42783 lw a5,-36(s0) + 3004578: e791 bnez a5,3004584 + DBG_PrintCh('0'); + 300457a: 03000513 li a0,48 + 300457e: 335d jal ra,3004324 + return 1; + 3004580: 4785 li a5,1 + 3004582: a005 j 30045a2 + } + cnt = DBG_CountDigits(hexNum, HEXADECIMAL); + 3004584: fdc42783 lw a5,-36(s0) + 3004588: 45c1 li a1,16 + 300458a: 853e mv a0,a5 + 300458c: 3595 jal ra,30043f0 + 300458e: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(hexNum, HEXADECIMAL, cnt); + 3004592: fec42603 lw a2,-20(s0) + 3004596: 45c1 li a1,16 + 3004598: fdc42503 lw a0,-36(s0) + 300459c: 3d75 jal ra,3004458 + return cnt; + 300459e: fec42783 lw a5,-20(s0) +} + 30045a2: 853e mv a0,a5 + 30045a4: 50b2 lw ra,44(sp) + 30045a6: 5422 lw s0,40(sp) + 30045a8: 6145 addi sp,sp,48 + 30045aa: 8082 ret + +030045ac : + * @brief Print floating-point number through UART port. + * @param fltNum The floating-point number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintFlt(float fltNum, unsigned int precision) +{ + 30045ac: 7139 addi sp,sp,-64 + 30045ae: de06 sw ra,60(sp) + 30045b0: dc22 sw s0,56(sp) + 30045b2: 0080 addi s0,sp,64 + 30045b4: fca42627 fsw fa0,-52(s0) + 30045b8: fca42423 sw a0,-56(s0) + unsigned int cnt = 0; + 30045bc: fe042623 sw zero,-20(s0) + unsigned int floatScale; + + if (fltNum < 0) { + 30045c0: fcc42787 flw fa5,-52(s0) + 30045c4: f0000753 fmv.w.x fa4,zero + 30045c8: a0e797d3 flt.s a5,fa5,fa4 + 30045cc: cf99 beqz a5,30045ea + DBG_PrintCh('-'); + 30045ce: 02d00513 li a0,45 + 30045d2: 3b89 jal ra,3004324 + cnt += 1; + 30045d4: fec42783 lw a5,-20(s0) + 30045d8: 0785 addi a5,a5,1 + 30045da: fef42623 sw a5,-20(s0) + fltNum = -fltNum; + 30045de: fcc42787 flw fa5,-52(s0) + 30045e2: 20f797d3 fneg.s fa5,fa5 + 30045e6: fcf42627 fsw fa5,-52(s0) + } + int integerVal = (int)fltNum; + 30045ea: fcc42787 flw fa5,-52(s0) + 30045ee: c00797d3 fcvt.w.s a5,fa5,rtz + 30045f2: fef42023 sw a5,-32(s0) + floatScale = DBG_Pow(10, (precision + 1)); /* 10: decimal */ + 30045f6: fc842783 lw a5,-56(s0) + 30045fa: 0785 addi a5,a5,1 + 30045fc: 85be mv a1,a5 + 30045fe: 4529 li a0,10 + 3004600: 3b45 jal ra,30043b0 + 3004602: fca42e23 sw a0,-36(s0) + int floatVal = (long)(floatScale * (fltNum - integerVal)); + 3004606: fdc42783 lw a5,-36(s0) + 300460a: d017f753 fcvt.s.wu fa4,a5 + 300460e: fe042783 lw a5,-32(s0) + 3004612: d007f7d3 fcvt.s.w fa5,a5 + 3004616: fcc42687 flw fa3,-52(s0) + 300461a: 08f6f7d3 fsub.s fa5,fa3,fa5 + 300461e: 10f777d3 fmul.s fa5,fa4,fa5 + 3004622: c00797d3 fcvt.w.s a5,fa5,rtz + 3004626: fef42423 sw a5,-24(s0) + /* Half-adjust: round up or round down */ + if (floatVal % DECIMAL_BASE >= HALF_ADJUST_BOUNDARY) { + 300462a: fe842703 lw a4,-24(s0) + 300462e: 47a9 li a5,10 + 3004630: 02f77733 remu a4,a4,a5 + 3004634: 4791 li a5,4 + 3004636: 00e7fb63 bgeu a5,a4,300464c + floatVal = floatVal / DECIMAL_BASE + 1; + 300463a: fe842703 lw a4,-24(s0) + 300463e: 47a9 li a5,10 + 3004640: 02f757b3 divu a5,a4,a5 + 3004644: 0785 addi a5,a5,1 + 3004646: fef42423 sw a5,-24(s0) + 300464a: a801 j 300465a + } else { + floatVal = floatVal / DECIMAL_BASE; + 300464c: fe842703 lw a4,-24(s0) + 3004650: 47a9 li a5,10 + 3004652: 02f757b3 divu a5,a4,a5 + 3004656: fef42423 sw a5,-24(s0) + } + cnt += DBG_PrintInt(integerVal); + 300465a: fe042503 lw a0,-32(s0) + 300465e: 3575 jal ra,300450a + 3004660: 872a mv a4,a0 + 3004662: fec42783 lw a5,-20(s0) + 3004666: 97ba add a5,a5,a4 + 3004668: fef42623 sw a5,-20(s0) + DBG_PrintCh('.'); + 300466c: 02e00513 li a0,46 + 3004670: 3955 jal ra,3004324 + cnt += 1; + 3004672: fec42783 lw a5,-20(s0) + 3004676: 0785 addi a5,a5,1 + 3004678: fef42623 sw a5,-20(s0) + /* Pad 0 in float part */ + unsigned int fltCnt = DBG_CountDigits(floatVal, DECIMAL); + 300467c: 45a9 li a1,10 + 300467e: fe842503 lw a0,-24(s0) + 3004682: 33bd jal ra,30043f0 + 3004684: fca42c23 sw a0,-40(s0) + if (precision > fltCnt) { + 3004688: fc842703 lw a4,-56(s0) + 300468c: fd842783 lw a5,-40(s0) + 3004690: 02e7f763 bgeu a5,a4,30046be + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 3004694: fe042223 sw zero,-28(s0) + 3004698: a809 j 30046aa + DBG_PrintCh('0'); /* add '0' */ + 300469a: 03000513 li a0,48 + 300469e: 3159 jal ra,3004324 + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 30046a0: fe442783 lw a5,-28(s0) + 30046a4: 0785 addi a5,a5,1 + 30046a6: fef42223 sw a5,-28(s0) + 30046aa: fc842703 lw a4,-56(s0) + 30046ae: fd842783 lw a5,-40(s0) + 30046b2: 40f707b3 sub a5,a4,a5 + 30046b6: fe442703 lw a4,-28(s0) + 30046ba: fef760e3 bltu a4,a5,300469a + } + } + DBG_PutUnsignedNum(floatVal, DECIMAL, fltCnt); /* print unsigned number */ + 30046be: fe842783 lw a5,-24(s0) + 30046c2: fd842603 lw a2,-40(s0) + 30046c6: 45a9 li a1,10 + 30046c8: 853e mv a0,a5 + 30046ca: 3379 jal ra,3004458 + cnt += precision; + 30046cc: fec42703 lw a4,-20(s0) + 30046d0: fc842783 lw a5,-56(s0) + 30046d4: 97ba add a5,a5,a4 + 30046d6: fef42623 sw a5,-20(s0) + return cnt; + 30046da: fec42783 lw a5,-20(s0) +} + 30046de: 853e mv a0,a5 + 30046e0: 50f2 lw ra,60(sp) + 30046e2: 5462 lw s0,56(sp) + 30046e4: 6121 addi sp,sp,64 + 30046e6: 8082 ret + +030046e8 : + * @param ch The format specifier. + * @param paramList The pointer of the variable parameter list. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int ParseSpecifier(const char ch, va_list *paramList) +{ + 30046e8: 7139 addi sp,sp,-64 + 30046ea: de06 sw ra,60(sp) + 30046ec: dc22 sw s0,56(sp) + 30046ee: 0080 addi s0,sp,64 + 30046f0: 87aa mv a5,a0 + 30046f2: fcb42423 sw a1,-56(s0) + 30046f6: fcf407a3 sb a5,-49(s0) + unsigned int cnt = 0; + 30046fa: fe042623 sw zero,-20(s0) + unsigned int tmpCnt; + char chVal = 0; + 30046fe: fe0405a3 sb zero,-21(s0) + const char *strVal = NULL; + 3004702: fe042223 sw zero,-28(s0) + int intVal = 0; + 3004706: fe042023 sw zero,-32(s0) + unsigned int unsignedVal = 0; + 300470a: fc042e23 sw zero,-36(s0) + unsigned int hexVal = 0; + 300470e: fc042c23 sw zero,-40(s0) + float fltVal = 0; + 3004712: fc042a23 sw zero,-44(s0) + switch (ch) { + 3004716: fcf40783 lb a5,-49(s0) + 300471a: fa878793 addi a5,a5,-88 + 300471e: 02000713 li a4,32 + 3004722: 14f76063 bltu a4,a5,3004862 + 3004726: 00279713 slli a4,a5,0x2 + 300472a: 030067b7 lui a5,0x3006 + 300472e: 54878793 addi a5,a5,1352 # 3006548 + 3004732: 97ba add a5,a5,a4 + 3004734: 439c lw a5,0(a5) + 3004736: 8782 jr a5 + case 'c': /* Character format data. */ + chVal = VA_ARG(*paramList, int); /* Use type int because of byte alignment */ + 3004738: fc842783 lw a5,-56(s0) + 300473c: 439c lw a5,0(a5) + 300473e: 00478693 addi a3,a5,4 + 3004742: fc842703 lw a4,-56(s0) + 3004746: c314 sw a3,0(a4) + 3004748: 439c lw a5,0(a5) + 300474a: fef405a3 sb a5,-21(s0) + DBG_PrintCh(chVal); + 300474e: feb40783 lb a5,-21(s0) + 3004752: 853e mv a0,a5 + 3004754: 3ec1 jal ra,3004324 + cnt += 1; + 3004756: fec42783 lw a5,-20(s0) + 300475a: 0785 addi a5,a5,1 + 300475c: fef42623 sw a5,-20(s0) + break; + 3004760: aa19 j 3004876 + case 's': /* String format data. */ + strVal = VA_ARG(*paramList, const char *); + 3004762: fc842783 lw a5,-56(s0) + 3004766: 439c lw a5,0(a5) + 3004768: 00478693 addi a3,a5,4 + 300476c: fc842703 lw a4,-56(s0) + 3004770: c314 sw a3,0(a4) + 3004772: 439c lw a5,0(a5) + 3004774: fef42223 sw a5,-28(s0) + cnt += DBG_PrintStr(strVal); + 3004778: fe442503 lw a0,-28(s0) + 300477c: 36ed jal ra,3004366 + 300477e: 87aa mv a5,a0 + 3004780: 873e mv a4,a5 + 3004782: fec42783 lw a5,-20(s0) + 3004786: 97ba add a5,a5,a4 + 3004788: fef42623 sw a5,-20(s0) + break; + 300478c: a0ed j 3004876 + case 'd': /* Integer decimal data. */ + intVal = VA_ARG(*paramList, int); + 300478e: fc842783 lw a5,-56(s0) + 3004792: 439c lw a5,0(a5) + 3004794: 00478693 addi a3,a5,4 + 3004798: fc842703 lw a4,-56(s0) + 300479c: c314 sw a3,0(a4) + 300479e: 439c lw a5,0(a5) + 30047a0: fef42023 sw a5,-32(s0) + cnt += DBG_PrintInt(intVal); + 30047a4: fe042503 lw a0,-32(s0) + 30047a8: 338d jal ra,300450a + 30047aa: 872a mv a4,a0 + 30047ac: fec42783 lw a5,-20(s0) + 30047b0: 97ba add a5,a5,a4 + 30047b2: fef42623 sw a5,-20(s0) + break; + 30047b6: a0c1 j 3004876 + case 'u': /* Unsigned decimal data. */ + unsignedVal = VA_ARG(*paramList, unsigned int); + 30047b8: fc842783 lw a5,-56(s0) + 30047bc: 439c lw a5,0(a5) + 30047be: 00478693 addi a3,a5,4 + 30047c2: fc842703 lw a4,-56(s0) + 30047c6: c314 sw a3,0(a4) + 30047c8: 439c lw a5,0(a5) + 30047ca: fcf42e23 sw a5,-36(s0) + tmpCnt = DBG_CountDigits(unsignedVal, DECIMAL); + 30047ce: fdc42783 lw a5,-36(s0) + 30047d2: 45a9 li a1,10 + 30047d4: 853e mv a0,a5 + 30047d6: 3929 jal ra,30043f0 + 30047d8: fca42823 sw a0,-48(s0) + DBG_PutUnsignedNum(unsignedVal, DECIMAL, tmpCnt); + 30047dc: fd042603 lw a2,-48(s0) + 30047e0: 45a9 li a1,10 + 30047e2: fdc42503 lw a0,-36(s0) + 30047e6: 398d jal ra,3004458 + cnt += tmpCnt; + 30047e8: fec42703 lw a4,-20(s0) + 30047ec: fd042783 lw a5,-48(s0) + 30047f0: 97ba add a5,a5,a4 + 30047f2: fef42623 sw a5,-20(s0) + break; + 30047f6: a041 j 3004876 + case 'x': /* Hexadecimal data. */ + case 'X': + case 'p': /* Address data. */ + hexVal = VA_ARG(*paramList, unsigned int); + 30047f8: fc842783 lw a5,-56(s0) + 30047fc: 439c lw a5,0(a5) + 30047fe: 00478693 addi a3,a5,4 + 3004802: fc842703 lw a4,-56(s0) + 3004806: c314 sw a3,0(a4) + 3004808: 439c lw a5,0(a5) + 300480a: fcf42c23 sw a5,-40(s0) + cnt += DBG_PrintHex(hexVal); + 300480e: fd842503 lw a0,-40(s0) + 3004812: 3b99 jal ra,3004568 + 3004814: 872a mv a4,a0 + 3004816: fec42783 lw a5,-20(s0) + 300481a: 97ba add a5,a5,a4 + 300481c: fef42623 sw a5,-20(s0) + break; + 3004820: a899 j 3004876 + case 'f': /* Floating-point data. */ + fltVal = VA_ARG(*paramList, double); + 3004822: fc842783 lw a5,-56(s0) + 3004826: 439c lw a5,0(a5) + 3004828: 079d addi a5,a5,7 + 300482a: 9be1 andi a5,a5,-8 + 300482c: 00878693 addi a3,a5,8 + 3004830: fc842703 lw a4,-56(s0) + 3004834: c314 sw a3,0(a4) + 3004836: 0047a803 lw a6,4(a5) + 300483a: 439c lw a5,0(a5) + 300483c: 853e mv a0,a5 + 300483e: 85c2 mv a1,a6 + 3004840: 75c010ef jal ra,3005f9c <__truncdfsf2> + 3004844: 20a507d3 fmv.s fa5,fa0 + 3004848: fcf42a27 fsw fa5,-44(s0) + cnt += DBG_PrintFlt(fltVal, 5); /* default precision: 5 */ + 300484c: 4515 li a0,5 + 300484e: fd442507 flw fa0,-44(s0) + 3004852: 3ba9 jal ra,30045ac + 3004854: 872a mv a4,a0 + 3004856: fec42783 lw a5,-20(s0) + 300485a: 97ba add a5,a5,a4 + 300485c: fef42623 sw a5,-20(s0) + break; + 3004860: a819 j 3004876 + default: + DBG_PrintCh(ch); + 3004862: fcf40783 lb a5,-49(s0) + 3004866: 853e mv a0,a5 + 3004868: 3c75 jal ra,3004324 + cnt += 1; + 300486a: fec42783 lw a5,-20(s0) + 300486e: 0785 addi a5,a5,1 + 3004870: fef42623 sw a5,-20(s0) + break; + 3004874: 0001 nop + } + return cnt; + 3004876: fec42783 lw a5,-20(s0) +} + 300487a: 853e mv a0,a5 + 300487c: 50f2 lw ra,60(sp) + 300487e: 5462 lw s0,56(sp) + 3004880: 6121 addi sp,sp,64 + 3004882: 8082 ret + +03004884 : + * @param intNum The decimal number to be printed. + * @param fieldWidth Field width. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintIntWithField(int intNum, int fieldWidth) +{ + 3004884: 7139 addi sp,sp,-64 + 3004886: de06 sw ra,60(sp) + 3004888: dc22 sw s0,56(sp) + 300488a: 0080 addi s0,sp,64 + 300488c: fca42623 sw a0,-52(s0) + 3004890: fcb42423 sw a1,-56(s0) + int zeroCnt = 0; + 3004894: fc042e23 sw zero,-36(s0) + int digitsCnt = 0; + 3004898: fe042623 sw zero,-20(s0) + unsigned int cnt = 0; + 300489c: fe042423 sw zero,-24(s0) + + if (intNum == 0) { + 30048a0: fcc42783 lw a5,-52(s0) + 30048a4: e791 bnez a5,30048b0 + DBG_PrintCh('0'); + 30048a6: 03000513 li a0,48 + 30048aa: 3cad jal ra,3004324 + return 1; + 30048ac: 4785 li a5,1 + 30048ae: a0dd j 3004994 + } + if (intNum < 0) { + 30048b0: fcc42783 lw a5,-52(s0) + 30048b4: 0607dd63 bgez a5,300492e + DBG_PrintCh('-'); /* add symbol */ + 30048b8: 02d00513 li a0,45 + 30048bc: 34a5 jal ra,3004324 + cnt++; + 30048be: fe842783 lw a5,-24(s0) + 30048c2: 0785 addi a5,a5,1 + 30048c4: fef42423 sw a5,-24(s0) + intNum = -intNum; + 30048c8: fcc42783 lw a5,-52(s0) + 30048cc: 40f007b3 neg a5,a5 + 30048d0: fcf42623 sw a5,-52(s0) + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 30048d4: 45a9 li a1,10 + 30048d6: fcc42503 lw a0,-52(s0) + 30048da: 3e19 jal ra,30043f0 + 30048dc: 87aa mv a5,a0 + 30048de: fef42623 sw a5,-20(s0) + zeroCnt = fieldWidth - digitsCnt; + 30048e2: fc842703 lw a4,-56(s0) + 30048e6: fec42783 lw a5,-20(s0) + 30048ea: 40f707b3 sub a5,a4,a5 + 30048ee: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 30048f2: fe042223 sw zero,-28(s0) + 30048f6: a831 j 3004912 + DBG_PrintCh('0'); /* add '0' */ + 30048f8: 03000513 li a0,48 + 30048fc: 3425 jal ra,3004324 + cnt++; + 30048fe: fe842783 lw a5,-24(s0) + 3004902: 0785 addi a5,a5,1 + 3004904: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004908: fe442783 lw a5,-28(s0) + 300490c: 0785 addi a5,a5,1 + 300490e: fef42223 sw a5,-28(s0) + 3004912: fe442703 lw a4,-28(s0) + 3004916: fdc42783 lw a5,-36(s0) + 300491a: fcf74fe3 blt a4,a5,30048f8 + } + cnt += digitsCnt; + 300491e: fec42783 lw a5,-20(s0) + 3004922: fe842703 lw a4,-24(s0) + 3004926: 97ba add a5,a5,a4 + 3004928: fef42423 sw a5,-24(s0) + 300492c: a891 j 3004980 + } else { + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 300492e: 45a9 li a1,10 + 3004930: fcc42503 lw a0,-52(s0) + 3004934: 3c75 jal ra,30043f0 + 3004936: 87aa mv a5,a0 + 3004938: fef42623 sw a5,-20(s0) + cnt = digitsCnt; + 300493c: fec42783 lw a5,-20(s0) + 3004940: fef42423 sw a5,-24(s0) + zeroCnt = fieldWidth - digitsCnt; + 3004944: fc842703 lw a4,-56(s0) + 3004948: fec42783 lw a5,-20(s0) + 300494c: 40f707b3 sub a5,a4,a5 + 3004950: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004954: fe042023 sw zero,-32(s0) + 3004958: a831 j 3004974 + DBG_PrintCh('0'); /* add '0' */ + 300495a: 03000513 li a0,48 + 300495e: 32d9 jal ra,3004324 + cnt++; + 3004960: fe842783 lw a5,-24(s0) + 3004964: 0785 addi a5,a5,1 + 3004966: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 300496a: fe042783 lw a5,-32(s0) + 300496e: 0785 addi a5,a5,1 + 3004970: fef42023 sw a5,-32(s0) + 3004974: fe042703 lw a4,-32(s0) + 3004978: fdc42783 lw a5,-36(s0) + 300497c: fcf74fe3 blt a4,a5,300495a + } + } + DBG_PutUnsignedNum(intNum, DECIMAL, digitsCnt); + 3004980: fcc42783 lw a5,-52(s0) + 3004984: fec42703 lw a4,-20(s0) + 3004988: 863a mv a2,a4 + 300498a: 45a9 li a1,10 + 300498c: 853e mv a0,a5 + 300498e: 34e9 jal ra,3004458 + return cnt; + 3004990: fe842783 lw a5,-24(s0) +} + 3004994: 853e mv a0,a5 + 3004996: 50f2 lw ra,60(sp) + 3004998: 5462 lw s0,56(sp) + 300499a: 6121 addi sp,sp,64 + 300499c: 8082 ret + +0300499e : + +static int DBG_Atoi(const char **s) +{ + 300499e: 7179 addi sp,sp,-48 + 30049a0: d622 sw s0,44(sp) + 30049a2: 1800 addi s0,sp,48 + 30049a4: fca42e23 sw a0,-36(s0) + int i, c; + + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 30049a8: fe042623 sw zero,-20(s0) + 30049ac: a02d j 30049d6 + i = i * 10 + c - '0'; /* 10: decimal */ + 30049ae: fec42703 lw a4,-20(s0) + 30049b2: 47a9 li a5,10 + 30049b4: 02f70733 mul a4,a4,a5 + 30049b8: fe842783 lw a5,-24(s0) + 30049bc: 97ba add a5,a5,a4 + 30049be: fd078793 addi a5,a5,-48 + 30049c2: fef42623 sw a5,-20(s0) + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 30049c6: fdc42783 lw a5,-36(s0) + 30049ca: 439c lw a5,0(a5) + 30049cc: 00178713 addi a4,a5,1 + 30049d0: fdc42783 lw a5,-36(s0) + 30049d4: c398 sw a4,0(a5) + 30049d6: fdc42783 lw a5,-36(s0) + 30049da: 439c lw a5,0(a5) + 30049dc: 00078783 lb a5,0(a5) + 30049e0: fef42423 sw a5,-24(s0) + 30049e4: fe842703 lw a4,-24(s0) + 30049e8: 02f00793 li a5,47 + 30049ec: 00e7d863 bge a5,a4,30049fc + 30049f0: fe842703 lw a4,-24(s0) + 30049f4: 03900793 li a5,57 + 30049f8: fae7dbe3 bge a5,a4,30049ae + } + return i; + 30049fc: fec42783 lw a5,-20(s0) +} + 3004a00: 853e mv a0,a5 + 3004a02: 5432 lw s0,44(sp) + 3004a04: 6145 addi sp,sp,48 + 3004a06: 8082 ret + +03004a08 : + * @param ... Variable parameter list. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, return BASE_STATUS_ERROR. + */ +int DBG_UartPrintf(const char *format, ...) +{ + 3004a08: 711d addi sp,sp,-96 + 3004a0a: de06 sw ra,60(sp) + 3004a0c: dc22 sw s0,56(sp) + 3004a0e: 0080 addi s0,sp,64 + 3004a10: fca42623 sw a0,-52(s0) + 3004a14: c04c sw a1,4(s0) + 3004a16: c410 sw a2,8(s0) + 3004a18: c454 sw a3,12(s0) + 3004a1a: c818 sw a4,16(s0) + 3004a1c: c85c sw a5,20(s0) + 3004a1e: 01042c23 sw a6,24(s0) + 3004a22: 01142e23 sw a7,28(s0) + DEBUG_ASSERT_PARAM(format != NULL); + int cnt = 0; + 3004a26: fe042623 sw zero,-20(s0) + int fieldWidth = 0; + 3004a2a: fe042423 sw zero,-24(s0) + int floatPrecision = 0; + 3004a2e: fe042223 sw zero,-28(s0) + float fltVal = 0; + 3004a32: fe042023 sw zero,-32(s0) + int intVal = 0; + 3004a36: fc042e23 sw zero,-36(s0) + va_list paramList; + VA_START(paramList, format); + 3004a3a: 02040793 addi a5,s0,32 + 3004a3e: 1791 addi a5,a5,-28 + 3004a40: fcf42c23 sw a5,-40(s0) + + while (*format != '\0') { + 3004a44: aa09 j 3004b56 + if (*format != '%') { + 3004a46: fcc42783 lw a5,-52(s0) + 3004a4a: 00078703 lb a4,0(a5) + 3004a4e: 02500793 li a5,37 + 3004a52: 00f70e63 beq a4,a5,3004a6e + DBG_PrintCh(*format); + 3004a56: fcc42783 lw a5,-52(s0) + 3004a5a: 00078783 lb a5,0(a5) + 3004a5e: 853e mv a0,a5 + 3004a60: 30d1 jal ra,3004324 + cnt += 1; + 3004a62: fec42783 lw a5,-20(s0) + 3004a66: 0785 addi a5,a5,1 + 3004a68: fef42623 sw a5,-20(s0) + 3004a6c: a0c5 j 3004b4c + } else { + format++; + 3004a6e: fcc42783 lw a5,-52(s0) + 3004a72: 0785 addi a5,a5,1 + 3004a74: fcf42623 sw a5,-52(s0) + if (*format == '0') { + 3004a78: fcc42783 lw a5,-52(s0) + 3004a7c: 00078703 lb a4,0(a5) + 3004a80: 03000793 li a5,48 + 3004a84: 04f71263 bne a4,a5,3004ac8 + format++; + 3004a88: fcc42783 lw a5,-52(s0) + 3004a8c: 0785 addi a5,a5,1 + 3004a8e: fcf42623 sw a5,-52(s0) + fieldWidth = DBG_Atoi(&format); + 3004a92: fcc40793 addi a5,s0,-52 + 3004a96: 853e mv a0,a5 + 3004a98: 3719 jal ra,300499e + 3004a9a: fea42423 sw a0,-24(s0) + intVal = VA_ARG(paramList, int); + 3004a9e: fd842783 lw a5,-40(s0) + 3004aa2: 00478713 addi a4,a5,4 + 3004aa6: fce42c23 sw a4,-40(s0) + 3004aaa: 439c lw a5,0(a5) + 3004aac: fcf42e23 sw a5,-36(s0) + cnt += DBG_PrintIntWithField(intVal, fieldWidth); + 3004ab0: fe842583 lw a1,-24(s0) + 3004ab4: fdc42503 lw a0,-36(s0) + 3004ab8: 33f1 jal ra,3004884 + 3004aba: 872a mv a4,a0 + 3004abc: fec42783 lw a5,-20(s0) + 3004ac0: 97ba add a5,a5,a4 + 3004ac2: fef42623 sw a5,-20(s0) + 3004ac6: a059 j 3004b4c + } else if (*format == '.') { + 3004ac8: fcc42783 lw a5,-52(s0) + 3004acc: 00078703 lb a4,0(a5) + 3004ad0: 02e00793 li a5,46 + 3004ad4: 04f71d63 bne a4,a5,3004b2e + format++; + 3004ad8: fcc42783 lw a5,-52(s0) + 3004adc: 0785 addi a5,a5,1 + 3004ade: fcf42623 sw a5,-52(s0) + floatPrecision = DBG_Atoi(&format); + 3004ae2: fcc40793 addi a5,s0,-52 + 3004ae6: 853e mv a0,a5 + 3004ae8: 3d5d jal ra,300499e + 3004aea: fea42223 sw a0,-28(s0) + fltVal = VA_ARG(paramList, double); + 3004aee: fd842783 lw a5,-40(s0) + 3004af2: 079d addi a5,a5,7 + 3004af4: 9be1 andi a5,a5,-8 + 3004af6: 00878713 addi a4,a5,8 + 3004afa: fce42c23 sw a4,-40(s0) + 3004afe: 0047a803 lw a6,4(a5) + 3004b02: 439c lw a5,0(a5) + 3004b04: 853e mv a0,a5 + 3004b06: 85c2 mv a1,a6 + 3004b08: 494010ef jal ra,3005f9c <__truncdfsf2> + 3004b0c: 20a507d3 fmv.s fa5,fa0 + 3004b10: fef42027 fsw fa5,-32(s0) + cnt += DBG_PrintFlt(fltVal, floatPrecision); + 3004b14: fe442783 lw a5,-28(s0) + 3004b18: 853e mv a0,a5 + 3004b1a: fe042507 flw fa0,-32(s0) + 3004b1e: 3479 jal ra,30045ac + 3004b20: 872a mv a4,a0 + 3004b22: fec42783 lw a5,-20(s0) + 3004b26: 97ba add a5,a5,a4 + 3004b28: fef42623 sw a5,-20(s0) + 3004b2c: a005 j 3004b4c + } else { + cnt += ParseSpecifier(*format, ¶mList); + 3004b2e: fcc42783 lw a5,-52(s0) + 3004b32: 00078783 lb a5,0(a5) + 3004b36: fd840713 addi a4,s0,-40 + 3004b3a: 85ba mv a1,a4 + 3004b3c: 853e mv a0,a5 + 3004b3e: 366d jal ra,30046e8 + 3004b40: 872a mv a4,a0 + 3004b42: fec42783 lw a5,-20(s0) + 3004b46: 97ba add a5,a5,a4 + 3004b48: fef42623 sw a5,-20(s0) + } + } + format++; + 3004b4c: fcc42783 lw a5,-52(s0) + 3004b50: 0785 addi a5,a5,1 + 3004b52: fcf42623 sw a5,-52(s0) + while (*format != '\0') { + 3004b56: fcc42783 lw a5,-52(s0) + 3004b5a: 00078783 lb a5,0(a5) + 3004b5e: ee0794e3 bnez a5,3004a46 + } + VA_END(paramList); + return cnt; + 3004b62: fec42783 lw a5,-20(s0) +} + 3004b66: 853e mv a0,a5 + 3004b68: 50f2 lw ra,60(sp) + 3004b6a: 5462 lw s0,56(sp) + 3004b6c: 6125 addi sp,sp,96 + 3004b6e: 8082 ret + +03004b70 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param regValue value of @ref IOCMG_REG. + * @retval None. + */ +static inline void DCL_IOCMG_SetRegValue(IOCMG_REG *iocmgRegx, unsigned int regValue) +{ + 3004b70: 1101 addi sp,sp,-32 + 3004b72: ce06 sw ra,28(sp) + 3004b74: cc22 sw s0,24(sp) + 3004b76: 1000 addi s0,sp,32 + 3004b78: fea42623 sw a0,-20(s0) + 3004b7c: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004b80: fec42703 lw a4,-20(s0) + 3004b84: 77c1 lui a5,0xffff0 + 3004b86: 8f7d and a4,a4,a5 + 3004b88: 147f07b7 lui a5,0x147f0 + 3004b8c: 00f70a63 beq a4,a5,3004ba0 + 3004b90: 08b00593 li a1,139 + 3004b94: 030067b7 lui a5,0x3006 + 3004b98: 5cc78513 addi a0,a5,1484 # 30065cc + 3004b9c: 2df1 jal ra,3005278 + 3004b9e: a001 j 3004b9e + iocmgRegx->reg = regValue; + 3004ba0: fec42783 lw a5,-20(s0) + 3004ba4: fe842703 lw a4,-24(s0) + 3004ba8: c398 sw a4,0(a5) +} + 3004baa: 0001 nop + 3004bac: 40f2 lw ra,28(sp) + 3004bae: 4462 lw s0,24(sp) + 3004bb0: 6105 addi sp,sp,32 + 3004bb2: 8082 ret + +03004bb4 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param driveRate value of @ref IOCMG_DriveRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetDriveRate(IOCMG_REG *iocmgRegx, IOCMG_DriveRate driveRate) +{ + 3004bb4: 1101 addi sp,sp,-32 + 3004bb6: ce06 sw ra,28(sp) + 3004bb8: cc22 sw s0,24(sp) + 3004bba: 1000 addi s0,sp,32 + 3004bbc: fea42623 sw a0,-20(s0) + 3004bc0: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004bc4: fec42703 lw a4,-20(s0) + 3004bc8: 77c1 lui a5,0xffff0 + 3004bca: 8f7d and a4,a4,a5 + 3004bcc: 147f07b7 lui a5,0x147f0 + 3004bd0: 00f70a63 beq a4,a5,3004be4 + 3004bd4: 0ba00593 li a1,186 + 3004bd8: 030067b7 lui a5,0x3006 + 3004bdc: 5cc78513 addi a0,a5,1484 # 30065cc + 3004be0: 2d61 jal ra,3005278 + 3004be2: a001 j 3004be2 + IOCMG_PARAM_CHECK_NO_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4); + 3004be4: fe842703 lw a4,-24(s0) + 3004be8: 478d li a5,3 + 3004bea: 00e7fa63 bgeu a5,a4,3004bfe + 3004bee: 0bb00593 li a1,187 + 3004bf2: 030067b7 lui a5,0x3006 + 3004bf6: 5cc78513 addi a0,a5,1484 # 30065cc + 3004bfa: 2dbd jal ra,3005278 + 3004bfc: a839 j 3004c1a + iocmgRegx->BIT.ds = driveRate; + 3004bfe: fe842783 lw a5,-24(s0) + 3004c02: 8b8d andi a5,a5,3 + 3004c04: 0ff7f693 andi a3,a5,255 + 3004c08: fec42703 lw a4,-20(s0) + 3004c0c: 431c lw a5,0(a4) + 3004c0e: 8a8d andi a3,a3,3 + 3004c10: 0692 slli a3,a3,0x4 + 3004c12: fcf7f793 andi a5,a5,-49 + 3004c16: 8fd5 or a5,a5,a3 + 3004c18: c31c sw a5,0(a4) +} + 3004c1a: 40f2 lw ra,28(sp) + 3004c1c: 4462 lw s0,24(sp) + 3004c1e: 6105 addi sp,sp,32 + 3004c20: 8082 ret + +03004c22 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param pullMode value of @ref IOCMG_PullMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetPullMode(IOCMG_REG *iocmgRegx, IOCMG_PullMode pullMode) +{ + 3004c22: 1101 addi sp,sp,-32 + 3004c24: ce06 sw ra,28(sp) + 3004c26: cc22 sw s0,24(sp) + 3004c28: 1000 addi s0,sp,32 + 3004c2a: fea42623 sw a0,-20(s0) + 3004c2e: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004c32: fec42703 lw a4,-20(s0) + 3004c36: 77c1 lui a5,0xffff0 + 3004c38: 8f7d and a4,a4,a5 + 3004c3a: 147f07b7 lui a5,0x147f0 + 3004c3e: 00f70a63 beq a4,a5,3004c52 + 3004c42: 0d200593 li a1,210 + 3004c46: 030067b7 lui a5,0x3006 + 3004c4a: 5cc78513 addi a0,a5,1484 # 30065cc + 3004c4e: 252d jal ra,3005278 + 3004c50: a001 j 3004c50 + IOCMG_PARAM_CHECK_NO_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE); + 3004c52: fe842703 lw a4,-24(s0) + 3004c56: 478d li a5,3 + 3004c58: 00e7fa63 bgeu a5,a4,3004c6c + 3004c5c: 0d300593 li a1,211 + 3004c60: 030067b7 lui a5,0x3006 + 3004c64: 5cc78513 addi a0,a5,1484 # 30065cc + 3004c68: 2d01 jal ra,3005278 + 3004c6a: a835 j 3004ca6 + iocmgRegx->BIT.pu = (pullMode & 0x02) >> 1; /* 10b: pull up mode */ + 3004c6c: fe842783 lw a5,-24(s0) + 3004c70: 8385 srli a5,a5,0x1 + 3004c72: 8b85 andi a5,a5,1 + 3004c74: 0ff7f693 andi a3,a5,255 + 3004c78: fec42703 lw a4,-20(s0) + 3004c7c: 431c lw a5,0(a4) + 3004c7e: 8a85 andi a3,a3,1 + 3004c80: 06a2 slli a3,a3,0x8 + 3004c82: eff7f793 andi a5,a5,-257 + 3004c86: 8fd5 or a5,a5,a3 + 3004c88: c31c sw a5,0(a4) + iocmgRegx->BIT.pd = pullMode & 0x01; /* 01b: pull down mode */ + 3004c8a: fe842783 lw a5,-24(s0) + 3004c8e: 8b85 andi a5,a5,1 + 3004c90: 0ff7f693 andi a3,a5,255 + 3004c94: fec42703 lw a4,-20(s0) + 3004c98: 431c lw a5,0(a4) + 3004c9a: 8a85 andi a3,a3,1 + 3004c9c: 069e slli a3,a3,0x7 + 3004c9e: f7f7f793 andi a5,a5,-129 + 3004ca2: 8fd5 or a5,a5,a3 + 3004ca4: c31c sw a5,0(a4) +} + 3004ca6: 40f2 lw ra,28(sp) + 3004ca8: 4462 lw s0,24(sp) + 3004caa: 6105 addi sp,sp,32 + 3004cac: 8082 ret + +03004cae : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param levelShiftRate value of @ref IOCMG_LevelShiftRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetLevelShiftRate(IOCMG_REG *iocmgRegx, IOCMG_LevelShiftRate levelShiftRate) +{ + 3004cae: 1101 addi sp,sp,-32 + 3004cb0: ce06 sw ra,28(sp) + 3004cb2: cc22 sw s0,24(sp) + 3004cb4: 1000 addi s0,sp,32 + 3004cb6: fea42623 sw a0,-20(s0) + 3004cba: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004cbe: fec42703 lw a4,-20(s0) + 3004cc2: 77c1 lui a5,0xffff0 + 3004cc4: 8f7d and a4,a4,a5 + 3004cc6: 147f07b7 lui a5,0x147f0 + 3004cca: 00f70a63 beq a4,a5,3004cde + 3004cce: 0ed00593 li a1,237 + 3004cd2: 030067b7 lui a5,0x3006 + 3004cd6: 5cc78513 addi a0,a5,1484 # 30065cc + 3004cda: 2b79 jal ra,3005278 + 3004cdc: a001 j 3004cdc + IOCMG_PARAM_CHECK_NO_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX && levelShiftRate >= LEVEL_SHIFT_RATE_FAST); + 3004cde: fe842703 lw a4,-24(s0) + 3004ce2: 4785 li a5,1 + 3004ce4: 00e7fa63 bgeu a5,a4,3004cf8 + 3004ce8: 0ee00593 li a1,238 + 3004cec: 030067b7 lui a5,0x3006 + 3004cf0: 5cc78513 addi a0,a5,1484 # 30065cc + 3004cf4: 2351 jal ra,3005278 + 3004cf6: a839 j 3004d14 + iocmgRegx->BIT.sr = levelShiftRate; + 3004cf8: fe842783 lw a5,-24(s0) + 3004cfc: 8b85 andi a5,a5,1 + 3004cfe: 0ff7f693 andi a3,a5,255 + 3004d02: fec42703 lw a4,-20(s0) + 3004d06: 431c lw a5,0(a4) + 3004d08: 8a85 andi a3,a3,1 + 3004d0a: 06a6 slli a3,a3,0x9 + 3004d0c: dff7f793 andi a5,a5,-513 + 3004d10: 8fd5 or a5,a5,a3 + 3004d12: c31c sw a5,0(a4) +} + 3004d14: 40f2 lw ra,28(sp) + 3004d16: 4462 lw s0,24(sp) + 3004d18: 6105 addi sp,sp,32 + 3004d1a: 8082 ret + +03004d1c : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param schmidtMode value of @ref IOCMG_SchmidtMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetSchmidtMode(IOCMG_REG *iocmgRegx, IOCMG_SchmidtMode schmidtMode) +{ + 3004d1c: 1101 addi sp,sp,-32 + 3004d1e: ce06 sw ra,28(sp) + 3004d20: cc22 sw s0,24(sp) + 3004d22: 1000 addi s0,sp,32 + 3004d24: fea42623 sw a0,-20(s0) + 3004d28: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004d2c: fec42703 lw a4,-20(s0) + 3004d30: 77c1 lui a5,0xffff0 + 3004d32: 8f7d and a4,a4,a5 + 3004d34: 147f07b7 lui a5,0x147f0 + 3004d38: 00f70a63 beq a4,a5,3004d4c + 3004d3c: 10500593 li a1,261 + 3004d40: 030067b7 lui a5,0x3006 + 3004d44: 5cc78513 addi a0,a5,1484 # 30065cc + 3004d48: 2b05 jal ra,3005278 + 3004d4a: a001 j 3004d4a + IOCMG_PARAM_CHECK_NO_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE); + 3004d4c: fe842703 lw a4,-24(s0) + 3004d50: 4785 li a5,1 + 3004d52: 00e7fa63 bgeu a5,a4,3004d66 + 3004d56: 10600593 li a1,262 + 3004d5a: 030067b7 lui a5,0x3006 + 3004d5e: 5cc78513 addi a0,a5,1484 # 30065cc + 3004d62: 2b19 jal ra,3005278 + 3004d64: a839 j 3004d82 + iocmgRegx->BIT.se = schmidtMode; + 3004d66: fe842783 lw a5,-24(s0) + 3004d6a: 8b85 andi a5,a5,1 + 3004d6c: 0ff7f693 andi a3,a5,255 + 3004d70: fec42703 lw a4,-20(s0) + 3004d74: 431c lw a5,0(a4) + 3004d76: 8a85 andi a3,a3,1 + 3004d78: 06aa slli a3,a3,0xa + 3004d7a: bff7f793 andi a5,a5,-1025 + 3004d7e: 8fd5 or a5,a5,a3 + 3004d80: c31c sw a5,0(a4) +} + 3004d82: 40f2 lw ra,28(sp) + 3004d84: 4462 lw s0,24(sp) + 3004d86: 6105 addi sp,sp,32 + 3004d88: 8082 ret + +03004d8a : + * @brief Get pins iocmg reg address + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_REG iocmg reg address. + */ +static IOCMG_REG* IOCMG_GetRegAddr(unsigned int pinTypedef) +{ + 3004d8a: 7179 addi sp,sp,-48 + 3004d8c: d622 sw s0,44(sp) + 3004d8e: 1800 addi s0,sp,48 + 3004d90: fca42e23 sw a0,-36(s0) + /* decode pin's iocmg reg offset address in base address, and conver value to point address */ + unsigned int iocmgBaseAddrValue = (uintptr_t)IOCMG_BASE; + 3004d94: 147f07b7 lui a5,0x147f0 + 3004d98: fef42623 sw a5,-20(s0) + unsigned int iocmgRegOffsetAddrValue = (pinTypedef >> 16) & 0x00000FFF; /* 16 : shift 16 bit */ + 3004d9c: fdc42783 lw a5,-36(s0) + 3004da0: 0107d713 srli a4,a5,0x10 + 3004da4: 6785 lui a5,0x1 + 3004da6: 17fd addi a5,a5,-1 # fff + 3004da8: 8ff9 and a5,a5,a4 + 3004daa: fef42423 sw a5,-24(s0) + IOCMG_REG* iocmgRegxAddr = (IOCMG_REG*)(void*)(iocmgBaseAddrValue + iocmgRegOffsetAddrValue); + 3004dae: fec42703 lw a4,-20(s0) + 3004db2: fe842783 lw a5,-24(s0) + 3004db6: 97ba add a5,a5,a4 + 3004db8: fef42223 sw a5,-28(s0) + if (!IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegxAddr & IOCMG_BASE_ADDR_MASK))) { + 3004dbc: fe442703 lw a4,-28(s0) + 3004dc0: 77c1 lui a5,0xffff0 + 3004dc2: 8f7d and a4,a4,a5 + 3004dc4: 147f07b7 lui a5,0x147f0 + 3004dc8: 00f70463 beq a4,a5,3004dd0 + return NULL; + 3004dcc: 4781 li a5,0 + 3004dce: a019 j 3004dd4 + } + return iocmgRegxAddr; + 3004dd0: fe442783 lw a5,-28(s0) +} + 3004dd4: 853e mv a0,a5 + 3004dd6: 5432 lw s0,44(sp) + 3004dd8: 6145 addi sp,sp,48 + 3004dda: 8082 ret + +03004ddc : + * @brief Set pins as function mode + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinAltFuncMode(unsigned int pinTypedef) +{ + 3004ddc: 7179 addi sp,sp,-48 + 3004dde: d606 sw ra,44(sp) + 3004de0: d422 sw s0,40(sp) + 3004de2: 1800 addi s0,sp,48 + 3004de4: fca42e23 sw a0,-36(s0) + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004de8: fdc42503 lw a0,-36(s0) + 3004dec: 3f79 jal ra,3004d8a + 3004dee: fea42623 sw a0,-20(s0) + /* get iocmg reg default value */ + unsigned int regValue = pinTypedef & IOCMG_REG_VALUE_MASK; + 3004df2: fdc42703 lw a4,-36(s0) + 3004df6: 67c1 lui a5,0x10 + 3004df8: 17fd addi a5,a5,-1 # ffff + 3004dfa: 8ff9 and a5,a5,a4 + 3004dfc: fef42423 sw a5,-24(s0) + DCL_IOCMG_SetRegValue(iocmgRegx, regValue); + 3004e00: fe842583 lw a1,-24(s0) + 3004e04: fec42503 lw a0,-20(s0) + 3004e08: 33a5 jal ra,3004b70 + return IOCMG_STATUS_OK; + 3004e0a: 4781 li a5,0 +} + 3004e0c: 853e mv a0,a5 + 3004e0e: 50b2 lw ra,44(sp) + 3004e10: 5422 lw s0,40(sp) + 3004e12: 6145 addi sp,sp,48 + 3004e14: 8082 ret + +03004e16 : + * @param pinTypedef the pin type defined in iomap.h + * @param pullMode function define as @ref IOCMG_PullMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinPullMode(unsigned int pinTypedef, IOCMG_PullMode pullMode) +{ + 3004e16: 7179 addi sp,sp,-48 + 3004e18: d606 sw ra,44(sp) + 3004e1a: d422 sw s0,40(sp) + 3004e1c: 1800 addi s0,sp,48 + 3004e1e: fca42e23 sw a0,-36(s0) + 3004e22: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE, IOCMG_PARAM_ERROR); + 3004e26: fd842703 lw a4,-40(s0) + 3004e2a: 478d li a5,3 + 3004e2c: 00e7fb63 bgeu a5,a4,3004e42 + 3004e30: 07800593 li a1,120 + 3004e34: 030067b7 lui a5,0x3006 + 3004e38: 5ec78513 addi a0,a5,1516 # 30065ec + 3004e3c: 2935 jal ra,3005278 + 3004e3e: 4791 li a5,4 + 3004e40: a821 j 3004e58 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004e42: fdc42503 lw a0,-36(s0) + 3004e46: 3791 jal ra,3004d8a + 3004e48: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetPullMode(iocmgRegx, pullMode); + 3004e4c: fd842583 lw a1,-40(s0) + 3004e50: fec42503 lw a0,-20(s0) + 3004e54: 33f9 jal ra,3004c22 + return IOCMG_STATUS_OK; + 3004e56: 4781 li a5,0 +} + 3004e58: 853e mv a0,a5 + 3004e5a: 50b2 lw ra,44(sp) + 3004e5c: 5422 lw s0,40(sp) + 3004e5e: 6145 addi sp,sp,48 + 3004e60: 8082 ret + +03004e62 : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinSchmidtMode(unsigned int pinTypedef, IOCMG_SchmidtMode schmidtMode) +{ + 3004e62: 7179 addi sp,sp,-48 + 3004e64: d606 sw ra,44(sp) + 3004e66: d422 sw s0,40(sp) + 3004e68: 1800 addi s0,sp,48 + 3004e6a: fca42e23 sw a0,-36(s0) + 3004e6e: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE, IOCMG_PARAM_ERROR); + 3004e72: fd842703 lw a4,-40(s0) + 3004e76: 4785 li a5,1 + 3004e78: 00e7fb63 bgeu a5,a4,3004e8e + 3004e7c: 09300593 li a1,147 + 3004e80: 030067b7 lui a5,0x3006 + 3004e84: 5ec78513 addi a0,a5,1516 # 30065ec + 3004e88: 2ec5 jal ra,3005278 + 3004e8a: 4791 li a5,4 + 3004e8c: a821 j 3004ea4 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004e8e: fdc42503 lw a0,-36(s0) + 3004e92: 3de5 jal ra,3004d8a + 3004e94: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetSchmidtMode(iocmgRegx, schmidtMode); + 3004e98: fd842583 lw a1,-40(s0) + 3004e9c: fec42503 lw a0,-20(s0) + 3004ea0: 3db5 jal ra,3004d1c + return IOCMG_STATUS_OK; + 3004ea2: 4781 li a5,0 +} + 3004ea4: 853e mv a0,a5 + 3004ea6: 50b2 lw ra,44(sp) + 3004ea8: 5422 lw s0,40(sp) + 3004eaa: 6145 addi sp,sp,48 + 3004eac: 8082 ret + +03004eae : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinLevelShiftRate(unsigned int pinTypedef, IOCMG_LevelShiftRate levelShiftRate) +{ + 3004eae: 7179 addi sp,sp,-48 + 3004eb0: d606 sw ra,44(sp) + 3004eb2: d422 sw s0,40(sp) + 3004eb4: 1800 addi s0,sp,48 + 3004eb6: fca42e23 sw a0,-36(s0) + 3004eba: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX, IOCMG_PARAM_ERROR); + 3004ebe: fd842703 lw a4,-40(s0) + 3004ec2: 4785 li a5,1 + 3004ec4: 00e7fb63 bgeu a5,a4,3004eda + 3004ec8: 0ae00593 li a1,174 + 3004ecc: 030067b7 lui a5,0x3006 + 3004ed0: 5ec78513 addi a0,a5,1516 # 30065ec + 3004ed4: 2655 jal ra,3005278 + 3004ed6: 4791 li a5,4 + 3004ed8: a821 j 3004ef0 + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate >= LEVEL_SHIFT_RATE_FAST, IOCMG_PARAM_ERROR); + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004eda: fdc42503 lw a0,-36(s0) + 3004ede: 3575 jal ra,3004d8a + 3004ee0: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetLevelShiftRate(iocmgRegx, levelShiftRate); + 3004ee4: fd842583 lw a1,-40(s0) + 3004ee8: fec42503 lw a0,-20(s0) + 3004eec: 33c9 jal ra,3004cae + return IOCMG_STATUS_OK; + 3004eee: 4781 li a5,0 +} + 3004ef0: 853e mv a0,a5 + 3004ef2: 50b2 lw ra,44(sp) + 3004ef4: 5422 lw s0,40(sp) + 3004ef6: 6145 addi sp,sp,48 + 3004ef8: 8082 ret + +03004efa : + * @param pinTypedef the pin type defined in iomap.h + * @param driveRate function define as @ref IOCMG_DriveRate + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinDriveRate(unsigned int pinTypedef, IOCMG_DriveRate driveRate) +{ + 3004efa: 7179 addi sp,sp,-48 + 3004efc: d606 sw ra,44(sp) + 3004efe: d422 sw s0,40(sp) + 3004f00: 1800 addi s0,sp,48 + 3004f02: fca42e23 sw a0,-36(s0) + 3004f06: fcb42c23 sw a1,-40(s0) + /* get iocmg reg address */ + IOCMG_PARAM_CHECK_WITH_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4, IOCMG_PARAM_ERROR); + 3004f0a: fd842703 lw a4,-40(s0) + 3004f0e: 478d li a5,3 + 3004f10: 00e7fb63 bgeu a5,a4,3004f26 + 3004f14: 0cb00593 li a1,203 + 3004f18: 030067b7 lui a5,0x3006 + 3004f1c: 5ec78513 addi a0,a5,1516 # 30065ec + 3004f20: 2ea1 jal ra,3005278 + 3004f22: 4791 li a5,4 + 3004f24: a821 j 3004f3c + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004f26: fdc42503 lw a0,-36(s0) + 3004f2a: 3585 jal ra,3004d8a + 3004f2c: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetDriveRate(iocmgRegx, driveRate); + 3004f30: fd842583 lw a1,-40(s0) + 3004f34: fec42503 lw a0,-20(s0) + 3004f38: 39b5 jal ra,3004bb4 + return IOCMG_STATUS_OK; + 3004f3a: 4781 li a5,0 +} + 3004f3c: 853e mv a0,a5 + 3004f3e: 50b2 lw ra,44(sp) + 3004f40: 5422 lw s0,40(sp) + 3004f42: 6145 addi sp,sp,48 + 3004f44: 8082 ret + +03004f46 : + * @param mode Timer Mode, @ref TIMER_Mode + * @retval true + * @retval false + */ +static inline bool IsTimerMode(TIMER_Mode mode) +{ + 3004f46: 1101 addi sp,sp,-32 + 3004f48: ce22 sw s0,28(sp) + 3004f4a: 1000 addi s0,sp,32 + 3004f4c: fea42623 sw a0,-20(s0) + return (((mode) == TIMER_MODE_RUN_FREE) || + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3004f50: fec42783 lw a5,-20(s0) + 3004f54: cb99 beqz a5,3004f6a + return (((mode) == TIMER_MODE_RUN_FREE) || + 3004f56: fec42703 lw a4,-20(s0) + 3004f5a: 4785 li a5,1 + 3004f5c: 00f70763 beq a4,a5,3004f6a + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3004f60: fec42703 lw a4,-20(s0) + 3004f64: 4789 li a5,2 + 3004f66: 00f71463 bne a4,a5,3004f6e + 3004f6a: 4785 li a5,1 + 3004f6c: a011 j 3004f70 + 3004f6e: 4781 li a5,0 + 3004f70: 8b85 andi a5,a5,1 + 3004f72: 9f81 uxtb a5 + ((mode) == TIMER_MODE_RUN_ONTSHOT)); +} + 3004f74: 853e mv a0,a5 + 3004f76: 4472 lw s0,28(sp) + 3004f78: 6105 addi sp,sp,32 + 3004f7a: 8082 ret + +03004f7c : + * @param mode Timer Interrupt Type, @ref TIMER_InterruptType + * @retval true + * @retval false + */ +static inline bool IsTimerInterruptType(TIMER_InterruptType interruptType) +{ + 3004f7c: 1101 addi sp,sp,-32 + 3004f7e: ce22 sw s0,28(sp) + 3004f80: 1000 addi s0,sp,32 + 3004f82: fea42623 sw a0,-20(s0) + return (((interruptType) == TIMER_PERIOD_FIN) || + 3004f86: fec42783 lw a5,-20(s0) + 3004f8a: c791 beqz a5,3004f96 + 3004f8c: fec42703 lw a4,-20(s0) + 3004f90: 4785 li a5,1 + 3004f92: 00f71463 bne a4,a5,3004f9a + 3004f96: 4785 li a5,1 + 3004f98: a011 j 3004f9c + 3004f9a: 4781 li a5,0 + 3004f9c: 8b85 andi a5,a5,1 + 3004f9e: 9f81 uxtb a5 + ((interruptType) == TIMER_OVER_FLOW)); +} + 3004fa0: 853e mv a0,a5 + 3004fa2: 4472 lw s0,28(sp) + 3004fa4: 6105 addi sp,sp,32 + 3004fa6: 8082 ret + +03004fa8 : + * @param size Timer Size, @ref TIMER_Size + * @retval true + * @retval false + */ +static inline bool IsTimerSize(TIMER_Size size) +{ + 3004fa8: 1101 addi sp,sp,-32 + 3004faa: ce22 sw s0,28(sp) + 3004fac: 1000 addi s0,sp,32 + 3004fae: fea42623 sw a0,-20(s0) + return (((size) == TIMER_SIZE_16BIT) || + 3004fb2: fec42783 lw a5,-20(s0) + 3004fb6: c791 beqz a5,3004fc2 + 3004fb8: fec42703 lw a4,-20(s0) + 3004fbc: 4785 li a5,1 + 3004fbe: 00f71463 bne a4,a5,3004fc6 + 3004fc2: 4785 li a5,1 + 3004fc4: a011 j 3004fc8 + 3004fc6: 4781 li a5,0 + 3004fc8: 8b85 andi a5,a5,1 + 3004fca: 9f81 uxtb a5 + ((size) == TIMER_SIZE_32BIT)); +} + 3004fcc: 853e mv a0,a5 + 3004fce: 4472 lw s0,28(sp) + 3004fd0: 6105 addi sp,sp,32 + 3004fd2: 8082 ret + +03004fd4 : + * @param period + * @retval true + * @retval false + */ +static inline bool IsTimerPeriod(unsigned int period) +{ + 3004fd4: 1101 addi sp,sp,-32 + 3004fd6: ce22 sw s0,28(sp) + 3004fd8: 1000 addi s0,sp,32 + 3004fda: fea42623 sw a0,-20(s0) + return ((period) >= PERIOD_MIN_VALUE); + 3004fde: fec42783 lw a5,-20(s0) + 3004fe2: 00f037b3 snez a5,a5 + 3004fe6: 9f81 uxtb a5 +} + 3004fe8: 853e mv a0,a5 + 3004fea: 4472 lw s0,28(sp) + 3004fec: 6105 addi sp,sp,32 + 3004fee: 8082 ret + +03004ff0 : + * @param div @see TIMER_PrescalerFactor + * @retval true + * @retval false + */ +static inline bool IsTimerDiv(TIMER_PrescalerFactor div) +{ + 3004ff0: 1101 addi sp,sp,-32 + 3004ff2: ce22 sw s0,28(sp) + 3004ff4: 1000 addi s0,sp,32 + 3004ff6: fea42623 sw a0,-20(s0) + return (((div) == TIMERPRESCALER_NO_DIV) || + ((div) == TIMERPRESCALER_DIV_16) || + 3004ffa: fec42783 lw a5,-20(s0) + 3004ffe: cb99 beqz a5,3005014 + return (((div) == TIMERPRESCALER_NO_DIV) || + 3005000: fec42703 lw a4,-20(s0) + 3005004: 4785 li a5,1 + 3005006: 00f70763 beq a4,a5,3005014 + ((div) == TIMERPRESCALER_DIV_16) || + 300500a: fec42703 lw a4,-20(s0) + 300500e: 4789 li a5,2 + 3005010: 00f71463 bne a4,a5,3005018 + 3005014: 4785 li a5,1 + 3005016: a011 j 300501a + 3005018: 4781 li a5,0 + 300501a: 8b85 andi a5,a5,1 + 300501c: 9f81 uxtb a5 + ((div) == TIMERPRESCALER_DIV_256)); +} + 300501e: 853e mv a0,a5 + 3005020: 4472 lw s0,28(sp) + 3005022: 6105 addi sp,sp,32 + 3005024: 8082 ret + +03005026 : + * @param handle Timer Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR parameter check fail + */ +BASE_StatusType HAL_TIMER_Init(TIMER_Handle *handle) +{ + 3005026: 1101 addi sp,sp,-32 + 3005028: ce06 sw ra,28(sp) + 300502a: cc22 sw s0,24(sp) + 300502c: 1000 addi s0,sp,32 + 300502e: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005032: fec42783 lw a5,-20(s0) + 3005036: eb89 bnez a5,3005048 + 3005038: 02800593 li a1,40 + 300503c: 030067b7 lui a5,0x3006 + 3005040: 62c78513 addi a0,a5,1580 # 300662c + 3005044: 2c15 jal ra,3005278 + 3005046: a001 j 3005046 + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 3005048: fec42783 lw a5,-20(s0) + 300504c: 4398 lw a4,0(a5) + 300504e: 143007b7 lui a5,0x14300 + 3005052: 02f70f63 beq a4,a5,3005090 + 3005056: fec42783 lw a5,-20(s0) + 300505a: 4398 lw a4,0(a5) + 300505c: 143017b7 lui a5,0x14301 + 3005060: 02f70863 beq a4,a5,3005090 + 3005064: fec42783 lw a5,-20(s0) + 3005068: 4398 lw a4,0(a5) + 300506a: 143027b7 lui a5,0x14302 + 300506e: 02f70163 beq a4,a5,3005090 + 3005072: fec42783 lw a5,-20(s0) + 3005076: 4398 lw a4,0(a5) + 3005078: 143037b7 lui a5,0x14303 + 300507c: 00f70a63 beq a4,a5,3005090 + 3005080: 02900593 li a1,41 + 3005084: 030067b7 lui a5,0x3006 + 3005088: 62c78513 addi a0,a5,1580 # 300662c + 300508c: 22f5 jal ra,3005278 + 300508e: a001 j 300508e + + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->load), BASE_STATUS_ERROR); + 3005090: fec42783 lw a5,-20(s0) + 3005094: 4bdc lw a5,20(a5) + 3005096: 853e mv a0,a5 + 3005098: 3f35 jal ra,3004fd4 + 300509a: 87aa mv a5,a0 + 300509c: 0017c793 xori a5,a5,1 + 30050a0: 9f81 uxtb a5 + 30050a2: cb91 beqz a5,30050b6 + 30050a4: 02b00593 li a1,43 + 30050a8: 030067b7 lui a5,0x3006 + 30050ac: 62c78513 addi a0,a5,1580 # 300662c + 30050b0: 22e1 jal ra,3005278 + 30050b2: 4785 li a5,1 + 30050b4: aa6d j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->bgLoad), BASE_STATUS_ERROR); + 30050b6: fec42783 lw a5,-20(s0) + 30050ba: 4f9c lw a5,24(a5) + 30050bc: 853e mv a0,a5 + 30050be: 3f19 jal ra,3004fd4 + 30050c0: 87aa mv a5,a0 + 30050c2: 0017c793 xori a5,a5,1 + 30050c6: 9f81 uxtb a5 + 30050c8: cb91 beqz a5,30050dc + 30050ca: 02c00593 li a1,44 + 30050ce: 030067b7 lui a5,0x3006 + 30050d2: 62c78513 addi a0,a5,1580 # 300662c + 30050d6: 224d jal ra,3005278 + 30050d8: 4785 li a5,1 + 30050da: aa51 j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerMode(handle->mode), BASE_STATUS_ERROR); + 30050dc: fec42783 lw a5,-20(s0) + 30050e0: 479c lw a5,8(a5) + 30050e2: 853e mv a0,a5 + 30050e4: 358d jal ra,3004f46 + 30050e6: 87aa mv a5,a0 + 30050e8: 0017c793 xori a5,a5,1 + 30050ec: 9f81 uxtb a5 + 30050ee: cb91 beqz a5,3005102 + 30050f0: 02d00593 li a1,45 + 30050f4: 030067b7 lui a5,0x3006 + 30050f8: 62c78513 addi a0,a5,1580 # 300662c + 30050fc: 2ab5 jal ra,3005278 + 30050fe: 4785 li a5,1 + 3005100: a2bd j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerSize(handle->size), BASE_STATUS_ERROR); + 3005102: fec42783 lw a5,-20(s0) + 3005106: 4b9c lw a5,16(a5) + 3005108: 853e mv a0,a5 + 300510a: 3d79 jal ra,3004fa8 + 300510c: 87aa mv a5,a0 + 300510e: 0017c793 xori a5,a5,1 + 3005112: 9f81 uxtb a5 + 3005114: cb91 beqz a5,3005128 + 3005116: 02e00593 li a1,46 + 300511a: 030067b7 lui a5,0x3006 + 300511e: 62c78513 addi a0,a5,1580 # 300662c + 3005122: 2a99 jal ra,3005278 + 3005124: 4785 li a5,1 + 3005126: a2a1 j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerDiv(handle->prescaler), BASE_STATUS_ERROR); + 3005128: fec42783 lw a5,-20(s0) + 300512c: 47dc lw a5,12(a5) + 300512e: 853e mv a0,a5 + 3005130: 35c1 jal ra,3004ff0 + 3005132: 87aa mv a5,a0 + 3005134: 0017c793 xori a5,a5,1 + 3005138: 9f81 uxtb a5 + 300513a: cb91 beqz a5,300514e + 300513c: 02f00593 li a1,47 + 3005140: 030067b7 lui a5,0x3006 + 3005144: 62c78513 addi a0,a5,1580 # 300662c + 3005148: 2a05 jal ra,3005278 + 300514a: 4785 li a5,1 + 300514c: a20d j 300526e + + /* Initialize the configuration parameters of the timer */ + handle->baseAddress->timer_intclr = BASE_CFG_SET; /* Writing to this register clears interrupt output of timer */ + 300514e: fec42783 lw a5,-20(s0) + 3005152: 439c lw a5,0(a5) + 3005154: 4705 li a4,1 + 3005156: c7d8 sw a4,12(a5) + handle->baseAddress->timer_load = handle->load; + 3005158: fec42783 lw a5,-20(s0) + 300515c: 439c lw a5,0(a5) + 300515e: fec42703 lw a4,-20(s0) + 3005162: 4b58 lw a4,20(a4) + 3005164: c398 sw a4,0(a5) + handle->baseAddress->timerbgload = handle->bgLoad; + 3005166: fec42783 lw a5,-20(s0) + 300516a: 439c lw a5,0(a5) + 300516c: fec42703 lw a4,-20(s0) + 3005170: 4f18 lw a4,24(a4) + 3005172: cf98 sw a4,24(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_DISABLE; + 3005174: fec42783 lw a5,-20(s0) + 3005178: 4398 lw a4,0(a5) + 300517a: 471c lw a5,8(a4) + 300517c: f7f7f793 andi a5,a5,-129 + 3005180: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timerintenable = handle->interruptEn; + 3005182: fec42783 lw a5,-20(s0) + 3005186: 4398 lw a4,0(a5) + 3005188: fec42783 lw a5,-20(s0) + 300518c: 2fd4 lbu a3,28(a5) + 300518e: 471c lw a5,8(a4) + 3005190: 8a85 andi a3,a3,1 + 3005192: 0696 slli a3,a3,0x5 + 3005194: fdf7f793 andi a5,a5,-33 + 3005198: 8fd5 or a5,a5,a3 + 300519a: c71c sw a5,8(a4) + + /* Sets the frequency divider and size of the timer module. */ + handle->baseAddress->TIMERx_CONTROL.BIT.timerpre = handle->prescaler; + 300519c: fec42783 lw a5,-20(s0) + 30051a0: 47d4 lw a3,12(a5) + 30051a2: fec42783 lw a5,-20(s0) + 30051a6: 4398 lw a4,0(a5) + 30051a8: 87b6 mv a5,a3 + 30051aa: 8b8d andi a5,a5,3 + 30051ac: 0ff7f693 andi a3,a5,255 + 30051b0: 471c lw a5,8(a4) + 30051b2: 8a8d andi a3,a3,3 + 30051b4: 068a slli a3,a3,0x2 + 30051b6: 9bcd andi a5,a5,-13 + 30051b8: 8fd5 or a5,a5,a3 + 30051ba: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timersize = handle->size; + 30051bc: fec42783 lw a5,-20(s0) + 30051c0: 4b94 lw a3,16(a5) + 30051c2: fec42783 lw a5,-20(s0) + 30051c6: 4398 lw a4,0(a5) + 30051c8: 87b6 mv a5,a3 + 30051ca: 8b85 andi a5,a5,1 + 30051cc: 0ff7f693 andi a3,a5,255 + 30051d0: 471c lw a5,8(a4) + 30051d2: 8a85 andi a3,a3,1 + 30051d4: 0686 slli a3,a3,0x1 + 30051d6: 9bf5 andi a5,a5,-3 + 30051d8: 8fd5 or a5,a5,a3 + 30051da: c71c sw a5,8(a4) + + /* Sets the running mode of the timer. */ + if (handle->mode == TIMER_MODE_RUN_ONTSHOT) { + 30051dc: fec42783 lw a5,-20(s0) + 30051e0: 4798 lw a4,8(a5) + 30051e2: 4789 li a5,2 + 30051e4: 00f71a63 bne a4,a5,30051f8 + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_SET; + 30051e8: fec42783 lw a5,-20(s0) + 30051ec: 4398 lw a4,0(a5) + 30051ee: 471c lw a5,8(a4) + 30051f0: 0017e793 ori a5,a5,1 + 30051f4: c71c sw a5,8(a4) + 30051f6: a805 j 3005226 + } else { + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_UNSET; + 30051f8: fec42783 lw a5,-20(s0) + 30051fc: 4398 lw a4,0(a5) + 30051fe: 471c lw a5,8(a4) + 3005200: 9bf9 andi a5,a5,-2 + 3005202: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005204: fec42783 lw a5,-20(s0) + 3005208: 479c lw a5,8(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 300520a: fec42703 lw a4,-20(s0) + 300520e: 4318 lw a4,0(a4) + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005210: 00f037b3 snez a5,a5 + 3005214: 0ff7f693 andi a3,a5,255 + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005218: 471c lw a5,8(a4) + 300521a: 8a85 andi a3,a3,1 + 300521c: 069a slli a3,a3,0x6 + 300521e: fbf7f793 andi a5,a5,-65 + 3005222: 8fd5 or a5,a5,a3 + 3005224: c71c sw a5,8(a4) + } + + /* Request for setting the DMA and ADC. */ + handle->baseAddress->TIMERx_CONTROLB.BIT.dmasreqen = handle->dmaReqEnable; + 3005226: fec42783 lw a5,-20(s0) + 300522a: 4398 lw a4,0(a5) + 300522c: fec42783 lw a5,-20(s0) + 3005230: 2ff4 lbu a3,30(a5) + 3005232: 4f5c lw a5,28(a4) + 3005234: 8a85 andi a3,a3,1 + 3005236: 0686 slli a3,a3,0x1 + 3005238: 9bf5 andi a5,a5,-3 + 300523a: 8fd5 or a5,a5,a3 + 300523c: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.dmabreqen = handle->dmaReqEnable; + 300523e: fec42783 lw a5,-20(s0) + 3005242: 4398 lw a4,0(a5) + 3005244: fec42783 lw a5,-20(s0) + 3005248: 2ff4 lbu a3,30(a5) + 300524a: 4f5c lw a5,28(a4) + 300524c: 8a85 andi a3,a3,1 + 300524e: 9bf9 andi a5,a5,-2 + 3005250: 8fd5 or a5,a5,a3 + 3005252: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.socen = handle->adcSocReqEnable; + 3005254: fec42783 lw a5,-20(s0) + 3005258: 4398 lw a4,0(a5) + 300525a: fec42783 lw a5,-20(s0) + 300525e: 3fd4 lbu a3,29(a5) + 3005260: 4f5c lw a5,28(a4) + 3005262: 8a85 andi a3,a3,1 + 3005264: 068a slli a3,a3,0x2 + 3005266: 9bed andi a5,a5,-5 + 3005268: 8fd5 or a5,a5,a3 + 300526a: cf5c sw a5,28(a4) + return BASE_STATUS_OK; + 300526c: 4781 li a5,0 +} + 300526e: 853e mv a0,a5 + 3005270: 40f2 lw ra,28(sp) + 3005272: 4462 lw s0,24(sp) + 3005274: 6105 addi sp,sp,32 + 3005276: 8082 ret + +03005278 : + 3005278: c37fc06f j 3001eae + +0300527c : + * @brief Start timer. + * @param handle Timer Handle + * @retval None + */ +void HAL_TIMER_Start(TIMER_Handle *handle) +{ + 300527c: 1101 addi sp,sp,-32 + 300527e: ce06 sw ra,28(sp) + 3005280: cc22 sw s0,24(sp) + 3005282: 1000 addi s0,sp,32 + 3005284: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005288: fec42783 lw a5,-20(s0) + 300528c: eb89 bnez a5,300529e + 300528e: 0bc00593 li a1,188 + 3005292: 030067b7 lui a5,0x3006 + 3005296: 62c78513 addi a0,a5,1580 # 300662c + 300529a: 3ff9 jal ra,3005278 + 300529c: a001 j 300529c + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 300529e: fec42783 lw a5,-20(s0) + 30052a2: 4398 lw a4,0(a5) + 30052a4: 143007b7 lui a5,0x14300 + 30052a8: 02f70f63 beq a4,a5,30052e6 + 30052ac: fec42783 lw a5,-20(s0) + 30052b0: 4398 lw a4,0(a5) + 30052b2: 143017b7 lui a5,0x14301 + 30052b6: 02f70863 beq a4,a5,30052e6 + 30052ba: fec42783 lw a5,-20(s0) + 30052be: 4398 lw a4,0(a5) + 30052c0: 143027b7 lui a5,0x14302 + 30052c4: 02f70163 beq a4,a5,30052e6 + 30052c8: fec42783 lw a5,-20(s0) + 30052cc: 4398 lw a4,0(a5) + 30052ce: 143037b7 lui a5,0x14303 + 30052d2: 00f70a63 beq a4,a5,30052e6 + 30052d6: 0bd00593 li a1,189 + 30052da: 030067b7 lui a5,0x3006 + 30052de: 62c78513 addi a0,a5,1580 # 300662c + 30052e2: 3f59 jal ra,3005278 + 30052e4: a001 j 30052e4 + /* Enable timer */ + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_SET; + 30052e6: fec42783 lw a5,-20(s0) + 30052ea: 4398 lw a4,0(a5) + 30052ec: 471c lw a5,8(a4) + 30052ee: 0807e793 ori a5,a5,128 + 30052f2: c71c sw a5,8(a4) +} + 30052f4: 0001 nop + 30052f6: 40f2 lw ra,28(sp) + 30052f8: 4462 lw s0,24(sp) + 30052fa: 6105 addi sp,sp,32 + 30052fc: 8082 ret + +030052fe : + * @brief GPT Interrupt service processing function. + * @param handle TIMER Handle + * @retval None + */ +void HAL_TIMER_IrqHandler(void *handle) +{ + 30052fe: 7179 addi sp,sp,-48 + 3005300: d606 sw ra,44(sp) + 3005302: d422 sw s0,40(sp) + 3005304: 1800 addi s0,sp,48 + 3005306: fca42e23 sw a0,-36(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 300530a: fdc42783 lw a5,-36(s0) + 300530e: eb89 bnez a5,3005320 + 3005310: 0d800593 li a1,216 + 3005314: 030067b7 lui a5,0x3006 + 3005318: 62c78513 addi a0,a5,1580 # 300662c + 300531c: 3fb1 jal ra,3005278 + 300531e: a001 j 300531e + TIMER_Handle *timerHandle = (TIMER_Handle *)handle; + 3005320: fdc42783 lw a5,-36(s0) + 3005324: fef42623 sw a5,-20(s0) + TIMER_ASSERT_PARAM(IsTIMERInstance(timerHandle->baseAddress)); + 3005328: fec42783 lw a5,-20(s0) + 300532c: 4398 lw a4,0(a5) + 300532e: 143007b7 lui a5,0x14300 + 3005332: 02f70f63 beq a4,a5,3005370 + 3005336: fec42783 lw a5,-20(s0) + 300533a: 4398 lw a4,0(a5) + 300533c: 143017b7 lui a5,0x14301 + 3005340: 02f70863 beq a4,a5,3005370 + 3005344: fec42783 lw a5,-20(s0) + 3005348: 4398 lw a4,0(a5) + 300534a: 143027b7 lui a5,0x14302 + 300534e: 02f70163 beq a4,a5,3005370 + 3005352: fec42783 lw a5,-20(s0) + 3005356: 4398 lw a4,0(a5) + 3005358: 143037b7 lui a5,0x14303 + 300535c: 00f70a63 beq a4,a5,3005370 + 3005360: 0da00593 li a1,218 + 3005364: 030067b7 lui a5,0x3006 + 3005368: 62c78513 addi a0,a5,1580 # 300662c + 300536c: 3731 jal ra,3005278 + 300536e: a001 j 300536e + /* Check interrupt type */ + if (timerHandle->baseAddress->TIMERx_MIS.dmaovmis == BASE_CFG_ENABLE) { + 3005370: fec42783 lw a5,-20(s0) + 3005374: 439c lw a5,0(a5) + 3005376: 4bdc lw a5,20(a5) + 3005378: 8385 srli a5,a5,0x1 + 300537a: 8b85 andi a5,a5,1 + 300537c: 0ff7f713 andi a4,a5,255 + 3005380: 4785 li a5,1 + 3005382: 02f71363 bne a4,a5,30053a8 + /* DMA overflow interrupt */ + timerHandle->baseAddress->DMAOV_INTCLR.BIT.dmaov_intclr = BASE_CFG_ENABLE; + 3005386: fec42783 lw a5,-20(s0) + 300538a: 4398 lw a4,0(a5) + 300538c: 531c lw a5,32(a4) + 300538e: 0017e793 ori a5,a5,1 + 3005392: d31c sw a5,32(a4) + /* Call the timer DMA request overflow callback function of the user. */ + if (timerHandle->userCallBack.TimerOverFlowCallBack != NULL) { + 3005394: fec42783 lw a5,-20(s0) + 3005398: 53dc lw a5,36(a5) + 300539a: c799 beqz a5,30053a8 + timerHandle->userCallBack.TimerOverFlowCallBack(timerHandle); + 300539c: fec42783 lw a5,-20(s0) + 30053a0: 53dc lw a5,36(a5) + 30053a2: fec42503 lw a0,-20(s0) + 30053a6: 9782 jalr a5 + } + } + if (timerHandle->baseAddress->TIMERx_MIS.timermis == BASE_CFG_ENABLE) { + 30053a8: fec42783 lw a5,-20(s0) + 30053ac: 439c lw a5,0(a5) + 30053ae: 4bdc lw a5,20(a5) + 30053b0: 8b85 andi a5,a5,1 + 30053b2: 0ff7f713 andi a4,a5,255 + 30053b6: 4785 li a5,1 + 30053b8: 02f71263 bne a4,a5,30053dc + /* TIMER Interrupt */ + timerHandle->baseAddress->timer_intclr = BASE_CFG_ENABLE; + 30053bc: fec42783 lw a5,-20(s0) + 30053c0: 439c lw a5,0(a5) + 30053c2: 4705 li a4,1 + 30053c4: c7d8 sw a4,12(a5) + /* Call the period finish callback function of the user. */ + if (timerHandle->userCallBack.TimerPeriodFinCallBack != NULL) { + 30053c6: fec42783 lw a5,-20(s0) + 30053ca: 539c lw a5,32(a5) + 30053cc: cb81 beqz a5,30053dc + timerHandle->userCallBack.TimerPeriodFinCallBack(timerHandle); + 30053ce: fec42783 lw a5,-20(s0) + 30053d2: 539c lw a5,32(a5) + 30053d4: fec42503 lw a0,-20(s0) + 30053d8: 9782 jalr a5 + } + } + return; + 30053da: 0001 nop + 30053dc: 0001 nop +} + 30053de: 50b2 lw ra,44(sp) + 30053e0: 5422 lw s0,40(sp) + 30053e2: 6145 addi sp,sp,48 + 30053e4: 8082 ret + +030053e6 : + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_TIMER_RegisterCallback(TIMER_Handle *handle, TIMER_InterruptType typeID, + TIMER_CallBackFunc callBackFunc) +{ + 30053e6: 1101 addi sp,sp,-32 + 30053e8: ce06 sw ra,28(sp) + 30053ea: cc22 sw s0,24(sp) + 30053ec: 1000 addi s0,sp,32 + 30053ee: fea42623 sw a0,-20(s0) + 30053f2: feb42423 sw a1,-24(s0) + 30053f6: fec42223 sw a2,-28(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 30053fa: fec42783 lw a5,-20(s0) + 30053fe: eb89 bnez a5,3005410 + 3005400: 0fa00593 li a1,250 + 3005404: 030067b7 lui a5,0x3006 + 3005408: 62c78513 addi a0,a5,1580 # 300662c + 300540c: 35b5 jal ra,3005278 + 300540e: a001 j 300540e + TIMER_ASSERT_PARAM(callBackFunc != NULL); + 3005410: fe442783 lw a5,-28(s0) + 3005414: eb89 bnez a5,3005426 + 3005416: 0fb00593 li a1,251 + 300541a: 030067b7 lui a5,0x3006 + 300541e: 62c78513 addi a0,a5,1580 # 300662c + 3005422: 3d99 jal ra,3005278 + 3005424: a001 j 3005424 + TIMER_ASSERT_PARAM(IsTimerInterruptType(typeID)); + 3005426: fe842503 lw a0,-24(s0) + 300542a: 3e89 jal ra,3004f7c + 300542c: 87aa mv a5,a0 + 300542e: 0017c793 xori a5,a5,1 + 3005432: 9f81 uxtb a5 + 3005434: cb89 beqz a5,3005446 + 3005436: 0fc00593 li a1,252 + 300543a: 030067b7 lui a5,0x3006 + 300543e: 62c78513 addi a0,a5,1580 # 300662c + 3005442: 3d1d jal ra,3005278 + 3005444: a001 j 3005444 + + /* Registers the user callback function. */ + switch (typeID) { + 3005446: fe842783 lw a5,-24(s0) + 300544a: cb91 beqz a5,300545e + 300544c: 4705 li a4,1 + 300544e: 00e79e63 bne a5,a4,300546a + case TIMER_OVER_FLOW: + handle->userCallBack.TimerOverFlowCallBack = callBackFunc; /* User DMA request overflow function */ + 3005452: fec42783 lw a5,-20(s0) + 3005456: fe442703 lw a4,-28(s0) + 300545a: d3d8 sw a4,36(a5) + break; + 300545c: a809 j 300546e + case TIMER_PERIOD_FIN: + handle->userCallBack.TimerPeriodFinCallBack = callBackFunc; /* User timer period finish call back. */ + 300545e: fec42783 lw a5,-20(s0) + 3005462: fe442703 lw a4,-28(s0) + 3005466: d398 sw a4,32(a5) + break; + 3005468: a019 j 300546e + default: + return BASE_STATUS_ERROR; + 300546a: 4785 li a5,1 + 300546c: a011 j 3005470 + } + return BASE_STATUS_OK; + 300546e: 4781 li a5,0 +} + 3005470: 853e mv a0,a5 + 3005472: 40f2 lw ra,28(sp) + 3005474: 4462 lw s0,24(sp) + 3005476: 6105 addi sp,sp,32 + 3005478: 8082 ret + +0300547a : + * @brief Check UART datalength parameter. + * @param datalength The number of data bits in a frame, @ref UART_DataLength + * @retval bool + */ +static inline bool IsUartDatalength(UART_DataLength datalength) +{ + 300547a: 1101 addi sp,sp,-32 + 300547c: ce22 sw s0,28(sp) + 300547e: 1000 addi s0,sp,32 + 3005480: fea42623 sw a0,-20(s0) + return (datalength >= UART_DATALENGTH_5BIT) && (datalength <= UART_DATALENGTH_8BIT); + 3005484: fec42783 lw a5,-20(s0) + 3005488: 0047b793 sltiu a5,a5,4 + 300548c: 9f81 uxtb a5 +} + 300548e: 853e mv a0,a5 + 3005490: 4472 lw s0,28(sp) + 3005492: 6105 addi sp,sp,32 + 3005494: 8082 ret + +03005496 : + * @brief Check UART stopbits parameter. + * @param stopbits The number of stop bits in a frame, @ref UART_StopBits + * @retval bool + */ +static inline bool IsUartStopbits(UART_StopBits stopbits) +{ + 3005496: 1101 addi sp,sp,-32 + 3005498: ce22 sw s0,28(sp) + 300549a: 1000 addi s0,sp,32 + 300549c: fea42623 sw a0,-20(s0) + return (stopbits == UART_STOPBITS_ONE) || (stopbits == UART_STOPBITS_TWO); + 30054a0: fec42783 lw a5,-20(s0) + 30054a4: c791 beqz a5,30054b0 + 30054a6: fec42703 lw a4,-20(s0) + 30054aa: 4785 li a5,1 + 30054ac: 00f71463 bne a4,a5,30054b4 + 30054b0: 4785 li a5,1 + 30054b2: a011 j 30054b6 + 30054b4: 4781 li a5,0 + 30054b6: 8b85 andi a5,a5,1 + 30054b8: 9f81 uxtb a5 +} + 30054ba: 853e mv a0,a5 + 30054bc: 4472 lw s0,28(sp) + 30054be: 6105 addi sp,sp,32 + 30054c0: 8082 ret + +030054c2 : + * @brief Check UART paritymode parameter. + * @param paritymode UART parity check mode, @ref UART_Parity_Mode + * @retval bool + */ +static inline bool IsUartParitymode(UART_Parity_Mode paritymode) +{ + 30054c2: 1101 addi sp,sp,-32 + 30054c4: ce22 sw s0,28(sp) + 30054c6: 1000 addi s0,sp,32 + 30054c8: fea42623 sw a0,-20(s0) + if ((paritymode >= UART_PARITY_ODD) && (paritymode <= UART_PARITY_NONE)) { + 30054cc: fec42703 lw a4,-20(s0) + 30054d0: 4791 li a5,4 + 30054d2: 00e7e463 bltu a5,a4,30054da + return true; + 30054d6: 4785 li a5,1 + 30054d8: a011 j 30054dc + } + return false; + 30054da: 4781 li a5,0 +} + 30054dc: 853e mv a0,a5 + 30054de: 4472 lw s0,28(sp) + 30054e0: 6105 addi sp,sp,32 + 30054e2: 8082 ret + +030054e4 : + * @brief Check UART transmode parameter. + * @param transmode Transmit mode, @ref UART_Transmit_Mode + * @retval bool + */ +static inline bool IsUartTransmode(UART_Transmit_Mode transmode) +{ + 30054e4: 1101 addi sp,sp,-32 + 30054e6: ce22 sw s0,28(sp) + 30054e8: 1000 addi s0,sp,32 + 30054ea: fea42623 sw a0,-20(s0) + if ((transmode == UART_MODE_BLOCKING) || + 30054ee: fec42783 lw a5,-20(s0) + 30054f2: c385 beqz a5,3005512 + 30054f4: fec42703 lw a4,-20(s0) + 30054f8: 4785 li a5,1 + 30054fa: 00f70c63 beq a4,a5,3005512 + (transmode == UART_MODE_INTERRUPT) || + 30054fe: fec42703 lw a4,-20(s0) + 3005502: 4789 li a5,2 + 3005504: 00f70763 beq a4,a5,3005512 + (transmode == UART_MODE_DMA) || + 3005508: fec42703 lw a4,-20(s0) + 300550c: 478d li a5,3 + 300550e: 00f71463 bne a4,a5,3005516 + (transmode == UART_MODE_DISABLE)) { + return true; + 3005512: 4785 li a5,1 + 3005514: a011 j 3005518 + } + return false; + 3005516: 4781 li a5,0 +} + 3005518: 853e mv a0,a5 + 300551a: 4472 lw s0,28(sp) + 300551c: 6105 addi sp,sp,32 + 300551e: 8082 ret + +03005520 : + * @brief Check UART fifoThreshold parameter. + * @param fifoThreshold UART TX/RX FIFO line interrupt threshold, @ref UART_FIFO_Threshold + * @retval bool + */ +static inline bool IsUartFIFOThreshold(UART_FIFO_Threshold fifoThreshold) +{ + 3005520: 1101 addi sp,sp,-32 + 3005522: ce22 sw s0,28(sp) + 3005524: 1000 addi s0,sp,32 + 3005526: fea42623 sw a0,-20(s0) + return (fifoThreshold >= UART_FIFODEPTH_SIZE0) && (fifoThreshold <= UART_FIFODEPTH_SIZE15); + 300552a: fec42783 lw a5,-20(s0) + 300552e: 0107b793 sltiu a5,a5,16 + 3005532: 9f81 uxtb a5 +} + 3005534: 853e mv a0,a5 + 3005536: 4472 lw s0,28(sp) + 3005538: 6105 addi sp,sp,32 + 300553a: 8082 ret + +0300553c : + * @brief Check UART Oversampling multiple. + * @param multiple Oversampling multiple, @ref UART_OversampleMultiple + * @retval bool + */ +static inline bool IsUartOversampleMultiple(UART_OversampleMultiple multiple) +{ + 300553c: 1101 addi sp,sp,-32 + 300553e: ce22 sw s0,28(sp) + 3005540: 1000 addi s0,sp,32 + 3005542: fea42623 sw a0,-20(s0) + return (multiple >= UART_OVERSAMPLING_16X) && (multiple <= UART_OVERSAMPLING_12X); + 3005546: fec42783 lw a5,-20(s0) + 300554a: 0057b793 sltiu a5,a5,5 + 300554e: 9f81 uxtb a5 +} + 3005550: 853e mv a0,a5 + 3005552: 4472 lw s0,28(sp) + 3005554: 6105 addi sp,sp,32 + 3005556: 8082 ret + +03005558 : +#define PARITY_EVEN 0x6 +#define PARITY_MARK 0x82 +#define PARITY_SPACE 0x86 + +static unsigned int DivClosest(unsigned int x, unsigned int divisor) +{ + 3005558: 7179 addi sp,sp,-48 + 300555a: d622 sw s0,44(sp) + 300555c: 1800 addi s0,sp,48 + 300555e: fca42e23 sw a0,-36(s0) + 3005562: fcb42c23 sw a1,-40(s0) + unsigned int ret; + if (divisor == 0) { + 3005566: fd842783 lw a5,-40(s0) + 300556a: e399 bnez a5,3005570 + return 0; + 300556c: 4781 li a5,0 + 300556e: a005 j 300558e + } + ret = (((x) + ((divisor) / 2)) / (divisor)); /* Round up the result, add 1/2 */ + 3005570: fd842783 lw a5,-40(s0) + 3005574: 0017d713 srli a4,a5,0x1 + 3005578: fdc42783 lw a5,-36(s0) + 300557c: 973e add a4,a4,a5 + 300557e: fd842783 lw a5,-40(s0) + 3005582: 02f757b3 divu a5,a4,a5 + 3005586: fef42623 sw a5,-20(s0) + return ret; + 300558a: fec42783 lw a5,-20(s0) +} + 300558e: 853e mv a0,a5 + 3005590: 5432 lw s0,44(sp) + 3005592: 6145 addi sp,sp,48 + 3005594: 8082 ret + +03005596 : + * @brief Sets the parity bit of the UART. + * @param uartHandle UART handle. + * @retval None. + */ +static void UART_SetParityBit(UART_Handle *uartHandle) +{ + 3005596: 1101 addi sp,sp,-32 + 3005598: ce22 sw s0,28(sp) + 300559a: 1000 addi s0,sp,32 + 300559c: fea42623 sw a0,-20(s0) + /* Sets the UART check mode. */ + switch (uartHandle->parity) { + 30055a0: fec42783 lw a5,-20(s0) + 30055a4: 4b9c lw a5,16(a5) + 30055a6: 4711 li a4,4 + 30055a8: 06f76e63 bltu a4,a5,3005624 + 30055ac: 00279713 slli a4,a5,0x2 + 30055b0: 030067b7 lui a5,0x3006 + 30055b4: 64c78793 addi a5,a5,1612 # 300664c + 30055b8: 97ba add a5,a5,a4 + 30055ba: 439c lw a5,0(a5) + 30055bc: 8782 jr a5 + case UART_PARITY_ODD: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_ODD; /* Odd parity. */ + 30055be: fec42783 lw a5,-20(s0) + 30055c2: 439c lw a5,0(a5) + 30055c4: 57d8 lw a4,44(a5) + 30055c6: fec42783 lw a5,-20(s0) + 30055ca: 439c lw a5,0(a5) + 30055cc: 00276713 ori a4,a4,2 + 30055d0: d7d8 sw a4,44(a5) + break; + 30055d2: a891 j 3005626 + case UART_PARITY_EVEN: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_EVEN; /* Even parity. */ + 30055d4: fec42783 lw a5,-20(s0) + 30055d8: 439c lw a5,0(a5) + 30055da: 57d8 lw a4,44(a5) + 30055dc: fec42783 lw a5,-20(s0) + 30055e0: 439c lw a5,0(a5) + 30055e2: 00676713 ori a4,a4,6 + 30055e6: d7d8 sw a4,44(a5) + break; + 30055e8: a83d j 3005626 + case UART_PARITY_MARK: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_MARK; /* Marking parity */ + 30055ea: fec42783 lw a5,-20(s0) + 30055ee: 439c lw a5,0(a5) + 30055f0: 57d8 lw a4,44(a5) + 30055f2: fec42783 lw a5,-20(s0) + 30055f6: 439c lw a5,0(a5) + 30055f8: 08276713 ori a4,a4,130 + 30055fc: d7d8 sw a4,44(a5) + break; + 30055fe: a025 j 3005626 + case UART_PARITY_SPACE: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_SPACE; /* space parity */ + 3005600: fec42783 lw a5,-20(s0) + 3005604: 439c lw a5,0(a5) + 3005606: 57d8 lw a4,44(a5) + 3005608: fec42783 lw a5,-20(s0) + 300560c: 439c lw a5,0(a5) + 300560e: 08676713 ori a4,a4,134 + 3005612: d7d8 sw a4,44(a5) + break; + 3005614: a809 j 3005626 + case UART_PARITY_NONE: + uartHandle->baseAddress->UART_LCR_H.BIT.pen = BASE_CFG_DISABLE; /* No parity */ + 3005616: fec42783 lw a5,-20(s0) + 300561a: 4398 lw a4,0(a5) + 300561c: 575c lw a5,44(a4) + 300561e: 9bf5 andi a5,a5,-3 + 3005620: d75c sw a5,44(a4) + break; + 3005622: a011 j 3005626 + default: + return; + 3005624: 0001 nop + } +} + 3005626: 4472 lw s0,28(sp) + 3005628: 6105 addi sp,sp,32 + 300562a: 8082 ret + +0300562c : + * @brief Initialize the UART hardware configuration and configure parameters based on the specified handle. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_Init(UART_Handle *uartHandle) +{ + 300562c: 7179 addi sp,sp,-48 + 300562e: d606 sw ra,44(sp) + 3005630: d422 sw s0,40(sp) + 3005632: 1800 addi s0,sp,48 + 3005634: fca42e23 sw a0,-36(s0) + UART_ASSERT_PARAM(uartHandle != NULL); + 3005638: fdc42783 lw a5,-36(s0) + 300563c: eb89 bnez a5,300564e + 300563e: 09700593 li a1,151 + 3005642: 030067b7 lui a5,0x3006 + 3005646: 66078513 addi a0,a5,1632 # 3006660 + 300564a: 313d jal ra,3005278 + 300564c: a001 j 300564c + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + 300564e: fdc42783 lw a5,-36(s0) + 3005652: 4398 lw a4,0(a5) + 3005654: 140007b7 lui a5,0x14000 + 3005658: 02f70f63 beq a4,a5,3005696 + 300565c: fdc42783 lw a5,-36(s0) + 3005660: 4398 lw a4,0(a5) + 3005662: 140017b7 lui a5,0x14001 + 3005666: 02f70863 beq a4,a5,3005696 + 300566a: fdc42783 lw a5,-36(s0) + 300566e: 4398 lw a4,0(a5) + 3005670: 140027b7 lui a5,0x14002 + 3005674: 02f70163 beq a4,a5,3005696 + 3005678: fdc42783 lw a5,-36(s0) + 300567c: 4398 lw a4,0(a5) + 300567e: 140037b7 lui a5,0x14003 + 3005682: 00f70a63 beq a4,a5,3005696 + 3005686: 09800593 li a1,152 + 300568a: 030067b7 lui a5,0x3006 + 300568e: 66078513 addi a0,a5,1632 # 3006660 + 3005692: 36dd jal ra,3005278 + 3005694: a001 j 3005694 + UART_PARAM_CHECK_WITH_RET(uartHandle->txState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 3005696: fdc42783 lw a5,-36(s0) + 300569a: 47bc lw a5,72(a5) + 300569c: cb91 beqz a5,30056b0 + 300569e: 09900593 li a1,153 + 30056a2: 030067b7 lui a5,0x3006 + 30056a6: 66078513 addi a0,a5,1632 # 3006660 + 30056aa: 36f9 jal ra,3005278 + 30056ac: 4785 li a5,1 + 30056ae: ae0d j 30059e0 + UART_PARAM_CHECK_WITH_RET(uartHandle->rxState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 30056b0: fdc42783 lw a5,-36(s0) + 30056b4: 47fc lw a5,76(a5) + 30056b6: cb91 beqz a5,30056ca + 30056b8: 09a00593 li a1,154 + 30056bc: 030067b7 lui a5,0x3006 + 30056c0: 66078513 addi a0,a5,1632 # 3006660 + 30056c4: 3e55 jal ra,3005278 + 30056c6: 4785 li a5,1 + 30056c8: ae21 j 30059e0 + unsigned int uartClock, quot; + UART_PARAM_CHECK_WITH_RET(IsUartDatalength(uartHandle->dataLength), BASE_STATUS_ERROR); + 30056ca: fdc42783 lw a5,-36(s0) + 30056ce: 479c lw a5,8(a5) + 30056d0: 853e mv a0,a5 + 30056d2: 3365 jal ra,300547a + 30056d4: 87aa mv a5,a0 + 30056d6: 0017c793 xori a5,a5,1 + 30056da: 9f81 uxtb a5 + 30056dc: cb91 beqz a5,30056f0 + 30056de: 09c00593 li a1,156 + 30056e2: 030067b7 lui a5,0x3006 + 30056e6: 66078513 addi a0,a5,1632 # 3006660 + 30056ea: 3679 jal ra,3005278 + 30056ec: 4785 li a5,1 + 30056ee: accd j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartStopbits(uartHandle->stopBits), BASE_STATUS_ERROR); + 30056f0: fdc42783 lw a5,-36(s0) + 30056f4: 47dc lw a5,12(a5) + 30056f6: 853e mv a0,a5 + 30056f8: 3b79 jal ra,3005496 + 30056fa: 87aa mv a5,a0 + 30056fc: 0017c793 xori a5,a5,1 + 3005700: 9f81 uxtb a5 + 3005702: cb91 beqz a5,3005716 + 3005704: 09d00593 li a1,157 + 3005708: 030067b7 lui a5,0x3006 + 300570c: 66078513 addi a0,a5,1632 # 3006660 + 3005710: 36a5 jal ra,3005278 + 3005712: 4785 li a5,1 + 3005714: a4f1 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartParitymode(uartHandle->parity), BASE_STATUS_ERROR); + 3005716: fdc42783 lw a5,-36(s0) + 300571a: 4b9c lw a5,16(a5) + 300571c: 853e mv a0,a5 + 300571e: 3355 jal ra,30054c2 + 3005720: 87aa mv a5,a0 + 3005722: 0017c793 xori a5,a5,1 + 3005726: 9f81 uxtb a5 + 3005728: cb91 beqz a5,300573c + 300572a: 09e00593 li a1,158 + 300572e: 030067b7 lui a5,0x3006 + 3005732: 66078513 addi a0,a5,1632 # 3006660 + 3005736: 3689 jal ra,3005278 + 3005738: 4785 li a5,1 + 300573a: a45d j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->txMode), BASE_STATUS_ERROR); + 300573c: fdc42783 lw a5,-36(s0) + 3005740: 4bdc lw a5,20(a5) + 3005742: 853e mv a0,a5 + 3005744: 3345 jal ra,30054e4 + 3005746: 87aa mv a5,a0 + 3005748: 0017c793 xori a5,a5,1 + 300574c: 9f81 uxtb a5 + 300574e: cb91 beqz a5,3005762 + 3005750: 09f00593 li a1,159 + 3005754: 030067b7 lui a5,0x3006 + 3005758: 66078513 addi a0,a5,1632 # 3006660 + 300575c: 3e31 jal ra,3005278 + 300575e: 4785 li a5,1 + 3005760: a441 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->rxMode), BASE_STATUS_ERROR); + 3005762: fdc42783 lw a5,-36(s0) + 3005766: 4f9c lw a5,24(a5) + 3005768: 853e mv a0,a5 + 300576a: 3bad jal ra,30054e4 + 300576c: 87aa mv a5,a0 + 300576e: 0017c793 xori a5,a5,1 + 3005772: 9f81 uxtb a5 + 3005774: cb91 beqz a5,3005788 + 3005776: 0a000593 li a1,160 + 300577a: 030067b7 lui a5,0x3006 + 300577e: 66078513 addi a0,a5,1632 # 3006660 + 3005782: 3cdd jal ra,3005278 + 3005784: 4785 li a5,1 + 3005786: aca9 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoTxThr), BASE_STATUS_ERROR); + 3005788: fdc42783 lw a5,-36(s0) + 300578c: 5b9c lw a5,48(a5) + 300578e: 853e mv a0,a5 + 3005790: 3b41 jal ra,3005520 + 3005792: 87aa mv a5,a0 + 3005794: 0017c793 xori a5,a5,1 + 3005798: 9f81 uxtb a5 + 300579a: cb91 beqz a5,30057ae + 300579c: 0a100593 li a1,161 + 30057a0: 030067b7 lui a5,0x3006 + 30057a4: 66078513 addi a0,a5,1632 # 3006660 + 30057a8: 3cc1 jal ra,3005278 + 30057aa: 4785 li a5,1 + 30057ac: ac15 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoRxThr), BASE_STATUS_ERROR); + 30057ae: fdc42783 lw a5,-36(s0) + 30057b2: 5bdc lw a5,52(a5) + 30057b4: 853e mv a0,a5 + 30057b6: 33ad jal ra,3005520 + 30057b8: 87aa mv a5,a0 + 30057ba: 0017c793 xori a5,a5,1 + 30057be: 9f81 uxtb a5 + 30057c0: cb91 beqz a5,30057d4 + 30057c2: 0a200593 li a1,162 + 30057c6: 030067b7 lui a5,0x3006 + 30057ca: 66078513 addi a0,a5,1632 # 3006660 + 30057ce: 346d jal ra,3005278 + 30057d0: 4785 li a5,1 + 30057d2: a439 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartOversampleMultiple(uartHandle->handleEx.overSampleMultiple), BASE_STATUS_ERROR); + 30057d4: fdc42783 lw a5,-36(s0) + 30057d8: 5fbc lw a5,120(a5) + 30057da: 853e mv a0,a5 + 30057dc: 3385 jal ra,300553c + 30057de: 87aa mv a5,a0 + 30057e0: 0017c793 xori a5,a5,1 + 30057e4: 9f81 uxtb a5 + 30057e6: cb91 beqz a5,30057fa + 30057e8: 0a300593 li a1,163 + 30057ec: 030067b7 lui a5,0x3006 + 30057f0: 66078513 addi a0,a5,1632 # 3006660 + 30057f4: 3451 jal ra,3005278 + 30057f6: 4785 li a5,1 + 30057f8: a2e5 j 30059e0 + + uartHandle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; + 30057fa: fdc42783 lw a5,-36(s0) + 30057fe: 4398 lw a4,0(a5) + 3005800: 5b1c lw a5,48(a4) + 3005802: 9bf9 andi a5,a5,-2 + 3005804: db1c sw a5,48(a4) + while (uartHandle->baseAddress->UART_FR.BIT.busy == 0x01) { + 3005806: 0001 nop + 3005808: fdc42783 lw a5,-36(s0) + 300580c: 439c lw a5,0(a5) + 300580e: 4f9c lw a5,24(a5) + 3005810: 838d srli a5,a5,0x3 + 3005812: 8b85 andi a5,a5,1 + 3005814: 0ff7f713 andi a4,a5,255 + 3005818: 4785 li a5,1 + 300581a: fef707e3 beq a4,a5,3005808 + ; + } + + uartClock = HAL_CRG_GetIpFreq((void *)uartHandle->baseAddress); + 300581e: fdc42783 lw a5,-36(s0) + 3005822: 439c lw a5,0(a5) + 3005824: 853e mv a0,a5 + 3005826: 9f1fd0ef jal ra,3003216 + 300582a: fea42623 sw a0,-20(s0) + + /* DCL OverSample Multiple check */ + uartHandle->baseAddress->UART_SPCFG.BIT.spcfg = uartHandle->handleEx.overSampleMultiple; + 300582e: fdc42783 lw a5,-36(s0) + 3005832: 5fb4 lw a3,120(a5) + 3005834: fdc42783 lw a5,-36(s0) + 3005838: 4398 lw a4,0(a5) + 300583a: 87b6 mv a5,a3 + 300583c: 8bbd andi a5,a5,15 + 300583e: 0ff7f693 andi a3,a5,255 + 3005842: 4f3c lw a5,88(a4) + 3005844: 8abd andi a3,a3,15 + 3005846: 9bc1 andi a5,a5,-16 + 3005848: 8fd5 or a5,a5,a3 + 300584a: cf3c sw a5,88(a4) + + /* DCL sequences setting */ + uartHandle->baseAddress->UART_DS.BIT.msbfirst = uartHandle->handleEx.msbFirst; + 300584c: fdc42783 lw a5,-36(s0) + 3005850: 4398 lw a4,0(a5) + 3005852: fdc42783 lw a5,-36(s0) + 3005856: 07c7c683 lbu a3,124(a5) + 300585a: 4b3c lw a5,80(a4) + 300585c: 8a85 andi a3,a3,1 + 300585e: 9bf9 andi a5,a5,-2 + 3005860: 8fd5 or a5,a5,a3 + 3005862: cb3c sw a5,80(a4) + + /* The baud rate divider(BRD) based on the baud rate and clock frequency, calculation formula */ + unsigned int oversample = uartHandle->baseAddress->UART_SPCFG.reg; + 3005864: fdc42783 lw a5,-36(s0) + 3005868: 439c lw a5,0(a5) + 300586a: 4fbc lw a5,88(a5) + 300586c: fef42423 sw a5,-24(s0) + if (uartHandle->baudRate > (uartClock / (OVERSAMPLING_PARAM - oversample))) { + 3005870: fdc42783 lw a5,-36(s0) + 3005874: 43d8 lw a4,4(a5) + 3005876: 46c1 li a3,16 + 3005878: fe842783 lw a5,-24(s0) + 300587c: 40f687b3 sub a5,a3,a5 + 3005880: fec42683 lw a3,-20(s0) + 3005884: 02f6d7b3 divu a5,a3,a5 + 3005888: 00e7f463 bgeu a5,a4,3005890 + return BASE_STATUS_ERROR; + 300588c: 4785 li a5,1 + 300588e: aa89 j 30059e0 + } else { + unsigned int tmpClock = uartClock / (OVERSAMPLING_PARAM - oversample) * 64; /* 64 is for decimal parts */ + 3005890: 4741 li a4,16 + 3005892: fe842783 lw a5,-24(s0) + 3005896: 40f707b3 sub a5,a4,a5 + 300589a: fec42703 lw a4,-20(s0) + 300589e: 02f757b3 divu a5,a4,a5 + 30058a2: 079a slli a5,a5,0x6 + 30058a4: fef42223 sw a5,-28(s0) + quot = DivClosest(tmpClock, uartHandle->baudRate); + 30058a8: fdc42783 lw a5,-36(s0) + 30058ac: 43dc lw a5,4(a5) + 30058ae: 85be mv a1,a5 + 30058b0: fe442503 lw a0,-28(s0) + 30058b4: 3155 jal ra,3005558 + 30058b6: fea42023 sw a0,-32(s0) + } + /* Clear the baud rate divider register */ + uartHandle->baseAddress->UART_FBRD.reg = 0; + 30058ba: fdc42783 lw a5,-36(s0) + 30058be: 439c lw a5,0(a5) + 30058c0: 0207a423 sw zero,40(a5) + uartHandle->baseAddress->UART_IBRD.reg = 0; + 30058c4: fdc42783 lw a5,-36(s0) + 30058c8: 439c lw a5,0(a5) + 30058ca: 0207a223 sw zero,36(a5) + /* The fractional baud rate divider value is stored to the lower 6 bits of the FBRD */ + uartHandle->baseAddress->UART_FBRD.reg = (quot & 0x3F); + 30058ce: fdc42783 lw a5,-36(s0) + 30058d2: 439c lw a5,0(a5) + 30058d4: fe042703 lw a4,-32(s0) + 30058d8: 03f77713 andi a4,a4,63 + 30058dc: d798 sw a4,40(a5) + /* Right shift 6 bits is the integer baud rate divider value, is stored to IBRD */ + uartHandle->baseAddress->UART_IBRD.reg = (quot >> 6); + 30058de: fdc42783 lw a5,-36(s0) + 30058e2: 439c lw a5,0(a5) + 30058e4: fe042703 lw a4,-32(s0) + 30058e8: 8319 srli a4,a4,0x6 + 30058ea: d3d8 sw a4,36(a5) + uartHandle->baseAddress->UART_LCR_H.reg = 0; + 30058ec: fdc42783 lw a5,-36(s0) + 30058f0: 439c lw a5,0(a5) + 30058f2: 0207a623 sw zero,44(a5) + uartHandle->baseAddress->UART_LCR_H.BIT.wlen = uartHandle->dataLength; /* Frame length seting */ + 30058f6: fdc42783 lw a5,-36(s0) + 30058fa: 4794 lw a3,8(a5) + 30058fc: fdc42783 lw a5,-36(s0) + 3005900: 4398 lw a4,0(a5) + 3005902: 87b6 mv a5,a3 + 3005904: 8b8d andi a5,a5,3 + 3005906: 0ff7f693 andi a3,a5,255 + 300590a: 575c lw a5,44(a4) + 300590c: 8a8d andi a3,a3,3 + 300590e: 0696 slli a3,a3,0x5 + 3005910: f9f7f793 andi a5,a5,-97 + 3005914: 8fd5 or a5,a5,a3 + 3005916: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_LCR_H.BIT.stp2 = uartHandle->stopBits; /* Stop bit seting */ + 3005918: fdc42783 lw a5,-36(s0) + 300591c: 47d4 lw a3,12(a5) + 300591e: fdc42783 lw a5,-36(s0) + 3005922: 4398 lw a4,0(a5) + 3005924: 87b6 mv a5,a3 + 3005926: 8b85 andi a5,a5,1 + 3005928: 0ff7f693 andi a3,a5,255 + 300592c: 575c lw a5,44(a4) + 300592e: 8a85 andi a3,a3,1 + 3005930: 068e slli a3,a3,0x3 + 3005932: 9bdd andi a5,a5,-9 + 3005934: 8fd5 or a5,a5,a3 + 3005936: d75c sw a5,44(a4) + UART_SetParityBit(uartHandle); + 3005938: fdc42503 lw a0,-36(s0) + 300593c: 39a9 jal ra,3005596 + if (uartHandle->fifoMode == true) { /* FIFO threshold setting */ + 300593e: fdc42783 lw a5,-36(s0) + 3005942: 02c7c783 lbu a5,44(a5) + 3005946: cbb1 beqz a5,300599a + uartHandle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_ENABLE; + 3005948: fdc42783 lw a5,-36(s0) + 300594c: 4398 lw a4,0(a5) + 300594e: 575c lw a5,44(a4) + 3005950: 0107e793 ori a5,a5,16 + 3005954: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_IFLS.BIT.rxiflsel = uartHandle->fifoRxThr; + 3005956: fdc42783 lw a5,-36(s0) + 300595a: 5bd4 lw a3,52(a5) + 300595c: fdc42783 lw a5,-36(s0) + 3005960: 4398 lw a4,0(a5) + 3005962: 87b6 mv a5,a3 + 3005964: 8bbd andi a5,a5,15 + 3005966: 0ff7f693 andi a3,a5,255 + 300596a: 5b5c lw a5,52(a4) + 300596c: 8abd andi a3,a3,15 + 300596e: 06a2 slli a3,a3,0x8 + 3005970: 767d lui a2,0xfffff + 3005972: 0ff60613 addi a2,a2,255 # fffff0ff + 3005976: 8ff1 and a5,a5,a2 + 3005978: 8fd5 or a5,a5,a3 + 300597a: db5c sw a5,52(a4) + uartHandle->baseAddress->UART_IFLS.BIT.txiflsel = uartHandle->fifoTxThr; + 300597c: fdc42783 lw a5,-36(s0) + 3005980: 5b94 lw a3,48(a5) + 3005982: fdc42783 lw a5,-36(s0) + 3005986: 4398 lw a4,0(a5) + 3005988: 87b6 mv a5,a3 + 300598a: 8bbd andi a5,a5,15 + 300598c: 0ff7f693 andi a3,a5,255 + 3005990: 5b5c lw a5,52(a4) + 3005992: 8abd andi a3,a3,15 + 3005994: 9bc1 andi a5,a5,-16 + 3005996: 8fd5 or a5,a5,a3 + 3005998: db5c sw a5,52(a4) + } + if (uartHandle->hwFlowCtr == UART_HW_FLOWCTR_ENABLE) { /* Hardwarer flow control setting */ + 300599a: fdc42783 lw a5,-36(s0) + 300599e: 5f98 lw a4,56(a5) + 30059a0: 4785 li a5,1 + 30059a2: 00f71c63 bne a4,a5,30059ba + uartHandle->baseAddress->UART_CR.reg |= 0xC000; + 30059a6: fdc42783 lw a5,-36(s0) + 30059aa: 439c lw a5,0(a5) + 30059ac: 5b94 lw a3,48(a5) + 30059ae: fdc42783 lw a5,-36(s0) + 30059b2: 439c lw a5,0(a5) + 30059b4: 6731 lui a4,0xc + 30059b6: 8f55 or a4,a4,a3 + 30059b8: db98 sw a4,48(a5) + } + uartHandle->baseAddress->UART_CR.reg |= 0x301; /* Enable bit use 0x301 is to set txe/rxe/uarten */ + 30059ba: fdc42783 lw a5,-36(s0) + 30059be: 439c lw a5,0(a5) + 30059c0: 5b98 lw a4,48(a5) + 30059c2: fdc42783 lw a5,-36(s0) + 30059c6: 439c lw a5,0(a5) + 30059c8: 30176713 ori a4,a4,769 + 30059cc: db98 sw a4,48(a5) + uartHandle->txState = UART_STATE_READY; + 30059ce: fdc42783 lw a5,-36(s0) + 30059d2: 4705 li a4,1 + 30059d4: c7b8 sw a4,72(a5) + uartHandle->rxState = UART_STATE_READY; + 30059d6: fdc42783 lw a5,-36(s0) + 30059da: 4705 li a4,1 + 30059dc: c7f8 sw a4,76(a5) + return BASE_STATUS_OK; + 30059de: 4781 li a5,0 +} + 30059e0: 853e mv a0,a5 + 30059e2: 50b2 lw ra,44(sp) + 30059e4: 5422 lw s0,40(sp) + 30059e6: 6145 addi sp,sp,48 + 30059e8: 8082 ret + +030059ea
: +/* USER CODE BEGIN 1 */ +/* 建议用户定义全局变量、结构体、宏定义或函数声明等 */ +/* USER CODE END 1 */ + +int main(void) +{ + 30059ea: 1141 addi sp,sp,-16 + 30059ec: c606 sw ra,12(sp) + 30059ee: c422 sw s0,8(sp) + 30059f0: 0800 addi s0,sp,16 + /* USER CODE BEGIN 2 */ + /* 建议用户放置初始化代码或启动代码等 */ + /* USER CODE END 2 */ + SystemInit(); + 30059f2: 2655 jal ra,3005d96 + /* USER CODE BEGIN 3 */ + /* 建议用户放置初始配置代码 */ + /* USER CODE END 3 */ + while (1) { + 30059f4: a001 j 30059f4 + +030059f6 : +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + 30059f6: 715d addi sp,sp,-80 + 30059f8: c686 sw ra,76(sp) + 30059fa: c4a2 sw s0,72(sp) + 30059fc: 0880 addi s0,sp,80 + 30059fe: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3005a02: 100007b7 lui a5,0x10000 + 3005a06: fcf42423 sw a5,-56(s0) + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + 3005a0a: fc042623 sw zero,-52(s0) + crg.pllPreDiv = CRG_PLL_PREDIV_4; + 3005a0e: 478d li a5,3 + 3005a10: fcf42823 sw a5,-48(s0) + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + 3005a14: 03000793 li a5,48 + 3005a18: fcf42a23 sw a5,-44(s0) + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + 3005a1c: 4785 li a5,1 + 3005a1e: fcf42c23 sw a5,-40(s0) + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + 3005a22: 4789 li a5,2 + 3005a24: fef42023 sw a5,-32(s0) + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + 3005a28: 4789 li a5,2 + 3005a2a: fef42223 sw a5,-28(s0) + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + 3005a2e: fe042423 sw zero,-24(s0) + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + 3005a32: 47e1 li a5,24 + 3005a34: fef42623 sw a5,-20(s0) + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + 3005a38: fc840793 addi a5,s0,-56 + 3005a3c: 853e mv a0,a5 + 3005a3e: aecfd0ef jal ra,3002d2a + 3005a42: 87aa mv a5,a0 + 3005a44: c399 beqz a5,3005a4a + return BASE_STATUS_ERROR; + 3005a46: 4785 li a5,1 + 3005a48: a039 j 3005a56 + } + *coreClkSelect = crg.coreClkSelect; + 3005a4a: fe042703 lw a4,-32(s0) + 3005a4e: fbc42783 lw a5,-68(s0) + 3005a52: c398 sw a4,0(a5) + return BASE_STATUS_OK; + 3005a54: 4781 li a5,0 +} + 3005a56: 853e mv a0,a5 + 3005a58: 40b6 lw ra,76(sp) + 3005a5a: 4426 lw s0,72(sp) + 3005a5c: 6161 addi sp,sp,80 + 3005a5e: 8082 ret + +03005a60 : + +static void ADC0_Init(void) +{ + 3005a60: 7179 addi sp,sp,-48 + 3005a62: d606 sw ra,44(sp) + 3005a64: d422 sw s0,40(sp) + 3005a66: 1800 addi s0,sp,48 + HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); + 3005a68: 4585 li a1,1 + 3005a6a: 18000537 lui a0,0x18000 + 3005a6e: 2c81 jal ra,3005cbe + HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); + 3005a70: 4589 li a1,2 + 3005a72: 18000537 lui a0,0x18000 + 3005a76: 95dfd0ef jal ra,30033d2 + HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_1); + 3005a7a: 4581 li a1,0 + 3005a7c: 18000537 lui a0,0x18000 + 3005a80: a09fd0ef jal ra,3003488 + + g_adc0.baseAddress = ADC0; + 3005a84: 040007b7 lui a5,0x4000 + 3005a88: 54478793 addi a5,a5,1348 # 4000544 + 3005a8c: 18000737 lui a4,0x18000 + 3005a90: c398 sw a4,0(a5) + g_adc0.socPriority = ADC_PRIMODE_ALL_ROUND; + 3005a92: 040007b7 lui a5,0x4000 + 3005a96: 54478793 addi a5,a5,1348 # 4000544 + 3005a9a: 0007a223 sw zero,4(a5) + + HAL_ADC_Init(&g_adc0); + 3005a9e: 040007b7 lui a5,0x4000 + 3005aa2: 54478513 addi a0,a5,1348 # 4000544 + 3005aa6: f75fb0ef jal ra,3001a1a + + SOC_Param socParam = {0}; + 3005aaa: fc042e23 sw zero,-36(s0) + 3005aae: fe042023 sw zero,-32(s0) + 3005ab2: fe042223 sw zero,-28(s0) + 3005ab6: fe042423 sw zero,-24(s0) + 3005aba: fe042623 sw zero,-20(s0) + socParam.adcInput = ADC_CH_ADCINA6; /* PIN4(ADC AIN6) */ + 3005abe: 4799 li a5,6 + 3005ac0: fcf42e23 sw a5,-36(s0) + socParam.sampleTotalTime = ADC_SOCSAMPLE_10CLK; /* adc sample total time 10 adc_clk */ + 3005ac4: 4789 li a5,2 + 3005ac6: fef42023 sw a5,-32(s0) + socParam.trigSource = ADC_TRIGSOC_SOFT; + 3005aca: fe042223 sw zero,-28(s0) + socParam.continueMode = BASE_CFG_ENABLE; + 3005ace: 4785 li a5,1 + 3005ad0: fef40423 sb a5,-24(s0) + socParam.finishMode = ADC_SOCFINISH_NONE; + 3005ad4: 4785 li a5,1 + 3005ad6: fef42623 sw a5,-20(s0) + HAL_ADC_ConfigureSoc(&g_adc0, ADC_SOC_NUM1, &socParam); + 3005ada: fdc40793 addi a5,s0,-36 + 3005ade: 863e mv a2,a5 + 3005ae0: 4585 li a1,1 + 3005ae2: 040007b7 lui a5,0x4000 + 3005ae6: 54478513 addi a0,a5,1348 # 4000544 + 3005aea: fe3fb0ef jal ra,3001acc +} + 3005aee: 0001 nop + 3005af0: 50b2 lw ra,44(sp) + 3005af2: 5422 lw s0,40(sp) + 3005af4: 6145 addi sp,sp,48 + 3005af6: 8082 ret + +03005af8 : + /* USER CODE BEGIN TIMER3_InterruptProcess */ + /* USER CODE END TIMER3_InterruptProcess */ +} + +static void TIMER3_Init(void) +{ + 3005af8: 1101 addi sp,sp,-32 + 3005afa: ce06 sw ra,28(sp) + 3005afc: cc22 sw s0,24(sp) + 3005afe: 1000 addi s0,sp,32 + HAL_CRG_IpEnableSet(TIMER3_BASE, IP_CLK_ENABLE); /* TIMER3 clock enable. */ + 3005b00: 4585 li a1,1 + 3005b02: 14303537 lui a0,0x14303 + 3005b06: 2a65 jal ra,3005cbe + unsigned int load = (HAL_CRG_GetIpFreq((void *)TIMER3) / (1u << (TIMERPRESCALER_NO_DIV * 4)) / 1000000u) * 10; + 3005b08: 14303537 lui a0,0x14303 + 3005b0c: f0afd0ef jal ra,3003216 + 3005b10: 872a mv a4,a0 + 3005b12: 000f47b7 lui a5,0xf4 + 3005b16: 24078793 addi a5,a5,576 # f4240 + 3005b1a: 02f75733 divu a4,a4,a5 + 3005b1e: 47a9 li a5,10 + 3005b20: 02f707b3 mul a5,a4,a5 + 3005b24: fef42623 sw a5,-20(s0) + + g_timer3.baseAddress = TIMER3; + 3005b28: 040007b7 lui a5,0x4000 + 3005b2c: 49c78793 addi a5,a5,1180 # 400049c + 3005b30: 14303737 lui a4,0x14303 + 3005b34: c398 sw a4,0(a5) + g_timer3.load = load - 1; /* Set timer value immediately */ + 3005b36: fec42783 lw a5,-20(s0) + 3005b3a: fff78713 addi a4,a5,-1 + 3005b3e: 040007b7 lui a5,0x4000 + 3005b42: 49c78793 addi a5,a5,1180 # 400049c + 3005b46: cbd8 sw a4,20(a5) + g_timer3.bgLoad = load - 1; /* Set timer value */ + 3005b48: fec42783 lw a5,-20(s0) + 3005b4c: fff78713 addi a4,a5,-1 + 3005b50: 040007b7 lui a5,0x4000 + 3005b54: 49c78793 addi a5,a5,1180 # 400049c + 3005b58: cf98 sw a4,24(a5) + g_timer3.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ + 3005b5a: 040007b7 lui a5,0x4000 + 3005b5e: 49c78793 addi a5,a5,1180 # 400049c + 3005b62: 4705 li a4,1 + 3005b64: c798 sw a4,8(a5) + g_timer3.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ + 3005b66: 040007b7 lui a5,0x4000 + 3005b6a: 49c78793 addi a5,a5,1180 # 400049c + 3005b6e: 0007a623 sw zero,12(a5) + g_timer3.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ + 3005b72: 040007b7 lui a5,0x4000 + 3005b76: 49c78793 addi a5,a5,1180 # 400049c + 3005b7a: 4705 li a4,1 + 3005b7c: cb98 sw a4,16(a5) + g_timer3.interruptEn = BASE_CFG_ENABLE; + 3005b7e: 040007b7 lui a5,0x4000 + 3005b82: 49c78793 addi a5,a5,1180 # 400049c + 3005b86: 4705 li a4,1 + 3005b88: afd8 sb a4,28(a5) + g_timer3.adcSocReqEnable = BASE_CFG_DISABLE; + 3005b8a: 040007b7 lui a5,0x4000 + 3005b8e: 49c78793 addi a5,a5,1180 # 400049c + 3005b92: 00078ea3 sb zero,29(a5) + g_timer3.dmaReqEnable = BASE_CFG_DISABLE; + 3005b96: 040007b7 lui a5,0x4000 + 3005b9a: 49c78793 addi a5,a5,1180 # 400049c + 3005b9e: 00078f23 sb zero,30(a5) + HAL_TIMER_Init(&g_timer3); + 3005ba2: 040007b7 lui a5,0x4000 + 3005ba6: 49c78513 addi a0,a5,1180 # 400049c + 3005baa: c7cff0ef jal ra,3005026 + IRQ_Register(IRQ_TIMER3, HAL_TIMER_IrqHandler, &g_timer3); + 3005bae: 040007b7 lui a5,0x4000 + 3005bb2: 49c78613 addi a2,a5,1180 # 400049c + 3005bb6: 030057b7 lui a5,0x3005 + 3005bba: 2fe78593 addi a1,a5,766 # 30052fe + 3005bbe: 02300513 li a0,35 + 3005bc2: cf0fc0ef jal ra,30020b2 + + HAL_TIMER_RegisterCallback(&g_timer3, TIMER_PERIOD_FIN, TIMER3_InterruptProcess); + 3005bc6: 030067b7 lui a5,0x3006 + 3005bca: dd678613 addi a2,a5,-554 # 3005dd6 + 3005bce: 4581 li a1,0 + 3005bd0: 040007b7 lui a5,0x4000 + 3005bd4: 49c78513 addi a0,a5,1180 # 400049c + 3005bd8: 3039 jal ra,30053e6 + IRQ_SetPriority(IRQ_TIMER3, 1); /* 1 is priority value */ + 3005bda: 4585 li a1,1 + 3005bdc: 02300513 li a0,35 + 3005be0: ca7fc0ef jal ra,3002886 + IRQ_EnableN(IRQ_TIMER3); + 3005be4: 02300513 li a0,35 + 3005be8: d50fc0ef jal ra,3002138 +} + 3005bec: 0001 nop + 3005bee: 40f2 lw ra,28(sp) + 3005bf0: 4462 lw s0,24(sp) + 3005bf2: 6105 addi sp,sp,32 + 3005bf4: 8082 ret + +03005bf6 : + +static void UART0_Init(void) +{ + 3005bf6: 1141 addi sp,sp,-16 + 3005bf8: c606 sw ra,12(sp) + 3005bfa: c422 sw s0,8(sp) + 3005bfc: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + 3005bfe: 4585 li a1,1 + 3005c00: 14000537 lui a0,0x14000 + 3005c04: 286d jal ra,3005cbe + g_uart0.baseAddress = UART0; + 3005c06: 040007b7 lui a5,0x4000 + 3005c0a: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c0e: 14000737 lui a4,0x14000 + 3005c12: c398 sw a4,0(a5) + + g_uart0.baudRate = UART0_BAND_RATE; + 3005c14: 040007b7 lui a5,0x4000 + 3005c18: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c1c: 6771 lui a4,0x1c + 3005c1e: 20070713 addi a4,a4,512 # 1c200 + 3005c22: c3d8 sw a4,4(a5) + g_uart0.dataLength = UART_DATALENGTH_8BIT; + 3005c24: 040007b7 lui a5,0x4000 + 3005c28: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c2c: 470d li a4,3 + 3005c2e: c798 sw a4,8(a5) + g_uart0.stopBits = UART_STOPBITS_ONE; + 3005c30: 040007b7 lui a5,0x4000 + 3005c34: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c38: 0007a623 sw zero,12(a5) + g_uart0.parity = UART_PARITY_NONE; + 3005c3c: 040007b7 lui a5,0x4000 + 3005c40: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c44: 4711 li a4,4 + 3005c46: cb98 sw a4,16(a5) + g_uart0.txMode = UART_MODE_BLOCKING; + 3005c48: 040007b7 lui a5,0x4000 + 3005c4c: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c50: 0007aa23 sw zero,20(a5) + g_uart0.rxMode = UART_MODE_BLOCKING; + 3005c54: 040007b7 lui a5,0x4000 + 3005c58: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c5c: 0007ac23 sw zero,24(a5) + g_uart0.fifoMode = BASE_CFG_ENABLE; + 3005c60: 040007b7 lui a5,0x4000 + 3005c64: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c68: 4705 li a4,1 + 3005c6a: 02e78623 sb a4,44(a5) + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + 3005c6e: 040007b7 lui a5,0x4000 + 3005c72: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c76: 4721 li a4,8 + 3005c78: db98 sw a4,48(a5) + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + 3005c7a: 040007b7 lui a5,0x4000 + 3005c7e: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c82: 4721 li a4,8 + 3005c84: dbd8 sw a4,52(a5) + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + 3005c86: 040007b7 lui a5,0x4000 + 3005c8a: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c8e: 0207ac23 sw zero,56(a5) + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + 3005c92: 040007b7 lui a5,0x4000 + 3005c96: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c9a: 0607ac23 sw zero,120(a5) + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + 3005c9e: 040007b7 lui a5,0x4000 + 3005ca2: 4c478793 addi a5,a5,1220 # 40004c4 + 3005ca6: 06078e23 sb zero,124(a5) + HAL_UART_Init(&g_uart0); + 3005caa: 040007b7 lui a5,0x4000 + 3005cae: 4c478513 addi a0,a5,1220 # 40004c4 + 3005cb2: 3aad jal ra,300562c +} + 3005cb4: 0001 nop + 3005cb6: 40b2 lw ra,12(sp) + 3005cb8: 4422 lw s0,8(sp) + 3005cba: 0141 addi sp,sp,16 + 3005cbc: 8082 ret + +03005cbe : + 3005cbe: e3cfd06f j 30032fa + +03005cc2 : + +static void IOConfig(void) +{ + 3005cc2: 1141 addi sp,sp,-16 + 3005cc4: c606 sw ra,12(sp) + 3005cc6: c422 sw s0,8(sp) + 3005cc8: 0800 addi s0,sp,16 + /* Config PIN4 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_ADC_AIN6); /* Check function selection */ + 3005cca: 010c07b7 lui a5,0x10c0 + 3005cce: 23c78513 addi a0,a5,572 # 10c023c + 3005cd2: 20c1 jal ra,3005d92 + HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_ADC_AIN6, PULL_NONE); /* Pull-up and Pull-down */ + 3005cd4: 4581 li a1,0 + 3005cd6: 010c07b7 lui a5,0x10c0 + 3005cda: 23c78513 addi a0,a5,572 # 10c023c + 3005cde: 2845 jal ra,3005d8e + HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_ADC_AIN6, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3005ce0: 4581 li a1,0 + 3005ce2: 010c07b7 lui a5,0x10c0 + 3005ce6: 23c78513 addi a0,a5,572 # 10c023c + 3005cea: 2045 jal ra,3005d8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_ADC_AIN6, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3005cec: 4585 li a1,1 + 3005cee: 010c07b7 lui a5,0x10c0 + 3005cf2: 23c78513 addi a0,a5,572 # 10c023c + 3005cf6: 2841 jal ra,3005d86 + HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_ADC_AIN6, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3005cf8: 4589 li a1,2 + 3005cfa: 010c07b7 lui a5,0x10c0 + 3005cfe: 23c78513 addi a0,a5,572 # 10c023c + 3005d02: 2041 jal ra,3005d82 + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + 3005d04: 019007b7 lui a5,0x1900 + 3005d08: 23378513 addi a0,a5,563 # 1900233 + 3005d0c: 2059 jal ra,3005d92 + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + 3005d0e: 4581 li a1,0 + 3005d10: 019007b7 lui a5,0x1900 + 3005d14: 23378513 addi a0,a5,563 # 1900233 + 3005d18: 289d jal ra,3005d8e + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3005d1a: 4581 li a1,0 + 3005d1c: 019007b7 lui a5,0x1900 + 3005d20: 23378513 addi a0,a5,563 # 1900233 + 3005d24: 209d jal ra,3005d8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3005d26: 4585 li a1,1 + 3005d28: 019007b7 lui a5,0x1900 + 3005d2c: 23378513 addi a0,a5,563 # 1900233 + 3005d30: 2899 jal ra,3005d86 + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3005d32: 4589 li a1,2 + 3005d34: 019007b7 lui a5,0x1900 + 3005d38: 23378513 addi a0,a5,563 # 1900233 + 3005d3c: 2099 jal ra,3005d82 + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + 3005d3e: 019407b7 lui a5,0x1940 + 3005d42: 23378513 addi a0,a5,563 # 1940233 + 3005d46: 20b1 jal ra,3005d92 + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + 3005d48: 4589 li a1,2 + 3005d4a: 019407b7 lui a5,0x1940 + 3005d4e: 23378513 addi a0,a5,563 # 1940233 + 3005d52: 2835 jal ra,3005d8e + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3005d54: 4581 li a1,0 + 3005d56: 019407b7 lui a5,0x1940 + 3005d5a: 23378513 addi a0,a5,563 # 1940233 + 3005d5e: 2035 jal ra,3005d8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3005d60: 4585 li a1,1 + 3005d62: 019407b7 lui a5,0x1940 + 3005d66: 23378513 addi a0,a5,563 # 1940233 + 3005d6a: 2831 jal ra,3005d86 + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3005d6c: 4589 li a1,2 + 3005d6e: 019407b7 lui a5,0x1940 + 3005d72: 23378513 addi a0,a5,563 # 1940233 + 3005d76: 2031 jal ra,3005d82 +} + 3005d78: 0001 nop + 3005d7a: 40b2 lw ra,12(sp) + 3005d7c: 4422 lw s0,8(sp) + 3005d7e: 0141 addi sp,sp,16 + 3005d80: 8082 ret + +03005d82 : + 3005d82: 978ff06f j 3004efa + +03005d86 : + 3005d86: 928ff06f j 3004eae + +03005d8a : + 3005d8a: 8d8ff06f j 3004e62 + +03005d8e : + 3005d8e: 888ff06f j 3004e16 + +03005d92 : + 3005d92: 84aff06f j 3004ddc + +03005d96 : + +void SystemInit(void) +{ + 3005d96: 1141 addi sp,sp,-16 + 3005d98: c606 sw ra,12(sp) + 3005d9a: c422 sw s0,8(sp) + 3005d9c: 0800 addi s0,sp,16 + IOConfig(); + 3005d9e: 3715 jal ra,3005cc2 + UART0_Init(); + 3005da0: 3d99 jal ra,3005bf6 + ADC0_Init(); + 3005da2: 397d jal ra,3005a60 + TIMER3_Init(); + 3005da4: 3b91 jal ra,3005af8 + + /* USER CODE BEGIN system_init */ + HAL_TIMER_Start(&g_timer3); + 3005da6: 040007b7 lui a5,0x4000 + 3005daa: 49c78513 addi a0,a5,1180 # 400049c + 3005dae: cceff0ef jal ra,300527c + HAL_ADC_StartIt(&g_adc0); + 3005db2: 040007b7 lui a5,0x4000 + 3005db6: 54478513 addi a0,a5,1348 # 4000544 + 3005dba: ec5fb0ef jal ra,3001c7e + HAL_ADC_SoftTrigSample(&g_adc0, ADC_SOC_NUM1); + 3005dbe: 4585 li a1,1 + 3005dc0: 040007b7 lui a5,0x4000 + 3005dc4: 54478513 addi a0,a5,1348 # 4000544 + 3005dc8: fe3fb0ef jal ra,3001daa + /* USER CODE END system_init */ + 3005dcc: 0001 nop + 3005dce: 40b2 lw ra,12(sp) + 3005dd0: 4422 lw s0,8(sp) + 3005dd2: 0141 addi sp,sp,16 + 3005dd4: 8082 ret + +03005dd6 : +float adc_num[adc_shownum]={0}; +unsigned int i=0; + + +void TIMER3_InterruptProcess(void *handle) +{ + 3005dd6: 7179 addi sp,sp,-48 + 3005dd8: d606 sw ra,44(sp) + 3005dda: d422 sw s0,40(sp) + 3005ddc: 1800 addi s0,sp,48 + 3005dde: fca42e23 sw a0,-36(s0) + unsigned int ret = HAL_ADC_GetConvResult(&g_adc0, ADC_SOC_NUM1); + 3005de2: 4585 li a1,1 + 3005de4: 040007b7 lui a5,0x4000 + 3005de8: 54478513 addi a0,a5,1348 # 4000544 + 3005dec: 840fc0ef jal ra,3001e2c + 3005df0: fea42623 sw a0,-20(s0) + + + adc_num[i] = (float)ret / (float)4096 * 3.3; + 3005df4: fec42783 lw a5,-20(s0) + 3005df8: d017f753 fcvt.s.wu fa4,a5 + 3005dfc: 030067b7 lui a5,0x3006 + 3005e00: 6887a787 flw fa5,1672(a5) # 3006688 + 3005e04: 18f77753 fdiv.s fa4,fa4,fa5 + 3005e08: 040027b7 lui a5,0x4002 + 3005e0c: 2047a783 lw a5,516(a5) # 4002204 + 3005e10: 03006737 lui a4,0x3006 + 3005e14: 68c72787 flw fa5,1676(a4) # 300668c + 3005e18: 10f777d3 fmul.s fa5,fa4,fa5 + 3005e1c: 04000737 lui a4,0x4000 + 3005e20: 5e470713 addi a4,a4,1508 # 40005e4 + 3005e24: 078a slli a5,a5,0x2 + 3005e26: 97ba add a5,a5,a4 + 3005e28: e39c fsw fa5,0(a5) + i++; + 3005e2a: 040027b7 lui a5,0x4002 + 3005e2e: 2047a783 lw a5,516(a5) # 4002204 + 3005e32: 00178713 addi a4,a5,1 + 3005e36: 040027b7 lui a5,0x4002 + 3005e3a: 20e7a223 sw a4,516(a5) # 4002204 + if(i>adc_shownum){ + 3005e3e: 040027b7 lui a5,0x4002 + 3005e42: 2047a703 lw a4,516(a5) # 4002204 + 3005e46: 70800793 li a5,1800 + 3005e4a: 06e7f563 bgeu a5,a4,3005eb4 + for(i=0;i + 3005e56: a099 j 3005e9c + { + DBG_PRINTF("V:%.2f\r\n", adc_num[i]); + 3005e58: 040027b7 lui a5,0x4002 + 3005e5c: 2047a783 lw a5,516(a5) # 4002204 + 3005e60: 04000737 lui a4,0x4000 + 3005e64: 5e470713 addi a4,a4,1508 # 40005e4 + 3005e68: 078a slli a5,a5,0x2 + 3005e6a: 97ba add a5,a5,a4 + 3005e6c: 639c flw fa5,0(a5) + 3005e6e: 20f78553 fmv.s fa0,fa5 + 3005e72: 20b1 jal ra,3005ebe <__extendsfdf2> + 3005e74: 87aa mv a5,a0 + 3005e76: 882e mv a6,a1 + 3005e78: 863e mv a2,a5 + 3005e7a: 86c2 mv a3,a6 + 3005e7c: 030067b7 lui a5,0x3006 + 3005e80: 67c78513 addi a0,a5,1660 # 300667c + 3005e84: b85fe0ef jal ra,3004a08 + for(i=0;i + 3005e90: 00178713 addi a4,a5,1 + 3005e94: 040027b7 lui a5,0x4002 + 3005e98: 20e7a223 sw a4,516(a5) # 4002204 + 3005e9c: 040027b7 lui a5,0x4002 + 3005ea0: 2047a703 lw a4,516(a5) # 4002204 + 3005ea4: 70700793 li a5,1799 + 3005ea8: fae7f8e3 bgeu a5,a4,3005e58 + } + i=0; + 3005eac: 040027b7 lui a5,0x4002 + 3005eb0: 2007a223 sw zero,516(a5) # 4002204 + } + +} + 3005eb4: 0001 nop + 3005eb6: 50b2 lw ra,44(sp) + 3005eb8: 5422 lw s0,40(sp) + 3005eba: 6145 addi sp,sp,48 + 3005ebc: 8082 ret + +03005ebe <__extendsfdf2>: + 3005ebe: 1141 addi sp,sp,-16 + 3005ec0: c606 sw ra,12(sp) + 3005ec2: c422 sw s0,8(sp) + 3005ec4: c226 sw s1,4(sp) + 3005ec6: e00506d3 fmv.x.w a3,fa0 + 3005eca: 002027f3 frrm a5 + 3005ece: 0176d513 srli a0,a3,0x17 + 3005ed2: 0ff57513 andi a0,a0,255 + 3005ed6: 00800437 lui s0,0x800 + 3005eda: 00150793 addi a5,a0,1 # 14000001 + 3005ede: 147d addi s0,s0,-1 # 7fffff + 3005ee0: 0ff7f793 andi a5,a5,255 + 3005ee4: 4705 li a4,1 + 3005ee6: 8c75 and s0,s0,a3 + 3005ee8: 01f6d493 srli s1,a3,0x1f + 3005eec: 00f75963 bge a4,a5,3005efe <__extendsfdf2+0x40> + 3005ef0: 00345793 srli a5,s0,0x3 + 3005ef4: 38050513 addi a0,a0,896 + 3005ef8: 0476 slli s0,s0,0x1d + 3005efa: 4701 li a4,0 + 3005efc: a891 j 3005f50 <__extendsfdf2+0x92> + 3005efe: e915 bnez a0,3005f32 <__extendsfdf2+0x74> + 3005f00: c459 beqz s0,3005f8e <__extendsfdf2+0xd0> + 3005f02: 8522 mv a0,s0 + 3005f04: 2c6d jal ra,30061be <__clzsi2> + 3005f06: 47a9 li a5,10 + 3005f08: 00a7cf63 blt a5,a0,3005f26 <__extendsfdf2+0x68> + 3005f0c: 47ad li a5,11 + 3005f0e: 8f89 sub a5,a5,a0 + 3005f10: 01550713 addi a4,a0,21 + 3005f14: 00f457b3 srl a5,s0,a5 + 3005f18: 00e41433 sll s0,s0,a4 + 3005f1c: 38900713 li a4,905 + 3005f20: 40a70533 sub a0,a4,a0 + 3005f24: bfd9 j 3005efa <__extendsfdf2+0x3c> + 3005f26: ff550793 addi a5,a0,-11 + 3005f2a: 00f417b3 sll a5,s0,a5 + 3005f2e: 4401 li s0,0 + 3005f30: b7f5 j 3005f1c <__extendsfdf2+0x5e> + 3005f32: c02d beqz s0,3005f94 <__extendsfdf2+0xd6> + 3005f34: 00400737 lui a4,0x400 + 3005f38: 8f61 and a4,a4,s0 + 3005f3a: 00345793 srli a5,s0,0x3 + 3005f3e: 00173713 seqz a4,a4 + 3005f42: 000806b7 lui a3,0x80 + 3005f46: 0712 slli a4,a4,0x4 + 3005f48: 0476 slli s0,s0,0x1d + 3005f4a: 8fd5 or a5,a5,a3 + 3005f4c: 7ff00513 li a0,2047 + 3005f50: 00100637 lui a2,0x100 + 3005f54: 167d addi a2,a2,-1 # fffff + 3005f56: 8ff1 and a5,a5,a2 + 3005f58: 80100637 lui a2,0x80100 + 3005f5c: 167d addi a2,a2,-1 # 800fffff + 3005f5e: 7ff57513 andi a0,a0,2047 + 3005f62: 0552 slli a0,a0,0x14 + 3005f64: 8ff1 and a5,a5,a2 + 3005f66: 80000637 lui a2,0x80000 + 3005f6a: 8fc9 or a5,a5,a0 + 3005f6c: fff64613 not a2,a2 + 3005f70: 01f49693 slli a3,s1,0x1f + 3005f74: 8ff1 and a5,a5,a2 + 3005f76: 00d7e633 or a2,a5,a3 + 3005f7a: 8522 mv a0,s0 + 3005f7c: 85b2 mv a1,a2 + 3005f7e: c319 beqz a4,3005f84 <__extendsfdf2+0xc6> + 3005f80: 00172073 csrs fflags,a4 + 3005f84: 40b2 lw ra,12(sp) + 3005f86: 4422 lw s0,8(sp) + 3005f88: 4492 lw s1,4(sp) + 3005f8a: 0141 addi sp,sp,16 + 3005f8c: 8082 ret + 3005f8e: 4781 li a5,0 + 3005f90: 4501 li a0,0 + 3005f92: b7a5 j 3005efa <__extendsfdf2+0x3c> + 3005f94: 4781 li a5,0 + 3005f96: 7ff00513 li a0,2047 + 3005f9a: b785 j 3005efa <__extendsfdf2+0x3c> + +03005f9c <__truncdfsf2>: + 3005f9c: 00202873 frrm a6 + 3005fa0: 001006b7 lui a3,0x100 + 3005fa4: 16fd addi a3,a3,-1 # fffff + 3005fa6: 8eed and a3,a3,a1 + 3005fa8: 0145d893 srli a7,a1,0x14 + 3005fac: 00369793 slli a5,a3,0x3 + 3005fb0: 7ff8f893 andi a7,a7,2047 + 3005fb4: 01d55693 srli a3,a0,0x1d + 3005fb8: 8edd or a3,a3,a5 + 3005fba: 00188793 addi a5,a7,1 + 3005fbe: 7ff7f793 andi a5,a5,2047 + 3005fc2: 4705 li a4,1 + 3005fc4: 81fd srli a1,a1,0x1f + 3005fc6: 00351613 slli a2,a0,0x3 + 3005fca: 16f75b63 bge a4,a5,3006140 <__truncdfsf2+0x1a4> + 3005fce: c8088713 addi a4,a7,-896 + 3005fd2: 0fe00793 li a5,254 + 3005fd6: 0ae7d063 bge a5,a4,3006076 <__truncdfsf2+0xda> + 3005fda: 04080063 beqz a6,300601a <__truncdfsf2+0x7e> + 3005fde: 478d li a5,3 + 3005fe0: 02f81963 bne a6,a5,3006012 <__truncdfsf2+0x76> + 3005fe4: c99d beqz a1,300601a <__truncdfsf2+0x7e> + 3005fe6: 57fd li a5,-1 + 3005fe8: 0fe00713 li a4,254 + 3005fec: 4681 li a3,0 + 3005fee: 4615 li a2,5 + 3005ff0: 4509 li a0,2 + 3005ff2: 00166613 ori a2,a2,1 + 3005ff6: 1aa80063 beq a6,a0,3006196 <__truncdfsf2+0x1fa> + 3005ffa: 450d li a0,3 + 3005ffc: 18a80a63 beq a6,a0,3006190 <__truncdfsf2+0x1f4> + 3006000: 12081763 bnez a6,300612e <__truncdfsf2+0x192> + 3006004: 00f7f513 andi a0,a5,15 + 3006008: 4891 li a7,4 + 300600a: 13150263 beq a0,a7,300612e <__truncdfsf2+0x192> + 300600e: 0791 addi a5,a5,4 + 3006010: aa39 j 300612e <__truncdfsf2+0x192> + 3006012: 4789 li a5,2 + 3006014: fcf819e3 bne a6,a5,3005fe6 <__truncdfsf2+0x4a> + 3006018: d5f9 beqz a1,3005fe6 <__truncdfsf2+0x4a> + 300601a: 4781 li a5,0 + 300601c: 0ff00713 li a4,255 + 3006020: 4615 li a2,5 + 3006022: 00579693 slli a3,a5,0x5 + 3006026: 0006db63 bgez a3,300603c <__truncdfsf2+0xa0> + 300602a: 0705 addi a4,a4,1 # 400001 + 300602c: 0ff00693 li a3,255 + 3006030: 16d70563 beq a4,a3,300619a <__truncdfsf2+0x1fe> + 3006034: fc0006b7 lui a3,0xfc000 + 3006038: 16fd addi a3,a3,-1 # fbffffff + 300603a: 8ff5 and a5,a5,a3 + 300603c: 0ff00693 li a3,255 + 3006040: 838d srli a5,a5,0x3 + 3006042: 00d71663 bne a4,a3,300604e <__truncdfsf2+0xb2> + 3006046: c781 beqz a5,300604e <__truncdfsf2+0xb2> + 3006048: 004007b7 lui a5,0x400 + 300604c: 4581 li a1,0 + 300604e: 008006b7 lui a3,0x800 + 3006052: 16fd addi a3,a3,-1 # 7fffff + 3006054: 8ff5 and a5,a5,a3 + 3006056: 808006b7 lui a3,0x80800 + 300605a: 0ff77713 andi a4,a4,255 + 300605e: 16fd addi a3,a3,-1 # 807fffff + 3006060: 075e slli a4,a4,0x17 + 3006062: 8ff5 and a5,a5,a3 + 3006064: 05fe slli a1,a1,0x1f + 3006066: 8fd9 or a5,a5,a4 + 3006068: 8fcd or a5,a5,a1 + 300606a: c219 beqz a2,3006070 <__truncdfsf2+0xd4> + 300606c: 00162073 csrs fflags,a2 + 3006070: f0078553 fmv.w.x fa0,a5 + 3006074: 8082 ret + 3006076: 08e04e63 bgtz a4,3006112 <__truncdfsf2+0x176> + 300607a: 57a5 li a5,-23 + 300607c: 0ef74d63 blt a4,a5,3006176 <__truncdfsf2+0x1da> + 3006080: 008007b7 lui a5,0x800 + 3006084: 4379 li t1,30 + 3006086: 8edd or a3,a3,a5 + 3006088: 40e30333 sub t1,t1,a4 + 300608c: 47fd li a5,31 + 300608e: 0467ce63 blt a5,t1,30060ea <__truncdfsf2+0x14e> + 3006092: c8288893 addi a7,a7,-894 + 3006096: 011617b3 sll a5,a2,a7 + 300609a: 00f037b3 snez a5,a5 + 300609e: 011696b3 sll a3,a3,a7 + 30060a2: 00665333 srl t1,a2,t1 + 30060a6: 8edd or a3,a3,a5 + 30060a8: 00d367b3 or a5,t1,a3 + 30060ac: 4701 li a4,0 + 30060ae: cff9 beqz a5,300618c <__truncdfsf2+0x1f0> + 30060b0: 00179713 slli a4,a5,0x1 + 30060b4: 00777693 andi a3,a4,7 + 30060b8: 4601 li a2,0 + 30060ba: c28d beqz a3,30060dc <__truncdfsf2+0x140> + 30060bc: 4689 li a3,2 + 30060be: 0cd80263 beq a6,a3,3006182 <__truncdfsf2+0x1e6> + 30060c2: 468d li a3,3 + 30060c4: 0ad80b63 beq a6,a3,300617a <__truncdfsf2+0x1de> + 30060c8: 4605 li a2,1 + 30060ca: 00081963 bnez a6,30060dc <__truncdfsf2+0x140> + 30060ce: 00f77693 andi a3,a4,15 + 30060d2: 4511 li a0,4 + 30060d4: 4605 li a2,1 + 30060d6: 00a68363 beq a3,a0,30060dc <__truncdfsf2+0x140> + 30060da: 0711 addi a4,a4,4 + 30060dc: 01b75693 srli a3,a4,0x1b + 30060e0: 0016c693 xori a3,a3,1 + 30060e4: 8a85 andi a3,a3,1 + 30060e6: 4701 li a4,0 + 30060e8: a83d j 3006126 <__truncdfsf2+0x18a> + 30060ea: 57f9 li a5,-2 + 30060ec: 40e78733 sub a4,a5,a4 + 30060f0: 02000793 li a5,32 + 30060f4: 00e6d733 srl a4,a3,a4 + 30060f8: 4501 li a0,0 + 30060fa: 00f30663 beq t1,a5,3006106 <__truncdfsf2+0x16a> + 30060fe: ca288893 addi a7,a7,-862 + 3006102: 01169533 sll a0,a3,a7 + 3006106: 00c567b3 or a5,a0,a2 + 300610a: 00f037b3 snez a5,a5 + 300610e: 8fd9 or a5,a5,a4 + 3006110: bf71 j 30060ac <__truncdfsf2+0x110> + 3006112: 051a slli a0,a0,0x6 + 3006114: 00a037b3 snez a5,a0 + 3006118: 068e slli a3,a3,0x3 + 300611a: 8275 srli a2,a2,0x1d + 300611c: 8edd or a3,a3,a5 + 300611e: 00c6e7b3 or a5,a3,a2 + 3006122: 4681 li a3,0 + 3006124: 4601 li a2,0 + 3006126: 0077f513 andi a0,a5,7 + 300612a: ec0513e3 bnez a0,3005ff0 <__truncdfsf2+0x54> + 300612e: ee068ae3 beqz a3,3006022 <__truncdfsf2+0x86> + 3006132: 00167693 andi a3,a2,1 + 3006136: ee0686e3 beqz a3,3006022 <__truncdfsf2+0x86> + 300613a: 00266613 ori a2,a2,2 + 300613e: b5d5 j 3006022 <__truncdfsf2+0x86> + 3006140: 00c6e7b3 or a5,a3,a2 + 3006144: 00089563 bnez a7,300614e <__truncdfsf2+0x1b2> + 3006148: 00f037b3 snez a5,a5 + 300614c: b785 j 30060ac <__truncdfsf2+0x110> + 300614e: cf8d beqz a5,3006188 <__truncdfsf2+0x1ec> + 3006150: 7ff00793 li a5,2047 + 3006154: 4601 li a2,0 + 3006156: 00f89863 bne a7,a5,3006166 <__truncdfsf2+0x1ca> + 300615a: 00400637 lui a2,0x400 + 300615e: 8e75 and a2,a2,a3 + 3006160: 00163613 seqz a2,a2 + 3006164: 0612 slli a2,a2,0x4 + 3006166: 068e slli a3,a3,0x3 + 3006168: 020007b7 lui a5,0x2000 + 300616c: 8fd5 or a5,a5,a3 + 300616e: 0ff00713 li a4,255 + 3006172: 4681 li a3,0 + 3006174: bf4d j 3006126 <__truncdfsf2+0x18a> + 3006176: 4785 li a5,1 + 3006178: bf25 j 30060b0 <__truncdfsf2+0x114> + 300617a: 4605 li a2,1 + 300617c: f1a5 bnez a1,30060dc <__truncdfsf2+0x140> + 300617e: 0721 addi a4,a4,8 + 3006180: bfb1 j 30060dc <__truncdfsf2+0x140> + 3006182: 4605 li a2,1 + 3006184: dda1 beqz a1,30060dc <__truncdfsf2+0x140> + 3006186: bfe5 j 300617e <__truncdfsf2+0x1e2> + 3006188: 0ff00713 li a4,255 + 300618c: 4601 li a2,0 + 300618e: bd51 j 3006022 <__truncdfsf2+0x86> + 3006190: fdd9 bnez a1,300612e <__truncdfsf2+0x192> + 3006192: 07a1 addi a5,a5,8 # 2000008 + 3006194: bf69 j 300612e <__truncdfsf2+0x192> + 3006196: ddc1 beqz a1,300612e <__truncdfsf2+0x192> + 3006198: bfed j 3006192 <__truncdfsf2+0x1f6> + 300619a: 4781 li a5,0 + 300619c: 00080e63 beqz a6,30061b8 <__truncdfsf2+0x21c> + 30061a0: 468d li a3,3 + 30061a2: 00d81763 bne a6,a3,30061b0 <__truncdfsf2+0x214> + 30061a6: c989 beqz a1,30061b8 <__truncdfsf2+0x21c> + 30061a8: 57fd li a5,-1 + 30061aa: 0fe00713 li a4,254 + 30061ae: a029 j 30061b8 <__truncdfsf2+0x21c> + 30061b0: 4689 li a3,2 + 30061b2: fed81be3 bne a6,a3,30061a8 <__truncdfsf2+0x20c> + 30061b6: d9ed beqz a1,30061a8 <__truncdfsf2+0x20c> + 30061b8: 00566613 ori a2,a2,5 + 30061bc: b541 j 300603c <__truncdfsf2+0xa0> + +030061be <__clzsi2>: + 30061be: 67c1 lui a5,0x10 + 30061c0: 02f57663 bgeu a0,a5,30061ec <__clzsi2+0x2e> + 30061c4: 0ff00793 li a5,255 + 30061c8: 00a7b7b3 sltu a5,a5,a0 + 30061cc: 078e slli a5,a5,0x3 + 30061ce: 02000713 li a4,32 + 30061d2: 8f1d sub a4,a4,a5 + 30061d4: 00f557b3 srl a5,a0,a5 + 30061d8: 00000517 auipc a0,0x0 + 30061dc: 5bc52503 lw a0,1468(a0) # 3006794 <_GLOBAL_OFFSET_TABLE_+0x4> + 30061e0: 97aa add a5,a5,a0 + 30061e2: 0007c503 lbu a0,0(a5) # 10000 + 30061e6: 40a70533 sub a0,a4,a0 + 30061ea: 8082 ret + 30061ec: 01000737 lui a4,0x1000 + 30061f0: 47c1 li a5,16 + 30061f2: fce56ee3 bltu a0,a4,30061ce <__clzsi2+0x10> + 30061f6: 47e1 li a5,24 + 30061f8: bfd9 j 30061ce <__clzsi2+0x10> + ... + +030061fc <__rodata_start>: + 30061fc: 9680 pop {ra,s0-s6},384 + 30061fe: 4b18 lw a4,16(a4) + +03006200 : + 3006200: 0000 1400 0000 0000 0140 0000 1000 1400 ........@....... + 3006210: 0000 0000 0144 0000 2000 1400 0000 0000 ....D.... ...... + 3006220: 0148 0000 3000 1400 0000 0000 014c 0000 H....0......L... + 3006230: 0000 1430 0000 0000 0240 0000 1000 1430 ..0.....@.....0. + 3006240: 0000 0000 0244 0000 2000 1430 0000 0000 ....D.... 0..... + 3006250: 0248 0000 3000 1430 0000 0000 024c 0000 H....00.....L... + 3006260: 0000 1438 0000 0000 0040 0000 0000 1420 ..8.....@..... . + 3006270: 0000 0000 0180 0000 1000 1420 0000 0000 .......... ..... + 3006280: 0184 0000 0000 1410 0000 0000 01c0 0000 ................ + 3006290: 1000 1410 0000 0000 01c4 0000 0000 1460 ..............`. + 30062a0: 0001 0000 02c0 0000 0000 1470 0000 0000 ..........p..... + 30062b0: 0440 0000 1000 1470 0000 0000 0444 0000 @.....p.....D... + 30062c0: 2000 1470 0000 0000 0448 0000 3000 1470 . p.....H....0p. + 30062d0: 0000 0000 044c 0000 0000 1440 0000 0000 ....L.....@..... + 30062e0: 0200 0000 0000 14b0 0000 0000 0280 0000 ................ + 30062f0: 1000 14b0 0000 0000 0284 0000 2000 14b0 ............. .. + 3006300: 0000 0000 0288 0000 0000 1c00 0000 0000 ................ + 3006310: 0300 0000 0000 1450 0000 0000 0480 0000 ......P......... + 3006320: 1000 1450 0000 0000 0484 0000 2000 1450 ..P.......... P. + 3006330: 0000 0000 0488 0000 3000 1450 0000 0000 .........0P..... + 3006340: 048c 0000 4000 1450 0000 0000 0490 0000 .....@P......... + 3006350: 5000 1450 0000 0000 0494 0000 1000 1440 .PP...........@. + 3006360: 0004 0000 03c0 0000 0000 14c0 0000 0000 ................ + 3006370: 04c0 0000 1000 14c0 0000 0000 04c4 0000 ................ + 3006380: 0000 147d 0000 0000 0b00 0000 0000 1480 ..}............. + 3006390: 0000 0000 0380 0000 0000 14a0 0000 0000 ................ + 30063a0: 0400 0000 1000 14a0 0000 0000 0404 0000 ................ + 30063b0: 2000 14a0 0000 0000 0408 0000 3000 14a0 . ...........0.. + 30063c0: 0000 0000 040c 0000 0000 1001 0000 0000 ................ + 30063d0: 0340 0000 0000 1810 0005 0000 0a60 0000 @...........`... + 30063e0: 0000 1830 0005 0000 0a70 0000 0000 1840 ..0.....p.....@. + 30063f0: 0005 0000 0a80 0000 0000 1820 0005 0000 .......... ..... + 3006400: 0a90 0000 1000 1820 0005 0000 0a90 0004 ...... ......... + 3006410: 0000 1800 0002 0000 0a00 0000 0000 1471 ..............q. + 3006420: 0003 0000 0500 0000 2e2e 642f 6972 6576 ........../drive + 3006430: 7372 612f 6364 692f 636e 612f 6364 695f rs/adc/inc/adc_i + 3006440: 2e70 0068 2e2e 642f 6972 6576 7372 612f p.h.../drivers/a + 3006450: 6364 732f 6372 612f 6364 632e 0000 0000 dc/src/adc.c.... + 3006460: 0000 3f80 0000 4480 5547 4055 0000 4580 ...?...DGUU@...E + 3006470: 6666 4026 51ec 4068 2e2e 642f 6972 6576 ff&@.Qh@../drive + 3006480: 7372 622f 7361 2f65 7273 2f63 6e69 6574 rs/base/src/inte + 3006490: 7272 7075 2e74 0063 2308 0300 235a 0300 rrupt.c..#..Z#.. + 30064a0: 23ac 0300 23fe 0300 2450 0300 24a2 0300 .#...#..P$...$.. + 30064b0: 24f4 0300 2546 0300 25dc 0300 262e 0300 .$..F%...%...&.. + 30064c0: 2680 0300 26d2 0300 2724 0300 2776 0300 .&...&..$'..v'.. + 30064d0: 27c8 0300 281a 0300 2e2e 642f 6972 6576 .'...(..../drive + 30064e0: 7372 632f 6772 692f 636e 632f 6772 695f rs/crg/inc/crg_i + 30064f0: 2e70 0068 2e2e 642f 6972 6576 7372 632f p.h.../drivers/c + 3006500: 6772 732f 6372 632f 6772 632e 0000 0000 rg/src/crg.c.... + 3006510: 0000 0000 0001 0000 0002 0000 0003 0000 ................ + 3006520: 0004 0000 0005 0000 0006 0000 0007 0000 ................ + 3006530: 329c 0300 32a6 0300 32be 0300 329c 0300 .2...2...2...2.. + 3006540: 32da 0300 329c 0300 47f8 0300 4862 0300 .2...2...G..bH.. + 3006550: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 3006560: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 3006570: 4862 0300 4738 0300 478e 0300 4862 0300 bH..8G...G..bH.. + 3006580: 4822 0300 4862 0300 4862 0300 4862 0300 "H..bH..bH..bH.. + 3006590: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 30065a0: 4862 0300 4862 0300 47f8 0300 4862 0300 bH..bH...G..bH.. + 30065b0: 4862 0300 4762 0300 4862 0300 47b8 0300 bH..bG..bH...G.. + 30065c0: 4862 0300 4862 0300 47f8 0300 2e2e 642f bH..bH...G..../d + 30065d0: 6972 6576 7372 692f 636f 676d 692f 636e rivers/iocmg/inc + 30065e0: 692f 636f 676d 695f 2e70 0068 2e2e 642f /iocmg_ip.h.../d + 30065f0: 6972 6576 7372 692f 636f 676d 732f 6372 rivers/iocmg/src + 3006600: 692f 636f 676d 632e 0000 0000 2e2e 642f /iocmg.c....../d + 3006610: 6972 6576 7372 742f 6d69 7265 692f 636e rivers/timer/inc + 3006620: 742f 6d69 7265 695f 2e70 0068 2e2e 642f /timer_ip.h.../d + 3006630: 6972 6576 7372 742f 6d69 7265 732f 6372 rivers/timer/src + 3006640: 742f 6d69 7265 632e 0000 0000 55be 0300 /timer.c.....U.. + 3006650: 55d4 0300 55ea 0300 5600 0300 5616 0300 .U...U...V...V.. + 3006660: 2e2e 642f 6972 6576 7372 752f 7261 2f74 ../drivers/uart/ + 3006670: 7273 2f63 6175 7472 632e 0000 3a56 2e25 src/uart.c..V:%. + 3006680: 6632 0a0d 0000 0000 0000 4580 3333 4053 2f.........E33S@ + +03006690 <__clz_tab>: + 3006690: 0100 0202 0303 0303 0404 0404 0404 0404 ................ + 30066a0: 0505 0505 0505 0505 0505 0505 0505 0505 ................ + 30066b0: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 30066c0: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 30066d0: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 30066e0: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 30066f0: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006700: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006710: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006720: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006730: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006740: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006750: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006760: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006770: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006780: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + +03006790 <_GLOBAL_OFFSET_TABLE_>: + 3006790: 0000 0000 6690 0300 ffff ffff 0000 0000 .....f.......... + +out/bin/target.elf: file format elf32-littleriscv + + +Disassembly of section .text.entry: + +03000004 <_start>: + + .section .text.entry + .global _start + .option norvc +_start: + j handle_reset + 3000004: 4fc0006f j 3000500 + +03000008 : +.endm + +/* The interrupt vector table must be aligned with 4 bytes */ +.align 2 +TrapHandler: + j TrapVector /* trap and INT 0 */ + 3000008: 4680006f j 3000470 + j TrapVector /* INT 1 */ + 300000c: 4640006f j 3000470 + j TrapVector /* INT 2 */ + 3000010: 4600006f j 3000470 + j TrapVector /* INT 3 */ + 3000014: 45c0006f j 3000470 + j TrapVector /* INT 4 */ + 3000018: 4580006f j 3000470 + j TrapVector /* INT 5 */ + 300001c: 4540006f j 3000470 + j TrapVector /* INT 6 */ + 3000020: 4500006f j 3000470 + j TrapVector /* INT 7 */ + 3000024: 44c0006f j 3000470 + j TrapVector /* INT 8 */ + 3000028: 4480006f j 3000470 + j TrapVector /* INT 9 */ + 300002c: 4440006f j 3000470 + j TrapVector /* INT 10 */ + 3000030: 4400006f j 3000470 + j TrapVector /* INT 11 */ + 3000034: 43c0006f j 3000470 + j TrapVector /* INT 12 */ + 3000038: 4380006f j 3000470 + j TrapVector /* INT 13 */ + 300003c: 4340006f j 3000470 + j TrapVector /* INT 14 */ + 3000040: 4300006f j 3000470 + j TrapVector /* INT 15 */ + 3000044: 42c0006f j 3000470 + j TrapVector /* INT 16 */ + 3000048: 4280006f j 3000470 + j TrapVector /* INT 17 */ + 300004c: 4240006f j 3000470 + j TrapVector /* INT 18 */ + 3000050: 4200006f j 3000470 + j TrapVector /* INT 19 */ + 3000054: 41c0006f j 3000470 + j TrapVector /* INT 20 */ + 3000058: 4180006f j 3000470 + j TrapVector /* INT 21 */ + 300005c: 4140006f j 3000470 + j TrapVector /* INT 22 */ + 3000060: 4100006f j 3000470 + j TrapVector /* INT 23 */ + 3000064: 40c0006f j 3000470 + j TrapVector /* INT 24 */ + 3000068: 4080006f j 3000470 + j TrapVector /* INT 25 */ + 300006c: 4040006f j 3000470 + + j IntHandler /* INT 26 */ + 3000070: 2640006f j 30002d4 + j IntHandler /* INT 27 */ + 3000074: 2600006f j 30002d4 + j IntHandler /* INT 28 */ + 3000078: 25c0006f j 30002d4 + j IntHandler /* INT 29 */ + 300007c: 2580006f j 30002d4 + j IntHandler /* INT 30 */ + 3000080: 2540006f j 30002d4 + j IntHandler /* INT 31 */ + 3000084: 2500006f j 30002d4 + j IntHandler /* INT 32 */ + 3000088: 24c0006f j 30002d4 + j IntHandler /* INT 33 */ + 300008c: 2480006f j 30002d4 + j IntHandler /* INT 34 */ + 3000090: 2440006f j 30002d4 + j IntHandler /* INT 35 */ + 3000094: 2400006f j 30002d4 + j IntHandler /* INT 36 */ + 3000098: 23c0006f j 30002d4 + j IntHandler /* INT 37 */ + 300009c: 2380006f j 30002d4 + j IntHandler /* INT 38 */ + 30000a0: 2340006f j 30002d4 + j IntHandler /* INT 39 */ + 30000a4: 2300006f j 30002d4 + j IntHandler /* INT 40 */ + 30000a8: 22c0006f j 30002d4 + j IntHandler /* INT 41 */ + 30000ac: 2280006f j 30002d4 + j IntHandler /* INT 42 */ + 30000b0: 2240006f j 30002d4 + j IntHandler /* INT 43 */ + 30000b4: 2200006f j 30002d4 + j IntHandler /* INT 44 */ + 30000b8: 21c0006f j 30002d4 + j IntHandler /* INT 45 */ + 30000bc: 2180006f j 30002d4 + j IntHandler /* INT 46 */ + 30000c0: 2140006f j 30002d4 + j IntHandler /* INT 47 */ + 30000c4: 2100006f j 30002d4 + j IntHandler /* INT 48 */ + 30000c8: 20c0006f j 30002d4 + j IntHandler /* INT 49 */ + 30000cc: 2080006f j 30002d4 + j IntHandler /* INT 50 */ + 30000d0: 2040006f j 30002d4 + j IntHandler /* INT 51 */ + 30000d4: 2000006f j 30002d4 + j IntHandler /* INT 52 */ + 30000d8: 1fc0006f j 30002d4 + j IntHandler /* INT 53 */ + 30000dc: 1f80006f j 30002d4 + j IntHandler /* INT 54 */ + 30000e0: 1f40006f j 30002d4 + j IntHandler /* INT 55 */ + 30000e4: 1f00006f j 30002d4 + j IntHandler /* INT 56 */ + 30000e8: 1ec0006f j 30002d4 + j IntHandler /* INT 57 */ + 30000ec: 1e80006f j 30002d4 + j IntHandler /* INT 58 */ + 30000f0: 1e40006f j 30002d4 + j IntHandler /* INT 59 */ + 30000f4: 1e00006f j 30002d4 + j IntHandler /* INT 60 */ + 30000f8: 1dc0006f j 30002d4 + j IntHandler /* INT 61 */ + 30000fc: 1d80006f j 30002d4 + j IntHandler /* INT 62 */ + 3000100: 1d40006f j 30002d4 + j IntHandler /* INT 63 */ + 3000104: 1d00006f j 30002d4 + j IntHandler /* INT 64 */ + 3000108: 1cc0006f j 30002d4 + j IntHandler /* INT 65 */ + 300010c: 1c80006f j 30002d4 + j IntHandler /* INT 66 */ + 3000110: 1c40006f j 30002d4 + j IntHandler /* INT 67 */ + 3000114: 1c00006f j 30002d4 + j IntHandler /* INT 68 */ + 3000118: 1bc0006f j 30002d4 + j IntHandler /* INT 69 */ + 300011c: 1b80006f j 30002d4 + j IntHandler /* INT 70 */ + 3000120: 1b40006f j 30002d4 + j IntHandler /* INT 71 */ + 3000124: 1b00006f j 30002d4 + j IntHandler /* INT 72 */ + 3000128: 1ac0006f j 30002d4 + j IntHandler /* INT 73 */ + 300012c: 1a80006f j 30002d4 + j IntHandler /* INT 74 */ + 3000130: 1a40006f j 30002d4 + j IntHandler /* INT 75 */ + 3000134: 1a00006f j 30002d4 + j IntHandler /* INT 76 */ + 3000138: 19c0006f j 30002d4 + j IntHandler /* INT 77 */ + 300013c: 1980006f j 30002d4 + j IntHandler /* INT 78 */ + 3000140: 1940006f j 30002d4 + j IntHandler /* INT 79 */ + 3000144: 1900006f j 30002d4 + j IntHandler /* INT 80 */ + 3000148: 18c0006f j 30002d4 + j IntHandler /* INT 81 */ + 300014c: 1880006f j 30002d4 + j IntHandler /* INT 82 */ + 3000150: 1840006f j 30002d4 + j IntHandler /* INT 83 */ + 3000154: 1800006f j 30002d4 + j IntHandler /* INT 84 */ + 3000158: 17c0006f j 30002d4 + j IntHandler /* INT 85 */ + 300015c: 1780006f j 30002d4 + j IntHandler /* INT 86 */ + 3000160: 1740006f j 30002d4 + j IntHandler /* INT 87 */ + 3000164: 1700006f j 30002d4 + j IntHandler /* INT 88 */ + 3000168: 16c0006f j 30002d4 + j IntHandler /* INT 89 */ + 300016c: 1680006f j 30002d4 + j IntHandler /* INT 90 */ + 3000170: 1640006f j 30002d4 + j IntHandler /* INT 91 */ + 3000174: 1600006f j 30002d4 + j IntHandler /* INT 92 */ + 3000178: 15c0006f j 30002d4 + j IntHandler /* INT 93 */ + 300017c: 1580006f j 30002d4 + j IntHandler /* INT 94 */ + 3000180: 1540006f j 30002d4 + j IntHandler /* INT 95 */ + 3000184: 1500006f j 30002d4 + j IntHandler /* INT 96 */ + 3000188: 14c0006f j 30002d4 + j IntHandler /* INT 97 */ + 300018c: 1480006f j 30002d4 + j IntHandler /* INT 98 */ + 3000190: 1440006f j 30002d4 + j IntHandler /* INT 99 */ + 3000194: 1400006f j 30002d4 + j IntHandler /* INT 100 */ + 3000198: 13c0006f j 30002d4 + j IntHandler /* INT 101 */ + 300019c: 1380006f j 30002d4 + j IntHandler /* INT 102 */ + 30001a0: 1340006f j 30002d4 + j IntHandler /* INT 103 */ + 30001a4: 1300006f j 30002d4 + j IntHandler /* INT 104 */ + 30001a8: 12c0006f j 30002d4 + j IntHandler /* INT 105 */ + 30001ac: 1280006f j 30002d4 + j IntHandler /* INT 106 */ + 30001b0: 1240006f j 30002d4 + j IntHandler /* INT 107 */ + 30001b4: 1200006f j 30002d4 + j IntHandler /* INT 108 */ + 30001b8: 11c0006f j 30002d4 + j IntHandler /* INT 109 */ + 30001bc: 1180006f j 30002d4 + j IntHandler /* INT 110 */ + 30001c0: 1140006f j 30002d4 + j IntHandler /* INT 111 */ + 30001c4: 1100006f j 30002d4 + j IntHandler /* INT 112 */ + 30001c8: 10c0006f j 30002d4 + j IntHandler /* INT 113 */ + 30001cc: 1080006f j 30002d4 + j IntHandler /* INT 114 */ + 30001d0: 1040006f j 30002d4 + j IntHandler /* INT 115 */ + 30001d4: 1000006f j 30002d4 + j IntHandler /* INT 116 */ + 30001d8: 0fc0006f j 30002d4 + j IntHandler /* INT 117 */ + 30001dc: 0f80006f j 30002d4 + j IntHandler /* INT 118 */ + 30001e0: 0f40006f j 30002d4 + j IntHandler /* INT 119 */ + 30001e4: 0f00006f j 30002d4 + j IntHandler /* INT 120 */ + 30001e8: 0ec0006f j 30002d4 + j IntHandler /* INT 121 */ + 30001ec: 0e80006f j 30002d4 + +030001f0 : + +.align 2 +NmiEntry: + SAVE_SYSERR_REGS + 30001f0: f9010113 addi sp,sp,-112 + 30001f4: 04812023 sw s0,64(sp) + 30001f8: 04912223 sw s1,68(sp) + 30001fc: 05212423 sw s2,72(sp) + 3000200: 05312623 sw s3,76(sp) + 3000204: 05412823 sw s4,80(sp) + 3000208: 05512a23 sw s5,84(sp) + 300020c: 05612c23 sw s6,88(sp) + 3000210: 05712e23 sw s7,92(sp) + 3000214: 07812023 sw s8,96(sp) + 3000218: 07912223 sw s9,100(sp) + 300021c: 07a12423 sw s10,104(sp) + 3000220: 07b12623 sw s11,108(sp) + 3000224: 11010593 addi a1,sp,272 + 3000228: 06b12823 sw a1,112(sp) + 300022c: 06312a23 sw gp,116(sp) + 3000230: 06412c23 sw tp,120(sp) + 3000234: 34102573 csrr a0,mepc + 3000238: 300025f3 csrr a1,mstatus + 300023c: 34302673 csrr a2,mtval + 3000240: 342026f3 csrr a3,mcause + 3000244: 06a12e23 sw a0,124(sp) + 3000248: 08b12023 sw a1,128(sp) + 300024c: 08c12223 sw a2,132(sp) + 3000250: 08d12423 sw a3,136(sp) + 3000254: 00010513 mv a0,sp + call SysErrNmiEntry + 3000258: 04c020ef jal ra,30022a4 + +0300025c : +deadLoop1: + tail deadLoop1 + 300025c: a001 j 300025c + nop + 300025e: 00000013 nop + +03000262 : + +.align 2 +TrapEntry: + SAVE_SYSERR_REGS + 3000262: f9010113 addi sp,sp,-112 + 3000266: 04812023 sw s0,64(sp) + 300026a: 04912223 sw s1,68(sp) + 300026e: 05212423 sw s2,72(sp) + 3000272: 05312623 sw s3,76(sp) + 3000276: 05412823 sw s4,80(sp) + 300027a: 05512a23 sw s5,84(sp) + 300027e: 05612c23 sw s6,88(sp) + 3000282: 05712e23 sw s7,92(sp) + 3000286: 07812023 sw s8,96(sp) + 300028a: 07912223 sw s9,100(sp) + 300028e: 07a12423 sw s10,104(sp) + 3000292: 07b12623 sw s11,108(sp) + 3000296: 11010593 addi a1,sp,272 + 300029a: 06b12823 sw a1,112(sp) + 300029e: 06312a23 sw gp,116(sp) + 30002a2: 06412c23 sw tp,120(sp) + 30002a6: 34102573 csrr a0,mepc + 30002aa: 300025f3 csrr a1,mstatus + 30002ae: 34302673 csrr a2,mtval + 30002b2: 342026f3 csrr a3,mcause + 30002b6: 06a12e23 sw a0,124(sp) + 30002ba: 08b12023 sw a1,128(sp) + 30002be: 08c12223 sw a2,132(sp) + 30002c2: 08d12423 sw a3,136(sp) + 30002c6: 00010513 mv a0,sp + /* Exception run with interrupts masked */ + csrc mstatus, MSTATUS_MIE + 30002ca: 30047073 csrci mstatus,8 + call SysErrExcEntry + 30002ce: 7b9010ef jal ra,3002286 + +030002d2 : +deadLoop2: + tail deadLoop2 + 30002d2: a001 j 30002d2 + +030002d4 : + +.align 2 +IntHandler: + addi sp, sp, -(TOTAL_INT_SIZE_ON_STACK) + 30002d4: f6010113 addi sp,sp,-160 + + SREG a0, 3 * REGBYTES(sp) + 30002d8: 00a12623 sw a0,12(sp) + SREG a1, 4 * REGBYTES(sp) + 30002dc: 00b12823 sw a1,16(sp) +#endif + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + csrr a0, mcause +#else + csrr a0, cipri + 30002e0: 7ed02573 csrr a0,0x7ed + csrr a1, prithd + 30002e4: bfe025f3 csrr a1,0xbfe + csrw prithd, a0 /* read prithd */ + 30002e8: bfe51073 csrw 0xbfe,a0 + SREG a1, 6 * REGBYTES(sp) /* save prithd */ + 30002ec: 00b12c23 sw a1,24(sp) + csrr a1, mstatus /* read mstatus */ + 30002f0: 300025f3 csrr a1,mstatus + SREG a1, 7 * REGBYTES(sp) /* save mstatus */ + 30002f4: 00b12e23 sw a1,28(sp) + csrr a1, mepc /* read mepc */ + 30002f8: 341025f3 csrr a1,mepc + SREG a1, 8 * REGBYTES(sp) /* save mepc */ + 30002fc: 02b12023 sw a1,32(sp) + + csrr a0, mcause + 3000300: 34202573 csrr a0,mcause + + li a1, (3<<11) + 3000304: 000025b7 lui a1,0x2 + 3000308: 80058593 addi a1,a1,-2048 # 1800 + csrs mstatus, a1 + 300030c: 3005a073 csrs mstatus,a1 + la a1, custom_nested_irq_main_handler_entry + 3000310: 00000597 auipc a1,0x0 + 3000314: 01058593 addi a1,a1,16 # 3000320 + csrw mepc, a1 + 3000318: 34159073 csrw mepc,a1 + mret + 300031c: 30200073 mret + +03000320 : +#endif + +.align 2 +custom_nested_irq_main_handler_entry: + SREG t0, 0 * REGBYTES(sp) + 3000320: 00512023 sw t0,0(sp) + SREG t1, 1 * REGBYTES(sp) + 3000324: 00612223 sw t1,4(sp) + SREG t2, 2 * REGBYTES(sp) + 3000328: 00712423 sw t2,8(sp) + SREG a2, 5 * REGBYTES(sp) + 300032c: 00c12a23 sw a2,20(sp) + SREG ra, 9 * REGBYTES(sp) + 3000330: 02112223 sw ra,36(sp) + SREG a3, 10 * REGBYTES(sp) + 3000334: 02d12423 sw a3,40(sp) + SREG a4, 11 * REGBYTES(sp) + 3000338: 02e12623 sw a4,44(sp) + SREG a5, 12 * REGBYTES(sp) + 300033c: 02f12823 sw a5,48(sp) + SREG a6, 13 * REGBYTES(sp) + 3000340: 03012a23 sw a6,52(sp) + SREG a7, 14 * REGBYTES(sp) + 3000344: 03112c23 sw a7,56(sp) + SREG t3, 15 * REGBYTES(sp) + 3000348: 03c12e23 sw t3,60(sp) + SREG t4, 16 * REGBYTES(sp) + 300034c: 05d12023 sw t4,64(sp) + SREG t5, 17 * REGBYTES(sp) + 3000350: 05e12223 sw t5,68(sp) + SREG t6, 18 * REGBYTES(sp) + 3000354: 05f12423 sw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FSREG f0, 19 * REGBYTES(sp) + 3000358: 04012627 fsw ft0,76(sp) + FSREG f1, 20 * REGBYTES(sp) + 300035c: 04112827 fsw ft1,80(sp) + FSREG f2, 21 * REGBYTES(sp) + 3000360: 04212a27 fsw ft2,84(sp) + FSREG f3, 22 * REGBYTES(sp) + 3000364: 04312c27 fsw ft3,88(sp) + FSREG f4, 23 * REGBYTES(sp) + 3000368: 04412e27 fsw ft4,92(sp) + FSREG f5, 24 * REGBYTES(sp) + 300036c: 06512027 fsw ft5,96(sp) + FSREG f6, 25 * REGBYTES(sp) + 3000370: 06612227 fsw ft6,100(sp) + FSREG f7, 26 * REGBYTES(sp) + 3000374: 06712427 fsw ft7,104(sp) + FSREG f10, 27 * REGBYTES(sp) + 3000378: 06a12627 fsw fa0,108(sp) + FSREG f11, 28 * REGBYTES(sp) + 300037c: 06b12827 fsw fa1,112(sp) + FSREG f12, 29 * REGBYTES(sp) + 3000380: 06c12a27 fsw fa2,116(sp) + FSREG f13, 30 * REGBYTES(sp) + 3000384: 06d12c27 fsw fa3,120(sp) + FSREG f14, 31 * REGBYTES(sp) + 3000388: 06e12e27 fsw fa4,124(sp) + FSREG f15, 32 * REGBYTES(sp) + 300038c: 08f12027 fsw fa5,128(sp) + FSREG f16, 33 * REGBYTES(sp) + 3000390: 09012227 fsw fa6,132(sp) + FSREG f17, 34 * REGBYTES(sp) + 3000394: 09112427 fsw fa7,136(sp) + FSREG f28, 35 * REGBYTES(sp) + 3000398: 09c12627 fsw ft8,140(sp) + FSREG f29, 36 * REGBYTES(sp) + 300039c: 09d12827 fsw ft9,144(sp) + FSREG f30, 37 * REGBYTES(sp) + 30003a0: 09e12a27 fsw ft10,148(sp) + FSREG f31, 38 * REGBYTES(sp) + 30003a4: 09f12c27 fsw ft11,152(sp) +#endif + + andi a0, a0, MCAUSE_MASK_INT_NUM + 30003a8: 0ff57513 andi a0,a0,255 + call InterruptEntry + 30003ac: 46b010ef jal ra,3002016 + + LREG t1, 1 * REGBYTES(sp) + 30003b0: 00412303 lw t1,4(sp) + LREG t2, 2 * REGBYTES(sp) + 30003b4: 00812383 lw t2,8(sp) + LREG a2, 5 * REGBYTES(sp) + 30003b8: 01412603 lw a2,20(sp) + LREG ra, 9 * REGBYTES(sp) + 30003bc: 02412083 lw ra,36(sp) + LREG a3, 10 * REGBYTES(sp) + 30003c0: 02812683 lw a3,40(sp) + LREG a4, 11 * REGBYTES(sp) + 30003c4: 02c12703 lw a4,44(sp) + LREG a5, 12 * REGBYTES(sp) + 30003c8: 03012783 lw a5,48(sp) + LREG a6, 13 * REGBYTES(sp) + 30003cc: 03412803 lw a6,52(sp) + LREG a7, 14 * REGBYTES(sp) + 30003d0: 03812883 lw a7,56(sp) + LREG t3, 15 * REGBYTES(sp) + 30003d4: 03c12e03 lw t3,60(sp) + LREG t4, 16 * REGBYTES(sp) + 30003d8: 04012e83 lw t4,64(sp) + LREG t5, 17 * REGBYTES(sp) + 30003dc: 04412f03 lw t5,68(sp) + LREG t6, 18 * REGBYTES(sp) + 30003e0: 04812f83 lw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FLREG f0, 19 * REGBYTES(sp) + 30003e4: 04c12007 flw ft0,76(sp) + FLREG f1, 20 * REGBYTES(sp) + 30003e8: 05012087 flw ft1,80(sp) + FLREG f2, 21 * REGBYTES(sp) + 30003ec: 05412107 flw ft2,84(sp) + FLREG f3, 22 * REGBYTES(sp) + 30003f0: 05812187 flw ft3,88(sp) + FLREG f4, 23 * REGBYTES(sp) + 30003f4: 05c12207 flw ft4,92(sp) + FLREG f5, 24 * REGBYTES(sp) + 30003f8: 06012287 flw ft5,96(sp) + FLREG f6, 25 * REGBYTES(sp) + 30003fc: 06412307 flw ft6,100(sp) + FLREG f7, 26 * REGBYTES(sp) + 3000400: 06812387 flw ft7,104(sp) + FLREG f10, 27 * REGBYTES(sp) + 3000404: 06c12507 flw fa0,108(sp) + FLREG f11, 28 * REGBYTES(sp) + 3000408: 07012587 flw fa1,112(sp) + FLREG f12, 29 * REGBYTES(sp) + 300040c: 07412607 flw fa2,116(sp) + FLREG f13, 30 * REGBYTES(sp) + 3000410: 07812687 flw fa3,120(sp) + FLREG f14, 31 * REGBYTES(sp) + 3000414: 07c12707 flw fa4,124(sp) + FLREG f15, 32 * REGBYTES(sp) + 3000418: 08012787 flw fa5,128(sp) + FLREG f16, 33 * REGBYTES(sp) + 300041c: 08412807 flw fa6,132(sp) + FLREG f17, 34 * REGBYTES(sp) + 3000420: 08812887 flw fa7,136(sp) + FLREG f28, 35 * REGBYTES(sp) + 3000424: 08c12e07 flw ft8,140(sp) + FLREG f29, 36 * REGBYTES(sp) + 3000428: 09012e87 flw ft9,144(sp) + FLREG f30, 37 * REGBYTES(sp) + 300042c: 09412f07 flw ft10,148(sp) + FLREG f31, 38 * REGBYTES(sp) + 3000430: 09812f87 flw ft11,152(sp) + +03000434 : + */ + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + LREG t0, 0 * REGBYTES(sp) +#else + LREG a0, 7 * REGBYTES(sp) /* load mstatus */ + 3000434: 01c12503 lw a0,28(sp) + csrr t0, mstatus + 3000438: 300022f3 csrr t0,mstatus + LREG a1, 8 * REGBYTES(sp) /* load mepc */ + 300043c: 02012583 lw a1,32(sp) + andi t0, t0, MSTATUS_MIE + 3000440: 0082f293 andi t0,t0,8 + bnei t0, 0, restore_mstatus + 3000444: 0002923b bnei t0,0,300044c + andi a0, a0, ~(MSTATUS_MIE | MSTATUS_MPIE) + 3000448: f7757513 andi a0,a0,-137 + +0300044c : +restore_mstatus: + csrw mstatus, a0 + 300044c: 30051073 csrw mstatus,a0 + + LREG t0, 0 * REGBYTES(sp) + 3000450: 00012283 lw t0,0(sp) + csrw mepc, a1 + 3000454: 34159073 csrw mepc,a1 + LREG a0, 6 * REGBYTES(sp) /* load prithd */ + 3000458: 01812503 lw a0,24(sp) + csrw prithd, a0 + 300045c: bfe51073 csrw 0xbfe,a0 + lw a1, (a0) + addi a1, a1, -1 + sw a1, (a0) +#endif + + LREG a1, 4 * REGBYTES(sp) /* 2 consecutive csrw instructions will have a bubble */ + 3000460: 01012583 lw a1,16(sp) + + LREG a0, 3 * REGBYTES(sp) + 3000464: 00c12503 lw a0,12(sp) + + addi sp, sp, TOTAL_INT_SIZE_ON_STACK + 3000468: 0a010113 addi sp,sp,160 + + mret + 300046c: 30200073 mret + +03000470 : + +.align 2 +TrapVector: + push_reg + 3000470: f6010113 addi sp,sp,-160 + 3000474: fff11f8b stmia {ra,t0-t6,a0-a7},(sp) + 3000478: f6010113 addi sp,sp,-160 + csrr a0, mcause + 300047c: 34202573 csrr a0,mcause + li t1, MCAUSE_ECALL_FROM_MMODE + 3000480: 00b00313 li t1,11 +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + beq a0, t1, switch_to_umode +#else + beq a0, t1, switch_to_mmode + 3000484: 02650c63 beq a0,t1,30004bc +#endif + li t1, MCAUSE_ECALL_FROM_UMODE + 3000488: 00800313 li t1,8 + beq a0, t1, switch_to_mmode + 300048c: 02650863 beq a0,t1,30004bc + + li a1, MCAUSE_MASK_INT_BIT + 3000490: 800005b7 lui a1,0x80000 + li a2, MCAUSE_MASK_INT_NUM + 3000494: 0ff00613 li a2,255 + and a1, a0, a1 + 3000498: 00b575b3 and a1,a0,a1 + and a0, a0, a2 + 300049c: 00c57533 and a0,a0,a2 + + li a2, 0xc + 30004a0: 00c00613 li a2,12 + beq a0, a2, NmiEntry + 30004a4: d4c506e3 beq a0,a2,30001f0 + beqz a1, TrapEntry + 30004a8: da058de3 beqz a1,3000262 + pop_reg + 30004ac: 0a010113 addi sp,sp,160 + 30004b0: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004b4: 0a010113 addi sp,sp,160 + mret + 30004b8: 30200073 mret + +030004bc : + mret +#endif + +.align 2 +switch_to_mmode: + li t2, MSTATUS_MPP_MACHINE + 30004bc: 000023b7 lui t2,0x2 + 30004c0: 80038393 addi t2,t2,-2048 # 1800 + csrs mstatus, t2 + 30004c4: 3003a073 csrs mstatus,t2 + csrr t0, mepc + 30004c8: 341022f3 csrr t0,mepc + addi t0, t0, 4 + 30004cc: 00428293 addi t0,t0,4 + csrw mepc, t0 + 30004d0: 34129073 csrw mepc,t0 + pop_reg + 30004d4: 0a010113 addi sp,sp,160 + 30004d8: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004dc: 0a010113 addi sp,sp,160 + mret + 30004e0: 30200073 mret + +030004e4 : + +.align 2 +mem_cpy: + bge t0, t2, cpy_done + 30004e4: 0072dc63 bge t0,t2,30004fc + lw t3, (t1) + 30004e8: 00032e03 lw t3,0(t1) + sw t3, (t0) + 30004ec: 01c2a023 sw t3,0(t0) + addi t0, t0, 4 + 30004f0: 00428293 addi t0,t0,4 + addi t1, t1, 4 + 30004f4: 00430313 addi t1,t1,4 + j mem_cpy + 30004f8: fedff06f j 30004e4 + +030004fc : +cpy_done: + ret + 30004fc: 00008067 ret + +03000500 : + +.align 2 +handle_reset: + csrwi mstatus, 0 + 3000500: 30005073 csrwi mstatus,0 + csrwi mie, 0 + 3000504: 30405073 csrwi mie,0 + csrci mstatus, 0x08 + 3000508: 30047073 csrci mstatus,8 + la t0, TrapHandler + 300050c: 00000297 auipc t0,0x0 + 3000510: afc28293 addi t0,t0,-1284 # 3000008 + addi t0, t0, 1 + 3000514: 00128293 addi t0,t0,1 + csrw mtvec, t0 + 3000518: 30529073 csrw mtvec,t0 + csrwi 0x7EF, 0x1 /* lock mtvec */ + 300051c: 7ef0d073 csrwi 0x7ef,1 + +03000520 : + csrwi 0x7C8, 0x1 /* enable hardware nest interrupt support */ +#endif + +flash_init: +/* eflash prefetch enable */ + li t0, EFC_BASE_ADDR + 3000520: 147102b7 lui t0,0x14710 + lw t1, 0x120(t0) + 3000524: 1202a303 lw t1,288(t0) # 14710120 + ori t1, t1, 1 + 3000528: 00136313 ori t1,t1,1 + sw t1, 0x120(t0) + 300052c: 1262a023 sw t1,288(t0) + +/* eflash cache enable */ + lw t1, 0x124(t0) + 3000530: 1242a303 lw t1,292(t0) + ori t1, t1, 1 + 3000534: 00136313 ori t1,t1,1 + sw t1, 0x124(t0) + 3000538: 1262a223 sw t1,292(t0) + +/* enable flash cmd */ + li t0, EFC_MAGIC_NUMBER + 300053c: fedcc2b7 lui t0,0xfedcc + 3000540: a9828293 addi t0,t0,-1384 # fedcba98 + li t1, EFC_MAGIC_LOCK_RW + 3000544: 14710337 lui t1,0x14710 + 3000548: 20030313 addi t1,t1,512 # 14710200 + sw t0, (t1) + 300054c: 00532023 sw t0,0(t1) + +/* initialize global pointer */ + .option push + .option norelax + la gp, __global_pointer$ + 3000550: 01001197 auipc gp,0x1001 + 3000554: bc418193 addi gp,gp,-1084 # 4001114 <__global_pointer$> + .option pop + +/* initialize stack pointer */ + la sp, __stack_top + 3000558: 01007117 auipc sp,0x1007 + 300055c: 6a810113 addi sp,sp,1704 # 4007c00 <__INTERRUPT_STACK_BEGIN__> + +/* timer0 interrupt enable */ + li t0, TIMER0_CONTROL + 3000560: 143002b7 lui t0,0x14300 + 3000564: 00828293 addi t0,t0,8 # 14300008 + lw t1, (t0) + 3000568: 0002a303 lw t1,0(t0) + andi t1, t1, TIMER0_INTENABLE + 300056c: 02037313 andi t1,t1,32 + sw t1, (t0) + 3000570: 0062a023 sw t1,0(t0) + +/* uart0 deinit */ + li t0, 0x14000000 + 3000574: 140002b7 lui t0,0x14000 + li t1, 0 + 3000578: 00000313 li t1,0 + sw t1, IBRD_OFFSET(t0) + 300057c: 0262a223 sw t1,36(t0) # 14000024 + sw t1, FBRD_OFFSET(t0) + 3000580: 0262a423 sw t1,40(t0) + sw t1, LCR_H_OFFSET(t0) + 3000584: 0262a623 sw t1,44(t0) + sw t1, CR_OFFSET(t0) + 3000588: 0262a823 sw t1,48(t0) + sw t1, DMACR_OFFSET(t0) + 300058c: 0462a423 sw t1,72(t0) + +03000590 : + +/* perform the rest of initialization in C */ +clear_sram: + /* clear sysram parity error */ + li t0, SYSRAM_ERROR + 3000590: 101082b7 lui t0,0x10108 + 3000594: 30028293 addi t0,t0,768 # 10108300 + lw t1, (t0) + 3000598: 0002a303 lw t1,0(t0) + ori t1, t1, 1 + 300059c: 00136313 ori t1,t1,1 + sw t1, (t0) + 30005a0: 0062a023 sw t1,0(t0) + + la t0, SRAM_START + 30005a4: 01000297 auipc t0,0x1000 + 30005a8: a5c28293 addi t0,t0,-1444 # 4000000 + la t1, SRAM_END + 30005ac: 01008317 auipc t1,0x1008 + 30005b0: a5430313 addi t1,t1,-1452 # 4008000 + li t2, 0 + 30005b4: 00000393 li t2,0 + +030005b8 : + +clear_sram_loop: + sw t2, (t0) /* clear all sram */ + 30005b8: 0072a023 sw t2,0(t0) + addi t0, t0, 4 /* increment clear index pointer */ + 30005bc: 00428293 addi t0,t0,4 + blt t0, t1, clear_sram_loop /* are we at the end yet, if not , contiue till the end */ + 30005c0: fe62cce3 blt t0,t1,30005b8 + +030005c4 : + +start_coderom_code_copy: + la t0, __sram_code_start_addr /* SRAM addr */ + 30005c4: ff000297 auipc t0,0xff000 + 30005c8: a3c28293 addi t0,t0,-1476 # 2000000 + la t1, __sram_code_load_addr /* ROM addr */ + 30005cc: 00000317 auipc t1,0x0 + 30005d0: 13830313 addi t1,t1,312 # 3000704 + la t2, __sram_code_end_addr + 30005d4: ff000397 auipc t2,0xff000 + 30005d8: a2c38393 addi t2,t2,-1492 # 2000000 + jal mem_cpy + 30005dc: f09ff0ef jal ra,30004e4 + +030005e0 : + +start_reserved_data_copy: + la t0, __reserved_code_start_addr /* SRAM addr */ + 30005e0: 01000297 auipc t0,0x1000 + 30005e4: a2028293 addi t0,t0,-1504 # 4000000 + la t1, __reserved_code_load_addr /* ROM addr */ + 30005e8: 00000317 auipc t1,0x0 + 30005ec: 11c30313 addi t1,t1,284 # 3000704 + la t2, __reserved_code_end_addr + 30005f0: 01000397 auipc t2,0x1000 + 30005f4: a1038393 addi t2,t2,-1520 # 4000000 + jal mem_cpy + 30005f8: eedff0ef jal ra,30004e4 + +030005fc : + +start_coderom_data_copy: + la t0, __data_start /* SRAM addr */ + 30005fc: 01000297 auipc t0,0x1000 + 3000600: a2428293 addi t0,t0,-1500 # 4000020 + la t1, __data_load /* ROM addr */ + 3000604: 00006317 auipc t1,0x6 + 3000608: 19830313 addi t1,t1,408 # 300679c <__data_load> + la t2, __data_end + 300060c: 01000397 auipc t2,0x1000 + 3000610: af038393 addi t2,t2,-1296 # 40000fc + jal mem_cpy + 3000614: ed1ff0ef jal ra,30004e4 + +03000618 : + +pmp_init: + li t0, 0xB00 + 3000618: 000012b7 lui t0,0x1 + 300061c: b0028293 addi t0,t0,-1280 # b00 + csrw pmpaddr0, t0 + 3000620: 3b029073 csrw pmpaddr0,t0 + li t0, 0x400400 /* 0x2C00~0x1000FFF, BOOTROM, enable R+X */ + 3000624: 004002b7 lui t0,0x400 + 3000628: 40028293 addi t0,t0,1024 # 400400 + csrw pmpaddr1, t0 + 300062c: 3b129073 csrw pmpaddr1,t0 + li t0, 0x800000 /* 0x1001000~0x1FFFFFF, Reserved: diable R+X+W */ + 3000630: 008002b7 lui t0,0x800 + csrw pmpaddr2, t0 + 3000634: 3b229073 csrw pmpaddr2,t0 + li t0, 0x802000 /* 0x2000000~0x2007FFF, SYSRAM_ITCM */ + 3000638: 008022b7 lui t0,0x802 + csrw pmpaddr3, t0 + 300063c: 3b329073 csrw pmpaddr3,t0 + li t0, 0xC00000 /* 0x2008000 ~ 0x2FFFFFF, Reserved: disable R+X+W */ + 3000640: 00c002b7 lui t0,0xc00 + csrw pmpaddr4, t0 + 3000644: 3b429073 csrw pmpaddr4,t0 + li t0, 0x1000000 /* 0x3000000 ~ 0x03FFFFFF: EFLASH: enable R+X */ + 3000648: 010002b7 lui t0,0x1000 + csrw pmpaddr5, t0 + 300064c: 3b529073 csrw pmpaddr5,t0 + li t0, 0x1002000 /* 0x4000000 ~ 0x04007FFF: SYSTEM_DTCM enable R+W */ + 3000650: 010022b7 lui t0,0x1002 + csrw pmpaddr6, t0 + 3000654: 3b629073 csrw pmpaddr6,t0 + li t0,0x7000400 /* 0x4008000 ~ 0x01C000FFF: REGISTER R+W */ + 3000658: 070002b7 lui t0,0x7000 + 300065c: 40028293 addi t0,t0,1024 # 7000400 + csrw pmpaddr7, t0 + 3000660: 3b729073 csrw pmpaddr7,t0 + + li t0,0xf3333333 /* register TOR-R-W */ + 3000664: f33332b7 lui t0,0xf3333 + 3000668: 33328293 addi t0,t0,819 # f3333333 + csrw 0x7d8,t0 + 300066c: 7d829073 csrw 0x7d8,t0 + li t0,0x0d080d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + csrw pmpcfg0,t0 + li t0,0x0b0b0d08 + csrw pmpcfg1,t0 +#else + li t0,0x8d888d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + 3000670: 8d8892b7 lui t0,0x8d889 + 3000674: d8b28293 addi t0,t0,-629 # 8d888d8b + csrw pmpcfg0,t0 + 3000678: 3a029073 csrw pmpcfg0,t0 + li t0,0x8b8b8d88 + 300067c: 8b8b92b7 lui t0,0x8b8b9 + 3000680: d8828293 addi t0,t0,-632 # 8b8b8d88 + csrw pmpcfg1,t0 + 3000684: 3a129073 csrw pmpcfg1,t0 +#endif + +/* disable Icache */ + csrwi 0x7C0, 0x0 /* disable ICACHE */ + 3000688: 7c005073 csrwi 0x7c0,0 + fence + 300068c: 0ff0000f fence + +/* disable Dcache */ + csrwi 0x7C1, 0x0 /* disable DCACHE */ + 3000690: 7c105073 csrwi 0x7c1,0 + fence + 3000694: 0ff0000f fence + +/* support float and mie */ + li t0,0x2008 + 3000698: 000022b7 lui t0,0x2 + 300069c: 00828293 addi t0,t0,8 # 2008 + csrs mstatus,t0 + 30006a0: 3002a073 csrs mstatus,t0 + li t0,0x20 + 30006a4: 02000293 li t0,32 + csrs misa,t0 + 30006a8: 3012a073 csrs misa,t0 + +/* Interrupt set default priority = 1*/ + li t0, 0x11111111 + 30006ac: 111112b7 lui t0,0x11111 + 30006b0: 11128293 addi t0,t0,273 # 11111111 + csrw locipri0, t0 + 30006b4: bc029073 csrw 0xbc0,t0 + csrw locipri1, t0 + 30006b8: bc129073 csrw 0xbc1,t0 + csrw locipri2, t0 + 30006bc: bc229073 csrw 0xbc2,t0 + csrw locipri3, t0 + 30006c0: bc329073 csrw 0xbc3,t0 + csrw locipri4, t0 + 30006c4: bc429073 csrw 0xbc4,t0 + csrw locipri5, t0 + 30006c8: bc529073 csrw 0xbc5,t0 + csrw locipri6, t0 + 30006cc: bc629073 csrw 0xbc6,t0 + csrw locipri7, t0 + 30006d0: bc729073 csrw 0xbc7,t0 + csrw locipri8, t0 + 30006d4: bc829073 csrw 0xbc8,t0 + csrw locipri9, t0 + 30006d8: bc929073 csrw 0xbc9,t0 + csrw locipri10, t0 + 30006dc: bca29073 csrw 0xbca,t0 + csrw locipri11, t0 + 30006e0: bcb29073 csrw 0xbcb,t0 + csrw locipri12, t0 + 30006e4: bcc29073 csrw 0xbcc,t0 + csrw locipri13, t0 + 30006e8: bcd29073 csrw 0xbcd,t0 + csrw locipri14, t0 + 30006ec: bce29073 csrw 0xbce,t0 + csrw locipri15, t0 + 30006f0: bcf29073 csrw 0xbcf,t0 + + ecall + 30006f4: 00000073 ecall + jal Chip_Init + 30006f8: 014000ef jal ra,300070c + +/* jump to C func. */ + jal main + 30006fc: 2ee050ef jal ra,30059ea
+ +03000700 : + +dead_loop: + j dead_loop + 3000700: 0000006f j 3000700 + +Disassembly of section .text: + +03000704 : + * @brief Chip Init Fail Process, deadloop if Chip Init fail + * @param None + * @retval None + */ +static inline void Chip_InitFail(void) +{ + 3000704: 1141 addi sp,sp,-16 + 3000706: c622 sw s0,12(sp) + 3000708: 0800 addi s0,sp,16 + while (1) { + 300070a: a001 j 300070a + +0300070c : + * @brief Chip Init + * @param None + * @retval None + */ +void Chip_Init(void) +{ + 300070c: 1101 addi sp,sp,-32 + 300070e: ce06 sw ra,28(sp) + 3000710: cc22 sw s0,24(sp) + 3000712: 1000 addi s0,sp,32 + CRG_CoreClkSelect coreClkSelect; + /* Config CRG */ + if (CRG_Config(&coreClkSelect) != BASE_STATUS_OK) { + 3000714: fec40793 addi a5,s0,-20 + 3000718: 853e mv a0,a5 + 300071a: 2dc050ef jal ra,30059f6 + 300071e: 87aa mv a5,a0 + 3000720: c391 beqz a5,3000724 + Chip_InitFail(); + 3000722: 37cd jal ra,3000704 + } + + /* Config FLASH Clock */ + FLASH_ClockConfig(coreClkSelect); + 3000724: fec42783 lw a5,-20(s0) + 3000728: 853e mv a0,a5 + 300072a: 796000ef jal ra,3000ec0 + SYSTICK_Init(); + 300072e: 057000ef jal ra,3000f84 + /* Set CoreClock Select after FLASH Config Done */ + CRG_SetCoreClockSelect(coreClkSelect); + 3000732: fec42783 lw a5,-20(s0) + 3000736: 853e mv a0,a5 + 3000738: 25b1 jal ra,3000d84 + + IRQ_Init(); + 300073a: 121010ef jal ra,300205a + ANAVREF_Init(); + 300073e: 23e5 jal ra,3000d26 + ANATRIM_Entry(); + 3000740: 2b51 jal ra,3000cd4 + /* User Add Code Here */ + 3000742: 0001 nop + 3000744: 40f2 lw ra,28(sp) + 3000746: 4462 lw s0,24(sp) + 3000748: 6105 addi sp,sp,32 + 300074a: 8082 ret + +0300074c : + * @brief Calculate the conversion gain of the tsensor. + * @param data, original data. + * @retval None + */ +static void CalculateGain(unsigned int data) +{ + 300074c: 1101 addi sp,sp,-32 + 300074e: ce22 sw s0,28(sp) + 3000750: 1000 addi s0,sp,32 + 3000752: fea42623 sw a0,-20(s0) + g_tsensorGain = ((float)(data) / 10000000.0f); + 3000756: fec42783 lw a5,-20(s0) + 300075a: d017f753 fcvt.s.wu fa4,a5 + 300075e: 030067b7 lui a5,0x3006 + 3000762: 1fc7a787 flw fa5,508(a5) # 30061fc <__rodata_start> + 3000766: 18f777d3 fdiv.s fa5,fa4,fa5 + 300076a: 040007b7 lui a5,0x4000 + 300076e: 02f7a027 fsw fa5,32(a5) # 4000020 +} + 3000772: 0001 nop + 3000774: 4472 lw s0,28(sp) + 3000776: 6105 addi sp,sp,32 + 3000778: 8082 ret + +0300077a : + * @brief Obtains the chip ID. + * @param None + * @retval None + */ +static bool CHIP_GetInfo(void) +{ + 300077a: 7179 addi sp,sp,-48 + 300077c: d606 sw ra,44(sp) + 300077e: d422 sw s0,40(sp) + 3000780: 1800 addi s0,sp,48 + FOTP_INFO_RGN0_NUMBER_4 emptyData; + FOTP_INFO_RGN0_NUMBER_2 idData; + FOTP_InfoGet(FOTP_INFO_RNG0, 4U, (void *)&emptyData.comData); /* 4 is the number of fotp_empty_flag in otp */ + 3000782: fe040793 addi a5,s0,-32 + 3000786: 863e mv a2,a5 + 3000788: 4591 li a1,4 + 300078a: 4501 li a0,0 + 300078c: 2391 jal ra,3000cd0 + FOTP_InfoGet(FOTP_INFO_RNG0, 2U, (void *)&idData.comData); /* 2 is the number of idData in otp */ + 300078e: fd040793 addi a5,s0,-48 + 3000792: 863e mv a2,a5 + 3000794: 4589 li a1,2 + 3000796: 4501 li a0,0 + 3000798: 2b25 jal ra,3000cd0 + if (emptyData.REG.fotp_empty_flag != 0x5AA59669 || idData.REG.chip_id == 0xFFFFFFFF) { + 300079a: fe042703 lw a4,-32(s0) + 300079e: 5aa597b7 lui a5,0x5aa59 + 30007a2: 66978793 addi a5,a5,1641 # 5aa59669 + 30007a6: 00f71763 bne a4,a5,30007b4 + 30007aa: fd042703 lw a4,-48(s0) + 30007ae: 57fd li a5,-1 + 30007b0: 00f71463 bne a4,a5,30007b8 + return false; + 30007b4: 4781 li a5,0 + 30007b6: a011 j 30007ba + } + return true; + 30007b8: 4785 li a5,1 +} + 30007ba: 853e mv a0,a5 + 30007bc: 50b2 lw ra,44(sp) + 30007be: 5422 lw s0,40(sp) + 30007c0: 6145 addi sp,sp,48 + 30007c2: 8082 ret + +030007c4 : + * @brief Analog module trim. + * @param None + * @retval None + */ +static void CHIP_AnalogTrim(void) +{ + 30007c4: 711d addi sp,sp,-96 + 30007c6: ce86 sw ra,92(sp) + 30007c8: cca2 sw s0,88(sp) + 30007ca: 1080 addi s0,sp,96 + FOTP_INFO_RGN0_NUMBER_20 trimData20; + FOTP_InfoGet(FOTP_INFO_RNG0, 20U, (void *)&trimData20.comData); /* 20 is the number of trim data in otp */ + 30007cc: fdc40793 addi a5,s0,-36 + 30007d0: 863e mv a2,a5 + 30007d2: 45d1 li a1,20 + 30007d4: 4501 li a0,0 + 30007d6: 29ed jal ra,3000cd0 + /* VREF */ + VREF->VREF_TRIM0.BIT.da_iref_trim = trimData20.REG.data0.da_iref_trim; + 30007d8: 18100737 lui a4,0x18100 + 30007dc: fdc42783 lw a5,-36(s0) + 30007e0: 83c1 srli a5,a5,0x10 + 30007e2: 9bfd andi a5,a5,-1 + 30007e4: 0ff7f693 andi a3,a5,255 + 30007e8: 433c lw a5,64(a4) + 30007ea: 0ff6f693 andi a3,a3,255 + 30007ee: f007f793 andi a5,a5,-256 + 30007f2: 8fd5 or a5,a5,a3 + 30007f4: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vref_trim = trimData20.REG.data0.da_ref_vref_trim; + 30007f6: 18100737 lui a4,0x18100 + 30007fa: fdc42783 lw a5,-36(s0) + 30007fe: 83a1 srli a5,a5,0x8 + 3000800: 9bfd andi a5,a5,-1 + 3000802: 0ff7f693 andi a3,a5,255 + 3000806: 433c lw a5,64(a4) + 3000808: 0ff6f693 andi a3,a3,255 + 300080c: 06a2 slli a3,a3,0x8 + 300080e: 7641 lui a2,0xffff0 + 3000810: 0ff60613 addi a2,a2,255 # ffff00ff + 3000814: 8ff1 and a5,a5,a2 + 3000816: 8fd5 or a5,a5,a3 + 3000818: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vbg_trim = trimData20.REG.data0.da_ref_vbg_trim; + 300081a: 18100737 lui a4,0x18100 + 300081e: fdc42783 lw a5,-36(s0) + 3000822: 0ff7f693 andi a3,a5,255 + 3000826: 433c lw a5,64(a4) + 3000828: 0ff6f693 andi a3,a3,255 + 300082c: 06c2 slli a3,a3,0x10 + 300082e: ff010637 lui a2,0xff010 + 3000832: 167d addi a2,a2,-1 # ff00ffff + 3000834: 8ff1 and a5,a5,a2 + 3000836: 8fd5 or a5,a5,a3 + 3000838: c33c sw a5,64(a4) + unsigned int value = trimData20.REG.data1.da_ref_temp_trim3; + 300083a: fe042783 lw a5,-32(s0) + 300083e: 83c1 srli a5,a5,0x10 + 3000840: 9bfd andi a5,a5,-1 + 3000842: 9f81 uxtb a5 + 3000844: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim2 << 8U); /* Shift left by 8 bits */ + 3000848: fe042783 lw a5,-32(s0) + 300084c: 83a1 srli a5,a5,0x8 + 300084e: 9bfd andi a5,a5,-1 + 3000850: 9f81 uxtb a5 + 3000852: 07a2 slli a5,a5,0x8 + 3000854: 873e mv a4,a5 + 3000856: fec42783 lw a5,-20(s0) + 300085a: 8fd9 or a5,a5,a4 + 300085c: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim1 << 16U); /* Shift left by 16 bits */ + 3000860: fe042783 lw a5,-32(s0) + 3000864: 9f81 uxtb a5 + 3000866: 07c2 slli a5,a5,0x10 + 3000868: 873e mv a4,a5 + 300086a: fec42783 lw a5,-20(s0) + 300086e: 8fd9 or a5,a5,a4 + 3000870: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data0.da_ref_temp_trim0 << 24U); /* Shift left by 24 bits */ + 3000874: fdc42783 lw a5,-36(s0) + 3000878: 83e1 srli a5,a5,0x18 + 300087a: 9f81 uxtb a5 + 300087c: 07e2 slli a5,a5,0x18 + 300087e: 873e mv a4,a5 + 3000880: fec42783 lw a5,-20(s0) + 3000884: 8fd9 or a5,a5,a4 + 3000886: fef42623 sw a5,-20(s0) + VREF->VREF_TRIM1.reg = value; + 300088a: 181007b7 lui a5,0x18100 + 300088e: fec42703 lw a4,-20(s0) + 3000892: c3f8 sw a4,68(a5) + + FOTP_INFO_RGN0_NUMBER_21 trimData21; + FOTP_InfoGet(FOTP_INFO_RNG0, 21U, (void *)&trimData21.comData); /* 21 is the number of trim data in otp */ + 3000894: fcc40793 addi a5,s0,-52 + 3000898: 863e mv a2,a5 + 300089a: 45d5 li a1,21 + 300089c: 4501 li a0,0 + 300089e: 290d jal ra,3000cd0 + /* ADC */ + ADC0->ADC_OEGE_TRIM.BIT.cfg_gain_cali_trim = trimData21.REG.data1.saradc_gain; + 30008a0: 18000737 lui a4,0x18000 + 30008a4: fd042783 lw a5,-48(s0) + 30008a8: 86be mv a3,a5 + 30008aa: 6789 lui a5,0x2 + 30008ac: 17fd addi a5,a5,-1 # 1fff + 30008ae: 8ff5 and a5,a5,a3 + 30008b0: 01079613 slli a2,a5,0x10 + 30008b4: 8241 srli a2,a2,0x10 + 30008b6: 6785 lui a5,0x1 + 30008b8: 973e add a4,a4,a5 + 30008ba: 80872783 lw a5,-2040(a4) # 17fff808 + 30008be: 6689 lui a3,0x2 + 30008c0: 16fd addi a3,a3,-1 # 1fff + 30008c2: 8ef1 and a3,a3,a2 + 30008c4: 06c2 slli a3,a3,0x10 + 30008c6: e0010637 lui a2,0xe0010 + 30008ca: 167d addi a2,a2,-1 # e000ffff + 30008cc: 8ff1 and a5,a5,a2 + 30008ce: 8fd5 or a5,a5,a3 + 30008d0: 80f72423 sw a5,-2040(a4) + ADC0->ADC_OEGE_TRIM.BIT.cfg_ofst_cali_trim = trimData21.REG.data1.saradc_offset; + 30008d4: 18000737 lui a4,0x18000 + 30008d8: fd042783 lw a5,-48(s0) + 30008dc: 83c1 srli a5,a5,0x10 + 30008de: 86be mv a3,a5 + 30008e0: 6785 lui a5,0x1 + 30008e2: 17fd addi a5,a5,-1 # fff + 30008e4: 8ff5 and a5,a5,a3 + 30008e6: 01079613 slli a2,a5,0x10 + 30008ea: 8241 srli a2,a2,0x10 + 30008ec: 6785 lui a5,0x1 + 30008ee: 973e add a4,a4,a5 + 30008f0: 80872783 lw a5,-2040(a4) # 17fff808 + 30008f4: 6685 lui a3,0x1 + 30008f6: 16fd addi a3,a3,-1 # fff + 30008f8: 8ef1 and a3,a3,a2 + 30008fa: 767d lui a2,0xfffff + 30008fc: 8ff1 and a5,a5,a2 + 30008fe: 8fd5 or a5,a5,a3 + 3000900: 80f72423 sw a5,-2040(a4) + + /* TSENSOR */ + TSENSOR->TSENSOR_TRIM.reg = trimData20.REG.data1.da_ref_vptat_trim; + 3000904: fe042783 lw a5,-32(s0) + 3000908: 83e1 srli a5,a5,0x18 + 300090a: 0ff7f713 andi a4,a5,255 + 300090e: 185007b7 lui a5,0x18500 + 3000912: cb98 sw a4,16(a5) + ADC0->ADC_TSENSOR_TRIM.BIT.cfg_tsensor_ofst_trim = trimData21.REG.data2.ts_offset; + 3000914: 18000737 lui a4,0x18000 + 3000918: fd442783 lw a5,-44(s0) + 300091c: 86be mv a3,a5 + 300091e: 6785 lui a5,0x1 + 3000920: 17fd addi a5,a5,-1 # fff + 3000922: 8ff5 and a5,a5,a3 + 3000924: 01079613 slli a2,a5,0x10 + 3000928: 8241 srli a2,a2,0x10 + 300092a: 6785 lui a5,0x1 + 300092c: 973e add a4,a4,a5 + 300092e: 80472783 lw a5,-2044(a4) # 17fff804 + 3000932: 6685 lui a3,0x1 + 3000934: 16fd addi a3,a3,-1 # fff + 3000936: 8ef1 and a3,a3,a2 + 3000938: 767d lui a2,0xfffff + 300093a: 8ff1 and a5,a5,a2 + 300093c: 8fd5 or a5,a5,a3 + 300093e: 80f72223 sw a5,-2044(a4) + CalculateGain(trimData21.REG.data3.ts_gain); + 3000942: fd842783 lw a5,-40(s0) + 3000946: 83a5 srli a5,a5,0x9 + 3000948: 853e mv a0,a5 + 300094a: 3509 jal ra,300074c + + /* PGA */ + PGA0->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga0_vos_trim; + 300094c: 18200737 lui a4,0x18200 + 3000950: fcc42783 lw a5,-52(s0) + 3000954: 1ff7f793 andi a5,a5,511 + 3000958: 01079693 slli a3,a5,0x10 + 300095c: 82c1 srli a3,a3,0x10 + 300095e: 531c lw a5,32(a4) + 3000960: 1ff6f693 andi a3,a3,511 + 3000964: e007f793 andi a5,a5,-512 + 3000968: 8fd5 or a5,a5,a3 + 300096a: d31c sw a5,32(a4) + PGA1->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga1_vos_trim; + 300096c: 18201737 lui a4,0x18201 + 3000970: fcc42783 lw a5,-52(s0) + 3000974: 83c1 srli a5,a5,0x10 + 3000976: 1ff7f793 andi a5,a5,511 + 300097a: 01079693 slli a3,a5,0x10 + 300097e: 82c1 srli a3,a3,0x10 + 3000980: 531c lw a5,32(a4) + 3000982: 1ff6f693 andi a3,a3,511 + 3000986: e007f793 andi a5,a5,-512 + 300098a: 8fd5 or a5,a5,a3 + 300098c: d31c sw a5,32(a4) + + FOTP_INFO_RGN0_NUMBER_22 trimData22; + FOTP_InfoGet(FOTP_INFO_RNG0, 22U, (void *)&trimData22.comData); /* 22 is the number of trim data in otp */ + 300098e: fbc40793 addi a5,s0,-68 + 3000992: 863e mv a2,a5 + 3000994: 45d9 li a1,22 + 3000996: 4501 li a0,0 + 3000998: 257d jal ra,3001046 + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_gain_trim2 = trimData22.REG.data0.pga0_gain2; + 300099a: 18000737 lui a4,0x18000 + 300099e: fbc42783 lw a5,-68(s0) + 30009a2: 86be mv a3,a5 + 30009a4: 6789 lui a5,0x2 + 30009a6: 17fd addi a5,a5,-1 # 1fff + 30009a8: 8ff5 and a5,a5,a3 + 30009aa: 01079613 slli a2,a5,0x10 + 30009ae: 8241 srli a2,a2,0x10 + 30009b0: 6785 lui a5,0x1 + 30009b2: 973e add a4,a4,a5 + 30009b4: 81472783 lw a5,-2028(a4) # 17fff814 + 30009b8: 6689 lui a3,0x2 + 30009ba: 16fd addi a3,a3,-1 # 1fff + 30009bc: 8ef1 and a3,a3,a2 + 30009be: 06c2 slli a3,a3,0x10 + 30009c0: e0010637 lui a2,0xe0010 + 30009c4: 167d addi a2,a2,-1 # e000ffff + 30009c6: 8ff1 and a5,a5,a2 + 30009c8: 8fd5 or a5,a5,a3 + 30009ca: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_ofst_trim2 = trimData22.REG.data0.pga0_offset2; + 30009ce: 18000737 lui a4,0x18000 + 30009d2: fbc42783 lw a5,-68(s0) + 30009d6: 83c1 srli a5,a5,0x10 + 30009d8: 86be mv a3,a5 + 30009da: 6785 lui a5,0x1 + 30009dc: 17fd addi a5,a5,-1 # fff + 30009de: 8ff5 and a5,a5,a3 + 30009e0: 01079613 slli a2,a5,0x10 + 30009e4: 8241 srli a2,a2,0x10 + 30009e6: 6785 lui a5,0x1 + 30009e8: 973e add a4,a4,a5 + 30009ea: 81472783 lw a5,-2028(a4) # 17fff814 + 30009ee: 6685 lui a3,0x1 + 30009f0: 16fd addi a3,a3,-1 # fff + 30009f2: 8ef1 and a3,a3,a2 + 30009f4: 767d lui a2,0xfffff + 30009f6: 8ff1 and a5,a5,a2 + 30009f8: 8fd5 or a5,a5,a3 + 30009fa: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_gain_trim4 = trimData22.REG.data1.pga0_gain4; + 30009fe: 18000737 lui a4,0x18000 + 3000a02: fc042783 lw a5,-64(s0) + 3000a06: 86be mv a3,a5 + 3000a08: 6789 lui a5,0x2 + 3000a0a: 17fd addi a5,a5,-1 # 1fff + 3000a0c: 8ff5 and a5,a5,a3 + 3000a0e: 01079613 slli a2,a5,0x10 + 3000a12: 8241 srli a2,a2,0x10 + 3000a14: 6785 lui a5,0x1 + 3000a16: 973e add a4,a4,a5 + 3000a18: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a1c: 6689 lui a3,0x2 + 3000a1e: 16fd addi a3,a3,-1 # 1fff + 3000a20: 8ef1 and a3,a3,a2 + 3000a22: 06c2 slli a3,a3,0x10 + 3000a24: e0010637 lui a2,0xe0010 + 3000a28: 167d addi a2,a2,-1 # e000ffff + 3000a2a: 8ff1 and a5,a5,a2 + 3000a2c: 8fd5 or a5,a5,a3 + 3000a2e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_ofst_trim4 = trimData22.REG.data1.pga0_offset4; + 3000a32: 18000737 lui a4,0x18000 + 3000a36: fc042783 lw a5,-64(s0) + 3000a3a: 83c1 srli a5,a5,0x10 + 3000a3c: 86be mv a3,a5 + 3000a3e: 6785 lui a5,0x1 + 3000a40: 17fd addi a5,a5,-1 # fff + 3000a42: 8ff5 and a5,a5,a3 + 3000a44: 01079613 slli a2,a5,0x10 + 3000a48: 8241 srli a2,a2,0x10 + 3000a4a: 6785 lui a5,0x1 + 3000a4c: 973e add a4,a4,a5 + 3000a4e: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a52: 6685 lui a3,0x1 + 3000a54: 16fd addi a3,a3,-1 # fff + 3000a56: 8ef1 and a3,a3,a2 + 3000a58: 767d lui a2,0xfffff + 3000a5a: 8ff1 and a5,a5,a2 + 3000a5c: 8fd5 or a5,a5,a3 + 3000a5e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_gain_trim8 = trimData22.REG.data2.pga0_gain8; + 3000a62: 18000737 lui a4,0x18000 + 3000a66: fc442783 lw a5,-60(s0) + 3000a6a: 86be mv a3,a5 + 3000a6c: 6789 lui a5,0x2 + 3000a6e: 17fd addi a5,a5,-1 # 1fff + 3000a70: 8ff5 and a5,a5,a3 + 3000a72: 01079613 slli a2,a5,0x10 + 3000a76: 8241 srli a2,a2,0x10 + 3000a78: 6785 lui a5,0x1 + 3000a7a: 973e add a4,a4,a5 + 3000a7c: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000a80: 6689 lui a3,0x2 + 3000a82: 16fd addi a3,a3,-1 # 1fff + 3000a84: 8ef1 and a3,a3,a2 + 3000a86: 06c2 slli a3,a3,0x10 + 3000a88: e0010637 lui a2,0xe0010 + 3000a8c: 167d addi a2,a2,-1 # e000ffff + 3000a8e: 8ff1 and a5,a5,a2 + 3000a90: 8fd5 or a5,a5,a3 + 3000a92: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_ofst_trim8 = trimData22.REG.data2.pga0_offset8; + 3000a96: 18000737 lui a4,0x18000 + 3000a9a: fc442783 lw a5,-60(s0) + 3000a9e: 83c1 srli a5,a5,0x10 + 3000aa0: 86be mv a3,a5 + 3000aa2: 6785 lui a5,0x1 + 3000aa4: 17fd addi a5,a5,-1 # fff + 3000aa6: 8ff5 and a5,a5,a3 + 3000aa8: 01079613 slli a2,a5,0x10 + 3000aac: 8241 srli a2,a2,0x10 + 3000aae: 6785 lui a5,0x1 + 3000ab0: 973e add a4,a4,a5 + 3000ab2: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000ab6: 6685 lui a3,0x1 + 3000ab8: 16fd addi a3,a3,-1 # fff + 3000aba: 8ef1 and a3,a3,a2 + 3000abc: 767d lui a2,0xfffff + 3000abe: 8ff1 and a5,a5,a2 + 3000ac0: 8fd5 or a5,a5,a3 + 3000ac2: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_gain_trim16 = trimData22.REG.data3.pga0_gain16; + 3000ac6: 18000737 lui a4,0x18000 + 3000aca: fc842783 lw a5,-56(s0) + 3000ace: 86be mv a3,a5 + 3000ad0: 6789 lui a5,0x2 + 3000ad2: 17fd addi a5,a5,-1 # 1fff + 3000ad4: 8ff5 and a5,a5,a3 + 3000ad6: 01079613 slli a2,a5,0x10 + 3000ada: 8241 srli a2,a2,0x10 + 3000adc: 6785 lui a5,0x1 + 3000ade: 973e add a4,a4,a5 + 3000ae0: 82072783 lw a5,-2016(a4) # 17fff820 + 3000ae4: 6689 lui a3,0x2 + 3000ae6: 16fd addi a3,a3,-1 # 1fff + 3000ae8: 8ef1 and a3,a3,a2 + 3000aea: 06c2 slli a3,a3,0x10 + 3000aec: e0010637 lui a2,0xe0010 + 3000af0: 167d addi a2,a2,-1 # e000ffff + 3000af2: 8ff1 and a5,a5,a2 + 3000af4: 8fd5 or a5,a5,a3 + 3000af6: 82f72023 sw a5,-2016(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_ofst_trim16 = trimData22.REG.data3.pga0_offset16; + 3000afa: 18000737 lui a4,0x18000 + 3000afe: fc842783 lw a5,-56(s0) + 3000b02: 83c1 srli a5,a5,0x10 + 3000b04: 86be mv a3,a5 + 3000b06: 6785 lui a5,0x1 + 3000b08: 17fd addi a5,a5,-1 # fff + 3000b0a: 8ff5 and a5,a5,a3 + 3000b0c: 01079613 slli a2,a5,0x10 + 3000b10: 8241 srli a2,a2,0x10 + 3000b12: 6785 lui a5,0x1 + 3000b14: 973e add a4,a4,a5 + 3000b16: 82072783 lw a5,-2016(a4) # 17fff820 + 3000b1a: 6685 lui a3,0x1 + 3000b1c: 16fd addi a3,a3,-1 # fff + 3000b1e: 8ef1 and a3,a3,a2 + 3000b20: 767d lui a2,0xfffff + 3000b22: 8ff1 and a5,a5,a2 + 3000b24: 8fd5 or a5,a5,a3 + 3000b26: 82f72023 sw a5,-2016(a4) + + FOTP_INFO_RGN0_NUMBER_23 trimData23; + FOTP_InfoGet(FOTP_INFO_RNG0, 23U, (void *)&trimData23.comData); /* 23 is the number of trim data in otp */ + 3000b2a: fac40793 addi a5,s0,-84 + 3000b2e: 863e mv a2,a5 + 3000b30: 45dd li a1,23 + 3000b32: 4501 li a0,0 + 3000b34: 2b09 jal ra,3001046 + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_gain_trim2 = trimData23.REG.data0.pga1_gain2; + 3000b36: 18000737 lui a4,0x18000 + 3000b3a: fac42783 lw a5,-84(s0) + 3000b3e: 86be mv a3,a5 + 3000b40: 6789 lui a5,0x2 + 3000b42: 17fd addi a5,a5,-1 # 1fff + 3000b44: 8ff5 and a5,a5,a3 + 3000b46: 01079613 slli a2,a5,0x10 + 3000b4a: 8241 srli a2,a2,0x10 + 3000b4c: 6785 lui a5,0x1 + 3000b4e: 973e add a4,a4,a5 + 3000b50: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b54: 6689 lui a3,0x2 + 3000b56: 16fd addi a3,a3,-1 # 1fff + 3000b58: 8ef1 and a3,a3,a2 + 3000b5a: 06c2 slli a3,a3,0x10 + 3000b5c: e0010637 lui a2,0xe0010 + 3000b60: 167d addi a2,a2,-1 # e000ffff + 3000b62: 8ff1 and a5,a5,a2 + 3000b64: 8fd5 or a5,a5,a3 + 3000b66: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_ofst_trim2 = trimData23.REG.data0.pga1_offset2; + 3000b6a: 18000737 lui a4,0x18000 + 3000b6e: fac42783 lw a5,-84(s0) + 3000b72: 83c1 srli a5,a5,0x10 + 3000b74: 86be mv a3,a5 + 3000b76: 6785 lui a5,0x1 + 3000b78: 17fd addi a5,a5,-1 # fff + 3000b7a: 8ff5 and a5,a5,a3 + 3000b7c: 01079613 slli a2,a5,0x10 + 3000b80: 8241 srli a2,a2,0x10 + 3000b82: 6785 lui a5,0x1 + 3000b84: 973e add a4,a4,a5 + 3000b86: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b8a: 6685 lui a3,0x1 + 3000b8c: 16fd addi a3,a3,-1 # fff + 3000b8e: 8ef1 and a3,a3,a2 + 3000b90: 767d lui a2,0xfffff + 3000b92: 8ff1 and a5,a5,a2 + 3000b94: 8fd5 or a5,a5,a3 + 3000b96: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_gain_trim4 = trimData23.REG.data1.pga1_gain4; + 3000b9a: 18000737 lui a4,0x18000 + 3000b9e: fb042783 lw a5,-80(s0) + 3000ba2: 86be mv a3,a5 + 3000ba4: 6789 lui a5,0x2 + 3000ba6: 17fd addi a5,a5,-1 # 1fff + 3000ba8: 8ff5 and a5,a5,a3 + 3000baa: 01079613 slli a2,a5,0x10 + 3000bae: 8241 srli a2,a2,0x10 + 3000bb0: 6785 lui a5,0x1 + 3000bb2: 973e add a4,a4,a5 + 3000bb4: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bb8: 6689 lui a3,0x2 + 3000bba: 16fd addi a3,a3,-1 # 1fff + 3000bbc: 8ef1 and a3,a3,a2 + 3000bbe: 06c2 slli a3,a3,0x10 + 3000bc0: e0010637 lui a2,0xe0010 + 3000bc4: 167d addi a2,a2,-1 # e000ffff + 3000bc6: 8ff1 and a5,a5,a2 + 3000bc8: 8fd5 or a5,a5,a3 + 3000bca: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_ofst_trim4 = trimData23.REG.data1.pga1_offset4; + 3000bce: 18000737 lui a4,0x18000 + 3000bd2: fb042783 lw a5,-80(s0) + 3000bd6: 83c1 srli a5,a5,0x10 + 3000bd8: 86be mv a3,a5 + 3000bda: 6785 lui a5,0x1 + 3000bdc: 17fd addi a5,a5,-1 # fff + 3000bde: 8ff5 and a5,a5,a3 + 3000be0: 01079613 slli a2,a5,0x10 + 3000be4: 8241 srli a2,a2,0x10 + 3000be6: 6785 lui a5,0x1 + 3000be8: 973e add a4,a4,a5 + 3000bea: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bee: 6685 lui a3,0x1 + 3000bf0: 16fd addi a3,a3,-1 # fff + 3000bf2: 8ef1 and a3,a3,a2 + 3000bf4: 767d lui a2,0xfffff + 3000bf6: 8ff1 and a5,a5,a2 + 3000bf8: 8fd5 or a5,a5,a3 + 3000bfa: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_gain_trim8 = trimData23.REG.data2.pga1_gain8; + 3000bfe: 18000737 lui a4,0x18000 + 3000c02: fb442783 lw a5,-76(s0) + 3000c06: 86be mv a3,a5 + 3000c08: 6789 lui a5,0x2 + 3000c0a: 17fd addi a5,a5,-1 # 1fff + 3000c0c: 8ff5 and a5,a5,a3 + 3000c0e: 01079613 slli a2,a5,0x10 + 3000c12: 8241 srli a2,a2,0x10 + 3000c14: 6785 lui a5,0x1 + 3000c16: 973e add a4,a4,a5 + 3000c18: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c1c: 6689 lui a3,0x2 + 3000c1e: 16fd addi a3,a3,-1 # 1fff + 3000c20: 8ef1 and a3,a3,a2 + 3000c22: 06c2 slli a3,a3,0x10 + 3000c24: e0010637 lui a2,0xe0010 + 3000c28: 167d addi a2,a2,-1 # e000ffff + 3000c2a: 8ff1 and a5,a5,a2 + 3000c2c: 8fd5 or a5,a5,a3 + 3000c2e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_ofst_trim8 = trimData23.REG.data2.pga1_offset8; + 3000c32: 18000737 lui a4,0x18000 + 3000c36: fb442783 lw a5,-76(s0) + 3000c3a: 83c1 srli a5,a5,0x10 + 3000c3c: 86be mv a3,a5 + 3000c3e: 6785 lui a5,0x1 + 3000c40: 17fd addi a5,a5,-1 # fff + 3000c42: 8ff5 and a5,a5,a3 + 3000c44: 01079613 slli a2,a5,0x10 + 3000c48: 8241 srli a2,a2,0x10 + 3000c4a: 6785 lui a5,0x1 + 3000c4c: 973e add a4,a4,a5 + 3000c4e: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c52: 6685 lui a3,0x1 + 3000c54: 16fd addi a3,a3,-1 # fff + 3000c56: 8ef1 and a3,a3,a2 + 3000c58: 767d lui a2,0xfffff + 3000c5a: 8ff1 and a5,a5,a2 + 3000c5c: 8fd5 or a5,a5,a3 + 3000c5e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_gain_trim16 = trimData23.REG.data3.pga1_gain16; + 3000c62: 18000737 lui a4,0x18000 + 3000c66: fb842783 lw a5,-72(s0) + 3000c6a: 86be mv a3,a5 + 3000c6c: 6789 lui a5,0x2 + 3000c6e: 17fd addi a5,a5,-1 # 1fff + 3000c70: 8ff5 and a5,a5,a3 + 3000c72: 01079613 slli a2,a5,0x10 + 3000c76: 8241 srli a2,a2,0x10 + 3000c78: 6785 lui a5,0x1 + 3000c7a: 973e add a4,a4,a5 + 3000c7c: 83072783 lw a5,-2000(a4) # 17fff830 + 3000c80: 6689 lui a3,0x2 + 3000c82: 16fd addi a3,a3,-1 # 1fff + 3000c84: 8ef1 and a3,a3,a2 + 3000c86: 06c2 slli a3,a3,0x10 + 3000c88: e0010637 lui a2,0xe0010 + 3000c8c: 167d addi a2,a2,-1 # e000ffff + 3000c8e: 8ff1 and a5,a5,a2 + 3000c90: 8fd5 or a5,a5,a3 + 3000c92: 82f72823 sw a5,-2000(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_ofst_trim16 = trimData23.REG.data3.pga1_offset16; + 3000c96: 18000737 lui a4,0x18000 + 3000c9a: fb842783 lw a5,-72(s0) + 3000c9e: 83c1 srli a5,a5,0x10 + 3000ca0: 86be mv a3,a5 + 3000ca2: 6785 lui a5,0x1 + 3000ca4: 17fd addi a5,a5,-1 # fff + 3000ca6: 8ff5 and a5,a5,a3 + 3000ca8: 01079613 slli a2,a5,0x10 + 3000cac: 8241 srli a2,a2,0x10 + 3000cae: 6785 lui a5,0x1 + 3000cb0: 973e add a4,a4,a5 + 3000cb2: 83072783 lw a5,-2000(a4) # 17fff830 + 3000cb6: 6685 lui a3,0x1 + 3000cb8: 16fd addi a3,a3,-1 # fff + 3000cba: 8ef1 and a3,a3,a2 + 3000cbc: 767d lui a2,0xfffff + 3000cbe: 8ff1 and a5,a5,a2 + 3000cc0: 8fd5 or a5,a5,a3 + 3000cc2: 82f72823 sw a5,-2000(a4) +} + 3000cc6: 0001 nop + 3000cc8: 40f6 lw ra,92(sp) + 3000cca: 4466 lw s0,88(sp) + 3000ccc: 6125 addi sp,sp,96 + 3000cce: 8082 ret + +03000cd0 : + 3000cd0: 3760006f j 3001046 + +03000cd4 : + * @brief Parameter calibration entry of the analog module. + * @param None + * @retval None + */ +void ANATRIM_Entry(void) +{ + 3000cd4: 1141 addi sp,sp,-16 + 3000cd6: c606 sw ra,12(sp) + 3000cd8: c422 sw s0,8(sp) + 3000cda: 0800 addi s0,sp,16 + if (CHIP_GetInfo() == false) { /* If the chip information is incorrect, calibration is not performed */ + 3000cdc: 3c79 jal ra,300077a + 3000cde: 87aa mv a5,a0 + 3000ce0: 0017c793 xori a5,a5,1 + 3000ce4: 9f81 uxtb a5 + 3000ce6: eb9d bnez a5,3000d1c + return; + } + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_ENABLE); /* Enable the clock for calibration */ + 3000ce8: 4585 li a1,1 + 3000cea: 18000537 lui a0,0x18000 + 3000cee: 2849 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_ENABLE); + 3000cf0: 4585 li a1,1 + 3000cf2: 18200537 lui a0,0x18200 + 3000cf6: 2069 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_ENABLE); + 3000cf8: 4585 li a1,1 + 3000cfa: 18201537 lui a0,0x18201 + 3000cfe: 2049 jal ra,3000d80 + CHIP_AnalogTrim(); + 3000d00: 34d1 jal ra,30007c4 + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_DISABLE); /* The clock is disabled after calibration */ + 3000d02: 4581 li a1,0 + 3000d04: 18000537 lui a0,0x18000 + 3000d08: 28a5 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_DISABLE); + 3000d0a: 4581 li a1,0 + 3000d0c: 18200537 lui a0,0x18200 + 3000d10: 2885 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_DISABLE); + 3000d12: 4581 li a1,0 + 3000d14: 18201537 lui a0,0x18201 + 3000d18: 20a5 jal ra,3000d80 + 3000d1a: a011 j 3000d1e + return; + 3000d1c: 0001 nop + 3000d1e: 40b2 lw ra,12(sp) + 3000d20: 4422 lw s0,8(sp) + 3000d22: 0141 addi sp,sp,16 + 3000d24: 8082 ret + +03000d26 : + * @brief Set Crg Core clock select + * @param None + * @retval None + */ +void ANAVREF_Init(void) +{ + 3000d26: 1141 addi sp,sp,-16 + 3000d28: c606 sw ra,12(sp) + 3000d2a: c422 sw s0,8(sp) + 3000d2c: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(VREF_BASE, IP_CLK_ENABLE); + 3000d2e: 4585 li a1,1 + 3000d30: 18100537 lui a0,0x18100 + 3000d34: 20b1 jal ra,3000d80 + VREF->VREF_CTRL1.BIT.da_ref_temp_trim_enh = 0x1; + 3000d36: 18100737 lui a4,0x18100 + 3000d3a: 531c lw a5,32(a4) + 3000d3c: 66c1 lui a3,0x10 + 3000d3e: 8fd5 or a5,a5,a3 + 3000d40: d31c sw a5,32(a4) + VREF->VREF_CTRL0.BIT.da_ref_enh = BASE_CFG_ENABLE; + 3000d42: 18100737 lui a4,0x18100 + 3000d46: 431c lw a5,0(a4) + 3000d48: 0017e793 ori a5,a5,1 + 3000d4c: c31c sw a5,0(a4) + BASE_FUNC_DELAY_US(200); /* delay 200us */ + 3000d4e: 000f47b7 lui a5,0xf4 + 3000d52: 24078593 addi a1,a5,576 # f4240 + 3000d56: 0c800513 li a0,200 + 3000d5a: 20b5 jal ra,3000dc6 + VREF->VREF_CTRL1.BIT.da_ref_chop_enh = BASE_CFG_ENABLE; + 3000d5c: 18100737 lui a4,0x18100 + 3000d60: 531c lw a5,32(a4) + 3000d62: 0017e793 ori a5,a5,1 + 3000d66: d31c sw a5,32(a4) + BASE_FUNC_DELAY_US(40); /* delay 40us */ + 3000d68: 000f47b7 lui a5,0xf4 + 3000d6c: 24078593 addi a1,a5,576 # f4240 + 3000d70: 02800513 li a0,40 + 3000d74: 2889 jal ra,3000dc6 + 3000d76: 0001 nop + 3000d78: 40b2 lw ra,12(sp) + 3000d7a: 4422 lw s0,8(sp) + 3000d7c: 0141 addi sp,sp,16 + 3000d7e: 8082 ret + +03000d80 : + 3000d80: 57a0206f j 30032fa + +03000d84 : + * @brief Set Crg Core clock select + * @param coreClkSelect Input core clock select value + * @retval None + */ +void CRG_SetCoreClockSelect(CRG_CoreClkSelect coreClkSelect) +{ + 3000d84: 715d addi sp,sp,-80 + 3000d86: c686 sw ra,76(sp) + 3000d88: c4a2 sw s0,72(sp) + 3000d8a: 0880 addi s0,sp,80 + 3000d8c: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3000d90: 100007b7 lui a5,0x10000 + 3000d94: fcf42423 sw a5,-56(s0) + crg.coreClkSelect = coreClkSelect; + 3000d98: fbc42783 lw a5,-68(s0) + 3000d9c: fef42023 sw a5,-32(s0) + if (crg.coreClkSelect == CRG_CORE_CLK_SELECT_TCXO) { /* If an external crystal oscillator is selected. */ + 3000da0: fe042703 lw a4,-32(s0) + 3000da4: 4785 li a5,1 + 3000da6: 00f71663 bne a4,a5,3000db2 + BASE_FUNC_DELAY_MS(10); /* 10: delay 10ms, wait clokc stable. */ + 3000daa: 3e800593 li a1,1000 + 3000dae: 4529 li a0,10 + 3000db0: 2819 jal ra,3000dc6 + } + HAL_CRG_SetCoreClockSelect(&crg); + 3000db2: fc840793 addi a5,s0,-56 + 3000db6: 853e mv a0,a5 + 3000db8: 23a020ef jal ra,3002ff2 + 3000dbc: 0001 nop + 3000dbe: 40b6 lw ra,76(sp) + 3000dc0: 4426 lw s0,72(sp) + 3000dc2: 6161 addi sp,sp,80 + 3000dc4: 8082 ret + +03000dc6 : + 3000dc6: 1de0106f j 3001fa4 + +03000dca : + * @param frequence frequnce + * @param div Output Divison + * @retval None + */ +static void SetFlashDiv(unsigned int frequency, unsigned int *nreadDiv) +{ + 3000dca: 7179 addi sp,sp,-48 + 3000dcc: d622 sw s0,44(sp) + 3000dce: 1800 addi s0,sp,48 + 3000dd0: fca42e23 sw a0,-36(s0) + 3000dd4: fcb42c23 sw a1,-40(s0) + unsigned int div; + unsigned int freq = frequency; + 3000dd8: fdc42783 lw a5,-36(s0) + 3000ddc: fef42423 sw a5,-24(s0) + /* Get frequency divider of flash. */ + if (freq < FLASH_BASE_FREQ) { + 3000de0: fe842703 lw a4,-24(s0) + 3000de4: 023c37b7 lui a5,0x23c3 + 3000de8: 45f78793 addi a5,a5,1119 # 23c345f + 3000dec: 00e7e863 bltu a5,a4,3000dfc + freq = FLASH_BASE_FREQ; + 3000df0: 023c37b7 lui a5,0x23c3 + 3000df4: 46078793 addi a5,a5,1120 # 23c3460 + 3000df8: fef42423 sw a5,-24(s0) + } + /* Get the flash frequency division based on the frequency. */ + if ((freq % FLASH_BASE_FREQ) == 0) { + 3000dfc: fe842703 lw a4,-24(s0) + 3000e00: 023c37b7 lui a5,0x23c3 + 3000e04: 46078793 addi a5,a5,1120 # 23c3460 + 3000e08: 02f777b3 remu a5,a4,a5 + 3000e0c: ef81 bnez a5,3000e24 + div = freq / FLASH_BASE_FREQ; + 3000e0e: fe842703 lw a4,-24(s0) + 3000e12: 023c37b7 lui a5,0x23c3 + 3000e16: 46078793 addi a5,a5,1120 # 23c3460 + 3000e1a: 02f757b3 divu a5,a4,a5 + 3000e1e: fef42623 sw a5,-20(s0) + 3000e22: a821 j 3000e3a + } else { + div = (freq / FLASH_BASE_FREQ) + 1; + 3000e24: fe842703 lw a4,-24(s0) + 3000e28: 023c37b7 lui a5,0x23c3 + 3000e2c: 46078793 addi a5,a5,1120 # 23c3460 + 3000e30: 02f757b3 divu a5,a4,a5 + 3000e34: 0785 addi a5,a5,1 + 3000e36: fef42623 sw a5,-20(s0) + } + /* Ensure the flash frequency division is valid. */ + if (div > FLASH_MAX_DIV) { + 3000e3a: fec42703 lw a4,-20(s0) + 3000e3e: 4791 li a5,4 + 3000e40: 00e7f563 bgeu a5,a4,3000e4a + div = FLASH_MAX_DIV; + 3000e44: 4791 li a5,4 + 3000e46: fef42623 sw a5,-20(s0) + } + *nreadDiv = div; + 3000e4a: fd842783 lw a5,-40(s0) + 3000e4e: fec42703 lw a4,-20(s0) + 3000e52: c398 sw a4,0(a5) +} + 3000e54: 0001 nop + 3000e56: 5432 lw s0,44(sp) + 3000e58: 6145 addi sp,sp,48 + 3000e5a: 8082 ret + +03000e5c : + * @brief Get the Rounding up value + * @param coreClkSelect Core Clock select + * @retval Frequency of Flash + */ +static unsigned int GetFlashFreq(CRG_CoreClkSelect coreClkSelect) +{ + 3000e5c: 7179 addi sp,sp,-48 + 3000e5e: d606 sw ra,44(sp) + 3000e60: d422 sw s0,40(sp) + 3000e62: 1800 addi s0,sp,48 + 3000e64: fca42e23 sw a0,-36(s0) + unsigned int hclk; + /* Get frequency of flash. */ + switch (coreClkSelect) { + 3000e68: fdc42783 lw a5,-36(s0) + 3000e6c: 4705 li a4,1 + 3000e6e: 02e78063 beq a5,a4,3000e8e + 3000e72: 4705 li a4,1 + 3000e74: 00e7e663 bltu a5,a4,3000e80 + 3000e78: 4709 li a4,2 + 3000e7a: 02e78163 beq a5,a4,3000e9c + 3000e7e: a025 j 3000ea6 + case CRG_CORE_CLK_SELECT_HOSC: + hclk = HOSC_FREQ; + 3000e80: 017d87b7 lui a5,0x17d8 + 3000e84: 84078793 addi a5,a5,-1984 # 17d7840 + 3000e88: fef42623 sw a5,-20(s0) + break; + 3000e8c: a01d j 3000eb2 + case CRG_CORE_CLK_SELECT_TCXO: + hclk = XTRAIL_FREQ; + 3000e8e: 01c9c7b7 lui a5,0x1c9c + 3000e92: 38078793 addi a5,a5,896 # 1c9c380 + 3000e96: fef42623 sw a5,-20(s0) + break; + 3000e9a: a821 j 3000eb2 + case CRG_CORE_CLK_SELECT_PLL: + hclk = HAL_CRG_GetPllFreq(); + 3000e9c: 278020ef jal ra,3003114 + 3000ea0: fea42623 sw a0,-20(s0) + break; + 3000ea4: a039 j 3000eb2 + default: + hclk = LOSC_FREQ; + 3000ea6: 67a1 lui a5,0x8 + 3000ea8: d0078793 addi a5,a5,-768 # 7d00 + 3000eac: fef42623 sw a5,-20(s0) + break; + 3000eb0: 0001 nop + } + return hclk; + 3000eb2: fec42783 lw a5,-20(s0) +} + 3000eb6: 853e mv a0,a5 + 3000eb8: 50b2 lw ra,44(sp) + 3000eba: 5422 lw s0,40(sp) + 3000ebc: 6145 addi sp,sp,48 + 3000ebe: 8082 ret + +03000ec0 : + * @brief Set flash clock frequence base on hclk + * @param coreClkSelect core clock select + * @retval None + */ +void FLASH_ClockConfig(CRG_CoreClkSelect coreClkSelect) +{ + 3000ec0: 7179 addi sp,sp,-48 + 3000ec2: d606 sw ra,44(sp) + 3000ec4: d422 sw s0,40(sp) + 3000ec6: 1800 addi s0,sp,48 + 3000ec8: fca42e23 sw a0,-36(s0) + EFC_RegStruct *efc = EFC; + 3000ecc: 147107b7 lui a5,0x14710 + 3000ed0: fef42623 sw a5,-20(s0) + EFLASH_CLK_CFG_REG cfg; + unsigned int hclk; + unsigned int nreadDiv; + + /* Step 1: Set nread_div */ + hclk = GetFlashFreq(coreClkSelect); + 3000ed4: fdc42503 lw a0,-36(s0) + 3000ed8: 3751 jal ra,3000e5c + 3000eda: fea42423 sw a0,-24(s0) + cfg.reg = efc->EFLASH_CLK_CFG.reg; + 3000ede: fec42703 lw a4,-20(s0) + 3000ee2: 6785 lui a5,0x1 + 3000ee4: 97ba add a5,a5,a4 + 3000ee6: 9407a783 lw a5,-1728(a5) # 940 + 3000eea: fef42223 sw a5,-28(s0) + SetFlashDiv(hclk, &nreadDiv); + 3000eee: fe040793 addi a5,s0,-32 + 3000ef2: 85be mv a1,a5 + 3000ef4: fe842503 lw a0,-24(s0) + 3000ef8: 3dc9 jal ra,3000dca + cfg.BIT.nread_div = nreadDiv; + 3000efa: fe042783 lw a5,-32(s0) + 3000efe: 8bbd andi a5,a5,15 + 3000f00: 0ff7f713 andi a4,a5,255 + 3000f04: fe442783 lw a5,-28(s0) + 3000f08: 8b3d andi a4,a4,15 + 3000f0a: 0712 slli a4,a4,0x4 + 3000f0c: f0f7f793 andi a5,a5,-241 + 3000f10: 8fd9 or a5,a5,a4 + 3000f12: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f16: fe442783 lw a5,-28(s0) + 3000f1a: 00100737 lui a4,0x100 + 3000f1e: 8fd9 or a5,a5,a4 + 3000f20: fef42223 sw a5,-28(s0) + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f24: fe442783 lw a5,-28(s0) + 3000f28: 00400737 lui a4,0x400 + 3000f2c: 8fd9 or a5,a5,a4 + 3000f2e: fef42223 sw a5,-28(s0) + + /* Step 2: Wait Busclk_sw_req */ + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f32: fe442783 lw a5,-28(s0) + 3000f36: 00400737 lui a4,0x400 + 3000f3a: 8fd9 or a5,a5,a4 + 3000f3c: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f40: fe442783 lw a5,-28(s0) + 3000f44: 00100737 lui a4,0x100 + 3000f48: 8fd9 or a5,a5,a4 + 3000f4a: fef42223 sw a5,-28(s0) + efc->EFLASH_CLK_CFG.reg = cfg.reg; + 3000f4e: fe442703 lw a4,-28(s0) + 3000f52: fec42683 lw a3,-20(s0) + 3000f56: 6785 lui a5,0x1 + 3000f58: 97b6 add a5,a5,a3 + 3000f5a: 94e7a023 sw a4,-1728(a5) # 940 + while (efc->EFLASH_CLK_CFG.BIT.busclk_sw_req == BASE_CFG_SET) { + 3000f5e: 0001 nop + 3000f60: fec42703 lw a4,-20(s0) + 3000f64: 6785 lui a5,0x1 + 3000f66: 97ba add a5,a5,a4 + 3000f68: 9407a783 lw a5,-1728(a5) # 940 + 3000f6c: 83d1 srli a5,a5,0x14 + 3000f6e: 8b85 andi a5,a5,1 + 3000f70: 0ff7f713 andi a4,a5,255 + 3000f74: 4785 li a5,1 + 3000f76: fef705e3 beq a4,a5,3000f60 + ; + } + 3000f7a: 0001 nop + 3000f7c: 50b2 lw ra,44(sp) + 3000f7e: 5422 lw s0,40(sp) + 3000f80: 6145 addi sp,sp,48 + 3000f82: 8082 ret + +03000f84 : + * @brief Init the systick + * @param None + * @retval None + */ +void SYSTICK_Init(void) +{ + 3000f84: 1141 addi sp,sp,-16 + 3000f86: c622 sw s0,12(sp) + 3000f88: 0800 addi s0,sp,16 + SYSTICK->TIMER_CTRL.reg = 0; + 3000f8a: 143807b7 lui a5,0x14380 + 3000f8e: 0007a023 sw zero,0(a5) # 14380000 + SYSTICK->TIMER_CTRL.BIT.enable = 1; + 3000f92: 14380737 lui a4,0x14380 + 3000f96: 431c lw a5,0(a4) + 3000f98: 0017e793 ori a5,a5,1 + 3000f9c: c31c sw a5,0(a4) +} + 3000f9e: 0001 nop + 3000fa0: 4432 lw s0,12(sp) + 3000fa2: 0141 addi sp,sp,16 + 3000fa4: 8082 ret + +03000fa6 : + * @brief Get the Systick frep(Hz) + * @param None + * @retval Clock frep of systick(Hz) + */ +unsigned int SYSTICK_GetCRGHZ(void) +{ + 3000fa6: 1141 addi sp,sp,-16 + 3000fa8: c606 sw ra,12(sp) + 3000faa: c422 sw s0,8(sp) + 3000fac: 0800 addi s0,sp,16 + /* Get the Systick IP */ + return HAL_CRG_GetIpFreq(SYSTICK_BASE); + 3000fae: 14380537 lui a0,0x14380 + 3000fb2: 264020ef jal ra,3003216 + 3000fb6: 87aa mv a5,a0 + 3000fb8: 853e mv a0,a5 + 3000fba: 40b2 lw ra,12(sp) + 3000fbc: 4422 lw s0,8(sp) + 3000fbe: 0141 addi sp,sp,16 + 3000fc0: 8082 ret + +03000fc2 : + * @param efc Flash control register base address + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +static unsigned int FOTP_CheckReadStatus(EFC_RegStruct *efc) +{ + 3000fc2: 1101 addi sp,sp,-32 + 3000fc4: ce22 sw s0,28(sp) + 3000fc6: 1000 addi s0,sp,32 + 3000fc8: fea42623 sw a0,-20(s0) + /* Check for errors in the flash reading process. */ + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fcc: fec42783 lw a5,-20(s0) + 3000fd0: 1007a783 lw a5,256(a5) + 3000fd4: 83c1 srli a5,a5,0x10 + 3000fd6: 8b85 andi a5,a5,1 + 3000fd8: 9f81 uxtb a5 + 3000fda: e38d bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000fdc: fec42783 lw a5,-20(s0) + 3000fe0: 1007a783 lw a5,256(a5) + 3000fe4: 83cd srli a5,a5,0x13 + 3000fe6: 8b85 andi a5,a5,1 + 3000fe8: 9f81 uxtb a5 + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fea: eb89 bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_chk) { + 3000fec: fec42783 lw a5,-20(s0) + 3000ff0: 1007a783 lw a5,256(a5) + 3000ff4: 83d1 srli a5,a5,0x14 + 3000ff6: 8b85 andi a5,a5,1 + 3000ff8: 9f81 uxtb a5 + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000ffa: c3a9 beqz a5,300103c + efc->INT_CLEAR.BIT.int_clr_err_ecc_corr = BASE_CFG_SET; + 3000ffc: fec42703 lw a4,-20(s0) + 3001000: 10c72783 lw a5,268(a4) # 1438010c + 3001004: 000806b7 lui a3,0x80 + 3001008: 8fd5 or a5,a5,a3 + 300100a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_illegal = BASE_CFG_SET; + 300100e: fec42703 lw a4,-20(s0) + 3001012: 10c72783 lw a5,268(a4) + 3001016: 66c1 lui a3,0x10 + 3001018: 8fd5 or a5,a5,a3 + 300101a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_ecc_chk = BASE_CFG_SET; + 300101e: fec42703 lw a4,-20(s0) + 3001022: 10c72783 lw a5,268(a4) + 3001026: 001006b7 lui a3,0x100 + 300102a: 8fd5 or a5,a5,a3 + 300102c: 10f72623 sw a5,268(a4) + efc->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001030: fec42783 lw a5,-20(s0) + 3001034: 2007a023 sw zero,512(a5) + return BASE_STATUS_ERROR; + 3001038: 4785 li a5,1 + 300103a: a011 j 300103e + } + return BASE_STATUS_OK; + 300103c: 4781 li a5,0 +} + 300103e: 853e mv a0,a5 + 3001040: 4472 lw s0,28(sp) + 3001042: 6105 addi sp,sp,32 + 3001044: 8082 ret + +03001046 : + * @param buf Buffer of read data + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +unsigned int FOTP_InfoGet(FOTP_InfoRngType type, unsigned int index, FOTP_CommonData *buf) +{ + 3001046: 7179 addi sp,sp,-48 + 3001048: d606 sw ra,44(sp) + 300104a: d422 sw s0,40(sp) + 300104c: 1800 addi s0,sp,48 + 300104e: fca42e23 sw a0,-36(s0) + 3001052: fcb42c23 sw a1,-40(s0) + 3001056: fcc42a23 sw a2,-44(s0) + EFC_RegStruct *p = EFC; + 300105a: 147107b7 lui a5,0x14710 + 300105e: fef42423 sw a5,-24(s0) + unsigned int addr; + + if (buf == NULL) { + 3001062: fd442783 lw a5,-44(s0) + 3001066: e399 bnez a5,300106c + return BASE_STATUS_ERROR; + 3001068: 4785 li a5,1 + 300106a: aa15 j 300119e + } + + if ((type >= FOTP_INFO_MAXTYPE) || (index > FOTP_INFO_REG_MAX_ID)) { + 300106c: fdc42703 lw a4,-36(s0) + 3001070: 4785 li a5,1 + 3001072: 00e7e763 bltu a5,a4,3001080 + 3001076: fd842703 lw a4,-40(s0) + 300107a: 47e5 li a5,25 + 300107c: 00e7f463 bgeu a5,a4,3001084 + return BASE_STATUS_ERROR; + 3001080: 4785 li a5,1 + 3001082: aa31 j 300119e + } + + /* If there is a read command, return */ + if (p->EFLASH_CMD.BIT.cmd_start) { + 3001084: fe842783 lw a5,-24(s0) + 3001088: 439c lw a5,0(a5) + 300108a: 8b85 andi a5,a5,1 + 300108c: 9f81 uxtb a5 + 300108e: c399 beqz a5,3001094 + return BASE_STATUS_ERROR; + 3001090: 4785 li a5,1 + 3001092: a231 j 300119e + } + + p->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; + 3001094: fe842783 lw a5,-24(s0) + 3001098: fedcc737 lui a4,0xfedcc + 300109c: a9870713 addi a4,a4,-1384 # fedcba98 + 30010a0: 20e7a023 sw a4,512(a5) # 14710200 + + /* Configure the read command parameters and start the read command */ + addr = (type == FOTP_INFO_RNG0) ? FOTP_INFO_RNG0_BASEADDR : FOTP_INFO_RNG1_BASEADDR; + 30010a4: fdc42783 lw a5,-36(s0) + 30010a8: e781 bnez a5,30010b0 + 30010aa: 008007b7 lui a5,0x800 + 30010ae: a019 j 30010b4 + 30010b0: 008017b7 lui a5,0x801 + 30010b4: fef42223 sw a5,-28(s0) + addr += index * REG_WORDS_NUM; + 30010b8: fd842783 lw a5,-40(s0) + 30010bc: 0792 slli a5,a5,0x4 + 30010be: fe442703 lw a4,-28(s0) + 30010c2: 97ba add a5,a5,a4 + 30010c4: fef42223 sw a5,-28(s0) + p->EFLASH_ADDR.BIT.cmd_addr = addr >> 2; /* Right shift 2 bit change to word */ + 30010c8: fe442783 lw a5,-28(s0) + 30010cc: 0027d713 srli a4,a5,0x2 + 30010d0: 004007b7 lui a5,0x400 + 30010d4: 17fd addi a5,a5,-1 # 3fffff + 30010d6: 00f77633 and a2,a4,a5 + 30010da: fe842703 lw a4,-24(s0) + 30010de: 435c lw a5,4(a4) + 30010e0: 004006b7 lui a3,0x400 + 30010e4: 16fd addi a3,a3,-1 # 3fffff + 30010e6: 8ef1 and a3,a3,a2 + 30010e8: 068a slli a3,a3,0x2 + 30010ea: ff000637 lui a2,0xff000 + 30010ee: 060d addi a2,a2,3 # ff000003 + 30010f0: 8ff1 and a5,a5,a2 + 30010f2: 8fd5 or a5,a5,a3 + 30010f4: c35c sw a5,4(a4) + p->EFLASH_CMD.BIT.cmd_code = FLASH_OPERATION_READ; + 30010f6: fe842703 lw a4,-24(s0) + 30010fa: 431c lw a5,0(a4) + 30010fc: 8ff7f793 andi a5,a5,-1793 + 3001100: 1007e793 ori a5,a5,256 + 3001104: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_read_size = FLASH_READ_128BIT; + 3001106: fe842703 lw a4,-24(s0) + 300110a: 431c lw a5,0(a4) + 300110c: d00006b7 lui a3,0xd0000 + 3001110: 16fd addi a3,a3,-1 # cfffffff + 3001112: 8efd and a3,a3,a5 + 3001114: 100007b7 lui a5,0x10000 + 3001118: 8fd5 or a5,a5,a3 + 300111a: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_start = BASE_CFG_SET; + 300111c: fe842703 lw a4,-24(s0) + 3001120: 431c lw a5,0(a4) + 3001122: 0017e793 ori a5,a5,1 + 3001126: c31c sw a5,0(a4) + + while (p->EFLASH_CMD.BIT.cmd_start) { + 3001128: 0001 nop + 300112a: fe842783 lw a5,-24(s0) + 300112e: 439c lw a5,0(a5) + 3001130: 8b85 andi a5,a5,1 + 3001132: 9f81 uxtb a5 + 3001134: fbfd bnez a5,300112a + ; + } + while (p->EFLASH_CMD.BIT.exec_state) { + 3001136: 0001 nop + 3001138: fe842783 lw a5,-24(s0) + 300113c: 439c lw a5,0(a5) + 300113e: 8399 srli a5,a5,0x6 + 3001140: 8b8d andi a5,a5,3 + 3001142: 9f81 uxtb a5 + 3001144: fbf5 bnez a5,3001138 + ; + } + /* read error, clear interrupt and return */ + if (FOTP_CheckReadStatus(p) != BASE_STATUS_OK) { + 3001146: fe842503 lw a0,-24(s0) + 300114a: 3da5 jal ra,3000fc2 + 300114c: 87aa mv a5,a0 + 300114e: c399 beqz a5,3001154 + return BASE_STATUS_ERROR; + 3001150: 4785 li a5,1 + 3001152: a0b1 j 300119e + } + /* Read data from FIFO to buffer */ + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001154: fe042623 sw zero,-20(s0) + 3001158: a00d j 300117a + buf->data[i] = p->FLASH_RDATA; + 300115a: fe842783 lw a5,-24(s0) + 300115e: 6007a703 lw a4,1536(a5) # 10000600 + 3001162: fd442683 lw a3,-44(s0) + 3001166: fec42783 lw a5,-20(s0) + 300116a: 078a slli a5,a5,0x2 + 300116c: 97b6 add a5,a5,a3 + 300116e: c398 sw a4,0(a5) + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001170: fec42783 lw a5,-20(s0) + 3001174: 0785 addi a5,a5,1 + 3001176: fef42623 sw a5,-20(s0) + 300117a: fec42703 lw a4,-20(s0) + 300117e: 478d li a5,3 + 3001180: fce7fde3 bgeu a5,a4,300115a + } + p->INT_CLEAR.BIT.int_clr_finish = BASE_CFG_SET; + 3001184: fe842703 lw a4,-24(s0) + 3001188: 10c72783 lw a5,268(a4) + 300118c: 0107e793 ori a5,a5,16 + 3001190: 10f72623 sw a5,268(a4) + p->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001194: fe842783 lw a5,-24(s0) + 3001198: 2007a023 sw zero,512(a5) + return BASE_STATUS_OK; + 300119c: 4781 li a5,0 + 300119e: 853e mv a0,a5 + 30011a0: 50b2 lw ra,44(sp) + 30011a2: 5422 lw s0,40(sp) + 30011a4: 6145 addi sp,sp,48 + 30011a6: 8082 ret + +030011a8 : + * @param baseAddr The ip base address + * @retval The Address(offset) in g_crgIpMatch if match success + * @retval 0 if match fail + */ +CHIP_CrgIpMatchInfo *GetCrgIpMatchInfo(const void *baseAddr) +{ + 30011a8: 7179 addi sp,sp,-48 + 30011aa: d622 sw s0,44(sp) + 30011ac: 1800 addi s0,sp,48 + 30011ae: fca42e23 sw a0,-36(s0) + unsigned int i; + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011b2: fe042623 sw zero,-20(s0) + 30011b6: a081 j 30011f6 + if (baseAddr == g_crgIpMatch[i].ipBaseAddr) { + 30011b8: 030067b7 lui a5,0x3006 + 30011bc: 20078713 addi a4,a5,512 # 3006200 + 30011c0: fec42683 lw a3,-20(s0) + 30011c4: 47b1 li a5,12 + 30011c6: 02f687b3 mul a5,a3,a5 + 30011ca: 97ba add a5,a5,a4 + 30011cc: 439c lw a5,0(a5) + 30011ce: fdc42703 lw a4,-36(s0) + 30011d2: 00f71d63 bne a4,a5,30011ec + return (CHIP_CrgIpMatchInfo *)&g_crgIpMatch[i]; + 30011d6: fec42703 lw a4,-20(s0) + 30011da: 47b1 li a5,12 + 30011dc: 02f70733 mul a4,a4,a5 + 30011e0: 030067b7 lui a5,0x3006 + 30011e4: 20078793 addi a5,a5,512 # 3006200 + 30011e8: 97ba add a5,a5,a4 + 30011ea: a829 j 3001204 + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011ec: fec42783 lw a5,-20(s0) + 30011f0: 0785 addi a5,a5,1 + 30011f2: fef42623 sw a5,-20(s0) + 30011f6: fec42703 lw a4,-20(s0) + 30011fa: 02d00793 li a5,45 + 30011fe: fae7fde3 bgeu a5,a4,30011b8 + } + } + return (CHIP_CrgIpMatchInfo *)0; /* The base address does not match, return 0. */ + 3001202: 4781 li a5,0 +} + 3001204: 853e mv a0,a5 + 3001206: 5432 lw s0,44(sp) + 3001208: 6145 addi sp,sp,48 + 300120a: 8082 ret + +0300120c : + * @brief Check ADC sample input. + * @param input Number of input. + * @retval bool + */ +static inline bool IsADCSampleChannel(ADC_Input input) +{ + 300120c: 1101 addi sp,sp,-32 + 300120e: ce22 sw s0,28(sp) + 3001210: 1000 addi s0,sp,32 + 3001212: fea42623 sw a0,-20(s0) + return (input >= ADC_CH_ADCINA0) && (input <= ADC_CH_ADCINA19); + 3001216: fec42783 lw a5,-20(s0) + 300121a: 0147b793 sltiu a5,a5,20 + 300121e: 9f81 uxtb a5 +} + 3001220: 853e mv a0,a5 + 3001222: 4472 lw s0,28(sp) + 3001224: 6105 addi sp,sp,32 + 3001226: 8082 ret + +03001228 : + * are configured through the SOC. + * @param soc Number of SOC. + * @retval bool + */ +static inline bool IsADCSOCx(ADC_SOCNumber soc) +{ + 3001228: 1101 addi sp,sp,-32 + 300122a: ce22 sw s0,28(sp) + 300122c: 1000 addi s0,sp,32 + 300122e: fea42623 sw a0,-20(s0) + return (soc >= ADC_SOC_NUM0) && (soc <= ADC_SOC_NUM15); + 3001232: fec42783 lw a5,-20(s0) + 3001236: 0107b793 sltiu a5,a5,16 + 300123a: 9f81 uxtb a5 +} + 300123c: 853e mv a0,a5 + 300123e: 4472 lw s0,28(sp) + 3001240: 6105 addi sp,sp,32 + 3001242: 8082 ret + +03001244 : + * @brief Check ADC interrupt parameter. + * @param intx Number of interrupt. + * @retval bool + */ +static inline bool IsADCIntx(ADC_IntNumber intx) +{ + 3001244: 1101 addi sp,sp,-32 + 3001246: ce22 sw s0,28(sp) + 3001248: 1000 addi s0,sp,32 + 300124a: fea42623 sw a0,-20(s0) + return (intx >= ADC_INT_NUMBER0) && (intx <= ADC_INT_NUMBER3); + 300124e: fec42783 lw a5,-20(s0) + 3001252: 0047b793 sltiu a5,a5,4 + 3001256: 9f81 uxtb a5 +} + 3001258: 853e mv a0,a5 + 300125a: 4472 lw s0,28(sp) + 300125c: 6105 addi sp,sp,32 + 300125e: 8082 ret + +03001260 : + * @brief Check SOC trigger source. + * @param trig Type of trigger source. + * @retval bool + */ +static inline bool IsADCTrigSource(ADC_TrigSource trig) +{ + 3001260: 1101 addi sp,sp,-32 + 3001262: ce22 sw s0,28(sp) + 3001264: 1000 addi s0,sp,32 + 3001266: fea42623 sw a0,-20(s0) + return (trig >= ADC_TRIGSOC_SOFT) && (trig <= ADC_TRIGSOC_GPIOPF1); + 300126a: fec42783 lw a5,-20(s0) + 300126e: 0157b793 sltiu a5,a5,21 + 3001272: 9f81 uxtb a5 +} + 3001274: 853e mv a0,a5 + 3001276: 4472 lw s0,28(sp) + 3001278: 6105 addi sp,sp,32 + 300127a: 8082 ret + +0300127c : + * @brief Check mode of completion of SOC sample + * @param mode Type of completion. + * @retval bool + */ +static inline bool IsADCFinishMode(ADC_SOCFinishMode mode) +{ + 300127c: 1101 addi sp,sp,-32 + 300127e: ce22 sw s0,28(sp) + 3001280: 1000 addi s0,sp,32 + 3001282: fea42623 sw a0,-20(s0) + return (mode >= ADC_SOCFINISH_NONE) && (mode <= ADC_SOCFINISH_INT3); + 3001286: fec42783 lw a5,-20(s0) + 300128a: cb81 beqz a5,300129a + 300128c: fec42703 lw a4,-20(s0) + 3001290: 4799 li a5,6 + 3001292: 00e7e463 bltu a5,a4,300129a + 3001296: 4785 li a5,1 + 3001298: a011 j 300129c + 300129a: 4781 li a5,0 + 300129c: 8b85 andi a5,a5,1 + 300129e: 9f81 uxtb a5 +} + 30012a0: 853e mv a0,a5 + 30012a2: 4472 lw s0,28(sp) + 30012a4: 6105 addi sp,sp,32 + 30012a6: 8082 ret + +030012a8 : + * @brief Check ADC sample priority parameter. + * @param mode Priority mode of SOC. + * @retval bool + */ +static inline bool IsADCPriorityMode(ADC_PriorityMode mode) +{ + 30012a8: 1101 addi sp,sp,-32 + 30012aa: ce22 sw s0,28(sp) + 30012ac: 1000 addi s0,sp,32 + 30012ae: fea42623 sw a0,-20(s0) + return (mode >= ADC_PRIMODE_ALL_ROUND) && (mode <= ADC_PRIMODE_ALL_PRIORITY); + 30012b2: fec42703 lw a4,-20(s0) + 30012b6: 67c1 lui a5,0x10 + 30012b8: 00f737b3 sltu a5,a4,a5 + 30012bc: 9f81 uxtb a5 +} + 30012be: 853e mv a0,a5 + 30012c0: 4472 lw s0,28(sp) + 30012c2: 6105 addi sp,sp,32 + 30012c4: 8082 ret + +030012c6 : + * @brief Check time of total ADC sampling time. + * @param acqps Time of total ADC sampling time. + * @retval bool + */ +static inline bool IsADCTotalTime(unsigned int acqps) +{ + 30012c6: 1101 addi sp,sp,-32 + 30012c8: ce22 sw s0,28(sp) + 30012ca: 1000 addi s0,sp,32 + 30012cc: fea42623 sw a0,-20(s0) + return (acqps <= ADC_SOCSAMPLE_500CLK); + 30012d0: fec42783 lw a5,-20(s0) + 30012d4: 0107b793 sltiu a5,a5,16 + 30012d8: 9f81 uxtb a5 +} + 30012da: 853e mv a0,a5 + 30012dc: 4472 lw s0,28(sp) + 30012de: 6105 addi sp,sp,32 + 30012e0: 8082 ret + +030012e2 : + * @brief Enable AVDD/3 Channal. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_EnableAvddChannel(ADC_RegStruct * const adcx) +{ + 30012e2: 1101 addi sp,sp,-32 + 30012e4: ce06 sw ra,28(sp) + 30012e6: cc22 sw s0,24(sp) + 30012e8: 1000 addi s0,sp,32 + 30012ea: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30012ee: fec42703 lw a4,-20(s0) + 30012f2: 180007b7 lui a5,0x18000 + 30012f6: 00f70b63 beq a4,a5,300130c + 30012fa: 6785 lui a5,0x1 + 30012fc: 86278593 addi a1,a5,-1950 # 862 + 3001300: 030067b7 lui a5,0x3006 + 3001304: 42878513 addi a0,a5,1064 # 3006428 + 3001308: 2b0d jal ra,300183a + 300130a: a001 j 300130a + adcx->ADC_AVDD_EN.BIT.cfg_avdd_en = true; + 300130c: fec42703 lw a4,-20(s0) + 3001310: 65872783 lw a5,1624(a4) + 3001314: 0017e793 ori a5,a5,1 + 3001318: 64f72c23 sw a5,1624(a4) +} + 300131c: 0001 nop + 300131e: 40f2 lw ra,28(sp) + 3001320: 4462 lw s0,24(sp) + 3001322: 6105 addi sp,sp,32 + 3001324: 8082 ret + +03001326 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt0(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001326: 7179 addi sp,sp,-48 + 3001328: d606 sw ra,44(sp) + 300132a: d422 sw s0,40(sp) + 300132c: 1800 addi s0,sp,48 + 300132e: fca42e23 sw a0,-36(s0) + 3001332: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001336: fdc42703 lw a4,-36(s0) + 300133a: 180007b7 lui a5,0x18000 + 300133e: 00f70b63 beq a4,a5,3001354 + 3001342: 6785 lui a5,0x1 + 3001344: 87978593 addi a1,a5,-1927 # 879 + 3001348: 030067b7 lui a5,0x3006 + 300134c: 42878513 addi a0,a5,1064 # 3006428 + 3001350: 21ed jal ra,300183a + 3001352: a001 j 3001352 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 3001354: fd842503 lw a0,-40(s0) + 3001358: 3dc1 jal ra,3001228 + 300135a: 87aa mv a5,a0 + 300135c: 0017c793 xori a5,a5,1 + 3001360: 9f81 uxtb a5 + 3001362: cb91 beqz a5,3001376 + 3001364: 6785 lui a5,0x1 + 3001366: 87a78593 addi a1,a5,-1926 # 87a + 300136a: 030067b7 lui a5,0x3006 + 300136e: 42878513 addi a0,a5,1064 # 3006428 + 3001372: 21e1 jal ra,300183a + 3001374: a01d j 300139a + unsigned int shiftBit = (unsigned int)socx; + 3001376: fd842783 lw a5,-40(s0) + 300137a: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 300137e: fdc42783 lw a5,-36(s0) + 3001382: 2b07a703 lw a4,688(a5) + 3001386: 4685 li a3,1 + 3001388: fec42783 lw a5,-20(s0) + 300138c: 00f697b3 sll a5,a3,a5 + 3001390: 8f5d or a4,a4,a5 + 3001392: fdc42783 lw a5,-36(s0) + 3001396: 2ae7a823 sw a4,688(a5) +} + 300139a: 50b2 lw ra,44(sp) + 300139c: 5422 lw s0,40(sp) + 300139e: 6145 addi sp,sp,48 + 30013a0: 8082 ret + +030013a2 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt1(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30013a2: 7179 addi sp,sp,-48 + 30013a4: d606 sw ra,44(sp) + 30013a6: d422 sw s0,40(sp) + 30013a8: 1800 addi s0,sp,48 + 30013aa: fca42e23 sw a0,-36(s0) + 30013ae: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30013b2: fdc42703 lw a4,-36(s0) + 30013b6: 180007b7 lui a5,0x18000 + 30013ba: 00f70b63 beq a4,a5,30013d0 + 30013be: 6785 lui a5,0x1 + 30013c0: 89478593 addi a1,a5,-1900 # 894 + 30013c4: 030067b7 lui a5,0x3006 + 30013c8: 42878513 addi a0,a5,1064 # 3006428 + 30013cc: 21bd jal ra,300183a + 30013ce: a001 j 30013ce + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30013d0: fd842503 lw a0,-40(s0) + 30013d4: 3d91 jal ra,3001228 + 30013d6: 87aa mv a5,a0 + 30013d8: 0017c793 xori a5,a5,1 + 30013dc: 9f81 uxtb a5 + 30013de: cb91 beqz a5,30013f2 + 30013e0: 6785 lui a5,0x1 + 30013e2: 89578593 addi a1,a5,-1899 # 895 + 30013e6: 030067b7 lui a5,0x3006 + 30013ea: 42878513 addi a0,a5,1064 # 3006428 + 30013ee: 21b1 jal ra,300183a + 30013f0: a025 j 3001418 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30013f2: fd842783 lw a5,-40(s0) + 30013f6: 07c1 addi a5,a5,16 + 30013f8: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 30013fc: fdc42783 lw a5,-36(s0) + 3001400: 2b07a703 lw a4,688(a5) + 3001404: 4685 li a3,1 + 3001406: fec42783 lw a5,-20(s0) + 300140a: 00f697b3 sll a5,a3,a5 + 300140e: 8f5d or a4,a4,a5 + 3001410: fdc42783 lw a5,-36(s0) + 3001414: 2ae7a823 sw a4,688(a5) +} + 3001418: 50b2 lw ra,44(sp) + 300141a: 5422 lw s0,40(sp) + 300141c: 6145 addi sp,sp,48 + 300141e: 8082 ret + +03001420 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt2(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001420: 7179 addi sp,sp,-48 + 3001422: d606 sw ra,44(sp) + 3001424: d422 sw s0,40(sp) + 3001426: 1800 addi s0,sp,48 + 3001428: fca42e23 sw a0,-36(s0) + 300142c: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001430: fdc42703 lw a4,-36(s0) + 3001434: 180007b7 lui a5,0x18000 + 3001438: 00f70b63 beq a4,a5,300144e + 300143c: 6785 lui a5,0x1 + 300143e: 8af78593 addi a1,a5,-1873 # 8af + 3001442: 030067b7 lui a5,0x3006 + 3001446: 42878513 addi a0,a5,1064 # 3006428 + 300144a: 2ec5 jal ra,300183a + 300144c: a001 j 300144c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300144e: fd842503 lw a0,-40(s0) + 3001452: 3bd9 jal ra,3001228 + 3001454: 87aa mv a5,a0 + 3001456: 0017c793 xori a5,a5,1 + 300145a: 9f81 uxtb a5 + 300145c: cb91 beqz a5,3001470 + 300145e: 6785 lui a5,0x1 + 3001460: 8b078593 addi a1,a5,-1872 # 8b0 + 3001464: 030067b7 lui a5,0x3006 + 3001468: 42878513 addi a0,a5,1064 # 3006428 + 300146c: 26f9 jal ra,300183a + 300146e: a01d j 3001494 + unsigned int shiftBit = (unsigned int)socx; + 3001470: fd842783 lw a5,-40(s0) + 3001474: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 3001478: fdc42783 lw a5,-36(s0) + 300147c: 2b47a703 lw a4,692(a5) + 3001480: 4685 li a3,1 + 3001482: fec42783 lw a5,-20(s0) + 3001486: 00f697b3 sll a5,a3,a5 + 300148a: 8f5d or a4,a4,a5 + 300148c: fdc42783 lw a5,-36(s0) + 3001490: 2ae7aa23 sw a4,692(a5) +} + 3001494: 50b2 lw ra,44(sp) + 3001496: 5422 lw s0,40(sp) + 3001498: 6145 addi sp,sp,48 + 300149a: 8082 ret + +0300149c : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt3(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300149c: 7179 addi sp,sp,-48 + 300149e: d606 sw ra,44(sp) + 30014a0: d422 sw s0,40(sp) + 30014a2: 1800 addi s0,sp,48 + 30014a4: fca42e23 sw a0,-36(s0) + 30014a8: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30014ac: fdc42703 lw a4,-36(s0) + 30014b0: 180007b7 lui a5,0x18000 + 30014b4: 00f70b63 beq a4,a5,30014ca + 30014b8: 6785 lui a5,0x1 + 30014ba: 8ca78593 addi a1,a5,-1846 # 8ca + 30014be: 030067b7 lui a5,0x3006 + 30014c2: 42878513 addi a0,a5,1064 # 3006428 + 30014c6: 2e95 jal ra,300183a + 30014c8: a001 j 30014c8 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30014ca: fd842503 lw a0,-40(s0) + 30014ce: 3ba9 jal ra,3001228 + 30014d0: 87aa mv a5,a0 + 30014d2: 0017c793 xori a5,a5,1 + 30014d6: 9f81 uxtb a5 + 30014d8: cb91 beqz a5,30014ec + 30014da: 6785 lui a5,0x1 + 30014dc: 8cb78593 addi a1,a5,-1845 # 8cb + 30014e0: 030067b7 lui a5,0x3006 + 30014e4: 42878513 addi a0,a5,1064 # 3006428 + 30014e8: 2e89 jal ra,300183a + 30014ea: a025 j 3001512 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30014ec: fd842783 lw a5,-40(s0) + 30014f0: 07c1 addi a5,a5,16 + 30014f2: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 30014f6: fdc42783 lw a5,-36(s0) + 30014fa: 2b47a703 lw a4,692(a5) + 30014fe: 4685 li a3,1 + 3001500: fec42783 lw a5,-20(s0) + 3001504: 00f697b3 sll a5,a3,a5 + 3001508: 8f5d or a4,a4,a5 + 300150a: fdc42783 lw a5,-36(s0) + 300150e: 2ae7aa23 sw a4,692(a5) +} + 3001512: 50b2 lw ra,44(sp) + 3001514: 5422 lw s0,40(sp) + 3001516: 6145 addi sp,sp,48 + 3001518: 8082 ret + +0300151a : + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + 300151a: 1101 addi sp,sp,-32 + 300151c: ce06 sw ra,28(sp) + 300151e: cc22 sw s0,24(sp) + 3001520: 1000 addi s0,sp,32 + 3001522: fea42623 sw a0,-20(s0) + 3001526: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300152a: fec42703 lw a4,-20(s0) + 300152e: 180007b7 lui a5,0x18000 + 3001532: 00f70b63 beq a4,a5,3001548 + 3001536: 6785 lui a5,0x1 + 3001538: 8e578593 addi a1,a5,-1819 # 8e5 + 300153c: 030067b7 lui a5,0x3006 + 3001540: 42878513 addi a0,a5,1064 # 3006428 + 3001544: 2cdd jal ra,300183a + 3001546: a001 j 3001546 + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + 3001548: fe842503 lw a0,-24(s0) + 300154c: 39e5 jal ra,3001244 + 300154e: 87aa mv a5,a0 + 3001550: 0017c793 xori a5,a5,1 + 3001554: 9f81 uxtb a5 + 3001556: cb91 beqz a5,300156a + 3001558: 6785 lui a5,0x1 + 300155a: 8e678593 addi a1,a5,-1818 # 8e6 + 300155e: 030067b7 lui a5,0x3006 + 3001562: 42878513 addi a0,a5,1064 # 3006428 + 3001566: 2cd1 jal ra,300183a + 3001568: a839 j 3001586 + adcx->ADC_DATA_FLAG_MASK.reg |= (1U << (unsigned int)intx); + 300156a: fec42783 lw a5,-20(s0) + 300156e: 2c07a703 lw a4,704(a5) + 3001572: 4685 li a3,1 + 3001574: fe842783 lw a5,-24(s0) + 3001578: 00f697b3 sll a5,a3,a5 + 300157c: 8f5d or a4,a4,a5 + 300157e: fec42783 lw a5,-20(s0) + 3001582: 2ce7a023 sw a4,704(a5) +} + 3001586: 40f2 lw ra,28(sp) + 3001588: 4462 lw s0,24(sp) + 300158a: 6105 addi sp,sp,32 + 300158c: 8082 ret + +0300158e : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval addr, the base address of the SOC registers. + */ +static unsigned int ADC_GetCTRLAddr(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300158e: 7179 addi sp,sp,-48 + 3001590: d622 sw s0,44(sp) + 3001592: 1800 addi s0,sp,48 + 3001594: fca42e23 sw a0,-36(s0) + 3001598: fcb42c23 sw a1,-40(s0) + unsigned int addr; + addr = (uintptr_t)(void *)&(adcx->ADC_SOC0_CFG); + 300159c: fdc42783 lw a5,-36(s0) + 30015a0: 10078793 addi a5,a5,256 + 30015a4: fef42623 sw a5,-20(s0) + addr += ((unsigned int)socx * 4); /* Register base address difference 4 */ + 30015a8: fd842783 lw a5,-40(s0) + 30015ac: 078a slli a5,a5,0x2 + 30015ae: fec42703 lw a4,-20(s0) + 30015b2: 97ba add a5,a5,a4 + 30015b4: fef42623 sw a5,-20(s0) + return addr; + 30015b8: fec42783 lw a5,-20(s0) +} + 30015bc: 853e mv a0,a5 + 30015be: 5432 lw s0,44(sp) + 30015c0: 6145 addi sp,sp,48 + 30015c2: 8082 ret + +030015c4 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param input ADC input, @ref ADC_Input. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelectChannel(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_Input input) +{ + 30015c4: 7179 addi sp,sp,-48 + 30015c6: d606 sw ra,44(sp) + 30015c8: d422 sw s0,40(sp) + 30015ca: 1800 addi s0,sp,48 + 30015cc: fca42e23 sw a0,-36(s0) + 30015d0: fcb42c23 sw a1,-40(s0) + 30015d4: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30015d8: fdc42703 lw a4,-36(s0) + 30015dc: 180007b7 lui a5,0x18000 + 30015e0: 00f70b63 beq a4,a5,30015f6 + 30015e4: 6785 lui a5,0x1 + 30015e6: 91c78593 addi a1,a5,-1764 # 91c + 30015ea: 030067b7 lui a5,0x3006 + 30015ee: 42878513 addi a0,a5,1064 # 3006428 + 30015f2: 24a1 jal ra,300183a + 30015f4: a001 j 30015f4 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCSampleChannel(input)); + 30015f6: fd842503 lw a0,-40(s0) + 30015fa: 313d jal ra,3001228 + 30015fc: 87aa mv a5,a0 + 30015fe: 0017c793 xori a5,a5,1 + 3001602: 9f81 uxtb a5 + 3001604: eb89 bnez a5,3001616 + 3001606: fd442503 lw a0,-44(s0) + 300160a: 3109 jal ra,300120c + 300160c: 87aa mv a5,a0 + 300160e: 0017c793 xori a5,a5,1 + 3001612: 9f81 uxtb a5 + 3001614: cb91 beqz a5,3001628 + 3001616: 6785 lui a5,0x1 + 3001618: 91d78593 addi a1,a5,-1763 # 91d + 300161c: 030067b7 lui a5,0x3006 + 3001620: 42878513 addi a0,a5,1064 # 3006428 + 3001624: 2c19 jal ra,300183a + 3001626: a091 j 300166a + ADC_SOC0_CFG_REG *soc = NULL; + 3001628: fe042623 sw zero,-20(s0) + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Get the Address After Translation */ + 300162c: fd842583 lw a1,-40(s0) + 3001630: fdc42503 lw a0,-36(s0) + 3001634: 3fa9 jal ra,300158e + 3001636: fea42423 sw a0,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 300163a: fe842783 lw a5,-24(s0) + 300163e: fef42623 sw a5,-20(s0) + soc->BIT.cfg_soc0_ch_sel = (unsigned int)input; + 3001642: fd442783 lw a5,-44(s0) + 3001646: 8bfd andi a5,a5,31 + 3001648: 0ff7f693 andi a3,a5,255 + 300164c: fec42703 lw a4,-20(s0) + 3001650: 431c lw a5,0(a4) + 3001652: 8afd andi a3,a3,31 + 3001654: 9b81 andi a5,a5,-32 + 3001656: 8fd5 or a5,a5,a3 + 3001658: c31c sw a5,0(a4) + if (input == ADC_CH_ADCINA18) { + 300165a: fd442703 lw a4,-44(s0) + 300165e: 47c9 li a5,18 + 3001660: 00f71563 bne a4,a5,300166a + DCL_ADC_EnableAvddChannel(adcx); + 3001664: fdc42503 lw a0,-36(s0) + 3001668: 39ad jal ra,30012e2 + } +} + 300166a: 50b2 lw ra,44(sp) + 300166c: 5422 lw s0,40(sp) + 300166e: 6145 addi sp,sp,48 + 3001670: 8082 ret + +03001672 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param trig Source of trigger, @ref ADC_TrigSource. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelcetTrigSource(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_TrigSource trig) +{ + 3001672: 7179 addi sp,sp,-48 + 3001674: d606 sw ra,44(sp) + 3001676: d422 sw s0,40(sp) + 3001678: 1800 addi s0,sp,48 + 300167a: fca42e23 sw a0,-36(s0) + 300167e: fcb42c23 sw a1,-40(s0) + 3001682: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001686: fdc42703 lw a4,-36(s0) + 300168a: 180007b7 lui a5,0x18000 + 300168e: 00f70b63 beq a4,a5,30016a4 + 3001692: 6785 lui a5,0x1 + 3001694: 93078593 addi a1,a5,-1744 # 930 + 3001698: 030067b7 lui a5,0x3006 + 300169c: 42878513 addi a0,a5,1064 # 3006428 + 30016a0: 2a69 jal ra,300183a + 30016a2: a001 j 30016a2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCTrigSource(trig)); + 30016a4: fd842503 lw a0,-40(s0) + 30016a8: 3641 jal ra,3001228 + 30016aa: 87aa mv a5,a0 + 30016ac: 0017c793 xori a5,a5,1 + 30016b0: 9f81 uxtb a5 + 30016b2: eb89 bnez a5,30016c4 + 30016b4: fd442503 lw a0,-44(s0) + 30016b8: 3665 jal ra,3001260 + 30016ba: 87aa mv a5,a0 + 30016bc: 0017c793 xori a5,a5,1 + 30016c0: 9f81 uxtb a5 + 30016c2: cb91 beqz a5,30016d6 + 30016c4: 6785 lui a5,0x1 + 30016c6: 93178593 addi a1,a5,-1743 # 931 + 30016ca: 030067b7 lui a5,0x3006 + 30016ce: 42878513 addi a0,a5,1064 # 3006428 + 30016d2: 22a5 jal ra,300183a + 30016d4: a835 j 3001710 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtaining the Address for Configuring the SOC */ + 30016d6: fd842583 lw a1,-40(s0) + 30016da: fdc42503 lw a0,-36(s0) + 30016de: 3d45 jal ra,300158e + 30016e0: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 30016e4: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30016e8: fec42783 lw a5,-20(s0) + 30016ec: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_trig_sel = (unsigned int)trig; + 30016f0: fd442783 lw a5,-44(s0) + 30016f4: 8bfd andi a5,a5,31 + 30016f6: 0ff7f693 andi a3,a5,255 + 30016fa: fe842703 lw a4,-24(s0) + 30016fe: 431c lw a5,0(a4) + 3001700: 8afd andi a3,a3,31 + 3001702: 06a6 slli a3,a3,0x9 + 3001704: 7671 lui a2,0xffffc + 3001706: 1ff60613 addi a2,a2,511 # ffffc1ff + 300170a: 8ff1 and a5,a5,a2 + 300170c: 8fd5 or a5,a5,a3 + 300170e: c31c sw a5,0(a4) +} + 3001710: 50b2 lw ra,44(sp) + 3001712: 5422 lw s0,40(sp) + 3001714: 6145 addi sp,sp,48 + 3001716: 8082 ret + +03001718 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param acqps Capacitor charging time. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetAcqps(ADC_RegStruct * const adcx, ADC_SOCNumber socx, unsigned int acqps) +{ + 3001718: 7179 addi sp,sp,-48 + 300171a: d606 sw ra,44(sp) + 300171c: d422 sw s0,40(sp) + 300171e: 1800 addi s0,sp,48 + 3001720: fca42e23 sw a0,-36(s0) + 3001724: fcb42c23 sw a1,-40(s0) + 3001728: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300172c: fdc42703 lw a4,-36(s0) + 3001730: 180007b7 lui a5,0x18000 + 3001734: 00f70b63 beq a4,a5,300174a + 3001738: 6785 lui a5,0x1 + 300173a: 94178593 addi a1,a5,-1727 # 941 + 300173e: 030067b7 lui a5,0x3006 + 3001742: 42878513 addi a0,a5,1064 # 3006428 + 3001746: 28d5 jal ra,300183a + 3001748: a001 j 3001748 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300174a: fd842503 lw a0,-40(s0) + 300174e: 3ce9 jal ra,3001228 + 3001750: 87aa mv a5,a0 + 3001752: 0017c793 xori a5,a5,1 + 3001756: 9f81 uxtb a5 + 3001758: cb91 beqz a5,300176c + 300175a: 6785 lui a5,0x1 + 300175c: 94278593 addi a1,a5,-1726 # 942 + 3001760: 030067b7 lui a5,0x3006 + 3001764: 42878513 addi a0,a5,1064 # 3006428 + 3001768: 28c9 jal ra,300183a + 300176a: a891 j 30017be + ADC_PARAM_CHECK_NO_RET(acqps <= 15); /* The value of acqps ranges from 0 to 15 */ + 300176c: fd442703 lw a4,-44(s0) + 3001770: 47bd li a5,15 + 3001772: 00e7fb63 bgeu a5,a4,3001788 + 3001776: 6785 lui a5,0x1 + 3001778: 94378593 addi a1,a5,-1725 # 943 + 300177c: 030067b7 lui a5,0x3006 + 3001780: 42878513 addi a0,a5,1064 # 3006428 + 3001784: 285d jal ra,300183a + 3001786: a825 j 30017be + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); + 3001788: fd842583 lw a1,-40(s0) + 300178c: fdc42503 lw a0,-36(s0) + 3001790: 3bfd jal ra,300158e + 3001792: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 3001796: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 300179a: fec42783 lw a5,-20(s0) + 300179e: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_samptime_sel = acqps; + 30017a2: fd442783 lw a5,-44(s0) + 30017a6: 8bbd andi a5,a5,15 + 30017a8: 0ff7f693 andi a3,a5,255 + 30017ac: fe842703 lw a4,-24(s0) + 30017b0: 431c lw a5,0(a4) + 30017b2: 8abd andi a3,a3,15 + 30017b4: 0696 slli a3,a3,0x5 + 30017b6: e1f7f793 andi a5,a5,-481 + 30017ba: 8fd5 or a5,a5,a3 + 30017bc: c31c sw a5,0(a4) +} + 30017be: 50b2 lw ra,44(sp) + 30017c0: 5422 lw s0,40(sp) + 30017c2: 6145 addi sp,sp,48 + 30017c4: 8082 ret + +030017c6 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SOCxSoftTrigger(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30017c6: 1101 addi sp,sp,-32 + 30017c8: ce06 sw ra,28(sp) + 30017ca: cc22 sw s0,24(sp) + 30017cc: 1000 addi s0,sp,32 + 30017ce: fea42623 sw a0,-20(s0) + 30017d2: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30017d6: fec42703 lw a4,-20(s0) + 30017da: 180007b7 lui a5,0x18000 + 30017de: 00f70b63 beq a4,a5,30017f4 + 30017e2: 6785 lui a5,0x1 + 30017e4: 95278593 addi a1,a5,-1710 # 952 + 30017e8: 030067b7 lui a5,0x3006 + 30017ec: 42878513 addi a0,a5,1064 # 3006428 + 30017f0: 20a9 jal ra,300183a + 30017f2: a001 j 30017f2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30017f4: fe842503 lw a0,-24(s0) + 30017f8: 3c05 jal ra,3001228 + 30017fa: 87aa mv a5,a0 + 30017fc: 0017c793 xori a5,a5,1 + 3001800: 9f81 uxtb a5 + 3001802: cb91 beqz a5,3001816 + 3001804: 6785 lui a5,0x1 + 3001806: 95378593 addi a1,a5,-1709 # 953 + 300180a: 030067b7 lui a5,0x3006 + 300180e: 42878513 addi a0,a5,1064 # 3006428 + 3001812: 2d71 jal ra,3001eae + 3001814: a839 j 3001832 + adcx->ADC_SOFT_TRIG.reg |= (1U << (unsigned int)socx); + 3001816: fec42783 lw a5,-20(s0) + 300181a: 1607a703 lw a4,352(a5) + 300181e: 4685 li a3,1 + 3001820: fe842783 lw a5,-24(s0) + 3001824: 00f697b3 sll a5,a3,a5 + 3001828: 8f5d or a4,a4,a5 + 300182a: fec42783 lw a5,-20(s0) + 300182e: 16e7a023 sw a4,352(a5) +} + 3001832: 40f2 lw ra,28(sp) + 3001834: 4462 lw s0,24(sp) + 3001836: 6105 addi sp,sp,32 + 3001838: 8082 ret + +0300183a : + 300183a: 6740006f j 3001eae + +0300183e : + * @param adcx ADC register base address. + * @param priorityMode Mode of SOC priority, @ref ADC_PriorityMode. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetPriority(ADC_RegStruct * const adcx, ADC_PriorityMode priorityMode) +{ + 300183e: 1101 addi sp,sp,-32 + 3001840: ce06 sw ra,28(sp) + 3001842: cc22 sw s0,24(sp) + 3001844: 1000 addi s0,sp,32 + 3001846: fea42623 sw a0,-20(s0) + 300184a: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300184e: fec42703 lw a4,-20(s0) + 3001852: 180007b7 lui a5,0x18000 + 3001856: 00f70b63 beq a4,a5,300186c + 300185a: 6785 lui a5,0x1 + 300185c: 96c78593 addi a1,a5,-1684 # 96c + 3001860: 030067b7 lui a5,0x3006 + 3001864: 42878513 addi a0,a5,1064 # 3006428 + 3001868: 2599 jal ra,3001eae + 300186a: a001 j 300186a + ADC_PARAM_CHECK_NO_RET(IsADCPriorityMode(priorityMode)); + 300186c: fe842503 lw a0,-24(s0) + 3001870: 3c25 jal ra,30012a8 + 3001872: 87aa mv a5,a0 + 3001874: 0017c793 xori a5,a5,1 + 3001878: 9f81 uxtb a5 + 300187a: cb91 beqz a5,300188e + 300187c: 6785 lui a5,0x1 + 300187e: 96d78593 addi a1,a5,-1683 # 96d + 3001882: 030067b7 lui a5,0x3006 + 3001886: 42878513 addi a0,a5,1064 # 3006428 + 300188a: 2515 jal ra,3001eae + 300188c: a039 j 300189a + adcx->ADC_ARBT0.reg = priorityMode; + 300188e: fec42783 lw a5,-20(s0) + 3001892: fe842703 lw a4,-24(s0) + 3001896: 20e7a023 sw a4,512(a5) +} + 300189a: 40f2 lw ra,28(sp) + 300189c: 4462 lw s0,24(sp) + 300189e: 6105 addi sp,sp,32 + 30018a0: 8082 ret + +030018a2 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval unsigned int, result. + */ +static inline unsigned int DCL_ADC_ReadSOCxResult(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30018a2: 7179 addi sp,sp,-48 + 30018a4: d606 sw ra,44(sp) + 30018a6: d422 sw s0,40(sp) + 30018a8: 1800 addi s0,sp,48 + 30018aa: fca42e23 sw a0,-36(s0) + 30018ae: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30018b2: fdc42703 lw a4,-36(s0) + 30018b6: 180007b7 lui a5,0x18000 + 30018ba: 00f70b63 beq a4,a5,30018d0 + 30018be: 6785 lui a5,0x1 + 30018c0: a8778593 addi a1,a5,-1401 # a87 + 30018c4: 030067b7 lui a5,0x3006 + 30018c8: 42878513 addi a0,a5,1064 # 3006428 + 30018cc: 23cd jal ra,3001eae + 30018ce: a001 j 30018ce + ADC_ASSERT_PARAM(IsADCSOCx(socx)); + 30018d0: fd842503 lw a0,-40(s0) + 30018d4: 3a91 jal ra,3001228 + 30018d6: 87aa mv a5,a0 + 30018d8: 0017c793 xori a5,a5,1 + 30018dc: 9f81 uxtb a5 + 30018de: cb91 beqz a5,30018f2 + 30018e0: 6785 lui a5,0x1 + 30018e2: a8878593 addi a1,a5,-1400 # a88 + 30018e6: 030067b7 lui a5,0x3006 + 30018ea: 42878513 addi a0,a5,1064 # 3006428 + 30018ee: 23c1 jal ra,3001eae + 30018f0: a001 j 30018f0 + ADC_RESULT0_REG *result; + uintptr_t addr = (uintptr_t)(void *)adcx; + 30018f2: fdc42783 lw a5,-36(s0) + 30018f6: fef42623 sw a5,-20(s0) + /* The address interval of the result register is 4 */ + result = (ADC_RESULT0_REG *)(void *)(addr + 4 * (unsigned int)socx); + 30018fa: fd842783 lw a5,-40(s0) + 30018fe: 00279713 slli a4,a5,0x2 + 3001902: fec42783 lw a5,-20(s0) + 3001906: 97ba add a5,a5,a4 + 3001908: fef42423 sw a5,-24(s0) + return result->reg; + 300190c: fe842783 lw a5,-24(s0) + 3001910: 439c lw a5,0(a5) +} + 3001912: 853e mv a0,a5 + 3001914: 50b2 lw ra,44(sp) + 3001916: 5422 lw s0,40(sp) + 3001918: 6145 addi sp,sp,48 + 300191a: 8082 ret + +0300191c : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300191c: 7179 addi sp,sp,-48 + 300191e: d606 sw ra,44(sp) + 3001920: d422 sw s0,40(sp) + 3001922: 1800 addi s0,sp,48 + 3001924: fca42e23 sw a0,-36(s0) + 3001928: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300192c: fdc42703 lw a4,-36(s0) + 3001930: 180007b7 lui a5,0x18000 + 3001934: 00f70b63 beq a4,a5,300194a + 3001938: 6785 lui a5,0x1 + 300193a: b4678593 addi a1,a5,-1210 # b46 + 300193e: 030067b7 lui a5,0x3006 + 3001942: 42878513 addi a0,a5,1064 # 3006428 + 3001946: 23a5 jal ra,3001eae + 3001948: a001 j 3001948 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300194a: fd842503 lw a0,-40(s0) + 300194e: 38e9 jal ra,3001228 + 3001950: 87aa mv a5,a0 + 3001952: 0017c793 xori a5,a5,1 + 3001956: 9f81 uxtb a5 + 3001958: cb91 beqz a5,300196c + 300195a: 6785 lui a5,0x1 + 300195c: b4778593 addi a1,a5,-1209 # b47 + 3001960: 030067b7 lui a5,0x3006 + 3001964: 42878513 addi a0,a5,1064 # 3006428 + 3001968: 2399 jal ra,3001eae + 300196a: a025 j 3001992 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 300196c: fd842583 lw a1,-40(s0) + 3001970: fdc42503 lw a0,-36(s0) + 3001974: 3929 jal ra,300158e + 3001976: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 300197a: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 300197e: fec42783 lw a5,-20(s0) + 3001982: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_ENABLE; + 3001986: fe842703 lw a4,-24(s0) + 300198a: 431c lw a5,0(a4) + 300198c: 6691 lui a3,0x4 + 300198e: 8fd5 or a5,a5,a3 + 3001990: c31c sw a5,0(a4) +} + 3001992: 50b2 lw ra,44(sp) + 3001994: 5422 lw s0,40(sp) + 3001996: 6145 addi sp,sp,48 + 3001998: 8082 ret + +0300199a : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_DisableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300199a: 7179 addi sp,sp,-48 + 300199c: d606 sw ra,44(sp) + 300199e: d422 sw s0,40(sp) + 30019a0: 1800 addi s0,sp,48 + 30019a2: fca42e23 sw a0,-36(s0) + 30019a6: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30019aa: fdc42703 lw a4,-36(s0) + 30019ae: 180007b7 lui a5,0x18000 + 30019b2: 00f70b63 beq a4,a5,30019c8 + 30019b6: 6785 lui a5,0x1 + 30019b8: b5678593 addi a1,a5,-1194 # b56 + 30019bc: 030067b7 lui a5,0x3006 + 30019c0: 42878513 addi a0,a5,1064 # 3006428 + 30019c4: 21ed jal ra,3001eae + 30019c6: a001 j 30019c6 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30019c8: fd842503 lw a0,-40(s0) + 30019cc: 38b1 jal ra,3001228 + 30019ce: 87aa mv a5,a0 + 30019d0: 0017c793 xori a5,a5,1 + 30019d4: 9f81 uxtb a5 + 30019d6: cb91 beqz a5,30019ea + 30019d8: 6785 lui a5,0x1 + 30019da: b5778593 addi a1,a5,-1193 # b57 + 30019de: 030067b7 lui a5,0x3006 + 30019e2: 42878513 addi a0,a5,1064 # 3006428 + 30019e6: 21e1 jal ra,3001eae + 30019e8: a02d j 3001a12 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 30019ea: fd842583 lw a1,-40(s0) + 30019ee: fdc42503 lw a0,-36(s0) + 30019f2: 3e71 jal ra,300158e + 30019f4: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 30019f8: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30019fc: fec42783 lw a5,-20(s0) + 3001a00: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_DISABLE; + 3001a04: fe842703 lw a4,-24(s0) + 3001a08: 431c lw a5,0(a4) + 3001a0a: 76f1 lui a3,0xffffc + 3001a0c: 16fd addi a3,a3,-1 # ffffbfff + 3001a0e: 8ff5 and a5,a5,a3 + 3001a10: c31c sw a5,0(a4) +} + 3001a12: 50b2 lw ra,44(sp) + 3001a14: 5422 lw s0,40(sp) + 3001a16: 6145 addi sp,sp,48 + 3001a18: 8082 ret + +03001a1a : + * triggered at least 100 us later. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_Init(ADC_Handle *adcHandle) +{ + 3001a1a: 1101 addi sp,sp,-32 + 3001a1c: ce06 sw ra,28(sp) + 3001a1e: cc22 sw s0,24(sp) + 3001a20: 1000 addi s0,sp,32 + 3001a22: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001a26: fec42783 lw a5,-20(s0) + 3001a2a: eb89 bnez a5,3001a3c + 3001a2c: 02c00593 li a1,44 + 3001a30: 030067b7 lui a5,0x3006 + 3001a34: 44478513 addi a0,a5,1092 # 3006444 + 3001a38: 299d jal ra,3001eae + 3001a3a: a001 j 3001a3a + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001a3c: fec42783 lw a5,-20(s0) + 3001a40: 4398 lw a4,0(a5) + 3001a42: 180007b7 lui a5,0x18000 + 3001a46: 00f70a63 beq a4,a5,3001a5a + 3001a4a: 02d00593 li a1,45 + 3001a4e: 030067b7 lui a5,0x3006 + 3001a52: 44478513 addi a0,a5,1092 # 3006444 + 3001a56: 29a1 jal ra,3001eae + 3001a58: a001 j 3001a58 + ADC_PARAM_CHECK_WITH_RET(IsADCPriorityMode(adcHandle->socPriority) == true, BASE_STATUS_ERROR); + 3001a5a: fec42783 lw a5,-20(s0) + 3001a5e: 43dc lw a5,4(a5) + 3001a60: 853e mv a0,a5 + 3001a62: 3099 jal ra,30012a8 + 3001a64: 87aa mv a5,a0 + 3001a66: 0017c793 xori a5,a5,1 + 3001a6a: 9f81 uxtb a5 + 3001a6c: cb91 beqz a5,3001a80 + 3001a6e: 02e00593 li a1,46 + 3001a72: 030067b7 lui a5,0x3006 + 3001a76: 44478513 addi a0,a5,1092 # 3006444 + 3001a7a: 2915 jal ra,3001eae + 3001a7c: 4785 li a5,1 + 3001a7e: a091 j 3001ac2 + DCL_ADC_SOCxSetPriority(adcHandle->baseAddress, adcHandle->socPriority); + 3001a80: fec42783 lw a5,-20(s0) + 3001a84: 4398 lw a4,0(a5) + 3001a86: fec42783 lw a5,-20(s0) + 3001a8a: 43dc lw a5,4(a5) + 3001a8c: 85be mv a1,a5 + 3001a8e: 853a mv a0,a4 + 3001a90: 337d jal ra,300183e + adcHandle->baseAddress->ADC_ANA_CTRL0.BIT.cfg_sar_samp_cap_sel = 0x4; /* Set the Number of Sampling Capacitors */ + 3001a92: fec42783 lw a5,-20(s0) + 3001a96: 4398 lw a4,0(a5) + 3001a98: 65472783 lw a5,1620(a4) + 3001a9c: 100006b7 lui a3,0x10000 + 3001aa0: 16fd addi a3,a3,-1 # fffffff + 3001aa2: 8efd and a3,a3,a5 + 3001aa4: 400007b7 lui a5,0x40000 + 3001aa8: 8fd5 or a5,a5,a3 + 3001aaa: 64f72a23 sw a5,1620(a4) + adcHandle->baseAddress->ADC_EN.reg = BASE_CFG_ENABLE; /* Enable ADC Controller */ + 3001aae: fec42783 lw a5,-20(s0) + 3001ab2: 439c lw a5,0(a5) + 3001ab4: 4705 li a4,1 + 3001ab6: 30e7a023 sw a4,768(a5) # 40000300 + BASE_FUNC_DelayUs(100); /* Wait for 100 us until the ADC controller is stable */ + 3001aba: 06400513 li a0,100 + 3001abe: 2929 jal ra,3001ed8 + return BASE_STATUS_OK; + 3001ac0: 4781 li a5,0 +} + 3001ac2: 853e mv a0,a5 + 3001ac4: 40f2 lw ra,28(sp) + 3001ac6: 4462 lw s0,24(sp) + 3001ac8: 6105 addi sp,sp,32 + 3001aca: 8082 ret + +03001acc : + * @param soc ID of SOC(start of conversion), managing the specific sample inputs. + * @param socParam Param struct of SOC. This is related to the peripheral circuit design, @ref SOC_Param. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_ConfigureSoc(ADC_Handle *adcHandle, ADC_SOCNumber soc, SOC_Param *socParam) +{ + 3001acc: 1101 addi sp,sp,-32 + 3001ace: ce06 sw ra,28(sp) + 3001ad0: cc22 sw s0,24(sp) + 3001ad2: 1000 addi s0,sp,32 + 3001ad4: fea42623 sw a0,-20(s0) + 3001ad8: feb42423 sw a1,-24(s0) + 3001adc: fec42223 sw a2,-28(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001ae0: fec42783 lw a5,-20(s0) + 3001ae4: eb89 bnez a5,3001af6 + 3001ae6: 04c00593 li a1,76 + 3001aea: 030067b7 lui a5,0x3006 + 3001aee: 44478513 addi a0,a5,1092 # 3006444 + 3001af2: 2e75 jal ra,3001eae + 3001af4: a001 j 3001af4 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001af6: fec42783 lw a5,-20(s0) + 3001afa: 4398 lw a4,0(a5) + 3001afc: 180007b7 lui a5,0x18000 + 3001b00: 00f70a63 beq a4,a5,3001b14 + 3001b04: 04d00593 li a1,77 + 3001b08: 030067b7 lui a5,0x3006 + 3001b0c: 44478513 addi a0,a5,1092 # 3006444 + 3001b10: 2e79 jal ra,3001eae + 3001b12: a001 j 3001b12 + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001b14: fe842503 lw a0,-24(s0) + 3001b18: f10ff0ef jal ra,3001228 + 3001b1c: 87aa mv a5,a0 + 3001b1e: 0017c793 xori a5,a5,1 + 3001b22: 9f81 uxtb a5 + 3001b24: cb91 beqz a5,3001b38 + 3001b26: 04e00593 li a1,78 + 3001b2a: 030067b7 lui a5,0x3006 + 3001b2e: 44478513 addi a0,a5,1092 # 3006444 + 3001b32: 2eb5 jal ra,3001eae + 3001b34: 4785 li a5,1 + 3001b36: aa3d j 3001c74 + ADC_ASSERT_PARAM(socParam != NULL); + 3001b38: fe442783 lw a5,-28(s0) + 3001b3c: eb89 bnez a5,3001b4e + 3001b3e: 04f00593 li a1,79 + 3001b42: 030067b7 lui a5,0x3006 + 3001b46: 44478513 addi a0,a5,1092 # 3006444 + 3001b4a: 2695 jal ra,3001eae + 3001b4c: a001 j 3001b4c + ADC_PARAM_CHECK_WITH_RET(IsADCSampleChannel(socParam->adcInput) == true, BASE_STATUS_ERROR); + 3001b4e: fe442783 lw a5,-28(s0) + 3001b52: 439c lw a5,0(a5) + 3001b54: 853e mv a0,a5 + 3001b56: eb6ff0ef jal ra,300120c + 3001b5a: 87aa mv a5,a0 + 3001b5c: 0017c793 xori a5,a5,1 + 3001b60: 9f81 uxtb a5 + 3001b62: cb91 beqz a5,3001b76 + 3001b64: 05000593 li a1,80 + 3001b68: 030067b7 lui a5,0x3006 + 3001b6c: 44478513 addi a0,a5,1092 # 3006444 + 3001b70: 2e3d jal ra,3001eae + 3001b72: 4785 li a5,1 + 3001b74: a201 j 3001c74 + ADC_PARAM_CHECK_WITH_RET(IsADCTotalTime(socParam->sampleTotalTime) == true, BASE_STATUS_ERROR); + 3001b76: fe442783 lw a5,-28(s0) + 3001b7a: 43dc lw a5,4(a5) + 3001b7c: 853e mv a0,a5 + 3001b7e: f48ff0ef jal ra,30012c6 + 3001b82: 87aa mv a5,a0 + 3001b84: 0017c793 xori a5,a5,1 + 3001b88: 9f81 uxtb a5 + 3001b8a: cb91 beqz a5,3001b9e + 3001b8c: 05100593 li a1,81 + 3001b90: 030067b7 lui a5,0x3006 + 3001b94: 44478513 addi a0,a5,1092 # 3006444 + 3001b98: 2e19 jal ra,3001eae + 3001b9a: 4785 li a5,1 + 3001b9c: a8e1 j 3001c74 + ADC_PARAM_CHECK_WITH_RET(IsADCTrigSource(socParam->trigSource) == true, BASE_STATUS_ERROR); + 3001b9e: fe442783 lw a5,-28(s0) + 3001ba2: 479c lw a5,8(a5) + 3001ba4: 853e mv a0,a5 + 3001ba6: ebaff0ef jal ra,3001260 + 3001baa: 87aa mv a5,a0 + 3001bac: 0017c793 xori a5,a5,1 + 3001bb0: 9f81 uxtb a5 + 3001bb2: cb91 beqz a5,3001bc6 + 3001bb4: 05200593 li a1,82 + 3001bb8: 030067b7 lui a5,0x3006 + 3001bbc: 44478513 addi a0,a5,1092 # 3006444 + 3001bc0: 24fd jal ra,3001eae + 3001bc2: 4785 li a5,1 + 3001bc4: a845 j 3001c74 + ADC_PARAM_CHECK_WITH_RET(IsADCFinishMode(socParam->finishMode) == true, BASE_STATUS_ERROR); + 3001bc6: fe442783 lw a5,-28(s0) + 3001bca: 4b9c lw a5,16(a5) + 3001bcc: 853e mv a0,a5 + 3001bce: eaeff0ef jal ra,300127c + 3001bd2: 87aa mv a5,a0 + 3001bd4: 0017c793 xori a5,a5,1 + 3001bd8: 9f81 uxtb a5 + 3001bda: cb91 beqz a5,3001bee + 3001bdc: 05300593 li a1,83 + 3001be0: 030067b7 lui a5,0x3006 + 3001be4: 44478513 addi a0,a5,1092 # 3006444 + 3001be8: 24d9 jal ra,3001eae + 3001bea: 4785 li a5,1 + 3001bec: a061 j 3001c74 + DCL_ADC_SOCxSelectChannel(adcHandle->baseAddress, soc, socParam->adcInput); /* Set channel */ + 3001bee: fec42783 lw a5,-20(s0) + 3001bf2: 4398 lw a4,0(a5) + 3001bf4: fe442783 lw a5,-28(s0) + 3001bf8: 439c lw a5,0(a5) + 3001bfa: 863e mv a2,a5 + 3001bfc: fe842583 lw a1,-24(s0) + 3001c00: 853a mv a0,a4 + 3001c02: 32c9 jal ra,30015c4 + DCL_ADC_SOCxSetAcqps(adcHandle->baseAddress, soc, socParam->sampleTotalTime); /* Set sampling time */ + 3001c04: fec42783 lw a5,-20(s0) + 3001c08: 4398 lw a4,0(a5) + 3001c0a: fe442783 lw a5,-28(s0) + 3001c0e: 43dc lw a5,4(a5) + 3001c10: 863e mv a2,a5 + 3001c12: fe842583 lw a1,-24(s0) + 3001c16: 853a mv a0,a4 + 3001c18: 3601 jal ra,3001718 + DCL_ADC_SOCxSelcetTrigSource(adcHandle->baseAddress, soc, socParam->trigSource); /* Set trigger source */ + 3001c1a: fec42783 lw a5,-20(s0) + 3001c1e: 4398 lw a4,0(a5) + 3001c20: fe442783 lw a5,-28(s0) + 3001c24: 479c lw a5,8(a5) + 3001c26: 863e mv a2,a5 + 3001c28: fe842583 lw a1,-24(s0) + 3001c2c: 853a mv a0,a4 + 3001c2e: 3491 jal ra,3001672 + if (socParam->continueMode == true) { /* Continuous Mode Judgment */ + 3001c30: fe442783 lw a5,-28(s0) + 3001c34: 27dc lbu a5,12(a5) + 3001c36: cb89 beqz a5,3001c48 + DCL_ADC_EnableSOCxContinue(adcHandle->baseAddress, soc); + 3001c38: fec42783 lw a5,-20(s0) + 3001c3c: 439c lw a5,0(a5) + 3001c3e: fe842583 lw a1,-24(s0) + 3001c42: 853e mv a0,a5 + 3001c44: 39e1 jal ra,300191c + 3001c46: a801 j 3001c56 + } else { + DCL_ADC_DisableSOCxContinue(adcHandle->baseAddress, soc); + 3001c48: fec42783 lw a5,-20(s0) + 3001c4c: 439c lw a5,0(a5) + 3001c4e: fe842583 lw a1,-24(s0) + 3001c52: 853e mv a0,a5 + 3001c54: 3399 jal ra,300199a + } + adcHandle->ADC_SOCxParam[soc].finishMode = socParam->finishMode; + 3001c56: fe442783 lw a5,-28(s0) + 3001c5a: 4b9c lw a5,16(a5) + 3001c5c: 01079713 slli a4,a5,0x10 + 3001c60: 8341 srli a4,a4,0x10 + 3001c62: fec42683 lw a3,-20(s0) + 3001c66: fe842783 lw a5,-24(s0) + 3001c6a: 07a1 addi a5,a5,8 + 3001c6c: 0786 slli a5,a5,0x1 + 3001c6e: 97b6 add a5,a5,a3 + 3001c70: a3da sh a4,4(a5) + return BASE_STATUS_OK; + 3001c72: 4781 li a5,0 +} + 3001c74: 853e mv a0,a5 + 3001c76: 40f2 lw ra,28(sp) + 3001c78: 4462 lw s0,24(sp) + 3001c7a: 6105 addi sp,sp,32 + 3001c7c: 8082 ret + +03001c7e : + * interrupt is reported. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_StartIt(ADC_Handle *adcHandle) +{ + 3001c7e: 7179 addi sp,sp,-48 + 3001c80: d606 sw ra,44(sp) + 3001c82: d422 sw s0,40(sp) + 3001c84: 1800 addi s0,sp,48 + 3001c86: fca42e23 sw a0,-36(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001c8a: fdc42783 lw a5,-36(s0) + 3001c8e: eb89 bnez a5,3001ca0 + 3001c90: 0af00593 li a1,175 + 3001c94: 030067b7 lui a5,0x3006 + 3001c98: 44478513 addi a0,a5,1092 # 3006444 + 3001c9c: 2c09 jal ra,3001eae + 3001c9e: a001 j 3001c9e + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001ca0: fdc42783 lw a5,-36(s0) + 3001ca4: 4398 lw a4,0(a5) + 3001ca6: 180007b7 lui a5,0x18000 + 3001caa: 00f70a63 beq a4,a5,3001cbe + 3001cae: 0b000593 li a1,176 + 3001cb2: 030067b7 lui a5,0x3006 + 3001cb6: 44478513 addi a0,a5,1092 # 3006444 + 3001cba: 2ad5 jal ra,3001eae + 3001cbc: a001 j 3001cbc + unsigned int intVal = 0; + 3001cbe: fe042423 sw zero,-24(s0) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001cc2: fe042623 sw zero,-20(s0) + 3001cc6: a859 j 3001d5c + intVal = adcHandle->ADC_SOCxParam[i].finishMode; + 3001cc8: fdc42703 lw a4,-36(s0) + 3001ccc: fec42783 lw a5,-20(s0) + 3001cd0: 07a1 addi a5,a5,8 + 3001cd2: 0786 slli a5,a5,0x1 + 3001cd4: 97ba add a5,a5,a4 + 3001cd6: 23de lhu a5,4(a5) + 3001cd8: fef42423 sw a5,-24(s0) + switch (intVal) { + 3001cdc: fe842783 lw a5,-24(s0) + 3001ce0: 4711 li a4,4 + 3001ce2: 02e78a63 beq a5,a4,3001d16 + 3001ce6: 4711 li a4,4 + 3001ce8: 00f76663 bltu a4,a5,3001cf4 + 3001cec: 470d li a4,3 + 3001cee: 00e78a63 beq a5,a4,3001d02 + break; + case ADC_SOCFINISH_INT3: + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + break; + default: + break; + 3001cf2: a085 j 3001d52 + switch (intVal) { + 3001cf4: 4715 li a4,5 + 3001cf6: 02e78a63 beq a5,a4,3001d2a + 3001cfa: 4719 li a4,6 + 3001cfc: 04e78163 beq a5,a4,3001d3e + break; + 3001d00: a889 j 3001d52 + DCL_ADC_SetSOCxBlindInt0(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 0 */ + 3001d02: fdc42783 lw a5,-36(s0) + 3001d06: 439c lw a5,0(a5) + 3001d08: fec42703 lw a4,-20(s0) + 3001d0c: 85ba mv a1,a4 + 3001d0e: 853e mv a0,a5 + 3001d10: e16ff0ef jal ra,3001326 + break; + 3001d14: a83d j 3001d52 + DCL_ADC_SetSOCxBlindInt1(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 1 */ + 3001d16: fdc42783 lw a5,-36(s0) + 3001d1a: 439c lw a5,0(a5) + 3001d1c: fec42703 lw a4,-20(s0) + 3001d20: 85ba mv a1,a4 + 3001d22: 853e mv a0,a5 + 3001d24: e7eff0ef jal ra,30013a2 + break; + 3001d28: a02d j 3001d52 + DCL_ADC_SetSOCxBlindInt2(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 2 */ + 3001d2a: fdc42783 lw a5,-36(s0) + 3001d2e: 439c lw a5,0(a5) + 3001d30: fec42703 lw a4,-20(s0) + 3001d34: 85ba mv a1,a4 + 3001d36: 853e mv a0,a5 + 3001d38: ee8ff0ef jal ra,3001420 + break; + 3001d3c: a819 j 3001d52 + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + 3001d3e: fdc42783 lw a5,-36(s0) + 3001d42: 439c lw a5,0(a5) + 3001d44: fec42703 lw a4,-20(s0) + 3001d48: 85ba mv a1,a4 + 3001d4a: 853e mv a0,a5 + 3001d4c: f50ff0ef jal ra,300149c + break; + 3001d50: 0001 nop + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001d52: fec42783 lw a5,-20(s0) + 3001d56: 0785 addi a5,a5,1 + 3001d58: fef42623 sw a5,-20(s0) + 3001d5c: fec42703 lw a4,-20(s0) + 3001d60: 47bd li a5,15 + 3001d62: f6e7d3e3 bge a5,a4,3001cc8 + } + } /* Enable ADC Interrupt */ + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER0); + 3001d66: fdc42783 lw a5,-36(s0) + 3001d6a: 439c lw a5,0(a5) + 3001d6c: 4581 li a1,0 + 3001d6e: 853e mv a0,a5 + 3001d70: faaff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER1); + 3001d74: fdc42783 lw a5,-36(s0) + 3001d78: 439c lw a5,0(a5) + 3001d7a: 4585 li a1,1 + 3001d7c: 853e mv a0,a5 + 3001d7e: f9cff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + 3001d82: fdc42783 lw a5,-36(s0) + 3001d86: 439c lw a5,0(a5) + 3001d88: 4589 li a1,2 + 3001d8a: 853e mv a0,a5 + 3001d8c: f8eff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER3); + 3001d90: fdc42783 lw a5,-36(s0) + 3001d94: 439c lw a5,0(a5) + 3001d96: 458d li a1,3 + 3001d98: 853e mv a0,a5 + 3001d9a: f80ff0ef jal ra,300151a + return BASE_STATUS_OK; + 3001d9e: 4781 li a5,0 +} + 3001da0: 853e mv a0,a5 + 3001da2: 50b2 lw ra,44(sp) + 3001da4: 5422 lw s0,40(sp) + 3001da6: 6145 addi sp,sp,48 + 3001da8: 8082 ret + +03001daa : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_SoftTrigSample(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001daa: 1101 addi sp,sp,-32 + 3001dac: ce06 sw ra,28(sp) + 3001dae: cc22 sw s0,24(sp) + 3001db0: 1000 addi s0,sp,32 + 3001db2: fea42623 sw a0,-20(s0) + 3001db6: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001dba: fec42783 lw a5,-20(s0) + 3001dbe: eb89 bnez a5,3001dd0 + 3001dc0: 0e500593 li a1,229 + 3001dc4: 030067b7 lui a5,0x3006 + 3001dc8: 44478513 addi a0,a5,1092 # 3006444 + 3001dcc: 20cd jal ra,3001eae + 3001dce: a001 j 3001dce + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001dd0: fec42783 lw a5,-20(s0) + 3001dd4: 4398 lw a4,0(a5) + 3001dd6: 180007b7 lui a5,0x18000 + 3001dda: 00f70a63 beq a4,a5,3001dee + 3001dde: 0e600593 li a1,230 + 3001de2: 030067b7 lui a5,0x3006 + 3001de6: 44478513 addi a0,a5,1092 # 3006444 + 3001dea: 20d1 jal ra,3001eae + 3001dec: a001 j 3001dec + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001dee: fe842503 lw a0,-24(s0) + 3001df2: c36ff0ef jal ra,3001228 + 3001df6: 87aa mv a5,a0 + 3001df8: 0017c793 xori a5,a5,1 + 3001dfc: 9f81 uxtb a5 + 3001dfe: cb91 beqz a5,3001e12 + 3001e00: 0e700593 li a1,231 + 3001e04: 030067b7 lui a5,0x3006 + 3001e08: 44478513 addi a0,a5,1092 # 3006444 + 3001e0c: 204d jal ra,3001eae + 3001e0e: 4785 li a5,1 + 3001e10: a809 j 3001e22 + DCL_ADC_SOCxSoftTrigger(adcHandle->baseAddress, soc); /* Software triggers a single SOC */ + 3001e12: fec42783 lw a5,-20(s0) + 3001e16: 439c lw a5,0(a5) + 3001e18: fe842583 lw a1,-24(s0) + 3001e1c: 853e mv a0,a5 + 3001e1e: 3265 jal ra,30017c6 + return BASE_STATUS_OK; + 3001e20: 4781 li a5,0 +} + 3001e22: 853e mv a0,a5 + 3001e24: 40f2 lw ra,28(sp) + 3001e26: 4462 lw s0,24(sp) + 3001e28: 6105 addi sp,sp,32 + 3001e2a: 8082 ret + +03001e2c : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval unsigned int value of ADC convert result. + */ +unsigned int HAL_ADC_GetConvResult(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001e2c: 1101 addi sp,sp,-32 + 3001e2e: ce06 sw ra,28(sp) + 3001e30: cc22 sw s0,24(sp) + 3001e32: 1000 addi s0,sp,32 + 3001e34: fea42623 sw a0,-20(s0) + 3001e38: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001e3c: fec42783 lw a5,-20(s0) + 3001e40: eb89 bnez a5,3001e52 + 3001e42: 0f400593 li a1,244 + 3001e46: 030067b7 lui a5,0x3006 + 3001e4a: 44478513 addi a0,a5,1092 # 3006444 + 3001e4e: 2085 jal ra,3001eae + 3001e50: a001 j 3001e50 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001e52: fec42783 lw a5,-20(s0) + 3001e56: 4398 lw a4,0(a5) + 3001e58: 180007b7 lui a5,0x18000 + 3001e5c: 00f70a63 beq a4,a5,3001e70 + 3001e60: 0f500593 li a1,245 + 3001e64: 030067b7 lui a5,0x3006 + 3001e68: 44478513 addi a0,a5,1092 # 3006444 + 3001e6c: 2089 jal ra,3001eae + 3001e6e: a001 j 3001e6e + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001e70: fe842503 lw a0,-24(s0) + 3001e74: bb4ff0ef jal ra,3001228 + 3001e78: 87aa mv a5,a0 + 3001e7a: 0017c793 xori a5,a5,1 + 3001e7e: 9f81 uxtb a5 + 3001e80: cb91 beqz a5,3001e94 + 3001e82: 0f600593 li a1,246 + 3001e86: 030067b7 lui a5,0x3006 + 3001e8a: 44478513 addi a0,a5,1092 # 3006444 + 3001e8e: 2005 jal ra,3001eae + 3001e90: 4785 li a5,1 + 3001e92: a809 j 3001ea4 + return DCL_ADC_ReadSOCxResult(adcHandle->baseAddress, soc); + 3001e94: fec42783 lw a5,-20(s0) + 3001e98: 439c lw a5,0(a5) + 3001e9a: fe842583 lw a1,-24(s0) + 3001e9e: 853e mv a0,a5 + 3001ea0: 3409 jal ra,30018a2 + 3001ea2: 87aa mv a5,a0 +} + 3001ea4: 853e mv a0,a5 + 3001ea6: 40f2 lw ra,28(sp) + 3001ea8: 4462 lw s0,24(sp) + 3001eaa: 6105 addi sp,sp,32 + 3001eac: 8082 ret + +03001eae : + * @param file Pointer to the name of the file where the error occurs. + * @param line Number of the line where the error occurs. + * @retval None. + */ +__weak void AssertErrorLog(char *file, unsigned int line) +{ + 3001eae: 1101 addi sp,sp,-32 + 3001eb0: ce22 sw s0,28(sp) + 3001eb2: 1000 addi s0,sp,32 + 3001eb4: fea42623 sw a0,-20(s0) + 3001eb8: feb42423 sw a1,-24(s0) + /* Use only if the user apllication is not defined. */ + BASE_FUNC_UNUSED(file); + BASE_FUNC_UNUSED(line); + 3001ebc: 0001 nop + 3001ebe: 4472 lw s0,28(sp) + 3001ec0: 6105 addi sp,sp,32 + 3001ec2: 8082 ret + +03001ec4 : + * @brief Get the systick + * @param None + * @retval The SysTick Value + */ +static inline unsigned int DCL_SYSTICK_GetTick(void) +{ + 3001ec4: 1141 addi sp,sp,-16 + 3001ec6: c622 sw s0,12(sp) + 3001ec8: 0800 addi s0,sp,16 + return SYSTICK->MTIME; /* Systick value(Lower 32bit register) */ + 3001eca: 143807b7 lui a5,0x14380 + 3001ece: 479c lw a5,8(a5) +} + 3001ed0: 853e mv a0,a5 + 3001ed2: 4432 lw s0,12(sp) + 3001ed4: 0141 addi sp,sp,16 + 3001ed6: 8082 ret + +03001ed8 : + * @brief Delay number of us. + * @param us The number of us to delay. + * @retval None. + */ +void BASE_FUNC_DelayUs(unsigned int us) +{ + 3001ed8: 7179 addi sp,sp,-48 + 3001eda: d606 sw ra,44(sp) + 3001edc: d422 sw s0,40(sp) + 3001ede: 1800 addi s0,sp,48 + 3001ee0: fca42e23 sw a0,-36(s0) + unsigned int preTick = DCL_SYSTICK_GetTick(); + 3001ee4: 37c5 jal ra,3001ec4 + 3001ee6: fea42623 sw a0,-20(s0) + unsigned int tickInUs = (SYSTICK_GetCRGHZ() / CRG_FREQ_1MHz) * us; + 3001eea: 8bcff0ef jal ra,3000fa6 + 3001eee: 872a mv a4,a0 + 3001ef0: 000f47b7 lui a5,0xf4 + 3001ef4: 24078793 addi a5,a5,576 # f4240 + 3001ef8: 02f757b3 divu a5,a4,a5 + 3001efc: fdc42703 lw a4,-36(s0) + 3001f00: 02f707b3 mul a5,a4,a5 + 3001f04: fef42423 sw a5,-24(s0) + unsigned int curTick; + unsigned int delta; + + /* Wait until the delta is greater than tickInUs */ + do { + curTick = DCL_SYSTICK_GetTick(); + 3001f08: 3f75 jal ra,3001ec4 + 3001f0a: fea42223 sw a0,-28(s0) + delta = (curTick >= preTick) ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick + 1; + 3001f0e: fe442703 lw a4,-28(s0) + 3001f12: fec42783 lw a5,-20(s0) + 3001f16: 40f707b3 sub a5,a4,a5 + 3001f1a: fef42023 sw a5,-32(s0) + } while (delta < tickInUs); + 3001f1e: fe042703 lw a4,-32(s0) + 3001f22: fe842783 lw a5,-24(s0) + 3001f26: fef761e3 bltu a4,a5,3001f08 +} + 3001f2a: 0001 nop + 3001f2c: 50b2 lw ra,44(sp) + 3001f2e: 5422 lw s0,40(sp) + 3001f30: 6145 addi sp,sp,48 + 3001f32: 8082 ret + +03001f34 : + * @brief Delay number of ms. + * @param ms The number of ms to delay. + * @retval None. + */ +void BASE_FUNC_DelayMs(unsigned int ms) +{ + 3001f34: 7179 addi sp,sp,-48 + 3001f36: d606 sw ra,44(sp) + 3001f38: d422 sw s0,40(sp) + 3001f3a: 1800 addi s0,sp,48 + 3001f3c: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < ms; ++i) { + 3001f40: fe042623 sw zero,-20(s0) + 3001f44: a809 j 3001f56 + BASE_FUNC_DelayUs(BASE_DEFINE_DELAY_US_IN_MS); + 3001f46: 3e800513 li a0,1000 + 3001f4a: 3779 jal ra,3001ed8 + for (unsigned int i = 0; i < ms; ++i) { + 3001f4c: fec42783 lw a5,-20(s0) + 3001f50: 0785 addi a5,a5,1 + 3001f52: fef42623 sw a5,-20(s0) + 3001f56: fec42703 lw a4,-20(s0) + 3001f5a: fdc42783 lw a5,-36(s0) + 3001f5e: fef764e3 bltu a4,a5,3001f46 + } +} + 3001f62: 0001 nop + 3001f64: 50b2 lw ra,44(sp) + 3001f66: 5422 lw s0,40(sp) + 3001f68: 6145 addi sp,sp,48 + 3001f6a: 8082 ret + +03001f6c : + * @brief Delay number of seconds. + * @param seconds The number of seconds to delay. + * @retval None. + */ +void BASE_FUNC_DelaySeconds(unsigned int seconds) +{ + 3001f6c: 7179 addi sp,sp,-48 + 3001f6e: d606 sw ra,44(sp) + 3001f70: d422 sw s0,40(sp) + 3001f72: 1800 addi s0,sp,48 + 3001f74: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < seconds; ++i) { + 3001f78: fe042623 sw zero,-20(s0) + 3001f7c: a809 j 3001f8e + BASE_FUNC_DelayMs(BASE_DEFINE_DELAY_MS_IN_SEC); + 3001f7e: 3e800513 li a0,1000 + 3001f82: 3f4d jal ra,3001f34 + for (unsigned int i = 0; i < seconds; ++i) { + 3001f84: fec42783 lw a5,-20(s0) + 3001f88: 0785 addi a5,a5,1 + 3001f8a: fef42623 sw a5,-20(s0) + 3001f8e: fec42703 lw a4,-20(s0) + 3001f92: fdc42783 lw a5,-36(s0) + 3001f96: fef764e3 bltu a4,a5,3001f7e + } +} + 3001f9a: 0001 nop + 3001f9c: 50b2 lw ra,44(sp) + 3001f9e: 5422 lw s0,40(sp) + 3001fa0: 6145 addi sp,sp,48 + 3001fa2: 8082 ret + +03001fa4 : + * @param delay The number of 'units' to delay. + * @param units Specifies the delay unit. + * @retval None. + */ +void BASE_FUNC_Delay(unsigned int delay, BASE_DelayUnit units) +{ + 3001fa4: 1101 addi sp,sp,-32 + 3001fa6: ce06 sw ra,28(sp) + 3001fa8: cc22 sw s0,24(sp) + 3001faa: 1000 addi s0,sp,32 + 3001fac: fea42623 sw a0,-20(s0) + 3001fb0: feb42423 sw a1,-24(s0) + switch (units) { + 3001fb4: fe842783 lw a5,-24(s0) + 3001fb8: 3e800713 li a4,1000 + 3001fbc: 02e78063 beq a5,a4,3001fdc + 3001fc0: 000f4737 lui a4,0xf4 + 3001fc4: 24070713 addi a4,a4,576 # f4240 + 3001fc8: 00e78e63 beq a5,a4,3001fe4 + 3001fcc: 4705 li a4,1 + 3001fce: 00e78363 beq a5,a4,3001fd4 + break; + case BASE_DEFINE_DELAY_MICROSECS: + BASE_FUNC_DelayUs(delay); + break; + default: + break; + 3001fd2: a829 j 3001fec + BASE_FUNC_DelaySeconds(delay); + 3001fd4: fec42503 lw a0,-20(s0) + 3001fd8: 3f51 jal ra,3001f6c + break; + 3001fda: a809 j 3001fec + BASE_FUNC_DelayMs(delay); + 3001fdc: fec42503 lw a0,-20(s0) + 3001fe0: 3f91 jal ra,3001f34 + break; + 3001fe2: a029 j 3001fec + BASE_FUNC_DelayUs(delay); + 3001fe4: fec42503 lw a0,-20(s0) + 3001fe8: 3dc5 jal ra,3001ed8 + break; + 3001fea: 0001 nop + } + return; + 3001fec: 0001 nop + 3001fee: 40f2 lw ra,28(sp) + 3001ff0: 4462 lw s0,24(sp) + 3001ff2: 6105 addi sp,sp,32 + 3001ff4: 8082 ret + +03001ff6 : + * @brief Clear external interrupt + * @param irqNum external interrupt number + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_NOT_CREATED + */ +static inline void IRQ_ClearN(unsigned int irqNum) +{ + 3001ff6: 1101 addi sp,sp,-32 + 3001ff8: ce22 sw s0,28(sp) + 3001ffa: 1000 addi s0,sp,32 + 3001ffc: fea42623 sw a0,-20(s0) + asm volatile("fence"); + 3002000: 0ff0000f fence + WRITE_CUSTOM_CSR_VAL(LOCIPCLR, irqNum); + 3002004: fec42783 lw a5,-20(s0) + 3002008: 82be mv t0,a5 + 300200a: bf029073 csrw 0xbf0,t0 +} + 300200e: 0001 nop + 3002010: 4472 lw s0,28(sp) + 3002012: 6105 addi sp,sp,32 + 3002014: 8082 ret + +03002016 : + * @brief Exception/Interrupt Handler Entry. + * @param irqNum external interrupt number. + * @retval None + */ +void InterruptEntry(unsigned int irqNum) +{ + 3002016: 1101 addi sp,sp,-32 + 3002018: ce06 sw ra,28(sp) + 300201a: cc22 sw s0,24(sp) + 300201c: 1000 addi s0,sp,32 + 300201e: fea42623 sw a0,-20(s0) + g_irqCallbackFunc[irqNum].pfnHandler(g_irqCallbackFunc[irqNum].param); + 3002022: 040007b7 lui a5,0x4000 + 3002026: 0fc78713 addi a4,a5,252 # 40000fc + 300202a: fec42783 lw a5,-20(s0) + 300202e: 078e slli a5,a5,0x3 + 3002030: 97ba add a5,a5,a4 + 3002032: 4394 lw a3,0(a5) + 3002034: 040007b7 lui a5,0x4000 + 3002038: 0fc78713 addi a4,a5,252 # 40000fc + 300203c: fec42783 lw a5,-20(s0) + 3002040: 078e slli a5,a5,0x3 + 3002042: 97ba add a5,a5,a4 + 3002044: 43dc lw a5,4(a5) + 3002046: 853e mv a0,a5 + 3002048: 9682 jalr a3 + IRQ_ClearN(irqNum); + 300204a: fec42503 lw a0,-20(s0) + 300204e: 3765 jal ra,3001ff6 +} + 3002050: 0001 nop + 3002052: 40f2 lw ra,28(sp) + 3002054: 4462 lw s0,24(sp) + 3002056: 6105 addi sp,sp,32 + 3002058: 8082 ret + +0300205a : + * @brief Irq initialization. + * @param none. + * @retval None + */ +void IRQ_Init(void) +{ + 300205a: 1101 addi sp,sp,-32 + 300205c: ce22 sw s0,28(sp) + 300205e: 1000 addi s0,sp,32 + unsigned int index; + + for (index = 0; index < IRQ_MAX; index++) { + 3002060: fe042623 sw zero,-20(s0) + 3002064: a82d j 300209e + g_irqCallbackFunc[index].pfnHandler = IRQ_DummyHandler; + 3002066: 040007b7 lui a5,0x4000 + 300206a: 0fc78713 addi a4,a5,252 # 40000fc + 300206e: fec42783 lw a5,-20(s0) + 3002072: 078e slli a5,a5,0x3 + 3002074: 97ba add a5,a5,a4 + 3002076: 03003737 lui a4,0x3003 + 300207a: 8fa70713 addi a4,a4,-1798 # 30028fa + 300207e: c398 sw a4,0(a5) + g_irqCallbackFunc[index].param = NULL; + 3002080: 040007b7 lui a5,0x4000 + 3002084: 0fc78713 addi a4,a5,252 # 40000fc + 3002088: fec42783 lw a5,-20(s0) + 300208c: 078e slli a5,a5,0x3 + 300208e: 97ba add a5,a5,a4 + 3002090: 0007a223 sw zero,4(a5) + for (index = 0; index < IRQ_MAX; index++) { + 3002094: fec42783 lw a5,-20(s0) + 3002098: 0785 addi a5,a5,1 + 300209a: fef42623 sw a5,-20(s0) + 300209e: fec42703 lw a4,-20(s0) + 30020a2: 07200793 li a5,114 + 30020a6: fce7f0e3 bgeu a5,a4,3002066 + } +} + 30020aa: 0001 nop + 30020ac: 4472 lw s0,28(sp) + 30020ae: 6105 addi sp,sp,32 + 30020b0: 8082 ret + +030020b2 : + * @note In the corresponding interrupt handler, manually clear the interrupt source and the corresponding interrupt + * flag bit (call the IRQ_ClearN function to clear the interrupt), otherwise the interrupt will always be + * triggered. + */ +unsigned int IRQ_Register(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 30020b2: 1101 addi sp,sp,-32 + 30020b4: ce06 sw ra,28(sp) + 30020b6: cc22 sw s0,24(sp) + 30020b8: 1000 addi s0,sp,32 + 30020ba: fea42623 sw a0,-20(s0) + 30020be: feb42423 sw a1,-24(s0) + 30020c2: fec42223 sw a2,-28(s0) + INTERRUPT_ASSERT_PARAM(func != NULL); + 30020c6: fe842783 lw a5,-24(s0) + 30020ca: eb89 bnez a5,30020dc + 30020cc: 06300593 li a1,99 + 30020d0: 030067b7 lui a5,0x3006 + 30020d4: 47878513 addi a0,a5,1144 # 3006478 + 30020d8: 3bd9 jal ra,3001eae + 30020da: a001 j 30020da + INTERRUPT_PARAM_CHECK_WITH_RET(irqNum < IRQ_MAX, IRQ_ERRNO_NUM_INVALID); + 30020dc: fec42703 lw a4,-20(s0) + 30020e0: 07200793 li a5,114 + 30020e4: 00e7fb63 bgeu a5,a4,30020fa + 30020e8: 06400593 li a1,100 + 30020ec: 030067b7 lui a5,0x3006 + 30020f0: 47878513 addi a0,a5,1144 # 3006478 + 30020f4: 3b6d jal ra,3001eae + 30020f6: 4789 li a5,2 + 30020f8: a81d j 300212e + + if (g_irqCallbackFunc[irqNum].pfnHandler != IRQ_DummyHandler) { + 30020fa: 040007b7 lui a5,0x4000 + 30020fe: 0fc78713 addi a4,a5,252 # 40000fc + 3002102: fec42783 lw a5,-20(s0) + 3002106: 078e slli a5,a5,0x3 + 3002108: 97ba add a5,a5,a4 + 300210a: 4398 lw a4,0(a5) + 300210c: 030037b7 lui a5,0x3003 + 3002110: 8fa78793 addi a5,a5,-1798 # 30028fa + 3002114: 00f70463 beq a4,a5,300211c + return IRQ_ERRNO_ALREADY_CREATED; + 3002118: 478d li a5,3 + 300211a: a811 j 300212e + } + IRQ_SetCallBack(irqNum, func, arg); + 300211c: fe442603 lw a2,-28(s0) + 3002120: fe842583 lw a1,-24(s0) + 3002124: fec42503 lw a0,-20(s0) + 3002128: 7e4000ef jal ra,300290c + return BASE_STATUS_OK; + 300212c: 4781 li a5,0 +} + 300212e: 853e mv a0,a5 + 3002130: 40f2 lw ra,28(sp) + 3002132: 4462 lw s0,24(sp) + 3002134: 6105 addi sp,sp,32 + 3002136: 8082 ret + +03002138 : + * @brief Enable the specified interrupt. + * @param irqNum External interrupt number. + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID. + */ +unsigned int IRQ_EnableN(unsigned int irqNum) +{ + 3002138: 7139 addi sp,sp,-64 + 300213a: de06 sw ra,60(sp) + 300213c: dc22 sw s0,56(sp) + 300213e: 0080 addi s0,sp,64 + 3002140: fca42623 sw a0,-52(s0) + unsigned int locienVal; +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 3002144: fcc42703 lw a4,-52(s0) + 3002148: 47e5 li a5,25 + 300214a: 00e7f863 bgeu a5,a4,300215a + 300214e: fcc42703 lw a4,-52(s0) + 3002152: 07200793 li a5,114 + 3002156: 00e7fb63 bgeu a5,a4,300216c + 300215a: 0c300593 li a1,195 + 300215e: 030067b7 lui a5,0x3006 + 3002162: 47878513 addi a0,a5,1144 # 3006478 + 3002166: 33a1 jal ra,3001eae + 3002168: 4789 li a5,2 + 300216a: a8cd j 300225c + /* The interrupt enable bits that can be controlled in the mie register (32 bits), up to 32 + can be controlled, and each bit corresponds to an interrupt enable */ + + RISCV_PRIV_MODE_SWITCH(priv); + + if (irqNum < IRQ_MIE_TOTAL_CNT) { + 300216c: fcc42703 lw a4,-52(s0) + 3002170: 47fd li a5,31 + 3002172: 02e7e063 bltu a5,a4,3002192 + irqOrder = 1U << irqNum; + 3002176: 4705 li a4,1 + 3002178: fcc42783 lw a5,-52(s0) + 300217c: 00f717b3 sll a5,a4,a5 + 3002180: fef42623 sw a5,-20(s0) + SET_CSR(mie, irqOrder); + 3002184: fec42783 lw a5,-20(s0) + 3002188: 3047a7f3 csrrs a5,mie,a5 + 300218c: fcf42c23 sw a5,-40(s0) + 3002190: a0e9 j 300225a + } else if (irqNum < IRQ_LOCIEN1_OFFSET) { + 3002192: fcc42703 lw a4,-52(s0) + 3002196: 03f00793 li a5,63 + 300219a: 02e7ef63 bltu a5,a4,30021d8 + irqOrder = irqNum - IRQ_MIE_TOTAL_CNT; + 300219e: fcc42783 lw a5,-52(s0) + 30021a2: 1781 addi a5,a5,-32 + 30021a4: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN0); + 30021a8: be0027f3 csrr a5,0xbe0 + 30021ac: fcf42e23 sw a5,-36(s0) + 30021b0: fdc42783 lw a5,-36(s0) + 30021b4: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 30021b8: 4705 li a4,1 + 30021ba: fec42783 lw a5,-20(s0) + 30021be: 00f717b3 sll a5,a4,a5 + 30021c2: fe442703 lw a4,-28(s0) + 30021c6: 8fd9 or a5,a5,a4 + 30021c8: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN0, locienVal); + 30021cc: fe442783 lw a5,-28(s0) + 30021d0: 82be mv t0,a5 + 30021d2: be029073 csrw 0xbe0,t0 + 30021d6: a051 j 300225a + } else if (irqNum < IRQ_LOCIEN2_OFFSET) { + 30021d8: fcc42703 lw a4,-52(s0) + 30021dc: 05f00793 li a5,95 + 30021e0: 04e7e063 bltu a5,a4,3002220 + irqOrder = irqNum - IRQ_LOCIEN1_OFFSET; + 30021e4: fcc42783 lw a5,-52(s0) + 30021e8: fc078793 addi a5,a5,-64 + 30021ec: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN1); + 30021f0: be1027f3 csrr a5,0xbe1 + 30021f4: fef42023 sw a5,-32(s0) + 30021f8: fe042783 lw a5,-32(s0) + 30021fc: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 3002200: 4705 li a4,1 + 3002202: fec42783 lw a5,-20(s0) + 3002206: 00f717b3 sll a5,a4,a5 + 300220a: fe442703 lw a4,-28(s0) + 300220e: 8fd9 or a5,a5,a4 + 3002210: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN1, locienVal); + 3002214: fe442783 lw a5,-28(s0) + 3002218: 82be mv t0,a5 + 300221a: be129073 csrw 0xbe1,t0 + 300221e: a835 j 300225a + } else { + irqOrder = irqNum - IRQ_LOCIEN2_OFFSET; + 3002220: fcc42783 lw a5,-52(s0) + 3002224: fa078793 addi a5,a5,-96 + 3002228: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN2); + 300222c: be2027f3 csrr a5,0xbe2 + 3002230: fef42423 sw a5,-24(s0) + 3002234: fe842783 lw a5,-24(s0) + 3002238: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 300223c: 4705 li a4,1 + 300223e: fec42783 lw a5,-20(s0) + 3002242: 00f717b3 sll a5,a4,a5 + 3002246: fe442703 lw a4,-28(s0) + 300224a: 8fd9 or a5,a5,a4 + 300224c: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN2, locienVal); + 3002250: fe442783 lw a5,-28(s0) + 3002254: 82be mv t0,a5 + 3002256: be229073 csrw 0xbe2,t0 + } + + RISCV_PRIV_MODE_SWITCH(priv); + + return BASE_STATUS_OK; + 300225a: 4781 li a5,0 +} + 300225c: 853e mv a0,a5 + 300225e: 50f2 lw ra,60(sp) + 3002260: 5462 lw s0,56(sp) + 3002262: 6121 addi sp,sp,64 + 3002264: 8082 ret + +03002266 : + * @param context. + * @note The actual code is generated by IDE + * @retval None. + */ +__weak void SysErrPrint(const SyserrContext *context) +{ + 3002266: 1101 addi sp,sp,-32 + 3002268: ce22 sw s0,28(sp) + 300226a: 1000 addi s0,sp,32 + 300226c: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(context); +} + 3002270: 0001 nop + 3002272: 4472 lw s0,28(sp) + 3002274: 6105 addi sp,sp,32 + 3002276: 8082 ret + +03002278 : + * @brief System error completion processing + * @param None. + * @retval None. + */ +static void SysErrFinish(void) +{ + 3002278: 1141 addi sp,sp,-16 + 300227a: c622 sw s0,12(sp) + 300227c: 0800 addi s0,sp,16 +} + 300227e: 0001 nop + 3002280: 4432 lw s0,12(sp) + 3002282: 0141 addi sp,sp,16 + 3002284: 8082 ret + +03002286 : + * @brief Exception Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrExcEntry(const SyserrContext *context) +{ + 3002286: 1101 addi sp,sp,-32 + 3002288: ce06 sw ra,28(sp) + 300228a: cc22 sw s0,24(sp) + 300228c: 1000 addi s0,sp,32 + 300228e: fea42623 sw a0,-20(s0) + SysErrPrint(context); + 3002292: fec42503 lw a0,-20(s0) + 3002296: 3fc1 jal ra,3002266 + SysErrFinish(); + 3002298: 37c5 jal ra,3002278 +} + 300229a: 0001 nop + 300229c: 40f2 lw ra,28(sp) + 300229e: 4462 lw s0,24(sp) + 30022a0: 6105 addi sp,sp,32 + 30022a2: 8082 ret + +030022a4 : + * @brief NMI Interrupt Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrNmiEntry(const SyserrContext *context) +{ + 30022a4: 1101 addi sp,sp,-32 + 30022a6: ce06 sw ra,28(sp) + 30022a8: cc22 sw s0,24(sp) + 30022aa: 1000 addi s0,sp,32 + 30022ac: fea42623 sw a0,-20(s0) + INTERRUPT_ASSERT_PARAM(context != NULL); + 30022b0: fec42783 lw a5,-20(s0) + 30022b4: eb89 bnez a5,30022c6 + 30022b6: 12d00593 li a1,301 + 30022ba: 030067b7 lui a5,0x3006 + 30022be: 47878513 addi a0,a5,1144 # 3006478 + 30022c2: 36f5 jal ra,3001eae + 30022c4: a001 j 30022c4 + SysErrPrint(context); + 30022c6: fec42503 lw a0,-20(s0) + 30022ca: 3f71 jal ra,3002266 + SysErrFinish(); + 30022cc: 3775 jal ra,3002278 +} + 30022ce: 0001 nop + 30022d0: 40f2 lw ra,28(sp) + 30022d2: 4462 lw s0,24(sp) + 30022d4: 6105 addi sp,sp,32 + 30022d6: 8082 ret + +030022d8 : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior local int prioroty. + * @retval None + */ +static void SetLocalIntNumPri(unsigned int intNum, unsigned int interPriNum, unsigned int prior) +{ + 30022d8: 711d addi sp,sp,-96 + 30022da: cea2 sw s0,92(sp) + 30022dc: 1080 addi s0,sp,96 + 30022de: faa42623 sw a0,-84(s0) + 30022e2: fab42423 sw a1,-88(s0) + 30022e6: fac42223 sw a2,-92(s0) + switch (intNum) { + 30022ea: fac42783 lw a5,-84(s0) + 30022ee: 17e1 addi a5,a5,-8 + 30022f0: 471d li a4,7 + 30022f2: 2af76363 bltu a4,a5,3002598 + 30022f6: 00279713 slli a4,a5,0x2 + 30022fa: 030067b7 lui a5,0x3006 + 30022fe: 49878793 addi a5,a5,1176 # 3006498 + 3002302: 97ba add a5,a5,a4 + 3002304: 439c lw a5,0(a5) + 3002306: 8782 jr a5 + case 8: /* GROUP8 */ + SET_LOCAL_INTER_NUM_PRI(8, interPriNum, prior); + 3002308: bc8027f3 csrr a5,0xbc8 + 300230c: faf42a23 sw a5,-76(s0) + 3002310: fb442783 lw a5,-76(s0) + 3002314: faf42823 sw a5,-80(s0) + 3002318: fa842783 lw a5,-88(s0) + 300231c: 078a slli a5,a5,0x2 + 300231e: 8bf1 andi a5,a5,28 + 3002320: 473d li a4,15 + 3002322: 00f717b3 sll a5,a4,a5 + 3002326: fff7c793 not a5,a5 + 300232a: fb042703 lw a4,-80(s0) + 300232e: 8ff9 and a5,a5,a4 + 3002330: faf42823 sw a5,-80(s0) + 3002334: fa842783 lw a5,-88(s0) + 3002338: 078a slli a5,a5,0x2 + 300233a: 8bf1 andi a5,a5,28 + 300233c: fa442703 lw a4,-92(s0) + 3002340: 00f717b3 sll a5,a4,a5 + 3002344: fb042703 lw a4,-80(s0) + 3002348: 8fd9 or a5,a5,a4 + 300234a: faf42823 sw a5,-80(s0) + 300234e: fb042783 lw a5,-80(s0) + 3002352: 82be mv t0,a5 + 3002354: bc829073 csrw 0xbc8,t0 + break; + 3002358: a489 j 300259a + case 9: /* GROUP9 */ + SET_LOCAL_INTER_NUM_PRI(9, interPriNum, prior); + 300235a: bc9027f3 csrr a5,0xbc9 + 300235e: faf42e23 sw a5,-68(s0) + 3002362: fbc42783 lw a5,-68(s0) + 3002366: faf42c23 sw a5,-72(s0) + 300236a: fa842783 lw a5,-88(s0) + 300236e: 078a slli a5,a5,0x2 + 3002370: 8bf1 andi a5,a5,28 + 3002372: 473d li a4,15 + 3002374: 00f717b3 sll a5,a4,a5 + 3002378: fff7c793 not a5,a5 + 300237c: fb842703 lw a4,-72(s0) + 3002380: 8ff9 and a5,a5,a4 + 3002382: faf42c23 sw a5,-72(s0) + 3002386: fa842783 lw a5,-88(s0) + 300238a: 078a slli a5,a5,0x2 + 300238c: 8bf1 andi a5,a5,28 + 300238e: fa442703 lw a4,-92(s0) + 3002392: 00f717b3 sll a5,a4,a5 + 3002396: fb842703 lw a4,-72(s0) + 300239a: 8fd9 or a5,a5,a4 + 300239c: faf42c23 sw a5,-72(s0) + 30023a0: fb842783 lw a5,-72(s0) + 30023a4: 82be mv t0,a5 + 30023a6: bc929073 csrw 0xbc9,t0 + break; + 30023aa: aac5 j 300259a + case 10: /* GROUP10 */ + SET_LOCAL_INTER_NUM_PRI(10, interPriNum, prior); + 30023ac: bca027f3 csrr a5,0xbca + 30023b0: fcf42223 sw a5,-60(s0) + 30023b4: fc442783 lw a5,-60(s0) + 30023b8: fcf42023 sw a5,-64(s0) + 30023bc: fa842783 lw a5,-88(s0) + 30023c0: 078a slli a5,a5,0x2 + 30023c2: 8bf1 andi a5,a5,28 + 30023c4: 473d li a4,15 + 30023c6: 00f717b3 sll a5,a4,a5 + 30023ca: fff7c793 not a5,a5 + 30023ce: fc042703 lw a4,-64(s0) + 30023d2: 8ff9 and a5,a5,a4 + 30023d4: fcf42023 sw a5,-64(s0) + 30023d8: fa842783 lw a5,-88(s0) + 30023dc: 078a slli a5,a5,0x2 + 30023de: 8bf1 andi a5,a5,28 + 30023e0: fa442703 lw a4,-92(s0) + 30023e4: 00f717b3 sll a5,a4,a5 + 30023e8: fc042703 lw a4,-64(s0) + 30023ec: 8fd9 or a5,a5,a4 + 30023ee: fcf42023 sw a5,-64(s0) + 30023f2: fc042783 lw a5,-64(s0) + 30023f6: 82be mv t0,a5 + 30023f8: bca29073 csrw 0xbca,t0 + break; + 30023fc: aa79 j 300259a + case 11: /* GROUP11 */ + SET_LOCAL_INTER_NUM_PRI(11, interPriNum, prior); + 30023fe: bcb027f3 csrr a5,0xbcb + 3002402: fcf42623 sw a5,-52(s0) + 3002406: fcc42783 lw a5,-52(s0) + 300240a: fcf42423 sw a5,-56(s0) + 300240e: fa842783 lw a5,-88(s0) + 3002412: 078a slli a5,a5,0x2 + 3002414: 8bf1 andi a5,a5,28 + 3002416: 473d li a4,15 + 3002418: 00f717b3 sll a5,a4,a5 + 300241c: fff7c793 not a5,a5 + 3002420: fc842703 lw a4,-56(s0) + 3002424: 8ff9 and a5,a5,a4 + 3002426: fcf42423 sw a5,-56(s0) + 300242a: fa842783 lw a5,-88(s0) + 300242e: 078a slli a5,a5,0x2 + 3002430: 8bf1 andi a5,a5,28 + 3002432: fa442703 lw a4,-92(s0) + 3002436: 00f717b3 sll a5,a4,a5 + 300243a: fc842703 lw a4,-56(s0) + 300243e: 8fd9 or a5,a5,a4 + 3002440: fcf42423 sw a5,-56(s0) + 3002444: fc842783 lw a5,-56(s0) + 3002448: 82be mv t0,a5 + 300244a: bcb29073 csrw 0xbcb,t0 + break; + 300244e: a2b1 j 300259a + case 12: /* GROUP12 */ + SET_LOCAL_INTER_NUM_PRI(12, interPriNum, prior); + 3002450: bcc027f3 csrr a5,0xbcc + 3002454: fcf42a23 sw a5,-44(s0) + 3002458: fd442783 lw a5,-44(s0) + 300245c: fcf42823 sw a5,-48(s0) + 3002460: fa842783 lw a5,-88(s0) + 3002464: 078a slli a5,a5,0x2 + 3002466: 8bf1 andi a5,a5,28 + 3002468: 473d li a4,15 + 300246a: 00f717b3 sll a5,a4,a5 + 300246e: fff7c793 not a5,a5 + 3002472: fd042703 lw a4,-48(s0) + 3002476: 8ff9 and a5,a5,a4 + 3002478: fcf42823 sw a5,-48(s0) + 300247c: fa842783 lw a5,-88(s0) + 3002480: 078a slli a5,a5,0x2 + 3002482: 8bf1 andi a5,a5,28 + 3002484: fa442703 lw a4,-92(s0) + 3002488: 00f717b3 sll a5,a4,a5 + 300248c: fd042703 lw a4,-48(s0) + 3002490: 8fd9 or a5,a5,a4 + 3002492: fcf42823 sw a5,-48(s0) + 3002496: fd042783 lw a5,-48(s0) + 300249a: 82be mv t0,a5 + 300249c: bcc29073 csrw 0xbcc,t0 + break; + 30024a0: a8ed j 300259a + case 13: /* GROUP13 */ + SET_LOCAL_INTER_NUM_PRI(13, interPriNum, prior); + 30024a2: bcd027f3 csrr a5,0xbcd + 30024a6: fcf42e23 sw a5,-36(s0) + 30024aa: fdc42783 lw a5,-36(s0) + 30024ae: fcf42c23 sw a5,-40(s0) + 30024b2: fa842783 lw a5,-88(s0) + 30024b6: 078a slli a5,a5,0x2 + 30024b8: 8bf1 andi a5,a5,28 + 30024ba: 473d li a4,15 + 30024bc: 00f717b3 sll a5,a4,a5 + 30024c0: fff7c793 not a5,a5 + 30024c4: fd842703 lw a4,-40(s0) + 30024c8: 8ff9 and a5,a5,a4 + 30024ca: fcf42c23 sw a5,-40(s0) + 30024ce: fa842783 lw a5,-88(s0) + 30024d2: 078a slli a5,a5,0x2 + 30024d4: 8bf1 andi a5,a5,28 + 30024d6: fa442703 lw a4,-92(s0) + 30024da: 00f717b3 sll a5,a4,a5 + 30024de: fd842703 lw a4,-40(s0) + 30024e2: 8fd9 or a5,a5,a4 + 30024e4: fcf42c23 sw a5,-40(s0) + 30024e8: fd842783 lw a5,-40(s0) + 30024ec: 82be mv t0,a5 + 30024ee: bcd29073 csrw 0xbcd,t0 + break; + 30024f2: a065 j 300259a + case 14: /* GROUP14 */ + SET_LOCAL_INTER_NUM_PRI(14, interPriNum, prior); + 30024f4: bce027f3 csrr a5,0xbce + 30024f8: fef42223 sw a5,-28(s0) + 30024fc: fe442783 lw a5,-28(s0) + 3002500: fef42023 sw a5,-32(s0) + 3002504: fa842783 lw a5,-88(s0) + 3002508: 078a slli a5,a5,0x2 + 300250a: 8bf1 andi a5,a5,28 + 300250c: 473d li a4,15 + 300250e: 00f717b3 sll a5,a4,a5 + 3002512: fff7c793 not a5,a5 + 3002516: fe042703 lw a4,-32(s0) + 300251a: 8ff9 and a5,a5,a4 + 300251c: fef42023 sw a5,-32(s0) + 3002520: fa842783 lw a5,-88(s0) + 3002524: 078a slli a5,a5,0x2 + 3002526: 8bf1 andi a5,a5,28 + 3002528: fa442703 lw a4,-92(s0) + 300252c: 00f717b3 sll a5,a4,a5 + 3002530: fe042703 lw a4,-32(s0) + 3002534: 8fd9 or a5,a5,a4 + 3002536: fef42023 sw a5,-32(s0) + 300253a: fe042783 lw a5,-32(s0) + 300253e: 82be mv t0,a5 + 3002540: bce29073 csrw 0xbce,t0 + break; + 3002544: a899 j 300259a + case 15: /* GROUP15 */ + SET_LOCAL_INTER_NUM_PRI(15, interPriNum, prior); + 3002546: bcf027f3 csrr a5,0xbcf + 300254a: fef42623 sw a5,-20(s0) + 300254e: fec42783 lw a5,-20(s0) + 3002552: fef42423 sw a5,-24(s0) + 3002556: fa842783 lw a5,-88(s0) + 300255a: 078a slli a5,a5,0x2 + 300255c: 8bf1 andi a5,a5,28 + 300255e: 473d li a4,15 + 3002560: 00f717b3 sll a5,a4,a5 + 3002564: fff7c793 not a5,a5 + 3002568: fe842703 lw a4,-24(s0) + 300256c: 8ff9 and a5,a5,a4 + 300256e: fef42423 sw a5,-24(s0) + 3002572: fa842783 lw a5,-88(s0) + 3002576: 078a slli a5,a5,0x2 + 3002578: 8bf1 andi a5,a5,28 + 300257a: fa442703 lw a4,-92(s0) + 300257e: 00f717b3 sll a5,a4,a5 + 3002582: fe842703 lw a4,-24(s0) + 3002586: 8fd9 or a5,a5,a4 + 3002588: fef42423 sw a5,-24(s0) + 300258c: fe842783 lw a5,-24(s0) + 3002590: 82be mv t0,a5 + 3002592: bcf29073 csrw 0xbcf,t0 + break; + 3002596: a011 j 300259a + default: + break; + 3002598: 0001 nop + } +} + 300259a: 0001 nop + 300259c: 4476 lw s0,92(sp) + 300259e: 6125 addi sp,sp,96 + 30025a0: 8082 ret + +030025a2 : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior Priority of this local interrupt to be set. + * @retval None. + */ +static void IRQ_SetLocalPriority(unsigned int interPriNum, unsigned int prior) +{ + 30025a2: 7159 addi sp,sp,-112 + 30025a4: d686 sw ra,108(sp) + 30025a6: d4a2 sw s0,104(sp) + 30025a8: 1880 addi s0,sp,112 + 30025aa: f8a42e23 sw a0,-100(s0) + 30025ae: f8b42c23 sw a1,-104(s0) +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + RISCV_PRIV_MODE_SWITCH(priv); + unsigned int intNum = GET_LOCAL_INTER_CONFIGREG_NUM(interPriNum); + 30025b2: f9c42783 lw a5,-100(s0) + 30025b6: 838d srli a5,a5,0x3 + 30025b8: fef42623 sw a5,-20(s0) + switch (intNum) { + 30025bc: fec42703 lw a4,-20(s0) + 30025c0: 479d li a5,7 + 30025c2: 2ae7e563 bltu a5,a4,300286c + 30025c6: fec42783 lw a5,-20(s0) + 30025ca: 00279713 slli a4,a5,0x2 + 30025ce: 030067b7 lui a5,0x3006 + 30025d2: 4b878793 addi a5,a5,1208 # 30064b8 + 30025d6: 97ba add a5,a5,a4 + 30025d8: 439c lw a5,0(a5) + 30025da: 8782 jr a5 + case 0: /* GROUP0 */ + SET_LOCAL_INTER_NUM_PRI(0, interPriNum, prior); + 30025dc: bc0027f3 csrr a5,0xbc0 + 30025e0: faf42823 sw a5,-80(s0) + 30025e4: fb042783 lw a5,-80(s0) + 30025e8: faf42623 sw a5,-84(s0) + 30025ec: f9c42783 lw a5,-100(s0) + 30025f0: 078a slli a5,a5,0x2 + 30025f2: 8bf1 andi a5,a5,28 + 30025f4: 473d li a4,15 + 30025f6: 00f717b3 sll a5,a4,a5 + 30025fa: fff7c793 not a5,a5 + 30025fe: fac42703 lw a4,-84(s0) + 3002602: 8ff9 and a5,a5,a4 + 3002604: faf42623 sw a5,-84(s0) + 3002608: f9c42783 lw a5,-100(s0) + 300260c: 078a slli a5,a5,0x2 + 300260e: 8bf1 andi a5,a5,28 + 3002610: f9842703 lw a4,-104(s0) + 3002614: 00f717b3 sll a5,a4,a5 + 3002618: fac42703 lw a4,-84(s0) + 300261c: 8fd9 or a5,a5,a4 + 300261e: faf42623 sw a5,-84(s0) + 3002622: fac42783 lw a5,-84(s0) + 3002626: 82be mv t0,a5 + 3002628: bc029073 csrw 0xbc0,t0 + break; + 300262c: ac81 j 300287c + case 1: /* GROUP1 */ + SET_LOCAL_INTER_NUM_PRI(1, interPriNum, prior); + 300262e: bc1027f3 csrr a5,0xbc1 + 3002632: faf42c23 sw a5,-72(s0) + 3002636: fb842783 lw a5,-72(s0) + 300263a: faf42a23 sw a5,-76(s0) + 300263e: f9c42783 lw a5,-100(s0) + 3002642: 078a slli a5,a5,0x2 + 3002644: 8bf1 andi a5,a5,28 + 3002646: 473d li a4,15 + 3002648: 00f717b3 sll a5,a4,a5 + 300264c: fff7c793 not a5,a5 + 3002650: fb442703 lw a4,-76(s0) + 3002654: 8ff9 and a5,a5,a4 + 3002656: faf42a23 sw a5,-76(s0) + 300265a: f9c42783 lw a5,-100(s0) + 300265e: 078a slli a5,a5,0x2 + 3002660: 8bf1 andi a5,a5,28 + 3002662: f9842703 lw a4,-104(s0) + 3002666: 00f717b3 sll a5,a4,a5 + 300266a: fb442703 lw a4,-76(s0) + 300266e: 8fd9 or a5,a5,a4 + 3002670: faf42a23 sw a5,-76(s0) + 3002674: fb442783 lw a5,-76(s0) + 3002678: 82be mv t0,a5 + 300267a: bc129073 csrw 0xbc1,t0 + break; + 300267e: aafd j 300287c + case 2: /* GROUP2 */ + SET_LOCAL_INTER_NUM_PRI(2, interPriNum, prior); + 3002680: bc2027f3 csrr a5,0xbc2 + 3002684: fcf42023 sw a5,-64(s0) + 3002688: fc042783 lw a5,-64(s0) + 300268c: faf42e23 sw a5,-68(s0) + 3002690: f9c42783 lw a5,-100(s0) + 3002694: 078a slli a5,a5,0x2 + 3002696: 8bf1 andi a5,a5,28 + 3002698: 473d li a4,15 + 300269a: 00f717b3 sll a5,a4,a5 + 300269e: fff7c793 not a5,a5 + 30026a2: fbc42703 lw a4,-68(s0) + 30026a6: 8ff9 and a5,a5,a4 + 30026a8: faf42e23 sw a5,-68(s0) + 30026ac: f9c42783 lw a5,-100(s0) + 30026b0: 078a slli a5,a5,0x2 + 30026b2: 8bf1 andi a5,a5,28 + 30026b4: f9842703 lw a4,-104(s0) + 30026b8: 00f717b3 sll a5,a4,a5 + 30026bc: fbc42703 lw a4,-68(s0) + 30026c0: 8fd9 or a5,a5,a4 + 30026c2: faf42e23 sw a5,-68(s0) + 30026c6: fbc42783 lw a5,-68(s0) + 30026ca: 82be mv t0,a5 + 30026cc: bc229073 csrw 0xbc2,t0 + break; + 30026d0: a275 j 300287c + case 3: /* GROUP3 */ + SET_LOCAL_INTER_NUM_PRI(3, interPriNum, prior); + 30026d2: bc3027f3 csrr a5,0xbc3 + 30026d6: fcf42423 sw a5,-56(s0) + 30026da: fc842783 lw a5,-56(s0) + 30026de: fcf42223 sw a5,-60(s0) + 30026e2: f9c42783 lw a5,-100(s0) + 30026e6: 078a slli a5,a5,0x2 + 30026e8: 8bf1 andi a5,a5,28 + 30026ea: 473d li a4,15 + 30026ec: 00f717b3 sll a5,a4,a5 + 30026f0: fff7c793 not a5,a5 + 30026f4: fc442703 lw a4,-60(s0) + 30026f8: 8ff9 and a5,a5,a4 + 30026fa: fcf42223 sw a5,-60(s0) + 30026fe: f9c42783 lw a5,-100(s0) + 3002702: 078a slli a5,a5,0x2 + 3002704: 8bf1 andi a5,a5,28 + 3002706: f9842703 lw a4,-104(s0) + 300270a: 00f717b3 sll a5,a4,a5 + 300270e: fc442703 lw a4,-60(s0) + 3002712: 8fd9 or a5,a5,a4 + 3002714: fcf42223 sw a5,-60(s0) + 3002718: fc442783 lw a5,-60(s0) + 300271c: 82be mv t0,a5 + 300271e: bc329073 csrw 0xbc3,t0 + break; + 3002722: aaa9 j 300287c + case 4: /* GROUP4 */ + SET_LOCAL_INTER_NUM_PRI(4, interPriNum, prior); + 3002724: bc4027f3 csrr a5,0xbc4 + 3002728: fcf42823 sw a5,-48(s0) + 300272c: fd042783 lw a5,-48(s0) + 3002730: fcf42623 sw a5,-52(s0) + 3002734: f9c42783 lw a5,-100(s0) + 3002738: 078a slli a5,a5,0x2 + 300273a: 8bf1 andi a5,a5,28 + 300273c: 473d li a4,15 + 300273e: 00f717b3 sll a5,a4,a5 + 3002742: fff7c793 not a5,a5 + 3002746: fcc42703 lw a4,-52(s0) + 300274a: 8ff9 and a5,a5,a4 + 300274c: fcf42623 sw a5,-52(s0) + 3002750: f9c42783 lw a5,-100(s0) + 3002754: 078a slli a5,a5,0x2 + 3002756: 8bf1 andi a5,a5,28 + 3002758: f9842703 lw a4,-104(s0) + 300275c: 00f717b3 sll a5,a4,a5 + 3002760: fcc42703 lw a4,-52(s0) + 3002764: 8fd9 or a5,a5,a4 + 3002766: fcf42623 sw a5,-52(s0) + 300276a: fcc42783 lw a5,-52(s0) + 300276e: 82be mv t0,a5 + 3002770: bc429073 csrw 0xbc4,t0 + break; + 3002774: a221 j 300287c + case 5: /* GROUP5 */ + SET_LOCAL_INTER_NUM_PRI(5, interPriNum, prior); + 3002776: bc5027f3 csrr a5,0xbc5 + 300277a: fcf42c23 sw a5,-40(s0) + 300277e: fd842783 lw a5,-40(s0) + 3002782: fcf42a23 sw a5,-44(s0) + 3002786: f9c42783 lw a5,-100(s0) + 300278a: 078a slli a5,a5,0x2 + 300278c: 8bf1 andi a5,a5,28 + 300278e: 473d li a4,15 + 3002790: 00f717b3 sll a5,a4,a5 + 3002794: fff7c793 not a5,a5 + 3002798: fd442703 lw a4,-44(s0) + 300279c: 8ff9 and a5,a5,a4 + 300279e: fcf42a23 sw a5,-44(s0) + 30027a2: f9c42783 lw a5,-100(s0) + 30027a6: 078a slli a5,a5,0x2 + 30027a8: 8bf1 andi a5,a5,28 + 30027aa: f9842703 lw a4,-104(s0) + 30027ae: 00f717b3 sll a5,a4,a5 + 30027b2: fd442703 lw a4,-44(s0) + 30027b6: 8fd9 or a5,a5,a4 + 30027b8: fcf42a23 sw a5,-44(s0) + 30027bc: fd442783 lw a5,-44(s0) + 30027c0: 82be mv t0,a5 + 30027c2: bc529073 csrw 0xbc5,t0 + break; + 30027c6: a85d j 300287c + case 6: /* GROUP6 */ + SET_LOCAL_INTER_NUM_PRI(6, interPriNum, prior); + 30027c8: bc6027f3 csrr a5,0xbc6 + 30027cc: fef42023 sw a5,-32(s0) + 30027d0: fe042783 lw a5,-32(s0) + 30027d4: fcf42e23 sw a5,-36(s0) + 30027d8: f9c42783 lw a5,-100(s0) + 30027dc: 078a slli a5,a5,0x2 + 30027de: 8bf1 andi a5,a5,28 + 30027e0: 473d li a4,15 + 30027e2: 00f717b3 sll a5,a4,a5 + 30027e6: fff7c793 not a5,a5 + 30027ea: fdc42703 lw a4,-36(s0) + 30027ee: 8ff9 and a5,a5,a4 + 30027f0: fcf42e23 sw a5,-36(s0) + 30027f4: f9c42783 lw a5,-100(s0) + 30027f8: 078a slli a5,a5,0x2 + 30027fa: 8bf1 andi a5,a5,28 + 30027fc: f9842703 lw a4,-104(s0) + 3002800: 00f717b3 sll a5,a4,a5 + 3002804: fdc42703 lw a4,-36(s0) + 3002808: 8fd9 or a5,a5,a4 + 300280a: fcf42e23 sw a5,-36(s0) + 300280e: fdc42783 lw a5,-36(s0) + 3002812: 82be mv t0,a5 + 3002814: bc629073 csrw 0xbc6,t0 + break; + 3002818: a095 j 300287c + case 7: /* GROUP7 */ + SET_LOCAL_INTER_NUM_PRI(7, interPriNum, prior); + 300281a: bc7027f3 csrr a5,0xbc7 + 300281e: fef42423 sw a5,-24(s0) + 3002822: fe842783 lw a5,-24(s0) + 3002826: fef42223 sw a5,-28(s0) + 300282a: f9c42783 lw a5,-100(s0) + 300282e: 078a slli a5,a5,0x2 + 3002830: 8bf1 andi a5,a5,28 + 3002832: 473d li a4,15 + 3002834: 00f717b3 sll a5,a4,a5 + 3002838: fff7c793 not a5,a5 + 300283c: fe442703 lw a4,-28(s0) + 3002840: 8ff9 and a5,a5,a4 + 3002842: fef42223 sw a5,-28(s0) + 3002846: f9c42783 lw a5,-100(s0) + 300284a: 078a slli a5,a5,0x2 + 300284c: 8bf1 andi a5,a5,28 + 300284e: f9842703 lw a4,-104(s0) + 3002852: 00f717b3 sll a5,a4,a5 + 3002856: fe442703 lw a4,-28(s0) + 300285a: 8fd9 or a5,a5,a4 + 300285c: fef42223 sw a5,-28(s0) + 3002860: fe442783 lw a5,-28(s0) + 3002864: 82be mv t0,a5 + 3002866: bc729073 csrw 0xbc7,t0 + break; + 300286a: a809 j 300287c + default: + SetLocalIntNumPri(intNum, interPriNum, prior); + 300286c: f9842603 lw a2,-104(s0) + 3002870: f9c42583 lw a1,-100(s0) + 3002874: fec42503 lw a0,-20(s0) + 3002878: 3485 jal ra,30022d8 + break; + 300287a: 0001 nop + } + RISCV_PRIV_MODE_SWITCH(priv); +} + 300287c: 0001 nop + 300287e: 50b6 lw ra,108(sp) + 3002880: 5426 lw s0,104(sp) + 3002882: 6165 addi sp,sp,112 + 3002884: 8082 ret + +03002886 : + * @param irqNum External interrupt number. + * @param priority. + * @retval IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_PRIORITY_INVALID or BASE_STATUS_OK. + */ +unsigned int IRQ_SetPriority(unsigned int irqNum, unsigned int priority) +{ + 3002886: 1101 addi sp,sp,-32 + 3002888: ce06 sw ra,28(sp) + 300288a: cc22 sw s0,24(sp) + 300288c: 1000 addi s0,sp,32 + 300288e: fea42623 sw a0,-20(s0) + 3002892: feb42423 sw a1,-24(s0) + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 3002896: fec42703 lw a4,-20(s0) + 300289a: 47e5 li a5,25 + 300289c: 00e7f863 bgeu a5,a4,30028ac + 30028a0: fec42703 lw a4,-20(s0) + 30028a4: 07200793 li a5,114 + 30028a8: 00e7fb63 bgeu a5,a4,30028be + 30028ac: 18c00593 li a1,396 + 30028b0: 030067b7 lui a5,0x3006 + 30028b4: 47878513 addi a0,a5,1144 # 3006478 + 30028b8: 21bd jal ra,3002d26 + 30028ba: 4789 li a5,2 + 30028bc: a815 j 30028f0 + INTERRUPT_PARAM_CHECK_WITH_RET((priority >= IRQ_PRIO_LOWEST && priority <= IRQ_PRIO_HIGHEST), \ + 30028be: fe842783 lw a5,-24(s0) + 30028c2: c791 beqz a5,30028ce + 30028c4: fe842703 lw a4,-24(s0) + 30028c8: 47bd li a5,15 + 30028ca: 00e7fb63 bgeu a5,a4,30028e0 + 30028ce: 18d00593 li a1,397 + 30028d2: 030067b7 lui a5,0x3006 + 30028d6: 47878513 addi a0,a5,1144 # 3006478 + 30028da: 21b1 jal ra,3002d26 + 30028dc: 4795 li a5,5 + 30028de: a809 j 30028f0 + IRQ_ERRNO_PRIORITY_INVALID); + + /* The locipri register is specifically used to configure the priority of the + external non-standard interrupts of the CPU, so the number of internal + standard interrupts should be subtracted */ + IRQ_SetLocalPriority(irqNum - IRQ_VECTOR_CNT, priority); + 30028e0: fec42783 lw a5,-20(s0) + 30028e4: 1799 addi a5,a5,-26 + 30028e6: fe842583 lw a1,-24(s0) + 30028ea: 853e mv a0,a5 + 30028ec: 395d jal ra,30025a2 + + return BASE_STATUS_OK; + 30028ee: 4781 li a5,0 +} + 30028f0: 853e mv a0,a5 + 30028f2: 40f2 lw ra,28(sp) + 30028f4: 4462 lw s0,24(sp) + 30028f6: 6105 addi sp,sp,32 + 30028f8: 8082 ret + +030028fa : + * @brief Interrupt dummy handler + * @param arg Not used + * @retval None. + */ +static void IRQ_DummyHandler(void *arg) +{ + 30028fa: 1101 addi sp,sp,-32 + 30028fc: ce22 sw s0,28(sp) + 30028fe: 1000 addi s0,sp,32 + 3002900: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(arg); +} + 3002904: 0001 nop + 3002906: 4472 lw s0,28(sp) + 3002908: 6105 addi sp,sp,32 + 300290a: 8082 ret + +0300290c : + * @param func callback function + * @param arg callback arg + * @retval None. + */ +static inline void IRQ_SetCallBack(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 300290c: 1101 addi sp,sp,-32 + 300290e: ce22 sw s0,28(sp) + 3002910: 1000 addi s0,sp,32 + 3002912: fea42623 sw a0,-20(s0) + 3002916: feb42423 sw a1,-24(s0) + 300291a: fec42223 sw a2,-28(s0) + g_irqCallbackFunc[irqNum].param = arg; + 300291e: 040007b7 lui a5,0x4000 + 3002922: 0fc78713 addi a4,a5,252 # 40000fc + 3002926: fec42783 lw a5,-20(s0) + 300292a: 078e slli a5,a5,0x3 + 300292c: 97ba add a5,a5,a4 + 300292e: fe442703 lw a4,-28(s0) + 3002932: c3d8 sw a4,4(a5) + g_irqCallbackFunc[irqNum].pfnHandler = func; + 3002934: 040007b7 lui a5,0x4000 + 3002938: 0fc78713 addi a4,a5,252 # 40000fc + 300293c: fec42783 lw a5,-20(s0) + 3002940: 078e slli a5,a5,0x3 + 3002942: 97ba add a5,a5,a4 + 3002944: fe842703 lw a4,-24(s0) + 3002948: c398 sw a4,0(a5) +} + 300294a: 0001 nop + 300294c: 4472 lw s0,28(sp) + 300294e: 6105 addi sp,sp,32 + 3002950: 8082 ret + +03002952 : + * @brief Set the write protection for CRG-related registers disable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionDisable(void) +{ + 3002952: 1141 addi sp,sp,-16 + 3002954: c622 sw s0,12(sp) + 3002956: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = (SYSCTRL0->SC_LOCKEN.reg & SC_LOCKEN_CRG_DISABLE_MASK) + SC_LOCKEN_VALID_HIGH_BIT; + 3002958: 101007b7 lui a5,0x10100 + 300295c: 43f8 lw a4,68(a5) + 300295e: 67c1 lui a5,0x10 + 3002960: 17f9 addi a5,a5,-2 # fffe + 3002962: 00f776b3 and a3,a4,a5 + 3002966: 101007b7 lui a5,0x10100 + 300296a: ea510737 lui a4,0xea510 + 300296e: 9736 add a4,a4,a3 + 3002970: c3f8 sw a4,68(a5) +} + 3002972: 0001 nop + 3002974: 4432 lw s0,12(sp) + 3002976: 0141 addi sp,sp,16 + 3002978: 8082 ret + +0300297a : + * @brief Set the Set the write protection for CRG-related registers enable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionEnable(void) +{ + 300297a: 1141 addi sp,sp,-16 + 300297c: c622 sw s0,12(sp) + 300297e: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = ((SYSCTRL0->SC_LOCKEN.reg & SC_LOW_BIT_MASK) | SC_LOCKEN_CRG_ENABLE_MASK) + + 3002980: 101007b7 lui a5,0x10100 + 3002984: 43f8 lw a4,68(a5) + 3002986: 67c1 lui a5,0x10 + 3002988: 17fd addi a5,a5,-1 # ffff + 300298a: 8ff9 and a5,a5,a4 + 300298c: 0017e693 ori a3,a5,1 + 3002990: 101007b7 lui a5,0x10100 + 3002994: ea510737 lui a4,0xea510 + 3002998: 9736 add a4,a4,a3 + 300299a: c3f8 sw a4,68(a5) + SC_LOCKEN_VALID_HIGH_BIT; +} + 300299c: 0001 nop + 300299e: 4432 lw s0,12(sp) + 30029a0: 0141 addi sp,sp,16 + 30029a2: 8082 ret + +030029a4 : + * @param clkSelect pll_ref_cksel + * @retval true + * @retval false + */ +static inline bool IsCrgPllRefClkSelect(CRG_PllRefClkSelect clkSelect) +{ + 30029a4: 1101 addi sp,sp,-32 + 30029a6: ce22 sw s0,28(sp) + 30029a8: 1000 addi s0,sp,32 + 30029aa: fea42623 sw a0,-20(s0) + return ((clkSelect == CRG_PLL_REF_CLK_SELECT_HOSC) || + 30029ae: fec42783 lw a5,-20(s0) + 30029b2: c791 beqz a5,30029be + 30029b4: fec42703 lw a4,-20(s0) + 30029b8: 4785 li a5,1 + 30029ba: 00f71463 bne a4,a5,30029c2 + 30029be: 4785 li a5,1 + 30029c0: a011 j 30029c4 + 30029c2: 4781 li a5,0 + 30029c4: 8b85 andi a5,a5,1 + 30029c6: 9f81 uxtb a5 + (clkSelect == CRG_PLL_REF_CLK_SELECT_XTAL)); +} + 30029c8: 853e mv a0,a5 + 30029ca: 4472 lw s0,28(sp) + 30029cc: 6105 addi sp,sp,32 + 30029ce: 8082 ret + +030029d0 : + * @param preDiv pll prediv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPreDiv(CRG_PllPreDiv preDiv) +{ + 30029d0: 1101 addi sp,sp,-32 + 30029d2: ce22 sw s0,28(sp) + 30029d4: 1000 addi s0,sp,32 + 30029d6: fea42623 sw a0,-20(s0) + return ((preDiv >= CRG_PLL_PREDIV_1) && + 30029da: fec42783 lw a5,-20(s0) + 30029de: 0087b793 sltiu a5,a5,8 + 30029e2: 9f81 uxtb a5 + (preDiv <= CRG_PLL_PREDIV_8)); +} + 30029e4: 853e mv a0,a5 + 30029e6: 4472 lw s0,28(sp) + 30029e8: 6105 addi sp,sp,32 + 30029ea: 8082 ret + +030029ec : + * @param postDiv pll_postdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv(CRG_PllPostDiv postDiv) +{ + 30029ec: 1101 addi sp,sp,-32 + 30029ee: ce22 sw s0,28(sp) + 30029f0: 1000 addi s0,sp,32 + 30029f2: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV_1) && + 30029f6: fec42783 lw a5,-20(s0) + 30029fa: 0087b793 sltiu a5,a5,8 + 30029fe: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV_8)); +} + 3002a00: 853e mv a0,a5 + 3002a02: 4472 lw s0,28(sp) + 3002a04: 6105 addi sp,sp,32 + 3002a06: 8082 ret + +03002a08 : + * @param postDiv pll_postdiv2 value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv2(CRG_PllPostDiv2 postDiv) +{ + 3002a08: 1101 addi sp,sp,-32 + 3002a0a: ce22 sw s0,28(sp) + 3002a0c: 1000 addi s0,sp,32 + 3002a0e: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV2_1) && + 3002a12: fec42783 lw a5,-20(s0) + 3002a16: 0087b793 sltiu a5,a5,8 + 3002a1a: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV2_8_MAX)); +} + 3002a1c: 853e mv a0,a5 + 3002a1e: 4472 lw s0,28(sp) + 3002a20: 6105 addi sp,sp,32 + 3002a22: 8082 ret + +03002a24 : + * @param fbDiv pll fbdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllFbDiv(unsigned int fbDiv) +{ + 3002a24: 1101 addi sp,sp,-32 + 3002a26: ce22 sw s0,28(sp) + 3002a28: 1000 addi s0,sp,32 + 3002a2a: fea42623 sw a0,-20(s0) + return (fbDiv <= CRG_PLL_FBDIV_MAX); + 3002a2e: fec42783 lw a5,-20(s0) + 3002a32: 0807b793 sltiu a5,a5,128 + 3002a36: 9f81 uxtb a5 +} + 3002a38: 853e mv a0,a5 + 3002a3a: 4472 lw s0,28(sp) + 3002a3c: 6105 addi sp,sp,32 + 3002a3e: 8082 ret + +03002a40 : + * @param select core_cksel value + * @retval true + * @retval false + */ +static inline bool IsCrgCoreCkSel(CRG_CoreClkSelect select) +{ + 3002a40: 1101 addi sp,sp,-32 + 3002a42: ce22 sw s0,28(sp) + 3002a44: 1000 addi s0,sp,32 + 3002a46: fea42623 sw a0,-20(s0) + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002a4a: fec42783 lw a5,-20(s0) + 3002a4e: cb99 beqz a5,3002a64 + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + 3002a50: fec42703 lw a4,-20(s0) + 3002a54: 4785 li a5,1 + 3002a56: 00f70763 beq a4,a5,3002a64 + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002a5a: fec42703 lw a4,-20(s0) + 3002a5e: 4789 li a5,2 + 3002a60: 00f71463 bne a4,a5,3002a68 + 3002a64: 4785 li a5,1 + 3002a66: a011 j 3002a6a + 3002a68: 4781 li a5,0 + 3002a6a: 8b85 andi a5,a5,1 + 3002a6c: 9f81 uxtb a5 + (select == CRG_CORE_CLK_SELECT_PLL)); +} + 3002a6e: 853e mv a0,a5 + 3002a70: 4472 lw s0,28(sp) + 3002a72: 6105 addi sp,sp,32 + 3002a74: 8082 ret + +03002a76 : + * @param select 1M clock selection + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkSel(CRG_1MClkSelect select) +{ + 3002a76: 1101 addi sp,sp,-32 + 3002a78: ce22 sw s0,28(sp) + 3002a7a: 1000 addi s0,sp,32 + 3002a7c: fea42623 sw a0,-20(s0) + return ((select == CRG_1M_CLK_SELECT_HOSC) || + 3002a80: fec42783 lw a5,-20(s0) + 3002a84: c791 beqz a5,3002a90 + 3002a86: fec42703 lw a4,-20(s0) + 3002a8a: 4785 li a5,1 + 3002a8c: 00f71463 bne a4,a5,3002a94 + 3002a90: 4785 li a5,1 + 3002a92: a011 j 3002a96 + 3002a94: 4781 li a5,0 + 3002a96: 8b85 andi a5,a5,1 + 3002a98: 9f81 uxtb a5 + (select == CRG_1M_CLK_SELECT_TCXO)); +} + 3002a9a: 853e mv a0,a5 + 3002a9c: 4472 lw s0,28(sp) + 3002a9e: 6105 addi sp,sp,32 + 3002aa0: 8082 ret + +03002aa2 : + * @param div 1M clock ratio + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkDiv(unsigned int div) +{ + 3002aa2: 1101 addi sp,sp,-32 + 3002aa4: ce22 sw s0,28(sp) + 3002aa6: 1000 addi s0,sp,32 + 3002aa8: fea42623 sw a0,-20(s0) + return (div <= CRG_1MHZ_CLK_MAX_DIV); + 3002aac: fec42783 lw a5,-20(s0) + 3002ab0: 0407b793 sltiu a5,a5,64 + 3002ab4: 9f81 uxtb a5 +} + 3002ab6: 853e mv a0,a5 + 3002ab8: 4472 lw s0,28(sp) + 3002aba: 6105 addi sp,sp,32 + 3002abc: 8082 ret + +03002abe : + * @param preDiv PLL Previous Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPreDiv(unsigned int pllRefFreq, unsigned int preDiv) +{ + 3002abe: 7179 addi sp,sp,-48 + 3002ac0: d622 sw s0,44(sp) + 3002ac2: 1800 addi s0,sp,48 + 3002ac4: fca42e23 sw a0,-36(s0) + 3002ac8: fcb42c23 sw a1,-40(s0) + unsigned int freq = pllRefFreq; + 3002acc: fdc42783 lw a5,-36(s0) + 3002ad0: fef42623 sw a5,-20(s0) + if (preDiv != 0) { + 3002ad4: fd842783 lw a5,-40(s0) + 3002ad8: cb89 beqz a5,3002aea + freq /= preDiv; + 3002ada: fec42703 lw a4,-20(s0) + 3002ade: fd842783 lw a5,-40(s0) + 3002ae2: 02f757b3 divu a5,a4,a5 + 3002ae6: fef42623 sw a5,-20(s0) + } + return (freq >= CRG_CLK_PFD_MIN_FREQ) && (freq <= CRG_CLK_PFD_MAX_FREQ); + 3002aea: fec42703 lw a4,-20(s0) + 3002aee: 003d17b7 lui a5,0x3d1 + 3002af2: 8ff78793 addi a5,a5,-1793 # 3d08ff + 3002af6: 00e7fc63 bgeu a5,a4,3002b0e + 3002afa: fec42703 lw a4,-20(s0) + 3002afe: 007277b7 lui a5,0x727 + 3002b02: 0e078793 addi a5,a5,224 # 7270e0 + 3002b06: 00e7e463 bltu a5,a4,3002b0e + 3002b0a: 4785 li a5,1 + 3002b0c: a011 j 3002b10 + 3002b0e: 4781 li a5,0 + 3002b10: 8b85 andi a5,a5,1 + 3002b12: 9f81 uxtb a5 +} + 3002b14: 853e mv a0,a5 + 3002b16: 5432 lw s0,44(sp) + 3002b18: 6145 addi sp,sp,48 + 3002b1a: 8082 ret + +03002b1c : + * @param fdDiv PLL FD Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidFdDiv(unsigned int clkPfdFreq, unsigned int fdDiv) +{ + 3002b1c: 7179 addi sp,sp,-48 + 3002b1e: d622 sw s0,44(sp) + 3002b20: 1800 addi s0,sp,48 + 3002b22: fca42e23 sw a0,-36(s0) + 3002b26: fcb42c23 sw a1,-40(s0) + if (clkPfdFreq > 30000000U) { /* The maximum speed of the external clock source is 30000000U. */ + 3002b2a: fdc42703 lw a4,-36(s0) + 3002b2e: 01c9c7b7 lui a5,0x1c9c + 3002b32: 38078793 addi a5,a5,896 # 1c9c380 + 3002b36: 00e7f463 bgeu a5,a4,3002b3e + return false; + 3002b3a: 4781 li a5,0 + 3002b3c: a08d j 3002b9e + } else if (fdDiv > CRG_PLL_FBDIV_MAX) { + 3002b3e: fd842703 lw a4,-40(s0) + 3002b42: 07f00793 li a5,127 + 3002b46: 00e7f463 bgeu a5,a4,3002b4e + return false; + 3002b4a: 4781 li a5,0 + 3002b4c: a889 j 3002b9e + } + + unsigned int freq = (fdDiv > 0x6) ? (clkPfdFreq * fdDiv) : (clkPfdFreq * 0x6); /* 0x0-0x6: divided by 0x6 */ + 3002b4e: fd842703 lw a4,-40(s0) + 3002b52: 4799 li a5,6 + 3002b54: 00e7f963 bgeu a5,a4,3002b66 + 3002b58: fdc42703 lw a4,-36(s0) + 3002b5c: fd842783 lw a5,-40(s0) + 3002b60: 02f707b3 mul a5,a4,a5 + 3002b64: a031 j 3002b70 + 3002b66: fdc42703 lw a4,-36(s0) + 3002b6a: 4799 li a5,6 + 3002b6c: 02f707b3 mul a5,a4,a5 + 3002b70: fef42623 sw a5,-20(s0) + return (freq >= CRG_CLK_VCO_MIN_FREQ) && (freq <= CRG_CLK_VCO_MAX_FREQ); + 3002b74: fec42703 lw a4,-20(s0) + 3002b78: 05f5e7b7 lui a5,0x5f5e + 3002b7c: 0ff78793 addi a5,a5,255 # 5f5e0ff + 3002b80: 00e7fc63 bgeu a5,a4,3002b98 + 3002b84: fec42703 lw a4,-20(s0) + 3002b88: 11e1a7b7 lui a5,0x11e1a + 3002b8c: 30078793 addi a5,a5,768 # 11e1a300 + 3002b90: 00e7e463 bltu a5,a4,3002b98 + 3002b94: 4785 li a5,1 + 3002b96: a011 j 3002b9a + 3002b98: 4781 li a5,0 + 3002b9a: 8b85 andi a5,a5,1 + 3002b9c: 9f81 uxtb a5 +} + 3002b9e: 853e mv a0,a5 + 3002ba0: 5432 lw s0,44(sp) + 3002ba2: 6145 addi sp,sp,48 + 3002ba4: 8082 ret + +03002ba6 : + * @param postDiv PLL Post Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv(unsigned int clkVcoFreq, unsigned int postDiv) +{ + 3002ba6: 7179 addi sp,sp,-48 + 3002ba8: d622 sw s0,44(sp) + 3002baa: 1800 addi s0,sp,48 + 3002bac: fca42e23 sw a0,-36(s0) + 3002bb0: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002bb4: fdc42783 lw a5,-36(s0) + 3002bb8: fef42623 sw a5,-20(s0) + if (postDiv != 0) { + 3002bbc: fd842783 lw a5,-40(s0) + 3002bc0: cb91 beqz a5,3002bd4 + freq /= (postDiv + 1); + 3002bc2: fd842783 lw a5,-40(s0) + 3002bc6: 0785 addi a5,a5,1 + 3002bc8: fec42703 lw a4,-20(s0) + 3002bcc: 02f757b3 divu a5,a4,a5 + 3002bd0: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_TARGET_MAX_FREQ); + 3002bd4: fec42703 lw a4,-20(s0) + 3002bd8: 08f0d7b7 lui a5,0x8f0d + 3002bdc: 18178793 addi a5,a5,385 # 8f0d181 + 3002be0: 00f737b3 sltu a5,a4,a5 + 3002be4: 9f81 uxtb a5 +} + 3002be6: 853e mv a0,a5 + 3002be8: 5432 lw s0,44(sp) + 3002bea: 6145 addi sp,sp,48 + 3002bec: 8082 ret + +03002bee : + * @param postDiv2 PLL Post Divsion2 + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv2(unsigned int clkVcoFreq, unsigned int postDiv2) +{ + 3002bee: 7179 addi sp,sp,-48 + 3002bf0: d622 sw s0,44(sp) + 3002bf2: 1800 addi s0,sp,48 + 3002bf4: fca42e23 sw a0,-36(s0) + 3002bf8: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002bfc: fdc42783 lw a5,-36(s0) + 3002c00: fef42623 sw a5,-20(s0) + if (postDiv2 != 0) { + 3002c04: fd842783 lw a5,-40(s0) + 3002c08: cb91 beqz a5,3002c1c + freq /= (postDiv2 + 1); + 3002c0a: fd842783 lw a5,-40(s0) + 3002c0e: 0785 addi a5,a5,1 + 3002c10: fec42703 lw a4,-20(s0) + 3002c14: 02f757b3 divu a5,a4,a5 + 3002c18: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_PST2_MAX_FREQ); + 3002c1c: fec42703 lw a4,-20(s0) + 3002c20: 05f5e7b7 lui a5,0x5f5e + 3002c24: 10178793 addi a5,a5,257 # 5f5e101 + 3002c28: 00f737b3 sltu a5,a4,a5 + 3002c2c: 9f81 uxtb a5 +} + 3002c2e: 853e mv a0,a5 + 3002c30: 5432 lw s0,44(sp) + 3002c32: 6145 addi sp,sp,48 + 3002c34: 8082 ret + +03002c36 : + * @param adcClkSelect the value of adc clock select + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkModeSelect(CRG_AdcClkSelect adcClkSelect) +{ + 3002c36: 1101 addi sp,sp,-32 + 3002c38: ce22 sw s0,28(sp) + 3002c3a: 1000 addi s0,sp,32 + 3002c3c: fea42623 sw a0,-20(s0) + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002c40: fec42783 lw a5,-20(s0) + 3002c44: c385 beqz a5,3002c64 + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + 3002c46: fec42703 lw a4,-20(s0) + 3002c4a: 4785 li a5,1 + 3002c4c: 00f70c63 beq a4,a5,3002c64 + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + 3002c50: fec42703 lw a4,-20(s0) + 3002c54: 4789 li a5,2 + 3002c56: 00f70763 beq a4,a5,3002c64 + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002c5a: fec42703 lw a4,-20(s0) + 3002c5e: 478d li a5,3 + 3002c60: 00f71463 bne a4,a5,3002c68 + 3002c64: 4785 li a5,1 + 3002c66: a011 j 3002c6a + 3002c68: 4781 li a5,0 + 3002c6a: 8b85 andi a5,a5,1 + 3002c6c: 9f81 uxtb a5 + adcClkSelect == CRG_ADC_CLK_SYN_CORE); +} + 3002c6e: 853e mv a0,a5 + 3002c70: 4472 lw s0,28(sp) + 3002c72: 6105 addi sp,sp,32 + 3002c74: 8082 ret + +03002c76 : + * @param div the value of adc clock div + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkDiv(CRG_AdcDiv div) +{ + 3002c76: 1101 addi sp,sp,-32 + 3002c78: ce22 sw s0,28(sp) + 3002c7a: 1000 addi s0,sp,32 + 3002c7c: fea42623 sw a0,-20(s0) + return (div == CRG_ADC_DIV_1 || \ + div == CRG_ADC_DIV_2 || \ + div == CRG_ADC_DIV_3 || \ + 3002c80: fec42783 lw a5,-20(s0) + 3002c84: c385 beqz a5,3002ca4 + return (div == CRG_ADC_DIV_1 || \ + 3002c86: fec42703 lw a4,-20(s0) + 3002c8a: 4785 li a5,1 + 3002c8c: 00f70c63 beq a4,a5,3002ca4 + div == CRG_ADC_DIV_2 || \ + 3002c90: fec42703 lw a4,-20(s0) + 3002c94: 4789 li a5,2 + 3002c96: 00f70763 beq a4,a5,3002ca4 + div == CRG_ADC_DIV_3 || \ + 3002c9a: fec42703 lw a4,-20(s0) + 3002c9e: 478d li a5,3 + 3002ca0: 00f71463 bne a4,a5,3002ca8 + 3002ca4: 4785 li a5,1 + 3002ca6: a011 j 3002caa + 3002ca8: 4781 li a5,0 + 3002caa: 8b85 andi a5,a5,1 + 3002cac: 9f81 uxtb a5 + div == CRG_ADC_DIV_4); +} + 3002cae: 853e mv a0,a5 + 3002cb0: 4472 lw s0,28(sp) + 3002cb2: 6105 addi sp,sp,32 + 3002cb4: 8082 ret + +03002cb6 : + * @param clk Clock register base address + * @param select Core clock selection + * @retval None + */ +static inline void DCL_CRG_SetCoreClkSel(CRG_RegStruct *clk, CRG_CoreClkSelect select) +{ + 3002cb6: 1101 addi sp,sp,-32 + 3002cb8: ce06 sw ra,28(sp) + 3002cba: cc22 sw s0,24(sp) + 3002cbc: 1000 addi s0,sp,32 + 3002cbe: fea42623 sw a0,-20(s0) + 3002cc2: feb42423 sw a1,-24(s0) + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + 3002cc6: fec42703 lw a4,-20(s0) + 3002cca: 100007b7 lui a5,0x10000 + 3002cce: 00f70a63 beq a4,a5,3002ce2 + 3002cd2: 64b00593 li a1,1611 + 3002cd6: 030067b7 lui a5,0x3006 + 3002cda: 4d878513 addi a0,a5,1240 # 30064d8 + 3002cde: 20a1 jal ra,3002d26 + 3002ce0: a001 j 3002ce0 + CRG_PARAM_CHECK_NO_RET(IsCrgCoreCkSel(select)); + 3002ce2: fe842503 lw a0,-24(s0) + 3002ce6: 3ba9 jal ra,3002a40 + 3002ce8: 87aa mv a5,a0 + 3002cea: 0017c793 xori a5,a5,1 + 3002cee: 9f81 uxtb a5 + 3002cf0: cb89 beqz a5,3002d02 + 3002cf2: 64c00593 li a1,1612 + 3002cf6: 030067b7 lui a5,0x3006 + 3002cfa: 4d878513 addi a0,a5,1240 # 30064d8 + 3002cfe: 2025 jal ra,3002d26 + 3002d00: a839 j 3002d1e + clk->PERI_CRG64.BIT.clk_pst1_sw_sel = select; + 3002d02: fe842783 lw a5,-24(s0) + 3002d06: 8b8d andi a5,a5,3 + 3002d08: 0ff7f693 andi a3,a5,255 + 3002d0c: fec42703 lw a4,-20(s0) + 3002d10: 10072783 lw a5,256(a4) # ea510100 + 3002d14: 8a8d andi a3,a3,3 + 3002d16: 9bf1 andi a5,a5,-4 + 3002d18: 8fd5 or a5,a5,a3 + 3002d1a: 10f72023 sw a5,256(a4) +} + 3002d1e: 40f2 lw ra,28(sp) + 3002d20: 4462 lw s0,24(sp) + 3002d22: 6105 addi sp,sp,32 + 3002d24: 8082 ret + +03002d26 : + 3002d26: 988ff06f j 3001eae + +03002d2a : + * @param handle CRG Handle + * @retval BASE_STATUS_ERROR Parameter Check fail + * @retval BASE_STATUS_OK Success + */ +BASE_StatusType HAL_CRG_Init(const CRG_Handle *handle) +{ + 3002d2a: 7179 addi sp,sp,-48 + 3002d2c: d606 sw ra,44(sp) + 3002d2e: d422 sw s0,40(sp) + 3002d30: 1800 addi s0,sp,48 + 3002d32: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != NULL); + 3002d36: fdc42783 lw a5,-36(s0) + 3002d3a: eb89 bnez a5,3002d4c + 3002d3c: 07100593 li a1,113 + 3002d40: 030067b7 lui a5,0x3006 + 3002d44: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d48: 3ff9 jal ra,3002d26 + 3002d4a: a001 j 3002d4a + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3002d4c: fdc42783 lw a5,-36(s0) + 3002d50: 4398 lw a4,0(a5) + 3002d52: 100007b7 lui a5,0x10000 + 3002d56: 00f70a63 beq a4,a5,3002d6a + 3002d5a: 07200593 li a1,114 + 3002d5e: 030067b7 lui a5,0x3006 + 3002d62: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d66: 37c1 jal ra,3002d26 + 3002d68: a001 j 3002d68 + /* Check the validity of PLL-related parameters. */ + CRG_PARAM_CHECK_WITH_RET(IsCrgPllRefClkSelect(handle->pllRefClkSelect), BASE_STATUS_ERROR); + 3002d6a: fdc42783 lw a5,-36(s0) + 3002d6e: 43dc lw a5,4(a5) + 3002d70: 853e mv a0,a5 + 3002d72: 390d jal ra,30029a4 + 3002d74: 87aa mv a5,a0 + 3002d76: 0017c793 xori a5,a5,1 + 3002d7a: 9f81 uxtb a5 + 3002d7c: cb91 beqz a5,3002d90 + 3002d7e: 07400593 li a1,116 + 3002d82: 030067b7 lui a5,0x3006 + 3002d86: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d8a: 3f71 jal ra,3002d26 + 3002d8c: 4785 li a5,1 + 3002d8e: aca9 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPreDiv(handle->pllPreDiv), BASE_STATUS_ERROR); + 3002d90: fdc42783 lw a5,-36(s0) + 3002d94: 479c lw a5,8(a5) + 3002d96: 853e mv a0,a5 + 3002d98: 3925 jal ra,30029d0 + 3002d9a: 87aa mv a5,a0 + 3002d9c: 0017c793 xori a5,a5,1 + 3002da0: 9f81 uxtb a5 + 3002da2: cb91 beqz a5,3002db6 + 3002da4: 07500593 li a1,117 + 3002da8: 030067b7 lui a5,0x3006 + 3002dac: 4f478513 addi a0,a5,1268 # 30064f4 + 3002db0: 3f9d jal ra,3002d26 + 3002db2: 4785 li a5,1 + 3002db4: ac15 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllFbDiv(handle->pllFbDiv), BASE_STATUS_ERROR); + 3002db6: fdc42783 lw a5,-36(s0) + 3002dba: 47dc lw a5,12(a5) + 3002dbc: 853e mv a0,a5 + 3002dbe: 319d jal ra,3002a24 + 3002dc0: 87aa mv a5,a0 + 3002dc2: 0017c793 xori a5,a5,1 + 3002dc6: 9f81 uxtb a5 + 3002dc8: cb91 beqz a5,3002ddc + 3002dca: 07600593 li a1,118 + 3002dce: 030067b7 lui a5,0x3006 + 3002dd2: 4f478513 addi a0,a5,1268 # 30064f4 + 3002dd6: 3f81 jal ra,3002d26 + 3002dd8: 4785 li a5,1 + 3002dda: a439 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv(handle->pllPostDiv), BASE_STATUS_ERROR); + 3002ddc: fdc42783 lw a5,-36(s0) + 3002de0: 4b9c lw a5,16(a5) + 3002de2: 853e mv a0,a5 + 3002de4: 3121 jal ra,30029ec + 3002de6: 87aa mv a5,a0 + 3002de8: 0017c793 xori a5,a5,1 + 3002dec: 9f81 uxtb a5 + 3002dee: cb91 beqz a5,3002e02 + 3002df0: 07700593 li a1,119 + 3002df4: 030067b7 lui a5,0x3006 + 3002df8: 4f478513 addi a0,a5,1268 # 30064f4 + 3002dfc: 372d jal ra,3002d26 + 3002dfe: 4785 li a5,1 + 3002e00: a2e5 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv2(handle->handleEx.pllPostDiv2), BASE_STATUS_ERROR); + 3002e02: fdc42783 lw a5,-36(s0) + 3002e06: 4fdc lw a5,28(a5) + 3002e08: 853e mv a0,a5 + 3002e0a: 3efd jal ra,3002a08 + 3002e0c: 87aa mv a5,a0 + 3002e0e: 0017c793 xori a5,a5,1 + 3002e12: 9f81 uxtb a5 + 3002e14: cb91 beqz a5,3002e28 + 3002e16: 07800593 li a1,120 + 3002e1a: 030067b7 lui a5,0x3006 + 3002e1e: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e22: 3711 jal ra,3002d26 + 3002e24: 4785 li a5,1 + 3002e26: a2c9 j 3002fe8 + /* Check the Clock Source and Frequency Divider of the 1 MHz Clock. */ + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkSel(handle->handleEx.clk1MSelect), BASE_STATUS_ERROR); + 3002e28: fdc42783 lw a5,-36(s0) + 3002e2c: 539c lw a5,32(a5) + 3002e2e: 853e mv a0,a5 + 3002e30: 3199 jal ra,3002a76 + 3002e32: 87aa mv a5,a0 + 3002e34: 0017c793 xori a5,a5,1 + 3002e38: 9f81 uxtb a5 + 3002e3a: cb91 beqz a5,3002e4e + 3002e3c: 07a00593 li a1,122 + 3002e40: 030067b7 lui a5,0x3006 + 3002e44: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e48: 3df9 jal ra,3002d26 + 3002e4a: 4785 li a5,1 + 3002e4c: aa71 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkDiv(handle->handleEx.clk1MDiv), BASE_STATUS_ERROR); + 3002e4e: fdc42783 lw a5,-36(s0) + 3002e52: 53dc lw a5,36(a5) + 3002e54: 853e mv a0,a5 + 3002e56: 31b1 jal ra,3002aa2 + 3002e58: 87aa mv a5,a0 + 3002e5a: 0017c793 xori a5,a5,1 + 3002e5e: 9f81 uxtb a5 + 3002e60: cb91 beqz a5,3002e74 + 3002e62: 07b00593 li a1,123 + 3002e66: 030067b7 lui a5,0x3006 + 3002e6a: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e6e: 3d65 jal ra,3002d26 + 3002e70: 4785 li a5,1 + 3002e72: aa9d j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 3002e74: fdc42783 lw a5,-36(s0) + 3002e78: 4f9c lw a5,24(a5) + 3002e7a: 853e mv a0,a5 + 3002e7c: 36d1 jal ra,3002a40 + 3002e7e: 87aa mv a5,a0 + 3002e80: 0017c793 xori a5,a5,1 + 3002e84: 9f81 uxtb a5 + 3002e86: cb91 beqz a5,3002e9a + 3002e88: 07c00593 li a1,124 + 3002e8c: 030067b7 lui a5,0x3006 + 3002e90: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e94: 3d49 jal ra,3002d26 + 3002e96: 4785 li a5,1 + 3002e98: aa81 j 3002fe8 + + *(unsigned int *)CRG_HOSC_CTRL2_ADDR = 0x306E; /* Optimized HOSC temperature drift performance parameter. */ + 3002e9a: 100017b7 lui a5,0x10001 + 3002e9e: f0478793 addi a5,a5,-252 # 10000f04 + 3002ea2: 670d lui a4,0x3 + 3002ea4: 06e70713 addi a4,a4,110 # 306e + 3002ea8: c398 sw a4,0(a5) + + CRG_RegStruct *reg = handle->baseAddress; + 3002eaa: fdc42783 lw a5,-36(s0) + 3002eae: 439c lw a5,0(a5) + 3002eb0: fef42623 sw a5,-20(s0) + g_crgBaseAddr = (void *)reg; + 3002eb4: 040007b7 lui a5,0x4000 + 3002eb8: fec42703 lw a4,-20(s0) + 3002ebc: 48e7aa23 sw a4,1172(a5) # 4000494 + /* Check the validity of the PLL parameter configuration. */ + if (CRG_IsValidPllConfig(handle) != BASE_STATUS_OK) { + 3002ec0: fdc42503 lw a0,-36(s0) + 3002ec4: 7a4000ef jal ra,3003668 + 3002ec8: 87aa mv a5,a0 + 3002eca: c399 beqz a5,3002ed0 + return BASE_STATUS_ERROR; + 3002ecc: 4785 li a5,1 + 3002ece: aa29 j 3002fe8 + } + /* Disable the write protection function of the CRG register. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3002ed0: 3449 jal ra,3002952 + + reg->PERI_CRG0.BIT.pll_ref_cksel = handle->pllRefClkSelect; + 3002ed2: fdc42783 lw a5,-36(s0) + 3002ed6: 43dc lw a5,4(a5) + 3002ed8: 8b85 andi a5,a5,1 + 3002eda: 0ff7f693 andi a3,a5,255 + 3002ede: fec42703 lw a4,-20(s0) + 3002ee2: 431c lw a5,0(a4) + 3002ee4: 8a85 andi a3,a3,1 + 3002ee6: 9bf9 andi a5,a5,-2 + 3002ee8: 8fd5 or a5,a5,a3 + 3002eea: c31c sw a5,0(a4) + reg->PERI_CRG1.BIT.pll_prediv = handle->pllPreDiv; + 3002eec: fdc42783 lw a5,-36(s0) + 3002ef0: 479c lw a5,8(a5) + 3002ef2: 8bbd andi a5,a5,15 + 3002ef4: 0ff7f693 andi a3,a5,255 + 3002ef8: fec42703 lw a4,-20(s0) + 3002efc: 435c lw a5,4(a4) + 3002efe: 8abd andi a3,a3,15 + 3002f00: 9bc1 andi a5,a5,-16 + 3002f02: 8fd5 or a5,a5,a3 + 3002f04: c35c sw a5,4(a4) + reg->PERI_CRG2.BIT.pll_fbdiv = handle->pllFbDiv; + 3002f06: fdc42783 lw a5,-36(s0) + 3002f0a: 47dc lw a5,12(a5) + 3002f0c: 0ff7f693 andi a3,a5,255 + 3002f10: fec42703 lw a4,-20(s0) + 3002f14: 471c lw a5,8(a4) + 3002f16: 0ff6f693 andi a3,a3,255 + 3002f1a: f007f793 andi a5,a5,-256 + 3002f1e: 8fd5 or a5,a5,a3 + 3002f20: c71c sw a5,8(a4) + reg->PERI_CRG3.BIT.pll_postdiv1 = handle->pllPostDiv; + 3002f22: fdc42783 lw a5,-36(s0) + 3002f26: 4b9c lw a5,16(a5) + 3002f28: 8bbd andi a5,a5,15 + 3002f2a: 0ff7f693 andi a3,a5,255 + 3002f2e: fec42703 lw a4,-20(s0) + 3002f32: 475c lw a5,12(a4) + 3002f34: 8abd andi a3,a3,15 + 3002f36: 9bc1 andi a5,a5,-16 + 3002f38: 8fd5 or a5,a5,a3 + 3002f3a: c75c sw a5,12(a4) + reg->PERI_CRG3.BIT.pll_postdiv2 = handle->handleEx.pllPostDiv2; + 3002f3c: fdc42783 lw a5,-36(s0) + 3002f40: 4fdc lw a5,28(a5) + 3002f42: 8bbd andi a5,a5,15 + 3002f44: 0ff7f693 andi a3,a5,255 + 3002f48: fec42703 lw a4,-20(s0) + 3002f4c: 475c lw a5,12(a4) + 3002f4e: 8abd andi a3,a3,15 + 3002f50: 0692 slli a3,a3,0x4 + 3002f52: f0f7f793 andi a5,a5,-241 + 3002f56: 8fd5 or a5,a5,a3 + 3002f58: c75c sw a5,12(a4) + reg->PERI_CRG4.BIT.pll_pd = BASE_CFG_UNSET; + 3002f5a: fec42703 lw a4,-20(s0) + 3002f5e: 4b1c lw a5,16(a4) + 3002f60: 9bf9 andi a5,a5,-2 + 3002f62: cb1c sw a5,16(a4) + + while (reg->PERI_CRG7.BIT.pll_lock != BASE_CFG_SET) { + 3002f64: 0001 nop + 3002f66: fec42783 lw a5,-20(s0) + 3002f6a: 4fdc lw a5,28(a5) + 3002f6c: 8b85 andi a5,a5,1 + 3002f6e: 0ff7f713 andi a4,a5,255 + 3002f72: 4785 li a5,1 + 3002f74: fef719e3 bne a4,a5,3002f66 + ; /* Wait for PLL to lock */ + } + + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3002f78: 3409 jal ra,300297a + /* Check the 1MHz clock parameter configuration. */ + if (CRG_IsValid1MHzConfig(handle) != BASE_STATUS_OK) { + 3002f7a: fdc42503 lw a0,-36(s0) + 3002f7e: 7ac000ef jal ra,300372a + 3002f82: 87aa mv a5,a0 + 3002f84: c399 beqz a5,3002f8a + return BASE_STATUS_ERROR; + 3002f86: 4785 li a5,1 + 3002f88: a085 j 3002fe8 + } + while (reg->HOSC_LOCK.BIT.hosc_lock != BASE_CFG_SET) { + 3002f8a: 0001 nop + 3002f8c: fec42703 lw a4,-20(s0) + 3002f90: 6785 lui a5,0x1 + 3002f92: 97ba add a5,a5,a4 + 3002f94: f107a783 lw a5,-240(a5) # f10 + 3002f98: 8b85 andi a5,a5,1 + 3002f9a: 0ff7f713 andi a4,a5,255 + 3002f9e: 4785 li a5,1 + 3002fa0: fef716e3 bne a4,a5,3002f8c + ; /* Wait for HOSC to lock */ + } + /* Set the Clock Source and Frequency Divider of the 1 MHz Clock. */ + reg->PERI_CRG67.BIT.clk_1m_div = handle->handleEx.clk1MDiv; + 3002fa4: fdc42783 lw a5,-36(s0) + 3002fa8: 53dc lw a5,36(a5) + 3002faa: 03f7f793 andi a5,a5,63 + 3002fae: 0ff7f693 andi a3,a5,255 + 3002fb2: fec42703 lw a4,-20(s0) + 3002fb6: 10c72783 lw a5,268(a4) + 3002fba: 03f6f693 andi a3,a3,63 + 3002fbe: fc07f793 andi a5,a5,-64 + 3002fc2: 8fd5 or a5,a5,a3 + 3002fc4: 10f72623 sw a5,268(a4) + reg->PERI_CRG66.BIT.clk_1m_ini_cksel = handle->handleEx.clk1MSelect; + 3002fc8: fdc42783 lw a5,-36(s0) + 3002fcc: 539c lw a5,32(a5) + 3002fce: 8b85 andi a5,a5,1 + 3002fd0: 0ff7f693 andi a3,a5,255 + 3002fd4: fec42703 lw a4,-20(s0) + 3002fd8: 10872783 lw a5,264(a4) + 3002fdc: 8a85 andi a3,a3,1 + 3002fde: 9bf9 andi a5,a5,-2 + 3002fe0: 8fd5 or a5,a5,a3 + 3002fe2: 10f72423 sw a5,264(a4) + return BASE_STATUS_OK; + 3002fe6: 4781 li a5,0 +} + 3002fe8: 853e mv a0,a5 + 3002fea: 50b2 lw ra,44(sp) + 3002fec: 5422 lw s0,40(sp) + 3002fee: 6145 addi sp,sp,48 + 3002ff0: 8082 ret + +03002ff2 : + * @param handle CRG Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Paramter check fail + */ +BASE_StatusType HAL_CRG_SetCoreClockSelect(CRG_Handle *handle) +{ + 3002ff2: 7179 addi sp,sp,-48 + 3002ff4: d606 sw ra,44(sp) + 3002ff6: d422 sw s0,40(sp) + 3002ff8: 1800 addi s0,sp,48 + 3002ffa: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != 0); + 3002ffe: fdc42783 lw a5,-36(s0) + 3003002: eb89 bnez a5,3003014 + 3003004: 10a00593 li a1,266 + 3003008: 030067b7 lui a5,0x3006 + 300300c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003010: 3b19 jal ra,3002d26 + 3003012: a001 j 3003012 + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3003014: fdc42783 lw a5,-36(s0) + 3003018: 4398 lw a4,0(a5) + 300301a: 100007b7 lui a5,0x10000 + 300301e: 00f70a63 beq a4,a5,3003032 + 3003022: 10b00593 li a1,267 + 3003026: 030067b7 lui a5,0x3006 + 300302a: 4f478513 addi a0,a5,1268 # 30064f4 + 300302e: 39e5 jal ra,3002d26 + 3003030: a001 j 3003030 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 3003032: fdc42783 lw a5,-36(s0) + 3003036: 4f9c lw a5,24(a5) + 3003038: 853e mv a0,a5 + 300303a: 3419 jal ra,3002a40 + 300303c: 87aa mv a5,a0 + 300303e: 0017c793 xori a5,a5,1 + 3003042: 9f81 uxtb a5 + 3003044: cb91 beqz a5,3003058 + 3003046: 10c00593 li a1,268 + 300304a: 030067b7 lui a5,0x3006 + 300304e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003052: 39d1 jal ra,3002d26 + 3003054: 4785 li a5,1 + 3003056: a005 j 3003076 + + CRG_RegStruct *reg = handle->baseAddress; + 3003058: fdc42783 lw a5,-36(s0) + 300305c: 439c lw a5,0(a5) + 300305e: fef42623 sw a5,-20(s0) + /* The write protection of the CRG register needs to be disabled. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3003062: 38c5 jal ra,3002952 + DCL_CRG_SetCoreClkSel(reg, handle->coreClkSelect); + 3003064: fdc42783 lw a5,-36(s0) + 3003068: 4f9c lw a5,24(a5) + 300306a: 85be mv a1,a5 + 300306c: fec42503 lw a0,-20(s0) + 3003070: 3199 jal ra,3002cb6 + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3003072: 3221 jal ra,300297a + + return BASE_STATUS_OK; + 3003074: 4781 li a5,0 +} + 3003076: 853e mv a0,a5 + 3003078: 50b2 lw ra,44(sp) + 300307a: 5422 lw s0,40(sp) + 300307c: 6145 addi sp,sp,48 + 300307e: 8082 ret + +03003080 : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +static inline unsigned int CRG_GetVcoFreq(void) +{ + 3003080: 1101 addi sp,sp,-32 + 3003082: ce06 sw ra,28(sp) + 3003084: cc22 sw s0,24(sp) + 3003086: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int regFbdiv; + CRG_RegStruct *crg = g_crgBaseAddr; + 3003088: 040007b7 lui a5,0x4000 + 300308c: 4947a783 lw a5,1172(a5) # 4000494 + 3003090: fef42623 sw a5,-20(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003094: fec42703 lw a4,-20(s0) + 3003098: 100007b7 lui a5,0x10000 + 300309c: 00f70a63 beq a4,a5,30030b0 + 30030a0: 12200593 li a1,290 + 30030a4: 030067b7 lui a5,0x3006 + 30030a8: 4f478513 addi a0,a5,1268 # 30064f4 + 30030ac: 39ad jal ra,3002d26 + 30030ae: a001 j 30030ae + CRG_ASSERT_PARAM((XTRAIL_FREQ <= 30000000U)); /* The maximum of the external clock source is 30000000U. */ + + freq = CRG_GetPllRefIni(crg->PERI_CRG0.BIT.pll_ref_cksel); + 30030b0: fec42783 lw a5,-20(s0) + 30030b4: 439c lw a5,0(a5) + 30030b6: 8b85 andi a5,a5,1 + 30030b8: 9f81 uxtb a5 + 30030ba: 853e mv a0,a5 + 30030bc: 25c1 jal ra,300377c + 30030be: fea42423 sw a0,-24(s0) + freq /= CRG_GetPreDivValue(crg->PERI_CRG1.BIT.pll_prediv); + 30030c2: fec42783 lw a5,-20(s0) + 30030c6: 43dc lw a5,4(a5) + 30030c8: 8bbd andi a5,a5,15 + 30030ca: 9f81 uxtb a5 + 30030cc: 853e mv a0,a5 + 30030ce: 2de1 jal ra,30037a6 + 30030d0: 872a mv a4,a0 + 30030d2: fe842783 lw a5,-24(s0) + 30030d6: 02e7d7b3 divu a5,a5,a4 + 30030da: fef42423 sw a5,-24(s0) + regFbdiv = CRG_GetPllFbDivValue(crg->PERI_CRG2.BIT.pll_fbdiv); /* Get the value of the fbdiv register. */ + 30030de: fec42783 lw a5,-20(s0) + 30030e2: 479c lw a5,8(a5) + 30030e4: 9f81 uxtb a5 + 30030e6: 853e mv a0,a5 + 30030e8: 25f5 jal ra,30037d4 + 30030ea: fea42223 sw a0,-28(s0) + freq *= (regFbdiv >= 0x06) ? regFbdiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 30030ee: fe442783 lw a5,-28(s0) + 30030f2: 4719 li a4,6 + 30030f4: 00e7f363 bgeu a5,a4,30030fa + 30030f8: 4799 li a5,6 + 30030fa: fe842703 lw a4,-24(s0) + 30030fe: 02f707b3 mul a5,a4,a5 + 3003102: fef42423 sw a5,-24(s0) + return freq; + 3003106: fe842783 lw a5,-24(s0) +} + 300310a: 853e mv a0,a5 + 300310c: 40f2 lw ra,28(sp) + 300310e: 4462 lw s0,24(sp) + 3003110: 6105 addi sp,sp,32 + 3003112: 8082 ret + +03003114 : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +unsigned int HAL_CRG_GetPllFreq(void) +{ + 3003114: 1101 addi sp,sp,-32 + 3003116: ce06 sw ra,28(sp) + 3003118: cc22 sw s0,24(sp) + 300311a: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int pllPostDivValue; + CRG_RegStruct *crg = g_crgBaseAddr; + 300311c: 040007b7 lui a5,0x4000 + 3003120: 4947a783 lw a5,1172(a5) # 4000494 + 3003124: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003128: fe842703 lw a4,-24(s0) + 300312c: 100007b7 lui a5,0x10000 + 3003130: 00f70a63 beq a4,a5,3003144 + 3003134: 13700593 li a1,311 + 3003138: 030067b7 lui a5,0x3006 + 300313c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003140: 36dd jal ra,3002d26 + 3003142: a001 j 3003142 + freq = CRG_GetVcoFreq(); + 3003144: 3f35 jal ra,3003080 + 3003146: fea42623 sw a0,-20(s0) + pllPostDivValue = CRG_GetPllPostDivValue((CRG_PllPostDiv)crg->PERI_CRG3.BIT.pll_postdiv1); + 300314a: fe842783 lw a5,-24(s0) + 300314e: 47dc lw a5,12(a5) + 3003150: 8bbd andi a5,a5,15 + 3003152: 9f81 uxtb a5 + 3003154: 853e mv a0,a5 + 3003156: 25c1 jal ra,3003816 + 3003158: fea42223 sw a0,-28(s0) + /* Calculate the PLL output clock frequency based on the VCO clock frequency and post-division coefficient. */ + if (pllPostDivValue != 0) { + 300315c: fe442783 lw a5,-28(s0) + 3003160: cb89 beqz a5,3003172 + freq /= pllPostDivValue; + 3003162: fec42703 lw a4,-20(s0) + 3003166: fe442783 lw a5,-28(s0) + 300316a: 02f757b3 divu a5,a4,a5 + 300316e: fef42623 sw a5,-20(s0) + } + return freq; + 3003172: fec42783 lw a5,-20(s0) +} + 3003176: 853e mv a0,a5 + 3003178: 40f2 lw ra,28(sp) + 300317a: 4462 lw s0,24(sp) + 300317c: 6105 addi sp,sp,32 + 300317e: 8082 ret + +03003180 : + * @brief Get Core Clock Frequence + * @param None + * @retval unsigned int Core clock frequency + */ +unsigned int HAL_CRG_GetCoreClkFreq(void) +{ + 3003180: 1101 addi sp,sp,-32 + 3003182: ce06 sw ra,28(sp) + 3003184: cc22 sw s0,24(sp) + 3003186: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int coreClkSelect; + CRG_RegStruct *crg = g_crgBaseAddr; + 3003188: 040007b7 lui a5,0x4000 + 300318c: 4947a783 lw a5,1172(a5) # 4000494 + 3003190: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003194: fe842703 lw a4,-24(s0) + 3003198: 100007b7 lui a5,0x10000 + 300319c: 00f70a63 beq a4,a5,30031b0 + 30031a0: 14c00593 li a1,332 + 30031a4: 030067b7 lui a5,0x3006 + 30031a8: 4f478513 addi a0,a5,1268 # 30064f4 + 30031ac: 3ead jal ra,3002d26 + 30031ae: a001 j 30031ae + coreClkSelect = crg->PERI_CRG64.BIT.clk_pst1_sw_sel; + 30031b0: fe842783 lw a5,-24(s0) + 30031b4: 1007a783 lw a5,256(a5) + 30031b8: 8b8d andi a5,a5,3 + 30031ba: 9f81 uxtb a5 + 30031bc: fef42223 sw a5,-28(s0) + switch (coreClkSelect) { + 30031c0: fe442783 lw a5,-28(s0) + 30031c4: 4705 li a4,1 + 30031c6: 02e78063 beq a5,a4,30031e6 + 30031ca: 4705 li a4,1 + 30031cc: 00e7e663 bltu a5,a4,30031d8 + 30031d0: 4709 li a4,2 + 30031d2: 02e78163 beq a5,a4,30031f4 + 30031d6: a01d j 30031fc + case CRG_CORE_CLK_SELECT_HOSC: /* The clock source is an internal high-speed clock. */ + freq = HOSC_FREQ; + 30031d8: 017d87b7 lui a5,0x17d8 + 30031dc: 84078793 addi a5,a5,-1984 # 17d7840 + 30031e0: fef42623 sw a5,-20(s0) + break; + 30031e4: a015 j 3003208 + + case CRG_CORE_CLK_SELECT_TCXO: /* The clock source is the external crystal oscillator clock. */ + freq = XTRAIL_FREQ; + 30031e6: 01c9c7b7 lui a5,0x1c9c + 30031ea: 38078793 addi a5,a5,896 # 1c9c380 + 30031ee: fef42623 sw a5,-20(s0) + break; + 30031f2: a819 j 3003208 + + case CRG_CORE_CLK_SELECT_PLL: /* The clock source is the PLL. */ + freq = HAL_CRG_GetPllFreq(); + 30031f4: 3705 jal ra,3003114 + 30031f6: fea42623 sw a0,-20(s0) + break; + 30031fa: a039 j 3003208 + + default: + freq = LOSC_FREQ; + 30031fc: 67a1 lui a5,0x8 + 30031fe: d0078793 addi a5,a5,-768 # 7d00 + 3003202: fef42623 sw a5,-20(s0) + break; + 3003206: 0001 nop + } + return freq; + 3003208: fec42783 lw a5,-20(s0) +} + 300320c: 853e mv a0,a5 + 300320e: 40f2 lw ra,28(sp) + 3003210: 4462 lw s0,24(sp) + 3003212: 6105 addi sp,sp,32 + 3003214: 8082 ret + +03003216 : + * @brief Get Clock Frequence + * @param handle CRG Handle + * @retval Frequece of IP + */ +unsigned int HAL_CRG_GetIpFreq(const void *baseAddress) +{ + 3003216: 7179 addi sp,sp,-48 + 3003218: d606 sw ra,44(sp) + 300321a: d422 sw s0,40(sp) + 300321c: 1800 addi s0,sp,48 + 300321e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3003222: fdc42783 lw a5,-36(s0) + 3003226: eb89 bnez a5,3003238 + 3003228: 16900593 li a1,361 + 300322c: 030067b7 lui a5,0x3006 + 3003230: 4f478513 addi a0,a5,1268 # 30064f4 + 3003234: 3ccd jal ra,3002d26 + 3003236: a001 j 3003236 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003238: 040007b7 lui a5,0x4000 + 300323c: 4947a703 lw a4,1172(a5) # 4000494 + 3003240: 100007b7 lui a5,0x10000 + 3003244: 00f70a63 beq a4,a5,3003258 + 3003248: 16a00593 li a1,362 + 300324c: 030067b7 lui a5,0x3006 + 3003250: 4f478513 addi a0,a5,1268 # 30064f4 + 3003254: 3cc9 jal ra,3002d26 + 3003256: a001 j 3003256 +#ifdef FPGA + /* Use this function to obtain the clock frequency during the FPGA phase. */ + return CHIP_GetIpFreqHz(baseAddress); +#else + unsigned int hclk = HAL_CRG_GetCoreClkFreq(); + 3003258: 3725 jal ra,3003180 + 300325a: fea42423 sw a0,-24(s0) + unsigned int freq = LOSC_FREQ; + 300325e: 67a1 lui a5,0x8 + 3003260: d0078793 addi a5,a5,-768 # 7d00 + 3003264: fef42623 sw a5,-20(s0) + unsigned int coreClkFreq; + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003268: fdc42503 lw a0,-36(s0) + 300326c: 2cc9 jal ra,300353e + 300326e: fea42223 sw a0,-28(s0) + if (p == NULL) { + 3003272: fe442783 lw a5,-28(s0) + 3003276: e781 bnez a5,300327e + return freq; + 3003278: fec42783 lw a5,-20(s0) + 300327c: a895 j 30032f0 + } + switch (p->type) { + 300327e: fe442783 lw a5,-28(s0) + 3003282: 43dc lw a5,4(a5) + 3003284: 4715 li a4,5 + 3003286: 04f76a63 bltu a4,a5,30032da + 300328a: 00279713 slli a4,a5,0x2 + 300328e: 030067b7 lui a5,0x3006 + 3003292: 53078793 addi a5,a5,1328 # 3006530 + 3003296: 97ba add a5,a5,a4 + 3003298: 439c lw a5,0(a5) + 300329a: 8782 jr a5 + case CRG_IP_NONE_CLK_SEL: + case CRG_IP_EFC: + case CRG_IP_ANA: + freq = hclk; /* Returns the internal high speed clock frequency. */ + 300329c: fe842783 lw a5,-24(s0) + 30032a0: fef42623 sw a5,-20(s0) + break; + 30032a4: a825 j 30032dc + + case CRG_IP_CAN: + freq = CRG_GetPllRefIni(g_crgBaseAddr->PERI_CRG0.BIT.pll_ref_cksel); + 30032a6: 040007b7 lui a5,0x4000 + 30032aa: 4947a783 lw a5,1172(a5) # 4000494 + 30032ae: 439c lw a5,0(a5) + 30032b0: 8b85 andi a5,a5,1 + 30032b2: 9f81 uxtb a5 + 30032b4: 853e mv a0,a5 + 30032b6: 21d9 jal ra,300377c + 30032b8: fea42623 sw a0,-20(s0) + break; + 30032bc: a005 j 30032dc + + case CRG_IP_ADC: + /* Get core clock frequence for calculating the ADC clock frequency. */ + coreClkFreq = HAL_CRG_GetCoreClkFreq(); + 30032be: 35c9 jal ra,3003180 + 30032c0: fea42023 sw a0,-32(s0) + freq = CRG_GetAdcIpFreq(p, CRG_GetVcoFreq(), coreClkFreq); + 30032c4: 3b75 jal ra,3003080 + 30032c6: 87aa mv a5,a0 + 30032c8: fe042603 lw a2,-32(s0) + 30032cc: 85be mv a1,a5 + 30032ce: fe442503 lw a0,-28(s0) + 30032d2: 2c85 jal ra,3003542 + 30032d4: fea42623 sw a0,-20(s0) + break; + 30032d8: a011 j 30032dc + + case CRG_IP_IWDG: /* The IWDG clock frequency is an internal low-speed clock. */ + default: + break; + 30032da: 0001 nop + } + if (freq == 0) { + 30032dc: fec42783 lw a5,-20(s0) + 30032e0: e791 bnez a5,30032ec + freq = LOSC_FREQ; + 30032e2: 67a1 lui a5,0x8 + 30032e4: d0078793 addi a5,a5,-768 # 7d00 + 30032e8: fef42623 sw a5,-20(s0) + } + return freq; + 30032ec: fec42783 lw a5,-20(s0) +#endif +} + 30032f0: 853e mv a0,a5 + 30032f2: 50b2 lw ra,44(sp) + 30032f4: 5422 lw s0,40(sp) + 30032f6: 6145 addi sp,sp,48 + 30032f8: 8082 ret + +030032fa : + * @param enable enable mask + * @retval BASE_STATUS_ERROR Can't find the Match or operation is not support + * @retval BASE_STATUS_OK Operation Success + */ +BASE_StatusType HAL_CRG_IpEnableSet(const void *baseAddress, unsigned int enable) +{ + 30032fa: 7179 addi sp,sp,-48 + 30032fc: d606 sw ra,44(sp) + 30032fe: d422 sw s0,40(sp) + 3003300: 1800 addi s0,sp,48 + 3003302: fca42e23 sw a0,-36(s0) + 3003306: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 300330a: fdc42783 lw a5,-36(s0) + 300330e: eb89 bnez a5,3003320 + 3003310: 19c00593 li a1,412 + 3003314: 030067b7 lui a5,0x3006 + 3003318: 4f478513 addi a0,a5,1268 # 30064f4 + 300331c: 3429 jal ra,3002d26 + 300331e: a001 j 300331e + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003320: 040007b7 lui a5,0x4000 + 3003324: 4947a703 lw a4,1172(a5) # 4000494 + 3003328: 100007b7 lui a5,0x10000 + 300332c: 00f70a63 beq a4,a5,3003340 + 3003330: 19d00593 li a1,413 + 3003334: 030067b7 lui a5,0x3006 + 3003338: 4f478513 addi a0,a5,1268 # 30064f4 + 300333c: 32ed jal ra,3002d26 + 300333e: a001 j 300333e + /* Check the validity of the input parameters. */ + CRG_PARAM_CHECK_WITH_RET((enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE), BASE_STATUS_ERROR); + 3003340: fd842703 lw a4,-40(s0) + 3003344: 4785 li a5,1 + 3003346: 00f70e63 beq a4,a5,3003362 + 300334a: fd842783 lw a5,-40(s0) + 300334e: cb91 beqz a5,3003362 + 3003350: 19f00593 li a1,415 + 3003354: 030067b7 lui a5,0x3006 + 3003358: 4f478513 addi a0,a5,1268 # 30064f4 + 300335c: 32e9 jal ra,3002d26 + 300335e: 4785 li a5,1 + 3003360: a0a5 j 30033c8 + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003362: fdc42503 lw a0,-36(s0) + 3003366: 2ae1 jal ra,300353e + 3003368: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 300336c: fec42783 lw a5,-20(s0) + 3003370: c799 beqz a5,300337e + 3003372: fec42783 lw a5,-20(s0) + 3003376: 43d8 lw a4,4(a5) + 3003378: 4795 li a5,5 + 300337a: 00e7f463 bgeu a5,a4,3003382 + return BASE_STATUS_ERROR; + 300337e: 4785 li a5,1 + 3003380: a0a1 j 30033c8 + } + if (g_ipClkProc[p->type].enableSet == NULL) { + 3003382: fec42783 lw a5,-20(s0) + 3003386: 43d4 lw a3,4(a5) + 3003388: 040007b7 lui a5,0x4000 + 300338c: 02478713 addi a4,a5,36 # 4000024 + 3003390: 02400793 li a5,36 + 3003394: 02f687b3 mul a5,a3,a5 + 3003398: 97ba add a5,a5,a4 + 300339a: 479c lw a5,8(a5) + 300339c: e399 bnez a5,30033a2 + return BASE_STATUS_ERROR; + 300339e: 4785 li a5,1 + 30033a0: a025 j 30033c8 + } + g_ipClkProc[p->type].enableSet(p, enable); + 30033a2: fec42783 lw a5,-20(s0) + 30033a6: 43d4 lw a3,4(a5) + 30033a8: 040007b7 lui a5,0x4000 + 30033ac: 02478713 addi a4,a5,36 # 4000024 + 30033b0: 02400793 li a5,36 + 30033b4: 02f687b3 mul a5,a3,a5 + 30033b8: 97ba add a5,a5,a4 + 30033ba: 479c lw a5,8(a5) + 30033bc: fd842583 lw a1,-40(s0) + 30033c0: fec42503 lw a0,-20(s0) + 30033c4: 9782 jalr a5 + return BASE_STATUS_OK; + 30033c6: 4781 li a5,0 +} + 30033c8: 853e mv a0,a5 + 30033ca: 50b2 lw ra,44(sp) + 30033cc: 5422 lw s0,40(sp) + 30033ce: 6145 addi sp,sp,48 + 30033d0: 8082 ret + +030033d2 : + * @param select clock select, @see CRG_APBLsClkSelect for ip in apb_ls_subsys or CRG_AdcClkSelect for adc + * @retval BASE_STATUS_OK success + * @retval BASE_STATUS_ERROR fail + */ +BASE_StatusType HAL_CRG_IpClkSelectSet(const void *baseAddress, unsigned int select) +{ + 30033d2: 7179 addi sp,sp,-48 + 30033d4: d606 sw ra,44(sp) + 30033d6: d422 sw s0,40(sp) + 30033d8: 1800 addi s0,sp,48 + 30033da: fca42e23 sw a0,-36(s0) + 30033de: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 30033e2: fdc42783 lw a5,-36(s0) + 30033e6: eb89 bnez a5,30033f8 + 30033e8: 1cd00593 li a1,461 + 30033ec: 030067b7 lui a5,0x3006 + 30033f0: 4f478513 addi a0,a5,1268 # 30064f4 + 30033f4: 2d8d jal ra,3003a66 + 30033f6: a001 j 30033f6 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30033f8: 040007b7 lui a5,0x4000 + 30033fc: 4947a703 lw a4,1172(a5) # 4000494 + 3003400: 100007b7 lui a5,0x10000 + 3003404: 00f70a63 beq a4,a5,3003418 + 3003408: 1ce00593 li a1,462 + 300340c: 030067b7 lui a5,0x3006 + 3003410: 4f478513 addi a0,a5,1268 # 30064f4 + 3003414: 2d89 jal ra,3003a66 + 3003416: a001 j 3003416 + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003418: fdc42503 lw a0,-36(s0) + 300341c: 220d jal ra,300353e + 300341e: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 3003422: fec42783 lw a5,-20(s0) + 3003426: c799 beqz a5,3003434 + 3003428: fec42783 lw a5,-20(s0) + 300342c: 43d8 lw a4,4(a5) + 300342e: 4795 li a5,5 + 3003430: 00e7f463 bgeu a5,a4,3003438 + return BASE_STATUS_ERROR; + 3003434: 4785 li a5,1 + 3003436: a0a1 j 300347e + } + if (g_ipClkProc[p->type].clkSelSet == NULL) { + 3003438: fec42783 lw a5,-20(s0) + 300343c: 43d4 lw a3,4(a5) + 300343e: 040007b7 lui a5,0x4000 + 3003442: 02478713 addi a4,a5,36 # 4000024 + 3003446: 02400793 li a5,36 + 300344a: 02f687b3 mul a5,a3,a5 + 300344e: 97ba add a5,a5,a4 + 3003450: 47dc lw a5,12(a5) + 3003452: e399 bnez a5,3003458 + return BASE_STATUS_ERROR; + 3003454: 4785 li a5,1 + 3003456: a025 j 300347e + } + g_ipClkProc[p->type].clkSelSet(p, select); /* Clock selection of the configuration module. */ + 3003458: fec42783 lw a5,-20(s0) + 300345c: 43d4 lw a3,4(a5) + 300345e: 040007b7 lui a5,0x4000 + 3003462: 02478713 addi a4,a5,36 # 4000024 + 3003466: 02400793 li a5,36 + 300346a: 02f687b3 mul a5,a3,a5 + 300346e: 97ba add a5,a5,a4 + 3003470: 47dc lw a5,12(a5) + 3003472: fd842583 lw a1,-40(s0) + 3003476: fec42503 lw a0,-20(s0) + 300347a: 9782 jalr a5 + return BASE_STATUS_OK; + 300347c: 4781 li a5,0 +} + 300347e: 853e mv a0,a5 + 3003480: 50b2 lw ra,44(sp) + 3003482: 5422 lw s0,40(sp) + 3003484: 6145 addi sp,sp,48 + 3003486: 8082 ret + +03003488 : + * @param div set div value + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Match Fail or Not support + */ +BASE_StatusType HAL_CRG_IpClkDivSet(const void *baseAddress, unsigned int div) +{ + 3003488: 7179 addi sp,sp,-48 + 300348a: d606 sw ra,44(sp) + 300348c: d422 sw s0,40(sp) + 300348e: 1800 addi s0,sp,48 + 3003490: fca42e23 sw a0,-36(s0) + 3003494: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3003498: fdc42783 lw a5,-36(s0) + 300349c: eb89 bnez a5,30034ae + 300349e: 22c00593 li a1,556 + 30034a2: 030067b7 lui a5,0x3006 + 30034a6: 4f478513 addi a0,a5,1268 # 30064f4 + 30034aa: 2b75 jal ra,3003a66 + 30034ac: a001 j 30034ac + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30034ae: 040007b7 lui a5,0x4000 + 30034b2: 4947a703 lw a4,1172(a5) # 4000494 + 30034b6: 100007b7 lui a5,0x10000 + 30034ba: 00f70a63 beq a4,a5,30034ce + 30034be: 22d00593 li a1,557 + 30034c2: 030067b7 lui a5,0x3006 + 30034c6: 4f478513 addi a0,a5,1268 # 30064f4 + 30034ca: 2b71 jal ra,3003a66 + 30034cc: a001 j 30034cc + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 30034ce: fdc42503 lw a0,-36(s0) + 30034d2: 20b5 jal ra,300353e + 30034d4: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 30034d8: fec42783 lw a5,-20(s0) + 30034dc: c799 beqz a5,30034ea + 30034de: fec42783 lw a5,-20(s0) + 30034e2: 43d8 lw a4,4(a5) + 30034e4: 4795 li a5,5 + 30034e6: 00e7f463 bgeu a5,a4,30034ee + return BASE_STATUS_ERROR; + 30034ea: 4785 li a5,1 + 30034ec: a0a1 j 3003534 + } + if (g_ipClkProc[p->type].clkDivSet == NULL) { + 30034ee: fec42783 lw a5,-20(s0) + 30034f2: 43d4 lw a3,4(a5) + 30034f4: 040007b7 lui a5,0x4000 + 30034f8: 02478713 addi a4,a5,36 # 4000024 + 30034fc: 02400793 li a5,36 + 3003500: 02f687b3 mul a5,a3,a5 + 3003504: 97ba add a5,a5,a4 + 3003506: 4b9c lw a5,16(a5) + 3003508: e399 bnez a5,300350e + return BASE_STATUS_ERROR; + 300350a: 4785 li a5,1 + 300350c: a025 j 3003534 + } + g_ipClkProc[p->type].clkDivSet(p, div); /* Configure the clock frequency divider of the module. */ + 300350e: fec42783 lw a5,-20(s0) + 3003512: 43d4 lw a3,4(a5) + 3003514: 040007b7 lui a5,0x4000 + 3003518: 02478713 addi a4,a5,36 # 4000024 + 300351c: 02400793 li a5,36 + 3003520: 02f687b3 mul a5,a3,a5 + 3003524: 97ba add a5,a5,a4 + 3003526: 4b9c lw a5,16(a5) + 3003528: fd842583 lw a1,-40(s0) + 300352c: fec42503 lw a0,-20(s0) + 3003530: 9782 jalr a5 + return BASE_STATUS_OK; + 3003532: 4781 li a5,0 +} + 3003534: 853e mv a0,a5 + 3003536: 50b2 lw ra,44(sp) + 3003538: 5422 lw s0,40(sp) + 300353a: 6145 addi sp,sp,48 + 300353c: 8082 ret + +0300353e : + 300353e: c6bfd06f j 30011a8 + +03003542 : + * @param coreClkFreq core clock rate + * @retval Ip Frequence + */ +static unsigned int CRG_GetAdcIpFreq(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int baseClkRate, + unsigned int coreClkFreq) +{ + 3003542: 7139 addi sp,sp,-64 + 3003544: de06 sw ra,60(sp) + 3003546: dc22 sw s0,56(sp) + 3003548: 0080 addi s0,sp,64 + 300354a: fca42623 sw a0,-52(s0) + 300354e: fcb42423 sw a1,-56(s0) + 3003552: fcc42223 sw a2,-60(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003556: fcc42783 lw a5,-52(s0) + 300355a: eb89 bnez a5,300356c + 300355c: 2af00593 li a1,687 + 3003560: 030067b7 lui a5,0x3006 + 3003564: 4f478513 addi a0,a5,1268 # 30064f4 + 3003568: 29fd jal ra,3003a66 + 300356a: a001 j 300356a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300356c: 040007b7 lui a5,0x4000 + 3003570: 4947a783 lw a5,1172(a5) # 4000494 + 3003574: eb89 bnez a5,3003586 + 3003576: 2b000593 li a1,688 + 300357a: 030067b7 lui a5,0x3006 + 300357e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003582: 21d5 jal ra,3003a66 + 3003584: a001 j 3003584 + + unsigned int clkSel; + unsigned int clkDiv; + unsigned int pst2Div; + unsigned int freq = 0; + 3003586: fe042623 sw zero,-20(s0) + + /* Obtains the clock source selection of the ADC. */ + const CRG_IpProc *proc = &g_ipClkProc[matchInfo->type]; + 300358a: fcc42783 lw a5,-52(s0) + 300358e: 43d8 lw a4,4(a5) + 3003590: 02400793 li a5,36 + 3003594: 02f70733 mul a4,a4,a5 + 3003598: 040007b7 lui a5,0x4000 + 300359c: 02478793 addi a5,a5,36 # 4000024 + 30035a0: 97ba add a5,a5,a4 + 30035a2: fef42423 sw a5,-24(s0) + if (proc->clkSelGet == NULL) { + 30035a6: fe842783 lw a5,-24(s0) + 30035aa: 4fdc lw a5,28(a5) + 30035ac: e399 bnez a5,30035b2 + return 0; + 30035ae: 4781 li a5,0 + 30035b0: a07d j 300365e + } + clkSel = proc->clkSelGet(matchInfo); + 30035b2: fe842783 lw a5,-24(s0) + 30035b6: 4fdc lw a5,28(a5) + 30035b8: fcc42503 lw a0,-52(s0) + 30035bc: 9782 jalr a5 + 30035be: fea42223 sw a0,-28(s0) + /* Calculate the frequency from the ADC's clock source. */ + if (clkSel == CRG_ADC_CLK_SYN_CORE) { + 30035c2: fe442703 lw a4,-28(s0) + 30035c6: 478d li a5,3 + 30035c8: 00f71763 bne a4,a5,30035d6 + freq = coreClkFreq; + 30035cc: fc442783 lw a5,-60(s0) + 30035d0: fef42623 sw a5,-20(s0) + 30035d4: a085 j 3003634 + } else if (clkSel == CRG_ADC_CLK_ASYN_HOSC) { + 30035d6: fe442783 lw a5,-28(s0) + 30035da: eb81 bnez a5,30035ea + freq = HOSC_FREQ; + 30035dc: 017d87b7 lui a5,0x17d8 + 30035e0: 84078793 addi a5,a5,-1984 # 17d7840 + 30035e4: fef42623 sw a5,-20(s0) + 30035e8: a0b1 j 3003634 + } else if (clkSel == CRG_ADC_CLK_ASYN_TCXO) { + 30035ea: fe442703 lw a4,-28(s0) + 30035ee: 4785 li a5,1 + 30035f0: 00f71963 bne a4,a5,3003602 + /* The maximum speed of the external clock source is 30000000U. */ + freq = (XTRAIL_FREQ > 30000000U) ? 0 : XTRAIL_FREQ; + 30035f4: 01c9c7b7 lui a5,0x1c9c + 30035f8: 38078793 addi a5,a5,896 # 1c9c380 + 30035fc: fef42623 sw a5,-20(s0) + 3003600: a815 j 3003634 + } else if (clkSel == CRG_ADC_CLK_ASYN_PLL_DIV) { + 3003602: fe442703 lw a4,-28(s0) + 3003606: 4789 li a5,2 + 3003608: 02f71663 bne a4,a5,3003634 + pst2Div = CRG_GetPllPostDivValue((CRG_PllPostDiv)g_crgBaseAddr->PERI_CRG3.BIT.pll_postdiv2); + 300360c: 040007b7 lui a5,0x4000 + 3003610: 4947a783 lw a5,1172(a5) # 4000494 + 3003614: 47dc lw a5,12(a5) + 3003616: 8391 srli a5,a5,0x4 + 3003618: 8bbd andi a5,a5,15 + 300361a: 9f81 uxtb a5 + 300361c: 853e mv a0,a5 + 300361e: 2ae5 jal ra,3003816 + 3003620: fea42023 sw a0,-32(s0) + freq = baseClkRate / pst2Div; + 3003624: fc842703 lw a4,-56(s0) + 3003628: fe042783 lw a5,-32(s0) + 300362c: 02f757b3 divu a5,a4,a5 + 3003630: fef42623 sw a5,-20(s0) + } + + /* Obtain the frequency divider based on the ADC clock source. */ + if (proc->clkDivGet == NULL) { + 3003634: fe842783 lw a5,-24(s0) + 3003638: 539c lw a5,32(a5) + 300363a: e399 bnez a5,3003640 + return 0; + 300363c: 4781 li a5,0 + 300363e: a005 j 300365e + } + clkDiv = proc->clkDivGet(matchInfo); + 3003640: fe842783 lw a5,-24(s0) + 3003644: 539c lw a5,32(a5) + 3003646: fcc42503 lw a0,-52(s0) + 300364a: 9782 jalr a5 + 300364c: fca42e23 sw a0,-36(s0) + /* Calculate the clock frequency of the ADC. */ + return (freq / (clkDiv + 1)); + 3003650: fdc42783 lw a5,-36(s0) + 3003654: 0785 addi a5,a5,1 + 3003656: fec42703 lw a4,-20(s0) + 300365a: 02f757b3 divu a5,a4,a5 +} + 300365e: 853e mv a0,a5 + 3003660: 50f2 lw ra,60(sp) + 3003662: 5462 lw s0,56(sp) + 3003664: 6121 addi sp,sp,64 + 3003666: 8082 ret + +03003668 : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValidPllConfig(const CRG_Handle *handle) +{ + 3003668: 7179 addi sp,sp,-48 + 300366a: d606 sw ra,44(sp) + 300366c: d422 sw s0,40(sp) + 300366e: 1800 addi s0,sp,48 + 3003670: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + unsigned int freq; + + freq = CRG_GetPllRefIni(handle->pllRefClkSelect); + 3003674: fdc42783 lw a5,-36(s0) + 3003678: 43dc lw a5,4(a5) + 300367a: 853e mv a0,a5 + 300367c: 2201 jal ra,300377c + 300367e: fea42623 sw a0,-20(s0) + preDiv = CRG_GetPreDivValue(handle->pllPreDiv); + 3003682: fdc42783 lw a5,-36(s0) + 3003686: 479c lw a5,8(a5) + 3003688: 853e mv a0,a5 + 300368a: 2a31 jal ra,30037a6 + 300368c: fea42423 sw a0,-24(s0) + /* Check the validity of the prescaled clock frequency. */ + if (!IsCrgValidPreDiv(freq, preDiv)) { + 3003690: fe842583 lw a1,-24(s0) + 3003694: fec42503 lw a0,-20(s0) + 3003698: c26ff0ef jal ra,3002abe + 300369c: 87aa mv a5,a0 + 300369e: 0017c793 xori a5,a5,1 + 30036a2: 9f81 uxtb a5 + 30036a4: c399 beqz a5,30036aa + return BASE_STATUS_ERROR; + 30036a6: 4785 li a5,1 + 30036a8: a8a5 j 3003720 + } + freq /= preDiv; + 30036aa: fec42703 lw a4,-20(s0) + 30036ae: fe842783 lw a5,-24(s0) + 30036b2: 02f757b3 divu a5,a4,a5 + 30036b6: fef42623 sw a5,-20(s0) + /* Check the validity of the clock frequency after frequency multiplication. */ + if (!IsCrgValidFdDiv(freq, handle->pllFbDiv)) { + 30036ba: fdc42783 lw a5,-36(s0) + 30036be: 47dc lw a5,12(a5) + 30036c0: 85be mv a1,a5 + 30036c2: fec42503 lw a0,-20(s0) + 30036c6: c56ff0ef jal ra,3002b1c + 30036ca: 87aa mv a5,a0 + 30036cc: 0017c793 xori a5,a5,1 + 30036d0: 9f81 uxtb a5 + 30036d2: c399 beqz a5,30036d8 + return BASE_STATUS_ERROR; + 30036d4: 4785 li a5,1 + 30036d6: a0a9 j 3003720 + } + freq *= (handle->pllFbDiv > 0x06) ? handle->pllFbDiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 30036d8: fdc42783 lw a5,-36(s0) + 30036dc: 47dc lw a5,12(a5) + 30036de: 4719 li a4,6 + 30036e0: 00e7f363 bgeu a5,a4,30036e6 + 30036e4: 4799 li a5,6 + 30036e6: fec42703 lw a4,-20(s0) + 30036ea: 02f707b3 mul a5,a4,a5 + 30036ee: fef42623 sw a5,-20(s0) + /* Check whether the PLL output frequency is valid. */ + if (IsCrgValidPostDiv(freq, handle->pllPostDiv) && IsCrgValidPostDiv2(freq, handle->handleEx.pllPostDiv2)) { + 30036f2: fdc42783 lw a5,-36(s0) + 30036f6: 4b9c lw a5,16(a5) + 30036f8: 85be mv a1,a5 + 30036fa: fec42503 lw a0,-20(s0) + 30036fe: ca8ff0ef jal ra,3002ba6 + 3003702: 87aa mv a5,a0 + 3003704: cf89 beqz a5,300371e + 3003706: fdc42783 lw a5,-36(s0) + 300370a: 4fdc lw a5,28(a5) + 300370c: 85be mv a1,a5 + 300370e: fec42503 lw a0,-20(s0) + 3003712: cdcff0ef jal ra,3002bee + 3003716: 87aa mv a5,a0 + 3003718: c399 beqz a5,300371e + return BASE_STATUS_OK; + 300371a: 4781 li a5,0 + 300371c: a011 j 3003720 + } + return BASE_STATUS_ERROR; + 300371e: 4785 li a5,1 +} + 3003720: 853e mv a0,a5 + 3003722: 50b2 lw ra,44(sp) + 3003724: 5422 lw s0,40(sp) + 3003726: 6145 addi sp,sp,48 + 3003728: 8082 ret + +0300372a : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValid1MHzConfig(const CRG_Handle *handle) +{ + 300372a: 7179 addi sp,sp,-48 + 300372c: d622 sw s0,44(sp) + 300372e: 1800 addi s0,sp,48 + 3003730: fca42e23 sw a0,-36(s0) + unsigned int freq; + /* Get the ref frequency of the 1 MHz clock. */ + freq = (handle->handleEx.clk1MSelect == CRG_1M_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003734: fdc42783 lw a5,-36(s0) + 3003738: 539c lw a5,32(a5) + 300373a: e791 bnez a5,3003746 + 300373c: 017d87b7 lui a5,0x17d8 + 3003740: 84078793 addi a5,a5,-1984 # 17d7840 + 3003744: a029 j 300374e + 3003746: 01c9c7b7 lui a5,0x1c9c + 300374a: 38078793 addi a5,a5,896 # 1c9c380 + 300374e: fef42623 sw a5,-20(s0) + /* Check whether the 1MHz output frequency is valid. */ + if ((freq / (handle->handleEx.clk1MDiv + 1)) == CRG_FREQ_1MHz) { + 3003752: fdc42783 lw a5,-36(s0) + 3003756: 53dc lw a5,36(a5) + 3003758: 0785 addi a5,a5,1 + 300375a: fec42703 lw a4,-20(s0) + 300375e: 02f75733 divu a4,a4,a5 + 3003762: 000f47b7 lui a5,0xf4 + 3003766: 24078793 addi a5,a5,576 # f4240 + 300376a: 00f71463 bne a4,a5,3003772 + return BASE_STATUS_OK; + 300376e: 4781 li a5,0 + 3003770: a011 j 3003774 + } + return BASE_STATUS_ERROR; + 3003772: 4785 li a5,1 +} + 3003774: 853e mv a0,a5 + 3003776: 5432 lw s0,44(sp) + 3003778: 6145 addi sp,sp,48 + 300377a: 8082 ret + +0300377c : + * @brief Get clock frequence + * @param crg CRG_RegStruct + * @retval The frequence fo clock + */ +static inline unsigned int CRG_GetPllRefIni(CRG_PllRefClkSelect pllRefClkSelect) +{ + 300377c: 1101 addi sp,sp,-32 + 300377e: ce22 sw s0,28(sp) + 3003780: 1000 addi s0,sp,32 + 3003782: fea42623 sw a0,-20(s0) + /* The maximum speed of the external clock source is 30000000U. */ + if (pllRefClkSelect == CRG_PLL_REF_CLK_SELECT_XTAL && XTRAIL_FREQ > 30000000U) { + return 0; + } + return (pllRefClkSelect == (unsigned int)CRG_PLL_REF_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003786: fec42783 lw a5,-20(s0) + 300378a: e791 bnez a5,3003796 + 300378c: 017d87b7 lui a5,0x17d8 + 3003790: 84078793 addi a5,a5,-1984 # 17d7840 + 3003794: a029 j 300379e + 3003796: 01c9c7b7 lui a5,0x1c9c + 300379a: 38078793 addi a5,a5,896 # 1c9c380 +} + 300379e: 853e mv a0,a5 + 30037a0: 4472 lw s0,28(sp) + 30037a2: 6105 addi sp,sp,32 + 30037a4: 8082 ret + +030037a6 : + * @brief Get previous division Value before PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPreDivValue(CRG_PllPreDiv pllPredDiv) +{ + 30037a6: 7179 addi sp,sp,-48 + 30037a8: d622 sw s0,44(sp) + 30037aa: 1800 addi s0,sp,48 + 30037ac: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + if (pllPredDiv <= CRG_PLL_PREDIV_1) { /* 0 or 1 returns PLL_PREDIV_OUT_1. */ + 30037b0: fdc42783 lw a5,-36(s0) + 30037b4: e789 bnez a5,30037be + preDiv = PLL_PREDIV_OUT_1; + 30037b6: 4785 li a5,1 + 30037b8: fef42623 sw a5,-20(s0) + 30037bc: a031 j 30037c8 + } else { + preDiv = pllPredDiv + 1; + 30037be: fdc42783 lw a5,-36(s0) + 30037c2: 0785 addi a5,a5,1 + 30037c4: fef42623 sw a5,-20(s0) + } + return preDiv; + 30037c8: fec42783 lw a5,-20(s0) +} + 30037cc: 853e mv a0,a5 + 30037ce: 5432 lw s0,44(sp) + 30037d0: 6145 addi sp,sp,48 + 30037d2: 8082 ret + +030037d4 : + * @brief Get PLL loop divider ratio + * @param crg CRG_RegStruct + * @retval PLL loop divider ratio + */ +static inline unsigned int CRG_GetPllFbDivValue(unsigned int pllFbDiv) +{ + 30037d4: 7179 addi sp,sp,-48 + 30037d6: d622 sw s0,44(sp) + 30037d8: 1800 addi s0,sp,48 + 30037da: fca42e23 sw a0,-36(s0) + unsigned int div = pllFbDiv; + 30037de: fdc42783 lw a5,-36(s0) + 30037e2: fef42623 sw a5,-20(s0) + /* Check the validity of the minimum frequency multiplication parameter. */ + if (div < CRG_PLL_FBDIV_MIN) { + 30037e6: fec42703 lw a4,-20(s0) + 30037ea: 4795 li a5,5 + 30037ec: 00e7e563 bltu a5,a4,30037f6 + div = CRG_PLL_FBDIV_MIN; + 30037f0: 4799 li a5,6 + 30037f2: fef42623 sw a5,-20(s0) + } + /* Check the validity of the maximum frequency multiplication parameter. */ + if (div > CRG_PLL_FBDIV_MAX) { + 30037f6: fec42703 lw a4,-20(s0) + 30037fa: 07f00793 li a5,127 + 30037fe: 00e7f663 bgeu a5,a4,300380a + div = CRG_PLL_FBDIV_MAX; + 3003802: 07f00793 li a5,127 + 3003806: fef42623 sw a5,-20(s0) + } + return div; + 300380a: fec42783 lw a5,-20(s0) +} + 300380e: 853e mv a0,a5 + 3003810: 5432 lw s0,44(sp) + 3003812: 6145 addi sp,sp,48 + 3003814: 8082 ret + +03003816 : + * @brief Get post division Value after PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPllPostDivValue(unsigned int pllPostDiv) +{ + 3003816: 7179 addi sp,sp,-48 + 3003818: d622 sw s0,44(sp) + 300381a: 1800 addi s0,sp,48 + 300381c: fca42e23 sw a0,-36(s0) + unsigned int div = pllPostDiv; + 3003820: fdc42783 lw a5,-36(s0) + 3003824: fef42623 sw a5,-20(s0) + if (div > CRG_PLL_POSTDIV_8) { + 3003828: fec42703 lw a4,-20(s0) + 300382c: 479d li a5,7 + 300382e: 00e7f663 bgeu a5,a4,300383a + div = (CRG_PLL_POSTDIV_8 + 1); /* If the postdiv is greater than 8, set this postdiv to 8. */ + 3003832: 47a1 li a5,8 + 3003834: fef42623 sw a5,-20(s0) + 3003838: a031 j 3003844 + } else { + div += 1; + 300383a: fec42783 lw a5,-20(s0) + 300383e: 0785 addi a5,a5,1 + 3003840: fef42623 sw a5,-20(s0) + } + return div; + 3003844: fec42783 lw a5,-20(s0) +} + 3003848: 853e mv a0,a5 + 300384a: 5432 lw s0,44(sp) + 300384c: 6145 addi sp,sp,48 + 300384e: 8082 ret + +03003850 : + * @param matchInfo IP without Clock select match info + * @param enable BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003850: 7179 addi sp,sp,-48 + 3003852: d606 sw ra,44(sp) + 3003854: d422 sw s0,40(sp) + 3003856: 1800 addi s0,sp,48 + 3003858: fca42e23 sw a0,-36(s0) + 300385c: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003860: fdc42783 lw a5,-36(s0) + 3003864: eb89 bnez a5,3003876 + 3003866: 34d00593 li a1,845 + 300386a: 030067b7 lui a5,0x3006 + 300386e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003872: 2ad5 jal ra,3003a66 + 3003874: a001 j 3003874 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003876: 040007b7 lui a5,0x4000 + 300387a: 4947a783 lw a5,1172(a5) # 4000494 + 300387e: eb89 bnez a5,3003890 + 3003880: 34e00593 li a1,846 + 3003884: 030067b7 lui a5,0x3006 + 3003888: 4f478513 addi a0,a5,1268 # 30064f4 + 300388c: 2ae9 jal ra,3003a66 + 300388e: a001 j 300388e + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003890: 040007b7 lui a5,0x4000 + 3003894: 4947a783 lw a5,1172(a5) # 4000494 + 3003898: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 300389c: fdc42783 lw a5,-36(s0) + 30038a0: 279e lhu a5,8(a5) + 30038a2: 873e mv a4,a5 + 30038a4: fec42783 lw a5,-20(s0) + 30038a8: 97ba add a5,a5,a4 + 30038aa: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 30038ae: fe842783 lw a5,-24(s0) + 30038b2: 439c lw a5,0(a5) + 30038b4: fef42223 sw a5,-28(s0) + if (enable & IP_CLK_ENABLE) { /* Set enable of target ip. */ + 30038b8: fd842783 lw a5,-40(s0) + 30038bc: 8b85 andi a5,a5,1 + 30038be: c7c1 beqz a5,3003946 + cfg.BIT.clkEnMask |= 1 << matchInfo->bitOffset; + 30038c0: fe442783 lw a5,-28(s0) + 30038c4: 9fa1 uxth a5 + 30038c6: 01079713 slli a4,a5,0x10 + 30038ca: 8741 srai a4,a4,0x10 + 30038cc: fdc42783 lw a5,-36(s0) + 30038d0: 27bc lbu a5,10(a5) + 30038d2: 86be mv a3,a5 + 30038d4: 4785 li a5,1 + 30038d6: 00d797b3 sll a5,a5,a3 + 30038da: 07c2 slli a5,a5,0x10 + 30038dc: 87c1 srai a5,a5,0x10 + 30038de: 8fd9 or a5,a5,a4 + 30038e0: 07c2 slli a5,a5,0x10 + 30038e2: 87c1 srai a5,a5,0x10 + 30038e4: 01079693 slli a3,a5,0x10 + 30038e8: 82c1 srli a3,a3,0x10 + 30038ea: fe442783 lw a5,-28(s0) + 30038ee: 6741 lui a4,0x10 + 30038f0: 177d addi a4,a4,-1 # ffff + 30038f2: 8f75 and a4,a4,a3 + 30038f4: 76c1 lui a3,0xffff0 + 30038f6: 8ff5 and a5,a5,a3 + 30038f8: 8fd9 or a5,a5,a4 + 30038fa: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); + 30038fe: fe442783 lw a5,-28(s0) + 3003902: 83c1 srli a5,a5,0x10 + 3003904: 9fa1 uxth a5 + 3003906: 01079713 slli a4,a5,0x10 + 300390a: 8741 srai a4,a4,0x10 + 300390c: fdc42783 lw a5,-36(s0) + 3003910: 27bc lbu a5,10(a5) + 3003912: 86be mv a3,a5 + 3003914: 4785 li a5,1 + 3003916: 00d797b3 sll a5,a5,a3 + 300391a: 07c2 slli a5,a5,0x10 + 300391c: 87c1 srai a5,a5,0x10 + 300391e: fff7c793 not a5,a5 + 3003922: 07c2 slli a5,a5,0x10 + 3003924: 87c1 srai a5,a5,0x10 + 3003926: 8ff9 and a5,a5,a4 + 3003928: 07c2 slli a5,a5,0x10 + 300392a: 87c1 srai a5,a5,0x10 + 300392c: 01079713 slli a4,a5,0x10 + 3003930: 8341 srli a4,a4,0x10 + 3003932: fe442783 lw a5,-28(s0) + 3003936: 0742 slli a4,a4,0x10 + 3003938: 66c1 lui a3,0x10 + 300393a: 16fd addi a3,a3,-1 # ffff + 300393c: 8ff5 and a5,a5,a3 + 300393e: 8fd9 or a5,a5,a4 + 3003940: fef42223 sw a5,-28(s0) + 3003944: a059 j 30039ca + } else { + cfg.BIT.clkEnMask &= ~(1 << matchInfo->bitOffset); /* Disable of target ip. */ + 3003946: fe442783 lw a5,-28(s0) + 300394a: 9fa1 uxth a5 + 300394c: 01079713 slli a4,a5,0x10 + 3003950: 8741 srai a4,a4,0x10 + 3003952: fdc42783 lw a5,-36(s0) + 3003956: 27bc lbu a5,10(a5) + 3003958: 86be mv a3,a5 + 300395a: 4785 li a5,1 + 300395c: 00d797b3 sll a5,a5,a3 + 3003960: 07c2 slli a5,a5,0x10 + 3003962: 87c1 srai a5,a5,0x10 + 3003964: fff7c793 not a5,a5 + 3003968: 07c2 slli a5,a5,0x10 + 300396a: 87c1 srai a5,a5,0x10 + 300396c: 8ff9 and a5,a5,a4 + 300396e: 07c2 slli a5,a5,0x10 + 3003970: 87c1 srai a5,a5,0x10 + 3003972: 01079693 slli a3,a5,0x10 + 3003976: 82c1 srli a3,a3,0x10 + 3003978: fe442783 lw a5,-28(s0) + 300397c: 6741 lui a4,0x10 + 300397e: 177d addi a4,a4,-1 # ffff + 3003980: 8f75 and a4,a4,a3 + 3003982: 76c1 lui a3,0xffff0 + 3003984: 8ff5 and a5,a5,a3 + 3003986: 8fd9 or a5,a5,a4 + 3003988: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq |= (1 << matchInfo->bitOffset); + 300398c: fe442783 lw a5,-28(s0) + 3003990: 83c1 srli a5,a5,0x10 + 3003992: 9fa1 uxth a5 + 3003994: 01079713 slli a4,a5,0x10 + 3003998: 8741 srai a4,a4,0x10 + 300399a: fdc42783 lw a5,-36(s0) + 300399e: 27bc lbu a5,10(a5) + 30039a0: 86be mv a3,a5 + 30039a2: 4785 li a5,1 + 30039a4: 00d797b3 sll a5,a5,a3 + 30039a8: 07c2 slli a5,a5,0x10 + 30039aa: 87c1 srai a5,a5,0x10 + 30039ac: 8fd9 or a5,a5,a4 + 30039ae: 07c2 slli a5,a5,0x10 + 30039b0: 87c1 srai a5,a5,0x10 + 30039b2: 01079713 slli a4,a5,0x10 + 30039b6: 8341 srli a4,a4,0x10 + 30039b8: fe442783 lw a5,-28(s0) + 30039bc: 0742 slli a4,a4,0x10 + 30039be: 66c1 lui a3,0x10 + 30039c0: 16fd addi a3,a3,-1 # ffff + 30039c2: 8ff5 and a5,a5,a3 + 30039c4: 8fd9 or a5,a5,a4 + 30039c6: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 30039ca: fe442703 lw a4,-28(s0) + 30039ce: fe842783 lw a5,-24(s0) + 30039d2: c398 sw a4,0(a5) +} + 30039d4: 0001 nop + 30039d6: 50b2 lw ra,44(sp) + 30039d8: 5422 lw s0,40(sp) + 30039da: 6145 addi sp,sp,48 + 30039dc: 8082 ret + +030039de : + * @brief Get Enable status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock Enable status + */ +static unsigned int CRG_IpWoClkSelEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30039de: 7179 addi sp,sp,-48 + 30039e0: d606 sw ra,44(sp) + 30039e2: d422 sw s0,40(sp) + 30039e4: 1800 addi s0,sp,48 + 30039e6: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30039ea: fdc42783 lw a5,-36(s0) + 30039ee: eb89 bnez a5,3003a00 + 30039f0: 36500593 li a1,869 + 30039f4: 030067b7 lui a5,0x3006 + 30039f8: 4f478513 addi a0,a5,1268 # 30064f4 + 30039fc: 20ad jal ra,3003a66 + 30039fe: a001 j 30039fe + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003a00: 040007b7 lui a5,0x4000 + 3003a04: 4947a783 lw a5,1172(a5) # 4000494 + 3003a08: eb89 bnez a5,3003a1a + 3003a0a: 36600593 li a1,870 + 3003a0e: 030067b7 lui a5,0x3006 + 3003a12: 4f478513 addi a0,a5,1268 # 30064f4 + 3003a16: 2881 jal ra,3003a66 + 3003a18: a001 j 3003a18 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003a1a: 040007b7 lui a5,0x4000 + 3003a1e: 4947a783 lw a5,1172(a5) # 4000494 + 3003a22: fef42623 sw a5,-20(s0) + /* Get enable status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003a26: fdc42783 lw a5,-36(s0) + 3003a2a: 279e lhu a5,8(a5) + 3003a2c: 873e mv a4,a5 + 3003a2e: fec42783 lw a5,-20(s0) + 3003a32: 97ba add a5,a5,a4 + 3003a34: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + + cfg.value = p->value; + 3003a38: fe842783 lw a5,-24(s0) + 3003a3c: 439c lw a5,0(a5) + 3003a3e: fef42223 sw a5,-28(s0) + return (cfg.BIT.clkEnMask & (1 << matchInfo->bitOffset)) == 0 ? false : true; + 3003a42: fe442783 lw a5,-28(s0) + 3003a46: 9fa1 uxth a5 + 3003a48: 873e mv a4,a5 + 3003a4a: fdc42783 lw a5,-36(s0) + 3003a4e: 27bc lbu a5,10(a5) + 3003a50: 40f757b3 sra a5,a4,a5 + 3003a54: 8b85 andi a5,a5,1 + 3003a56: 00f037b3 snez a5,a5 + 3003a5a: 9f81 uxtb a5 +} + 3003a5c: 853e mv a0,a5 + 3003a5e: 50b2 lw ra,44(sp) + 3003a60: 5422 lw s0,40(sp) + 3003a62: 6145 addi sp,sp,48 + 3003a64: 8082 ret + +03003a66 : + 3003a66: c48fe06f j 3001eae + +03003a6a : + * @param matchInfo IP without Clock select match info + * @param reset BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelResetSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int reset) +{ + 3003a6a: 7179 addi sp,sp,-48 + 3003a6c: d606 sw ra,44(sp) + 3003a6e: d422 sw s0,40(sp) + 3003a70: 1800 addi s0,sp,48 + 3003a72: fca42e23 sw a0,-36(s0) + 3003a76: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003a7a: fdc42783 lw a5,-36(s0) + 3003a7e: eb89 bnez a5,3003a90 + 3003a80: 37900593 li a1,889 + 3003a84: 030067b7 lui a5,0x3006 + 3003a88: 4f478513 addi a0,a5,1268 # 30064f4 + 3003a8c: 3fe9 jal ra,3003a66 + 3003a8e: a001 j 3003a8e + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003a90: 040007b7 lui a5,0x4000 + 3003a94: 4947a783 lw a5,1172(a5) # 4000494 + 3003a98: eb89 bnez a5,3003aaa + 3003a9a: 37a00593 li a1,890 + 3003a9e: 030067b7 lui a5,0x3006 + 3003aa2: 4f478513 addi a0,a5,1268 # 30064f4 + 3003aa6: 37c1 jal ra,3003a66 + 3003aa8: a001 j 3003aa8 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003aaa: 040007b7 lui a5,0x4000 + 3003aae: 4947a783 lw a5,1172(a5) # 4000494 + 3003ab2: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003ab6: fdc42783 lw a5,-36(s0) + 3003aba: 279e lhu a5,8(a5) + 3003abc: 873e mv a4,a5 + 3003abe: fec42783 lw a5,-20(s0) + 3003ac2: 97ba add a5,a5,a4 + 3003ac4: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003ac8: fe842783 lw a5,-24(s0) + 3003acc: 439c lw a5,0(a5) + 3003ace: fef42223 sw a5,-28(s0) + if (reset & BASE_CFG_SET) { + 3003ad2: fd842783 lw a5,-40(s0) + 3003ad6: 8b85 andi a5,a5,1 + 3003ad8: c3a9 beqz a5,3003b1a + cfg.BIT.softResetReq |= 1 << matchInfo->bitOffset; /* reset of target ip. */ + 3003ada: fe442783 lw a5,-28(s0) + 3003ade: 83c1 srli a5,a5,0x10 + 3003ae0: 9fa1 uxth a5 + 3003ae2: 01079713 slli a4,a5,0x10 + 3003ae6: 8741 srai a4,a4,0x10 + 3003ae8: fdc42783 lw a5,-36(s0) + 3003aec: 27bc lbu a5,10(a5) + 3003aee: 86be mv a3,a5 + 3003af0: 4785 li a5,1 + 3003af2: 00d797b3 sll a5,a5,a3 + 3003af6: 07c2 slli a5,a5,0x10 + 3003af8: 87c1 srai a5,a5,0x10 + 3003afa: 8fd9 or a5,a5,a4 + 3003afc: 07c2 slli a5,a5,0x10 + 3003afe: 87c1 srai a5,a5,0x10 + 3003b00: 01079713 slli a4,a5,0x10 + 3003b04: 8341 srli a4,a4,0x10 + 3003b06: fe442783 lw a5,-28(s0) + 3003b0a: 0742 slli a4,a4,0x10 + 3003b0c: 66c1 lui a3,0x10 + 3003b0e: 16fd addi a3,a3,-1 # ffff + 3003b10: 8ff5 and a5,a5,a3 + 3003b12: 8fd9 or a5,a5,a4 + 3003b14: fef42223 sw a5,-28(s0) + 3003b18: a0a1 j 3003b60 + } else { + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); /* Undo reset of target ip. */ + 3003b1a: fe442783 lw a5,-28(s0) + 3003b1e: 83c1 srli a5,a5,0x10 + 3003b20: 9fa1 uxth a5 + 3003b22: 01079713 slli a4,a5,0x10 + 3003b26: 8741 srai a4,a4,0x10 + 3003b28: fdc42783 lw a5,-36(s0) + 3003b2c: 27bc lbu a5,10(a5) + 3003b2e: 86be mv a3,a5 + 3003b30: 4785 li a5,1 + 3003b32: 00d797b3 sll a5,a5,a3 + 3003b36: 07c2 slli a5,a5,0x10 + 3003b38: 87c1 srai a5,a5,0x10 + 3003b3a: fff7c793 not a5,a5 + 3003b3e: 07c2 slli a5,a5,0x10 + 3003b40: 87c1 srai a5,a5,0x10 + 3003b42: 8ff9 and a5,a5,a4 + 3003b44: 07c2 slli a5,a5,0x10 + 3003b46: 87c1 srai a5,a5,0x10 + 3003b48: 01079713 slli a4,a5,0x10 + 3003b4c: 8341 srli a4,a4,0x10 + 3003b4e: fe442783 lw a5,-28(s0) + 3003b52: 0742 slli a4,a4,0x10 + 3003b54: 66c1 lui a3,0x10 + 3003b56: 16fd addi a3,a3,-1 # ffff + 3003b58: 8ff5 and a5,a5,a3 + 3003b5a: 8fd9 or a5,a5,a4 + 3003b5c: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3003b60: fe442703 lw a4,-28(s0) + 3003b64: fe842783 lw a5,-24(s0) + 3003b68: c398 sw a4,0(a5) +} + 3003b6a: 0001 nop + 3003b6c: 50b2 lw ra,44(sp) + 3003b6e: 5422 lw s0,40(sp) + 3003b70: 6145 addi sp,sp,48 + 3003b72: 8082 ret + +03003b74 : + * @brief Get Reset status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock select reset status + */ +static unsigned int CRG_IpWoClkSelResetGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003b74: 7179 addi sp,sp,-48 + 3003b76: d606 sw ra,44(sp) + 3003b78: d422 sw s0,40(sp) + 3003b7a: 1800 addi s0,sp,48 + 3003b7c: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003b80: fdc42783 lw a5,-36(s0) + 3003b84: eb89 bnez a5,3003b96 + 3003b86: 38f00593 li a1,911 + 3003b8a: 030067b7 lui a5,0x3006 + 3003b8e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003b92: 3dd1 jal ra,3003a66 + 3003b94: a001 j 3003b94 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003b96: 040007b7 lui a5,0x4000 + 3003b9a: 4947a783 lw a5,1172(a5) # 4000494 + 3003b9e: eb89 bnez a5,3003bb0 + 3003ba0: 39000593 li a1,912 + 3003ba4: 030067b7 lui a5,0x3006 + 3003ba8: 4f478513 addi a0,a5,1268 # 30064f4 + 3003bac: 3d6d jal ra,3003a66 + 3003bae: a001 j 3003bae + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003bb0: 040007b7 lui a5,0x4000 + 3003bb4: 4947a783 lw a5,1172(a5) # 4000494 + 3003bb8: fef42623 sw a5,-20(s0) + /* Get the reset status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003bbc: fdc42783 lw a5,-36(s0) + 3003bc0: 279e lhu a5,8(a5) + 3003bc2: 873e mv a4,a5 + 3003bc4: fec42783 lw a5,-20(s0) + 3003bc8: 97ba add a5,a5,a4 + 3003bca: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003bce: fe842783 lw a5,-24(s0) + 3003bd2: 439c lw a5,0(a5) + 3003bd4: fef42223 sw a5,-28(s0) + return (cfg.BIT.softResetReq & (1 << matchInfo->bitOffset)) ? BASE_CFG_SET : BASE_CFG_UNSET; + 3003bd8: fe442783 lw a5,-28(s0) + 3003bdc: 83c1 srli a5,a5,0x10 + 3003bde: 9fa1 uxth a5 + 3003be0: 873e mv a4,a5 + 3003be2: fdc42783 lw a5,-36(s0) + 3003be6: 27bc lbu a5,10(a5) + 3003be8: 40f757b3 sra a5,a4,a5 + 3003bec: 8b85 andi a5,a5,1 + 3003bee: 00f037b3 snez a5,a5 + 3003bf2: 9f81 uxtb a5 +} + 3003bf4: 853e mv a0,a5 + 3003bf6: 50b2 lw ra,44(sp) + 3003bf8: 5422 lw s0,40(sp) + 3003bfa: 6145 addi sp,sp,48 + 3003bfc: 8082 ret + +03003bfe : + * @param matchInfo ADC match info + * @param enable IP_CLK_ENABLE + * @retval None + */ +static void CRG_AdcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003bfe: 7179 addi sp,sp,-48 + 3003c00: d606 sw ra,44(sp) + 3003c02: d422 sw s0,40(sp) + 3003c04: 1800 addi s0,sp,48 + 3003c06: fca42e23 sw a0,-36(s0) + 3003c0a: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003c0e: fdc42783 lw a5,-36(s0) + 3003c12: eb89 bnez a5,3003c24 + 3003c14: 3a200593 li a1,930 + 3003c18: 030067b7 lui a5,0x3006 + 3003c1c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003c20: 3599 jal ra,3003a66 + 3003c22: a001 j 3003c22 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003c24: 040007b7 lui a5,0x4000 + 3003c28: 4947a783 lw a5,1172(a5) # 4000494 + 3003c2c: eb89 bnez a5,3003c3e + 3003c2e: 3a300593 li a1,931 + 3003c32: 030067b7 lui a5,0x3006 + 3003c36: 4f478513 addi a0,a5,1268 # 30064f4 + 3003c3a: 3535 jal ra,3003a66 + 3003c3c: a001 j 3003c3c + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003c3e: 040007b7 lui a5,0x4000 + 3003c42: 4947a783 lw a5,1172(a5) # 4000494 + 3003c46: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003c4a: fdc42783 lw a5,-36(s0) + 3003c4e: 279e lhu a5,8(a5) + 3003c50: 873e mv a4,a5 + 3003c52: fec42783 lw a5,-20(s0) + 3003c56: 97ba add a5,a5,a4 + 3003c58: fef42423 sw a5,-24(s0) + CRG_AdcIpCfg cfg; + cfg.value[1] = p->value[1]; + 3003c5c: fe842783 lw a5,-24(s0) + 3003c60: 43dc lw a5,4(a5) + 3003c62: fef42223 sw a5,-28(s0) + if (enable) { /* Enables and Deassert reset the ADC clock. */ + 3003c66: fd842783 lw a5,-40(s0) + 3003c6a: cf99 beqz a5,3003c88 + cfg.BIT.clk_adc_cken = BASE_CFG_SET; + 3003c6c: fe442783 lw a5,-28(s0) + 3003c70: 0017e793 ori a5,a5,1 + 3003c74: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003c78: fe442783 lw a5,-28(s0) + 3003c7c: 7741 lui a4,0xffff0 + 3003c7e: 177d addi a4,a4,-1 # fffeffff + 3003c80: 8ff9 and a5,a5,a4 + 3003c82: fef42223 sw a5,-28(s0) + 3003c86: a829 j 3003ca0 + } else { /* Disable and reset the ADC clock. */ + cfg.BIT.clk_adc_cken = BASE_CFG_UNSET; + 3003c88: fe442783 lw a5,-28(s0) + 3003c8c: 9bf9 andi a5,a5,-2 + 3003c8e: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003c92: fe442783 lw a5,-28(s0) + 3003c96: 7741 lui a4,0xffff0 + 3003c98: 177d addi a4,a4,-1 # fffeffff + 3003c9a: 8ff9 and a5,a5,a4 + 3003c9c: fef42223 sw a5,-28(s0) + } + p->value[1] = cfg.value[1]; + 3003ca0: fe442703 lw a4,-28(s0) + 3003ca4: fe842783 lw a5,-24(s0) + 3003ca8: c3d8 sw a4,4(a5) +} + 3003caa: 0001 nop + 3003cac: 50b2 lw ra,44(sp) + 3003cae: 5422 lw s0,40(sp) + 3003cb0: 6145 addi sp,sp,48 + 3003cb2: 8082 ret + +03003cb4 : + * @brief Get Enable status of ADC + * @param matchInfo ADC match info + * @retval Cken of ADC + */ +static unsigned int CRG_AdcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003cb4: 7179 addi sp,sp,-48 + 3003cb6: d606 sw ra,44(sp) + 3003cb8: d422 sw s0,40(sp) + 3003cba: 1800 addi s0,sp,48 + 3003cbc: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003cc0: fdc42783 lw a5,-36(s0) + 3003cc4: eb89 bnez a5,3003cd6 + 3003cc6: 3ba00593 li a1,954 + 3003cca: 030067b7 lui a5,0x3006 + 3003cce: 4f478513 addi a0,a5,1268 # 30064f4 + 3003cd2: 3b51 jal ra,3003a66 + 3003cd4: a001 j 3003cd4 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003cd6: 040007b7 lui a5,0x4000 + 3003cda: 4947a783 lw a5,1172(a5) # 4000494 + 3003cde: eb89 bnez a5,3003cf0 + 3003ce0: 3bb00593 li a1,955 + 3003ce4: 030067b7 lui a5,0x3006 + 3003ce8: 4f478513 addi a0,a5,1268 # 30064f4 + 3003cec: 3bad jal ra,3003a66 + 3003cee: a001 j 3003cee + unsigned int enable; + /* Get the enable status of the ADC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003cf0: 040007b7 lui a5,0x4000 + 3003cf4: 4947a783 lw a5,1172(a5) # 4000494 + 3003cf8: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003cfc: fdc42783 lw a5,-36(s0) + 3003d00: 279e lhu a5,8(a5) + 3003d02: 873e mv a4,a5 + 3003d04: fec42783 lw a5,-20(s0) + 3003d08: 97ba add a5,a5,a4 + 3003d0a: fef42423 sw a5,-24(s0) + enable = ((p->BIT.clk_adc_cken != 0)) ? IP_CLK_ENABLE : IP_CLK_DISABLE; + 3003d0e: fe842783 lw a5,-24(s0) + 3003d12: 43dc lw a5,4(a5) + 3003d14: 8b85 andi a5,a5,1 + 3003d16: 9f81 uxtb a5 + 3003d18: c399 beqz a5,3003d1e + 3003d1a: 4785 li a5,1 + 3003d1c: a011 j 3003d20 + 3003d1e: 4781 li a5,0 + 3003d20: fef42223 sw a5,-28(s0) + return enable; + 3003d24: fe442783 lw a5,-28(s0) +} + 3003d28: 853e mv a0,a5 + 3003d2a: 50b2 lw ra,44(sp) + 3003d2c: 5422 lw s0,40(sp) + 3003d2e: 6145 addi sp,sp,48 + 3003d30: 8082 ret + +03003d32 : + * @param matchInfo ADC match info + * @param clkSelect @see CRG_AdcClkSelect + * @retval None + */ +static void CRG_AdcClkSelectSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int clkSelect) +{ + 3003d32: 7179 addi sp,sp,-48 + 3003d34: d606 sw ra,44(sp) + 3003d36: d422 sw s0,40(sp) + 3003d38: 1800 addi s0,sp,48 + 3003d3a: fca42e23 sw a0,-36(s0) + 3003d3e: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003d42: fdc42783 lw a5,-36(s0) + 3003d46: eb89 bnez a5,3003d58 + 3003d48: 3cc00593 li a1,972 + 3003d4c: 030067b7 lui a5,0x3006 + 3003d50: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d54: 3b09 jal ra,3003a66 + 3003d56: a001 j 3003d56 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003d58: 040007b7 lui a5,0x4000 + 3003d5c: 4947a783 lw a5,1172(a5) # 4000494 + 3003d60: eb89 bnez a5,3003d72 + 3003d62: 3cd00593 li a1,973 + 3003d66: 030067b7 lui a5,0x3006 + 3003d6a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d6e: 39e5 jal ra,3003a66 + 3003d70: a001 j 3003d70 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003d72: 040007b7 lui a5,0x4000 + 3003d76: 4947a703 lw a4,1172(a5) # 4000494 + 3003d7a: 100007b7 lui a5,0x10000 + 3003d7e: 00f70a63 beq a4,a5,3003d92 + 3003d82: 3ce00593 li a1,974 + 3003d86: 030067b7 lui a5,0x3006 + 3003d8a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d8e: 39e1 jal ra,3003a66 + 3003d90: a001 j 3003d90 + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkModeSelect(clkSelect)); + 3003d92: fd842503 lw a0,-40(s0) + 3003d96: ea1fe0ef jal ra,3002c36 + 3003d9a: 87aa mv a5,a0 + 3003d9c: 0017c793 xori a5,a5,1 + 3003da0: 9f81 uxtb a5 + 3003da2: cb89 beqz a5,3003db4 + 3003da4: 3cf00593 li a1,975 + 3003da8: 030067b7 lui a5,0x3006 + 3003dac: 4f478513 addi a0,a5,1268 # 30064f4 + 3003db0: 395d jal ra,3003a66 + 3003db2: a89d j 3003e28 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003db4: 040007b7 lui a5,0x4000 + 3003db8: 4947a783 lw a5,1172(a5) # 4000494 + 3003dbc: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003dc0: fdc42783 lw a5,-36(s0) + 3003dc4: 279e lhu a5,8(a5) + 3003dc6: 873e mv a4,a5 + 3003dc8: fec42783 lw a5,-20(s0) + 3003dcc: 97ba add a5,a5,a4 + 3003dce: fef42423 sw a5,-24(s0) + if (clkSelect == CRG_ADC_CLK_SYN_CORE) { + 3003dd2: fd842703 lw a4,-40(s0) + 3003dd6: 478d li a5,3 + 3003dd8: 00f71a63 bne a4,a5,3003dec + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_SET; /* use sync clock */ + 3003ddc: fe842703 lw a4,-24(s0) + 3003de0: 435c lw a5,4(a4) + 3003de2: 010006b7 lui a3,0x1000 + 3003de6: 8fd5 or a5,a5,a3 + 3003de8: c35c sw a5,4(a4) + 3003dea: a83d j 3003e28 + } else { + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3003dec: b67fe0ef jal ra,3002952 + g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel = clkSelect; /* write clock selection */ + 3003df0: 040007b7 lui a5,0x4000 + 3003df4: 4947a703 lw a4,1172(a5) # 4000494 + 3003df8: fd842783 lw a5,-40(s0) + 3003dfc: 8b8d andi a5,a5,3 + 3003dfe: 0ff7f693 andi a3,a5,255 + 3003e02: 10072783 lw a5,256(a4) + 3003e06: 8a8d andi a3,a3,3 + 3003e08: 0692 slli a3,a3,0x4 + 3003e0a: fcf7f793 andi a5,a5,-49 + 3003e0e: 8fd5 or a5,a5,a3 + 3003e10: 10f72023 sw a5,256(a4) + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3003e14: b67fe0ef jal ra,300297a + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_UNSET; + 3003e18: fe842703 lw a4,-24(s0) + 3003e1c: 435c lw a5,4(a4) + 3003e1e: ff0006b7 lui a3,0xff000 + 3003e22: 16fd addi a3,a3,-1 # feffffff + 3003e24: 8ff5 and a5,a5,a3 + 3003e26: c35c sw a5,4(a4) + } +} + 3003e28: 50b2 lw ra,44(sp) + 3003e2a: 5422 lw s0,40(sp) + 3003e2c: 6145 addi sp,sp,48 + 3003e2e: 8082 ret + +03003e30 : + * @brief Get ADC Clock Select + * @param matchInfo ADC match info + * @retval Adc Clock select @see CRG_AdcClkSelect + */ +static unsigned int CRG_AdcClkSelectGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003e30: 7179 addi sp,sp,-48 + 3003e32: d606 sw ra,44(sp) + 3003e34: d422 sw s0,40(sp) + 3003e36: 1800 addi s0,sp,48 + 3003e38: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003e3c: fdc42783 lw a5,-36(s0) + 3003e40: eb89 bnez a5,3003e52 + 3003e42: 3e400593 li a1,996 + 3003e46: 030067b7 lui a5,0x3006 + 3003e4a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003e4e: 3921 jal ra,3003a66 + 3003e50: a001 j 3003e50 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003e52: 040007b7 lui a5,0x4000 + 3003e56: 4947a783 lw a5,1172(a5) # 4000494 + 3003e5a: eb89 bnez a5,3003e6c + 3003e5c: 3e500593 li a1,997 + 3003e60: 030067b7 lui a5,0x3006 + 3003e64: 4f478513 addi a0,a5,1268 # 30064f4 + 3003e68: 3efd jal ra,3003a66 + 3003e6a: a001 j 3003e6a + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003e6c: 040007b7 lui a5,0x4000 + 3003e70: 4947a783 lw a5,1172(a5) # 4000494 + 3003e74: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003e78: fdc42783 lw a5,-36(s0) + 3003e7c: 279e lhu a5,8(a5) + 3003e7e: 873e mv a4,a5 + 3003e80: fec42783 lw a5,-20(s0) + 3003e84: 97ba add a5,a5,a4 + 3003e86: fef42423 sw a5,-24(s0) + if (p->BIT.cfg_adc_ckmode_sel == BASE_CFG_SET) { + 3003e8a: fe842783 lw a5,-24(s0) + 3003e8e: 43dc lw a5,4(a5) + 3003e90: 83e1 srli a5,a5,0x18 + 3003e92: 8b85 andi a5,a5,1 + 3003e94: 0ff7f713 andi a4,a5,255 + 3003e98: 4785 li a5,1 + 3003e9a: 00f71463 bne a4,a5,3003ea2 + return CRG_ADC_CLK_SYN_CORE; /* Synchronous clock signal */ + 3003e9e: 478d li a5,3 + 3003ea0: a811 j 3003eb4 + } + return g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel; /* asynchronous clock signal */ + 3003ea2: 040007b7 lui a5,0x4000 + 3003ea6: 4947a783 lw a5,1172(a5) # 4000494 + 3003eaa: 1007a783 lw a5,256(a5) + 3003eae: 8391 srli a5,a5,0x4 + 3003eb0: 8b8d andi a5,a5,3 + 3003eb2: 9f81 uxtb a5 +} + 3003eb4: 853e mv a0,a5 + 3003eb6: 50b2 lw ra,44(sp) + 3003eb8: 5422 lw s0,40(sp) + 3003eba: 6145 addi sp,sp,48 + 3003ebc: 8082 ret + +03003ebe : + * @param matchInfo ADC match info + * @param div Adc clock division + * @retval None + */ +static void CRG_AdcDivSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int div) +{ + 3003ebe: 7179 addi sp,sp,-48 + 3003ec0: d606 sw ra,44(sp) + 3003ec2: d422 sw s0,40(sp) + 3003ec4: 1800 addi s0,sp,48 + 3003ec6: fca42e23 sw a0,-36(s0) + 3003eca: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003ece: fdc42783 lw a5,-36(s0) + 3003ed2: eb89 bnez a5,3003ee4 + 3003ed4: 3f700593 li a1,1015 + 3003ed8: 030067b7 lui a5,0x3006 + 3003edc: 4f478513 addi a0,a5,1268 # 30064f4 + 3003ee0: 3659 jal ra,3003a66 + 3003ee2: a001 j 3003ee2 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003ee4: 040007b7 lui a5,0x4000 + 3003ee8: 4947a783 lw a5,1172(a5) # 4000494 + 3003eec: eb89 bnez a5,3003efe + 3003eee: 3f800593 li a1,1016 + 3003ef2: 030067b7 lui a5,0x3006 + 3003ef6: 4f478513 addi a0,a5,1268 # 30064f4 + 3003efa: 36b5 jal ra,3003a66 + 3003efc: a001 j 3003efc + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkDiv(div)); + 3003efe: fd842503 lw a0,-40(s0) + 3003f02: d75fe0ef jal ra,3002c76 + 3003f06: 87aa mv a5,a0 + 3003f08: 0017c793 xori a5,a5,1 + 3003f0c: 9f81 uxtb a5 + 3003f0e: cb89 beqz a5,3003f20 + 3003f10: 3f900593 li a1,1017 + 3003f14: 030067b7 lui a5,0x3006 + 3003f18: 4f478513 addi a0,a5,1268 # 30064f4 + 3003f1c: 36a9 jal ra,3003a66 + 3003f1e: a885 j 3003f8e + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003f20: 040007b7 lui a5,0x4000 + 3003f24: 4947a783 lw a5,1172(a5) # 4000494 + 3003f28: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003f2c: fdc42783 lw a5,-36(s0) + 3003f30: 279e lhu a5,8(a5) + 3003f32: 873e mv a4,a5 + 3003f34: fec42783 lw a5,-20(s0) + 3003f38: 97ba add a5,a5,a4 + 3003f3a: fef42423 sw a5,-24(s0) + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3003f3e: fe842783 lw a5,-24(s0) + 3003f42: 43dc lw a5,4(a5) + 3003f44: 83e1 srli a5,a5,0x18 + 3003f46: 8b85 andi a5,a5,1 + 3003f48: 9f81 uxtb a5 + 3003f4a: fef42223 sw a5,-28(s0) + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3003f4e: fe442703 lw a4,-28(s0) + 3003f52: 4785 li a5,1 + 3003f54: 02f71163 bne a4,a5,3003f76 + p->BIT.clk_adc_div1 = div; /* write div to I1 */ + 3003f58: fd842783 lw a5,-40(s0) + 3003f5c: 8b8d andi a5,a5,3 + 3003f5e: 0ff7f693 andi a3,a5,255 + 3003f62: fe842703 lw a4,-24(s0) + 3003f66: 431c lw a5,0(a4) + 3003f68: 8a8d andi a3,a3,3 + 3003f6a: 06a2 slli a3,a3,0x8 + 3003f6c: cff7f793 andi a5,a5,-769 + 3003f70: 8fd5 or a5,a5,a3 + 3003f72: c31c sw a5,0(a4) + 3003f74: a829 j 3003f8e + } else { + p->BIT.clk_adc_div0 = div; /* write div to I0 */ + 3003f76: fd842783 lw a5,-40(s0) + 3003f7a: 8b8d andi a5,a5,3 + 3003f7c: 0ff7f693 andi a3,a5,255 + 3003f80: fe842703 lw a4,-24(s0) + 3003f84: 431c lw a5,0(a4) + 3003f86: 8a8d andi a3,a3,3 + 3003f88: 9bf1 andi a5,a5,-4 + 3003f8a: 8fd5 or a5,a5,a3 + 3003f8c: c31c sw a5,0(a4) + } +} + 3003f8e: 50b2 lw ra,44(sp) + 3003f90: 5422 lw s0,40(sp) + 3003f92: 6145 addi sp,sp,48 + 3003f94: 8082 ret + +03003f96 : + * @brief Get ADC clock division + * @param matchInfo ADC match info + * @retval Adc clock division + */ +static unsigned int CRG_AdcDivGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003f96: 7179 addi sp,sp,-48 + 3003f98: d606 sw ra,44(sp) + 3003f9a: d422 sw s0,40(sp) + 3003f9c: 1800 addi s0,sp,48 + 3003f9e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003fa2: fdc42783 lw a5,-36(s0) + 3003fa6: eb89 bnez a5,3003fb8 + 3003fa8: 40c00593 li a1,1036 + 3003fac: 030067b7 lui a5,0x3006 + 3003fb0: 4f478513 addi a0,a5,1268 # 30064f4 + 3003fb4: 3c4d jal ra,3003a66 + 3003fb6: a001 j 3003fb6 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003fb8: 040007b7 lui a5,0x4000 + 3003fbc: 4947a783 lw a5,1172(a5) # 4000494 + 3003fc0: eb89 bnez a5,3003fd2 + 3003fc2: 40d00593 li a1,1037 + 3003fc6: 030067b7 lui a5,0x3006 + 3003fca: 4f478513 addi a0,a5,1268 # 30064f4 + 3003fce: 3c61 jal ra,3003a66 + 3003fd0: a001 j 3003fd0 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003fd2: 040007b7 lui a5,0x4000 + 3003fd6: 4947a783 lw a5,1172(a5) # 4000494 + 3003fda: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003fde: fdc42783 lw a5,-36(s0) + 3003fe2: 279e lhu a5,8(a5) + 3003fe4: 873e mv a4,a5 + 3003fe6: fec42783 lw a5,-20(s0) + 3003fea: 97ba add a5,a5,a4 + 3003fec: fef42423 sw a5,-24(s0) + + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3003ff0: fe842783 lw a5,-24(s0) + 3003ff4: 43dc lw a5,4(a5) + 3003ff6: 83e1 srli a5,a5,0x18 + 3003ff8: 8b85 andi a5,a5,1 + 3003ffa: 9f81 uxtb a5 + 3003ffc: fef42223 sw a5,-28(s0) + + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3004000: fe442703 lw a4,-28(s0) + 3004004: 4785 li a5,1 + 3004006: 00f71963 bne a4,a5,3004018 + return p->BIT.clk_adc_div1; /* return div value I1 */ + 300400a: fe842783 lw a5,-24(s0) + 300400e: 439c lw a5,0(a5) + 3004010: 83a1 srli a5,a5,0x8 + 3004012: 8b8d andi a5,a5,3 + 3004014: 9f81 uxtb a5 + 3004016: a031 j 3004022 + } + return p->BIT.clk_adc_div0; /* return div valye I0 */ + 3004018: fe842783 lw a5,-24(s0) + 300401c: 439c lw a5,0(a5) + 300401e: 8b8d andi a5,a5,3 + 3004020: 9f81 uxtb a5 +} + 3004022: 853e mv a0,a5 + 3004024: 50b2 lw ra,44(sp) + 3004026: 5422 lw s0,40(sp) + 3004028: 6145 addi sp,sp,48 + 300402a: 8082 ret + +0300402c : + * @brief Enable Clock of EFC + * @param matchInfo EFC match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_EfcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 300402c: 7179 addi sp,sp,-48 + 300402e: d606 sw ra,44(sp) + 3004030: d422 sw s0,40(sp) + 3004032: 1800 addi s0,sp,48 + 3004034: fca42e23 sw a0,-36(s0) + 3004038: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300403c: fdc42783 lw a5,-36(s0) + 3004040: eb89 bnez a5,3004052 + 3004042: 42100593 li a1,1057 + 3004046: 030067b7 lui a5,0x3006 + 300404a: 4f478513 addi a0,a5,1268 # 30064f4 + 300404e: 3c21 jal ra,3003a66 + 3004050: a001 j 3004050 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004052: 040007b7 lui a5,0x4000 + 3004056: 4947a783 lw a5,1172(a5) # 4000494 + 300405a: eb89 bnez a5,300406c + 300405c: 42200593 li a1,1058 + 3004060: 030067b7 lui a5,0x3006 + 3004064: 4f478513 addi a0,a5,1268 # 30064f4 + 3004068: 3afd jal ra,3003a66 + 300406a: a001 j 300406a + /* Enables or disables EFC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300406c: 040007b7 lui a5,0x4000 + 3004070: 4947a783 lw a5,1172(a5) # 4000494 + 3004074: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004078: fdc42783 lw a5,-36(s0) + 300407c: 279e lhu a5,8(a5) + 300407e: 873e mv a4,a5 + 3004080: fec42783 lw a5,-20(s0) + 3004084: 97ba add a5,a5,a4 + 3004086: fef42423 sw a5,-24(s0) + p->BIT.eflash_cken = (enable & IP_CLK_ENABLE) ? BASE_CFG_SET : BASE_CFG_UNSET; + 300408a: fd842783 lw a5,-40(s0) + 300408e: 8b85 andi a5,a5,1 + 3004090: 0ff7f693 andi a3,a5,255 + 3004094: fe842703 lw a4,-24(s0) + 3004098: 431c lw a5,0(a4) + 300409a: 8a85 andi a3,a3,1 + 300409c: 9bf9 andi a5,a5,-2 + 300409e: 8fd5 or a5,a5,a3 + 30040a0: c31c sw a5,0(a4) +} + 30040a2: 0001 nop + 30040a4: 50b2 lw ra,44(sp) + 30040a6: 5422 lw s0,40(sp) + 30040a8: 6145 addi sp,sp,48 + 30040aa: 8082 ret + +030040ac : + * @brief Disable Clock of EFC + * @param matchInfo EFC match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_EfcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30040ac: 7179 addi sp,sp,-48 + 30040ae: d606 sw ra,44(sp) + 30040b0: d422 sw s0,40(sp) + 30040b2: 1800 addi s0,sp,48 + 30040b4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30040b8: fdc42783 lw a5,-36(s0) + 30040bc: eb89 bnez a5,30040ce + 30040be: 43000593 li a1,1072 + 30040c2: 030067b7 lui a5,0x3006 + 30040c6: 4f478513 addi a0,a5,1268 # 30064f4 + 30040ca: 3a71 jal ra,3003a66 + 30040cc: a001 j 30040cc + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30040ce: 040007b7 lui a5,0x4000 + 30040d2: 4947a783 lw a5,1172(a5) # 4000494 + 30040d6: eb89 bnez a5,30040e8 + 30040d8: 43100593 li a1,1073 + 30040dc: 030067b7 lui a5,0x3006 + 30040e0: 4f478513 addi a0,a5,1268 # 30064f4 + 30040e4: 3249 jal ra,3003a66 + 30040e6: a001 j 30040e6 + /* Get the value of the EFC register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30040e8: 040007b7 lui a5,0x4000 + 30040ec: 4947a783 lw a5,1172(a5) # 4000494 + 30040f0: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 30040f4: fdc42783 lw a5,-36(s0) + 30040f8: 279e lhu a5,8(a5) + 30040fa: 873e mv a4,a5 + 30040fc: fec42783 lw a5,-20(s0) + 3004100: 97ba add a5,a5,a4 + 3004102: fef42423 sw a5,-24(s0) + return p->BIT.eflash_cken; + 3004106: fe842783 lw a5,-24(s0) + 300410a: 439c lw a5,0(a5) + 300410c: 8b85 andi a5,a5,1 + 300410e: 9f81 uxtb a5 +} + 3004110: 853e mv a0,a5 + 3004112: 50b2 lw ra,44(sp) + 3004114: 5422 lw s0,40(sp) + 3004116: 6145 addi sp,sp,48 + 3004118: 8082 ret + +0300411a : + * @brief Enable Clock of ANA + * @param matchInfo ANA match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_AnaEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 300411a: 7179 addi sp,sp,-48 + 300411c: d606 sw ra,44(sp) + 300411e: d422 sw s0,40(sp) + 3004120: 1800 addi s0,sp,48 + 3004122: fca42e23 sw a0,-36(s0) + 3004126: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300412a: fdc42783 lw a5,-36(s0) + 300412e: eb89 bnez a5,3004140 + 3004130: 44000593 li a1,1088 + 3004134: 030067b7 lui a5,0x3006 + 3004138: 4f478513 addi a0,a5,1268 # 30064f4 + 300413c: 322d jal ra,3003a66 + 300413e: a001 j 300413e + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004140: 040007b7 lui a5,0x4000 + 3004144: 4947a783 lw a5,1172(a5) # 4000494 + 3004148: eb89 bnez a5,300415a + 300414a: 44100593 li a1,1089 + 300414e: 030067b7 lui a5,0x3006 + 3004152: 4f478513 addi a0,a5,1268 # 30064f4 + 3004156: 3a01 jal ra,3003a66 + 3004158: a001 j 3004158 + CRG_PARAM_CHECK_NO_RET(enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE); + 300415a: fd842703 lw a4,-40(s0) + 300415e: 4785 li a5,1 + 3004160: 00f70d63 beq a4,a5,300417a + 3004164: fd842783 lw a5,-40(s0) + 3004168: cb89 beqz a5,300417a + 300416a: 44200593 li a1,1090 + 300416e: 030067b7 lui a5,0x3006 + 3004172: 4f478513 addi a0,a5,1268 # 30064f4 + 3004176: 38c5 jal ra,3003a66 + 3004178: a20d j 300429a + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300417a: 040007b7 lui a5,0x4000 + 300417e: 4947a783 lw a5,1172(a5) # 4000494 + 3004182: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 3004186: fdc42783 lw a5,-36(s0) + 300418a: 279e lhu a5,8(a5) + 300418c: 873e mv a4,a5 + 300418e: fec42783 lw a5,-20(s0) + 3004192: 97ba add a5,a5,a4 + 3004194: fdc42703 lw a4,-36(s0) + 3004198: 2738 lbu a4,10(a4) + 300419a: 97ba add a5,a5,a4 + 300419c: fef42423 sw a5,-24(s0) + + if ((enable == IP_CLK_ENABLE) && (p->BIT.ip_srst_req == BASE_CFG_SET)) { + 30041a0: fd842703 lw a4,-40(s0) + 30041a4: 4785 li a5,1 + 30041a6: 02f71f63 bne a4,a5,30041e4 + 30041aa: fe842783 lw a5,-24(s0) + 30041ae: 439c lw a5,0(a5) + 30041b0: 83c1 srli a5,a5,0x10 + 30041b2: 8b85 andi a5,a5,1 + 30041b4: 0ff7f713 andi a4,a5,255 + 30041b8: 4785 li a5,1 + 30041ba: 02f71563 bne a4,a5,30041e4 + p->BIT.ip_srst_req = BASE_CFG_UNSET; + 30041be: fe842703 lw a4,-24(s0) + 30041c2: 431c lw a5,0(a4) + 30041c4: 76c1 lui a3,0xffff0 + 30041c6: 16fd addi a3,a3,-1 # fffeffff + 30041c8: 8ff5 and a5,a5,a3 + 30041ca: c31c sw a5,0(a4) + g_anaEnableFlag++; /* count enable analog IP number */ + 30041cc: 040007b7 lui a5,0x4000 + 30041d0: 4987c783 lbu a5,1176(a5) # 4000498 + 30041d4: 0785 addi a5,a5,1 + 30041d6: 0ff7f713 andi a4,a5,255 + 30041da: 040007b7 lui a5,0x4000 + 30041de: 48e78c23 sb a4,1176(a5) # 4000498 + 30041e2: a089 j 3004224 + } else if ((enable == IP_CLK_DISABLE) && (p->BIT.ip_srst_req == BASE_CFG_UNSET)) { + 30041e4: fd842783 lw a5,-40(s0) + 30041e8: ef95 bnez a5,3004224 + 30041ea: fe842783 lw a5,-24(s0) + 30041ee: 439c lw a5,0(a5) + 30041f0: 83c1 srli a5,a5,0x10 + 30041f2: 8b85 andi a5,a5,1 + 30041f4: 9f81 uxtb a5 + 30041f6: e79d bnez a5,3004224 + p->BIT.ip_srst_req = BASE_CFG_SET; + 30041f8: fe842703 lw a4,-24(s0) + 30041fc: 431c lw a5,0(a4) + 30041fe: 66c1 lui a3,0x10 + 3004200: 8fd5 or a5,a5,a3 + 3004202: c31c sw a5,0(a4) + if (g_anaEnableFlag > 0) { + 3004204: 040007b7 lui a5,0x4000 + 3004208: 4987c783 lbu a5,1176(a5) # 4000498 + 300420c: cf81 beqz a5,3004224 + g_anaEnableFlag--; /* Decreasing the count to enable the analog IP number. */ + 300420e: 040007b7 lui a5,0x4000 + 3004212: 4987c783 lbu a5,1176(a5) # 4000498 + 3004216: 17fd addi a5,a5,-1 + 3004218: 0ff7f713 andi a4,a5,255 + 300421c: 040007b7 lui a5,0x4000 + 3004220: 48e78c23 sb a4,1176(a5) # 4000498 + } + } + + if ((g_anaEnableFlag == 0) && (enable == IP_CLK_DISABLE)) { /* all analog clock disable */ + 3004224: 040007b7 lui a5,0x4000 + 3004228: 4987c783 lbu a5,1176(a5) # 4000498 + 300422c: eb85 bnez a5,300425c + 300422e: fd842783 lw a5,-40(s0) + 3004232: e78d bnez a5,300425c + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_UNSET; + 3004234: 10000737 lui a4,0x10000 + 3004238: 6785 lui a5,0x1 + 300423a: 973e add a4,a4,a5 + 300423c: a5072783 lw a5,-1456(a4) # ffffa50 + 3004240: 9bf9 andi a5,a5,-2 + 3004242: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_SET; + 3004246: 10000737 lui a4,0x10000 + 300424a: 6785 lui a5,0x1 + 300424c: 973e add a4,a4,a5 + 300424e: a5072783 lw a5,-1456(a4) # ffffa50 + 3004252: 66c1 lui a3,0x10 + 3004254: 8fd5 or a5,a5,a3 + 3004256: a4f72823 sw a5,-1456(a4) + 300425a: a081 j 300429a + } else if ((g_anaEnableFlag > 0) && (enable == IP_CLK_ENABLE)) { /* all analog clock enable */ + 300425c: 040007b7 lui a5,0x4000 + 3004260: 4987c783 lbu a5,1176(a5) # 4000498 + 3004264: cb9d beqz a5,300429a + 3004266: fd842703 lw a4,-40(s0) + 300426a: 4785 li a5,1 + 300426c: 02f71763 bne a4,a5,300429a + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_UNSET; + 3004270: 10000737 lui a4,0x10000 + 3004274: 6785 lui a5,0x1 + 3004276: 973e add a4,a4,a5 + 3004278: a5072783 lw a5,-1456(a4) # ffffa50 + 300427c: 76c1 lui a3,0xffff0 + 300427e: 16fd addi a3,a3,-1 # fffeffff + 3004280: 8ff5 and a5,a5,a3 + 3004282: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_SET; + 3004286: 10000737 lui a4,0x10000 + 300428a: 6785 lui a5,0x1 + 300428c: 973e add a4,a4,a5 + 300428e: a5072783 lw a5,-1456(a4) # ffffa50 + 3004292: 0017e793 ori a5,a5,1 + 3004296: a4f72823 sw a5,-1456(a4) + } +} + 300429a: 50b2 lw ra,44(sp) + 300429c: 5422 lw s0,40(sp) + 300429e: 6145 addi sp,sp,48 + 30042a0: 8082 ret + +030042a2 : + * @brief Get Clock of ANA + * @param matchInfo ANA match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_AnaEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30042a2: 7179 addi sp,sp,-48 + 30042a4: d606 sw ra,44(sp) + 30042a6: d422 sw s0,40(sp) + 30042a8: 1800 addi s0,sp,48 + 30042aa: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30042ae: fdc42783 lw a5,-36(s0) + 30042b2: eb91 bnez a5,30042c6 + 30042b4: 46200593 li a1,1122 + 30042b8: 030067b7 lui a5,0x3006 + 30042bc: 4f478513 addi a0,a5,1268 # 30064f4 + 30042c0: beffd0ef jal ra,3001eae + 30042c4: a001 j 30042c4 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30042c6: 040007b7 lui a5,0x4000 + 30042ca: 4947a783 lw a5,1172(a5) # 4000494 + 30042ce: eb91 bnez a5,30042e2 + 30042d0: 46300593 li a1,1123 + 30042d4: 030067b7 lui a5,0x3006 + 30042d8: 4f478513 addi a0,a5,1268 # 30064f4 + 30042dc: bd3fd0ef jal ra,3001eae + 30042e0: a001 j 30042e0 + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30042e2: 040007b7 lui a5,0x4000 + 30042e6: 4947a783 lw a5,1172(a5) # 4000494 + 30042ea: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 30042ee: fdc42783 lw a5,-36(s0) + 30042f2: 279e lhu a5,8(a5) + 30042f4: 873e mv a4,a5 + 30042f6: fec42783 lw a5,-20(s0) + 30042fa: 97ba add a5,a5,a4 + 30042fc: fdc42703 lw a4,-36(s0) + 3004300: 2738 lbu a4,10(a4) + 3004302: 97ba add a5,a5,a4 + 3004304: fef42423 sw a5,-24(s0) + /* The clock is enabled based on the IP reset status. */ + return (p->BIT.ip_srst_req) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3004308: fe842783 lw a5,-24(s0) + 300430c: 439c lw a5,0(a5) + 300430e: 83c1 srli a5,a5,0x10 + 3004310: 8b85 andi a5,a5,1 + 3004312: 9f81 uxtb a5 + 3004314: 0017c793 xori a5,a5,1 + 3004318: 9f81 uxtb a5 +} + 300431a: 853e mv a0,a5 + 300431c: 50b2 lw ra,44(sp) + 300431e: 5422 lw s0,40(sp) + 3004320: 6145 addi sp,sp,48 + 3004322: 8082 ret + +03004324 : + * @brief Write a character to the UART port. + * @param ch The int promotion of the character to be written. + * @retval None. + */ +static void DBG_PrintCh(unsigned int ch) +{ + 3004324: 1101 addi sp,sp,-32 + 3004326: ce22 sw s0,28(sp) + 3004328: 1000 addi s0,sp,32 + 300432a: fea42623 sw a0,-20(s0) + while (DBG_PRINTF_UART_PORT->UART_FR.BIT.txff == 1) { + 300432e: 0001 nop + 3004330: 140007b7 lui a5,0x14000 + 3004334: 4f9c lw a5,24(a5) + 3004336: 8395 srli a5,a5,0x5 + 3004338: 8b85 andi a5,a5,1 + 300433a: 0ff7f713 andi a4,a5,255 + 300433e: 4785 li a5,1 + 3004340: fef708e3 beq a4,a5,3004330 + ; + } + DBG_PRINTF_UART_PORT->UART_DR.BIT.data = (unsigned char)ch; + 3004344: 14000737 lui a4,0x14000 + 3004348: fec42783 lw a5,-20(s0) + 300434c: 0ff7f693 andi a3,a5,255 + 3004350: 431c lw a5,0(a4) + 3004352: 0ff6f693 andi a3,a3,255 + 3004356: f007f793 andi a5,a5,-256 + 300435a: 8fd5 or a5,a5,a3 + 300435c: c31c sw a5,0(a4) +} + 300435e: 0001 nop + 3004360: 4472 lw s0,28(sp) + 3004362: 6105 addi sp,sp,32 + 3004364: 8082 ret + +03004366 : + * @param str The string to be printed. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, a BASE_STATUS_ERROR is returned. + */ +static int DBG_PrintStr(const char *str) +{ + 3004366: 7179 addi sp,sp,-48 + 3004368: d606 sw ra,44(sp) + 300436a: d422 sw s0,40(sp) + 300436c: 1800 addi s0,sp,48 + 300436e: fca42e23 sw a0,-36(s0) + DEBUG_ASSERT_PARAM(str != NULL); + int cnt = 0; + 3004372: fe042623 sw zero,-20(s0) + while (*str != '\0') { + 3004376: a00d j 3004398 + DBG_PrintCh(*str); + 3004378: fdc42783 lw a5,-36(s0) + 300437c: 00078783 lb a5,0(a5) # 14000000 + 3004380: 853e mv a0,a5 + 3004382: 374d jal ra,3004324 + str++; + 3004384: fdc42783 lw a5,-36(s0) + 3004388: 0785 addi a5,a5,1 + 300438a: fcf42e23 sw a5,-36(s0) + cnt++; + 300438e: fec42783 lw a5,-20(s0) + 3004392: 0785 addi a5,a5,1 + 3004394: fef42623 sw a5,-20(s0) + while (*str != '\0') { + 3004398: fdc42783 lw a5,-36(s0) + 300439c: 00078783 lb a5,0(a5) + 30043a0: ffe1 bnez a5,3004378 + } + return cnt; + 30043a2: fec42783 lw a5,-20(s0) +} + 30043a6: 853e mv a0,a5 + 30043a8: 50b2 lw ra,44(sp) + 30043aa: 5422 lw s0,40(sp) + 30043ac: 6145 addi sp,sp,48 + 30043ae: 8082 ret + +030043b0 : + * @param base Base value. + * @param exponent Exponent value. + * @retval unsigned long The result of raising base to the power exponent. + */ +static unsigned long DBG_Pow(unsigned int base, unsigned int exponent) +{ + 30043b0: 7179 addi sp,sp,-48 + 30043b2: d622 sw s0,44(sp) + 30043b4: 1800 addi s0,sp,48 + 30043b6: fca42e23 sw a0,-36(s0) + 30043ba: fcb42c23 sw a1,-40(s0) + unsigned long ret = 1; + 30043be: 4785 li a5,1 + 30043c0: fef42623 sw a5,-20(s0) + while (exponent--) { + 30043c4: a809 j 30043d6 + ret *= base; + 30043c6: fec42703 lw a4,-20(s0) + 30043ca: fdc42783 lw a5,-36(s0) + 30043ce: 02f707b3 mul a5,a4,a5 + 30043d2: fef42623 sw a5,-20(s0) + while (exponent--) { + 30043d6: fd842783 lw a5,-40(s0) + 30043da: fff78713 addi a4,a5,-1 + 30043de: fce42c23 sw a4,-40(s0) + 30043e2: f3f5 bnez a5,30043c6 + } + return ret; /* ret = base ^ exponent */ + 30043e4: fec42783 lw a5,-20(s0) +} + 30043e8: 853e mv a0,a5 + 30043ea: 5432 lw s0,44(sp) + 30043ec: 6145 addi sp,sp,48 + 30043ee: 8082 ret + +030043f0 : + * @param num The number to be counted. + * @param base The number base of num. + * @retval unsigned int The number of digits. + */ +static unsigned int DBG_CountDigits(int num, NumBase base) +{ + 30043f0: 7179 addi sp,sp,-48 + 30043f2: d622 sw s0,44(sp) + 30043f4: 1800 addi s0,sp,48 + 30043f6: fca42e23 sw a0,-36(s0) + 30043fa: fcb42c23 sw a1,-40(s0) + unsigned int cnt = 0; + 30043fe: fe042623 sw zero,-20(s0) + if (base == 0) { + 3004402: fd842783 lw a5,-40(s0) + 3004406: e78d bnez a5,3004430 + return 0; + 3004408: 4781 li a5,0 + 300440a: a099 j 3004450 + } + while (num != 0) { + cnt++; + 300440c: fec42783 lw a5,-20(s0) + 3004410: 0785 addi a5,a5,1 + 3004412: fef42623 sw a5,-20(s0) + if (cnt > MAX_DIV_TIMES) { + 3004416: fec42703 lw a4,-20(s0) + 300441a: 47fd li a5,31 + 300441c: 00e7ee63 bltu a5,a4,3004438 + break; + } + num /= base; + 3004420: fdc42703 lw a4,-36(s0) + 3004424: fd842783 lw a5,-40(s0) + 3004428: 02f757b3 divu a5,a4,a5 + 300442c: fcf42e23 sw a5,-36(s0) + while (num != 0) { + 3004430: fdc42783 lw a5,-36(s0) + 3004434: ffe1 bnez a5,300440c + 3004436: a011 j 300443a + break; + 3004438: 0001 nop + } + cnt = (cnt == 0) ? 1 : cnt; + 300443a: fec42783 lw a5,-20(s0) + 300443e: c781 beqz a5,3004446 + 3004440: fec42783 lw a5,-20(s0) + 3004444: a011 j 3004448 + 3004446: 4785 li a5,1 + 3004448: fef42623 sw a5,-20(s0) + return cnt; + 300444c: fec42783 lw a5,-20(s0) +} + 3004450: 853e mv a0,a5 + 3004452: 5432 lw s0,44(sp) + 3004454: 6145 addi sp,sp,48 + 3004456: 8082 ret + +03004458 : + * @param num The unsigned number to be printed. + * @param base The number base of num. + * @param digits The digits of num. + */ +static void DBG_PutUnsignedNum(unsigned int num, NumBase base, unsigned int digits) +{ + 3004458: 7179 addi sp,sp,-48 + 300445a: d606 sw ra,44(sp) + 300445c: d422 sw s0,40(sp) + 300445e: 1800 addi s0,sp,48 + 3004460: fca42e23 sw a0,-36(s0) + 3004464: fcb42c23 sw a1,-40(s0) + 3004468: fcc42a23 sw a2,-44(s0) + unsigned char ch; + while (digits != 0) { + 300446c: a069 j 30044f6 + ch = num / DBG_Pow(base, digits - 1); + 300446e: fd442783 lw a5,-44(s0) + 3004472: 17fd addi a5,a5,-1 + 3004474: 85be mv a1,a5 + 3004476: fd842503 lw a0,-40(s0) + 300447a: 3f1d jal ra,30043b0 + 300447c: 872a mv a4,a0 + 300447e: fdc42783 lw a5,-36(s0) + 3004482: 02e7d7b3 divu a5,a5,a4 + 3004486: fef407a3 sb a5,-17(s0) + num %= DBG_Pow(base, digits - 1); + 300448a: fd442783 lw a5,-44(s0) + 300448e: 17fd addi a5,a5,-1 + 3004490: 85be mv a1,a5 + 3004492: fd842503 lw a0,-40(s0) + 3004496: 3f29 jal ra,30043b0 + 3004498: 872a mv a4,a0 + 300449a: fdc42783 lw a5,-36(s0) + 300449e: 02e7f7b3 remu a5,a5,a4 + 30044a2: fcf42e23 sw a5,-36(s0) + if (base == DECIMAL) { + 30044a6: fd842703 lw a4,-40(s0) + 30044aa: 47a9 li a5,10 + 30044ac: 00f71963 bne a4,a5,30044be + DBG_PrintCh(ch + '0'); + 30044b0: fef44783 lbu a5,-17(s0) + 30044b4: 03078793 addi a5,a5,48 + 30044b8: 853e mv a0,a5 + 30044ba: 35ad jal ra,3004324 + 30044bc: a805 j 30044ec + } else if (base == HEXADECIMAL) { + 30044be: fd842703 lw a4,-40(s0) + 30044c2: 47c1 li a5,16 + 30044c4: 02f71d63 bne a4,a5,30044fe + if (ch < DECIMAL_BASE) { + 30044c8: fef44703 lbu a4,-17(s0) + 30044cc: 47a5 li a5,9 + 30044ce: 00e7e963 bltu a5,a4,30044e0 + DBG_PrintCh(ch + '0'); + 30044d2: fef44783 lbu a5,-17(s0) + 30044d6: 03078793 addi a5,a5,48 + 30044da: 853e mv a0,a5 + 30044dc: 35a1 jal ra,3004324 + 30044de: a039 j 30044ec + } else { + DBG_PrintCh(ch - DECIMAL_BASE + 'A'); + 30044e0: fef44783 lbu a5,-17(s0) + 30044e4: 03778793 addi a5,a5,55 + 30044e8: 853e mv a0,a5 + 30044ea: 3d2d jal ra,3004324 + } + } else { + break; + } + digits--; + 30044ec: fd442783 lw a5,-44(s0) + 30044f0: 17fd addi a5,a5,-1 + 30044f2: fcf42a23 sw a5,-44(s0) + while (digits != 0) { + 30044f6: fd442783 lw a5,-44(s0) + 30044fa: fbb5 bnez a5,300446e + } +} + 30044fc: a011 j 3004500 + break; + 30044fe: 0001 nop +} + 3004500: 0001 nop + 3004502: 50b2 lw ra,44(sp) + 3004504: 5422 lw s0,40(sp) + 3004506: 6145 addi sp,sp,48 + 3004508: 8082 ret + +0300450a : + * @brief Print decimal number through UART port. + * @param intNum The decimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintInt(int intNum) +{ + 300450a: 7179 addi sp,sp,-48 + 300450c: d606 sw ra,44(sp) + 300450e: d422 sw s0,40(sp) + 3004510: 1800 addi s0,sp,48 + 3004512: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (intNum == 0) { + 3004516: fdc42783 lw a5,-36(s0) + 300451a: e791 bnez a5,3004526 + DBG_PrintCh('0'); + 300451c: 03000513 li a0,48 + 3004520: 3511 jal ra,3004324 + return 1; + 3004522: 4785 li a5,1 + 3004524: a82d j 300455e + } + if (intNum < 0) { + 3004526: fdc42783 lw a5,-36(s0) + 300452a: 0007db63 bgez a5,3004540 + DBG_PrintCh('-'); + 300452e: 02d00513 li a0,45 + 3004532: 3bcd jal ra,3004324 + intNum = -intNum; + 3004534: fdc42783 lw a5,-36(s0) + 3004538: 40f007b3 neg a5,a5 + 300453c: fcf42e23 sw a5,-36(s0) + } + cnt = DBG_CountDigits(intNum, DECIMAL); + 3004540: 45a9 li a1,10 + 3004542: fdc42503 lw a0,-36(s0) + 3004546: 356d jal ra,30043f0 + 3004548: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(intNum, DECIMAL, cnt); + 300454c: fdc42783 lw a5,-36(s0) + 3004550: fec42603 lw a2,-20(s0) + 3004554: 45a9 li a1,10 + 3004556: 853e mv a0,a5 + 3004558: 3701 jal ra,3004458 + return cnt; + 300455a: fec42783 lw a5,-20(s0) +} + 300455e: 853e mv a0,a5 + 3004560: 50b2 lw ra,44(sp) + 3004562: 5422 lw s0,40(sp) + 3004564: 6145 addi sp,sp,48 + 3004566: 8082 ret + +03004568 : + * @brief Print hexadecimal number through UART port. + * @param hexNum The hexadecimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintHex(unsigned int hexNum) +{ + 3004568: 7179 addi sp,sp,-48 + 300456a: d606 sw ra,44(sp) + 300456c: d422 sw s0,40(sp) + 300456e: 1800 addi s0,sp,48 + 3004570: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (hexNum == 0) { + 3004574: fdc42783 lw a5,-36(s0) + 3004578: e791 bnez a5,3004584 + DBG_PrintCh('0'); + 300457a: 03000513 li a0,48 + 300457e: 335d jal ra,3004324 + return 1; + 3004580: 4785 li a5,1 + 3004582: a005 j 30045a2 + } + cnt = DBG_CountDigits(hexNum, HEXADECIMAL); + 3004584: fdc42783 lw a5,-36(s0) + 3004588: 45c1 li a1,16 + 300458a: 853e mv a0,a5 + 300458c: 3595 jal ra,30043f0 + 300458e: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(hexNum, HEXADECIMAL, cnt); + 3004592: fec42603 lw a2,-20(s0) + 3004596: 45c1 li a1,16 + 3004598: fdc42503 lw a0,-36(s0) + 300459c: 3d75 jal ra,3004458 + return cnt; + 300459e: fec42783 lw a5,-20(s0) +} + 30045a2: 853e mv a0,a5 + 30045a4: 50b2 lw ra,44(sp) + 30045a6: 5422 lw s0,40(sp) + 30045a8: 6145 addi sp,sp,48 + 30045aa: 8082 ret + +030045ac : + * @brief Print floating-point number through UART port. + * @param fltNum The floating-point number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintFlt(float fltNum, unsigned int precision) +{ + 30045ac: 7139 addi sp,sp,-64 + 30045ae: de06 sw ra,60(sp) + 30045b0: dc22 sw s0,56(sp) + 30045b2: 0080 addi s0,sp,64 + 30045b4: fca42627 fsw fa0,-52(s0) + 30045b8: fca42423 sw a0,-56(s0) + unsigned int cnt = 0; + 30045bc: fe042623 sw zero,-20(s0) + unsigned int floatScale; + + if (fltNum < 0) { + 30045c0: fcc42787 flw fa5,-52(s0) + 30045c4: f0000753 fmv.w.x fa4,zero + 30045c8: a0e797d3 flt.s a5,fa5,fa4 + 30045cc: cf99 beqz a5,30045ea + DBG_PrintCh('-'); + 30045ce: 02d00513 li a0,45 + 30045d2: 3b89 jal ra,3004324 + cnt += 1; + 30045d4: fec42783 lw a5,-20(s0) + 30045d8: 0785 addi a5,a5,1 + 30045da: fef42623 sw a5,-20(s0) + fltNum = -fltNum; + 30045de: fcc42787 flw fa5,-52(s0) + 30045e2: 20f797d3 fneg.s fa5,fa5 + 30045e6: fcf42627 fsw fa5,-52(s0) + } + int integerVal = (int)fltNum; + 30045ea: fcc42787 flw fa5,-52(s0) + 30045ee: c00797d3 fcvt.w.s a5,fa5,rtz + 30045f2: fef42023 sw a5,-32(s0) + floatScale = DBG_Pow(10, (precision + 1)); /* 10: decimal */ + 30045f6: fc842783 lw a5,-56(s0) + 30045fa: 0785 addi a5,a5,1 + 30045fc: 85be mv a1,a5 + 30045fe: 4529 li a0,10 + 3004600: 3b45 jal ra,30043b0 + 3004602: fca42e23 sw a0,-36(s0) + int floatVal = (long)(floatScale * (fltNum - integerVal)); + 3004606: fdc42783 lw a5,-36(s0) + 300460a: d017f753 fcvt.s.wu fa4,a5 + 300460e: fe042783 lw a5,-32(s0) + 3004612: d007f7d3 fcvt.s.w fa5,a5 + 3004616: fcc42687 flw fa3,-52(s0) + 300461a: 08f6f7d3 fsub.s fa5,fa3,fa5 + 300461e: 10f777d3 fmul.s fa5,fa4,fa5 + 3004622: c00797d3 fcvt.w.s a5,fa5,rtz + 3004626: fef42423 sw a5,-24(s0) + /* Half-adjust: round up or round down */ + if (floatVal % DECIMAL_BASE >= HALF_ADJUST_BOUNDARY) { + 300462a: fe842703 lw a4,-24(s0) + 300462e: 47a9 li a5,10 + 3004630: 02f77733 remu a4,a4,a5 + 3004634: 4791 li a5,4 + 3004636: 00e7fb63 bgeu a5,a4,300464c + floatVal = floatVal / DECIMAL_BASE + 1; + 300463a: fe842703 lw a4,-24(s0) + 300463e: 47a9 li a5,10 + 3004640: 02f757b3 divu a5,a4,a5 + 3004644: 0785 addi a5,a5,1 + 3004646: fef42423 sw a5,-24(s0) + 300464a: a801 j 300465a + } else { + floatVal = floatVal / DECIMAL_BASE; + 300464c: fe842703 lw a4,-24(s0) + 3004650: 47a9 li a5,10 + 3004652: 02f757b3 divu a5,a4,a5 + 3004656: fef42423 sw a5,-24(s0) + } + cnt += DBG_PrintInt(integerVal); + 300465a: fe042503 lw a0,-32(s0) + 300465e: 3575 jal ra,300450a + 3004660: 872a mv a4,a0 + 3004662: fec42783 lw a5,-20(s0) + 3004666: 97ba add a5,a5,a4 + 3004668: fef42623 sw a5,-20(s0) + DBG_PrintCh('.'); + 300466c: 02e00513 li a0,46 + 3004670: 3955 jal ra,3004324 + cnt += 1; + 3004672: fec42783 lw a5,-20(s0) + 3004676: 0785 addi a5,a5,1 + 3004678: fef42623 sw a5,-20(s0) + /* Pad 0 in float part */ + unsigned int fltCnt = DBG_CountDigits(floatVal, DECIMAL); + 300467c: 45a9 li a1,10 + 300467e: fe842503 lw a0,-24(s0) + 3004682: 33bd jal ra,30043f0 + 3004684: fca42c23 sw a0,-40(s0) + if (precision > fltCnt) { + 3004688: fc842703 lw a4,-56(s0) + 300468c: fd842783 lw a5,-40(s0) + 3004690: 02e7f763 bgeu a5,a4,30046be + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 3004694: fe042223 sw zero,-28(s0) + 3004698: a809 j 30046aa + DBG_PrintCh('0'); /* add '0' */ + 300469a: 03000513 li a0,48 + 300469e: 3159 jal ra,3004324 + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 30046a0: fe442783 lw a5,-28(s0) + 30046a4: 0785 addi a5,a5,1 + 30046a6: fef42223 sw a5,-28(s0) + 30046aa: fc842703 lw a4,-56(s0) + 30046ae: fd842783 lw a5,-40(s0) + 30046b2: 40f707b3 sub a5,a4,a5 + 30046b6: fe442703 lw a4,-28(s0) + 30046ba: fef760e3 bltu a4,a5,300469a + } + } + DBG_PutUnsignedNum(floatVal, DECIMAL, fltCnt); /* print unsigned number */ + 30046be: fe842783 lw a5,-24(s0) + 30046c2: fd842603 lw a2,-40(s0) + 30046c6: 45a9 li a1,10 + 30046c8: 853e mv a0,a5 + 30046ca: 3379 jal ra,3004458 + cnt += precision; + 30046cc: fec42703 lw a4,-20(s0) + 30046d0: fc842783 lw a5,-56(s0) + 30046d4: 97ba add a5,a5,a4 + 30046d6: fef42623 sw a5,-20(s0) + return cnt; + 30046da: fec42783 lw a5,-20(s0) +} + 30046de: 853e mv a0,a5 + 30046e0: 50f2 lw ra,60(sp) + 30046e2: 5462 lw s0,56(sp) + 30046e4: 6121 addi sp,sp,64 + 30046e6: 8082 ret + +030046e8 : + * @param ch The format specifier. + * @param paramList The pointer of the variable parameter list. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int ParseSpecifier(const char ch, va_list *paramList) +{ + 30046e8: 7139 addi sp,sp,-64 + 30046ea: de06 sw ra,60(sp) + 30046ec: dc22 sw s0,56(sp) + 30046ee: 0080 addi s0,sp,64 + 30046f0: 87aa mv a5,a0 + 30046f2: fcb42423 sw a1,-56(s0) + 30046f6: fcf407a3 sb a5,-49(s0) + unsigned int cnt = 0; + 30046fa: fe042623 sw zero,-20(s0) + unsigned int tmpCnt; + char chVal = 0; + 30046fe: fe0405a3 sb zero,-21(s0) + const char *strVal = NULL; + 3004702: fe042223 sw zero,-28(s0) + int intVal = 0; + 3004706: fe042023 sw zero,-32(s0) + unsigned int unsignedVal = 0; + 300470a: fc042e23 sw zero,-36(s0) + unsigned int hexVal = 0; + 300470e: fc042c23 sw zero,-40(s0) + float fltVal = 0; + 3004712: fc042a23 sw zero,-44(s0) + switch (ch) { + 3004716: fcf40783 lb a5,-49(s0) + 300471a: fa878793 addi a5,a5,-88 + 300471e: 02000713 li a4,32 + 3004722: 14f76063 bltu a4,a5,3004862 + 3004726: 00279713 slli a4,a5,0x2 + 300472a: 030067b7 lui a5,0x3006 + 300472e: 54878793 addi a5,a5,1352 # 3006548 + 3004732: 97ba add a5,a5,a4 + 3004734: 439c lw a5,0(a5) + 3004736: 8782 jr a5 + case 'c': /* Character format data. */ + chVal = VA_ARG(*paramList, int); /* Use type int because of byte alignment */ + 3004738: fc842783 lw a5,-56(s0) + 300473c: 439c lw a5,0(a5) + 300473e: 00478693 addi a3,a5,4 + 3004742: fc842703 lw a4,-56(s0) + 3004746: c314 sw a3,0(a4) + 3004748: 439c lw a5,0(a5) + 300474a: fef405a3 sb a5,-21(s0) + DBG_PrintCh(chVal); + 300474e: feb40783 lb a5,-21(s0) + 3004752: 853e mv a0,a5 + 3004754: 3ec1 jal ra,3004324 + cnt += 1; + 3004756: fec42783 lw a5,-20(s0) + 300475a: 0785 addi a5,a5,1 + 300475c: fef42623 sw a5,-20(s0) + break; + 3004760: aa19 j 3004876 + case 's': /* String format data. */ + strVal = VA_ARG(*paramList, const char *); + 3004762: fc842783 lw a5,-56(s0) + 3004766: 439c lw a5,0(a5) + 3004768: 00478693 addi a3,a5,4 + 300476c: fc842703 lw a4,-56(s0) + 3004770: c314 sw a3,0(a4) + 3004772: 439c lw a5,0(a5) + 3004774: fef42223 sw a5,-28(s0) + cnt += DBG_PrintStr(strVal); + 3004778: fe442503 lw a0,-28(s0) + 300477c: 36ed jal ra,3004366 + 300477e: 87aa mv a5,a0 + 3004780: 873e mv a4,a5 + 3004782: fec42783 lw a5,-20(s0) + 3004786: 97ba add a5,a5,a4 + 3004788: fef42623 sw a5,-20(s0) + break; + 300478c: a0ed j 3004876 + case 'd': /* Integer decimal data. */ + intVal = VA_ARG(*paramList, int); + 300478e: fc842783 lw a5,-56(s0) + 3004792: 439c lw a5,0(a5) + 3004794: 00478693 addi a3,a5,4 + 3004798: fc842703 lw a4,-56(s0) + 300479c: c314 sw a3,0(a4) + 300479e: 439c lw a5,0(a5) + 30047a0: fef42023 sw a5,-32(s0) + cnt += DBG_PrintInt(intVal); + 30047a4: fe042503 lw a0,-32(s0) + 30047a8: 338d jal ra,300450a + 30047aa: 872a mv a4,a0 + 30047ac: fec42783 lw a5,-20(s0) + 30047b0: 97ba add a5,a5,a4 + 30047b2: fef42623 sw a5,-20(s0) + break; + 30047b6: a0c1 j 3004876 + case 'u': /* Unsigned decimal data. */ + unsignedVal = VA_ARG(*paramList, unsigned int); + 30047b8: fc842783 lw a5,-56(s0) + 30047bc: 439c lw a5,0(a5) + 30047be: 00478693 addi a3,a5,4 + 30047c2: fc842703 lw a4,-56(s0) + 30047c6: c314 sw a3,0(a4) + 30047c8: 439c lw a5,0(a5) + 30047ca: fcf42e23 sw a5,-36(s0) + tmpCnt = DBG_CountDigits(unsignedVal, DECIMAL); + 30047ce: fdc42783 lw a5,-36(s0) + 30047d2: 45a9 li a1,10 + 30047d4: 853e mv a0,a5 + 30047d6: 3929 jal ra,30043f0 + 30047d8: fca42823 sw a0,-48(s0) + DBG_PutUnsignedNum(unsignedVal, DECIMAL, tmpCnt); + 30047dc: fd042603 lw a2,-48(s0) + 30047e0: 45a9 li a1,10 + 30047e2: fdc42503 lw a0,-36(s0) + 30047e6: 398d jal ra,3004458 + cnt += tmpCnt; + 30047e8: fec42703 lw a4,-20(s0) + 30047ec: fd042783 lw a5,-48(s0) + 30047f0: 97ba add a5,a5,a4 + 30047f2: fef42623 sw a5,-20(s0) + break; + 30047f6: a041 j 3004876 + case 'x': /* Hexadecimal data. */ + case 'X': + case 'p': /* Address data. */ + hexVal = VA_ARG(*paramList, unsigned int); + 30047f8: fc842783 lw a5,-56(s0) + 30047fc: 439c lw a5,0(a5) + 30047fe: 00478693 addi a3,a5,4 + 3004802: fc842703 lw a4,-56(s0) + 3004806: c314 sw a3,0(a4) + 3004808: 439c lw a5,0(a5) + 300480a: fcf42c23 sw a5,-40(s0) + cnt += DBG_PrintHex(hexVal); + 300480e: fd842503 lw a0,-40(s0) + 3004812: 3b99 jal ra,3004568 + 3004814: 872a mv a4,a0 + 3004816: fec42783 lw a5,-20(s0) + 300481a: 97ba add a5,a5,a4 + 300481c: fef42623 sw a5,-20(s0) + break; + 3004820: a899 j 3004876 + case 'f': /* Floating-point data. */ + fltVal = VA_ARG(*paramList, double); + 3004822: fc842783 lw a5,-56(s0) + 3004826: 439c lw a5,0(a5) + 3004828: 079d addi a5,a5,7 + 300482a: 9be1 andi a5,a5,-8 + 300482c: 00878693 addi a3,a5,8 + 3004830: fc842703 lw a4,-56(s0) + 3004834: c314 sw a3,0(a4) + 3004836: 0047a803 lw a6,4(a5) + 300483a: 439c lw a5,0(a5) + 300483c: 853e mv a0,a5 + 300483e: 85c2 mv a1,a6 + 3004840: 75c010ef jal ra,3005f9c <__truncdfsf2> + 3004844: 20a507d3 fmv.s fa5,fa0 + 3004848: fcf42a27 fsw fa5,-44(s0) + cnt += DBG_PrintFlt(fltVal, 5); /* default precision: 5 */ + 300484c: 4515 li a0,5 + 300484e: fd442507 flw fa0,-44(s0) + 3004852: 3ba9 jal ra,30045ac + 3004854: 872a mv a4,a0 + 3004856: fec42783 lw a5,-20(s0) + 300485a: 97ba add a5,a5,a4 + 300485c: fef42623 sw a5,-20(s0) + break; + 3004860: a819 j 3004876 + default: + DBG_PrintCh(ch); + 3004862: fcf40783 lb a5,-49(s0) + 3004866: 853e mv a0,a5 + 3004868: 3c75 jal ra,3004324 + cnt += 1; + 300486a: fec42783 lw a5,-20(s0) + 300486e: 0785 addi a5,a5,1 + 3004870: fef42623 sw a5,-20(s0) + break; + 3004874: 0001 nop + } + return cnt; + 3004876: fec42783 lw a5,-20(s0) +} + 300487a: 853e mv a0,a5 + 300487c: 50f2 lw ra,60(sp) + 300487e: 5462 lw s0,56(sp) + 3004880: 6121 addi sp,sp,64 + 3004882: 8082 ret + +03004884 : + * @param intNum The decimal number to be printed. + * @param fieldWidth Field width. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintIntWithField(int intNum, int fieldWidth) +{ + 3004884: 7139 addi sp,sp,-64 + 3004886: de06 sw ra,60(sp) + 3004888: dc22 sw s0,56(sp) + 300488a: 0080 addi s0,sp,64 + 300488c: fca42623 sw a0,-52(s0) + 3004890: fcb42423 sw a1,-56(s0) + int zeroCnt = 0; + 3004894: fc042e23 sw zero,-36(s0) + int digitsCnt = 0; + 3004898: fe042623 sw zero,-20(s0) + unsigned int cnt = 0; + 300489c: fe042423 sw zero,-24(s0) + + if (intNum == 0) { + 30048a0: fcc42783 lw a5,-52(s0) + 30048a4: e791 bnez a5,30048b0 + DBG_PrintCh('0'); + 30048a6: 03000513 li a0,48 + 30048aa: 3cad jal ra,3004324 + return 1; + 30048ac: 4785 li a5,1 + 30048ae: a0dd j 3004994 + } + if (intNum < 0) { + 30048b0: fcc42783 lw a5,-52(s0) + 30048b4: 0607dd63 bgez a5,300492e + DBG_PrintCh('-'); /* add symbol */ + 30048b8: 02d00513 li a0,45 + 30048bc: 34a5 jal ra,3004324 + cnt++; + 30048be: fe842783 lw a5,-24(s0) + 30048c2: 0785 addi a5,a5,1 + 30048c4: fef42423 sw a5,-24(s0) + intNum = -intNum; + 30048c8: fcc42783 lw a5,-52(s0) + 30048cc: 40f007b3 neg a5,a5 + 30048d0: fcf42623 sw a5,-52(s0) + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 30048d4: 45a9 li a1,10 + 30048d6: fcc42503 lw a0,-52(s0) + 30048da: 3e19 jal ra,30043f0 + 30048dc: 87aa mv a5,a0 + 30048de: fef42623 sw a5,-20(s0) + zeroCnt = fieldWidth - digitsCnt; + 30048e2: fc842703 lw a4,-56(s0) + 30048e6: fec42783 lw a5,-20(s0) + 30048ea: 40f707b3 sub a5,a4,a5 + 30048ee: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 30048f2: fe042223 sw zero,-28(s0) + 30048f6: a831 j 3004912 + DBG_PrintCh('0'); /* add '0' */ + 30048f8: 03000513 li a0,48 + 30048fc: 3425 jal ra,3004324 + cnt++; + 30048fe: fe842783 lw a5,-24(s0) + 3004902: 0785 addi a5,a5,1 + 3004904: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004908: fe442783 lw a5,-28(s0) + 300490c: 0785 addi a5,a5,1 + 300490e: fef42223 sw a5,-28(s0) + 3004912: fe442703 lw a4,-28(s0) + 3004916: fdc42783 lw a5,-36(s0) + 300491a: fcf74fe3 blt a4,a5,30048f8 + } + cnt += digitsCnt; + 300491e: fec42783 lw a5,-20(s0) + 3004922: fe842703 lw a4,-24(s0) + 3004926: 97ba add a5,a5,a4 + 3004928: fef42423 sw a5,-24(s0) + 300492c: a891 j 3004980 + } else { + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 300492e: 45a9 li a1,10 + 3004930: fcc42503 lw a0,-52(s0) + 3004934: 3c75 jal ra,30043f0 + 3004936: 87aa mv a5,a0 + 3004938: fef42623 sw a5,-20(s0) + cnt = digitsCnt; + 300493c: fec42783 lw a5,-20(s0) + 3004940: fef42423 sw a5,-24(s0) + zeroCnt = fieldWidth - digitsCnt; + 3004944: fc842703 lw a4,-56(s0) + 3004948: fec42783 lw a5,-20(s0) + 300494c: 40f707b3 sub a5,a4,a5 + 3004950: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004954: fe042023 sw zero,-32(s0) + 3004958: a831 j 3004974 + DBG_PrintCh('0'); /* add '0' */ + 300495a: 03000513 li a0,48 + 300495e: 32d9 jal ra,3004324 + cnt++; + 3004960: fe842783 lw a5,-24(s0) + 3004964: 0785 addi a5,a5,1 + 3004966: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 300496a: fe042783 lw a5,-32(s0) + 300496e: 0785 addi a5,a5,1 + 3004970: fef42023 sw a5,-32(s0) + 3004974: fe042703 lw a4,-32(s0) + 3004978: fdc42783 lw a5,-36(s0) + 300497c: fcf74fe3 blt a4,a5,300495a + } + } + DBG_PutUnsignedNum(intNum, DECIMAL, digitsCnt); + 3004980: fcc42783 lw a5,-52(s0) + 3004984: fec42703 lw a4,-20(s0) + 3004988: 863a mv a2,a4 + 300498a: 45a9 li a1,10 + 300498c: 853e mv a0,a5 + 300498e: 34e9 jal ra,3004458 + return cnt; + 3004990: fe842783 lw a5,-24(s0) +} + 3004994: 853e mv a0,a5 + 3004996: 50f2 lw ra,60(sp) + 3004998: 5462 lw s0,56(sp) + 300499a: 6121 addi sp,sp,64 + 300499c: 8082 ret + +0300499e : + +static int DBG_Atoi(const char **s) +{ + 300499e: 7179 addi sp,sp,-48 + 30049a0: d622 sw s0,44(sp) + 30049a2: 1800 addi s0,sp,48 + 30049a4: fca42e23 sw a0,-36(s0) + int i, c; + + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 30049a8: fe042623 sw zero,-20(s0) + 30049ac: a02d j 30049d6 + i = i * 10 + c - '0'; /* 10: decimal */ + 30049ae: fec42703 lw a4,-20(s0) + 30049b2: 47a9 li a5,10 + 30049b4: 02f70733 mul a4,a4,a5 + 30049b8: fe842783 lw a5,-24(s0) + 30049bc: 97ba add a5,a5,a4 + 30049be: fd078793 addi a5,a5,-48 + 30049c2: fef42623 sw a5,-20(s0) + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 30049c6: fdc42783 lw a5,-36(s0) + 30049ca: 439c lw a5,0(a5) + 30049cc: 00178713 addi a4,a5,1 + 30049d0: fdc42783 lw a5,-36(s0) + 30049d4: c398 sw a4,0(a5) + 30049d6: fdc42783 lw a5,-36(s0) + 30049da: 439c lw a5,0(a5) + 30049dc: 00078783 lb a5,0(a5) + 30049e0: fef42423 sw a5,-24(s0) + 30049e4: fe842703 lw a4,-24(s0) + 30049e8: 02f00793 li a5,47 + 30049ec: 00e7d863 bge a5,a4,30049fc + 30049f0: fe842703 lw a4,-24(s0) + 30049f4: 03900793 li a5,57 + 30049f8: fae7dbe3 bge a5,a4,30049ae + } + return i; + 30049fc: fec42783 lw a5,-20(s0) +} + 3004a00: 853e mv a0,a5 + 3004a02: 5432 lw s0,44(sp) + 3004a04: 6145 addi sp,sp,48 + 3004a06: 8082 ret + +03004a08 : + * @param ... Variable parameter list. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, return BASE_STATUS_ERROR. + */ +int DBG_UartPrintf(const char *format, ...) +{ + 3004a08: 711d addi sp,sp,-96 + 3004a0a: de06 sw ra,60(sp) + 3004a0c: dc22 sw s0,56(sp) + 3004a0e: 0080 addi s0,sp,64 + 3004a10: fca42623 sw a0,-52(s0) + 3004a14: c04c sw a1,4(s0) + 3004a16: c410 sw a2,8(s0) + 3004a18: c454 sw a3,12(s0) + 3004a1a: c818 sw a4,16(s0) + 3004a1c: c85c sw a5,20(s0) + 3004a1e: 01042c23 sw a6,24(s0) + 3004a22: 01142e23 sw a7,28(s0) + DEBUG_ASSERT_PARAM(format != NULL); + int cnt = 0; + 3004a26: fe042623 sw zero,-20(s0) + int fieldWidth = 0; + 3004a2a: fe042423 sw zero,-24(s0) + int floatPrecision = 0; + 3004a2e: fe042223 sw zero,-28(s0) + float fltVal = 0; + 3004a32: fe042023 sw zero,-32(s0) + int intVal = 0; + 3004a36: fc042e23 sw zero,-36(s0) + va_list paramList; + VA_START(paramList, format); + 3004a3a: 02040793 addi a5,s0,32 + 3004a3e: 1791 addi a5,a5,-28 + 3004a40: fcf42c23 sw a5,-40(s0) + + while (*format != '\0') { + 3004a44: aa09 j 3004b56 + if (*format != '%') { + 3004a46: fcc42783 lw a5,-52(s0) + 3004a4a: 00078703 lb a4,0(a5) + 3004a4e: 02500793 li a5,37 + 3004a52: 00f70e63 beq a4,a5,3004a6e + DBG_PrintCh(*format); + 3004a56: fcc42783 lw a5,-52(s0) + 3004a5a: 00078783 lb a5,0(a5) + 3004a5e: 853e mv a0,a5 + 3004a60: 30d1 jal ra,3004324 + cnt += 1; + 3004a62: fec42783 lw a5,-20(s0) + 3004a66: 0785 addi a5,a5,1 + 3004a68: fef42623 sw a5,-20(s0) + 3004a6c: a0c5 j 3004b4c + } else { + format++; + 3004a6e: fcc42783 lw a5,-52(s0) + 3004a72: 0785 addi a5,a5,1 + 3004a74: fcf42623 sw a5,-52(s0) + if (*format == '0') { + 3004a78: fcc42783 lw a5,-52(s0) + 3004a7c: 00078703 lb a4,0(a5) + 3004a80: 03000793 li a5,48 + 3004a84: 04f71263 bne a4,a5,3004ac8 + format++; + 3004a88: fcc42783 lw a5,-52(s0) + 3004a8c: 0785 addi a5,a5,1 + 3004a8e: fcf42623 sw a5,-52(s0) + fieldWidth = DBG_Atoi(&format); + 3004a92: fcc40793 addi a5,s0,-52 + 3004a96: 853e mv a0,a5 + 3004a98: 3719 jal ra,300499e + 3004a9a: fea42423 sw a0,-24(s0) + intVal = VA_ARG(paramList, int); + 3004a9e: fd842783 lw a5,-40(s0) + 3004aa2: 00478713 addi a4,a5,4 + 3004aa6: fce42c23 sw a4,-40(s0) + 3004aaa: 439c lw a5,0(a5) + 3004aac: fcf42e23 sw a5,-36(s0) + cnt += DBG_PrintIntWithField(intVal, fieldWidth); + 3004ab0: fe842583 lw a1,-24(s0) + 3004ab4: fdc42503 lw a0,-36(s0) + 3004ab8: 33f1 jal ra,3004884 + 3004aba: 872a mv a4,a0 + 3004abc: fec42783 lw a5,-20(s0) + 3004ac0: 97ba add a5,a5,a4 + 3004ac2: fef42623 sw a5,-20(s0) + 3004ac6: a059 j 3004b4c + } else if (*format == '.') { + 3004ac8: fcc42783 lw a5,-52(s0) + 3004acc: 00078703 lb a4,0(a5) + 3004ad0: 02e00793 li a5,46 + 3004ad4: 04f71d63 bne a4,a5,3004b2e + format++; + 3004ad8: fcc42783 lw a5,-52(s0) + 3004adc: 0785 addi a5,a5,1 + 3004ade: fcf42623 sw a5,-52(s0) + floatPrecision = DBG_Atoi(&format); + 3004ae2: fcc40793 addi a5,s0,-52 + 3004ae6: 853e mv a0,a5 + 3004ae8: 3d5d jal ra,300499e + 3004aea: fea42223 sw a0,-28(s0) + fltVal = VA_ARG(paramList, double); + 3004aee: fd842783 lw a5,-40(s0) + 3004af2: 079d addi a5,a5,7 + 3004af4: 9be1 andi a5,a5,-8 + 3004af6: 00878713 addi a4,a5,8 + 3004afa: fce42c23 sw a4,-40(s0) + 3004afe: 0047a803 lw a6,4(a5) + 3004b02: 439c lw a5,0(a5) + 3004b04: 853e mv a0,a5 + 3004b06: 85c2 mv a1,a6 + 3004b08: 494010ef jal ra,3005f9c <__truncdfsf2> + 3004b0c: 20a507d3 fmv.s fa5,fa0 + 3004b10: fef42027 fsw fa5,-32(s0) + cnt += DBG_PrintFlt(fltVal, floatPrecision); + 3004b14: fe442783 lw a5,-28(s0) + 3004b18: 853e mv a0,a5 + 3004b1a: fe042507 flw fa0,-32(s0) + 3004b1e: 3479 jal ra,30045ac + 3004b20: 872a mv a4,a0 + 3004b22: fec42783 lw a5,-20(s0) + 3004b26: 97ba add a5,a5,a4 + 3004b28: fef42623 sw a5,-20(s0) + 3004b2c: a005 j 3004b4c + } else { + cnt += ParseSpecifier(*format, ¶mList); + 3004b2e: fcc42783 lw a5,-52(s0) + 3004b32: 00078783 lb a5,0(a5) + 3004b36: fd840713 addi a4,s0,-40 + 3004b3a: 85ba mv a1,a4 + 3004b3c: 853e mv a0,a5 + 3004b3e: 366d jal ra,30046e8 + 3004b40: 872a mv a4,a0 + 3004b42: fec42783 lw a5,-20(s0) + 3004b46: 97ba add a5,a5,a4 + 3004b48: fef42623 sw a5,-20(s0) + } + } + format++; + 3004b4c: fcc42783 lw a5,-52(s0) + 3004b50: 0785 addi a5,a5,1 + 3004b52: fcf42623 sw a5,-52(s0) + while (*format != '\0') { + 3004b56: fcc42783 lw a5,-52(s0) + 3004b5a: 00078783 lb a5,0(a5) + 3004b5e: ee0794e3 bnez a5,3004a46 + } + VA_END(paramList); + return cnt; + 3004b62: fec42783 lw a5,-20(s0) +} + 3004b66: 853e mv a0,a5 + 3004b68: 50f2 lw ra,60(sp) + 3004b6a: 5462 lw s0,56(sp) + 3004b6c: 6125 addi sp,sp,96 + 3004b6e: 8082 ret + +03004b70 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param regValue value of @ref IOCMG_REG. + * @retval None. + */ +static inline void DCL_IOCMG_SetRegValue(IOCMG_REG *iocmgRegx, unsigned int regValue) +{ + 3004b70: 1101 addi sp,sp,-32 + 3004b72: ce06 sw ra,28(sp) + 3004b74: cc22 sw s0,24(sp) + 3004b76: 1000 addi s0,sp,32 + 3004b78: fea42623 sw a0,-20(s0) + 3004b7c: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004b80: fec42703 lw a4,-20(s0) + 3004b84: 77c1 lui a5,0xffff0 + 3004b86: 8f7d and a4,a4,a5 + 3004b88: 147f07b7 lui a5,0x147f0 + 3004b8c: 00f70a63 beq a4,a5,3004ba0 + 3004b90: 08b00593 li a1,139 + 3004b94: 030067b7 lui a5,0x3006 + 3004b98: 5cc78513 addi a0,a5,1484 # 30065cc + 3004b9c: 2df1 jal ra,3005278 + 3004b9e: a001 j 3004b9e + iocmgRegx->reg = regValue; + 3004ba0: fec42783 lw a5,-20(s0) + 3004ba4: fe842703 lw a4,-24(s0) + 3004ba8: c398 sw a4,0(a5) +} + 3004baa: 0001 nop + 3004bac: 40f2 lw ra,28(sp) + 3004bae: 4462 lw s0,24(sp) + 3004bb0: 6105 addi sp,sp,32 + 3004bb2: 8082 ret + +03004bb4 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param driveRate value of @ref IOCMG_DriveRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetDriveRate(IOCMG_REG *iocmgRegx, IOCMG_DriveRate driveRate) +{ + 3004bb4: 1101 addi sp,sp,-32 + 3004bb6: ce06 sw ra,28(sp) + 3004bb8: cc22 sw s0,24(sp) + 3004bba: 1000 addi s0,sp,32 + 3004bbc: fea42623 sw a0,-20(s0) + 3004bc0: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004bc4: fec42703 lw a4,-20(s0) + 3004bc8: 77c1 lui a5,0xffff0 + 3004bca: 8f7d and a4,a4,a5 + 3004bcc: 147f07b7 lui a5,0x147f0 + 3004bd0: 00f70a63 beq a4,a5,3004be4 + 3004bd4: 0ba00593 li a1,186 + 3004bd8: 030067b7 lui a5,0x3006 + 3004bdc: 5cc78513 addi a0,a5,1484 # 30065cc + 3004be0: 2d61 jal ra,3005278 + 3004be2: a001 j 3004be2 + IOCMG_PARAM_CHECK_NO_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4); + 3004be4: fe842703 lw a4,-24(s0) + 3004be8: 478d li a5,3 + 3004bea: 00e7fa63 bgeu a5,a4,3004bfe + 3004bee: 0bb00593 li a1,187 + 3004bf2: 030067b7 lui a5,0x3006 + 3004bf6: 5cc78513 addi a0,a5,1484 # 30065cc + 3004bfa: 2dbd jal ra,3005278 + 3004bfc: a839 j 3004c1a + iocmgRegx->BIT.ds = driveRate; + 3004bfe: fe842783 lw a5,-24(s0) + 3004c02: 8b8d andi a5,a5,3 + 3004c04: 0ff7f693 andi a3,a5,255 + 3004c08: fec42703 lw a4,-20(s0) + 3004c0c: 431c lw a5,0(a4) + 3004c0e: 8a8d andi a3,a3,3 + 3004c10: 0692 slli a3,a3,0x4 + 3004c12: fcf7f793 andi a5,a5,-49 + 3004c16: 8fd5 or a5,a5,a3 + 3004c18: c31c sw a5,0(a4) +} + 3004c1a: 40f2 lw ra,28(sp) + 3004c1c: 4462 lw s0,24(sp) + 3004c1e: 6105 addi sp,sp,32 + 3004c20: 8082 ret + +03004c22 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param pullMode value of @ref IOCMG_PullMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetPullMode(IOCMG_REG *iocmgRegx, IOCMG_PullMode pullMode) +{ + 3004c22: 1101 addi sp,sp,-32 + 3004c24: ce06 sw ra,28(sp) + 3004c26: cc22 sw s0,24(sp) + 3004c28: 1000 addi s0,sp,32 + 3004c2a: fea42623 sw a0,-20(s0) + 3004c2e: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004c32: fec42703 lw a4,-20(s0) + 3004c36: 77c1 lui a5,0xffff0 + 3004c38: 8f7d and a4,a4,a5 + 3004c3a: 147f07b7 lui a5,0x147f0 + 3004c3e: 00f70a63 beq a4,a5,3004c52 + 3004c42: 0d200593 li a1,210 + 3004c46: 030067b7 lui a5,0x3006 + 3004c4a: 5cc78513 addi a0,a5,1484 # 30065cc + 3004c4e: 252d jal ra,3005278 + 3004c50: a001 j 3004c50 + IOCMG_PARAM_CHECK_NO_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE); + 3004c52: fe842703 lw a4,-24(s0) + 3004c56: 478d li a5,3 + 3004c58: 00e7fa63 bgeu a5,a4,3004c6c + 3004c5c: 0d300593 li a1,211 + 3004c60: 030067b7 lui a5,0x3006 + 3004c64: 5cc78513 addi a0,a5,1484 # 30065cc + 3004c68: 2d01 jal ra,3005278 + 3004c6a: a835 j 3004ca6 + iocmgRegx->BIT.pu = (pullMode & 0x02) >> 1; /* 10b: pull up mode */ + 3004c6c: fe842783 lw a5,-24(s0) + 3004c70: 8385 srli a5,a5,0x1 + 3004c72: 8b85 andi a5,a5,1 + 3004c74: 0ff7f693 andi a3,a5,255 + 3004c78: fec42703 lw a4,-20(s0) + 3004c7c: 431c lw a5,0(a4) + 3004c7e: 8a85 andi a3,a3,1 + 3004c80: 06a2 slli a3,a3,0x8 + 3004c82: eff7f793 andi a5,a5,-257 + 3004c86: 8fd5 or a5,a5,a3 + 3004c88: c31c sw a5,0(a4) + iocmgRegx->BIT.pd = pullMode & 0x01; /* 01b: pull down mode */ + 3004c8a: fe842783 lw a5,-24(s0) + 3004c8e: 8b85 andi a5,a5,1 + 3004c90: 0ff7f693 andi a3,a5,255 + 3004c94: fec42703 lw a4,-20(s0) + 3004c98: 431c lw a5,0(a4) + 3004c9a: 8a85 andi a3,a3,1 + 3004c9c: 069e slli a3,a3,0x7 + 3004c9e: f7f7f793 andi a5,a5,-129 + 3004ca2: 8fd5 or a5,a5,a3 + 3004ca4: c31c sw a5,0(a4) +} + 3004ca6: 40f2 lw ra,28(sp) + 3004ca8: 4462 lw s0,24(sp) + 3004caa: 6105 addi sp,sp,32 + 3004cac: 8082 ret + +03004cae : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param levelShiftRate value of @ref IOCMG_LevelShiftRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetLevelShiftRate(IOCMG_REG *iocmgRegx, IOCMG_LevelShiftRate levelShiftRate) +{ + 3004cae: 1101 addi sp,sp,-32 + 3004cb0: ce06 sw ra,28(sp) + 3004cb2: cc22 sw s0,24(sp) + 3004cb4: 1000 addi s0,sp,32 + 3004cb6: fea42623 sw a0,-20(s0) + 3004cba: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004cbe: fec42703 lw a4,-20(s0) + 3004cc2: 77c1 lui a5,0xffff0 + 3004cc4: 8f7d and a4,a4,a5 + 3004cc6: 147f07b7 lui a5,0x147f0 + 3004cca: 00f70a63 beq a4,a5,3004cde + 3004cce: 0ed00593 li a1,237 + 3004cd2: 030067b7 lui a5,0x3006 + 3004cd6: 5cc78513 addi a0,a5,1484 # 30065cc + 3004cda: 2b79 jal ra,3005278 + 3004cdc: a001 j 3004cdc + IOCMG_PARAM_CHECK_NO_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX && levelShiftRate >= LEVEL_SHIFT_RATE_FAST); + 3004cde: fe842703 lw a4,-24(s0) + 3004ce2: 4785 li a5,1 + 3004ce4: 00e7fa63 bgeu a5,a4,3004cf8 + 3004ce8: 0ee00593 li a1,238 + 3004cec: 030067b7 lui a5,0x3006 + 3004cf0: 5cc78513 addi a0,a5,1484 # 30065cc + 3004cf4: 2351 jal ra,3005278 + 3004cf6: a839 j 3004d14 + iocmgRegx->BIT.sr = levelShiftRate; + 3004cf8: fe842783 lw a5,-24(s0) + 3004cfc: 8b85 andi a5,a5,1 + 3004cfe: 0ff7f693 andi a3,a5,255 + 3004d02: fec42703 lw a4,-20(s0) + 3004d06: 431c lw a5,0(a4) + 3004d08: 8a85 andi a3,a3,1 + 3004d0a: 06a6 slli a3,a3,0x9 + 3004d0c: dff7f793 andi a5,a5,-513 + 3004d10: 8fd5 or a5,a5,a3 + 3004d12: c31c sw a5,0(a4) +} + 3004d14: 40f2 lw ra,28(sp) + 3004d16: 4462 lw s0,24(sp) + 3004d18: 6105 addi sp,sp,32 + 3004d1a: 8082 ret + +03004d1c : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param schmidtMode value of @ref IOCMG_SchmidtMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetSchmidtMode(IOCMG_REG *iocmgRegx, IOCMG_SchmidtMode schmidtMode) +{ + 3004d1c: 1101 addi sp,sp,-32 + 3004d1e: ce06 sw ra,28(sp) + 3004d20: cc22 sw s0,24(sp) + 3004d22: 1000 addi s0,sp,32 + 3004d24: fea42623 sw a0,-20(s0) + 3004d28: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004d2c: fec42703 lw a4,-20(s0) + 3004d30: 77c1 lui a5,0xffff0 + 3004d32: 8f7d and a4,a4,a5 + 3004d34: 147f07b7 lui a5,0x147f0 + 3004d38: 00f70a63 beq a4,a5,3004d4c + 3004d3c: 10500593 li a1,261 + 3004d40: 030067b7 lui a5,0x3006 + 3004d44: 5cc78513 addi a0,a5,1484 # 30065cc + 3004d48: 2b05 jal ra,3005278 + 3004d4a: a001 j 3004d4a + IOCMG_PARAM_CHECK_NO_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE); + 3004d4c: fe842703 lw a4,-24(s0) + 3004d50: 4785 li a5,1 + 3004d52: 00e7fa63 bgeu a5,a4,3004d66 + 3004d56: 10600593 li a1,262 + 3004d5a: 030067b7 lui a5,0x3006 + 3004d5e: 5cc78513 addi a0,a5,1484 # 30065cc + 3004d62: 2b19 jal ra,3005278 + 3004d64: a839 j 3004d82 + iocmgRegx->BIT.se = schmidtMode; + 3004d66: fe842783 lw a5,-24(s0) + 3004d6a: 8b85 andi a5,a5,1 + 3004d6c: 0ff7f693 andi a3,a5,255 + 3004d70: fec42703 lw a4,-20(s0) + 3004d74: 431c lw a5,0(a4) + 3004d76: 8a85 andi a3,a3,1 + 3004d78: 06aa slli a3,a3,0xa + 3004d7a: bff7f793 andi a5,a5,-1025 + 3004d7e: 8fd5 or a5,a5,a3 + 3004d80: c31c sw a5,0(a4) +} + 3004d82: 40f2 lw ra,28(sp) + 3004d84: 4462 lw s0,24(sp) + 3004d86: 6105 addi sp,sp,32 + 3004d88: 8082 ret + +03004d8a : + * @brief Get pins iocmg reg address + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_REG iocmg reg address. + */ +static IOCMG_REG* IOCMG_GetRegAddr(unsigned int pinTypedef) +{ + 3004d8a: 7179 addi sp,sp,-48 + 3004d8c: d622 sw s0,44(sp) + 3004d8e: 1800 addi s0,sp,48 + 3004d90: fca42e23 sw a0,-36(s0) + /* decode pin's iocmg reg offset address in base address, and conver value to point address */ + unsigned int iocmgBaseAddrValue = (uintptr_t)IOCMG_BASE; + 3004d94: 147f07b7 lui a5,0x147f0 + 3004d98: fef42623 sw a5,-20(s0) + unsigned int iocmgRegOffsetAddrValue = (pinTypedef >> 16) & 0x00000FFF; /* 16 : shift 16 bit */ + 3004d9c: fdc42783 lw a5,-36(s0) + 3004da0: 0107d713 srli a4,a5,0x10 + 3004da4: 6785 lui a5,0x1 + 3004da6: 17fd addi a5,a5,-1 # fff + 3004da8: 8ff9 and a5,a5,a4 + 3004daa: fef42423 sw a5,-24(s0) + IOCMG_REG* iocmgRegxAddr = (IOCMG_REG*)(void*)(iocmgBaseAddrValue + iocmgRegOffsetAddrValue); + 3004dae: fec42703 lw a4,-20(s0) + 3004db2: fe842783 lw a5,-24(s0) + 3004db6: 97ba add a5,a5,a4 + 3004db8: fef42223 sw a5,-28(s0) + if (!IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegxAddr & IOCMG_BASE_ADDR_MASK))) { + 3004dbc: fe442703 lw a4,-28(s0) + 3004dc0: 77c1 lui a5,0xffff0 + 3004dc2: 8f7d and a4,a4,a5 + 3004dc4: 147f07b7 lui a5,0x147f0 + 3004dc8: 00f70463 beq a4,a5,3004dd0 + return NULL; + 3004dcc: 4781 li a5,0 + 3004dce: a019 j 3004dd4 + } + return iocmgRegxAddr; + 3004dd0: fe442783 lw a5,-28(s0) +} + 3004dd4: 853e mv a0,a5 + 3004dd6: 5432 lw s0,44(sp) + 3004dd8: 6145 addi sp,sp,48 + 3004dda: 8082 ret + +03004ddc : + * @brief Set pins as function mode + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinAltFuncMode(unsigned int pinTypedef) +{ + 3004ddc: 7179 addi sp,sp,-48 + 3004dde: d606 sw ra,44(sp) + 3004de0: d422 sw s0,40(sp) + 3004de2: 1800 addi s0,sp,48 + 3004de4: fca42e23 sw a0,-36(s0) + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004de8: fdc42503 lw a0,-36(s0) + 3004dec: 3f79 jal ra,3004d8a + 3004dee: fea42623 sw a0,-20(s0) + /* get iocmg reg default value */ + unsigned int regValue = pinTypedef & IOCMG_REG_VALUE_MASK; + 3004df2: fdc42703 lw a4,-36(s0) + 3004df6: 67c1 lui a5,0x10 + 3004df8: 17fd addi a5,a5,-1 # ffff + 3004dfa: 8ff9 and a5,a5,a4 + 3004dfc: fef42423 sw a5,-24(s0) + DCL_IOCMG_SetRegValue(iocmgRegx, regValue); + 3004e00: fe842583 lw a1,-24(s0) + 3004e04: fec42503 lw a0,-20(s0) + 3004e08: 33a5 jal ra,3004b70 + return IOCMG_STATUS_OK; + 3004e0a: 4781 li a5,0 +} + 3004e0c: 853e mv a0,a5 + 3004e0e: 50b2 lw ra,44(sp) + 3004e10: 5422 lw s0,40(sp) + 3004e12: 6145 addi sp,sp,48 + 3004e14: 8082 ret + +03004e16 : + * @param pinTypedef the pin type defined in iomap.h + * @param pullMode function define as @ref IOCMG_PullMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinPullMode(unsigned int pinTypedef, IOCMG_PullMode pullMode) +{ + 3004e16: 7179 addi sp,sp,-48 + 3004e18: d606 sw ra,44(sp) + 3004e1a: d422 sw s0,40(sp) + 3004e1c: 1800 addi s0,sp,48 + 3004e1e: fca42e23 sw a0,-36(s0) + 3004e22: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE, IOCMG_PARAM_ERROR); + 3004e26: fd842703 lw a4,-40(s0) + 3004e2a: 478d li a5,3 + 3004e2c: 00e7fb63 bgeu a5,a4,3004e42 + 3004e30: 07800593 li a1,120 + 3004e34: 030067b7 lui a5,0x3006 + 3004e38: 5ec78513 addi a0,a5,1516 # 30065ec + 3004e3c: 2935 jal ra,3005278 + 3004e3e: 4791 li a5,4 + 3004e40: a821 j 3004e58 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004e42: fdc42503 lw a0,-36(s0) + 3004e46: 3791 jal ra,3004d8a + 3004e48: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetPullMode(iocmgRegx, pullMode); + 3004e4c: fd842583 lw a1,-40(s0) + 3004e50: fec42503 lw a0,-20(s0) + 3004e54: 33f9 jal ra,3004c22 + return IOCMG_STATUS_OK; + 3004e56: 4781 li a5,0 +} + 3004e58: 853e mv a0,a5 + 3004e5a: 50b2 lw ra,44(sp) + 3004e5c: 5422 lw s0,40(sp) + 3004e5e: 6145 addi sp,sp,48 + 3004e60: 8082 ret + +03004e62 : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinSchmidtMode(unsigned int pinTypedef, IOCMG_SchmidtMode schmidtMode) +{ + 3004e62: 7179 addi sp,sp,-48 + 3004e64: d606 sw ra,44(sp) + 3004e66: d422 sw s0,40(sp) + 3004e68: 1800 addi s0,sp,48 + 3004e6a: fca42e23 sw a0,-36(s0) + 3004e6e: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE, IOCMG_PARAM_ERROR); + 3004e72: fd842703 lw a4,-40(s0) + 3004e76: 4785 li a5,1 + 3004e78: 00e7fb63 bgeu a5,a4,3004e8e + 3004e7c: 09300593 li a1,147 + 3004e80: 030067b7 lui a5,0x3006 + 3004e84: 5ec78513 addi a0,a5,1516 # 30065ec + 3004e88: 2ec5 jal ra,3005278 + 3004e8a: 4791 li a5,4 + 3004e8c: a821 j 3004ea4 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004e8e: fdc42503 lw a0,-36(s0) + 3004e92: 3de5 jal ra,3004d8a + 3004e94: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetSchmidtMode(iocmgRegx, schmidtMode); + 3004e98: fd842583 lw a1,-40(s0) + 3004e9c: fec42503 lw a0,-20(s0) + 3004ea0: 3db5 jal ra,3004d1c + return IOCMG_STATUS_OK; + 3004ea2: 4781 li a5,0 +} + 3004ea4: 853e mv a0,a5 + 3004ea6: 50b2 lw ra,44(sp) + 3004ea8: 5422 lw s0,40(sp) + 3004eaa: 6145 addi sp,sp,48 + 3004eac: 8082 ret + +03004eae : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinLevelShiftRate(unsigned int pinTypedef, IOCMG_LevelShiftRate levelShiftRate) +{ + 3004eae: 7179 addi sp,sp,-48 + 3004eb0: d606 sw ra,44(sp) + 3004eb2: d422 sw s0,40(sp) + 3004eb4: 1800 addi s0,sp,48 + 3004eb6: fca42e23 sw a0,-36(s0) + 3004eba: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX, IOCMG_PARAM_ERROR); + 3004ebe: fd842703 lw a4,-40(s0) + 3004ec2: 4785 li a5,1 + 3004ec4: 00e7fb63 bgeu a5,a4,3004eda + 3004ec8: 0ae00593 li a1,174 + 3004ecc: 030067b7 lui a5,0x3006 + 3004ed0: 5ec78513 addi a0,a5,1516 # 30065ec + 3004ed4: 2655 jal ra,3005278 + 3004ed6: 4791 li a5,4 + 3004ed8: a821 j 3004ef0 + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate >= LEVEL_SHIFT_RATE_FAST, IOCMG_PARAM_ERROR); + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004eda: fdc42503 lw a0,-36(s0) + 3004ede: 3575 jal ra,3004d8a + 3004ee0: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetLevelShiftRate(iocmgRegx, levelShiftRate); + 3004ee4: fd842583 lw a1,-40(s0) + 3004ee8: fec42503 lw a0,-20(s0) + 3004eec: 33c9 jal ra,3004cae + return IOCMG_STATUS_OK; + 3004eee: 4781 li a5,0 +} + 3004ef0: 853e mv a0,a5 + 3004ef2: 50b2 lw ra,44(sp) + 3004ef4: 5422 lw s0,40(sp) + 3004ef6: 6145 addi sp,sp,48 + 3004ef8: 8082 ret + +03004efa : + * @param pinTypedef the pin type defined in iomap.h + * @param driveRate function define as @ref IOCMG_DriveRate + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinDriveRate(unsigned int pinTypedef, IOCMG_DriveRate driveRate) +{ + 3004efa: 7179 addi sp,sp,-48 + 3004efc: d606 sw ra,44(sp) + 3004efe: d422 sw s0,40(sp) + 3004f00: 1800 addi s0,sp,48 + 3004f02: fca42e23 sw a0,-36(s0) + 3004f06: fcb42c23 sw a1,-40(s0) + /* get iocmg reg address */ + IOCMG_PARAM_CHECK_WITH_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4, IOCMG_PARAM_ERROR); + 3004f0a: fd842703 lw a4,-40(s0) + 3004f0e: 478d li a5,3 + 3004f10: 00e7fb63 bgeu a5,a4,3004f26 + 3004f14: 0cb00593 li a1,203 + 3004f18: 030067b7 lui a5,0x3006 + 3004f1c: 5ec78513 addi a0,a5,1516 # 30065ec + 3004f20: 2ea1 jal ra,3005278 + 3004f22: 4791 li a5,4 + 3004f24: a821 j 3004f3c + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004f26: fdc42503 lw a0,-36(s0) + 3004f2a: 3585 jal ra,3004d8a + 3004f2c: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetDriveRate(iocmgRegx, driveRate); + 3004f30: fd842583 lw a1,-40(s0) + 3004f34: fec42503 lw a0,-20(s0) + 3004f38: 39b5 jal ra,3004bb4 + return IOCMG_STATUS_OK; + 3004f3a: 4781 li a5,0 +} + 3004f3c: 853e mv a0,a5 + 3004f3e: 50b2 lw ra,44(sp) + 3004f40: 5422 lw s0,40(sp) + 3004f42: 6145 addi sp,sp,48 + 3004f44: 8082 ret + +03004f46 : + * @param mode Timer Mode, @ref TIMER_Mode + * @retval true + * @retval false + */ +static inline bool IsTimerMode(TIMER_Mode mode) +{ + 3004f46: 1101 addi sp,sp,-32 + 3004f48: ce22 sw s0,28(sp) + 3004f4a: 1000 addi s0,sp,32 + 3004f4c: fea42623 sw a0,-20(s0) + return (((mode) == TIMER_MODE_RUN_FREE) || + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3004f50: fec42783 lw a5,-20(s0) + 3004f54: cb99 beqz a5,3004f6a + return (((mode) == TIMER_MODE_RUN_FREE) || + 3004f56: fec42703 lw a4,-20(s0) + 3004f5a: 4785 li a5,1 + 3004f5c: 00f70763 beq a4,a5,3004f6a + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3004f60: fec42703 lw a4,-20(s0) + 3004f64: 4789 li a5,2 + 3004f66: 00f71463 bne a4,a5,3004f6e + 3004f6a: 4785 li a5,1 + 3004f6c: a011 j 3004f70 + 3004f6e: 4781 li a5,0 + 3004f70: 8b85 andi a5,a5,1 + 3004f72: 9f81 uxtb a5 + ((mode) == TIMER_MODE_RUN_ONTSHOT)); +} + 3004f74: 853e mv a0,a5 + 3004f76: 4472 lw s0,28(sp) + 3004f78: 6105 addi sp,sp,32 + 3004f7a: 8082 ret + +03004f7c : + * @param mode Timer Interrupt Type, @ref TIMER_InterruptType + * @retval true + * @retval false + */ +static inline bool IsTimerInterruptType(TIMER_InterruptType interruptType) +{ + 3004f7c: 1101 addi sp,sp,-32 + 3004f7e: ce22 sw s0,28(sp) + 3004f80: 1000 addi s0,sp,32 + 3004f82: fea42623 sw a0,-20(s0) + return (((interruptType) == TIMER_PERIOD_FIN) || + 3004f86: fec42783 lw a5,-20(s0) + 3004f8a: c791 beqz a5,3004f96 + 3004f8c: fec42703 lw a4,-20(s0) + 3004f90: 4785 li a5,1 + 3004f92: 00f71463 bne a4,a5,3004f9a + 3004f96: 4785 li a5,1 + 3004f98: a011 j 3004f9c + 3004f9a: 4781 li a5,0 + 3004f9c: 8b85 andi a5,a5,1 + 3004f9e: 9f81 uxtb a5 + ((interruptType) == TIMER_OVER_FLOW)); +} + 3004fa0: 853e mv a0,a5 + 3004fa2: 4472 lw s0,28(sp) + 3004fa4: 6105 addi sp,sp,32 + 3004fa6: 8082 ret + +03004fa8 : + * @param size Timer Size, @ref TIMER_Size + * @retval true + * @retval false + */ +static inline bool IsTimerSize(TIMER_Size size) +{ + 3004fa8: 1101 addi sp,sp,-32 + 3004faa: ce22 sw s0,28(sp) + 3004fac: 1000 addi s0,sp,32 + 3004fae: fea42623 sw a0,-20(s0) + return (((size) == TIMER_SIZE_16BIT) || + 3004fb2: fec42783 lw a5,-20(s0) + 3004fb6: c791 beqz a5,3004fc2 + 3004fb8: fec42703 lw a4,-20(s0) + 3004fbc: 4785 li a5,1 + 3004fbe: 00f71463 bne a4,a5,3004fc6 + 3004fc2: 4785 li a5,1 + 3004fc4: a011 j 3004fc8 + 3004fc6: 4781 li a5,0 + 3004fc8: 8b85 andi a5,a5,1 + 3004fca: 9f81 uxtb a5 + ((size) == TIMER_SIZE_32BIT)); +} + 3004fcc: 853e mv a0,a5 + 3004fce: 4472 lw s0,28(sp) + 3004fd0: 6105 addi sp,sp,32 + 3004fd2: 8082 ret + +03004fd4 : + * @param period + * @retval true + * @retval false + */ +static inline bool IsTimerPeriod(unsigned int period) +{ + 3004fd4: 1101 addi sp,sp,-32 + 3004fd6: ce22 sw s0,28(sp) + 3004fd8: 1000 addi s0,sp,32 + 3004fda: fea42623 sw a0,-20(s0) + return ((period) >= PERIOD_MIN_VALUE); + 3004fde: fec42783 lw a5,-20(s0) + 3004fe2: 00f037b3 snez a5,a5 + 3004fe6: 9f81 uxtb a5 +} + 3004fe8: 853e mv a0,a5 + 3004fea: 4472 lw s0,28(sp) + 3004fec: 6105 addi sp,sp,32 + 3004fee: 8082 ret + +03004ff0 : + * @param div @see TIMER_PrescalerFactor + * @retval true + * @retval false + */ +static inline bool IsTimerDiv(TIMER_PrescalerFactor div) +{ + 3004ff0: 1101 addi sp,sp,-32 + 3004ff2: ce22 sw s0,28(sp) + 3004ff4: 1000 addi s0,sp,32 + 3004ff6: fea42623 sw a0,-20(s0) + return (((div) == TIMERPRESCALER_NO_DIV) || + ((div) == TIMERPRESCALER_DIV_16) || + 3004ffa: fec42783 lw a5,-20(s0) + 3004ffe: cb99 beqz a5,3005014 + return (((div) == TIMERPRESCALER_NO_DIV) || + 3005000: fec42703 lw a4,-20(s0) + 3005004: 4785 li a5,1 + 3005006: 00f70763 beq a4,a5,3005014 + ((div) == TIMERPRESCALER_DIV_16) || + 300500a: fec42703 lw a4,-20(s0) + 300500e: 4789 li a5,2 + 3005010: 00f71463 bne a4,a5,3005018 + 3005014: 4785 li a5,1 + 3005016: a011 j 300501a + 3005018: 4781 li a5,0 + 300501a: 8b85 andi a5,a5,1 + 300501c: 9f81 uxtb a5 + ((div) == TIMERPRESCALER_DIV_256)); +} + 300501e: 853e mv a0,a5 + 3005020: 4472 lw s0,28(sp) + 3005022: 6105 addi sp,sp,32 + 3005024: 8082 ret + +03005026 : + * @param handle Timer Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR parameter check fail + */ +BASE_StatusType HAL_TIMER_Init(TIMER_Handle *handle) +{ + 3005026: 1101 addi sp,sp,-32 + 3005028: ce06 sw ra,28(sp) + 300502a: cc22 sw s0,24(sp) + 300502c: 1000 addi s0,sp,32 + 300502e: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005032: fec42783 lw a5,-20(s0) + 3005036: eb89 bnez a5,3005048 + 3005038: 02800593 li a1,40 + 300503c: 030067b7 lui a5,0x3006 + 3005040: 62c78513 addi a0,a5,1580 # 300662c + 3005044: 2c15 jal ra,3005278 + 3005046: a001 j 3005046 + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 3005048: fec42783 lw a5,-20(s0) + 300504c: 4398 lw a4,0(a5) + 300504e: 143007b7 lui a5,0x14300 + 3005052: 02f70f63 beq a4,a5,3005090 + 3005056: fec42783 lw a5,-20(s0) + 300505a: 4398 lw a4,0(a5) + 300505c: 143017b7 lui a5,0x14301 + 3005060: 02f70863 beq a4,a5,3005090 + 3005064: fec42783 lw a5,-20(s0) + 3005068: 4398 lw a4,0(a5) + 300506a: 143027b7 lui a5,0x14302 + 300506e: 02f70163 beq a4,a5,3005090 + 3005072: fec42783 lw a5,-20(s0) + 3005076: 4398 lw a4,0(a5) + 3005078: 143037b7 lui a5,0x14303 + 300507c: 00f70a63 beq a4,a5,3005090 + 3005080: 02900593 li a1,41 + 3005084: 030067b7 lui a5,0x3006 + 3005088: 62c78513 addi a0,a5,1580 # 300662c + 300508c: 22f5 jal ra,3005278 + 300508e: a001 j 300508e + + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->load), BASE_STATUS_ERROR); + 3005090: fec42783 lw a5,-20(s0) + 3005094: 4bdc lw a5,20(a5) + 3005096: 853e mv a0,a5 + 3005098: 3f35 jal ra,3004fd4 + 300509a: 87aa mv a5,a0 + 300509c: 0017c793 xori a5,a5,1 + 30050a0: 9f81 uxtb a5 + 30050a2: cb91 beqz a5,30050b6 + 30050a4: 02b00593 li a1,43 + 30050a8: 030067b7 lui a5,0x3006 + 30050ac: 62c78513 addi a0,a5,1580 # 300662c + 30050b0: 22e1 jal ra,3005278 + 30050b2: 4785 li a5,1 + 30050b4: aa6d j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->bgLoad), BASE_STATUS_ERROR); + 30050b6: fec42783 lw a5,-20(s0) + 30050ba: 4f9c lw a5,24(a5) + 30050bc: 853e mv a0,a5 + 30050be: 3f19 jal ra,3004fd4 + 30050c0: 87aa mv a5,a0 + 30050c2: 0017c793 xori a5,a5,1 + 30050c6: 9f81 uxtb a5 + 30050c8: cb91 beqz a5,30050dc + 30050ca: 02c00593 li a1,44 + 30050ce: 030067b7 lui a5,0x3006 + 30050d2: 62c78513 addi a0,a5,1580 # 300662c + 30050d6: 224d jal ra,3005278 + 30050d8: 4785 li a5,1 + 30050da: aa51 j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerMode(handle->mode), BASE_STATUS_ERROR); + 30050dc: fec42783 lw a5,-20(s0) + 30050e0: 479c lw a5,8(a5) + 30050e2: 853e mv a0,a5 + 30050e4: 358d jal ra,3004f46 + 30050e6: 87aa mv a5,a0 + 30050e8: 0017c793 xori a5,a5,1 + 30050ec: 9f81 uxtb a5 + 30050ee: cb91 beqz a5,3005102 + 30050f0: 02d00593 li a1,45 + 30050f4: 030067b7 lui a5,0x3006 + 30050f8: 62c78513 addi a0,a5,1580 # 300662c + 30050fc: 2ab5 jal ra,3005278 + 30050fe: 4785 li a5,1 + 3005100: a2bd j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerSize(handle->size), BASE_STATUS_ERROR); + 3005102: fec42783 lw a5,-20(s0) + 3005106: 4b9c lw a5,16(a5) + 3005108: 853e mv a0,a5 + 300510a: 3d79 jal ra,3004fa8 + 300510c: 87aa mv a5,a0 + 300510e: 0017c793 xori a5,a5,1 + 3005112: 9f81 uxtb a5 + 3005114: cb91 beqz a5,3005128 + 3005116: 02e00593 li a1,46 + 300511a: 030067b7 lui a5,0x3006 + 300511e: 62c78513 addi a0,a5,1580 # 300662c + 3005122: 2a99 jal ra,3005278 + 3005124: 4785 li a5,1 + 3005126: a2a1 j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerDiv(handle->prescaler), BASE_STATUS_ERROR); + 3005128: fec42783 lw a5,-20(s0) + 300512c: 47dc lw a5,12(a5) + 300512e: 853e mv a0,a5 + 3005130: 35c1 jal ra,3004ff0 + 3005132: 87aa mv a5,a0 + 3005134: 0017c793 xori a5,a5,1 + 3005138: 9f81 uxtb a5 + 300513a: cb91 beqz a5,300514e + 300513c: 02f00593 li a1,47 + 3005140: 030067b7 lui a5,0x3006 + 3005144: 62c78513 addi a0,a5,1580 # 300662c + 3005148: 2a05 jal ra,3005278 + 300514a: 4785 li a5,1 + 300514c: a20d j 300526e + + /* Initialize the configuration parameters of the timer */ + handle->baseAddress->timer_intclr = BASE_CFG_SET; /* Writing to this register clears interrupt output of timer */ + 300514e: fec42783 lw a5,-20(s0) + 3005152: 439c lw a5,0(a5) + 3005154: 4705 li a4,1 + 3005156: c7d8 sw a4,12(a5) + handle->baseAddress->timer_load = handle->load; + 3005158: fec42783 lw a5,-20(s0) + 300515c: 439c lw a5,0(a5) + 300515e: fec42703 lw a4,-20(s0) + 3005162: 4b58 lw a4,20(a4) + 3005164: c398 sw a4,0(a5) + handle->baseAddress->timerbgload = handle->bgLoad; + 3005166: fec42783 lw a5,-20(s0) + 300516a: 439c lw a5,0(a5) + 300516c: fec42703 lw a4,-20(s0) + 3005170: 4f18 lw a4,24(a4) + 3005172: cf98 sw a4,24(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_DISABLE; + 3005174: fec42783 lw a5,-20(s0) + 3005178: 4398 lw a4,0(a5) + 300517a: 471c lw a5,8(a4) + 300517c: f7f7f793 andi a5,a5,-129 + 3005180: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timerintenable = handle->interruptEn; + 3005182: fec42783 lw a5,-20(s0) + 3005186: 4398 lw a4,0(a5) + 3005188: fec42783 lw a5,-20(s0) + 300518c: 2fd4 lbu a3,28(a5) + 300518e: 471c lw a5,8(a4) + 3005190: 8a85 andi a3,a3,1 + 3005192: 0696 slli a3,a3,0x5 + 3005194: fdf7f793 andi a5,a5,-33 + 3005198: 8fd5 or a5,a5,a3 + 300519a: c71c sw a5,8(a4) + + /* Sets the frequency divider and size of the timer module. */ + handle->baseAddress->TIMERx_CONTROL.BIT.timerpre = handle->prescaler; + 300519c: fec42783 lw a5,-20(s0) + 30051a0: 47d4 lw a3,12(a5) + 30051a2: fec42783 lw a5,-20(s0) + 30051a6: 4398 lw a4,0(a5) + 30051a8: 87b6 mv a5,a3 + 30051aa: 8b8d andi a5,a5,3 + 30051ac: 0ff7f693 andi a3,a5,255 + 30051b0: 471c lw a5,8(a4) + 30051b2: 8a8d andi a3,a3,3 + 30051b4: 068a slli a3,a3,0x2 + 30051b6: 9bcd andi a5,a5,-13 + 30051b8: 8fd5 or a5,a5,a3 + 30051ba: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timersize = handle->size; + 30051bc: fec42783 lw a5,-20(s0) + 30051c0: 4b94 lw a3,16(a5) + 30051c2: fec42783 lw a5,-20(s0) + 30051c6: 4398 lw a4,0(a5) + 30051c8: 87b6 mv a5,a3 + 30051ca: 8b85 andi a5,a5,1 + 30051cc: 0ff7f693 andi a3,a5,255 + 30051d0: 471c lw a5,8(a4) + 30051d2: 8a85 andi a3,a3,1 + 30051d4: 0686 slli a3,a3,0x1 + 30051d6: 9bf5 andi a5,a5,-3 + 30051d8: 8fd5 or a5,a5,a3 + 30051da: c71c sw a5,8(a4) + + /* Sets the running mode of the timer. */ + if (handle->mode == TIMER_MODE_RUN_ONTSHOT) { + 30051dc: fec42783 lw a5,-20(s0) + 30051e0: 4798 lw a4,8(a5) + 30051e2: 4789 li a5,2 + 30051e4: 00f71a63 bne a4,a5,30051f8 + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_SET; + 30051e8: fec42783 lw a5,-20(s0) + 30051ec: 4398 lw a4,0(a5) + 30051ee: 471c lw a5,8(a4) + 30051f0: 0017e793 ori a5,a5,1 + 30051f4: c71c sw a5,8(a4) + 30051f6: a805 j 3005226 + } else { + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_UNSET; + 30051f8: fec42783 lw a5,-20(s0) + 30051fc: 4398 lw a4,0(a5) + 30051fe: 471c lw a5,8(a4) + 3005200: 9bf9 andi a5,a5,-2 + 3005202: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005204: fec42783 lw a5,-20(s0) + 3005208: 479c lw a5,8(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 300520a: fec42703 lw a4,-20(s0) + 300520e: 4318 lw a4,0(a4) + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005210: 00f037b3 snez a5,a5 + 3005214: 0ff7f693 andi a3,a5,255 + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005218: 471c lw a5,8(a4) + 300521a: 8a85 andi a3,a3,1 + 300521c: 069a slli a3,a3,0x6 + 300521e: fbf7f793 andi a5,a5,-65 + 3005222: 8fd5 or a5,a5,a3 + 3005224: c71c sw a5,8(a4) + } + + /* Request for setting the DMA and ADC. */ + handle->baseAddress->TIMERx_CONTROLB.BIT.dmasreqen = handle->dmaReqEnable; + 3005226: fec42783 lw a5,-20(s0) + 300522a: 4398 lw a4,0(a5) + 300522c: fec42783 lw a5,-20(s0) + 3005230: 2ff4 lbu a3,30(a5) + 3005232: 4f5c lw a5,28(a4) + 3005234: 8a85 andi a3,a3,1 + 3005236: 0686 slli a3,a3,0x1 + 3005238: 9bf5 andi a5,a5,-3 + 300523a: 8fd5 or a5,a5,a3 + 300523c: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.dmabreqen = handle->dmaReqEnable; + 300523e: fec42783 lw a5,-20(s0) + 3005242: 4398 lw a4,0(a5) + 3005244: fec42783 lw a5,-20(s0) + 3005248: 2ff4 lbu a3,30(a5) + 300524a: 4f5c lw a5,28(a4) + 300524c: 8a85 andi a3,a3,1 + 300524e: 9bf9 andi a5,a5,-2 + 3005250: 8fd5 or a5,a5,a3 + 3005252: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.socen = handle->adcSocReqEnable; + 3005254: fec42783 lw a5,-20(s0) + 3005258: 4398 lw a4,0(a5) + 300525a: fec42783 lw a5,-20(s0) + 300525e: 3fd4 lbu a3,29(a5) + 3005260: 4f5c lw a5,28(a4) + 3005262: 8a85 andi a3,a3,1 + 3005264: 068a slli a3,a3,0x2 + 3005266: 9bed andi a5,a5,-5 + 3005268: 8fd5 or a5,a5,a3 + 300526a: cf5c sw a5,28(a4) + return BASE_STATUS_OK; + 300526c: 4781 li a5,0 +} + 300526e: 853e mv a0,a5 + 3005270: 40f2 lw ra,28(sp) + 3005272: 4462 lw s0,24(sp) + 3005274: 6105 addi sp,sp,32 + 3005276: 8082 ret + +03005278 : + 3005278: c37fc06f j 3001eae + +0300527c : + * @brief Start timer. + * @param handle Timer Handle + * @retval None + */ +void HAL_TIMER_Start(TIMER_Handle *handle) +{ + 300527c: 1101 addi sp,sp,-32 + 300527e: ce06 sw ra,28(sp) + 3005280: cc22 sw s0,24(sp) + 3005282: 1000 addi s0,sp,32 + 3005284: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005288: fec42783 lw a5,-20(s0) + 300528c: eb89 bnez a5,300529e + 300528e: 0bc00593 li a1,188 + 3005292: 030067b7 lui a5,0x3006 + 3005296: 62c78513 addi a0,a5,1580 # 300662c + 300529a: 3ff9 jal ra,3005278 + 300529c: a001 j 300529c + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 300529e: fec42783 lw a5,-20(s0) + 30052a2: 4398 lw a4,0(a5) + 30052a4: 143007b7 lui a5,0x14300 + 30052a8: 02f70f63 beq a4,a5,30052e6 + 30052ac: fec42783 lw a5,-20(s0) + 30052b0: 4398 lw a4,0(a5) + 30052b2: 143017b7 lui a5,0x14301 + 30052b6: 02f70863 beq a4,a5,30052e6 + 30052ba: fec42783 lw a5,-20(s0) + 30052be: 4398 lw a4,0(a5) + 30052c0: 143027b7 lui a5,0x14302 + 30052c4: 02f70163 beq a4,a5,30052e6 + 30052c8: fec42783 lw a5,-20(s0) + 30052cc: 4398 lw a4,0(a5) + 30052ce: 143037b7 lui a5,0x14303 + 30052d2: 00f70a63 beq a4,a5,30052e6 + 30052d6: 0bd00593 li a1,189 + 30052da: 030067b7 lui a5,0x3006 + 30052de: 62c78513 addi a0,a5,1580 # 300662c + 30052e2: 3f59 jal ra,3005278 + 30052e4: a001 j 30052e4 + /* Enable timer */ + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_SET; + 30052e6: fec42783 lw a5,-20(s0) + 30052ea: 4398 lw a4,0(a5) + 30052ec: 471c lw a5,8(a4) + 30052ee: 0807e793 ori a5,a5,128 + 30052f2: c71c sw a5,8(a4) +} + 30052f4: 0001 nop + 30052f6: 40f2 lw ra,28(sp) + 30052f8: 4462 lw s0,24(sp) + 30052fa: 6105 addi sp,sp,32 + 30052fc: 8082 ret + +030052fe : + * @brief GPT Interrupt service processing function. + * @param handle TIMER Handle + * @retval None + */ +void HAL_TIMER_IrqHandler(void *handle) +{ + 30052fe: 7179 addi sp,sp,-48 + 3005300: d606 sw ra,44(sp) + 3005302: d422 sw s0,40(sp) + 3005304: 1800 addi s0,sp,48 + 3005306: fca42e23 sw a0,-36(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 300530a: fdc42783 lw a5,-36(s0) + 300530e: eb89 bnez a5,3005320 + 3005310: 0d800593 li a1,216 + 3005314: 030067b7 lui a5,0x3006 + 3005318: 62c78513 addi a0,a5,1580 # 300662c + 300531c: 3fb1 jal ra,3005278 + 300531e: a001 j 300531e + TIMER_Handle *timerHandle = (TIMER_Handle *)handle; + 3005320: fdc42783 lw a5,-36(s0) + 3005324: fef42623 sw a5,-20(s0) + TIMER_ASSERT_PARAM(IsTIMERInstance(timerHandle->baseAddress)); + 3005328: fec42783 lw a5,-20(s0) + 300532c: 4398 lw a4,0(a5) + 300532e: 143007b7 lui a5,0x14300 + 3005332: 02f70f63 beq a4,a5,3005370 + 3005336: fec42783 lw a5,-20(s0) + 300533a: 4398 lw a4,0(a5) + 300533c: 143017b7 lui a5,0x14301 + 3005340: 02f70863 beq a4,a5,3005370 + 3005344: fec42783 lw a5,-20(s0) + 3005348: 4398 lw a4,0(a5) + 300534a: 143027b7 lui a5,0x14302 + 300534e: 02f70163 beq a4,a5,3005370 + 3005352: fec42783 lw a5,-20(s0) + 3005356: 4398 lw a4,0(a5) + 3005358: 143037b7 lui a5,0x14303 + 300535c: 00f70a63 beq a4,a5,3005370 + 3005360: 0da00593 li a1,218 + 3005364: 030067b7 lui a5,0x3006 + 3005368: 62c78513 addi a0,a5,1580 # 300662c + 300536c: 3731 jal ra,3005278 + 300536e: a001 j 300536e + /* Check interrupt type */ + if (timerHandle->baseAddress->TIMERx_MIS.dmaovmis == BASE_CFG_ENABLE) { + 3005370: fec42783 lw a5,-20(s0) + 3005374: 439c lw a5,0(a5) + 3005376: 4bdc lw a5,20(a5) + 3005378: 8385 srli a5,a5,0x1 + 300537a: 8b85 andi a5,a5,1 + 300537c: 0ff7f713 andi a4,a5,255 + 3005380: 4785 li a5,1 + 3005382: 02f71363 bne a4,a5,30053a8 + /* DMA overflow interrupt */ + timerHandle->baseAddress->DMAOV_INTCLR.BIT.dmaov_intclr = BASE_CFG_ENABLE; + 3005386: fec42783 lw a5,-20(s0) + 300538a: 4398 lw a4,0(a5) + 300538c: 531c lw a5,32(a4) + 300538e: 0017e793 ori a5,a5,1 + 3005392: d31c sw a5,32(a4) + /* Call the timer DMA request overflow callback function of the user. */ + if (timerHandle->userCallBack.TimerOverFlowCallBack != NULL) { + 3005394: fec42783 lw a5,-20(s0) + 3005398: 53dc lw a5,36(a5) + 300539a: c799 beqz a5,30053a8 + timerHandle->userCallBack.TimerOverFlowCallBack(timerHandle); + 300539c: fec42783 lw a5,-20(s0) + 30053a0: 53dc lw a5,36(a5) + 30053a2: fec42503 lw a0,-20(s0) + 30053a6: 9782 jalr a5 + } + } + if (timerHandle->baseAddress->TIMERx_MIS.timermis == BASE_CFG_ENABLE) { + 30053a8: fec42783 lw a5,-20(s0) + 30053ac: 439c lw a5,0(a5) + 30053ae: 4bdc lw a5,20(a5) + 30053b0: 8b85 andi a5,a5,1 + 30053b2: 0ff7f713 andi a4,a5,255 + 30053b6: 4785 li a5,1 + 30053b8: 02f71263 bne a4,a5,30053dc + /* TIMER Interrupt */ + timerHandle->baseAddress->timer_intclr = BASE_CFG_ENABLE; + 30053bc: fec42783 lw a5,-20(s0) + 30053c0: 439c lw a5,0(a5) + 30053c2: 4705 li a4,1 + 30053c4: c7d8 sw a4,12(a5) + /* Call the period finish callback function of the user. */ + if (timerHandle->userCallBack.TimerPeriodFinCallBack != NULL) { + 30053c6: fec42783 lw a5,-20(s0) + 30053ca: 539c lw a5,32(a5) + 30053cc: cb81 beqz a5,30053dc + timerHandle->userCallBack.TimerPeriodFinCallBack(timerHandle); + 30053ce: fec42783 lw a5,-20(s0) + 30053d2: 539c lw a5,32(a5) + 30053d4: fec42503 lw a0,-20(s0) + 30053d8: 9782 jalr a5 + } + } + return; + 30053da: 0001 nop + 30053dc: 0001 nop +} + 30053de: 50b2 lw ra,44(sp) + 30053e0: 5422 lw s0,40(sp) + 30053e2: 6145 addi sp,sp,48 + 30053e4: 8082 ret + +030053e6 : + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_TIMER_RegisterCallback(TIMER_Handle *handle, TIMER_InterruptType typeID, + TIMER_CallBackFunc callBackFunc) +{ + 30053e6: 1101 addi sp,sp,-32 + 30053e8: ce06 sw ra,28(sp) + 30053ea: cc22 sw s0,24(sp) + 30053ec: 1000 addi s0,sp,32 + 30053ee: fea42623 sw a0,-20(s0) + 30053f2: feb42423 sw a1,-24(s0) + 30053f6: fec42223 sw a2,-28(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 30053fa: fec42783 lw a5,-20(s0) + 30053fe: eb89 bnez a5,3005410 + 3005400: 0fa00593 li a1,250 + 3005404: 030067b7 lui a5,0x3006 + 3005408: 62c78513 addi a0,a5,1580 # 300662c + 300540c: 35b5 jal ra,3005278 + 300540e: a001 j 300540e + TIMER_ASSERT_PARAM(callBackFunc != NULL); + 3005410: fe442783 lw a5,-28(s0) + 3005414: eb89 bnez a5,3005426 + 3005416: 0fb00593 li a1,251 + 300541a: 030067b7 lui a5,0x3006 + 300541e: 62c78513 addi a0,a5,1580 # 300662c + 3005422: 3d99 jal ra,3005278 + 3005424: a001 j 3005424 + TIMER_ASSERT_PARAM(IsTimerInterruptType(typeID)); + 3005426: fe842503 lw a0,-24(s0) + 300542a: 3e89 jal ra,3004f7c + 300542c: 87aa mv a5,a0 + 300542e: 0017c793 xori a5,a5,1 + 3005432: 9f81 uxtb a5 + 3005434: cb89 beqz a5,3005446 + 3005436: 0fc00593 li a1,252 + 300543a: 030067b7 lui a5,0x3006 + 300543e: 62c78513 addi a0,a5,1580 # 300662c + 3005442: 3d1d jal ra,3005278 + 3005444: a001 j 3005444 + + /* Registers the user callback function. */ + switch (typeID) { + 3005446: fe842783 lw a5,-24(s0) + 300544a: cb91 beqz a5,300545e + 300544c: 4705 li a4,1 + 300544e: 00e79e63 bne a5,a4,300546a + case TIMER_OVER_FLOW: + handle->userCallBack.TimerOverFlowCallBack = callBackFunc; /* User DMA request overflow function */ + 3005452: fec42783 lw a5,-20(s0) + 3005456: fe442703 lw a4,-28(s0) + 300545a: d3d8 sw a4,36(a5) + break; + 300545c: a809 j 300546e + case TIMER_PERIOD_FIN: + handle->userCallBack.TimerPeriodFinCallBack = callBackFunc; /* User timer period finish call back. */ + 300545e: fec42783 lw a5,-20(s0) + 3005462: fe442703 lw a4,-28(s0) + 3005466: d398 sw a4,32(a5) + break; + 3005468: a019 j 300546e + default: + return BASE_STATUS_ERROR; + 300546a: 4785 li a5,1 + 300546c: a011 j 3005470 + } + return BASE_STATUS_OK; + 300546e: 4781 li a5,0 +} + 3005470: 853e mv a0,a5 + 3005472: 40f2 lw ra,28(sp) + 3005474: 4462 lw s0,24(sp) + 3005476: 6105 addi sp,sp,32 + 3005478: 8082 ret + +0300547a : + * @brief Check UART datalength parameter. + * @param datalength The number of data bits in a frame, @ref UART_DataLength + * @retval bool + */ +static inline bool IsUartDatalength(UART_DataLength datalength) +{ + 300547a: 1101 addi sp,sp,-32 + 300547c: ce22 sw s0,28(sp) + 300547e: 1000 addi s0,sp,32 + 3005480: fea42623 sw a0,-20(s0) + return (datalength >= UART_DATALENGTH_5BIT) && (datalength <= UART_DATALENGTH_8BIT); + 3005484: fec42783 lw a5,-20(s0) + 3005488: 0047b793 sltiu a5,a5,4 + 300548c: 9f81 uxtb a5 +} + 300548e: 853e mv a0,a5 + 3005490: 4472 lw s0,28(sp) + 3005492: 6105 addi sp,sp,32 + 3005494: 8082 ret + +03005496 : + * @brief Check UART stopbits parameter. + * @param stopbits The number of stop bits in a frame, @ref UART_StopBits + * @retval bool + */ +static inline bool IsUartStopbits(UART_StopBits stopbits) +{ + 3005496: 1101 addi sp,sp,-32 + 3005498: ce22 sw s0,28(sp) + 300549a: 1000 addi s0,sp,32 + 300549c: fea42623 sw a0,-20(s0) + return (stopbits == UART_STOPBITS_ONE) || (stopbits == UART_STOPBITS_TWO); + 30054a0: fec42783 lw a5,-20(s0) + 30054a4: c791 beqz a5,30054b0 + 30054a6: fec42703 lw a4,-20(s0) + 30054aa: 4785 li a5,1 + 30054ac: 00f71463 bne a4,a5,30054b4 + 30054b0: 4785 li a5,1 + 30054b2: a011 j 30054b6 + 30054b4: 4781 li a5,0 + 30054b6: 8b85 andi a5,a5,1 + 30054b8: 9f81 uxtb a5 +} + 30054ba: 853e mv a0,a5 + 30054bc: 4472 lw s0,28(sp) + 30054be: 6105 addi sp,sp,32 + 30054c0: 8082 ret + +030054c2 : + * @brief Check UART paritymode parameter. + * @param paritymode UART parity check mode, @ref UART_Parity_Mode + * @retval bool + */ +static inline bool IsUartParitymode(UART_Parity_Mode paritymode) +{ + 30054c2: 1101 addi sp,sp,-32 + 30054c4: ce22 sw s0,28(sp) + 30054c6: 1000 addi s0,sp,32 + 30054c8: fea42623 sw a0,-20(s0) + if ((paritymode >= UART_PARITY_ODD) && (paritymode <= UART_PARITY_NONE)) { + 30054cc: fec42703 lw a4,-20(s0) + 30054d0: 4791 li a5,4 + 30054d2: 00e7e463 bltu a5,a4,30054da + return true; + 30054d6: 4785 li a5,1 + 30054d8: a011 j 30054dc + } + return false; + 30054da: 4781 li a5,0 +} + 30054dc: 853e mv a0,a5 + 30054de: 4472 lw s0,28(sp) + 30054e0: 6105 addi sp,sp,32 + 30054e2: 8082 ret + +030054e4 : + * @brief Check UART transmode parameter. + * @param transmode Transmit mode, @ref UART_Transmit_Mode + * @retval bool + */ +static inline bool IsUartTransmode(UART_Transmit_Mode transmode) +{ + 30054e4: 1101 addi sp,sp,-32 + 30054e6: ce22 sw s0,28(sp) + 30054e8: 1000 addi s0,sp,32 + 30054ea: fea42623 sw a0,-20(s0) + if ((transmode == UART_MODE_BLOCKING) || + 30054ee: fec42783 lw a5,-20(s0) + 30054f2: c385 beqz a5,3005512 + 30054f4: fec42703 lw a4,-20(s0) + 30054f8: 4785 li a5,1 + 30054fa: 00f70c63 beq a4,a5,3005512 + (transmode == UART_MODE_INTERRUPT) || + 30054fe: fec42703 lw a4,-20(s0) + 3005502: 4789 li a5,2 + 3005504: 00f70763 beq a4,a5,3005512 + (transmode == UART_MODE_DMA) || + 3005508: fec42703 lw a4,-20(s0) + 300550c: 478d li a5,3 + 300550e: 00f71463 bne a4,a5,3005516 + (transmode == UART_MODE_DISABLE)) { + return true; + 3005512: 4785 li a5,1 + 3005514: a011 j 3005518 + } + return false; + 3005516: 4781 li a5,0 +} + 3005518: 853e mv a0,a5 + 300551a: 4472 lw s0,28(sp) + 300551c: 6105 addi sp,sp,32 + 300551e: 8082 ret + +03005520 : + * @brief Check UART fifoThreshold parameter. + * @param fifoThreshold UART TX/RX FIFO line interrupt threshold, @ref UART_FIFO_Threshold + * @retval bool + */ +static inline bool IsUartFIFOThreshold(UART_FIFO_Threshold fifoThreshold) +{ + 3005520: 1101 addi sp,sp,-32 + 3005522: ce22 sw s0,28(sp) + 3005524: 1000 addi s0,sp,32 + 3005526: fea42623 sw a0,-20(s0) + return (fifoThreshold >= UART_FIFODEPTH_SIZE0) && (fifoThreshold <= UART_FIFODEPTH_SIZE15); + 300552a: fec42783 lw a5,-20(s0) + 300552e: 0107b793 sltiu a5,a5,16 + 3005532: 9f81 uxtb a5 +} + 3005534: 853e mv a0,a5 + 3005536: 4472 lw s0,28(sp) + 3005538: 6105 addi sp,sp,32 + 300553a: 8082 ret + +0300553c : + * @brief Check UART Oversampling multiple. + * @param multiple Oversampling multiple, @ref UART_OversampleMultiple + * @retval bool + */ +static inline bool IsUartOversampleMultiple(UART_OversampleMultiple multiple) +{ + 300553c: 1101 addi sp,sp,-32 + 300553e: ce22 sw s0,28(sp) + 3005540: 1000 addi s0,sp,32 + 3005542: fea42623 sw a0,-20(s0) + return (multiple >= UART_OVERSAMPLING_16X) && (multiple <= UART_OVERSAMPLING_12X); + 3005546: fec42783 lw a5,-20(s0) + 300554a: 0057b793 sltiu a5,a5,5 + 300554e: 9f81 uxtb a5 +} + 3005550: 853e mv a0,a5 + 3005552: 4472 lw s0,28(sp) + 3005554: 6105 addi sp,sp,32 + 3005556: 8082 ret + +03005558 : +#define PARITY_EVEN 0x6 +#define PARITY_MARK 0x82 +#define PARITY_SPACE 0x86 + +static unsigned int DivClosest(unsigned int x, unsigned int divisor) +{ + 3005558: 7179 addi sp,sp,-48 + 300555a: d622 sw s0,44(sp) + 300555c: 1800 addi s0,sp,48 + 300555e: fca42e23 sw a0,-36(s0) + 3005562: fcb42c23 sw a1,-40(s0) + unsigned int ret; + if (divisor == 0) { + 3005566: fd842783 lw a5,-40(s0) + 300556a: e399 bnez a5,3005570 + return 0; + 300556c: 4781 li a5,0 + 300556e: a005 j 300558e + } + ret = (((x) + ((divisor) / 2)) / (divisor)); /* Round up the result, add 1/2 */ + 3005570: fd842783 lw a5,-40(s0) + 3005574: 0017d713 srli a4,a5,0x1 + 3005578: fdc42783 lw a5,-36(s0) + 300557c: 973e add a4,a4,a5 + 300557e: fd842783 lw a5,-40(s0) + 3005582: 02f757b3 divu a5,a4,a5 + 3005586: fef42623 sw a5,-20(s0) + return ret; + 300558a: fec42783 lw a5,-20(s0) +} + 300558e: 853e mv a0,a5 + 3005590: 5432 lw s0,44(sp) + 3005592: 6145 addi sp,sp,48 + 3005594: 8082 ret + +03005596 : + * @brief Sets the parity bit of the UART. + * @param uartHandle UART handle. + * @retval None. + */ +static void UART_SetParityBit(UART_Handle *uartHandle) +{ + 3005596: 1101 addi sp,sp,-32 + 3005598: ce22 sw s0,28(sp) + 300559a: 1000 addi s0,sp,32 + 300559c: fea42623 sw a0,-20(s0) + /* Sets the UART check mode. */ + switch (uartHandle->parity) { + 30055a0: fec42783 lw a5,-20(s0) + 30055a4: 4b9c lw a5,16(a5) + 30055a6: 4711 li a4,4 + 30055a8: 06f76e63 bltu a4,a5,3005624 + 30055ac: 00279713 slli a4,a5,0x2 + 30055b0: 030067b7 lui a5,0x3006 + 30055b4: 64c78793 addi a5,a5,1612 # 300664c + 30055b8: 97ba add a5,a5,a4 + 30055ba: 439c lw a5,0(a5) + 30055bc: 8782 jr a5 + case UART_PARITY_ODD: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_ODD; /* Odd parity. */ + 30055be: fec42783 lw a5,-20(s0) + 30055c2: 439c lw a5,0(a5) + 30055c4: 57d8 lw a4,44(a5) + 30055c6: fec42783 lw a5,-20(s0) + 30055ca: 439c lw a5,0(a5) + 30055cc: 00276713 ori a4,a4,2 + 30055d0: d7d8 sw a4,44(a5) + break; + 30055d2: a891 j 3005626 + case UART_PARITY_EVEN: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_EVEN; /* Even parity. */ + 30055d4: fec42783 lw a5,-20(s0) + 30055d8: 439c lw a5,0(a5) + 30055da: 57d8 lw a4,44(a5) + 30055dc: fec42783 lw a5,-20(s0) + 30055e0: 439c lw a5,0(a5) + 30055e2: 00676713 ori a4,a4,6 + 30055e6: d7d8 sw a4,44(a5) + break; + 30055e8: a83d j 3005626 + case UART_PARITY_MARK: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_MARK; /* Marking parity */ + 30055ea: fec42783 lw a5,-20(s0) + 30055ee: 439c lw a5,0(a5) + 30055f0: 57d8 lw a4,44(a5) + 30055f2: fec42783 lw a5,-20(s0) + 30055f6: 439c lw a5,0(a5) + 30055f8: 08276713 ori a4,a4,130 + 30055fc: d7d8 sw a4,44(a5) + break; + 30055fe: a025 j 3005626 + case UART_PARITY_SPACE: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_SPACE; /* space parity */ + 3005600: fec42783 lw a5,-20(s0) + 3005604: 439c lw a5,0(a5) + 3005606: 57d8 lw a4,44(a5) + 3005608: fec42783 lw a5,-20(s0) + 300560c: 439c lw a5,0(a5) + 300560e: 08676713 ori a4,a4,134 + 3005612: d7d8 sw a4,44(a5) + break; + 3005614: a809 j 3005626 + case UART_PARITY_NONE: + uartHandle->baseAddress->UART_LCR_H.BIT.pen = BASE_CFG_DISABLE; /* No parity */ + 3005616: fec42783 lw a5,-20(s0) + 300561a: 4398 lw a4,0(a5) + 300561c: 575c lw a5,44(a4) + 300561e: 9bf5 andi a5,a5,-3 + 3005620: d75c sw a5,44(a4) + break; + 3005622: a011 j 3005626 + default: + return; + 3005624: 0001 nop + } +} + 3005626: 4472 lw s0,28(sp) + 3005628: 6105 addi sp,sp,32 + 300562a: 8082 ret + +0300562c : + * @brief Initialize the UART hardware configuration and configure parameters based on the specified handle. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_Init(UART_Handle *uartHandle) +{ + 300562c: 7179 addi sp,sp,-48 + 300562e: d606 sw ra,44(sp) + 3005630: d422 sw s0,40(sp) + 3005632: 1800 addi s0,sp,48 + 3005634: fca42e23 sw a0,-36(s0) + UART_ASSERT_PARAM(uartHandle != NULL); + 3005638: fdc42783 lw a5,-36(s0) + 300563c: eb89 bnez a5,300564e + 300563e: 09700593 li a1,151 + 3005642: 030067b7 lui a5,0x3006 + 3005646: 66078513 addi a0,a5,1632 # 3006660 + 300564a: 313d jal ra,3005278 + 300564c: a001 j 300564c + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + 300564e: fdc42783 lw a5,-36(s0) + 3005652: 4398 lw a4,0(a5) + 3005654: 140007b7 lui a5,0x14000 + 3005658: 02f70f63 beq a4,a5,3005696 + 300565c: fdc42783 lw a5,-36(s0) + 3005660: 4398 lw a4,0(a5) + 3005662: 140017b7 lui a5,0x14001 + 3005666: 02f70863 beq a4,a5,3005696 + 300566a: fdc42783 lw a5,-36(s0) + 300566e: 4398 lw a4,0(a5) + 3005670: 140027b7 lui a5,0x14002 + 3005674: 02f70163 beq a4,a5,3005696 + 3005678: fdc42783 lw a5,-36(s0) + 300567c: 4398 lw a4,0(a5) + 300567e: 140037b7 lui a5,0x14003 + 3005682: 00f70a63 beq a4,a5,3005696 + 3005686: 09800593 li a1,152 + 300568a: 030067b7 lui a5,0x3006 + 300568e: 66078513 addi a0,a5,1632 # 3006660 + 3005692: 36dd jal ra,3005278 + 3005694: a001 j 3005694 + UART_PARAM_CHECK_WITH_RET(uartHandle->txState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 3005696: fdc42783 lw a5,-36(s0) + 300569a: 47bc lw a5,72(a5) + 300569c: cb91 beqz a5,30056b0 + 300569e: 09900593 li a1,153 + 30056a2: 030067b7 lui a5,0x3006 + 30056a6: 66078513 addi a0,a5,1632 # 3006660 + 30056aa: 36f9 jal ra,3005278 + 30056ac: 4785 li a5,1 + 30056ae: ae0d j 30059e0 + UART_PARAM_CHECK_WITH_RET(uartHandle->rxState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 30056b0: fdc42783 lw a5,-36(s0) + 30056b4: 47fc lw a5,76(a5) + 30056b6: cb91 beqz a5,30056ca + 30056b8: 09a00593 li a1,154 + 30056bc: 030067b7 lui a5,0x3006 + 30056c0: 66078513 addi a0,a5,1632 # 3006660 + 30056c4: 3e55 jal ra,3005278 + 30056c6: 4785 li a5,1 + 30056c8: ae21 j 30059e0 + unsigned int uartClock, quot; + UART_PARAM_CHECK_WITH_RET(IsUartDatalength(uartHandle->dataLength), BASE_STATUS_ERROR); + 30056ca: fdc42783 lw a5,-36(s0) + 30056ce: 479c lw a5,8(a5) + 30056d0: 853e mv a0,a5 + 30056d2: 3365 jal ra,300547a + 30056d4: 87aa mv a5,a0 + 30056d6: 0017c793 xori a5,a5,1 + 30056da: 9f81 uxtb a5 + 30056dc: cb91 beqz a5,30056f0 + 30056de: 09c00593 li a1,156 + 30056e2: 030067b7 lui a5,0x3006 + 30056e6: 66078513 addi a0,a5,1632 # 3006660 + 30056ea: 3679 jal ra,3005278 + 30056ec: 4785 li a5,1 + 30056ee: accd j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartStopbits(uartHandle->stopBits), BASE_STATUS_ERROR); + 30056f0: fdc42783 lw a5,-36(s0) + 30056f4: 47dc lw a5,12(a5) + 30056f6: 853e mv a0,a5 + 30056f8: 3b79 jal ra,3005496 + 30056fa: 87aa mv a5,a0 + 30056fc: 0017c793 xori a5,a5,1 + 3005700: 9f81 uxtb a5 + 3005702: cb91 beqz a5,3005716 + 3005704: 09d00593 li a1,157 + 3005708: 030067b7 lui a5,0x3006 + 300570c: 66078513 addi a0,a5,1632 # 3006660 + 3005710: 36a5 jal ra,3005278 + 3005712: 4785 li a5,1 + 3005714: a4f1 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartParitymode(uartHandle->parity), BASE_STATUS_ERROR); + 3005716: fdc42783 lw a5,-36(s0) + 300571a: 4b9c lw a5,16(a5) + 300571c: 853e mv a0,a5 + 300571e: 3355 jal ra,30054c2 + 3005720: 87aa mv a5,a0 + 3005722: 0017c793 xori a5,a5,1 + 3005726: 9f81 uxtb a5 + 3005728: cb91 beqz a5,300573c + 300572a: 09e00593 li a1,158 + 300572e: 030067b7 lui a5,0x3006 + 3005732: 66078513 addi a0,a5,1632 # 3006660 + 3005736: 3689 jal ra,3005278 + 3005738: 4785 li a5,1 + 300573a: a45d j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->txMode), BASE_STATUS_ERROR); + 300573c: fdc42783 lw a5,-36(s0) + 3005740: 4bdc lw a5,20(a5) + 3005742: 853e mv a0,a5 + 3005744: 3345 jal ra,30054e4 + 3005746: 87aa mv a5,a0 + 3005748: 0017c793 xori a5,a5,1 + 300574c: 9f81 uxtb a5 + 300574e: cb91 beqz a5,3005762 + 3005750: 09f00593 li a1,159 + 3005754: 030067b7 lui a5,0x3006 + 3005758: 66078513 addi a0,a5,1632 # 3006660 + 300575c: 3e31 jal ra,3005278 + 300575e: 4785 li a5,1 + 3005760: a441 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->rxMode), BASE_STATUS_ERROR); + 3005762: fdc42783 lw a5,-36(s0) + 3005766: 4f9c lw a5,24(a5) + 3005768: 853e mv a0,a5 + 300576a: 3bad jal ra,30054e4 + 300576c: 87aa mv a5,a0 + 300576e: 0017c793 xori a5,a5,1 + 3005772: 9f81 uxtb a5 + 3005774: cb91 beqz a5,3005788 + 3005776: 0a000593 li a1,160 + 300577a: 030067b7 lui a5,0x3006 + 300577e: 66078513 addi a0,a5,1632 # 3006660 + 3005782: 3cdd jal ra,3005278 + 3005784: 4785 li a5,1 + 3005786: aca9 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoTxThr), BASE_STATUS_ERROR); + 3005788: fdc42783 lw a5,-36(s0) + 300578c: 5b9c lw a5,48(a5) + 300578e: 853e mv a0,a5 + 3005790: 3b41 jal ra,3005520 + 3005792: 87aa mv a5,a0 + 3005794: 0017c793 xori a5,a5,1 + 3005798: 9f81 uxtb a5 + 300579a: cb91 beqz a5,30057ae + 300579c: 0a100593 li a1,161 + 30057a0: 030067b7 lui a5,0x3006 + 30057a4: 66078513 addi a0,a5,1632 # 3006660 + 30057a8: 3cc1 jal ra,3005278 + 30057aa: 4785 li a5,1 + 30057ac: ac15 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoRxThr), BASE_STATUS_ERROR); + 30057ae: fdc42783 lw a5,-36(s0) + 30057b2: 5bdc lw a5,52(a5) + 30057b4: 853e mv a0,a5 + 30057b6: 33ad jal ra,3005520 + 30057b8: 87aa mv a5,a0 + 30057ba: 0017c793 xori a5,a5,1 + 30057be: 9f81 uxtb a5 + 30057c0: cb91 beqz a5,30057d4 + 30057c2: 0a200593 li a1,162 + 30057c6: 030067b7 lui a5,0x3006 + 30057ca: 66078513 addi a0,a5,1632 # 3006660 + 30057ce: 346d jal ra,3005278 + 30057d0: 4785 li a5,1 + 30057d2: a439 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartOversampleMultiple(uartHandle->handleEx.overSampleMultiple), BASE_STATUS_ERROR); + 30057d4: fdc42783 lw a5,-36(s0) + 30057d8: 5fbc lw a5,120(a5) + 30057da: 853e mv a0,a5 + 30057dc: 3385 jal ra,300553c + 30057de: 87aa mv a5,a0 + 30057e0: 0017c793 xori a5,a5,1 + 30057e4: 9f81 uxtb a5 + 30057e6: cb91 beqz a5,30057fa + 30057e8: 0a300593 li a1,163 + 30057ec: 030067b7 lui a5,0x3006 + 30057f0: 66078513 addi a0,a5,1632 # 3006660 + 30057f4: 3451 jal ra,3005278 + 30057f6: 4785 li a5,1 + 30057f8: a2e5 j 30059e0 + + uartHandle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; + 30057fa: fdc42783 lw a5,-36(s0) + 30057fe: 4398 lw a4,0(a5) + 3005800: 5b1c lw a5,48(a4) + 3005802: 9bf9 andi a5,a5,-2 + 3005804: db1c sw a5,48(a4) + while (uartHandle->baseAddress->UART_FR.BIT.busy == 0x01) { + 3005806: 0001 nop + 3005808: fdc42783 lw a5,-36(s0) + 300580c: 439c lw a5,0(a5) + 300580e: 4f9c lw a5,24(a5) + 3005810: 838d srli a5,a5,0x3 + 3005812: 8b85 andi a5,a5,1 + 3005814: 0ff7f713 andi a4,a5,255 + 3005818: 4785 li a5,1 + 300581a: fef707e3 beq a4,a5,3005808 + ; + } + + uartClock = HAL_CRG_GetIpFreq((void *)uartHandle->baseAddress); + 300581e: fdc42783 lw a5,-36(s0) + 3005822: 439c lw a5,0(a5) + 3005824: 853e mv a0,a5 + 3005826: 9f1fd0ef jal ra,3003216 + 300582a: fea42623 sw a0,-20(s0) + + /* DCL OverSample Multiple check */ + uartHandle->baseAddress->UART_SPCFG.BIT.spcfg = uartHandle->handleEx.overSampleMultiple; + 300582e: fdc42783 lw a5,-36(s0) + 3005832: 5fb4 lw a3,120(a5) + 3005834: fdc42783 lw a5,-36(s0) + 3005838: 4398 lw a4,0(a5) + 300583a: 87b6 mv a5,a3 + 300583c: 8bbd andi a5,a5,15 + 300583e: 0ff7f693 andi a3,a5,255 + 3005842: 4f3c lw a5,88(a4) + 3005844: 8abd andi a3,a3,15 + 3005846: 9bc1 andi a5,a5,-16 + 3005848: 8fd5 or a5,a5,a3 + 300584a: cf3c sw a5,88(a4) + + /* DCL sequences setting */ + uartHandle->baseAddress->UART_DS.BIT.msbfirst = uartHandle->handleEx.msbFirst; + 300584c: fdc42783 lw a5,-36(s0) + 3005850: 4398 lw a4,0(a5) + 3005852: fdc42783 lw a5,-36(s0) + 3005856: 07c7c683 lbu a3,124(a5) + 300585a: 4b3c lw a5,80(a4) + 300585c: 8a85 andi a3,a3,1 + 300585e: 9bf9 andi a5,a5,-2 + 3005860: 8fd5 or a5,a5,a3 + 3005862: cb3c sw a5,80(a4) + + /* The baud rate divider(BRD) based on the baud rate and clock frequency, calculation formula */ + unsigned int oversample = uartHandle->baseAddress->UART_SPCFG.reg; + 3005864: fdc42783 lw a5,-36(s0) + 3005868: 439c lw a5,0(a5) + 300586a: 4fbc lw a5,88(a5) + 300586c: fef42423 sw a5,-24(s0) + if (uartHandle->baudRate > (uartClock / (OVERSAMPLING_PARAM - oversample))) { + 3005870: fdc42783 lw a5,-36(s0) + 3005874: 43d8 lw a4,4(a5) + 3005876: 46c1 li a3,16 + 3005878: fe842783 lw a5,-24(s0) + 300587c: 40f687b3 sub a5,a3,a5 + 3005880: fec42683 lw a3,-20(s0) + 3005884: 02f6d7b3 divu a5,a3,a5 + 3005888: 00e7f463 bgeu a5,a4,3005890 + return BASE_STATUS_ERROR; + 300588c: 4785 li a5,1 + 300588e: aa89 j 30059e0 + } else { + unsigned int tmpClock = uartClock / (OVERSAMPLING_PARAM - oversample) * 64; /* 64 is for decimal parts */ + 3005890: 4741 li a4,16 + 3005892: fe842783 lw a5,-24(s0) + 3005896: 40f707b3 sub a5,a4,a5 + 300589a: fec42703 lw a4,-20(s0) + 300589e: 02f757b3 divu a5,a4,a5 + 30058a2: 079a slli a5,a5,0x6 + 30058a4: fef42223 sw a5,-28(s0) + quot = DivClosest(tmpClock, uartHandle->baudRate); + 30058a8: fdc42783 lw a5,-36(s0) + 30058ac: 43dc lw a5,4(a5) + 30058ae: 85be mv a1,a5 + 30058b0: fe442503 lw a0,-28(s0) + 30058b4: 3155 jal ra,3005558 + 30058b6: fea42023 sw a0,-32(s0) + } + /* Clear the baud rate divider register */ + uartHandle->baseAddress->UART_FBRD.reg = 0; + 30058ba: fdc42783 lw a5,-36(s0) + 30058be: 439c lw a5,0(a5) + 30058c0: 0207a423 sw zero,40(a5) + uartHandle->baseAddress->UART_IBRD.reg = 0; + 30058c4: fdc42783 lw a5,-36(s0) + 30058c8: 439c lw a5,0(a5) + 30058ca: 0207a223 sw zero,36(a5) + /* The fractional baud rate divider value is stored to the lower 6 bits of the FBRD */ + uartHandle->baseAddress->UART_FBRD.reg = (quot & 0x3F); + 30058ce: fdc42783 lw a5,-36(s0) + 30058d2: 439c lw a5,0(a5) + 30058d4: fe042703 lw a4,-32(s0) + 30058d8: 03f77713 andi a4,a4,63 + 30058dc: d798 sw a4,40(a5) + /* Right shift 6 bits is the integer baud rate divider value, is stored to IBRD */ + uartHandle->baseAddress->UART_IBRD.reg = (quot >> 6); + 30058de: fdc42783 lw a5,-36(s0) + 30058e2: 439c lw a5,0(a5) + 30058e4: fe042703 lw a4,-32(s0) + 30058e8: 8319 srli a4,a4,0x6 + 30058ea: d3d8 sw a4,36(a5) + uartHandle->baseAddress->UART_LCR_H.reg = 0; + 30058ec: fdc42783 lw a5,-36(s0) + 30058f0: 439c lw a5,0(a5) + 30058f2: 0207a623 sw zero,44(a5) + uartHandle->baseAddress->UART_LCR_H.BIT.wlen = uartHandle->dataLength; /* Frame length seting */ + 30058f6: fdc42783 lw a5,-36(s0) + 30058fa: 4794 lw a3,8(a5) + 30058fc: fdc42783 lw a5,-36(s0) + 3005900: 4398 lw a4,0(a5) + 3005902: 87b6 mv a5,a3 + 3005904: 8b8d andi a5,a5,3 + 3005906: 0ff7f693 andi a3,a5,255 + 300590a: 575c lw a5,44(a4) + 300590c: 8a8d andi a3,a3,3 + 300590e: 0696 slli a3,a3,0x5 + 3005910: f9f7f793 andi a5,a5,-97 + 3005914: 8fd5 or a5,a5,a3 + 3005916: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_LCR_H.BIT.stp2 = uartHandle->stopBits; /* Stop bit seting */ + 3005918: fdc42783 lw a5,-36(s0) + 300591c: 47d4 lw a3,12(a5) + 300591e: fdc42783 lw a5,-36(s0) + 3005922: 4398 lw a4,0(a5) + 3005924: 87b6 mv a5,a3 + 3005926: 8b85 andi a5,a5,1 + 3005928: 0ff7f693 andi a3,a5,255 + 300592c: 575c lw a5,44(a4) + 300592e: 8a85 andi a3,a3,1 + 3005930: 068e slli a3,a3,0x3 + 3005932: 9bdd andi a5,a5,-9 + 3005934: 8fd5 or a5,a5,a3 + 3005936: d75c sw a5,44(a4) + UART_SetParityBit(uartHandle); + 3005938: fdc42503 lw a0,-36(s0) + 300593c: 39a9 jal ra,3005596 + if (uartHandle->fifoMode == true) { /* FIFO threshold setting */ + 300593e: fdc42783 lw a5,-36(s0) + 3005942: 02c7c783 lbu a5,44(a5) + 3005946: cbb1 beqz a5,300599a + uartHandle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_ENABLE; + 3005948: fdc42783 lw a5,-36(s0) + 300594c: 4398 lw a4,0(a5) + 300594e: 575c lw a5,44(a4) + 3005950: 0107e793 ori a5,a5,16 + 3005954: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_IFLS.BIT.rxiflsel = uartHandle->fifoRxThr; + 3005956: fdc42783 lw a5,-36(s0) + 300595a: 5bd4 lw a3,52(a5) + 300595c: fdc42783 lw a5,-36(s0) + 3005960: 4398 lw a4,0(a5) + 3005962: 87b6 mv a5,a3 + 3005964: 8bbd andi a5,a5,15 + 3005966: 0ff7f693 andi a3,a5,255 + 300596a: 5b5c lw a5,52(a4) + 300596c: 8abd andi a3,a3,15 + 300596e: 06a2 slli a3,a3,0x8 + 3005970: 767d lui a2,0xfffff + 3005972: 0ff60613 addi a2,a2,255 # fffff0ff + 3005976: 8ff1 and a5,a5,a2 + 3005978: 8fd5 or a5,a5,a3 + 300597a: db5c sw a5,52(a4) + uartHandle->baseAddress->UART_IFLS.BIT.txiflsel = uartHandle->fifoTxThr; + 300597c: fdc42783 lw a5,-36(s0) + 3005980: 5b94 lw a3,48(a5) + 3005982: fdc42783 lw a5,-36(s0) + 3005986: 4398 lw a4,0(a5) + 3005988: 87b6 mv a5,a3 + 300598a: 8bbd andi a5,a5,15 + 300598c: 0ff7f693 andi a3,a5,255 + 3005990: 5b5c lw a5,52(a4) + 3005992: 8abd andi a3,a3,15 + 3005994: 9bc1 andi a5,a5,-16 + 3005996: 8fd5 or a5,a5,a3 + 3005998: db5c sw a5,52(a4) + } + if (uartHandle->hwFlowCtr == UART_HW_FLOWCTR_ENABLE) { /* Hardwarer flow control setting */ + 300599a: fdc42783 lw a5,-36(s0) + 300599e: 5f98 lw a4,56(a5) + 30059a0: 4785 li a5,1 + 30059a2: 00f71c63 bne a4,a5,30059ba + uartHandle->baseAddress->UART_CR.reg |= 0xC000; + 30059a6: fdc42783 lw a5,-36(s0) + 30059aa: 439c lw a5,0(a5) + 30059ac: 5b94 lw a3,48(a5) + 30059ae: fdc42783 lw a5,-36(s0) + 30059b2: 439c lw a5,0(a5) + 30059b4: 6731 lui a4,0xc + 30059b6: 8f55 or a4,a4,a3 + 30059b8: db98 sw a4,48(a5) + } + uartHandle->baseAddress->UART_CR.reg |= 0x301; /* Enable bit use 0x301 is to set txe/rxe/uarten */ + 30059ba: fdc42783 lw a5,-36(s0) + 30059be: 439c lw a5,0(a5) + 30059c0: 5b98 lw a4,48(a5) + 30059c2: fdc42783 lw a5,-36(s0) + 30059c6: 439c lw a5,0(a5) + 30059c8: 30176713 ori a4,a4,769 + 30059cc: db98 sw a4,48(a5) + uartHandle->txState = UART_STATE_READY; + 30059ce: fdc42783 lw a5,-36(s0) + 30059d2: 4705 li a4,1 + 30059d4: c7b8 sw a4,72(a5) + uartHandle->rxState = UART_STATE_READY; + 30059d6: fdc42783 lw a5,-36(s0) + 30059da: 4705 li a4,1 + 30059dc: c7f8 sw a4,76(a5) + return BASE_STATUS_OK; + 30059de: 4781 li a5,0 +} + 30059e0: 853e mv a0,a5 + 30059e2: 50b2 lw ra,44(sp) + 30059e4: 5422 lw s0,40(sp) + 30059e6: 6145 addi sp,sp,48 + 30059e8: 8082 ret + +030059ea
: +/* USER CODE BEGIN 1 */ +/* 建议用户定义全局变量、结构体、宏定义或函数声明等 */ +/* USER CODE END 1 */ + +int main(void) +{ + 30059ea: 1141 addi sp,sp,-16 + 30059ec: c606 sw ra,12(sp) + 30059ee: c422 sw s0,8(sp) + 30059f0: 0800 addi s0,sp,16 + /* USER CODE BEGIN 2 */ + /* 建议用户放置初始化代码或启动代码等 */ + /* USER CODE END 2 */ + SystemInit(); + 30059f2: 2655 jal ra,3005d96 + /* USER CODE BEGIN 3 */ + /* 建议用户放置初始配置代码 */ + /* USER CODE END 3 */ + while (1) { + 30059f4: a001 j 30059f4 + +030059f6 : +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + 30059f6: 715d addi sp,sp,-80 + 30059f8: c686 sw ra,76(sp) + 30059fa: c4a2 sw s0,72(sp) + 30059fc: 0880 addi s0,sp,80 + 30059fe: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3005a02: 100007b7 lui a5,0x10000 + 3005a06: fcf42423 sw a5,-56(s0) + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + 3005a0a: fc042623 sw zero,-52(s0) + crg.pllPreDiv = CRG_PLL_PREDIV_4; + 3005a0e: 478d li a5,3 + 3005a10: fcf42823 sw a5,-48(s0) + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + 3005a14: 03000793 li a5,48 + 3005a18: fcf42a23 sw a5,-44(s0) + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + 3005a1c: 4785 li a5,1 + 3005a1e: fcf42c23 sw a5,-40(s0) + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + 3005a22: 4789 li a5,2 + 3005a24: fef42023 sw a5,-32(s0) + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + 3005a28: 4789 li a5,2 + 3005a2a: fef42223 sw a5,-28(s0) + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + 3005a2e: fe042423 sw zero,-24(s0) + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + 3005a32: 47e1 li a5,24 + 3005a34: fef42623 sw a5,-20(s0) + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + 3005a38: fc840793 addi a5,s0,-56 + 3005a3c: 853e mv a0,a5 + 3005a3e: aecfd0ef jal ra,3002d2a + 3005a42: 87aa mv a5,a0 + 3005a44: c399 beqz a5,3005a4a + return BASE_STATUS_ERROR; + 3005a46: 4785 li a5,1 + 3005a48: a039 j 3005a56 + } + *coreClkSelect = crg.coreClkSelect; + 3005a4a: fe042703 lw a4,-32(s0) + 3005a4e: fbc42783 lw a5,-68(s0) + 3005a52: c398 sw a4,0(a5) + return BASE_STATUS_OK; + 3005a54: 4781 li a5,0 +} + 3005a56: 853e mv a0,a5 + 3005a58: 40b6 lw ra,76(sp) + 3005a5a: 4426 lw s0,72(sp) + 3005a5c: 6161 addi sp,sp,80 + 3005a5e: 8082 ret + +03005a60 : + +static void ADC0_Init(void) +{ + 3005a60: 7179 addi sp,sp,-48 + 3005a62: d606 sw ra,44(sp) + 3005a64: d422 sw s0,40(sp) + 3005a66: 1800 addi s0,sp,48 + HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); + 3005a68: 4585 li a1,1 + 3005a6a: 18000537 lui a0,0x18000 + 3005a6e: 2c81 jal ra,3005cbe + HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); + 3005a70: 4589 li a1,2 + 3005a72: 18000537 lui a0,0x18000 + 3005a76: 95dfd0ef jal ra,30033d2 + HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_1); + 3005a7a: 4581 li a1,0 + 3005a7c: 18000537 lui a0,0x18000 + 3005a80: a09fd0ef jal ra,3003488 + + g_adc0.baseAddress = ADC0; + 3005a84: 040007b7 lui a5,0x4000 + 3005a88: 54478793 addi a5,a5,1348 # 4000544 + 3005a8c: 18000737 lui a4,0x18000 + 3005a90: c398 sw a4,0(a5) + g_adc0.socPriority = ADC_PRIMODE_ALL_ROUND; + 3005a92: 040007b7 lui a5,0x4000 + 3005a96: 54478793 addi a5,a5,1348 # 4000544 + 3005a9a: 0007a223 sw zero,4(a5) + + HAL_ADC_Init(&g_adc0); + 3005a9e: 040007b7 lui a5,0x4000 + 3005aa2: 54478513 addi a0,a5,1348 # 4000544 + 3005aa6: f75fb0ef jal ra,3001a1a + + SOC_Param socParam = {0}; + 3005aaa: fc042e23 sw zero,-36(s0) + 3005aae: fe042023 sw zero,-32(s0) + 3005ab2: fe042223 sw zero,-28(s0) + 3005ab6: fe042423 sw zero,-24(s0) + 3005aba: fe042623 sw zero,-20(s0) + socParam.adcInput = ADC_CH_ADCINA6; /* PIN4(ADC AIN6) */ + 3005abe: 4799 li a5,6 + 3005ac0: fcf42e23 sw a5,-36(s0) + socParam.sampleTotalTime = ADC_SOCSAMPLE_10CLK; /* adc sample total time 10 adc_clk */ + 3005ac4: 4789 li a5,2 + 3005ac6: fef42023 sw a5,-32(s0) + socParam.trigSource = ADC_TRIGSOC_SOFT; + 3005aca: fe042223 sw zero,-28(s0) + socParam.continueMode = BASE_CFG_ENABLE; + 3005ace: 4785 li a5,1 + 3005ad0: fef40423 sb a5,-24(s0) + socParam.finishMode = ADC_SOCFINISH_NONE; + 3005ad4: 4785 li a5,1 + 3005ad6: fef42623 sw a5,-20(s0) + HAL_ADC_ConfigureSoc(&g_adc0, ADC_SOC_NUM1, &socParam); + 3005ada: fdc40793 addi a5,s0,-36 + 3005ade: 863e mv a2,a5 + 3005ae0: 4585 li a1,1 + 3005ae2: 040007b7 lui a5,0x4000 + 3005ae6: 54478513 addi a0,a5,1348 # 4000544 + 3005aea: fe3fb0ef jal ra,3001acc +} + 3005aee: 0001 nop + 3005af0: 50b2 lw ra,44(sp) + 3005af2: 5422 lw s0,40(sp) + 3005af4: 6145 addi sp,sp,48 + 3005af6: 8082 ret + +03005af8 : + /* USER CODE BEGIN TIMER3_InterruptProcess */ + /* USER CODE END TIMER3_InterruptProcess */ +} + +static void TIMER3_Init(void) +{ + 3005af8: 1101 addi sp,sp,-32 + 3005afa: ce06 sw ra,28(sp) + 3005afc: cc22 sw s0,24(sp) + 3005afe: 1000 addi s0,sp,32 + HAL_CRG_IpEnableSet(TIMER3_BASE, IP_CLK_ENABLE); /* TIMER3 clock enable. */ + 3005b00: 4585 li a1,1 + 3005b02: 14303537 lui a0,0x14303 + 3005b06: 2a65 jal ra,3005cbe + unsigned int load = (HAL_CRG_GetIpFreq((void *)TIMER3) / (1u << (TIMERPRESCALER_NO_DIV * 4)) / 1000000u) * 10; + 3005b08: 14303537 lui a0,0x14303 + 3005b0c: f0afd0ef jal ra,3003216 + 3005b10: 872a mv a4,a0 + 3005b12: 000f47b7 lui a5,0xf4 + 3005b16: 24078793 addi a5,a5,576 # f4240 + 3005b1a: 02f75733 divu a4,a4,a5 + 3005b1e: 47a9 li a5,10 + 3005b20: 02f707b3 mul a5,a4,a5 + 3005b24: fef42623 sw a5,-20(s0) + + g_timer3.baseAddress = TIMER3; + 3005b28: 040007b7 lui a5,0x4000 + 3005b2c: 49c78793 addi a5,a5,1180 # 400049c + 3005b30: 14303737 lui a4,0x14303 + 3005b34: c398 sw a4,0(a5) + g_timer3.load = load - 1; /* Set timer value immediately */ + 3005b36: fec42783 lw a5,-20(s0) + 3005b3a: fff78713 addi a4,a5,-1 + 3005b3e: 040007b7 lui a5,0x4000 + 3005b42: 49c78793 addi a5,a5,1180 # 400049c + 3005b46: cbd8 sw a4,20(a5) + g_timer3.bgLoad = load - 1; /* Set timer value */ + 3005b48: fec42783 lw a5,-20(s0) + 3005b4c: fff78713 addi a4,a5,-1 + 3005b50: 040007b7 lui a5,0x4000 + 3005b54: 49c78793 addi a5,a5,1180 # 400049c + 3005b58: cf98 sw a4,24(a5) + g_timer3.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ + 3005b5a: 040007b7 lui a5,0x4000 + 3005b5e: 49c78793 addi a5,a5,1180 # 400049c + 3005b62: 4705 li a4,1 + 3005b64: c798 sw a4,8(a5) + g_timer3.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ + 3005b66: 040007b7 lui a5,0x4000 + 3005b6a: 49c78793 addi a5,a5,1180 # 400049c + 3005b6e: 0007a623 sw zero,12(a5) + g_timer3.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ + 3005b72: 040007b7 lui a5,0x4000 + 3005b76: 49c78793 addi a5,a5,1180 # 400049c + 3005b7a: 4705 li a4,1 + 3005b7c: cb98 sw a4,16(a5) + g_timer3.interruptEn = BASE_CFG_ENABLE; + 3005b7e: 040007b7 lui a5,0x4000 + 3005b82: 49c78793 addi a5,a5,1180 # 400049c + 3005b86: 4705 li a4,1 + 3005b88: afd8 sb a4,28(a5) + g_timer3.adcSocReqEnable = BASE_CFG_DISABLE; + 3005b8a: 040007b7 lui a5,0x4000 + 3005b8e: 49c78793 addi a5,a5,1180 # 400049c + 3005b92: 00078ea3 sb zero,29(a5) + g_timer3.dmaReqEnable = BASE_CFG_DISABLE; + 3005b96: 040007b7 lui a5,0x4000 + 3005b9a: 49c78793 addi a5,a5,1180 # 400049c + 3005b9e: 00078f23 sb zero,30(a5) + HAL_TIMER_Init(&g_timer3); + 3005ba2: 040007b7 lui a5,0x4000 + 3005ba6: 49c78513 addi a0,a5,1180 # 400049c + 3005baa: c7cff0ef jal ra,3005026 + IRQ_Register(IRQ_TIMER3, HAL_TIMER_IrqHandler, &g_timer3); + 3005bae: 040007b7 lui a5,0x4000 + 3005bb2: 49c78613 addi a2,a5,1180 # 400049c + 3005bb6: 030057b7 lui a5,0x3005 + 3005bba: 2fe78593 addi a1,a5,766 # 30052fe + 3005bbe: 02300513 li a0,35 + 3005bc2: cf0fc0ef jal ra,30020b2 + + HAL_TIMER_RegisterCallback(&g_timer3, TIMER_PERIOD_FIN, TIMER3_InterruptProcess); + 3005bc6: 030067b7 lui a5,0x3006 + 3005bca: dd678613 addi a2,a5,-554 # 3005dd6 + 3005bce: 4581 li a1,0 + 3005bd0: 040007b7 lui a5,0x4000 + 3005bd4: 49c78513 addi a0,a5,1180 # 400049c + 3005bd8: 3039 jal ra,30053e6 + IRQ_SetPriority(IRQ_TIMER3, 1); /* 1 is priority value */ + 3005bda: 4585 li a1,1 + 3005bdc: 02300513 li a0,35 + 3005be0: ca7fc0ef jal ra,3002886 + IRQ_EnableN(IRQ_TIMER3); + 3005be4: 02300513 li a0,35 + 3005be8: d50fc0ef jal ra,3002138 +} + 3005bec: 0001 nop + 3005bee: 40f2 lw ra,28(sp) + 3005bf0: 4462 lw s0,24(sp) + 3005bf2: 6105 addi sp,sp,32 + 3005bf4: 8082 ret + +03005bf6 : + +static void UART0_Init(void) +{ + 3005bf6: 1141 addi sp,sp,-16 + 3005bf8: c606 sw ra,12(sp) + 3005bfa: c422 sw s0,8(sp) + 3005bfc: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + 3005bfe: 4585 li a1,1 + 3005c00: 14000537 lui a0,0x14000 + 3005c04: 286d jal ra,3005cbe + g_uart0.baseAddress = UART0; + 3005c06: 040007b7 lui a5,0x4000 + 3005c0a: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c0e: 14000737 lui a4,0x14000 + 3005c12: c398 sw a4,0(a5) + + g_uart0.baudRate = UART0_BAND_RATE; + 3005c14: 040007b7 lui a5,0x4000 + 3005c18: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c1c: 6771 lui a4,0x1c + 3005c1e: 20070713 addi a4,a4,512 # 1c200 + 3005c22: c3d8 sw a4,4(a5) + g_uart0.dataLength = UART_DATALENGTH_8BIT; + 3005c24: 040007b7 lui a5,0x4000 + 3005c28: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c2c: 470d li a4,3 + 3005c2e: c798 sw a4,8(a5) + g_uart0.stopBits = UART_STOPBITS_ONE; + 3005c30: 040007b7 lui a5,0x4000 + 3005c34: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c38: 0007a623 sw zero,12(a5) + g_uart0.parity = UART_PARITY_NONE; + 3005c3c: 040007b7 lui a5,0x4000 + 3005c40: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c44: 4711 li a4,4 + 3005c46: cb98 sw a4,16(a5) + g_uart0.txMode = UART_MODE_BLOCKING; + 3005c48: 040007b7 lui a5,0x4000 + 3005c4c: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c50: 0007aa23 sw zero,20(a5) + g_uart0.rxMode = UART_MODE_BLOCKING; + 3005c54: 040007b7 lui a5,0x4000 + 3005c58: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c5c: 0007ac23 sw zero,24(a5) + g_uart0.fifoMode = BASE_CFG_ENABLE; + 3005c60: 040007b7 lui a5,0x4000 + 3005c64: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c68: 4705 li a4,1 + 3005c6a: 02e78623 sb a4,44(a5) + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + 3005c6e: 040007b7 lui a5,0x4000 + 3005c72: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c76: 4721 li a4,8 + 3005c78: db98 sw a4,48(a5) + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + 3005c7a: 040007b7 lui a5,0x4000 + 3005c7e: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c82: 4721 li a4,8 + 3005c84: dbd8 sw a4,52(a5) + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + 3005c86: 040007b7 lui a5,0x4000 + 3005c8a: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c8e: 0207ac23 sw zero,56(a5) + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + 3005c92: 040007b7 lui a5,0x4000 + 3005c96: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c9a: 0607ac23 sw zero,120(a5) + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + 3005c9e: 040007b7 lui a5,0x4000 + 3005ca2: 4c478793 addi a5,a5,1220 # 40004c4 + 3005ca6: 06078e23 sb zero,124(a5) + HAL_UART_Init(&g_uart0); + 3005caa: 040007b7 lui a5,0x4000 + 3005cae: 4c478513 addi a0,a5,1220 # 40004c4 + 3005cb2: 3aad jal ra,300562c +} + 3005cb4: 0001 nop + 3005cb6: 40b2 lw ra,12(sp) + 3005cb8: 4422 lw s0,8(sp) + 3005cba: 0141 addi sp,sp,16 + 3005cbc: 8082 ret + +03005cbe : + 3005cbe: e3cfd06f j 30032fa + +03005cc2 : + +static void IOConfig(void) +{ + 3005cc2: 1141 addi sp,sp,-16 + 3005cc4: c606 sw ra,12(sp) + 3005cc6: c422 sw s0,8(sp) + 3005cc8: 0800 addi s0,sp,16 + /* Config PIN4 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_ADC_AIN6); /* Check function selection */ + 3005cca: 010c07b7 lui a5,0x10c0 + 3005cce: 23c78513 addi a0,a5,572 # 10c023c + 3005cd2: 20c1 jal ra,3005d92 + HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_ADC_AIN6, PULL_NONE); /* Pull-up and Pull-down */ + 3005cd4: 4581 li a1,0 + 3005cd6: 010c07b7 lui a5,0x10c0 + 3005cda: 23c78513 addi a0,a5,572 # 10c023c + 3005cde: 2845 jal ra,3005d8e + HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_ADC_AIN6, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3005ce0: 4581 li a1,0 + 3005ce2: 010c07b7 lui a5,0x10c0 + 3005ce6: 23c78513 addi a0,a5,572 # 10c023c + 3005cea: 2045 jal ra,3005d8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_ADC_AIN6, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3005cec: 4585 li a1,1 + 3005cee: 010c07b7 lui a5,0x10c0 + 3005cf2: 23c78513 addi a0,a5,572 # 10c023c + 3005cf6: 2841 jal ra,3005d86 + HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_ADC_AIN6, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3005cf8: 4589 li a1,2 + 3005cfa: 010c07b7 lui a5,0x10c0 + 3005cfe: 23c78513 addi a0,a5,572 # 10c023c + 3005d02: 2041 jal ra,3005d82 + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + 3005d04: 019007b7 lui a5,0x1900 + 3005d08: 23378513 addi a0,a5,563 # 1900233 + 3005d0c: 2059 jal ra,3005d92 + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + 3005d0e: 4581 li a1,0 + 3005d10: 019007b7 lui a5,0x1900 + 3005d14: 23378513 addi a0,a5,563 # 1900233 + 3005d18: 289d jal ra,3005d8e + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3005d1a: 4581 li a1,0 + 3005d1c: 019007b7 lui a5,0x1900 + 3005d20: 23378513 addi a0,a5,563 # 1900233 + 3005d24: 209d jal ra,3005d8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3005d26: 4585 li a1,1 + 3005d28: 019007b7 lui a5,0x1900 + 3005d2c: 23378513 addi a0,a5,563 # 1900233 + 3005d30: 2899 jal ra,3005d86 + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3005d32: 4589 li a1,2 + 3005d34: 019007b7 lui a5,0x1900 + 3005d38: 23378513 addi a0,a5,563 # 1900233 + 3005d3c: 2099 jal ra,3005d82 + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + 3005d3e: 019407b7 lui a5,0x1940 + 3005d42: 23378513 addi a0,a5,563 # 1940233 + 3005d46: 20b1 jal ra,3005d92 + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + 3005d48: 4589 li a1,2 + 3005d4a: 019407b7 lui a5,0x1940 + 3005d4e: 23378513 addi a0,a5,563 # 1940233 + 3005d52: 2835 jal ra,3005d8e + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3005d54: 4581 li a1,0 + 3005d56: 019407b7 lui a5,0x1940 + 3005d5a: 23378513 addi a0,a5,563 # 1940233 + 3005d5e: 2035 jal ra,3005d8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3005d60: 4585 li a1,1 + 3005d62: 019407b7 lui a5,0x1940 + 3005d66: 23378513 addi a0,a5,563 # 1940233 + 3005d6a: 2831 jal ra,3005d86 + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3005d6c: 4589 li a1,2 + 3005d6e: 019407b7 lui a5,0x1940 + 3005d72: 23378513 addi a0,a5,563 # 1940233 + 3005d76: 2031 jal ra,3005d82 +} + 3005d78: 0001 nop + 3005d7a: 40b2 lw ra,12(sp) + 3005d7c: 4422 lw s0,8(sp) + 3005d7e: 0141 addi sp,sp,16 + 3005d80: 8082 ret + +03005d82 : + 3005d82: 978ff06f j 3004efa + +03005d86 : + 3005d86: 928ff06f j 3004eae + +03005d8a : + 3005d8a: 8d8ff06f j 3004e62 + +03005d8e : + 3005d8e: 888ff06f j 3004e16 + +03005d92 : + 3005d92: 84aff06f j 3004ddc + +03005d96 : + +void SystemInit(void) +{ + 3005d96: 1141 addi sp,sp,-16 + 3005d98: c606 sw ra,12(sp) + 3005d9a: c422 sw s0,8(sp) + 3005d9c: 0800 addi s0,sp,16 + IOConfig(); + 3005d9e: 3715 jal ra,3005cc2 + UART0_Init(); + 3005da0: 3d99 jal ra,3005bf6 + ADC0_Init(); + 3005da2: 397d jal ra,3005a60 + TIMER3_Init(); + 3005da4: 3b91 jal ra,3005af8 + + /* USER CODE BEGIN system_init */ + HAL_TIMER_Start(&g_timer3); + 3005da6: 040007b7 lui a5,0x4000 + 3005daa: 49c78513 addi a0,a5,1180 # 400049c + 3005dae: cceff0ef jal ra,300527c + HAL_ADC_StartIt(&g_adc0); + 3005db2: 040007b7 lui a5,0x4000 + 3005db6: 54478513 addi a0,a5,1348 # 4000544 + 3005dba: ec5fb0ef jal ra,3001c7e + HAL_ADC_SoftTrigSample(&g_adc0, ADC_SOC_NUM1); + 3005dbe: 4585 li a1,1 + 3005dc0: 040007b7 lui a5,0x4000 + 3005dc4: 54478513 addi a0,a5,1348 # 4000544 + 3005dc8: fe3fb0ef jal ra,3001daa + /* USER CODE END system_init */ + 3005dcc: 0001 nop + 3005dce: 40b2 lw ra,12(sp) + 3005dd0: 4422 lw s0,8(sp) + 3005dd2: 0141 addi sp,sp,16 + 3005dd4: 8082 ret + +03005dd6 : +float adc_num[adc_shownum]={0}; +unsigned int i=0; + + +void TIMER3_InterruptProcess(void *handle) +{ + 3005dd6: 7179 addi sp,sp,-48 + 3005dd8: d606 sw ra,44(sp) + 3005dda: d422 sw s0,40(sp) + 3005ddc: 1800 addi s0,sp,48 + 3005dde: fca42e23 sw a0,-36(s0) + unsigned int ret = HAL_ADC_GetConvResult(&g_adc0, ADC_SOC_NUM1); + 3005de2: 4585 li a1,1 + 3005de4: 040007b7 lui a5,0x4000 + 3005de8: 54478513 addi a0,a5,1348 # 4000544 + 3005dec: 840fc0ef jal ra,3001e2c + 3005df0: fea42623 sw a0,-20(s0) + + + adc_num[i] = (float)ret / (float)4096 * 3.3; + 3005df4: fec42783 lw a5,-20(s0) + 3005df8: d017f753 fcvt.s.wu fa4,a5 + 3005dfc: 030067b7 lui a5,0x3006 + 3005e00: 6847a787 flw fa5,1668(a5) # 3006684 + 3005e04: 18f77753 fdiv.s fa4,fa4,fa5 + 3005e08: 040027b7 lui a5,0x4002 + 3005e0c: 2047a783 lw a5,516(a5) # 4002204 + 3005e10: 03006737 lui a4,0x3006 + 3005e14: 68872787 flw fa5,1672(a4) # 3006688 + 3005e18: 10f777d3 fmul.s fa5,fa4,fa5 + 3005e1c: 04000737 lui a4,0x4000 + 3005e20: 5e470713 addi a4,a4,1508 # 40005e4 + 3005e24: 078a slli a5,a5,0x2 + 3005e26: 97ba add a5,a5,a4 + 3005e28: e39c fsw fa5,0(a5) + i++; + 3005e2a: 040027b7 lui a5,0x4002 + 3005e2e: 2047a783 lw a5,516(a5) # 4002204 + 3005e32: 00178713 addi a4,a5,1 + 3005e36: 040027b7 lui a5,0x4002 + 3005e3a: 20e7a223 sw a4,516(a5) # 4002204 + if(i>adc_shownum){ + 3005e3e: 040027b7 lui a5,0x4002 + 3005e42: 2047a703 lw a4,516(a5) # 4002204 + 3005e46: 70800793 li a5,1800 + 3005e4a: 06e7f563 bgeu a5,a4,3005eb4 + for(i=0;i + 3005e56: a099 j 3005e9c + { + DBG_PRINTF("V:%f\r\n", adc_num[i]); + 3005e58: 040027b7 lui a5,0x4002 + 3005e5c: 2047a783 lw a5,516(a5) # 4002204 + 3005e60: 04000737 lui a4,0x4000 + 3005e64: 5e470713 addi a4,a4,1508 # 40005e4 + 3005e68: 078a slli a5,a5,0x2 + 3005e6a: 97ba add a5,a5,a4 + 3005e6c: 639c flw fa5,0(a5) + 3005e6e: 20f78553 fmv.s fa0,fa5 + 3005e72: 20b1 jal ra,3005ebe <__extendsfdf2> + 3005e74: 87aa mv a5,a0 + 3005e76: 882e mv a6,a1 + 3005e78: 863e mv a2,a5 + 3005e7a: 86c2 mv a3,a6 + 3005e7c: 030067b7 lui a5,0x3006 + 3005e80: 67c78513 addi a0,a5,1660 # 300667c + 3005e84: b85fe0ef jal ra,3004a08 + for(i=0;i + 3005e90: 00178713 addi a4,a5,1 + 3005e94: 040027b7 lui a5,0x4002 + 3005e98: 20e7a223 sw a4,516(a5) # 4002204 + 3005e9c: 040027b7 lui a5,0x4002 + 3005ea0: 2047a703 lw a4,516(a5) # 4002204 + 3005ea4: 70700793 li a5,1799 + 3005ea8: fae7f8e3 bgeu a5,a4,3005e58 + } + i=0; + 3005eac: 040027b7 lui a5,0x4002 + 3005eb0: 2007a223 sw zero,516(a5) # 4002204 + } + +} + 3005eb4: 0001 nop + 3005eb6: 50b2 lw ra,44(sp) + 3005eb8: 5422 lw s0,40(sp) + 3005eba: 6145 addi sp,sp,48 + 3005ebc: 8082 ret + +03005ebe <__extendsfdf2>: + 3005ebe: 1141 addi sp,sp,-16 + 3005ec0: c606 sw ra,12(sp) + 3005ec2: c422 sw s0,8(sp) + 3005ec4: c226 sw s1,4(sp) + 3005ec6: e00506d3 fmv.x.w a3,fa0 + 3005eca: 002027f3 frrm a5 + 3005ece: 0176d513 srli a0,a3,0x17 + 3005ed2: 0ff57513 andi a0,a0,255 + 3005ed6: 00800437 lui s0,0x800 + 3005eda: 00150793 addi a5,a0,1 # 14000001 + 3005ede: 147d addi s0,s0,-1 # 7fffff + 3005ee0: 0ff7f793 andi a5,a5,255 + 3005ee4: 4705 li a4,1 + 3005ee6: 8c75 and s0,s0,a3 + 3005ee8: 01f6d493 srli s1,a3,0x1f + 3005eec: 00f75963 bge a4,a5,3005efe <__extendsfdf2+0x40> + 3005ef0: 00345793 srli a5,s0,0x3 + 3005ef4: 38050513 addi a0,a0,896 + 3005ef8: 0476 slli s0,s0,0x1d + 3005efa: 4701 li a4,0 + 3005efc: a891 j 3005f50 <__extendsfdf2+0x92> + 3005efe: e915 bnez a0,3005f32 <__extendsfdf2+0x74> + 3005f00: c459 beqz s0,3005f8e <__extendsfdf2+0xd0> + 3005f02: 8522 mv a0,s0 + 3005f04: 2c6d jal ra,30061be <__clzsi2> + 3005f06: 47a9 li a5,10 + 3005f08: 00a7cf63 blt a5,a0,3005f26 <__extendsfdf2+0x68> + 3005f0c: 47ad li a5,11 + 3005f0e: 8f89 sub a5,a5,a0 + 3005f10: 01550713 addi a4,a0,21 + 3005f14: 00f457b3 srl a5,s0,a5 + 3005f18: 00e41433 sll s0,s0,a4 + 3005f1c: 38900713 li a4,905 + 3005f20: 40a70533 sub a0,a4,a0 + 3005f24: bfd9 j 3005efa <__extendsfdf2+0x3c> + 3005f26: ff550793 addi a5,a0,-11 + 3005f2a: 00f417b3 sll a5,s0,a5 + 3005f2e: 4401 li s0,0 + 3005f30: b7f5 j 3005f1c <__extendsfdf2+0x5e> + 3005f32: c02d beqz s0,3005f94 <__extendsfdf2+0xd6> + 3005f34: 00400737 lui a4,0x400 + 3005f38: 8f61 and a4,a4,s0 + 3005f3a: 00345793 srli a5,s0,0x3 + 3005f3e: 00173713 seqz a4,a4 + 3005f42: 000806b7 lui a3,0x80 + 3005f46: 0712 slli a4,a4,0x4 + 3005f48: 0476 slli s0,s0,0x1d + 3005f4a: 8fd5 or a5,a5,a3 + 3005f4c: 7ff00513 li a0,2047 + 3005f50: 00100637 lui a2,0x100 + 3005f54: 167d addi a2,a2,-1 # fffff + 3005f56: 8ff1 and a5,a5,a2 + 3005f58: 80100637 lui a2,0x80100 + 3005f5c: 167d addi a2,a2,-1 # 800fffff + 3005f5e: 7ff57513 andi a0,a0,2047 + 3005f62: 0552 slli a0,a0,0x14 + 3005f64: 8ff1 and a5,a5,a2 + 3005f66: 80000637 lui a2,0x80000 + 3005f6a: 8fc9 or a5,a5,a0 + 3005f6c: fff64613 not a2,a2 + 3005f70: 01f49693 slli a3,s1,0x1f + 3005f74: 8ff1 and a5,a5,a2 + 3005f76: 00d7e633 or a2,a5,a3 + 3005f7a: 8522 mv a0,s0 + 3005f7c: 85b2 mv a1,a2 + 3005f7e: c319 beqz a4,3005f84 <__extendsfdf2+0xc6> + 3005f80: 00172073 csrs fflags,a4 + 3005f84: 40b2 lw ra,12(sp) + 3005f86: 4422 lw s0,8(sp) + 3005f88: 4492 lw s1,4(sp) + 3005f8a: 0141 addi sp,sp,16 + 3005f8c: 8082 ret + 3005f8e: 4781 li a5,0 + 3005f90: 4501 li a0,0 + 3005f92: b7a5 j 3005efa <__extendsfdf2+0x3c> + 3005f94: 4781 li a5,0 + 3005f96: 7ff00513 li a0,2047 + 3005f9a: b785 j 3005efa <__extendsfdf2+0x3c> + +03005f9c <__truncdfsf2>: + 3005f9c: 00202873 frrm a6 + 3005fa0: 001006b7 lui a3,0x100 + 3005fa4: 16fd addi a3,a3,-1 # fffff + 3005fa6: 8eed and a3,a3,a1 + 3005fa8: 0145d893 srli a7,a1,0x14 + 3005fac: 00369793 slli a5,a3,0x3 + 3005fb0: 7ff8f893 andi a7,a7,2047 + 3005fb4: 01d55693 srli a3,a0,0x1d + 3005fb8: 8edd or a3,a3,a5 + 3005fba: 00188793 addi a5,a7,1 + 3005fbe: 7ff7f793 andi a5,a5,2047 + 3005fc2: 4705 li a4,1 + 3005fc4: 81fd srli a1,a1,0x1f + 3005fc6: 00351613 slli a2,a0,0x3 + 3005fca: 16f75b63 bge a4,a5,3006140 <__truncdfsf2+0x1a4> + 3005fce: c8088713 addi a4,a7,-896 + 3005fd2: 0fe00793 li a5,254 + 3005fd6: 0ae7d063 bge a5,a4,3006076 <__truncdfsf2+0xda> + 3005fda: 04080063 beqz a6,300601a <__truncdfsf2+0x7e> + 3005fde: 478d li a5,3 + 3005fe0: 02f81963 bne a6,a5,3006012 <__truncdfsf2+0x76> + 3005fe4: c99d beqz a1,300601a <__truncdfsf2+0x7e> + 3005fe6: 57fd li a5,-1 + 3005fe8: 0fe00713 li a4,254 + 3005fec: 4681 li a3,0 + 3005fee: 4615 li a2,5 + 3005ff0: 4509 li a0,2 + 3005ff2: 00166613 ori a2,a2,1 + 3005ff6: 1aa80063 beq a6,a0,3006196 <__truncdfsf2+0x1fa> + 3005ffa: 450d li a0,3 + 3005ffc: 18a80a63 beq a6,a0,3006190 <__truncdfsf2+0x1f4> + 3006000: 12081763 bnez a6,300612e <__truncdfsf2+0x192> + 3006004: 00f7f513 andi a0,a5,15 + 3006008: 4891 li a7,4 + 300600a: 13150263 beq a0,a7,300612e <__truncdfsf2+0x192> + 300600e: 0791 addi a5,a5,4 + 3006010: aa39 j 300612e <__truncdfsf2+0x192> + 3006012: 4789 li a5,2 + 3006014: fcf819e3 bne a6,a5,3005fe6 <__truncdfsf2+0x4a> + 3006018: d5f9 beqz a1,3005fe6 <__truncdfsf2+0x4a> + 300601a: 4781 li a5,0 + 300601c: 0ff00713 li a4,255 + 3006020: 4615 li a2,5 + 3006022: 00579693 slli a3,a5,0x5 + 3006026: 0006db63 bgez a3,300603c <__truncdfsf2+0xa0> + 300602a: 0705 addi a4,a4,1 # 400001 + 300602c: 0ff00693 li a3,255 + 3006030: 16d70563 beq a4,a3,300619a <__truncdfsf2+0x1fe> + 3006034: fc0006b7 lui a3,0xfc000 + 3006038: 16fd addi a3,a3,-1 # fbffffff + 300603a: 8ff5 and a5,a5,a3 + 300603c: 0ff00693 li a3,255 + 3006040: 838d srli a5,a5,0x3 + 3006042: 00d71663 bne a4,a3,300604e <__truncdfsf2+0xb2> + 3006046: c781 beqz a5,300604e <__truncdfsf2+0xb2> + 3006048: 004007b7 lui a5,0x400 + 300604c: 4581 li a1,0 + 300604e: 008006b7 lui a3,0x800 + 3006052: 16fd addi a3,a3,-1 # 7fffff + 3006054: 8ff5 and a5,a5,a3 + 3006056: 808006b7 lui a3,0x80800 + 300605a: 0ff77713 andi a4,a4,255 + 300605e: 16fd addi a3,a3,-1 # 807fffff + 3006060: 075e slli a4,a4,0x17 + 3006062: 8ff5 and a5,a5,a3 + 3006064: 05fe slli a1,a1,0x1f + 3006066: 8fd9 or a5,a5,a4 + 3006068: 8fcd or a5,a5,a1 + 300606a: c219 beqz a2,3006070 <__truncdfsf2+0xd4> + 300606c: 00162073 csrs fflags,a2 + 3006070: f0078553 fmv.w.x fa0,a5 + 3006074: 8082 ret + 3006076: 08e04e63 bgtz a4,3006112 <__truncdfsf2+0x176> + 300607a: 57a5 li a5,-23 + 300607c: 0ef74d63 blt a4,a5,3006176 <__truncdfsf2+0x1da> + 3006080: 008007b7 lui a5,0x800 + 3006084: 4379 li t1,30 + 3006086: 8edd or a3,a3,a5 + 3006088: 40e30333 sub t1,t1,a4 + 300608c: 47fd li a5,31 + 300608e: 0467ce63 blt a5,t1,30060ea <__truncdfsf2+0x14e> + 3006092: c8288893 addi a7,a7,-894 + 3006096: 011617b3 sll a5,a2,a7 + 300609a: 00f037b3 snez a5,a5 + 300609e: 011696b3 sll a3,a3,a7 + 30060a2: 00665333 srl t1,a2,t1 + 30060a6: 8edd or a3,a3,a5 + 30060a8: 00d367b3 or a5,t1,a3 + 30060ac: 4701 li a4,0 + 30060ae: cff9 beqz a5,300618c <__truncdfsf2+0x1f0> + 30060b0: 00179713 slli a4,a5,0x1 + 30060b4: 00777693 andi a3,a4,7 + 30060b8: 4601 li a2,0 + 30060ba: c28d beqz a3,30060dc <__truncdfsf2+0x140> + 30060bc: 4689 li a3,2 + 30060be: 0cd80263 beq a6,a3,3006182 <__truncdfsf2+0x1e6> + 30060c2: 468d li a3,3 + 30060c4: 0ad80b63 beq a6,a3,300617a <__truncdfsf2+0x1de> + 30060c8: 4605 li a2,1 + 30060ca: 00081963 bnez a6,30060dc <__truncdfsf2+0x140> + 30060ce: 00f77693 andi a3,a4,15 + 30060d2: 4511 li a0,4 + 30060d4: 4605 li a2,1 + 30060d6: 00a68363 beq a3,a0,30060dc <__truncdfsf2+0x140> + 30060da: 0711 addi a4,a4,4 + 30060dc: 01b75693 srli a3,a4,0x1b + 30060e0: 0016c693 xori a3,a3,1 + 30060e4: 8a85 andi a3,a3,1 + 30060e6: 4701 li a4,0 + 30060e8: a83d j 3006126 <__truncdfsf2+0x18a> + 30060ea: 57f9 li a5,-2 + 30060ec: 40e78733 sub a4,a5,a4 + 30060f0: 02000793 li a5,32 + 30060f4: 00e6d733 srl a4,a3,a4 + 30060f8: 4501 li a0,0 + 30060fa: 00f30663 beq t1,a5,3006106 <__truncdfsf2+0x16a> + 30060fe: ca288893 addi a7,a7,-862 + 3006102: 01169533 sll a0,a3,a7 + 3006106: 00c567b3 or a5,a0,a2 + 300610a: 00f037b3 snez a5,a5 + 300610e: 8fd9 or a5,a5,a4 + 3006110: bf71 j 30060ac <__truncdfsf2+0x110> + 3006112: 051a slli a0,a0,0x6 + 3006114: 00a037b3 snez a5,a0 + 3006118: 068e slli a3,a3,0x3 + 300611a: 8275 srli a2,a2,0x1d + 300611c: 8edd or a3,a3,a5 + 300611e: 00c6e7b3 or a5,a3,a2 + 3006122: 4681 li a3,0 + 3006124: 4601 li a2,0 + 3006126: 0077f513 andi a0,a5,7 + 300612a: ec0513e3 bnez a0,3005ff0 <__truncdfsf2+0x54> + 300612e: ee068ae3 beqz a3,3006022 <__truncdfsf2+0x86> + 3006132: 00167693 andi a3,a2,1 + 3006136: ee0686e3 beqz a3,3006022 <__truncdfsf2+0x86> + 300613a: 00266613 ori a2,a2,2 + 300613e: b5d5 j 3006022 <__truncdfsf2+0x86> + 3006140: 00c6e7b3 or a5,a3,a2 + 3006144: 00089563 bnez a7,300614e <__truncdfsf2+0x1b2> + 3006148: 00f037b3 snez a5,a5 + 300614c: b785 j 30060ac <__truncdfsf2+0x110> + 300614e: cf8d beqz a5,3006188 <__truncdfsf2+0x1ec> + 3006150: 7ff00793 li a5,2047 + 3006154: 4601 li a2,0 + 3006156: 00f89863 bne a7,a5,3006166 <__truncdfsf2+0x1ca> + 300615a: 00400637 lui a2,0x400 + 300615e: 8e75 and a2,a2,a3 + 3006160: 00163613 seqz a2,a2 + 3006164: 0612 slli a2,a2,0x4 + 3006166: 068e slli a3,a3,0x3 + 3006168: 020007b7 lui a5,0x2000 + 300616c: 8fd5 or a5,a5,a3 + 300616e: 0ff00713 li a4,255 + 3006172: 4681 li a3,0 + 3006174: bf4d j 3006126 <__truncdfsf2+0x18a> + 3006176: 4785 li a5,1 + 3006178: bf25 j 30060b0 <__truncdfsf2+0x114> + 300617a: 4605 li a2,1 + 300617c: f1a5 bnez a1,30060dc <__truncdfsf2+0x140> + 300617e: 0721 addi a4,a4,8 + 3006180: bfb1 j 30060dc <__truncdfsf2+0x140> + 3006182: 4605 li a2,1 + 3006184: dda1 beqz a1,30060dc <__truncdfsf2+0x140> + 3006186: bfe5 j 300617e <__truncdfsf2+0x1e2> + 3006188: 0ff00713 li a4,255 + 300618c: 4601 li a2,0 + 300618e: bd51 j 3006022 <__truncdfsf2+0x86> + 3006190: fdd9 bnez a1,300612e <__truncdfsf2+0x192> + 3006192: 07a1 addi a5,a5,8 # 2000008 + 3006194: bf69 j 300612e <__truncdfsf2+0x192> + 3006196: ddc1 beqz a1,300612e <__truncdfsf2+0x192> + 3006198: bfed j 3006192 <__truncdfsf2+0x1f6> + 300619a: 4781 li a5,0 + 300619c: 00080e63 beqz a6,30061b8 <__truncdfsf2+0x21c> + 30061a0: 468d li a3,3 + 30061a2: 00d81763 bne a6,a3,30061b0 <__truncdfsf2+0x214> + 30061a6: c989 beqz a1,30061b8 <__truncdfsf2+0x21c> + 30061a8: 57fd li a5,-1 + 30061aa: 0fe00713 li a4,254 + 30061ae: a029 j 30061b8 <__truncdfsf2+0x21c> + 30061b0: 4689 li a3,2 + 30061b2: fed81be3 bne a6,a3,30061a8 <__truncdfsf2+0x20c> + 30061b6: d9ed beqz a1,30061a8 <__truncdfsf2+0x20c> + 30061b8: 00566613 ori a2,a2,5 + 30061bc: b541 j 300603c <__truncdfsf2+0xa0> + +030061be <__clzsi2>: + 30061be: 67c1 lui a5,0x10 + 30061c0: 02f57663 bgeu a0,a5,30061ec <__clzsi2+0x2e> + 30061c4: 0ff00793 li a5,255 + 30061c8: 00a7b7b3 sltu a5,a5,a0 + 30061cc: 078e slli a5,a5,0x3 + 30061ce: 02000713 li a4,32 + 30061d2: 8f1d sub a4,a4,a5 + 30061d4: 00f557b3 srl a5,a0,a5 + 30061d8: 00000517 auipc a0,0x0 + 30061dc: 5b852503 lw a0,1464(a0) # 3006790 <_GLOBAL_OFFSET_TABLE_+0x4> + 30061e0: 97aa add a5,a5,a0 + 30061e2: 0007c503 lbu a0,0(a5) # 10000 + 30061e6: 40a70533 sub a0,a4,a0 + 30061ea: 8082 ret + 30061ec: 01000737 lui a4,0x1000 + 30061f0: 47c1 li a5,16 + 30061f2: fce56ee3 bltu a0,a4,30061ce <__clzsi2+0x10> + 30061f6: 47e1 li a5,24 + 30061f8: bfd9 j 30061ce <__clzsi2+0x10> + ... + +030061fc <__rodata_start>: + 30061fc: 9680 pop {ra,s0-s6},384 + 30061fe: 4b18 lw a4,16(a4) + +03006200 : + 3006200: 0000 1400 0000 0000 0140 0000 1000 1400 ........@....... + 3006210: 0000 0000 0144 0000 2000 1400 0000 0000 ....D.... ...... + 3006220: 0148 0000 3000 1400 0000 0000 014c 0000 H....0......L... + 3006230: 0000 1430 0000 0000 0240 0000 1000 1430 ..0.....@.....0. + 3006240: 0000 0000 0244 0000 2000 1430 0000 0000 ....D.... 0..... + 3006250: 0248 0000 3000 1430 0000 0000 024c 0000 H....00.....L... + 3006260: 0000 1438 0000 0000 0040 0000 0000 1420 ..8.....@..... . + 3006270: 0000 0000 0180 0000 1000 1420 0000 0000 .......... ..... + 3006280: 0184 0000 0000 1410 0000 0000 01c0 0000 ................ + 3006290: 1000 1410 0000 0000 01c4 0000 0000 1460 ..............`. + 30062a0: 0001 0000 02c0 0000 0000 1470 0000 0000 ..........p..... + 30062b0: 0440 0000 1000 1470 0000 0000 0444 0000 @.....p.....D... + 30062c0: 2000 1470 0000 0000 0448 0000 3000 1470 . p.....H....0p. + 30062d0: 0000 0000 044c 0000 0000 1440 0000 0000 ....L.....@..... + 30062e0: 0200 0000 0000 14b0 0000 0000 0280 0000 ................ + 30062f0: 1000 14b0 0000 0000 0284 0000 2000 14b0 ............. .. + 3006300: 0000 0000 0288 0000 0000 1c00 0000 0000 ................ + 3006310: 0300 0000 0000 1450 0000 0000 0480 0000 ......P......... + 3006320: 1000 1450 0000 0000 0484 0000 2000 1450 ..P.......... P. + 3006330: 0000 0000 0488 0000 3000 1450 0000 0000 .........0P..... + 3006340: 048c 0000 4000 1450 0000 0000 0490 0000 .....@P......... + 3006350: 5000 1450 0000 0000 0494 0000 1000 1440 .PP...........@. + 3006360: 0004 0000 03c0 0000 0000 14c0 0000 0000 ................ + 3006370: 04c0 0000 1000 14c0 0000 0000 04c4 0000 ................ + 3006380: 0000 147d 0000 0000 0b00 0000 0000 1480 ..}............. + 3006390: 0000 0000 0380 0000 0000 14a0 0000 0000 ................ + 30063a0: 0400 0000 1000 14a0 0000 0000 0404 0000 ................ + 30063b0: 2000 14a0 0000 0000 0408 0000 3000 14a0 . ...........0.. + 30063c0: 0000 0000 040c 0000 0000 1001 0000 0000 ................ + 30063d0: 0340 0000 0000 1810 0005 0000 0a60 0000 @...........`... + 30063e0: 0000 1830 0005 0000 0a70 0000 0000 1840 ..0.....p.....@. + 30063f0: 0005 0000 0a80 0000 0000 1820 0005 0000 .......... ..... + 3006400: 0a90 0000 1000 1820 0005 0000 0a90 0004 ...... ......... + 3006410: 0000 1800 0002 0000 0a00 0000 0000 1471 ..............q. + 3006420: 0003 0000 0500 0000 2e2e 642f 6972 6576 ........../drive + 3006430: 7372 612f 6364 692f 636e 612f 6364 695f rs/adc/inc/adc_i + 3006440: 2e70 0068 2e2e 642f 6972 6576 7372 612f p.h.../drivers/a + 3006450: 6364 732f 6372 612f 6364 632e 0000 0000 dc/src/adc.c.... + 3006460: 0000 3f80 0000 4480 5547 4055 0000 4580 ...?...DGUU@...E + 3006470: 6666 4026 51ec 4068 2e2e 642f 6972 6576 ff&@.Qh@../drive + 3006480: 7372 622f 7361 2f65 7273 2f63 6e69 6574 rs/base/src/inte + 3006490: 7272 7075 2e74 0063 2308 0300 235a 0300 rrupt.c..#..Z#.. + 30064a0: 23ac 0300 23fe 0300 2450 0300 24a2 0300 .#...#..P$...$.. + 30064b0: 24f4 0300 2546 0300 25dc 0300 262e 0300 .$..F%...%...&.. + 30064c0: 2680 0300 26d2 0300 2724 0300 2776 0300 .&...&..$'..v'.. + 30064d0: 27c8 0300 281a 0300 2e2e 642f 6972 6576 .'...(..../drive + 30064e0: 7372 632f 6772 692f 636e 632f 6772 695f rs/crg/inc/crg_i + 30064f0: 2e70 0068 2e2e 642f 6972 6576 7372 632f p.h.../drivers/c + 3006500: 6772 732f 6372 632f 6772 632e 0000 0000 rg/src/crg.c.... + 3006510: 0000 0000 0001 0000 0002 0000 0003 0000 ................ + 3006520: 0004 0000 0005 0000 0006 0000 0007 0000 ................ + 3006530: 329c 0300 32a6 0300 32be 0300 329c 0300 .2...2...2...2.. + 3006540: 32da 0300 329c 0300 47f8 0300 4862 0300 .2...2...G..bH.. + 3006550: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 3006560: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 3006570: 4862 0300 4738 0300 478e 0300 4862 0300 bH..8G...G..bH.. + 3006580: 4822 0300 4862 0300 4862 0300 4862 0300 "H..bH..bH..bH.. + 3006590: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 30065a0: 4862 0300 4862 0300 47f8 0300 4862 0300 bH..bH...G..bH.. + 30065b0: 4862 0300 4762 0300 4862 0300 47b8 0300 bH..bG..bH...G.. + 30065c0: 4862 0300 4862 0300 47f8 0300 2e2e 642f bH..bH...G..../d + 30065d0: 6972 6576 7372 692f 636f 676d 692f 636e rivers/iocmg/inc + 30065e0: 692f 636f 676d 695f 2e70 0068 2e2e 642f /iocmg_ip.h.../d + 30065f0: 6972 6576 7372 692f 636f 676d 732f 6372 rivers/iocmg/src + 3006600: 692f 636f 676d 632e 0000 0000 2e2e 642f /iocmg.c....../d + 3006610: 6972 6576 7372 742f 6d69 7265 692f 636e rivers/timer/inc + 3006620: 742f 6d69 7265 695f 2e70 0068 2e2e 642f /timer_ip.h.../d + 3006630: 6972 6576 7372 742f 6d69 7265 732f 6372 rivers/timer/src + 3006640: 742f 6d69 7265 632e 0000 0000 55be 0300 /timer.c.....U.. + 3006650: 55d4 0300 55ea 0300 5600 0300 5616 0300 .U...U...V...V.. + 3006660: 2e2e 642f 6972 6576 7372 752f 7261 2f74 ../drivers/uart/ + 3006670: 7273 2f63 6175 7472 632e 0000 3a56 6625 src/uart.c..V:%f + 3006680: 0a0d 0000 0000 4580 3333 4053 .......E33S@ + +0300668c <__clz_tab>: + 300668c: 0100 0202 0303 0303 0404 0404 0404 0404 ................ + 300669c: 0505 0505 0505 0505 0505 0505 0505 0505 ................ + 30066ac: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 30066bc: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 30066cc: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 30066dc: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 30066ec: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 30066fc: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 300670c: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 300671c: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 300672c: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 300673c: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 300674c: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 300675c: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 300676c: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 300677c: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + +0300678c <_GLOBAL_OFFSET_TABLE_>: + 300678c: 0000 0000 668c 0300 ffff ffff 0000 0000 .....f.......... + +out/bin/target.elf: file format elf32-littleriscv + + +Disassembly of section .text.entry: + +03000004 <_start>: + + .section .text.entry + .global _start + .option norvc +_start: + j handle_reset + 3000004: 4fc0006f j 3000500 + +03000008 : +.endm + +/* The interrupt vector table must be aligned with 4 bytes */ +.align 2 +TrapHandler: + j TrapVector /* trap and INT 0 */ + 3000008: 4680006f j 3000470 + j TrapVector /* INT 1 */ + 300000c: 4640006f j 3000470 + j TrapVector /* INT 2 */ + 3000010: 4600006f j 3000470 + j TrapVector /* INT 3 */ + 3000014: 45c0006f j 3000470 + j TrapVector /* INT 4 */ + 3000018: 4580006f j 3000470 + j TrapVector /* INT 5 */ + 300001c: 4540006f j 3000470 + j TrapVector /* INT 6 */ + 3000020: 4500006f j 3000470 + j TrapVector /* INT 7 */ + 3000024: 44c0006f j 3000470 + j TrapVector /* INT 8 */ + 3000028: 4480006f j 3000470 + j TrapVector /* INT 9 */ + 300002c: 4440006f j 3000470 + j TrapVector /* INT 10 */ + 3000030: 4400006f j 3000470 + j TrapVector /* INT 11 */ + 3000034: 43c0006f j 3000470 + j TrapVector /* INT 12 */ + 3000038: 4380006f j 3000470 + j TrapVector /* INT 13 */ + 300003c: 4340006f j 3000470 + j TrapVector /* INT 14 */ + 3000040: 4300006f j 3000470 + j TrapVector /* INT 15 */ + 3000044: 42c0006f j 3000470 + j TrapVector /* INT 16 */ + 3000048: 4280006f j 3000470 + j TrapVector /* INT 17 */ + 300004c: 4240006f j 3000470 + j TrapVector /* INT 18 */ + 3000050: 4200006f j 3000470 + j TrapVector /* INT 19 */ + 3000054: 41c0006f j 3000470 + j TrapVector /* INT 20 */ + 3000058: 4180006f j 3000470 + j TrapVector /* INT 21 */ + 300005c: 4140006f j 3000470 + j TrapVector /* INT 22 */ + 3000060: 4100006f j 3000470 + j TrapVector /* INT 23 */ + 3000064: 40c0006f j 3000470 + j TrapVector /* INT 24 */ + 3000068: 4080006f j 3000470 + j TrapVector /* INT 25 */ + 300006c: 4040006f j 3000470 + + j IntHandler /* INT 26 */ + 3000070: 2640006f j 30002d4 + j IntHandler /* INT 27 */ + 3000074: 2600006f j 30002d4 + j IntHandler /* INT 28 */ + 3000078: 25c0006f j 30002d4 + j IntHandler /* INT 29 */ + 300007c: 2580006f j 30002d4 + j IntHandler /* INT 30 */ + 3000080: 2540006f j 30002d4 + j IntHandler /* INT 31 */ + 3000084: 2500006f j 30002d4 + j IntHandler /* INT 32 */ + 3000088: 24c0006f j 30002d4 + j IntHandler /* INT 33 */ + 300008c: 2480006f j 30002d4 + j IntHandler /* INT 34 */ + 3000090: 2440006f j 30002d4 + j IntHandler /* INT 35 */ + 3000094: 2400006f j 30002d4 + j IntHandler /* INT 36 */ + 3000098: 23c0006f j 30002d4 + j IntHandler /* INT 37 */ + 300009c: 2380006f j 30002d4 + j IntHandler /* INT 38 */ + 30000a0: 2340006f j 30002d4 + j IntHandler /* INT 39 */ + 30000a4: 2300006f j 30002d4 + j IntHandler /* INT 40 */ + 30000a8: 22c0006f j 30002d4 + j IntHandler /* INT 41 */ + 30000ac: 2280006f j 30002d4 + j IntHandler /* INT 42 */ + 30000b0: 2240006f j 30002d4 + j IntHandler /* INT 43 */ + 30000b4: 2200006f j 30002d4 + j IntHandler /* INT 44 */ + 30000b8: 21c0006f j 30002d4 + j IntHandler /* INT 45 */ + 30000bc: 2180006f j 30002d4 + j IntHandler /* INT 46 */ + 30000c0: 2140006f j 30002d4 + j IntHandler /* INT 47 */ + 30000c4: 2100006f j 30002d4 + j IntHandler /* INT 48 */ + 30000c8: 20c0006f j 30002d4 + j IntHandler /* INT 49 */ + 30000cc: 2080006f j 30002d4 + j IntHandler /* INT 50 */ + 30000d0: 2040006f j 30002d4 + j IntHandler /* INT 51 */ + 30000d4: 2000006f j 30002d4 + j IntHandler /* INT 52 */ + 30000d8: 1fc0006f j 30002d4 + j IntHandler /* INT 53 */ + 30000dc: 1f80006f j 30002d4 + j IntHandler /* INT 54 */ + 30000e0: 1f40006f j 30002d4 + j IntHandler /* INT 55 */ + 30000e4: 1f00006f j 30002d4 + j IntHandler /* INT 56 */ + 30000e8: 1ec0006f j 30002d4 + j IntHandler /* INT 57 */ + 30000ec: 1e80006f j 30002d4 + j IntHandler /* INT 58 */ + 30000f0: 1e40006f j 30002d4 + j IntHandler /* INT 59 */ + 30000f4: 1e00006f j 30002d4 + j IntHandler /* INT 60 */ + 30000f8: 1dc0006f j 30002d4 + j IntHandler /* INT 61 */ + 30000fc: 1d80006f j 30002d4 + j IntHandler /* INT 62 */ + 3000100: 1d40006f j 30002d4 + j IntHandler /* INT 63 */ + 3000104: 1d00006f j 30002d4 + j IntHandler /* INT 64 */ + 3000108: 1cc0006f j 30002d4 + j IntHandler /* INT 65 */ + 300010c: 1c80006f j 30002d4 + j IntHandler /* INT 66 */ + 3000110: 1c40006f j 30002d4 + j IntHandler /* INT 67 */ + 3000114: 1c00006f j 30002d4 + j IntHandler /* INT 68 */ + 3000118: 1bc0006f j 30002d4 + j IntHandler /* INT 69 */ + 300011c: 1b80006f j 30002d4 + j IntHandler /* INT 70 */ + 3000120: 1b40006f j 30002d4 + j IntHandler /* INT 71 */ + 3000124: 1b00006f j 30002d4 + j IntHandler /* INT 72 */ + 3000128: 1ac0006f j 30002d4 + j IntHandler /* INT 73 */ + 300012c: 1a80006f j 30002d4 + j IntHandler /* INT 74 */ + 3000130: 1a40006f j 30002d4 + j IntHandler /* INT 75 */ + 3000134: 1a00006f j 30002d4 + j IntHandler /* INT 76 */ + 3000138: 19c0006f j 30002d4 + j IntHandler /* INT 77 */ + 300013c: 1980006f j 30002d4 + j IntHandler /* INT 78 */ + 3000140: 1940006f j 30002d4 + j IntHandler /* INT 79 */ + 3000144: 1900006f j 30002d4 + j IntHandler /* INT 80 */ + 3000148: 18c0006f j 30002d4 + j IntHandler /* INT 81 */ + 300014c: 1880006f j 30002d4 + j IntHandler /* INT 82 */ + 3000150: 1840006f j 30002d4 + j IntHandler /* INT 83 */ + 3000154: 1800006f j 30002d4 + j IntHandler /* INT 84 */ + 3000158: 17c0006f j 30002d4 + j IntHandler /* INT 85 */ + 300015c: 1780006f j 30002d4 + j IntHandler /* INT 86 */ + 3000160: 1740006f j 30002d4 + j IntHandler /* INT 87 */ + 3000164: 1700006f j 30002d4 + j IntHandler /* INT 88 */ + 3000168: 16c0006f j 30002d4 + j IntHandler /* INT 89 */ + 300016c: 1680006f j 30002d4 + j IntHandler /* INT 90 */ + 3000170: 1640006f j 30002d4 + j IntHandler /* INT 91 */ + 3000174: 1600006f j 30002d4 + j IntHandler /* INT 92 */ + 3000178: 15c0006f j 30002d4 + j IntHandler /* INT 93 */ + 300017c: 1580006f j 30002d4 + j IntHandler /* INT 94 */ + 3000180: 1540006f j 30002d4 + j IntHandler /* INT 95 */ + 3000184: 1500006f j 30002d4 + j IntHandler /* INT 96 */ + 3000188: 14c0006f j 30002d4 + j IntHandler /* INT 97 */ + 300018c: 1480006f j 30002d4 + j IntHandler /* INT 98 */ + 3000190: 1440006f j 30002d4 + j IntHandler /* INT 99 */ + 3000194: 1400006f j 30002d4 + j IntHandler /* INT 100 */ + 3000198: 13c0006f j 30002d4 + j IntHandler /* INT 101 */ + 300019c: 1380006f j 30002d4 + j IntHandler /* INT 102 */ + 30001a0: 1340006f j 30002d4 + j IntHandler /* INT 103 */ + 30001a4: 1300006f j 30002d4 + j IntHandler /* INT 104 */ + 30001a8: 12c0006f j 30002d4 + j IntHandler /* INT 105 */ + 30001ac: 1280006f j 30002d4 + j IntHandler /* INT 106 */ + 30001b0: 1240006f j 30002d4 + j IntHandler /* INT 107 */ + 30001b4: 1200006f j 30002d4 + j IntHandler /* INT 108 */ + 30001b8: 11c0006f j 30002d4 + j IntHandler /* INT 109 */ + 30001bc: 1180006f j 30002d4 + j IntHandler /* INT 110 */ + 30001c0: 1140006f j 30002d4 + j IntHandler /* INT 111 */ + 30001c4: 1100006f j 30002d4 + j IntHandler /* INT 112 */ + 30001c8: 10c0006f j 30002d4 + j IntHandler /* INT 113 */ + 30001cc: 1080006f j 30002d4 + j IntHandler /* INT 114 */ + 30001d0: 1040006f j 30002d4 + j IntHandler /* INT 115 */ + 30001d4: 1000006f j 30002d4 + j IntHandler /* INT 116 */ + 30001d8: 0fc0006f j 30002d4 + j IntHandler /* INT 117 */ + 30001dc: 0f80006f j 30002d4 + j IntHandler /* INT 118 */ + 30001e0: 0f40006f j 30002d4 + j IntHandler /* INT 119 */ + 30001e4: 0f00006f j 30002d4 + j IntHandler /* INT 120 */ + 30001e8: 0ec0006f j 30002d4 + j IntHandler /* INT 121 */ + 30001ec: 0e80006f j 30002d4 + +030001f0 : + +.align 2 +NmiEntry: + SAVE_SYSERR_REGS + 30001f0: f9010113 addi sp,sp,-112 + 30001f4: 04812023 sw s0,64(sp) + 30001f8: 04912223 sw s1,68(sp) + 30001fc: 05212423 sw s2,72(sp) + 3000200: 05312623 sw s3,76(sp) + 3000204: 05412823 sw s4,80(sp) + 3000208: 05512a23 sw s5,84(sp) + 300020c: 05612c23 sw s6,88(sp) + 3000210: 05712e23 sw s7,92(sp) + 3000214: 07812023 sw s8,96(sp) + 3000218: 07912223 sw s9,100(sp) + 300021c: 07a12423 sw s10,104(sp) + 3000220: 07b12623 sw s11,108(sp) + 3000224: 11010593 addi a1,sp,272 + 3000228: 06b12823 sw a1,112(sp) + 300022c: 06312a23 sw gp,116(sp) + 3000230: 06412c23 sw tp,120(sp) + 3000234: 34102573 csrr a0,mepc + 3000238: 300025f3 csrr a1,mstatus + 300023c: 34302673 csrr a2,mtval + 3000240: 342026f3 csrr a3,mcause + 3000244: 06a12e23 sw a0,124(sp) + 3000248: 08b12023 sw a1,128(sp) + 300024c: 08c12223 sw a2,132(sp) + 3000250: 08d12423 sw a3,136(sp) + 3000254: 00010513 mv a0,sp + call SysErrNmiEntry + 3000258: 04c020ef jal ra,30022a4 + +0300025c : +deadLoop1: + tail deadLoop1 + 300025c: a001 j 300025c + nop + 300025e: 00000013 nop + +03000262 : + +.align 2 +TrapEntry: + SAVE_SYSERR_REGS + 3000262: f9010113 addi sp,sp,-112 + 3000266: 04812023 sw s0,64(sp) + 300026a: 04912223 sw s1,68(sp) + 300026e: 05212423 sw s2,72(sp) + 3000272: 05312623 sw s3,76(sp) + 3000276: 05412823 sw s4,80(sp) + 300027a: 05512a23 sw s5,84(sp) + 300027e: 05612c23 sw s6,88(sp) + 3000282: 05712e23 sw s7,92(sp) + 3000286: 07812023 sw s8,96(sp) + 300028a: 07912223 sw s9,100(sp) + 300028e: 07a12423 sw s10,104(sp) + 3000292: 07b12623 sw s11,108(sp) + 3000296: 11010593 addi a1,sp,272 + 300029a: 06b12823 sw a1,112(sp) + 300029e: 06312a23 sw gp,116(sp) + 30002a2: 06412c23 sw tp,120(sp) + 30002a6: 34102573 csrr a0,mepc + 30002aa: 300025f3 csrr a1,mstatus + 30002ae: 34302673 csrr a2,mtval + 30002b2: 342026f3 csrr a3,mcause + 30002b6: 06a12e23 sw a0,124(sp) + 30002ba: 08b12023 sw a1,128(sp) + 30002be: 08c12223 sw a2,132(sp) + 30002c2: 08d12423 sw a3,136(sp) + 30002c6: 00010513 mv a0,sp + /* Exception run with interrupts masked */ + csrc mstatus, MSTATUS_MIE + 30002ca: 30047073 csrci mstatus,8 + call SysErrExcEntry + 30002ce: 7b9010ef jal ra,3002286 + +030002d2 : +deadLoop2: + tail deadLoop2 + 30002d2: a001 j 30002d2 + +030002d4 : + +.align 2 +IntHandler: + addi sp, sp, -(TOTAL_INT_SIZE_ON_STACK) + 30002d4: f6010113 addi sp,sp,-160 + + SREG a0, 3 * REGBYTES(sp) + 30002d8: 00a12623 sw a0,12(sp) + SREG a1, 4 * REGBYTES(sp) + 30002dc: 00b12823 sw a1,16(sp) +#endif + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + csrr a0, mcause +#else + csrr a0, cipri + 30002e0: 7ed02573 csrr a0,0x7ed + csrr a1, prithd + 30002e4: bfe025f3 csrr a1,0xbfe + csrw prithd, a0 /* read prithd */ + 30002e8: bfe51073 csrw 0xbfe,a0 + SREG a1, 6 * REGBYTES(sp) /* save prithd */ + 30002ec: 00b12c23 sw a1,24(sp) + csrr a1, mstatus /* read mstatus */ + 30002f0: 300025f3 csrr a1,mstatus + SREG a1, 7 * REGBYTES(sp) /* save mstatus */ + 30002f4: 00b12e23 sw a1,28(sp) + csrr a1, mepc /* read mepc */ + 30002f8: 341025f3 csrr a1,mepc + SREG a1, 8 * REGBYTES(sp) /* save mepc */ + 30002fc: 02b12023 sw a1,32(sp) + + csrr a0, mcause + 3000300: 34202573 csrr a0,mcause + + li a1, (3<<11) + 3000304: 000025b7 lui a1,0x2 + 3000308: 80058593 addi a1,a1,-2048 # 1800 + csrs mstatus, a1 + 300030c: 3005a073 csrs mstatus,a1 + la a1, custom_nested_irq_main_handler_entry + 3000310: 00000597 auipc a1,0x0 + 3000314: 01058593 addi a1,a1,16 # 3000320 + csrw mepc, a1 + 3000318: 34159073 csrw mepc,a1 + mret + 300031c: 30200073 mret + +03000320 : +#endif + +.align 2 +custom_nested_irq_main_handler_entry: + SREG t0, 0 * REGBYTES(sp) + 3000320: 00512023 sw t0,0(sp) + SREG t1, 1 * REGBYTES(sp) + 3000324: 00612223 sw t1,4(sp) + SREG t2, 2 * REGBYTES(sp) + 3000328: 00712423 sw t2,8(sp) + SREG a2, 5 * REGBYTES(sp) + 300032c: 00c12a23 sw a2,20(sp) + SREG ra, 9 * REGBYTES(sp) + 3000330: 02112223 sw ra,36(sp) + SREG a3, 10 * REGBYTES(sp) + 3000334: 02d12423 sw a3,40(sp) + SREG a4, 11 * REGBYTES(sp) + 3000338: 02e12623 sw a4,44(sp) + SREG a5, 12 * REGBYTES(sp) + 300033c: 02f12823 sw a5,48(sp) + SREG a6, 13 * REGBYTES(sp) + 3000340: 03012a23 sw a6,52(sp) + SREG a7, 14 * REGBYTES(sp) + 3000344: 03112c23 sw a7,56(sp) + SREG t3, 15 * REGBYTES(sp) + 3000348: 03c12e23 sw t3,60(sp) + SREG t4, 16 * REGBYTES(sp) + 300034c: 05d12023 sw t4,64(sp) + SREG t5, 17 * REGBYTES(sp) + 3000350: 05e12223 sw t5,68(sp) + SREG t6, 18 * REGBYTES(sp) + 3000354: 05f12423 sw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FSREG f0, 19 * REGBYTES(sp) + 3000358: 04012627 fsw ft0,76(sp) + FSREG f1, 20 * REGBYTES(sp) + 300035c: 04112827 fsw ft1,80(sp) + FSREG f2, 21 * REGBYTES(sp) + 3000360: 04212a27 fsw ft2,84(sp) + FSREG f3, 22 * REGBYTES(sp) + 3000364: 04312c27 fsw ft3,88(sp) + FSREG f4, 23 * REGBYTES(sp) + 3000368: 04412e27 fsw ft4,92(sp) + FSREG f5, 24 * REGBYTES(sp) + 300036c: 06512027 fsw ft5,96(sp) + FSREG f6, 25 * REGBYTES(sp) + 3000370: 06612227 fsw ft6,100(sp) + FSREG f7, 26 * REGBYTES(sp) + 3000374: 06712427 fsw ft7,104(sp) + FSREG f10, 27 * REGBYTES(sp) + 3000378: 06a12627 fsw fa0,108(sp) + FSREG f11, 28 * REGBYTES(sp) + 300037c: 06b12827 fsw fa1,112(sp) + FSREG f12, 29 * REGBYTES(sp) + 3000380: 06c12a27 fsw fa2,116(sp) + FSREG f13, 30 * REGBYTES(sp) + 3000384: 06d12c27 fsw fa3,120(sp) + FSREG f14, 31 * REGBYTES(sp) + 3000388: 06e12e27 fsw fa4,124(sp) + FSREG f15, 32 * REGBYTES(sp) + 300038c: 08f12027 fsw fa5,128(sp) + FSREG f16, 33 * REGBYTES(sp) + 3000390: 09012227 fsw fa6,132(sp) + FSREG f17, 34 * REGBYTES(sp) + 3000394: 09112427 fsw fa7,136(sp) + FSREG f28, 35 * REGBYTES(sp) + 3000398: 09c12627 fsw ft8,140(sp) + FSREG f29, 36 * REGBYTES(sp) + 300039c: 09d12827 fsw ft9,144(sp) + FSREG f30, 37 * REGBYTES(sp) + 30003a0: 09e12a27 fsw ft10,148(sp) + FSREG f31, 38 * REGBYTES(sp) + 30003a4: 09f12c27 fsw ft11,152(sp) +#endif + + andi a0, a0, MCAUSE_MASK_INT_NUM + 30003a8: 0ff57513 andi a0,a0,255 + call InterruptEntry + 30003ac: 46b010ef jal ra,3002016 + + LREG t1, 1 * REGBYTES(sp) + 30003b0: 00412303 lw t1,4(sp) + LREG t2, 2 * REGBYTES(sp) + 30003b4: 00812383 lw t2,8(sp) + LREG a2, 5 * REGBYTES(sp) + 30003b8: 01412603 lw a2,20(sp) + LREG ra, 9 * REGBYTES(sp) + 30003bc: 02412083 lw ra,36(sp) + LREG a3, 10 * REGBYTES(sp) + 30003c0: 02812683 lw a3,40(sp) + LREG a4, 11 * REGBYTES(sp) + 30003c4: 02c12703 lw a4,44(sp) + LREG a5, 12 * REGBYTES(sp) + 30003c8: 03012783 lw a5,48(sp) + LREG a6, 13 * REGBYTES(sp) + 30003cc: 03412803 lw a6,52(sp) + LREG a7, 14 * REGBYTES(sp) + 30003d0: 03812883 lw a7,56(sp) + LREG t3, 15 * REGBYTES(sp) + 30003d4: 03c12e03 lw t3,60(sp) + LREG t4, 16 * REGBYTES(sp) + 30003d8: 04012e83 lw t4,64(sp) + LREG t5, 17 * REGBYTES(sp) + 30003dc: 04412f03 lw t5,68(sp) + LREG t6, 18 * REGBYTES(sp) + 30003e0: 04812f83 lw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FLREG f0, 19 * REGBYTES(sp) + 30003e4: 04c12007 flw ft0,76(sp) + FLREG f1, 20 * REGBYTES(sp) + 30003e8: 05012087 flw ft1,80(sp) + FLREG f2, 21 * REGBYTES(sp) + 30003ec: 05412107 flw ft2,84(sp) + FLREG f3, 22 * REGBYTES(sp) + 30003f0: 05812187 flw ft3,88(sp) + FLREG f4, 23 * REGBYTES(sp) + 30003f4: 05c12207 flw ft4,92(sp) + FLREG f5, 24 * REGBYTES(sp) + 30003f8: 06012287 flw ft5,96(sp) + FLREG f6, 25 * REGBYTES(sp) + 30003fc: 06412307 flw ft6,100(sp) + FLREG f7, 26 * REGBYTES(sp) + 3000400: 06812387 flw ft7,104(sp) + FLREG f10, 27 * REGBYTES(sp) + 3000404: 06c12507 flw fa0,108(sp) + FLREG f11, 28 * REGBYTES(sp) + 3000408: 07012587 flw fa1,112(sp) + FLREG f12, 29 * REGBYTES(sp) + 300040c: 07412607 flw fa2,116(sp) + FLREG f13, 30 * REGBYTES(sp) + 3000410: 07812687 flw fa3,120(sp) + FLREG f14, 31 * REGBYTES(sp) + 3000414: 07c12707 flw fa4,124(sp) + FLREG f15, 32 * REGBYTES(sp) + 3000418: 08012787 flw fa5,128(sp) + FLREG f16, 33 * REGBYTES(sp) + 300041c: 08412807 flw fa6,132(sp) + FLREG f17, 34 * REGBYTES(sp) + 3000420: 08812887 flw fa7,136(sp) + FLREG f28, 35 * REGBYTES(sp) + 3000424: 08c12e07 flw ft8,140(sp) + FLREG f29, 36 * REGBYTES(sp) + 3000428: 09012e87 flw ft9,144(sp) + FLREG f30, 37 * REGBYTES(sp) + 300042c: 09412f07 flw ft10,148(sp) + FLREG f31, 38 * REGBYTES(sp) + 3000430: 09812f87 flw ft11,152(sp) + +03000434 : + */ + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + LREG t0, 0 * REGBYTES(sp) +#else + LREG a0, 7 * REGBYTES(sp) /* load mstatus */ + 3000434: 01c12503 lw a0,28(sp) + csrr t0, mstatus + 3000438: 300022f3 csrr t0,mstatus + LREG a1, 8 * REGBYTES(sp) /* load mepc */ + 300043c: 02012583 lw a1,32(sp) + andi t0, t0, MSTATUS_MIE + 3000440: 0082f293 andi t0,t0,8 + bnei t0, 0, restore_mstatus + 3000444: 0002923b bnei t0,0,300044c + andi a0, a0, ~(MSTATUS_MIE | MSTATUS_MPIE) + 3000448: f7757513 andi a0,a0,-137 + +0300044c : +restore_mstatus: + csrw mstatus, a0 + 300044c: 30051073 csrw mstatus,a0 + + LREG t0, 0 * REGBYTES(sp) + 3000450: 00012283 lw t0,0(sp) + csrw mepc, a1 + 3000454: 34159073 csrw mepc,a1 + LREG a0, 6 * REGBYTES(sp) /* load prithd */ + 3000458: 01812503 lw a0,24(sp) + csrw prithd, a0 + 300045c: bfe51073 csrw 0xbfe,a0 + lw a1, (a0) + addi a1, a1, -1 + sw a1, (a0) +#endif + + LREG a1, 4 * REGBYTES(sp) /* 2 consecutive csrw instructions will have a bubble */ + 3000460: 01012583 lw a1,16(sp) + + LREG a0, 3 * REGBYTES(sp) + 3000464: 00c12503 lw a0,12(sp) + + addi sp, sp, TOTAL_INT_SIZE_ON_STACK + 3000468: 0a010113 addi sp,sp,160 + + mret + 300046c: 30200073 mret + +03000470 : + +.align 2 +TrapVector: + push_reg + 3000470: f6010113 addi sp,sp,-160 + 3000474: fff11f8b stmia {ra,t0-t6,a0-a7},(sp) + 3000478: f6010113 addi sp,sp,-160 + csrr a0, mcause + 300047c: 34202573 csrr a0,mcause + li t1, MCAUSE_ECALL_FROM_MMODE + 3000480: 00b00313 li t1,11 +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + beq a0, t1, switch_to_umode +#else + beq a0, t1, switch_to_mmode + 3000484: 02650c63 beq a0,t1,30004bc +#endif + li t1, MCAUSE_ECALL_FROM_UMODE + 3000488: 00800313 li t1,8 + beq a0, t1, switch_to_mmode + 300048c: 02650863 beq a0,t1,30004bc + + li a1, MCAUSE_MASK_INT_BIT + 3000490: 800005b7 lui a1,0x80000 + li a2, MCAUSE_MASK_INT_NUM + 3000494: 0ff00613 li a2,255 + and a1, a0, a1 + 3000498: 00b575b3 and a1,a0,a1 + and a0, a0, a2 + 300049c: 00c57533 and a0,a0,a2 + + li a2, 0xc + 30004a0: 00c00613 li a2,12 + beq a0, a2, NmiEntry + 30004a4: d4c506e3 beq a0,a2,30001f0 + beqz a1, TrapEntry + 30004a8: da058de3 beqz a1,3000262 + pop_reg + 30004ac: 0a010113 addi sp,sp,160 + 30004b0: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004b4: 0a010113 addi sp,sp,160 + mret + 30004b8: 30200073 mret + +030004bc : + mret +#endif + +.align 2 +switch_to_mmode: + li t2, MSTATUS_MPP_MACHINE + 30004bc: 000023b7 lui t2,0x2 + 30004c0: 80038393 addi t2,t2,-2048 # 1800 + csrs mstatus, t2 + 30004c4: 3003a073 csrs mstatus,t2 + csrr t0, mepc + 30004c8: 341022f3 csrr t0,mepc + addi t0, t0, 4 + 30004cc: 00428293 addi t0,t0,4 + csrw mepc, t0 + 30004d0: 34129073 csrw mepc,t0 + pop_reg + 30004d4: 0a010113 addi sp,sp,160 + 30004d8: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004dc: 0a010113 addi sp,sp,160 + mret + 30004e0: 30200073 mret + +030004e4 : + +.align 2 +mem_cpy: + bge t0, t2, cpy_done + 30004e4: 0072dc63 bge t0,t2,30004fc + lw t3, (t1) + 30004e8: 00032e03 lw t3,0(t1) + sw t3, (t0) + 30004ec: 01c2a023 sw t3,0(t0) + addi t0, t0, 4 + 30004f0: 00428293 addi t0,t0,4 + addi t1, t1, 4 + 30004f4: 00430313 addi t1,t1,4 + j mem_cpy + 30004f8: fedff06f j 30004e4 + +030004fc : +cpy_done: + ret + 30004fc: 00008067 ret + +03000500 : + +.align 2 +handle_reset: + csrwi mstatus, 0 + 3000500: 30005073 csrwi mstatus,0 + csrwi mie, 0 + 3000504: 30405073 csrwi mie,0 + csrci mstatus, 0x08 + 3000508: 30047073 csrci mstatus,8 + la t0, TrapHandler + 300050c: 00000297 auipc t0,0x0 + 3000510: afc28293 addi t0,t0,-1284 # 3000008 + addi t0, t0, 1 + 3000514: 00128293 addi t0,t0,1 + csrw mtvec, t0 + 3000518: 30529073 csrw mtvec,t0 + csrwi 0x7EF, 0x1 /* lock mtvec */ + 300051c: 7ef0d073 csrwi 0x7ef,1 + +03000520 : + csrwi 0x7C8, 0x1 /* enable hardware nest interrupt support */ +#endif + +flash_init: +/* eflash prefetch enable */ + li t0, EFC_BASE_ADDR + 3000520: 147102b7 lui t0,0x14710 + lw t1, 0x120(t0) + 3000524: 1202a303 lw t1,288(t0) # 14710120 + ori t1, t1, 1 + 3000528: 00136313 ori t1,t1,1 + sw t1, 0x120(t0) + 300052c: 1262a023 sw t1,288(t0) + +/* eflash cache enable */ + lw t1, 0x124(t0) + 3000530: 1242a303 lw t1,292(t0) + ori t1, t1, 1 + 3000534: 00136313 ori t1,t1,1 + sw t1, 0x124(t0) + 3000538: 1262a223 sw t1,292(t0) + +/* enable flash cmd */ + li t0, EFC_MAGIC_NUMBER + 300053c: fedcc2b7 lui t0,0xfedcc + 3000540: a9828293 addi t0,t0,-1384 # fedcba98 + li t1, EFC_MAGIC_LOCK_RW + 3000544: 14710337 lui t1,0x14710 + 3000548: 20030313 addi t1,t1,512 # 14710200 + sw t0, (t1) + 300054c: 00532023 sw t0,0(t1) + +/* initialize global pointer */ + .option push + .option norelax + la gp, __global_pointer$ + 3000550: 01001197 auipc gp,0x1001 + 3000554: bc418193 addi gp,gp,-1084 # 4001114 <__global_pointer$> + .option pop + +/* initialize stack pointer */ + la sp, __stack_top + 3000558: 01007117 auipc sp,0x1007 + 300055c: 6a810113 addi sp,sp,1704 # 4007c00 <__INTERRUPT_STACK_BEGIN__> + +/* timer0 interrupt enable */ + li t0, TIMER0_CONTROL + 3000560: 143002b7 lui t0,0x14300 + 3000564: 00828293 addi t0,t0,8 # 14300008 + lw t1, (t0) + 3000568: 0002a303 lw t1,0(t0) + andi t1, t1, TIMER0_INTENABLE + 300056c: 02037313 andi t1,t1,32 + sw t1, (t0) + 3000570: 0062a023 sw t1,0(t0) + +/* uart0 deinit */ + li t0, 0x14000000 + 3000574: 140002b7 lui t0,0x14000 + li t1, 0 + 3000578: 00000313 li t1,0 + sw t1, IBRD_OFFSET(t0) + 300057c: 0262a223 sw t1,36(t0) # 14000024 + sw t1, FBRD_OFFSET(t0) + 3000580: 0262a423 sw t1,40(t0) + sw t1, LCR_H_OFFSET(t0) + 3000584: 0262a623 sw t1,44(t0) + sw t1, CR_OFFSET(t0) + 3000588: 0262a823 sw t1,48(t0) + sw t1, DMACR_OFFSET(t0) + 300058c: 0462a423 sw t1,72(t0) + +03000590 : + +/* perform the rest of initialization in C */ +clear_sram: + /* clear sysram parity error */ + li t0, SYSRAM_ERROR + 3000590: 101082b7 lui t0,0x10108 + 3000594: 30028293 addi t0,t0,768 # 10108300 + lw t1, (t0) + 3000598: 0002a303 lw t1,0(t0) + ori t1, t1, 1 + 300059c: 00136313 ori t1,t1,1 + sw t1, (t0) + 30005a0: 0062a023 sw t1,0(t0) + + la t0, SRAM_START + 30005a4: 01000297 auipc t0,0x1000 + 30005a8: a5c28293 addi t0,t0,-1444 # 4000000 + la t1, SRAM_END + 30005ac: 01008317 auipc t1,0x1008 + 30005b0: a5430313 addi t1,t1,-1452 # 4008000 + li t2, 0 + 30005b4: 00000393 li t2,0 + +030005b8 : + +clear_sram_loop: + sw t2, (t0) /* clear all sram */ + 30005b8: 0072a023 sw t2,0(t0) + addi t0, t0, 4 /* increment clear index pointer */ + 30005bc: 00428293 addi t0,t0,4 + blt t0, t1, clear_sram_loop /* are we at the end yet, if not , contiue till the end */ + 30005c0: fe62cce3 blt t0,t1,30005b8 + +030005c4 : + +start_coderom_code_copy: + la t0, __sram_code_start_addr /* SRAM addr */ + 30005c4: ff000297 auipc t0,0xff000 + 30005c8: a3c28293 addi t0,t0,-1476 # 2000000 + la t1, __sram_code_load_addr /* ROM addr */ + 30005cc: 00000317 auipc t1,0x0 + 30005d0: 13830313 addi t1,t1,312 # 3000704 + la t2, __sram_code_end_addr + 30005d4: ff000397 auipc t2,0xff000 + 30005d8: a2c38393 addi t2,t2,-1492 # 2000000 + jal mem_cpy + 30005dc: f09ff0ef jal ra,30004e4 + +030005e0 : + +start_reserved_data_copy: + la t0, __reserved_code_start_addr /* SRAM addr */ + 30005e0: 01000297 auipc t0,0x1000 + 30005e4: a2028293 addi t0,t0,-1504 # 4000000 + la t1, __reserved_code_load_addr /* ROM addr */ + 30005e8: 00000317 auipc t1,0x0 + 30005ec: 11c30313 addi t1,t1,284 # 3000704 + la t2, __reserved_code_end_addr + 30005f0: 01000397 auipc t2,0x1000 + 30005f4: a1038393 addi t2,t2,-1520 # 4000000 + jal mem_cpy + 30005f8: eedff0ef jal ra,30004e4 + +030005fc : + +start_coderom_data_copy: + la t0, __data_start /* SRAM addr */ + 30005fc: 01000297 auipc t0,0x1000 + 3000600: a2428293 addi t0,t0,-1500 # 4000020 + la t1, __data_load /* ROM addr */ + 3000604: 00006317 auipc t1,0x6 + 3000608: 1a030313 addi t1,t1,416 # 30067a4 <__data_load> + la t2, __data_end + 300060c: 01000397 auipc t2,0x1000 + 3000610: af038393 addi t2,t2,-1296 # 40000fc + jal mem_cpy + 3000614: ed1ff0ef jal ra,30004e4 + +03000618 : + +pmp_init: + li t0, 0xB00 + 3000618: 000012b7 lui t0,0x1 + 300061c: b0028293 addi t0,t0,-1280 # b00 + csrw pmpaddr0, t0 + 3000620: 3b029073 csrw pmpaddr0,t0 + li t0, 0x400400 /* 0x2C00~0x1000FFF, BOOTROM, enable R+X */ + 3000624: 004002b7 lui t0,0x400 + 3000628: 40028293 addi t0,t0,1024 # 400400 + csrw pmpaddr1, t0 + 300062c: 3b129073 csrw pmpaddr1,t0 + li t0, 0x800000 /* 0x1001000~0x1FFFFFF, Reserved: diable R+X+W */ + 3000630: 008002b7 lui t0,0x800 + csrw pmpaddr2, t0 + 3000634: 3b229073 csrw pmpaddr2,t0 + li t0, 0x802000 /* 0x2000000~0x2007FFF, SYSRAM_ITCM */ + 3000638: 008022b7 lui t0,0x802 + csrw pmpaddr3, t0 + 300063c: 3b329073 csrw pmpaddr3,t0 + li t0, 0xC00000 /* 0x2008000 ~ 0x2FFFFFF, Reserved: disable R+X+W */ + 3000640: 00c002b7 lui t0,0xc00 + csrw pmpaddr4, t0 + 3000644: 3b429073 csrw pmpaddr4,t0 + li t0, 0x1000000 /* 0x3000000 ~ 0x03FFFFFF: EFLASH: enable R+X */ + 3000648: 010002b7 lui t0,0x1000 + csrw pmpaddr5, t0 + 300064c: 3b529073 csrw pmpaddr5,t0 + li t0, 0x1002000 /* 0x4000000 ~ 0x04007FFF: SYSTEM_DTCM enable R+W */ + 3000650: 010022b7 lui t0,0x1002 + csrw pmpaddr6, t0 + 3000654: 3b629073 csrw pmpaddr6,t0 + li t0,0x7000400 /* 0x4008000 ~ 0x01C000FFF: REGISTER R+W */ + 3000658: 070002b7 lui t0,0x7000 + 300065c: 40028293 addi t0,t0,1024 # 7000400 + csrw pmpaddr7, t0 + 3000660: 3b729073 csrw pmpaddr7,t0 + + li t0,0xf3333333 /* register TOR-R-W */ + 3000664: f33332b7 lui t0,0xf3333 + 3000668: 33328293 addi t0,t0,819 # f3333333 + csrw 0x7d8,t0 + 300066c: 7d829073 csrw 0x7d8,t0 + li t0,0x0d080d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + csrw pmpcfg0,t0 + li t0,0x0b0b0d08 + csrw pmpcfg1,t0 +#else + li t0,0x8d888d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + 3000670: 8d8892b7 lui t0,0x8d889 + 3000674: d8b28293 addi t0,t0,-629 # 8d888d8b + csrw pmpcfg0,t0 + 3000678: 3a029073 csrw pmpcfg0,t0 + li t0,0x8b8b8d88 + 300067c: 8b8b92b7 lui t0,0x8b8b9 + 3000680: d8828293 addi t0,t0,-632 # 8b8b8d88 + csrw pmpcfg1,t0 + 3000684: 3a129073 csrw pmpcfg1,t0 +#endif + +/* disable Icache */ + csrwi 0x7C0, 0x0 /* disable ICACHE */ + 3000688: 7c005073 csrwi 0x7c0,0 + fence + 300068c: 0ff0000f fence + +/* disable Dcache */ + csrwi 0x7C1, 0x0 /* disable DCACHE */ + 3000690: 7c105073 csrwi 0x7c1,0 + fence + 3000694: 0ff0000f fence + +/* support float and mie */ + li t0,0x2008 + 3000698: 000022b7 lui t0,0x2 + 300069c: 00828293 addi t0,t0,8 # 2008 + csrs mstatus,t0 + 30006a0: 3002a073 csrs mstatus,t0 + li t0,0x20 + 30006a4: 02000293 li t0,32 + csrs misa,t0 + 30006a8: 3012a073 csrs misa,t0 + +/* Interrupt set default priority = 1*/ + li t0, 0x11111111 + 30006ac: 111112b7 lui t0,0x11111 + 30006b0: 11128293 addi t0,t0,273 # 11111111 + csrw locipri0, t0 + 30006b4: bc029073 csrw 0xbc0,t0 + csrw locipri1, t0 + 30006b8: bc129073 csrw 0xbc1,t0 + csrw locipri2, t0 + 30006bc: bc229073 csrw 0xbc2,t0 + csrw locipri3, t0 + 30006c0: bc329073 csrw 0xbc3,t0 + csrw locipri4, t0 + 30006c4: bc429073 csrw 0xbc4,t0 + csrw locipri5, t0 + 30006c8: bc529073 csrw 0xbc5,t0 + csrw locipri6, t0 + 30006cc: bc629073 csrw 0xbc6,t0 + csrw locipri7, t0 + 30006d0: bc729073 csrw 0xbc7,t0 + csrw locipri8, t0 + 30006d4: bc829073 csrw 0xbc8,t0 + csrw locipri9, t0 + 30006d8: bc929073 csrw 0xbc9,t0 + csrw locipri10, t0 + 30006dc: bca29073 csrw 0xbca,t0 + csrw locipri11, t0 + 30006e0: bcb29073 csrw 0xbcb,t0 + csrw locipri12, t0 + 30006e4: bcc29073 csrw 0xbcc,t0 + csrw locipri13, t0 + 30006e8: bcd29073 csrw 0xbcd,t0 + csrw locipri14, t0 + 30006ec: bce29073 csrw 0xbce,t0 + csrw locipri15, t0 + 30006f0: bcf29073 csrw 0xbcf,t0 + + ecall + 30006f4: 00000073 ecall + jal Chip_Init + 30006f8: 014000ef jal ra,300070c + +/* jump to C func. */ + jal main + 30006fc: 2ee050ef jal ra,30059ea
+ +03000700 : + +dead_loop: + j dead_loop + 3000700: 0000006f j 3000700 + +Disassembly of section .text: + +03000704 : + * @brief Chip Init Fail Process, deadloop if Chip Init fail + * @param None + * @retval None + */ +static inline void Chip_InitFail(void) +{ + 3000704: 1141 addi sp,sp,-16 + 3000706: c622 sw s0,12(sp) + 3000708: 0800 addi s0,sp,16 + while (1) { + 300070a: a001 j 300070a + +0300070c : + * @brief Chip Init + * @param None + * @retval None + */ +void Chip_Init(void) +{ + 300070c: 1101 addi sp,sp,-32 + 300070e: ce06 sw ra,28(sp) + 3000710: cc22 sw s0,24(sp) + 3000712: 1000 addi s0,sp,32 + CRG_CoreClkSelect coreClkSelect; + /* Config CRG */ + if (CRG_Config(&coreClkSelect) != BASE_STATUS_OK) { + 3000714: fec40793 addi a5,s0,-20 + 3000718: 853e mv a0,a5 + 300071a: 2dc050ef jal ra,30059f6 + 300071e: 87aa mv a5,a0 + 3000720: c391 beqz a5,3000724 + Chip_InitFail(); + 3000722: 37cd jal ra,3000704 + } + + /* Config FLASH Clock */ + FLASH_ClockConfig(coreClkSelect); + 3000724: fec42783 lw a5,-20(s0) + 3000728: 853e mv a0,a5 + 300072a: 796000ef jal ra,3000ec0 + SYSTICK_Init(); + 300072e: 057000ef jal ra,3000f84 + /* Set CoreClock Select after FLASH Config Done */ + CRG_SetCoreClockSelect(coreClkSelect); + 3000732: fec42783 lw a5,-20(s0) + 3000736: 853e mv a0,a5 + 3000738: 25b1 jal ra,3000d84 + + IRQ_Init(); + 300073a: 121010ef jal ra,300205a + ANAVREF_Init(); + 300073e: 23e5 jal ra,3000d26 + ANATRIM_Entry(); + 3000740: 2b51 jal ra,3000cd4 + /* User Add Code Here */ + 3000742: 0001 nop + 3000744: 40f2 lw ra,28(sp) + 3000746: 4462 lw s0,24(sp) + 3000748: 6105 addi sp,sp,32 + 300074a: 8082 ret + +0300074c : + * @brief Calculate the conversion gain of the tsensor. + * @param data, original data. + * @retval None + */ +static void CalculateGain(unsigned int data) +{ + 300074c: 1101 addi sp,sp,-32 + 300074e: ce22 sw s0,28(sp) + 3000750: 1000 addi s0,sp,32 + 3000752: fea42623 sw a0,-20(s0) + g_tsensorGain = ((float)(data) / 10000000.0f); + 3000756: fec42783 lw a5,-20(s0) + 300075a: d017f753 fcvt.s.wu fa4,a5 + 300075e: 030067b7 lui a5,0x3006 + 3000762: 1fc7a787 flw fa5,508(a5) # 30061fc <__rodata_start> + 3000766: 18f777d3 fdiv.s fa5,fa4,fa5 + 300076a: 040007b7 lui a5,0x4000 + 300076e: 02f7a027 fsw fa5,32(a5) # 4000020 +} + 3000772: 0001 nop + 3000774: 4472 lw s0,28(sp) + 3000776: 6105 addi sp,sp,32 + 3000778: 8082 ret + +0300077a : + * @brief Obtains the chip ID. + * @param None + * @retval None + */ +static bool CHIP_GetInfo(void) +{ + 300077a: 7179 addi sp,sp,-48 + 300077c: d606 sw ra,44(sp) + 300077e: d422 sw s0,40(sp) + 3000780: 1800 addi s0,sp,48 + FOTP_INFO_RGN0_NUMBER_4 emptyData; + FOTP_INFO_RGN0_NUMBER_2 idData; + FOTP_InfoGet(FOTP_INFO_RNG0, 4U, (void *)&emptyData.comData); /* 4 is the number of fotp_empty_flag in otp */ + 3000782: fe040793 addi a5,s0,-32 + 3000786: 863e mv a2,a5 + 3000788: 4591 li a1,4 + 300078a: 4501 li a0,0 + 300078c: 2391 jal ra,3000cd0 + FOTP_InfoGet(FOTP_INFO_RNG0, 2U, (void *)&idData.comData); /* 2 is the number of idData in otp */ + 300078e: fd040793 addi a5,s0,-48 + 3000792: 863e mv a2,a5 + 3000794: 4589 li a1,2 + 3000796: 4501 li a0,0 + 3000798: 2b25 jal ra,3000cd0 + if (emptyData.REG.fotp_empty_flag != 0x5AA59669 || idData.REG.chip_id == 0xFFFFFFFF) { + 300079a: fe042703 lw a4,-32(s0) + 300079e: 5aa597b7 lui a5,0x5aa59 + 30007a2: 66978793 addi a5,a5,1641 # 5aa59669 + 30007a6: 00f71763 bne a4,a5,30007b4 + 30007aa: fd042703 lw a4,-48(s0) + 30007ae: 57fd li a5,-1 + 30007b0: 00f71463 bne a4,a5,30007b8 + return false; + 30007b4: 4781 li a5,0 + 30007b6: a011 j 30007ba + } + return true; + 30007b8: 4785 li a5,1 +} + 30007ba: 853e mv a0,a5 + 30007bc: 50b2 lw ra,44(sp) + 30007be: 5422 lw s0,40(sp) + 30007c0: 6145 addi sp,sp,48 + 30007c2: 8082 ret + +030007c4 : + * @brief Analog module trim. + * @param None + * @retval None + */ +static void CHIP_AnalogTrim(void) +{ + 30007c4: 711d addi sp,sp,-96 + 30007c6: ce86 sw ra,92(sp) + 30007c8: cca2 sw s0,88(sp) + 30007ca: 1080 addi s0,sp,96 + FOTP_INFO_RGN0_NUMBER_20 trimData20; + FOTP_InfoGet(FOTP_INFO_RNG0, 20U, (void *)&trimData20.comData); /* 20 is the number of trim data in otp */ + 30007cc: fdc40793 addi a5,s0,-36 + 30007d0: 863e mv a2,a5 + 30007d2: 45d1 li a1,20 + 30007d4: 4501 li a0,0 + 30007d6: 29ed jal ra,3000cd0 + /* VREF */ + VREF->VREF_TRIM0.BIT.da_iref_trim = trimData20.REG.data0.da_iref_trim; + 30007d8: 18100737 lui a4,0x18100 + 30007dc: fdc42783 lw a5,-36(s0) + 30007e0: 83c1 srli a5,a5,0x10 + 30007e2: 9bfd andi a5,a5,-1 + 30007e4: 0ff7f693 andi a3,a5,255 + 30007e8: 433c lw a5,64(a4) + 30007ea: 0ff6f693 andi a3,a3,255 + 30007ee: f007f793 andi a5,a5,-256 + 30007f2: 8fd5 or a5,a5,a3 + 30007f4: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vref_trim = trimData20.REG.data0.da_ref_vref_trim; + 30007f6: 18100737 lui a4,0x18100 + 30007fa: fdc42783 lw a5,-36(s0) + 30007fe: 83a1 srli a5,a5,0x8 + 3000800: 9bfd andi a5,a5,-1 + 3000802: 0ff7f693 andi a3,a5,255 + 3000806: 433c lw a5,64(a4) + 3000808: 0ff6f693 andi a3,a3,255 + 300080c: 06a2 slli a3,a3,0x8 + 300080e: 7641 lui a2,0xffff0 + 3000810: 0ff60613 addi a2,a2,255 # ffff00ff + 3000814: 8ff1 and a5,a5,a2 + 3000816: 8fd5 or a5,a5,a3 + 3000818: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vbg_trim = trimData20.REG.data0.da_ref_vbg_trim; + 300081a: 18100737 lui a4,0x18100 + 300081e: fdc42783 lw a5,-36(s0) + 3000822: 0ff7f693 andi a3,a5,255 + 3000826: 433c lw a5,64(a4) + 3000828: 0ff6f693 andi a3,a3,255 + 300082c: 06c2 slli a3,a3,0x10 + 300082e: ff010637 lui a2,0xff010 + 3000832: 167d addi a2,a2,-1 # ff00ffff + 3000834: 8ff1 and a5,a5,a2 + 3000836: 8fd5 or a5,a5,a3 + 3000838: c33c sw a5,64(a4) + unsigned int value = trimData20.REG.data1.da_ref_temp_trim3; + 300083a: fe042783 lw a5,-32(s0) + 300083e: 83c1 srli a5,a5,0x10 + 3000840: 9bfd andi a5,a5,-1 + 3000842: 9f81 uxtb a5 + 3000844: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim2 << 8U); /* Shift left by 8 bits */ + 3000848: fe042783 lw a5,-32(s0) + 300084c: 83a1 srli a5,a5,0x8 + 300084e: 9bfd andi a5,a5,-1 + 3000850: 9f81 uxtb a5 + 3000852: 07a2 slli a5,a5,0x8 + 3000854: 873e mv a4,a5 + 3000856: fec42783 lw a5,-20(s0) + 300085a: 8fd9 or a5,a5,a4 + 300085c: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim1 << 16U); /* Shift left by 16 bits */ + 3000860: fe042783 lw a5,-32(s0) + 3000864: 9f81 uxtb a5 + 3000866: 07c2 slli a5,a5,0x10 + 3000868: 873e mv a4,a5 + 300086a: fec42783 lw a5,-20(s0) + 300086e: 8fd9 or a5,a5,a4 + 3000870: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data0.da_ref_temp_trim0 << 24U); /* Shift left by 24 bits */ + 3000874: fdc42783 lw a5,-36(s0) + 3000878: 83e1 srli a5,a5,0x18 + 300087a: 9f81 uxtb a5 + 300087c: 07e2 slli a5,a5,0x18 + 300087e: 873e mv a4,a5 + 3000880: fec42783 lw a5,-20(s0) + 3000884: 8fd9 or a5,a5,a4 + 3000886: fef42623 sw a5,-20(s0) + VREF->VREF_TRIM1.reg = value; + 300088a: 181007b7 lui a5,0x18100 + 300088e: fec42703 lw a4,-20(s0) + 3000892: c3f8 sw a4,68(a5) + + FOTP_INFO_RGN0_NUMBER_21 trimData21; + FOTP_InfoGet(FOTP_INFO_RNG0, 21U, (void *)&trimData21.comData); /* 21 is the number of trim data in otp */ + 3000894: fcc40793 addi a5,s0,-52 + 3000898: 863e mv a2,a5 + 300089a: 45d5 li a1,21 + 300089c: 4501 li a0,0 + 300089e: 290d jal ra,3000cd0 + /* ADC */ + ADC0->ADC_OEGE_TRIM.BIT.cfg_gain_cali_trim = trimData21.REG.data1.saradc_gain; + 30008a0: 18000737 lui a4,0x18000 + 30008a4: fd042783 lw a5,-48(s0) + 30008a8: 86be mv a3,a5 + 30008aa: 6789 lui a5,0x2 + 30008ac: 17fd addi a5,a5,-1 # 1fff + 30008ae: 8ff5 and a5,a5,a3 + 30008b0: 01079613 slli a2,a5,0x10 + 30008b4: 8241 srli a2,a2,0x10 + 30008b6: 6785 lui a5,0x1 + 30008b8: 973e add a4,a4,a5 + 30008ba: 80872783 lw a5,-2040(a4) # 17fff808 + 30008be: 6689 lui a3,0x2 + 30008c0: 16fd addi a3,a3,-1 # 1fff + 30008c2: 8ef1 and a3,a3,a2 + 30008c4: 06c2 slli a3,a3,0x10 + 30008c6: e0010637 lui a2,0xe0010 + 30008ca: 167d addi a2,a2,-1 # e000ffff + 30008cc: 8ff1 and a5,a5,a2 + 30008ce: 8fd5 or a5,a5,a3 + 30008d0: 80f72423 sw a5,-2040(a4) + ADC0->ADC_OEGE_TRIM.BIT.cfg_ofst_cali_trim = trimData21.REG.data1.saradc_offset; + 30008d4: 18000737 lui a4,0x18000 + 30008d8: fd042783 lw a5,-48(s0) + 30008dc: 83c1 srli a5,a5,0x10 + 30008de: 86be mv a3,a5 + 30008e0: 6785 lui a5,0x1 + 30008e2: 17fd addi a5,a5,-1 # fff + 30008e4: 8ff5 and a5,a5,a3 + 30008e6: 01079613 slli a2,a5,0x10 + 30008ea: 8241 srli a2,a2,0x10 + 30008ec: 6785 lui a5,0x1 + 30008ee: 973e add a4,a4,a5 + 30008f0: 80872783 lw a5,-2040(a4) # 17fff808 + 30008f4: 6685 lui a3,0x1 + 30008f6: 16fd addi a3,a3,-1 # fff + 30008f8: 8ef1 and a3,a3,a2 + 30008fa: 767d lui a2,0xfffff + 30008fc: 8ff1 and a5,a5,a2 + 30008fe: 8fd5 or a5,a5,a3 + 3000900: 80f72423 sw a5,-2040(a4) + + /* TSENSOR */ + TSENSOR->TSENSOR_TRIM.reg = trimData20.REG.data1.da_ref_vptat_trim; + 3000904: fe042783 lw a5,-32(s0) + 3000908: 83e1 srli a5,a5,0x18 + 300090a: 0ff7f713 andi a4,a5,255 + 300090e: 185007b7 lui a5,0x18500 + 3000912: cb98 sw a4,16(a5) + ADC0->ADC_TSENSOR_TRIM.BIT.cfg_tsensor_ofst_trim = trimData21.REG.data2.ts_offset; + 3000914: 18000737 lui a4,0x18000 + 3000918: fd442783 lw a5,-44(s0) + 300091c: 86be mv a3,a5 + 300091e: 6785 lui a5,0x1 + 3000920: 17fd addi a5,a5,-1 # fff + 3000922: 8ff5 and a5,a5,a3 + 3000924: 01079613 slli a2,a5,0x10 + 3000928: 8241 srli a2,a2,0x10 + 300092a: 6785 lui a5,0x1 + 300092c: 973e add a4,a4,a5 + 300092e: 80472783 lw a5,-2044(a4) # 17fff804 + 3000932: 6685 lui a3,0x1 + 3000934: 16fd addi a3,a3,-1 # fff + 3000936: 8ef1 and a3,a3,a2 + 3000938: 767d lui a2,0xfffff + 300093a: 8ff1 and a5,a5,a2 + 300093c: 8fd5 or a5,a5,a3 + 300093e: 80f72223 sw a5,-2044(a4) + CalculateGain(trimData21.REG.data3.ts_gain); + 3000942: fd842783 lw a5,-40(s0) + 3000946: 83a5 srli a5,a5,0x9 + 3000948: 853e mv a0,a5 + 300094a: 3509 jal ra,300074c + + /* PGA */ + PGA0->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga0_vos_trim; + 300094c: 18200737 lui a4,0x18200 + 3000950: fcc42783 lw a5,-52(s0) + 3000954: 1ff7f793 andi a5,a5,511 + 3000958: 01079693 slli a3,a5,0x10 + 300095c: 82c1 srli a3,a3,0x10 + 300095e: 531c lw a5,32(a4) + 3000960: 1ff6f693 andi a3,a3,511 + 3000964: e007f793 andi a5,a5,-512 + 3000968: 8fd5 or a5,a5,a3 + 300096a: d31c sw a5,32(a4) + PGA1->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga1_vos_trim; + 300096c: 18201737 lui a4,0x18201 + 3000970: fcc42783 lw a5,-52(s0) + 3000974: 83c1 srli a5,a5,0x10 + 3000976: 1ff7f793 andi a5,a5,511 + 300097a: 01079693 slli a3,a5,0x10 + 300097e: 82c1 srli a3,a3,0x10 + 3000980: 531c lw a5,32(a4) + 3000982: 1ff6f693 andi a3,a3,511 + 3000986: e007f793 andi a5,a5,-512 + 300098a: 8fd5 or a5,a5,a3 + 300098c: d31c sw a5,32(a4) + + FOTP_INFO_RGN0_NUMBER_22 trimData22; + FOTP_InfoGet(FOTP_INFO_RNG0, 22U, (void *)&trimData22.comData); /* 22 is the number of trim data in otp */ + 300098e: fbc40793 addi a5,s0,-68 + 3000992: 863e mv a2,a5 + 3000994: 45d9 li a1,22 + 3000996: 4501 li a0,0 + 3000998: 257d jal ra,3001046 + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_gain_trim2 = trimData22.REG.data0.pga0_gain2; + 300099a: 18000737 lui a4,0x18000 + 300099e: fbc42783 lw a5,-68(s0) + 30009a2: 86be mv a3,a5 + 30009a4: 6789 lui a5,0x2 + 30009a6: 17fd addi a5,a5,-1 # 1fff + 30009a8: 8ff5 and a5,a5,a3 + 30009aa: 01079613 slli a2,a5,0x10 + 30009ae: 8241 srli a2,a2,0x10 + 30009b0: 6785 lui a5,0x1 + 30009b2: 973e add a4,a4,a5 + 30009b4: 81472783 lw a5,-2028(a4) # 17fff814 + 30009b8: 6689 lui a3,0x2 + 30009ba: 16fd addi a3,a3,-1 # 1fff + 30009bc: 8ef1 and a3,a3,a2 + 30009be: 06c2 slli a3,a3,0x10 + 30009c0: e0010637 lui a2,0xe0010 + 30009c4: 167d addi a2,a2,-1 # e000ffff + 30009c6: 8ff1 and a5,a5,a2 + 30009c8: 8fd5 or a5,a5,a3 + 30009ca: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_ofst_trim2 = trimData22.REG.data0.pga0_offset2; + 30009ce: 18000737 lui a4,0x18000 + 30009d2: fbc42783 lw a5,-68(s0) + 30009d6: 83c1 srli a5,a5,0x10 + 30009d8: 86be mv a3,a5 + 30009da: 6785 lui a5,0x1 + 30009dc: 17fd addi a5,a5,-1 # fff + 30009de: 8ff5 and a5,a5,a3 + 30009e0: 01079613 slli a2,a5,0x10 + 30009e4: 8241 srli a2,a2,0x10 + 30009e6: 6785 lui a5,0x1 + 30009e8: 973e add a4,a4,a5 + 30009ea: 81472783 lw a5,-2028(a4) # 17fff814 + 30009ee: 6685 lui a3,0x1 + 30009f0: 16fd addi a3,a3,-1 # fff + 30009f2: 8ef1 and a3,a3,a2 + 30009f4: 767d lui a2,0xfffff + 30009f6: 8ff1 and a5,a5,a2 + 30009f8: 8fd5 or a5,a5,a3 + 30009fa: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_gain_trim4 = trimData22.REG.data1.pga0_gain4; + 30009fe: 18000737 lui a4,0x18000 + 3000a02: fc042783 lw a5,-64(s0) + 3000a06: 86be mv a3,a5 + 3000a08: 6789 lui a5,0x2 + 3000a0a: 17fd addi a5,a5,-1 # 1fff + 3000a0c: 8ff5 and a5,a5,a3 + 3000a0e: 01079613 slli a2,a5,0x10 + 3000a12: 8241 srli a2,a2,0x10 + 3000a14: 6785 lui a5,0x1 + 3000a16: 973e add a4,a4,a5 + 3000a18: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a1c: 6689 lui a3,0x2 + 3000a1e: 16fd addi a3,a3,-1 # 1fff + 3000a20: 8ef1 and a3,a3,a2 + 3000a22: 06c2 slli a3,a3,0x10 + 3000a24: e0010637 lui a2,0xe0010 + 3000a28: 167d addi a2,a2,-1 # e000ffff + 3000a2a: 8ff1 and a5,a5,a2 + 3000a2c: 8fd5 or a5,a5,a3 + 3000a2e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_ofst_trim4 = trimData22.REG.data1.pga0_offset4; + 3000a32: 18000737 lui a4,0x18000 + 3000a36: fc042783 lw a5,-64(s0) + 3000a3a: 83c1 srli a5,a5,0x10 + 3000a3c: 86be mv a3,a5 + 3000a3e: 6785 lui a5,0x1 + 3000a40: 17fd addi a5,a5,-1 # fff + 3000a42: 8ff5 and a5,a5,a3 + 3000a44: 01079613 slli a2,a5,0x10 + 3000a48: 8241 srli a2,a2,0x10 + 3000a4a: 6785 lui a5,0x1 + 3000a4c: 973e add a4,a4,a5 + 3000a4e: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a52: 6685 lui a3,0x1 + 3000a54: 16fd addi a3,a3,-1 # fff + 3000a56: 8ef1 and a3,a3,a2 + 3000a58: 767d lui a2,0xfffff + 3000a5a: 8ff1 and a5,a5,a2 + 3000a5c: 8fd5 or a5,a5,a3 + 3000a5e: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_gain_trim8 = trimData22.REG.data2.pga0_gain8; + 3000a62: 18000737 lui a4,0x18000 + 3000a66: fc442783 lw a5,-60(s0) + 3000a6a: 86be mv a3,a5 + 3000a6c: 6789 lui a5,0x2 + 3000a6e: 17fd addi a5,a5,-1 # 1fff + 3000a70: 8ff5 and a5,a5,a3 + 3000a72: 01079613 slli a2,a5,0x10 + 3000a76: 8241 srli a2,a2,0x10 + 3000a78: 6785 lui a5,0x1 + 3000a7a: 973e add a4,a4,a5 + 3000a7c: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000a80: 6689 lui a3,0x2 + 3000a82: 16fd addi a3,a3,-1 # 1fff + 3000a84: 8ef1 and a3,a3,a2 + 3000a86: 06c2 slli a3,a3,0x10 + 3000a88: e0010637 lui a2,0xe0010 + 3000a8c: 167d addi a2,a2,-1 # e000ffff + 3000a8e: 8ff1 and a5,a5,a2 + 3000a90: 8fd5 or a5,a5,a3 + 3000a92: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_ofst_trim8 = trimData22.REG.data2.pga0_offset8; + 3000a96: 18000737 lui a4,0x18000 + 3000a9a: fc442783 lw a5,-60(s0) + 3000a9e: 83c1 srli a5,a5,0x10 + 3000aa0: 86be mv a3,a5 + 3000aa2: 6785 lui a5,0x1 + 3000aa4: 17fd addi a5,a5,-1 # fff + 3000aa6: 8ff5 and a5,a5,a3 + 3000aa8: 01079613 slli a2,a5,0x10 + 3000aac: 8241 srli a2,a2,0x10 + 3000aae: 6785 lui a5,0x1 + 3000ab0: 973e add a4,a4,a5 + 3000ab2: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000ab6: 6685 lui a3,0x1 + 3000ab8: 16fd addi a3,a3,-1 # fff + 3000aba: 8ef1 and a3,a3,a2 + 3000abc: 767d lui a2,0xfffff + 3000abe: 8ff1 and a5,a5,a2 + 3000ac0: 8fd5 or a5,a5,a3 + 3000ac2: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_gain_trim16 = trimData22.REG.data3.pga0_gain16; + 3000ac6: 18000737 lui a4,0x18000 + 3000aca: fc842783 lw a5,-56(s0) + 3000ace: 86be mv a3,a5 + 3000ad0: 6789 lui a5,0x2 + 3000ad2: 17fd addi a5,a5,-1 # 1fff + 3000ad4: 8ff5 and a5,a5,a3 + 3000ad6: 01079613 slli a2,a5,0x10 + 3000ada: 8241 srli a2,a2,0x10 + 3000adc: 6785 lui a5,0x1 + 3000ade: 973e add a4,a4,a5 + 3000ae0: 82072783 lw a5,-2016(a4) # 17fff820 + 3000ae4: 6689 lui a3,0x2 + 3000ae6: 16fd addi a3,a3,-1 # 1fff + 3000ae8: 8ef1 and a3,a3,a2 + 3000aea: 06c2 slli a3,a3,0x10 + 3000aec: e0010637 lui a2,0xe0010 + 3000af0: 167d addi a2,a2,-1 # e000ffff + 3000af2: 8ff1 and a5,a5,a2 + 3000af4: 8fd5 or a5,a5,a3 + 3000af6: 82f72023 sw a5,-2016(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_ofst_trim16 = trimData22.REG.data3.pga0_offset16; + 3000afa: 18000737 lui a4,0x18000 + 3000afe: fc842783 lw a5,-56(s0) + 3000b02: 83c1 srli a5,a5,0x10 + 3000b04: 86be mv a3,a5 + 3000b06: 6785 lui a5,0x1 + 3000b08: 17fd addi a5,a5,-1 # fff + 3000b0a: 8ff5 and a5,a5,a3 + 3000b0c: 01079613 slli a2,a5,0x10 + 3000b10: 8241 srli a2,a2,0x10 + 3000b12: 6785 lui a5,0x1 + 3000b14: 973e add a4,a4,a5 + 3000b16: 82072783 lw a5,-2016(a4) # 17fff820 + 3000b1a: 6685 lui a3,0x1 + 3000b1c: 16fd addi a3,a3,-1 # fff + 3000b1e: 8ef1 and a3,a3,a2 + 3000b20: 767d lui a2,0xfffff + 3000b22: 8ff1 and a5,a5,a2 + 3000b24: 8fd5 or a5,a5,a3 + 3000b26: 82f72023 sw a5,-2016(a4) + + FOTP_INFO_RGN0_NUMBER_23 trimData23; + FOTP_InfoGet(FOTP_INFO_RNG0, 23U, (void *)&trimData23.comData); /* 23 is the number of trim data in otp */ + 3000b2a: fac40793 addi a5,s0,-84 + 3000b2e: 863e mv a2,a5 + 3000b30: 45dd li a1,23 + 3000b32: 4501 li a0,0 + 3000b34: 2b09 jal ra,3001046 + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_gain_trim2 = trimData23.REG.data0.pga1_gain2; + 3000b36: 18000737 lui a4,0x18000 + 3000b3a: fac42783 lw a5,-84(s0) + 3000b3e: 86be mv a3,a5 + 3000b40: 6789 lui a5,0x2 + 3000b42: 17fd addi a5,a5,-1 # 1fff + 3000b44: 8ff5 and a5,a5,a3 + 3000b46: 01079613 slli a2,a5,0x10 + 3000b4a: 8241 srli a2,a2,0x10 + 3000b4c: 6785 lui a5,0x1 + 3000b4e: 973e add a4,a4,a5 + 3000b50: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b54: 6689 lui a3,0x2 + 3000b56: 16fd addi a3,a3,-1 # 1fff + 3000b58: 8ef1 and a3,a3,a2 + 3000b5a: 06c2 slli a3,a3,0x10 + 3000b5c: e0010637 lui a2,0xe0010 + 3000b60: 167d addi a2,a2,-1 # e000ffff + 3000b62: 8ff1 and a5,a5,a2 + 3000b64: 8fd5 or a5,a5,a3 + 3000b66: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_ofst_trim2 = trimData23.REG.data0.pga1_offset2; + 3000b6a: 18000737 lui a4,0x18000 + 3000b6e: fac42783 lw a5,-84(s0) + 3000b72: 83c1 srli a5,a5,0x10 + 3000b74: 86be mv a3,a5 + 3000b76: 6785 lui a5,0x1 + 3000b78: 17fd addi a5,a5,-1 # fff + 3000b7a: 8ff5 and a5,a5,a3 + 3000b7c: 01079613 slli a2,a5,0x10 + 3000b80: 8241 srli a2,a2,0x10 + 3000b82: 6785 lui a5,0x1 + 3000b84: 973e add a4,a4,a5 + 3000b86: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b8a: 6685 lui a3,0x1 + 3000b8c: 16fd addi a3,a3,-1 # fff + 3000b8e: 8ef1 and a3,a3,a2 + 3000b90: 767d lui a2,0xfffff + 3000b92: 8ff1 and a5,a5,a2 + 3000b94: 8fd5 or a5,a5,a3 + 3000b96: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_gain_trim4 = trimData23.REG.data1.pga1_gain4; + 3000b9a: 18000737 lui a4,0x18000 + 3000b9e: fb042783 lw a5,-80(s0) + 3000ba2: 86be mv a3,a5 + 3000ba4: 6789 lui a5,0x2 + 3000ba6: 17fd addi a5,a5,-1 # 1fff + 3000ba8: 8ff5 and a5,a5,a3 + 3000baa: 01079613 slli a2,a5,0x10 + 3000bae: 8241 srli a2,a2,0x10 + 3000bb0: 6785 lui a5,0x1 + 3000bb2: 973e add a4,a4,a5 + 3000bb4: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bb8: 6689 lui a3,0x2 + 3000bba: 16fd addi a3,a3,-1 # 1fff + 3000bbc: 8ef1 and a3,a3,a2 + 3000bbe: 06c2 slli a3,a3,0x10 + 3000bc0: e0010637 lui a2,0xe0010 + 3000bc4: 167d addi a2,a2,-1 # e000ffff + 3000bc6: 8ff1 and a5,a5,a2 + 3000bc8: 8fd5 or a5,a5,a3 + 3000bca: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_ofst_trim4 = trimData23.REG.data1.pga1_offset4; + 3000bce: 18000737 lui a4,0x18000 + 3000bd2: fb042783 lw a5,-80(s0) + 3000bd6: 83c1 srli a5,a5,0x10 + 3000bd8: 86be mv a3,a5 + 3000bda: 6785 lui a5,0x1 + 3000bdc: 17fd addi a5,a5,-1 # fff + 3000bde: 8ff5 and a5,a5,a3 + 3000be0: 01079613 slli a2,a5,0x10 + 3000be4: 8241 srli a2,a2,0x10 + 3000be6: 6785 lui a5,0x1 + 3000be8: 973e add a4,a4,a5 + 3000bea: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bee: 6685 lui a3,0x1 + 3000bf0: 16fd addi a3,a3,-1 # fff + 3000bf2: 8ef1 and a3,a3,a2 + 3000bf4: 767d lui a2,0xfffff + 3000bf6: 8ff1 and a5,a5,a2 + 3000bf8: 8fd5 or a5,a5,a3 + 3000bfa: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_gain_trim8 = trimData23.REG.data2.pga1_gain8; + 3000bfe: 18000737 lui a4,0x18000 + 3000c02: fb442783 lw a5,-76(s0) + 3000c06: 86be mv a3,a5 + 3000c08: 6789 lui a5,0x2 + 3000c0a: 17fd addi a5,a5,-1 # 1fff + 3000c0c: 8ff5 and a5,a5,a3 + 3000c0e: 01079613 slli a2,a5,0x10 + 3000c12: 8241 srli a2,a2,0x10 + 3000c14: 6785 lui a5,0x1 + 3000c16: 973e add a4,a4,a5 + 3000c18: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c1c: 6689 lui a3,0x2 + 3000c1e: 16fd addi a3,a3,-1 # 1fff + 3000c20: 8ef1 and a3,a3,a2 + 3000c22: 06c2 slli a3,a3,0x10 + 3000c24: e0010637 lui a2,0xe0010 + 3000c28: 167d addi a2,a2,-1 # e000ffff + 3000c2a: 8ff1 and a5,a5,a2 + 3000c2c: 8fd5 or a5,a5,a3 + 3000c2e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_ofst_trim8 = trimData23.REG.data2.pga1_offset8; + 3000c32: 18000737 lui a4,0x18000 + 3000c36: fb442783 lw a5,-76(s0) + 3000c3a: 83c1 srli a5,a5,0x10 + 3000c3c: 86be mv a3,a5 + 3000c3e: 6785 lui a5,0x1 + 3000c40: 17fd addi a5,a5,-1 # fff + 3000c42: 8ff5 and a5,a5,a3 + 3000c44: 01079613 slli a2,a5,0x10 + 3000c48: 8241 srli a2,a2,0x10 + 3000c4a: 6785 lui a5,0x1 + 3000c4c: 973e add a4,a4,a5 + 3000c4e: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c52: 6685 lui a3,0x1 + 3000c54: 16fd addi a3,a3,-1 # fff + 3000c56: 8ef1 and a3,a3,a2 + 3000c58: 767d lui a2,0xfffff + 3000c5a: 8ff1 and a5,a5,a2 + 3000c5c: 8fd5 or a5,a5,a3 + 3000c5e: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_gain_trim16 = trimData23.REG.data3.pga1_gain16; + 3000c62: 18000737 lui a4,0x18000 + 3000c66: fb842783 lw a5,-72(s0) + 3000c6a: 86be mv a3,a5 + 3000c6c: 6789 lui a5,0x2 + 3000c6e: 17fd addi a5,a5,-1 # 1fff + 3000c70: 8ff5 and a5,a5,a3 + 3000c72: 01079613 slli a2,a5,0x10 + 3000c76: 8241 srli a2,a2,0x10 + 3000c78: 6785 lui a5,0x1 + 3000c7a: 973e add a4,a4,a5 + 3000c7c: 83072783 lw a5,-2000(a4) # 17fff830 + 3000c80: 6689 lui a3,0x2 + 3000c82: 16fd addi a3,a3,-1 # 1fff + 3000c84: 8ef1 and a3,a3,a2 + 3000c86: 06c2 slli a3,a3,0x10 + 3000c88: e0010637 lui a2,0xe0010 + 3000c8c: 167d addi a2,a2,-1 # e000ffff + 3000c8e: 8ff1 and a5,a5,a2 + 3000c90: 8fd5 or a5,a5,a3 + 3000c92: 82f72823 sw a5,-2000(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_ofst_trim16 = trimData23.REG.data3.pga1_offset16; + 3000c96: 18000737 lui a4,0x18000 + 3000c9a: fb842783 lw a5,-72(s0) + 3000c9e: 83c1 srli a5,a5,0x10 + 3000ca0: 86be mv a3,a5 + 3000ca2: 6785 lui a5,0x1 + 3000ca4: 17fd addi a5,a5,-1 # fff + 3000ca6: 8ff5 and a5,a5,a3 + 3000ca8: 01079613 slli a2,a5,0x10 + 3000cac: 8241 srli a2,a2,0x10 + 3000cae: 6785 lui a5,0x1 + 3000cb0: 973e add a4,a4,a5 + 3000cb2: 83072783 lw a5,-2000(a4) # 17fff830 + 3000cb6: 6685 lui a3,0x1 + 3000cb8: 16fd addi a3,a3,-1 # fff + 3000cba: 8ef1 and a3,a3,a2 + 3000cbc: 767d lui a2,0xfffff + 3000cbe: 8ff1 and a5,a5,a2 + 3000cc0: 8fd5 or a5,a5,a3 + 3000cc2: 82f72823 sw a5,-2000(a4) +} + 3000cc6: 0001 nop + 3000cc8: 40f6 lw ra,92(sp) + 3000cca: 4466 lw s0,88(sp) + 3000ccc: 6125 addi sp,sp,96 + 3000cce: 8082 ret + +03000cd0 : + 3000cd0: 3760006f j 3001046 + +03000cd4 : + * @brief Parameter calibration entry of the analog module. + * @param None + * @retval None + */ +void ANATRIM_Entry(void) +{ + 3000cd4: 1141 addi sp,sp,-16 + 3000cd6: c606 sw ra,12(sp) + 3000cd8: c422 sw s0,8(sp) + 3000cda: 0800 addi s0,sp,16 + if (CHIP_GetInfo() == false) { /* If the chip information is incorrect, calibration is not performed */ + 3000cdc: 3c79 jal ra,300077a + 3000cde: 87aa mv a5,a0 + 3000ce0: 0017c793 xori a5,a5,1 + 3000ce4: 9f81 uxtb a5 + 3000ce6: eb9d bnez a5,3000d1c + return; + } + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_ENABLE); /* Enable the clock for calibration */ + 3000ce8: 4585 li a1,1 + 3000cea: 18000537 lui a0,0x18000 + 3000cee: 2849 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_ENABLE); + 3000cf0: 4585 li a1,1 + 3000cf2: 18200537 lui a0,0x18200 + 3000cf6: 2069 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_ENABLE); + 3000cf8: 4585 li a1,1 + 3000cfa: 18201537 lui a0,0x18201 + 3000cfe: 2049 jal ra,3000d80 + CHIP_AnalogTrim(); + 3000d00: 34d1 jal ra,30007c4 + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_DISABLE); /* The clock is disabled after calibration */ + 3000d02: 4581 li a1,0 + 3000d04: 18000537 lui a0,0x18000 + 3000d08: 28a5 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_DISABLE); + 3000d0a: 4581 li a1,0 + 3000d0c: 18200537 lui a0,0x18200 + 3000d10: 2885 jal ra,3000d80 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_DISABLE); + 3000d12: 4581 li a1,0 + 3000d14: 18201537 lui a0,0x18201 + 3000d18: 20a5 jal ra,3000d80 + 3000d1a: a011 j 3000d1e + return; + 3000d1c: 0001 nop + 3000d1e: 40b2 lw ra,12(sp) + 3000d20: 4422 lw s0,8(sp) + 3000d22: 0141 addi sp,sp,16 + 3000d24: 8082 ret + +03000d26 : + * @brief Set Crg Core clock select + * @param None + * @retval None + */ +void ANAVREF_Init(void) +{ + 3000d26: 1141 addi sp,sp,-16 + 3000d28: c606 sw ra,12(sp) + 3000d2a: c422 sw s0,8(sp) + 3000d2c: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(VREF_BASE, IP_CLK_ENABLE); + 3000d2e: 4585 li a1,1 + 3000d30: 18100537 lui a0,0x18100 + 3000d34: 20b1 jal ra,3000d80 + VREF->VREF_CTRL1.BIT.da_ref_temp_trim_enh = 0x1; + 3000d36: 18100737 lui a4,0x18100 + 3000d3a: 531c lw a5,32(a4) + 3000d3c: 66c1 lui a3,0x10 + 3000d3e: 8fd5 or a5,a5,a3 + 3000d40: d31c sw a5,32(a4) + VREF->VREF_CTRL0.BIT.da_ref_enh = BASE_CFG_ENABLE; + 3000d42: 18100737 lui a4,0x18100 + 3000d46: 431c lw a5,0(a4) + 3000d48: 0017e793 ori a5,a5,1 + 3000d4c: c31c sw a5,0(a4) + BASE_FUNC_DELAY_US(200); /* delay 200us */ + 3000d4e: 000f47b7 lui a5,0xf4 + 3000d52: 24078593 addi a1,a5,576 # f4240 + 3000d56: 0c800513 li a0,200 + 3000d5a: 20b5 jal ra,3000dc6 + VREF->VREF_CTRL1.BIT.da_ref_chop_enh = BASE_CFG_ENABLE; + 3000d5c: 18100737 lui a4,0x18100 + 3000d60: 531c lw a5,32(a4) + 3000d62: 0017e793 ori a5,a5,1 + 3000d66: d31c sw a5,32(a4) + BASE_FUNC_DELAY_US(40); /* delay 40us */ + 3000d68: 000f47b7 lui a5,0xf4 + 3000d6c: 24078593 addi a1,a5,576 # f4240 + 3000d70: 02800513 li a0,40 + 3000d74: 2889 jal ra,3000dc6 + 3000d76: 0001 nop + 3000d78: 40b2 lw ra,12(sp) + 3000d7a: 4422 lw s0,8(sp) + 3000d7c: 0141 addi sp,sp,16 + 3000d7e: 8082 ret + +03000d80 : + 3000d80: 57a0206f j 30032fa + +03000d84 : + * @brief Set Crg Core clock select + * @param coreClkSelect Input core clock select value + * @retval None + */ +void CRG_SetCoreClockSelect(CRG_CoreClkSelect coreClkSelect) +{ + 3000d84: 715d addi sp,sp,-80 + 3000d86: c686 sw ra,76(sp) + 3000d88: c4a2 sw s0,72(sp) + 3000d8a: 0880 addi s0,sp,80 + 3000d8c: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3000d90: 100007b7 lui a5,0x10000 + 3000d94: fcf42423 sw a5,-56(s0) + crg.coreClkSelect = coreClkSelect; + 3000d98: fbc42783 lw a5,-68(s0) + 3000d9c: fef42023 sw a5,-32(s0) + if (crg.coreClkSelect == CRG_CORE_CLK_SELECT_TCXO) { /* If an external crystal oscillator is selected. */ + 3000da0: fe042703 lw a4,-32(s0) + 3000da4: 4785 li a5,1 + 3000da6: 00f71663 bne a4,a5,3000db2 + BASE_FUNC_DELAY_MS(10); /* 10: delay 10ms, wait clokc stable. */ + 3000daa: 3e800593 li a1,1000 + 3000dae: 4529 li a0,10 + 3000db0: 2819 jal ra,3000dc6 + } + HAL_CRG_SetCoreClockSelect(&crg); + 3000db2: fc840793 addi a5,s0,-56 + 3000db6: 853e mv a0,a5 + 3000db8: 23a020ef jal ra,3002ff2 + 3000dbc: 0001 nop + 3000dbe: 40b6 lw ra,76(sp) + 3000dc0: 4426 lw s0,72(sp) + 3000dc2: 6161 addi sp,sp,80 + 3000dc4: 8082 ret + +03000dc6 : + 3000dc6: 1de0106f j 3001fa4 + +03000dca : + * @param frequence frequnce + * @param div Output Divison + * @retval None + */ +static void SetFlashDiv(unsigned int frequency, unsigned int *nreadDiv) +{ + 3000dca: 7179 addi sp,sp,-48 + 3000dcc: d622 sw s0,44(sp) + 3000dce: 1800 addi s0,sp,48 + 3000dd0: fca42e23 sw a0,-36(s0) + 3000dd4: fcb42c23 sw a1,-40(s0) + unsigned int div; + unsigned int freq = frequency; + 3000dd8: fdc42783 lw a5,-36(s0) + 3000ddc: fef42423 sw a5,-24(s0) + /* Get frequency divider of flash. */ + if (freq < FLASH_BASE_FREQ) { + 3000de0: fe842703 lw a4,-24(s0) + 3000de4: 023c37b7 lui a5,0x23c3 + 3000de8: 45f78793 addi a5,a5,1119 # 23c345f + 3000dec: 00e7e863 bltu a5,a4,3000dfc + freq = FLASH_BASE_FREQ; + 3000df0: 023c37b7 lui a5,0x23c3 + 3000df4: 46078793 addi a5,a5,1120 # 23c3460 + 3000df8: fef42423 sw a5,-24(s0) + } + /* Get the flash frequency division based on the frequency. */ + if ((freq % FLASH_BASE_FREQ) == 0) { + 3000dfc: fe842703 lw a4,-24(s0) + 3000e00: 023c37b7 lui a5,0x23c3 + 3000e04: 46078793 addi a5,a5,1120 # 23c3460 + 3000e08: 02f777b3 remu a5,a4,a5 + 3000e0c: ef81 bnez a5,3000e24 + div = freq / FLASH_BASE_FREQ; + 3000e0e: fe842703 lw a4,-24(s0) + 3000e12: 023c37b7 lui a5,0x23c3 + 3000e16: 46078793 addi a5,a5,1120 # 23c3460 + 3000e1a: 02f757b3 divu a5,a4,a5 + 3000e1e: fef42623 sw a5,-20(s0) + 3000e22: a821 j 3000e3a + } else { + div = (freq / FLASH_BASE_FREQ) + 1; + 3000e24: fe842703 lw a4,-24(s0) + 3000e28: 023c37b7 lui a5,0x23c3 + 3000e2c: 46078793 addi a5,a5,1120 # 23c3460 + 3000e30: 02f757b3 divu a5,a4,a5 + 3000e34: 0785 addi a5,a5,1 + 3000e36: fef42623 sw a5,-20(s0) + } + /* Ensure the flash frequency division is valid. */ + if (div > FLASH_MAX_DIV) { + 3000e3a: fec42703 lw a4,-20(s0) + 3000e3e: 4791 li a5,4 + 3000e40: 00e7f563 bgeu a5,a4,3000e4a + div = FLASH_MAX_DIV; + 3000e44: 4791 li a5,4 + 3000e46: fef42623 sw a5,-20(s0) + } + *nreadDiv = div; + 3000e4a: fd842783 lw a5,-40(s0) + 3000e4e: fec42703 lw a4,-20(s0) + 3000e52: c398 sw a4,0(a5) +} + 3000e54: 0001 nop + 3000e56: 5432 lw s0,44(sp) + 3000e58: 6145 addi sp,sp,48 + 3000e5a: 8082 ret + +03000e5c : + * @brief Get the Rounding up value + * @param coreClkSelect Core Clock select + * @retval Frequency of Flash + */ +static unsigned int GetFlashFreq(CRG_CoreClkSelect coreClkSelect) +{ + 3000e5c: 7179 addi sp,sp,-48 + 3000e5e: d606 sw ra,44(sp) + 3000e60: d422 sw s0,40(sp) + 3000e62: 1800 addi s0,sp,48 + 3000e64: fca42e23 sw a0,-36(s0) + unsigned int hclk; + /* Get frequency of flash. */ + switch (coreClkSelect) { + 3000e68: fdc42783 lw a5,-36(s0) + 3000e6c: 4705 li a4,1 + 3000e6e: 02e78063 beq a5,a4,3000e8e + 3000e72: 4705 li a4,1 + 3000e74: 00e7e663 bltu a5,a4,3000e80 + 3000e78: 4709 li a4,2 + 3000e7a: 02e78163 beq a5,a4,3000e9c + 3000e7e: a025 j 3000ea6 + case CRG_CORE_CLK_SELECT_HOSC: + hclk = HOSC_FREQ; + 3000e80: 017d87b7 lui a5,0x17d8 + 3000e84: 84078793 addi a5,a5,-1984 # 17d7840 + 3000e88: fef42623 sw a5,-20(s0) + break; + 3000e8c: a01d j 3000eb2 + case CRG_CORE_CLK_SELECT_TCXO: + hclk = XTRAIL_FREQ; + 3000e8e: 01c9c7b7 lui a5,0x1c9c + 3000e92: 38078793 addi a5,a5,896 # 1c9c380 + 3000e96: fef42623 sw a5,-20(s0) + break; + 3000e9a: a821 j 3000eb2 + case CRG_CORE_CLK_SELECT_PLL: + hclk = HAL_CRG_GetPllFreq(); + 3000e9c: 278020ef jal ra,3003114 + 3000ea0: fea42623 sw a0,-20(s0) + break; + 3000ea4: a039 j 3000eb2 + default: + hclk = LOSC_FREQ; + 3000ea6: 67a1 lui a5,0x8 + 3000ea8: d0078793 addi a5,a5,-768 # 7d00 + 3000eac: fef42623 sw a5,-20(s0) + break; + 3000eb0: 0001 nop + } + return hclk; + 3000eb2: fec42783 lw a5,-20(s0) +} + 3000eb6: 853e mv a0,a5 + 3000eb8: 50b2 lw ra,44(sp) + 3000eba: 5422 lw s0,40(sp) + 3000ebc: 6145 addi sp,sp,48 + 3000ebe: 8082 ret + +03000ec0 : + * @brief Set flash clock frequence base on hclk + * @param coreClkSelect core clock select + * @retval None + */ +void FLASH_ClockConfig(CRG_CoreClkSelect coreClkSelect) +{ + 3000ec0: 7179 addi sp,sp,-48 + 3000ec2: d606 sw ra,44(sp) + 3000ec4: d422 sw s0,40(sp) + 3000ec6: 1800 addi s0,sp,48 + 3000ec8: fca42e23 sw a0,-36(s0) + EFC_RegStruct *efc = EFC; + 3000ecc: 147107b7 lui a5,0x14710 + 3000ed0: fef42623 sw a5,-20(s0) + EFLASH_CLK_CFG_REG cfg; + unsigned int hclk; + unsigned int nreadDiv; + + /* Step 1: Set nread_div */ + hclk = GetFlashFreq(coreClkSelect); + 3000ed4: fdc42503 lw a0,-36(s0) + 3000ed8: 3751 jal ra,3000e5c + 3000eda: fea42423 sw a0,-24(s0) + cfg.reg = efc->EFLASH_CLK_CFG.reg; + 3000ede: fec42703 lw a4,-20(s0) + 3000ee2: 6785 lui a5,0x1 + 3000ee4: 97ba add a5,a5,a4 + 3000ee6: 9407a783 lw a5,-1728(a5) # 940 + 3000eea: fef42223 sw a5,-28(s0) + SetFlashDiv(hclk, &nreadDiv); + 3000eee: fe040793 addi a5,s0,-32 + 3000ef2: 85be mv a1,a5 + 3000ef4: fe842503 lw a0,-24(s0) + 3000ef8: 3dc9 jal ra,3000dca + cfg.BIT.nread_div = nreadDiv; + 3000efa: fe042783 lw a5,-32(s0) + 3000efe: 8bbd andi a5,a5,15 + 3000f00: 0ff7f713 andi a4,a5,255 + 3000f04: fe442783 lw a5,-28(s0) + 3000f08: 8b3d andi a4,a4,15 + 3000f0a: 0712 slli a4,a4,0x4 + 3000f0c: f0f7f793 andi a5,a5,-241 + 3000f10: 8fd9 or a5,a5,a4 + 3000f12: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f16: fe442783 lw a5,-28(s0) + 3000f1a: 00100737 lui a4,0x100 + 3000f1e: 8fd9 or a5,a5,a4 + 3000f20: fef42223 sw a5,-28(s0) + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f24: fe442783 lw a5,-28(s0) + 3000f28: 00400737 lui a4,0x400 + 3000f2c: 8fd9 or a5,a5,a4 + 3000f2e: fef42223 sw a5,-28(s0) + + /* Step 2: Wait Busclk_sw_req */ + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f32: fe442783 lw a5,-28(s0) + 3000f36: 00400737 lui a4,0x400 + 3000f3a: 8fd9 or a5,a5,a4 + 3000f3c: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f40: fe442783 lw a5,-28(s0) + 3000f44: 00100737 lui a4,0x100 + 3000f48: 8fd9 or a5,a5,a4 + 3000f4a: fef42223 sw a5,-28(s0) + efc->EFLASH_CLK_CFG.reg = cfg.reg; + 3000f4e: fe442703 lw a4,-28(s0) + 3000f52: fec42683 lw a3,-20(s0) + 3000f56: 6785 lui a5,0x1 + 3000f58: 97b6 add a5,a5,a3 + 3000f5a: 94e7a023 sw a4,-1728(a5) # 940 + while (efc->EFLASH_CLK_CFG.BIT.busclk_sw_req == BASE_CFG_SET) { + 3000f5e: 0001 nop + 3000f60: fec42703 lw a4,-20(s0) + 3000f64: 6785 lui a5,0x1 + 3000f66: 97ba add a5,a5,a4 + 3000f68: 9407a783 lw a5,-1728(a5) # 940 + 3000f6c: 83d1 srli a5,a5,0x14 + 3000f6e: 8b85 andi a5,a5,1 + 3000f70: 0ff7f713 andi a4,a5,255 + 3000f74: 4785 li a5,1 + 3000f76: fef705e3 beq a4,a5,3000f60 + ; + } + 3000f7a: 0001 nop + 3000f7c: 50b2 lw ra,44(sp) + 3000f7e: 5422 lw s0,40(sp) + 3000f80: 6145 addi sp,sp,48 + 3000f82: 8082 ret + +03000f84 : + * @brief Init the systick + * @param None + * @retval None + */ +void SYSTICK_Init(void) +{ + 3000f84: 1141 addi sp,sp,-16 + 3000f86: c622 sw s0,12(sp) + 3000f88: 0800 addi s0,sp,16 + SYSTICK->TIMER_CTRL.reg = 0; + 3000f8a: 143807b7 lui a5,0x14380 + 3000f8e: 0007a023 sw zero,0(a5) # 14380000 + SYSTICK->TIMER_CTRL.BIT.enable = 1; + 3000f92: 14380737 lui a4,0x14380 + 3000f96: 431c lw a5,0(a4) + 3000f98: 0017e793 ori a5,a5,1 + 3000f9c: c31c sw a5,0(a4) +} + 3000f9e: 0001 nop + 3000fa0: 4432 lw s0,12(sp) + 3000fa2: 0141 addi sp,sp,16 + 3000fa4: 8082 ret + +03000fa6 : + * @brief Get the Systick frep(Hz) + * @param None + * @retval Clock frep of systick(Hz) + */ +unsigned int SYSTICK_GetCRGHZ(void) +{ + 3000fa6: 1141 addi sp,sp,-16 + 3000fa8: c606 sw ra,12(sp) + 3000faa: c422 sw s0,8(sp) + 3000fac: 0800 addi s0,sp,16 + /* Get the Systick IP */ + return HAL_CRG_GetIpFreq(SYSTICK_BASE); + 3000fae: 14380537 lui a0,0x14380 + 3000fb2: 264020ef jal ra,3003216 + 3000fb6: 87aa mv a5,a0 + 3000fb8: 853e mv a0,a5 + 3000fba: 40b2 lw ra,12(sp) + 3000fbc: 4422 lw s0,8(sp) + 3000fbe: 0141 addi sp,sp,16 + 3000fc0: 8082 ret + +03000fc2 : + * @param efc Flash control register base address + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +static unsigned int FOTP_CheckReadStatus(EFC_RegStruct *efc) +{ + 3000fc2: 1101 addi sp,sp,-32 + 3000fc4: ce22 sw s0,28(sp) + 3000fc6: 1000 addi s0,sp,32 + 3000fc8: fea42623 sw a0,-20(s0) + /* Check for errors in the flash reading process. */ + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fcc: fec42783 lw a5,-20(s0) + 3000fd0: 1007a783 lw a5,256(a5) + 3000fd4: 83c1 srli a5,a5,0x10 + 3000fd6: 8b85 andi a5,a5,1 + 3000fd8: 9f81 uxtb a5 + 3000fda: e38d bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000fdc: fec42783 lw a5,-20(s0) + 3000fe0: 1007a783 lw a5,256(a5) + 3000fe4: 83cd srli a5,a5,0x13 + 3000fe6: 8b85 andi a5,a5,1 + 3000fe8: 9f81 uxtb a5 + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fea: eb89 bnez a5,3000ffc + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_chk) { + 3000fec: fec42783 lw a5,-20(s0) + 3000ff0: 1007a783 lw a5,256(a5) + 3000ff4: 83d1 srli a5,a5,0x14 + 3000ff6: 8b85 andi a5,a5,1 + 3000ff8: 9f81 uxtb a5 + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000ffa: c3a9 beqz a5,300103c + efc->INT_CLEAR.BIT.int_clr_err_ecc_corr = BASE_CFG_SET; + 3000ffc: fec42703 lw a4,-20(s0) + 3001000: 10c72783 lw a5,268(a4) # 1438010c + 3001004: 000806b7 lui a3,0x80 + 3001008: 8fd5 or a5,a5,a3 + 300100a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_illegal = BASE_CFG_SET; + 300100e: fec42703 lw a4,-20(s0) + 3001012: 10c72783 lw a5,268(a4) + 3001016: 66c1 lui a3,0x10 + 3001018: 8fd5 or a5,a5,a3 + 300101a: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_ecc_chk = BASE_CFG_SET; + 300101e: fec42703 lw a4,-20(s0) + 3001022: 10c72783 lw a5,268(a4) + 3001026: 001006b7 lui a3,0x100 + 300102a: 8fd5 or a5,a5,a3 + 300102c: 10f72623 sw a5,268(a4) + efc->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001030: fec42783 lw a5,-20(s0) + 3001034: 2007a023 sw zero,512(a5) + return BASE_STATUS_ERROR; + 3001038: 4785 li a5,1 + 300103a: a011 j 300103e + } + return BASE_STATUS_OK; + 300103c: 4781 li a5,0 +} + 300103e: 853e mv a0,a5 + 3001040: 4472 lw s0,28(sp) + 3001042: 6105 addi sp,sp,32 + 3001044: 8082 ret + +03001046 : + * @param buf Buffer of read data + * @retval BASE_STATUS_ERROR fail. + * @retval BASE_STATUS_OK success. + */ +unsigned int FOTP_InfoGet(FOTP_InfoRngType type, unsigned int index, FOTP_CommonData *buf) +{ + 3001046: 7179 addi sp,sp,-48 + 3001048: d606 sw ra,44(sp) + 300104a: d422 sw s0,40(sp) + 300104c: 1800 addi s0,sp,48 + 300104e: fca42e23 sw a0,-36(s0) + 3001052: fcb42c23 sw a1,-40(s0) + 3001056: fcc42a23 sw a2,-44(s0) + EFC_RegStruct *p = EFC; + 300105a: 147107b7 lui a5,0x14710 + 300105e: fef42423 sw a5,-24(s0) + unsigned int addr; + + if (buf == NULL) { + 3001062: fd442783 lw a5,-44(s0) + 3001066: e399 bnez a5,300106c + return BASE_STATUS_ERROR; + 3001068: 4785 li a5,1 + 300106a: aa15 j 300119e + } + + if ((type >= FOTP_INFO_MAXTYPE) || (index > FOTP_INFO_REG_MAX_ID)) { + 300106c: fdc42703 lw a4,-36(s0) + 3001070: 4785 li a5,1 + 3001072: 00e7e763 bltu a5,a4,3001080 + 3001076: fd842703 lw a4,-40(s0) + 300107a: 47e5 li a5,25 + 300107c: 00e7f463 bgeu a5,a4,3001084 + return BASE_STATUS_ERROR; + 3001080: 4785 li a5,1 + 3001082: aa31 j 300119e + } + + /* If there is a read command, return */ + if (p->EFLASH_CMD.BIT.cmd_start) { + 3001084: fe842783 lw a5,-24(s0) + 3001088: 439c lw a5,0(a5) + 300108a: 8b85 andi a5,a5,1 + 300108c: 9f81 uxtb a5 + 300108e: c399 beqz a5,3001094 + return BASE_STATUS_ERROR; + 3001090: 4785 li a5,1 + 3001092: a231 j 300119e + } + + p->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; + 3001094: fe842783 lw a5,-24(s0) + 3001098: fedcc737 lui a4,0xfedcc + 300109c: a9870713 addi a4,a4,-1384 # fedcba98 + 30010a0: 20e7a023 sw a4,512(a5) # 14710200 + + /* Configure the read command parameters and start the read command */ + addr = (type == FOTP_INFO_RNG0) ? FOTP_INFO_RNG0_BASEADDR : FOTP_INFO_RNG1_BASEADDR; + 30010a4: fdc42783 lw a5,-36(s0) + 30010a8: e781 bnez a5,30010b0 + 30010aa: 008007b7 lui a5,0x800 + 30010ae: a019 j 30010b4 + 30010b0: 008017b7 lui a5,0x801 + 30010b4: fef42223 sw a5,-28(s0) + addr += index * REG_WORDS_NUM; + 30010b8: fd842783 lw a5,-40(s0) + 30010bc: 0792 slli a5,a5,0x4 + 30010be: fe442703 lw a4,-28(s0) + 30010c2: 97ba add a5,a5,a4 + 30010c4: fef42223 sw a5,-28(s0) + p->EFLASH_ADDR.BIT.cmd_addr = addr >> 2; /* Right shift 2 bit change to word */ + 30010c8: fe442783 lw a5,-28(s0) + 30010cc: 0027d713 srli a4,a5,0x2 + 30010d0: 004007b7 lui a5,0x400 + 30010d4: 17fd addi a5,a5,-1 # 3fffff + 30010d6: 00f77633 and a2,a4,a5 + 30010da: fe842703 lw a4,-24(s0) + 30010de: 435c lw a5,4(a4) + 30010e0: 004006b7 lui a3,0x400 + 30010e4: 16fd addi a3,a3,-1 # 3fffff + 30010e6: 8ef1 and a3,a3,a2 + 30010e8: 068a slli a3,a3,0x2 + 30010ea: ff000637 lui a2,0xff000 + 30010ee: 060d addi a2,a2,3 # ff000003 + 30010f0: 8ff1 and a5,a5,a2 + 30010f2: 8fd5 or a5,a5,a3 + 30010f4: c35c sw a5,4(a4) + p->EFLASH_CMD.BIT.cmd_code = FLASH_OPERATION_READ; + 30010f6: fe842703 lw a4,-24(s0) + 30010fa: 431c lw a5,0(a4) + 30010fc: 8ff7f793 andi a5,a5,-1793 + 3001100: 1007e793 ori a5,a5,256 + 3001104: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_read_size = FLASH_READ_128BIT; + 3001106: fe842703 lw a4,-24(s0) + 300110a: 431c lw a5,0(a4) + 300110c: d00006b7 lui a3,0xd0000 + 3001110: 16fd addi a3,a3,-1 # cfffffff + 3001112: 8efd and a3,a3,a5 + 3001114: 100007b7 lui a5,0x10000 + 3001118: 8fd5 or a5,a5,a3 + 300111a: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_start = BASE_CFG_SET; + 300111c: fe842703 lw a4,-24(s0) + 3001120: 431c lw a5,0(a4) + 3001122: 0017e793 ori a5,a5,1 + 3001126: c31c sw a5,0(a4) + + while (p->EFLASH_CMD.BIT.cmd_start) { + 3001128: 0001 nop + 300112a: fe842783 lw a5,-24(s0) + 300112e: 439c lw a5,0(a5) + 3001130: 8b85 andi a5,a5,1 + 3001132: 9f81 uxtb a5 + 3001134: fbfd bnez a5,300112a + ; + } + while (p->EFLASH_CMD.BIT.exec_state) { + 3001136: 0001 nop + 3001138: fe842783 lw a5,-24(s0) + 300113c: 439c lw a5,0(a5) + 300113e: 8399 srli a5,a5,0x6 + 3001140: 8b8d andi a5,a5,3 + 3001142: 9f81 uxtb a5 + 3001144: fbf5 bnez a5,3001138 + ; + } + /* read error, clear interrupt and return */ + if (FOTP_CheckReadStatus(p) != BASE_STATUS_OK) { + 3001146: fe842503 lw a0,-24(s0) + 300114a: 3da5 jal ra,3000fc2 + 300114c: 87aa mv a5,a0 + 300114e: c399 beqz a5,3001154 + return BASE_STATUS_ERROR; + 3001150: 4785 li a5,1 + 3001152: a0b1 j 300119e + } + /* Read data from FIFO to buffer */ + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001154: fe042623 sw zero,-20(s0) + 3001158: a00d j 300117a + buf->data[i] = p->FLASH_RDATA; + 300115a: fe842783 lw a5,-24(s0) + 300115e: 6007a703 lw a4,1536(a5) # 10000600 + 3001162: fd442683 lw a3,-44(s0) + 3001166: fec42783 lw a5,-20(s0) + 300116a: 078a slli a5,a5,0x2 + 300116c: 97b6 add a5,a5,a3 + 300116e: c398 sw a4,0(a5) + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001170: fec42783 lw a5,-20(s0) + 3001174: 0785 addi a5,a5,1 + 3001176: fef42623 sw a5,-20(s0) + 300117a: fec42703 lw a4,-20(s0) + 300117e: 478d li a5,3 + 3001180: fce7fde3 bgeu a5,a4,300115a + } + p->INT_CLEAR.BIT.int_clr_finish = BASE_CFG_SET; + 3001184: fe842703 lw a4,-24(s0) + 3001188: 10c72783 lw a5,268(a4) + 300118c: 0107e793 ori a5,a5,16 + 3001190: 10f72623 sw a5,268(a4) + p->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001194: fe842783 lw a5,-24(s0) + 3001198: 2007a023 sw zero,512(a5) + return BASE_STATUS_OK; + 300119c: 4781 li a5,0 + 300119e: 853e mv a0,a5 + 30011a0: 50b2 lw ra,44(sp) + 30011a2: 5422 lw s0,40(sp) + 30011a4: 6145 addi sp,sp,48 + 30011a6: 8082 ret + +030011a8 : + * @param baseAddr The ip base address + * @retval The Address(offset) in g_crgIpMatch if match success + * @retval 0 if match fail + */ +CHIP_CrgIpMatchInfo *GetCrgIpMatchInfo(const void *baseAddr) +{ + 30011a8: 7179 addi sp,sp,-48 + 30011aa: d622 sw s0,44(sp) + 30011ac: 1800 addi s0,sp,48 + 30011ae: fca42e23 sw a0,-36(s0) + unsigned int i; + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011b2: fe042623 sw zero,-20(s0) + 30011b6: a081 j 30011f6 + if (baseAddr == g_crgIpMatch[i].ipBaseAddr) { + 30011b8: 030067b7 lui a5,0x3006 + 30011bc: 20078713 addi a4,a5,512 # 3006200 + 30011c0: fec42683 lw a3,-20(s0) + 30011c4: 47b1 li a5,12 + 30011c6: 02f687b3 mul a5,a3,a5 + 30011ca: 97ba add a5,a5,a4 + 30011cc: 439c lw a5,0(a5) + 30011ce: fdc42703 lw a4,-36(s0) + 30011d2: 00f71d63 bne a4,a5,30011ec + return (CHIP_CrgIpMatchInfo *)&g_crgIpMatch[i]; + 30011d6: fec42703 lw a4,-20(s0) + 30011da: 47b1 li a5,12 + 30011dc: 02f70733 mul a4,a4,a5 + 30011e0: 030067b7 lui a5,0x3006 + 30011e4: 20078793 addi a5,a5,512 # 3006200 + 30011e8: 97ba add a5,a5,a4 + 30011ea: a829 j 3001204 + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011ec: fec42783 lw a5,-20(s0) + 30011f0: 0785 addi a5,a5,1 + 30011f2: fef42623 sw a5,-20(s0) + 30011f6: fec42703 lw a4,-20(s0) + 30011fa: 02d00793 li a5,45 + 30011fe: fae7fde3 bgeu a5,a4,30011b8 + } + } + return (CHIP_CrgIpMatchInfo *)0; /* The base address does not match, return 0. */ + 3001202: 4781 li a5,0 +} + 3001204: 853e mv a0,a5 + 3001206: 5432 lw s0,44(sp) + 3001208: 6145 addi sp,sp,48 + 300120a: 8082 ret + +0300120c : + * @brief Check ADC sample input. + * @param input Number of input. + * @retval bool + */ +static inline bool IsADCSampleChannel(ADC_Input input) +{ + 300120c: 1101 addi sp,sp,-32 + 300120e: ce22 sw s0,28(sp) + 3001210: 1000 addi s0,sp,32 + 3001212: fea42623 sw a0,-20(s0) + return (input >= ADC_CH_ADCINA0) && (input <= ADC_CH_ADCINA19); + 3001216: fec42783 lw a5,-20(s0) + 300121a: 0147b793 sltiu a5,a5,20 + 300121e: 9f81 uxtb a5 +} + 3001220: 853e mv a0,a5 + 3001222: 4472 lw s0,28(sp) + 3001224: 6105 addi sp,sp,32 + 3001226: 8082 ret + +03001228 : + * are configured through the SOC. + * @param soc Number of SOC. + * @retval bool + */ +static inline bool IsADCSOCx(ADC_SOCNumber soc) +{ + 3001228: 1101 addi sp,sp,-32 + 300122a: ce22 sw s0,28(sp) + 300122c: 1000 addi s0,sp,32 + 300122e: fea42623 sw a0,-20(s0) + return (soc >= ADC_SOC_NUM0) && (soc <= ADC_SOC_NUM15); + 3001232: fec42783 lw a5,-20(s0) + 3001236: 0107b793 sltiu a5,a5,16 + 300123a: 9f81 uxtb a5 +} + 300123c: 853e mv a0,a5 + 300123e: 4472 lw s0,28(sp) + 3001240: 6105 addi sp,sp,32 + 3001242: 8082 ret + +03001244 : + * @brief Check ADC interrupt parameter. + * @param intx Number of interrupt. + * @retval bool + */ +static inline bool IsADCIntx(ADC_IntNumber intx) +{ + 3001244: 1101 addi sp,sp,-32 + 3001246: ce22 sw s0,28(sp) + 3001248: 1000 addi s0,sp,32 + 300124a: fea42623 sw a0,-20(s0) + return (intx >= ADC_INT_NUMBER0) && (intx <= ADC_INT_NUMBER3); + 300124e: fec42783 lw a5,-20(s0) + 3001252: 0047b793 sltiu a5,a5,4 + 3001256: 9f81 uxtb a5 +} + 3001258: 853e mv a0,a5 + 300125a: 4472 lw s0,28(sp) + 300125c: 6105 addi sp,sp,32 + 300125e: 8082 ret + +03001260 : + * @brief Check SOC trigger source. + * @param trig Type of trigger source. + * @retval bool + */ +static inline bool IsADCTrigSource(ADC_TrigSource trig) +{ + 3001260: 1101 addi sp,sp,-32 + 3001262: ce22 sw s0,28(sp) + 3001264: 1000 addi s0,sp,32 + 3001266: fea42623 sw a0,-20(s0) + return (trig >= ADC_TRIGSOC_SOFT) && (trig <= ADC_TRIGSOC_GPIOPF1); + 300126a: fec42783 lw a5,-20(s0) + 300126e: 0157b793 sltiu a5,a5,21 + 3001272: 9f81 uxtb a5 +} + 3001274: 853e mv a0,a5 + 3001276: 4472 lw s0,28(sp) + 3001278: 6105 addi sp,sp,32 + 300127a: 8082 ret + +0300127c : + * @brief Check mode of completion of SOC sample + * @param mode Type of completion. + * @retval bool + */ +static inline bool IsADCFinishMode(ADC_SOCFinishMode mode) +{ + 300127c: 1101 addi sp,sp,-32 + 300127e: ce22 sw s0,28(sp) + 3001280: 1000 addi s0,sp,32 + 3001282: fea42623 sw a0,-20(s0) + return (mode >= ADC_SOCFINISH_NONE) && (mode <= ADC_SOCFINISH_INT3); + 3001286: fec42783 lw a5,-20(s0) + 300128a: cb81 beqz a5,300129a + 300128c: fec42703 lw a4,-20(s0) + 3001290: 4799 li a5,6 + 3001292: 00e7e463 bltu a5,a4,300129a + 3001296: 4785 li a5,1 + 3001298: a011 j 300129c + 300129a: 4781 li a5,0 + 300129c: 8b85 andi a5,a5,1 + 300129e: 9f81 uxtb a5 +} + 30012a0: 853e mv a0,a5 + 30012a2: 4472 lw s0,28(sp) + 30012a4: 6105 addi sp,sp,32 + 30012a6: 8082 ret + +030012a8 : + * @brief Check ADC sample priority parameter. + * @param mode Priority mode of SOC. + * @retval bool + */ +static inline bool IsADCPriorityMode(ADC_PriorityMode mode) +{ + 30012a8: 1101 addi sp,sp,-32 + 30012aa: ce22 sw s0,28(sp) + 30012ac: 1000 addi s0,sp,32 + 30012ae: fea42623 sw a0,-20(s0) + return (mode >= ADC_PRIMODE_ALL_ROUND) && (mode <= ADC_PRIMODE_ALL_PRIORITY); + 30012b2: fec42703 lw a4,-20(s0) + 30012b6: 67c1 lui a5,0x10 + 30012b8: 00f737b3 sltu a5,a4,a5 + 30012bc: 9f81 uxtb a5 +} + 30012be: 853e mv a0,a5 + 30012c0: 4472 lw s0,28(sp) + 30012c2: 6105 addi sp,sp,32 + 30012c4: 8082 ret + +030012c6 : + * @brief Check time of total ADC sampling time. + * @param acqps Time of total ADC sampling time. + * @retval bool + */ +static inline bool IsADCTotalTime(unsigned int acqps) +{ + 30012c6: 1101 addi sp,sp,-32 + 30012c8: ce22 sw s0,28(sp) + 30012ca: 1000 addi s0,sp,32 + 30012cc: fea42623 sw a0,-20(s0) + return (acqps <= ADC_SOCSAMPLE_500CLK); + 30012d0: fec42783 lw a5,-20(s0) + 30012d4: 0107b793 sltiu a5,a5,16 + 30012d8: 9f81 uxtb a5 +} + 30012da: 853e mv a0,a5 + 30012dc: 4472 lw s0,28(sp) + 30012de: 6105 addi sp,sp,32 + 30012e0: 8082 ret + +030012e2 : + * @brief Enable AVDD/3 Channal. + * @param adcx ADC register base address. + * @retval None. + */ +static inline void DCL_ADC_EnableAvddChannel(ADC_RegStruct * const adcx) +{ + 30012e2: 1101 addi sp,sp,-32 + 30012e4: ce06 sw ra,28(sp) + 30012e6: cc22 sw s0,24(sp) + 30012e8: 1000 addi s0,sp,32 + 30012ea: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30012ee: fec42703 lw a4,-20(s0) + 30012f2: 180007b7 lui a5,0x18000 + 30012f6: 00f70b63 beq a4,a5,300130c + 30012fa: 6785 lui a5,0x1 + 30012fc: 86278593 addi a1,a5,-1950 # 862 + 3001300: 030067b7 lui a5,0x3006 + 3001304: 42878513 addi a0,a5,1064 # 3006428 + 3001308: 2b0d jal ra,300183a + 300130a: a001 j 300130a + adcx->ADC_AVDD_EN.BIT.cfg_avdd_en = true; + 300130c: fec42703 lw a4,-20(s0) + 3001310: 65872783 lw a5,1624(a4) + 3001314: 0017e793 ori a5,a5,1 + 3001318: 64f72c23 sw a5,1624(a4) +} + 300131c: 0001 nop + 300131e: 40f2 lw ra,28(sp) + 3001320: 4462 lw s0,24(sp) + 3001322: 6105 addi sp,sp,32 + 3001324: 8082 ret + +03001326 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt0(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001326: 7179 addi sp,sp,-48 + 3001328: d606 sw ra,44(sp) + 300132a: d422 sw s0,40(sp) + 300132c: 1800 addi s0,sp,48 + 300132e: fca42e23 sw a0,-36(s0) + 3001332: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001336: fdc42703 lw a4,-36(s0) + 300133a: 180007b7 lui a5,0x18000 + 300133e: 00f70b63 beq a4,a5,3001354 + 3001342: 6785 lui a5,0x1 + 3001344: 87978593 addi a1,a5,-1927 # 879 + 3001348: 030067b7 lui a5,0x3006 + 300134c: 42878513 addi a0,a5,1064 # 3006428 + 3001350: 21ed jal ra,300183a + 3001352: a001 j 3001352 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 3001354: fd842503 lw a0,-40(s0) + 3001358: 3dc1 jal ra,3001228 + 300135a: 87aa mv a5,a0 + 300135c: 0017c793 xori a5,a5,1 + 3001360: 9f81 uxtb a5 + 3001362: cb91 beqz a5,3001376 + 3001364: 6785 lui a5,0x1 + 3001366: 87a78593 addi a1,a5,-1926 # 87a + 300136a: 030067b7 lui a5,0x3006 + 300136e: 42878513 addi a0,a5,1064 # 3006428 + 3001372: 21e1 jal ra,300183a + 3001374: a01d j 300139a + unsigned int shiftBit = (unsigned int)socx; + 3001376: fd842783 lw a5,-40(s0) + 300137a: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 300137e: fdc42783 lw a5,-36(s0) + 3001382: 2b07a703 lw a4,688(a5) + 3001386: 4685 li a3,1 + 3001388: fec42783 lw a5,-20(s0) + 300138c: 00f697b3 sll a5,a3,a5 + 3001390: 8f5d or a4,a4,a5 + 3001392: fdc42783 lw a5,-36(s0) + 3001396: 2ae7a823 sw a4,688(a5) +} + 300139a: 50b2 lw ra,44(sp) + 300139c: 5422 lw s0,40(sp) + 300139e: 6145 addi sp,sp,48 + 30013a0: 8082 ret + +030013a2 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt1(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30013a2: 7179 addi sp,sp,-48 + 30013a4: d606 sw ra,44(sp) + 30013a6: d422 sw s0,40(sp) + 30013a8: 1800 addi s0,sp,48 + 30013aa: fca42e23 sw a0,-36(s0) + 30013ae: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30013b2: fdc42703 lw a4,-36(s0) + 30013b6: 180007b7 lui a5,0x18000 + 30013ba: 00f70b63 beq a4,a5,30013d0 + 30013be: 6785 lui a5,0x1 + 30013c0: 89478593 addi a1,a5,-1900 # 894 + 30013c4: 030067b7 lui a5,0x3006 + 30013c8: 42878513 addi a0,a5,1064 # 3006428 + 30013cc: 21bd jal ra,300183a + 30013ce: a001 j 30013ce + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30013d0: fd842503 lw a0,-40(s0) + 30013d4: 3d91 jal ra,3001228 + 30013d6: 87aa mv a5,a0 + 30013d8: 0017c793 xori a5,a5,1 + 30013dc: 9f81 uxtb a5 + 30013de: cb91 beqz a5,30013f2 + 30013e0: 6785 lui a5,0x1 + 30013e2: 89578593 addi a1,a5,-1899 # 895 + 30013e6: 030067b7 lui a5,0x3006 + 30013ea: 42878513 addi a0,a5,1064 # 3006428 + 30013ee: 21b1 jal ra,300183a + 30013f0: a025 j 3001418 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30013f2: fd842783 lw a5,-40(s0) + 30013f6: 07c1 addi a5,a5,16 + 30013f8: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_0.reg |= (1U << shiftBit); + 30013fc: fdc42783 lw a5,-36(s0) + 3001400: 2b07a703 lw a4,688(a5) + 3001404: 4685 li a3,1 + 3001406: fec42783 lw a5,-20(s0) + 300140a: 00f697b3 sll a5,a3,a5 + 300140e: 8f5d or a4,a4,a5 + 3001410: fdc42783 lw a5,-36(s0) + 3001414: 2ae7a823 sw a4,688(a5) +} + 3001418: 50b2 lw ra,44(sp) + 300141a: 5422 lw s0,40(sp) + 300141c: 6145 addi sp,sp,48 + 300141e: 8082 ret + +03001420 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt2(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 3001420: 7179 addi sp,sp,-48 + 3001422: d606 sw ra,44(sp) + 3001424: d422 sw s0,40(sp) + 3001426: 1800 addi s0,sp,48 + 3001428: fca42e23 sw a0,-36(s0) + 300142c: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001430: fdc42703 lw a4,-36(s0) + 3001434: 180007b7 lui a5,0x18000 + 3001438: 00f70b63 beq a4,a5,300144e + 300143c: 6785 lui a5,0x1 + 300143e: 8af78593 addi a1,a5,-1873 # 8af + 3001442: 030067b7 lui a5,0x3006 + 3001446: 42878513 addi a0,a5,1064 # 3006428 + 300144a: 2ec5 jal ra,300183a + 300144c: a001 j 300144c + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300144e: fd842503 lw a0,-40(s0) + 3001452: 3bd9 jal ra,3001228 + 3001454: 87aa mv a5,a0 + 3001456: 0017c793 xori a5,a5,1 + 300145a: 9f81 uxtb a5 + 300145c: cb91 beqz a5,3001470 + 300145e: 6785 lui a5,0x1 + 3001460: 8b078593 addi a1,a5,-1872 # 8b0 + 3001464: 030067b7 lui a5,0x3006 + 3001468: 42878513 addi a0,a5,1064 # 3006428 + 300146c: 26f9 jal ra,300183a + 300146e: a01d j 3001494 + unsigned int shiftBit = (unsigned int)socx; + 3001470: fd842783 lw a5,-40(s0) + 3001474: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 3001478: fdc42783 lw a5,-36(s0) + 300147c: 2b47a703 lw a4,692(a5) + 3001480: 4685 li a3,1 + 3001482: fec42783 lw a5,-20(s0) + 3001486: 00f697b3 sll a5,a3,a5 + 300148a: 8f5d or a4,a4,a5 + 300148c: fdc42783 lw a5,-36(s0) + 3001490: 2ae7aa23 sw a4,692(a5) +} + 3001494: 50b2 lw ra,44(sp) + 3001496: 5422 lw s0,40(sp) + 3001498: 6145 addi sp,sp,48 + 300149a: 8082 ret + +0300149c : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SetSOCxBlindInt3(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300149c: 7179 addi sp,sp,-48 + 300149e: d606 sw ra,44(sp) + 30014a0: d422 sw s0,40(sp) + 30014a2: 1800 addi s0,sp,48 + 30014a4: fca42e23 sw a0,-36(s0) + 30014a8: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30014ac: fdc42703 lw a4,-36(s0) + 30014b0: 180007b7 lui a5,0x18000 + 30014b4: 00f70b63 beq a4,a5,30014ca + 30014b8: 6785 lui a5,0x1 + 30014ba: 8ca78593 addi a1,a5,-1846 # 8ca + 30014be: 030067b7 lui a5,0x3006 + 30014c2: 42878513 addi a0,a5,1064 # 3006428 + 30014c6: 2e95 jal ra,300183a + 30014c8: a001 j 30014c8 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30014ca: fd842503 lw a0,-40(s0) + 30014ce: 3ba9 jal ra,3001228 + 30014d0: 87aa mv a5,a0 + 30014d2: 0017c793 xori a5,a5,1 + 30014d6: 9f81 uxtb a5 + 30014d8: cb91 beqz a5,30014ec + 30014da: 6785 lui a5,0x1 + 30014dc: 8cb78593 addi a1,a5,-1845 # 8cb + 30014e0: 030067b7 lui a5,0x3006 + 30014e4: 42878513 addi a0,a5,1064 # 3006428 + 30014e8: 2e89 jal ra,300183a + 30014ea: a025 j 3001512 + unsigned int shiftBit = (unsigned int)socx + 16; /* Offset 16 bits configuration */ + 30014ec: fd842783 lw a5,-40(s0) + 30014f0: 07c1 addi a5,a5,16 + 30014f2: fef42623 sw a5,-20(s0) + adcx->ADC_INT_DATA_1.reg |= (1U << shiftBit); + 30014f6: fdc42783 lw a5,-36(s0) + 30014fa: 2b47a703 lw a4,692(a5) + 30014fe: 4685 li a3,1 + 3001500: fec42783 lw a5,-20(s0) + 3001504: 00f697b3 sll a5,a3,a5 + 3001508: 8f5d or a4,a4,a5 + 300150a: fdc42783 lw a5,-36(s0) + 300150e: 2ae7aa23 sw a4,692(a5) +} + 3001512: 50b2 lw ra,44(sp) + 3001514: 5422 lw s0,40(sp) + 3001516: 6145 addi sp,sp,48 + 3001518: 8082 ret + +0300151a : + * @param adcx ADC register base address. + * @param intx Number of ADC interrupt controller, @ref ADC_IntNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableIntx(ADC_RegStruct * const adcx, ADC_IntNumber intx) +{ + 300151a: 1101 addi sp,sp,-32 + 300151c: ce06 sw ra,28(sp) + 300151e: cc22 sw s0,24(sp) + 3001520: 1000 addi s0,sp,32 + 3001522: fea42623 sw a0,-20(s0) + 3001526: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300152a: fec42703 lw a4,-20(s0) + 300152e: 180007b7 lui a5,0x18000 + 3001532: 00f70b63 beq a4,a5,3001548 + 3001536: 6785 lui a5,0x1 + 3001538: 8e578593 addi a1,a5,-1819 # 8e5 + 300153c: 030067b7 lui a5,0x3006 + 3001540: 42878513 addi a0,a5,1064 # 3006428 + 3001544: 2cdd jal ra,300183a + 3001546: a001 j 3001546 + ADC_PARAM_CHECK_NO_RET(IsADCIntx(intx)); + 3001548: fe842503 lw a0,-24(s0) + 300154c: 39e5 jal ra,3001244 + 300154e: 87aa mv a5,a0 + 3001550: 0017c793 xori a5,a5,1 + 3001554: 9f81 uxtb a5 + 3001556: cb91 beqz a5,300156a + 3001558: 6785 lui a5,0x1 + 300155a: 8e678593 addi a1,a5,-1818 # 8e6 + 300155e: 030067b7 lui a5,0x3006 + 3001562: 42878513 addi a0,a5,1064 # 3006428 + 3001566: 2cd1 jal ra,300183a + 3001568: a839 j 3001586 + adcx->ADC_DATA_FLAG_MASK.reg |= (1U << (unsigned int)intx); + 300156a: fec42783 lw a5,-20(s0) + 300156e: 2c07a703 lw a4,704(a5) + 3001572: 4685 li a3,1 + 3001574: fe842783 lw a5,-24(s0) + 3001578: 00f697b3 sll a5,a3,a5 + 300157c: 8f5d or a4,a4,a5 + 300157e: fec42783 lw a5,-20(s0) + 3001582: 2ce7a023 sw a4,704(a5) +} + 3001586: 40f2 lw ra,28(sp) + 3001588: 4462 lw s0,24(sp) + 300158a: 6105 addi sp,sp,32 + 300158c: 8082 ret + +0300158e : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval addr, the base address of the SOC registers. + */ +static unsigned int ADC_GetCTRLAddr(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300158e: 7179 addi sp,sp,-48 + 3001590: d622 sw s0,44(sp) + 3001592: 1800 addi s0,sp,48 + 3001594: fca42e23 sw a0,-36(s0) + 3001598: fcb42c23 sw a1,-40(s0) + unsigned int addr; + addr = (uintptr_t)(void *)&(adcx->ADC_SOC0_CFG); + 300159c: fdc42783 lw a5,-36(s0) + 30015a0: 10078793 addi a5,a5,256 + 30015a4: fef42623 sw a5,-20(s0) + addr += ((unsigned int)socx * 4); /* Register base address difference 4 */ + 30015a8: fd842783 lw a5,-40(s0) + 30015ac: 078a slli a5,a5,0x2 + 30015ae: fec42703 lw a4,-20(s0) + 30015b2: 97ba add a5,a5,a4 + 30015b4: fef42623 sw a5,-20(s0) + return addr; + 30015b8: fec42783 lw a5,-20(s0) +} + 30015bc: 853e mv a0,a5 + 30015be: 5432 lw s0,44(sp) + 30015c0: 6145 addi sp,sp,48 + 30015c2: 8082 ret + +030015c4 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param input ADC input, @ref ADC_Input. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelectChannel(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_Input input) +{ + 30015c4: 7179 addi sp,sp,-48 + 30015c6: d606 sw ra,44(sp) + 30015c8: d422 sw s0,40(sp) + 30015ca: 1800 addi s0,sp,48 + 30015cc: fca42e23 sw a0,-36(s0) + 30015d0: fcb42c23 sw a1,-40(s0) + 30015d4: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30015d8: fdc42703 lw a4,-36(s0) + 30015dc: 180007b7 lui a5,0x18000 + 30015e0: 00f70b63 beq a4,a5,30015f6 + 30015e4: 6785 lui a5,0x1 + 30015e6: 91c78593 addi a1,a5,-1764 # 91c + 30015ea: 030067b7 lui a5,0x3006 + 30015ee: 42878513 addi a0,a5,1064 # 3006428 + 30015f2: 24a1 jal ra,300183a + 30015f4: a001 j 30015f4 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCSampleChannel(input)); + 30015f6: fd842503 lw a0,-40(s0) + 30015fa: 313d jal ra,3001228 + 30015fc: 87aa mv a5,a0 + 30015fe: 0017c793 xori a5,a5,1 + 3001602: 9f81 uxtb a5 + 3001604: eb89 bnez a5,3001616 + 3001606: fd442503 lw a0,-44(s0) + 300160a: 3109 jal ra,300120c + 300160c: 87aa mv a5,a0 + 300160e: 0017c793 xori a5,a5,1 + 3001612: 9f81 uxtb a5 + 3001614: cb91 beqz a5,3001628 + 3001616: 6785 lui a5,0x1 + 3001618: 91d78593 addi a1,a5,-1763 # 91d + 300161c: 030067b7 lui a5,0x3006 + 3001620: 42878513 addi a0,a5,1064 # 3006428 + 3001624: 2c19 jal ra,300183a + 3001626: a091 j 300166a + ADC_SOC0_CFG_REG *soc = NULL; + 3001628: fe042623 sw zero,-20(s0) + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Get the Address After Translation */ + 300162c: fd842583 lw a1,-40(s0) + 3001630: fdc42503 lw a0,-36(s0) + 3001634: 3fa9 jal ra,300158e + 3001636: fea42423 sw a0,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 300163a: fe842783 lw a5,-24(s0) + 300163e: fef42623 sw a5,-20(s0) + soc->BIT.cfg_soc0_ch_sel = (unsigned int)input; + 3001642: fd442783 lw a5,-44(s0) + 3001646: 8bfd andi a5,a5,31 + 3001648: 0ff7f693 andi a3,a5,255 + 300164c: fec42703 lw a4,-20(s0) + 3001650: 431c lw a5,0(a4) + 3001652: 8afd andi a3,a3,31 + 3001654: 9b81 andi a5,a5,-32 + 3001656: 8fd5 or a5,a5,a3 + 3001658: c31c sw a5,0(a4) + if (input == ADC_CH_ADCINA18) { + 300165a: fd442703 lw a4,-44(s0) + 300165e: 47c9 li a5,18 + 3001660: 00f71563 bne a4,a5,300166a + DCL_ADC_EnableAvddChannel(adcx); + 3001664: fdc42503 lw a0,-36(s0) + 3001668: 39ad jal ra,30012e2 + } +} + 300166a: 50b2 lw ra,44(sp) + 300166c: 5422 lw s0,40(sp) + 300166e: 6145 addi sp,sp,48 + 3001670: 8082 ret + +03001672 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param trig Source of trigger, @ref ADC_TrigSource. + * @retval None. + */ +static inline void DCL_ADC_SOCxSelcetTrigSource(ADC_RegStruct * const adcx, ADC_SOCNumber socx, ADC_TrigSource trig) +{ + 3001672: 7179 addi sp,sp,-48 + 3001674: d606 sw ra,44(sp) + 3001676: d422 sw s0,40(sp) + 3001678: 1800 addi s0,sp,48 + 300167a: fca42e23 sw a0,-36(s0) + 300167e: fcb42c23 sw a1,-40(s0) + 3001682: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 3001686: fdc42703 lw a4,-36(s0) + 300168a: 180007b7 lui a5,0x18000 + 300168e: 00f70b63 beq a4,a5,30016a4 + 3001692: 6785 lui a5,0x1 + 3001694: 93078593 addi a1,a5,-1744 # 930 + 3001698: 030067b7 lui a5,0x3006 + 300169c: 42878513 addi a0,a5,1064 # 3006428 + 30016a0: 2a69 jal ra,300183a + 30016a2: a001 j 30016a2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx) && IsADCTrigSource(trig)); + 30016a4: fd842503 lw a0,-40(s0) + 30016a8: 3641 jal ra,3001228 + 30016aa: 87aa mv a5,a0 + 30016ac: 0017c793 xori a5,a5,1 + 30016b0: 9f81 uxtb a5 + 30016b2: eb89 bnez a5,30016c4 + 30016b4: fd442503 lw a0,-44(s0) + 30016b8: 3665 jal ra,3001260 + 30016ba: 87aa mv a5,a0 + 30016bc: 0017c793 xori a5,a5,1 + 30016c0: 9f81 uxtb a5 + 30016c2: cb91 beqz a5,30016d6 + 30016c4: 6785 lui a5,0x1 + 30016c6: 93178593 addi a1,a5,-1743 # 931 + 30016ca: 030067b7 lui a5,0x3006 + 30016ce: 42878513 addi a0,a5,1064 # 3006428 + 30016d2: 22a5 jal ra,300183a + 30016d4: a835 j 3001710 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtaining the Address for Configuring the SOC */ + 30016d6: fd842583 lw a1,-40(s0) + 30016da: fdc42503 lw a0,-36(s0) + 30016de: 3d45 jal ra,300158e + 30016e0: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 30016e4: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30016e8: fec42783 lw a5,-20(s0) + 30016ec: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_trig_sel = (unsigned int)trig; + 30016f0: fd442783 lw a5,-44(s0) + 30016f4: 8bfd andi a5,a5,31 + 30016f6: 0ff7f693 andi a3,a5,255 + 30016fa: fe842703 lw a4,-24(s0) + 30016fe: 431c lw a5,0(a4) + 3001700: 8afd andi a3,a3,31 + 3001702: 06a6 slli a3,a3,0x9 + 3001704: 7671 lui a2,0xffffc + 3001706: 1ff60613 addi a2,a2,511 # ffffc1ff + 300170a: 8ff1 and a5,a5,a2 + 300170c: 8fd5 or a5,a5,a3 + 300170e: c31c sw a5,0(a4) +} + 3001710: 50b2 lw ra,44(sp) + 3001712: 5422 lw s0,40(sp) + 3001714: 6145 addi sp,sp,48 + 3001716: 8082 ret + +03001718 : + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @param acqps Capacitor charging time. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetAcqps(ADC_RegStruct * const adcx, ADC_SOCNumber socx, unsigned int acqps) +{ + 3001718: 7179 addi sp,sp,-48 + 300171a: d606 sw ra,44(sp) + 300171c: d422 sw s0,40(sp) + 300171e: 1800 addi s0,sp,48 + 3001720: fca42e23 sw a0,-36(s0) + 3001724: fcb42c23 sw a1,-40(s0) + 3001728: fcc42a23 sw a2,-44(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300172c: fdc42703 lw a4,-36(s0) + 3001730: 180007b7 lui a5,0x18000 + 3001734: 00f70b63 beq a4,a5,300174a + 3001738: 6785 lui a5,0x1 + 300173a: 94178593 addi a1,a5,-1727 # 941 + 300173e: 030067b7 lui a5,0x3006 + 3001742: 42878513 addi a0,a5,1064 # 3006428 + 3001746: 28d5 jal ra,300183a + 3001748: a001 j 3001748 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300174a: fd842503 lw a0,-40(s0) + 300174e: 3ce9 jal ra,3001228 + 3001750: 87aa mv a5,a0 + 3001752: 0017c793 xori a5,a5,1 + 3001756: 9f81 uxtb a5 + 3001758: cb91 beqz a5,300176c + 300175a: 6785 lui a5,0x1 + 300175c: 94278593 addi a1,a5,-1726 # 942 + 3001760: 030067b7 lui a5,0x3006 + 3001764: 42878513 addi a0,a5,1064 # 3006428 + 3001768: 28c9 jal ra,300183a + 300176a: a891 j 30017be + ADC_PARAM_CHECK_NO_RET(acqps <= 15); /* The value of acqps ranges from 0 to 15 */ + 300176c: fd442703 lw a4,-44(s0) + 3001770: 47bd li a5,15 + 3001772: 00e7fb63 bgeu a5,a4,3001788 + 3001776: 6785 lui a5,0x1 + 3001778: 94378593 addi a1,a5,-1725 # 943 + 300177c: 030067b7 lui a5,0x3006 + 3001780: 42878513 addi a0,a5,1064 # 3006428 + 3001784: 285d jal ra,300183a + 3001786: a825 j 30017be + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); + 3001788: fd842583 lw a1,-40(s0) + 300178c: fdc42503 lw a0,-36(s0) + 3001790: 3bfd jal ra,300158e + 3001792: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 3001796: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 300179a: fec42783 lw a5,-20(s0) + 300179e: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_samptime_sel = acqps; + 30017a2: fd442783 lw a5,-44(s0) + 30017a6: 8bbd andi a5,a5,15 + 30017a8: 0ff7f693 andi a3,a5,255 + 30017ac: fe842703 lw a4,-24(s0) + 30017b0: 431c lw a5,0(a4) + 30017b2: 8abd andi a3,a3,15 + 30017b4: 0696 slli a3,a3,0x5 + 30017b6: e1f7f793 andi a5,a5,-481 + 30017ba: 8fd5 or a5,a5,a3 + 30017bc: c31c sw a5,0(a4) +} + 30017be: 50b2 lw ra,44(sp) + 30017c0: 5422 lw s0,40(sp) + 30017c2: 6145 addi sp,sp,48 + 30017c4: 8082 ret + +030017c6 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_SOCxSoftTrigger(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30017c6: 1101 addi sp,sp,-32 + 30017c8: ce06 sw ra,28(sp) + 30017ca: cc22 sw s0,24(sp) + 30017cc: 1000 addi s0,sp,32 + 30017ce: fea42623 sw a0,-20(s0) + 30017d2: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30017d6: fec42703 lw a4,-20(s0) + 30017da: 180007b7 lui a5,0x18000 + 30017de: 00f70b63 beq a4,a5,30017f4 + 30017e2: 6785 lui a5,0x1 + 30017e4: 95278593 addi a1,a5,-1710 # 952 + 30017e8: 030067b7 lui a5,0x3006 + 30017ec: 42878513 addi a0,a5,1064 # 3006428 + 30017f0: 20a9 jal ra,300183a + 30017f2: a001 j 30017f2 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30017f4: fe842503 lw a0,-24(s0) + 30017f8: 3c05 jal ra,3001228 + 30017fa: 87aa mv a5,a0 + 30017fc: 0017c793 xori a5,a5,1 + 3001800: 9f81 uxtb a5 + 3001802: cb91 beqz a5,3001816 + 3001804: 6785 lui a5,0x1 + 3001806: 95378593 addi a1,a5,-1709 # 953 + 300180a: 030067b7 lui a5,0x3006 + 300180e: 42878513 addi a0,a5,1064 # 3006428 + 3001812: 2d71 jal ra,3001eae + 3001814: a839 j 3001832 + adcx->ADC_SOFT_TRIG.reg |= (1U << (unsigned int)socx); + 3001816: fec42783 lw a5,-20(s0) + 300181a: 1607a703 lw a4,352(a5) + 300181e: 4685 li a3,1 + 3001820: fe842783 lw a5,-24(s0) + 3001824: 00f697b3 sll a5,a3,a5 + 3001828: 8f5d or a4,a4,a5 + 300182a: fec42783 lw a5,-20(s0) + 300182e: 16e7a023 sw a4,352(a5) +} + 3001832: 40f2 lw ra,28(sp) + 3001834: 4462 lw s0,24(sp) + 3001836: 6105 addi sp,sp,32 + 3001838: 8082 ret + +0300183a : + 300183a: 6740006f j 3001eae + +0300183e : + * @param adcx ADC register base address. + * @param priorityMode Mode of SOC priority, @ref ADC_PriorityMode. + * @retval None. + */ +static inline void DCL_ADC_SOCxSetPriority(ADC_RegStruct * const adcx, ADC_PriorityMode priorityMode) +{ + 300183e: 1101 addi sp,sp,-32 + 3001840: ce06 sw ra,28(sp) + 3001842: cc22 sw s0,24(sp) + 3001844: 1000 addi s0,sp,32 + 3001846: fea42623 sw a0,-20(s0) + 300184a: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300184e: fec42703 lw a4,-20(s0) + 3001852: 180007b7 lui a5,0x18000 + 3001856: 00f70b63 beq a4,a5,300186c + 300185a: 6785 lui a5,0x1 + 300185c: 96c78593 addi a1,a5,-1684 # 96c + 3001860: 030067b7 lui a5,0x3006 + 3001864: 42878513 addi a0,a5,1064 # 3006428 + 3001868: 2599 jal ra,3001eae + 300186a: a001 j 300186a + ADC_PARAM_CHECK_NO_RET(IsADCPriorityMode(priorityMode)); + 300186c: fe842503 lw a0,-24(s0) + 3001870: 3c25 jal ra,30012a8 + 3001872: 87aa mv a5,a0 + 3001874: 0017c793 xori a5,a5,1 + 3001878: 9f81 uxtb a5 + 300187a: cb91 beqz a5,300188e + 300187c: 6785 lui a5,0x1 + 300187e: 96d78593 addi a1,a5,-1683 # 96d + 3001882: 030067b7 lui a5,0x3006 + 3001886: 42878513 addi a0,a5,1064 # 3006428 + 300188a: 2515 jal ra,3001eae + 300188c: a039 j 300189a + adcx->ADC_ARBT0.reg = priorityMode; + 300188e: fec42783 lw a5,-20(s0) + 3001892: fe842703 lw a4,-24(s0) + 3001896: 20e7a023 sw a4,512(a5) +} + 300189a: 40f2 lw ra,28(sp) + 300189c: 4462 lw s0,24(sp) + 300189e: 6105 addi sp,sp,32 + 30018a0: 8082 ret + +030018a2 : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval unsigned int, result. + */ +static inline unsigned int DCL_ADC_ReadSOCxResult(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 30018a2: 7179 addi sp,sp,-48 + 30018a4: d606 sw ra,44(sp) + 30018a6: d422 sw s0,40(sp) + 30018a8: 1800 addi s0,sp,48 + 30018aa: fca42e23 sw a0,-36(s0) + 30018ae: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30018b2: fdc42703 lw a4,-36(s0) + 30018b6: 180007b7 lui a5,0x18000 + 30018ba: 00f70b63 beq a4,a5,30018d0 + 30018be: 6785 lui a5,0x1 + 30018c0: a8778593 addi a1,a5,-1401 # a87 + 30018c4: 030067b7 lui a5,0x3006 + 30018c8: 42878513 addi a0,a5,1064 # 3006428 + 30018cc: 23cd jal ra,3001eae + 30018ce: a001 j 30018ce + ADC_ASSERT_PARAM(IsADCSOCx(socx)); + 30018d0: fd842503 lw a0,-40(s0) + 30018d4: 3a91 jal ra,3001228 + 30018d6: 87aa mv a5,a0 + 30018d8: 0017c793 xori a5,a5,1 + 30018dc: 9f81 uxtb a5 + 30018de: cb91 beqz a5,30018f2 + 30018e0: 6785 lui a5,0x1 + 30018e2: a8878593 addi a1,a5,-1400 # a88 + 30018e6: 030067b7 lui a5,0x3006 + 30018ea: 42878513 addi a0,a5,1064 # 3006428 + 30018ee: 23c1 jal ra,3001eae + 30018f0: a001 j 30018f0 + ADC_RESULT0_REG *result; + uintptr_t addr = (uintptr_t)(void *)adcx; + 30018f2: fdc42783 lw a5,-36(s0) + 30018f6: fef42623 sw a5,-20(s0) + /* The address interval of the result register is 4 */ + result = (ADC_RESULT0_REG *)(void *)(addr + 4 * (unsigned int)socx); + 30018fa: fd842783 lw a5,-40(s0) + 30018fe: 00279713 slli a4,a5,0x2 + 3001902: fec42783 lw a5,-20(s0) + 3001906: 97ba add a5,a5,a4 + 3001908: fef42423 sw a5,-24(s0) + return result->reg; + 300190c: fe842783 lw a5,-24(s0) + 3001910: 439c lw a5,0(a5) +} + 3001912: 853e mv a0,a5 + 3001914: 50b2 lw ra,44(sp) + 3001916: 5422 lw s0,40(sp) + 3001918: 6145 addi sp,sp,48 + 300191a: 8082 ret + +0300191c : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_EnableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300191c: 7179 addi sp,sp,-48 + 300191e: d606 sw ra,44(sp) + 3001920: d422 sw s0,40(sp) + 3001922: 1800 addi s0,sp,48 + 3001924: fca42e23 sw a0,-36(s0) + 3001928: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 300192c: fdc42703 lw a4,-36(s0) + 3001930: 180007b7 lui a5,0x18000 + 3001934: 00f70b63 beq a4,a5,300194a + 3001938: 6785 lui a5,0x1 + 300193a: b4678593 addi a1,a5,-1210 # b46 + 300193e: 030067b7 lui a5,0x3006 + 3001942: 42878513 addi a0,a5,1064 # 3006428 + 3001946: 23a5 jal ra,3001eae + 3001948: a001 j 3001948 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 300194a: fd842503 lw a0,-40(s0) + 300194e: 38e9 jal ra,3001228 + 3001950: 87aa mv a5,a0 + 3001952: 0017c793 xori a5,a5,1 + 3001956: 9f81 uxtb a5 + 3001958: cb91 beqz a5,300196c + 300195a: 6785 lui a5,0x1 + 300195c: b4778593 addi a1,a5,-1209 # b47 + 3001960: 030067b7 lui a5,0x3006 + 3001964: 42878513 addi a0,a5,1064 # 3006428 + 3001968: 2399 jal ra,3001eae + 300196a: a025 j 3001992 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 300196c: fd842583 lw a1,-40(s0) + 3001970: fdc42503 lw a0,-36(s0) + 3001974: 3929 jal ra,300158e + 3001976: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 300197a: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 300197e: fec42783 lw a5,-20(s0) + 3001982: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_ENABLE; + 3001986: fe842703 lw a4,-24(s0) + 300198a: 431c lw a5,0(a4) + 300198c: 6691 lui a3,0x4 + 300198e: 8fd5 or a5,a5,a3 + 3001990: c31c sw a5,0(a4) +} + 3001992: 50b2 lw ra,44(sp) + 3001994: 5422 lw s0,40(sp) + 3001996: 6145 addi sp,sp,48 + 3001998: 8082 ret + +0300199a : + * @param adcx ADC register base address. + * @param socx Number of SOC, @ref ADC_SOCNumber. + * @retval None. + */ +static inline void DCL_ADC_DisableSOCxContinue(ADC_RegStruct * const adcx, ADC_SOCNumber socx) +{ + 300199a: 7179 addi sp,sp,-48 + 300199c: d606 sw ra,44(sp) + 300199e: d422 sw s0,40(sp) + 30019a0: 1800 addi s0,sp,48 + 30019a2: fca42e23 sw a0,-36(s0) + 30019a6: fcb42c23 sw a1,-40(s0) + ADC_ASSERT_PARAM(IsADCInstance(adcx)); + 30019aa: fdc42703 lw a4,-36(s0) + 30019ae: 180007b7 lui a5,0x18000 + 30019b2: 00f70b63 beq a4,a5,30019c8 + 30019b6: 6785 lui a5,0x1 + 30019b8: b5678593 addi a1,a5,-1194 # b56 + 30019bc: 030067b7 lui a5,0x3006 + 30019c0: 42878513 addi a0,a5,1064 # 3006428 + 30019c4: 21ed jal ra,3001eae + 30019c6: a001 j 30019c6 + ADC_PARAM_CHECK_NO_RET(IsADCSOCx(socx)); + 30019c8: fd842503 lw a0,-40(s0) + 30019cc: 38b1 jal ra,3001228 + 30019ce: 87aa mv a5,a0 + 30019d0: 0017c793 xori a5,a5,1 + 30019d4: 9f81 uxtb a5 + 30019d6: cb91 beqz a5,30019ea + 30019d8: 6785 lui a5,0x1 + 30019da: b5778593 addi a1,a5,-1193 # b57 + 30019de: 030067b7 lui a5,0x3006 + 30019e2: 42878513 addi a0,a5,1064 # 3006428 + 30019e6: 21e1 jal ra,3001eae + 30019e8: a02d j 3001a12 + unsigned int addr = ADC_GetCTRLAddr(adcx, socx); /* Obtains the SOC base address */ + 30019ea: fd842583 lw a1,-40(s0) + 30019ee: fdc42503 lw a0,-36(s0) + 30019f2: 3e71 jal ra,300158e + 30019f4: fea42623 sw a0,-20(s0) + ADC_SOC0_CFG_REG *soc = NULL; + 30019f8: fe042423 sw zero,-24(s0) + soc = (ADC_SOC0_CFG_REG *)(void *)(uintptr_t)addr; + 30019fc: fec42783 lw a5,-20(s0) + 3001a00: fef42423 sw a5,-24(s0) + soc->BIT.cfg_soc0_cont_en = BASE_CFG_DISABLE; + 3001a04: fe842703 lw a4,-24(s0) + 3001a08: 431c lw a5,0(a4) + 3001a0a: 76f1 lui a3,0xffffc + 3001a0c: 16fd addi a3,a3,-1 # ffffbfff + 3001a0e: 8ff5 and a5,a5,a3 + 3001a10: c31c sw a5,0(a4) +} + 3001a12: 50b2 lw ra,44(sp) + 3001a14: 5422 lw s0,40(sp) + 3001a16: 6145 addi sp,sp,48 + 3001a18: 8082 ret + +03001a1a : + * triggered at least 100 us later. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_Init(ADC_Handle *adcHandle) +{ + 3001a1a: 1101 addi sp,sp,-32 + 3001a1c: ce06 sw ra,28(sp) + 3001a1e: cc22 sw s0,24(sp) + 3001a20: 1000 addi s0,sp,32 + 3001a22: fea42623 sw a0,-20(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001a26: fec42783 lw a5,-20(s0) + 3001a2a: eb89 bnez a5,3001a3c + 3001a2c: 02c00593 li a1,44 + 3001a30: 030067b7 lui a5,0x3006 + 3001a34: 44478513 addi a0,a5,1092 # 3006444 + 3001a38: 299d jal ra,3001eae + 3001a3a: a001 j 3001a3a + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001a3c: fec42783 lw a5,-20(s0) + 3001a40: 4398 lw a4,0(a5) + 3001a42: 180007b7 lui a5,0x18000 + 3001a46: 00f70a63 beq a4,a5,3001a5a + 3001a4a: 02d00593 li a1,45 + 3001a4e: 030067b7 lui a5,0x3006 + 3001a52: 44478513 addi a0,a5,1092 # 3006444 + 3001a56: 29a1 jal ra,3001eae + 3001a58: a001 j 3001a58 + ADC_PARAM_CHECK_WITH_RET(IsADCPriorityMode(adcHandle->socPriority) == true, BASE_STATUS_ERROR); + 3001a5a: fec42783 lw a5,-20(s0) + 3001a5e: 43dc lw a5,4(a5) + 3001a60: 853e mv a0,a5 + 3001a62: 3099 jal ra,30012a8 + 3001a64: 87aa mv a5,a0 + 3001a66: 0017c793 xori a5,a5,1 + 3001a6a: 9f81 uxtb a5 + 3001a6c: cb91 beqz a5,3001a80 + 3001a6e: 02e00593 li a1,46 + 3001a72: 030067b7 lui a5,0x3006 + 3001a76: 44478513 addi a0,a5,1092 # 3006444 + 3001a7a: 2915 jal ra,3001eae + 3001a7c: 4785 li a5,1 + 3001a7e: a091 j 3001ac2 + DCL_ADC_SOCxSetPriority(adcHandle->baseAddress, adcHandle->socPriority); + 3001a80: fec42783 lw a5,-20(s0) + 3001a84: 4398 lw a4,0(a5) + 3001a86: fec42783 lw a5,-20(s0) + 3001a8a: 43dc lw a5,4(a5) + 3001a8c: 85be mv a1,a5 + 3001a8e: 853a mv a0,a4 + 3001a90: 337d jal ra,300183e + adcHandle->baseAddress->ADC_ANA_CTRL0.BIT.cfg_sar_samp_cap_sel = 0x4; /* Set the Number of Sampling Capacitors */ + 3001a92: fec42783 lw a5,-20(s0) + 3001a96: 4398 lw a4,0(a5) + 3001a98: 65472783 lw a5,1620(a4) + 3001a9c: 100006b7 lui a3,0x10000 + 3001aa0: 16fd addi a3,a3,-1 # fffffff + 3001aa2: 8efd and a3,a3,a5 + 3001aa4: 400007b7 lui a5,0x40000 + 3001aa8: 8fd5 or a5,a5,a3 + 3001aaa: 64f72a23 sw a5,1620(a4) + adcHandle->baseAddress->ADC_EN.reg = BASE_CFG_ENABLE; /* Enable ADC Controller */ + 3001aae: fec42783 lw a5,-20(s0) + 3001ab2: 439c lw a5,0(a5) + 3001ab4: 4705 li a4,1 + 3001ab6: 30e7a023 sw a4,768(a5) # 40000300 + BASE_FUNC_DelayUs(100); /* Wait for 100 us until the ADC controller is stable */ + 3001aba: 06400513 li a0,100 + 3001abe: 2929 jal ra,3001ed8 + return BASE_STATUS_OK; + 3001ac0: 4781 li a5,0 +} + 3001ac2: 853e mv a0,a5 + 3001ac4: 40f2 lw ra,28(sp) + 3001ac6: 4462 lw s0,24(sp) + 3001ac8: 6105 addi sp,sp,32 + 3001aca: 8082 ret + +03001acc : + * @param soc ID of SOC(start of conversion), managing the specific sample inputs. + * @param socParam Param struct of SOC. This is related to the peripheral circuit design, @ref SOC_Param. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_ConfigureSoc(ADC_Handle *adcHandle, ADC_SOCNumber soc, SOC_Param *socParam) +{ + 3001acc: 1101 addi sp,sp,-32 + 3001ace: ce06 sw ra,28(sp) + 3001ad0: cc22 sw s0,24(sp) + 3001ad2: 1000 addi s0,sp,32 + 3001ad4: fea42623 sw a0,-20(s0) + 3001ad8: feb42423 sw a1,-24(s0) + 3001adc: fec42223 sw a2,-28(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001ae0: fec42783 lw a5,-20(s0) + 3001ae4: eb89 bnez a5,3001af6 + 3001ae6: 04c00593 li a1,76 + 3001aea: 030067b7 lui a5,0x3006 + 3001aee: 44478513 addi a0,a5,1092 # 3006444 + 3001af2: 2e75 jal ra,3001eae + 3001af4: a001 j 3001af4 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001af6: fec42783 lw a5,-20(s0) + 3001afa: 4398 lw a4,0(a5) + 3001afc: 180007b7 lui a5,0x18000 + 3001b00: 00f70a63 beq a4,a5,3001b14 + 3001b04: 04d00593 li a1,77 + 3001b08: 030067b7 lui a5,0x3006 + 3001b0c: 44478513 addi a0,a5,1092 # 3006444 + 3001b10: 2e79 jal ra,3001eae + 3001b12: a001 j 3001b12 + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001b14: fe842503 lw a0,-24(s0) + 3001b18: f10ff0ef jal ra,3001228 + 3001b1c: 87aa mv a5,a0 + 3001b1e: 0017c793 xori a5,a5,1 + 3001b22: 9f81 uxtb a5 + 3001b24: cb91 beqz a5,3001b38 + 3001b26: 04e00593 li a1,78 + 3001b2a: 030067b7 lui a5,0x3006 + 3001b2e: 44478513 addi a0,a5,1092 # 3006444 + 3001b32: 2eb5 jal ra,3001eae + 3001b34: 4785 li a5,1 + 3001b36: aa3d j 3001c74 + ADC_ASSERT_PARAM(socParam != NULL); + 3001b38: fe442783 lw a5,-28(s0) + 3001b3c: eb89 bnez a5,3001b4e + 3001b3e: 04f00593 li a1,79 + 3001b42: 030067b7 lui a5,0x3006 + 3001b46: 44478513 addi a0,a5,1092 # 3006444 + 3001b4a: 2695 jal ra,3001eae + 3001b4c: a001 j 3001b4c + ADC_PARAM_CHECK_WITH_RET(IsADCSampleChannel(socParam->adcInput) == true, BASE_STATUS_ERROR); + 3001b4e: fe442783 lw a5,-28(s0) + 3001b52: 439c lw a5,0(a5) + 3001b54: 853e mv a0,a5 + 3001b56: eb6ff0ef jal ra,300120c + 3001b5a: 87aa mv a5,a0 + 3001b5c: 0017c793 xori a5,a5,1 + 3001b60: 9f81 uxtb a5 + 3001b62: cb91 beqz a5,3001b76 + 3001b64: 05000593 li a1,80 + 3001b68: 030067b7 lui a5,0x3006 + 3001b6c: 44478513 addi a0,a5,1092 # 3006444 + 3001b70: 2e3d jal ra,3001eae + 3001b72: 4785 li a5,1 + 3001b74: a201 j 3001c74 + ADC_PARAM_CHECK_WITH_RET(IsADCTotalTime(socParam->sampleTotalTime) == true, BASE_STATUS_ERROR); + 3001b76: fe442783 lw a5,-28(s0) + 3001b7a: 43dc lw a5,4(a5) + 3001b7c: 853e mv a0,a5 + 3001b7e: f48ff0ef jal ra,30012c6 + 3001b82: 87aa mv a5,a0 + 3001b84: 0017c793 xori a5,a5,1 + 3001b88: 9f81 uxtb a5 + 3001b8a: cb91 beqz a5,3001b9e + 3001b8c: 05100593 li a1,81 + 3001b90: 030067b7 lui a5,0x3006 + 3001b94: 44478513 addi a0,a5,1092 # 3006444 + 3001b98: 2e19 jal ra,3001eae + 3001b9a: 4785 li a5,1 + 3001b9c: a8e1 j 3001c74 + ADC_PARAM_CHECK_WITH_RET(IsADCTrigSource(socParam->trigSource) == true, BASE_STATUS_ERROR); + 3001b9e: fe442783 lw a5,-28(s0) + 3001ba2: 479c lw a5,8(a5) + 3001ba4: 853e mv a0,a5 + 3001ba6: ebaff0ef jal ra,3001260 + 3001baa: 87aa mv a5,a0 + 3001bac: 0017c793 xori a5,a5,1 + 3001bb0: 9f81 uxtb a5 + 3001bb2: cb91 beqz a5,3001bc6 + 3001bb4: 05200593 li a1,82 + 3001bb8: 030067b7 lui a5,0x3006 + 3001bbc: 44478513 addi a0,a5,1092 # 3006444 + 3001bc0: 24fd jal ra,3001eae + 3001bc2: 4785 li a5,1 + 3001bc4: a845 j 3001c74 + ADC_PARAM_CHECK_WITH_RET(IsADCFinishMode(socParam->finishMode) == true, BASE_STATUS_ERROR); + 3001bc6: fe442783 lw a5,-28(s0) + 3001bca: 4b9c lw a5,16(a5) + 3001bcc: 853e mv a0,a5 + 3001bce: eaeff0ef jal ra,300127c + 3001bd2: 87aa mv a5,a0 + 3001bd4: 0017c793 xori a5,a5,1 + 3001bd8: 9f81 uxtb a5 + 3001bda: cb91 beqz a5,3001bee + 3001bdc: 05300593 li a1,83 + 3001be0: 030067b7 lui a5,0x3006 + 3001be4: 44478513 addi a0,a5,1092 # 3006444 + 3001be8: 24d9 jal ra,3001eae + 3001bea: 4785 li a5,1 + 3001bec: a061 j 3001c74 + DCL_ADC_SOCxSelectChannel(adcHandle->baseAddress, soc, socParam->adcInput); /* Set channel */ + 3001bee: fec42783 lw a5,-20(s0) + 3001bf2: 4398 lw a4,0(a5) + 3001bf4: fe442783 lw a5,-28(s0) + 3001bf8: 439c lw a5,0(a5) + 3001bfa: 863e mv a2,a5 + 3001bfc: fe842583 lw a1,-24(s0) + 3001c00: 853a mv a0,a4 + 3001c02: 32c9 jal ra,30015c4 + DCL_ADC_SOCxSetAcqps(adcHandle->baseAddress, soc, socParam->sampleTotalTime); /* Set sampling time */ + 3001c04: fec42783 lw a5,-20(s0) + 3001c08: 4398 lw a4,0(a5) + 3001c0a: fe442783 lw a5,-28(s0) + 3001c0e: 43dc lw a5,4(a5) + 3001c10: 863e mv a2,a5 + 3001c12: fe842583 lw a1,-24(s0) + 3001c16: 853a mv a0,a4 + 3001c18: 3601 jal ra,3001718 + DCL_ADC_SOCxSelcetTrigSource(adcHandle->baseAddress, soc, socParam->trigSource); /* Set trigger source */ + 3001c1a: fec42783 lw a5,-20(s0) + 3001c1e: 4398 lw a4,0(a5) + 3001c20: fe442783 lw a5,-28(s0) + 3001c24: 479c lw a5,8(a5) + 3001c26: 863e mv a2,a5 + 3001c28: fe842583 lw a1,-24(s0) + 3001c2c: 853a mv a0,a4 + 3001c2e: 3491 jal ra,3001672 + if (socParam->continueMode == true) { /* Continuous Mode Judgment */ + 3001c30: fe442783 lw a5,-28(s0) + 3001c34: 27dc lbu a5,12(a5) + 3001c36: cb89 beqz a5,3001c48 + DCL_ADC_EnableSOCxContinue(adcHandle->baseAddress, soc); + 3001c38: fec42783 lw a5,-20(s0) + 3001c3c: 439c lw a5,0(a5) + 3001c3e: fe842583 lw a1,-24(s0) + 3001c42: 853e mv a0,a5 + 3001c44: 39e1 jal ra,300191c + 3001c46: a801 j 3001c56 + } else { + DCL_ADC_DisableSOCxContinue(adcHandle->baseAddress, soc); + 3001c48: fec42783 lw a5,-20(s0) + 3001c4c: 439c lw a5,0(a5) + 3001c4e: fe842583 lw a1,-24(s0) + 3001c52: 853e mv a0,a5 + 3001c54: 3399 jal ra,300199a + } + adcHandle->ADC_SOCxParam[soc].finishMode = socParam->finishMode; + 3001c56: fe442783 lw a5,-28(s0) + 3001c5a: 4b9c lw a5,16(a5) + 3001c5c: 01079713 slli a4,a5,0x10 + 3001c60: 8341 srli a4,a4,0x10 + 3001c62: fec42683 lw a3,-20(s0) + 3001c66: fe842783 lw a5,-24(s0) + 3001c6a: 07a1 addi a5,a5,8 + 3001c6c: 0786 slli a5,a5,0x1 + 3001c6e: 97b6 add a5,a5,a3 + 3001c70: a3da sh a4,4(a5) + return BASE_STATUS_OK; + 3001c72: 4781 li a5,0 +} + 3001c74: 853e mv a0,a5 + 3001c76: 40f2 lw ra,28(sp) + 3001c78: 4462 lw s0,24(sp) + 3001c7a: 6105 addi sp,sp,32 + 3001c7c: 8082 ret + +03001c7e : + * interrupt is reported. + * @param adcHandle ADC handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_StartIt(ADC_Handle *adcHandle) +{ + 3001c7e: 7179 addi sp,sp,-48 + 3001c80: d606 sw ra,44(sp) + 3001c82: d422 sw s0,40(sp) + 3001c84: 1800 addi s0,sp,48 + 3001c86: fca42e23 sw a0,-36(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001c8a: fdc42783 lw a5,-36(s0) + 3001c8e: eb89 bnez a5,3001ca0 + 3001c90: 0af00593 li a1,175 + 3001c94: 030067b7 lui a5,0x3006 + 3001c98: 44478513 addi a0,a5,1092 # 3006444 + 3001c9c: 2c09 jal ra,3001eae + 3001c9e: a001 j 3001c9e + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001ca0: fdc42783 lw a5,-36(s0) + 3001ca4: 4398 lw a4,0(a5) + 3001ca6: 180007b7 lui a5,0x18000 + 3001caa: 00f70a63 beq a4,a5,3001cbe + 3001cae: 0b000593 li a1,176 + 3001cb2: 030067b7 lui a5,0x3006 + 3001cb6: 44478513 addi a0,a5,1092 # 3006444 + 3001cba: 2ad5 jal ra,3001eae + 3001cbc: a001 j 3001cbc + unsigned int intVal = 0; + 3001cbe: fe042423 sw zero,-24(s0) + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001cc2: fe042623 sw zero,-20(s0) + 3001cc6: a859 j 3001d5c + intVal = adcHandle->ADC_SOCxParam[i].finishMode; + 3001cc8: fdc42703 lw a4,-36(s0) + 3001ccc: fec42783 lw a5,-20(s0) + 3001cd0: 07a1 addi a5,a5,8 + 3001cd2: 0786 slli a5,a5,0x1 + 3001cd4: 97ba add a5,a5,a4 + 3001cd6: 23de lhu a5,4(a5) + 3001cd8: fef42423 sw a5,-24(s0) + switch (intVal) { + 3001cdc: fe842783 lw a5,-24(s0) + 3001ce0: 4711 li a4,4 + 3001ce2: 02e78a63 beq a5,a4,3001d16 + 3001ce6: 4711 li a4,4 + 3001ce8: 00f76663 bltu a4,a5,3001cf4 + 3001cec: 470d li a4,3 + 3001cee: 00e78a63 beq a5,a4,3001d02 + break; + case ADC_SOCFINISH_INT3: + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + break; + default: + break; + 3001cf2: a085 j 3001d52 + switch (intVal) { + 3001cf4: 4715 li a4,5 + 3001cf6: 02e78a63 beq a5,a4,3001d2a + 3001cfa: 4719 li a4,6 + 3001cfc: 04e78163 beq a5,a4,3001d3e + break; + 3001d00: a889 j 3001d52 + DCL_ADC_SetSOCxBlindInt0(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 0 */ + 3001d02: fdc42783 lw a5,-36(s0) + 3001d06: 439c lw a5,0(a5) + 3001d08: fec42703 lw a4,-20(s0) + 3001d0c: 85ba mv a1,a4 + 3001d0e: 853e mv a0,a5 + 3001d10: e16ff0ef jal ra,3001326 + break; + 3001d14: a83d j 3001d52 + DCL_ADC_SetSOCxBlindInt1(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 1 */ + 3001d16: fdc42783 lw a5,-36(s0) + 3001d1a: 439c lw a5,0(a5) + 3001d1c: fec42703 lw a4,-20(s0) + 3001d20: 85ba mv a1,a4 + 3001d22: 853e mv a0,a5 + 3001d24: e7eff0ef jal ra,30013a2 + break; + 3001d28: a02d j 3001d52 + DCL_ADC_SetSOCxBlindInt2(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 2 */ + 3001d2a: fdc42783 lw a5,-36(s0) + 3001d2e: 439c lw a5,0(a5) + 3001d30: fec42703 lw a4,-20(s0) + 3001d34: 85ba mv a1,a4 + 3001d36: 853e mv a0,a5 + 3001d38: ee8ff0ef jal ra,3001420 + break; + 3001d3c: a819 j 3001d52 + DCL_ADC_SetSOCxBlindInt3(adcHandle->baseAddress, i); /* The SOC selects to use interrupt 3 */ + 3001d3e: fdc42783 lw a5,-36(s0) + 3001d42: 439c lw a5,0(a5) + 3001d44: fec42703 lw a4,-20(s0) + 3001d48: 85ba mv a1,a4 + 3001d4a: 853e mv a0,a5 + 3001d4c: f50ff0ef jal ra,300149c + break; + 3001d50: 0001 nop + for (int i = 0; i < SOC_MAX_NUM; i++) { + 3001d52: fec42783 lw a5,-20(s0) + 3001d56: 0785 addi a5,a5,1 + 3001d58: fef42623 sw a5,-20(s0) + 3001d5c: fec42703 lw a4,-20(s0) + 3001d60: 47bd li a5,15 + 3001d62: f6e7d3e3 bge a5,a4,3001cc8 + } + } /* Enable ADC Interrupt */ + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER0); + 3001d66: fdc42783 lw a5,-36(s0) + 3001d6a: 439c lw a5,0(a5) + 3001d6c: 4581 li a1,0 + 3001d6e: 853e mv a0,a5 + 3001d70: faaff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER1); + 3001d74: fdc42783 lw a5,-36(s0) + 3001d78: 439c lw a5,0(a5) + 3001d7a: 4585 li a1,1 + 3001d7c: 853e mv a0,a5 + 3001d7e: f9cff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER2); + 3001d82: fdc42783 lw a5,-36(s0) + 3001d86: 439c lw a5,0(a5) + 3001d88: 4589 li a1,2 + 3001d8a: 853e mv a0,a5 + 3001d8c: f8eff0ef jal ra,300151a + DCL_ADC_EnableIntx(adcHandle->baseAddress, ADC_INT_NUMBER3); + 3001d90: fdc42783 lw a5,-36(s0) + 3001d94: 439c lw a5,0(a5) + 3001d96: 458d li a1,3 + 3001d98: 853e mv a0,a5 + 3001d9a: f80ff0ef jal ra,300151a + return BASE_STATUS_OK; + 3001d9e: 4781 li a5,0 +} + 3001da0: 853e mv a0,a5 + 3001da2: 50b2 lw ra,44(sp) + 3001da4: 5422 lw s0,40(sp) + 3001da6: 6145 addi sp,sp,48 + 3001da8: 8082 ret + +03001daa : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_ADC_SoftTrigSample(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001daa: 1101 addi sp,sp,-32 + 3001dac: ce06 sw ra,28(sp) + 3001dae: cc22 sw s0,24(sp) + 3001db0: 1000 addi s0,sp,32 + 3001db2: fea42623 sw a0,-20(s0) + 3001db6: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001dba: fec42783 lw a5,-20(s0) + 3001dbe: eb89 bnez a5,3001dd0 + 3001dc0: 0e500593 li a1,229 + 3001dc4: 030067b7 lui a5,0x3006 + 3001dc8: 44478513 addi a0,a5,1092 # 3006444 + 3001dcc: 20cd jal ra,3001eae + 3001dce: a001 j 3001dce + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001dd0: fec42783 lw a5,-20(s0) + 3001dd4: 4398 lw a4,0(a5) + 3001dd6: 180007b7 lui a5,0x18000 + 3001dda: 00f70a63 beq a4,a5,3001dee + 3001dde: 0e600593 li a1,230 + 3001de2: 030067b7 lui a5,0x3006 + 3001de6: 44478513 addi a0,a5,1092 # 3006444 + 3001dea: 20d1 jal ra,3001eae + 3001dec: a001 j 3001dec + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001dee: fe842503 lw a0,-24(s0) + 3001df2: c36ff0ef jal ra,3001228 + 3001df6: 87aa mv a5,a0 + 3001df8: 0017c793 xori a5,a5,1 + 3001dfc: 9f81 uxtb a5 + 3001dfe: cb91 beqz a5,3001e12 + 3001e00: 0e700593 li a1,231 + 3001e04: 030067b7 lui a5,0x3006 + 3001e08: 44478513 addi a0,a5,1092 # 3006444 + 3001e0c: 204d jal ra,3001eae + 3001e0e: 4785 li a5,1 + 3001e10: a809 j 3001e22 + DCL_ADC_SOCxSoftTrigger(adcHandle->baseAddress, soc); /* Software triggers a single SOC */ + 3001e12: fec42783 lw a5,-20(s0) + 3001e16: 439c lw a5,0(a5) + 3001e18: fe842583 lw a1,-24(s0) + 3001e1c: 853e mv a0,a5 + 3001e1e: 3265 jal ra,30017c6 + return BASE_STATUS_OK; + 3001e20: 4781 li a5,0 +} + 3001e22: 853e mv a0,a5 + 3001e24: 40f2 lw ra,28(sp) + 3001e26: 4462 lw s0,24(sp) + 3001e28: 6105 addi sp,sp,32 + 3001e2a: 8082 ret + +03001e2c : + * @param adcHandle ADC handle. + * @param soc ID of SOC. + * @retval unsigned int value of ADC convert result. + */ +unsigned int HAL_ADC_GetConvResult(ADC_Handle *adcHandle, unsigned int soc) +{ + 3001e2c: 1101 addi sp,sp,-32 + 3001e2e: ce06 sw ra,28(sp) + 3001e30: cc22 sw s0,24(sp) + 3001e32: 1000 addi s0,sp,32 + 3001e34: fea42623 sw a0,-20(s0) + 3001e38: feb42423 sw a1,-24(s0) + ADC_ASSERT_PARAM(adcHandle != NULL); + 3001e3c: fec42783 lw a5,-20(s0) + 3001e40: eb89 bnez a5,3001e52 + 3001e42: 0f400593 li a1,244 + 3001e46: 030067b7 lui a5,0x3006 + 3001e4a: 44478513 addi a0,a5,1092 # 3006444 + 3001e4e: 2085 jal ra,3001eae + 3001e50: a001 j 3001e50 + ADC_ASSERT_PARAM(IsADCInstance(adcHandle->baseAddress)); + 3001e52: fec42783 lw a5,-20(s0) + 3001e56: 4398 lw a4,0(a5) + 3001e58: 180007b7 lui a5,0x18000 + 3001e5c: 00f70a63 beq a4,a5,3001e70 + 3001e60: 0f500593 li a1,245 + 3001e64: 030067b7 lui a5,0x3006 + 3001e68: 44478513 addi a0,a5,1092 # 3006444 + 3001e6c: 2089 jal ra,3001eae + 3001e6e: a001 j 3001e6e + ADC_PARAM_CHECK_WITH_RET(IsADCSOCx(soc) == true, BASE_STATUS_ERROR); + 3001e70: fe842503 lw a0,-24(s0) + 3001e74: bb4ff0ef jal ra,3001228 + 3001e78: 87aa mv a5,a0 + 3001e7a: 0017c793 xori a5,a5,1 + 3001e7e: 9f81 uxtb a5 + 3001e80: cb91 beqz a5,3001e94 + 3001e82: 0f600593 li a1,246 + 3001e86: 030067b7 lui a5,0x3006 + 3001e8a: 44478513 addi a0,a5,1092 # 3006444 + 3001e8e: 2005 jal ra,3001eae + 3001e90: 4785 li a5,1 + 3001e92: a809 j 3001ea4 + return DCL_ADC_ReadSOCxResult(adcHandle->baseAddress, soc); + 3001e94: fec42783 lw a5,-20(s0) + 3001e98: 439c lw a5,0(a5) + 3001e9a: fe842583 lw a1,-24(s0) + 3001e9e: 853e mv a0,a5 + 3001ea0: 3409 jal ra,30018a2 + 3001ea2: 87aa mv a5,a0 +} + 3001ea4: 853e mv a0,a5 + 3001ea6: 40f2 lw ra,28(sp) + 3001ea8: 4462 lw s0,24(sp) + 3001eaa: 6105 addi sp,sp,32 + 3001eac: 8082 ret + +03001eae : + * @param file Pointer to the name of the file where the error occurs. + * @param line Number of the line where the error occurs. + * @retval None. + */ +__weak void AssertErrorLog(char *file, unsigned int line) +{ + 3001eae: 1101 addi sp,sp,-32 + 3001eb0: ce22 sw s0,28(sp) + 3001eb2: 1000 addi s0,sp,32 + 3001eb4: fea42623 sw a0,-20(s0) + 3001eb8: feb42423 sw a1,-24(s0) + /* Use only if the user apllication is not defined. */ + BASE_FUNC_UNUSED(file); + BASE_FUNC_UNUSED(line); + 3001ebc: 0001 nop + 3001ebe: 4472 lw s0,28(sp) + 3001ec0: 6105 addi sp,sp,32 + 3001ec2: 8082 ret + +03001ec4 : + * @brief Get the systick + * @param None + * @retval The SysTick Value + */ +static inline unsigned int DCL_SYSTICK_GetTick(void) +{ + 3001ec4: 1141 addi sp,sp,-16 + 3001ec6: c622 sw s0,12(sp) + 3001ec8: 0800 addi s0,sp,16 + return SYSTICK->MTIME; /* Systick value(Lower 32bit register) */ + 3001eca: 143807b7 lui a5,0x14380 + 3001ece: 479c lw a5,8(a5) +} + 3001ed0: 853e mv a0,a5 + 3001ed2: 4432 lw s0,12(sp) + 3001ed4: 0141 addi sp,sp,16 + 3001ed6: 8082 ret + +03001ed8 : + * @brief Delay number of us. + * @param us The number of us to delay. + * @retval None. + */ +void BASE_FUNC_DelayUs(unsigned int us) +{ + 3001ed8: 7179 addi sp,sp,-48 + 3001eda: d606 sw ra,44(sp) + 3001edc: d422 sw s0,40(sp) + 3001ede: 1800 addi s0,sp,48 + 3001ee0: fca42e23 sw a0,-36(s0) + unsigned int preTick = DCL_SYSTICK_GetTick(); + 3001ee4: 37c5 jal ra,3001ec4 + 3001ee6: fea42623 sw a0,-20(s0) + unsigned int tickInUs = (SYSTICK_GetCRGHZ() / CRG_FREQ_1MHz) * us; + 3001eea: 8bcff0ef jal ra,3000fa6 + 3001eee: 872a mv a4,a0 + 3001ef0: 000f47b7 lui a5,0xf4 + 3001ef4: 24078793 addi a5,a5,576 # f4240 + 3001ef8: 02f757b3 divu a5,a4,a5 + 3001efc: fdc42703 lw a4,-36(s0) + 3001f00: 02f707b3 mul a5,a4,a5 + 3001f04: fef42423 sw a5,-24(s0) + unsigned int curTick; + unsigned int delta; + + /* Wait until the delta is greater than tickInUs */ + do { + curTick = DCL_SYSTICK_GetTick(); + 3001f08: 3f75 jal ra,3001ec4 + 3001f0a: fea42223 sw a0,-28(s0) + delta = (curTick >= preTick) ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick + 1; + 3001f0e: fe442703 lw a4,-28(s0) + 3001f12: fec42783 lw a5,-20(s0) + 3001f16: 40f707b3 sub a5,a4,a5 + 3001f1a: fef42023 sw a5,-32(s0) + } while (delta < tickInUs); + 3001f1e: fe042703 lw a4,-32(s0) + 3001f22: fe842783 lw a5,-24(s0) + 3001f26: fef761e3 bltu a4,a5,3001f08 +} + 3001f2a: 0001 nop + 3001f2c: 50b2 lw ra,44(sp) + 3001f2e: 5422 lw s0,40(sp) + 3001f30: 6145 addi sp,sp,48 + 3001f32: 8082 ret + +03001f34 : + * @brief Delay number of ms. + * @param ms The number of ms to delay. + * @retval None. + */ +void BASE_FUNC_DelayMs(unsigned int ms) +{ + 3001f34: 7179 addi sp,sp,-48 + 3001f36: d606 sw ra,44(sp) + 3001f38: d422 sw s0,40(sp) + 3001f3a: 1800 addi s0,sp,48 + 3001f3c: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < ms; ++i) { + 3001f40: fe042623 sw zero,-20(s0) + 3001f44: a809 j 3001f56 + BASE_FUNC_DelayUs(BASE_DEFINE_DELAY_US_IN_MS); + 3001f46: 3e800513 li a0,1000 + 3001f4a: 3779 jal ra,3001ed8 + for (unsigned int i = 0; i < ms; ++i) { + 3001f4c: fec42783 lw a5,-20(s0) + 3001f50: 0785 addi a5,a5,1 + 3001f52: fef42623 sw a5,-20(s0) + 3001f56: fec42703 lw a4,-20(s0) + 3001f5a: fdc42783 lw a5,-36(s0) + 3001f5e: fef764e3 bltu a4,a5,3001f46 + } +} + 3001f62: 0001 nop + 3001f64: 50b2 lw ra,44(sp) + 3001f66: 5422 lw s0,40(sp) + 3001f68: 6145 addi sp,sp,48 + 3001f6a: 8082 ret + +03001f6c : + * @brief Delay number of seconds. + * @param seconds The number of seconds to delay. + * @retval None. + */ +void BASE_FUNC_DelaySeconds(unsigned int seconds) +{ + 3001f6c: 7179 addi sp,sp,-48 + 3001f6e: d606 sw ra,44(sp) + 3001f70: d422 sw s0,40(sp) + 3001f72: 1800 addi s0,sp,48 + 3001f74: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < seconds; ++i) { + 3001f78: fe042623 sw zero,-20(s0) + 3001f7c: a809 j 3001f8e + BASE_FUNC_DelayMs(BASE_DEFINE_DELAY_MS_IN_SEC); + 3001f7e: 3e800513 li a0,1000 + 3001f82: 3f4d jal ra,3001f34 + for (unsigned int i = 0; i < seconds; ++i) { + 3001f84: fec42783 lw a5,-20(s0) + 3001f88: 0785 addi a5,a5,1 + 3001f8a: fef42623 sw a5,-20(s0) + 3001f8e: fec42703 lw a4,-20(s0) + 3001f92: fdc42783 lw a5,-36(s0) + 3001f96: fef764e3 bltu a4,a5,3001f7e + } +} + 3001f9a: 0001 nop + 3001f9c: 50b2 lw ra,44(sp) + 3001f9e: 5422 lw s0,40(sp) + 3001fa0: 6145 addi sp,sp,48 + 3001fa2: 8082 ret + +03001fa4 : + * @param delay The number of 'units' to delay. + * @param units Specifies the delay unit. + * @retval None. + */ +void BASE_FUNC_Delay(unsigned int delay, BASE_DelayUnit units) +{ + 3001fa4: 1101 addi sp,sp,-32 + 3001fa6: ce06 sw ra,28(sp) + 3001fa8: cc22 sw s0,24(sp) + 3001faa: 1000 addi s0,sp,32 + 3001fac: fea42623 sw a0,-20(s0) + 3001fb0: feb42423 sw a1,-24(s0) + switch (units) { + 3001fb4: fe842783 lw a5,-24(s0) + 3001fb8: 3e800713 li a4,1000 + 3001fbc: 02e78063 beq a5,a4,3001fdc + 3001fc0: 000f4737 lui a4,0xf4 + 3001fc4: 24070713 addi a4,a4,576 # f4240 + 3001fc8: 00e78e63 beq a5,a4,3001fe4 + 3001fcc: 4705 li a4,1 + 3001fce: 00e78363 beq a5,a4,3001fd4 + break; + case BASE_DEFINE_DELAY_MICROSECS: + BASE_FUNC_DelayUs(delay); + break; + default: + break; + 3001fd2: a829 j 3001fec + BASE_FUNC_DelaySeconds(delay); + 3001fd4: fec42503 lw a0,-20(s0) + 3001fd8: 3f51 jal ra,3001f6c + break; + 3001fda: a809 j 3001fec + BASE_FUNC_DelayMs(delay); + 3001fdc: fec42503 lw a0,-20(s0) + 3001fe0: 3f91 jal ra,3001f34 + break; + 3001fe2: a029 j 3001fec + BASE_FUNC_DelayUs(delay); + 3001fe4: fec42503 lw a0,-20(s0) + 3001fe8: 3dc5 jal ra,3001ed8 + break; + 3001fea: 0001 nop + } + return; + 3001fec: 0001 nop + 3001fee: 40f2 lw ra,28(sp) + 3001ff0: 4462 lw s0,24(sp) + 3001ff2: 6105 addi sp,sp,32 + 3001ff4: 8082 ret + +03001ff6 : + * @brief Clear external interrupt + * @param irqNum external interrupt number + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_NOT_CREATED + */ +static inline void IRQ_ClearN(unsigned int irqNum) +{ + 3001ff6: 1101 addi sp,sp,-32 + 3001ff8: ce22 sw s0,28(sp) + 3001ffa: 1000 addi s0,sp,32 + 3001ffc: fea42623 sw a0,-20(s0) + asm volatile("fence"); + 3002000: 0ff0000f fence + WRITE_CUSTOM_CSR_VAL(LOCIPCLR, irqNum); + 3002004: fec42783 lw a5,-20(s0) + 3002008: 82be mv t0,a5 + 300200a: bf029073 csrw 0xbf0,t0 +} + 300200e: 0001 nop + 3002010: 4472 lw s0,28(sp) + 3002012: 6105 addi sp,sp,32 + 3002014: 8082 ret + +03002016 : + * @brief Exception/Interrupt Handler Entry. + * @param irqNum external interrupt number. + * @retval None + */ +void InterruptEntry(unsigned int irqNum) +{ + 3002016: 1101 addi sp,sp,-32 + 3002018: ce06 sw ra,28(sp) + 300201a: cc22 sw s0,24(sp) + 300201c: 1000 addi s0,sp,32 + 300201e: fea42623 sw a0,-20(s0) + g_irqCallbackFunc[irqNum].pfnHandler(g_irqCallbackFunc[irqNum].param); + 3002022: 040007b7 lui a5,0x4000 + 3002026: 0fc78713 addi a4,a5,252 # 40000fc + 300202a: fec42783 lw a5,-20(s0) + 300202e: 078e slli a5,a5,0x3 + 3002030: 97ba add a5,a5,a4 + 3002032: 4394 lw a3,0(a5) + 3002034: 040007b7 lui a5,0x4000 + 3002038: 0fc78713 addi a4,a5,252 # 40000fc + 300203c: fec42783 lw a5,-20(s0) + 3002040: 078e slli a5,a5,0x3 + 3002042: 97ba add a5,a5,a4 + 3002044: 43dc lw a5,4(a5) + 3002046: 853e mv a0,a5 + 3002048: 9682 jalr a3 + IRQ_ClearN(irqNum); + 300204a: fec42503 lw a0,-20(s0) + 300204e: 3765 jal ra,3001ff6 +} + 3002050: 0001 nop + 3002052: 40f2 lw ra,28(sp) + 3002054: 4462 lw s0,24(sp) + 3002056: 6105 addi sp,sp,32 + 3002058: 8082 ret + +0300205a : + * @brief Irq initialization. + * @param none. + * @retval None + */ +void IRQ_Init(void) +{ + 300205a: 1101 addi sp,sp,-32 + 300205c: ce22 sw s0,28(sp) + 300205e: 1000 addi s0,sp,32 + unsigned int index; + + for (index = 0; index < IRQ_MAX; index++) { + 3002060: fe042623 sw zero,-20(s0) + 3002064: a82d j 300209e + g_irqCallbackFunc[index].pfnHandler = IRQ_DummyHandler; + 3002066: 040007b7 lui a5,0x4000 + 300206a: 0fc78713 addi a4,a5,252 # 40000fc + 300206e: fec42783 lw a5,-20(s0) + 3002072: 078e slli a5,a5,0x3 + 3002074: 97ba add a5,a5,a4 + 3002076: 03003737 lui a4,0x3003 + 300207a: 8fa70713 addi a4,a4,-1798 # 30028fa + 300207e: c398 sw a4,0(a5) + g_irqCallbackFunc[index].param = NULL; + 3002080: 040007b7 lui a5,0x4000 + 3002084: 0fc78713 addi a4,a5,252 # 40000fc + 3002088: fec42783 lw a5,-20(s0) + 300208c: 078e slli a5,a5,0x3 + 300208e: 97ba add a5,a5,a4 + 3002090: 0007a223 sw zero,4(a5) + for (index = 0; index < IRQ_MAX; index++) { + 3002094: fec42783 lw a5,-20(s0) + 3002098: 0785 addi a5,a5,1 + 300209a: fef42623 sw a5,-20(s0) + 300209e: fec42703 lw a4,-20(s0) + 30020a2: 07200793 li a5,114 + 30020a6: fce7f0e3 bgeu a5,a4,3002066 + } +} + 30020aa: 0001 nop + 30020ac: 4472 lw s0,28(sp) + 30020ae: 6105 addi sp,sp,32 + 30020b0: 8082 ret + +030020b2 : + * @note In the corresponding interrupt handler, manually clear the interrupt source and the corresponding interrupt + * flag bit (call the IRQ_ClearN function to clear the interrupt), otherwise the interrupt will always be + * triggered. + */ +unsigned int IRQ_Register(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 30020b2: 1101 addi sp,sp,-32 + 30020b4: ce06 sw ra,28(sp) + 30020b6: cc22 sw s0,24(sp) + 30020b8: 1000 addi s0,sp,32 + 30020ba: fea42623 sw a0,-20(s0) + 30020be: feb42423 sw a1,-24(s0) + 30020c2: fec42223 sw a2,-28(s0) + INTERRUPT_ASSERT_PARAM(func != NULL); + 30020c6: fe842783 lw a5,-24(s0) + 30020ca: eb89 bnez a5,30020dc + 30020cc: 06300593 li a1,99 + 30020d0: 030067b7 lui a5,0x3006 + 30020d4: 47878513 addi a0,a5,1144 # 3006478 + 30020d8: 3bd9 jal ra,3001eae + 30020da: a001 j 30020da + INTERRUPT_PARAM_CHECK_WITH_RET(irqNum < IRQ_MAX, IRQ_ERRNO_NUM_INVALID); + 30020dc: fec42703 lw a4,-20(s0) + 30020e0: 07200793 li a5,114 + 30020e4: 00e7fb63 bgeu a5,a4,30020fa + 30020e8: 06400593 li a1,100 + 30020ec: 030067b7 lui a5,0x3006 + 30020f0: 47878513 addi a0,a5,1144 # 3006478 + 30020f4: 3b6d jal ra,3001eae + 30020f6: 4789 li a5,2 + 30020f8: a81d j 300212e + + if (g_irqCallbackFunc[irqNum].pfnHandler != IRQ_DummyHandler) { + 30020fa: 040007b7 lui a5,0x4000 + 30020fe: 0fc78713 addi a4,a5,252 # 40000fc + 3002102: fec42783 lw a5,-20(s0) + 3002106: 078e slli a5,a5,0x3 + 3002108: 97ba add a5,a5,a4 + 300210a: 4398 lw a4,0(a5) + 300210c: 030037b7 lui a5,0x3003 + 3002110: 8fa78793 addi a5,a5,-1798 # 30028fa + 3002114: 00f70463 beq a4,a5,300211c + return IRQ_ERRNO_ALREADY_CREATED; + 3002118: 478d li a5,3 + 300211a: a811 j 300212e + } + IRQ_SetCallBack(irqNum, func, arg); + 300211c: fe442603 lw a2,-28(s0) + 3002120: fe842583 lw a1,-24(s0) + 3002124: fec42503 lw a0,-20(s0) + 3002128: 7e4000ef jal ra,300290c + return BASE_STATUS_OK; + 300212c: 4781 li a5,0 +} + 300212e: 853e mv a0,a5 + 3002130: 40f2 lw ra,28(sp) + 3002132: 4462 lw s0,24(sp) + 3002134: 6105 addi sp,sp,32 + 3002136: 8082 ret + +03002138 : + * @brief Enable the specified interrupt. + * @param irqNum External interrupt number. + * @retval BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID. + */ +unsigned int IRQ_EnableN(unsigned int irqNum) +{ + 3002138: 7139 addi sp,sp,-64 + 300213a: de06 sw ra,60(sp) + 300213c: dc22 sw s0,56(sp) + 300213e: 0080 addi s0,sp,64 + 3002140: fca42623 sw a0,-52(s0) + unsigned int locienVal; +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 3002144: fcc42703 lw a4,-52(s0) + 3002148: 47e5 li a5,25 + 300214a: 00e7f863 bgeu a5,a4,300215a + 300214e: fcc42703 lw a4,-52(s0) + 3002152: 07200793 li a5,114 + 3002156: 00e7fb63 bgeu a5,a4,300216c + 300215a: 0c300593 li a1,195 + 300215e: 030067b7 lui a5,0x3006 + 3002162: 47878513 addi a0,a5,1144 # 3006478 + 3002166: 33a1 jal ra,3001eae + 3002168: 4789 li a5,2 + 300216a: a8cd j 300225c + /* The interrupt enable bits that can be controlled in the mie register (32 bits), up to 32 + can be controlled, and each bit corresponds to an interrupt enable */ + + RISCV_PRIV_MODE_SWITCH(priv); + + if (irqNum < IRQ_MIE_TOTAL_CNT) { + 300216c: fcc42703 lw a4,-52(s0) + 3002170: 47fd li a5,31 + 3002172: 02e7e063 bltu a5,a4,3002192 + irqOrder = 1U << irqNum; + 3002176: 4705 li a4,1 + 3002178: fcc42783 lw a5,-52(s0) + 300217c: 00f717b3 sll a5,a4,a5 + 3002180: fef42623 sw a5,-20(s0) + SET_CSR(mie, irqOrder); + 3002184: fec42783 lw a5,-20(s0) + 3002188: 3047a7f3 csrrs a5,mie,a5 + 300218c: fcf42c23 sw a5,-40(s0) + 3002190: a0e9 j 300225a + } else if (irqNum < IRQ_LOCIEN1_OFFSET) { + 3002192: fcc42703 lw a4,-52(s0) + 3002196: 03f00793 li a5,63 + 300219a: 02e7ef63 bltu a5,a4,30021d8 + irqOrder = irqNum - IRQ_MIE_TOTAL_CNT; + 300219e: fcc42783 lw a5,-52(s0) + 30021a2: 1781 addi a5,a5,-32 + 30021a4: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN0); + 30021a8: be0027f3 csrr a5,0xbe0 + 30021ac: fcf42e23 sw a5,-36(s0) + 30021b0: fdc42783 lw a5,-36(s0) + 30021b4: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 30021b8: 4705 li a4,1 + 30021ba: fec42783 lw a5,-20(s0) + 30021be: 00f717b3 sll a5,a4,a5 + 30021c2: fe442703 lw a4,-28(s0) + 30021c6: 8fd9 or a5,a5,a4 + 30021c8: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN0, locienVal); + 30021cc: fe442783 lw a5,-28(s0) + 30021d0: 82be mv t0,a5 + 30021d2: be029073 csrw 0xbe0,t0 + 30021d6: a051 j 300225a + } else if (irqNum < IRQ_LOCIEN2_OFFSET) { + 30021d8: fcc42703 lw a4,-52(s0) + 30021dc: 05f00793 li a5,95 + 30021e0: 04e7e063 bltu a5,a4,3002220 + irqOrder = irqNum - IRQ_LOCIEN1_OFFSET; + 30021e4: fcc42783 lw a5,-52(s0) + 30021e8: fc078793 addi a5,a5,-64 + 30021ec: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN1); + 30021f0: be1027f3 csrr a5,0xbe1 + 30021f4: fef42023 sw a5,-32(s0) + 30021f8: fe042783 lw a5,-32(s0) + 30021fc: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 3002200: 4705 li a4,1 + 3002202: fec42783 lw a5,-20(s0) + 3002206: 00f717b3 sll a5,a4,a5 + 300220a: fe442703 lw a4,-28(s0) + 300220e: 8fd9 or a5,a5,a4 + 3002210: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN1, locienVal); + 3002214: fe442783 lw a5,-28(s0) + 3002218: 82be mv t0,a5 + 300221a: be129073 csrw 0xbe1,t0 + 300221e: a835 j 300225a + } else { + irqOrder = irqNum - IRQ_LOCIEN2_OFFSET; + 3002220: fcc42783 lw a5,-52(s0) + 3002224: fa078793 addi a5,a5,-96 + 3002228: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN2); + 300222c: be2027f3 csrr a5,0xbe2 + 3002230: fef42423 sw a5,-24(s0) + 3002234: fe842783 lw a5,-24(s0) + 3002238: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 300223c: 4705 li a4,1 + 300223e: fec42783 lw a5,-20(s0) + 3002242: 00f717b3 sll a5,a4,a5 + 3002246: fe442703 lw a4,-28(s0) + 300224a: 8fd9 or a5,a5,a4 + 300224c: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN2, locienVal); + 3002250: fe442783 lw a5,-28(s0) + 3002254: 82be mv t0,a5 + 3002256: be229073 csrw 0xbe2,t0 + } + + RISCV_PRIV_MODE_SWITCH(priv); + + return BASE_STATUS_OK; + 300225a: 4781 li a5,0 +} + 300225c: 853e mv a0,a5 + 300225e: 50f2 lw ra,60(sp) + 3002260: 5462 lw s0,56(sp) + 3002262: 6121 addi sp,sp,64 + 3002264: 8082 ret + +03002266 : + * @param context. + * @note The actual code is generated by IDE + * @retval None. + */ +__weak void SysErrPrint(const SyserrContext *context) +{ + 3002266: 1101 addi sp,sp,-32 + 3002268: ce22 sw s0,28(sp) + 300226a: 1000 addi s0,sp,32 + 300226c: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(context); +} + 3002270: 0001 nop + 3002272: 4472 lw s0,28(sp) + 3002274: 6105 addi sp,sp,32 + 3002276: 8082 ret + +03002278 : + * @brief System error completion processing + * @param None. + * @retval None. + */ +static void SysErrFinish(void) +{ + 3002278: 1141 addi sp,sp,-16 + 300227a: c622 sw s0,12(sp) + 300227c: 0800 addi s0,sp,16 +} + 300227e: 0001 nop + 3002280: 4432 lw s0,12(sp) + 3002282: 0141 addi sp,sp,16 + 3002284: 8082 ret + +03002286 : + * @brief Exception Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrExcEntry(const SyserrContext *context) +{ + 3002286: 1101 addi sp,sp,-32 + 3002288: ce06 sw ra,28(sp) + 300228a: cc22 sw s0,24(sp) + 300228c: 1000 addi s0,sp,32 + 300228e: fea42623 sw a0,-20(s0) + SysErrPrint(context); + 3002292: fec42503 lw a0,-20(s0) + 3002296: 3fc1 jal ra,3002266 + SysErrFinish(); + 3002298: 37c5 jal ra,3002278 +} + 300229a: 0001 nop + 300229c: 40f2 lw ra,28(sp) + 300229e: 4462 lw s0,24(sp) + 30022a0: 6105 addi sp,sp,32 + 30022a2: 8082 ret + +030022a4 : + * @brief NMI Interrupt Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrNmiEntry(const SyserrContext *context) +{ + 30022a4: 1101 addi sp,sp,-32 + 30022a6: ce06 sw ra,28(sp) + 30022a8: cc22 sw s0,24(sp) + 30022aa: 1000 addi s0,sp,32 + 30022ac: fea42623 sw a0,-20(s0) + INTERRUPT_ASSERT_PARAM(context != NULL); + 30022b0: fec42783 lw a5,-20(s0) + 30022b4: eb89 bnez a5,30022c6 + 30022b6: 12d00593 li a1,301 + 30022ba: 030067b7 lui a5,0x3006 + 30022be: 47878513 addi a0,a5,1144 # 3006478 + 30022c2: 36f5 jal ra,3001eae + 30022c4: a001 j 30022c4 + SysErrPrint(context); + 30022c6: fec42503 lw a0,-20(s0) + 30022ca: 3f71 jal ra,3002266 + SysErrFinish(); + 30022cc: 3775 jal ra,3002278 +} + 30022ce: 0001 nop + 30022d0: 40f2 lw ra,28(sp) + 30022d2: 4462 lw s0,24(sp) + 30022d4: 6105 addi sp,sp,32 + 30022d6: 8082 ret + +030022d8 : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior local int prioroty. + * @retval None + */ +static void SetLocalIntNumPri(unsigned int intNum, unsigned int interPriNum, unsigned int prior) +{ + 30022d8: 711d addi sp,sp,-96 + 30022da: cea2 sw s0,92(sp) + 30022dc: 1080 addi s0,sp,96 + 30022de: faa42623 sw a0,-84(s0) + 30022e2: fab42423 sw a1,-88(s0) + 30022e6: fac42223 sw a2,-92(s0) + switch (intNum) { + 30022ea: fac42783 lw a5,-84(s0) + 30022ee: 17e1 addi a5,a5,-8 + 30022f0: 471d li a4,7 + 30022f2: 2af76363 bltu a4,a5,3002598 + 30022f6: 00279713 slli a4,a5,0x2 + 30022fa: 030067b7 lui a5,0x3006 + 30022fe: 49878793 addi a5,a5,1176 # 3006498 + 3002302: 97ba add a5,a5,a4 + 3002304: 439c lw a5,0(a5) + 3002306: 8782 jr a5 + case 8: /* GROUP8 */ + SET_LOCAL_INTER_NUM_PRI(8, interPriNum, prior); + 3002308: bc8027f3 csrr a5,0xbc8 + 300230c: faf42a23 sw a5,-76(s0) + 3002310: fb442783 lw a5,-76(s0) + 3002314: faf42823 sw a5,-80(s0) + 3002318: fa842783 lw a5,-88(s0) + 300231c: 078a slli a5,a5,0x2 + 300231e: 8bf1 andi a5,a5,28 + 3002320: 473d li a4,15 + 3002322: 00f717b3 sll a5,a4,a5 + 3002326: fff7c793 not a5,a5 + 300232a: fb042703 lw a4,-80(s0) + 300232e: 8ff9 and a5,a5,a4 + 3002330: faf42823 sw a5,-80(s0) + 3002334: fa842783 lw a5,-88(s0) + 3002338: 078a slli a5,a5,0x2 + 300233a: 8bf1 andi a5,a5,28 + 300233c: fa442703 lw a4,-92(s0) + 3002340: 00f717b3 sll a5,a4,a5 + 3002344: fb042703 lw a4,-80(s0) + 3002348: 8fd9 or a5,a5,a4 + 300234a: faf42823 sw a5,-80(s0) + 300234e: fb042783 lw a5,-80(s0) + 3002352: 82be mv t0,a5 + 3002354: bc829073 csrw 0xbc8,t0 + break; + 3002358: a489 j 300259a + case 9: /* GROUP9 */ + SET_LOCAL_INTER_NUM_PRI(9, interPriNum, prior); + 300235a: bc9027f3 csrr a5,0xbc9 + 300235e: faf42e23 sw a5,-68(s0) + 3002362: fbc42783 lw a5,-68(s0) + 3002366: faf42c23 sw a5,-72(s0) + 300236a: fa842783 lw a5,-88(s0) + 300236e: 078a slli a5,a5,0x2 + 3002370: 8bf1 andi a5,a5,28 + 3002372: 473d li a4,15 + 3002374: 00f717b3 sll a5,a4,a5 + 3002378: fff7c793 not a5,a5 + 300237c: fb842703 lw a4,-72(s0) + 3002380: 8ff9 and a5,a5,a4 + 3002382: faf42c23 sw a5,-72(s0) + 3002386: fa842783 lw a5,-88(s0) + 300238a: 078a slli a5,a5,0x2 + 300238c: 8bf1 andi a5,a5,28 + 300238e: fa442703 lw a4,-92(s0) + 3002392: 00f717b3 sll a5,a4,a5 + 3002396: fb842703 lw a4,-72(s0) + 300239a: 8fd9 or a5,a5,a4 + 300239c: faf42c23 sw a5,-72(s0) + 30023a0: fb842783 lw a5,-72(s0) + 30023a4: 82be mv t0,a5 + 30023a6: bc929073 csrw 0xbc9,t0 + break; + 30023aa: aac5 j 300259a + case 10: /* GROUP10 */ + SET_LOCAL_INTER_NUM_PRI(10, interPriNum, prior); + 30023ac: bca027f3 csrr a5,0xbca + 30023b0: fcf42223 sw a5,-60(s0) + 30023b4: fc442783 lw a5,-60(s0) + 30023b8: fcf42023 sw a5,-64(s0) + 30023bc: fa842783 lw a5,-88(s0) + 30023c0: 078a slli a5,a5,0x2 + 30023c2: 8bf1 andi a5,a5,28 + 30023c4: 473d li a4,15 + 30023c6: 00f717b3 sll a5,a4,a5 + 30023ca: fff7c793 not a5,a5 + 30023ce: fc042703 lw a4,-64(s0) + 30023d2: 8ff9 and a5,a5,a4 + 30023d4: fcf42023 sw a5,-64(s0) + 30023d8: fa842783 lw a5,-88(s0) + 30023dc: 078a slli a5,a5,0x2 + 30023de: 8bf1 andi a5,a5,28 + 30023e0: fa442703 lw a4,-92(s0) + 30023e4: 00f717b3 sll a5,a4,a5 + 30023e8: fc042703 lw a4,-64(s0) + 30023ec: 8fd9 or a5,a5,a4 + 30023ee: fcf42023 sw a5,-64(s0) + 30023f2: fc042783 lw a5,-64(s0) + 30023f6: 82be mv t0,a5 + 30023f8: bca29073 csrw 0xbca,t0 + break; + 30023fc: aa79 j 300259a + case 11: /* GROUP11 */ + SET_LOCAL_INTER_NUM_PRI(11, interPriNum, prior); + 30023fe: bcb027f3 csrr a5,0xbcb + 3002402: fcf42623 sw a5,-52(s0) + 3002406: fcc42783 lw a5,-52(s0) + 300240a: fcf42423 sw a5,-56(s0) + 300240e: fa842783 lw a5,-88(s0) + 3002412: 078a slli a5,a5,0x2 + 3002414: 8bf1 andi a5,a5,28 + 3002416: 473d li a4,15 + 3002418: 00f717b3 sll a5,a4,a5 + 300241c: fff7c793 not a5,a5 + 3002420: fc842703 lw a4,-56(s0) + 3002424: 8ff9 and a5,a5,a4 + 3002426: fcf42423 sw a5,-56(s0) + 300242a: fa842783 lw a5,-88(s0) + 300242e: 078a slli a5,a5,0x2 + 3002430: 8bf1 andi a5,a5,28 + 3002432: fa442703 lw a4,-92(s0) + 3002436: 00f717b3 sll a5,a4,a5 + 300243a: fc842703 lw a4,-56(s0) + 300243e: 8fd9 or a5,a5,a4 + 3002440: fcf42423 sw a5,-56(s0) + 3002444: fc842783 lw a5,-56(s0) + 3002448: 82be mv t0,a5 + 300244a: bcb29073 csrw 0xbcb,t0 + break; + 300244e: a2b1 j 300259a + case 12: /* GROUP12 */ + SET_LOCAL_INTER_NUM_PRI(12, interPriNum, prior); + 3002450: bcc027f3 csrr a5,0xbcc + 3002454: fcf42a23 sw a5,-44(s0) + 3002458: fd442783 lw a5,-44(s0) + 300245c: fcf42823 sw a5,-48(s0) + 3002460: fa842783 lw a5,-88(s0) + 3002464: 078a slli a5,a5,0x2 + 3002466: 8bf1 andi a5,a5,28 + 3002468: 473d li a4,15 + 300246a: 00f717b3 sll a5,a4,a5 + 300246e: fff7c793 not a5,a5 + 3002472: fd042703 lw a4,-48(s0) + 3002476: 8ff9 and a5,a5,a4 + 3002478: fcf42823 sw a5,-48(s0) + 300247c: fa842783 lw a5,-88(s0) + 3002480: 078a slli a5,a5,0x2 + 3002482: 8bf1 andi a5,a5,28 + 3002484: fa442703 lw a4,-92(s0) + 3002488: 00f717b3 sll a5,a4,a5 + 300248c: fd042703 lw a4,-48(s0) + 3002490: 8fd9 or a5,a5,a4 + 3002492: fcf42823 sw a5,-48(s0) + 3002496: fd042783 lw a5,-48(s0) + 300249a: 82be mv t0,a5 + 300249c: bcc29073 csrw 0xbcc,t0 + break; + 30024a0: a8ed j 300259a + case 13: /* GROUP13 */ + SET_LOCAL_INTER_NUM_PRI(13, interPriNum, prior); + 30024a2: bcd027f3 csrr a5,0xbcd + 30024a6: fcf42e23 sw a5,-36(s0) + 30024aa: fdc42783 lw a5,-36(s0) + 30024ae: fcf42c23 sw a5,-40(s0) + 30024b2: fa842783 lw a5,-88(s0) + 30024b6: 078a slli a5,a5,0x2 + 30024b8: 8bf1 andi a5,a5,28 + 30024ba: 473d li a4,15 + 30024bc: 00f717b3 sll a5,a4,a5 + 30024c0: fff7c793 not a5,a5 + 30024c4: fd842703 lw a4,-40(s0) + 30024c8: 8ff9 and a5,a5,a4 + 30024ca: fcf42c23 sw a5,-40(s0) + 30024ce: fa842783 lw a5,-88(s0) + 30024d2: 078a slli a5,a5,0x2 + 30024d4: 8bf1 andi a5,a5,28 + 30024d6: fa442703 lw a4,-92(s0) + 30024da: 00f717b3 sll a5,a4,a5 + 30024de: fd842703 lw a4,-40(s0) + 30024e2: 8fd9 or a5,a5,a4 + 30024e4: fcf42c23 sw a5,-40(s0) + 30024e8: fd842783 lw a5,-40(s0) + 30024ec: 82be mv t0,a5 + 30024ee: bcd29073 csrw 0xbcd,t0 + break; + 30024f2: a065 j 300259a + case 14: /* GROUP14 */ + SET_LOCAL_INTER_NUM_PRI(14, interPriNum, prior); + 30024f4: bce027f3 csrr a5,0xbce + 30024f8: fef42223 sw a5,-28(s0) + 30024fc: fe442783 lw a5,-28(s0) + 3002500: fef42023 sw a5,-32(s0) + 3002504: fa842783 lw a5,-88(s0) + 3002508: 078a slli a5,a5,0x2 + 300250a: 8bf1 andi a5,a5,28 + 300250c: 473d li a4,15 + 300250e: 00f717b3 sll a5,a4,a5 + 3002512: fff7c793 not a5,a5 + 3002516: fe042703 lw a4,-32(s0) + 300251a: 8ff9 and a5,a5,a4 + 300251c: fef42023 sw a5,-32(s0) + 3002520: fa842783 lw a5,-88(s0) + 3002524: 078a slli a5,a5,0x2 + 3002526: 8bf1 andi a5,a5,28 + 3002528: fa442703 lw a4,-92(s0) + 300252c: 00f717b3 sll a5,a4,a5 + 3002530: fe042703 lw a4,-32(s0) + 3002534: 8fd9 or a5,a5,a4 + 3002536: fef42023 sw a5,-32(s0) + 300253a: fe042783 lw a5,-32(s0) + 300253e: 82be mv t0,a5 + 3002540: bce29073 csrw 0xbce,t0 + break; + 3002544: a899 j 300259a + case 15: /* GROUP15 */ + SET_LOCAL_INTER_NUM_PRI(15, interPriNum, prior); + 3002546: bcf027f3 csrr a5,0xbcf + 300254a: fef42623 sw a5,-20(s0) + 300254e: fec42783 lw a5,-20(s0) + 3002552: fef42423 sw a5,-24(s0) + 3002556: fa842783 lw a5,-88(s0) + 300255a: 078a slli a5,a5,0x2 + 300255c: 8bf1 andi a5,a5,28 + 300255e: 473d li a4,15 + 3002560: 00f717b3 sll a5,a4,a5 + 3002564: fff7c793 not a5,a5 + 3002568: fe842703 lw a4,-24(s0) + 300256c: 8ff9 and a5,a5,a4 + 300256e: fef42423 sw a5,-24(s0) + 3002572: fa842783 lw a5,-88(s0) + 3002576: 078a slli a5,a5,0x2 + 3002578: 8bf1 andi a5,a5,28 + 300257a: fa442703 lw a4,-92(s0) + 300257e: 00f717b3 sll a5,a4,a5 + 3002582: fe842703 lw a4,-24(s0) + 3002586: 8fd9 or a5,a5,a4 + 3002588: fef42423 sw a5,-24(s0) + 300258c: fe842783 lw a5,-24(s0) + 3002590: 82be mv t0,a5 + 3002592: bcf29073 csrw 0xbcf,t0 + break; + 3002596: a011 j 300259a + default: + break; + 3002598: 0001 nop + } +} + 300259a: 0001 nop + 300259c: 4476 lw s0,92(sp) + 300259e: 6125 addi sp,sp,96 + 30025a0: 8082 ret + +030025a2 : + * @param interPriNum Local interrupt number, which equals external interrupt number - IRQ_VECTOR_CN. + * @param prior Priority of this local interrupt to be set. + * @retval None. + */ +static void IRQ_SetLocalPriority(unsigned int interPriNum, unsigned int prior) +{ + 30025a2: 7159 addi sp,sp,-112 + 30025a4: d686 sw ra,108(sp) + 30025a6: d4a2 sw s0,104(sp) + 30025a8: 1880 addi s0,sp,112 + 30025aa: f8a42e23 sw a0,-100(s0) + 30025ae: f8b42c23 sw a1,-104(s0) +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + unsigned int priv = IRQ_GetCpuPrivilege(); +#endif + RISCV_PRIV_MODE_SWITCH(priv); + unsigned int intNum = GET_LOCAL_INTER_CONFIGREG_NUM(interPriNum); + 30025b2: f9c42783 lw a5,-100(s0) + 30025b6: 838d srli a5,a5,0x3 + 30025b8: fef42623 sw a5,-20(s0) + switch (intNum) { + 30025bc: fec42703 lw a4,-20(s0) + 30025c0: 479d li a5,7 + 30025c2: 2ae7e563 bltu a5,a4,300286c + 30025c6: fec42783 lw a5,-20(s0) + 30025ca: 00279713 slli a4,a5,0x2 + 30025ce: 030067b7 lui a5,0x3006 + 30025d2: 4b878793 addi a5,a5,1208 # 30064b8 + 30025d6: 97ba add a5,a5,a4 + 30025d8: 439c lw a5,0(a5) + 30025da: 8782 jr a5 + case 0: /* GROUP0 */ + SET_LOCAL_INTER_NUM_PRI(0, interPriNum, prior); + 30025dc: bc0027f3 csrr a5,0xbc0 + 30025e0: faf42823 sw a5,-80(s0) + 30025e4: fb042783 lw a5,-80(s0) + 30025e8: faf42623 sw a5,-84(s0) + 30025ec: f9c42783 lw a5,-100(s0) + 30025f0: 078a slli a5,a5,0x2 + 30025f2: 8bf1 andi a5,a5,28 + 30025f4: 473d li a4,15 + 30025f6: 00f717b3 sll a5,a4,a5 + 30025fa: fff7c793 not a5,a5 + 30025fe: fac42703 lw a4,-84(s0) + 3002602: 8ff9 and a5,a5,a4 + 3002604: faf42623 sw a5,-84(s0) + 3002608: f9c42783 lw a5,-100(s0) + 300260c: 078a slli a5,a5,0x2 + 300260e: 8bf1 andi a5,a5,28 + 3002610: f9842703 lw a4,-104(s0) + 3002614: 00f717b3 sll a5,a4,a5 + 3002618: fac42703 lw a4,-84(s0) + 300261c: 8fd9 or a5,a5,a4 + 300261e: faf42623 sw a5,-84(s0) + 3002622: fac42783 lw a5,-84(s0) + 3002626: 82be mv t0,a5 + 3002628: bc029073 csrw 0xbc0,t0 + break; + 300262c: ac81 j 300287c + case 1: /* GROUP1 */ + SET_LOCAL_INTER_NUM_PRI(1, interPriNum, prior); + 300262e: bc1027f3 csrr a5,0xbc1 + 3002632: faf42c23 sw a5,-72(s0) + 3002636: fb842783 lw a5,-72(s0) + 300263a: faf42a23 sw a5,-76(s0) + 300263e: f9c42783 lw a5,-100(s0) + 3002642: 078a slli a5,a5,0x2 + 3002644: 8bf1 andi a5,a5,28 + 3002646: 473d li a4,15 + 3002648: 00f717b3 sll a5,a4,a5 + 300264c: fff7c793 not a5,a5 + 3002650: fb442703 lw a4,-76(s0) + 3002654: 8ff9 and a5,a5,a4 + 3002656: faf42a23 sw a5,-76(s0) + 300265a: f9c42783 lw a5,-100(s0) + 300265e: 078a slli a5,a5,0x2 + 3002660: 8bf1 andi a5,a5,28 + 3002662: f9842703 lw a4,-104(s0) + 3002666: 00f717b3 sll a5,a4,a5 + 300266a: fb442703 lw a4,-76(s0) + 300266e: 8fd9 or a5,a5,a4 + 3002670: faf42a23 sw a5,-76(s0) + 3002674: fb442783 lw a5,-76(s0) + 3002678: 82be mv t0,a5 + 300267a: bc129073 csrw 0xbc1,t0 + break; + 300267e: aafd j 300287c + case 2: /* GROUP2 */ + SET_LOCAL_INTER_NUM_PRI(2, interPriNum, prior); + 3002680: bc2027f3 csrr a5,0xbc2 + 3002684: fcf42023 sw a5,-64(s0) + 3002688: fc042783 lw a5,-64(s0) + 300268c: faf42e23 sw a5,-68(s0) + 3002690: f9c42783 lw a5,-100(s0) + 3002694: 078a slli a5,a5,0x2 + 3002696: 8bf1 andi a5,a5,28 + 3002698: 473d li a4,15 + 300269a: 00f717b3 sll a5,a4,a5 + 300269e: fff7c793 not a5,a5 + 30026a2: fbc42703 lw a4,-68(s0) + 30026a6: 8ff9 and a5,a5,a4 + 30026a8: faf42e23 sw a5,-68(s0) + 30026ac: f9c42783 lw a5,-100(s0) + 30026b0: 078a slli a5,a5,0x2 + 30026b2: 8bf1 andi a5,a5,28 + 30026b4: f9842703 lw a4,-104(s0) + 30026b8: 00f717b3 sll a5,a4,a5 + 30026bc: fbc42703 lw a4,-68(s0) + 30026c0: 8fd9 or a5,a5,a4 + 30026c2: faf42e23 sw a5,-68(s0) + 30026c6: fbc42783 lw a5,-68(s0) + 30026ca: 82be mv t0,a5 + 30026cc: bc229073 csrw 0xbc2,t0 + break; + 30026d0: a275 j 300287c + case 3: /* GROUP3 */ + SET_LOCAL_INTER_NUM_PRI(3, interPriNum, prior); + 30026d2: bc3027f3 csrr a5,0xbc3 + 30026d6: fcf42423 sw a5,-56(s0) + 30026da: fc842783 lw a5,-56(s0) + 30026de: fcf42223 sw a5,-60(s0) + 30026e2: f9c42783 lw a5,-100(s0) + 30026e6: 078a slli a5,a5,0x2 + 30026e8: 8bf1 andi a5,a5,28 + 30026ea: 473d li a4,15 + 30026ec: 00f717b3 sll a5,a4,a5 + 30026f0: fff7c793 not a5,a5 + 30026f4: fc442703 lw a4,-60(s0) + 30026f8: 8ff9 and a5,a5,a4 + 30026fa: fcf42223 sw a5,-60(s0) + 30026fe: f9c42783 lw a5,-100(s0) + 3002702: 078a slli a5,a5,0x2 + 3002704: 8bf1 andi a5,a5,28 + 3002706: f9842703 lw a4,-104(s0) + 300270a: 00f717b3 sll a5,a4,a5 + 300270e: fc442703 lw a4,-60(s0) + 3002712: 8fd9 or a5,a5,a4 + 3002714: fcf42223 sw a5,-60(s0) + 3002718: fc442783 lw a5,-60(s0) + 300271c: 82be mv t0,a5 + 300271e: bc329073 csrw 0xbc3,t0 + break; + 3002722: aaa9 j 300287c + case 4: /* GROUP4 */ + SET_LOCAL_INTER_NUM_PRI(4, interPriNum, prior); + 3002724: bc4027f3 csrr a5,0xbc4 + 3002728: fcf42823 sw a5,-48(s0) + 300272c: fd042783 lw a5,-48(s0) + 3002730: fcf42623 sw a5,-52(s0) + 3002734: f9c42783 lw a5,-100(s0) + 3002738: 078a slli a5,a5,0x2 + 300273a: 8bf1 andi a5,a5,28 + 300273c: 473d li a4,15 + 300273e: 00f717b3 sll a5,a4,a5 + 3002742: fff7c793 not a5,a5 + 3002746: fcc42703 lw a4,-52(s0) + 300274a: 8ff9 and a5,a5,a4 + 300274c: fcf42623 sw a5,-52(s0) + 3002750: f9c42783 lw a5,-100(s0) + 3002754: 078a slli a5,a5,0x2 + 3002756: 8bf1 andi a5,a5,28 + 3002758: f9842703 lw a4,-104(s0) + 300275c: 00f717b3 sll a5,a4,a5 + 3002760: fcc42703 lw a4,-52(s0) + 3002764: 8fd9 or a5,a5,a4 + 3002766: fcf42623 sw a5,-52(s0) + 300276a: fcc42783 lw a5,-52(s0) + 300276e: 82be mv t0,a5 + 3002770: bc429073 csrw 0xbc4,t0 + break; + 3002774: a221 j 300287c + case 5: /* GROUP5 */ + SET_LOCAL_INTER_NUM_PRI(5, interPriNum, prior); + 3002776: bc5027f3 csrr a5,0xbc5 + 300277a: fcf42c23 sw a5,-40(s0) + 300277e: fd842783 lw a5,-40(s0) + 3002782: fcf42a23 sw a5,-44(s0) + 3002786: f9c42783 lw a5,-100(s0) + 300278a: 078a slli a5,a5,0x2 + 300278c: 8bf1 andi a5,a5,28 + 300278e: 473d li a4,15 + 3002790: 00f717b3 sll a5,a4,a5 + 3002794: fff7c793 not a5,a5 + 3002798: fd442703 lw a4,-44(s0) + 300279c: 8ff9 and a5,a5,a4 + 300279e: fcf42a23 sw a5,-44(s0) + 30027a2: f9c42783 lw a5,-100(s0) + 30027a6: 078a slli a5,a5,0x2 + 30027a8: 8bf1 andi a5,a5,28 + 30027aa: f9842703 lw a4,-104(s0) + 30027ae: 00f717b3 sll a5,a4,a5 + 30027b2: fd442703 lw a4,-44(s0) + 30027b6: 8fd9 or a5,a5,a4 + 30027b8: fcf42a23 sw a5,-44(s0) + 30027bc: fd442783 lw a5,-44(s0) + 30027c0: 82be mv t0,a5 + 30027c2: bc529073 csrw 0xbc5,t0 + break; + 30027c6: a85d j 300287c + case 6: /* GROUP6 */ + SET_LOCAL_INTER_NUM_PRI(6, interPriNum, prior); + 30027c8: bc6027f3 csrr a5,0xbc6 + 30027cc: fef42023 sw a5,-32(s0) + 30027d0: fe042783 lw a5,-32(s0) + 30027d4: fcf42e23 sw a5,-36(s0) + 30027d8: f9c42783 lw a5,-100(s0) + 30027dc: 078a slli a5,a5,0x2 + 30027de: 8bf1 andi a5,a5,28 + 30027e0: 473d li a4,15 + 30027e2: 00f717b3 sll a5,a4,a5 + 30027e6: fff7c793 not a5,a5 + 30027ea: fdc42703 lw a4,-36(s0) + 30027ee: 8ff9 and a5,a5,a4 + 30027f0: fcf42e23 sw a5,-36(s0) + 30027f4: f9c42783 lw a5,-100(s0) + 30027f8: 078a slli a5,a5,0x2 + 30027fa: 8bf1 andi a5,a5,28 + 30027fc: f9842703 lw a4,-104(s0) + 3002800: 00f717b3 sll a5,a4,a5 + 3002804: fdc42703 lw a4,-36(s0) + 3002808: 8fd9 or a5,a5,a4 + 300280a: fcf42e23 sw a5,-36(s0) + 300280e: fdc42783 lw a5,-36(s0) + 3002812: 82be mv t0,a5 + 3002814: bc629073 csrw 0xbc6,t0 + break; + 3002818: a095 j 300287c + case 7: /* GROUP7 */ + SET_LOCAL_INTER_NUM_PRI(7, interPriNum, prior); + 300281a: bc7027f3 csrr a5,0xbc7 + 300281e: fef42423 sw a5,-24(s0) + 3002822: fe842783 lw a5,-24(s0) + 3002826: fef42223 sw a5,-28(s0) + 300282a: f9c42783 lw a5,-100(s0) + 300282e: 078a slli a5,a5,0x2 + 3002830: 8bf1 andi a5,a5,28 + 3002832: 473d li a4,15 + 3002834: 00f717b3 sll a5,a4,a5 + 3002838: fff7c793 not a5,a5 + 300283c: fe442703 lw a4,-28(s0) + 3002840: 8ff9 and a5,a5,a4 + 3002842: fef42223 sw a5,-28(s0) + 3002846: f9c42783 lw a5,-100(s0) + 300284a: 078a slli a5,a5,0x2 + 300284c: 8bf1 andi a5,a5,28 + 300284e: f9842703 lw a4,-104(s0) + 3002852: 00f717b3 sll a5,a4,a5 + 3002856: fe442703 lw a4,-28(s0) + 300285a: 8fd9 or a5,a5,a4 + 300285c: fef42223 sw a5,-28(s0) + 3002860: fe442783 lw a5,-28(s0) + 3002864: 82be mv t0,a5 + 3002866: bc729073 csrw 0xbc7,t0 + break; + 300286a: a809 j 300287c + default: + SetLocalIntNumPri(intNum, interPriNum, prior); + 300286c: f9842603 lw a2,-104(s0) + 3002870: f9c42583 lw a1,-100(s0) + 3002874: fec42503 lw a0,-20(s0) + 3002878: 3485 jal ra,30022d8 + break; + 300287a: 0001 nop + } + RISCV_PRIV_MODE_SWITCH(priv); +} + 300287c: 0001 nop + 300287e: 50b6 lw ra,108(sp) + 3002880: 5426 lw s0,104(sp) + 3002882: 6165 addi sp,sp,112 + 3002884: 8082 ret + +03002886 : + * @param irqNum External interrupt number. + * @param priority. + * @retval IRQ_ERRNO_NUM_INVALID or IRQ_ERRNO_PRIORITY_INVALID or BASE_STATUS_OK. + */ +unsigned int IRQ_SetPriority(unsigned int irqNum, unsigned int priority) +{ + 3002886: 1101 addi sp,sp,-32 + 3002888: ce06 sw ra,28(sp) + 300288a: cc22 sw s0,24(sp) + 300288c: 1000 addi s0,sp,32 + 300288e: fea42623 sw a0,-20(s0) + 3002892: feb42423 sw a1,-24(s0) + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 3002896: fec42703 lw a4,-20(s0) + 300289a: 47e5 li a5,25 + 300289c: 00e7f863 bgeu a5,a4,30028ac + 30028a0: fec42703 lw a4,-20(s0) + 30028a4: 07200793 li a5,114 + 30028a8: 00e7fb63 bgeu a5,a4,30028be + 30028ac: 18c00593 li a1,396 + 30028b0: 030067b7 lui a5,0x3006 + 30028b4: 47878513 addi a0,a5,1144 # 3006478 + 30028b8: 21bd jal ra,3002d26 + 30028ba: 4789 li a5,2 + 30028bc: a815 j 30028f0 + INTERRUPT_PARAM_CHECK_WITH_RET((priority >= IRQ_PRIO_LOWEST && priority <= IRQ_PRIO_HIGHEST), \ + 30028be: fe842783 lw a5,-24(s0) + 30028c2: c791 beqz a5,30028ce + 30028c4: fe842703 lw a4,-24(s0) + 30028c8: 47bd li a5,15 + 30028ca: 00e7fb63 bgeu a5,a4,30028e0 + 30028ce: 18d00593 li a1,397 + 30028d2: 030067b7 lui a5,0x3006 + 30028d6: 47878513 addi a0,a5,1144 # 3006478 + 30028da: 21b1 jal ra,3002d26 + 30028dc: 4795 li a5,5 + 30028de: a809 j 30028f0 + IRQ_ERRNO_PRIORITY_INVALID); + + /* The locipri register is specifically used to configure the priority of the + external non-standard interrupts of the CPU, so the number of internal + standard interrupts should be subtracted */ + IRQ_SetLocalPriority(irqNum - IRQ_VECTOR_CNT, priority); + 30028e0: fec42783 lw a5,-20(s0) + 30028e4: 1799 addi a5,a5,-26 + 30028e6: fe842583 lw a1,-24(s0) + 30028ea: 853e mv a0,a5 + 30028ec: 395d jal ra,30025a2 + + return BASE_STATUS_OK; + 30028ee: 4781 li a5,0 +} + 30028f0: 853e mv a0,a5 + 30028f2: 40f2 lw ra,28(sp) + 30028f4: 4462 lw s0,24(sp) + 30028f6: 6105 addi sp,sp,32 + 30028f8: 8082 ret + +030028fa : + * @brief Interrupt dummy handler + * @param arg Not used + * @retval None. + */ +static void IRQ_DummyHandler(void *arg) +{ + 30028fa: 1101 addi sp,sp,-32 + 30028fc: ce22 sw s0,28(sp) + 30028fe: 1000 addi s0,sp,32 + 3002900: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(arg); +} + 3002904: 0001 nop + 3002906: 4472 lw s0,28(sp) + 3002908: 6105 addi sp,sp,32 + 300290a: 8082 ret + +0300290c : + * @param func callback function + * @param arg callback arg + * @retval None. + */ +static inline void IRQ_SetCallBack(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 300290c: 1101 addi sp,sp,-32 + 300290e: ce22 sw s0,28(sp) + 3002910: 1000 addi s0,sp,32 + 3002912: fea42623 sw a0,-20(s0) + 3002916: feb42423 sw a1,-24(s0) + 300291a: fec42223 sw a2,-28(s0) + g_irqCallbackFunc[irqNum].param = arg; + 300291e: 040007b7 lui a5,0x4000 + 3002922: 0fc78713 addi a4,a5,252 # 40000fc + 3002926: fec42783 lw a5,-20(s0) + 300292a: 078e slli a5,a5,0x3 + 300292c: 97ba add a5,a5,a4 + 300292e: fe442703 lw a4,-28(s0) + 3002932: c3d8 sw a4,4(a5) + g_irqCallbackFunc[irqNum].pfnHandler = func; + 3002934: 040007b7 lui a5,0x4000 + 3002938: 0fc78713 addi a4,a5,252 # 40000fc + 300293c: fec42783 lw a5,-20(s0) + 3002940: 078e slli a5,a5,0x3 + 3002942: 97ba add a5,a5,a4 + 3002944: fe842703 lw a4,-24(s0) + 3002948: c398 sw a4,0(a5) +} + 300294a: 0001 nop + 300294c: 4472 lw s0,28(sp) + 300294e: 6105 addi sp,sp,32 + 3002950: 8082 ret + +03002952 : + * @brief Set the write protection for CRG-related registers disable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionDisable(void) +{ + 3002952: 1141 addi sp,sp,-16 + 3002954: c622 sw s0,12(sp) + 3002956: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = (SYSCTRL0->SC_LOCKEN.reg & SC_LOCKEN_CRG_DISABLE_MASK) + SC_LOCKEN_VALID_HIGH_BIT; + 3002958: 101007b7 lui a5,0x10100 + 300295c: 43f8 lw a4,68(a5) + 300295e: 67c1 lui a5,0x10 + 3002960: 17f9 addi a5,a5,-2 # fffe + 3002962: 00f776b3 and a3,a4,a5 + 3002966: 101007b7 lui a5,0x10100 + 300296a: ea510737 lui a4,0xea510 + 300296e: 9736 add a4,a4,a3 + 3002970: c3f8 sw a4,68(a5) +} + 3002972: 0001 nop + 3002974: 4432 lw s0,12(sp) + 3002976: 0141 addi sp,sp,16 + 3002978: 8082 ret + +0300297a : + * @brief Set the Set the write protection for CRG-related registers enable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionEnable(void) +{ + 300297a: 1141 addi sp,sp,-16 + 300297c: c622 sw s0,12(sp) + 300297e: 0800 addi s0,sp,16 + /* Set the corresponding bit without affecting the other bits and set the high 16 bits to EA51 to write to. */ + SYSCTRL0->SC_LOCKEN.reg = ((SYSCTRL0->SC_LOCKEN.reg & SC_LOW_BIT_MASK) | SC_LOCKEN_CRG_ENABLE_MASK) + + 3002980: 101007b7 lui a5,0x10100 + 3002984: 43f8 lw a4,68(a5) + 3002986: 67c1 lui a5,0x10 + 3002988: 17fd addi a5,a5,-1 # ffff + 300298a: 8ff9 and a5,a5,a4 + 300298c: 0017e693 ori a3,a5,1 + 3002990: 101007b7 lui a5,0x10100 + 3002994: ea510737 lui a4,0xea510 + 3002998: 9736 add a4,a4,a3 + 300299a: c3f8 sw a4,68(a5) + SC_LOCKEN_VALID_HIGH_BIT; +} + 300299c: 0001 nop + 300299e: 4432 lw s0,12(sp) + 30029a0: 0141 addi sp,sp,16 + 30029a2: 8082 ret + +030029a4 : + * @param clkSelect pll_ref_cksel + * @retval true + * @retval false + */ +static inline bool IsCrgPllRefClkSelect(CRG_PllRefClkSelect clkSelect) +{ + 30029a4: 1101 addi sp,sp,-32 + 30029a6: ce22 sw s0,28(sp) + 30029a8: 1000 addi s0,sp,32 + 30029aa: fea42623 sw a0,-20(s0) + return ((clkSelect == CRG_PLL_REF_CLK_SELECT_HOSC) || + 30029ae: fec42783 lw a5,-20(s0) + 30029b2: c791 beqz a5,30029be + 30029b4: fec42703 lw a4,-20(s0) + 30029b8: 4785 li a5,1 + 30029ba: 00f71463 bne a4,a5,30029c2 + 30029be: 4785 li a5,1 + 30029c0: a011 j 30029c4 + 30029c2: 4781 li a5,0 + 30029c4: 8b85 andi a5,a5,1 + 30029c6: 9f81 uxtb a5 + (clkSelect == CRG_PLL_REF_CLK_SELECT_XTAL)); +} + 30029c8: 853e mv a0,a5 + 30029ca: 4472 lw s0,28(sp) + 30029cc: 6105 addi sp,sp,32 + 30029ce: 8082 ret + +030029d0 : + * @param preDiv pll prediv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPreDiv(CRG_PllPreDiv preDiv) +{ + 30029d0: 1101 addi sp,sp,-32 + 30029d2: ce22 sw s0,28(sp) + 30029d4: 1000 addi s0,sp,32 + 30029d6: fea42623 sw a0,-20(s0) + return ((preDiv >= CRG_PLL_PREDIV_1) && + 30029da: fec42783 lw a5,-20(s0) + 30029de: 0087b793 sltiu a5,a5,8 + 30029e2: 9f81 uxtb a5 + (preDiv <= CRG_PLL_PREDIV_8)); +} + 30029e4: 853e mv a0,a5 + 30029e6: 4472 lw s0,28(sp) + 30029e8: 6105 addi sp,sp,32 + 30029ea: 8082 ret + +030029ec : + * @param postDiv pll_postdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv(CRG_PllPostDiv postDiv) +{ + 30029ec: 1101 addi sp,sp,-32 + 30029ee: ce22 sw s0,28(sp) + 30029f0: 1000 addi s0,sp,32 + 30029f2: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV_1) && + 30029f6: fec42783 lw a5,-20(s0) + 30029fa: 0087b793 sltiu a5,a5,8 + 30029fe: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV_8)); +} + 3002a00: 853e mv a0,a5 + 3002a02: 4472 lw s0,28(sp) + 3002a04: 6105 addi sp,sp,32 + 3002a06: 8082 ret + +03002a08 : + * @param postDiv pll_postdiv2 value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv2(CRG_PllPostDiv2 postDiv) +{ + 3002a08: 1101 addi sp,sp,-32 + 3002a0a: ce22 sw s0,28(sp) + 3002a0c: 1000 addi s0,sp,32 + 3002a0e: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV2_1) && + 3002a12: fec42783 lw a5,-20(s0) + 3002a16: 0087b793 sltiu a5,a5,8 + 3002a1a: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV2_8_MAX)); +} + 3002a1c: 853e mv a0,a5 + 3002a1e: 4472 lw s0,28(sp) + 3002a20: 6105 addi sp,sp,32 + 3002a22: 8082 ret + +03002a24 : + * @param fbDiv pll fbdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllFbDiv(unsigned int fbDiv) +{ + 3002a24: 1101 addi sp,sp,-32 + 3002a26: ce22 sw s0,28(sp) + 3002a28: 1000 addi s0,sp,32 + 3002a2a: fea42623 sw a0,-20(s0) + return (fbDiv <= CRG_PLL_FBDIV_MAX); + 3002a2e: fec42783 lw a5,-20(s0) + 3002a32: 0807b793 sltiu a5,a5,128 + 3002a36: 9f81 uxtb a5 +} + 3002a38: 853e mv a0,a5 + 3002a3a: 4472 lw s0,28(sp) + 3002a3c: 6105 addi sp,sp,32 + 3002a3e: 8082 ret + +03002a40 : + * @param select core_cksel value + * @retval true + * @retval false + */ +static inline bool IsCrgCoreCkSel(CRG_CoreClkSelect select) +{ + 3002a40: 1101 addi sp,sp,-32 + 3002a42: ce22 sw s0,28(sp) + 3002a44: 1000 addi s0,sp,32 + 3002a46: fea42623 sw a0,-20(s0) + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002a4a: fec42783 lw a5,-20(s0) + 3002a4e: cb99 beqz a5,3002a64 + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + 3002a50: fec42703 lw a4,-20(s0) + 3002a54: 4785 li a5,1 + 3002a56: 00f70763 beq a4,a5,3002a64 + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3002a5a: fec42703 lw a4,-20(s0) + 3002a5e: 4789 li a5,2 + 3002a60: 00f71463 bne a4,a5,3002a68 + 3002a64: 4785 li a5,1 + 3002a66: a011 j 3002a6a + 3002a68: 4781 li a5,0 + 3002a6a: 8b85 andi a5,a5,1 + 3002a6c: 9f81 uxtb a5 + (select == CRG_CORE_CLK_SELECT_PLL)); +} + 3002a6e: 853e mv a0,a5 + 3002a70: 4472 lw s0,28(sp) + 3002a72: 6105 addi sp,sp,32 + 3002a74: 8082 ret + +03002a76 : + * @param select 1M clock selection + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkSel(CRG_1MClkSelect select) +{ + 3002a76: 1101 addi sp,sp,-32 + 3002a78: ce22 sw s0,28(sp) + 3002a7a: 1000 addi s0,sp,32 + 3002a7c: fea42623 sw a0,-20(s0) + return ((select == CRG_1M_CLK_SELECT_HOSC) || + 3002a80: fec42783 lw a5,-20(s0) + 3002a84: c791 beqz a5,3002a90 + 3002a86: fec42703 lw a4,-20(s0) + 3002a8a: 4785 li a5,1 + 3002a8c: 00f71463 bne a4,a5,3002a94 + 3002a90: 4785 li a5,1 + 3002a92: a011 j 3002a96 + 3002a94: 4781 li a5,0 + 3002a96: 8b85 andi a5,a5,1 + 3002a98: 9f81 uxtb a5 + (select == CRG_1M_CLK_SELECT_TCXO)); +} + 3002a9a: 853e mv a0,a5 + 3002a9c: 4472 lw s0,28(sp) + 3002a9e: 6105 addi sp,sp,32 + 3002aa0: 8082 ret + +03002aa2 : + * @param div 1M clock ratio + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkDiv(unsigned int div) +{ + 3002aa2: 1101 addi sp,sp,-32 + 3002aa4: ce22 sw s0,28(sp) + 3002aa6: 1000 addi s0,sp,32 + 3002aa8: fea42623 sw a0,-20(s0) + return (div <= CRG_1MHZ_CLK_MAX_DIV); + 3002aac: fec42783 lw a5,-20(s0) + 3002ab0: 0407b793 sltiu a5,a5,64 + 3002ab4: 9f81 uxtb a5 +} + 3002ab6: 853e mv a0,a5 + 3002ab8: 4472 lw s0,28(sp) + 3002aba: 6105 addi sp,sp,32 + 3002abc: 8082 ret + +03002abe : + * @param preDiv PLL Previous Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPreDiv(unsigned int pllRefFreq, unsigned int preDiv) +{ + 3002abe: 7179 addi sp,sp,-48 + 3002ac0: d622 sw s0,44(sp) + 3002ac2: 1800 addi s0,sp,48 + 3002ac4: fca42e23 sw a0,-36(s0) + 3002ac8: fcb42c23 sw a1,-40(s0) + unsigned int freq = pllRefFreq; + 3002acc: fdc42783 lw a5,-36(s0) + 3002ad0: fef42623 sw a5,-20(s0) + if (preDiv != 0) { + 3002ad4: fd842783 lw a5,-40(s0) + 3002ad8: cb89 beqz a5,3002aea + freq /= preDiv; + 3002ada: fec42703 lw a4,-20(s0) + 3002ade: fd842783 lw a5,-40(s0) + 3002ae2: 02f757b3 divu a5,a4,a5 + 3002ae6: fef42623 sw a5,-20(s0) + } + return (freq >= CRG_CLK_PFD_MIN_FREQ) && (freq <= CRG_CLK_PFD_MAX_FREQ); + 3002aea: fec42703 lw a4,-20(s0) + 3002aee: 003d17b7 lui a5,0x3d1 + 3002af2: 8ff78793 addi a5,a5,-1793 # 3d08ff + 3002af6: 00e7fc63 bgeu a5,a4,3002b0e + 3002afa: fec42703 lw a4,-20(s0) + 3002afe: 007277b7 lui a5,0x727 + 3002b02: 0e078793 addi a5,a5,224 # 7270e0 + 3002b06: 00e7e463 bltu a5,a4,3002b0e + 3002b0a: 4785 li a5,1 + 3002b0c: a011 j 3002b10 + 3002b0e: 4781 li a5,0 + 3002b10: 8b85 andi a5,a5,1 + 3002b12: 9f81 uxtb a5 +} + 3002b14: 853e mv a0,a5 + 3002b16: 5432 lw s0,44(sp) + 3002b18: 6145 addi sp,sp,48 + 3002b1a: 8082 ret + +03002b1c : + * @param fdDiv PLL FD Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidFdDiv(unsigned int clkPfdFreq, unsigned int fdDiv) +{ + 3002b1c: 7179 addi sp,sp,-48 + 3002b1e: d622 sw s0,44(sp) + 3002b20: 1800 addi s0,sp,48 + 3002b22: fca42e23 sw a0,-36(s0) + 3002b26: fcb42c23 sw a1,-40(s0) + if (clkPfdFreq > 30000000U) { /* The maximum speed of the external clock source is 30000000U. */ + 3002b2a: fdc42703 lw a4,-36(s0) + 3002b2e: 01c9c7b7 lui a5,0x1c9c + 3002b32: 38078793 addi a5,a5,896 # 1c9c380 + 3002b36: 00e7f463 bgeu a5,a4,3002b3e + return false; + 3002b3a: 4781 li a5,0 + 3002b3c: a08d j 3002b9e + } else if (fdDiv > CRG_PLL_FBDIV_MAX) { + 3002b3e: fd842703 lw a4,-40(s0) + 3002b42: 07f00793 li a5,127 + 3002b46: 00e7f463 bgeu a5,a4,3002b4e + return false; + 3002b4a: 4781 li a5,0 + 3002b4c: a889 j 3002b9e + } + + unsigned int freq = (fdDiv > 0x6) ? (clkPfdFreq * fdDiv) : (clkPfdFreq * 0x6); /* 0x0-0x6: divided by 0x6 */ + 3002b4e: fd842703 lw a4,-40(s0) + 3002b52: 4799 li a5,6 + 3002b54: 00e7f963 bgeu a5,a4,3002b66 + 3002b58: fdc42703 lw a4,-36(s0) + 3002b5c: fd842783 lw a5,-40(s0) + 3002b60: 02f707b3 mul a5,a4,a5 + 3002b64: a031 j 3002b70 + 3002b66: fdc42703 lw a4,-36(s0) + 3002b6a: 4799 li a5,6 + 3002b6c: 02f707b3 mul a5,a4,a5 + 3002b70: fef42623 sw a5,-20(s0) + return (freq >= CRG_CLK_VCO_MIN_FREQ) && (freq <= CRG_CLK_VCO_MAX_FREQ); + 3002b74: fec42703 lw a4,-20(s0) + 3002b78: 05f5e7b7 lui a5,0x5f5e + 3002b7c: 0ff78793 addi a5,a5,255 # 5f5e0ff + 3002b80: 00e7fc63 bgeu a5,a4,3002b98 + 3002b84: fec42703 lw a4,-20(s0) + 3002b88: 11e1a7b7 lui a5,0x11e1a + 3002b8c: 30078793 addi a5,a5,768 # 11e1a300 + 3002b90: 00e7e463 bltu a5,a4,3002b98 + 3002b94: 4785 li a5,1 + 3002b96: a011 j 3002b9a + 3002b98: 4781 li a5,0 + 3002b9a: 8b85 andi a5,a5,1 + 3002b9c: 9f81 uxtb a5 +} + 3002b9e: 853e mv a0,a5 + 3002ba0: 5432 lw s0,44(sp) + 3002ba2: 6145 addi sp,sp,48 + 3002ba4: 8082 ret + +03002ba6 : + * @param postDiv PLL Post Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv(unsigned int clkVcoFreq, unsigned int postDiv) +{ + 3002ba6: 7179 addi sp,sp,-48 + 3002ba8: d622 sw s0,44(sp) + 3002baa: 1800 addi s0,sp,48 + 3002bac: fca42e23 sw a0,-36(s0) + 3002bb0: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002bb4: fdc42783 lw a5,-36(s0) + 3002bb8: fef42623 sw a5,-20(s0) + if (postDiv != 0) { + 3002bbc: fd842783 lw a5,-40(s0) + 3002bc0: cb91 beqz a5,3002bd4 + freq /= (postDiv + 1); + 3002bc2: fd842783 lw a5,-40(s0) + 3002bc6: 0785 addi a5,a5,1 + 3002bc8: fec42703 lw a4,-20(s0) + 3002bcc: 02f757b3 divu a5,a4,a5 + 3002bd0: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_TARGET_MAX_FREQ); + 3002bd4: fec42703 lw a4,-20(s0) + 3002bd8: 08f0d7b7 lui a5,0x8f0d + 3002bdc: 18178793 addi a5,a5,385 # 8f0d181 + 3002be0: 00f737b3 sltu a5,a4,a5 + 3002be4: 9f81 uxtb a5 +} + 3002be6: 853e mv a0,a5 + 3002be8: 5432 lw s0,44(sp) + 3002bea: 6145 addi sp,sp,48 + 3002bec: 8082 ret + +03002bee : + * @param postDiv2 PLL Post Divsion2 + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv2(unsigned int clkVcoFreq, unsigned int postDiv2) +{ + 3002bee: 7179 addi sp,sp,-48 + 3002bf0: d622 sw s0,44(sp) + 3002bf2: 1800 addi s0,sp,48 + 3002bf4: fca42e23 sw a0,-36(s0) + 3002bf8: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3002bfc: fdc42783 lw a5,-36(s0) + 3002c00: fef42623 sw a5,-20(s0) + if (postDiv2 != 0) { + 3002c04: fd842783 lw a5,-40(s0) + 3002c08: cb91 beqz a5,3002c1c + freq /= (postDiv2 + 1); + 3002c0a: fd842783 lw a5,-40(s0) + 3002c0e: 0785 addi a5,a5,1 + 3002c10: fec42703 lw a4,-20(s0) + 3002c14: 02f757b3 divu a5,a4,a5 + 3002c18: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_PST2_MAX_FREQ); + 3002c1c: fec42703 lw a4,-20(s0) + 3002c20: 05f5e7b7 lui a5,0x5f5e + 3002c24: 10178793 addi a5,a5,257 # 5f5e101 + 3002c28: 00f737b3 sltu a5,a4,a5 + 3002c2c: 9f81 uxtb a5 +} + 3002c2e: 853e mv a0,a5 + 3002c30: 5432 lw s0,44(sp) + 3002c32: 6145 addi sp,sp,48 + 3002c34: 8082 ret + +03002c36 : + * @param adcClkSelect the value of adc clock select + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkModeSelect(CRG_AdcClkSelect adcClkSelect) +{ + 3002c36: 1101 addi sp,sp,-32 + 3002c38: ce22 sw s0,28(sp) + 3002c3a: 1000 addi s0,sp,32 + 3002c3c: fea42623 sw a0,-20(s0) + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002c40: fec42783 lw a5,-20(s0) + 3002c44: c385 beqz a5,3002c64 + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + 3002c46: fec42703 lw a4,-20(s0) + 3002c4a: 4785 li a5,1 + 3002c4c: 00f70c63 beq a4,a5,3002c64 + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + 3002c50: fec42703 lw a4,-20(s0) + 3002c54: 4789 li a5,2 + 3002c56: 00f70763 beq a4,a5,3002c64 + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3002c5a: fec42703 lw a4,-20(s0) + 3002c5e: 478d li a5,3 + 3002c60: 00f71463 bne a4,a5,3002c68 + 3002c64: 4785 li a5,1 + 3002c66: a011 j 3002c6a + 3002c68: 4781 li a5,0 + 3002c6a: 8b85 andi a5,a5,1 + 3002c6c: 9f81 uxtb a5 + adcClkSelect == CRG_ADC_CLK_SYN_CORE); +} + 3002c6e: 853e mv a0,a5 + 3002c70: 4472 lw s0,28(sp) + 3002c72: 6105 addi sp,sp,32 + 3002c74: 8082 ret + +03002c76 : + * @param div the value of adc clock div + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkDiv(CRG_AdcDiv div) +{ + 3002c76: 1101 addi sp,sp,-32 + 3002c78: ce22 sw s0,28(sp) + 3002c7a: 1000 addi s0,sp,32 + 3002c7c: fea42623 sw a0,-20(s0) + return (div == CRG_ADC_DIV_1 || \ + div == CRG_ADC_DIV_2 || \ + div == CRG_ADC_DIV_3 || \ + 3002c80: fec42783 lw a5,-20(s0) + 3002c84: c385 beqz a5,3002ca4 + return (div == CRG_ADC_DIV_1 || \ + 3002c86: fec42703 lw a4,-20(s0) + 3002c8a: 4785 li a5,1 + 3002c8c: 00f70c63 beq a4,a5,3002ca4 + div == CRG_ADC_DIV_2 || \ + 3002c90: fec42703 lw a4,-20(s0) + 3002c94: 4789 li a5,2 + 3002c96: 00f70763 beq a4,a5,3002ca4 + div == CRG_ADC_DIV_3 || \ + 3002c9a: fec42703 lw a4,-20(s0) + 3002c9e: 478d li a5,3 + 3002ca0: 00f71463 bne a4,a5,3002ca8 + 3002ca4: 4785 li a5,1 + 3002ca6: a011 j 3002caa + 3002ca8: 4781 li a5,0 + 3002caa: 8b85 andi a5,a5,1 + 3002cac: 9f81 uxtb a5 + div == CRG_ADC_DIV_4); +} + 3002cae: 853e mv a0,a5 + 3002cb0: 4472 lw s0,28(sp) + 3002cb2: 6105 addi sp,sp,32 + 3002cb4: 8082 ret + +03002cb6 : + * @param clk Clock register base address + * @param select Core clock selection + * @retval None + */ +static inline void DCL_CRG_SetCoreClkSel(CRG_RegStruct *clk, CRG_CoreClkSelect select) +{ + 3002cb6: 1101 addi sp,sp,-32 + 3002cb8: ce06 sw ra,28(sp) + 3002cba: cc22 sw s0,24(sp) + 3002cbc: 1000 addi s0,sp,32 + 3002cbe: fea42623 sw a0,-20(s0) + 3002cc2: feb42423 sw a1,-24(s0) + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + 3002cc6: fec42703 lw a4,-20(s0) + 3002cca: 100007b7 lui a5,0x10000 + 3002cce: 00f70a63 beq a4,a5,3002ce2 + 3002cd2: 64b00593 li a1,1611 + 3002cd6: 030067b7 lui a5,0x3006 + 3002cda: 4d878513 addi a0,a5,1240 # 30064d8 + 3002cde: 20a1 jal ra,3002d26 + 3002ce0: a001 j 3002ce0 + CRG_PARAM_CHECK_NO_RET(IsCrgCoreCkSel(select)); + 3002ce2: fe842503 lw a0,-24(s0) + 3002ce6: 3ba9 jal ra,3002a40 + 3002ce8: 87aa mv a5,a0 + 3002cea: 0017c793 xori a5,a5,1 + 3002cee: 9f81 uxtb a5 + 3002cf0: cb89 beqz a5,3002d02 + 3002cf2: 64c00593 li a1,1612 + 3002cf6: 030067b7 lui a5,0x3006 + 3002cfa: 4d878513 addi a0,a5,1240 # 30064d8 + 3002cfe: 2025 jal ra,3002d26 + 3002d00: a839 j 3002d1e + clk->PERI_CRG64.BIT.clk_pst1_sw_sel = select; + 3002d02: fe842783 lw a5,-24(s0) + 3002d06: 8b8d andi a5,a5,3 + 3002d08: 0ff7f693 andi a3,a5,255 + 3002d0c: fec42703 lw a4,-20(s0) + 3002d10: 10072783 lw a5,256(a4) # ea510100 + 3002d14: 8a8d andi a3,a3,3 + 3002d16: 9bf1 andi a5,a5,-4 + 3002d18: 8fd5 or a5,a5,a3 + 3002d1a: 10f72023 sw a5,256(a4) +} + 3002d1e: 40f2 lw ra,28(sp) + 3002d20: 4462 lw s0,24(sp) + 3002d22: 6105 addi sp,sp,32 + 3002d24: 8082 ret + +03002d26 : + 3002d26: 988ff06f j 3001eae + +03002d2a : + * @param handle CRG Handle + * @retval BASE_STATUS_ERROR Parameter Check fail + * @retval BASE_STATUS_OK Success + */ +BASE_StatusType HAL_CRG_Init(const CRG_Handle *handle) +{ + 3002d2a: 7179 addi sp,sp,-48 + 3002d2c: d606 sw ra,44(sp) + 3002d2e: d422 sw s0,40(sp) + 3002d30: 1800 addi s0,sp,48 + 3002d32: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != NULL); + 3002d36: fdc42783 lw a5,-36(s0) + 3002d3a: eb89 bnez a5,3002d4c + 3002d3c: 07100593 li a1,113 + 3002d40: 030067b7 lui a5,0x3006 + 3002d44: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d48: 3ff9 jal ra,3002d26 + 3002d4a: a001 j 3002d4a + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3002d4c: fdc42783 lw a5,-36(s0) + 3002d50: 4398 lw a4,0(a5) + 3002d52: 100007b7 lui a5,0x10000 + 3002d56: 00f70a63 beq a4,a5,3002d6a + 3002d5a: 07200593 li a1,114 + 3002d5e: 030067b7 lui a5,0x3006 + 3002d62: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d66: 37c1 jal ra,3002d26 + 3002d68: a001 j 3002d68 + /* Check the validity of PLL-related parameters. */ + CRG_PARAM_CHECK_WITH_RET(IsCrgPllRefClkSelect(handle->pllRefClkSelect), BASE_STATUS_ERROR); + 3002d6a: fdc42783 lw a5,-36(s0) + 3002d6e: 43dc lw a5,4(a5) + 3002d70: 853e mv a0,a5 + 3002d72: 390d jal ra,30029a4 + 3002d74: 87aa mv a5,a0 + 3002d76: 0017c793 xori a5,a5,1 + 3002d7a: 9f81 uxtb a5 + 3002d7c: cb91 beqz a5,3002d90 + 3002d7e: 07400593 li a1,116 + 3002d82: 030067b7 lui a5,0x3006 + 3002d86: 4f478513 addi a0,a5,1268 # 30064f4 + 3002d8a: 3f71 jal ra,3002d26 + 3002d8c: 4785 li a5,1 + 3002d8e: aca9 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPreDiv(handle->pllPreDiv), BASE_STATUS_ERROR); + 3002d90: fdc42783 lw a5,-36(s0) + 3002d94: 479c lw a5,8(a5) + 3002d96: 853e mv a0,a5 + 3002d98: 3925 jal ra,30029d0 + 3002d9a: 87aa mv a5,a0 + 3002d9c: 0017c793 xori a5,a5,1 + 3002da0: 9f81 uxtb a5 + 3002da2: cb91 beqz a5,3002db6 + 3002da4: 07500593 li a1,117 + 3002da8: 030067b7 lui a5,0x3006 + 3002dac: 4f478513 addi a0,a5,1268 # 30064f4 + 3002db0: 3f9d jal ra,3002d26 + 3002db2: 4785 li a5,1 + 3002db4: ac15 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllFbDiv(handle->pllFbDiv), BASE_STATUS_ERROR); + 3002db6: fdc42783 lw a5,-36(s0) + 3002dba: 47dc lw a5,12(a5) + 3002dbc: 853e mv a0,a5 + 3002dbe: 319d jal ra,3002a24 + 3002dc0: 87aa mv a5,a0 + 3002dc2: 0017c793 xori a5,a5,1 + 3002dc6: 9f81 uxtb a5 + 3002dc8: cb91 beqz a5,3002ddc + 3002dca: 07600593 li a1,118 + 3002dce: 030067b7 lui a5,0x3006 + 3002dd2: 4f478513 addi a0,a5,1268 # 30064f4 + 3002dd6: 3f81 jal ra,3002d26 + 3002dd8: 4785 li a5,1 + 3002dda: a439 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv(handle->pllPostDiv), BASE_STATUS_ERROR); + 3002ddc: fdc42783 lw a5,-36(s0) + 3002de0: 4b9c lw a5,16(a5) + 3002de2: 853e mv a0,a5 + 3002de4: 3121 jal ra,30029ec + 3002de6: 87aa mv a5,a0 + 3002de8: 0017c793 xori a5,a5,1 + 3002dec: 9f81 uxtb a5 + 3002dee: cb91 beqz a5,3002e02 + 3002df0: 07700593 li a1,119 + 3002df4: 030067b7 lui a5,0x3006 + 3002df8: 4f478513 addi a0,a5,1268 # 30064f4 + 3002dfc: 372d jal ra,3002d26 + 3002dfe: 4785 li a5,1 + 3002e00: a2e5 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv2(handle->handleEx.pllPostDiv2), BASE_STATUS_ERROR); + 3002e02: fdc42783 lw a5,-36(s0) + 3002e06: 4fdc lw a5,28(a5) + 3002e08: 853e mv a0,a5 + 3002e0a: 3efd jal ra,3002a08 + 3002e0c: 87aa mv a5,a0 + 3002e0e: 0017c793 xori a5,a5,1 + 3002e12: 9f81 uxtb a5 + 3002e14: cb91 beqz a5,3002e28 + 3002e16: 07800593 li a1,120 + 3002e1a: 030067b7 lui a5,0x3006 + 3002e1e: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e22: 3711 jal ra,3002d26 + 3002e24: 4785 li a5,1 + 3002e26: a2c9 j 3002fe8 + /* Check the Clock Source and Frequency Divider of the 1 MHz Clock. */ + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkSel(handle->handleEx.clk1MSelect), BASE_STATUS_ERROR); + 3002e28: fdc42783 lw a5,-36(s0) + 3002e2c: 539c lw a5,32(a5) + 3002e2e: 853e mv a0,a5 + 3002e30: 3199 jal ra,3002a76 + 3002e32: 87aa mv a5,a0 + 3002e34: 0017c793 xori a5,a5,1 + 3002e38: 9f81 uxtb a5 + 3002e3a: cb91 beqz a5,3002e4e + 3002e3c: 07a00593 li a1,122 + 3002e40: 030067b7 lui a5,0x3006 + 3002e44: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e48: 3df9 jal ra,3002d26 + 3002e4a: 4785 li a5,1 + 3002e4c: aa71 j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkDiv(handle->handleEx.clk1MDiv), BASE_STATUS_ERROR); + 3002e4e: fdc42783 lw a5,-36(s0) + 3002e52: 53dc lw a5,36(a5) + 3002e54: 853e mv a0,a5 + 3002e56: 31b1 jal ra,3002aa2 + 3002e58: 87aa mv a5,a0 + 3002e5a: 0017c793 xori a5,a5,1 + 3002e5e: 9f81 uxtb a5 + 3002e60: cb91 beqz a5,3002e74 + 3002e62: 07b00593 li a1,123 + 3002e66: 030067b7 lui a5,0x3006 + 3002e6a: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e6e: 3d65 jal ra,3002d26 + 3002e70: 4785 li a5,1 + 3002e72: aa9d j 3002fe8 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 3002e74: fdc42783 lw a5,-36(s0) + 3002e78: 4f9c lw a5,24(a5) + 3002e7a: 853e mv a0,a5 + 3002e7c: 36d1 jal ra,3002a40 + 3002e7e: 87aa mv a5,a0 + 3002e80: 0017c793 xori a5,a5,1 + 3002e84: 9f81 uxtb a5 + 3002e86: cb91 beqz a5,3002e9a + 3002e88: 07c00593 li a1,124 + 3002e8c: 030067b7 lui a5,0x3006 + 3002e90: 4f478513 addi a0,a5,1268 # 30064f4 + 3002e94: 3d49 jal ra,3002d26 + 3002e96: 4785 li a5,1 + 3002e98: aa81 j 3002fe8 + + *(unsigned int *)CRG_HOSC_CTRL2_ADDR = 0x306E; /* Optimized HOSC temperature drift performance parameter. */ + 3002e9a: 100017b7 lui a5,0x10001 + 3002e9e: f0478793 addi a5,a5,-252 # 10000f04 + 3002ea2: 670d lui a4,0x3 + 3002ea4: 06e70713 addi a4,a4,110 # 306e + 3002ea8: c398 sw a4,0(a5) + + CRG_RegStruct *reg = handle->baseAddress; + 3002eaa: fdc42783 lw a5,-36(s0) + 3002eae: 439c lw a5,0(a5) + 3002eb0: fef42623 sw a5,-20(s0) + g_crgBaseAddr = (void *)reg; + 3002eb4: 040007b7 lui a5,0x4000 + 3002eb8: fec42703 lw a4,-20(s0) + 3002ebc: 48e7aa23 sw a4,1172(a5) # 4000494 + /* Check the validity of the PLL parameter configuration. */ + if (CRG_IsValidPllConfig(handle) != BASE_STATUS_OK) { + 3002ec0: fdc42503 lw a0,-36(s0) + 3002ec4: 7a4000ef jal ra,3003668 + 3002ec8: 87aa mv a5,a0 + 3002eca: c399 beqz a5,3002ed0 + return BASE_STATUS_ERROR; + 3002ecc: 4785 li a5,1 + 3002ece: aa29 j 3002fe8 + } + /* Disable the write protection function of the CRG register. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3002ed0: 3449 jal ra,3002952 + + reg->PERI_CRG0.BIT.pll_ref_cksel = handle->pllRefClkSelect; + 3002ed2: fdc42783 lw a5,-36(s0) + 3002ed6: 43dc lw a5,4(a5) + 3002ed8: 8b85 andi a5,a5,1 + 3002eda: 0ff7f693 andi a3,a5,255 + 3002ede: fec42703 lw a4,-20(s0) + 3002ee2: 431c lw a5,0(a4) + 3002ee4: 8a85 andi a3,a3,1 + 3002ee6: 9bf9 andi a5,a5,-2 + 3002ee8: 8fd5 or a5,a5,a3 + 3002eea: c31c sw a5,0(a4) + reg->PERI_CRG1.BIT.pll_prediv = handle->pllPreDiv; + 3002eec: fdc42783 lw a5,-36(s0) + 3002ef0: 479c lw a5,8(a5) + 3002ef2: 8bbd andi a5,a5,15 + 3002ef4: 0ff7f693 andi a3,a5,255 + 3002ef8: fec42703 lw a4,-20(s0) + 3002efc: 435c lw a5,4(a4) + 3002efe: 8abd andi a3,a3,15 + 3002f00: 9bc1 andi a5,a5,-16 + 3002f02: 8fd5 or a5,a5,a3 + 3002f04: c35c sw a5,4(a4) + reg->PERI_CRG2.BIT.pll_fbdiv = handle->pllFbDiv; + 3002f06: fdc42783 lw a5,-36(s0) + 3002f0a: 47dc lw a5,12(a5) + 3002f0c: 0ff7f693 andi a3,a5,255 + 3002f10: fec42703 lw a4,-20(s0) + 3002f14: 471c lw a5,8(a4) + 3002f16: 0ff6f693 andi a3,a3,255 + 3002f1a: f007f793 andi a5,a5,-256 + 3002f1e: 8fd5 or a5,a5,a3 + 3002f20: c71c sw a5,8(a4) + reg->PERI_CRG3.BIT.pll_postdiv1 = handle->pllPostDiv; + 3002f22: fdc42783 lw a5,-36(s0) + 3002f26: 4b9c lw a5,16(a5) + 3002f28: 8bbd andi a5,a5,15 + 3002f2a: 0ff7f693 andi a3,a5,255 + 3002f2e: fec42703 lw a4,-20(s0) + 3002f32: 475c lw a5,12(a4) + 3002f34: 8abd andi a3,a3,15 + 3002f36: 9bc1 andi a5,a5,-16 + 3002f38: 8fd5 or a5,a5,a3 + 3002f3a: c75c sw a5,12(a4) + reg->PERI_CRG3.BIT.pll_postdiv2 = handle->handleEx.pllPostDiv2; + 3002f3c: fdc42783 lw a5,-36(s0) + 3002f40: 4fdc lw a5,28(a5) + 3002f42: 8bbd andi a5,a5,15 + 3002f44: 0ff7f693 andi a3,a5,255 + 3002f48: fec42703 lw a4,-20(s0) + 3002f4c: 475c lw a5,12(a4) + 3002f4e: 8abd andi a3,a3,15 + 3002f50: 0692 slli a3,a3,0x4 + 3002f52: f0f7f793 andi a5,a5,-241 + 3002f56: 8fd5 or a5,a5,a3 + 3002f58: c75c sw a5,12(a4) + reg->PERI_CRG4.BIT.pll_pd = BASE_CFG_UNSET; + 3002f5a: fec42703 lw a4,-20(s0) + 3002f5e: 4b1c lw a5,16(a4) + 3002f60: 9bf9 andi a5,a5,-2 + 3002f62: cb1c sw a5,16(a4) + + while (reg->PERI_CRG7.BIT.pll_lock != BASE_CFG_SET) { + 3002f64: 0001 nop + 3002f66: fec42783 lw a5,-20(s0) + 3002f6a: 4fdc lw a5,28(a5) + 3002f6c: 8b85 andi a5,a5,1 + 3002f6e: 0ff7f713 andi a4,a5,255 + 3002f72: 4785 li a5,1 + 3002f74: fef719e3 bne a4,a5,3002f66 + ; /* Wait for PLL to lock */ + } + + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3002f78: 3409 jal ra,300297a + /* Check the 1MHz clock parameter configuration. */ + if (CRG_IsValid1MHzConfig(handle) != BASE_STATUS_OK) { + 3002f7a: fdc42503 lw a0,-36(s0) + 3002f7e: 7ac000ef jal ra,300372a + 3002f82: 87aa mv a5,a0 + 3002f84: c399 beqz a5,3002f8a + return BASE_STATUS_ERROR; + 3002f86: 4785 li a5,1 + 3002f88: a085 j 3002fe8 + } + while (reg->HOSC_LOCK.BIT.hosc_lock != BASE_CFG_SET) { + 3002f8a: 0001 nop + 3002f8c: fec42703 lw a4,-20(s0) + 3002f90: 6785 lui a5,0x1 + 3002f92: 97ba add a5,a5,a4 + 3002f94: f107a783 lw a5,-240(a5) # f10 + 3002f98: 8b85 andi a5,a5,1 + 3002f9a: 0ff7f713 andi a4,a5,255 + 3002f9e: 4785 li a5,1 + 3002fa0: fef716e3 bne a4,a5,3002f8c + ; /* Wait for HOSC to lock */ + } + /* Set the Clock Source and Frequency Divider of the 1 MHz Clock. */ + reg->PERI_CRG67.BIT.clk_1m_div = handle->handleEx.clk1MDiv; + 3002fa4: fdc42783 lw a5,-36(s0) + 3002fa8: 53dc lw a5,36(a5) + 3002faa: 03f7f793 andi a5,a5,63 + 3002fae: 0ff7f693 andi a3,a5,255 + 3002fb2: fec42703 lw a4,-20(s0) + 3002fb6: 10c72783 lw a5,268(a4) + 3002fba: 03f6f693 andi a3,a3,63 + 3002fbe: fc07f793 andi a5,a5,-64 + 3002fc2: 8fd5 or a5,a5,a3 + 3002fc4: 10f72623 sw a5,268(a4) + reg->PERI_CRG66.BIT.clk_1m_ini_cksel = handle->handleEx.clk1MSelect; + 3002fc8: fdc42783 lw a5,-36(s0) + 3002fcc: 539c lw a5,32(a5) + 3002fce: 8b85 andi a5,a5,1 + 3002fd0: 0ff7f693 andi a3,a5,255 + 3002fd4: fec42703 lw a4,-20(s0) + 3002fd8: 10872783 lw a5,264(a4) + 3002fdc: 8a85 andi a3,a3,1 + 3002fde: 9bf9 andi a5,a5,-2 + 3002fe0: 8fd5 or a5,a5,a3 + 3002fe2: 10f72423 sw a5,264(a4) + return BASE_STATUS_OK; + 3002fe6: 4781 li a5,0 +} + 3002fe8: 853e mv a0,a5 + 3002fea: 50b2 lw ra,44(sp) + 3002fec: 5422 lw s0,40(sp) + 3002fee: 6145 addi sp,sp,48 + 3002ff0: 8082 ret + +03002ff2 : + * @param handle CRG Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Paramter check fail + */ +BASE_StatusType HAL_CRG_SetCoreClockSelect(CRG_Handle *handle) +{ + 3002ff2: 7179 addi sp,sp,-48 + 3002ff4: d606 sw ra,44(sp) + 3002ff6: d422 sw s0,40(sp) + 3002ff8: 1800 addi s0,sp,48 + 3002ffa: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != 0); + 3002ffe: fdc42783 lw a5,-36(s0) + 3003002: eb89 bnez a5,3003014 + 3003004: 10a00593 li a1,266 + 3003008: 030067b7 lui a5,0x3006 + 300300c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003010: 3b19 jal ra,3002d26 + 3003012: a001 j 3003012 + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3003014: fdc42783 lw a5,-36(s0) + 3003018: 4398 lw a4,0(a5) + 300301a: 100007b7 lui a5,0x10000 + 300301e: 00f70a63 beq a4,a5,3003032 + 3003022: 10b00593 li a1,267 + 3003026: 030067b7 lui a5,0x3006 + 300302a: 4f478513 addi a0,a5,1268 # 30064f4 + 300302e: 39e5 jal ra,3002d26 + 3003030: a001 j 3003030 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 3003032: fdc42783 lw a5,-36(s0) + 3003036: 4f9c lw a5,24(a5) + 3003038: 853e mv a0,a5 + 300303a: 3419 jal ra,3002a40 + 300303c: 87aa mv a5,a0 + 300303e: 0017c793 xori a5,a5,1 + 3003042: 9f81 uxtb a5 + 3003044: cb91 beqz a5,3003058 + 3003046: 10c00593 li a1,268 + 300304a: 030067b7 lui a5,0x3006 + 300304e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003052: 39d1 jal ra,3002d26 + 3003054: 4785 li a5,1 + 3003056: a005 j 3003076 + + CRG_RegStruct *reg = handle->baseAddress; + 3003058: fdc42783 lw a5,-36(s0) + 300305c: 439c lw a5,0(a5) + 300305e: fef42623 sw a5,-20(s0) + /* The write protection of the CRG register needs to be disabled. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3003062: 38c5 jal ra,3002952 + DCL_CRG_SetCoreClkSel(reg, handle->coreClkSelect); + 3003064: fdc42783 lw a5,-36(s0) + 3003068: 4f9c lw a5,24(a5) + 300306a: 85be mv a1,a5 + 300306c: fec42503 lw a0,-20(s0) + 3003070: 3199 jal ra,3002cb6 + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3003072: 3221 jal ra,300297a + + return BASE_STATUS_OK; + 3003074: 4781 li a5,0 +} + 3003076: 853e mv a0,a5 + 3003078: 50b2 lw ra,44(sp) + 300307a: 5422 lw s0,40(sp) + 300307c: 6145 addi sp,sp,48 + 300307e: 8082 ret + +03003080 : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +static inline unsigned int CRG_GetVcoFreq(void) +{ + 3003080: 1101 addi sp,sp,-32 + 3003082: ce06 sw ra,28(sp) + 3003084: cc22 sw s0,24(sp) + 3003086: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int regFbdiv; + CRG_RegStruct *crg = g_crgBaseAddr; + 3003088: 040007b7 lui a5,0x4000 + 300308c: 4947a783 lw a5,1172(a5) # 4000494 + 3003090: fef42623 sw a5,-20(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003094: fec42703 lw a4,-20(s0) + 3003098: 100007b7 lui a5,0x10000 + 300309c: 00f70a63 beq a4,a5,30030b0 + 30030a0: 12200593 li a1,290 + 30030a4: 030067b7 lui a5,0x3006 + 30030a8: 4f478513 addi a0,a5,1268 # 30064f4 + 30030ac: 39ad jal ra,3002d26 + 30030ae: a001 j 30030ae + CRG_ASSERT_PARAM((XTRAIL_FREQ <= 30000000U)); /* The maximum of the external clock source is 30000000U. */ + + freq = CRG_GetPllRefIni(crg->PERI_CRG0.BIT.pll_ref_cksel); + 30030b0: fec42783 lw a5,-20(s0) + 30030b4: 439c lw a5,0(a5) + 30030b6: 8b85 andi a5,a5,1 + 30030b8: 9f81 uxtb a5 + 30030ba: 853e mv a0,a5 + 30030bc: 25c1 jal ra,300377c + 30030be: fea42423 sw a0,-24(s0) + freq /= CRG_GetPreDivValue(crg->PERI_CRG1.BIT.pll_prediv); + 30030c2: fec42783 lw a5,-20(s0) + 30030c6: 43dc lw a5,4(a5) + 30030c8: 8bbd andi a5,a5,15 + 30030ca: 9f81 uxtb a5 + 30030cc: 853e mv a0,a5 + 30030ce: 2de1 jal ra,30037a6 + 30030d0: 872a mv a4,a0 + 30030d2: fe842783 lw a5,-24(s0) + 30030d6: 02e7d7b3 divu a5,a5,a4 + 30030da: fef42423 sw a5,-24(s0) + regFbdiv = CRG_GetPllFbDivValue(crg->PERI_CRG2.BIT.pll_fbdiv); /* Get the value of the fbdiv register. */ + 30030de: fec42783 lw a5,-20(s0) + 30030e2: 479c lw a5,8(a5) + 30030e4: 9f81 uxtb a5 + 30030e6: 853e mv a0,a5 + 30030e8: 25f5 jal ra,30037d4 + 30030ea: fea42223 sw a0,-28(s0) + freq *= (regFbdiv >= 0x06) ? regFbdiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 30030ee: fe442783 lw a5,-28(s0) + 30030f2: 4719 li a4,6 + 30030f4: 00e7f363 bgeu a5,a4,30030fa + 30030f8: 4799 li a5,6 + 30030fa: fe842703 lw a4,-24(s0) + 30030fe: 02f707b3 mul a5,a4,a5 + 3003102: fef42423 sw a5,-24(s0) + return freq; + 3003106: fe842783 lw a5,-24(s0) +} + 300310a: 853e mv a0,a5 + 300310c: 40f2 lw ra,28(sp) + 300310e: 4462 lw s0,24(sp) + 3003110: 6105 addi sp,sp,32 + 3003112: 8082 ret + +03003114 : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +unsigned int HAL_CRG_GetPllFreq(void) +{ + 3003114: 1101 addi sp,sp,-32 + 3003116: ce06 sw ra,28(sp) + 3003118: cc22 sw s0,24(sp) + 300311a: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int pllPostDivValue; + CRG_RegStruct *crg = g_crgBaseAddr; + 300311c: 040007b7 lui a5,0x4000 + 3003120: 4947a783 lw a5,1172(a5) # 4000494 + 3003124: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003128: fe842703 lw a4,-24(s0) + 300312c: 100007b7 lui a5,0x10000 + 3003130: 00f70a63 beq a4,a5,3003144 + 3003134: 13700593 li a1,311 + 3003138: 030067b7 lui a5,0x3006 + 300313c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003140: 36dd jal ra,3002d26 + 3003142: a001 j 3003142 + freq = CRG_GetVcoFreq(); + 3003144: 3f35 jal ra,3003080 + 3003146: fea42623 sw a0,-20(s0) + pllPostDivValue = CRG_GetPllPostDivValue((CRG_PllPostDiv)crg->PERI_CRG3.BIT.pll_postdiv1); + 300314a: fe842783 lw a5,-24(s0) + 300314e: 47dc lw a5,12(a5) + 3003150: 8bbd andi a5,a5,15 + 3003152: 9f81 uxtb a5 + 3003154: 853e mv a0,a5 + 3003156: 25c1 jal ra,3003816 + 3003158: fea42223 sw a0,-28(s0) + /* Calculate the PLL output clock frequency based on the VCO clock frequency and post-division coefficient. */ + if (pllPostDivValue != 0) { + 300315c: fe442783 lw a5,-28(s0) + 3003160: cb89 beqz a5,3003172 + freq /= pllPostDivValue; + 3003162: fec42703 lw a4,-20(s0) + 3003166: fe442783 lw a5,-28(s0) + 300316a: 02f757b3 divu a5,a4,a5 + 300316e: fef42623 sw a5,-20(s0) + } + return freq; + 3003172: fec42783 lw a5,-20(s0) +} + 3003176: 853e mv a0,a5 + 3003178: 40f2 lw ra,28(sp) + 300317a: 4462 lw s0,24(sp) + 300317c: 6105 addi sp,sp,32 + 300317e: 8082 ret + +03003180 : + * @brief Get Core Clock Frequence + * @param None + * @retval unsigned int Core clock frequency + */ +unsigned int HAL_CRG_GetCoreClkFreq(void) +{ + 3003180: 1101 addi sp,sp,-32 + 3003182: ce06 sw ra,28(sp) + 3003184: cc22 sw s0,24(sp) + 3003186: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int coreClkSelect; + CRG_RegStruct *crg = g_crgBaseAddr; + 3003188: 040007b7 lui a5,0x4000 + 300318c: 4947a783 lw a5,1172(a5) # 4000494 + 3003190: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 3003194: fe842703 lw a4,-24(s0) + 3003198: 100007b7 lui a5,0x10000 + 300319c: 00f70a63 beq a4,a5,30031b0 + 30031a0: 14c00593 li a1,332 + 30031a4: 030067b7 lui a5,0x3006 + 30031a8: 4f478513 addi a0,a5,1268 # 30064f4 + 30031ac: 3ead jal ra,3002d26 + 30031ae: a001 j 30031ae + coreClkSelect = crg->PERI_CRG64.BIT.clk_pst1_sw_sel; + 30031b0: fe842783 lw a5,-24(s0) + 30031b4: 1007a783 lw a5,256(a5) + 30031b8: 8b8d andi a5,a5,3 + 30031ba: 9f81 uxtb a5 + 30031bc: fef42223 sw a5,-28(s0) + switch (coreClkSelect) { + 30031c0: fe442783 lw a5,-28(s0) + 30031c4: 4705 li a4,1 + 30031c6: 02e78063 beq a5,a4,30031e6 + 30031ca: 4705 li a4,1 + 30031cc: 00e7e663 bltu a5,a4,30031d8 + 30031d0: 4709 li a4,2 + 30031d2: 02e78163 beq a5,a4,30031f4 + 30031d6: a01d j 30031fc + case CRG_CORE_CLK_SELECT_HOSC: /* The clock source is an internal high-speed clock. */ + freq = HOSC_FREQ; + 30031d8: 017d87b7 lui a5,0x17d8 + 30031dc: 84078793 addi a5,a5,-1984 # 17d7840 + 30031e0: fef42623 sw a5,-20(s0) + break; + 30031e4: a015 j 3003208 + + case CRG_CORE_CLK_SELECT_TCXO: /* The clock source is the external crystal oscillator clock. */ + freq = XTRAIL_FREQ; + 30031e6: 01c9c7b7 lui a5,0x1c9c + 30031ea: 38078793 addi a5,a5,896 # 1c9c380 + 30031ee: fef42623 sw a5,-20(s0) + break; + 30031f2: a819 j 3003208 + + case CRG_CORE_CLK_SELECT_PLL: /* The clock source is the PLL. */ + freq = HAL_CRG_GetPllFreq(); + 30031f4: 3705 jal ra,3003114 + 30031f6: fea42623 sw a0,-20(s0) + break; + 30031fa: a039 j 3003208 + + default: + freq = LOSC_FREQ; + 30031fc: 67a1 lui a5,0x8 + 30031fe: d0078793 addi a5,a5,-768 # 7d00 + 3003202: fef42623 sw a5,-20(s0) + break; + 3003206: 0001 nop + } + return freq; + 3003208: fec42783 lw a5,-20(s0) +} + 300320c: 853e mv a0,a5 + 300320e: 40f2 lw ra,28(sp) + 3003210: 4462 lw s0,24(sp) + 3003212: 6105 addi sp,sp,32 + 3003214: 8082 ret + +03003216 : + * @brief Get Clock Frequence + * @param handle CRG Handle + * @retval Frequece of IP + */ +unsigned int HAL_CRG_GetIpFreq(const void *baseAddress) +{ + 3003216: 7179 addi sp,sp,-48 + 3003218: d606 sw ra,44(sp) + 300321a: d422 sw s0,40(sp) + 300321c: 1800 addi s0,sp,48 + 300321e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3003222: fdc42783 lw a5,-36(s0) + 3003226: eb89 bnez a5,3003238 + 3003228: 16900593 li a1,361 + 300322c: 030067b7 lui a5,0x3006 + 3003230: 4f478513 addi a0,a5,1268 # 30064f4 + 3003234: 3ccd jal ra,3002d26 + 3003236: a001 j 3003236 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003238: 040007b7 lui a5,0x4000 + 300323c: 4947a703 lw a4,1172(a5) # 4000494 + 3003240: 100007b7 lui a5,0x10000 + 3003244: 00f70a63 beq a4,a5,3003258 + 3003248: 16a00593 li a1,362 + 300324c: 030067b7 lui a5,0x3006 + 3003250: 4f478513 addi a0,a5,1268 # 30064f4 + 3003254: 3cc9 jal ra,3002d26 + 3003256: a001 j 3003256 +#ifdef FPGA + /* Use this function to obtain the clock frequency during the FPGA phase. */ + return CHIP_GetIpFreqHz(baseAddress); +#else + unsigned int hclk = HAL_CRG_GetCoreClkFreq(); + 3003258: 3725 jal ra,3003180 + 300325a: fea42423 sw a0,-24(s0) + unsigned int freq = LOSC_FREQ; + 300325e: 67a1 lui a5,0x8 + 3003260: d0078793 addi a5,a5,-768 # 7d00 + 3003264: fef42623 sw a5,-20(s0) + unsigned int coreClkFreq; + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003268: fdc42503 lw a0,-36(s0) + 300326c: 2cc9 jal ra,300353e + 300326e: fea42223 sw a0,-28(s0) + if (p == NULL) { + 3003272: fe442783 lw a5,-28(s0) + 3003276: e781 bnez a5,300327e + return freq; + 3003278: fec42783 lw a5,-20(s0) + 300327c: a895 j 30032f0 + } + switch (p->type) { + 300327e: fe442783 lw a5,-28(s0) + 3003282: 43dc lw a5,4(a5) + 3003284: 4715 li a4,5 + 3003286: 04f76a63 bltu a4,a5,30032da + 300328a: 00279713 slli a4,a5,0x2 + 300328e: 030067b7 lui a5,0x3006 + 3003292: 53078793 addi a5,a5,1328 # 3006530 + 3003296: 97ba add a5,a5,a4 + 3003298: 439c lw a5,0(a5) + 300329a: 8782 jr a5 + case CRG_IP_NONE_CLK_SEL: + case CRG_IP_EFC: + case CRG_IP_ANA: + freq = hclk; /* Returns the internal high speed clock frequency. */ + 300329c: fe842783 lw a5,-24(s0) + 30032a0: fef42623 sw a5,-20(s0) + break; + 30032a4: a825 j 30032dc + + case CRG_IP_CAN: + freq = CRG_GetPllRefIni(g_crgBaseAddr->PERI_CRG0.BIT.pll_ref_cksel); + 30032a6: 040007b7 lui a5,0x4000 + 30032aa: 4947a783 lw a5,1172(a5) # 4000494 + 30032ae: 439c lw a5,0(a5) + 30032b0: 8b85 andi a5,a5,1 + 30032b2: 9f81 uxtb a5 + 30032b4: 853e mv a0,a5 + 30032b6: 21d9 jal ra,300377c + 30032b8: fea42623 sw a0,-20(s0) + break; + 30032bc: a005 j 30032dc + + case CRG_IP_ADC: + /* Get core clock frequence for calculating the ADC clock frequency. */ + coreClkFreq = HAL_CRG_GetCoreClkFreq(); + 30032be: 35c9 jal ra,3003180 + 30032c0: fea42023 sw a0,-32(s0) + freq = CRG_GetAdcIpFreq(p, CRG_GetVcoFreq(), coreClkFreq); + 30032c4: 3b75 jal ra,3003080 + 30032c6: 87aa mv a5,a0 + 30032c8: fe042603 lw a2,-32(s0) + 30032cc: 85be mv a1,a5 + 30032ce: fe442503 lw a0,-28(s0) + 30032d2: 2c85 jal ra,3003542 + 30032d4: fea42623 sw a0,-20(s0) + break; + 30032d8: a011 j 30032dc + + case CRG_IP_IWDG: /* The IWDG clock frequency is an internal low-speed clock. */ + default: + break; + 30032da: 0001 nop + } + if (freq == 0) { + 30032dc: fec42783 lw a5,-20(s0) + 30032e0: e791 bnez a5,30032ec + freq = LOSC_FREQ; + 30032e2: 67a1 lui a5,0x8 + 30032e4: d0078793 addi a5,a5,-768 # 7d00 + 30032e8: fef42623 sw a5,-20(s0) + } + return freq; + 30032ec: fec42783 lw a5,-20(s0) +#endif +} + 30032f0: 853e mv a0,a5 + 30032f2: 50b2 lw ra,44(sp) + 30032f4: 5422 lw s0,40(sp) + 30032f6: 6145 addi sp,sp,48 + 30032f8: 8082 ret + +030032fa : + * @param enable enable mask + * @retval BASE_STATUS_ERROR Can't find the Match or operation is not support + * @retval BASE_STATUS_OK Operation Success + */ +BASE_StatusType HAL_CRG_IpEnableSet(const void *baseAddress, unsigned int enable) +{ + 30032fa: 7179 addi sp,sp,-48 + 30032fc: d606 sw ra,44(sp) + 30032fe: d422 sw s0,40(sp) + 3003300: 1800 addi s0,sp,48 + 3003302: fca42e23 sw a0,-36(s0) + 3003306: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 300330a: fdc42783 lw a5,-36(s0) + 300330e: eb89 bnez a5,3003320 + 3003310: 19c00593 li a1,412 + 3003314: 030067b7 lui a5,0x3006 + 3003318: 4f478513 addi a0,a5,1268 # 30064f4 + 300331c: 3429 jal ra,3002d26 + 300331e: a001 j 300331e + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003320: 040007b7 lui a5,0x4000 + 3003324: 4947a703 lw a4,1172(a5) # 4000494 + 3003328: 100007b7 lui a5,0x10000 + 300332c: 00f70a63 beq a4,a5,3003340 + 3003330: 19d00593 li a1,413 + 3003334: 030067b7 lui a5,0x3006 + 3003338: 4f478513 addi a0,a5,1268 # 30064f4 + 300333c: 32ed jal ra,3002d26 + 300333e: a001 j 300333e + /* Check the validity of the input parameters. */ + CRG_PARAM_CHECK_WITH_RET((enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE), BASE_STATUS_ERROR); + 3003340: fd842703 lw a4,-40(s0) + 3003344: 4785 li a5,1 + 3003346: 00f70e63 beq a4,a5,3003362 + 300334a: fd842783 lw a5,-40(s0) + 300334e: cb91 beqz a5,3003362 + 3003350: 19f00593 li a1,415 + 3003354: 030067b7 lui a5,0x3006 + 3003358: 4f478513 addi a0,a5,1268 # 30064f4 + 300335c: 32e9 jal ra,3002d26 + 300335e: 4785 li a5,1 + 3003360: a0a5 j 30033c8 + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003362: fdc42503 lw a0,-36(s0) + 3003366: 2ae1 jal ra,300353e + 3003368: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 300336c: fec42783 lw a5,-20(s0) + 3003370: c799 beqz a5,300337e + 3003372: fec42783 lw a5,-20(s0) + 3003376: 43d8 lw a4,4(a5) + 3003378: 4795 li a5,5 + 300337a: 00e7f463 bgeu a5,a4,3003382 + return BASE_STATUS_ERROR; + 300337e: 4785 li a5,1 + 3003380: a0a1 j 30033c8 + } + if (g_ipClkProc[p->type].enableSet == NULL) { + 3003382: fec42783 lw a5,-20(s0) + 3003386: 43d4 lw a3,4(a5) + 3003388: 040007b7 lui a5,0x4000 + 300338c: 02478713 addi a4,a5,36 # 4000024 + 3003390: 02400793 li a5,36 + 3003394: 02f687b3 mul a5,a3,a5 + 3003398: 97ba add a5,a5,a4 + 300339a: 479c lw a5,8(a5) + 300339c: e399 bnez a5,30033a2 + return BASE_STATUS_ERROR; + 300339e: 4785 li a5,1 + 30033a0: a025 j 30033c8 + } + g_ipClkProc[p->type].enableSet(p, enable); + 30033a2: fec42783 lw a5,-20(s0) + 30033a6: 43d4 lw a3,4(a5) + 30033a8: 040007b7 lui a5,0x4000 + 30033ac: 02478713 addi a4,a5,36 # 4000024 + 30033b0: 02400793 li a5,36 + 30033b4: 02f687b3 mul a5,a3,a5 + 30033b8: 97ba add a5,a5,a4 + 30033ba: 479c lw a5,8(a5) + 30033bc: fd842583 lw a1,-40(s0) + 30033c0: fec42503 lw a0,-20(s0) + 30033c4: 9782 jalr a5 + return BASE_STATUS_OK; + 30033c6: 4781 li a5,0 +} + 30033c8: 853e mv a0,a5 + 30033ca: 50b2 lw ra,44(sp) + 30033cc: 5422 lw s0,40(sp) + 30033ce: 6145 addi sp,sp,48 + 30033d0: 8082 ret + +030033d2 : + * @param select clock select, @see CRG_APBLsClkSelect for ip in apb_ls_subsys or CRG_AdcClkSelect for adc + * @retval BASE_STATUS_OK success + * @retval BASE_STATUS_ERROR fail + */ +BASE_StatusType HAL_CRG_IpClkSelectSet(const void *baseAddress, unsigned int select) +{ + 30033d2: 7179 addi sp,sp,-48 + 30033d4: d606 sw ra,44(sp) + 30033d6: d422 sw s0,40(sp) + 30033d8: 1800 addi s0,sp,48 + 30033da: fca42e23 sw a0,-36(s0) + 30033de: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 30033e2: fdc42783 lw a5,-36(s0) + 30033e6: eb89 bnez a5,30033f8 + 30033e8: 1cd00593 li a1,461 + 30033ec: 030067b7 lui a5,0x3006 + 30033f0: 4f478513 addi a0,a5,1268 # 30064f4 + 30033f4: 2d8d jal ra,3003a66 + 30033f6: a001 j 30033f6 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30033f8: 040007b7 lui a5,0x4000 + 30033fc: 4947a703 lw a4,1172(a5) # 4000494 + 3003400: 100007b7 lui a5,0x10000 + 3003404: 00f70a63 beq a4,a5,3003418 + 3003408: 1ce00593 li a1,462 + 300340c: 030067b7 lui a5,0x3006 + 3003410: 4f478513 addi a0,a5,1268 # 30064f4 + 3003414: 2d89 jal ra,3003a66 + 3003416: a001 j 3003416 + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3003418: fdc42503 lw a0,-36(s0) + 300341c: 220d jal ra,300353e + 300341e: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 3003422: fec42783 lw a5,-20(s0) + 3003426: c799 beqz a5,3003434 + 3003428: fec42783 lw a5,-20(s0) + 300342c: 43d8 lw a4,4(a5) + 300342e: 4795 li a5,5 + 3003430: 00e7f463 bgeu a5,a4,3003438 + return BASE_STATUS_ERROR; + 3003434: 4785 li a5,1 + 3003436: a0a1 j 300347e + } + if (g_ipClkProc[p->type].clkSelSet == NULL) { + 3003438: fec42783 lw a5,-20(s0) + 300343c: 43d4 lw a3,4(a5) + 300343e: 040007b7 lui a5,0x4000 + 3003442: 02478713 addi a4,a5,36 # 4000024 + 3003446: 02400793 li a5,36 + 300344a: 02f687b3 mul a5,a3,a5 + 300344e: 97ba add a5,a5,a4 + 3003450: 47dc lw a5,12(a5) + 3003452: e399 bnez a5,3003458 + return BASE_STATUS_ERROR; + 3003454: 4785 li a5,1 + 3003456: a025 j 300347e + } + g_ipClkProc[p->type].clkSelSet(p, select); /* Clock selection of the configuration module. */ + 3003458: fec42783 lw a5,-20(s0) + 300345c: 43d4 lw a3,4(a5) + 300345e: 040007b7 lui a5,0x4000 + 3003462: 02478713 addi a4,a5,36 # 4000024 + 3003466: 02400793 li a5,36 + 300346a: 02f687b3 mul a5,a3,a5 + 300346e: 97ba add a5,a5,a4 + 3003470: 47dc lw a5,12(a5) + 3003472: fd842583 lw a1,-40(s0) + 3003476: fec42503 lw a0,-20(s0) + 300347a: 9782 jalr a5 + return BASE_STATUS_OK; + 300347c: 4781 li a5,0 +} + 300347e: 853e mv a0,a5 + 3003480: 50b2 lw ra,44(sp) + 3003482: 5422 lw s0,40(sp) + 3003484: 6145 addi sp,sp,48 + 3003486: 8082 ret + +03003488 : + * @param div set div value + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Match Fail or Not support + */ +BASE_StatusType HAL_CRG_IpClkDivSet(const void *baseAddress, unsigned int div) +{ + 3003488: 7179 addi sp,sp,-48 + 300348a: d606 sw ra,44(sp) + 300348c: d422 sw s0,40(sp) + 300348e: 1800 addi s0,sp,48 + 3003490: fca42e23 sw a0,-36(s0) + 3003494: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3003498: fdc42783 lw a5,-36(s0) + 300349c: eb89 bnez a5,30034ae + 300349e: 22c00593 li a1,556 + 30034a2: 030067b7 lui a5,0x3006 + 30034a6: 4f478513 addi a0,a5,1268 # 30064f4 + 30034aa: 2b75 jal ra,3003a66 + 30034ac: a001 j 30034ac + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 30034ae: 040007b7 lui a5,0x4000 + 30034b2: 4947a703 lw a4,1172(a5) # 4000494 + 30034b6: 100007b7 lui a5,0x10000 + 30034ba: 00f70a63 beq a4,a5,30034ce + 30034be: 22d00593 li a1,557 + 30034c2: 030067b7 lui a5,0x3006 + 30034c6: 4f478513 addi a0,a5,1268 # 30064f4 + 30034ca: 2b71 jal ra,3003a66 + 30034cc: a001 j 30034cc + + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 30034ce: fdc42503 lw a0,-36(s0) + 30034d2: 20b5 jal ra,300353e + 30034d4: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 30034d8: fec42783 lw a5,-20(s0) + 30034dc: c799 beqz a5,30034ea + 30034de: fec42783 lw a5,-20(s0) + 30034e2: 43d8 lw a4,4(a5) + 30034e4: 4795 li a5,5 + 30034e6: 00e7f463 bgeu a5,a4,30034ee + return BASE_STATUS_ERROR; + 30034ea: 4785 li a5,1 + 30034ec: a0a1 j 3003534 + } + if (g_ipClkProc[p->type].clkDivSet == NULL) { + 30034ee: fec42783 lw a5,-20(s0) + 30034f2: 43d4 lw a3,4(a5) + 30034f4: 040007b7 lui a5,0x4000 + 30034f8: 02478713 addi a4,a5,36 # 4000024 + 30034fc: 02400793 li a5,36 + 3003500: 02f687b3 mul a5,a3,a5 + 3003504: 97ba add a5,a5,a4 + 3003506: 4b9c lw a5,16(a5) + 3003508: e399 bnez a5,300350e + return BASE_STATUS_ERROR; + 300350a: 4785 li a5,1 + 300350c: a025 j 3003534 + } + g_ipClkProc[p->type].clkDivSet(p, div); /* Configure the clock frequency divider of the module. */ + 300350e: fec42783 lw a5,-20(s0) + 3003512: 43d4 lw a3,4(a5) + 3003514: 040007b7 lui a5,0x4000 + 3003518: 02478713 addi a4,a5,36 # 4000024 + 300351c: 02400793 li a5,36 + 3003520: 02f687b3 mul a5,a3,a5 + 3003524: 97ba add a5,a5,a4 + 3003526: 4b9c lw a5,16(a5) + 3003528: fd842583 lw a1,-40(s0) + 300352c: fec42503 lw a0,-20(s0) + 3003530: 9782 jalr a5 + return BASE_STATUS_OK; + 3003532: 4781 li a5,0 +} + 3003534: 853e mv a0,a5 + 3003536: 50b2 lw ra,44(sp) + 3003538: 5422 lw s0,40(sp) + 300353a: 6145 addi sp,sp,48 + 300353c: 8082 ret + +0300353e : + 300353e: c6bfd06f j 30011a8 + +03003542 : + * @param coreClkFreq core clock rate + * @retval Ip Frequence + */ +static unsigned int CRG_GetAdcIpFreq(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int baseClkRate, + unsigned int coreClkFreq) +{ + 3003542: 7139 addi sp,sp,-64 + 3003544: de06 sw ra,60(sp) + 3003546: dc22 sw s0,56(sp) + 3003548: 0080 addi s0,sp,64 + 300354a: fca42623 sw a0,-52(s0) + 300354e: fcb42423 sw a1,-56(s0) + 3003552: fcc42223 sw a2,-60(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003556: fcc42783 lw a5,-52(s0) + 300355a: eb89 bnez a5,300356c + 300355c: 2af00593 li a1,687 + 3003560: 030067b7 lui a5,0x3006 + 3003564: 4f478513 addi a0,a5,1268 # 30064f4 + 3003568: 29fd jal ra,3003a66 + 300356a: a001 j 300356a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300356c: 040007b7 lui a5,0x4000 + 3003570: 4947a783 lw a5,1172(a5) # 4000494 + 3003574: eb89 bnez a5,3003586 + 3003576: 2b000593 li a1,688 + 300357a: 030067b7 lui a5,0x3006 + 300357e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003582: 21d5 jal ra,3003a66 + 3003584: a001 j 3003584 + + unsigned int clkSel; + unsigned int clkDiv; + unsigned int pst2Div; + unsigned int freq = 0; + 3003586: fe042623 sw zero,-20(s0) + + /* Obtains the clock source selection of the ADC. */ + const CRG_IpProc *proc = &g_ipClkProc[matchInfo->type]; + 300358a: fcc42783 lw a5,-52(s0) + 300358e: 43d8 lw a4,4(a5) + 3003590: 02400793 li a5,36 + 3003594: 02f70733 mul a4,a4,a5 + 3003598: 040007b7 lui a5,0x4000 + 300359c: 02478793 addi a5,a5,36 # 4000024 + 30035a0: 97ba add a5,a5,a4 + 30035a2: fef42423 sw a5,-24(s0) + if (proc->clkSelGet == NULL) { + 30035a6: fe842783 lw a5,-24(s0) + 30035aa: 4fdc lw a5,28(a5) + 30035ac: e399 bnez a5,30035b2 + return 0; + 30035ae: 4781 li a5,0 + 30035b0: a07d j 300365e + } + clkSel = proc->clkSelGet(matchInfo); + 30035b2: fe842783 lw a5,-24(s0) + 30035b6: 4fdc lw a5,28(a5) + 30035b8: fcc42503 lw a0,-52(s0) + 30035bc: 9782 jalr a5 + 30035be: fea42223 sw a0,-28(s0) + /* Calculate the frequency from the ADC's clock source. */ + if (clkSel == CRG_ADC_CLK_SYN_CORE) { + 30035c2: fe442703 lw a4,-28(s0) + 30035c6: 478d li a5,3 + 30035c8: 00f71763 bne a4,a5,30035d6 + freq = coreClkFreq; + 30035cc: fc442783 lw a5,-60(s0) + 30035d0: fef42623 sw a5,-20(s0) + 30035d4: a085 j 3003634 + } else if (clkSel == CRG_ADC_CLK_ASYN_HOSC) { + 30035d6: fe442783 lw a5,-28(s0) + 30035da: eb81 bnez a5,30035ea + freq = HOSC_FREQ; + 30035dc: 017d87b7 lui a5,0x17d8 + 30035e0: 84078793 addi a5,a5,-1984 # 17d7840 + 30035e4: fef42623 sw a5,-20(s0) + 30035e8: a0b1 j 3003634 + } else if (clkSel == CRG_ADC_CLK_ASYN_TCXO) { + 30035ea: fe442703 lw a4,-28(s0) + 30035ee: 4785 li a5,1 + 30035f0: 00f71963 bne a4,a5,3003602 + /* The maximum speed of the external clock source is 30000000U. */ + freq = (XTRAIL_FREQ > 30000000U) ? 0 : XTRAIL_FREQ; + 30035f4: 01c9c7b7 lui a5,0x1c9c + 30035f8: 38078793 addi a5,a5,896 # 1c9c380 + 30035fc: fef42623 sw a5,-20(s0) + 3003600: a815 j 3003634 + } else if (clkSel == CRG_ADC_CLK_ASYN_PLL_DIV) { + 3003602: fe442703 lw a4,-28(s0) + 3003606: 4789 li a5,2 + 3003608: 02f71663 bne a4,a5,3003634 + pst2Div = CRG_GetPllPostDivValue((CRG_PllPostDiv)g_crgBaseAddr->PERI_CRG3.BIT.pll_postdiv2); + 300360c: 040007b7 lui a5,0x4000 + 3003610: 4947a783 lw a5,1172(a5) # 4000494 + 3003614: 47dc lw a5,12(a5) + 3003616: 8391 srli a5,a5,0x4 + 3003618: 8bbd andi a5,a5,15 + 300361a: 9f81 uxtb a5 + 300361c: 853e mv a0,a5 + 300361e: 2ae5 jal ra,3003816 + 3003620: fea42023 sw a0,-32(s0) + freq = baseClkRate / pst2Div; + 3003624: fc842703 lw a4,-56(s0) + 3003628: fe042783 lw a5,-32(s0) + 300362c: 02f757b3 divu a5,a4,a5 + 3003630: fef42623 sw a5,-20(s0) + } + + /* Obtain the frequency divider based on the ADC clock source. */ + if (proc->clkDivGet == NULL) { + 3003634: fe842783 lw a5,-24(s0) + 3003638: 539c lw a5,32(a5) + 300363a: e399 bnez a5,3003640 + return 0; + 300363c: 4781 li a5,0 + 300363e: a005 j 300365e + } + clkDiv = proc->clkDivGet(matchInfo); + 3003640: fe842783 lw a5,-24(s0) + 3003644: 539c lw a5,32(a5) + 3003646: fcc42503 lw a0,-52(s0) + 300364a: 9782 jalr a5 + 300364c: fca42e23 sw a0,-36(s0) + /* Calculate the clock frequency of the ADC. */ + return (freq / (clkDiv + 1)); + 3003650: fdc42783 lw a5,-36(s0) + 3003654: 0785 addi a5,a5,1 + 3003656: fec42703 lw a4,-20(s0) + 300365a: 02f757b3 divu a5,a4,a5 +} + 300365e: 853e mv a0,a5 + 3003660: 50f2 lw ra,60(sp) + 3003662: 5462 lw s0,56(sp) + 3003664: 6121 addi sp,sp,64 + 3003666: 8082 ret + +03003668 : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValidPllConfig(const CRG_Handle *handle) +{ + 3003668: 7179 addi sp,sp,-48 + 300366a: d606 sw ra,44(sp) + 300366c: d422 sw s0,40(sp) + 300366e: 1800 addi s0,sp,48 + 3003670: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + unsigned int freq; + + freq = CRG_GetPllRefIni(handle->pllRefClkSelect); + 3003674: fdc42783 lw a5,-36(s0) + 3003678: 43dc lw a5,4(a5) + 300367a: 853e mv a0,a5 + 300367c: 2201 jal ra,300377c + 300367e: fea42623 sw a0,-20(s0) + preDiv = CRG_GetPreDivValue(handle->pllPreDiv); + 3003682: fdc42783 lw a5,-36(s0) + 3003686: 479c lw a5,8(a5) + 3003688: 853e mv a0,a5 + 300368a: 2a31 jal ra,30037a6 + 300368c: fea42423 sw a0,-24(s0) + /* Check the validity of the prescaled clock frequency. */ + if (!IsCrgValidPreDiv(freq, preDiv)) { + 3003690: fe842583 lw a1,-24(s0) + 3003694: fec42503 lw a0,-20(s0) + 3003698: c26ff0ef jal ra,3002abe + 300369c: 87aa mv a5,a0 + 300369e: 0017c793 xori a5,a5,1 + 30036a2: 9f81 uxtb a5 + 30036a4: c399 beqz a5,30036aa + return BASE_STATUS_ERROR; + 30036a6: 4785 li a5,1 + 30036a8: a8a5 j 3003720 + } + freq /= preDiv; + 30036aa: fec42703 lw a4,-20(s0) + 30036ae: fe842783 lw a5,-24(s0) + 30036b2: 02f757b3 divu a5,a4,a5 + 30036b6: fef42623 sw a5,-20(s0) + /* Check the validity of the clock frequency after frequency multiplication. */ + if (!IsCrgValidFdDiv(freq, handle->pllFbDiv)) { + 30036ba: fdc42783 lw a5,-36(s0) + 30036be: 47dc lw a5,12(a5) + 30036c0: 85be mv a1,a5 + 30036c2: fec42503 lw a0,-20(s0) + 30036c6: c56ff0ef jal ra,3002b1c + 30036ca: 87aa mv a5,a0 + 30036cc: 0017c793 xori a5,a5,1 + 30036d0: 9f81 uxtb a5 + 30036d2: c399 beqz a5,30036d8 + return BASE_STATUS_ERROR; + 30036d4: 4785 li a5,1 + 30036d6: a0a9 j 3003720 + } + freq *= (handle->pllFbDiv > 0x06) ? handle->pllFbDiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 30036d8: fdc42783 lw a5,-36(s0) + 30036dc: 47dc lw a5,12(a5) + 30036de: 4719 li a4,6 + 30036e0: 00e7f363 bgeu a5,a4,30036e6 + 30036e4: 4799 li a5,6 + 30036e6: fec42703 lw a4,-20(s0) + 30036ea: 02f707b3 mul a5,a4,a5 + 30036ee: fef42623 sw a5,-20(s0) + /* Check whether the PLL output frequency is valid. */ + if (IsCrgValidPostDiv(freq, handle->pllPostDiv) && IsCrgValidPostDiv2(freq, handle->handleEx.pllPostDiv2)) { + 30036f2: fdc42783 lw a5,-36(s0) + 30036f6: 4b9c lw a5,16(a5) + 30036f8: 85be mv a1,a5 + 30036fa: fec42503 lw a0,-20(s0) + 30036fe: ca8ff0ef jal ra,3002ba6 + 3003702: 87aa mv a5,a0 + 3003704: cf89 beqz a5,300371e + 3003706: fdc42783 lw a5,-36(s0) + 300370a: 4fdc lw a5,28(a5) + 300370c: 85be mv a1,a5 + 300370e: fec42503 lw a0,-20(s0) + 3003712: cdcff0ef jal ra,3002bee + 3003716: 87aa mv a5,a0 + 3003718: c399 beqz a5,300371e + return BASE_STATUS_OK; + 300371a: 4781 li a5,0 + 300371c: a011 j 3003720 + } + return BASE_STATUS_ERROR; + 300371e: 4785 li a5,1 +} + 3003720: 853e mv a0,a5 + 3003722: 50b2 lw ra,44(sp) + 3003724: 5422 lw s0,40(sp) + 3003726: 6145 addi sp,sp,48 + 3003728: 8082 ret + +0300372a : + * @param CRG_Handle CRG handle + * @retval BASE_STATUS_OK Check Success + * @retval BASE_STATUS_ERROR Check Fail + */ +static BASE_StatusType CRG_IsValid1MHzConfig(const CRG_Handle *handle) +{ + 300372a: 7179 addi sp,sp,-48 + 300372c: d622 sw s0,44(sp) + 300372e: 1800 addi s0,sp,48 + 3003730: fca42e23 sw a0,-36(s0) + unsigned int freq; + /* Get the ref frequency of the 1 MHz clock. */ + freq = (handle->handleEx.clk1MSelect == CRG_1M_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003734: fdc42783 lw a5,-36(s0) + 3003738: 539c lw a5,32(a5) + 300373a: e791 bnez a5,3003746 + 300373c: 017d87b7 lui a5,0x17d8 + 3003740: 84078793 addi a5,a5,-1984 # 17d7840 + 3003744: a029 j 300374e + 3003746: 01c9c7b7 lui a5,0x1c9c + 300374a: 38078793 addi a5,a5,896 # 1c9c380 + 300374e: fef42623 sw a5,-20(s0) + /* Check whether the 1MHz output frequency is valid. */ + if ((freq / (handle->handleEx.clk1MDiv + 1)) == CRG_FREQ_1MHz) { + 3003752: fdc42783 lw a5,-36(s0) + 3003756: 53dc lw a5,36(a5) + 3003758: 0785 addi a5,a5,1 + 300375a: fec42703 lw a4,-20(s0) + 300375e: 02f75733 divu a4,a4,a5 + 3003762: 000f47b7 lui a5,0xf4 + 3003766: 24078793 addi a5,a5,576 # f4240 + 300376a: 00f71463 bne a4,a5,3003772 + return BASE_STATUS_OK; + 300376e: 4781 li a5,0 + 3003770: a011 j 3003774 + } + return BASE_STATUS_ERROR; + 3003772: 4785 li a5,1 +} + 3003774: 853e mv a0,a5 + 3003776: 5432 lw s0,44(sp) + 3003778: 6145 addi sp,sp,48 + 300377a: 8082 ret + +0300377c : + * @brief Get clock frequence + * @param crg CRG_RegStruct + * @retval The frequence fo clock + */ +static inline unsigned int CRG_GetPllRefIni(CRG_PllRefClkSelect pllRefClkSelect) +{ + 300377c: 1101 addi sp,sp,-32 + 300377e: ce22 sw s0,28(sp) + 3003780: 1000 addi s0,sp,32 + 3003782: fea42623 sw a0,-20(s0) + /* The maximum speed of the external clock source is 30000000U. */ + if (pllRefClkSelect == CRG_PLL_REF_CLK_SELECT_XTAL && XTRAIL_FREQ > 30000000U) { + return 0; + } + return (pllRefClkSelect == (unsigned int)CRG_PLL_REF_CLK_SELECT_HOSC) ? HOSC_FREQ : XTRAIL_FREQ; + 3003786: fec42783 lw a5,-20(s0) + 300378a: e791 bnez a5,3003796 + 300378c: 017d87b7 lui a5,0x17d8 + 3003790: 84078793 addi a5,a5,-1984 # 17d7840 + 3003794: a029 j 300379e + 3003796: 01c9c7b7 lui a5,0x1c9c + 300379a: 38078793 addi a5,a5,896 # 1c9c380 +} + 300379e: 853e mv a0,a5 + 30037a0: 4472 lw s0,28(sp) + 30037a2: 6105 addi sp,sp,32 + 30037a4: 8082 ret + +030037a6 : + * @brief Get previous division Value before PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPreDivValue(CRG_PllPreDiv pllPredDiv) +{ + 30037a6: 7179 addi sp,sp,-48 + 30037a8: d622 sw s0,44(sp) + 30037aa: 1800 addi s0,sp,48 + 30037ac: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + if (pllPredDiv <= CRG_PLL_PREDIV_1) { /* 0 or 1 returns PLL_PREDIV_OUT_1. */ + 30037b0: fdc42783 lw a5,-36(s0) + 30037b4: e789 bnez a5,30037be + preDiv = PLL_PREDIV_OUT_1; + 30037b6: 4785 li a5,1 + 30037b8: fef42623 sw a5,-20(s0) + 30037bc: a031 j 30037c8 + } else { + preDiv = pllPredDiv + 1; + 30037be: fdc42783 lw a5,-36(s0) + 30037c2: 0785 addi a5,a5,1 + 30037c4: fef42623 sw a5,-20(s0) + } + return preDiv; + 30037c8: fec42783 lw a5,-20(s0) +} + 30037cc: 853e mv a0,a5 + 30037ce: 5432 lw s0,44(sp) + 30037d0: 6145 addi sp,sp,48 + 30037d2: 8082 ret + +030037d4 : + * @brief Get PLL loop divider ratio + * @param crg CRG_RegStruct + * @retval PLL loop divider ratio + */ +static inline unsigned int CRG_GetPllFbDivValue(unsigned int pllFbDiv) +{ + 30037d4: 7179 addi sp,sp,-48 + 30037d6: d622 sw s0,44(sp) + 30037d8: 1800 addi s0,sp,48 + 30037da: fca42e23 sw a0,-36(s0) + unsigned int div = pllFbDiv; + 30037de: fdc42783 lw a5,-36(s0) + 30037e2: fef42623 sw a5,-20(s0) + /* Check the validity of the minimum frequency multiplication parameter. */ + if (div < CRG_PLL_FBDIV_MIN) { + 30037e6: fec42703 lw a4,-20(s0) + 30037ea: 4795 li a5,5 + 30037ec: 00e7e563 bltu a5,a4,30037f6 + div = CRG_PLL_FBDIV_MIN; + 30037f0: 4799 li a5,6 + 30037f2: fef42623 sw a5,-20(s0) + } + /* Check the validity of the maximum frequency multiplication parameter. */ + if (div > CRG_PLL_FBDIV_MAX) { + 30037f6: fec42703 lw a4,-20(s0) + 30037fa: 07f00793 li a5,127 + 30037fe: 00e7f663 bgeu a5,a4,300380a + div = CRG_PLL_FBDIV_MAX; + 3003802: 07f00793 li a5,127 + 3003806: fef42623 sw a5,-20(s0) + } + return div; + 300380a: fec42783 lw a5,-20(s0) +} + 300380e: 853e mv a0,a5 + 3003810: 5432 lw s0,44(sp) + 3003812: 6145 addi sp,sp,48 + 3003814: 8082 ret + +03003816 : + * @brief Get post division Value after PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPllPostDivValue(unsigned int pllPostDiv) +{ + 3003816: 7179 addi sp,sp,-48 + 3003818: d622 sw s0,44(sp) + 300381a: 1800 addi s0,sp,48 + 300381c: fca42e23 sw a0,-36(s0) + unsigned int div = pllPostDiv; + 3003820: fdc42783 lw a5,-36(s0) + 3003824: fef42623 sw a5,-20(s0) + if (div > CRG_PLL_POSTDIV_8) { + 3003828: fec42703 lw a4,-20(s0) + 300382c: 479d li a5,7 + 300382e: 00e7f663 bgeu a5,a4,300383a + div = (CRG_PLL_POSTDIV_8 + 1); /* If the postdiv is greater than 8, set this postdiv to 8. */ + 3003832: 47a1 li a5,8 + 3003834: fef42623 sw a5,-20(s0) + 3003838: a031 j 3003844 + } else { + div += 1; + 300383a: fec42783 lw a5,-20(s0) + 300383e: 0785 addi a5,a5,1 + 3003840: fef42623 sw a5,-20(s0) + } + return div; + 3003844: fec42783 lw a5,-20(s0) +} + 3003848: 853e mv a0,a5 + 300384a: 5432 lw s0,44(sp) + 300384c: 6145 addi sp,sp,48 + 300384e: 8082 ret + +03003850 : + * @param matchInfo IP without Clock select match info + * @param enable BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003850: 7179 addi sp,sp,-48 + 3003852: d606 sw ra,44(sp) + 3003854: d422 sw s0,40(sp) + 3003856: 1800 addi s0,sp,48 + 3003858: fca42e23 sw a0,-36(s0) + 300385c: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003860: fdc42783 lw a5,-36(s0) + 3003864: eb89 bnez a5,3003876 + 3003866: 34d00593 li a1,845 + 300386a: 030067b7 lui a5,0x3006 + 300386e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003872: 2ad5 jal ra,3003a66 + 3003874: a001 j 3003874 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003876: 040007b7 lui a5,0x4000 + 300387a: 4947a783 lw a5,1172(a5) # 4000494 + 300387e: eb89 bnez a5,3003890 + 3003880: 34e00593 li a1,846 + 3003884: 030067b7 lui a5,0x3006 + 3003888: 4f478513 addi a0,a5,1268 # 30064f4 + 300388c: 2ae9 jal ra,3003a66 + 300388e: a001 j 300388e + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003890: 040007b7 lui a5,0x4000 + 3003894: 4947a783 lw a5,1172(a5) # 4000494 + 3003898: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 300389c: fdc42783 lw a5,-36(s0) + 30038a0: 279e lhu a5,8(a5) + 30038a2: 873e mv a4,a5 + 30038a4: fec42783 lw a5,-20(s0) + 30038a8: 97ba add a5,a5,a4 + 30038aa: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 30038ae: fe842783 lw a5,-24(s0) + 30038b2: 439c lw a5,0(a5) + 30038b4: fef42223 sw a5,-28(s0) + if (enable & IP_CLK_ENABLE) { /* Set enable of target ip. */ + 30038b8: fd842783 lw a5,-40(s0) + 30038bc: 8b85 andi a5,a5,1 + 30038be: c7c1 beqz a5,3003946 + cfg.BIT.clkEnMask |= 1 << matchInfo->bitOffset; + 30038c0: fe442783 lw a5,-28(s0) + 30038c4: 9fa1 uxth a5 + 30038c6: 01079713 slli a4,a5,0x10 + 30038ca: 8741 srai a4,a4,0x10 + 30038cc: fdc42783 lw a5,-36(s0) + 30038d0: 27bc lbu a5,10(a5) + 30038d2: 86be mv a3,a5 + 30038d4: 4785 li a5,1 + 30038d6: 00d797b3 sll a5,a5,a3 + 30038da: 07c2 slli a5,a5,0x10 + 30038dc: 87c1 srai a5,a5,0x10 + 30038de: 8fd9 or a5,a5,a4 + 30038e0: 07c2 slli a5,a5,0x10 + 30038e2: 87c1 srai a5,a5,0x10 + 30038e4: 01079693 slli a3,a5,0x10 + 30038e8: 82c1 srli a3,a3,0x10 + 30038ea: fe442783 lw a5,-28(s0) + 30038ee: 6741 lui a4,0x10 + 30038f0: 177d addi a4,a4,-1 # ffff + 30038f2: 8f75 and a4,a4,a3 + 30038f4: 76c1 lui a3,0xffff0 + 30038f6: 8ff5 and a5,a5,a3 + 30038f8: 8fd9 or a5,a5,a4 + 30038fa: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); + 30038fe: fe442783 lw a5,-28(s0) + 3003902: 83c1 srli a5,a5,0x10 + 3003904: 9fa1 uxth a5 + 3003906: 01079713 slli a4,a5,0x10 + 300390a: 8741 srai a4,a4,0x10 + 300390c: fdc42783 lw a5,-36(s0) + 3003910: 27bc lbu a5,10(a5) + 3003912: 86be mv a3,a5 + 3003914: 4785 li a5,1 + 3003916: 00d797b3 sll a5,a5,a3 + 300391a: 07c2 slli a5,a5,0x10 + 300391c: 87c1 srai a5,a5,0x10 + 300391e: fff7c793 not a5,a5 + 3003922: 07c2 slli a5,a5,0x10 + 3003924: 87c1 srai a5,a5,0x10 + 3003926: 8ff9 and a5,a5,a4 + 3003928: 07c2 slli a5,a5,0x10 + 300392a: 87c1 srai a5,a5,0x10 + 300392c: 01079713 slli a4,a5,0x10 + 3003930: 8341 srli a4,a4,0x10 + 3003932: fe442783 lw a5,-28(s0) + 3003936: 0742 slli a4,a4,0x10 + 3003938: 66c1 lui a3,0x10 + 300393a: 16fd addi a3,a3,-1 # ffff + 300393c: 8ff5 and a5,a5,a3 + 300393e: 8fd9 or a5,a5,a4 + 3003940: fef42223 sw a5,-28(s0) + 3003944: a059 j 30039ca + } else { + cfg.BIT.clkEnMask &= ~(1 << matchInfo->bitOffset); /* Disable of target ip. */ + 3003946: fe442783 lw a5,-28(s0) + 300394a: 9fa1 uxth a5 + 300394c: 01079713 slli a4,a5,0x10 + 3003950: 8741 srai a4,a4,0x10 + 3003952: fdc42783 lw a5,-36(s0) + 3003956: 27bc lbu a5,10(a5) + 3003958: 86be mv a3,a5 + 300395a: 4785 li a5,1 + 300395c: 00d797b3 sll a5,a5,a3 + 3003960: 07c2 slli a5,a5,0x10 + 3003962: 87c1 srai a5,a5,0x10 + 3003964: fff7c793 not a5,a5 + 3003968: 07c2 slli a5,a5,0x10 + 300396a: 87c1 srai a5,a5,0x10 + 300396c: 8ff9 and a5,a5,a4 + 300396e: 07c2 slli a5,a5,0x10 + 3003970: 87c1 srai a5,a5,0x10 + 3003972: 01079693 slli a3,a5,0x10 + 3003976: 82c1 srli a3,a3,0x10 + 3003978: fe442783 lw a5,-28(s0) + 300397c: 6741 lui a4,0x10 + 300397e: 177d addi a4,a4,-1 # ffff + 3003980: 8f75 and a4,a4,a3 + 3003982: 76c1 lui a3,0xffff0 + 3003984: 8ff5 and a5,a5,a3 + 3003986: 8fd9 or a5,a5,a4 + 3003988: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq |= (1 << matchInfo->bitOffset); + 300398c: fe442783 lw a5,-28(s0) + 3003990: 83c1 srli a5,a5,0x10 + 3003992: 9fa1 uxth a5 + 3003994: 01079713 slli a4,a5,0x10 + 3003998: 8741 srai a4,a4,0x10 + 300399a: fdc42783 lw a5,-36(s0) + 300399e: 27bc lbu a5,10(a5) + 30039a0: 86be mv a3,a5 + 30039a2: 4785 li a5,1 + 30039a4: 00d797b3 sll a5,a5,a3 + 30039a8: 07c2 slli a5,a5,0x10 + 30039aa: 87c1 srai a5,a5,0x10 + 30039ac: 8fd9 or a5,a5,a4 + 30039ae: 07c2 slli a5,a5,0x10 + 30039b0: 87c1 srai a5,a5,0x10 + 30039b2: 01079713 slli a4,a5,0x10 + 30039b6: 8341 srli a4,a4,0x10 + 30039b8: fe442783 lw a5,-28(s0) + 30039bc: 0742 slli a4,a4,0x10 + 30039be: 66c1 lui a3,0x10 + 30039c0: 16fd addi a3,a3,-1 # ffff + 30039c2: 8ff5 and a5,a5,a3 + 30039c4: 8fd9 or a5,a5,a4 + 30039c6: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 30039ca: fe442703 lw a4,-28(s0) + 30039ce: fe842783 lw a5,-24(s0) + 30039d2: c398 sw a4,0(a5) +} + 30039d4: 0001 nop + 30039d6: 50b2 lw ra,44(sp) + 30039d8: 5422 lw s0,40(sp) + 30039da: 6145 addi sp,sp,48 + 30039dc: 8082 ret + +030039de : + * @brief Get Enable status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock Enable status + */ +static unsigned int CRG_IpWoClkSelEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30039de: 7179 addi sp,sp,-48 + 30039e0: d606 sw ra,44(sp) + 30039e2: d422 sw s0,40(sp) + 30039e4: 1800 addi s0,sp,48 + 30039e6: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30039ea: fdc42783 lw a5,-36(s0) + 30039ee: eb89 bnez a5,3003a00 + 30039f0: 36500593 li a1,869 + 30039f4: 030067b7 lui a5,0x3006 + 30039f8: 4f478513 addi a0,a5,1268 # 30064f4 + 30039fc: 20ad jal ra,3003a66 + 30039fe: a001 j 30039fe + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003a00: 040007b7 lui a5,0x4000 + 3003a04: 4947a783 lw a5,1172(a5) # 4000494 + 3003a08: eb89 bnez a5,3003a1a + 3003a0a: 36600593 li a1,870 + 3003a0e: 030067b7 lui a5,0x3006 + 3003a12: 4f478513 addi a0,a5,1268 # 30064f4 + 3003a16: 2881 jal ra,3003a66 + 3003a18: a001 j 3003a18 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003a1a: 040007b7 lui a5,0x4000 + 3003a1e: 4947a783 lw a5,1172(a5) # 4000494 + 3003a22: fef42623 sw a5,-20(s0) + /* Get enable status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003a26: fdc42783 lw a5,-36(s0) + 3003a2a: 279e lhu a5,8(a5) + 3003a2c: 873e mv a4,a5 + 3003a2e: fec42783 lw a5,-20(s0) + 3003a32: 97ba add a5,a5,a4 + 3003a34: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + + cfg.value = p->value; + 3003a38: fe842783 lw a5,-24(s0) + 3003a3c: 439c lw a5,0(a5) + 3003a3e: fef42223 sw a5,-28(s0) + return (cfg.BIT.clkEnMask & (1 << matchInfo->bitOffset)) == 0 ? false : true; + 3003a42: fe442783 lw a5,-28(s0) + 3003a46: 9fa1 uxth a5 + 3003a48: 873e mv a4,a5 + 3003a4a: fdc42783 lw a5,-36(s0) + 3003a4e: 27bc lbu a5,10(a5) + 3003a50: 40f757b3 sra a5,a4,a5 + 3003a54: 8b85 andi a5,a5,1 + 3003a56: 00f037b3 snez a5,a5 + 3003a5a: 9f81 uxtb a5 +} + 3003a5c: 853e mv a0,a5 + 3003a5e: 50b2 lw ra,44(sp) + 3003a60: 5422 lw s0,40(sp) + 3003a62: 6145 addi sp,sp,48 + 3003a64: 8082 ret + +03003a66 : + 3003a66: c48fe06f j 3001eae + +03003a6a : + * @param matchInfo IP without Clock select match info + * @param reset BASE_CFG_SET or BASE_CFG_UNSET + * @retval None + */ +static void CRG_IpWoClkSelResetSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int reset) +{ + 3003a6a: 7179 addi sp,sp,-48 + 3003a6c: d606 sw ra,44(sp) + 3003a6e: d422 sw s0,40(sp) + 3003a70: 1800 addi s0,sp,48 + 3003a72: fca42e23 sw a0,-36(s0) + 3003a76: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003a7a: fdc42783 lw a5,-36(s0) + 3003a7e: eb89 bnez a5,3003a90 + 3003a80: 37900593 li a1,889 + 3003a84: 030067b7 lui a5,0x3006 + 3003a88: 4f478513 addi a0,a5,1268 # 30064f4 + 3003a8c: 3fe9 jal ra,3003a66 + 3003a8e: a001 j 3003a8e + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003a90: 040007b7 lui a5,0x4000 + 3003a94: 4947a783 lw a5,1172(a5) # 4000494 + 3003a98: eb89 bnez a5,3003aaa + 3003a9a: 37a00593 li a1,890 + 3003a9e: 030067b7 lui a5,0x3006 + 3003aa2: 4f478513 addi a0,a5,1268 # 30064f4 + 3003aa6: 37c1 jal ra,3003a66 + 3003aa8: a001 j 3003aa8 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003aaa: 040007b7 lui a5,0x4000 + 3003aae: 4947a783 lw a5,1172(a5) # 4000494 + 3003ab2: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003ab6: fdc42783 lw a5,-36(s0) + 3003aba: 279e lhu a5,8(a5) + 3003abc: 873e mv a4,a5 + 3003abe: fec42783 lw a5,-20(s0) + 3003ac2: 97ba add a5,a5,a4 + 3003ac4: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003ac8: fe842783 lw a5,-24(s0) + 3003acc: 439c lw a5,0(a5) + 3003ace: fef42223 sw a5,-28(s0) + if (reset & BASE_CFG_SET) { + 3003ad2: fd842783 lw a5,-40(s0) + 3003ad6: 8b85 andi a5,a5,1 + 3003ad8: c3a9 beqz a5,3003b1a + cfg.BIT.softResetReq |= 1 << matchInfo->bitOffset; /* reset of target ip. */ + 3003ada: fe442783 lw a5,-28(s0) + 3003ade: 83c1 srli a5,a5,0x10 + 3003ae0: 9fa1 uxth a5 + 3003ae2: 01079713 slli a4,a5,0x10 + 3003ae6: 8741 srai a4,a4,0x10 + 3003ae8: fdc42783 lw a5,-36(s0) + 3003aec: 27bc lbu a5,10(a5) + 3003aee: 86be mv a3,a5 + 3003af0: 4785 li a5,1 + 3003af2: 00d797b3 sll a5,a5,a3 + 3003af6: 07c2 slli a5,a5,0x10 + 3003af8: 87c1 srai a5,a5,0x10 + 3003afa: 8fd9 or a5,a5,a4 + 3003afc: 07c2 slli a5,a5,0x10 + 3003afe: 87c1 srai a5,a5,0x10 + 3003b00: 01079713 slli a4,a5,0x10 + 3003b04: 8341 srli a4,a4,0x10 + 3003b06: fe442783 lw a5,-28(s0) + 3003b0a: 0742 slli a4,a4,0x10 + 3003b0c: 66c1 lui a3,0x10 + 3003b0e: 16fd addi a3,a3,-1 # ffff + 3003b10: 8ff5 and a5,a5,a3 + 3003b12: 8fd9 or a5,a5,a4 + 3003b14: fef42223 sw a5,-28(s0) + 3003b18: a0a1 j 3003b60 + } else { + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); /* Undo reset of target ip. */ + 3003b1a: fe442783 lw a5,-28(s0) + 3003b1e: 83c1 srli a5,a5,0x10 + 3003b20: 9fa1 uxth a5 + 3003b22: 01079713 slli a4,a5,0x10 + 3003b26: 8741 srai a4,a4,0x10 + 3003b28: fdc42783 lw a5,-36(s0) + 3003b2c: 27bc lbu a5,10(a5) + 3003b2e: 86be mv a3,a5 + 3003b30: 4785 li a5,1 + 3003b32: 00d797b3 sll a5,a5,a3 + 3003b36: 07c2 slli a5,a5,0x10 + 3003b38: 87c1 srai a5,a5,0x10 + 3003b3a: fff7c793 not a5,a5 + 3003b3e: 07c2 slli a5,a5,0x10 + 3003b40: 87c1 srai a5,a5,0x10 + 3003b42: 8ff9 and a5,a5,a4 + 3003b44: 07c2 slli a5,a5,0x10 + 3003b46: 87c1 srai a5,a5,0x10 + 3003b48: 01079713 slli a4,a5,0x10 + 3003b4c: 8341 srli a4,a4,0x10 + 3003b4e: fe442783 lw a5,-28(s0) + 3003b52: 0742 slli a4,a4,0x10 + 3003b54: 66c1 lui a3,0x10 + 3003b56: 16fd addi a3,a3,-1 # ffff + 3003b58: 8ff5 and a5,a5,a3 + 3003b5a: 8fd9 or a5,a5,a4 + 3003b5c: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3003b60: fe442703 lw a4,-28(s0) + 3003b64: fe842783 lw a5,-24(s0) + 3003b68: c398 sw a4,0(a5) +} + 3003b6a: 0001 nop + 3003b6c: 50b2 lw ra,44(sp) + 3003b6e: 5422 lw s0,40(sp) + 3003b70: 6145 addi sp,sp,48 + 3003b72: 8082 ret + +03003b74 : + * @brief Get Reset status of IP in APB_HS_SUBSYS + * @param matchInfo IP without Clock select match info + * @retval Clock select reset status + */ +static unsigned int CRG_IpWoClkSelResetGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003b74: 7179 addi sp,sp,-48 + 3003b76: d606 sw ra,44(sp) + 3003b78: d422 sw s0,40(sp) + 3003b7a: 1800 addi s0,sp,48 + 3003b7c: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003b80: fdc42783 lw a5,-36(s0) + 3003b84: eb89 bnez a5,3003b96 + 3003b86: 38f00593 li a1,911 + 3003b8a: 030067b7 lui a5,0x3006 + 3003b8e: 4f478513 addi a0,a5,1268 # 30064f4 + 3003b92: 3dd1 jal ra,3003a66 + 3003b94: a001 j 3003b94 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003b96: 040007b7 lui a5,0x4000 + 3003b9a: 4947a783 lw a5,1172(a5) # 4000494 + 3003b9e: eb89 bnez a5,3003bb0 + 3003ba0: 39000593 li a1,912 + 3003ba4: 030067b7 lui a5,0x3006 + 3003ba8: 4f478513 addi a0,a5,1268 # 30064f4 + 3003bac: 3d6d jal ra,3003a66 + 3003bae: a001 j 3003bae + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003bb0: 040007b7 lui a5,0x4000 + 3003bb4: 4947a783 lw a5,1172(a5) # 4000494 + 3003bb8: fef42623 sw a5,-20(s0) + /* Get the reset status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3003bbc: fdc42783 lw a5,-36(s0) + 3003bc0: 279e lhu a5,8(a5) + 3003bc2: 873e mv a4,a5 + 3003bc4: fec42783 lw a5,-20(s0) + 3003bc8: 97ba add a5,a5,a4 + 3003bca: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3003bce: fe842783 lw a5,-24(s0) + 3003bd2: 439c lw a5,0(a5) + 3003bd4: fef42223 sw a5,-28(s0) + return (cfg.BIT.softResetReq & (1 << matchInfo->bitOffset)) ? BASE_CFG_SET : BASE_CFG_UNSET; + 3003bd8: fe442783 lw a5,-28(s0) + 3003bdc: 83c1 srli a5,a5,0x10 + 3003bde: 9fa1 uxth a5 + 3003be0: 873e mv a4,a5 + 3003be2: fdc42783 lw a5,-36(s0) + 3003be6: 27bc lbu a5,10(a5) + 3003be8: 40f757b3 sra a5,a4,a5 + 3003bec: 8b85 andi a5,a5,1 + 3003bee: 00f037b3 snez a5,a5 + 3003bf2: 9f81 uxtb a5 +} + 3003bf4: 853e mv a0,a5 + 3003bf6: 50b2 lw ra,44(sp) + 3003bf8: 5422 lw s0,40(sp) + 3003bfa: 6145 addi sp,sp,48 + 3003bfc: 8082 ret + +03003bfe : + * @param matchInfo ADC match info + * @param enable IP_CLK_ENABLE + * @retval None + */ +static void CRG_AdcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3003bfe: 7179 addi sp,sp,-48 + 3003c00: d606 sw ra,44(sp) + 3003c02: d422 sw s0,40(sp) + 3003c04: 1800 addi s0,sp,48 + 3003c06: fca42e23 sw a0,-36(s0) + 3003c0a: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003c0e: fdc42783 lw a5,-36(s0) + 3003c12: eb89 bnez a5,3003c24 + 3003c14: 3a200593 li a1,930 + 3003c18: 030067b7 lui a5,0x3006 + 3003c1c: 4f478513 addi a0,a5,1268 # 30064f4 + 3003c20: 3599 jal ra,3003a66 + 3003c22: a001 j 3003c22 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003c24: 040007b7 lui a5,0x4000 + 3003c28: 4947a783 lw a5,1172(a5) # 4000494 + 3003c2c: eb89 bnez a5,3003c3e + 3003c2e: 3a300593 li a1,931 + 3003c32: 030067b7 lui a5,0x3006 + 3003c36: 4f478513 addi a0,a5,1268 # 30064f4 + 3003c3a: 3535 jal ra,3003a66 + 3003c3c: a001 j 3003c3c + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003c3e: 040007b7 lui a5,0x4000 + 3003c42: 4947a783 lw a5,1172(a5) # 4000494 + 3003c46: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003c4a: fdc42783 lw a5,-36(s0) + 3003c4e: 279e lhu a5,8(a5) + 3003c50: 873e mv a4,a5 + 3003c52: fec42783 lw a5,-20(s0) + 3003c56: 97ba add a5,a5,a4 + 3003c58: fef42423 sw a5,-24(s0) + CRG_AdcIpCfg cfg; + cfg.value[1] = p->value[1]; + 3003c5c: fe842783 lw a5,-24(s0) + 3003c60: 43dc lw a5,4(a5) + 3003c62: fef42223 sw a5,-28(s0) + if (enable) { /* Enables and Deassert reset the ADC clock. */ + 3003c66: fd842783 lw a5,-40(s0) + 3003c6a: cf99 beqz a5,3003c88 + cfg.BIT.clk_adc_cken = BASE_CFG_SET; + 3003c6c: fe442783 lw a5,-28(s0) + 3003c70: 0017e793 ori a5,a5,1 + 3003c74: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003c78: fe442783 lw a5,-28(s0) + 3003c7c: 7741 lui a4,0xffff0 + 3003c7e: 177d addi a4,a4,-1 # fffeffff + 3003c80: 8ff9 and a5,a5,a4 + 3003c82: fef42223 sw a5,-28(s0) + 3003c86: a829 j 3003ca0 + } else { /* Disable and reset the ADC clock. */ + cfg.BIT.clk_adc_cken = BASE_CFG_UNSET; + 3003c88: fe442783 lw a5,-28(s0) + 3003c8c: 9bf9 andi a5,a5,-2 + 3003c8e: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3003c92: fe442783 lw a5,-28(s0) + 3003c96: 7741 lui a4,0xffff0 + 3003c98: 177d addi a4,a4,-1 # fffeffff + 3003c9a: 8ff9 and a5,a5,a4 + 3003c9c: fef42223 sw a5,-28(s0) + } + p->value[1] = cfg.value[1]; + 3003ca0: fe442703 lw a4,-28(s0) + 3003ca4: fe842783 lw a5,-24(s0) + 3003ca8: c3d8 sw a4,4(a5) +} + 3003caa: 0001 nop + 3003cac: 50b2 lw ra,44(sp) + 3003cae: 5422 lw s0,40(sp) + 3003cb0: 6145 addi sp,sp,48 + 3003cb2: 8082 ret + +03003cb4 : + * @brief Get Enable status of ADC + * @param matchInfo ADC match info + * @retval Cken of ADC + */ +static unsigned int CRG_AdcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003cb4: 7179 addi sp,sp,-48 + 3003cb6: d606 sw ra,44(sp) + 3003cb8: d422 sw s0,40(sp) + 3003cba: 1800 addi s0,sp,48 + 3003cbc: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003cc0: fdc42783 lw a5,-36(s0) + 3003cc4: eb89 bnez a5,3003cd6 + 3003cc6: 3ba00593 li a1,954 + 3003cca: 030067b7 lui a5,0x3006 + 3003cce: 4f478513 addi a0,a5,1268 # 30064f4 + 3003cd2: 3b51 jal ra,3003a66 + 3003cd4: a001 j 3003cd4 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003cd6: 040007b7 lui a5,0x4000 + 3003cda: 4947a783 lw a5,1172(a5) # 4000494 + 3003cde: eb89 bnez a5,3003cf0 + 3003ce0: 3bb00593 li a1,955 + 3003ce4: 030067b7 lui a5,0x3006 + 3003ce8: 4f478513 addi a0,a5,1268 # 30064f4 + 3003cec: 3bad jal ra,3003a66 + 3003cee: a001 j 3003cee + unsigned int enable; + /* Get the enable status of the ADC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003cf0: 040007b7 lui a5,0x4000 + 3003cf4: 4947a783 lw a5,1172(a5) # 4000494 + 3003cf8: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003cfc: fdc42783 lw a5,-36(s0) + 3003d00: 279e lhu a5,8(a5) + 3003d02: 873e mv a4,a5 + 3003d04: fec42783 lw a5,-20(s0) + 3003d08: 97ba add a5,a5,a4 + 3003d0a: fef42423 sw a5,-24(s0) + enable = ((p->BIT.clk_adc_cken != 0)) ? IP_CLK_ENABLE : IP_CLK_DISABLE; + 3003d0e: fe842783 lw a5,-24(s0) + 3003d12: 43dc lw a5,4(a5) + 3003d14: 8b85 andi a5,a5,1 + 3003d16: 9f81 uxtb a5 + 3003d18: c399 beqz a5,3003d1e + 3003d1a: 4785 li a5,1 + 3003d1c: a011 j 3003d20 + 3003d1e: 4781 li a5,0 + 3003d20: fef42223 sw a5,-28(s0) + return enable; + 3003d24: fe442783 lw a5,-28(s0) +} + 3003d28: 853e mv a0,a5 + 3003d2a: 50b2 lw ra,44(sp) + 3003d2c: 5422 lw s0,40(sp) + 3003d2e: 6145 addi sp,sp,48 + 3003d30: 8082 ret + +03003d32 : + * @param matchInfo ADC match info + * @param clkSelect @see CRG_AdcClkSelect + * @retval None + */ +static void CRG_AdcClkSelectSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int clkSelect) +{ + 3003d32: 7179 addi sp,sp,-48 + 3003d34: d606 sw ra,44(sp) + 3003d36: d422 sw s0,40(sp) + 3003d38: 1800 addi s0,sp,48 + 3003d3a: fca42e23 sw a0,-36(s0) + 3003d3e: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003d42: fdc42783 lw a5,-36(s0) + 3003d46: eb89 bnez a5,3003d58 + 3003d48: 3cc00593 li a1,972 + 3003d4c: 030067b7 lui a5,0x3006 + 3003d50: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d54: 3b09 jal ra,3003a66 + 3003d56: a001 j 3003d56 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003d58: 040007b7 lui a5,0x4000 + 3003d5c: 4947a783 lw a5,1172(a5) # 4000494 + 3003d60: eb89 bnez a5,3003d72 + 3003d62: 3cd00593 li a1,973 + 3003d66: 030067b7 lui a5,0x3006 + 3003d6a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d6e: 39e5 jal ra,3003a66 + 3003d70: a001 j 3003d70 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3003d72: 040007b7 lui a5,0x4000 + 3003d76: 4947a703 lw a4,1172(a5) # 4000494 + 3003d7a: 100007b7 lui a5,0x10000 + 3003d7e: 00f70a63 beq a4,a5,3003d92 + 3003d82: 3ce00593 li a1,974 + 3003d86: 030067b7 lui a5,0x3006 + 3003d8a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003d8e: 39e1 jal ra,3003a66 + 3003d90: a001 j 3003d90 + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkModeSelect(clkSelect)); + 3003d92: fd842503 lw a0,-40(s0) + 3003d96: ea1fe0ef jal ra,3002c36 + 3003d9a: 87aa mv a5,a0 + 3003d9c: 0017c793 xori a5,a5,1 + 3003da0: 9f81 uxtb a5 + 3003da2: cb89 beqz a5,3003db4 + 3003da4: 3cf00593 li a1,975 + 3003da8: 030067b7 lui a5,0x3006 + 3003dac: 4f478513 addi a0,a5,1268 # 30064f4 + 3003db0: 395d jal ra,3003a66 + 3003db2: a89d j 3003e28 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003db4: 040007b7 lui a5,0x4000 + 3003db8: 4947a783 lw a5,1172(a5) # 4000494 + 3003dbc: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003dc0: fdc42783 lw a5,-36(s0) + 3003dc4: 279e lhu a5,8(a5) + 3003dc6: 873e mv a4,a5 + 3003dc8: fec42783 lw a5,-20(s0) + 3003dcc: 97ba add a5,a5,a4 + 3003dce: fef42423 sw a5,-24(s0) + if (clkSelect == CRG_ADC_CLK_SYN_CORE) { + 3003dd2: fd842703 lw a4,-40(s0) + 3003dd6: 478d li a5,3 + 3003dd8: 00f71a63 bne a4,a5,3003dec + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_SET; /* use sync clock */ + 3003ddc: fe842703 lw a4,-24(s0) + 3003de0: 435c lw a5,4(a4) + 3003de2: 010006b7 lui a3,0x1000 + 3003de6: 8fd5 or a5,a5,a3 + 3003de8: c35c sw a5,4(a4) + 3003dea: a83d j 3003e28 + } else { + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3003dec: b67fe0ef jal ra,3002952 + g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel = clkSelect; /* write clock selection */ + 3003df0: 040007b7 lui a5,0x4000 + 3003df4: 4947a703 lw a4,1172(a5) # 4000494 + 3003df8: fd842783 lw a5,-40(s0) + 3003dfc: 8b8d andi a5,a5,3 + 3003dfe: 0ff7f693 andi a3,a5,255 + 3003e02: 10072783 lw a5,256(a4) + 3003e06: 8a8d andi a3,a3,3 + 3003e08: 0692 slli a3,a3,0x4 + 3003e0a: fcf7f793 andi a5,a5,-49 + 3003e0e: 8fd5 or a5,a5,a3 + 3003e10: 10f72023 sw a5,256(a4) + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3003e14: b67fe0ef jal ra,300297a + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_UNSET; + 3003e18: fe842703 lw a4,-24(s0) + 3003e1c: 435c lw a5,4(a4) + 3003e1e: ff0006b7 lui a3,0xff000 + 3003e22: 16fd addi a3,a3,-1 # feffffff + 3003e24: 8ff5 and a5,a5,a3 + 3003e26: c35c sw a5,4(a4) + } +} + 3003e28: 50b2 lw ra,44(sp) + 3003e2a: 5422 lw s0,40(sp) + 3003e2c: 6145 addi sp,sp,48 + 3003e2e: 8082 ret + +03003e30 : + * @brief Get ADC Clock Select + * @param matchInfo ADC match info + * @retval Adc Clock select @see CRG_AdcClkSelect + */ +static unsigned int CRG_AdcClkSelectGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003e30: 7179 addi sp,sp,-48 + 3003e32: d606 sw ra,44(sp) + 3003e34: d422 sw s0,40(sp) + 3003e36: 1800 addi s0,sp,48 + 3003e38: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003e3c: fdc42783 lw a5,-36(s0) + 3003e40: eb89 bnez a5,3003e52 + 3003e42: 3e400593 li a1,996 + 3003e46: 030067b7 lui a5,0x3006 + 3003e4a: 4f478513 addi a0,a5,1268 # 30064f4 + 3003e4e: 3921 jal ra,3003a66 + 3003e50: a001 j 3003e50 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003e52: 040007b7 lui a5,0x4000 + 3003e56: 4947a783 lw a5,1172(a5) # 4000494 + 3003e5a: eb89 bnez a5,3003e6c + 3003e5c: 3e500593 li a1,997 + 3003e60: 030067b7 lui a5,0x3006 + 3003e64: 4f478513 addi a0,a5,1268 # 30064f4 + 3003e68: 3efd jal ra,3003a66 + 3003e6a: a001 j 3003e6a + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003e6c: 040007b7 lui a5,0x4000 + 3003e70: 4947a783 lw a5,1172(a5) # 4000494 + 3003e74: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003e78: fdc42783 lw a5,-36(s0) + 3003e7c: 279e lhu a5,8(a5) + 3003e7e: 873e mv a4,a5 + 3003e80: fec42783 lw a5,-20(s0) + 3003e84: 97ba add a5,a5,a4 + 3003e86: fef42423 sw a5,-24(s0) + if (p->BIT.cfg_adc_ckmode_sel == BASE_CFG_SET) { + 3003e8a: fe842783 lw a5,-24(s0) + 3003e8e: 43dc lw a5,4(a5) + 3003e90: 83e1 srli a5,a5,0x18 + 3003e92: 8b85 andi a5,a5,1 + 3003e94: 0ff7f713 andi a4,a5,255 + 3003e98: 4785 li a5,1 + 3003e9a: 00f71463 bne a4,a5,3003ea2 + return CRG_ADC_CLK_SYN_CORE; /* Synchronous clock signal */ + 3003e9e: 478d li a5,3 + 3003ea0: a811 j 3003eb4 + } + return g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel; /* asynchronous clock signal */ + 3003ea2: 040007b7 lui a5,0x4000 + 3003ea6: 4947a783 lw a5,1172(a5) # 4000494 + 3003eaa: 1007a783 lw a5,256(a5) + 3003eae: 8391 srli a5,a5,0x4 + 3003eb0: 8b8d andi a5,a5,3 + 3003eb2: 9f81 uxtb a5 +} + 3003eb4: 853e mv a0,a5 + 3003eb6: 50b2 lw ra,44(sp) + 3003eb8: 5422 lw s0,40(sp) + 3003eba: 6145 addi sp,sp,48 + 3003ebc: 8082 ret + +03003ebe : + * @param matchInfo ADC match info + * @param div Adc clock division + * @retval None + */ +static void CRG_AdcDivSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int div) +{ + 3003ebe: 7179 addi sp,sp,-48 + 3003ec0: d606 sw ra,44(sp) + 3003ec2: d422 sw s0,40(sp) + 3003ec4: 1800 addi s0,sp,48 + 3003ec6: fca42e23 sw a0,-36(s0) + 3003eca: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003ece: fdc42783 lw a5,-36(s0) + 3003ed2: eb89 bnez a5,3003ee4 + 3003ed4: 3f700593 li a1,1015 + 3003ed8: 030067b7 lui a5,0x3006 + 3003edc: 4f478513 addi a0,a5,1268 # 30064f4 + 3003ee0: 3659 jal ra,3003a66 + 3003ee2: a001 j 3003ee2 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003ee4: 040007b7 lui a5,0x4000 + 3003ee8: 4947a783 lw a5,1172(a5) # 4000494 + 3003eec: eb89 bnez a5,3003efe + 3003eee: 3f800593 li a1,1016 + 3003ef2: 030067b7 lui a5,0x3006 + 3003ef6: 4f478513 addi a0,a5,1268 # 30064f4 + 3003efa: 36b5 jal ra,3003a66 + 3003efc: a001 j 3003efc + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkDiv(div)); + 3003efe: fd842503 lw a0,-40(s0) + 3003f02: d75fe0ef jal ra,3002c76 + 3003f06: 87aa mv a5,a0 + 3003f08: 0017c793 xori a5,a5,1 + 3003f0c: 9f81 uxtb a5 + 3003f0e: cb89 beqz a5,3003f20 + 3003f10: 3f900593 li a1,1017 + 3003f14: 030067b7 lui a5,0x3006 + 3003f18: 4f478513 addi a0,a5,1268 # 30064f4 + 3003f1c: 36a9 jal ra,3003a66 + 3003f1e: a885 j 3003f8e + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003f20: 040007b7 lui a5,0x4000 + 3003f24: 4947a783 lw a5,1172(a5) # 4000494 + 3003f28: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003f2c: fdc42783 lw a5,-36(s0) + 3003f30: 279e lhu a5,8(a5) + 3003f32: 873e mv a4,a5 + 3003f34: fec42783 lw a5,-20(s0) + 3003f38: 97ba add a5,a5,a4 + 3003f3a: fef42423 sw a5,-24(s0) + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3003f3e: fe842783 lw a5,-24(s0) + 3003f42: 43dc lw a5,4(a5) + 3003f44: 83e1 srli a5,a5,0x18 + 3003f46: 8b85 andi a5,a5,1 + 3003f48: 9f81 uxtb a5 + 3003f4a: fef42223 sw a5,-28(s0) + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3003f4e: fe442703 lw a4,-28(s0) + 3003f52: 4785 li a5,1 + 3003f54: 02f71163 bne a4,a5,3003f76 + p->BIT.clk_adc_div1 = div; /* write div to I1 */ + 3003f58: fd842783 lw a5,-40(s0) + 3003f5c: 8b8d andi a5,a5,3 + 3003f5e: 0ff7f693 andi a3,a5,255 + 3003f62: fe842703 lw a4,-24(s0) + 3003f66: 431c lw a5,0(a4) + 3003f68: 8a8d andi a3,a3,3 + 3003f6a: 06a2 slli a3,a3,0x8 + 3003f6c: cff7f793 andi a5,a5,-769 + 3003f70: 8fd5 or a5,a5,a3 + 3003f72: c31c sw a5,0(a4) + 3003f74: a829 j 3003f8e + } else { + p->BIT.clk_adc_div0 = div; /* write div to I0 */ + 3003f76: fd842783 lw a5,-40(s0) + 3003f7a: 8b8d andi a5,a5,3 + 3003f7c: 0ff7f693 andi a3,a5,255 + 3003f80: fe842703 lw a4,-24(s0) + 3003f84: 431c lw a5,0(a4) + 3003f86: 8a8d andi a3,a3,3 + 3003f88: 9bf1 andi a5,a5,-4 + 3003f8a: 8fd5 or a5,a5,a3 + 3003f8c: c31c sw a5,0(a4) + } +} + 3003f8e: 50b2 lw ra,44(sp) + 3003f90: 5422 lw s0,40(sp) + 3003f92: 6145 addi sp,sp,48 + 3003f94: 8082 ret + +03003f96 : + * @brief Get ADC clock division + * @param matchInfo ADC match info + * @retval Adc clock division + */ +static unsigned int CRG_AdcDivGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3003f96: 7179 addi sp,sp,-48 + 3003f98: d606 sw ra,44(sp) + 3003f9a: d422 sw s0,40(sp) + 3003f9c: 1800 addi s0,sp,48 + 3003f9e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003fa2: fdc42783 lw a5,-36(s0) + 3003fa6: eb89 bnez a5,3003fb8 + 3003fa8: 40c00593 li a1,1036 + 3003fac: 030067b7 lui a5,0x3006 + 3003fb0: 4f478513 addi a0,a5,1268 # 30064f4 + 3003fb4: 3c4d jal ra,3003a66 + 3003fb6: a001 j 3003fb6 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003fb8: 040007b7 lui a5,0x4000 + 3003fbc: 4947a783 lw a5,1172(a5) # 4000494 + 3003fc0: eb89 bnez a5,3003fd2 + 3003fc2: 40d00593 li a1,1037 + 3003fc6: 030067b7 lui a5,0x3006 + 3003fca: 4f478513 addi a0,a5,1268 # 30064f4 + 3003fce: 3c61 jal ra,3003a66 + 3003fd0: a001 j 3003fd0 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003fd2: 040007b7 lui a5,0x4000 + 3003fd6: 4947a783 lw a5,1172(a5) # 4000494 + 3003fda: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003fde: fdc42783 lw a5,-36(s0) + 3003fe2: 279e lhu a5,8(a5) + 3003fe4: 873e mv a4,a5 + 3003fe6: fec42783 lw a5,-20(s0) + 3003fea: 97ba add a5,a5,a4 + 3003fec: fef42423 sw a5,-24(s0) + + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3003ff0: fe842783 lw a5,-24(s0) + 3003ff4: 43dc lw a5,4(a5) + 3003ff6: 83e1 srli a5,a5,0x18 + 3003ff8: 8b85 andi a5,a5,1 + 3003ffa: 9f81 uxtb a5 + 3003ffc: fef42223 sw a5,-28(s0) + + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3004000: fe442703 lw a4,-28(s0) + 3004004: 4785 li a5,1 + 3004006: 00f71963 bne a4,a5,3004018 + return p->BIT.clk_adc_div1; /* return div value I1 */ + 300400a: fe842783 lw a5,-24(s0) + 300400e: 439c lw a5,0(a5) + 3004010: 83a1 srli a5,a5,0x8 + 3004012: 8b8d andi a5,a5,3 + 3004014: 9f81 uxtb a5 + 3004016: a031 j 3004022 + } + return p->BIT.clk_adc_div0; /* return div valye I0 */ + 3004018: fe842783 lw a5,-24(s0) + 300401c: 439c lw a5,0(a5) + 300401e: 8b8d andi a5,a5,3 + 3004020: 9f81 uxtb a5 +} + 3004022: 853e mv a0,a5 + 3004024: 50b2 lw ra,44(sp) + 3004026: 5422 lw s0,40(sp) + 3004028: 6145 addi sp,sp,48 + 300402a: 8082 ret + +0300402c : + * @brief Enable Clock of EFC + * @param matchInfo EFC match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_EfcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 300402c: 7179 addi sp,sp,-48 + 300402e: d606 sw ra,44(sp) + 3004030: d422 sw s0,40(sp) + 3004032: 1800 addi s0,sp,48 + 3004034: fca42e23 sw a0,-36(s0) + 3004038: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300403c: fdc42783 lw a5,-36(s0) + 3004040: eb89 bnez a5,3004052 + 3004042: 42100593 li a1,1057 + 3004046: 030067b7 lui a5,0x3006 + 300404a: 4f478513 addi a0,a5,1268 # 30064f4 + 300404e: 3c21 jal ra,3003a66 + 3004050: a001 j 3004050 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004052: 040007b7 lui a5,0x4000 + 3004056: 4947a783 lw a5,1172(a5) # 4000494 + 300405a: eb89 bnez a5,300406c + 300405c: 42200593 li a1,1058 + 3004060: 030067b7 lui a5,0x3006 + 3004064: 4f478513 addi a0,a5,1268 # 30064f4 + 3004068: 3afd jal ra,3003a66 + 300406a: a001 j 300406a + /* Enables or disables EFC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300406c: 040007b7 lui a5,0x4000 + 3004070: 4947a783 lw a5,1172(a5) # 4000494 + 3004074: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 3004078: fdc42783 lw a5,-36(s0) + 300407c: 279e lhu a5,8(a5) + 300407e: 873e mv a4,a5 + 3004080: fec42783 lw a5,-20(s0) + 3004084: 97ba add a5,a5,a4 + 3004086: fef42423 sw a5,-24(s0) + p->BIT.eflash_cken = (enable & IP_CLK_ENABLE) ? BASE_CFG_SET : BASE_CFG_UNSET; + 300408a: fd842783 lw a5,-40(s0) + 300408e: 8b85 andi a5,a5,1 + 3004090: 0ff7f693 andi a3,a5,255 + 3004094: fe842703 lw a4,-24(s0) + 3004098: 431c lw a5,0(a4) + 300409a: 8a85 andi a3,a3,1 + 300409c: 9bf9 andi a5,a5,-2 + 300409e: 8fd5 or a5,a5,a3 + 30040a0: c31c sw a5,0(a4) +} + 30040a2: 0001 nop + 30040a4: 50b2 lw ra,44(sp) + 30040a6: 5422 lw s0,40(sp) + 30040a8: 6145 addi sp,sp,48 + 30040aa: 8082 ret + +030040ac : + * @brief Disable Clock of EFC + * @param matchInfo EFC match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_EfcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30040ac: 7179 addi sp,sp,-48 + 30040ae: d606 sw ra,44(sp) + 30040b0: d422 sw s0,40(sp) + 30040b2: 1800 addi s0,sp,48 + 30040b4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30040b8: fdc42783 lw a5,-36(s0) + 30040bc: eb89 bnez a5,30040ce + 30040be: 43000593 li a1,1072 + 30040c2: 030067b7 lui a5,0x3006 + 30040c6: 4f478513 addi a0,a5,1268 # 30064f4 + 30040ca: 3a71 jal ra,3003a66 + 30040cc: a001 j 30040cc + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30040ce: 040007b7 lui a5,0x4000 + 30040d2: 4947a783 lw a5,1172(a5) # 4000494 + 30040d6: eb89 bnez a5,30040e8 + 30040d8: 43100593 li a1,1073 + 30040dc: 030067b7 lui a5,0x3006 + 30040e0: 4f478513 addi a0,a5,1268 # 30064f4 + 30040e4: 3249 jal ra,3003a66 + 30040e6: a001 j 30040e6 + /* Get the value of the EFC register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30040e8: 040007b7 lui a5,0x4000 + 30040ec: 4947a783 lw a5,1172(a5) # 4000494 + 30040f0: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 30040f4: fdc42783 lw a5,-36(s0) + 30040f8: 279e lhu a5,8(a5) + 30040fa: 873e mv a4,a5 + 30040fc: fec42783 lw a5,-20(s0) + 3004100: 97ba add a5,a5,a4 + 3004102: fef42423 sw a5,-24(s0) + return p->BIT.eflash_cken; + 3004106: fe842783 lw a5,-24(s0) + 300410a: 439c lw a5,0(a5) + 300410c: 8b85 andi a5,a5,1 + 300410e: 9f81 uxtb a5 +} + 3004110: 853e mv a0,a5 + 3004112: 50b2 lw ra,44(sp) + 3004114: 5422 lw s0,40(sp) + 3004116: 6145 addi sp,sp,48 + 3004118: 8082 ret + +0300411a : + * @brief Enable Clock of ANA + * @param matchInfo ANA match Info + * @param enable IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static void CRG_AnaEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 300411a: 7179 addi sp,sp,-48 + 300411c: d606 sw ra,44(sp) + 300411e: d422 sw s0,40(sp) + 3004120: 1800 addi s0,sp,48 + 3004122: fca42e23 sw a0,-36(s0) + 3004126: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 300412a: fdc42783 lw a5,-36(s0) + 300412e: eb89 bnez a5,3004140 + 3004130: 44000593 li a1,1088 + 3004134: 030067b7 lui a5,0x3006 + 3004138: 4f478513 addi a0,a5,1268 # 30064f4 + 300413c: 322d jal ra,3003a66 + 300413e: a001 j 300413e + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3004140: 040007b7 lui a5,0x4000 + 3004144: 4947a783 lw a5,1172(a5) # 4000494 + 3004148: eb89 bnez a5,300415a + 300414a: 44100593 li a1,1089 + 300414e: 030067b7 lui a5,0x3006 + 3004152: 4f478513 addi a0,a5,1268 # 30064f4 + 3004156: 3a01 jal ra,3003a66 + 3004158: a001 j 3004158 + CRG_PARAM_CHECK_NO_RET(enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE); + 300415a: fd842703 lw a4,-40(s0) + 300415e: 4785 li a5,1 + 3004160: 00f70d63 beq a4,a5,300417a + 3004164: fd842783 lw a5,-40(s0) + 3004168: cb89 beqz a5,300417a + 300416a: 44200593 li a1,1090 + 300416e: 030067b7 lui a5,0x3006 + 3004172: 4f478513 addi a0,a5,1268 # 30064f4 + 3004176: 38c5 jal ra,3003a66 + 3004178: a20d j 300429a + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300417a: 040007b7 lui a5,0x4000 + 300417e: 4947a783 lw a5,1172(a5) # 4000494 + 3004182: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 3004186: fdc42783 lw a5,-36(s0) + 300418a: 279e lhu a5,8(a5) + 300418c: 873e mv a4,a5 + 300418e: fec42783 lw a5,-20(s0) + 3004192: 97ba add a5,a5,a4 + 3004194: fdc42703 lw a4,-36(s0) + 3004198: 2738 lbu a4,10(a4) + 300419a: 97ba add a5,a5,a4 + 300419c: fef42423 sw a5,-24(s0) + + if ((enable == IP_CLK_ENABLE) && (p->BIT.ip_srst_req == BASE_CFG_SET)) { + 30041a0: fd842703 lw a4,-40(s0) + 30041a4: 4785 li a5,1 + 30041a6: 02f71f63 bne a4,a5,30041e4 + 30041aa: fe842783 lw a5,-24(s0) + 30041ae: 439c lw a5,0(a5) + 30041b0: 83c1 srli a5,a5,0x10 + 30041b2: 8b85 andi a5,a5,1 + 30041b4: 0ff7f713 andi a4,a5,255 + 30041b8: 4785 li a5,1 + 30041ba: 02f71563 bne a4,a5,30041e4 + p->BIT.ip_srst_req = BASE_CFG_UNSET; + 30041be: fe842703 lw a4,-24(s0) + 30041c2: 431c lw a5,0(a4) + 30041c4: 76c1 lui a3,0xffff0 + 30041c6: 16fd addi a3,a3,-1 # fffeffff + 30041c8: 8ff5 and a5,a5,a3 + 30041ca: c31c sw a5,0(a4) + g_anaEnableFlag++; /* count enable analog IP number */ + 30041cc: 040007b7 lui a5,0x4000 + 30041d0: 4987c783 lbu a5,1176(a5) # 4000498 + 30041d4: 0785 addi a5,a5,1 + 30041d6: 0ff7f713 andi a4,a5,255 + 30041da: 040007b7 lui a5,0x4000 + 30041de: 48e78c23 sb a4,1176(a5) # 4000498 + 30041e2: a089 j 3004224 + } else if ((enable == IP_CLK_DISABLE) && (p->BIT.ip_srst_req == BASE_CFG_UNSET)) { + 30041e4: fd842783 lw a5,-40(s0) + 30041e8: ef95 bnez a5,3004224 + 30041ea: fe842783 lw a5,-24(s0) + 30041ee: 439c lw a5,0(a5) + 30041f0: 83c1 srli a5,a5,0x10 + 30041f2: 8b85 andi a5,a5,1 + 30041f4: 9f81 uxtb a5 + 30041f6: e79d bnez a5,3004224 + p->BIT.ip_srst_req = BASE_CFG_SET; + 30041f8: fe842703 lw a4,-24(s0) + 30041fc: 431c lw a5,0(a4) + 30041fe: 66c1 lui a3,0x10 + 3004200: 8fd5 or a5,a5,a3 + 3004202: c31c sw a5,0(a4) + if (g_anaEnableFlag > 0) { + 3004204: 040007b7 lui a5,0x4000 + 3004208: 4987c783 lbu a5,1176(a5) # 4000498 + 300420c: cf81 beqz a5,3004224 + g_anaEnableFlag--; /* Decreasing the count to enable the analog IP number. */ + 300420e: 040007b7 lui a5,0x4000 + 3004212: 4987c783 lbu a5,1176(a5) # 4000498 + 3004216: 17fd addi a5,a5,-1 + 3004218: 0ff7f713 andi a4,a5,255 + 300421c: 040007b7 lui a5,0x4000 + 3004220: 48e78c23 sb a4,1176(a5) # 4000498 + } + } + + if ((g_anaEnableFlag == 0) && (enable == IP_CLK_DISABLE)) { /* all analog clock disable */ + 3004224: 040007b7 lui a5,0x4000 + 3004228: 4987c783 lbu a5,1176(a5) # 4000498 + 300422c: eb85 bnez a5,300425c + 300422e: fd842783 lw a5,-40(s0) + 3004232: e78d bnez a5,300425c + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_UNSET; + 3004234: 10000737 lui a4,0x10000 + 3004238: 6785 lui a5,0x1 + 300423a: 973e add a4,a4,a5 + 300423c: a5072783 lw a5,-1456(a4) # ffffa50 + 3004240: 9bf9 andi a5,a5,-2 + 3004242: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_SET; + 3004246: 10000737 lui a4,0x10000 + 300424a: 6785 lui a5,0x1 + 300424c: 973e add a4,a4,a5 + 300424e: a5072783 lw a5,-1456(a4) # ffffa50 + 3004252: 66c1 lui a3,0x10 + 3004254: 8fd5 or a5,a5,a3 + 3004256: a4f72823 sw a5,-1456(a4) + 300425a: a081 j 300429a + } else if ((g_anaEnableFlag > 0) && (enable == IP_CLK_ENABLE)) { /* all analog clock enable */ + 300425c: 040007b7 lui a5,0x4000 + 3004260: 4987c783 lbu a5,1176(a5) # 4000498 + 3004264: cb9d beqz a5,300429a + 3004266: fd842703 lw a4,-40(s0) + 300426a: 4785 li a5,1 + 300426c: 02f71763 bne a4,a5,300429a + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_UNSET; + 3004270: 10000737 lui a4,0x10000 + 3004274: 6785 lui a5,0x1 + 3004276: 973e add a4,a4,a5 + 3004278: a5072783 lw a5,-1456(a4) # ffffa50 + 300427c: 76c1 lui a3,0xffff0 + 300427e: 16fd addi a3,a3,-1 # fffeffff + 3004280: 8ff5 and a5,a5,a3 + 3004282: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_SET; + 3004286: 10000737 lui a4,0x10000 + 300428a: 6785 lui a5,0x1 + 300428c: 973e add a4,a4,a5 + 300428e: a5072783 lw a5,-1456(a4) # ffffa50 + 3004292: 0017e793 ori a5,a5,1 + 3004296: a4f72823 sw a5,-1456(a4) + } +} + 300429a: 50b2 lw ra,44(sp) + 300429c: 5422 lw s0,40(sp) + 300429e: 6145 addi sp,sp,48 + 30042a0: 8082 ret + +030042a2 : + * @brief Get Clock of ANA + * @param matchInfo ANA match Info + * @return unsigned int IP_CLK_ENABLE or IP_CRG_DISABLE + */ +static unsigned int CRG_AnaEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30042a2: 7179 addi sp,sp,-48 + 30042a4: d606 sw ra,44(sp) + 30042a6: d422 sw s0,40(sp) + 30042a8: 1800 addi s0,sp,48 + 30042aa: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30042ae: fdc42783 lw a5,-36(s0) + 30042b2: eb91 bnez a5,30042c6 + 30042b4: 46200593 li a1,1122 + 30042b8: 030067b7 lui a5,0x3006 + 30042bc: 4f478513 addi a0,a5,1268 # 30064f4 + 30042c0: beffd0ef jal ra,3001eae + 30042c4: a001 j 30042c4 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30042c6: 040007b7 lui a5,0x4000 + 30042ca: 4947a783 lw a5,1172(a5) # 4000494 + 30042ce: eb91 bnez a5,30042e2 + 30042d0: 46300593 li a1,1123 + 30042d4: 030067b7 lui a5,0x3006 + 30042d8: 4f478513 addi a0,a5,1268 # 30064f4 + 30042dc: bd3fd0ef jal ra,3001eae + 30042e0: a001 j 30042e0 + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30042e2: 040007b7 lui a5,0x4000 + 30042e6: 4947a783 lw a5,1172(a5) # 4000494 + 30042ea: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 30042ee: fdc42783 lw a5,-36(s0) + 30042f2: 279e lhu a5,8(a5) + 30042f4: 873e mv a4,a5 + 30042f6: fec42783 lw a5,-20(s0) + 30042fa: 97ba add a5,a5,a4 + 30042fc: fdc42703 lw a4,-36(s0) + 3004300: 2738 lbu a4,10(a4) + 3004302: 97ba add a5,a5,a4 + 3004304: fef42423 sw a5,-24(s0) + /* The clock is enabled based on the IP reset status. */ + return (p->BIT.ip_srst_req) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3004308: fe842783 lw a5,-24(s0) + 300430c: 439c lw a5,0(a5) + 300430e: 83c1 srli a5,a5,0x10 + 3004310: 8b85 andi a5,a5,1 + 3004312: 9f81 uxtb a5 + 3004314: 0017c793 xori a5,a5,1 + 3004318: 9f81 uxtb a5 +} + 300431a: 853e mv a0,a5 + 300431c: 50b2 lw ra,44(sp) + 300431e: 5422 lw s0,40(sp) + 3004320: 6145 addi sp,sp,48 + 3004322: 8082 ret + +03004324 : + * @brief Write a character to the UART port. + * @param ch The int promotion of the character to be written. + * @retval None. + */ +static void DBG_PrintCh(unsigned int ch) +{ + 3004324: 1101 addi sp,sp,-32 + 3004326: ce22 sw s0,28(sp) + 3004328: 1000 addi s0,sp,32 + 300432a: fea42623 sw a0,-20(s0) + while (DBG_PRINTF_UART_PORT->UART_FR.BIT.txff == 1) { + 300432e: 0001 nop + 3004330: 140007b7 lui a5,0x14000 + 3004334: 4f9c lw a5,24(a5) + 3004336: 8395 srli a5,a5,0x5 + 3004338: 8b85 andi a5,a5,1 + 300433a: 0ff7f713 andi a4,a5,255 + 300433e: 4785 li a5,1 + 3004340: fef708e3 beq a4,a5,3004330 + ; + } + DBG_PRINTF_UART_PORT->UART_DR.BIT.data = (unsigned char)ch; + 3004344: 14000737 lui a4,0x14000 + 3004348: fec42783 lw a5,-20(s0) + 300434c: 0ff7f693 andi a3,a5,255 + 3004350: 431c lw a5,0(a4) + 3004352: 0ff6f693 andi a3,a3,255 + 3004356: f007f793 andi a5,a5,-256 + 300435a: 8fd5 or a5,a5,a3 + 300435c: c31c sw a5,0(a4) +} + 300435e: 0001 nop + 3004360: 4472 lw s0,28(sp) + 3004362: 6105 addi sp,sp,32 + 3004364: 8082 ret + +03004366 : + * @param str The string to be printed. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, a BASE_STATUS_ERROR is returned. + */ +static int DBG_PrintStr(const char *str) +{ + 3004366: 7179 addi sp,sp,-48 + 3004368: d606 sw ra,44(sp) + 300436a: d422 sw s0,40(sp) + 300436c: 1800 addi s0,sp,48 + 300436e: fca42e23 sw a0,-36(s0) + DEBUG_ASSERT_PARAM(str != NULL); + int cnt = 0; + 3004372: fe042623 sw zero,-20(s0) + while (*str != '\0') { + 3004376: a00d j 3004398 + DBG_PrintCh(*str); + 3004378: fdc42783 lw a5,-36(s0) + 300437c: 00078783 lb a5,0(a5) # 14000000 + 3004380: 853e mv a0,a5 + 3004382: 374d jal ra,3004324 + str++; + 3004384: fdc42783 lw a5,-36(s0) + 3004388: 0785 addi a5,a5,1 + 300438a: fcf42e23 sw a5,-36(s0) + cnt++; + 300438e: fec42783 lw a5,-20(s0) + 3004392: 0785 addi a5,a5,1 + 3004394: fef42623 sw a5,-20(s0) + while (*str != '\0') { + 3004398: fdc42783 lw a5,-36(s0) + 300439c: 00078783 lb a5,0(a5) + 30043a0: ffe1 bnez a5,3004378 + } + return cnt; + 30043a2: fec42783 lw a5,-20(s0) +} + 30043a6: 853e mv a0,a5 + 30043a8: 50b2 lw ra,44(sp) + 30043aa: 5422 lw s0,40(sp) + 30043ac: 6145 addi sp,sp,48 + 30043ae: 8082 ret + +030043b0 : + * @param base Base value. + * @param exponent Exponent value. + * @retval unsigned long The result of raising base to the power exponent. + */ +static unsigned long DBG_Pow(unsigned int base, unsigned int exponent) +{ + 30043b0: 7179 addi sp,sp,-48 + 30043b2: d622 sw s0,44(sp) + 30043b4: 1800 addi s0,sp,48 + 30043b6: fca42e23 sw a0,-36(s0) + 30043ba: fcb42c23 sw a1,-40(s0) + unsigned long ret = 1; + 30043be: 4785 li a5,1 + 30043c0: fef42623 sw a5,-20(s0) + while (exponent--) { + 30043c4: a809 j 30043d6 + ret *= base; + 30043c6: fec42703 lw a4,-20(s0) + 30043ca: fdc42783 lw a5,-36(s0) + 30043ce: 02f707b3 mul a5,a4,a5 + 30043d2: fef42623 sw a5,-20(s0) + while (exponent--) { + 30043d6: fd842783 lw a5,-40(s0) + 30043da: fff78713 addi a4,a5,-1 + 30043de: fce42c23 sw a4,-40(s0) + 30043e2: f3f5 bnez a5,30043c6 + } + return ret; /* ret = base ^ exponent */ + 30043e4: fec42783 lw a5,-20(s0) +} + 30043e8: 853e mv a0,a5 + 30043ea: 5432 lw s0,44(sp) + 30043ec: 6145 addi sp,sp,48 + 30043ee: 8082 ret + +030043f0 : + * @param num The number to be counted. + * @param base The number base of num. + * @retval unsigned int The number of digits. + */ +static unsigned int DBG_CountDigits(int num, NumBase base) +{ + 30043f0: 7179 addi sp,sp,-48 + 30043f2: d622 sw s0,44(sp) + 30043f4: 1800 addi s0,sp,48 + 30043f6: fca42e23 sw a0,-36(s0) + 30043fa: fcb42c23 sw a1,-40(s0) + unsigned int cnt = 0; + 30043fe: fe042623 sw zero,-20(s0) + if (base == 0) { + 3004402: fd842783 lw a5,-40(s0) + 3004406: e78d bnez a5,3004430 + return 0; + 3004408: 4781 li a5,0 + 300440a: a099 j 3004450 + } + while (num != 0) { + cnt++; + 300440c: fec42783 lw a5,-20(s0) + 3004410: 0785 addi a5,a5,1 + 3004412: fef42623 sw a5,-20(s0) + if (cnt > MAX_DIV_TIMES) { + 3004416: fec42703 lw a4,-20(s0) + 300441a: 47fd li a5,31 + 300441c: 00e7ee63 bltu a5,a4,3004438 + break; + } + num /= base; + 3004420: fdc42703 lw a4,-36(s0) + 3004424: fd842783 lw a5,-40(s0) + 3004428: 02f757b3 divu a5,a4,a5 + 300442c: fcf42e23 sw a5,-36(s0) + while (num != 0) { + 3004430: fdc42783 lw a5,-36(s0) + 3004434: ffe1 bnez a5,300440c + 3004436: a011 j 300443a + break; + 3004438: 0001 nop + } + cnt = (cnt == 0) ? 1 : cnt; + 300443a: fec42783 lw a5,-20(s0) + 300443e: c781 beqz a5,3004446 + 3004440: fec42783 lw a5,-20(s0) + 3004444: a011 j 3004448 + 3004446: 4785 li a5,1 + 3004448: fef42623 sw a5,-20(s0) + return cnt; + 300444c: fec42783 lw a5,-20(s0) +} + 3004450: 853e mv a0,a5 + 3004452: 5432 lw s0,44(sp) + 3004454: 6145 addi sp,sp,48 + 3004456: 8082 ret + +03004458 : + * @param num The unsigned number to be printed. + * @param base The number base of num. + * @param digits The digits of num. + */ +static void DBG_PutUnsignedNum(unsigned int num, NumBase base, unsigned int digits) +{ + 3004458: 7179 addi sp,sp,-48 + 300445a: d606 sw ra,44(sp) + 300445c: d422 sw s0,40(sp) + 300445e: 1800 addi s0,sp,48 + 3004460: fca42e23 sw a0,-36(s0) + 3004464: fcb42c23 sw a1,-40(s0) + 3004468: fcc42a23 sw a2,-44(s0) + unsigned char ch; + while (digits != 0) { + 300446c: a069 j 30044f6 + ch = num / DBG_Pow(base, digits - 1); + 300446e: fd442783 lw a5,-44(s0) + 3004472: 17fd addi a5,a5,-1 + 3004474: 85be mv a1,a5 + 3004476: fd842503 lw a0,-40(s0) + 300447a: 3f1d jal ra,30043b0 + 300447c: 872a mv a4,a0 + 300447e: fdc42783 lw a5,-36(s0) + 3004482: 02e7d7b3 divu a5,a5,a4 + 3004486: fef407a3 sb a5,-17(s0) + num %= DBG_Pow(base, digits - 1); + 300448a: fd442783 lw a5,-44(s0) + 300448e: 17fd addi a5,a5,-1 + 3004490: 85be mv a1,a5 + 3004492: fd842503 lw a0,-40(s0) + 3004496: 3f29 jal ra,30043b0 + 3004498: 872a mv a4,a0 + 300449a: fdc42783 lw a5,-36(s0) + 300449e: 02e7f7b3 remu a5,a5,a4 + 30044a2: fcf42e23 sw a5,-36(s0) + if (base == DECIMAL) { + 30044a6: fd842703 lw a4,-40(s0) + 30044aa: 47a9 li a5,10 + 30044ac: 00f71963 bne a4,a5,30044be + DBG_PrintCh(ch + '0'); + 30044b0: fef44783 lbu a5,-17(s0) + 30044b4: 03078793 addi a5,a5,48 + 30044b8: 853e mv a0,a5 + 30044ba: 35ad jal ra,3004324 + 30044bc: a805 j 30044ec + } else if (base == HEXADECIMAL) { + 30044be: fd842703 lw a4,-40(s0) + 30044c2: 47c1 li a5,16 + 30044c4: 02f71d63 bne a4,a5,30044fe + if (ch < DECIMAL_BASE) { + 30044c8: fef44703 lbu a4,-17(s0) + 30044cc: 47a5 li a5,9 + 30044ce: 00e7e963 bltu a5,a4,30044e0 + DBG_PrintCh(ch + '0'); + 30044d2: fef44783 lbu a5,-17(s0) + 30044d6: 03078793 addi a5,a5,48 + 30044da: 853e mv a0,a5 + 30044dc: 35a1 jal ra,3004324 + 30044de: a039 j 30044ec + } else { + DBG_PrintCh(ch - DECIMAL_BASE + 'A'); + 30044e0: fef44783 lbu a5,-17(s0) + 30044e4: 03778793 addi a5,a5,55 + 30044e8: 853e mv a0,a5 + 30044ea: 3d2d jal ra,3004324 + } + } else { + break; + } + digits--; + 30044ec: fd442783 lw a5,-44(s0) + 30044f0: 17fd addi a5,a5,-1 + 30044f2: fcf42a23 sw a5,-44(s0) + while (digits != 0) { + 30044f6: fd442783 lw a5,-44(s0) + 30044fa: fbb5 bnez a5,300446e + } +} + 30044fc: a011 j 3004500 + break; + 30044fe: 0001 nop +} + 3004500: 0001 nop + 3004502: 50b2 lw ra,44(sp) + 3004504: 5422 lw s0,40(sp) + 3004506: 6145 addi sp,sp,48 + 3004508: 8082 ret + +0300450a : + * @brief Print decimal number through UART port. + * @param intNum The decimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintInt(int intNum) +{ + 300450a: 7179 addi sp,sp,-48 + 300450c: d606 sw ra,44(sp) + 300450e: d422 sw s0,40(sp) + 3004510: 1800 addi s0,sp,48 + 3004512: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (intNum == 0) { + 3004516: fdc42783 lw a5,-36(s0) + 300451a: e791 bnez a5,3004526 + DBG_PrintCh('0'); + 300451c: 03000513 li a0,48 + 3004520: 3511 jal ra,3004324 + return 1; + 3004522: 4785 li a5,1 + 3004524: a82d j 300455e + } + if (intNum < 0) { + 3004526: fdc42783 lw a5,-36(s0) + 300452a: 0007db63 bgez a5,3004540 + DBG_PrintCh('-'); + 300452e: 02d00513 li a0,45 + 3004532: 3bcd jal ra,3004324 + intNum = -intNum; + 3004534: fdc42783 lw a5,-36(s0) + 3004538: 40f007b3 neg a5,a5 + 300453c: fcf42e23 sw a5,-36(s0) + } + cnt = DBG_CountDigits(intNum, DECIMAL); + 3004540: 45a9 li a1,10 + 3004542: fdc42503 lw a0,-36(s0) + 3004546: 356d jal ra,30043f0 + 3004548: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(intNum, DECIMAL, cnt); + 300454c: fdc42783 lw a5,-36(s0) + 3004550: fec42603 lw a2,-20(s0) + 3004554: 45a9 li a1,10 + 3004556: 853e mv a0,a5 + 3004558: 3701 jal ra,3004458 + return cnt; + 300455a: fec42783 lw a5,-20(s0) +} + 300455e: 853e mv a0,a5 + 3004560: 50b2 lw ra,44(sp) + 3004562: 5422 lw s0,40(sp) + 3004564: 6145 addi sp,sp,48 + 3004566: 8082 ret + +03004568 : + * @brief Print hexadecimal number through UART port. + * @param hexNum The hexadecimal number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintHex(unsigned int hexNum) +{ + 3004568: 7179 addi sp,sp,-48 + 300456a: d606 sw ra,44(sp) + 300456c: d422 sw s0,40(sp) + 300456e: 1800 addi s0,sp,48 + 3004570: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (hexNum == 0) { + 3004574: fdc42783 lw a5,-36(s0) + 3004578: e791 bnez a5,3004584 + DBG_PrintCh('0'); + 300457a: 03000513 li a0,48 + 300457e: 335d jal ra,3004324 + return 1; + 3004580: 4785 li a5,1 + 3004582: a005 j 30045a2 + } + cnt = DBG_CountDigits(hexNum, HEXADECIMAL); + 3004584: fdc42783 lw a5,-36(s0) + 3004588: 45c1 li a1,16 + 300458a: 853e mv a0,a5 + 300458c: 3595 jal ra,30043f0 + 300458e: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(hexNum, HEXADECIMAL, cnt); + 3004592: fec42603 lw a2,-20(s0) + 3004596: 45c1 li a1,16 + 3004598: fdc42503 lw a0,-36(s0) + 300459c: 3d75 jal ra,3004458 + return cnt; + 300459e: fec42783 lw a5,-20(s0) +} + 30045a2: 853e mv a0,a5 + 30045a4: 50b2 lw ra,44(sp) + 30045a6: 5422 lw s0,40(sp) + 30045a8: 6145 addi sp,sp,48 + 30045aa: 8082 ret + +030045ac : + * @brief Print floating-point number through UART port. + * @param fltNum The floating-point number to be printed. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintFlt(float fltNum, unsigned int precision) +{ + 30045ac: 7139 addi sp,sp,-64 + 30045ae: de06 sw ra,60(sp) + 30045b0: dc22 sw s0,56(sp) + 30045b2: 0080 addi s0,sp,64 + 30045b4: fca42627 fsw fa0,-52(s0) + 30045b8: fca42423 sw a0,-56(s0) + unsigned int cnt = 0; + 30045bc: fe042623 sw zero,-20(s0) + unsigned int floatScale; + + if (fltNum < 0) { + 30045c0: fcc42787 flw fa5,-52(s0) + 30045c4: f0000753 fmv.w.x fa4,zero + 30045c8: a0e797d3 flt.s a5,fa5,fa4 + 30045cc: cf99 beqz a5,30045ea + DBG_PrintCh('-'); + 30045ce: 02d00513 li a0,45 + 30045d2: 3b89 jal ra,3004324 + cnt += 1; + 30045d4: fec42783 lw a5,-20(s0) + 30045d8: 0785 addi a5,a5,1 + 30045da: fef42623 sw a5,-20(s0) + fltNum = -fltNum; + 30045de: fcc42787 flw fa5,-52(s0) + 30045e2: 20f797d3 fneg.s fa5,fa5 + 30045e6: fcf42627 fsw fa5,-52(s0) + } + int integerVal = (int)fltNum; + 30045ea: fcc42787 flw fa5,-52(s0) + 30045ee: c00797d3 fcvt.w.s a5,fa5,rtz + 30045f2: fef42023 sw a5,-32(s0) + floatScale = DBG_Pow(10, (precision + 1)); /* 10: decimal */ + 30045f6: fc842783 lw a5,-56(s0) + 30045fa: 0785 addi a5,a5,1 + 30045fc: 85be mv a1,a5 + 30045fe: 4529 li a0,10 + 3004600: 3b45 jal ra,30043b0 + 3004602: fca42e23 sw a0,-36(s0) + int floatVal = (long)(floatScale * (fltNum - integerVal)); + 3004606: fdc42783 lw a5,-36(s0) + 300460a: d017f753 fcvt.s.wu fa4,a5 + 300460e: fe042783 lw a5,-32(s0) + 3004612: d007f7d3 fcvt.s.w fa5,a5 + 3004616: fcc42687 flw fa3,-52(s0) + 300461a: 08f6f7d3 fsub.s fa5,fa3,fa5 + 300461e: 10f777d3 fmul.s fa5,fa4,fa5 + 3004622: c00797d3 fcvt.w.s a5,fa5,rtz + 3004626: fef42423 sw a5,-24(s0) + /* Half-adjust: round up or round down */ + if (floatVal % DECIMAL_BASE >= HALF_ADJUST_BOUNDARY) { + 300462a: fe842703 lw a4,-24(s0) + 300462e: 47a9 li a5,10 + 3004630: 02f77733 remu a4,a4,a5 + 3004634: 4791 li a5,4 + 3004636: 00e7fb63 bgeu a5,a4,300464c + floatVal = floatVal / DECIMAL_BASE + 1; + 300463a: fe842703 lw a4,-24(s0) + 300463e: 47a9 li a5,10 + 3004640: 02f757b3 divu a5,a4,a5 + 3004644: 0785 addi a5,a5,1 + 3004646: fef42423 sw a5,-24(s0) + 300464a: a801 j 300465a + } else { + floatVal = floatVal / DECIMAL_BASE; + 300464c: fe842703 lw a4,-24(s0) + 3004650: 47a9 li a5,10 + 3004652: 02f757b3 divu a5,a4,a5 + 3004656: fef42423 sw a5,-24(s0) + } + cnt += DBG_PrintInt(integerVal); + 300465a: fe042503 lw a0,-32(s0) + 300465e: 3575 jal ra,300450a + 3004660: 872a mv a4,a0 + 3004662: fec42783 lw a5,-20(s0) + 3004666: 97ba add a5,a5,a4 + 3004668: fef42623 sw a5,-20(s0) + DBG_PrintCh('.'); + 300466c: 02e00513 li a0,46 + 3004670: 3955 jal ra,3004324 + cnt += 1; + 3004672: fec42783 lw a5,-20(s0) + 3004676: 0785 addi a5,a5,1 + 3004678: fef42623 sw a5,-20(s0) + /* Pad 0 in float part */ + unsigned int fltCnt = DBG_CountDigits(floatVal, DECIMAL); + 300467c: 45a9 li a1,10 + 300467e: fe842503 lw a0,-24(s0) + 3004682: 33bd jal ra,30043f0 + 3004684: fca42c23 sw a0,-40(s0) + if (precision > fltCnt) { + 3004688: fc842703 lw a4,-56(s0) + 300468c: fd842783 lw a5,-40(s0) + 3004690: 02e7f763 bgeu a5,a4,30046be + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 3004694: fe042223 sw zero,-28(s0) + 3004698: a809 j 30046aa + DBG_PrintCh('0'); /* add '0' */ + 300469a: 03000513 li a0,48 + 300469e: 3159 jal ra,3004324 + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 30046a0: fe442783 lw a5,-28(s0) + 30046a4: 0785 addi a5,a5,1 + 30046a6: fef42223 sw a5,-28(s0) + 30046aa: fc842703 lw a4,-56(s0) + 30046ae: fd842783 lw a5,-40(s0) + 30046b2: 40f707b3 sub a5,a4,a5 + 30046b6: fe442703 lw a4,-28(s0) + 30046ba: fef760e3 bltu a4,a5,300469a + } + } + DBG_PutUnsignedNum(floatVal, DECIMAL, fltCnt); /* print unsigned number */ + 30046be: fe842783 lw a5,-24(s0) + 30046c2: fd842603 lw a2,-40(s0) + 30046c6: 45a9 li a1,10 + 30046c8: 853e mv a0,a5 + 30046ca: 3379 jal ra,3004458 + cnt += precision; + 30046cc: fec42703 lw a4,-20(s0) + 30046d0: fc842783 lw a5,-56(s0) + 30046d4: 97ba add a5,a5,a4 + 30046d6: fef42623 sw a5,-20(s0) + return cnt; + 30046da: fec42783 lw a5,-20(s0) +} + 30046de: 853e mv a0,a5 + 30046e0: 50f2 lw ra,60(sp) + 30046e2: 5462 lw s0,56(sp) + 30046e4: 6121 addi sp,sp,64 + 30046e6: 8082 ret + +030046e8 : + * @param ch The format specifier. + * @param paramList The pointer of the variable parameter list. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int ParseSpecifier(const char ch, va_list *paramList) +{ + 30046e8: 7139 addi sp,sp,-64 + 30046ea: de06 sw ra,60(sp) + 30046ec: dc22 sw s0,56(sp) + 30046ee: 0080 addi s0,sp,64 + 30046f0: 87aa mv a5,a0 + 30046f2: fcb42423 sw a1,-56(s0) + 30046f6: fcf407a3 sb a5,-49(s0) + unsigned int cnt = 0; + 30046fa: fe042623 sw zero,-20(s0) + unsigned int tmpCnt; + char chVal = 0; + 30046fe: fe0405a3 sb zero,-21(s0) + const char *strVal = NULL; + 3004702: fe042223 sw zero,-28(s0) + int intVal = 0; + 3004706: fe042023 sw zero,-32(s0) + unsigned int unsignedVal = 0; + 300470a: fc042e23 sw zero,-36(s0) + unsigned int hexVal = 0; + 300470e: fc042c23 sw zero,-40(s0) + float fltVal = 0; + 3004712: fc042a23 sw zero,-44(s0) + switch (ch) { + 3004716: fcf40783 lb a5,-49(s0) + 300471a: fa878793 addi a5,a5,-88 + 300471e: 02000713 li a4,32 + 3004722: 14f76063 bltu a4,a5,3004862 + 3004726: 00279713 slli a4,a5,0x2 + 300472a: 030067b7 lui a5,0x3006 + 300472e: 54878793 addi a5,a5,1352 # 3006548 + 3004732: 97ba add a5,a5,a4 + 3004734: 439c lw a5,0(a5) + 3004736: 8782 jr a5 + case 'c': /* Character format data. */ + chVal = VA_ARG(*paramList, int); /* Use type int because of byte alignment */ + 3004738: fc842783 lw a5,-56(s0) + 300473c: 439c lw a5,0(a5) + 300473e: 00478693 addi a3,a5,4 + 3004742: fc842703 lw a4,-56(s0) + 3004746: c314 sw a3,0(a4) + 3004748: 439c lw a5,0(a5) + 300474a: fef405a3 sb a5,-21(s0) + DBG_PrintCh(chVal); + 300474e: feb40783 lb a5,-21(s0) + 3004752: 853e mv a0,a5 + 3004754: 3ec1 jal ra,3004324 + cnt += 1; + 3004756: fec42783 lw a5,-20(s0) + 300475a: 0785 addi a5,a5,1 + 300475c: fef42623 sw a5,-20(s0) + break; + 3004760: aa19 j 3004876 + case 's': /* String format data. */ + strVal = VA_ARG(*paramList, const char *); + 3004762: fc842783 lw a5,-56(s0) + 3004766: 439c lw a5,0(a5) + 3004768: 00478693 addi a3,a5,4 + 300476c: fc842703 lw a4,-56(s0) + 3004770: c314 sw a3,0(a4) + 3004772: 439c lw a5,0(a5) + 3004774: fef42223 sw a5,-28(s0) + cnt += DBG_PrintStr(strVal); + 3004778: fe442503 lw a0,-28(s0) + 300477c: 36ed jal ra,3004366 + 300477e: 87aa mv a5,a0 + 3004780: 873e mv a4,a5 + 3004782: fec42783 lw a5,-20(s0) + 3004786: 97ba add a5,a5,a4 + 3004788: fef42623 sw a5,-20(s0) + break; + 300478c: a0ed j 3004876 + case 'd': /* Integer decimal data. */ + intVal = VA_ARG(*paramList, int); + 300478e: fc842783 lw a5,-56(s0) + 3004792: 439c lw a5,0(a5) + 3004794: 00478693 addi a3,a5,4 + 3004798: fc842703 lw a4,-56(s0) + 300479c: c314 sw a3,0(a4) + 300479e: 439c lw a5,0(a5) + 30047a0: fef42023 sw a5,-32(s0) + cnt += DBG_PrintInt(intVal); + 30047a4: fe042503 lw a0,-32(s0) + 30047a8: 338d jal ra,300450a + 30047aa: 872a mv a4,a0 + 30047ac: fec42783 lw a5,-20(s0) + 30047b0: 97ba add a5,a5,a4 + 30047b2: fef42623 sw a5,-20(s0) + break; + 30047b6: a0c1 j 3004876 + case 'u': /* Unsigned decimal data. */ + unsignedVal = VA_ARG(*paramList, unsigned int); + 30047b8: fc842783 lw a5,-56(s0) + 30047bc: 439c lw a5,0(a5) + 30047be: 00478693 addi a3,a5,4 + 30047c2: fc842703 lw a4,-56(s0) + 30047c6: c314 sw a3,0(a4) + 30047c8: 439c lw a5,0(a5) + 30047ca: fcf42e23 sw a5,-36(s0) + tmpCnt = DBG_CountDigits(unsignedVal, DECIMAL); + 30047ce: fdc42783 lw a5,-36(s0) + 30047d2: 45a9 li a1,10 + 30047d4: 853e mv a0,a5 + 30047d6: 3929 jal ra,30043f0 + 30047d8: fca42823 sw a0,-48(s0) + DBG_PutUnsignedNum(unsignedVal, DECIMAL, tmpCnt); + 30047dc: fd042603 lw a2,-48(s0) + 30047e0: 45a9 li a1,10 + 30047e2: fdc42503 lw a0,-36(s0) + 30047e6: 398d jal ra,3004458 + cnt += tmpCnt; + 30047e8: fec42703 lw a4,-20(s0) + 30047ec: fd042783 lw a5,-48(s0) + 30047f0: 97ba add a5,a5,a4 + 30047f2: fef42623 sw a5,-20(s0) + break; + 30047f6: a041 j 3004876 + case 'x': /* Hexadecimal data. */ + case 'X': + case 'p': /* Address data. */ + hexVal = VA_ARG(*paramList, unsigned int); + 30047f8: fc842783 lw a5,-56(s0) + 30047fc: 439c lw a5,0(a5) + 30047fe: 00478693 addi a3,a5,4 + 3004802: fc842703 lw a4,-56(s0) + 3004806: c314 sw a3,0(a4) + 3004808: 439c lw a5,0(a5) + 300480a: fcf42c23 sw a5,-40(s0) + cnt += DBG_PrintHex(hexVal); + 300480e: fd842503 lw a0,-40(s0) + 3004812: 3b99 jal ra,3004568 + 3004814: 872a mv a4,a0 + 3004816: fec42783 lw a5,-20(s0) + 300481a: 97ba add a5,a5,a4 + 300481c: fef42623 sw a5,-20(s0) + break; + 3004820: a899 j 3004876 + case 'f': /* Floating-point data. */ + fltVal = VA_ARG(*paramList, double); + 3004822: fc842783 lw a5,-56(s0) + 3004826: 439c lw a5,0(a5) + 3004828: 079d addi a5,a5,7 + 300482a: 9be1 andi a5,a5,-8 + 300482c: 00878693 addi a3,a5,8 + 3004830: fc842703 lw a4,-56(s0) + 3004834: c314 sw a3,0(a4) + 3004836: 0047a803 lw a6,4(a5) + 300483a: 439c lw a5,0(a5) + 300483c: 853e mv a0,a5 + 300483e: 85c2 mv a1,a6 + 3004840: 75c010ef jal ra,3005f9c <__truncdfsf2> + 3004844: 20a507d3 fmv.s fa5,fa0 + 3004848: fcf42a27 fsw fa5,-44(s0) + cnt += DBG_PrintFlt(fltVal, 5); /* default precision: 5 */ + 300484c: 4515 li a0,5 + 300484e: fd442507 flw fa0,-44(s0) + 3004852: 3ba9 jal ra,30045ac + 3004854: 872a mv a4,a0 + 3004856: fec42783 lw a5,-20(s0) + 300485a: 97ba add a5,a5,a4 + 300485c: fef42623 sw a5,-20(s0) + break; + 3004860: a819 j 3004876 + default: + DBG_PrintCh(ch); + 3004862: fcf40783 lb a5,-49(s0) + 3004866: 853e mv a0,a5 + 3004868: 3c75 jal ra,3004324 + cnt += 1; + 300486a: fec42783 lw a5,-20(s0) + 300486e: 0785 addi a5,a5,1 + 3004870: fef42623 sw a5,-20(s0) + break; + 3004874: 0001 nop + } + return cnt; + 3004876: fec42783 lw a5,-20(s0) +} + 300487a: 853e mv a0,a5 + 300487c: 50f2 lw ra,60(sp) + 300487e: 5462 lw s0,56(sp) + 3004880: 6121 addi sp,sp,64 + 3004882: 8082 ret + +03004884 : + * @param intNum The decimal number to be printed. + * @param fieldWidth Field width. + * @retval unsigned int The total number of characters printed. + */ +static unsigned int DBG_PrintIntWithField(int intNum, int fieldWidth) +{ + 3004884: 7139 addi sp,sp,-64 + 3004886: de06 sw ra,60(sp) + 3004888: dc22 sw s0,56(sp) + 300488a: 0080 addi s0,sp,64 + 300488c: fca42623 sw a0,-52(s0) + 3004890: fcb42423 sw a1,-56(s0) + int zeroCnt = 0; + 3004894: fc042e23 sw zero,-36(s0) + int digitsCnt = 0; + 3004898: fe042623 sw zero,-20(s0) + unsigned int cnt = 0; + 300489c: fe042423 sw zero,-24(s0) + + if (intNum == 0) { + 30048a0: fcc42783 lw a5,-52(s0) + 30048a4: e791 bnez a5,30048b0 + DBG_PrintCh('0'); + 30048a6: 03000513 li a0,48 + 30048aa: 3cad jal ra,3004324 + return 1; + 30048ac: 4785 li a5,1 + 30048ae: a0dd j 3004994 + } + if (intNum < 0) { + 30048b0: fcc42783 lw a5,-52(s0) + 30048b4: 0607dd63 bgez a5,300492e + DBG_PrintCh('-'); /* add symbol */ + 30048b8: 02d00513 li a0,45 + 30048bc: 34a5 jal ra,3004324 + cnt++; + 30048be: fe842783 lw a5,-24(s0) + 30048c2: 0785 addi a5,a5,1 + 30048c4: fef42423 sw a5,-24(s0) + intNum = -intNum; + 30048c8: fcc42783 lw a5,-52(s0) + 30048cc: 40f007b3 neg a5,a5 + 30048d0: fcf42623 sw a5,-52(s0) + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 30048d4: 45a9 li a1,10 + 30048d6: fcc42503 lw a0,-52(s0) + 30048da: 3e19 jal ra,30043f0 + 30048dc: 87aa mv a5,a0 + 30048de: fef42623 sw a5,-20(s0) + zeroCnt = fieldWidth - digitsCnt; + 30048e2: fc842703 lw a4,-56(s0) + 30048e6: fec42783 lw a5,-20(s0) + 30048ea: 40f707b3 sub a5,a4,a5 + 30048ee: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 30048f2: fe042223 sw zero,-28(s0) + 30048f6: a831 j 3004912 + DBG_PrintCh('0'); /* add '0' */ + 30048f8: 03000513 li a0,48 + 30048fc: 3425 jal ra,3004324 + cnt++; + 30048fe: fe842783 lw a5,-24(s0) + 3004902: 0785 addi a5,a5,1 + 3004904: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004908: fe442783 lw a5,-28(s0) + 300490c: 0785 addi a5,a5,1 + 300490e: fef42223 sw a5,-28(s0) + 3004912: fe442703 lw a4,-28(s0) + 3004916: fdc42783 lw a5,-36(s0) + 300491a: fcf74fe3 blt a4,a5,30048f8 + } + cnt += digitsCnt; + 300491e: fec42783 lw a5,-20(s0) + 3004922: fe842703 lw a4,-24(s0) + 3004926: 97ba add a5,a5,a4 + 3004928: fef42423 sw a5,-24(s0) + 300492c: a891 j 3004980 + } else { + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 300492e: 45a9 li a1,10 + 3004930: fcc42503 lw a0,-52(s0) + 3004934: 3c75 jal ra,30043f0 + 3004936: 87aa mv a5,a0 + 3004938: fef42623 sw a5,-20(s0) + cnt = digitsCnt; + 300493c: fec42783 lw a5,-20(s0) + 3004940: fef42423 sw a5,-24(s0) + zeroCnt = fieldWidth - digitsCnt; + 3004944: fc842703 lw a4,-56(s0) + 3004948: fec42783 lw a5,-20(s0) + 300494c: 40f707b3 sub a5,a4,a5 + 3004950: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 3004954: fe042023 sw zero,-32(s0) + 3004958: a831 j 3004974 + DBG_PrintCh('0'); /* add '0' */ + 300495a: 03000513 li a0,48 + 300495e: 32d9 jal ra,3004324 + cnt++; + 3004960: fe842783 lw a5,-24(s0) + 3004964: 0785 addi a5,a5,1 + 3004966: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 300496a: fe042783 lw a5,-32(s0) + 300496e: 0785 addi a5,a5,1 + 3004970: fef42023 sw a5,-32(s0) + 3004974: fe042703 lw a4,-32(s0) + 3004978: fdc42783 lw a5,-36(s0) + 300497c: fcf74fe3 blt a4,a5,300495a + } + } + DBG_PutUnsignedNum(intNum, DECIMAL, digitsCnt); + 3004980: fcc42783 lw a5,-52(s0) + 3004984: fec42703 lw a4,-20(s0) + 3004988: 863a mv a2,a4 + 300498a: 45a9 li a1,10 + 300498c: 853e mv a0,a5 + 300498e: 34e9 jal ra,3004458 + return cnt; + 3004990: fe842783 lw a5,-24(s0) +} + 3004994: 853e mv a0,a5 + 3004996: 50f2 lw ra,60(sp) + 3004998: 5462 lw s0,56(sp) + 300499a: 6121 addi sp,sp,64 + 300499c: 8082 ret + +0300499e : + +static int DBG_Atoi(const char **s) +{ + 300499e: 7179 addi sp,sp,-48 + 30049a0: d622 sw s0,44(sp) + 30049a2: 1800 addi s0,sp,48 + 30049a4: fca42e23 sw a0,-36(s0) + int i, c; + + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 30049a8: fe042623 sw zero,-20(s0) + 30049ac: a02d j 30049d6 + i = i * 10 + c - '0'; /* 10: decimal */ + 30049ae: fec42703 lw a4,-20(s0) + 30049b2: 47a9 li a5,10 + 30049b4: 02f70733 mul a4,a4,a5 + 30049b8: fe842783 lw a5,-24(s0) + 30049bc: 97ba add a5,a5,a4 + 30049be: fd078793 addi a5,a5,-48 + 30049c2: fef42623 sw a5,-20(s0) + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 30049c6: fdc42783 lw a5,-36(s0) + 30049ca: 439c lw a5,0(a5) + 30049cc: 00178713 addi a4,a5,1 + 30049d0: fdc42783 lw a5,-36(s0) + 30049d4: c398 sw a4,0(a5) + 30049d6: fdc42783 lw a5,-36(s0) + 30049da: 439c lw a5,0(a5) + 30049dc: 00078783 lb a5,0(a5) + 30049e0: fef42423 sw a5,-24(s0) + 30049e4: fe842703 lw a4,-24(s0) + 30049e8: 02f00793 li a5,47 + 30049ec: 00e7d863 bge a5,a4,30049fc + 30049f0: fe842703 lw a4,-24(s0) + 30049f4: 03900793 li a5,57 + 30049f8: fae7dbe3 bge a5,a4,30049ae + } + return i; + 30049fc: fec42783 lw a5,-20(s0) +} + 3004a00: 853e mv a0,a5 + 3004a02: 5432 lw s0,44(sp) + 3004a04: 6145 addi sp,sp,48 + 3004a06: 8082 ret + +03004a08 : + * @param ... Variable parameter list. + * @retval int If succeeded, the total number of characters printed is returned. + * If the input parameter is wrong, return BASE_STATUS_ERROR. + */ +int DBG_UartPrintf(const char *format, ...) +{ + 3004a08: 711d addi sp,sp,-96 + 3004a0a: de06 sw ra,60(sp) + 3004a0c: dc22 sw s0,56(sp) + 3004a0e: 0080 addi s0,sp,64 + 3004a10: fca42623 sw a0,-52(s0) + 3004a14: c04c sw a1,4(s0) + 3004a16: c410 sw a2,8(s0) + 3004a18: c454 sw a3,12(s0) + 3004a1a: c818 sw a4,16(s0) + 3004a1c: c85c sw a5,20(s0) + 3004a1e: 01042c23 sw a6,24(s0) + 3004a22: 01142e23 sw a7,28(s0) + DEBUG_ASSERT_PARAM(format != NULL); + int cnt = 0; + 3004a26: fe042623 sw zero,-20(s0) + int fieldWidth = 0; + 3004a2a: fe042423 sw zero,-24(s0) + int floatPrecision = 0; + 3004a2e: fe042223 sw zero,-28(s0) + float fltVal = 0; + 3004a32: fe042023 sw zero,-32(s0) + int intVal = 0; + 3004a36: fc042e23 sw zero,-36(s0) + va_list paramList; + VA_START(paramList, format); + 3004a3a: 02040793 addi a5,s0,32 + 3004a3e: 1791 addi a5,a5,-28 + 3004a40: fcf42c23 sw a5,-40(s0) + + while (*format != '\0') { + 3004a44: aa09 j 3004b56 + if (*format != '%') { + 3004a46: fcc42783 lw a5,-52(s0) + 3004a4a: 00078703 lb a4,0(a5) + 3004a4e: 02500793 li a5,37 + 3004a52: 00f70e63 beq a4,a5,3004a6e + DBG_PrintCh(*format); + 3004a56: fcc42783 lw a5,-52(s0) + 3004a5a: 00078783 lb a5,0(a5) + 3004a5e: 853e mv a0,a5 + 3004a60: 30d1 jal ra,3004324 + cnt += 1; + 3004a62: fec42783 lw a5,-20(s0) + 3004a66: 0785 addi a5,a5,1 + 3004a68: fef42623 sw a5,-20(s0) + 3004a6c: a0c5 j 3004b4c + } else { + format++; + 3004a6e: fcc42783 lw a5,-52(s0) + 3004a72: 0785 addi a5,a5,1 + 3004a74: fcf42623 sw a5,-52(s0) + if (*format == '0') { + 3004a78: fcc42783 lw a5,-52(s0) + 3004a7c: 00078703 lb a4,0(a5) + 3004a80: 03000793 li a5,48 + 3004a84: 04f71263 bne a4,a5,3004ac8 + format++; + 3004a88: fcc42783 lw a5,-52(s0) + 3004a8c: 0785 addi a5,a5,1 + 3004a8e: fcf42623 sw a5,-52(s0) + fieldWidth = DBG_Atoi(&format); + 3004a92: fcc40793 addi a5,s0,-52 + 3004a96: 853e mv a0,a5 + 3004a98: 3719 jal ra,300499e + 3004a9a: fea42423 sw a0,-24(s0) + intVal = VA_ARG(paramList, int); + 3004a9e: fd842783 lw a5,-40(s0) + 3004aa2: 00478713 addi a4,a5,4 + 3004aa6: fce42c23 sw a4,-40(s0) + 3004aaa: 439c lw a5,0(a5) + 3004aac: fcf42e23 sw a5,-36(s0) + cnt += DBG_PrintIntWithField(intVal, fieldWidth); + 3004ab0: fe842583 lw a1,-24(s0) + 3004ab4: fdc42503 lw a0,-36(s0) + 3004ab8: 33f1 jal ra,3004884 + 3004aba: 872a mv a4,a0 + 3004abc: fec42783 lw a5,-20(s0) + 3004ac0: 97ba add a5,a5,a4 + 3004ac2: fef42623 sw a5,-20(s0) + 3004ac6: a059 j 3004b4c + } else if (*format == '.') { + 3004ac8: fcc42783 lw a5,-52(s0) + 3004acc: 00078703 lb a4,0(a5) + 3004ad0: 02e00793 li a5,46 + 3004ad4: 04f71d63 bne a4,a5,3004b2e + format++; + 3004ad8: fcc42783 lw a5,-52(s0) + 3004adc: 0785 addi a5,a5,1 + 3004ade: fcf42623 sw a5,-52(s0) + floatPrecision = DBG_Atoi(&format); + 3004ae2: fcc40793 addi a5,s0,-52 + 3004ae6: 853e mv a0,a5 + 3004ae8: 3d5d jal ra,300499e + 3004aea: fea42223 sw a0,-28(s0) + fltVal = VA_ARG(paramList, double); + 3004aee: fd842783 lw a5,-40(s0) + 3004af2: 079d addi a5,a5,7 + 3004af4: 9be1 andi a5,a5,-8 + 3004af6: 00878713 addi a4,a5,8 + 3004afa: fce42c23 sw a4,-40(s0) + 3004afe: 0047a803 lw a6,4(a5) + 3004b02: 439c lw a5,0(a5) + 3004b04: 853e mv a0,a5 + 3004b06: 85c2 mv a1,a6 + 3004b08: 494010ef jal ra,3005f9c <__truncdfsf2> + 3004b0c: 20a507d3 fmv.s fa5,fa0 + 3004b10: fef42027 fsw fa5,-32(s0) + cnt += DBG_PrintFlt(fltVal, floatPrecision); + 3004b14: fe442783 lw a5,-28(s0) + 3004b18: 853e mv a0,a5 + 3004b1a: fe042507 flw fa0,-32(s0) + 3004b1e: 3479 jal ra,30045ac + 3004b20: 872a mv a4,a0 + 3004b22: fec42783 lw a5,-20(s0) + 3004b26: 97ba add a5,a5,a4 + 3004b28: fef42623 sw a5,-20(s0) + 3004b2c: a005 j 3004b4c + } else { + cnt += ParseSpecifier(*format, ¶mList); + 3004b2e: fcc42783 lw a5,-52(s0) + 3004b32: 00078783 lb a5,0(a5) + 3004b36: fd840713 addi a4,s0,-40 + 3004b3a: 85ba mv a1,a4 + 3004b3c: 853e mv a0,a5 + 3004b3e: 366d jal ra,30046e8 + 3004b40: 872a mv a4,a0 + 3004b42: fec42783 lw a5,-20(s0) + 3004b46: 97ba add a5,a5,a4 + 3004b48: fef42623 sw a5,-20(s0) + } + } + format++; + 3004b4c: fcc42783 lw a5,-52(s0) + 3004b50: 0785 addi a5,a5,1 + 3004b52: fcf42623 sw a5,-52(s0) + while (*format != '\0') { + 3004b56: fcc42783 lw a5,-52(s0) + 3004b5a: 00078783 lb a5,0(a5) + 3004b5e: ee0794e3 bnez a5,3004a46 + } + VA_END(paramList); + return cnt; + 3004b62: fec42783 lw a5,-20(s0) +} + 3004b66: 853e mv a0,a5 + 3004b68: 50f2 lw ra,60(sp) + 3004b6a: 5462 lw s0,56(sp) + 3004b6c: 6125 addi sp,sp,96 + 3004b6e: 8082 ret + +03004b70 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param regValue value of @ref IOCMG_REG. + * @retval None. + */ +static inline void DCL_IOCMG_SetRegValue(IOCMG_REG *iocmgRegx, unsigned int regValue) +{ + 3004b70: 1101 addi sp,sp,-32 + 3004b72: ce06 sw ra,28(sp) + 3004b74: cc22 sw s0,24(sp) + 3004b76: 1000 addi s0,sp,32 + 3004b78: fea42623 sw a0,-20(s0) + 3004b7c: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004b80: fec42703 lw a4,-20(s0) + 3004b84: 77c1 lui a5,0xffff0 + 3004b86: 8f7d and a4,a4,a5 + 3004b88: 147f07b7 lui a5,0x147f0 + 3004b8c: 00f70a63 beq a4,a5,3004ba0 + 3004b90: 08b00593 li a1,139 + 3004b94: 030067b7 lui a5,0x3006 + 3004b98: 5cc78513 addi a0,a5,1484 # 30065cc + 3004b9c: 2df1 jal ra,3005278 + 3004b9e: a001 j 3004b9e + iocmgRegx->reg = regValue; + 3004ba0: fec42783 lw a5,-20(s0) + 3004ba4: fe842703 lw a4,-24(s0) + 3004ba8: c398 sw a4,0(a5) +} + 3004baa: 0001 nop + 3004bac: 40f2 lw ra,28(sp) + 3004bae: 4462 lw s0,24(sp) + 3004bb0: 6105 addi sp,sp,32 + 3004bb2: 8082 ret + +03004bb4 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param driveRate value of @ref IOCMG_DriveRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetDriveRate(IOCMG_REG *iocmgRegx, IOCMG_DriveRate driveRate) +{ + 3004bb4: 1101 addi sp,sp,-32 + 3004bb6: ce06 sw ra,28(sp) + 3004bb8: cc22 sw s0,24(sp) + 3004bba: 1000 addi s0,sp,32 + 3004bbc: fea42623 sw a0,-20(s0) + 3004bc0: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004bc4: fec42703 lw a4,-20(s0) + 3004bc8: 77c1 lui a5,0xffff0 + 3004bca: 8f7d and a4,a4,a5 + 3004bcc: 147f07b7 lui a5,0x147f0 + 3004bd0: 00f70a63 beq a4,a5,3004be4 + 3004bd4: 0ba00593 li a1,186 + 3004bd8: 030067b7 lui a5,0x3006 + 3004bdc: 5cc78513 addi a0,a5,1484 # 30065cc + 3004be0: 2d61 jal ra,3005278 + 3004be2: a001 j 3004be2 + IOCMG_PARAM_CHECK_NO_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4); + 3004be4: fe842703 lw a4,-24(s0) + 3004be8: 478d li a5,3 + 3004bea: 00e7fa63 bgeu a5,a4,3004bfe + 3004bee: 0bb00593 li a1,187 + 3004bf2: 030067b7 lui a5,0x3006 + 3004bf6: 5cc78513 addi a0,a5,1484 # 30065cc + 3004bfa: 2dbd jal ra,3005278 + 3004bfc: a839 j 3004c1a + iocmgRegx->BIT.ds = driveRate; + 3004bfe: fe842783 lw a5,-24(s0) + 3004c02: 8b8d andi a5,a5,3 + 3004c04: 0ff7f693 andi a3,a5,255 + 3004c08: fec42703 lw a4,-20(s0) + 3004c0c: 431c lw a5,0(a4) + 3004c0e: 8a8d andi a3,a3,3 + 3004c10: 0692 slli a3,a3,0x4 + 3004c12: fcf7f793 andi a5,a5,-49 + 3004c16: 8fd5 or a5,a5,a3 + 3004c18: c31c sw a5,0(a4) +} + 3004c1a: 40f2 lw ra,28(sp) + 3004c1c: 4462 lw s0,24(sp) + 3004c1e: 6105 addi sp,sp,32 + 3004c20: 8082 ret + +03004c22 : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param pullMode value of @ref IOCMG_PullMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetPullMode(IOCMG_REG *iocmgRegx, IOCMG_PullMode pullMode) +{ + 3004c22: 1101 addi sp,sp,-32 + 3004c24: ce06 sw ra,28(sp) + 3004c26: cc22 sw s0,24(sp) + 3004c28: 1000 addi s0,sp,32 + 3004c2a: fea42623 sw a0,-20(s0) + 3004c2e: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004c32: fec42703 lw a4,-20(s0) + 3004c36: 77c1 lui a5,0xffff0 + 3004c38: 8f7d and a4,a4,a5 + 3004c3a: 147f07b7 lui a5,0x147f0 + 3004c3e: 00f70a63 beq a4,a5,3004c52 + 3004c42: 0d200593 li a1,210 + 3004c46: 030067b7 lui a5,0x3006 + 3004c4a: 5cc78513 addi a0,a5,1484 # 30065cc + 3004c4e: 252d jal ra,3005278 + 3004c50: a001 j 3004c50 + IOCMG_PARAM_CHECK_NO_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE); + 3004c52: fe842703 lw a4,-24(s0) + 3004c56: 478d li a5,3 + 3004c58: 00e7fa63 bgeu a5,a4,3004c6c + 3004c5c: 0d300593 li a1,211 + 3004c60: 030067b7 lui a5,0x3006 + 3004c64: 5cc78513 addi a0,a5,1484 # 30065cc + 3004c68: 2d01 jal ra,3005278 + 3004c6a: a835 j 3004ca6 + iocmgRegx->BIT.pu = (pullMode & 0x02) >> 1; /* 10b: pull up mode */ + 3004c6c: fe842783 lw a5,-24(s0) + 3004c70: 8385 srli a5,a5,0x1 + 3004c72: 8b85 andi a5,a5,1 + 3004c74: 0ff7f693 andi a3,a5,255 + 3004c78: fec42703 lw a4,-20(s0) + 3004c7c: 431c lw a5,0(a4) + 3004c7e: 8a85 andi a3,a3,1 + 3004c80: 06a2 slli a3,a3,0x8 + 3004c82: eff7f793 andi a5,a5,-257 + 3004c86: 8fd5 or a5,a5,a3 + 3004c88: c31c sw a5,0(a4) + iocmgRegx->BIT.pd = pullMode & 0x01; /* 01b: pull down mode */ + 3004c8a: fe842783 lw a5,-24(s0) + 3004c8e: 8b85 andi a5,a5,1 + 3004c90: 0ff7f693 andi a3,a5,255 + 3004c94: fec42703 lw a4,-20(s0) + 3004c98: 431c lw a5,0(a4) + 3004c9a: 8a85 andi a3,a3,1 + 3004c9c: 069e slli a3,a3,0x7 + 3004c9e: f7f7f793 andi a5,a5,-129 + 3004ca2: 8fd5 or a5,a5,a3 + 3004ca4: c31c sw a5,0(a4) +} + 3004ca6: 40f2 lw ra,28(sp) + 3004ca8: 4462 lw s0,24(sp) + 3004caa: 6105 addi sp,sp,32 + 3004cac: 8082 ret + +03004cae : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param levelShiftRate value of @ref IOCMG_LevelShiftRate. + * @retval None. + */ +static inline void DCL_IOCMG_SetLevelShiftRate(IOCMG_REG *iocmgRegx, IOCMG_LevelShiftRate levelShiftRate) +{ + 3004cae: 1101 addi sp,sp,-32 + 3004cb0: ce06 sw ra,28(sp) + 3004cb2: cc22 sw s0,24(sp) + 3004cb4: 1000 addi s0,sp,32 + 3004cb6: fea42623 sw a0,-20(s0) + 3004cba: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004cbe: fec42703 lw a4,-20(s0) + 3004cc2: 77c1 lui a5,0xffff0 + 3004cc4: 8f7d and a4,a4,a5 + 3004cc6: 147f07b7 lui a5,0x147f0 + 3004cca: 00f70a63 beq a4,a5,3004cde + 3004cce: 0ed00593 li a1,237 + 3004cd2: 030067b7 lui a5,0x3006 + 3004cd6: 5cc78513 addi a0,a5,1484 # 30065cc + 3004cda: 2b79 jal ra,3005278 + 3004cdc: a001 j 3004cdc + IOCMG_PARAM_CHECK_NO_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX && levelShiftRate >= LEVEL_SHIFT_RATE_FAST); + 3004cde: fe842703 lw a4,-24(s0) + 3004ce2: 4785 li a5,1 + 3004ce4: 00e7fa63 bgeu a5,a4,3004cf8 + 3004ce8: 0ee00593 li a1,238 + 3004cec: 030067b7 lui a5,0x3006 + 3004cf0: 5cc78513 addi a0,a5,1484 # 30065cc + 3004cf4: 2351 jal ra,3005278 + 3004cf6: a839 j 3004d14 + iocmgRegx->BIT.sr = levelShiftRate; + 3004cf8: fe842783 lw a5,-24(s0) + 3004cfc: 8b85 andi a5,a5,1 + 3004cfe: 0ff7f693 andi a3,a5,255 + 3004d02: fec42703 lw a4,-20(s0) + 3004d06: 431c lw a5,0(a4) + 3004d08: 8a85 andi a3,a3,1 + 3004d0a: 06a6 slli a3,a3,0x9 + 3004d0c: dff7f793 andi a5,a5,-513 + 3004d10: 8fd5 or a5,a5,a3 + 3004d12: c31c sw a5,0(a4) +} + 3004d14: 40f2 lw ra,28(sp) + 3004d16: 4462 lw s0,24(sp) + 3004d18: 6105 addi sp,sp,32 + 3004d1a: 8082 ret + +03004d1c : + * @param iocmgRegx Value of @ref IOCMG_REG. + * @param schmidtMode value of @ref IOCMG_SchmidtMode. + * @retval None. + */ +static inline void DCL_IOCMG_SetSchmidtMode(IOCMG_REG *iocmgRegx, IOCMG_SchmidtMode schmidtMode) +{ + 3004d1c: 1101 addi sp,sp,-32 + 3004d1e: ce06 sw ra,28(sp) + 3004d20: cc22 sw s0,24(sp) + 3004d22: 1000 addi s0,sp,32 + 3004d24: fea42623 sw a0,-20(s0) + 3004d28: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3004d2c: fec42703 lw a4,-20(s0) + 3004d30: 77c1 lui a5,0xffff0 + 3004d32: 8f7d and a4,a4,a5 + 3004d34: 147f07b7 lui a5,0x147f0 + 3004d38: 00f70a63 beq a4,a5,3004d4c + 3004d3c: 10500593 li a1,261 + 3004d40: 030067b7 lui a5,0x3006 + 3004d44: 5cc78513 addi a0,a5,1484 # 30065cc + 3004d48: 2b05 jal ra,3005278 + 3004d4a: a001 j 3004d4a + IOCMG_PARAM_CHECK_NO_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE); + 3004d4c: fe842703 lw a4,-24(s0) + 3004d50: 4785 li a5,1 + 3004d52: 00e7fa63 bgeu a5,a4,3004d66 + 3004d56: 10600593 li a1,262 + 3004d5a: 030067b7 lui a5,0x3006 + 3004d5e: 5cc78513 addi a0,a5,1484 # 30065cc + 3004d62: 2b19 jal ra,3005278 + 3004d64: a839 j 3004d82 + iocmgRegx->BIT.se = schmidtMode; + 3004d66: fe842783 lw a5,-24(s0) + 3004d6a: 8b85 andi a5,a5,1 + 3004d6c: 0ff7f693 andi a3,a5,255 + 3004d70: fec42703 lw a4,-20(s0) + 3004d74: 431c lw a5,0(a4) + 3004d76: 8a85 andi a3,a3,1 + 3004d78: 06aa slli a3,a3,0xa + 3004d7a: bff7f793 andi a5,a5,-1025 + 3004d7e: 8fd5 or a5,a5,a3 + 3004d80: c31c sw a5,0(a4) +} + 3004d82: 40f2 lw ra,28(sp) + 3004d84: 4462 lw s0,24(sp) + 3004d86: 6105 addi sp,sp,32 + 3004d88: 8082 ret + +03004d8a : + * @brief Get pins iocmg reg address + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_REG iocmg reg address. + */ +static IOCMG_REG* IOCMG_GetRegAddr(unsigned int pinTypedef) +{ + 3004d8a: 7179 addi sp,sp,-48 + 3004d8c: d622 sw s0,44(sp) + 3004d8e: 1800 addi s0,sp,48 + 3004d90: fca42e23 sw a0,-36(s0) + /* decode pin's iocmg reg offset address in base address, and conver value to point address */ + unsigned int iocmgBaseAddrValue = (uintptr_t)IOCMG_BASE; + 3004d94: 147f07b7 lui a5,0x147f0 + 3004d98: fef42623 sw a5,-20(s0) + unsigned int iocmgRegOffsetAddrValue = (pinTypedef >> 16) & 0x00000FFF; /* 16 : shift 16 bit */ + 3004d9c: fdc42783 lw a5,-36(s0) + 3004da0: 0107d713 srli a4,a5,0x10 + 3004da4: 6785 lui a5,0x1 + 3004da6: 17fd addi a5,a5,-1 # fff + 3004da8: 8ff9 and a5,a5,a4 + 3004daa: fef42423 sw a5,-24(s0) + IOCMG_REG* iocmgRegxAddr = (IOCMG_REG*)(void*)(iocmgBaseAddrValue + iocmgRegOffsetAddrValue); + 3004dae: fec42703 lw a4,-20(s0) + 3004db2: fe842783 lw a5,-24(s0) + 3004db6: 97ba add a5,a5,a4 + 3004db8: fef42223 sw a5,-28(s0) + if (!IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegxAddr & IOCMG_BASE_ADDR_MASK))) { + 3004dbc: fe442703 lw a4,-28(s0) + 3004dc0: 77c1 lui a5,0xffff0 + 3004dc2: 8f7d and a4,a4,a5 + 3004dc4: 147f07b7 lui a5,0x147f0 + 3004dc8: 00f70463 beq a4,a5,3004dd0 + return NULL; + 3004dcc: 4781 li a5,0 + 3004dce: a019 j 3004dd4 + } + return iocmgRegxAddr; + 3004dd0: fe442783 lw a5,-28(s0) +} + 3004dd4: 853e mv a0,a5 + 3004dd6: 5432 lw s0,44(sp) + 3004dd8: 6145 addi sp,sp,48 + 3004dda: 8082 ret + +03004ddc : + * @brief Set pins as function mode + * @param pinTypedef the pin type defined in iomap.h + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinAltFuncMode(unsigned int pinTypedef) +{ + 3004ddc: 7179 addi sp,sp,-48 + 3004dde: d606 sw ra,44(sp) + 3004de0: d422 sw s0,40(sp) + 3004de2: 1800 addi s0,sp,48 + 3004de4: fca42e23 sw a0,-36(s0) + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004de8: fdc42503 lw a0,-36(s0) + 3004dec: 3f79 jal ra,3004d8a + 3004dee: fea42623 sw a0,-20(s0) + /* get iocmg reg default value */ + unsigned int regValue = pinTypedef & IOCMG_REG_VALUE_MASK; + 3004df2: fdc42703 lw a4,-36(s0) + 3004df6: 67c1 lui a5,0x10 + 3004df8: 17fd addi a5,a5,-1 # ffff + 3004dfa: 8ff9 and a5,a5,a4 + 3004dfc: fef42423 sw a5,-24(s0) + DCL_IOCMG_SetRegValue(iocmgRegx, regValue); + 3004e00: fe842583 lw a1,-24(s0) + 3004e04: fec42503 lw a0,-20(s0) + 3004e08: 33a5 jal ra,3004b70 + return IOCMG_STATUS_OK; + 3004e0a: 4781 li a5,0 +} + 3004e0c: 853e mv a0,a5 + 3004e0e: 50b2 lw ra,44(sp) + 3004e10: 5422 lw s0,40(sp) + 3004e12: 6145 addi sp,sp,48 + 3004e14: 8082 ret + +03004e16 : + * @param pinTypedef the pin type defined in iomap.h + * @param pullMode function define as @ref IOCMG_PullMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinPullMode(unsigned int pinTypedef, IOCMG_PullMode pullMode) +{ + 3004e16: 7179 addi sp,sp,-48 + 3004e18: d606 sw ra,44(sp) + 3004e1a: d422 sw s0,40(sp) + 3004e1c: 1800 addi s0,sp,48 + 3004e1e: fca42e23 sw a0,-36(s0) + 3004e22: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE, IOCMG_PARAM_ERROR); + 3004e26: fd842703 lw a4,-40(s0) + 3004e2a: 478d li a5,3 + 3004e2c: 00e7fb63 bgeu a5,a4,3004e42 + 3004e30: 07800593 li a1,120 + 3004e34: 030067b7 lui a5,0x3006 + 3004e38: 5ec78513 addi a0,a5,1516 # 30065ec + 3004e3c: 2935 jal ra,3005278 + 3004e3e: 4791 li a5,4 + 3004e40: a821 j 3004e58 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004e42: fdc42503 lw a0,-36(s0) + 3004e46: 3791 jal ra,3004d8a + 3004e48: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetPullMode(iocmgRegx, pullMode); + 3004e4c: fd842583 lw a1,-40(s0) + 3004e50: fec42503 lw a0,-20(s0) + 3004e54: 33f9 jal ra,3004c22 + return IOCMG_STATUS_OK; + 3004e56: 4781 li a5,0 +} + 3004e58: 853e mv a0,a5 + 3004e5a: 50b2 lw ra,44(sp) + 3004e5c: 5422 lw s0,40(sp) + 3004e5e: 6145 addi sp,sp,48 + 3004e60: 8082 ret + +03004e62 : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinSchmidtMode(unsigned int pinTypedef, IOCMG_SchmidtMode schmidtMode) +{ + 3004e62: 7179 addi sp,sp,-48 + 3004e64: d606 sw ra,44(sp) + 3004e66: d422 sw s0,40(sp) + 3004e68: 1800 addi s0,sp,48 + 3004e6a: fca42e23 sw a0,-36(s0) + 3004e6e: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE, IOCMG_PARAM_ERROR); + 3004e72: fd842703 lw a4,-40(s0) + 3004e76: 4785 li a5,1 + 3004e78: 00e7fb63 bgeu a5,a4,3004e8e + 3004e7c: 09300593 li a1,147 + 3004e80: 030067b7 lui a5,0x3006 + 3004e84: 5ec78513 addi a0,a5,1516 # 30065ec + 3004e88: 2ec5 jal ra,3005278 + 3004e8a: 4791 li a5,4 + 3004e8c: a821 j 3004ea4 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004e8e: fdc42503 lw a0,-36(s0) + 3004e92: 3de5 jal ra,3004d8a + 3004e94: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetSchmidtMode(iocmgRegx, schmidtMode); + 3004e98: fd842583 lw a1,-40(s0) + 3004e9c: fec42503 lw a0,-20(s0) + 3004ea0: 3db5 jal ra,3004d1c + return IOCMG_STATUS_OK; + 3004ea2: 4781 li a5,0 +} + 3004ea4: 853e mv a0,a5 + 3004ea6: 50b2 lw ra,44(sp) + 3004ea8: 5422 lw s0,40(sp) + 3004eaa: 6145 addi sp,sp,48 + 3004eac: 8082 ret + +03004eae : + * @param pinTypedef the pin type defined in iomap.h + * @param schmidtMode function define as @ref IOCMG_SchmidtMode + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinLevelShiftRate(unsigned int pinTypedef, IOCMG_LevelShiftRate levelShiftRate) +{ + 3004eae: 7179 addi sp,sp,-48 + 3004eb0: d606 sw ra,44(sp) + 3004eb2: d422 sw s0,40(sp) + 3004eb4: 1800 addi s0,sp,48 + 3004eb6: fca42e23 sw a0,-36(s0) + 3004eba: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX, IOCMG_PARAM_ERROR); + 3004ebe: fd842703 lw a4,-40(s0) + 3004ec2: 4785 li a5,1 + 3004ec4: 00e7fb63 bgeu a5,a4,3004eda + 3004ec8: 0ae00593 li a1,174 + 3004ecc: 030067b7 lui a5,0x3006 + 3004ed0: 5ec78513 addi a0,a5,1516 # 30065ec + 3004ed4: 2655 jal ra,3005278 + 3004ed6: 4791 li a5,4 + 3004ed8: a821 j 3004ef0 + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate >= LEVEL_SHIFT_RATE_FAST, IOCMG_PARAM_ERROR); + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004eda: fdc42503 lw a0,-36(s0) + 3004ede: 3575 jal ra,3004d8a + 3004ee0: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetLevelShiftRate(iocmgRegx, levelShiftRate); + 3004ee4: fd842583 lw a1,-40(s0) + 3004ee8: fec42503 lw a0,-20(s0) + 3004eec: 33c9 jal ra,3004cae + return IOCMG_STATUS_OK; + 3004eee: 4781 li a5,0 +} + 3004ef0: 853e mv a0,a5 + 3004ef2: 50b2 lw ra,44(sp) + 3004ef4: 5422 lw s0,40(sp) + 3004ef6: 6145 addi sp,sp,48 + 3004ef8: 8082 ret + +03004efa : + * @param pinTypedef the pin type defined in iomap.h + * @param driveRate function define as @ref IOCMG_DriveRate + * @retval IOCMG_Status @ref IOCMG_Status. + */ +IOCMG_Status HAL_IOCMG_SetPinDriveRate(unsigned int pinTypedef, IOCMG_DriveRate driveRate) +{ + 3004efa: 7179 addi sp,sp,-48 + 3004efc: d606 sw ra,44(sp) + 3004efe: d422 sw s0,40(sp) + 3004f00: 1800 addi s0,sp,48 + 3004f02: fca42e23 sw a0,-36(s0) + 3004f06: fcb42c23 sw a1,-40(s0) + /* get iocmg reg address */ + IOCMG_PARAM_CHECK_WITH_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4, IOCMG_PARAM_ERROR); + 3004f0a: fd842703 lw a4,-40(s0) + 3004f0e: 478d li a5,3 + 3004f10: 00e7fb63 bgeu a5,a4,3004f26 + 3004f14: 0cb00593 li a1,203 + 3004f18: 030067b7 lui a5,0x3006 + 3004f1c: 5ec78513 addi a0,a5,1516 # 30065ec + 3004f20: 2ea1 jal ra,3005278 + 3004f22: 4791 li a5,4 + 3004f24: a821 j 3004f3c + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3004f26: fdc42503 lw a0,-36(s0) + 3004f2a: 3585 jal ra,3004d8a + 3004f2c: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetDriveRate(iocmgRegx, driveRate); + 3004f30: fd842583 lw a1,-40(s0) + 3004f34: fec42503 lw a0,-20(s0) + 3004f38: 39b5 jal ra,3004bb4 + return IOCMG_STATUS_OK; + 3004f3a: 4781 li a5,0 +} + 3004f3c: 853e mv a0,a5 + 3004f3e: 50b2 lw ra,44(sp) + 3004f40: 5422 lw s0,40(sp) + 3004f42: 6145 addi sp,sp,48 + 3004f44: 8082 ret + +03004f46 : + * @param mode Timer Mode, @ref TIMER_Mode + * @retval true + * @retval false + */ +static inline bool IsTimerMode(TIMER_Mode mode) +{ + 3004f46: 1101 addi sp,sp,-32 + 3004f48: ce22 sw s0,28(sp) + 3004f4a: 1000 addi s0,sp,32 + 3004f4c: fea42623 sw a0,-20(s0) + return (((mode) == TIMER_MODE_RUN_FREE) || + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3004f50: fec42783 lw a5,-20(s0) + 3004f54: cb99 beqz a5,3004f6a + return (((mode) == TIMER_MODE_RUN_FREE) || + 3004f56: fec42703 lw a4,-20(s0) + 3004f5a: 4785 li a5,1 + 3004f5c: 00f70763 beq a4,a5,3004f6a + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3004f60: fec42703 lw a4,-20(s0) + 3004f64: 4789 li a5,2 + 3004f66: 00f71463 bne a4,a5,3004f6e + 3004f6a: 4785 li a5,1 + 3004f6c: a011 j 3004f70 + 3004f6e: 4781 li a5,0 + 3004f70: 8b85 andi a5,a5,1 + 3004f72: 9f81 uxtb a5 + ((mode) == TIMER_MODE_RUN_ONTSHOT)); +} + 3004f74: 853e mv a0,a5 + 3004f76: 4472 lw s0,28(sp) + 3004f78: 6105 addi sp,sp,32 + 3004f7a: 8082 ret + +03004f7c : + * @param mode Timer Interrupt Type, @ref TIMER_InterruptType + * @retval true + * @retval false + */ +static inline bool IsTimerInterruptType(TIMER_InterruptType interruptType) +{ + 3004f7c: 1101 addi sp,sp,-32 + 3004f7e: ce22 sw s0,28(sp) + 3004f80: 1000 addi s0,sp,32 + 3004f82: fea42623 sw a0,-20(s0) + return (((interruptType) == TIMER_PERIOD_FIN) || + 3004f86: fec42783 lw a5,-20(s0) + 3004f8a: c791 beqz a5,3004f96 + 3004f8c: fec42703 lw a4,-20(s0) + 3004f90: 4785 li a5,1 + 3004f92: 00f71463 bne a4,a5,3004f9a + 3004f96: 4785 li a5,1 + 3004f98: a011 j 3004f9c + 3004f9a: 4781 li a5,0 + 3004f9c: 8b85 andi a5,a5,1 + 3004f9e: 9f81 uxtb a5 + ((interruptType) == TIMER_OVER_FLOW)); +} + 3004fa0: 853e mv a0,a5 + 3004fa2: 4472 lw s0,28(sp) + 3004fa4: 6105 addi sp,sp,32 + 3004fa6: 8082 ret + +03004fa8 : + * @param size Timer Size, @ref TIMER_Size + * @retval true + * @retval false + */ +static inline bool IsTimerSize(TIMER_Size size) +{ + 3004fa8: 1101 addi sp,sp,-32 + 3004faa: ce22 sw s0,28(sp) + 3004fac: 1000 addi s0,sp,32 + 3004fae: fea42623 sw a0,-20(s0) + return (((size) == TIMER_SIZE_16BIT) || + 3004fb2: fec42783 lw a5,-20(s0) + 3004fb6: c791 beqz a5,3004fc2 + 3004fb8: fec42703 lw a4,-20(s0) + 3004fbc: 4785 li a5,1 + 3004fbe: 00f71463 bne a4,a5,3004fc6 + 3004fc2: 4785 li a5,1 + 3004fc4: a011 j 3004fc8 + 3004fc6: 4781 li a5,0 + 3004fc8: 8b85 andi a5,a5,1 + 3004fca: 9f81 uxtb a5 + ((size) == TIMER_SIZE_32BIT)); +} + 3004fcc: 853e mv a0,a5 + 3004fce: 4472 lw s0,28(sp) + 3004fd0: 6105 addi sp,sp,32 + 3004fd2: 8082 ret + +03004fd4 : + * @param period + * @retval true + * @retval false + */ +static inline bool IsTimerPeriod(unsigned int period) +{ + 3004fd4: 1101 addi sp,sp,-32 + 3004fd6: ce22 sw s0,28(sp) + 3004fd8: 1000 addi s0,sp,32 + 3004fda: fea42623 sw a0,-20(s0) + return ((period) >= PERIOD_MIN_VALUE); + 3004fde: fec42783 lw a5,-20(s0) + 3004fe2: 00f037b3 snez a5,a5 + 3004fe6: 9f81 uxtb a5 +} + 3004fe8: 853e mv a0,a5 + 3004fea: 4472 lw s0,28(sp) + 3004fec: 6105 addi sp,sp,32 + 3004fee: 8082 ret + +03004ff0 : + * @param div @see TIMER_PrescalerFactor + * @retval true + * @retval false + */ +static inline bool IsTimerDiv(TIMER_PrescalerFactor div) +{ + 3004ff0: 1101 addi sp,sp,-32 + 3004ff2: ce22 sw s0,28(sp) + 3004ff4: 1000 addi s0,sp,32 + 3004ff6: fea42623 sw a0,-20(s0) + return (((div) == TIMERPRESCALER_NO_DIV) || + ((div) == TIMERPRESCALER_DIV_16) || + 3004ffa: fec42783 lw a5,-20(s0) + 3004ffe: cb99 beqz a5,3005014 + return (((div) == TIMERPRESCALER_NO_DIV) || + 3005000: fec42703 lw a4,-20(s0) + 3005004: 4785 li a5,1 + 3005006: 00f70763 beq a4,a5,3005014 + ((div) == TIMERPRESCALER_DIV_16) || + 300500a: fec42703 lw a4,-20(s0) + 300500e: 4789 li a5,2 + 3005010: 00f71463 bne a4,a5,3005018 + 3005014: 4785 li a5,1 + 3005016: a011 j 300501a + 3005018: 4781 li a5,0 + 300501a: 8b85 andi a5,a5,1 + 300501c: 9f81 uxtb a5 + ((div) == TIMERPRESCALER_DIV_256)); +} + 300501e: 853e mv a0,a5 + 3005020: 4472 lw s0,28(sp) + 3005022: 6105 addi sp,sp,32 + 3005024: 8082 ret + +03005026 : + * @param handle Timer Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR parameter check fail + */ +BASE_StatusType HAL_TIMER_Init(TIMER_Handle *handle) +{ + 3005026: 1101 addi sp,sp,-32 + 3005028: ce06 sw ra,28(sp) + 300502a: cc22 sw s0,24(sp) + 300502c: 1000 addi s0,sp,32 + 300502e: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005032: fec42783 lw a5,-20(s0) + 3005036: eb89 bnez a5,3005048 + 3005038: 02800593 li a1,40 + 300503c: 030067b7 lui a5,0x3006 + 3005040: 62c78513 addi a0,a5,1580 # 300662c + 3005044: 2c15 jal ra,3005278 + 3005046: a001 j 3005046 + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 3005048: fec42783 lw a5,-20(s0) + 300504c: 4398 lw a4,0(a5) + 300504e: 143007b7 lui a5,0x14300 + 3005052: 02f70f63 beq a4,a5,3005090 + 3005056: fec42783 lw a5,-20(s0) + 300505a: 4398 lw a4,0(a5) + 300505c: 143017b7 lui a5,0x14301 + 3005060: 02f70863 beq a4,a5,3005090 + 3005064: fec42783 lw a5,-20(s0) + 3005068: 4398 lw a4,0(a5) + 300506a: 143027b7 lui a5,0x14302 + 300506e: 02f70163 beq a4,a5,3005090 + 3005072: fec42783 lw a5,-20(s0) + 3005076: 4398 lw a4,0(a5) + 3005078: 143037b7 lui a5,0x14303 + 300507c: 00f70a63 beq a4,a5,3005090 + 3005080: 02900593 li a1,41 + 3005084: 030067b7 lui a5,0x3006 + 3005088: 62c78513 addi a0,a5,1580 # 300662c + 300508c: 22f5 jal ra,3005278 + 300508e: a001 j 300508e + + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->load), BASE_STATUS_ERROR); + 3005090: fec42783 lw a5,-20(s0) + 3005094: 4bdc lw a5,20(a5) + 3005096: 853e mv a0,a5 + 3005098: 3f35 jal ra,3004fd4 + 300509a: 87aa mv a5,a0 + 300509c: 0017c793 xori a5,a5,1 + 30050a0: 9f81 uxtb a5 + 30050a2: cb91 beqz a5,30050b6 + 30050a4: 02b00593 li a1,43 + 30050a8: 030067b7 lui a5,0x3006 + 30050ac: 62c78513 addi a0,a5,1580 # 300662c + 30050b0: 22e1 jal ra,3005278 + 30050b2: 4785 li a5,1 + 30050b4: aa6d j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->bgLoad), BASE_STATUS_ERROR); + 30050b6: fec42783 lw a5,-20(s0) + 30050ba: 4f9c lw a5,24(a5) + 30050bc: 853e mv a0,a5 + 30050be: 3f19 jal ra,3004fd4 + 30050c0: 87aa mv a5,a0 + 30050c2: 0017c793 xori a5,a5,1 + 30050c6: 9f81 uxtb a5 + 30050c8: cb91 beqz a5,30050dc + 30050ca: 02c00593 li a1,44 + 30050ce: 030067b7 lui a5,0x3006 + 30050d2: 62c78513 addi a0,a5,1580 # 300662c + 30050d6: 224d jal ra,3005278 + 30050d8: 4785 li a5,1 + 30050da: aa51 j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerMode(handle->mode), BASE_STATUS_ERROR); + 30050dc: fec42783 lw a5,-20(s0) + 30050e0: 479c lw a5,8(a5) + 30050e2: 853e mv a0,a5 + 30050e4: 358d jal ra,3004f46 + 30050e6: 87aa mv a5,a0 + 30050e8: 0017c793 xori a5,a5,1 + 30050ec: 9f81 uxtb a5 + 30050ee: cb91 beqz a5,3005102 + 30050f0: 02d00593 li a1,45 + 30050f4: 030067b7 lui a5,0x3006 + 30050f8: 62c78513 addi a0,a5,1580 # 300662c + 30050fc: 2ab5 jal ra,3005278 + 30050fe: 4785 li a5,1 + 3005100: a2bd j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerSize(handle->size), BASE_STATUS_ERROR); + 3005102: fec42783 lw a5,-20(s0) + 3005106: 4b9c lw a5,16(a5) + 3005108: 853e mv a0,a5 + 300510a: 3d79 jal ra,3004fa8 + 300510c: 87aa mv a5,a0 + 300510e: 0017c793 xori a5,a5,1 + 3005112: 9f81 uxtb a5 + 3005114: cb91 beqz a5,3005128 + 3005116: 02e00593 li a1,46 + 300511a: 030067b7 lui a5,0x3006 + 300511e: 62c78513 addi a0,a5,1580 # 300662c + 3005122: 2a99 jal ra,3005278 + 3005124: 4785 li a5,1 + 3005126: a2a1 j 300526e + TIMER_PARAM_CHECK_WITH_RET(IsTimerDiv(handle->prescaler), BASE_STATUS_ERROR); + 3005128: fec42783 lw a5,-20(s0) + 300512c: 47dc lw a5,12(a5) + 300512e: 853e mv a0,a5 + 3005130: 35c1 jal ra,3004ff0 + 3005132: 87aa mv a5,a0 + 3005134: 0017c793 xori a5,a5,1 + 3005138: 9f81 uxtb a5 + 300513a: cb91 beqz a5,300514e + 300513c: 02f00593 li a1,47 + 3005140: 030067b7 lui a5,0x3006 + 3005144: 62c78513 addi a0,a5,1580 # 300662c + 3005148: 2a05 jal ra,3005278 + 300514a: 4785 li a5,1 + 300514c: a20d j 300526e + + /* Initialize the configuration parameters of the timer */ + handle->baseAddress->timer_intclr = BASE_CFG_SET; /* Writing to this register clears interrupt output of timer */ + 300514e: fec42783 lw a5,-20(s0) + 3005152: 439c lw a5,0(a5) + 3005154: 4705 li a4,1 + 3005156: c7d8 sw a4,12(a5) + handle->baseAddress->timer_load = handle->load; + 3005158: fec42783 lw a5,-20(s0) + 300515c: 439c lw a5,0(a5) + 300515e: fec42703 lw a4,-20(s0) + 3005162: 4b58 lw a4,20(a4) + 3005164: c398 sw a4,0(a5) + handle->baseAddress->timerbgload = handle->bgLoad; + 3005166: fec42783 lw a5,-20(s0) + 300516a: 439c lw a5,0(a5) + 300516c: fec42703 lw a4,-20(s0) + 3005170: 4f18 lw a4,24(a4) + 3005172: cf98 sw a4,24(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_DISABLE; + 3005174: fec42783 lw a5,-20(s0) + 3005178: 4398 lw a4,0(a5) + 300517a: 471c lw a5,8(a4) + 300517c: f7f7f793 andi a5,a5,-129 + 3005180: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timerintenable = handle->interruptEn; + 3005182: fec42783 lw a5,-20(s0) + 3005186: 4398 lw a4,0(a5) + 3005188: fec42783 lw a5,-20(s0) + 300518c: 2fd4 lbu a3,28(a5) + 300518e: 471c lw a5,8(a4) + 3005190: 8a85 andi a3,a3,1 + 3005192: 0696 slli a3,a3,0x5 + 3005194: fdf7f793 andi a5,a5,-33 + 3005198: 8fd5 or a5,a5,a3 + 300519a: c71c sw a5,8(a4) + + /* Sets the frequency divider and size of the timer module. */ + handle->baseAddress->TIMERx_CONTROL.BIT.timerpre = handle->prescaler; + 300519c: fec42783 lw a5,-20(s0) + 30051a0: 47d4 lw a3,12(a5) + 30051a2: fec42783 lw a5,-20(s0) + 30051a6: 4398 lw a4,0(a5) + 30051a8: 87b6 mv a5,a3 + 30051aa: 8b8d andi a5,a5,3 + 30051ac: 0ff7f693 andi a3,a5,255 + 30051b0: 471c lw a5,8(a4) + 30051b2: 8a8d andi a3,a3,3 + 30051b4: 068a slli a3,a3,0x2 + 30051b6: 9bcd andi a5,a5,-13 + 30051b8: 8fd5 or a5,a5,a3 + 30051ba: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timersize = handle->size; + 30051bc: fec42783 lw a5,-20(s0) + 30051c0: 4b94 lw a3,16(a5) + 30051c2: fec42783 lw a5,-20(s0) + 30051c6: 4398 lw a4,0(a5) + 30051c8: 87b6 mv a5,a3 + 30051ca: 8b85 andi a5,a5,1 + 30051cc: 0ff7f693 andi a3,a5,255 + 30051d0: 471c lw a5,8(a4) + 30051d2: 8a85 andi a3,a3,1 + 30051d4: 0686 slli a3,a3,0x1 + 30051d6: 9bf5 andi a5,a5,-3 + 30051d8: 8fd5 or a5,a5,a3 + 30051da: c71c sw a5,8(a4) + + /* Sets the running mode of the timer. */ + if (handle->mode == TIMER_MODE_RUN_ONTSHOT) { + 30051dc: fec42783 lw a5,-20(s0) + 30051e0: 4798 lw a4,8(a5) + 30051e2: 4789 li a5,2 + 30051e4: 00f71a63 bne a4,a5,30051f8 + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_SET; + 30051e8: fec42783 lw a5,-20(s0) + 30051ec: 4398 lw a4,0(a5) + 30051ee: 471c lw a5,8(a4) + 30051f0: 0017e793 ori a5,a5,1 + 30051f4: c71c sw a5,8(a4) + 30051f6: a805 j 3005226 + } else { + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_UNSET; + 30051f8: fec42783 lw a5,-20(s0) + 30051fc: 4398 lw a4,0(a5) + 30051fe: 471c lw a5,8(a4) + 3005200: 9bf9 andi a5,a5,-2 + 3005202: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005204: fec42783 lw a5,-20(s0) + 3005208: 479c lw a5,8(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 300520a: fec42703 lw a4,-20(s0) + 300520e: 4318 lw a4,0(a4) + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005210: 00f037b3 snez a5,a5 + 3005214: 0ff7f693 andi a3,a5,255 + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005218: 471c lw a5,8(a4) + 300521a: 8a85 andi a3,a3,1 + 300521c: 069a slli a3,a3,0x6 + 300521e: fbf7f793 andi a5,a5,-65 + 3005222: 8fd5 or a5,a5,a3 + 3005224: c71c sw a5,8(a4) + } + + /* Request for setting the DMA and ADC. */ + handle->baseAddress->TIMERx_CONTROLB.BIT.dmasreqen = handle->dmaReqEnable; + 3005226: fec42783 lw a5,-20(s0) + 300522a: 4398 lw a4,0(a5) + 300522c: fec42783 lw a5,-20(s0) + 3005230: 2ff4 lbu a3,30(a5) + 3005232: 4f5c lw a5,28(a4) + 3005234: 8a85 andi a3,a3,1 + 3005236: 0686 slli a3,a3,0x1 + 3005238: 9bf5 andi a5,a5,-3 + 300523a: 8fd5 or a5,a5,a3 + 300523c: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.dmabreqen = handle->dmaReqEnable; + 300523e: fec42783 lw a5,-20(s0) + 3005242: 4398 lw a4,0(a5) + 3005244: fec42783 lw a5,-20(s0) + 3005248: 2ff4 lbu a3,30(a5) + 300524a: 4f5c lw a5,28(a4) + 300524c: 8a85 andi a3,a3,1 + 300524e: 9bf9 andi a5,a5,-2 + 3005250: 8fd5 or a5,a5,a3 + 3005252: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.socen = handle->adcSocReqEnable; + 3005254: fec42783 lw a5,-20(s0) + 3005258: 4398 lw a4,0(a5) + 300525a: fec42783 lw a5,-20(s0) + 300525e: 3fd4 lbu a3,29(a5) + 3005260: 4f5c lw a5,28(a4) + 3005262: 8a85 andi a3,a3,1 + 3005264: 068a slli a3,a3,0x2 + 3005266: 9bed andi a5,a5,-5 + 3005268: 8fd5 or a5,a5,a3 + 300526a: cf5c sw a5,28(a4) + return BASE_STATUS_OK; + 300526c: 4781 li a5,0 +} + 300526e: 853e mv a0,a5 + 3005270: 40f2 lw ra,28(sp) + 3005272: 4462 lw s0,24(sp) + 3005274: 6105 addi sp,sp,32 + 3005276: 8082 ret + +03005278 : + 3005278: c37fc06f j 3001eae + +0300527c : + * @brief Start timer. + * @param handle Timer Handle + * @retval None + */ +void HAL_TIMER_Start(TIMER_Handle *handle) +{ + 300527c: 1101 addi sp,sp,-32 + 300527e: ce06 sw ra,28(sp) + 3005280: cc22 sw s0,24(sp) + 3005282: 1000 addi s0,sp,32 + 3005284: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005288: fec42783 lw a5,-20(s0) + 300528c: eb89 bnez a5,300529e + 300528e: 0bc00593 li a1,188 + 3005292: 030067b7 lui a5,0x3006 + 3005296: 62c78513 addi a0,a5,1580 # 300662c + 300529a: 3ff9 jal ra,3005278 + 300529c: a001 j 300529c + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 300529e: fec42783 lw a5,-20(s0) + 30052a2: 4398 lw a4,0(a5) + 30052a4: 143007b7 lui a5,0x14300 + 30052a8: 02f70f63 beq a4,a5,30052e6 + 30052ac: fec42783 lw a5,-20(s0) + 30052b0: 4398 lw a4,0(a5) + 30052b2: 143017b7 lui a5,0x14301 + 30052b6: 02f70863 beq a4,a5,30052e6 + 30052ba: fec42783 lw a5,-20(s0) + 30052be: 4398 lw a4,0(a5) + 30052c0: 143027b7 lui a5,0x14302 + 30052c4: 02f70163 beq a4,a5,30052e6 + 30052c8: fec42783 lw a5,-20(s0) + 30052cc: 4398 lw a4,0(a5) + 30052ce: 143037b7 lui a5,0x14303 + 30052d2: 00f70a63 beq a4,a5,30052e6 + 30052d6: 0bd00593 li a1,189 + 30052da: 030067b7 lui a5,0x3006 + 30052de: 62c78513 addi a0,a5,1580 # 300662c + 30052e2: 3f59 jal ra,3005278 + 30052e4: a001 j 30052e4 + /* Enable timer */ + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_SET; + 30052e6: fec42783 lw a5,-20(s0) + 30052ea: 4398 lw a4,0(a5) + 30052ec: 471c lw a5,8(a4) + 30052ee: 0807e793 ori a5,a5,128 + 30052f2: c71c sw a5,8(a4) +} + 30052f4: 0001 nop + 30052f6: 40f2 lw ra,28(sp) + 30052f8: 4462 lw s0,24(sp) + 30052fa: 6105 addi sp,sp,32 + 30052fc: 8082 ret + +030052fe : + * @brief GPT Interrupt service processing function. + * @param handle TIMER Handle + * @retval None + */ +void HAL_TIMER_IrqHandler(void *handle) +{ + 30052fe: 7179 addi sp,sp,-48 + 3005300: d606 sw ra,44(sp) + 3005302: d422 sw s0,40(sp) + 3005304: 1800 addi s0,sp,48 + 3005306: fca42e23 sw a0,-36(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 300530a: fdc42783 lw a5,-36(s0) + 300530e: eb89 bnez a5,3005320 + 3005310: 0d800593 li a1,216 + 3005314: 030067b7 lui a5,0x3006 + 3005318: 62c78513 addi a0,a5,1580 # 300662c + 300531c: 3fb1 jal ra,3005278 + 300531e: a001 j 300531e + TIMER_Handle *timerHandle = (TIMER_Handle *)handle; + 3005320: fdc42783 lw a5,-36(s0) + 3005324: fef42623 sw a5,-20(s0) + TIMER_ASSERT_PARAM(IsTIMERInstance(timerHandle->baseAddress)); + 3005328: fec42783 lw a5,-20(s0) + 300532c: 4398 lw a4,0(a5) + 300532e: 143007b7 lui a5,0x14300 + 3005332: 02f70f63 beq a4,a5,3005370 + 3005336: fec42783 lw a5,-20(s0) + 300533a: 4398 lw a4,0(a5) + 300533c: 143017b7 lui a5,0x14301 + 3005340: 02f70863 beq a4,a5,3005370 + 3005344: fec42783 lw a5,-20(s0) + 3005348: 4398 lw a4,0(a5) + 300534a: 143027b7 lui a5,0x14302 + 300534e: 02f70163 beq a4,a5,3005370 + 3005352: fec42783 lw a5,-20(s0) + 3005356: 4398 lw a4,0(a5) + 3005358: 143037b7 lui a5,0x14303 + 300535c: 00f70a63 beq a4,a5,3005370 + 3005360: 0da00593 li a1,218 + 3005364: 030067b7 lui a5,0x3006 + 3005368: 62c78513 addi a0,a5,1580 # 300662c + 300536c: 3731 jal ra,3005278 + 300536e: a001 j 300536e + /* Check interrupt type */ + if (timerHandle->baseAddress->TIMERx_MIS.dmaovmis == BASE_CFG_ENABLE) { + 3005370: fec42783 lw a5,-20(s0) + 3005374: 439c lw a5,0(a5) + 3005376: 4bdc lw a5,20(a5) + 3005378: 8385 srli a5,a5,0x1 + 300537a: 8b85 andi a5,a5,1 + 300537c: 0ff7f713 andi a4,a5,255 + 3005380: 4785 li a5,1 + 3005382: 02f71363 bne a4,a5,30053a8 + /* DMA overflow interrupt */ + timerHandle->baseAddress->DMAOV_INTCLR.BIT.dmaov_intclr = BASE_CFG_ENABLE; + 3005386: fec42783 lw a5,-20(s0) + 300538a: 4398 lw a4,0(a5) + 300538c: 531c lw a5,32(a4) + 300538e: 0017e793 ori a5,a5,1 + 3005392: d31c sw a5,32(a4) + /* Call the timer DMA request overflow callback function of the user. */ + if (timerHandle->userCallBack.TimerOverFlowCallBack != NULL) { + 3005394: fec42783 lw a5,-20(s0) + 3005398: 53dc lw a5,36(a5) + 300539a: c799 beqz a5,30053a8 + timerHandle->userCallBack.TimerOverFlowCallBack(timerHandle); + 300539c: fec42783 lw a5,-20(s0) + 30053a0: 53dc lw a5,36(a5) + 30053a2: fec42503 lw a0,-20(s0) + 30053a6: 9782 jalr a5 + } + } + if (timerHandle->baseAddress->TIMERx_MIS.timermis == BASE_CFG_ENABLE) { + 30053a8: fec42783 lw a5,-20(s0) + 30053ac: 439c lw a5,0(a5) + 30053ae: 4bdc lw a5,20(a5) + 30053b0: 8b85 andi a5,a5,1 + 30053b2: 0ff7f713 andi a4,a5,255 + 30053b6: 4785 li a5,1 + 30053b8: 02f71263 bne a4,a5,30053dc + /* TIMER Interrupt */ + timerHandle->baseAddress->timer_intclr = BASE_CFG_ENABLE; + 30053bc: fec42783 lw a5,-20(s0) + 30053c0: 439c lw a5,0(a5) + 30053c2: 4705 li a4,1 + 30053c4: c7d8 sw a4,12(a5) + /* Call the period finish callback function of the user. */ + if (timerHandle->userCallBack.TimerPeriodFinCallBack != NULL) { + 30053c6: fec42783 lw a5,-20(s0) + 30053ca: 539c lw a5,32(a5) + 30053cc: cb81 beqz a5,30053dc + timerHandle->userCallBack.TimerPeriodFinCallBack(timerHandle); + 30053ce: fec42783 lw a5,-20(s0) + 30053d2: 539c lw a5,32(a5) + 30053d4: fec42503 lw a0,-20(s0) + 30053d8: 9782 jalr a5 + } + } + return; + 30053da: 0001 nop + 30053dc: 0001 nop +} + 30053de: 50b2 lw ra,44(sp) + 30053e0: 5422 lw s0,40(sp) + 30053e2: 6145 addi sp,sp,48 + 30053e4: 8082 ret + +030053e6 : + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Parameter check fail + */ +BASE_StatusType HAL_TIMER_RegisterCallback(TIMER_Handle *handle, TIMER_InterruptType typeID, + TIMER_CallBackFunc callBackFunc) +{ + 30053e6: 1101 addi sp,sp,-32 + 30053e8: ce06 sw ra,28(sp) + 30053ea: cc22 sw s0,24(sp) + 30053ec: 1000 addi s0,sp,32 + 30053ee: fea42623 sw a0,-20(s0) + 30053f2: feb42423 sw a1,-24(s0) + 30053f6: fec42223 sw a2,-28(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 30053fa: fec42783 lw a5,-20(s0) + 30053fe: eb89 bnez a5,3005410 + 3005400: 0fa00593 li a1,250 + 3005404: 030067b7 lui a5,0x3006 + 3005408: 62c78513 addi a0,a5,1580 # 300662c + 300540c: 35b5 jal ra,3005278 + 300540e: a001 j 300540e + TIMER_ASSERT_PARAM(callBackFunc != NULL); + 3005410: fe442783 lw a5,-28(s0) + 3005414: eb89 bnez a5,3005426 + 3005416: 0fb00593 li a1,251 + 300541a: 030067b7 lui a5,0x3006 + 300541e: 62c78513 addi a0,a5,1580 # 300662c + 3005422: 3d99 jal ra,3005278 + 3005424: a001 j 3005424 + TIMER_ASSERT_PARAM(IsTimerInterruptType(typeID)); + 3005426: fe842503 lw a0,-24(s0) + 300542a: 3e89 jal ra,3004f7c + 300542c: 87aa mv a5,a0 + 300542e: 0017c793 xori a5,a5,1 + 3005432: 9f81 uxtb a5 + 3005434: cb89 beqz a5,3005446 + 3005436: 0fc00593 li a1,252 + 300543a: 030067b7 lui a5,0x3006 + 300543e: 62c78513 addi a0,a5,1580 # 300662c + 3005442: 3d1d jal ra,3005278 + 3005444: a001 j 3005444 + + /* Registers the user callback function. */ + switch (typeID) { + 3005446: fe842783 lw a5,-24(s0) + 300544a: cb91 beqz a5,300545e + 300544c: 4705 li a4,1 + 300544e: 00e79e63 bne a5,a4,300546a + case TIMER_OVER_FLOW: + handle->userCallBack.TimerOverFlowCallBack = callBackFunc; /* User DMA request overflow function */ + 3005452: fec42783 lw a5,-20(s0) + 3005456: fe442703 lw a4,-28(s0) + 300545a: d3d8 sw a4,36(a5) + break; + 300545c: a809 j 300546e + case TIMER_PERIOD_FIN: + handle->userCallBack.TimerPeriodFinCallBack = callBackFunc; /* User timer period finish call back. */ + 300545e: fec42783 lw a5,-20(s0) + 3005462: fe442703 lw a4,-28(s0) + 3005466: d398 sw a4,32(a5) + break; + 3005468: a019 j 300546e + default: + return BASE_STATUS_ERROR; + 300546a: 4785 li a5,1 + 300546c: a011 j 3005470 + } + return BASE_STATUS_OK; + 300546e: 4781 li a5,0 +} + 3005470: 853e mv a0,a5 + 3005472: 40f2 lw ra,28(sp) + 3005474: 4462 lw s0,24(sp) + 3005476: 6105 addi sp,sp,32 + 3005478: 8082 ret + +0300547a : + * @brief Check UART datalength parameter. + * @param datalength The number of data bits in a frame, @ref UART_DataLength + * @retval bool + */ +static inline bool IsUartDatalength(UART_DataLength datalength) +{ + 300547a: 1101 addi sp,sp,-32 + 300547c: ce22 sw s0,28(sp) + 300547e: 1000 addi s0,sp,32 + 3005480: fea42623 sw a0,-20(s0) + return (datalength >= UART_DATALENGTH_5BIT) && (datalength <= UART_DATALENGTH_8BIT); + 3005484: fec42783 lw a5,-20(s0) + 3005488: 0047b793 sltiu a5,a5,4 + 300548c: 9f81 uxtb a5 +} + 300548e: 853e mv a0,a5 + 3005490: 4472 lw s0,28(sp) + 3005492: 6105 addi sp,sp,32 + 3005494: 8082 ret + +03005496 : + * @brief Check UART stopbits parameter. + * @param stopbits The number of stop bits in a frame, @ref UART_StopBits + * @retval bool + */ +static inline bool IsUartStopbits(UART_StopBits stopbits) +{ + 3005496: 1101 addi sp,sp,-32 + 3005498: ce22 sw s0,28(sp) + 300549a: 1000 addi s0,sp,32 + 300549c: fea42623 sw a0,-20(s0) + return (stopbits == UART_STOPBITS_ONE) || (stopbits == UART_STOPBITS_TWO); + 30054a0: fec42783 lw a5,-20(s0) + 30054a4: c791 beqz a5,30054b0 + 30054a6: fec42703 lw a4,-20(s0) + 30054aa: 4785 li a5,1 + 30054ac: 00f71463 bne a4,a5,30054b4 + 30054b0: 4785 li a5,1 + 30054b2: a011 j 30054b6 + 30054b4: 4781 li a5,0 + 30054b6: 8b85 andi a5,a5,1 + 30054b8: 9f81 uxtb a5 +} + 30054ba: 853e mv a0,a5 + 30054bc: 4472 lw s0,28(sp) + 30054be: 6105 addi sp,sp,32 + 30054c0: 8082 ret + +030054c2 : + * @brief Check UART paritymode parameter. + * @param paritymode UART parity check mode, @ref UART_Parity_Mode + * @retval bool + */ +static inline bool IsUartParitymode(UART_Parity_Mode paritymode) +{ + 30054c2: 1101 addi sp,sp,-32 + 30054c4: ce22 sw s0,28(sp) + 30054c6: 1000 addi s0,sp,32 + 30054c8: fea42623 sw a0,-20(s0) + if ((paritymode >= UART_PARITY_ODD) && (paritymode <= UART_PARITY_NONE)) { + 30054cc: fec42703 lw a4,-20(s0) + 30054d0: 4791 li a5,4 + 30054d2: 00e7e463 bltu a5,a4,30054da + return true; + 30054d6: 4785 li a5,1 + 30054d8: a011 j 30054dc + } + return false; + 30054da: 4781 li a5,0 +} + 30054dc: 853e mv a0,a5 + 30054de: 4472 lw s0,28(sp) + 30054e0: 6105 addi sp,sp,32 + 30054e2: 8082 ret + +030054e4 : + * @brief Check UART transmode parameter. + * @param transmode Transmit mode, @ref UART_Transmit_Mode + * @retval bool + */ +static inline bool IsUartTransmode(UART_Transmit_Mode transmode) +{ + 30054e4: 1101 addi sp,sp,-32 + 30054e6: ce22 sw s0,28(sp) + 30054e8: 1000 addi s0,sp,32 + 30054ea: fea42623 sw a0,-20(s0) + if ((transmode == UART_MODE_BLOCKING) || + 30054ee: fec42783 lw a5,-20(s0) + 30054f2: c385 beqz a5,3005512 + 30054f4: fec42703 lw a4,-20(s0) + 30054f8: 4785 li a5,1 + 30054fa: 00f70c63 beq a4,a5,3005512 + (transmode == UART_MODE_INTERRUPT) || + 30054fe: fec42703 lw a4,-20(s0) + 3005502: 4789 li a5,2 + 3005504: 00f70763 beq a4,a5,3005512 + (transmode == UART_MODE_DMA) || + 3005508: fec42703 lw a4,-20(s0) + 300550c: 478d li a5,3 + 300550e: 00f71463 bne a4,a5,3005516 + (transmode == UART_MODE_DISABLE)) { + return true; + 3005512: 4785 li a5,1 + 3005514: a011 j 3005518 + } + return false; + 3005516: 4781 li a5,0 +} + 3005518: 853e mv a0,a5 + 300551a: 4472 lw s0,28(sp) + 300551c: 6105 addi sp,sp,32 + 300551e: 8082 ret + +03005520 : + * @brief Check UART fifoThreshold parameter. + * @param fifoThreshold UART TX/RX FIFO line interrupt threshold, @ref UART_FIFO_Threshold + * @retval bool + */ +static inline bool IsUartFIFOThreshold(UART_FIFO_Threshold fifoThreshold) +{ + 3005520: 1101 addi sp,sp,-32 + 3005522: ce22 sw s0,28(sp) + 3005524: 1000 addi s0,sp,32 + 3005526: fea42623 sw a0,-20(s0) + return (fifoThreshold >= UART_FIFODEPTH_SIZE0) && (fifoThreshold <= UART_FIFODEPTH_SIZE15); + 300552a: fec42783 lw a5,-20(s0) + 300552e: 0107b793 sltiu a5,a5,16 + 3005532: 9f81 uxtb a5 +} + 3005534: 853e mv a0,a5 + 3005536: 4472 lw s0,28(sp) + 3005538: 6105 addi sp,sp,32 + 300553a: 8082 ret + +0300553c : + * @brief Check UART Oversampling multiple. + * @param multiple Oversampling multiple, @ref UART_OversampleMultiple + * @retval bool + */ +static inline bool IsUartOversampleMultiple(UART_OversampleMultiple multiple) +{ + 300553c: 1101 addi sp,sp,-32 + 300553e: ce22 sw s0,28(sp) + 3005540: 1000 addi s0,sp,32 + 3005542: fea42623 sw a0,-20(s0) + return (multiple >= UART_OVERSAMPLING_16X) && (multiple <= UART_OVERSAMPLING_12X); + 3005546: fec42783 lw a5,-20(s0) + 300554a: 0057b793 sltiu a5,a5,5 + 300554e: 9f81 uxtb a5 +} + 3005550: 853e mv a0,a5 + 3005552: 4472 lw s0,28(sp) + 3005554: 6105 addi sp,sp,32 + 3005556: 8082 ret + +03005558 : +#define PARITY_EVEN 0x6 +#define PARITY_MARK 0x82 +#define PARITY_SPACE 0x86 + +static unsigned int DivClosest(unsigned int x, unsigned int divisor) +{ + 3005558: 7179 addi sp,sp,-48 + 300555a: d622 sw s0,44(sp) + 300555c: 1800 addi s0,sp,48 + 300555e: fca42e23 sw a0,-36(s0) + 3005562: fcb42c23 sw a1,-40(s0) + unsigned int ret; + if (divisor == 0) { + 3005566: fd842783 lw a5,-40(s0) + 300556a: e399 bnez a5,3005570 + return 0; + 300556c: 4781 li a5,0 + 300556e: a005 j 300558e + } + ret = (((x) + ((divisor) / 2)) / (divisor)); /* Round up the result, add 1/2 */ + 3005570: fd842783 lw a5,-40(s0) + 3005574: 0017d713 srli a4,a5,0x1 + 3005578: fdc42783 lw a5,-36(s0) + 300557c: 973e add a4,a4,a5 + 300557e: fd842783 lw a5,-40(s0) + 3005582: 02f757b3 divu a5,a4,a5 + 3005586: fef42623 sw a5,-20(s0) + return ret; + 300558a: fec42783 lw a5,-20(s0) +} + 300558e: 853e mv a0,a5 + 3005590: 5432 lw s0,44(sp) + 3005592: 6145 addi sp,sp,48 + 3005594: 8082 ret + +03005596 : + * @brief Sets the parity bit of the UART. + * @param uartHandle UART handle. + * @retval None. + */ +static void UART_SetParityBit(UART_Handle *uartHandle) +{ + 3005596: 1101 addi sp,sp,-32 + 3005598: ce22 sw s0,28(sp) + 300559a: 1000 addi s0,sp,32 + 300559c: fea42623 sw a0,-20(s0) + /* Sets the UART check mode. */ + switch (uartHandle->parity) { + 30055a0: fec42783 lw a5,-20(s0) + 30055a4: 4b9c lw a5,16(a5) + 30055a6: 4711 li a4,4 + 30055a8: 06f76e63 bltu a4,a5,3005624 + 30055ac: 00279713 slli a4,a5,0x2 + 30055b0: 030067b7 lui a5,0x3006 + 30055b4: 64c78793 addi a5,a5,1612 # 300664c + 30055b8: 97ba add a5,a5,a4 + 30055ba: 439c lw a5,0(a5) + 30055bc: 8782 jr a5 + case UART_PARITY_ODD: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_ODD; /* Odd parity. */ + 30055be: fec42783 lw a5,-20(s0) + 30055c2: 439c lw a5,0(a5) + 30055c4: 57d8 lw a4,44(a5) + 30055c6: fec42783 lw a5,-20(s0) + 30055ca: 439c lw a5,0(a5) + 30055cc: 00276713 ori a4,a4,2 + 30055d0: d7d8 sw a4,44(a5) + break; + 30055d2: a891 j 3005626 + case UART_PARITY_EVEN: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_EVEN; /* Even parity. */ + 30055d4: fec42783 lw a5,-20(s0) + 30055d8: 439c lw a5,0(a5) + 30055da: 57d8 lw a4,44(a5) + 30055dc: fec42783 lw a5,-20(s0) + 30055e0: 439c lw a5,0(a5) + 30055e2: 00676713 ori a4,a4,6 + 30055e6: d7d8 sw a4,44(a5) + break; + 30055e8: a83d j 3005626 + case UART_PARITY_MARK: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_MARK; /* Marking parity */ + 30055ea: fec42783 lw a5,-20(s0) + 30055ee: 439c lw a5,0(a5) + 30055f0: 57d8 lw a4,44(a5) + 30055f2: fec42783 lw a5,-20(s0) + 30055f6: 439c lw a5,0(a5) + 30055f8: 08276713 ori a4,a4,130 + 30055fc: d7d8 sw a4,44(a5) + break; + 30055fe: a025 j 3005626 + case UART_PARITY_SPACE: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_SPACE; /* space parity */ + 3005600: fec42783 lw a5,-20(s0) + 3005604: 439c lw a5,0(a5) + 3005606: 57d8 lw a4,44(a5) + 3005608: fec42783 lw a5,-20(s0) + 300560c: 439c lw a5,0(a5) + 300560e: 08676713 ori a4,a4,134 + 3005612: d7d8 sw a4,44(a5) + break; + 3005614: a809 j 3005626 + case UART_PARITY_NONE: + uartHandle->baseAddress->UART_LCR_H.BIT.pen = BASE_CFG_DISABLE; /* No parity */ + 3005616: fec42783 lw a5,-20(s0) + 300561a: 4398 lw a4,0(a5) + 300561c: 575c lw a5,44(a4) + 300561e: 9bf5 andi a5,a5,-3 + 3005620: d75c sw a5,44(a4) + break; + 3005622: a011 j 3005626 + default: + return; + 3005624: 0001 nop + } +} + 3005626: 4472 lw s0,28(sp) + 3005628: 6105 addi sp,sp,32 + 300562a: 8082 ret + +0300562c : + * @brief Initialize the UART hardware configuration and configure parameters based on the specified handle. + * @param uartHandle UART handle. + * @retval BASE status type: OK, ERROR. + */ +BASE_StatusType HAL_UART_Init(UART_Handle *uartHandle) +{ + 300562c: 7179 addi sp,sp,-48 + 300562e: d606 sw ra,44(sp) + 3005630: d422 sw s0,40(sp) + 3005632: 1800 addi s0,sp,48 + 3005634: fca42e23 sw a0,-36(s0) + UART_ASSERT_PARAM(uartHandle != NULL); + 3005638: fdc42783 lw a5,-36(s0) + 300563c: eb89 bnez a5,300564e + 300563e: 09700593 li a1,151 + 3005642: 030067b7 lui a5,0x3006 + 3005646: 66078513 addi a0,a5,1632 # 3006660 + 300564a: 313d jal ra,3005278 + 300564c: a001 j 300564c + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + 300564e: fdc42783 lw a5,-36(s0) + 3005652: 4398 lw a4,0(a5) + 3005654: 140007b7 lui a5,0x14000 + 3005658: 02f70f63 beq a4,a5,3005696 + 300565c: fdc42783 lw a5,-36(s0) + 3005660: 4398 lw a4,0(a5) + 3005662: 140017b7 lui a5,0x14001 + 3005666: 02f70863 beq a4,a5,3005696 + 300566a: fdc42783 lw a5,-36(s0) + 300566e: 4398 lw a4,0(a5) + 3005670: 140027b7 lui a5,0x14002 + 3005674: 02f70163 beq a4,a5,3005696 + 3005678: fdc42783 lw a5,-36(s0) + 300567c: 4398 lw a4,0(a5) + 300567e: 140037b7 lui a5,0x14003 + 3005682: 00f70a63 beq a4,a5,3005696 + 3005686: 09800593 li a1,152 + 300568a: 030067b7 lui a5,0x3006 + 300568e: 66078513 addi a0,a5,1632 # 3006660 + 3005692: 36dd jal ra,3005278 + 3005694: a001 j 3005694 + UART_PARAM_CHECK_WITH_RET(uartHandle->txState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 3005696: fdc42783 lw a5,-36(s0) + 300569a: 47bc lw a5,72(a5) + 300569c: cb91 beqz a5,30056b0 + 300569e: 09900593 li a1,153 + 30056a2: 030067b7 lui a5,0x3006 + 30056a6: 66078513 addi a0,a5,1632 # 3006660 + 30056aa: 36f9 jal ra,3005278 + 30056ac: 4785 li a5,1 + 30056ae: ae0d j 30059e0 + UART_PARAM_CHECK_WITH_RET(uartHandle->rxState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 30056b0: fdc42783 lw a5,-36(s0) + 30056b4: 47fc lw a5,76(a5) + 30056b6: cb91 beqz a5,30056ca + 30056b8: 09a00593 li a1,154 + 30056bc: 030067b7 lui a5,0x3006 + 30056c0: 66078513 addi a0,a5,1632 # 3006660 + 30056c4: 3e55 jal ra,3005278 + 30056c6: 4785 li a5,1 + 30056c8: ae21 j 30059e0 + unsigned int uartClock, quot; + UART_PARAM_CHECK_WITH_RET(IsUartDatalength(uartHandle->dataLength), BASE_STATUS_ERROR); + 30056ca: fdc42783 lw a5,-36(s0) + 30056ce: 479c lw a5,8(a5) + 30056d0: 853e mv a0,a5 + 30056d2: 3365 jal ra,300547a + 30056d4: 87aa mv a5,a0 + 30056d6: 0017c793 xori a5,a5,1 + 30056da: 9f81 uxtb a5 + 30056dc: cb91 beqz a5,30056f0 + 30056de: 09c00593 li a1,156 + 30056e2: 030067b7 lui a5,0x3006 + 30056e6: 66078513 addi a0,a5,1632 # 3006660 + 30056ea: 3679 jal ra,3005278 + 30056ec: 4785 li a5,1 + 30056ee: accd j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartStopbits(uartHandle->stopBits), BASE_STATUS_ERROR); + 30056f0: fdc42783 lw a5,-36(s0) + 30056f4: 47dc lw a5,12(a5) + 30056f6: 853e mv a0,a5 + 30056f8: 3b79 jal ra,3005496 + 30056fa: 87aa mv a5,a0 + 30056fc: 0017c793 xori a5,a5,1 + 3005700: 9f81 uxtb a5 + 3005702: cb91 beqz a5,3005716 + 3005704: 09d00593 li a1,157 + 3005708: 030067b7 lui a5,0x3006 + 300570c: 66078513 addi a0,a5,1632 # 3006660 + 3005710: 36a5 jal ra,3005278 + 3005712: 4785 li a5,1 + 3005714: a4f1 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartParitymode(uartHandle->parity), BASE_STATUS_ERROR); + 3005716: fdc42783 lw a5,-36(s0) + 300571a: 4b9c lw a5,16(a5) + 300571c: 853e mv a0,a5 + 300571e: 3355 jal ra,30054c2 + 3005720: 87aa mv a5,a0 + 3005722: 0017c793 xori a5,a5,1 + 3005726: 9f81 uxtb a5 + 3005728: cb91 beqz a5,300573c + 300572a: 09e00593 li a1,158 + 300572e: 030067b7 lui a5,0x3006 + 3005732: 66078513 addi a0,a5,1632 # 3006660 + 3005736: 3689 jal ra,3005278 + 3005738: 4785 li a5,1 + 300573a: a45d j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->txMode), BASE_STATUS_ERROR); + 300573c: fdc42783 lw a5,-36(s0) + 3005740: 4bdc lw a5,20(a5) + 3005742: 853e mv a0,a5 + 3005744: 3345 jal ra,30054e4 + 3005746: 87aa mv a5,a0 + 3005748: 0017c793 xori a5,a5,1 + 300574c: 9f81 uxtb a5 + 300574e: cb91 beqz a5,3005762 + 3005750: 09f00593 li a1,159 + 3005754: 030067b7 lui a5,0x3006 + 3005758: 66078513 addi a0,a5,1632 # 3006660 + 300575c: 3e31 jal ra,3005278 + 300575e: 4785 li a5,1 + 3005760: a441 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->rxMode), BASE_STATUS_ERROR); + 3005762: fdc42783 lw a5,-36(s0) + 3005766: 4f9c lw a5,24(a5) + 3005768: 853e mv a0,a5 + 300576a: 3bad jal ra,30054e4 + 300576c: 87aa mv a5,a0 + 300576e: 0017c793 xori a5,a5,1 + 3005772: 9f81 uxtb a5 + 3005774: cb91 beqz a5,3005788 + 3005776: 0a000593 li a1,160 + 300577a: 030067b7 lui a5,0x3006 + 300577e: 66078513 addi a0,a5,1632 # 3006660 + 3005782: 3cdd jal ra,3005278 + 3005784: 4785 li a5,1 + 3005786: aca9 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoTxThr), BASE_STATUS_ERROR); + 3005788: fdc42783 lw a5,-36(s0) + 300578c: 5b9c lw a5,48(a5) + 300578e: 853e mv a0,a5 + 3005790: 3b41 jal ra,3005520 + 3005792: 87aa mv a5,a0 + 3005794: 0017c793 xori a5,a5,1 + 3005798: 9f81 uxtb a5 + 300579a: cb91 beqz a5,30057ae + 300579c: 0a100593 li a1,161 + 30057a0: 030067b7 lui a5,0x3006 + 30057a4: 66078513 addi a0,a5,1632 # 3006660 + 30057a8: 3cc1 jal ra,3005278 + 30057aa: 4785 li a5,1 + 30057ac: ac15 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoRxThr), BASE_STATUS_ERROR); + 30057ae: fdc42783 lw a5,-36(s0) + 30057b2: 5bdc lw a5,52(a5) + 30057b4: 853e mv a0,a5 + 30057b6: 33ad jal ra,3005520 + 30057b8: 87aa mv a5,a0 + 30057ba: 0017c793 xori a5,a5,1 + 30057be: 9f81 uxtb a5 + 30057c0: cb91 beqz a5,30057d4 + 30057c2: 0a200593 li a1,162 + 30057c6: 030067b7 lui a5,0x3006 + 30057ca: 66078513 addi a0,a5,1632 # 3006660 + 30057ce: 346d jal ra,3005278 + 30057d0: 4785 li a5,1 + 30057d2: a439 j 30059e0 + UART_PARAM_CHECK_WITH_RET(IsUartOversampleMultiple(uartHandle->handleEx.overSampleMultiple), BASE_STATUS_ERROR); + 30057d4: fdc42783 lw a5,-36(s0) + 30057d8: 5fbc lw a5,120(a5) + 30057da: 853e mv a0,a5 + 30057dc: 3385 jal ra,300553c + 30057de: 87aa mv a5,a0 + 30057e0: 0017c793 xori a5,a5,1 + 30057e4: 9f81 uxtb a5 + 30057e6: cb91 beqz a5,30057fa + 30057e8: 0a300593 li a1,163 + 30057ec: 030067b7 lui a5,0x3006 + 30057f0: 66078513 addi a0,a5,1632 # 3006660 + 30057f4: 3451 jal ra,3005278 + 30057f6: 4785 li a5,1 + 30057f8: a2e5 j 30059e0 + + uartHandle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; + 30057fa: fdc42783 lw a5,-36(s0) + 30057fe: 4398 lw a4,0(a5) + 3005800: 5b1c lw a5,48(a4) + 3005802: 9bf9 andi a5,a5,-2 + 3005804: db1c sw a5,48(a4) + while (uartHandle->baseAddress->UART_FR.BIT.busy == 0x01) { + 3005806: 0001 nop + 3005808: fdc42783 lw a5,-36(s0) + 300580c: 439c lw a5,0(a5) + 300580e: 4f9c lw a5,24(a5) + 3005810: 838d srli a5,a5,0x3 + 3005812: 8b85 andi a5,a5,1 + 3005814: 0ff7f713 andi a4,a5,255 + 3005818: 4785 li a5,1 + 300581a: fef707e3 beq a4,a5,3005808 + ; + } + + uartClock = HAL_CRG_GetIpFreq((void *)uartHandle->baseAddress); + 300581e: fdc42783 lw a5,-36(s0) + 3005822: 439c lw a5,0(a5) + 3005824: 853e mv a0,a5 + 3005826: 9f1fd0ef jal ra,3003216 + 300582a: fea42623 sw a0,-20(s0) + + /* DCL OverSample Multiple check */ + uartHandle->baseAddress->UART_SPCFG.BIT.spcfg = uartHandle->handleEx.overSampleMultiple; + 300582e: fdc42783 lw a5,-36(s0) + 3005832: 5fb4 lw a3,120(a5) + 3005834: fdc42783 lw a5,-36(s0) + 3005838: 4398 lw a4,0(a5) + 300583a: 87b6 mv a5,a3 + 300583c: 8bbd andi a5,a5,15 + 300583e: 0ff7f693 andi a3,a5,255 + 3005842: 4f3c lw a5,88(a4) + 3005844: 8abd andi a3,a3,15 + 3005846: 9bc1 andi a5,a5,-16 + 3005848: 8fd5 or a5,a5,a3 + 300584a: cf3c sw a5,88(a4) + + /* DCL sequences setting */ + uartHandle->baseAddress->UART_DS.BIT.msbfirst = uartHandle->handleEx.msbFirst; + 300584c: fdc42783 lw a5,-36(s0) + 3005850: 4398 lw a4,0(a5) + 3005852: fdc42783 lw a5,-36(s0) + 3005856: 07c7c683 lbu a3,124(a5) + 300585a: 4b3c lw a5,80(a4) + 300585c: 8a85 andi a3,a3,1 + 300585e: 9bf9 andi a5,a5,-2 + 3005860: 8fd5 or a5,a5,a3 + 3005862: cb3c sw a5,80(a4) + + /* The baud rate divider(BRD) based on the baud rate and clock frequency, calculation formula */ + unsigned int oversample = uartHandle->baseAddress->UART_SPCFG.reg; + 3005864: fdc42783 lw a5,-36(s0) + 3005868: 439c lw a5,0(a5) + 300586a: 4fbc lw a5,88(a5) + 300586c: fef42423 sw a5,-24(s0) + if (uartHandle->baudRate > (uartClock / (OVERSAMPLING_PARAM - oversample))) { + 3005870: fdc42783 lw a5,-36(s0) + 3005874: 43d8 lw a4,4(a5) + 3005876: 46c1 li a3,16 + 3005878: fe842783 lw a5,-24(s0) + 300587c: 40f687b3 sub a5,a3,a5 + 3005880: fec42683 lw a3,-20(s0) + 3005884: 02f6d7b3 divu a5,a3,a5 + 3005888: 00e7f463 bgeu a5,a4,3005890 + return BASE_STATUS_ERROR; + 300588c: 4785 li a5,1 + 300588e: aa89 j 30059e0 + } else { + unsigned int tmpClock = uartClock / (OVERSAMPLING_PARAM - oversample) * 64; /* 64 is for decimal parts */ + 3005890: 4741 li a4,16 + 3005892: fe842783 lw a5,-24(s0) + 3005896: 40f707b3 sub a5,a4,a5 + 300589a: fec42703 lw a4,-20(s0) + 300589e: 02f757b3 divu a5,a4,a5 + 30058a2: 079a slli a5,a5,0x6 + 30058a4: fef42223 sw a5,-28(s0) + quot = DivClosest(tmpClock, uartHandle->baudRate); + 30058a8: fdc42783 lw a5,-36(s0) + 30058ac: 43dc lw a5,4(a5) + 30058ae: 85be mv a1,a5 + 30058b0: fe442503 lw a0,-28(s0) + 30058b4: 3155 jal ra,3005558 + 30058b6: fea42023 sw a0,-32(s0) + } + /* Clear the baud rate divider register */ + uartHandle->baseAddress->UART_FBRD.reg = 0; + 30058ba: fdc42783 lw a5,-36(s0) + 30058be: 439c lw a5,0(a5) + 30058c0: 0207a423 sw zero,40(a5) + uartHandle->baseAddress->UART_IBRD.reg = 0; + 30058c4: fdc42783 lw a5,-36(s0) + 30058c8: 439c lw a5,0(a5) + 30058ca: 0207a223 sw zero,36(a5) + /* The fractional baud rate divider value is stored to the lower 6 bits of the FBRD */ + uartHandle->baseAddress->UART_FBRD.reg = (quot & 0x3F); + 30058ce: fdc42783 lw a5,-36(s0) + 30058d2: 439c lw a5,0(a5) + 30058d4: fe042703 lw a4,-32(s0) + 30058d8: 03f77713 andi a4,a4,63 + 30058dc: d798 sw a4,40(a5) + /* Right shift 6 bits is the integer baud rate divider value, is stored to IBRD */ + uartHandle->baseAddress->UART_IBRD.reg = (quot >> 6); + 30058de: fdc42783 lw a5,-36(s0) + 30058e2: 439c lw a5,0(a5) + 30058e4: fe042703 lw a4,-32(s0) + 30058e8: 8319 srli a4,a4,0x6 + 30058ea: d3d8 sw a4,36(a5) + uartHandle->baseAddress->UART_LCR_H.reg = 0; + 30058ec: fdc42783 lw a5,-36(s0) + 30058f0: 439c lw a5,0(a5) + 30058f2: 0207a623 sw zero,44(a5) + uartHandle->baseAddress->UART_LCR_H.BIT.wlen = uartHandle->dataLength; /* Frame length seting */ + 30058f6: fdc42783 lw a5,-36(s0) + 30058fa: 4794 lw a3,8(a5) + 30058fc: fdc42783 lw a5,-36(s0) + 3005900: 4398 lw a4,0(a5) + 3005902: 87b6 mv a5,a3 + 3005904: 8b8d andi a5,a5,3 + 3005906: 0ff7f693 andi a3,a5,255 + 300590a: 575c lw a5,44(a4) + 300590c: 8a8d andi a3,a3,3 + 300590e: 0696 slli a3,a3,0x5 + 3005910: f9f7f793 andi a5,a5,-97 + 3005914: 8fd5 or a5,a5,a3 + 3005916: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_LCR_H.BIT.stp2 = uartHandle->stopBits; /* Stop bit seting */ + 3005918: fdc42783 lw a5,-36(s0) + 300591c: 47d4 lw a3,12(a5) + 300591e: fdc42783 lw a5,-36(s0) + 3005922: 4398 lw a4,0(a5) + 3005924: 87b6 mv a5,a3 + 3005926: 8b85 andi a5,a5,1 + 3005928: 0ff7f693 andi a3,a5,255 + 300592c: 575c lw a5,44(a4) + 300592e: 8a85 andi a3,a3,1 + 3005930: 068e slli a3,a3,0x3 + 3005932: 9bdd andi a5,a5,-9 + 3005934: 8fd5 or a5,a5,a3 + 3005936: d75c sw a5,44(a4) + UART_SetParityBit(uartHandle); + 3005938: fdc42503 lw a0,-36(s0) + 300593c: 39a9 jal ra,3005596 + if (uartHandle->fifoMode == true) { /* FIFO threshold setting */ + 300593e: fdc42783 lw a5,-36(s0) + 3005942: 02c7c783 lbu a5,44(a5) + 3005946: cbb1 beqz a5,300599a + uartHandle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_ENABLE; + 3005948: fdc42783 lw a5,-36(s0) + 300594c: 4398 lw a4,0(a5) + 300594e: 575c lw a5,44(a4) + 3005950: 0107e793 ori a5,a5,16 + 3005954: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_IFLS.BIT.rxiflsel = uartHandle->fifoRxThr; + 3005956: fdc42783 lw a5,-36(s0) + 300595a: 5bd4 lw a3,52(a5) + 300595c: fdc42783 lw a5,-36(s0) + 3005960: 4398 lw a4,0(a5) + 3005962: 87b6 mv a5,a3 + 3005964: 8bbd andi a5,a5,15 + 3005966: 0ff7f693 andi a3,a5,255 + 300596a: 5b5c lw a5,52(a4) + 300596c: 8abd andi a3,a3,15 + 300596e: 06a2 slli a3,a3,0x8 + 3005970: 767d lui a2,0xfffff + 3005972: 0ff60613 addi a2,a2,255 # fffff0ff + 3005976: 8ff1 and a5,a5,a2 + 3005978: 8fd5 or a5,a5,a3 + 300597a: db5c sw a5,52(a4) + uartHandle->baseAddress->UART_IFLS.BIT.txiflsel = uartHandle->fifoTxThr; + 300597c: fdc42783 lw a5,-36(s0) + 3005980: 5b94 lw a3,48(a5) + 3005982: fdc42783 lw a5,-36(s0) + 3005986: 4398 lw a4,0(a5) + 3005988: 87b6 mv a5,a3 + 300598a: 8bbd andi a5,a5,15 + 300598c: 0ff7f693 andi a3,a5,255 + 3005990: 5b5c lw a5,52(a4) + 3005992: 8abd andi a3,a3,15 + 3005994: 9bc1 andi a5,a5,-16 + 3005996: 8fd5 or a5,a5,a3 + 3005998: db5c sw a5,52(a4) + } + if (uartHandle->hwFlowCtr == UART_HW_FLOWCTR_ENABLE) { /* Hardwarer flow control setting */ + 300599a: fdc42783 lw a5,-36(s0) + 300599e: 5f98 lw a4,56(a5) + 30059a0: 4785 li a5,1 + 30059a2: 00f71c63 bne a4,a5,30059ba + uartHandle->baseAddress->UART_CR.reg |= 0xC000; + 30059a6: fdc42783 lw a5,-36(s0) + 30059aa: 439c lw a5,0(a5) + 30059ac: 5b94 lw a3,48(a5) + 30059ae: fdc42783 lw a5,-36(s0) + 30059b2: 439c lw a5,0(a5) + 30059b4: 6731 lui a4,0xc + 30059b6: 8f55 or a4,a4,a3 + 30059b8: db98 sw a4,48(a5) + } + uartHandle->baseAddress->UART_CR.reg |= 0x301; /* Enable bit use 0x301 is to set txe/rxe/uarten */ + 30059ba: fdc42783 lw a5,-36(s0) + 30059be: 439c lw a5,0(a5) + 30059c0: 5b98 lw a4,48(a5) + 30059c2: fdc42783 lw a5,-36(s0) + 30059c6: 439c lw a5,0(a5) + 30059c8: 30176713 ori a4,a4,769 + 30059cc: db98 sw a4,48(a5) + uartHandle->txState = UART_STATE_READY; + 30059ce: fdc42783 lw a5,-36(s0) + 30059d2: 4705 li a4,1 + 30059d4: c7b8 sw a4,72(a5) + uartHandle->rxState = UART_STATE_READY; + 30059d6: fdc42783 lw a5,-36(s0) + 30059da: 4705 li a4,1 + 30059dc: c7f8 sw a4,76(a5) + return BASE_STATUS_OK; + 30059de: 4781 li a5,0 +} + 30059e0: 853e mv a0,a5 + 30059e2: 50b2 lw ra,44(sp) + 30059e4: 5422 lw s0,40(sp) + 30059e6: 6145 addi sp,sp,48 + 30059e8: 8082 ret + +030059ea
: +/* USER CODE BEGIN 1 */ +/* 建议用户定义全局变量、结构体、宏定义或函数声明等 */ +/* USER CODE END 1 */ + +int main(void) +{ + 30059ea: 1141 addi sp,sp,-16 + 30059ec: c606 sw ra,12(sp) + 30059ee: c422 sw s0,8(sp) + 30059f0: 0800 addi s0,sp,16 + /* USER CODE BEGIN 2 */ + /* 建议用户放置初始化代码或启动代码等 */ + /* USER CODE END 2 */ + SystemInit(); + 30059f2: 2655 jal ra,3005d96 + /* USER CODE BEGIN 3 */ + /* 建议用户放置初始配置代码 */ + /* USER CODE END 3 */ + while (1) { + 30059f4: a001 j 30059f4 + +030059f6 : +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + 30059f6: 715d addi sp,sp,-80 + 30059f8: c686 sw ra,76(sp) + 30059fa: c4a2 sw s0,72(sp) + 30059fc: 0880 addi s0,sp,80 + 30059fe: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3005a02: 100007b7 lui a5,0x10000 + 3005a06: fcf42423 sw a5,-56(s0) + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + 3005a0a: fc042623 sw zero,-52(s0) + crg.pllPreDiv = CRG_PLL_PREDIV_4; + 3005a0e: 478d li a5,3 + 3005a10: fcf42823 sw a5,-48(s0) + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + 3005a14: 03000793 li a5,48 + 3005a18: fcf42a23 sw a5,-44(s0) + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + 3005a1c: 4785 li a5,1 + 3005a1e: fcf42c23 sw a5,-40(s0) + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + 3005a22: 4789 li a5,2 + 3005a24: fef42023 sw a5,-32(s0) + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + 3005a28: 4789 li a5,2 + 3005a2a: fef42223 sw a5,-28(s0) + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + 3005a2e: fe042423 sw zero,-24(s0) + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + 3005a32: 47e1 li a5,24 + 3005a34: fef42623 sw a5,-20(s0) + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + 3005a38: fc840793 addi a5,s0,-56 + 3005a3c: 853e mv a0,a5 + 3005a3e: aecfd0ef jal ra,3002d2a + 3005a42: 87aa mv a5,a0 + 3005a44: c399 beqz a5,3005a4a + return BASE_STATUS_ERROR; + 3005a46: 4785 li a5,1 + 3005a48: a039 j 3005a56 + } + *coreClkSelect = crg.coreClkSelect; + 3005a4a: fe042703 lw a4,-32(s0) + 3005a4e: fbc42783 lw a5,-68(s0) + 3005a52: c398 sw a4,0(a5) + return BASE_STATUS_OK; + 3005a54: 4781 li a5,0 +} + 3005a56: 853e mv a0,a5 + 3005a58: 40b6 lw ra,76(sp) + 3005a5a: 4426 lw s0,72(sp) + 3005a5c: 6161 addi sp,sp,80 + 3005a5e: 8082 ret + +03005a60 : + +static void ADC0_Init(void) +{ + 3005a60: 7179 addi sp,sp,-48 + 3005a62: d606 sw ra,44(sp) + 3005a64: d422 sw s0,40(sp) + 3005a66: 1800 addi s0,sp,48 + HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); + 3005a68: 4585 li a1,1 + 3005a6a: 18000537 lui a0,0x18000 + 3005a6e: 2c81 jal ra,3005cbe + HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); + 3005a70: 4589 li a1,2 + 3005a72: 18000537 lui a0,0x18000 + 3005a76: 95dfd0ef jal ra,30033d2 + HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_1); + 3005a7a: 4581 li a1,0 + 3005a7c: 18000537 lui a0,0x18000 + 3005a80: a09fd0ef jal ra,3003488 + + g_adc0.baseAddress = ADC0; + 3005a84: 040007b7 lui a5,0x4000 + 3005a88: 54478793 addi a5,a5,1348 # 4000544 + 3005a8c: 18000737 lui a4,0x18000 + 3005a90: c398 sw a4,0(a5) + g_adc0.socPriority = ADC_PRIMODE_ALL_ROUND; + 3005a92: 040007b7 lui a5,0x4000 + 3005a96: 54478793 addi a5,a5,1348 # 4000544 + 3005a9a: 0007a223 sw zero,4(a5) + + HAL_ADC_Init(&g_adc0); + 3005a9e: 040007b7 lui a5,0x4000 + 3005aa2: 54478513 addi a0,a5,1348 # 4000544 + 3005aa6: f75fb0ef jal ra,3001a1a + + SOC_Param socParam = {0}; + 3005aaa: fc042e23 sw zero,-36(s0) + 3005aae: fe042023 sw zero,-32(s0) + 3005ab2: fe042223 sw zero,-28(s0) + 3005ab6: fe042423 sw zero,-24(s0) + 3005aba: fe042623 sw zero,-20(s0) + socParam.adcInput = ADC_CH_ADCINA6; /* PIN4(ADC AIN6) */ + 3005abe: 4799 li a5,6 + 3005ac0: fcf42e23 sw a5,-36(s0) + socParam.sampleTotalTime = ADC_SOCSAMPLE_10CLK; /* adc sample total time 10 adc_clk */ + 3005ac4: 4789 li a5,2 + 3005ac6: fef42023 sw a5,-32(s0) + socParam.trigSource = ADC_TRIGSOC_SOFT; + 3005aca: fe042223 sw zero,-28(s0) + socParam.continueMode = BASE_CFG_ENABLE; + 3005ace: 4785 li a5,1 + 3005ad0: fef40423 sb a5,-24(s0) + socParam.finishMode = ADC_SOCFINISH_NONE; + 3005ad4: 4785 li a5,1 + 3005ad6: fef42623 sw a5,-20(s0) + HAL_ADC_ConfigureSoc(&g_adc0, ADC_SOC_NUM1, &socParam); + 3005ada: fdc40793 addi a5,s0,-36 + 3005ade: 863e mv a2,a5 + 3005ae0: 4585 li a1,1 + 3005ae2: 040007b7 lui a5,0x4000 + 3005ae6: 54478513 addi a0,a5,1348 # 4000544 + 3005aea: fe3fb0ef jal ra,3001acc +} + 3005aee: 0001 nop + 3005af0: 50b2 lw ra,44(sp) + 3005af2: 5422 lw s0,40(sp) + 3005af4: 6145 addi sp,sp,48 + 3005af6: 8082 ret + +03005af8 : + /* USER CODE BEGIN TIMER3_InterruptProcess */ + /* USER CODE END TIMER3_InterruptProcess */ +} + +static void TIMER3_Init(void) +{ + 3005af8: 1101 addi sp,sp,-32 + 3005afa: ce06 sw ra,28(sp) + 3005afc: cc22 sw s0,24(sp) + 3005afe: 1000 addi s0,sp,32 + HAL_CRG_IpEnableSet(TIMER3_BASE, IP_CLK_ENABLE); /* TIMER3 clock enable. */ + 3005b00: 4585 li a1,1 + 3005b02: 14303537 lui a0,0x14303 + 3005b06: 2a65 jal ra,3005cbe + unsigned int load = (HAL_CRG_GetIpFreq((void *)TIMER3) / (1u << (TIMERPRESCALER_NO_DIV * 4)) / 1000000u) * 10; + 3005b08: 14303537 lui a0,0x14303 + 3005b0c: f0afd0ef jal ra,3003216 + 3005b10: 872a mv a4,a0 + 3005b12: 000f47b7 lui a5,0xf4 + 3005b16: 24078793 addi a5,a5,576 # f4240 + 3005b1a: 02f75733 divu a4,a4,a5 + 3005b1e: 47a9 li a5,10 + 3005b20: 02f707b3 mul a5,a4,a5 + 3005b24: fef42623 sw a5,-20(s0) + + g_timer3.baseAddress = TIMER3; + 3005b28: 040007b7 lui a5,0x4000 + 3005b2c: 49c78793 addi a5,a5,1180 # 400049c + 3005b30: 14303737 lui a4,0x14303 + 3005b34: c398 sw a4,0(a5) + g_timer3.load = load - 1; /* Set timer value immediately */ + 3005b36: fec42783 lw a5,-20(s0) + 3005b3a: fff78713 addi a4,a5,-1 + 3005b3e: 040007b7 lui a5,0x4000 + 3005b42: 49c78793 addi a5,a5,1180 # 400049c + 3005b46: cbd8 sw a4,20(a5) + g_timer3.bgLoad = load - 1; /* Set timer value */ + 3005b48: fec42783 lw a5,-20(s0) + 3005b4c: fff78713 addi a4,a5,-1 + 3005b50: 040007b7 lui a5,0x4000 + 3005b54: 49c78793 addi a5,a5,1180 # 400049c + 3005b58: cf98 sw a4,24(a5) + g_timer3.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ + 3005b5a: 040007b7 lui a5,0x4000 + 3005b5e: 49c78793 addi a5,a5,1180 # 400049c + 3005b62: 4705 li a4,1 + 3005b64: c798 sw a4,8(a5) + g_timer3.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ + 3005b66: 040007b7 lui a5,0x4000 + 3005b6a: 49c78793 addi a5,a5,1180 # 400049c + 3005b6e: 0007a623 sw zero,12(a5) + g_timer3.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ + 3005b72: 040007b7 lui a5,0x4000 + 3005b76: 49c78793 addi a5,a5,1180 # 400049c + 3005b7a: 4705 li a4,1 + 3005b7c: cb98 sw a4,16(a5) + g_timer3.interruptEn = BASE_CFG_ENABLE; + 3005b7e: 040007b7 lui a5,0x4000 + 3005b82: 49c78793 addi a5,a5,1180 # 400049c + 3005b86: 4705 li a4,1 + 3005b88: afd8 sb a4,28(a5) + g_timer3.adcSocReqEnable = BASE_CFG_DISABLE; + 3005b8a: 040007b7 lui a5,0x4000 + 3005b8e: 49c78793 addi a5,a5,1180 # 400049c + 3005b92: 00078ea3 sb zero,29(a5) + g_timer3.dmaReqEnable = BASE_CFG_DISABLE; + 3005b96: 040007b7 lui a5,0x4000 + 3005b9a: 49c78793 addi a5,a5,1180 # 400049c + 3005b9e: 00078f23 sb zero,30(a5) + HAL_TIMER_Init(&g_timer3); + 3005ba2: 040007b7 lui a5,0x4000 + 3005ba6: 49c78513 addi a0,a5,1180 # 400049c + 3005baa: c7cff0ef jal ra,3005026 + IRQ_Register(IRQ_TIMER3, HAL_TIMER_IrqHandler, &g_timer3); + 3005bae: 040007b7 lui a5,0x4000 + 3005bb2: 49c78613 addi a2,a5,1180 # 400049c + 3005bb6: 030057b7 lui a5,0x3005 + 3005bba: 2fe78593 addi a1,a5,766 # 30052fe + 3005bbe: 02300513 li a0,35 + 3005bc2: cf0fc0ef jal ra,30020b2 + + HAL_TIMER_RegisterCallback(&g_timer3, TIMER_PERIOD_FIN, TIMER3_InterruptProcess); + 3005bc6: 030067b7 lui a5,0x3006 + 3005bca: dd678613 addi a2,a5,-554 # 3005dd6 + 3005bce: 4581 li a1,0 + 3005bd0: 040007b7 lui a5,0x4000 + 3005bd4: 49c78513 addi a0,a5,1180 # 400049c + 3005bd8: 3039 jal ra,30053e6 + IRQ_SetPriority(IRQ_TIMER3, 1); /* 1 is priority value */ + 3005bda: 4585 li a1,1 + 3005bdc: 02300513 li a0,35 + 3005be0: ca7fc0ef jal ra,3002886 + IRQ_EnableN(IRQ_TIMER3); + 3005be4: 02300513 li a0,35 + 3005be8: d50fc0ef jal ra,3002138 +} + 3005bec: 0001 nop + 3005bee: 40f2 lw ra,28(sp) + 3005bf0: 4462 lw s0,24(sp) + 3005bf2: 6105 addi sp,sp,32 + 3005bf4: 8082 ret + +03005bf6 : + +static void UART0_Init(void) +{ + 3005bf6: 1141 addi sp,sp,-16 + 3005bf8: c606 sw ra,12(sp) + 3005bfa: c422 sw s0,8(sp) + 3005bfc: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + 3005bfe: 4585 li a1,1 + 3005c00: 14000537 lui a0,0x14000 + 3005c04: 286d jal ra,3005cbe + g_uart0.baseAddress = UART0; + 3005c06: 040007b7 lui a5,0x4000 + 3005c0a: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c0e: 14000737 lui a4,0x14000 + 3005c12: c398 sw a4,0(a5) + + g_uart0.baudRate = UART0_BAND_RATE; + 3005c14: 040007b7 lui a5,0x4000 + 3005c18: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c1c: 6771 lui a4,0x1c + 3005c1e: 20070713 addi a4,a4,512 # 1c200 + 3005c22: c3d8 sw a4,4(a5) + g_uart0.dataLength = UART_DATALENGTH_8BIT; + 3005c24: 040007b7 lui a5,0x4000 + 3005c28: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c2c: 470d li a4,3 + 3005c2e: c798 sw a4,8(a5) + g_uart0.stopBits = UART_STOPBITS_ONE; + 3005c30: 040007b7 lui a5,0x4000 + 3005c34: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c38: 0007a623 sw zero,12(a5) + g_uart0.parity = UART_PARITY_NONE; + 3005c3c: 040007b7 lui a5,0x4000 + 3005c40: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c44: 4711 li a4,4 + 3005c46: cb98 sw a4,16(a5) + g_uart0.txMode = UART_MODE_BLOCKING; + 3005c48: 040007b7 lui a5,0x4000 + 3005c4c: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c50: 0007aa23 sw zero,20(a5) + g_uart0.rxMode = UART_MODE_BLOCKING; + 3005c54: 040007b7 lui a5,0x4000 + 3005c58: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c5c: 0007ac23 sw zero,24(a5) + g_uart0.fifoMode = BASE_CFG_ENABLE; + 3005c60: 040007b7 lui a5,0x4000 + 3005c64: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c68: 4705 li a4,1 + 3005c6a: 02e78623 sb a4,44(a5) + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + 3005c6e: 040007b7 lui a5,0x4000 + 3005c72: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c76: 4721 li a4,8 + 3005c78: db98 sw a4,48(a5) + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + 3005c7a: 040007b7 lui a5,0x4000 + 3005c7e: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c82: 4721 li a4,8 + 3005c84: dbd8 sw a4,52(a5) + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + 3005c86: 040007b7 lui a5,0x4000 + 3005c8a: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c8e: 0207ac23 sw zero,56(a5) + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + 3005c92: 040007b7 lui a5,0x4000 + 3005c96: 4c478793 addi a5,a5,1220 # 40004c4 + 3005c9a: 0607ac23 sw zero,120(a5) + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + 3005c9e: 040007b7 lui a5,0x4000 + 3005ca2: 4c478793 addi a5,a5,1220 # 40004c4 + 3005ca6: 06078e23 sb zero,124(a5) + HAL_UART_Init(&g_uart0); + 3005caa: 040007b7 lui a5,0x4000 + 3005cae: 4c478513 addi a0,a5,1220 # 40004c4 + 3005cb2: 3aad jal ra,300562c +} + 3005cb4: 0001 nop + 3005cb6: 40b2 lw ra,12(sp) + 3005cb8: 4422 lw s0,8(sp) + 3005cba: 0141 addi sp,sp,16 + 3005cbc: 8082 ret + +03005cbe : + 3005cbe: e3cfd06f j 30032fa + +03005cc2 : + +static void IOConfig(void) +{ + 3005cc2: 1141 addi sp,sp,-16 + 3005cc4: c606 sw ra,12(sp) + 3005cc6: c422 sw s0,8(sp) + 3005cc8: 0800 addi s0,sp,16 + /* Config PIN4 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_ADC_AIN6); /* Check function selection */ + 3005cca: 010c07b7 lui a5,0x10c0 + 3005cce: 23c78513 addi a0,a5,572 # 10c023c + 3005cd2: 20c1 jal ra,3005d92 + HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_ADC_AIN6, PULL_NONE); /* Pull-up and Pull-down */ + 3005cd4: 4581 li a1,0 + 3005cd6: 010c07b7 lui a5,0x10c0 + 3005cda: 23c78513 addi a0,a5,572 # 10c023c + 3005cde: 2845 jal ra,3005d8e + HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_ADC_AIN6, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3005ce0: 4581 li a1,0 + 3005ce2: 010c07b7 lui a5,0x10c0 + 3005ce6: 23c78513 addi a0,a5,572 # 10c023c + 3005cea: 2045 jal ra,3005d8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_ADC_AIN6, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3005cec: 4585 li a1,1 + 3005cee: 010c07b7 lui a5,0x10c0 + 3005cf2: 23c78513 addi a0,a5,572 # 10c023c + 3005cf6: 2841 jal ra,3005d86 + HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_ADC_AIN6, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3005cf8: 4589 li a1,2 + 3005cfa: 010c07b7 lui a5,0x10c0 + 3005cfe: 23c78513 addi a0,a5,572 # 10c023c + 3005d02: 2041 jal ra,3005d82 + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + 3005d04: 019007b7 lui a5,0x1900 + 3005d08: 23378513 addi a0,a5,563 # 1900233 + 3005d0c: 2059 jal ra,3005d92 + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + 3005d0e: 4581 li a1,0 + 3005d10: 019007b7 lui a5,0x1900 + 3005d14: 23378513 addi a0,a5,563 # 1900233 + 3005d18: 289d jal ra,3005d8e + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3005d1a: 4581 li a1,0 + 3005d1c: 019007b7 lui a5,0x1900 + 3005d20: 23378513 addi a0,a5,563 # 1900233 + 3005d24: 209d jal ra,3005d8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3005d26: 4585 li a1,1 + 3005d28: 019007b7 lui a5,0x1900 + 3005d2c: 23378513 addi a0,a5,563 # 1900233 + 3005d30: 2899 jal ra,3005d86 + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3005d32: 4589 li a1,2 + 3005d34: 019007b7 lui a5,0x1900 + 3005d38: 23378513 addi a0,a5,563 # 1900233 + 3005d3c: 2099 jal ra,3005d82 + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + 3005d3e: 019407b7 lui a5,0x1940 + 3005d42: 23378513 addi a0,a5,563 # 1940233 + 3005d46: 20b1 jal ra,3005d92 + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + 3005d48: 4589 li a1,2 + 3005d4a: 019407b7 lui a5,0x1940 + 3005d4e: 23378513 addi a0,a5,563 # 1940233 + 3005d52: 2835 jal ra,3005d8e + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3005d54: 4581 li a1,0 + 3005d56: 019407b7 lui a5,0x1940 + 3005d5a: 23378513 addi a0,a5,563 # 1940233 + 3005d5e: 2035 jal ra,3005d8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3005d60: 4585 li a1,1 + 3005d62: 019407b7 lui a5,0x1940 + 3005d66: 23378513 addi a0,a5,563 # 1940233 + 3005d6a: 2831 jal ra,3005d86 + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3005d6c: 4589 li a1,2 + 3005d6e: 019407b7 lui a5,0x1940 + 3005d72: 23378513 addi a0,a5,563 # 1940233 + 3005d76: 2031 jal ra,3005d82 +} + 3005d78: 0001 nop + 3005d7a: 40b2 lw ra,12(sp) + 3005d7c: 4422 lw s0,8(sp) + 3005d7e: 0141 addi sp,sp,16 + 3005d80: 8082 ret + +03005d82 : + 3005d82: 978ff06f j 3004efa + +03005d86 : + 3005d86: 928ff06f j 3004eae + +03005d8a : + 3005d8a: 8d8ff06f j 3004e62 + +03005d8e : + 3005d8e: 888ff06f j 3004e16 + +03005d92 : + 3005d92: 84aff06f j 3004ddc + +03005d96 : + +void SystemInit(void) +{ + 3005d96: 1141 addi sp,sp,-16 + 3005d98: c606 sw ra,12(sp) + 3005d9a: c422 sw s0,8(sp) + 3005d9c: 0800 addi s0,sp,16 + IOConfig(); + 3005d9e: 3715 jal ra,3005cc2 + UART0_Init(); + 3005da0: 3d99 jal ra,3005bf6 + ADC0_Init(); + 3005da2: 397d jal ra,3005a60 + TIMER3_Init(); + 3005da4: 3b91 jal ra,3005af8 + + /* USER CODE BEGIN system_init */ + HAL_TIMER_Start(&g_timer3); + 3005da6: 040007b7 lui a5,0x4000 + 3005daa: 49c78513 addi a0,a5,1180 # 400049c + 3005dae: cceff0ef jal ra,300527c + HAL_ADC_StartIt(&g_adc0); + 3005db2: 040007b7 lui a5,0x4000 + 3005db6: 54478513 addi a0,a5,1348 # 4000544 + 3005dba: ec5fb0ef jal ra,3001c7e + HAL_ADC_SoftTrigSample(&g_adc0, ADC_SOC_NUM1); + 3005dbe: 4585 li a1,1 + 3005dc0: 040007b7 lui a5,0x4000 + 3005dc4: 54478513 addi a0,a5,1348 # 4000544 + 3005dc8: fe3fb0ef jal ra,3001daa + /* USER CODE END system_init */ + 3005dcc: 0001 nop + 3005dce: 40b2 lw ra,12(sp) + 3005dd0: 4422 lw s0,8(sp) + 3005dd2: 0141 addi sp,sp,16 + 3005dd4: 8082 ret + +03005dd6 : +float adc_num[adc_shownum]={0}; +unsigned int i=0; + + +void TIMER3_InterruptProcess(void *handle) +{ + 3005dd6: 7179 addi sp,sp,-48 + 3005dd8: d606 sw ra,44(sp) + 3005dda: d422 sw s0,40(sp) + 3005ddc: 1800 addi s0,sp,48 + 3005dde: fca42e23 sw a0,-36(s0) + unsigned int ret = HAL_ADC_GetConvResult(&g_adc0, ADC_SOC_NUM1); + 3005de2: 4585 li a1,1 + 3005de4: 040007b7 lui a5,0x4000 + 3005de8: 54478513 addi a0,a5,1348 # 4000544 + 3005dec: 840fc0ef jal ra,3001e2c + 3005df0: fea42623 sw a0,-20(s0) + + + adc_num[i] = (float)ret / (float)4096 * 3.3; + 3005df4: fec42783 lw a5,-20(s0) + 3005df8: d017f753 fcvt.s.wu fa4,a5 + 3005dfc: 030067b7 lui a5,0x3006 + 3005e00: 68c7a787 flw fa5,1676(a5) # 300668c + 3005e04: 18f77753 fdiv.s fa4,fa4,fa5 + 3005e08: 040027b7 lui a5,0x4002 + 3005e0c: 2047a783 lw a5,516(a5) # 4002204 + 3005e10: 03006737 lui a4,0x3006 + 3005e14: 69072787 flw fa5,1680(a4) # 3006690 + 3005e18: 10f777d3 fmul.s fa5,fa4,fa5 + 3005e1c: 04000737 lui a4,0x4000 + 3005e20: 5e470713 addi a4,a4,1508 # 40005e4 + 3005e24: 078a slli a5,a5,0x2 + 3005e26: 97ba add a5,a5,a4 + 3005e28: e39c fsw fa5,0(a5) + i++; + 3005e2a: 040027b7 lui a5,0x4002 + 3005e2e: 2047a783 lw a5,516(a5) # 4002204 + 3005e32: 00178713 addi a4,a5,1 + 3005e36: 040027b7 lui a5,0x4002 + 3005e3a: 20e7a223 sw a4,516(a5) # 4002204 + if(i>adc_shownum){ + 3005e3e: 040027b7 lui a5,0x4002 + 3005e42: 2047a703 lw a4,516(a5) # 4002204 + 3005e46: 70800793 li a5,1800 + 3005e4a: 06e7f563 bgeu a5,a4,3005eb4 + for(i=0;i + 3005e56: a099 j 3005e9c + { + DBG_PRINTF("Voltage:%f\r\n", adc_num[i]); + 3005e58: 040027b7 lui a5,0x4002 + 3005e5c: 2047a783 lw a5,516(a5) # 4002204 + 3005e60: 04000737 lui a4,0x4000 + 3005e64: 5e470713 addi a4,a4,1508 # 40005e4 + 3005e68: 078a slli a5,a5,0x2 + 3005e6a: 97ba add a5,a5,a4 + 3005e6c: 639c flw fa5,0(a5) + 3005e6e: 20f78553 fmv.s fa0,fa5 + 3005e72: 20b1 jal ra,3005ebe <__extendsfdf2> + 3005e74: 87aa mv a5,a0 + 3005e76: 882e mv a6,a1 + 3005e78: 863e mv a2,a5 + 3005e7a: 86c2 mv a3,a6 + 3005e7c: 030067b7 lui a5,0x3006 + 3005e80: 67c78513 addi a0,a5,1660 # 300667c + 3005e84: b85fe0ef jal ra,3004a08 + for(i=0;i + 3005e90: 00178713 addi a4,a5,1 + 3005e94: 040027b7 lui a5,0x4002 + 3005e98: 20e7a223 sw a4,516(a5) # 4002204 + 3005e9c: 040027b7 lui a5,0x4002 + 3005ea0: 2047a703 lw a4,516(a5) # 4002204 + 3005ea4: 70700793 li a5,1799 + 3005ea8: fae7f8e3 bgeu a5,a4,3005e58 + } + i=0; + 3005eac: 040027b7 lui a5,0x4002 + 3005eb0: 2007a223 sw zero,516(a5) # 4002204 + } + +} + 3005eb4: 0001 nop + 3005eb6: 50b2 lw ra,44(sp) + 3005eb8: 5422 lw s0,40(sp) + 3005eba: 6145 addi sp,sp,48 + 3005ebc: 8082 ret + +03005ebe <__extendsfdf2>: + 3005ebe: 1141 addi sp,sp,-16 + 3005ec0: c606 sw ra,12(sp) + 3005ec2: c422 sw s0,8(sp) + 3005ec4: c226 sw s1,4(sp) + 3005ec6: e00506d3 fmv.x.w a3,fa0 + 3005eca: 002027f3 frrm a5 + 3005ece: 0176d513 srli a0,a3,0x17 + 3005ed2: 0ff57513 andi a0,a0,255 + 3005ed6: 00800437 lui s0,0x800 + 3005eda: 00150793 addi a5,a0,1 # 14000001 + 3005ede: 147d addi s0,s0,-1 # 7fffff + 3005ee0: 0ff7f793 andi a5,a5,255 + 3005ee4: 4705 li a4,1 + 3005ee6: 8c75 and s0,s0,a3 + 3005ee8: 01f6d493 srli s1,a3,0x1f + 3005eec: 00f75963 bge a4,a5,3005efe <__extendsfdf2+0x40> + 3005ef0: 00345793 srli a5,s0,0x3 + 3005ef4: 38050513 addi a0,a0,896 + 3005ef8: 0476 slli s0,s0,0x1d + 3005efa: 4701 li a4,0 + 3005efc: a891 j 3005f50 <__extendsfdf2+0x92> + 3005efe: e915 bnez a0,3005f32 <__extendsfdf2+0x74> + 3005f00: c459 beqz s0,3005f8e <__extendsfdf2+0xd0> + 3005f02: 8522 mv a0,s0 + 3005f04: 2c6d jal ra,30061be <__clzsi2> + 3005f06: 47a9 li a5,10 + 3005f08: 00a7cf63 blt a5,a0,3005f26 <__extendsfdf2+0x68> + 3005f0c: 47ad li a5,11 + 3005f0e: 8f89 sub a5,a5,a0 + 3005f10: 01550713 addi a4,a0,21 + 3005f14: 00f457b3 srl a5,s0,a5 + 3005f18: 00e41433 sll s0,s0,a4 + 3005f1c: 38900713 li a4,905 + 3005f20: 40a70533 sub a0,a4,a0 + 3005f24: bfd9 j 3005efa <__extendsfdf2+0x3c> + 3005f26: ff550793 addi a5,a0,-11 + 3005f2a: 00f417b3 sll a5,s0,a5 + 3005f2e: 4401 li s0,0 + 3005f30: b7f5 j 3005f1c <__extendsfdf2+0x5e> + 3005f32: c02d beqz s0,3005f94 <__extendsfdf2+0xd6> + 3005f34: 00400737 lui a4,0x400 + 3005f38: 8f61 and a4,a4,s0 + 3005f3a: 00345793 srli a5,s0,0x3 + 3005f3e: 00173713 seqz a4,a4 + 3005f42: 000806b7 lui a3,0x80 + 3005f46: 0712 slli a4,a4,0x4 + 3005f48: 0476 slli s0,s0,0x1d + 3005f4a: 8fd5 or a5,a5,a3 + 3005f4c: 7ff00513 li a0,2047 + 3005f50: 00100637 lui a2,0x100 + 3005f54: 167d addi a2,a2,-1 # fffff + 3005f56: 8ff1 and a5,a5,a2 + 3005f58: 80100637 lui a2,0x80100 + 3005f5c: 167d addi a2,a2,-1 # 800fffff + 3005f5e: 7ff57513 andi a0,a0,2047 + 3005f62: 0552 slli a0,a0,0x14 + 3005f64: 8ff1 and a5,a5,a2 + 3005f66: 80000637 lui a2,0x80000 + 3005f6a: 8fc9 or a5,a5,a0 + 3005f6c: fff64613 not a2,a2 + 3005f70: 01f49693 slli a3,s1,0x1f + 3005f74: 8ff1 and a5,a5,a2 + 3005f76: 00d7e633 or a2,a5,a3 + 3005f7a: 8522 mv a0,s0 + 3005f7c: 85b2 mv a1,a2 + 3005f7e: c319 beqz a4,3005f84 <__extendsfdf2+0xc6> + 3005f80: 00172073 csrs fflags,a4 + 3005f84: 40b2 lw ra,12(sp) + 3005f86: 4422 lw s0,8(sp) + 3005f88: 4492 lw s1,4(sp) + 3005f8a: 0141 addi sp,sp,16 + 3005f8c: 8082 ret + 3005f8e: 4781 li a5,0 + 3005f90: 4501 li a0,0 + 3005f92: b7a5 j 3005efa <__extendsfdf2+0x3c> + 3005f94: 4781 li a5,0 + 3005f96: 7ff00513 li a0,2047 + 3005f9a: b785 j 3005efa <__extendsfdf2+0x3c> + +03005f9c <__truncdfsf2>: + 3005f9c: 00202873 frrm a6 + 3005fa0: 001006b7 lui a3,0x100 + 3005fa4: 16fd addi a3,a3,-1 # fffff + 3005fa6: 8eed and a3,a3,a1 + 3005fa8: 0145d893 srli a7,a1,0x14 + 3005fac: 00369793 slli a5,a3,0x3 + 3005fb0: 7ff8f893 andi a7,a7,2047 + 3005fb4: 01d55693 srli a3,a0,0x1d + 3005fb8: 8edd or a3,a3,a5 + 3005fba: 00188793 addi a5,a7,1 + 3005fbe: 7ff7f793 andi a5,a5,2047 + 3005fc2: 4705 li a4,1 + 3005fc4: 81fd srli a1,a1,0x1f + 3005fc6: 00351613 slli a2,a0,0x3 + 3005fca: 16f75b63 bge a4,a5,3006140 <__truncdfsf2+0x1a4> + 3005fce: c8088713 addi a4,a7,-896 + 3005fd2: 0fe00793 li a5,254 + 3005fd6: 0ae7d063 bge a5,a4,3006076 <__truncdfsf2+0xda> + 3005fda: 04080063 beqz a6,300601a <__truncdfsf2+0x7e> + 3005fde: 478d li a5,3 + 3005fe0: 02f81963 bne a6,a5,3006012 <__truncdfsf2+0x76> + 3005fe4: c99d beqz a1,300601a <__truncdfsf2+0x7e> + 3005fe6: 57fd li a5,-1 + 3005fe8: 0fe00713 li a4,254 + 3005fec: 4681 li a3,0 + 3005fee: 4615 li a2,5 + 3005ff0: 4509 li a0,2 + 3005ff2: 00166613 ori a2,a2,1 + 3005ff6: 1aa80063 beq a6,a0,3006196 <__truncdfsf2+0x1fa> + 3005ffa: 450d li a0,3 + 3005ffc: 18a80a63 beq a6,a0,3006190 <__truncdfsf2+0x1f4> + 3006000: 12081763 bnez a6,300612e <__truncdfsf2+0x192> + 3006004: 00f7f513 andi a0,a5,15 + 3006008: 4891 li a7,4 + 300600a: 13150263 beq a0,a7,300612e <__truncdfsf2+0x192> + 300600e: 0791 addi a5,a5,4 + 3006010: aa39 j 300612e <__truncdfsf2+0x192> + 3006012: 4789 li a5,2 + 3006014: fcf819e3 bne a6,a5,3005fe6 <__truncdfsf2+0x4a> + 3006018: d5f9 beqz a1,3005fe6 <__truncdfsf2+0x4a> + 300601a: 4781 li a5,0 + 300601c: 0ff00713 li a4,255 + 3006020: 4615 li a2,5 + 3006022: 00579693 slli a3,a5,0x5 + 3006026: 0006db63 bgez a3,300603c <__truncdfsf2+0xa0> + 300602a: 0705 addi a4,a4,1 # 400001 + 300602c: 0ff00693 li a3,255 + 3006030: 16d70563 beq a4,a3,300619a <__truncdfsf2+0x1fe> + 3006034: fc0006b7 lui a3,0xfc000 + 3006038: 16fd addi a3,a3,-1 # fbffffff + 300603a: 8ff5 and a5,a5,a3 + 300603c: 0ff00693 li a3,255 + 3006040: 838d srli a5,a5,0x3 + 3006042: 00d71663 bne a4,a3,300604e <__truncdfsf2+0xb2> + 3006046: c781 beqz a5,300604e <__truncdfsf2+0xb2> + 3006048: 004007b7 lui a5,0x400 + 300604c: 4581 li a1,0 + 300604e: 008006b7 lui a3,0x800 + 3006052: 16fd addi a3,a3,-1 # 7fffff + 3006054: 8ff5 and a5,a5,a3 + 3006056: 808006b7 lui a3,0x80800 + 300605a: 0ff77713 andi a4,a4,255 + 300605e: 16fd addi a3,a3,-1 # 807fffff + 3006060: 075e slli a4,a4,0x17 + 3006062: 8ff5 and a5,a5,a3 + 3006064: 05fe slli a1,a1,0x1f + 3006066: 8fd9 or a5,a5,a4 + 3006068: 8fcd or a5,a5,a1 + 300606a: c219 beqz a2,3006070 <__truncdfsf2+0xd4> + 300606c: 00162073 csrs fflags,a2 + 3006070: f0078553 fmv.w.x fa0,a5 + 3006074: 8082 ret + 3006076: 08e04e63 bgtz a4,3006112 <__truncdfsf2+0x176> + 300607a: 57a5 li a5,-23 + 300607c: 0ef74d63 blt a4,a5,3006176 <__truncdfsf2+0x1da> + 3006080: 008007b7 lui a5,0x800 + 3006084: 4379 li t1,30 + 3006086: 8edd or a3,a3,a5 + 3006088: 40e30333 sub t1,t1,a4 + 300608c: 47fd li a5,31 + 300608e: 0467ce63 blt a5,t1,30060ea <__truncdfsf2+0x14e> + 3006092: c8288893 addi a7,a7,-894 + 3006096: 011617b3 sll a5,a2,a7 + 300609a: 00f037b3 snez a5,a5 + 300609e: 011696b3 sll a3,a3,a7 + 30060a2: 00665333 srl t1,a2,t1 + 30060a6: 8edd or a3,a3,a5 + 30060a8: 00d367b3 or a5,t1,a3 + 30060ac: 4701 li a4,0 + 30060ae: cff9 beqz a5,300618c <__truncdfsf2+0x1f0> + 30060b0: 00179713 slli a4,a5,0x1 + 30060b4: 00777693 andi a3,a4,7 + 30060b8: 4601 li a2,0 + 30060ba: c28d beqz a3,30060dc <__truncdfsf2+0x140> + 30060bc: 4689 li a3,2 + 30060be: 0cd80263 beq a6,a3,3006182 <__truncdfsf2+0x1e6> + 30060c2: 468d li a3,3 + 30060c4: 0ad80b63 beq a6,a3,300617a <__truncdfsf2+0x1de> + 30060c8: 4605 li a2,1 + 30060ca: 00081963 bnez a6,30060dc <__truncdfsf2+0x140> + 30060ce: 00f77693 andi a3,a4,15 + 30060d2: 4511 li a0,4 + 30060d4: 4605 li a2,1 + 30060d6: 00a68363 beq a3,a0,30060dc <__truncdfsf2+0x140> + 30060da: 0711 addi a4,a4,4 + 30060dc: 01b75693 srli a3,a4,0x1b + 30060e0: 0016c693 xori a3,a3,1 + 30060e4: 8a85 andi a3,a3,1 + 30060e6: 4701 li a4,0 + 30060e8: a83d j 3006126 <__truncdfsf2+0x18a> + 30060ea: 57f9 li a5,-2 + 30060ec: 40e78733 sub a4,a5,a4 + 30060f0: 02000793 li a5,32 + 30060f4: 00e6d733 srl a4,a3,a4 + 30060f8: 4501 li a0,0 + 30060fa: 00f30663 beq t1,a5,3006106 <__truncdfsf2+0x16a> + 30060fe: ca288893 addi a7,a7,-862 + 3006102: 01169533 sll a0,a3,a7 + 3006106: 00c567b3 or a5,a0,a2 + 300610a: 00f037b3 snez a5,a5 + 300610e: 8fd9 or a5,a5,a4 + 3006110: bf71 j 30060ac <__truncdfsf2+0x110> + 3006112: 051a slli a0,a0,0x6 + 3006114: 00a037b3 snez a5,a0 + 3006118: 068e slli a3,a3,0x3 + 300611a: 8275 srli a2,a2,0x1d + 300611c: 8edd or a3,a3,a5 + 300611e: 00c6e7b3 or a5,a3,a2 + 3006122: 4681 li a3,0 + 3006124: 4601 li a2,0 + 3006126: 0077f513 andi a0,a5,7 + 300612a: ec0513e3 bnez a0,3005ff0 <__truncdfsf2+0x54> + 300612e: ee068ae3 beqz a3,3006022 <__truncdfsf2+0x86> + 3006132: 00167693 andi a3,a2,1 + 3006136: ee0686e3 beqz a3,3006022 <__truncdfsf2+0x86> + 300613a: 00266613 ori a2,a2,2 + 300613e: b5d5 j 3006022 <__truncdfsf2+0x86> + 3006140: 00c6e7b3 or a5,a3,a2 + 3006144: 00089563 bnez a7,300614e <__truncdfsf2+0x1b2> + 3006148: 00f037b3 snez a5,a5 + 300614c: b785 j 30060ac <__truncdfsf2+0x110> + 300614e: cf8d beqz a5,3006188 <__truncdfsf2+0x1ec> + 3006150: 7ff00793 li a5,2047 + 3006154: 4601 li a2,0 + 3006156: 00f89863 bne a7,a5,3006166 <__truncdfsf2+0x1ca> + 300615a: 00400637 lui a2,0x400 + 300615e: 8e75 and a2,a2,a3 + 3006160: 00163613 seqz a2,a2 + 3006164: 0612 slli a2,a2,0x4 + 3006166: 068e slli a3,a3,0x3 + 3006168: 020007b7 lui a5,0x2000 + 300616c: 8fd5 or a5,a5,a3 + 300616e: 0ff00713 li a4,255 + 3006172: 4681 li a3,0 + 3006174: bf4d j 3006126 <__truncdfsf2+0x18a> + 3006176: 4785 li a5,1 + 3006178: bf25 j 30060b0 <__truncdfsf2+0x114> + 300617a: 4605 li a2,1 + 300617c: f1a5 bnez a1,30060dc <__truncdfsf2+0x140> + 300617e: 0721 addi a4,a4,8 + 3006180: bfb1 j 30060dc <__truncdfsf2+0x140> + 3006182: 4605 li a2,1 + 3006184: dda1 beqz a1,30060dc <__truncdfsf2+0x140> + 3006186: bfe5 j 300617e <__truncdfsf2+0x1e2> + 3006188: 0ff00713 li a4,255 + 300618c: 4601 li a2,0 + 300618e: bd51 j 3006022 <__truncdfsf2+0x86> + 3006190: fdd9 bnez a1,300612e <__truncdfsf2+0x192> + 3006192: 07a1 addi a5,a5,8 # 2000008 + 3006194: bf69 j 300612e <__truncdfsf2+0x192> + 3006196: ddc1 beqz a1,300612e <__truncdfsf2+0x192> + 3006198: bfed j 3006192 <__truncdfsf2+0x1f6> + 300619a: 4781 li a5,0 + 300619c: 00080e63 beqz a6,30061b8 <__truncdfsf2+0x21c> + 30061a0: 468d li a3,3 + 30061a2: 00d81763 bne a6,a3,30061b0 <__truncdfsf2+0x214> + 30061a6: c989 beqz a1,30061b8 <__truncdfsf2+0x21c> + 30061a8: 57fd li a5,-1 + 30061aa: 0fe00713 li a4,254 + 30061ae: a029 j 30061b8 <__truncdfsf2+0x21c> + 30061b0: 4689 li a3,2 + 30061b2: fed81be3 bne a6,a3,30061a8 <__truncdfsf2+0x20c> + 30061b6: d9ed beqz a1,30061a8 <__truncdfsf2+0x20c> + 30061b8: 00566613 ori a2,a2,5 + 30061bc: b541 j 300603c <__truncdfsf2+0xa0> + +030061be <__clzsi2>: + 30061be: 67c1 lui a5,0x10 + 30061c0: 02f57663 bgeu a0,a5,30061ec <__clzsi2+0x2e> + 30061c4: 0ff00793 li a5,255 + 30061c8: 00a7b7b3 sltu a5,a5,a0 + 30061cc: 078e slli a5,a5,0x3 + 30061ce: 02000713 li a4,32 + 30061d2: 8f1d sub a4,a4,a5 + 30061d4: 00f557b3 srl a5,a0,a5 + 30061d8: 00000517 auipc a0,0x0 + 30061dc: 5c052503 lw a0,1472(a0) # 3006798 <_GLOBAL_OFFSET_TABLE_+0x4> + 30061e0: 97aa add a5,a5,a0 + 30061e2: 0007c503 lbu a0,0(a5) # 10000 + 30061e6: 40a70533 sub a0,a4,a0 + 30061ea: 8082 ret + 30061ec: 01000737 lui a4,0x1000 + 30061f0: 47c1 li a5,16 + 30061f2: fce56ee3 bltu a0,a4,30061ce <__clzsi2+0x10> + 30061f6: 47e1 li a5,24 + 30061f8: bfd9 j 30061ce <__clzsi2+0x10> + ... + +030061fc <__rodata_start>: + 30061fc: 9680 pop {ra,s0-s6},384 + 30061fe: 4b18 lw a4,16(a4) + +03006200 : + 3006200: 0000 1400 0000 0000 0140 0000 1000 1400 ........@....... + 3006210: 0000 0000 0144 0000 2000 1400 0000 0000 ....D.... ...... + 3006220: 0148 0000 3000 1400 0000 0000 014c 0000 H....0......L... + 3006230: 0000 1430 0000 0000 0240 0000 1000 1430 ..0.....@.....0. + 3006240: 0000 0000 0244 0000 2000 1430 0000 0000 ....D.... 0..... + 3006250: 0248 0000 3000 1430 0000 0000 024c 0000 H....00.....L... + 3006260: 0000 1438 0000 0000 0040 0000 0000 1420 ..8.....@..... . + 3006270: 0000 0000 0180 0000 1000 1420 0000 0000 .......... ..... + 3006280: 0184 0000 0000 1410 0000 0000 01c0 0000 ................ + 3006290: 1000 1410 0000 0000 01c4 0000 0000 1460 ..............`. + 30062a0: 0001 0000 02c0 0000 0000 1470 0000 0000 ..........p..... + 30062b0: 0440 0000 1000 1470 0000 0000 0444 0000 @.....p.....D... + 30062c0: 2000 1470 0000 0000 0448 0000 3000 1470 . p.....H....0p. + 30062d0: 0000 0000 044c 0000 0000 1440 0000 0000 ....L.....@..... + 30062e0: 0200 0000 0000 14b0 0000 0000 0280 0000 ................ + 30062f0: 1000 14b0 0000 0000 0284 0000 2000 14b0 ............. .. + 3006300: 0000 0000 0288 0000 0000 1c00 0000 0000 ................ + 3006310: 0300 0000 0000 1450 0000 0000 0480 0000 ......P......... + 3006320: 1000 1450 0000 0000 0484 0000 2000 1450 ..P.......... P. + 3006330: 0000 0000 0488 0000 3000 1450 0000 0000 .........0P..... + 3006340: 048c 0000 4000 1450 0000 0000 0490 0000 .....@P......... + 3006350: 5000 1450 0000 0000 0494 0000 1000 1440 .PP...........@. + 3006360: 0004 0000 03c0 0000 0000 14c0 0000 0000 ................ + 3006370: 04c0 0000 1000 14c0 0000 0000 04c4 0000 ................ + 3006380: 0000 147d 0000 0000 0b00 0000 0000 1480 ..}............. + 3006390: 0000 0000 0380 0000 0000 14a0 0000 0000 ................ + 30063a0: 0400 0000 1000 14a0 0000 0000 0404 0000 ................ + 30063b0: 2000 14a0 0000 0000 0408 0000 3000 14a0 . ...........0.. + 30063c0: 0000 0000 040c 0000 0000 1001 0000 0000 ................ + 30063d0: 0340 0000 0000 1810 0005 0000 0a60 0000 @...........`... + 30063e0: 0000 1830 0005 0000 0a70 0000 0000 1840 ..0.....p.....@. + 30063f0: 0005 0000 0a80 0000 0000 1820 0005 0000 .......... ..... + 3006400: 0a90 0000 1000 1820 0005 0000 0a90 0004 ...... ......... + 3006410: 0000 1800 0002 0000 0a00 0000 0000 1471 ..............q. + 3006420: 0003 0000 0500 0000 2e2e 642f 6972 6576 ........../drive + 3006430: 7372 612f 6364 692f 636e 612f 6364 695f rs/adc/inc/adc_i + 3006440: 2e70 0068 2e2e 642f 6972 6576 7372 612f p.h.../drivers/a + 3006450: 6364 732f 6372 612f 6364 632e 0000 0000 dc/src/adc.c.... + 3006460: 0000 3f80 0000 4480 5547 4055 0000 4580 ...?...DGUU@...E + 3006470: 6666 4026 51ec 4068 2e2e 642f 6972 6576 ff&@.Qh@../drive + 3006480: 7372 622f 7361 2f65 7273 2f63 6e69 6574 rs/base/src/inte + 3006490: 7272 7075 2e74 0063 2308 0300 235a 0300 rrupt.c..#..Z#.. + 30064a0: 23ac 0300 23fe 0300 2450 0300 24a2 0300 .#...#..P$...$.. + 30064b0: 24f4 0300 2546 0300 25dc 0300 262e 0300 .$..F%...%...&.. + 30064c0: 2680 0300 26d2 0300 2724 0300 2776 0300 .&...&..$'..v'.. + 30064d0: 27c8 0300 281a 0300 2e2e 642f 6972 6576 .'...(..../drive + 30064e0: 7372 632f 6772 692f 636e 632f 6772 695f rs/crg/inc/crg_i + 30064f0: 2e70 0068 2e2e 642f 6972 6576 7372 632f p.h.../drivers/c + 3006500: 6772 732f 6372 632f 6772 632e 0000 0000 rg/src/crg.c.... + 3006510: 0000 0000 0001 0000 0002 0000 0003 0000 ................ + 3006520: 0004 0000 0005 0000 0006 0000 0007 0000 ................ + 3006530: 329c 0300 32a6 0300 32be 0300 329c 0300 .2...2...2...2.. + 3006540: 32da 0300 329c 0300 47f8 0300 4862 0300 .2...2...G..bH.. + 3006550: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 3006560: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 3006570: 4862 0300 4738 0300 478e 0300 4862 0300 bH..8G...G..bH.. + 3006580: 4822 0300 4862 0300 4862 0300 4862 0300 "H..bH..bH..bH.. + 3006590: 4862 0300 4862 0300 4862 0300 4862 0300 bH..bH..bH..bH.. + 30065a0: 4862 0300 4862 0300 47f8 0300 4862 0300 bH..bH...G..bH.. + 30065b0: 4862 0300 4762 0300 4862 0300 47b8 0300 bH..bG..bH...G.. + 30065c0: 4862 0300 4862 0300 47f8 0300 2e2e 642f bH..bH...G..../d + 30065d0: 6972 6576 7372 692f 636f 676d 692f 636e rivers/iocmg/inc + 30065e0: 692f 636f 676d 695f 2e70 0068 2e2e 642f /iocmg_ip.h.../d + 30065f0: 6972 6576 7372 692f 636f 676d 732f 6372 rivers/iocmg/src + 3006600: 692f 636f 676d 632e 0000 0000 2e2e 642f /iocmg.c....../d + 3006610: 6972 6576 7372 742f 6d69 7265 692f 636e rivers/timer/inc + 3006620: 742f 6d69 7265 695f 2e70 0068 2e2e 642f /timer_ip.h.../d + 3006630: 6972 6576 7372 742f 6d69 7265 732f 6372 rivers/timer/src + 3006640: 742f 6d69 7265 632e 0000 0000 55be 0300 /timer.c.....U.. + 3006650: 55d4 0300 55ea 0300 5600 0300 5616 0300 .U...U...V...V.. + 3006660: 2e2e 642f 6972 6576 7372 752f 7261 2f74 ../drivers/uart/ + 3006670: 7273 2f63 6175 7472 632e 0000 6f56 746c src/uart.c..Volt + 3006680: 6761 3a65 6625 0a0d 0000 0000 0000 4580 age:%f.........E + 3006690: 3333 4053 33S@ + +03006694 <__clz_tab>: + 3006694: 0100 0202 0303 0303 0404 0404 0404 0404 ................ + 30066a4: 0505 0505 0505 0505 0505 0505 0505 0505 ................ + 30066b4: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 30066c4: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + 30066d4: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 30066e4: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 30066f4: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006704: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + 3006714: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006724: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006734: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006744: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006754: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006764: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006774: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + 3006784: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + +03006794 <_GLOBAL_OFFSET_TABLE_>: + 3006794: 0000 0000 6694 0300 ffff ffff 0000 0000 .....f.......... diff --git a/vendor/others/demo/5-tim_adc/demo/out/bin/target.map b/vendor/others/demo/5-tim_adc/demo/out/bin/target.map new file mode 100644 index 000000000..dad8e77f3 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/out/bin/target.map @@ -0,0 +1,7335 @@ +Archive member included to satisfy reference by file (symbol) + +..\middleware\thirdparty\sysroot\lib\libmcs_smo_4th.a(mcs_smo_4th.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_dispatch.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_port.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_config.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_del.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_init.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_minor.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_base_task.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_idle.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sched_single.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys_init.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_del.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_global.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_init.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_minor.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_priority.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_privdata.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_taskself_id.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_tick.o) + (--whole-archive) +..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + (--whole-archive) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_udivdi3.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o (__udivdi3) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_umoddi3.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o (__umoddi3) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsfdf2.o) + obj/user/generatecode/tim_adc.o (__extendsfdf2) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + obj/drivers/debug/log/src/console.o (__truncdfsf2) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_udivdi3.o) (__clz_tab) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsfdf2.o) (__clzsi2) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__ctype_get_mb_cur_max.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o (__ctype_get_mb_cur_max) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o (iswspace) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o (isxdigit) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o (free) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o (malloc) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) (__libc_free) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) (__malloc_lock) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) (__madvise) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) (__mmap) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mprotect.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) (mprotect) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) (munmap) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o (mbtowc) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o (wcstombs) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o (wctomb) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o (feof) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o (fgetc) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o (fgets) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o (fgetwc) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o (fread) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o (fseek) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o (ftell) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) (fwide) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o (stdin) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetc.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o (ungetc) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetwc.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o (ungetwc) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o (vsprintf) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o (strtod) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + obj/drivers/debug/log/src/dfx_log_proc.o (strtoul) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memchr.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) (memchr) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memcpy.o) + ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_port.o) (memcpy) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memmove.o) + obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o (memmove) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memset.o) + obj/drivers/adc/src/adc.o (memset) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) + obj/drivers/debug/log/src/ext_command.o (strchr) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchrnul.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) (__strchrnul) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcmp.o) + obj/drivers/debug/log/src/dfx_log_proc.o (strcmp) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strlen.o) + obj/drivers/debug/log/src/app_command.o (strlen) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strncmp.o) + obj/drivers/debug/log/src/app_command.o (strncmp) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) (wcschr) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcslen.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) (wcslen) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) (__lock) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) (__stack_chk_guard) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__errno_location.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) (___errno_location) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) (__floatscan) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) (__intscan) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) (__libc) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) (__shlim) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(syscall_ret.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) (__syscall_ret) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) (__c_dot_utf8_locale) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(copysignl.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (copysignl) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fabsl.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (fabsl) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (fmodl) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (scalbn) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbnl.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (scalbnl) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(internal.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) (__fsmu8) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) (mbrtowc) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcrtomb.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) (wcrtomb) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcsrtombs.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) (wcsrtombs) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) (__lockfile) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) (__stdio_close) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_read.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) (__stdio_read) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) (__stdio_seek) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) (__toread) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__uflow.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) (__uflow) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) (vsnprintf) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lseek.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) (__lseek) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__fpclassifyl.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) (__fpclassifyl) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) (__stdio_exit_needed) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) (__ofl_lock) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) (vfprintf) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strnlen.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) (strnlen) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) (strerror) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) (__lctrans) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__signbitl.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) (__signbitl) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(frexpl.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) (frexpl) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) (__towrite) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) (__fwritex) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_lshrdi3.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) (__lshrdi3) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_ashldi3.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) (__ashldi3) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_divdi3.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__divdi3) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_moddi3.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__moddi3) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__muldf3) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsidf.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__floatsidf) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(addtf3.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__addtf3) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(divtf3.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__divtf3) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(eqtf2.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__eqtf2) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(getf2.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__getf2) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(letf2.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) (__letf2) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(multf3.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__multf3) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(subtf3.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__subtf3) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixtfsi.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) (__fixtfsi) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixunstfsi.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) (__fixunstfsi) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsitf.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__floatsitf) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatunsitf.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__floatunsitf) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsftf2.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__extendsftf2) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extenddftf2.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__extenddftf2) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfsf2.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) (__trunctfsf2) +d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfdf2.o) + d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) (__trunctfdf2) + +Allocating common symbols +Common symbol size file + +__stack_chk_guard 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) +__hwcap 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) +__libc 0x38 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) +__malloc_lock 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + +Discarded input sections + + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libmcs_smo_4th.a(mcs_smo_4th.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libmcs_smo_4th.a(mcs_smo_4th.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libmcs_smo_4th.a(mcs_smo_4th.o) + .text.SMO4TH_ParamUpdate + 0x0000000000000000 0x4a ..\middleware\thirdparty\sysroot\lib\libmcs_smo_4th.a(mcs_smo_4th.o) + .text.SMO4TH_Clear + 0x0000000000000000 0x2e ..\middleware\thirdparty\sysroot\lib\libmcs_smo_4th.a(mcs_smo_4th.o) + .text.SMO4TH_Init + 0x0000000000000000 0x4c ..\middleware\thirdparty\sysroot\lib\libmcs_smo_4th.a(mcs_smo_4th.o) + .text.SMO4TH_Exec + 0x0000000000000000 0x16a ..\middleware\thirdparty\sysroot\lib\libmcs_smo_4th.a(mcs_smo_4th.o) + .text.SMO4TH_SetTs + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libmcs_smo_4th.a(mcs_smo_4th.o) + .rodata.SMO4TH_Exec.cst4 + 0x0000000000000000 0xc ..\middleware\thirdparty\sysroot\lib\libmcs_smo_4th.a(mcs_smo_4th.o) + .rodata.SMO4TH_ParamUpdate.cst4 + 0x0000000000000000 0x8 ..\middleware\thirdparty\sysroot\lib\libmcs_smo_4th.a(mcs_smo_4th.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libmcs_smo_4th.a(mcs_smo_4th.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libmcs_smo_4th.a(mcs_smo_4th.o) + .text 0x0000000000000000 0x1f8 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_dispatch.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_dispatch.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_dispatch.o) + .riscv.attributes + 0x0000000000000000 0x36 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_dispatch.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_port.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_port.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_port.o) + .text.OsTskContextGet + 0x0000000000000000 0x2c ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_port.o) + .text.OsTskContextInit + 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_port.o) + .text.OsGetLMB1 + 0x0000000000000000 0x3e ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_port.o) + .data.g_lmb1Idx + 0x0000000000000000 0x20 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_port.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_port.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_port.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_config.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_config.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_config.o) + .text.OsStart 0x0000000000000000 0x8 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_config.o) + .text.NOS_MoudleInit + 0x0000000000000000 0x1e ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_config.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_config.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_config.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task.o) + .text.OsTskSchedule + 0x0000000000000000 0x60 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task.o) + .text.OsTaskScan + 0x0000000000000000 0x13a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task.o) + .bss.g_runQueue + 0x0000000000000000 0x34 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task.o) + .bss.g_tskSortedDelay + 0x0000000000000000 0x8 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_del.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_del.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_del.o) + .text.OsTaskDelete + 0x0000000000000000 0x14e ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_del.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_del.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_del.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_init.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_init.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_init.o) + .text.OsTskAMPInit + 0x0000000000000000 0xbc ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_init.o) + .text.OsIdleTskAMPCreate + 0x0000000000000000 0x44 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_init.o) + .bss.g_idleTaskStackSpace + 0x0000000000000000 0x150 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_init.o) + .rodata.OsIdleTskAMPCreate.str1.1 + 0x0000000000000000 0xc ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_init.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_init.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_init.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_minor.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_minor.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_minor.o) + .text.NOS_TaskSuspendInner + 0x0000000000000000 0x9c ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_minor.o) + .text.NOS_TaskResumeInner + 0x0000000000000000 0x7e ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_minor.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_minor.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_amp_task_minor.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_base_task.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_base_task.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_base_task.o) + .text.OsTskReadyAdd + 0x0000000000000000 0x3e ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_base_task.o) + .text.OsTskReadyDel + 0x0000000000000000 0x4a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_base_task.o) + .text.OsTskTimerAdd + 0x0000000000000000 0x66 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_base_task.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_base_task.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_base_task.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_idle.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_idle.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_idle.o) + .text.OsIdleThread + 0x0000000000000000 0x2 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_idle.o) + .text.OsIdleTaskExe + 0x0000000000000000 0x2 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_idle.o) + .text.OsIdleReg + 0x0000000000000000 0x10 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_idle.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_idle.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_idle.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sched_single.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sched_single.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sched_single.o) + .text.OsMainSchedule + 0x0000000000000000 0x6a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sched_single.o) + .text.OsFirstTimeSwitch + 0x0000000000000000 0x3e ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sched_single.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sched_single.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sched_single.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys.o) + .bss.g_idleEntry + 0x0000000000000000 0x4 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys.o) + .bss.g_runningTask + 0x0000000000000000 0x4 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys.o) + .bss.g_taskScanHook + 0x0000000000000000 0x4 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys.o) + .bss.g_threadNum + 0x0000000000000000 0x4 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys.o) + .bss.g_tickNoRespondCnt + 0x0000000000000000 0x4 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys.o) + .bss.g_uniFlag + 0x0000000000000000 0x4 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys.o) + .bss.g_uniTicks + 0x0000000000000000 0x8 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys_init.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys_init.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys_init.o) + .text.NOS_SetNosParam + 0x0000000000000000 0xa ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys_init.o) + .text.NOS_GetCurTick + 0x0000000000000000 0x12 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys_init.o) + .bss.g_sreGetTickFunc + 0x0000000000000000 0x4 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys_init.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys_init.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_sys_init.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_del.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_del.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_del.o) + .text.OsTaskDelStatusCheck + 0x0000000000000000 0x2e ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_del.o) + .text.NOS_TaskDeleteInner + 0x0000000000000000 0x8 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_del.o) + .text.OsTaskExit + 0x0000000000000000 0xa ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_del.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_del.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_del.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_global.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_global.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_global.o) + .text.OsTskSwitchHookCaller + 0x0000000000000000 0x2 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_global.o) + .text.OsTskMaxNumGet + 0x0000000000000000 0xa ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_global.o) + .bss.g_highestTask + 0x0000000000000000 0x4 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_global.o) + .bss.g_idleTaskID + 0x0000000000000000 0x4 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_global.o) + .bss.g_tskCBArray + 0x0000000000000000 0x268 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_global.o) + .bss.g_uniTaskLock + 0x0000000000000000 0x2 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_global.o) + .data.g_tskMaxNum + 0x0000000000000000 0x4 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_global.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_global.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_global.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_init.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_init.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_init.o) + .text.OsTskEntry + 0x0000000000000000 0x3a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_init.o) + .text.OsTskInit + 0x0000000000000000 0x1c ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_init.o) + .text.OsActivate + 0x0000000000000000 0x2e ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_init.o) + .text.OsTskRecycle + 0x0000000000000000 0x3a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_init.o) + .text.OsTaskCreateOnly + 0x0000000000000000 0x1a0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_init.o) + .text.NOS_TaskCreateOnlyInner + 0x0000000000000000 0xa ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_init.o) + .text.NOS_TaskCreateInner + 0x0000000000000000 0x1c ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_init.o) + .data.g_tskCBFreeList + 0x0000000000000000 0x8 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_init.o) + .data.g_tskRecyleList + 0x0000000000000000 0x8 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_init.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_init.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_init.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_minor.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_minor.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_minor.o) + .text.OsTaskYield + 0x0000000000000000 0xb4 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_minor.o) + .text.NOS_TaskDelayInner + 0x0000000000000000 0x92 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_minor.o) + .text.NOS_TaskYield + 0x0000000000000000 0x52 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_minor.o) + .text.NOS_TaskLock + 0x0000000000000000 0x36 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_minor.o) + .text.NOS_TaskUnlock + 0x0000000000000000 0x42 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_minor.o) + .text.NOS_TaskUpdateExpirCnt + 0x0000000000000000 0x4e ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_minor.o) + .text.NOS_TaskStartPeriod + 0x0000000000000000 0x5a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_minor.o) + .text.NOS_TaskStopPeriod + 0x0000000000000000 0x66 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_minor.o) + .text.__riscv_abstrpat_ax_to_sx + 0x0000000000000000 0xe ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_minor.o) + .text.__riscv_abstrpat_sx_to_ax + 0x0000000000000000 0xe ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_minor.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_minor.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_minor.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_priority.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_priority.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_priority.o) + .text.NOS_TaskPriorityGetInner + 0x0000000000000000 0x50 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_priority.o) + .text.NOS_TaskPrioritySetInner + 0x0000000000000000 0x98 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_priority.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_priority.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_priority.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_privdata.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_privdata.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_privdata.o) + .text.NOS_TaskPrivateDataGet + 0x0000000000000000 0xc ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_privdata.o) + .text.NOS_TaskPrivateDataSet + 0x0000000000000000 0xc ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_privdata.o) + .text.OsTaskPrivateDataGetById + 0x0000000000000000 0x34 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_privdata.o) + .text.NOS_TaskPrivateDataGetById + 0x0000000000000000 0x12 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_privdata.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_privdata.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task_privdata.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_taskself_id.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_taskself_id.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_taskself_id.o) + .text.NOS_TaskSelf + 0x0000000000000000 0x24 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_taskself_id.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_taskself_id.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_taskself_id.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_tick.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_tick.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_tick.o) + .text.OsHwiDispatchTick + 0x0000000000000000 0x76 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_tick.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_tick.o) + .riscv.attributes + 0x0000000000000000 0x32 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_tick.o) + .text 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .data 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .bss 0x0000000000000000 0x0 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .text.PeriodTaskEntry + 0x0000000000000000 0x30 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .text.NOS_TaskInit + 0x0000000000000000 0x38 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .text.NOS_GetCycle + 0x0000000000000000 0x1c ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .text.NOS_StartScheduler + 0x0000000000000000 0x8 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .text.NOS_TaskCreateOnly + 0x0000000000000000 0x5c ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .text.NOS_TaskCreate + 0x0000000000000000 0x5c ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .text.NOS_TaskDelete + 0x0000000000000000 0x8 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .text.NOS_TaskSuspend + 0x0000000000000000 0x8 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .text.NOS_TaskResume + 0x0000000000000000 0x8 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .text.NOS_TaskDelay + 0x0000000000000000 0x1a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .text.NOS_TaskPrioritySet + 0x0000000000000000 0x8 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .text.NOS_TaskPriorityGet + 0x0000000000000000 0x8 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .text.NOS_CreateTimerTask + 0x0000000000000000 0x7a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .text.NOS_StartTimerTask + 0x0000000000000000 0x1a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .text.NOS_StopTimerTask + 0x0000000000000000 0x8 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .data.g_nosSysConfig + 0x0000000000000000 0xc ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .comment 0x0000000000000000 0x2a ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .riscv.attributes + 0x0000000000000000 0x36 ..\middleware\thirdparty\sysroot\lib\libnostask.a(nos_task.o) + .text 0x0000000000000000 0x0 obj/chip/3061m/startup.o + .data 0x0000000000000000 0x0 obj/chip/3061m/startup.o + .bss 0x0000000000000000 0x0 obj/chip/3061m/startup.o + .text 0x0000000000000000 0x0 obj/chip/3061m/chipinit/chipinit.o + .data 0x0000000000000000 0x0 obj/chip/3061m/chipinit/chipinit.o + .bss 0x0000000000000000 0x0 obj/chip/3061m/chipinit/chipinit.o + .text.ADC_GetCTRLAddr + 0x0000000000000000 0x36 obj/chip/3061m/chipinit/chipinit.o + .text 0x0000000000000000 0x0 obj/chip/3061m/chipinit/anatrim/anatrim.o + .data 0x0000000000000000 0x0 obj/chip/3061m/chipinit/anatrim/anatrim.o + .bss 0x0000000000000000 0x0 obj/chip/3061m/chipinit/anatrim/anatrim.o + .text.ADC_GetCTRLAddr + 0x0000000000000000 0x36 obj/chip/3061m/chipinit/anatrim/anatrim.o + .text 0x0000000000000000 0x0 obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o + .data 0x0000000000000000 0x0 obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o + .bss 0x0000000000000000 0x0 obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o + .text 0x0000000000000000 0x0 obj/chip/3061m/chipinit/crginit/crginit.o + .data 0x0000000000000000 0x0 obj/chip/3061m/chipinit/crginit/crginit.o + .bss 0x0000000000000000 0x0 obj/chip/3061m/chipinit/crginit/crginit.o + .rodata 0x0000000000000000 0x29 obj/chip/3061m/chipinit/crginit/crginit.o + .text.CRG_Config + 0x0000000000000000 0x8a obj/chip/3061m/chipinit/crginit/crginit.o + .text 0x0000000000000000 0x0 obj/chip/3061m/chipinit/flashinit/flashinit.o + .data 0x0000000000000000 0x0 obj/chip/3061m/chipinit/flashinit/flashinit.o + .bss 0x0000000000000000 0x0 obj/chip/3061m/chipinit/flashinit/flashinit.o + .text 0x0000000000000000 0x0 obj/chip/3061m/chipinit/systickinit/systickinit.o + .data 0x0000000000000000 0x0 obj/chip/3061m/chipinit/systickinit/systickinit.o + .bss 0x0000000000000000 0x0 obj/chip/3061m/chipinit/systickinit/systickinit.o + .text 0x0000000000000000 0x0 obj/chip/3061m/fotp/fotp_info_read.o + .data 0x0000000000000000 0x0 obj/chip/3061m/fotp/fotp_info_read.o + .bss 0x0000000000000000 0x0 obj/chip/3061m/fotp/fotp_info_read.o + .text 0x0000000000000000 0x0 obj/chip/3061m/ip_crg/ip_crg_common.o + .data 0x0000000000000000 0x0 obj/chip/3061m/ip_crg/ip_crg_common.o + .bss 0x0000000000000000 0x0 obj/chip/3061m/ip_crg/ip_crg_common.o + .text 0x0000000000000000 0x0 obj/drivers/acmp/src/acmp.o + .data 0x0000000000000000 0x0 obj/drivers/acmp/src/acmp.o + .bss 0x0000000000000000 0x0 obj/drivers/acmp/src/acmp.o + .text.IsACMPOutputPolarity + 0x0000000000000000 0x2c obj/drivers/acmp/src/acmp.o + .text.IsACMPInputPNumber + 0x0000000000000000 0x1c obj/drivers/acmp/src/acmp.o + .text.IsACMPInputNNumber + 0x0000000000000000 0x1c obj/drivers/acmp/src/acmp.o + .text.IsACMPBlkingSrcType + 0x0000000000000000 0x1c obj/drivers/acmp/src/acmp.o + .text.IsACMPResultSeletion + 0x0000000000000000 0x1c obj/drivers/acmp/src/acmp.o + .rodata 0x0000000000000000 0x1b obj/drivers/acmp/src/acmp.o + .text.ACMP_InputOutputInit + 0x0000000000000000 0x144 obj/drivers/acmp/src/acmp.o + .text.ACMP_FilterInit + 0x0000000000000000 0x244 obj/drivers/acmp/src/acmp.o + .text.HAL_ACMP_Init + 0x0000000000000000 0x144 obj/drivers/acmp/src/acmp.o + .text.HAL_ACMP_DeInit + 0x0000000000000000 0x98 obj/drivers/acmp/src/acmp.o + .text.HAL_ACMP_SetHystVol + 0x0000000000000000 0x96 obj/drivers/acmp/src/acmp.o + .text.HAL_ACMP_BlkingValid + 0x0000000000000000 0x64 obj/drivers/acmp/src/acmp.o + .text.HAL_ACMP_BlkingInvalid + 0x0000000000000000 0x62 obj/drivers/acmp/src/acmp.o + .text.HAL_ACMP_ResultSelect + 0x0000000000000000 0xd8 obj/drivers/acmp/src/acmp.o + .text.HAL_ACMP_IrqHandler + 0x0000000000000000 0xfa obj/drivers/acmp/src/acmp.o + .text.HAL_ACMP_RegisterCallBack + 0x0000000000000000 0xbc obj/drivers/acmp/src/acmp.o + .debug_info 0x0000000000000000 0xcf0 obj/drivers/acmp/src/acmp.o + .debug_abbrev 0x0000000000000000 0x231 obj/drivers/acmp/src/acmp.o + .debug_aranges + 0x0000000000000000 0x90 obj/drivers/acmp/src/acmp.o + .debug_ranges 0x0000000000000000 0x80 obj/drivers/acmp/src/acmp.o + .debug_line 0x0000000000000000 0x6e8 obj/drivers/acmp/src/acmp.o + .debug_str 0x0000000000000000 0xe95 obj/drivers/acmp/src/acmp.o + .comment 0x0000000000000000 0x2a obj/drivers/acmp/src/acmp.o + .debug_frame 0x0000000000000000 0x224 obj/drivers/acmp/src/acmp.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/acmp/src/acmp.o + .text 0x0000000000000000 0x0 obj/drivers/acmp/src/acmp_ex.o + .data 0x0000000000000000 0x0 obj/drivers/acmp/src/acmp_ex.o + .bss 0x0000000000000000 0x0 obj/drivers/acmp/src/acmp_ex.o + .rodata 0x0000000000000000 0x1e obj/drivers/acmp/src/acmp_ex.o + .text.HAL_ACMP_SetTrimValueEx + 0x0000000000000000 0x9e obj/drivers/acmp/src/acmp_ex.o + .debug_info 0x0000000000000000 0x9d2 obj/drivers/acmp/src/acmp_ex.o + .debug_abbrev 0x0000000000000000 0x181 obj/drivers/acmp/src/acmp_ex.o + .debug_aranges + 0x0000000000000000 0x20 obj/drivers/acmp/src/acmp_ex.o + .debug_ranges 0x0000000000000000 0x10 obj/drivers/acmp/src/acmp_ex.o + .debug_line 0x0000000000000000 0x108 obj/drivers/acmp/src/acmp_ex.o + .debug_str 0x0000000000000000 0xbde obj/drivers/acmp/src/acmp_ex.o + .comment 0x0000000000000000 0x2a obj/drivers/acmp/src/acmp_ex.o + .debug_frame 0x0000000000000000 0x34 obj/drivers/acmp/src/acmp_ex.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/acmp/src/acmp_ex.o + .text 0x0000000000000000 0x0 obj/drivers/adc/src/adc.o + .data 0x0000000000000000 0x0 obj/drivers/adc/src/adc.o + .bss 0x0000000000000000 0x0 obj/drivers/adc/src/adc.o + .text.DCL_ADC_ClearIntx + 0x0000000000000000 0x7c obj/drivers/adc/src/adc.o + .text.DCL_ADC_SOCxMultiSoftTrigger + 0x0000000000000000 0x6a obj/drivers/adc/src/adc.o + .text.DCL_ADC_DMARequestSource + 0x0000000000000000 0x86 obj/drivers/adc/src/adc.o + .text.DCL_ADC_EnableDMABurstReq + 0x0000000000000000 0x4a obj/drivers/adc/src/adc.o + .text.DCL_ADC_EnableDMASingleReq + 0x0000000000000000 0x4a obj/drivers/adc/src/adc.o + .text.DCL_ADC_GetConvState + 0x0000000000000000 0x86 obj/drivers/adc/src/adc.o + .text.DCL_ADC_ResetConvState + 0x0000000000000000 0x82 obj/drivers/adc/src/adc.o + .text.IsDmaChannelNum + 0x0000000000000000 0x50 obj/drivers/adc/src/adc.o + .text.HAL_ADC_Deinit + 0x0000000000000000 0x62 obj/drivers/adc/src/adc.o + .text.ADC_DMATransFinish + 0x0000000000000000 0x50 obj/drivers/adc/src/adc.o + .text.ADC_DMATransError + 0x0000000000000000 0x50 obj/drivers/adc/src/adc.o + .text.HAL_ADC_StartDma + 0x0000000000000000 0x250 obj/drivers/adc/src/adc.o + .text.HAL_ADC_SoftTrigMultiSample + 0x0000000000000000 0x9a obj/drivers/adc/src/adc.o + .text.HAL_ADC_CheckSocFinish + 0x0000000000000000 0xba obj/drivers/adc/src/adc.o + .text.ADC_IntxClearEoc + 0x0000000000000000 0x118 obj/drivers/adc/src/adc.o + .text.HAL_ADC_IrqHandlerOver + 0x0000000000000000 0xde obj/drivers/adc/src/adc.o + .text.HAL_ADC_IrqHandlerInt0 + 0x0000000000000000 0x92 obj/drivers/adc/src/adc.o + .text.HAL_ADC_IrqHandlerInt1 + 0x0000000000000000 0x92 obj/drivers/adc/src/adc.o + .text.HAL_ADC_IrqHandlerInt2 + 0x0000000000000000 0x92 obj/drivers/adc/src/adc.o + .text.HAL_ADC_IrqHandlerInt3 + 0x0000000000000000 0x92 obj/drivers/adc/src/adc.o + .text.ADC_EventCallBack + 0x0000000000000000 0x80 obj/drivers/adc/src/adc.o + .text.HAL_ADC_IrqHandlerAllEvent + 0x0000000000000000 0x10a obj/drivers/adc/src/adc.o + .text.ADC_RegieterEventCallBack + 0x0000000000000000 0x4e obj/drivers/adc/src/adc.o + .text.HAL_ADC_RegisterCallBack + 0x0000000000000000 0xf8 obj/drivers/adc/src/adc.o + .rodata.HAL_ADC_RegisterCallBack + 0x0000000000000000 0x24 obj/drivers/adc/src/adc.o + .text.HAL_ADC_InitForVdda + 0x0000000000000000 0x172 obj/drivers/adc/src/adc.o + .text.HAL_ADC_GetVddaByDac + 0x0000000000000000 0x1dc obj/drivers/adc/src/adc.o + .text.HAL_ADC_GetTransResultByVdda + 0x0000000000000000 0xda obj/drivers/adc/src/adc.o + .text 0x0000000000000000 0x0 obj/drivers/adc/src/adc_ex.o + .data 0x0000000000000000 0x0 obj/drivers/adc/src/adc_ex.o + .bss 0x0000000000000000 0x0 obj/drivers/adc/src/adc_ex.o + .text.IsADCPostProcessingBlock + 0x0000000000000000 0x1c obj/drivers/adc/src/adc_ex.o + .text.IsADCWorkMode + 0x0000000000000000 0x1c obj/drivers/adc/src/adc_ex.o + .text.IsADCOversamplingMultiple + 0x0000000000000000 0x30 obj/drivers/adc/src/adc_ex.o + .text.IsADCOversamplingRightShift + 0x0000000000000000 0x1c obj/drivers/adc/src/adc_ex.o + .text.IsADCSOCx + 0x0000000000000000 0x1c obj/drivers/adc/src/adc_ex.o + .text.ADC_GetCTRLAddr + 0x0000000000000000 0x36 obj/drivers/adc/src/adc_ex.o + .rodata 0x0000000000000000 0x44 obj/drivers/adc/src/adc_ex.o + .text.DCL_ADC_SOCxSelectPPBx + 0x0000000000000000 0xd6 obj/drivers/adc/src/adc_ex.o + .text.DCL_ADC_SetPPBxOffset + 0x0000000000000000 0xd4 obj/drivers/adc/src/adc_ex.o + .text.DCL_ADC_SetPPBxFunction + 0x0000000000000000 0xec obj/drivers/adc/src/adc_ex.o + .text.DCL_ADC_SetPPBxThreshold + 0x0000000000000000 0x126 obj/drivers/adc/src/adc_ex.o + .text.DCL_ADC_SetPPBxErrorRef + 0x0000000000000000 0xd4 obj/drivers/adc/src/adc_ex.o + .text.DCL_ADC_GetPPBxDelayCnt + 0x0000000000000000 0x9a obj/drivers/adc/src/adc_ex.o + .text.DCL_ADC_GetPPBxErrorResult + 0x0000000000000000 0x9a obj/drivers/adc/src/adc_ex.o + .text.DCL_ADC_GetOversamplingState + 0x0000000000000000 0x48 obj/drivers/adc/src/adc_ex.o + .text.DCL_ADC_ResetOversamplingState + 0x0000000000000000 0x4a obj/drivers/adc/src/adc_ex.o + .text.DCL_ADC_ReadOversamplingResult + 0x0000000000000000 0x42 obj/drivers/adc/src/adc_ex.o + .text.DCL_ADC_EnableOversamplingInt + 0x0000000000000000 0x4a obj/drivers/adc/src/adc_ex.o + .text.DCL_ADC_EnableSOCxContinue + 0x0000000000000000 0x96 obj/drivers/adc/src/adc_ex.o + .text.DCL_ADC_DisableSOCxContinue + 0x0000000000000000 0x98 obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_EnableSocCotinueModeEx + 0x0000000000000000 0x9e obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_DisableSocCotinueModeEx + 0x0000000000000000 0x9e obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_GetControllerStatusEx + 0x0000000000000000 0x70 obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_CheckOversamplingFinishEx + 0x0000000000000000 0x80 obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_GetOversamplingResultEx + 0x0000000000000000 0x68 obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_ConfigureOversamplingEx + 0x0000000000000000 0x19c obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_ConfigureWorkModeEx + 0x0000000000000000 0x98 obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_EnablePPBxEventIntEx + 0x0000000000000000 0x72 obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_DisablePPBxEventIntEx + 0x0000000000000000 0x80 obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_ConfigurePPBxEx + 0x0000000000000000 0xe8 obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_SetPPBxThresholdEx + 0x0000000000000000 0x10e obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_SetPPBxOffsetEx + 0x0000000000000000 0xc0 obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_SetPPBxErrorRefEx + 0x0000000000000000 0xa4 obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_GetPPBxErrorResultEx + 0x0000000000000000 0xac obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_GetPPBxDelayCntEx + 0x0000000000000000 0x7a obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_InitForVddaEx + 0x0000000000000000 0xd0 obj/drivers/adc/src/adc_ex.o + .text.HAL_ADC_GetVddaEx + 0x0000000000000000 0x16e obj/drivers/adc/src/adc_ex.o + .debug_info 0x0000000000000000 0x5eb2 obj/drivers/adc/src/adc_ex.o + .debug_abbrev 0x0000000000000000 0x2c8 obj/drivers/adc/src/adc_ex.o + .debug_aranges + 0x0000000000000000 0x138 obj/drivers/adc/src/adc_ex.o + .debug_ranges 0x0000000000000000 0x128 obj/drivers/adc/src/adc_ex.o + .debug_line 0x0000000000000000 0xd93 obj/drivers/adc/src/adc_ex.o + .debug_str 0x0000000000000000 0x4b02 obj/drivers/adc/src/adc_ex.o + .comment 0x0000000000000000 0x2a obj/drivers/adc/src/adc_ex.o + .debug_frame 0x0000000000000000 0x51c obj/drivers/adc/src/adc_ex.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/adc/src/adc_ex.o + .text 0x0000000000000000 0x0 obj/drivers/apt/src/apt.o + .data 0x0000000000000000 0x0 obj/drivers/apt/src/apt.o + .bss 0x0000000000000000 0x0 obj/drivers/apt/src/apt.o + .text.APT_ForcePWMAOutputLow + 0x0000000000000000 0xb2 obj/drivers/apt/src/apt.o + .text.APT_ForcePWMBOutputLow + 0x0000000000000000 0xb6 obj/drivers/apt/src/apt.o + .rodata 0x0000000000000000 0x4c obj/drivers/apt/src/apt.o + .text.DCL_APT_ForcePWMOutputLow + 0x0000000000000000 0x76 obj/drivers/apt/src/apt.o + .text.APT_TimeBaseInit + 0x0000000000000000 0xb8 obj/drivers/apt/src/apt.o + .text.APT_SetPWMCompareVal + 0x0000000000000000 0x208 obj/drivers/apt/src/apt.o + .text.APT_SetOutputABasicType + 0x0000000000000000 0x12c obj/drivers/apt/src/apt.o + .text.APT_SetOutputBBasicType + 0x0000000000000000 0x12c obj/drivers/apt/src/apt.o + .text.APT_SetPWMBasicType + 0x0000000000000000 0x12c obj/drivers/apt/src/apt.o + .text.APT_SetContWaveform + 0x0000000000000000 0x8a obj/drivers/apt/src/apt.o + .text.APT_SetPWMWaveform + 0x0000000000000000 0x128 obj/drivers/apt/src/apt.o + .text.APT_SetADCTrgCompareVal + 0x0000000000000000 0x1de obj/drivers/apt/src/apt.o + .text.APT_SetADCTrigger + 0x0000000000000000 0x128 obj/drivers/apt/src/apt.o + .text.APT_SetTimerInterrupt + 0x0000000000000000 0x9a obj/drivers/apt/src/apt.o + .text.HAL_APT_PWMInit + 0x0000000000000000 0x220 obj/drivers/apt/src/apt.o + .text.HAL_APT_PWMDeInit + 0x0000000000000000 0xd8 obj/drivers/apt/src/apt.o + .text.APT_SetOutCtrlProtectMode + 0x0000000000000000 0xd8 obj/drivers/apt/src/apt.o + .text.APT_SetOutCtrlAction + 0x0000000000000000 0xaa obj/drivers/apt/src/apt.o + .text.APT_SetOutCtrlActionEx + 0x0000000000000000 0xae obj/drivers/apt/src/apt.o + .text.APT_ChangeOcEventToEmEvent + 0x0000000000000000 0xae obj/drivers/apt/src/apt.o + .text.APT_SetCombieEvtOutCtrl + 0x0000000000000000 0x108 obj/drivers/apt/src/apt.o + .text.APT_OcSetEmulation + 0x0000000000000000 0x60 obj/drivers/apt/src/apt.o + .text.HAL_APT_ProtectInit + 0x0000000000000000 0x260 obj/drivers/apt/src/apt.o + .text.APT_SetEMEventFilterEx + 0x0000000000000000 0xe2 obj/drivers/apt/src/apt.o + .text.APT_SetProtectSrcEventPolarityEx + 0x0000000000000000 0xfc obj/drivers/apt/src/apt.o + .text.APT_SetSysEventProtectModeEx + 0x0000000000000000 0xd8 obj/drivers/apt/src/apt.o + .text.APT_SysProtectInitEx + 0x0000000000000000 0xb6 obj/drivers/apt/src/apt.o + .text.HAL_APT_ProtectInitEx + 0x0000000000000000 0x2e6 obj/drivers/apt/src/apt.o + .text.HAL_APT_ProtectDeInitEx + 0x0000000000000000 0x6e obj/drivers/apt/src/apt.o + .text.HAL_APT_ProtectDeInit + 0x0000000000000000 0x6e obj/drivers/apt/src/apt.o + .text.APT_SetEMInputEvtPolarity + 0x0000000000000000 0xcc obj/drivers/apt/src/apt.o + .text.APT_EMCombineEventInit + 0x0000000000000000 0x146 obj/drivers/apt/src/apt.o + .text.APT_EMWdAndCapUpDownModeInit + 0x0000000000000000 0xf2 obj/drivers/apt/src/apt.o + .text.APT_EMWdAndCapInit + 0x0000000000000000 0x132 obj/drivers/apt/src/apt.o + .text.HAL_APT_EMInit + 0x0000000000000000 0xac obj/drivers/apt/src/apt.o + .text.HAL_APT_EMGetCapValue + 0x0000000000000000 0x88 obj/drivers/apt/src/apt.o + .text.HAL_APT_EMSetValleySwithSoftDelay + 0x0000000000000000 0x86 obj/drivers/apt/src/apt.o + .text.HAL_APT_ForcePWMOutputLow + 0x0000000000000000 0x90 obj/drivers/apt/src/apt.o + .text.HAL_APT_MasterSyncInit + 0x0000000000000000 0xf0 obj/drivers/apt/src/apt.o + .text.HAL_APT_SlaveSyncInit + 0x0000000000000000 0x1a0 obj/drivers/apt/src/apt.o + .text.HAL_APT_StartModule + 0x0000000000000000 0x2c obj/drivers/apt/src/apt.o + .text.HAL_APT_StopModule + 0x0000000000000000 0x30 obj/drivers/apt/src/apt.o + .text.HAL_APT_SetPWMDuty + 0x0000000000000000 0x178 obj/drivers/apt/src/apt.o + .text.HAL_APT_SetPWMDutyByNumber + 0x0000000000000000 0x1bc obj/drivers/apt/src/apt.o + .text.HAL_APT_SetADCTriggerTime + 0x0000000000000000 0x178 obj/drivers/apt/src/apt.o + .text.APT_SetActionChannelA + 0x0000000000000000 0x96 obj/drivers/apt/src/apt.o + .text.APT_SetActionChannelB + 0x0000000000000000 0x9c obj/drivers/apt/src/apt.o + .text.HAL_APT_ChangeOutputType + 0x0000000000000000 0x134 obj/drivers/apt/src/apt.o + .text.HAL_APT_EventIrqHandler + 0x0000000000000000 0x94 obj/drivers/apt/src/apt.o + .text.HAL_APT_TimerIrqHandler + 0x0000000000000000 0x60 obj/drivers/apt/src/apt.o + .text.HAL_APT_RegisterCallBack + 0x0000000000000000 0x60 obj/drivers/apt/src/apt.o + .text.HAL_APT_EMSetWdOffsetAndWidth + 0x0000000000000000 0x8e obj/drivers/apt/src/apt.o + .text.APT_ConfigAction + 0x0000000000000000 0xd0 obj/drivers/apt/src/apt.o + .text.APT_ConfigRefA + 0x0000000000000000 0x142 obj/drivers/apt/src/apt.o + .text.APT_ConfigRefB + 0x0000000000000000 0x142 obj/drivers/apt/src/apt.o + .text.APT_ConfigRefC + 0x0000000000000000 0x142 obj/drivers/apt/src/apt.o + .text.APT_ConfigRefD + 0x0000000000000000 0x142 obj/drivers/apt/src/apt.o + .text.HAL_APT_ConfigRefDot + 0x0000000000000000 0x170 obj/drivers/apt/src/apt.o + .debug_info 0x0000000000000000 0x582e obj/drivers/apt/src/apt.o + .debug_abbrev 0x0000000000000000 0x300 obj/drivers/apt/src/apt.o + .debug_aranges + 0x0000000000000000 0x1e0 obj/drivers/apt/src/apt.o + .debug_ranges 0x0000000000000000 0x1d0 obj/drivers/apt/src/apt.o + .debug_line 0x0000000000000000 0x1e0c obj/drivers/apt/src/apt.o + .debug_str 0x0000000000000000 0x5092 obj/drivers/apt/src/apt.o + .comment 0x0000000000000000 0x2a obj/drivers/apt/src/apt.o + .debug_frame 0x0000000000000000 0x814 obj/drivers/apt/src/apt.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/apt/src/apt.o + .text 0x0000000000000000 0x0 obj/drivers/base/src/assert.o + .data 0x0000000000000000 0x0 obj/drivers/base/src/assert.o + .bss 0x0000000000000000 0x0 obj/drivers/base/src/assert.o + .text 0x0000000000000000 0x0 obj/drivers/base/src/base_math.o + .data 0x0000000000000000 0x0 obj/drivers/base/src/base_math.o + .bss 0x0000000000000000 0x0 obj/drivers/base/src/base_math.o + .rodata.g_triFunMappingTable + 0x0000000000000000 0x200 obj/drivers/base/src/base_math.o + .text.BASE_MATH_GetSinCos + 0x0000000000000000 0x1a0 obj/drivers/base/src/base_math.o + .text.BASE_MATH_CalSinIn90 + 0x0000000000000000 0xbc obj/drivers/base/src/base_math.o + .text.BASE_MATH_GetSin + 0x0000000000000000 0x11e obj/drivers/base/src/base_math.o + .text.BASE_MATH_GetCos + 0x0000000000000000 0x12e obj/drivers/base/src/base_math.o + .rodata 0x0000000000000000 0x58 obj/drivers/base/src/base_math.o + .text.BASE_MATH_Sqrt + 0x0000000000000000 0xae obj/drivers/base/src/base_math.o + .text.BASE_MATH_Pow + 0x0000000000000000 0xb6 obj/drivers/base/src/base_math.o + .text.BASE_MATH_Clarke + 0x0000000000000000 0x90 obj/drivers/base/src/base_math.o + .text.BASE_MATH_Park + 0x0000000000000000 0x106 obj/drivers/base/src/base_math.o + .text.BASE_MATH_RevPark + 0x0000000000000000 0xa6 obj/drivers/base/src/base_math.o + .debug_info 0x0000000000000000 0x4bb obj/drivers/base/src/base_math.o + .debug_abbrev 0x0000000000000000 0x1c8 obj/drivers/base/src/base_math.o + .debug_aranges + 0x0000000000000000 0x60 obj/drivers/base/src/base_math.o + .debug_ranges 0x0000000000000000 0x50 obj/drivers/base/src/base_math.o + .debug_line 0x0000000000000000 0x3b0 obj/drivers/base/src/base_math.o + .debug_str 0x0000000000000000 0x610 obj/drivers/base/src/base_math.o + .comment 0x0000000000000000 0x2a obj/drivers/base/src/base_math.o + .debug_frame 0x0000000000000000 0x150 obj/drivers/base/src/base_math.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/base/src/base_math.o + .text 0x0000000000000000 0x0 obj/drivers/base/src/clock.o + .data 0x0000000000000000 0x0 obj/drivers/base/src/clock.o + .bss 0x0000000000000000 0x0 obj/drivers/base/src/clock.o + .text.BASE_FUNC_GetCpuFreqHz + 0x0000000000000000 0x1c obj/drivers/base/src/clock.o + .text 0x0000000000000000 0x0 obj/drivers/base/src/generalfunc.o + .data 0x0000000000000000 0x0 obj/drivers/base/src/generalfunc.o + .bss 0x0000000000000000 0x0 obj/drivers/base/src/generalfunc.o + .text.DCL_SYSTICK_GetTick + 0x0000000000000000 0x14 obj/drivers/base/src/generalfunc.o + .bss.g_averageHandle + 0x0000000000000000 0x30 obj/drivers/base/src/generalfunc.o + .bss.g_fsmHandle + 0x0000000000000000 0xc obj/drivers/base/src/generalfunc.o + .text.BASE_FUNC_GetTick + 0x0000000000000000 0x1c obj/drivers/base/src/generalfunc.o + .rodata 0x0000000000000000 0x22 obj/drivers/base/src/generalfunc.o + .text.BASE_FUNC_FindArrayValue + 0x0000000000000000 0xee obj/drivers/base/src/generalfunc.o + .text.BASE_FUNC_CalcSumByte + 0x0000000000000000 0x8a obj/drivers/base/src/generalfunc.o + .text.BASE_FUNC_CalcSumShort + 0x0000000000000000 0x8a obj/drivers/base/src/generalfunc.o + .text.BASE_FUNC_AverageInit + 0x0000000000000000 0x13a obj/drivers/base/src/generalfunc.o + .text.BASE_FUNC_GetSlipAverageVal + 0x0000000000000000 0x2d4 obj/drivers/base/src/generalfunc.o + .text.BASE_FUNC_AverageDeInit + 0x0000000000000000 0x4e obj/drivers/base/src/generalfunc.o + .text.BASE_FSM_FunRegister + 0x0000000000000000 0x4e obj/drivers/base/src/generalfunc.o + .text.BASE_FSM_Run + 0x0000000000000000 0x78 obj/drivers/base/src/generalfunc.o + .debug_info 0x0000000000000000 0x53d obj/drivers/base/src/generalfunc.o + .debug_abbrev 0x0000000000000000 0x1c2 obj/drivers/base/src/generalfunc.o + .debug_aranges + 0x0000000000000000 0x68 obj/drivers/base/src/generalfunc.o + .debug_ranges 0x0000000000000000 0x58 obj/drivers/base/src/generalfunc.o + .debug_line 0x0000000000000000 0x3de obj/drivers/base/src/generalfunc.o + .debug_str 0x0000000000000000 0x774 obj/drivers/base/src/generalfunc.o + .comment 0x0000000000000000 0x2a obj/drivers/base/src/generalfunc.o + .debug_frame 0x0000000000000000 0x17c obj/drivers/base/src/generalfunc.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/base/src/generalfunc.o + .text 0x0000000000000000 0x0 obj/drivers/base/src/interrupt.o + .data 0x0000000000000000 0x0 obj/drivers/base/src/interrupt.o + .bss 0x0000000000000000 0x0 obj/drivers/base/src/interrupt.o + .text.IRQ_Unregister + 0x0000000000000000 0x6a obj/drivers/base/src/interrupt.o + .text.IRQ_Enable + 0x0000000000000000 0x16 obj/drivers/base/src/interrupt.o + .text.IRQ_Disable + 0x0000000000000000 0x1a obj/drivers/base/src/interrupt.o + .text.IRQ_DisableN + 0x0000000000000000 0x110 obj/drivers/base/src/interrupt.o + .text.GetLocaIntNumPri + 0x0000000000000000 0x1ba obj/drivers/base/src/interrupt.o + .rodata.GetLocaIntNumPri + 0x0000000000000000 0x20 obj/drivers/base/src/interrupt.o + .text.IRQ_GetLocalPriority + 0x0000000000000000 0x1de obj/drivers/base/src/interrupt.o + .rodata.IRQ_GetLocalPriority + 0x0000000000000000 0x20 obj/drivers/base/src/interrupt.o + .text.IRQ_GetPriority + 0x0000000000000000 0x58 obj/drivers/base/src/interrupt.o + .text.IRQ_ClearAll + 0x0000000000000000 0x3e obj/drivers/base/src/interrupt.o + .text 0x0000000000000000 0x0 obj/drivers/base/src/lock.o + .data 0x0000000000000000 0x0 obj/drivers/base/src/lock.o + .bss 0x0000000000000000 0x0 obj/drivers/base/src/lock.o + .bss.g_baseLock + 0x0000000000000000 0x20 obj/drivers/base/src/lock.o + .rodata 0x0000000000000000 0x1b obj/drivers/base/src/lock.o + .text.BASE_FUNC_SoftwareLock + 0x0000000000000000 0x52 obj/drivers/base/src/lock.o + .text.BASE_FUNC_SoftwareUnLock + 0x0000000000000000 0x38 obj/drivers/base/src/lock.o + .text.BASE_FUNC_HardwareLock + 0x0000000000000000 0x56 obj/drivers/base/src/lock.o + .text.BASE_FUNC_HardwareUnLock + 0x0000000000000000 0x50 obj/drivers/base/src/lock.o + .debug_info 0x0000000000000000 0x18c obj/drivers/base/src/lock.o + .debug_abbrev 0x0000000000000000 0xf2 obj/drivers/base/src/lock.o + .debug_aranges + 0x0000000000000000 0x38 obj/drivers/base/src/lock.o + .debug_ranges 0x0000000000000000 0x28 obj/drivers/base/src/lock.o + .debug_line 0x0000000000000000 0x147 obj/drivers/base/src/lock.o + .debug_str 0x0000000000000000 0x5a4 obj/drivers/base/src/lock.o + .comment 0x0000000000000000 0x2a obj/drivers/base/src/lock.o + .debug_frame 0x0000000000000000 0xa0 obj/drivers/base/src/lock.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/base/src/lock.o + .text 0x0000000000000000 0x0 obj/drivers/base/src/reset.o + .data 0x0000000000000000 0x0 obj/drivers/base/src/reset.o + .bss 0x0000000000000000 0x0 obj/drivers/base/src/reset.o + .text.DCL_SYSCTRL_SoftReset + 0x0000000000000000 0x1a obj/drivers/base/src/reset.o + .text.DCL_SYSCTRL_ScWriteProtectionDisable + 0x0000000000000000 0x28 obj/drivers/base/src/reset.o + .text.IsCrgCoreCkSel + 0x0000000000000000 0x36 obj/drivers/base/src/reset.o + .rodata 0x0000000000000000 0x1c obj/drivers/base/src/reset.o + .text.DCL_CRG_SetCoreClkSel + 0x0000000000000000 0x82 obj/drivers/base/src/reset.o + .text.BASE_FUNC_SoftReset + 0x0000000000000000 0x2a obj/drivers/base/src/reset.o + .debug_info 0x0000000000000000 0x2ac7 obj/drivers/base/src/reset.o + .debug_abbrev 0x0000000000000000 0x1d7 obj/drivers/base/src/reset.o + .debug_aranges + 0x0000000000000000 0x40 obj/drivers/base/src/reset.o + .debug_ranges 0x0000000000000000 0x30 obj/drivers/base/src/reset.o + .debug_line 0x0000000000000000 0x174 obj/drivers/base/src/reset.o + .debug_str 0x0000000000000000 0x14f7 obj/drivers/base/src/reset.o + .comment 0x0000000000000000 0x2a obj/drivers/base/src/reset.o + .debug_frame 0x0000000000000000 0xb0 obj/drivers/base/src/reset.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/base/src/reset.o + .text 0x0000000000000000 0x0 obj/drivers/can/src/can.o + .data 0x0000000000000000 0x0 obj/drivers/can/src/can.o + .bss 0x0000000000000000 0x0 obj/drivers/can/src/can.o + .data.g_stdRecvMap + 0x0000000000000000 0x4 obj/drivers/can/src/can.o + .data.g_extRecvMap + 0x0000000000000000 0x4 obj/drivers/can/src/can.o + .data.g_allSendMap + 0x0000000000000000 0x4 obj/drivers/can/src/can.o + .data.g_allRecvMap + 0x0000000000000000 0x4 obj/drivers/can/src/can.o + .bss.g_msgObj 0x0000000000000000 0x80 obj/drivers/can/src/can.o + .text.CAN_WaitTime + 0x0000000000000000 0x78 obj/drivers/can/src/can.o + .text.CAN_AutoRetrans + 0x0000000000000000 0x40 obj/drivers/can/src/can.o + .text.HAL_CAN_Init + 0x0000000000000000 0x1e6 obj/drivers/can/src/can.o + .text.HAL_CAN_DeInit + 0x0000000000000000 0x48 obj/drivers/can/src/can.o + .text.HAL_CAN_GetErrorStatus + 0x0000000000000000 0x36 obj/drivers/can/src/can.o + .text.HAL_CAN_GetErrorStatusCode + 0x0000000000000000 0x2e obj/drivers/can/src/can.o + .text.HAL_CAN_GetBusOffStatus + 0x0000000000000000 0x36 obj/drivers/can/src/can.o + .text.HAL_CAN_MessageReceiveStatus + 0x0000000000000000 0x36 obj/drivers/can/src/can.o + .text.HAL_CAN_MessageSendStatus + 0x0000000000000000 0x36 obj/drivers/can/src/can.o + .text.WriteData + 0x0000000000000000 0x11e obj/drivers/can/src/can.o + .text.HAL_CAN_Write + 0x0000000000000000 0x21c obj/drivers/can/src/can.o + .text.CAN_ReadCallback + 0x0000000000000000 0x24c obj/drivers/can/src/can.o + .text.CAN_ReceiveFilter + 0x0000000000000000 0x1e0 obj/drivers/can/src/can.o + .text.HAL_CAN_ReadIT + 0x0000000000000000 0x86 obj/drivers/can/src/can.o + .text.CAN_ConfigReadReq + 0x0000000000000000 0xee obj/drivers/can/src/can.o + .text.WriteFinishClear + 0x0000000000000000 0x64 obj/drivers/can/src/can.o + .text.WriteIrqService + 0x0000000000000000 0x54 obj/drivers/can/src/can.o + .text.ReadIrqService + 0x0000000000000000 0x3e obj/drivers/can/src/can.o + .text.HAL_CAN_IrqHandler + 0x0000000000000000 0x10e obj/drivers/can/src/can.o + .text.HAL_CAN_RegisterCallBack + 0x0000000000000000 0x5c obj/drivers/can/src/can.o + .debug_info 0x0000000000000000 0x20cd obj/drivers/can/src/can.o + .debug_abbrev 0x0000000000000000 0x2d1 obj/drivers/can/src/can.o + .debug_aranges + 0x0000000000000000 0xb8 obj/drivers/can/src/can.o + .debug_ranges 0x0000000000000000 0xa8 obj/drivers/can/src/can.o + .debug_line 0x0000000000000000 0x8c3 obj/drivers/can/src/can.o + .debug_str 0x0000000000000000 0x13a9 obj/drivers/can/src/can.o + .comment 0x0000000000000000 0x2a obj/drivers/can/src/can.o + .debug_frame 0x0000000000000000 0x2c4 obj/drivers/can/src/can.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/can/src/can.o + .text 0x0000000000000000 0x0 obj/drivers/capm/src/capm.o + .data 0x0000000000000000 0x0 obj/drivers/capm/src/capm.o + .bss 0x0000000000000000 0x0 obj/drivers/capm/src/capm.o + .rodata 0x0000000000000000 0x3b obj/drivers/capm/src/capm.o + .text.DCL_CAPM_SetTSRDiv + 0x0000000000000000 0x6e obj/drivers/capm/src/capm.o + .text.DCL_CAPM_SetSyncPhase + 0x0000000000000000 0x5e obj/drivers/capm/src/capm.o + .text.DCL_CAPM_GetSyncPhase + 0x0000000000000000 0x56 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_GetECR0 + 0x0000000000000000 0x56 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_GetECR1 + 0x0000000000000000 0x56 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_GetECR2 + 0x0000000000000000 0x56 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_GetECR3 + 0x0000000000000000 0x56 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_GetCRTEdge + 0x0000000000000000 0x5c obj/drivers/capm/src/capm.o + .text.DCL_CAPM_GetNextECRNum + 0x0000000000000000 0x5a obj/drivers/capm/src/capm.o + .text.DCL_CAPM_RisingCap + 0x0000000000000000 0x82 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_FallingCap + 0x0000000000000000 0x86 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_EnableCapReset + 0x0000000000000000 0x82 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_DisableCapReset + 0x0000000000000000 0x86 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_EnableCapRegLoad + 0x0000000000000000 0x5c obj/drivers/capm/src/capm.o + .text.DCL_CAPM_DisableCapRegLoad + 0x0000000000000000 0x5c obj/drivers/capm/src/capm.o + .text.DCL_CAPM_SetDMATriggleReg + 0x0000000000000000 0x90 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_SetPreScale + 0x0000000000000000 0x9a obj/drivers/capm/src/capm.o + .text.DCL_CAPM_SetFilterLevel + 0x0000000000000000 0x7e obj/drivers/capm/src/capm.o + .text.DCL_CAPM_EnableFilter + 0x0000000000000000 0x5c obj/drivers/capm/src/capm.o + .text.DCL_CAPM_DisableFilter + 0x0000000000000000 0x5a obj/drivers/capm/src/capm.o + .text.DCL_CAPM_SetCapMode + 0x0000000000000000 0x92 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_SetStopSeq + 0x0000000000000000 0x8e obj/drivers/capm/src/capm.o + .text.DCL_CAPM_EnableSyncIn0 + 0x0000000000000000 0x44 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_EnableSyncIn1 + 0x0000000000000000 0x44 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_EnableSyncIn2 + 0x0000000000000000 0x44 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_DisableSyncIn0 + 0x0000000000000000 0x42 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_DisableSyncIn1 + 0x0000000000000000 0x42 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_DisableSyncIn2 + 0x0000000000000000 0x42 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_ClearInter + 0x0000000000000000 0x66 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_EnableInter + 0x0000000000000000 0x66 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_DisableInter + 0x0000000000000000 0x6a obj/drivers/capm/src/capm.o + .text.DCL_CAPM_GetInterFlag + 0x0000000000000000 0x56 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_DisableTSRStop + 0x0000000000000000 0x5c obj/drivers/capm/src/capm.o + .text.DCL_CAPM_SetInputSEL0 + 0x0000000000000000 0x54 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_SetInputSEL1 + 0x0000000000000000 0x54 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_SetInputSEL2 + 0x0000000000000000 0x54 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_SetSyncInput0 + 0x0000000000000000 0x72 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_SetSyncInput1 + 0x0000000000000000 0x72 obj/drivers/capm/src/capm.o + .text.DCL_CAPM_SetSyncInput2 + 0x0000000000000000 0x72 obj/drivers/capm/src/capm.o + .text.CAPM_SetCapReset + 0x0000000000000000 0xd6 obj/drivers/capm/src/capm.o + .text.CAPM_SetRegCaptureEvent + 0x0000000000000000 0xee obj/drivers/capm/src/capm.o + .text.CAPM_SetDeburrNum + 0x0000000000000000 0x88 obj/drivers/capm/src/capm.o + .text.HAL_CAPM_IrqHandler + 0x0000000000000000 0xfc obj/drivers/capm/src/capm.o + .text.HAL_CAPM_RegisterCallback + 0x0000000000000000 0xd0 obj/drivers/capm/src/capm.o + .text.CAPM_DmaErrorIRQService + 0x0000000000000000 0x50 obj/drivers/capm/src/capm.o + .text.CAPM_DmaFinishIRQService + 0x0000000000000000 0x50 obj/drivers/capm/src/capm.o + .text.CAPM_GetCapmNumber + 0x0000000000000000 0x8e obj/drivers/capm/src/capm.o + .text.CAPM_SyncSetByNumber + 0x0000000000000000 0x96 obj/drivers/capm/src/capm.o + .text.CAPM_SyncDisableByNumber + 0x0000000000000000 0x56 obj/drivers/capm/src/capm.o + .text.CAPM_SyncInit + 0x0000000000000000 0x70 obj/drivers/capm/src/capm.o + .text.CAPM_InputSel + 0x0000000000000000 0xa4 obj/drivers/capm/src/capm.o + .text.HAL_CAPM_Init + 0x0000000000000000 0x1ae obj/drivers/capm/src/capm.o + .text.HAL_CAPM_DeInit + 0x0000000000000000 0xb4 obj/drivers/capm/src/capm.o + .text.HAL_CAPM_GetECRValue + 0x0000000000000000 0xe6 obj/drivers/capm/src/capm.o + .text.HAL_CAPM_GetCrtEdge + 0x0000000000000000 0x44 obj/drivers/capm/src/capm.o + .text.HAL_CAPM_GetNextLoadECRNum + 0x0000000000000000 0x44 obj/drivers/capm/src/capm.o + .text.HAL_CAPM_SetSyncPhs + 0x0000000000000000 0x4a obj/drivers/capm/src/capm.o + .text.HAL_CAPM_GetSyncPhs + 0x0000000000000000 0x44 obj/drivers/capm/src/capm.o + .text.HAL_CAPM_GetECRValueDMA + 0x0000000000000000 0x112 obj/drivers/capm/src/capm.o + .debug_info 0x0000000000000000 0x2c0d obj/drivers/capm/src/capm.o + .debug_abbrev 0x0000000000000000 0x30a obj/drivers/capm/src/capm.o + .debug_aranges + 0x0000000000000000 0x1f0 obj/drivers/capm/src/capm.o + .debug_ranges 0x0000000000000000 0x1e0 obj/drivers/capm/src/capm.o + .debug_line 0x0000000000000000 0x1498 obj/drivers/capm/src/capm.o + .debug_str 0x0000000000000000 0x22a1 obj/drivers/capm/src/capm.o + .comment 0x0000000000000000 0x2a obj/drivers/capm/src/capm.o + .debug_frame 0x0000000000000000 0x864 obj/drivers/capm/src/capm.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/capm/src/capm.o + .text 0x0000000000000000 0x0 obj/drivers/cfd/src/cfd.o + .data 0x0000000000000000 0x0 obj/drivers/cfd/src/cfd.o + .bss 0x0000000000000000 0x0 obj/drivers/cfd/src/cfd.o + .rodata 0x0000000000000000 0x51 obj/drivers/cfd/src/cfd.o + .text.DCL_CRG_GetPllRefClkSel + 0x0000000000000000 0x42 obj/drivers/cfd/src/cfd.o + .text.DCL_CFD_Enable + 0x0000000000000000 0x50 obj/drivers/cfd/src/cfd.o + .text.DCL_CFD_Disable + 0x0000000000000000 0x4c obj/drivers/cfd/src/cfd.o + .text.DCL_CFD_SetCfdClock + 0x0000000000000000 0x8c obj/drivers/cfd/src/cfd.o + .text.DCL_CFD_SetWindowUpperBound + 0x0000000000000000 0x6c obj/drivers/cfd/src/cfd.o + .text.DCL_CFD_GetWindowUpperBound + 0x0000000000000000 0x4a obj/drivers/cfd/src/cfd.o + .text.DCL_CFD_EnableInterrupt + 0x0000000000000000 0x76 obj/drivers/cfd/src/cfd.o + .text.DCL_CFD_DisableInterrupt + 0x0000000000000000 0x7a obj/drivers/cfd/src/cfd.o + .text.DCL_CFD_GetInterruptType + 0x0000000000000000 0x3e obj/drivers/cfd/src/cfd.o + .text.HAL_CFD_Init + 0x0000000000000000 0xae obj/drivers/cfd/src/cfd.o + .text.HAL_CFD_DeInit + 0x0000000000000000 0x7a obj/drivers/cfd/src/cfd.o + .text.HAL_CFD_Config + 0x0000000000000000 0xa6 obj/drivers/cfd/src/cfd.o + .text.HAL_CFD_GetConfig + 0x0000000000000000 0x8a obj/drivers/cfd/src/cfd.o + .text.HAL_CFD_Start + 0x0000000000000000 0x66 obj/drivers/cfd/src/cfd.o + .text.HAL_CFD_Stop + 0x0000000000000000 0x66 obj/drivers/cfd/src/cfd.o + .text.HAL_CFD_RegisterCallback + 0x0000000000000000 0xa8 obj/drivers/cfd/src/cfd.o + .text.HAL_CFD_IrqHandler + 0x0000000000000000 0xce obj/drivers/cfd/src/cfd.o + .debug_info 0x0000000000000000 0x2f30 obj/drivers/cfd/src/cfd.o + .debug_abbrev 0x0000000000000000 0x224 obj/drivers/cfd/src/cfd.o + .debug_aranges + 0x0000000000000000 0xa0 obj/drivers/cfd/src/cfd.o + .debug_ranges 0x0000000000000000 0x90 obj/drivers/cfd/src/cfd.o + .debug_line 0x0000000000000000 0x630 obj/drivers/cfd/src/cfd.o + .debug_str 0x0000000000000000 0x18c2 obj/drivers/cfd/src/cfd.o + .comment 0x0000000000000000 0x2a obj/drivers/cfd/src/cfd.o + .debug_frame 0x0000000000000000 0x274 obj/drivers/cfd/src/cfd.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/cfd/src/cfd.o + .text 0x0000000000000000 0x0 obj/drivers/cmm/src/cmm.o + .data 0x0000000000000000 0x0 obj/drivers/cmm/src/cmm.o + .bss 0x0000000000000000 0x0 obj/drivers/cmm/src/cmm.o + .rodata 0x0000000000000000 0x35 obj/drivers/cmm/src/cmm.o + .text.DCL_CMM_Enable + 0x0000000000000000 0x44 obj/drivers/cmm/src/cmm.o + .text.DCL_CMM_Disable + 0x0000000000000000 0x42 obj/drivers/cmm/src/cmm.o + .text.DCL_CMM_SetTargetClockFreqDivision + 0x0000000000000000 0x76 obj/drivers/cmm/src/cmm.o + .text.DCL_CMM_GetTargetClockFreqDivision + 0x0000000000000000 0x44 obj/drivers/cmm/src/cmm.o + .text.DCL_CMM_SetTargetClockSource + 0x0000000000000000 0x72 obj/drivers/cmm/src/cmm.o + .text.DCL_CMM_GetTargetClockSource + 0x0000000000000000 0x42 obj/drivers/cmm/src/cmm.o + .text.DCL_CMM_SetRefClockFreqDivision + 0x0000000000000000 0x76 obj/drivers/cmm/src/cmm.o + .text.DCL_CMM_GetRefClockFreqDivision + 0x0000000000000000 0x44 obj/drivers/cmm/src/cmm.o + .text.DCL_CMM_SetRefClockSource + 0x0000000000000000 0x72 obj/drivers/cmm/src/cmm.o + .text.DCL_CMM_GetRefClockSource + 0x0000000000000000 0x42 obj/drivers/cmm/src/cmm.o + .text.DCL_CMM_SetCmmWindowUpperBound + 0x0000000000000000 0x56 obj/drivers/cmm/src/cmm.o + .text.DCL_CMM_GetCmmWindowUpperBound + 0x0000000000000000 0x40 obj/drivers/cmm/src/cmm.o + .text.DCL_CMM_SetCmmWindowLowerBound + 0x0000000000000000 0x56 obj/drivers/cmm/src/cmm.o + .text.DCL_CMM_GetCmmWindowLowerBound + 0x0000000000000000 0x40 obj/drivers/cmm/src/cmm.o + .text.IsCMMInterruptType + 0x0000000000000000 0x44 obj/drivers/cmm/src/cmm.o + .text.DCL_CMM_EnableInterrupt + 0x0000000000000000 0x78 obj/drivers/cmm/src/cmm.o + .text.DCL_CMM_DisableInterrupt + 0x0000000000000000 0x7c obj/drivers/cmm/src/cmm.o + .text.HAL_CMM_Init + 0x0000000000000000 0x1b4 obj/drivers/cmm/src/cmm.o + .text.HAL_CMM_DeInit + 0x0000000000000000 0x88 obj/drivers/cmm/src/cmm.o + .text.HAL_CMM_Config + 0x0000000000000000 0x1ea obj/drivers/cmm/src/cmm.o + .rodata.HAL_CMM_Config + 0x0000000000000000 0x24 obj/drivers/cmm/src/cmm.o + .text.HAL_CMM_GetConfig + 0x0000000000000000 0xea obj/drivers/cmm/src/cmm.o + .text.HAL_CMM_Start + 0x0000000000000000 0x66 obj/drivers/cmm/src/cmm.o + .text.HAL_CMM_Stop + 0x0000000000000000 0x66 obj/drivers/cmm/src/cmm.o + .text.HAL_CMM_RegisterCallback + 0x0000000000000000 0xbc obj/drivers/cmm/src/cmm.o + .text.HAL_CMM_IrqHandler + 0x0000000000000000 0x11e obj/drivers/cmm/src/cmm.o + .debug_info 0x0000000000000000 0xdb8 obj/drivers/cmm/src/cmm.o + .debug_abbrev 0x0000000000000000 0x1fc obj/drivers/cmm/src/cmm.o + .debug_aranges + 0x0000000000000000 0xe0 obj/drivers/cmm/src/cmm.o + .debug_ranges 0x0000000000000000 0xd0 obj/drivers/cmm/src/cmm.o + .debug_line 0x0000000000000000 0x8cb obj/drivers/cmm/src/cmm.o + .debug_str 0x0000000000000000 0xe8f obj/drivers/cmm/src/cmm.o + .comment 0x0000000000000000 0x2a obj/drivers/cmm/src/cmm.o + .debug_frame 0x0000000000000000 0x39c obj/drivers/cmm/src/cmm.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/cmm/src/cmm.o + .text 0x0000000000000000 0x0 obj/drivers/crc/src/crc.o + .data 0x0000000000000000 0x0 obj/drivers/crc/src/crc.o + .bss 0x0000000000000000 0x0 obj/drivers/crc/src/crc.o + .rodata 0x0000000000000000 0x35 obj/drivers/crc/src/crc.o + .text.DCL_CRC_SetPolynomialMode + 0x0000000000000000 0x72 obj/drivers/crc/src/crc.o + .text.DCL_CRC_SoftReset + 0x0000000000000000 0x44 obj/drivers/crc/src/crc.o + .text.DCL_CRC_LoadInitValue + 0x0000000000000000 0x44 obj/drivers/crc/src/crc.o + .text.DCL_CRC_GetInitValue + 0x0000000000000000 0x3e obj/drivers/crc/src/crc.o + .text.DCL_CRC_SetInputData32 + 0x0000000000000000 0x46 obj/drivers/crc/src/crc.o + .text.DCL_CRC_GetOutputData + 0x0000000000000000 0x3e obj/drivers/crc/src/crc.o + .text.DCL_CRC_SetEndianMode + 0x0000000000000000 0x52 obj/drivers/crc/src/crc.o + .text.DCL_CRC_SetByteReverseMode + 0x0000000000000000 0x50 obj/drivers/crc/src/crc.o + .text.DCL_CRC_SetOutputReverseMode + 0x0000000000000000 0x52 obj/drivers/crc/src/crc.o + .text.DCL_CRC_SetXorResultMode + 0x0000000000000000 0x50 obj/drivers/crc/src/crc.o + .text.IsCrcPolynomial + 0x0000000000000000 0x54 obj/drivers/crc/src/crc.o + .text.IsCrcInitValueType + 0x0000000000000000 0x58 obj/drivers/crc/src/crc.o + .text.IsCrcResultXorValueType + 0x0000000000000000 0x62 obj/drivers/crc/src/crc.o + .text.IsCrcXorEndianEnableType + 0x0000000000000000 0x46 obj/drivers/crc/src/crc.o + .text.IsCrcReverseEnableType + 0x0000000000000000 0x46 obj/drivers/crc/src/crc.o + .text.IsCrcInputDataFormat + 0x0000000000000000 0x36 obj/drivers/crc/src/crc.o + .text.IsCrcAlgorithm + 0x0000000000000000 0xec obj/drivers/crc/src/crc.o + .text.HAL_CRC_Init + 0x0000000000000000 0x30c obj/drivers/crc/src/crc.o + .text.HAL_CRC_DeInit + 0x0000000000000000 0x66 obj/drivers/crc/src/crc.o + .text.HAL_CRC_SetInputDataGetCheck + 0x0000000000000000 0x80 obj/drivers/crc/src/crc.o + .text.HAL_CRC_Accumulate + 0x0000000000000000 0xe8 obj/drivers/crc/src/crc.o + .text.HAL_CRC_Calculate + 0x0000000000000000 0xa0 obj/drivers/crc/src/crc.o + .text.CRC_Handle_8 + 0x0000000000000000 0xb4 obj/drivers/crc/src/crc.o + .text.CRC_Handle_16 + 0x0000000000000000 0xb6 obj/drivers/crc/src/crc.o + .text.CRC_Handle_32 + 0x0000000000000000 0xb6 obj/drivers/crc/src/crc.o + .text.HAL_CRC_CheckInputData + 0x0000000000000000 0xa0 obj/drivers/crc/src/crc.o + .text.HAL_CRC_SetCheckInData + 0x0000000000000000 0x66 obj/drivers/crc/src/crc.o + .text.HAL_CRC_LoadCheckInData + 0x0000000000000000 0x78 obj/drivers/crc/src/crc.o + .text.HAL_CRC_RegisterCallback + 0x0000000000000000 0x16 obj/drivers/crc/src/crc.o + .text.HAL_CRC_IrqHandler + 0x0000000000000000 0x12 obj/drivers/crc/src/crc.o + .text.CRC_SetInitValueByAlgorithm + 0x0000000000000000 0x6e obj/drivers/crc/src/crc.o + .text.CRC_SetXorValueByAlgorithm + 0x0000000000000000 0x70 obj/drivers/crc/src/crc.o + .text.CRC_SetXorEndianReverseEnableByAlgorithm + 0x0000000000000000 0x102 obj/drivers/crc/src/crc.o + .text.CRC_SetPolynomialModeByAlgorithm + 0x0000000000000000 0x6c obj/drivers/crc/src/crc.o + .text.CRC_SetResultXorValue + 0x0000000000000000 0xfc obj/drivers/crc/src/crc.o + .text.CRC_SetInitValue + 0x0000000000000000 0xe6 obj/drivers/crc/src/crc.o + .debug_info 0x0000000000000000 0xe97 obj/drivers/crc/src/crc.o + .debug_abbrev 0x0000000000000000 0x26b obj/drivers/crc/src/crc.o + .debug_aranges + 0x0000000000000000 0x138 obj/drivers/crc/src/crc.o + .debug_ranges 0x0000000000000000 0x128 obj/drivers/crc/src/crc.o + .debug_line 0x0000000000000000 0xdc7 obj/drivers/crc/src/crc.o + .debug_str 0x0000000000000000 0xfcf obj/drivers/crc/src/crc.o + .comment 0x0000000000000000 0x2a obj/drivers/crc/src/crc.o + .debug_frame 0x0000000000000000 0x500 obj/drivers/crc/src/crc.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/crc/src/crc.o + .text 0x0000000000000000 0x0 obj/drivers/crg/src/crg.o + .data 0x0000000000000000 0x0 obj/drivers/crg/src/crg.o + .bss 0x0000000000000000 0x0 obj/drivers/crg/src/crg.o + .text.HAL_CRG_InitWithTargetFrequence + 0x0000000000000000 0x1c8 obj/drivers/crg/src/crg.o + .text.HAL_CRG_DeInit + 0x0000000000000000 0xd6 obj/drivers/crg/src/crg.o + .text.HAL_CRG_GetConfig + 0x0000000000000000 0x112 obj/drivers/crg/src/crg.o + .text.HAL_CRG_IpEnableGet + 0x0000000000000000 0xe8 obj/drivers/crg/src/crg.o + .text.HAL_CRG_IpClkSelectGet + 0x0000000000000000 0xe8 obj/drivers/crg/src/crg.o + .text.HAL_CRG_IpClkResetSet + 0x0000000000000000 0xf0 obj/drivers/crg/src/crg.o + .text.HAL_CRG_IpClkResetGet + 0x0000000000000000 0xe8 obj/drivers/crg/src/crg.o + .text.HAL_CRG_IpClkDivGet + 0x0000000000000000 0xe8 obj/drivers/crg/src/crg.o + .text.HAL_CRG_PvdResetEnable + 0x0000000000000000 0x58 obj/drivers/crg/src/crg.o + .text.CRG_GetPllTargetFreqPostDiv + 0x0000000000000000 0xea obj/drivers/crg/src/crg.o + .text.CRG_GetPllOptConfig + 0x0000000000000000 0x13e obj/drivers/crg/src/crg.o + .text 0x0000000000000000 0x0 obj/drivers/dac/src/dac.o + .data 0x0000000000000000 0x0 obj/drivers/dac/src/dac.o + .bss 0x0000000000000000 0x0 obj/drivers/dac/src/dac.o + .text.IsDacConfigureValue + 0x0000000000000000 0x1e obj/drivers/dac/src/dac.o + .rodata 0x0000000000000000 0x19 obj/drivers/dac/src/dac.o + .text.HAL_DAC_SetValue + 0x0000000000000000 0x9c obj/drivers/dac/src/dac.o + .text.HAL_DAC_Init + 0x0000000000000000 0xe6 obj/drivers/dac/src/dac.o + .text.HAL_DAC_DeInit + 0x0000000000000000 0x6c obj/drivers/dac/src/dac.o + .debug_info 0x0000000000000000 0x2b5 obj/drivers/dac/src/dac.o + .debug_abbrev 0x0000000000000000 0x149 obj/drivers/dac/src/dac.o + .debug_aranges + 0x0000000000000000 0x38 obj/drivers/dac/src/dac.o + .debug_ranges 0x0000000000000000 0x28 obj/drivers/dac/src/dac.o + .debug_line 0x0000000000000000 0x1f2 obj/drivers/dac/src/dac.o + .debug_str 0x0000000000000000 0x62a obj/drivers/dac/src/dac.o + .comment 0x0000000000000000 0x2a obj/drivers/dac/src/dac.o + .debug_frame 0x0000000000000000 0x9c obj/drivers/dac/src/dac.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/dac/src/dac.o + .text 0x0000000000000000 0x0 obj/drivers/debug/log/src/app_command.o + .data 0x0000000000000000 0x0 obj/drivers/debug/log/src/app_command.o + .bss 0x0000000000000000 0x0 obj/drivers/debug/log/src/app_command.o + .bss.g_cmdCtx 0x0000000000000000 0x3cc obj/drivers/debug/log/src/app_command.o + .text.AppCmdGetCtx + 0x0000000000000000 0x16 obj/drivers/debug/log/src/app_command.o + .text.GetPreCmd + 0x0000000000000000 0xf6 obj/drivers/debug/log/src/app_command.o + .text.GetNextCmd + 0x0000000000000000 0xfe obj/drivers/debug/log/src/app_command.o + .text.CmdDeleteTailChar + 0x0000000000000000 0x6e obj/drivers/debug/log/src/app_command.o + .text.CmdAddTailChar + 0x0000000000000000 0x5c obj/drivers/debug/log/src/app_command.o + .text.IgnoreCmdKey + 0x0000000000000000 0x78 obj/drivers/debug/log/src/app_command.o + .text.DeleteCmdKey + 0x0000000000000000 0x6a obj/drivers/debug/log/src/app_command.o + .rodata 0x0000000000000000 0x53 obj/drivers/debug/log/src/app_command.o + .text.OutputLogCmd + 0x0000000000000000 0xf6 obj/drivers/debug/log/src/app_command.o + .text.RecordCmd + 0x0000000000000000 0x114 obj/drivers/debug/log/src/app_command.o + .text.CleanInputCmd + 0x0000000000000000 0x36 obj/drivers/debug/log/src/app_command.o + .text.CmdDirectionKey + 0x0000000000000000 0x106 obj/drivers/debug/log/src/app_command.o + .text.CompletesTabKey + 0x0000000000000000 0xba obj/drivers/debug/log/src/app_command.o + .text.CmdTabKey + 0x0000000000000000 0x15c obj/drivers/debug/log/src/app_command.o + .text.CmdEnterKey + 0x0000000000000000 0xb6 obj/drivers/debug/log/src/app_command.o + .text.CmdStrSetLevel + 0x0000000000000000 0x4e obj/drivers/debug/log/src/app_command.o + .rodata.astDoWithTable + 0x0000000000000000 0x30 obj/drivers/debug/log/src/app_command.o + .text.GetCmdStr + 0x0000000000000000 0x15e obj/drivers/debug/log/src/app_command.o + .text.ExtAppCmdProcess + 0x0000000000000000 0x150 obj/drivers/debug/log/src/app_command.o + .debug_info 0x0000000000000000 0x82d obj/drivers/debug/log/src/app_command.o + .debug_abbrev 0x0000000000000000 0x29f obj/drivers/debug/log/src/app_command.o + .debug_aranges + 0x0000000000000000 0xa0 obj/drivers/debug/log/src/app_command.o + .debug_ranges 0x0000000000000000 0x90 obj/drivers/debug/log/src/app_command.o + .debug_line 0x0000000000000000 0x856 obj/drivers/debug/log/src/app_command.o + .debug_str 0x0000000000000000 0x8bf obj/drivers/debug/log/src/app_command.o + .comment 0x0000000000000000 0x2a obj/drivers/debug/log/src/app_command.o + .debug_frame 0x0000000000000000 0x274 obj/drivers/debug/log/src/app_command.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/debug/log/src/app_command.o + .text 0x0000000000000000 0x0 obj/drivers/debug/log/src/cmd.o + .data 0x0000000000000000 0x0 obj/drivers/debug/log/src/cmd.o + .bss 0x0000000000000000 0x0 obj/drivers/debug/log/src/cmd.o + .bss.g_cmdRegister + 0x0000000000000000 0x400 obj/drivers/debug/log/src/cmd.o + .bss.g_cmdIndex + 0x0000000000000000 0x4 obj/drivers/debug/log/src/cmd.o + .text.GetRegisterAddr + 0x0000000000000000 0x16 obj/drivers/debug/log/src/cmd.o + .rodata 0x0000000000000000 0x3e obj/drivers/debug/log/src/cmd.o + .text.ExtCmdRegister + 0x0000000000000000 0x8e obj/drivers/debug/log/src/cmd.o + .debug_info 0x0000000000000000 0x151 obj/drivers/debug/log/src/cmd.o + .debug_abbrev 0x0000000000000000 0xf7 obj/drivers/debug/log/src/cmd.o + .debug_aranges + 0x0000000000000000 0x28 obj/drivers/debug/log/src/cmd.o + .debug_ranges 0x0000000000000000 0x18 obj/drivers/debug/log/src/cmd.o + .debug_line 0x0000000000000000 0xe5 obj/drivers/debug/log/src/cmd.o + .debug_str 0x0000000000000000 0x4eb obj/drivers/debug/log/src/cmd.o + .comment 0x0000000000000000 0x2a obj/drivers/debug/log/src/cmd.o + .debug_frame 0x0000000000000000 0x54 obj/drivers/debug/log/src/cmd.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/debug/log/src/cmd.o + .text 0x0000000000000000 0x0 obj/drivers/debug/log/src/cmd_common.o + .data 0x0000000000000000 0x0 obj/drivers/debug/log/src/cmd_common.o + .bss 0x0000000000000000 0x0 obj/drivers/debug/log/src/cmd_common.o + .text.CmdParserParam + 0x0000000000000000 0xf0 obj/drivers/debug/log/src/cmd_common.o + .debug_info 0x0000000000000000 0x8f obj/drivers/debug/log/src/cmd_common.o + .debug_abbrev 0x0000000000000000 0x69 obj/drivers/debug/log/src/cmd_common.o + .debug_aranges + 0x0000000000000000 0x20 obj/drivers/debug/log/src/cmd_common.o + .debug_ranges 0x0000000000000000 0x10 obj/drivers/debug/log/src/cmd_common.o + .debug_line 0x0000000000000000 0xe4 obj/drivers/debug/log/src/cmd_common.o + .debug_str 0x0000000000000000 0x461 obj/drivers/debug/log/src/cmd_common.o + .comment 0x0000000000000000 0x2a obj/drivers/debug/log/src/cmd_common.o + .debug_frame 0x0000000000000000 0x30 obj/drivers/debug/log/src/cmd_common.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/debug/log/src/cmd_common.o + .text 0x0000000000000000 0x0 obj/drivers/debug/log/src/config.o + .data 0x0000000000000000 0x0 obj/drivers/debug/log/src/config.o + .bss 0x0000000000000000 0x0 obj/drivers/debug/log/src/config.o + .rodata 0x0000000000000000 0x16b obj/drivers/debug/log/src/config.o + .text.ExtLoadRead + 0x0000000000000000 0x98 obj/drivers/debug/log/src/config.o + .text.ExtLoadWrite + 0x0000000000000000 0x94 obj/drivers/debug/log/src/config.o + .bss.g_dataItem + 0x0000000000000000 0x100 obj/drivers/debug/log/src/config.o + .text.ExtConfigRead + 0x0000000000000000 0xb0 obj/drivers/debug/log/src/config.o + .text.ExtConfigWrite + 0x0000000000000000 0xb0 obj/drivers/debug/log/src/config.o + .debug_info 0x0000000000000000 0x282 obj/drivers/debug/log/src/config.o + .debug_abbrev 0x0000000000000000 0x12f obj/drivers/debug/log/src/config.o + .debug_aranges + 0x0000000000000000 0x38 obj/drivers/debug/log/src/config.o + .debug_ranges 0x0000000000000000 0x28 obj/drivers/debug/log/src/config.o + .debug_line 0x0000000000000000 0x2eb obj/drivers/debug/log/src/config.o + .debug_str 0x0000000000000000 0x58f obj/drivers/debug/log/src/config.o + .comment 0x0000000000000000 0x2a obj/drivers/debug/log/src/config.o + .debug_frame 0x0000000000000000 0xa0 obj/drivers/debug/log/src/config.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/debug/log/src/config.o + .text 0x0000000000000000 0x0 obj/drivers/debug/log/src/console.o + .data 0x0000000000000000 0x0 obj/drivers/debug/log/src/console.o + .bss 0x0000000000000000 0x0 obj/drivers/debug/log/src/console.o + .bss.g_console_uart + 0x0000000000000000 0x80 obj/drivers/debug/log/src/console.o + .text.QueryUartRxStatus + 0x0000000000000000 0x2e obj/drivers/debug/log/src/console.o + .text.ConsolePutc + 0x0000000000000000 0x78 obj/drivers/debug/log/src/console.o + .text.ConsolePuts + 0x0000000000000000 0x50 obj/drivers/debug/log/src/console.o + .text.ConsoleGetc + 0x0000000000000000 0x4a obj/drivers/debug/log/src/console.o + .text.ConsoleGetQuery + 0x0000000000000000 0x32 obj/drivers/debug/log/src/console.o + .text.DBG_Pow 0x0000000000000000 0x40 obj/drivers/debug/log/src/console.o + .text.DBG_CountDigits + 0x0000000000000000 0x56 obj/drivers/debug/log/src/console.o + .text.DBG_PutUnsignedNum + 0x0000000000000000 0xde obj/drivers/debug/log/src/console.o + .text.DBG_PrintInt + 0x0000000000000000 0x76 obj/drivers/debug/log/src/console.o + .text.DBG_PrintHex + 0x0000000000000000 0x56 obj/drivers/debug/log/src/console.o + .text.DBG_PrintFlt + 0x0000000000000000 0x166 obj/drivers/debug/log/src/console.o + .text.ParseSpecifier + 0x0000000000000000 0x1d0 obj/drivers/debug/log/src/console.o + .rodata.ParseSpecifier + 0x0000000000000000 0x84 obj/drivers/debug/log/src/console.o + .text.DBG_PrintIntWithField + 0x0000000000000000 0x144 obj/drivers/debug/log/src/console.o + .text.DBG_Atoi + 0x0000000000000000 0x6a obj/drivers/debug/log/src/console.o + .text.UartPrintf + 0x0000000000000000 0x190 obj/drivers/debug/log/src/console.o + .text.ConsoleInit + 0x0000000000000000 0x3a obj/drivers/debug/log/src/console.o + .debug_info 0x0000000000000000 0x2968 obj/drivers/debug/log/src/console.o + .debug_abbrev 0x0000000000000000 0x33d obj/drivers/debug/log/src/console.o + .debug_aranges + 0x0000000000000000 0x98 obj/drivers/debug/log/src/console.o + .debug_ranges 0x0000000000000000 0x88 obj/drivers/debug/log/src/console.o + .debug_line 0x0000000000000000 0x70c obj/drivers/debug/log/src/console.o + .debug_str 0x0000000000000000 0x20da obj/drivers/debug/log/src/console.o + .comment 0x0000000000000000 0x2a obj/drivers/debug/log/src/console.o + .debug_frame 0x0000000000000000 0x250 obj/drivers/debug/log/src/console.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/debug/log/src/console.o + .text 0x0000000000000000 0x0 obj/drivers/debug/log/src/dfx_debug.o + .data 0x0000000000000000 0x0 obj/drivers/debug/log/src/dfx_debug.o + .bss 0x0000000000000000 0x0 obj/drivers/debug/log/src/dfx_debug.o + .text.ExtSetDebugMode + 0x0000000000000000 0x3e obj/drivers/debug/log/src/dfx_debug.o + .debug_info 0x0000000000000000 0x1b4 obj/drivers/debug/log/src/dfx_debug.o + .debug_abbrev 0x0000000000000000 0xcf obj/drivers/debug/log/src/dfx_debug.o + .debug_aranges + 0x0000000000000000 0x20 obj/drivers/debug/log/src/dfx_debug.o + .debug_ranges 0x0000000000000000 0x10 obj/drivers/debug/log/src/dfx_debug.o + .debug_line 0x0000000000000000 0xc1 obj/drivers/debug/log/src/dfx_debug.o + .debug_str 0x0000000000000000 0x58e obj/drivers/debug/log/src/dfx_debug.o + .comment 0x0000000000000000 0x2a obj/drivers/debug/log/src/dfx_debug.o + .debug_frame 0x0000000000000000 0x34 obj/drivers/debug/log/src/dfx_debug.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/debug/log/src/dfx_debug.o + .text 0x0000000000000000 0x0 obj/drivers/debug/log/src/dfx_log.o + .data 0x0000000000000000 0x0 obj/drivers/debug/log/src/dfx_log.o + .bss 0x0000000000000000 0x0 obj/drivers/debug/log/src/dfx_log.o + .bss.g_memoryLog + 0x0000000000000000 0x40c obj/drivers/debug/log/src/dfx_log.o + .rodata 0x0000000000000000 0x1b7 obj/drivers/debug/log/src/dfx_log.o + .data.moduleStr + 0x0000000000000000 0x34 obj/drivers/debug/log/src/dfx_log.o + .data.ExtLogLevel1 + 0x0000000000000000 0x18 obj/drivers/debug/log/src/dfx_log.o + .bss.g_logCtx 0x0000000000000000 0x448 obj/drivers/debug/log/src/dfx_log.o + .text.GetLogCtx + 0x0000000000000000 0x16 obj/drivers/debug/log/src/dfx_log.o + .data.g_debugSwitch + 0x0000000000000000 0x44c obj/drivers/debug/log/src/dfx_log.o + .text.GetDebugSwitch + 0x0000000000000000 0x16 obj/drivers/debug/log/src/dfx_log.o + .text.InitMemoryData + 0x0000000000000000 0x2a obj/drivers/debug/log/src/dfx_log.o + .text.GetMemoryData + 0x0000000000000000 0x16 obj/drivers/debug/log/src/dfx_log.o + .text.LogCtxInit + 0x0000000000000000 0x52 obj/drivers/debug/log/src/dfx_log.o + .text.PutLogToMem + 0x0000000000000000 0x15a obj/drivers/debug/log/src/dfx_log.o + .text.CountNumberLen + 0x0000000000000000 0x38 obj/drivers/debug/log/src/dfx_log.o + .text.IsLogOutBufLegal + 0x0000000000000000 0x64 obj/drivers/debug/log/src/dfx_log.o + .text.ExtDrvLogOutBuf + 0x0000000000000000 0x256 obj/drivers/debug/log/src/dfx_log.o + .text.CmdGetVersionInfo + 0x0000000000000000 0x38 obj/drivers/debug/log/src/dfx_log.o + .text.DealLogBuf + 0x0000000000000000 0xdc obj/drivers/debug/log/src/dfx_log.o + .text.ExtDrvLogOut0 + 0x0000000000000000 0xb6 obj/drivers/debug/log/src/dfx_log.o + .text.ExtDrvLogOut1 + 0x0000000000000000 0xbc obj/drivers/debug/log/src/dfx_log.o + .text.ExtDrvLogOut2 + 0x0000000000000000 0xc4 obj/drivers/debug/log/src/dfx_log.o + .text.ExtDrvLogOut3 + 0x0000000000000000 0xcc obj/drivers/debug/log/src/dfx_log.o + .text.ExtDrvLogSetLogLevel + 0x0000000000000000 0x76 obj/drivers/debug/log/src/dfx_log.o + .text.ExtDrvLogOutFmt + 0x0000000000000000 0x126 obj/drivers/debug/log/src/dfx_log.o + .debug_info 0x0000000000000000 0x8de obj/drivers/debug/log/src/dfx_log.o + .debug_abbrev 0x0000000000000000 0x240 obj/drivers/debug/log/src/dfx_log.o + .debug_aranges + 0x0000000000000000 0xa0 obj/drivers/debug/log/src/dfx_log.o + .debug_ranges 0x0000000000000000 0x90 obj/drivers/debug/log/src/dfx_log.o + .debug_line 0x0000000000000000 0x788 obj/drivers/debug/log/src/dfx_log.o + .debug_str 0x0000000000000000 0x8b4 obj/drivers/debug/log/src/dfx_log.o + .comment 0x0000000000000000 0x2a obj/drivers/debug/log/src/dfx_log.o + .debug_frame 0x0000000000000000 0x274 obj/drivers/debug/log/src/dfx_log.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/debug/log/src/dfx_log.o + .text 0x0000000000000000 0x0 obj/drivers/debug/log/src/dfx_log_proc.o + .data 0x0000000000000000 0x0 obj/drivers/debug/log/src/dfx_log_proc.o + .bss 0x0000000000000000 0x0 obj/drivers/debug/log/src/dfx_log_proc.o + .rodata 0x0000000000000000 0x243 obj/drivers/debug/log/src/dfx_log_proc.o + .text.DrvLogShowLogLevel + 0x0000000000000000 0x11a obj/drivers/debug/log/src/dfx_log_proc.o + .text.DrvLogPutLogToMem + 0x0000000000000000 0xb2 obj/drivers/debug/log/src/dfx_log_proc.o + .text.DrvLogPrintMemLog + 0x0000000000000000 0xe0 obj/drivers/debug/log/src/dfx_log_proc.o + .text.DrvLogCmdHelp + 0x0000000000000000 0x62 obj/drivers/debug/log/src/dfx_log_proc.o + .text.DrvLogCmd + 0x0000000000000000 0x1a8 obj/drivers/debug/log/src/dfx_log_proc.o + .text.DfxCmdRegister + 0x0000000000000000 0x2a obj/drivers/debug/log/src/dfx_log_proc.o + .debug_info 0x0000000000000000 0x378 obj/drivers/debug/log/src/dfx_log_proc.o + .debug_abbrev 0x0000000000000000 0x159 obj/drivers/debug/log/src/dfx_log_proc.o + .debug_aranges + 0x0000000000000000 0x48 obj/drivers/debug/log/src/dfx_log_proc.o + .debug_ranges 0x0000000000000000 0x38 obj/drivers/debug/log/src/dfx_log_proc.o + .debug_line 0x0000000000000000 0x341 obj/drivers/debug/log/src/dfx_log_proc.o + .debug_str 0x0000000000000000 0x745 obj/drivers/debug/log/src/dfx_log_proc.o + .comment 0x0000000000000000 0x2a obj/drivers/debug/log/src/dfx_log_proc.o + .debug_frame 0x0000000000000000 0xf0 obj/drivers/debug/log/src/dfx_log_proc.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/debug/log/src/dfx_log_proc.o + .text 0x0000000000000000 0x0 obj/drivers/debug/log/src/event.o + .data 0x0000000000000000 0x0 obj/drivers/debug/log/src/event.o + .bss 0x0000000000000000 0x0 obj/drivers/debug/log/src/event.o + .bss.g_userMgr + 0x0000000000000000 0x2c obj/drivers/debug/log/src/event.o + .rodata 0x0000000000000000 0x26 obj/drivers/debug/log/src/event.o + .text.UserReport + 0x0000000000000000 0x5e obj/drivers/debug/log/src/event.o + .text.UserGetEventObj + 0x0000000000000000 0x52 obj/drivers/debug/log/src/event.o + .text.UserReportEvent + 0x0000000000000000 0x56 obj/drivers/debug/log/src/event.o + .text.EventInit + 0x0000000000000000 0x10 obj/drivers/debug/log/src/event.o + .debug_info 0x0000000000000000 0x2e2 obj/drivers/debug/log/src/event.o + .debug_abbrev 0x0000000000000000 0x156 obj/drivers/debug/log/src/event.o + .debug_aranges + 0x0000000000000000 0x38 obj/drivers/debug/log/src/event.o + .debug_ranges 0x0000000000000000 0x28 obj/drivers/debug/log/src/event.o + .debug_line 0x0000000000000000 0x14c obj/drivers/debug/log/src/event.o + .debug_str 0x0000000000000000 0x5bd obj/drivers/debug/log/src/event.o + .comment 0x0000000000000000 0x2a obj/drivers/debug/log/src/event.o + .debug_frame 0x0000000000000000 0x98 obj/drivers/debug/log/src/event.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/debug/log/src/event.o + .text 0x0000000000000000 0x0 obj/drivers/debug/log/src/ext_command.o + .data 0x0000000000000000 0x0 obj/drivers/debug/log/src/ext_command.o + .bss 0x0000000000000000 0x0 obj/drivers/debug/log/src/ext_command.o + .text.ExtCmdFindCmd + 0x0000000000000000 0xfc obj/drivers/debug/log/src/ext_command.o + .text.IsFindMatchCmdParamLegal + 0x0000000000000000 0x3e obj/drivers/debug/log/src/ext_command.o + .rodata 0x0000000000000000 0xd obj/drivers/debug/log/src/ext_command.o + .text.ExtCmdFindMatchCmd + 0x0000000000000000 0x162 obj/drivers/debug/log/src/ext_command.o + .debug_info 0x0000000000000000 0x291 obj/drivers/debug/log/src/ext_command.o + .debug_abbrev 0x0000000000000000 0x133 obj/drivers/debug/log/src/ext_command.o + .debug_aranges + 0x0000000000000000 0x30 obj/drivers/debug/log/src/ext_command.o + .debug_ranges 0x0000000000000000 0x20 obj/drivers/debug/log/src/ext_command.o + .debug_line 0x0000000000000000 0x305 obj/drivers/debug/log/src/ext_command.o + .debug_str 0x0000000000000000 0x545 obj/drivers/debug/log/src/ext_command.o + .comment 0x0000000000000000 0x2a obj/drivers/debug/log/src/ext_command.o + .debug_frame 0x0000000000000000 0x7c obj/drivers/debug/log/src/ext_command.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/debug/log/src/ext_command.o + .text 0x0000000000000000 0x0 obj/drivers/debug/src/debug.o + .data 0x0000000000000000 0x0 obj/drivers/debug/src/debug.o + .bss 0x0000000000000000 0x0 obj/drivers/debug/src/debug.o + .bss.g_dbgUart + 0x0000000000000000 0x80 obj/drivers/debug/src/debug.o + .text.DBG_UartPrintInit + 0x0000000000000000 0xb2 obj/drivers/debug/src/debug.o + .text.DBG_UartPrintDeInit + 0x0000000000000000 0x24 obj/drivers/debug/src/debug.o + .text 0x0000000000000000 0x0 obj/drivers/dma/src/dma.o + .data 0x0000000000000000 0x0 obj/drivers/dma/src/dma.o + .bss 0x0000000000000000 0x0 obj/drivers/dma/src/dma.o + .text.IsDmaChannelNum + 0x0000000000000000 0x50 obj/drivers/dma/src/dma.o + .text.IsDmaWidth + 0x0000000000000000 0x32 obj/drivers/dma/src/dma.o + .text.IsDmaBurstLength + 0x0000000000000000 0x64 obj/drivers/dma/src/dma.o + .text.IsDmaAddrMode + 0x0000000000000000 0x2c obj/drivers/dma/src/dma.o + .text.IsDmaDirection + 0x0000000000000000 0x64 obj/drivers/dma/src/dma.o + .text.IsDmaReqPeriph + 0x0000000000000000 0x1c obj/drivers/dma/src/dma.o + .text.IsDmaValidAddress + 0x0000000000000000 0x4c obj/drivers/dma/src/dma.o + .bss.g_listTable + 0x0000000000000000 0x140 obj/drivers/dma/src/dma.o + .bss.g_listIndex + 0x0000000000000000 0x4 obj/drivers/dma/src/dma.o + .rodata 0x0000000000000000 0x19 obj/drivers/dma/src/dma.o + .text.HAL_DMA_Init + 0x0000000000000000 0x12e obj/drivers/dma/src/dma.o + .text.HAL_DMA_Deinit + 0x0000000000000000 0x10a obj/drivers/dma/src/dma.o + .text.HAL_DMA_GetChannelState + 0x0000000000000000 0xc4 obj/drivers/dma/src/dma.o + .text.HAL_DMA_InitChannel + 0x0000000000000000 0x370 obj/drivers/dma/src/dma.o + .text.DMA_SetSrcPeriph + 0x0000000000000000 0x66 obj/drivers/dma/src/dma.o + .text.DMA_SetDestPeriph + 0x0000000000000000 0x66 obj/drivers/dma/src/dma.o + .text.DMA_SetDirection + 0x0000000000000000 0x1e2 obj/drivers/dma/src/dma.o + .rodata.DMA_SetDirection + 0x0000000000000000 0x20 obj/drivers/dma/src/dma.o + .text.DMA_CalControlval + 0x0000000000000000 0xe2 obj/drivers/dma/src/dma.o + .text.DMA_ConfigureSplit + 0x0000000000000000 0x154 obj/drivers/dma/src/dma.o + .text.DMA_SetChannelAndDirection + 0x0000000000000000 0x1cc obj/drivers/dma/src/dma.o + .text.DMA_SetChannel + 0x0000000000000000 0x26a obj/drivers/dma/src/dma.o + .text.HAL_DMA_Start + 0x0000000000000000 0x18a obj/drivers/dma/src/dma.o + .text.HAL_DMA_StartIT + 0x0000000000000000 0x16e obj/drivers/dma/src/dma.o + .text.HAL_DMA_StopChannel + 0x0000000000000000 0xe8 obj/drivers/dma/src/dma.o + .text.DMA_ChannelIrqHandlerTc + 0x0000000000000000 0x98 obj/drivers/dma/src/dma.o + .text.DMA_ChannelIrqHandlerError + 0x0000000000000000 0x98 obj/drivers/dma/src/dma.o + .text.HAL_DMA_IrqHandlerTc + 0x0000000000000000 0xaa obj/drivers/dma/src/dma.o + .text.HAL_DMA_IrqHandlerError + 0x0000000000000000 0xaa obj/drivers/dma/src/dma.o + .text.HAL_DMA_RegisterCallback + 0x0000000000000000 0xca obj/drivers/dma/src/dma.o + .text.DMA_FindListEndNode + 0x0000000000000000 0x32 obj/drivers/dma/src/dma.o + .text.HAL_DMA_ListAddNode + 0x0000000000000000 0x98 obj/drivers/dma/src/dma.o + .text.DMA_CreateNode + 0x0000000000000000 0xca obj/drivers/dma/src/dma.o + .text.DMA_SplitToBlock + 0x0000000000000000 0xc0 obj/drivers/dma/src/dma.o + .text.HAL_DMA_InitNewNode + 0x0000000000000000 0x398 obj/drivers/dma/src/dma.o + .text.HAL_DMA_StartListTransfer + 0x0000000000000000 0x1a6 obj/drivers/dma/src/dma.o + .text.HAL_DMA_QuickStart + 0x0000000000000000 0x12c obj/drivers/dma/src/dma.o + .debug_info 0x0000000000000000 0x1bee obj/drivers/dma/src/dma.o + .debug_abbrev 0x0000000000000000 0x2d1 obj/drivers/dma/src/dma.o + .debug_aranges + 0x0000000000000000 0x120 obj/drivers/dma/src/dma.o + .debug_ranges 0x0000000000000000 0x110 obj/drivers/dma/src/dma.o + .debug_line 0x0000000000000000 0x1115 obj/drivers/dma/src/dma.o + .debug_str 0x0000000000000000 0x1777 obj/drivers/dma/src/dma.o + .comment 0x0000000000000000 0x2a obj/drivers/dma/src/dma.o + .debug_frame 0x0000000000000000 0x4b4 obj/drivers/dma/src/dma.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/dma/src/dma.o + .text 0x0000000000000000 0x0 obj/drivers/dma/src/dma_ex.o + .data 0x0000000000000000 0x0 obj/drivers/dma/src/dma_ex.o + .bss 0x0000000000000000 0x0 obj/drivers/dma/src/dma_ex.o + .text.IsDmaChannelNum + 0x0000000000000000 0x50 obj/drivers/dma/src/dma_ex.o + .text.IsDmaPriority + 0x0000000000000000 0x3c obj/drivers/dma/src/dma_ex.o + .rodata 0x0000000000000000 0x1c obj/drivers/dma/src/dma_ex.o + .text.HAL_DMA_SetChannelPriorityEx + 0x0000000000000000 0xc0 obj/drivers/dma/src/dma_ex.o + .debug_info 0x0000000000000000 0x10d2 obj/drivers/dma/src/dma_ex.o + .debug_abbrev 0x0000000000000000 0x1c0 obj/drivers/dma/src/dma_ex.o + .debug_aranges + 0x0000000000000000 0x30 obj/drivers/dma/src/dma_ex.o + .debug_ranges 0x0000000000000000 0x20 obj/drivers/dma/src/dma_ex.o + .debug_line 0x0000000000000000 0x16e obj/drivers/dma/src/dma_ex.o + .debug_str 0x0000000000000000 0x1361 obj/drivers/dma/src/dma_ex.o + .comment 0x0000000000000000 0x2a obj/drivers/dma/src/dma_ex.o + .debug_frame 0x0000000000000000 0x74 obj/drivers/dma/src/dma_ex.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/dma/src/dma_ex.o + .text 0x0000000000000000 0x0 obj/drivers/flash/src/flash.o + .data 0x0000000000000000 0x0 obj/drivers/flash/src/flash.o + .bss 0x0000000000000000 0x0 obj/drivers/flash/src/flash.o + .text.IsFlashOperationMode + 0x0000000000000000 0x2c obj/drivers/flash/src/flash.o + .text.IsFlashWriteSrcAddress + 0x0000000000000000 0x4c obj/drivers/flash/src/flash.o + .text.IsFlashEraseMode + 0x0000000000000000 0x30 obj/drivers/flash/src/flash.o + .text.CheckErrorStatus + 0x0000000000000000 0x4c obj/drivers/flash/src/flash.o + .text.FlashPopulateDefaults + 0x0000000000000000 0x4a obj/drivers/flash/src/flash.o + .text.FLASH_WriteWords + 0x0000000000000000 0x1ea obj/drivers/flash/src/flash.o + .text.FLASH_GetWriteAlignmentWords + 0x0000000000000000 0x36 obj/drivers/flash/src/flash.o + .text.FLASH_EraseWithMode + 0x0000000000000000 0x142 obj/drivers/flash/src/flash.o + .text.FLASH_WriteHandler + 0x0000000000000000 0xee obj/drivers/flash/src/flash.o + .rodata 0x0000000000000000 0x1d obj/drivers/flash/src/flash.o + .text.FLASH_EraseHandler + 0x0000000000000000 0xd2 obj/drivers/flash/src/flash.o + .text.HAL_FLASH_Init + 0x0000000000000000 0xfe obj/drivers/flash/src/flash.o + .text.HAL_FLASH_DeInit + 0x0000000000000000 0x9e obj/drivers/flash/src/flash.o + .text.HAL_FLASH_RegisterCallback + 0x0000000000000000 0x66 obj/drivers/flash/src/flash.o + .text.FLASH_WritteBlockingErrorHandle + 0x0000000000000000 0x38 obj/drivers/flash/src/flash.o + .text.HAL_FLASH_WriteBlocking + 0x0000000000000000 0x2e6 obj/drivers/flash/src/flash.o + .text.HAL_FLASH_EraseBlocking + 0x0000000000000000 0x252 obj/drivers/flash/src/flash.o + .text.HAL_FLASH_WriteIT + 0x0000000000000000 0x22c obj/drivers/flash/src/flash.o + .text.HAL_FLASH_EraseIT + 0x0000000000000000 0x200 obj/drivers/flash/src/flash.o + .text.HAL_FLASH_Read + 0x0000000000000000 0x136 obj/drivers/flash/src/flash.o + .text.InterruptWriteHandle + 0x0000000000000000 0x130 obj/drivers/flash/src/flash.o + .text.InterruptEraseHandle + 0x0000000000000000 0x8e obj/drivers/flash/src/flash.o + .text.HAL_FLASH_IrqHandler + 0x0000000000000000 0x192 obj/drivers/flash/src/flash.o + .text.HAL_FLASH_IrqHandlerError + 0x0000000000000000 0xe2 obj/drivers/flash/src/flash.o + .debug_info 0x0000000000000000 0x1cf5 obj/drivers/flash/src/flash.o + .debug_abbrev 0x0000000000000000 0x2b0 obj/drivers/flash/src/flash.o + .debug_aranges + 0x0000000000000000 0xd0 obj/drivers/flash/src/flash.o + .debug_ranges 0x0000000000000000 0xc0 obj/drivers/flash/src/flash.o + .debug_line 0x0000000000000000 0xf2f obj/drivers/flash/src/flash.o + .debug_str 0x0000000000000000 0x1a6f obj/drivers/flash/src/flash.o + .comment 0x0000000000000000 0x2a obj/drivers/flash/src/flash.o + .debug_frame 0x0000000000000000 0x350 obj/drivers/flash/src/flash.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/flash/src/flash.o + .text 0x0000000000000000 0x0 obj/drivers/gpio/src/gpio.o + .data 0x0000000000000000 0x0 obj/drivers/gpio/src/gpio.o + .bss 0x0000000000000000 0x0 obj/drivers/gpio/src/gpio.o + .text.IsGpioValue + 0x0000000000000000 0x2c obj/drivers/gpio/src/gpio.o + .text.IsGpioDirection + 0x0000000000000000 0x2c obj/drivers/gpio/src/gpio.o + .text.IsGpioPins + 0x0000000000000000 0x30 obj/drivers/gpio/src/gpio.o + .text.IsGpioPin + 0x0000000000000000 0x7e obj/drivers/gpio/src/gpio.o + .text.IsGpioITMode + 0x0000000000000000 0x54 obj/drivers/gpio/src/gpio.o + .rodata 0x0000000000000000 0x3b obj/drivers/gpio/src/gpio.o + .text.DCL_GPIO_SetValue + 0x0000000000000000 0xf2 obj/drivers/gpio/src/gpio.o + .text.DCL_GPIO_SetDirection + 0x0000000000000000 0x114 obj/drivers/gpio/src/gpio.o + .text.DCL_GPIO_ClearIrq + 0x0000000000000000 0xb8 obj/drivers/gpio/src/gpio.o + .text.DCL_GPIO_EnableIrq + 0x0000000000000000 0xc8 obj/drivers/gpio/src/gpio.o + .text.DCL_GPIO_DisableIrq + 0x0000000000000000 0xbc obj/drivers/gpio/src/gpio.o + .text.DCL_GPIO_GetMIS + 0x0000000000000000 0x80 obj/drivers/gpio/src/gpio.o + .text.HAL_GPIO_Init + 0x0000000000000000 0xfe obj/drivers/gpio/src/gpio.o + .text.HAL_GPIO_DeInit + 0x0000000000000000 0xde obj/drivers/gpio/src/gpio.o + .text.HAL_GPIO_SetDirection + 0x0000000000000000 0x112 obj/drivers/gpio/src/gpio.o + .text.HAL_GPIO_SetValue + 0x0000000000000000 0x112 obj/drivers/gpio/src/gpio.o + .text.HAL_GPIO_GetPinValue + 0x0000000000000000 0xe2 obj/drivers/gpio/src/gpio.o + .text.HAL_GPIO_GetAllValue + 0x0000000000000000 0xaa obj/drivers/gpio/src/gpio.o + .text.HAL_GPIO_GetPinDirection + 0x0000000000000000 0xe2 obj/drivers/gpio/src/gpio.o + .text.HAL_GPIO_GetAllDirection + 0x0000000000000000 0xaa obj/drivers/gpio/src/gpio.o + .text.HAL_GPIO_TogglePin + 0x0000000000000000 0xf0 obj/drivers/gpio/src/gpio.o + .text.HAL_GPIO_GetPinIrqType + 0x0000000000000000 0x15a obj/drivers/gpio/src/gpio.o + .text.GPIO_SetLevelIrqType + 0x0000000000000000 0x96 obj/drivers/gpio/src/gpio.o + .text.GPIO_SetEdgeIrqType + 0x0000000000000000 0x9a obj/drivers/gpio/src/gpio.o + .text.HAL_GPIO_SetIrqType + 0x0000000000000000 0x244 obj/drivers/gpio/src/gpio.o + .text.GPIO_ExcuteCallBack + 0x0000000000000000 0x11e obj/drivers/gpio/src/gpio.o + .text.HAL_GPIO_IrqHandler + 0x0000000000000000 0x124 obj/drivers/gpio/src/gpio.o + .text.HAL_GPIO_RegisterCallBack + 0x0000000000000000 0x110 obj/drivers/gpio/src/gpio.o + .debug_info 0x0000000000000000 0x1006 obj/drivers/gpio/src/gpio.o + .debug_abbrev 0x0000000000000000 0x2c6 obj/drivers/gpio/src/gpio.o + .debug_aranges + 0x0000000000000000 0xf0 obj/drivers/gpio/src/gpio.o + .debug_ranges 0x0000000000000000 0xe0 obj/drivers/gpio/src/gpio.o + .debug_line 0x0000000000000000 0xfec obj/drivers/gpio/src/gpio.o + .debug_str 0x0000000000000000 0xa0b obj/drivers/gpio/src/gpio.o + .comment 0x0000000000000000 0x2a obj/drivers/gpio/src/gpio.o + .debug_frame 0x0000000000000000 0x3e0 obj/drivers/gpio/src/gpio.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/gpio/src/gpio.o + .text 0x0000000000000000 0x0 obj/drivers/gpt/src/gpt.o + .data 0x0000000000000000 0x0 obj/drivers/gpt/src/gpt.o + .bss 0x0000000000000000 0x0 obj/drivers/gpt/src/gpt.o + .text.IsGptPwmNum + 0x0000000000000000 0x1c obj/drivers/gpt/src/gpt.o + .text.IsGptDiv + 0x0000000000000000 0x1e obj/drivers/gpt/src/gpt.o + .text.IsGptPeriod + 0x0000000000000000 0x30 obj/drivers/gpt/src/gpt.o + .text.IsGptRefDot + 0x0000000000000000 0x1e obj/drivers/gpt/src/gpt.o + .text.IsGptAction + 0x0000000000000000 0x1c obj/drivers/gpt/src/gpt.o + .text.IsGptSetOption + 0x0000000000000000 0x2c obj/drivers/gpt/src/gpt.o + .text.GPT_GetKeepState + 0x0000000000000000 0x28 obj/drivers/gpt/src/gpt.o + .rodata 0x0000000000000000 0x19 obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_Init + 0x0000000000000000 0xa6 obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_Start + 0x0000000000000000 0x9a obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_Stop + 0x0000000000000000 0x98 obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_Config + 0x0000000000000000 0x378 obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_GetConfig + 0x0000000000000000 0x1b2 obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_SetReferCounterAndAction + 0x0000000000000000 0x130 obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_GetReferCounterAndAction + 0x0000000000000000 0xec obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_SetCountPeriod + 0x0000000000000000 0xea obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_GetCountPeriod + 0x0000000000000000 0x92 obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_SetDivFactor + 0x0000000000000000 0xe6 obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_GetDivFactor + 0x0000000000000000 0x9a obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_SetBufferLoad + 0x0000000000000000 0xe8 obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_GetBufferLoadStatus + 0x0000000000000000 0x8a obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_SetOutFinishInt + 0x0000000000000000 0xea obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_SetPeriodInt + 0x0000000000000000 0xe8 obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_IrqOutFinishHandler + 0x0000000000000000 0xca obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_IrqPeriodHandler + 0x0000000000000000 0xc6 obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_RegisterCallBack + 0x0000000000000000 0xb6 obj/drivers/gpt/src/gpt.o + .debug_info 0x0000000000000000 0x1197 obj/drivers/gpt/src/gpt.o + .debug_abbrev 0x0000000000000000 0x253 obj/drivers/gpt/src/gpt.o + .debug_aranges + 0x0000000000000000 0xe0 obj/drivers/gpt/src/gpt.o + .debug_ranges 0x0000000000000000 0xd0 obj/drivers/gpt/src/gpt.o + .debug_line 0x0000000000000000 0xc6a obj/drivers/gpt/src/gpt.o + .debug_str 0x0000000000000000 0xdbe obj/drivers/gpt/src/gpt.o + .comment 0x0000000000000000 0x2a obj/drivers/gpt/src/gpt.o + .debug_frame 0x0000000000000000 0x384 obj/drivers/gpt/src/gpt.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/gpt/src/gpt.o + .text 0x0000000000000000 0x0 obj/drivers/gpt/src/gpt_ex.o + .data 0x0000000000000000 0x0 obj/drivers/gpt/src/gpt_ex.o + .bss 0x0000000000000000 0x0 obj/drivers/gpt/src/gpt_ex.o + .text.IsGptSetOption + 0x0000000000000000 0x2c obj/drivers/gpt/src/gpt_ex.o + .rodata 0x0000000000000000 0x1c obj/drivers/gpt/src/gpt_ex.o + .text.HAL_GPT_GetCounterValueEx + 0x0000000000000000 0x92 obj/drivers/gpt/src/gpt_ex.o + .text.HAL_GPT_TriggerDMAEnableEx + 0x0000000000000000 0x122 obj/drivers/gpt/src/gpt_ex.o + .text.HAL_GPT_TriggerDMADisableEx + 0x0000000000000000 0x11e obj/drivers/gpt/src/gpt_ex.o + .text.HAL_GPT_TriggerADCEnableEx + 0x0000000000000000 0xf2 obj/drivers/gpt/src/gpt_ex.o + .text.HAL_GPT_TriggerADCDisableEx + 0x0000000000000000 0xea obj/drivers/gpt/src/gpt_ex.o + .text.HAL_GPT_GetCurrentPWM0NumberEx + 0x0000000000000000 0x98 obj/drivers/gpt/src/gpt_ex.o + .text.HAL_GPT_SoftInjOutFinIntEx + 0x0000000000000000 0xea obj/drivers/gpt/src/gpt_ex.o + .text.HAL_GPT_SoftInjPeriodFinIntEx + 0x0000000000000000 0xe8 obj/drivers/gpt/src/gpt_ex.o + .debug_info 0x0000000000000000 0xe34 obj/drivers/gpt/src/gpt_ex.o + .debug_abbrev 0x0000000000000000 0x1aa obj/drivers/gpt/src/gpt_ex.o + .debug_aranges + 0x0000000000000000 0x60 obj/drivers/gpt/src/gpt_ex.o + .debug_ranges 0x0000000000000000 0x50 obj/drivers/gpt/src/gpt_ex.o + .debug_line 0x0000000000000000 0x5cd obj/drivers/gpt/src/gpt_ex.o + .debug_str 0x0000000000000000 0xcf1 obj/drivers/gpt/src/gpt_ex.o + .comment 0x0000000000000000 0x2a obj/drivers/gpt/src/gpt_ex.o + .debug_frame 0x0000000000000000 0x158 obj/drivers/gpt/src/gpt_ex.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/gpt/src/gpt_ex.o + .text 0x0000000000000000 0x0 obj/drivers/i2c/src/i2c.o + .data 0x0000000000000000 0x0 obj/drivers/i2c/src/i2c.o + .bss 0x0000000000000000 0x0 obj/drivers/i2c/src/i2c.o + .text.DCL_SYSTICK_GetTick + 0x0000000000000000 0x14 obj/drivers/i2c/src/i2c.o + .text.IsI2cFunctionMode + 0x0000000000000000 0x40 obj/drivers/i2c/src/i2c.o + .text.IsI2cAddressMode + 0x0000000000000000 0x2c obj/drivers/i2c/src/i2c.o + .text.IsI2cSdaHoldTime + 0x0000000000000000 0x1e obj/drivers/i2c/src/i2c.o + .text.IsI2cGeneralCallMode + 0x0000000000000000 0x2c obj/drivers/i2c/src/i2c.o + .text.IsI2cOwnAddressOrMask + 0x0000000000000000 0x1c obj/drivers/i2c/src/i2c.o + .text.IsXMBusAddressOrMask + 0x0000000000000000 0x1c obj/drivers/i2c/src/i2c.o + .text.IsXMBusAddressEnable + 0x0000000000000000 0x2c obj/drivers/i2c/src/i2c.o + .text.IsI2cSpikeFilterTime + 0x0000000000000000 0x1c obj/drivers/i2c/src/i2c.o + .text.IsI2cFreq + 0x0000000000000000 0x1c obj/drivers/i2c/src/i2c.o + .text.IsI2cIgnoreAckFlag + 0x0000000000000000 0x2c obj/drivers/i2c/src/i2c.o + .text.IsI2cTxWaterMark + 0x0000000000000000 0x1c obj/drivers/i2c/src/i2c.o + .text.IsI2cRxWaterMark + 0x0000000000000000 0x1c obj/drivers/i2c/src/i2c.o + .text.IsI2cSdaDelayTime + 0x0000000000000000 0x1c obj/drivers/i2c/src/i2c.o + .bss.g_internalConfigParam + 0x0000000000000000 0x18 obj/drivers/i2c/src/i2c.o + .bss.g_internalTxBuffDMA + 0x0000000000000000 0x2000 obj/drivers/i2c/src/i2c.o + .bss.g_dmaTransferSize + 0x0000000000000000 0x4 obj/drivers/i2c/src/i2c.o + .rodata 0x0000000000000000 0x19 obj/drivers/i2c/src/i2c.o + .text.CheckAllInitParameters + 0x0000000000000000 0x2ee obj/drivers/i2c/src/i2c.o + .text.SetSlaveDevAddr + 0x0000000000000000 0xa4 obj/drivers/i2c/src/i2c.o + .text.I2cBusClear + 0x0000000000000000 0x144 obj/drivers/i2c/src/i2c.o + .text.SetErrorHandling + 0x0000000000000000 0x8a obj/drivers/i2c/src/i2c.o + .text.CheckItemStatus + 0x0000000000000000 0xf2 obj/drivers/i2c/src/i2c.o + .rodata.CheckItemStatus + 0x0000000000000000 0x14 obj/drivers/i2c/src/i2c.o + .text.WaitStatusReady + 0x0000000000000000 0x158 obj/drivers/i2c/src/i2c.o + .text.SetTxFIFODataAndCmd + 0x0000000000000000 0x70 obj/drivers/i2c/src/i2c.o + .text.SendSlaveAddressWriteCmd + 0x0000000000000000 0x12c obj/drivers/i2c/src/i2c.o + .text.SendSlaveAddressReadCmd + 0x0000000000000000 0x130 obj/drivers/i2c/src/i2c.o + .text.I2C_ConfigParametersAndStartBlocking + 0x0000000000000000 0xae obj/drivers/i2c/src/i2c.o + .text.BlockingSendStopCommand + 0x0000000000000000 0x70 obj/drivers/i2c/src/i2c.o + .text.BlockingMasterRxDataOptStepNormal + 0x0000000000000000 0xe2 obj/drivers/i2c/src/i2c.o + .text.BlockingMasterTxDataOptStepNormal + 0x0000000000000000 0x80 obj/drivers/i2c/src/i2c.o + .text.BlockingSlaveRxDataOptStepNormal + 0x0000000000000000 0xa4 obj/drivers/i2c/src/i2c.o + .text.IsInterruptErrorStatus + 0x0000000000000000 0x94 obj/drivers/i2c/src/i2c.o + .text.InterruptSendStart + 0x0000000000000000 0xdc obj/drivers/i2c/src/i2c.o + .text.InterruptAllDoneHandle + 0x0000000000000000 0xea obj/drivers/i2c/src/i2c.o + .text.InterruptMasterTxHandle + 0x0000000000000000 0x110 obj/drivers/i2c/src/i2c.o + .text.InterruptMasterRxHandle + 0x0000000000000000 0x190 obj/drivers/i2c/src/i2c.o + .text.InterruptSlaveTxHandle + 0x0000000000000000 0x132 obj/drivers/i2c/src/i2c.o + .text.InterruptSlaveRxHandle + 0x0000000000000000 0x14e obj/drivers/i2c/src/i2c.o + .text.InterruptHandle + 0x0000000000000000 0x136 obj/drivers/i2c/src/i2c.o + .text.DmaConfigCommandData + 0x0000000000000000 0x60 obj/drivers/i2c/src/i2c.o + .text.DmaMasterConfigDataAndCmd + 0x0000000000000000 0xa6 obj/drivers/i2c/src/i2c.o + .text.DmaSlaveConfigDataAndCmd + 0x0000000000000000 0xa6 obj/drivers/i2c/src/i2c.o + .text.I2C_DmaErrorHandle + 0x0000000000000000 0x76 obj/drivers/i2c/src/i2c.o + .text.I2C_DmaDoneHandle + 0x0000000000000000 0xb4 obj/drivers/i2c/src/i2c.o + .text.DmaWaitHandleFinish + 0x0000000000000000 0x134 obj/drivers/i2c/src/i2c.o + .text.DmaOptStepNormalFinishFun + 0x0000000000000000 0x1d4 obj/drivers/i2c/src/i2c.o + .text.DmaErrorHandlerFun + 0x0000000000000000 0xf2 obj/drivers/i2c/src/i2c.o + .text.DmaMasterReadData + 0x0000000000000000 0x152 obj/drivers/i2c/src/i2c.o + .text.DmaMasterWriteData + 0x0000000000000000 0xe2 obj/drivers/i2c/src/i2c.o + .text.DmaSlaveReadData + 0x0000000000000000 0x152 obj/drivers/i2c/src/i2c.o + .text.DmaSlaveWriteData + 0x0000000000000000 0xe2 obj/drivers/i2c/src/i2c.o + .text.I2cTransferDataDma + 0x0000000000000000 0x122 obj/drivers/i2c/src/i2c.o + .text.I2C_SlaveMultiplexIT + 0x0000000000000000 0xb6 obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_Init + 0x0000000000000000 0x2f8 obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_Deinit + 0x0000000000000000 0xb4 obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_RegisterCallback + 0x0000000000000000 0x106 obj/drivers/i2c/src/i2c.o + .rodata.HAL_I2C_RegisterCallback + 0x0000000000000000 0x14 obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_MasterReadBlocking + 0x0000000000000000 0x25a obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_MasterWriteBlocking + 0x0000000000000000 0x25a obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_SlaveReadBlocking + 0x0000000000000000 0x1ac obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_SlaveWriteBlocking + 0x0000000000000000 0x234 obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_MasterReadIT + 0x0000000000000000 0x1c4 obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_MasterWriteIT + 0x0000000000000000 0x1ce obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_SlaveReadIT + 0x0000000000000000 0xf0 obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_SlaveWriteIT + 0x0000000000000000 0xf0 obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_MasterReadDMA + 0x0000000000000000 0x2bc obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_MasterWriteDMA + 0x0000000000000000 0x266 obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_SlaveReadDMA + 0x0000000000000000 0x20e obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_SlaveWriteDMA + 0x0000000000000000 0x1c2 obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_IrqHandler + 0x0000000000000000 0x140 obj/drivers/i2c/src/i2c.o + .debug_info 0x0000000000000000 0x388a obj/drivers/i2c/src/i2c.o + .debug_abbrev 0x0000000000000000 0x312 obj/drivers/i2c/src/i2c.o + .debug_aranges + 0x0000000000000000 0x228 obj/drivers/i2c/src/i2c.o + .debug_ranges 0x0000000000000000 0x218 obj/drivers/i2c/src/i2c.o + .debug_line 0x0000000000000000 0x272f obj/drivers/i2c/src/i2c.o + .debug_str 0x0000000000000000 0x2a76 obj/drivers/i2c/src/i2c.o + .comment 0x0000000000000000 0x2a obj/drivers/i2c/src/i2c.o + .debug_frame 0x0000000000000000 0x964 obj/drivers/i2c/src/i2c.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/i2c/src/i2c.o + .text 0x0000000000000000 0x0 obj/drivers/i2c/src/i2c_ex.o + .data 0x0000000000000000 0x0 obj/drivers/i2c/src/i2c_ex.o + .bss 0x0000000000000000 0x0 obj/drivers/i2c/src/i2c_ex.o + .text.IsI2cOwnAddressOrMask + 0x0000000000000000 0x1c obj/drivers/i2c/src/i2c_ex.o + .text.IsXMBusAddressOrMask + 0x0000000000000000 0x1c obj/drivers/i2c/src/i2c_ex.o + .text.IsI2cDataTransferSequence + 0x0000000000000000 0x2c obj/drivers/i2c/src/i2c_ex.o + .text.IsI2cClockStretchValue + 0x0000000000000000 0x2c obj/drivers/i2c/src/i2c_ex.o + .text.IsI2cSclLowTimeout + 0x0000000000000000 0x20 obj/drivers/i2c/src/i2c_ex.o + .text.IsI2cBusFreeTime + 0x0000000000000000 0x1e obj/drivers/i2c/src/i2c_ex.o + .rodata 0x0000000000000000 0x1c obj/drivers/i2c/src/i2c_ex.o + .text.HAL_I2C_SetDataTransferSequenceEx + 0x0000000000000000 0xb4 obj/drivers/i2c/src/i2c_ex.o + .text.HAL_I2C_SetSclStretchModeEx + 0x0000000000000000 0xb6 obj/drivers/i2c/src/i2c_ex.o + .text.HAL_I2C_SetSclLowTimeoutEx + 0x0000000000000000 0xc4 obj/drivers/i2c/src/i2c_ex.o + .text.HAL_I2C_SetBusFreeTimeEx + 0x0000000000000000 0xbc obj/drivers/i2c/src/i2c_ex.o + .text.HAL_I2C_Set10BitSlaveEnableEx + 0x0000000000000000 0x76 obj/drivers/i2c/src/i2c_ex.o + .text.HAL_I2C_SetDeviceIdAddressEnableEx + 0x0000000000000000 0x76 obj/drivers/i2c/src/i2c_ex.o + .text.HAL_I2C_SetStartByteEnableEx + 0x0000000000000000 0x76 obj/drivers/i2c/src/i2c_ex.o + .text.HAL_I2C_SetOwnAddressMaskEx + 0x0000000000000000 0xc0 obj/drivers/i2c/src/i2c_ex.o + .text.HAL_I2C_SetOwnXmbAddressMaskEx + 0x0000000000000000 0xc0 obj/drivers/i2c/src/i2c_ex.o + .debug_info 0x0000000000000000 0x2578 obj/drivers/i2c/src/i2c_ex.o + .debug_abbrev 0x0000000000000000 0x20f obj/drivers/i2c/src/i2c_ex.o + .debug_aranges + 0x0000000000000000 0x90 obj/drivers/i2c/src/i2c_ex.o + .debug_ranges 0x0000000000000000 0x80 obj/drivers/i2c/src/i2c_ex.o + .debug_line 0x0000000000000000 0x541 obj/drivers/i2c/src/i2c_ex.o + .debug_str 0x0000000000000000 0x2228 obj/drivers/i2c/src/i2c_ex.o + .comment 0x0000000000000000 0x2a obj/drivers/i2c/src/i2c_ex.o + .debug_frame 0x0000000000000000 0x214 obj/drivers/i2c/src/i2c_ex.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/i2c/src/i2c_ex.o + .text 0x0000000000000000 0x0 obj/drivers/iocmg/src/iocmg.o + .data 0x0000000000000000 0x0 obj/drivers/iocmg/src/iocmg.o + .bss 0x0000000000000000 0x0 obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_GetFuncMode + 0x0000000000000000 0x46 obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_GetDriveRate + 0x0000000000000000 0x48 obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_GetPullMode + 0x0000000000000000 0x6a obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_GetLevelShiftRate + 0x0000000000000000 0x48 obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_GetSchmidtMode + 0x0000000000000000 0x48 obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_SetOscClkOutputMode + 0x0000000000000000 0x5c obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_GetOscClkOutputMode + 0x0000000000000000 0x26 obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_SetOscClkFuncMode + 0x0000000000000000 0x5e obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_GetOscClkFuncMode + 0x0000000000000000 0x26 obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_SetOscClkDriveRate + 0x0000000000000000 0x54 obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_GetOscClkDriveRate + 0x0000000000000000 0x1e obj/drivers/iocmg/src/iocmg.o + .text.HAL_IOCMG_Init + 0x0000000000000000 0x110 obj/drivers/iocmg/src/iocmg.o + .text.HAL_IOCMG_GetPinAltFuncMode + 0x0000000000000000 0x34 obj/drivers/iocmg/src/iocmg.o + .text.HAL_IOCMG_GetPinPullMode + 0x0000000000000000 0x34 obj/drivers/iocmg/src/iocmg.o + .text.HAL_IOCMG_GetPinSchmidtMode + 0x0000000000000000 0x34 obj/drivers/iocmg/src/iocmg.o + .text.HAL_IOCMG_GetPinLevelShiftRate + 0x0000000000000000 0x34 obj/drivers/iocmg/src/iocmg.o + .text.HAL_IOCMG_GetPinDriveRate + 0x0000000000000000 0x34 obj/drivers/iocmg/src/iocmg.o + .text.HAL_IOCMG_SetOscClkOutputMode + 0x0000000000000000 0x50 obj/drivers/iocmg/src/iocmg.o + .text.HAL_IOCMG_GetOscClkOutputMode + 0x0000000000000000 0x1c obj/drivers/iocmg/src/iocmg.o + .text.HAL_IOCMG_SetOscClkFuncMode + 0x0000000000000000 0x50 obj/drivers/iocmg/src/iocmg.o + .text.HAL_IOCMG_GetOscClkFuncMode + 0x0000000000000000 0x1c obj/drivers/iocmg/src/iocmg.o + .text.HAL_IOCMG_SetOscClkDriveRate + 0x0000000000000000 0x46 obj/drivers/iocmg/src/iocmg.o + .text.HAL_IOCMG_GetOscClkDriveRate + 0x0000000000000000 0x1c obj/drivers/iocmg/src/iocmg.o + .text 0x0000000000000000 0x0 obj/drivers/iwdg/src/iwdg.o + .data 0x0000000000000000 0x0 obj/drivers/iwdg/src/iwdg.o + .bss 0x0000000000000000 0x0 obj/drivers/iwdg/src/iwdg.o + .rodata 0x0000000000000000 0x4c obj/drivers/iwdg/src/iwdg.o + .text.DCL_IWDG_SetLoadValue + 0x0000000000000000 0x70 obj/drivers/iwdg/src/iwdg.o + .text.DCL_IWDG_GetLoadValue + 0x0000000000000000 0x40 obj/drivers/iwdg/src/iwdg.o + .text.DCL_IWDG_Start + 0x0000000000000000 0x48 obj/drivers/iwdg/src/iwdg.o + .text.DCL_IWDG_Stop + 0x0000000000000000 0x48 obj/drivers/iwdg/src/iwdg.o + .text.DCL_IWDG_Refresh + 0x0000000000000000 0x48 obj/drivers/iwdg/src/iwdg.o + .text.DCL_IWDG_SetFreqDivValue + 0x0000000000000000 0x92 obj/drivers/iwdg/src/iwdg.o + .text.DCL_IWDG_GetFreqDivValue + 0x0000000000000000 0x42 obj/drivers/iwdg/src/iwdg.o + .text.DCL_IWDG_EnableReset + 0x0000000000000000 0x60 obj/drivers/iwdg/src/iwdg.o + .text.IsIwdgTimeType + 0x0000000000000000 0x40 obj/drivers/iwdg/src/iwdg.o + .text.IsIwdgTimeValue + 0x0000000000000000 0xca obj/drivers/iwdg/src/iwdg.o + .text.HAL_IWDG_Init + 0x0000000000000000 0x138 obj/drivers/iwdg/src/iwdg.o + .text.IWDG_CalculateRegTimeout + 0x0000000000000000 0xc2 obj/drivers/iwdg/src/iwdg.o + .text.HAL_IWDG_SetTimeValue + 0x0000000000000000 0x13e obj/drivers/iwdg/src/iwdg.o + .text.HAL_IWDG_Refresh + 0x0000000000000000 0x66 obj/drivers/iwdg/src/iwdg.o + .text.HAL_IWDG_GetLoadValue + 0x0000000000000000 0x68 obj/drivers/iwdg/src/iwdg.o + .text.HAL_IWDG_GetCounterValue + 0x0000000000000000 0x18a obj/drivers/iwdg/src/iwdg.o + .text.HAL_IWDG_Start + 0x0000000000000000 0x66 obj/drivers/iwdg/src/iwdg.o + .text.HAL_IWDG_Stop + 0x0000000000000000 0x66 obj/drivers/iwdg/src/iwdg.o + .text.HAL_IWDG_RegisterCallback + 0x0000000000000000 0x16 obj/drivers/iwdg/src/iwdg.o + .text.HAL_IWDG_IrqHandler + 0x0000000000000000 0x12 obj/drivers/iwdg/src/iwdg.o + .debug_info 0x0000000000000000 0x89a obj/drivers/iwdg/src/iwdg.o + .debug_abbrev 0x0000000000000000 0x20f obj/drivers/iwdg/src/iwdg.o + .debug_aranges + 0x0000000000000000 0xb8 obj/drivers/iwdg/src/iwdg.o + .debug_ranges 0x0000000000000000 0xa8 obj/drivers/iwdg/src/iwdg.o + .debug_line 0x0000000000000000 0x6d3 obj/drivers/iwdg/src/iwdg.o + .debug_str 0x0000000000000000 0x9ed obj/drivers/iwdg/src/iwdg.o + .comment 0x0000000000000000 0x2a obj/drivers/iwdg/src/iwdg.o + .debug_frame 0x0000000000000000 0x2e0 obj/drivers/iwdg/src/iwdg.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/iwdg/src/iwdg.o + .text 0x0000000000000000 0x0 obj/drivers/iwdg/src/iwdg_ex.o + .data 0x0000000000000000 0x0 obj/drivers/iwdg/src/iwdg_ex.o + .bss 0x0000000000000000 0x0 obj/drivers/iwdg/src/iwdg_ex.o + .rodata 0x0000000000000000 0x48 obj/drivers/iwdg/src/iwdg_ex.o + .text.DCL_IWDG_SetWindowValue + 0x0000000000000000 0x8e obj/drivers/iwdg/src/iwdg_ex.o + .text.DCL_IWDG_GetWindowValue + 0x0000000000000000 0x40 obj/drivers/iwdg/src/iwdg_ex.o + .text.DCL_IWDG_GetFreqDivValue + 0x0000000000000000 0x42 obj/drivers/iwdg/src/iwdg_ex.o + .text.DCL_IWDG_EnableWindowsMode + 0x0000000000000000 0x60 obj/drivers/iwdg/src/iwdg_ex.o + .text.DCL_IWDG_DisableWindowsMode + 0x0000000000000000 0x5e obj/drivers/iwdg/src/iwdg_ex.o + .text.IsIwdgTimeType + 0x0000000000000000 0x40 obj/drivers/iwdg/src/iwdg_ex.o + .text.HAL_IWDG_SetWindowValueEx + 0x0000000000000000 0x156 obj/drivers/iwdg/src/iwdg_ex.o + .text.IWDG_CalculateRegTimeoutEx + 0x0000000000000000 0xc2 obj/drivers/iwdg/src/iwdg_ex.o + .text.HAL_IWDG_GetWindowValueEx + 0x0000000000000000 0x98 obj/drivers/iwdg/src/iwdg_ex.o + .text.HAL_IWDG_EnableWindowModeEx + 0x0000000000000000 0x66 obj/drivers/iwdg/src/iwdg_ex.o + .text.HAL_IWDG_DisableWindowModeEx + 0x0000000000000000 0x66 obj/drivers/iwdg/src/iwdg_ex.o + .debug_info 0x0000000000000000 0x5f5 obj/drivers/iwdg/src/iwdg_ex.o + .debug_abbrev 0x0000000000000000 0x1c7 obj/drivers/iwdg/src/iwdg_ex.o + .debug_aranges + 0x0000000000000000 0x70 obj/drivers/iwdg/src/iwdg_ex.o + .debug_ranges 0x0000000000000000 0x60 obj/drivers/iwdg/src/iwdg_ex.o + .debug_line 0x0000000000000000 0x418 obj/drivers/iwdg/src/iwdg_ex.o + .debug_str 0x0000000000000000 0x7ce obj/drivers/iwdg/src/iwdg_ex.o + .comment 0x0000000000000000 0x2a obj/drivers/iwdg/src/iwdg_ex.o + .debug_frame 0x0000000000000000 0x19c obj/drivers/iwdg/src/iwdg_ex.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/iwdg/src/iwdg_ex.o + .text 0x0000000000000000 0x0 obj/drivers/pga/src/pga.o + .data 0x0000000000000000 0x0 obj/drivers/pga/src/pga.o + .bss 0x0000000000000000 0x0 obj/drivers/pga/src/pga.o + .text.IsPgaGain + 0x0000000000000000 0x1c obj/drivers/pga/src/pga.o + .text.IsPgaExtCapCompensation + 0x0000000000000000 0x1c obj/drivers/pga/src/pga.o + .rodata 0x0000000000000000 0x19 obj/drivers/pga/src/pga.o + .text.HAL_PGA_Init + 0x0000000000000000 0x14a obj/drivers/pga/src/pga.o + .text.HAL_PGA_DeInit + 0x0000000000000000 0x7a obj/drivers/pga/src/pga.o + .text.HAL_PGA_SetGain + 0x0000000000000000 0x86 obj/drivers/pga/src/pga.o + .text.HAL_PGA_Start + 0x0000000000000000 0x72 obj/drivers/pga/src/pga.o + .text.HAL_PGA_Stop + 0x0000000000000000 0x70 obj/drivers/pga/src/pga.o + .debug_info 0x0000000000000000 0x598 obj/drivers/pga/src/pga.o + .debug_abbrev 0x0000000000000000 0x153 obj/drivers/pga/src/pga.o + .debug_aranges + 0x0000000000000000 0x50 obj/drivers/pga/src/pga.o + .debug_ranges 0x0000000000000000 0x40 obj/drivers/pga/src/pga.o + .debug_line 0x0000000000000000 0x2aa obj/drivers/pga/src/pga.o + .debug_str 0x0000000000000000 0x852 obj/drivers/pga/src/pga.o + .comment 0x0000000000000000 0x2a obj/drivers/pga/src/pga.o + .debug_frame 0x0000000000000000 0x108 obj/drivers/pga/src/pga.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/pga/src/pga.o + .text 0x0000000000000000 0x0 obj/drivers/pmc/src/pmc.o + .data 0x0000000000000000 0x0 obj/drivers/pmc/src/pmc.o + .bss 0x0000000000000000 0x0 obj/drivers/pmc/src/pmc.o + .data.g_internalPvdValueTable + 0x0000000000000000 0x40 obj/drivers/pmc/src/pmc.o + .text.IsPvdThreshold + 0x0000000000000000 0x68 obj/drivers/pmc/src/pmc.o + .text.IsWakeupSrc + 0x0000000000000000 0x40 obj/drivers/pmc/src/pmc.o + .text.IsActiveMode + 0x0000000000000000 0x40 obj/drivers/pmc/src/pmc.o + .text.DCL_PMC_EnablePvd + 0x0000000000000000 0x2a obj/drivers/pmc/src/pmc.o + .text.DCL_PMC_DisablePvd + 0x0000000000000000 0x28 obj/drivers/pmc/src/pmc.o + .rodata 0x0000000000000000 0x35 obj/drivers/pmc/src/pmc.o + .text.DCL_PMC_SetPvdThreshold + 0x0000000000000000 0xac obj/drivers/pmc/src/pmc.o + .text.PMC_SetDeepSleepWakeupSrc + 0x0000000000000000 0x142 obj/drivers/pmc/src/pmc.o + .text.PMC_PvdInit + 0x0000000000000000 0xa0 obj/drivers/pmc/src/pmc.o + .text.HAL_PMC_Init + 0x0000000000000000 0x6e obj/drivers/pmc/src/pmc.o + .text.HAL_PMC_DeInit + 0x0000000000000000 0x70 obj/drivers/pmc/src/pmc.o + .text.HAL_PMC_EnterSleepMode + 0x0000000000000000 0x12 obj/drivers/pmc/src/pmc.o + .text.HAL_PMC_EnterDeepSleepMode + 0x0000000000000000 0x68 obj/drivers/pmc/src/pmc.o + .text.HAL_PMC_EnterShutdownMode + 0x0000000000000000 0x12 obj/drivers/pmc/src/pmc.o + .text.HAL_PMC_GetWakeupType + 0x0000000000000000 0x88 obj/drivers/pmc/src/pmc.o + .text.HAL_PMC_IrqHandler + 0x0000000000000000 0x92 obj/drivers/pmc/src/pmc.o + .text.HAL_PMC_RegisterCallback + 0x0000000000000000 0x84 obj/drivers/pmc/src/pmc.o + .debug_info 0x0000000000000000 0xe8f obj/drivers/pmc/src/pmc.o + .debug_abbrev 0x0000000000000000 0x2c2 obj/drivers/pmc/src/pmc.o + .debug_aranges + 0x0000000000000000 0x98 obj/drivers/pmc/src/pmc.o + .debug_ranges 0x0000000000000000 0x88 obj/drivers/pmc/src/pmc.o + .debug_line 0x0000000000000000 0x5ec obj/drivers/pmc/src/pmc.o + .debug_str 0x0000000000000000 0xe3c obj/drivers/pmc/src/pmc.o + .comment 0x0000000000000000 0x2a obj/drivers/pmc/src/pmc.o + .debug_frame 0x0000000000000000 0x238 obj/drivers/pmc/src/pmc.o + .riscv.attributes + 0x0000000000000000 0x36 obj/drivers/pmc/src/pmc.o + .text 0x0000000000000000 0x0 obj/drivers/qdm/src/qdm.o + .data 0x0000000000000000 0x0 obj/drivers/qdm/src/qdm.o + .bss 0x0000000000000000 0x0 obj/drivers/qdm/src/qdm.o + .text.IsEmuMode + 0x0000000000000000 0x32 obj/drivers/qdm/src/qdm.o + .text.IsLockMode + 0x0000000000000000 0x3c obj/drivers/qdm/src/qdm.o + .text.IsDecodeMode + 0x0000000000000000 0x22 obj/drivers/qdm/src/qdm.o + .text.IsResolution + 0x0000000000000000 0x32 obj/drivers/qdm/src/qdm.o + .text.IsSwap 0x0000000000000000 0x28 obj/drivers/qdm/src/qdm.o + .text.IsTrgLockMode + 0x0000000000000000 0x28 obj/drivers/qdm/src/qdm.o + .text.IsPtuMode + 0x0000000000000000 0x28 obj/drivers/qdm/src/qdm.o + .text.IsPcntMode + 0x0000000000000000 0x32 obj/drivers/qdm/src/qdm.o + .text.IsPcntRstMode + 0x0000000000000000 0x3c obj/drivers/qdm/src/qdm.o + .text.IsPcntIdxInitMode + 0x0000000000000000 0x3c obj/drivers/qdm/src/qdm.o + .text.IsTsuPrescaler + 0x0000000000000000 0x6e obj/drivers/qdm/src/qdm.o + .text.IsCevtPrescaler + 0x0000000000000000 0x8c obj/drivers/qdm/src/qdm.o + .rodata 0x0000000000000000 0x35 obj/drivers/qdm/src/qdm.o + .text.DCL_QDM_SetInputFilterWidth + 0x0000000000000000 0x122 obj/drivers/qdm/src/qdm.o + .text.DCL_QDM_SetIndexLockMode + 0x0000000000000000 0x86 obj/drivers/qdm/src/qdm.o + .text.QDM_DecoderConfig + 0x0000000000000000 0x26e obj/drivers/qdm/src/qdm.o + .text.QDM_CounterConfig + 0x0000000000000000 0x23c obj/drivers/qdm/src/qdm.o + .text.QDM_EnableSubmodule + 0x0000000000000000 0x98 obj/drivers/qdm/src/qdm.o + .text.QDM_InterruptEnable + 0x0000000000000000 0x72 obj/drivers/qdm/src/qdm.o + .text.SpeedLose + 0x0000000000000000 0x2a obj/drivers/qdm/src/qdm.o + .text.ZIndexLock + 0x0000000000000000 0x2a obj/drivers/qdm/src/qdm.o + .text.OrthoDirChange + 0x0000000000000000 0x2e obj/drivers/qdm/src/qdm.o + .text.OrthoPhaseErr + 0x0000000000000000 0x2e obj/drivers/qdm/src/qdm.o + .text.PosCompareMatch + 0x0000000000000000 0x2a obj/drivers/qdm/src/qdm.o + .text.PosCompareReady + 0x0000000000000000 0x2a obj/drivers/qdm/src/qdm.o + .text.PosCounterErr + 0x0000000000000000 0x2e obj/drivers/qdm/src/qdm.o + .text.PosCounterOverflow + 0x0000000000000000 0x2a obj/drivers/qdm/src/qdm.o + .text.PosCounterUnderflow + 0x0000000000000000 0x2a obj/drivers/qdm/src/qdm.o + .text.OtherInterruptCallBack + 0x0000000000000000 0x120 obj/drivers/qdm/src/qdm.o + .text.CalculateSpeed + 0x0000000000000000 0x144 obj/drivers/qdm/src/qdm.o + .text.HAL_QDM_IrqHandler + 0x0000000000000000 0x17a obj/drivers/qdm/src/qdm.o + .text.SelectInterruptCallback + 0x0000000000000000 0xb8 obj/drivers/qdm/src/qdm.o + .rodata.SelectInterruptCallback + 0x0000000000000000 0x28 obj/drivers/qdm/src/qdm.o + .text.HAL_QDM_RegisterCallback + 0x0000000000000000 0x9c obj/drivers/qdm/src/qdm.o + .text.HAL_QDM_Init + 0x0000000000000000 0x16e obj/drivers/qdm/src/qdm.o + .text.HAL_QDM_DeInit + 0x0000000000000000 0xa4 obj/drivers/qdm/src/qdm.o + .text.HAL_QDM_ReadPosCountAndDir + 0x0000000000000000 0xc8 obj/drivers/qdm/src/qdm.o + .text.HAL_QDM_GetPhaseErrorStatus + 0x0000000000000000 0x9a obj/drivers/qdm/src/qdm.o + .text.HAL_QDM_GetSpeedRpmM + 0x0000000000000000 0x38 obj/drivers/qdm/src/qdm.o + .text.HAL_QDM_GetSpeedRpmMT + 0x0000000000000000 0x174 obj/drivers/qdm/src/qdm.o + .bss.lastPoslockValue.2381 + 0x0000000000000000 0x4 obj/drivers/qdm/src/qdm.o + .debug_info 0x0000000000000000 0x182b obj/drivers/qdm/src/qdm.o + .debug_abbrev 0x0000000000000000 0x224 obj/drivers/qdm/src/qdm.o + .debug_aranges + 0x0000000000000000 0x148 obj/drivers/qdm/src/qdm.o + .debug_ranges 0x0000000000000000 0x138 obj/drivers/qdm/src/qdm.o + .debug_line 0x0000000000000000 0xe96 obj/drivers/qdm/src/qdm.o + .debug_str 0x0000000000000000 0x176f obj/drivers/qdm/src/qdm.o + .comment 0x0000000000000000 0x2a obj/drivers/qdm/src/qdm.o + .debug_frame 0x0000000000000000 0x558 obj/drivers/qdm/src/qdm.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/qdm/src/qdm.o + .text 0x0000000000000000 0x0 obj/drivers/spi/src/spi.o + .data 0x0000000000000000 0x0 obj/drivers/spi/src/spi.o + .bss 0x0000000000000000 0x0 obj/drivers/spi/src/spi.o + .text.DCL_SYSTICK_GetTick + 0x0000000000000000 0x14 obj/drivers/spi/src/spi.o + .text.IsSpiMode + 0x0000000000000000 0x28 obj/drivers/spi/src/spi.o + .text.IsSpiXferMode + 0x0000000000000000 0x32 obj/drivers/spi/src/spi.o + .text.IsSpiClkPolarity + 0x0000000000000000 0x28 obj/drivers/spi/src/spi.o + .text.IsSpiClkPhase + 0x0000000000000000 0x28 obj/drivers/spi/src/spi.o + .text.IsSpiEndian + 0x0000000000000000 0x28 obj/drivers/spi/src/spi.o + .text.IsSpiFrameFormat + 0x0000000000000000 0x32 obj/drivers/spi/src/spi.o + .text.IsSpiDataWidth + 0x0000000000000000 0x2c obj/drivers/spi/src/spi.o + .text.IsSpiWaitVal + 0x0000000000000000 0x22 obj/drivers/spi/src/spi.o + .text.IsSpiTxIntSize + 0x0000000000000000 0x22 obj/drivers/spi/src/spi.o + .text.IsSpiRxIntSize + 0x0000000000000000 0x22 obj/drivers/spi/src/spi.o + .text.IsSpiTxDmaBurstSize + 0x0000000000000000 0x22 obj/drivers/spi/src/spi.o + .text.IsSpiRxDmaBurstSize + 0x0000000000000000 0x22 obj/drivers/spi/src/spi.o + .text.IsSpiFreqCpsdvsr + 0x0000000000000000 0x24 obj/drivers/spi/src/spi.o + .rodata 0x0000000000000000 0x19 obj/drivers/spi/src/spi.o + .text.CheckAllInitParameters + 0x0000000000000000 0x2da obj/drivers/spi/src/spi.o + .text.ConfigThreeTransferParam + 0x0000000000000000 0x136 obj/drivers/spi/src/spi.o + .text.InternalCsControl + 0x0000000000000000 0x16 obj/drivers/spi/src/spi.o + .text.SpiCsControl + 0x0000000000000000 0x52 obj/drivers/spi/src/spi.o + .text.SpiRxTxCallack + 0x0000000000000000 0x110 obj/drivers/spi/src/spi.o + .text.WriteData + 0x0000000000000000 0x102 obj/drivers/spi/src/spi.o + .text.ReadData + 0x0000000000000000 0xf2 obj/drivers/spi/src/spi.o + .text.ReadWriteData + 0x0000000000000000 0x14a obj/drivers/spi/src/spi.o + .text.ReadWriteInt + 0x0000000000000000 0x94 obj/drivers/spi/src/spi.o + .text.ReadBlocking + 0x0000000000000000 0x15e obj/drivers/spi/src/spi.o + .text.ReadWriteBlocking + 0x0000000000000000 0x16e obj/drivers/spi/src/spi.o + .text.ConfigTransmissionParameter + 0x0000000000000000 0x7c obj/drivers/spi/src/spi.o + .text.ClearSpiRxFifo + 0x0000000000000000 0x30 obj/drivers/spi/src/spi.o + .text.HAL_SPI_Init + 0x0000000000000000 0x25a obj/drivers/spi/src/spi.o + .text.HAL_SPI_Deinit + 0x0000000000000000 0xcc obj/drivers/spi/src/spi.o + .text.HAL_SPI_ConfigParameter + 0x0000000000000000 0x292 obj/drivers/spi/src/spi.o + .text.HAL_SPI_RegisterCallback + 0x0000000000000000 0x102 obj/drivers/spi/src/spi.o + .rodata.HAL_SPI_RegisterCallback + 0x0000000000000000 0x14 obj/drivers/spi/src/spi.o + .text.HAL_SPI_ReadBlocking + 0x0000000000000000 0x146 obj/drivers/spi/src/spi.o + .text.HAL_SPI_WriteBlocking + 0x0000000000000000 0x12c obj/drivers/spi/src/spi.o + .text.HAL_SPI_WriteReadBlocking + 0x0000000000000000 0x138 obj/drivers/spi/src/spi.o + .text.HAL_SPI_ReadIT + 0x0000000000000000 0x12a obj/drivers/spi/src/spi.o + .text.HAL_SPI_WriteIT + 0x0000000000000000 0x116 obj/drivers/spi/src/spi.o + .text.HAL_SPI_WriteReadIT + 0x0000000000000000 0x122 obj/drivers/spi/src/spi.o + .text.WaitComplete + 0x0000000000000000 0xa4 obj/drivers/spi/src/spi.o + .text.ReadDmaFinishFun + 0x0000000000000000 0xfa obj/drivers/spi/src/spi.o + .text.WriteDmaFinishFun + 0x0000000000000000 0xc6 obj/drivers/spi/src/spi.o + .text.DmaErrorFun + 0x0000000000000000 0xa0 obj/drivers/spi/src/spi.o + .text.EnableDma + 0x0000000000000000 0x56 obj/drivers/spi/src/spi.o + .text.SetDmaCallBack + 0x0000000000000000 0x8a obj/drivers/spi/src/spi.o + .text.HAL_SPI_ReadDMA + 0x0000000000000000 0x284 obj/drivers/spi/src/spi.o + .text.HAL_SPI_WriteDMA + 0x0000000000000000 0x27c obj/drivers/spi/src/spi.o + .text.HAL_SPI_WriteReadDMA + 0x0000000000000000 0x288 obj/drivers/spi/src/spi.o + .text.HAL_SPI_DMAStop + 0x0000000000000000 0xac obj/drivers/spi/src/spi.o + .text.HAL_SPI_ChipSelectChannelSet + 0x0000000000000000 0xa6 obj/drivers/spi/src/spi.o + .text.HAL_SPI_ChipSelectChannelGet + 0x0000000000000000 0x84 obj/drivers/spi/src/spi.o + .text.HAL_SPI_IrqHandler + 0x0000000000000000 0xf8 obj/drivers/spi/src/spi.o + .bss.writeVal.2948 + 0x0000000000000000 0x2 obj/drivers/spi/src/spi.o + .bss.readVal.2958 + 0x0000000000000000 0x2 obj/drivers/spi/src/spi.o + .debug_info 0x0000000000000000 0x29dc obj/drivers/spi/src/spi.o + .debug_abbrev 0x0000000000000000 0x307 obj/drivers/spi/src/spi.o + .debug_aranges + 0x0000000000000000 0x1a8 obj/drivers/spi/src/spi.o + .debug_ranges 0x0000000000000000 0x198 obj/drivers/spi/src/spi.o + .debug_line 0x0000000000000000 0x1aa5 obj/drivers/spi/src/spi.o + .debug_str 0x0000000000000000 0x24cb obj/drivers/spi/src/spi.o + .comment 0x0000000000000000 0x2a obj/drivers/spi/src/spi.o + .debug_frame 0x0000000000000000 0x6e8 obj/drivers/spi/src/spi.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/spi/src/spi.o + .text 0x0000000000000000 0x0 obj/drivers/spi/src/spi_ex.o + .data 0x0000000000000000 0x0 obj/drivers/spi/src/spi_ex.o + .bss 0x0000000000000000 0x0 obj/drivers/spi/src/spi_ex.o + .text.IsSpiChipConfigMode + 0x0000000000000000 0x22 obj/drivers/spi/src/spi_ex.o + .rodata 0x0000000000000000 0x1c obj/drivers/spi/src/spi_ex.o + .text.HAL_SPI_SetChipConfigSelectEx + 0x0000000000000000 0xb6 obj/drivers/spi/src/spi_ex.o + .text.HAL_SPI_GetChipConfigSelectEx + 0x0000000000000000 0x72 obj/drivers/spi/src/spi_ex.o + .debug_info 0x0000000000000000 0x1a4e obj/drivers/spi/src/spi_ex.o + .debug_abbrev 0x0000000000000000 0x1d9 obj/drivers/spi/src/spi_ex.o + .debug_aranges + 0x0000000000000000 0x30 obj/drivers/spi/src/spi_ex.o + .debug_ranges 0x0000000000000000 0x20 obj/drivers/spi/src/spi_ex.o + .debug_line 0x0000000000000000 0x1bb obj/drivers/spi/src/spi_ex.o + .debug_str 0x0000000000000000 0x17a1 obj/drivers/spi/src/spi_ex.o + .comment 0x0000000000000000 0x2a obj/drivers/spi/src/spi_ex.o + .debug_frame 0x0000000000000000 0x78 obj/drivers/spi/src/spi_ex.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/spi/src/spi_ex.o + .text 0x0000000000000000 0x0 obj/drivers/timer/src/timer.o + .data 0x0000000000000000 0x0 obj/drivers/timer/src/timer.o + .bss 0x0000000000000000 0x0 obj/drivers/timer/src/timer.o + .text.DCL_TIMER_SetTimerMode + 0x0000000000000000 0xca obj/drivers/timer/src/timer.o + .text.DCL_TIMER_GetTimerMode + 0x0000000000000000 0x7e obj/drivers/timer/src/timer.o + .text.HAL_TIMER_DeInit + 0x0000000000000000 0xd0 obj/drivers/timer/src/timer.o + .text.HAL_TIMER_Config + 0x0000000000000000 0x27a obj/drivers/timer/src/timer.o + .text.HAL_TIMER_GetConfig + 0x0000000000000000 0x160 obj/drivers/timer/src/timer.o + .text.HAL_TIMER_Stop + 0x0000000000000000 0x98 obj/drivers/timer/src/timer.o + .text.HAL_TIMER_UnRegisterCallback + 0x0000000000000000 0x5e obj/drivers/timer/src/timer.o + .text 0x0000000000000000 0x0 obj/drivers/timer/src/timer_ex.o + .data 0x0000000000000000 0x0 obj/drivers/timer/src/timer_ex.o + .bss 0x0000000000000000 0x0 obj/drivers/timer/src/timer_ex.o + .rodata 0x0000000000000000 0x20 obj/drivers/timer/src/timer_ex.o + .text.HAL_TIMER_DMARequestOverFlowEx + 0x0000000000000000 0x9c obj/drivers/timer/src/timer_ex.o + .text.HAL_TIMER_TriggerAdcEx + 0x0000000000000000 0x9e obj/drivers/timer/src/timer_ex.o + .debug_info 0x0000000000000000 0x524 obj/drivers/timer/src/timer_ex.o + .debug_abbrev 0x0000000000000000 0x120 obj/drivers/timer/src/timer_ex.o + .debug_aranges + 0x0000000000000000 0x28 obj/drivers/timer/src/timer_ex.o + .debug_ranges 0x0000000000000000 0x18 obj/drivers/timer/src/timer_ex.o + .debug_line 0x0000000000000000 0x188 obj/drivers/timer/src/timer_ex.o + .debug_str 0x0000000000000000 0x87d obj/drivers/timer/src/timer_ex.o + .comment 0x0000000000000000 0x2a obj/drivers/timer/src/timer_ex.o + .debug_frame 0x0000000000000000 0x58 obj/drivers/timer/src/timer_ex.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/timer/src/timer_ex.o + .text 0x0000000000000000 0x0 obj/drivers/tsensor/src/tsensor.o + .data 0x0000000000000000 0x0 obj/drivers/tsensor/src/tsensor.o + .bss 0x0000000000000000 0x0 obj/drivers/tsensor/src/tsensor.o + .text.IsADCSOCx + 0x0000000000000000 0x1c obj/drivers/tsensor/src/tsensor.o + .text.ADC_GetCTRLAddr + 0x0000000000000000 0x36 obj/drivers/tsensor/src/tsensor.o + .rodata 0x0000000000000000 0x2c obj/drivers/tsensor/src/tsensor.o + .text.DCL_ADC_SOCxSoftTrigger + 0x0000000000000000 0x86 obj/drivers/tsensor/src/tsensor.o + .text.DCL_ADC_ReadSOCxResult + 0x0000000000000000 0x8c obj/drivers/tsensor/src/tsensor.o + .text.DCL_ADC_GetConvState + 0x0000000000000000 0x86 obj/drivers/tsensor/src/tsensor.o + .text.DCL_ADC_ResetConvState + 0x0000000000000000 0x82 obj/drivers/tsensor/src/tsensor.o + .text.ADC_ClkEnable + 0x0000000000000000 0x5c obj/drivers/tsensor/src/tsensor.o + .text.TSENSOR_SampleConfigure + 0x0000000000000000 0xb2 obj/drivers/tsensor/src/tsensor.o + .text.TSENSOR_Conversion + 0x0000000000000000 0x68 obj/drivers/tsensor/src/tsensor.o + .text.HAL_TSENSOR_Init + 0x0000000000000000 0x22 obj/drivers/tsensor/src/tsensor.o + .text.HAL_TSENSOR_Deinit + 0x0000000000000000 0x22 obj/drivers/tsensor/src/tsensor.o + .text.HAL_TSENSOR_GetResult + 0x0000000000000000 0xc0 obj/drivers/tsensor/src/tsensor.o + .text.HAL_TSENSOR_GetTemperature + 0x0000000000000000 0x34 obj/drivers/tsensor/src/tsensor.o + .debug_info 0x0000000000000000 0x5766 obj/drivers/tsensor/src/tsensor.o + .debug_abbrev 0x0000000000000000 0x321 obj/drivers/tsensor/src/tsensor.o + .debug_aranges + 0x0000000000000000 0x80 obj/drivers/tsensor/src/tsensor.o + .debug_ranges 0x0000000000000000 0x70 obj/drivers/tsensor/src/tsensor.o + .debug_line 0x0000000000000000 0x4ab obj/drivers/tsensor/src/tsensor.o + .debug_str 0x0000000000000000 0x46bf obj/drivers/tsensor/src/tsensor.o + .comment 0x0000000000000000 0x2a obj/drivers/tsensor/src/tsensor.o + .debug_frame 0x0000000000000000 0x1d8 obj/drivers/tsensor/src/tsensor.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/tsensor/src/tsensor.o + .text 0x0000000000000000 0x0 obj/drivers/uart/src/uart.o + .data 0x0000000000000000 0x0 obj/drivers/uart/src/uart.o + .bss 0x0000000000000000 0x0 obj/drivers/uart/src/uart.o + .text.DCL_SYSTICK_GetTick + 0x0000000000000000 0x14 obj/drivers/uart/src/uart.o + .text.IsDmaChannelNum + 0x0000000000000000 0x50 obj/drivers/uart/src/uart.o + .text.BaudDetectCallBack + 0x0000000000000000 0xdc obj/drivers/uart/src/uart.o + .text.CharterMatchCallBack + 0x0000000000000000 0x4c obj/drivers/uart/src/uart.o + .text.HAL_UART_DeInit + 0x0000000000000000 0x13e obj/drivers/uart/src/uart.o + .text.HAL_UART_GetState + 0x0000000000000000 0x7c obj/drivers/uart/src/uart.o + .text.HAL_UART_WriteBlocking + 0x0000000000000000 0x268 obj/drivers/uart/src/uart.o + .text.HAL_UART_WriteIT + 0x0000000000000000 0x14e obj/drivers/uart/src/uart.o + .text.WriteITCallBack + 0x0000000000000000 0x164 obj/drivers/uart/src/uart.o + .text.HAL_UART_WriteDMA + 0x0000000000000000 0x1f6 obj/drivers/uart/src/uart.o + .text.HAL_UART_ReadBlocking + 0x0000000000000000 0x29c obj/drivers/uart/src/uart.o + .text.HAL_UART_ReadIT + 0x0000000000000000 0x150 obj/drivers/uart/src/uart.o + .text.ReadITCallBack + 0x0000000000000000 0x168 obj/drivers/uart/src/uart.o + .text.ReadDMAFinishFun + 0x0000000000000000 0xba obj/drivers/uart/src/uart.o + .text.WriteDMAFinishFun + 0x0000000000000000 0xba obj/drivers/uart/src/uart.o + .text.TransmitDMAErrorFun + 0x0000000000000000 0xdc obj/drivers/uart/src/uart.o + .text.HAL_UART_ReadDMA + 0x0000000000000000 0x1f2 obj/drivers/uart/src/uart.o + .text.HAL_UART_StopWrite + 0x0000000000000000 0x120 obj/drivers/uart/src/uart.o + .text.HAL_UART_StopRead + 0x0000000000000000 0x13a obj/drivers/uart/src/uart.o + .text.ErrorServiceCallback + 0x0000000000000000 0x14a obj/drivers/uart/src/uart.o + .text.HAL_UART_IrqHandler + 0x0000000000000000 0x184 obj/drivers/uart/src/uart.o + .text.HAL_UART_RegisterCallBack + 0x0000000000000000 0x11a obj/drivers/uart/src/uart.o + .rodata.HAL_UART_RegisterCallBack + 0x0000000000000000 0x24 obj/drivers/uart/src/uart.o + .text.HAL_UART_ReadDMAAndCyclicallyStored + 0x0000000000000000 0x310 obj/drivers/uart/src/uart.o + .text.HAL_UART_ReadDMAGetPos + 0x0000000000000000 0x16c obj/drivers/uart/src/uart.o + .text 0x0000000000000000 0x0 obj/drivers/uart/src/uart_ex.o + .data 0x0000000000000000 0x0 obj/drivers/uart/src/uart_ex.o + .bss 0x0000000000000000 0x0 obj/drivers/uart/src/uart_ex.o + .text.IsUartOversampleMultiple + 0x0000000000000000 0x1c obj/drivers/uart/src/uart_ex.o + .text.IsUartSequenceMode + 0x0000000000000000 0x2c obj/drivers/uart/src/uart_ex.o + .rodata 0x0000000000000000 0x1e obj/drivers/uart/src/uart_ex.o + .text.HAL_UART_OpenCharacterMatchEx + 0x0000000000000000 0xc0 obj/drivers/uart/src/uart_ex.o + .text.HAL_UART_CloseCharacterMatchEx + 0x0000000000000000 0xa8 obj/drivers/uart/src/uart_ex.o + .text.HAL_UART_EnableBaudDetectionEx + 0x0000000000000000 0xcc obj/drivers/uart/src/uart_ex.o + .text.HAL_UART_DisableBaudDetectionEx + 0x0000000000000000 0xce obj/drivers/uart/src/uart_ex.o + .text.HAL_UART_SetRxWaiteTimeEx + 0x0000000000000000 0xb6 obj/drivers/uart/src/uart_ex.o + .text.HAL_UART_SetOversampleMultipleEx + 0x0000000000000000 0xce obj/drivers/uart/src/uart_ex.o + .text.HAL_UART_SetDataSequenceModeEx + 0x0000000000000000 0xce obj/drivers/uart/src/uart_ex.o + .debug_info 0x0000000000000000 0x24e4 obj/drivers/uart/src/uart_ex.o + .debug_abbrev 0x0000000000000000 0x1fe obj/drivers/uart/src/uart_ex.o + .debug_aranges + 0x0000000000000000 0x60 obj/drivers/uart/src/uart_ex.o + .debug_ranges 0x0000000000000000 0x50 obj/drivers/uart/src/uart_ex.o + .debug_line 0x0000000000000000 0x4dd obj/drivers/uart/src/uart_ex.o + .debug_str 0x0000000000000000 0x1e92 obj/drivers/uart/src/uart_ex.o + .comment 0x0000000000000000 0x2a obj/drivers/uart/src/uart_ex.o + .debug_frame 0x0000000000000000 0x14c obj/drivers/uart/src/uart_ex.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/uart/src/uart_ex.o + .text 0x0000000000000000 0x0 obj/drivers/wwdg/src/wwdg.o + .data 0x0000000000000000 0x0 obj/drivers/wwdg/src/wwdg.o + .bss 0x0000000000000000 0x0 obj/drivers/wwdg/src/wwdg.o + .rodata 0x0000000000000000 0x4c obj/drivers/wwdg/src/wwdg.o + .text.DCL_WWDG_SetLoadValue + 0x0000000000000000 0x72 obj/drivers/wwdg/src/wwdg.o + .text.DCL_WWDG_GetLoadValue + 0x0000000000000000 0x40 obj/drivers/wwdg/src/wwdg.o + .text.DCL_WWDG_SetWindowValue + 0x0000000000000000 0x72 obj/drivers/wwdg/src/wwdg.o + .text.DCL_WWDG_GetWindowValue + 0x0000000000000000 0x40 obj/drivers/wwdg/src/wwdg.o + .text.DCL_WWDG_Start + 0x0000000000000000 0x48 obj/drivers/wwdg/src/wwdg.o + .text.DCL_WWDG_Stop + 0x0000000000000000 0x48 obj/drivers/wwdg/src/wwdg.o + .text.DCL_WWDG_Refresh + 0x0000000000000000 0x48 obj/drivers/wwdg/src/wwdg.o + .text.DCL_WWDG_SetFreqDivValue + 0x0000000000000000 0x92 obj/drivers/wwdg/src/wwdg.o + .text.DCL_WWDG_GetFreqDivValue + 0x0000000000000000 0x42 obj/drivers/wwdg/src/wwdg.o + .text.DCL_WWDG_EnableReset + 0x0000000000000000 0x60 obj/drivers/wwdg/src/wwdg.o + .text.DCL_WWDG_EnableInterrupt + 0x0000000000000000 0x60 obj/drivers/wwdg/src/wwdg.o + .text.IsWwdgTimeType + 0x0000000000000000 0x40 obj/drivers/wwdg/src/wwdg.o + .text.IsWwdgTimeValue + 0x0000000000000000 0xca obj/drivers/wwdg/src/wwdg.o + .text.HAL_WWDG_Init + 0x0000000000000000 0x1f4 obj/drivers/wwdg/src/wwdg.o + .text.WWDG_CalculateRegTimeout + 0x0000000000000000 0xc2 obj/drivers/wwdg/src/wwdg.o + .text.HAL_WWDG_SetTimeValue + 0x0000000000000000 0x13c obj/drivers/wwdg/src/wwdg.o + .text.HAL_WWDG_Refresh + 0x0000000000000000 0x66 obj/drivers/wwdg/src/wwdg.o + .text.HAL_WWDG_GetLoadValue + 0x0000000000000000 0x68 obj/drivers/wwdg/src/wwdg.o + .text.HAL_WWDG_GetWindowValue + 0x0000000000000000 0x68 obj/drivers/wwdg/src/wwdg.o + .text.HAL_WWDG_GetCounterValue + 0x0000000000000000 0x18a obj/drivers/wwdg/src/wwdg.o + .text.HAL_WWDG_Start + 0x0000000000000000 0x66 obj/drivers/wwdg/src/wwdg.o + .text.HAL_WWDG_Stop + 0x0000000000000000 0x66 obj/drivers/wwdg/src/wwdg.o + .text.HAL_WWDG_RegisterCallback + 0x0000000000000000 0x6a obj/drivers/wwdg/src/wwdg.o + .text.HAL_WWDG_IrqHandler + 0x0000000000000000 0x86 obj/drivers/wwdg/src/wwdg.o + .debug_info 0x0000000000000000 0xa45 obj/drivers/wwdg/src/wwdg.o + .debug_abbrev 0x0000000000000000 0x1ec obj/drivers/wwdg/src/wwdg.o + .debug_aranges + 0x0000000000000000 0xd8 obj/drivers/wwdg/src/wwdg.o + .debug_ranges 0x0000000000000000 0xc8 obj/drivers/wwdg/src/wwdg.o + .debug_line 0x0000000000000000 0x8ba obj/drivers/wwdg/src/wwdg.o + .debug_str 0x0000000000000000 0xab8 obj/drivers/wwdg/src/wwdg.o + .comment 0x0000000000000000 0x2a obj/drivers/wwdg/src/wwdg.o + .debug_frame 0x0000000000000000 0x378 obj/drivers/wwdg/src/wwdg.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/wwdg/src/wwdg.o + .text 0x0000000000000000 0x0 obj/drivers/wwdg/src/wwdg_ex.o + .data 0x0000000000000000 0x0 obj/drivers/wwdg/src/wwdg_ex.o + .bss 0x0000000000000000 0x0 obj/drivers/wwdg/src/wwdg_ex.o + .rodata 0x0000000000000000 0x3e obj/drivers/wwdg/src/wwdg_ex.o + .text.DCL_WWDG_EnableWindowsMode + 0x0000000000000000 0x60 obj/drivers/wwdg/src/wwdg_ex.o + .text.DCL_WWDG_DisableWindowsMode + 0x0000000000000000 0x5e obj/drivers/wwdg/src/wwdg_ex.o + .text.HAL_WWDG_EnableWindowModeEx + 0x0000000000000000 0x66 obj/drivers/wwdg/src/wwdg_ex.o + .text.HAL_WWDG_DisableWindowModeEx + 0x0000000000000000 0x66 obj/drivers/wwdg/src/wwdg_ex.o + .debug_info 0x0000000000000000 0x529 obj/drivers/wwdg/src/wwdg_ex.o + .debug_abbrev 0x0000000000000000 0x145 obj/drivers/wwdg/src/wwdg_ex.o + .debug_aranges + 0x0000000000000000 0x38 obj/drivers/wwdg/src/wwdg_ex.o + .debug_ranges 0x0000000000000000 0x28 obj/drivers/wwdg/src/wwdg_ex.o + .debug_line 0x0000000000000000 0x192 obj/drivers/wwdg/src/wwdg_ex.o + .debug_str 0x0000000000000000 0x746 obj/drivers/wwdg/src/wwdg_ex.o + .comment 0x0000000000000000 0x2a obj/drivers/wwdg/src/wwdg_ex.o + .debug_frame 0x0000000000000000 0xa0 obj/drivers/wwdg/src/wwdg_ex.o + .riscv.attributes + 0x0000000000000000 0x32 obj/drivers/wwdg/src/wwdg_ex.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .text.IsADCSOCx + 0x0000000000000000 0x1c obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .text.ADC_GetCTRLAddr + 0x0000000000000000 0x36 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .rodata 0x0000000000000000 0x5c obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .text.DCL_ADC_ReadSOCxResult + 0x0000000000000000 0x8c obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .text.ADCCALIBR_GetSocResult + 0x0000000000000000 0x64 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .text.ADCCALIBR_Init + 0x0000000000000000 0x4a obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .text.ADCCALIBR_Exec + 0x0000000000000000 0xf0 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .text.ADCCALIBR_IsFinish + 0x0000000000000000 0x44 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .debug_info 0x0000000000000000 0x52d2 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .debug_abbrev 0x0000000000000000 0x2a7 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .debug_aranges + 0x0000000000000000 0x50 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .debug_ranges 0x0000000000000000 0x40 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .debug_line 0x0000000000000000 0x2f8 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .debug_str 0x0000000000000000 0x4072 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .debug_frame 0x0000000000000000 0x104 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/brake/mcs_brake.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/brake/mcs_brake.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/brake/mcs_brake.o + .rodata 0x0000000000000000 0x38 obj/middleware/control_library/brake/mcs_brake.o + .text.BRAKE_Init + 0x0000000000000000 0xbe obj/middleware/control_library/brake/mcs_brake.o + .text.BRAKE_Clear + 0x0000000000000000 0x52 obj/middleware/control_library/brake/mcs_brake.o + .text.BRAKE_Exec + 0x0000000000000000 0x1f8 obj/middleware/control_library/brake/mcs_brake.o + .debug_info 0x0000000000000000 0x21b obj/middleware/control_library/brake/mcs_brake.o + .debug_abbrev 0x0000000000000000 0xd5 obj/middleware/control_library/brake/mcs_brake.o + .debug_aranges + 0x0000000000000000 0x30 obj/middleware/control_library/brake/mcs_brake.o + .debug_ranges 0x0000000000000000 0x20 obj/middleware/control_library/brake/mcs_brake.o + .debug_line 0x0000000000000000 0x1dc obj/middleware/control_library/brake/mcs_brake.o + .debug_str 0x0000000000000000 0x59a obj/middleware/control_library/brake/mcs_brake.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/brake/mcs_brake.o + .debug_frame 0x0000000000000000 0x80 obj/middleware/control_library/brake/mcs_brake.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/brake/mcs_brake.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/filter/mcs_filter.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/filter/mcs_filter.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/filter/mcs_filter.o + .rodata 0x0000000000000000 0x3c obj/middleware/control_library/filter/mcs_filter.o + .text.FOLPF_Init + 0x0000000000000000 0x110 obj/middleware/control_library/filter/mcs_filter.o + .text.FOLPF_Clear + 0x0000000000000000 0x42 obj/middleware/control_library/filter/mcs_filter.o + .text.FOLPF_Exec + 0x0000000000000000 0x6c obj/middleware/control_library/filter/mcs_filter.o + .text.FOLPF_SetTs + 0x0000000000000000 0xc8 obj/middleware/control_library/filter/mcs_filter.o + .debug_info 0x0000000000000000 0x1a6 obj/middleware/control_library/filter/mcs_filter.o + .debug_abbrev 0x0000000000000000 0xf5 obj/middleware/control_library/filter/mcs_filter.o + .debug_aranges + 0x0000000000000000 0x38 obj/middleware/control_library/filter/mcs_filter.o + .debug_ranges 0x0000000000000000 0x28 obj/middleware/control_library/filter/mcs_filter.o + .debug_line 0x0000000000000000 0x1b2 obj/middleware/control_library/filter/mcs_filter.o + .debug_str 0x0000000000000000 0x4c9 obj/middleware/control_library/filter/mcs_filter.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/filter/mcs_filter.o + .debug_frame 0x0000000000000000 0xa4 obj/middleware/control_library/filter/mcs_filter.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/filter/mcs_filter.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/filter/mcs_lpfRk4.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/filter/mcs_lpfRk4.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/filter/mcs_lpfRk4.o + .rodata 0x0000000000000000 0x48 obj/middleware/control_library/filter/mcs_lpfRk4.o + .text.LPFRK4_Clear + 0x0000000000000000 0x3a obj/middleware/control_library/filter/mcs_lpfRk4.o + .text.LPFRK4_Exec + 0x0000000000000000 0x218 obj/middleware/control_library/filter/mcs_lpfRk4.o + .debug_info 0x0000000000000000 0x14e obj/middleware/control_library/filter/mcs_lpfRk4.o + .debug_abbrev 0x0000000000000000 0xcc obj/middleware/control_library/filter/mcs_lpfRk4.o + .debug_aranges + 0x0000000000000000 0x28 obj/middleware/control_library/filter/mcs_lpfRk4.o + .debug_ranges 0x0000000000000000 0x18 obj/middleware/control_library/filter/mcs_lpfRk4.o + .debug_line 0x0000000000000000 0x156 obj/middleware/control_library/filter/mcs_lpfRk4.o + .debug_str 0x0000000000000000 0x4aa obj/middleware/control_library/filter/mcs_lpfRk4.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/filter/mcs_lpfRk4.o + .debug_frame 0x0000000000000000 0x5c obj/middleware/control_library/filter/mcs_lpfRk4.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/filter/mcs_lpfRk4.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/filter/mcs_pll.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/filter/mcs_pll.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/filter/mcs_pll.o + .rodata 0x0000000000000000 0x44 obj/middleware/control_library/filter/mcs_pll.o + .text.PLL_Init + 0x0000000000000000 0x130 obj/middleware/control_library/filter/mcs_pll.o + .text.PLL_ParamUpdate + 0x0000000000000000 0x9a obj/middleware/control_library/filter/mcs_pll.o + .text.PLL_Reset + 0x0000000000000000 0x68 obj/middleware/control_library/filter/mcs_pll.o + .text.PLL_Clear + 0x0000000000000000 0x40 obj/middleware/control_library/filter/mcs_pll.o + .text.PLL_Exec + 0x0000000000000000 0x188 obj/middleware/control_library/filter/mcs_pll.o + .text.PLL_SetTs + 0x0000000000000000 0x98 obj/middleware/control_library/filter/mcs_pll.o + .debug_info 0x0000000000000000 0x2fb obj/middleware/control_library/filter/mcs_pll.o + .debug_abbrev 0x0000000000000000 0xd9 obj/middleware/control_library/filter/mcs_pll.o + .debug_aranges + 0x0000000000000000 0x48 obj/middleware/control_library/filter/mcs_pll.o + .debug_ranges 0x0000000000000000 0x38 obj/middleware/control_library/filter/mcs_pll.o + .debug_line 0x0000000000000000 0x334 obj/middleware/control_library/filter/mcs_pll.o + .debug_str 0x0000000000000000 0x569 obj/middleware/control_library/filter/mcs_pll.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/filter/mcs_pll.o + .debug_frame 0x0000000000000000 0xf0 obj/middleware/control_library/filter/mcs_pll.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/filter/mcs_pll.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .rodata 0x0000000000000000 0x3c obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .text.CURRCTRL_Init + 0x0000000000000000 0x180 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .text.CURRCTRL_Reset + 0x0000000000000000 0x8c obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .text.CURRCTRL_Clear + 0x0000000000000000 0x54 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .text.CURRCTRL_Exec + 0x0000000000000000 0x10a obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .text.CURRCTRL_SetTs + 0x0000000000000000 0x9c obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .debug_info 0x0000000000000000 0x3e6 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .debug_abbrev 0x0000000000000000 0xd1 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .debug_aranges + 0x0000000000000000 0x40 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .debug_ranges 0x0000000000000000 0x30 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .debug_line 0x0000000000000000 0x358 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .debug_str 0x0000000000000000 0x607 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .debug_frame 0x0000000000000000 0xbc obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o + .rodata 0x0000000000000000 0x40 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o + .text.CURRFF_Exec + 0x0000000000000000 0xe8 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o + .debug_info 0x0000000000000000 0x191 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o + .debug_abbrev 0x0000000000000000 0xb2 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o + .debug_line 0x0000000000000000 0x114 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o + .debug_str 0x0000000000000000 0x508 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o + .debug_frame 0x0000000000000000 0x34 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .rodata 0x0000000000000000 0x48 obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .text.FW_Clear + 0x0000000000000000 0x3a obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .text.FW_Init 0x0000000000000000 0xec obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .text.FW_Exec 0x0000000000000000 0x24e obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .text.FW_SetTs + 0x0000000000000000 0x70 obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .debug_info 0x0000000000000000 0x29e obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .debug_abbrev 0x0000000000000000 0xd7 obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .debug_aranges + 0x0000000000000000 0x38 obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .debug_ranges 0x0000000000000000 0x28 obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .debug_line 0x0000000000000000 0x2cc obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .debug_str 0x0000000000000000 0x55b obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .debug_frame 0x0000000000000000 0xa4 obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .rodata 0x0000000000000000 0x48 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .text.IF_Init 0x0000000000000000 0x138 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .text.IF_Clear + 0x0000000000000000 0x42 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .text.IF_CurrAmpCalc + 0x0000000000000000 0x70 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .text.IF_CurrAngleCalc + 0x0000000000000000 0xc0 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .text.IF_SetAngleTs + 0x0000000000000000 0x70 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .debug_info 0x0000000000000000 0x1bd obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .debug_abbrev 0x0000000000000000 0xc8 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .debug_aranges + 0x0000000000000000 0x40 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .debug_ranges 0x0000000000000000 0x30 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .debug_line 0x0000000000000000 0x22e obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .debug_str 0x0000000000000000 0x524 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .debug_frame 0x0000000000000000 0xc8 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .text.POSCTRL_Clear + 0x0000000000000000 0x4a obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .text.POSCTRL_Init + 0x0000000000000000 0xf6 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .text.POSCTRL_ModeSelect + 0x0000000000000000 0x20 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .text.POSCTRL_SetSlope + 0x0000000000000000 0x42 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .text.POSCTRL_SetTarget + 0x0000000000000000 0x2a obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .text.POSCTRL_AngleExpand + 0x0000000000000000 0x124 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .text.POSCTRL_PidExec + 0x0000000000000000 0x3c obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .text.POSCTRL_Exec + 0x0000000000000000 0x86 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .text.POSCTRL_SetKp + 0x0000000000000000 0x20 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .text.POSCTRL_SetKi + 0x0000000000000000 0x20 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .text.POSCTRL_SetKd + 0x0000000000000000 0x20 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .text.POSCTRL_SetNs + 0x0000000000000000 0x20 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .rodata 0x0000000000000000 0x14 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .debug_info 0x0000000000000000 0x5fa obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .debug_abbrev 0x0000000000000000 0x133 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .debug_aranges + 0x0000000000000000 0x78 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .debug_ranges 0x0000000000000000 0x68 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .debug_line 0x0000000000000000 0x35a obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .debug_str 0x0000000000000000 0x732 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .debug_frame 0x0000000000000000 0x1a4 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .rodata 0x0000000000000000 0x3b obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .text.SPDCTRL_Init + 0x0000000000000000 0xe0 obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .text.SPDCTRL_Exec + 0x0000000000000000 0x64 obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .text.SPDCTRL_Clear + 0x0000000000000000 0x40 obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .text.SPDCTRL_Reset + 0x0000000000000000 0x58 obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .debug_info 0x0000000000000000 0x323 obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .debug_abbrev 0x0000000000000000 0xed obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .debug_aranges + 0x0000000000000000 0x38 obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .debug_ranges 0x0000000000000000 0x28 obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .debug_line 0x0000000000000000 0x227 obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .debug_str 0x0000000000000000 0x5d5 obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .debug_frame 0x0000000000000000 0xa4 obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o + .rodata 0x0000000000000000 0x40 obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o + .text.STARTUP_Init + 0x0000000000000000 0x108 obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o + .text.STARTUP_Clear + 0x0000000000000000 0x3a obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o + .text.STARTUP_CurrCal + 0x0000000000000000 0x82 obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o + .debug_info 0x0000000000000000 0x194 obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o + .debug_abbrev 0x0000000000000000 0xe9 obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o + .debug_aranges + 0x0000000000000000 0x30 obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o + .debug_ranges 0x0000000000000000 0x20 obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o + .debug_line 0x0000000000000000 0x16e obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o + .debug_str 0x0000000000000000 0x54d obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o + .debug_frame 0x0000000000000000 0x80 obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/math/mcs_math.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/math/mcs_math.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/math/mcs_math.o + .rodata.atanInBottom + 0x0000000000000000 0xc8 obj/middleware/control_library/math/mcs_math.o + .rodata.atanValBottom + 0x0000000000000000 0xc8 obj/middleware/control_library/math/mcs_math.o + .rodata.atanInMid + 0x0000000000000000 0x64 obj/middleware/control_library/math/mcs_math.o + .rodata.atanValMid + 0x0000000000000000 0x64 obj/middleware/control_library/math/mcs_math.o + .rodata.atanInTop + 0x0000000000000000 0x28 obj/middleware/control_library/math/mcs_math.o + .rodata.atanValTop + 0x0000000000000000 0x28 obj/middleware/control_library/math/mcs_math.o + .rodata.g_sinTable + 0x0000000000000000 0x800 obj/middleware/control_library/math/mcs_math.o + .text.TaylorCalSinIn90 + 0x0000000000000000 0xa4 obj/middleware/control_library/math/mcs_math.o + .text.GetSin 0x0000000000000000 0x10a obj/middleware/control_library/math/mcs_math.o + .text.GetCos 0x0000000000000000 0x11a obj/middleware/control_library/math/mcs_math.o + .rodata 0x0000000000000000 0x70 obj/middleware/control_library/math/mcs_math.o + .text.TrigCalc + 0x0000000000000000 0x62 obj/middleware/control_library/math/mcs_math.o + .text.ParkCalc + 0x0000000000000000 0xc4 obj/middleware/control_library/math/mcs_math.o + .text.InvParkCalc + 0x0000000000000000 0xc0 obj/middleware/control_library/math/mcs_math.o + .text.ClarkeCalc + 0x0000000000000000 0x84 obj/middleware/control_library/math/mcs_math.o + .text.Abs 0x0000000000000000 0x30 obj/middleware/control_library/math/mcs_math.o + .text.Clamp 0x0000000000000000 0x8c obj/middleware/control_library/math/mcs_math.o + .text.Max 0x0000000000000000 0x30 obj/middleware/control_library/math/mcs_math.o + .text.Min 0x0000000000000000 0x30 obj/middleware/control_library/math/mcs_math.o + .text.Sqrt 0x0000000000000000 0x60 obj/middleware/control_library/math/mcs_math.o + .text.AngleSub + 0x0000000000000000 0x9a obj/middleware/control_library/math/mcs_math.o + .text.BinSearch + 0x0000000000000000 0xb2 obj/middleware/control_library/math/mcs_math.o + .text.PreLookBinSearch + 0x0000000000000000 0x110 obj/middleware/control_library/math/mcs_math.o + .text.ATan 0x0000000000000000 0x216 obj/middleware/control_library/math/mcs_math.o + .text.Mod 0x0000000000000000 0x80 obj/middleware/control_library/math/mcs_math.o + .text.Atan2 0x0000000000000000 0x148 obj/middleware/control_library/math/mcs_math.o + .text.Sat 0x0000000000000000 0x8c obj/middleware/control_library/math/mcs_math.o + .debug_info 0x0000000000000000 0x7cc obj/middleware/control_library/math/mcs_math.o + .debug_abbrev 0x0000000000000000 0x1f7 obj/middleware/control_library/math/mcs_math.o + .debug_aranges + 0x0000000000000000 0xb0 obj/middleware/control_library/math/mcs_math.o + .debug_ranges 0x0000000000000000 0xa0 obj/middleware/control_library/math/mcs_math.o + .debug_line 0x0000000000000000 0x6fa obj/middleware/control_library/math/mcs_math.o + .debug_str 0x0000000000000000 0x661 obj/middleware/control_library/math/mcs_math.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/math/mcs_math.o + .debug_frame 0x0000000000000000 0x2bc obj/middleware/control_library/math/mcs_math.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/math/mcs_math.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .rodata 0x0000000000000000 0x44 obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .text.R1SVPWM_Init + 0x0000000000000000 0x142 obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .text.R1SVPWM_Clear + 0x0000000000000000 0x52 obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .text.R1SVPWM_PhaseShift + 0x0000000000000000 0x18e obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .text.R1SVPWM_Exec + 0x0000000000000000 0x258 obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .text.R1CurrReconstruct + 0x0000000000000000 0x186 obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .rodata.R1CurrReconstruct + 0x0000000000000000 0x1c obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .debug_info 0x0000000000000000 0x3fc obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .debug_abbrev 0x0000000000000000 0xe3 obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .debug_aranges + 0x0000000000000000 0x40 obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .debug_ranges 0x0000000000000000 0x30 obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .debug_line 0x0000000000000000 0x45f obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .debug_str 0x0000000000000000 0x621 obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .debug_frame 0x0000000000000000 0xd4 obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/modulation/mcs_r1_svpwm.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/modulation/mcs_svpwm.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/modulation/mcs_svpwm.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/modulation/mcs_svpwm.o + .rodata 0x0000000000000000 0x4c obj/middleware/control_library/modulation/mcs_svpwm.o + .text.SVPWM_Init + 0x0000000000000000 0x86 obj/middleware/control_library/modulation/mcs_svpwm.o + .text.SVPWM_SectorCalc + 0x0000000000000000 0x138 obj/middleware/control_library/modulation/mcs_svpwm.o + .text.SVPWM_CompareValCalc + 0x0000000000000000 0x148 obj/middleware/control_library/modulation/mcs_svpwm.o + .rodata.SVPWM_CompareValCalc + 0x0000000000000000 0x1c obj/middleware/control_library/modulation/mcs_svpwm.o + .text.SVPWM_IndexConvert + 0x0000000000000000 0xee obj/middleware/control_library/modulation/mcs_svpwm.o + .rodata.SVPWM_IndexConvert + 0x0000000000000000 0x1c obj/middleware/control_library/modulation/mcs_svpwm.o + .text.SVPWM_Exec + 0x0000000000000000 0x204 obj/middleware/control_library/modulation/mcs_svpwm.o + .debug_info 0x0000000000000000 0x2c5 obj/middleware/control_library/modulation/mcs_svpwm.o + .debug_abbrev 0x0000000000000000 0xcb obj/middleware/control_library/modulation/mcs_svpwm.o + .debug_aranges + 0x0000000000000000 0x40 obj/middleware/control_library/modulation/mcs_svpwm.o + .debug_ranges 0x0000000000000000 0x30 obj/middleware/control_library/modulation/mcs_svpwm.o + .debug_line 0x0000000000000000 0x3d2 obj/middleware/control_library/modulation/mcs_svpwm.o + .debug_str 0x0000000000000000 0x585 obj/middleware/control_library/modulation/mcs_svpwm.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/modulation/mcs_svpwm.o + .debug_frame 0x0000000000000000 0xd0 obj/middleware/control_library/modulation/mcs_svpwm.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/modulation/mcs_svpwm.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/observer/mcs_fosmo.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/observer/mcs_fosmo.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/observer/mcs_fosmo.o + .rodata 0x0000000000000000 0x48 obj/middleware/control_library/observer/mcs_fosmo.o + .text.FOSMO_Init + 0x0000000000000000 0x166 obj/middleware/control_library/observer/mcs_fosmo.o + .text.FOSMO_ParamUpdate + 0x0000000000000000 0x15c obj/middleware/control_library/observer/mcs_fosmo.o + .text.FOSMO_Clear + 0x0000000000000000 0x96 obj/middleware/control_library/observer/mcs_fosmo.o + .text.FOSMO_Exec + 0x0000000000000000 0x38e obj/middleware/control_library/observer/mcs_fosmo.o + .text.FOSMO_SetTs + 0x0000000000000000 0x9c obj/middleware/control_library/observer/mcs_fosmo.o + .text.FOSMO_SetLambda + 0x0000000000000000 0xa4 obj/middleware/control_library/observer/mcs_fosmo.o + .debug_info 0x0000000000000000 0x5dd obj/middleware/control_library/observer/mcs_fosmo.o + .debug_abbrev 0x0000000000000000 0xe0 obj/middleware/control_library/observer/mcs_fosmo.o + .debug_aranges + 0x0000000000000000 0x48 obj/middleware/control_library/observer/mcs_fosmo.o + .debug_ranges 0x0000000000000000 0x38 obj/middleware/control_library/observer/mcs_fosmo.o + .debug_line 0x0000000000000000 0x4e2 obj/middleware/control_library/observer/mcs_fosmo.o + .debug_str 0x0000000000000000 0x6d0 obj/middleware/control_library/observer/mcs_fosmo.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/observer/mcs_fosmo.o + .debug_frame 0x0000000000000000 0xf8 obj/middleware/control_library/observer/mcs_fosmo.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/observer/mcs_fosmo.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/pfc/pfc_curr_ctrl.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/pfc/pfc_curr_ctrl.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/pfc/pfc_curr_ctrl.o + .rodata 0x0000000000000000 0x32 obj/middleware/control_library/pfc/pfc_curr_ctrl.o + .text.PFC_CurrCtrlClear + 0x0000000000000000 0x42 obj/middleware/control_library/pfc/pfc_curr_ctrl.o + .text.PFC_CurrCtrlExec + 0x0000000000000000 0x64 obj/middleware/control_library/pfc/pfc_curr_ctrl.o + .debug_info 0x0000000000000000 0x1f4 obj/middleware/control_library/pfc/pfc_curr_ctrl.o + .debug_abbrev 0x0000000000000000 0xac obj/middleware/control_library/pfc/pfc_curr_ctrl.o + .debug_aranges + 0x0000000000000000 0x28 obj/middleware/control_library/pfc/pfc_curr_ctrl.o + .debug_ranges 0x0000000000000000 0x18 obj/middleware/control_library/pfc/pfc_curr_ctrl.o + .debug_line 0x0000000000000000 0x10c obj/middleware/control_library/pfc/pfc_curr_ctrl.o + .debug_str 0x0000000000000000 0x595 obj/middleware/control_library/pfc/pfc_curr_ctrl.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/pfc/pfc_curr_ctrl.o + .debug_frame 0x0000000000000000 0x58 obj/middleware/control_library/pfc/pfc_curr_ctrl.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/pfc/pfc_curr_ctrl.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/pfc/pfc_volt_ctrl.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/pfc/pfc_volt_ctrl.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/pfc/pfc_volt_ctrl.o + .rodata 0x0000000000000000 0x32 obj/middleware/control_library/pfc/pfc_volt_ctrl.o + .text.PFC_VoltCtrlClear + 0x0000000000000000 0x42 obj/middleware/control_library/pfc/pfc_volt_ctrl.o + .text.PFC_VoltCtrlExec + 0x0000000000000000 0x62 obj/middleware/control_library/pfc/pfc_volt_ctrl.o + .debug_info 0x0000000000000000 0x1ac obj/middleware/control_library/pfc/pfc_volt_ctrl.o + .debug_abbrev 0x0000000000000000 0xac obj/middleware/control_library/pfc/pfc_volt_ctrl.o + .debug_aranges + 0x0000000000000000 0x28 obj/middleware/control_library/pfc/pfc_volt_ctrl.o + .debug_ranges 0x0000000000000000 0x18 obj/middleware/control_library/pfc/pfc_volt_ctrl.o + .debug_line 0x0000000000000000 0x10c obj/middleware/control_library/pfc/pfc_volt_ctrl.o + .debug_str 0x0000000000000000 0x549 obj/middleware/control_library/pfc/pfc_volt_ctrl.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/pfc/pfc_volt_ctrl.o + .debug_frame 0x0000000000000000 0x58 obj/middleware/control_library/pfc/pfc_volt_ctrl.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/pfc/pfc_volt_ctrl.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .rodata 0x0000000000000000 0x40 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .text.PID_Reset + 0x0000000000000000 0x7e obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .text.PID_Clear + 0x0000000000000000 0x62 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .text.PI_Exec 0x0000000000000000 0xe0 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .text.PID_Exec + 0x0000000000000000 0x1de obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .text.PID_SetKp + 0x0000000000000000 0x40 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .text.PID_SetKi + 0x0000000000000000 0x40 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .text.PID_SetKd + 0x0000000000000000 0x40 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .text.PID_SetNs + 0x0000000000000000 0x70 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .text.PID_SetTs + 0x0000000000000000 0x70 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .text.PID_SetLimit + 0x0000000000000000 0x7e obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .debug_info 0x0000000000000000 0x381 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .debug_abbrev 0x0000000000000000 0xf5 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .debug_aranges + 0x0000000000000000 0x68 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .debug_ranges 0x0000000000000000 0x58 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .debug_line 0x0000000000000000 0x368 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .debug_str 0x0000000000000000 0x549 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .debug_frame 0x0000000000000000 0x180 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/power/mcs_power_mgmt.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/power/mcs_power_mgmt.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/power/mcs_power_mgmt.o + .rodata 0x0000000000000000 0x3c obj/middleware/control_library/power/mcs_power_mgmt.o + .text.MotorPowerInit + 0x0000000000000000 0x8e obj/middleware/control_library/power/mcs_power_mgmt.o + .text.MotorPowerCalc + 0x0000000000000000 0x7e obj/middleware/control_library/power/mcs_power_mgmt.o + .text.MotorPowerClear + 0x0000000000000000 0x3a obj/middleware/control_library/power/mcs_power_mgmt.o + .debug_info 0x0000000000000000 0x152 obj/middleware/control_library/power/mcs_power_mgmt.o + .debug_abbrev 0x0000000000000000 0xd7 obj/middleware/control_library/power/mcs_power_mgmt.o + .debug_aranges + 0x0000000000000000 0x30 obj/middleware/control_library/power/mcs_power_mgmt.o + .debug_ranges 0x0000000000000000 0x20 obj/middleware/control_library/power/mcs_power_mgmt.o + .debug_line 0x0000000000000000 0x17d obj/middleware/control_library/power/mcs_power_mgmt.o + .debug_str 0x0000000000000000 0x4db obj/middleware/control_library/power/mcs_power_mgmt.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/power/mcs_power_mgmt.o + .debug_frame 0x0000000000000000 0x7c obj/middleware/control_library/power/mcs_power_mgmt.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/power/mcs_power_mgmt.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/protection/mcs_openphs_det.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/protection/mcs_openphs_det.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/protection/mcs_openphs_det.o + .rodata 0x0000000000000000 0x3b obj/middleware/control_library/protection/mcs_openphs_det.o + .text.OPD_Init + 0x0000000000000000 0x88 obj/middleware/control_library/protection/mcs_openphs_det.o + .text.OPD_Exec + 0x0000000000000000 0x100 obj/middleware/control_library/protection/mcs_openphs_det.o + .text.OPD_Clear + 0x0000000000000000 0x4a obj/middleware/control_library/protection/mcs_openphs_det.o + .debug_info 0x0000000000000000 0x17a obj/middleware/control_library/protection/mcs_openphs_det.o + .debug_abbrev 0x0000000000000000 0xf8 obj/middleware/control_library/protection/mcs_openphs_det.o + .debug_aranges + 0x0000000000000000 0x30 obj/middleware/control_library/protection/mcs_openphs_det.o + .debug_ranges 0x0000000000000000 0x20 obj/middleware/control_library/protection/mcs_openphs_det.o + .debug_line 0x0000000000000000 0x1d7 obj/middleware/control_library/protection/mcs_openphs_det.o + .debug_str 0x0000000000000000 0x51e obj/middleware/control_library/protection/mcs_openphs_det.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/protection/mcs_openphs_det.o + .debug_frame 0x0000000000000000 0x7c obj/middleware/control_library/protection/mcs_openphs_det.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/protection/mcs_openphs_det.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/protection/mcs_stall_det.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/protection/mcs_stall_det.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/protection/mcs_stall_det.o + .rodata 0x0000000000000000 0x39 obj/middleware/control_library/protection/mcs_stall_det.o + .text.STD_Init + 0x0000000000000000 0x132 obj/middleware/control_library/protection/mcs_stall_det.o + .text.STD_Exec_ByCurrSpd + 0x0000000000000000 0xb4 obj/middleware/control_library/protection/mcs_stall_det.o + .text.STD_Clear + 0x0000000000000000 0x3a obj/middleware/control_library/protection/mcs_stall_det.o + .debug_info 0x0000000000000000 0x187 obj/middleware/control_library/protection/mcs_stall_det.o + .debug_abbrev 0x0000000000000000 0xe6 obj/middleware/control_library/protection/mcs_stall_det.o + .debug_aranges + 0x0000000000000000 0x30 obj/middleware/control_library/protection/mcs_stall_det.o + .debug_ranges 0x0000000000000000 0x20 obj/middleware/control_library/protection/mcs_stall_det.o + .debug_line 0x0000000000000000 0x1bb obj/middleware/control_library/protection/mcs_stall_det.o + .debug_str 0x0000000000000000 0x505 obj/middleware/control_library/protection/mcs_stall_det.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/protection/mcs_stall_det.o + .debug_frame 0x0000000000000000 0x80 obj/middleware/control_library/protection/mcs_stall_det.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/protection/mcs_stall_det.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/protection/mcs_unbalance_det.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/protection/mcs_unbalance_det.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/protection/mcs_unbalance_det.o + .rodata 0x0000000000000000 0x60 obj/middleware/control_library/protection/mcs_unbalance_det.o + .text.UNBAL_Init + 0x0000000000000000 0xe4 obj/middleware/control_library/protection/mcs_unbalance_det.o + .text.UNBAL_RmsCurrCalc + 0x0000000000000000 0x1b6 obj/middleware/control_library/protection/mcs_unbalance_det.o + .text.UNBAL_RmsCurrGet + 0x0000000000000000 0x120 obj/middleware/control_library/protection/mcs_unbalance_det.o + .text.UNBAL_Calc + 0x0000000000000000 0x2b0 obj/middleware/control_library/protection/mcs_unbalance_det.o + .text.UNBAL_Det + 0x0000000000000000 0xb2 obj/middleware/control_library/protection/mcs_unbalance_det.o + .text.UNBAL_Clear + 0x0000000000000000 0x62 obj/middleware/control_library/protection/mcs_unbalance_det.o + .debug_info 0x0000000000000000 0x395 obj/middleware/control_library/protection/mcs_unbalance_det.o + .debug_abbrev 0x0000000000000000 0x116 obj/middleware/control_library/protection/mcs_unbalance_det.o + .debug_aranges + 0x0000000000000000 0x48 obj/middleware/control_library/protection/mcs_unbalance_det.o + .debug_ranges 0x0000000000000000 0x38 obj/middleware/control_library/protection/mcs_unbalance_det.o + .debug_line 0x0000000000000000 0x3d0 obj/middleware/control_library/protection/mcs_unbalance_det.o + .debug_str 0x0000000000000000 0x5bd obj/middleware/control_library/protection/mcs_unbalance_det.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/protection/mcs_unbalance_det.o + .debug_frame 0x0000000000000000 0xf8 obj/middleware/control_library/protection/mcs_unbalance_det.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/protection/mcs_unbalance_det.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .rodata 0x0000000000000000 0x33 obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .text.RMG_Init + 0x0000000000000000 0x9c obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .text.RMG_Clear + 0x0000000000000000 0x3a obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .text.RMG_Exec + 0x0000000000000000 0xba obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .text.RMG_SetTs + 0x0000000000000000 0x56 obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .text.RMG_SetSlope + 0x0000000000000000 0x86 obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .debug_info 0x0000000000000000 0x19f obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .debug_abbrev 0x0000000000000000 0xe6 obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .debug_aranges + 0x0000000000000000 0x40 obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .debug_ranges 0x0000000000000000 0x30 obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .debug_line 0x0000000000000000 0x1c8 obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .debug_str 0x0000000000000000 0x4ce obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .debug_frame 0x0000000000000000 0xc4 obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/ramp/mcs_ramp_mgmt.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/utilities/mcs_mtr_param.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/utilities/mcs_mtr_param.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/utilities/mcs_mtr_param.o + .rodata 0x0000000000000000 0x3c obj/middleware/control_library/utilities/mcs_mtr_param.o + .text.MtrParamInit + 0x0000000000000000 0x9a obj/middleware/control_library/utilities/mcs_mtr_param.o + .debug_info 0x0000000000000000 0x131 obj/middleware/control_library/utilities/mcs_mtr_param.o + .debug_abbrev 0x0000000000000000 0x8c obj/middleware/control_library/utilities/mcs_mtr_param.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/control_library/utilities/mcs_mtr_param.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/control_library/utilities/mcs_mtr_param.o + .debug_line 0x0000000000000000 0xcf obj/middleware/control_library/utilities/mcs_mtr_param.o + .debug_str 0x0000000000000000 0x4f8 obj/middleware/control_library/utilities/mcs_mtr_param.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/utilities/mcs_mtr_param.o + .debug_frame 0x0000000000000000 0x38 obj/middleware/control_library/utilities/mcs_mtr_param.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/utilities/mcs_mtr_param.o + .text 0x0000000000000000 0x0 obj/middleware/control_library/vf/mcs_vf_ctrl.o + .data 0x0000000000000000 0x0 obj/middleware/control_library/vf/mcs_vf_ctrl.o + .bss 0x0000000000000000 0x0 obj/middleware/control_library/vf/mcs_vf_ctrl.o + .rodata 0x0000000000000000 0x40 obj/middleware/control_library/vf/mcs_vf_ctrl.o + .text.VF_Init 0x0000000000000000 0x15c obj/middleware/control_library/vf/mcs_vf_ctrl.o + .text.VF_Exec 0x0000000000000000 0x1e8 obj/middleware/control_library/vf/mcs_vf_ctrl.o + .text.VF_Clear + 0x0000000000000000 0x52 obj/middleware/control_library/vf/mcs_vf_ctrl.o + .text.VF_SetTs + 0x0000000000000000 0x86 obj/middleware/control_library/vf/mcs_vf_ctrl.o + .text.VF_SetSpdSlope + 0x0000000000000000 0x4c obj/middleware/control_library/vf/mcs_vf_ctrl.o + .text.VF_SetDRatio + 0x0000000000000000 0xbc obj/middleware/control_library/vf/mcs_vf_ctrl.o + .debug_info 0x0000000000000000 0x300 obj/middleware/control_library/vf/mcs_vf_ctrl.o + .debug_abbrev 0x0000000000000000 0xda obj/middleware/control_library/vf/mcs_vf_ctrl.o + .debug_aranges + 0x0000000000000000 0x48 obj/middleware/control_library/vf/mcs_vf_ctrl.o + .debug_ranges 0x0000000000000000 0x38 obj/middleware/control_library/vf/mcs_vf_ctrl.o + .debug_line 0x0000000000000000 0x36c obj/middleware/control_library/vf/mcs_vf_ctrl.o + .debug_str 0x0000000000000000 0x541 obj/middleware/control_library/vf/mcs_vf_ctrl.o + .comment 0x0000000000000000 0x2a obj/middleware/control_library/vf/mcs_vf_ctrl.o + .debug_frame 0x0000000000000000 0xf0 obj/middleware/control_library/vf/mcs_vf_ctrl.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/control_library/vf/mcs_vf_ctrl.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o + .text.fscanf_s + 0x0000000000000000 0x52 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o + .debug_info 0x0000000000000000 0x106 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o + .debug_abbrev 0x0000000000000000 0xb8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o + .debug_line 0x0000000000000000 0x146 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o + .debug_str 0x0000000000000000 0x4dd obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o + .debug_frame 0x0000000000000000 0x38 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o + .text.fwscanf_s + 0x0000000000000000 0x52 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o + .debug_info 0x0000000000000000 0x111 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o + .debug_abbrev 0x0000000000000000 0xc5 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o + .debug_line 0x0000000000000000 0x147 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o + .debug_str 0x0000000000000000 0x4e7 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o + .debug_frame 0x0000000000000000 0x38 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o + .text.SecTrimCRLF + 0x0000000000000000 0x82 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o + .text.gets_s 0x0000000000000000 0x72 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o + .debug_info 0x0000000000000000 0x12c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o + .debug_abbrev 0x0000000000000000 0xcd obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o + .debug_aranges + 0x0000000000000000 0x28 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o + .debug_ranges 0x0000000000000000 0x18 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o + .debug_line 0x0000000000000000 0x1c2 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o + .debug_str 0x0000000000000000 0x4e9 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o + .debug_frame 0x0000000000000000 0x58 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .text.SecMemcpyError + 0x0000000000000000 0xde obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .text.memcpy_s + 0x0000000000000000 0x126 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .text.memcpy_sOptAsm + 0x0000000000000000 0xfb4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .rodata.memcpy_sOptAsm + 0x0000000000000000 0x208 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .text.memcpy_sOptTc + 0x0000000000000000 0xf9e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .rodata.memcpy_sOptTc + 0x0000000000000000 0x208 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .debug_info 0x0000000000000000 0xf00 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .debug_abbrev 0x0000000000000000 0x112 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .debug_aranges + 0x0000000000000000 0x38 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .debug_ranges 0x0000000000000000 0x28 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .debug_line 0x0000000000000000 0x10e7 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .debug_str 0x0000000000000000 0x806 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .debug_frame 0x0000000000000000 0xac obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o + .text.memmove_s + 0x0000000000000000 0xb4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o + .debug_info 0x0000000000000000 0x10c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o + .debug_abbrev 0x0000000000000000 0xb4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o + .debug_line 0x0000000000000000 0x1ec obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o + .debug_str 0x0000000000000000 0x4df obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o + .debug_frame 0x0000000000000000 0x34 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .rodata.g_allZero + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .rodata.g_allFF + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .text.SecStrictAliasingCast + 0x0000000000000000 0x16 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .text.SecMemsetError + 0x0000000000000000 0x58 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .text.memset_s + 0x0000000000000000 0x8a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .text.memset_sOptAsm + 0x0000000000000000 0x10bc obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .rodata.memset_sOptAsm + 0x0000000000000000 0x210 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .text.memset_sOptTc + 0x0000000000000000 0x10a6 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .rodata.memset_sOptTc + 0x0000000000000000 0x210 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .debug_info 0x0000000000000000 0xa58 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .debug_abbrev 0x0000000000000000 0x16a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .debug_aranges + 0x0000000000000000 0x40 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .debug_ranges 0x0000000000000000 0x60 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .debug_line 0x0000000000000000 0xe0c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .debug_str 0x0000000000000000 0x767 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .debug_frame 0x0000000000000000 0xc8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o + .text.scanf_s 0x0000000000000000 0x4c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o + .debug_info 0x0000000000000000 0xf7 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o + .debug_abbrev 0x0000000000000000 0xb8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o + .debug_line 0x0000000000000000 0x145 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o + .debug_str 0x0000000000000000 0x4d4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o + .debug_frame 0x0000000000000000 0x34 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o + .rodata 0x0000000000000000 0x7 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o + .text.GetHwSecureCVersion + 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o + .debug_info 0x0000000000000000 0xdb obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o + .debug_abbrev 0x0000000000000000 0x8c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o + .debug_line 0x0000000000000000 0x14a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o + .debug_str 0x0000000000000000 0x4e6 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o + .debug_frame 0x0000000000000000 0x30 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.__isspace + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecBracketSetBit + 0x0000000000000000 0x5a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecBracketSetBitRange + 0x0000000000000000 0x68 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecCanInputForBracket + 0x0000000000000000 0x6c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecCanInputString + 0x0000000000000000 0x48 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecCanInputCharacter + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecNumberArgType + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecAssignNarrowFloat + 0x0000000000000000 0x8c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecAssignFloat + 0x0000000000000000 0x30 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecInitFloatSpec + 0x0000000000000000 0x3a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecFreeFloatSpec + 0x0000000000000000 0x98 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecExtendFloatLen + 0x0000000000000000 0x104 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecIsFloatDecimal + 0x0000000000000000 0x22 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecInputFloatSign + 0x0000000000000000 0xec obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecInputFloatDigit + 0x0000000000000000 0xe4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecInputFloatE + 0x0000000000000000 0x5c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecInputFloatFractional + 0x0000000000000000 0xfa obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecInputFloatExponent + 0x0000000000000000 0x102 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecInputFloat + 0x0000000000000000 0xba obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecIsLeadByte + 0x0000000000000000 0x22 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecUpdateWcharFlagByType + 0x0000000000000000 0x56 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecDecodeScanQualifierL + 0x0000000000000000 0x68 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecDecodeScanQualifierI + 0x0000000000000000 0x112 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecDecodeScanWidth + 0x0000000000000000 0x96 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecSetDefaultScanSpec + 0x0000000000000000 0x8e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecDecodeScanQualifier + 0x0000000000000000 0xda obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .rodata.SecDecodeScanQualifier + 0x0000000000000000 0x144 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecDecodeScanFlag + 0x0000000000000000 0x76 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecDecodeClearFormat + 0x0000000000000000 0xe8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecAddEndingZero + 0x0000000000000000 0x3c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecDecodeClearArg + 0x0000000000000000 0x5c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecClearDestBuf + 0x0000000000000000 0x10e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecAssignNumber + 0x0000000000000000 0x9e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecIsLongBitEqual + 0x0000000000000000 0x1e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecHexValueOfChar + 0x0000000000000000 0x46 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecDecodeNumberDecimal + 0x0000000000000000 0xdc obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecDecodeNumberHex + 0x0000000000000000 0x5a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecDecodeNumberOctal + 0x0000000000000000 0x4c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecFinishNumberNegativeOther + 0x0000000000000000 0xae obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecFinishNumberNegativeInt + 0x0000000000000000 0xb4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecFinishNumberPositiveOther + 0x0000000000000000 0x98 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecFinishNumberPositiveInt + 0x0000000000000000 0x96 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecDecodeNumber64Decimal + 0x0000000000000000 0x166 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecDecodeNumber64Hex + 0x0000000000000000 0x98 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecDecodeNumber64Octal + 0x0000000000000000 0xa2 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecDecodeNumber + 0x0000000000000000 0xd8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecFinishNumber + 0x0000000000000000 0x6c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecFinishNumber64 + 0x0000000000000000 0x164 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecSeekStream + 0x0000000000000000 0x96 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecAdjustStream + 0x0000000000000000 0x4e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecSkipSpaceFormat + 0x0000000000000000 0x4a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecSetupBracketTable + 0x0000000000000000 0x17c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecConvertInputCharToWchar + 0x0000000000000000 0x11c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecInputForChar + 0x0000000000000000 0x9c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecInputNumberDigital + 0x0000000000000000 0xc4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecInputNumber + 0x0000000000000000 0x20c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecInputString + 0x0000000000000000 0x1bc obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecInputS + 0x0000000000000000 0x5f2 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .rodata.SecInputS + 0x0000000000000000 0x64 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecGetCharFromStream + 0x0000000000000000 0x2e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecReadAndSkipBomHeader + 0x0000000000000000 0x9a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecGetCharFromFile + 0x0000000000000000 0x1b0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecGetChar + 0x0000000000000000 0xb2 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecUnGetCharImpl + 0x0000000000000000 0xd0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecUnGetChar + 0x0000000000000000 0x48 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecSkipSpaceChar + 0x0000000000000000 0x50 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecIsDigit + 0x0000000000000000 0x22 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecIsXdigit + 0x0000000000000000 0x28 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text.SecIsSpace + 0x0000000000000000 0x28 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .rodata.secDecodeNumberHex.2353 + 0x0000000000000000 0x8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .rodata.secDecodeNumberOctal.2355 + 0x0000000000000000 0x8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .rodata.secDecodeNumberDecimal.2357 + 0x0000000000000000 0x8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .rodata.secFinishNumber.2408 + 0x0000000000000000 0x8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .debug_info 0x0000000000000000 0x14c5 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .debug_abbrev 0x0000000000000000 0x269 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .debug_aranges + 0x0000000000000000 0x230 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .debug_ranges 0x0000000000000000 0x220 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .debug_line 0x0000000000000000 0x1e20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .debug_str 0x0000000000000000 0xd4c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .debug_frame 0x0000000000000000 0x93c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecBracketSetBit + 0x0000000000000000 0x5e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecBracketSetBitRange + 0x0000000000000000 0x5e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecCanInputForBracket + 0x0000000000000000 0x80 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecCanInputString + 0x0000000000000000 0x48 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecCanInputCharacter + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecNumberArgType + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecAssignNarrowFloat + 0x0000000000000000 0x8c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecAssignWideFloat + 0x0000000000000000 0xb8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecAssignFloat + 0x0000000000000000 0x2c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecInitFloatSpec + 0x0000000000000000 0x3a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecFreeFloatSpec + 0x0000000000000000 0x9a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecExtendFloatLen + 0x0000000000000000 0x10a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecIsFloatDecimal + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecInputFloatSign + 0x0000000000000000 0xee obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecInputFloatDigit + 0x0000000000000000 0xe2 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecInputFloatE + 0x0000000000000000 0x5c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecInputFloatFractional + 0x0000000000000000 0xf4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecInputFloatExponent + 0x0000000000000000 0x104 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecInputFloat + 0x0000000000000000 0xbc obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecUpdateWcharFlagByType + 0x0000000000000000 0x54 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecDecodeScanQualifierL + 0x0000000000000000 0x68 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecDecodeScanQualifierI + 0x0000000000000000 0x112 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecDecodeScanWidth + 0x0000000000000000 0x98 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecSetDefaultScanSpec + 0x0000000000000000 0x8e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecDecodeScanQualifier + 0x0000000000000000 0xda obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .rodata.SecDecodeScanQualifier + 0x0000000000000000 0x144 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecDecodeScanFlag + 0x0000000000000000 0x76 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecDecodeClearFormat + 0x0000000000000000 0xe6 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecAddEndingZero + 0x0000000000000000 0x3c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecDecodeClearArg + 0x0000000000000000 0x5c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecClearDestBufW + 0x0000000000000000 0x10c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecAssignNumber + 0x0000000000000000 0x9e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecIsLongBitEqual + 0x0000000000000000 0x1e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecHexValueOfChar + 0x0000000000000000 0x46 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecDecodeNumberDecimal + 0x0000000000000000 0xdc obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecDecodeNumberHex + 0x0000000000000000 0x5a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecDecodeNumberOctal + 0x0000000000000000 0x4c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecFinishNumberNegativeOther + 0x0000000000000000 0xae obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecFinishNumberNegativeInt + 0x0000000000000000 0xb4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecFinishNumberPositiveOther + 0x0000000000000000 0x98 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecFinishNumberPositiveInt + 0x0000000000000000 0x96 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecDecodeNumber64Decimal + 0x0000000000000000 0x166 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecDecodeNumber64Hex + 0x0000000000000000 0x98 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecDecodeNumber64Octal + 0x0000000000000000 0xa2 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecDecodeNumber + 0x0000000000000000 0xd8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecFinishNumber + 0x0000000000000000 0x6c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecFinishNumber64 + 0x0000000000000000 0x164 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecSeekStream + 0x0000000000000000 0x96 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecAdjustStream + 0x0000000000000000 0x4e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecSkipSpaceFormat + 0x0000000000000000 0x4a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecSetupBracketTable + 0x0000000000000000 0x17c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecInputForWchar + 0x0000000000000000 0xec obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecInputNumberDigital + 0x0000000000000000 0xc4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecInputNumber + 0x0000000000000000 0x200 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecInputString + 0x0000000000000000 0x1b8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecAllocBracketTable + 0x0000000000000000 0x3e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecFreeBracketTable + 0x0000000000000000 0x36 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecInputSW + 0x0000000000000000 0x5fc obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .rodata.SecInputSW + 0x0000000000000000 0x64 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecGetCharFromStream + 0x0000000000000000 0x2e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecReadAndSkipBomHeader + 0x0000000000000000 0xa6 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecGetCharFromFile + 0x0000000000000000 0x1b0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecGetChar + 0x0000000000000000 0xb0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecUnGetCharImpl + 0x0000000000000000 0xd0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecUnGetChar + 0x0000000000000000 0x48 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecSkipSpaceChar + 0x0000000000000000 0x50 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecWcharHighBits + 0x0000000000000000 0x1a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecWcharLowByte + 0x0000000000000000 0x18 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecIsDigit + 0x0000000000000000 0x42 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecIsXdigit + 0x0000000000000000 0x44 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text.SecIsSpace + 0x0000000000000000 0x24 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .rodata.secDecodeNumberHex.2704 + 0x0000000000000000 0x8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .rodata.secDecodeNumberOctal.2706 + 0x0000000000000000 0x8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .rodata.secDecodeNumberDecimal.2708 + 0x0000000000000000 0x8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .rodata.secFinishNumber.2749 + 0x0000000000000000 0x8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .debug_info 0x0000000000000000 0x151b obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .debug_abbrev 0x0000000000000000 0x24f obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .debug_aranges + 0x0000000000000000 0x240 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .debug_ranges 0x0000000000000000 0x230 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .debug_line 0x0000000000000000 0x1e0d obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .debug_str 0x0000000000000000 0xda0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .debug_frame 0x0000000000000000 0x980 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .rodata.g_itoaUpperDigits + 0x0000000000000000 0x14 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .rodata.g_itoaLowerDigits + 0x0000000000000000 0x14 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecFormatFloat + 0x0000000000000000 0x52 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecFormatLongDouble + 0x0000000000000000 0x1c8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecFormatDouble + 0x0000000000000000 0x136 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecIsSameSize + 0x0000000000000000 0x28 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecNumber32ToOctalString + 0x0000000000000000 0x5c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecNumber32ToHexString + 0x0000000000000000 0x58 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecNumber32ToDecStringFast + 0x0000000000000000 0xd8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecNumber32ToString + 0x0000000000000000 0x6a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecNumber64ToDecString + 0x0000000000000000 0xa0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecNumber64ToOctalString + 0x0000000000000000 0x8a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecNumber64ToHexString + 0x0000000000000000 0x7e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecNumber64ToString + 0x0000000000000000 0x7a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecNumberToString + 0x0000000000000000 0x52 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecIsNumberNeedTo32Bit + 0x0000000000000000 0x3e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecNumberToBuffer + 0x0000000000000000 0xf6 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecWriteChar + 0x0000000000000000 0x6a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecWriteMultiChar + 0x0000000000000000 0x8c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecWriteString + 0x0000000000000000 0xa0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecWriteStringByLoop + 0x0000000000000000 0x7a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecWriteStringOpt + 0x0000000000000000 0x82 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecIsStreamBufEnough + 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecWriteTextOpt + 0x0000000000000000 0x76 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecWriteLeftPadding + 0x0000000000000000 0x4e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecWritePrefix + 0x0000000000000000 0x4a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecWriteLeadingZero + 0x0000000000000000 0x58 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecWriteRightPadding + 0x0000000000000000 0x58 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecWriteTextAfterWctomb + 0x0000000000000000 0xaa obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecWriteFloatText + 0x0000000000000000 0x3e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecWriteText + 0x0000000000000000 0x5c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecDecodeState + 0x0000000000000000 0x50 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecDecodeFlags + 0x0000000000000000 0x92 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .rodata.SecDecodeFlags + 0x0000000000000000 0x44 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecDecodeSizeI + 0x0000000000000000 0x11a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecDecodeSize + 0x0000000000000000 0x154 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .rodata.SecDecodeSize + 0x0000000000000000 0xc8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecDecodeTypeC + 0x0000000000000000 0x88 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecDecodeTypeSchar + 0x0000000000000000 0xb2 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecDecodeTypeSwchar + 0x0000000000000000 0x90 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecDecodeTypeS + 0x0000000000000000 0x5e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecDecodePrecision + 0x0000000000000000 0x88 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecDecodeWidth + 0x0000000000000000 0xb6 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecUpdateWcharFlags + 0x0000000000000000 0x36 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecUpdateWstringFlags + 0x0000000000000000 0x22 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecUpdatePointFlags + 0x0000000000000000 0x84 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecUpdateXpxFlags + 0x0000000000000000 0x98 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecUpdateOudiFlags + 0x0000000000000000 0xa4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecFreeFloatBuffer + 0x0000000000000000 0x66 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecSeekToFrontPercent + 0x0000000000000000 0x42 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecInitFloatFmt + 0x0000000000000000 0xdc obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecInitFloatBuffer + 0x0000000000000000 0x14e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecUpdateNegativeChar + 0x0000000000000000 0x7a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecNumberSatisfyPrecision + 0x0000000000000000 0x9e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecNumberForceOctal + 0x0000000000000000 0x64 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecUpdateSignedNumberPrefix + 0x0000000000000000 0x84 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecNumberCompatZero + 0x0000000000000000 0x44 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecOutput + 0x0000000000000000 0x70c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .rodata.SecOutput + 0x0000000000000000 0xf8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecPutZeroChar + 0x0000000000000000 0x4c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text.SecVsnprintfImpl + 0x0000000000000000 0x92 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .rodata.stateTable.2204 + 0x0000000000000000 0x151 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .data.strNullString.2246 + 0x0000000000000000 0x8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .data.wStrNullString.2256 + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .data.strNullPointer.2349 + 0x0000000000000000 0x8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .debug_info 0x0000000000000000 0x1484 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .debug_abbrev 0x0000000000000000 0x28c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .debug_aranges + 0x0000000000000000 0x1d8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .debug_ranges 0x0000000000000000 0x210 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .debug_line 0x0000000000000000 0x1730 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .debug_str 0x0000000000000000 0xc27 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .debug_frame 0x0000000000000000 0x790 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .rodata.g_itoaUpperDigits + 0x0000000000000000 0x14 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .rodata.g_itoaLowerDigits + 0x0000000000000000 0x14 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecFormatFloat + 0x0000000000000000 0x52 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecFormatLongDouble + 0x0000000000000000 0x1c8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecFormatDouble + 0x0000000000000000 0x136 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecIsSameSize + 0x0000000000000000 0x28 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecNumber32ToOctalString + 0x0000000000000000 0x5c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecNumber32ToHexString + 0x0000000000000000 0x58 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecNumber32ToDecStringFast + 0x0000000000000000 0xd8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecNumber32ToString + 0x0000000000000000 0x6a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecNumber64ToDecString + 0x0000000000000000 0xa0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecNumber64ToOctalString + 0x0000000000000000 0x8a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecNumber64ToHexString + 0x0000000000000000 0x7e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecNumber64ToString + 0x0000000000000000 0x7a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecNumberToString + 0x0000000000000000 0x52 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecIsNumberNeedTo32Bit + 0x0000000000000000 0x3e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecNumberToBuffer + 0x0000000000000000 0xf6 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecWriteChar + 0x0000000000000000 0x68 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecWriteMultiChar + 0x0000000000000000 0x8a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecWriteString + 0x0000000000000000 0x9e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecWriteStringByLoop + 0x0000000000000000 0x78 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecWriteStringOpt + 0x0000000000000000 0x86 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecIsStreamBufEnough + 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecWriteTextOpt + 0x0000000000000000 0x76 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecWriteLeftPadding + 0x0000000000000000 0x4e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecWritePrefix + 0x0000000000000000 0x4a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecWriteLeadingZero + 0x0000000000000000 0x58 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecWriteRightPadding + 0x0000000000000000 0x58 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecWriteTextAfterMbtowc + 0x0000000000000000 0xbc obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecWriteFloatText + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecWriteText + 0x0000000000000000 0x5c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecDecodeState + 0x0000000000000000 0x60 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecDecodeFlags + 0x0000000000000000 0x90 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .rodata.SecDecodeFlags + 0x0000000000000000 0x44 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecDecodeSizeI + 0x0000000000000000 0x106 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecDecodeSize + 0x0000000000000000 0x14e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .rodata.SecDecodeSize + 0x0000000000000000 0xc8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecDecodeTypeC + 0x0000000000000000 0x84 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecDecodeTypeSchar + 0x0000000000000000 0xb2 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecDecodeTypeSwchar + 0x0000000000000000 0x90 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecDecodeTypeS + 0x0000000000000000 0x74 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecDecodePrecision + 0x0000000000000000 0x88 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecDecodeWidth + 0x0000000000000000 0xb6 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecUpdateWcharFlags + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecUpdateWstringFlags + 0x0000000000000000 0x22 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecUpdatePointFlags + 0x0000000000000000 0x80 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecUpdateXpxFlags + 0x0000000000000000 0x94 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecUpdateOudiFlags + 0x0000000000000000 0xa2 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecFreeFloatBuffer + 0x0000000000000000 0x66 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecSeekToFrontPercent + 0x0000000000000000 0x40 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecInitFloatFmt + 0x0000000000000000 0xe4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecInitFloatBuffer + 0x0000000000000000 0x14e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecUpdateNegativeChar + 0x0000000000000000 0x7a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecNumberSatisfyPrecision + 0x0000000000000000 0x9e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecNumberForceOctal + 0x0000000000000000 0x64 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecUpdateSignedNumberPrefix + 0x0000000000000000 0x7e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecNumberCompatZero + 0x0000000000000000 0x44 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecOutput + 0x0000000000000000 0x6f8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .rodata.SecOutput + 0x0000000000000000 0xf8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecPutZeroChar + 0x0000000000000000 0x4c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text.SecVswprintfImpl + 0x0000000000000000 0x9a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .rodata.stateTable.2448 + 0x0000000000000000 0x151 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .data.strNullString.2490 + 0x0000000000000000 0x8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .data.wStrNullString.2500 + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .data.strNullPointer.2593 + 0x0000000000000000 0x8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .debug_info 0x0000000000000000 0x147b obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .debug_abbrev 0x0000000000000000 0x28c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .debug_aranges + 0x0000000000000000 0x1d8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .debug_ranges 0x0000000000000000 0x210 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .debug_line 0x0000000000000000 0x1784 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .debug_str 0x0000000000000000 0xc38 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .debug_frame 0x0000000000000000 0x78c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o + .text.snprintf_s + 0x0000000000000000 0x5e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o + .text.snprintf_truncated_s + 0x0000000000000000 0x58 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o + .debug_info 0x0000000000000000 0x191 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o + .debug_abbrev 0x0000000000000000 0xdf obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o + .debug_aranges + 0x0000000000000000 0x28 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o + .debug_ranges 0x0000000000000000 0x18 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o + .debug_line 0x0000000000000000 0x171 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o + .debug_str 0x0000000000000000 0x50c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o + .debug_frame 0x0000000000000000 0x60 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o + .text.sprintf_s + 0x0000000000000000 0x58 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o + .debug_info 0x0000000000000000 0x126 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o + .debug_abbrev 0x0000000000000000 0xc5 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o + .debug_line 0x0000000000000000 0x147 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o + .debug_str 0x0000000000000000 0x4ef obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o + .debug_frame 0x0000000000000000 0x38 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o + .text.sscanf_s + 0x0000000000000000 0x52 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o + .debug_info 0x0000000000000000 0x106 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o + .debug_abbrev 0x0000000000000000 0xb8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o + .debug_line 0x0000000000000000 0x146 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o + .debug_str 0x0000000000000000 0x4dd obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o + .debug_frame 0x0000000000000000 0x38 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o + .text.SecDoCat + 0x0000000000000000 0x18e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o + .text.strcat_s + 0x0000000000000000 0x6c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o + .debug_info 0x0000000000000000 0x1c0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o + .debug_abbrev 0x0000000000000000 0xd4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o + .debug_aranges + 0x0000000000000000 0x28 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o + .debug_ranges 0x0000000000000000 0x18 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o + .debug_line 0x0000000000000000 0x2cd obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o + .debug_str 0x0000000000000000 0x51a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o + .debug_frame 0x0000000000000000 0x5c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .text.CheckSrcRange + 0x0000000000000000 0x66 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .text.strcpy_error + 0x0000000000000000 0x6c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .text.strcpy_s + 0x0000000000000000 0x8a2 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .rodata.strcpy_s + 0x0000000000000000 0x108 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .debug_info 0x0000000000000000 0x84e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .debug_abbrev 0x0000000000000000 0x102 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .debug_aranges + 0x0000000000000000 0x30 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .debug_ranges 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .debug_line 0x0000000000000000 0x5c9 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .debug_str 0x0000000000000000 0x6b2 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .debug_frame 0x0000000000000000 0x7c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o + .text.SecDoCatLimit + 0x0000000000000000 0x194 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o + .text.strncat_s + 0x0000000000000000 0x8a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o + .debug_info 0x0000000000000000 0x1ce obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o + .debug_abbrev 0x0000000000000000 0xd4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o + .debug_aranges + 0x0000000000000000 0x28 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o + .debug_ranges 0x0000000000000000 0x18 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o + .debug_line 0x0000000000000000 0x2dc obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o + .debug_str 0x0000000000000000 0x51d obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o + .debug_frame 0x0000000000000000 0x5c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o + .text.CheckSrcCountRange + 0x0000000000000000 0x82 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o + .text.strncpy_error + 0x0000000000000000 0x9c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o + .text.strncpy_s + 0x0000000000000000 0x1a6 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o + .debug_info 0x0000000000000000 0x25e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o + .debug_abbrev 0x0000000000000000 0xd4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o + .debug_aranges + 0x0000000000000000 0x30 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o + .debug_ranges 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o + .debug_line 0x0000000000000000 0x384 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o + .debug_str 0x0000000000000000 0x545 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o + .debug_frame 0x0000000000000000 0x7c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .text.SecIsInDelimit + 0x0000000000000000 0x54 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .text.SecFindBegin + 0x0000000000000000 0x5c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .text.SecFindRest + 0x0000000000000000 0x6a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .text.SecUpdateToken + 0x0000000000000000 0x4c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .text.strtok_s + 0x0000000000000000 0x82 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .debug_info 0x0000000000000000 0x20f obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .debug_abbrev 0x0000000000000000 0xeb obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .debug_aranges + 0x0000000000000000 0x40 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .debug_ranges 0x0000000000000000 0x30 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .debug_line 0x0000000000000000 0x284 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .debug_str 0x0000000000000000 0x51d obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .debug_frame 0x0000000000000000 0xc0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o + .text.swprintf_s + 0x0000000000000000 0x58 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o + .debug_info 0x0000000000000000 0x131 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o + .debug_abbrev 0x0000000000000000 0xc5 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o + .debug_line 0x0000000000000000 0x148 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o + .debug_str 0x0000000000000000 0x4f9 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o + .debug_frame 0x0000000000000000 0x38 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o + .text.swscanf_s + 0x0000000000000000 0x52 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o + .debug_info 0x0000000000000000 0x111 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o + .debug_abbrev 0x0000000000000000 0xc5 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o + .debug_line 0x0000000000000000 0x147 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o + .debug_str 0x0000000000000000 0x4e7 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o + .debug_frame 0x0000000000000000 0x38 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o + .text.vfscanf_s + 0x0000000000000000 0x9e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o + .debug_info 0x0000000000000000 0x18c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o + .debug_abbrev 0x0000000000000000 0xda obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o + .debug_line 0x0000000000000000 0x189 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o + .debug_str 0x0000000000000000 0x536 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o + .debug_frame 0x0000000000000000 0x34 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o + .text.vfwscanf_s + 0x0000000000000000 0x9e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o + .debug_info 0x0000000000000000 0x1a6 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o + .debug_abbrev 0x0000000000000000 0xdc obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o + .debug_line 0x0000000000000000 0x18a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o + .debug_str 0x0000000000000000 0x540 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o + .debug_frame 0x0000000000000000 0x34 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o + .text.vscanf_s + 0x0000000000000000 0x7a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o + .debug_info 0x0000000000000000 0x17e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o + .debug_abbrev 0x0000000000000000 0xda obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o + .debug_line 0x0000000000000000 0x17c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o + .debug_str 0x0000000000000000 0x52d obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o + .debug_frame 0x0000000000000000 0x34 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o + .text.vsnprintf_s + 0x0000000000000000 0xde obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o + .text.vsnprintf_truncated_s + 0x0000000000000000 0xa2 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o + .debug_info 0x0000000000000000 0x193 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o + .debug_abbrev 0x0000000000000000 0xcb obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o + .debug_aranges + 0x0000000000000000 0x28 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o + .debug_ranges 0x0000000000000000 0x18 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o + .debug_line 0x0000000000000000 0x25c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o + .debug_str 0x0000000000000000 0x524 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o + .debug_frame 0x0000000000000000 0x58 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o + .text.vsprintf_s + 0x0000000000000000 0x90 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o + .debug_info 0x0000000000000000 0x129 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o + .debug_abbrev 0x0000000000000000 0xb1 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o + .debug_line 0x0000000000000000 0x1a6 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o + .debug_str 0x0000000000000000 0x506 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o + .debug_frame 0x0000000000000000 0x34 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o + .text.vsscanf_s + 0x0000000000000000 0xb4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o + .debug_info 0x0000000000000000 0x19d obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o + .debug_abbrev 0x0000000000000000 0xda obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o + .debug_line 0x0000000000000000 0x1a1 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o + .debug_str 0x0000000000000000 0x536 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o + .debug_frame 0x0000000000000000 0x34 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o + .text.vswprintf_s + 0x0000000000000000 0x98 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o + .debug_info 0x0000000000000000 0x134 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o + .debug_abbrev 0x0000000000000000 0xb1 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o + .debug_line 0x0000000000000000 0x1a7 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o + .debug_str 0x0000000000000000 0x510 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o + .debug_frame 0x0000000000000000 0x34 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o + .text.SecWcslen + 0x0000000000000000 0x3c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o + .text.vswscanf_s + 0x0000000000000000 0xba obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o + .debug_info 0x0000000000000000 0x1e7 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o + .debug_abbrev 0x0000000000000000 0x112 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o + .debug_aranges + 0x0000000000000000 0x28 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o + .debug_ranges 0x0000000000000000 0x18 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o + .debug_line 0x0000000000000000 0x1d6 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o + .debug_str 0x0000000000000000 0x54a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o + .debug_frame 0x0000000000000000 0x54 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o + .text.vwscanf_s + 0x0000000000000000 0x7a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o + .debug_info 0x0000000000000000 0x198 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o + .debug_abbrev 0x0000000000000000 0xdc obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o + .debug_line 0x0000000000000000 0x17d obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o + .debug_str 0x0000000000000000 0x537 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o + .debug_frame 0x0000000000000000 0x34 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o + .text.SecDoCatW + 0x0000000000000000 0x188 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o + .text.wcscat_s + 0x0000000000000000 0x70 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o + .debug_info 0x0000000000000000 0x1cb obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o + .debug_abbrev 0x0000000000000000 0xd4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o + .debug_aranges + 0x0000000000000000 0x28 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o + .debug_ranges 0x0000000000000000 0x18 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o + .debug_line 0x0000000000000000 0x2cd obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o + .debug_str 0x0000000000000000 0x518 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o + .debug_frame 0x0000000000000000 0x5c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o + .text.SecDoCpyW + 0x0000000000000000 0xf0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o + .text.wcscpy_s + 0x0000000000000000 0x70 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o + .debug_info 0x0000000000000000 0x185 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o + .debug_abbrev 0x0000000000000000 0xc9 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o + .debug_aranges + 0x0000000000000000 0x28 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o + .debug_ranges 0x0000000000000000 0x18 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o + .debug_line 0x0000000000000000 0x26b obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o + .debug_str 0x0000000000000000 0x50a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o + .debug_frame 0x0000000000000000 0x58 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o + .text.SecDoCatLimitW + 0x0000000000000000 0x190 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o + .text.wcsncat_s + 0x0000000000000000 0x92 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o + .debug_info 0x0000000000000000 0x1d9 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o + .debug_abbrev 0x0000000000000000 0xd4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o + .debug_aranges + 0x0000000000000000 0x28 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o + .debug_ranges 0x0000000000000000 0x18 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o + .debug_line 0x0000000000000000 0x2dc obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o + .debug_str 0x0000000000000000 0x51c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o + .debug_frame 0x0000000000000000 0x5c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o + .text.SecDoCpyLimitW + 0x0000000000000000 0x14e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o + .text.wcsncpy_s + 0x0000000000000000 0xa4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o + .debug_info 0x0000000000000000 0x1cb obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o + .debug_abbrev 0x0000000000000000 0xd4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o + .debug_aranges + 0x0000000000000000 0x28 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o + .debug_ranges 0x0000000000000000 0x18 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o + .debug_line 0x0000000000000000 0x2c8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o + .debug_str 0x0000000000000000 0x517 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o + .debug_frame 0x0000000000000000 0x5c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .text.SecIsInDelimitW + 0x0000000000000000 0x4c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .text.SecFindBeginW + 0x0000000000000000 0x58 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .text.SecFindRestW + 0x0000000000000000 0x66 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .text.SecUpdateTokenW + 0x0000000000000000 0x4c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .text.wcstok_s + 0x0000000000000000 0x82 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .debug_info 0x0000000000000000 0x21a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .debug_abbrev 0x0000000000000000 0xf8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .debug_aranges + 0x0000000000000000 0x40 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .debug_ranges 0x0000000000000000 0x30 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .debug_line 0x0000000000000000 0x284 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .debug_str 0x0000000000000000 0x529 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .debug_frame 0x0000000000000000 0xc0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o + .text.wmemcpy_s + 0x0000000000000000 0x92 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o + .debug_info 0x0000000000000000 0x11f obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o + .debug_abbrev 0x0000000000000000 0xa8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o + .debug_line 0x0000000000000000 0x1b5 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o + .debug_str 0x0000000000000000 0x4e7 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o + .debug_frame 0x0000000000000000 0x34 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o + .text.wmemmove_s + 0x0000000000000000 0x92 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o + .debug_info 0x0000000000000000 0x11f obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o + .debug_abbrev 0x0000000000000000 0xa8 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o + .debug_line 0x0000000000000000 0x1b6 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o + .debug_str 0x0000000000000000 0x4e9 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o + .debug_frame 0x0000000000000000 0x34 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o + .text 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o + .data 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o + .bss 0x0000000000000000 0x0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o + .text.wscanf_s + 0x0000000000000000 0x4c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o + .debug_info 0x0000000000000000 0x102 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o + .debug_abbrev 0x0000000000000000 0xc5 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o + .debug_aranges + 0x0000000000000000 0x20 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o + .debug_ranges 0x0000000000000000 0x10 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o + .debug_line 0x0000000000000000 0x146 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o + .debug_str 0x0000000000000000 0x4de obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o + .comment 0x0000000000000000 0x2a obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o + .debug_frame 0x0000000000000000 0x34 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o + .riscv.attributes + 0x0000000000000000 0x32 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o + .text 0x0000000000000000 0x0 obj/user/main.o + .data 0x0000000000000000 0x0 obj/user/main.o + .bss 0x0000000000000000 0x0 obj/user/main.o + .text.ADC_GetCTRLAddr + 0x0000000000000000 0x36 obj/user/main.o + .text 0x0000000000000000 0x0 obj/user/generatecode/system_init.o + .data 0x0000000000000000 0x0 obj/user/generatecode/system_init.o + .bss 0x0000000000000000 0x0 obj/user/generatecode/system_init.o + .text.ADC_GetCTRLAddr + 0x0000000000000000 0x36 obj/user/generatecode/system_init.o + .text.TIMER3_InterruptProcess + 0x0000000000000000 0x12 obj/user/generatecode/system_init.o + .text 0x0000000000000000 0x0 obj/user/generatecode/tim_adc.o + .data 0x0000000000000000 0x0 obj/user/generatecode/tim_adc.o + .bss 0x0000000000000000 0x0 obj/user/generatecode/tim_adc.o + .text.ADC_GetCTRLAddr + 0x0000000000000000 0x36 obj/user/generatecode/tim_adc.o + .text 0x0000000000000000 0x35e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_udivdi3.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_udivdi3.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_udivdi3.o) + .debug_info 0x0000000000000000 0x95d d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_udivdi3.o) + .debug_abbrev 0x0000000000000000 0x1d1 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_udivdi3.o) + .debug_loc 0x0000000000000000 0xba9 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_udivdi3.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_udivdi3.o) + .debug_ranges 0x0000000000000000 0xf0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_udivdi3.o) + .debug_line 0x0000000000000000 0x4bd d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_udivdi3.o) + .debug_str 0x0000000000000000 0x53c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_udivdi3.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_udivdi3.o) + .eh_frame 0x0000000000000000 0x28 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_udivdi3.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_udivdi3.o) + .text 0x0000000000000000 0x354 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_umoddi3.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_umoddi3.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_umoddi3.o) + .debug_info 0x0000000000000000 0x9ba d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_umoddi3.o) + .debug_abbrev 0x0000000000000000 0x1eb d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_umoddi3.o) + .debug_loc 0x0000000000000000 0x9a4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_umoddi3.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_umoddi3.o) + .debug_ranges 0x0000000000000000 0xc0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_umoddi3.o) + .debug_line 0x0000000000000000 0x4b0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_umoddi3.o) + .debug_str 0x0000000000000000 0x53c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_umoddi3.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_umoddi3.o) + .eh_frame 0x0000000000000000 0x28 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_umoddi3.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_umoddi3.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsfdf2.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsfdf2.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__ctype_get_mb_cur_max.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__ctype_get_mb_cur_max.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__ctype_get_mb_cur_max.o) + .text.__ctype_get_mb_cur_max + 0x0000000000000000 0x10 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__ctype_get_mb_cur_max.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__ctype_get_mb_cur_max.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__ctype_get_mb_cur_max.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__ctype_get_mb_cur_max.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .text.iswspace + 0x0000000000000000 0x26 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .text.__iswspace_l + 0x0000000000000000 0x8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .rodata.spaces.1304 + 0x0000000000000000 0x58 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + .text.isxdigit + 0x0000000000000000 0x1c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + .text.__isxdigit_l + 0x0000000000000000 0x8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .text.free 0x0000000000000000 0x8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .text.__simple_malloc + 0x0000000000000000 0x224 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .text.__libc_malloc + 0x0000000000000000 0x8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .text.default_malloc + 0x0000000000000000 0x8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .sbss.brk.1649 + 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .sbss.cur.1650 + 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .sbss.end.1651 + 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .sbss.lock 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .sbss.mmap_step.1652 + 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .sdata.__bump_lockptr + 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .text.queue 0x0000000000000000 0x28 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .text.get_meta + 0x0000000000000000 0xc8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .text.get_stride + 0x0000000000000000 0x2e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .text.nontrivial_free + 0x0000000000000000 0x2ac d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .text.__libc_free + 0x0000000000000000 0x1cc d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.queue 0x0000000000000000 0x28 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.get_stride + 0x0000000000000000 0x2e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.enframe 0x0000000000000000 0xde d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.rdlock 0x0000000000000000 0x24 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.step_seq + 0x0000000000000000 0x3c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.size_to_class + 0x0000000000000000 0x8a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.__malloc_atfork + 0x0000000000000000 0x24 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.__malloc_alloc_meta + 0x0000000000000000 0x224 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.alloc_slot + 0x0000000000000000 0x4fe d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.__libc_malloc_impl + 0x0000000000000000 0x200 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.__malloc_allzerop + 0x0000000000000000 0x140 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .bss.__malloc_context + 0x0000000000000000 0x1f8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .rodata.__malloc_size_classes + 0x0000000000000000 0x60 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .rodata.debruijn32.2634 + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .rodata.small_cnt_tab + 0x0000000000000000 0x1b d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .sdata.med_cnt_tab + 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + COMMON 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) + .text.__madvise + 0x0000000000000000 0x10 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + .text.dummy 0x0000000000000000 0x2 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + .text.__mmap 0x0000000000000000 0x9e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mprotect.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mprotect.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mprotect.o) + .text.__mprotect + 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mprotect.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mprotect.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mprotect.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mprotect.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + .text.dummy 0x0000000000000000 0x2 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + .text.__munmap + 0x0000000000000000 0x28 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) + .text.mbtowc 0x0000000000000000 0x100 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) + .text.wcstombs + 0x0000000000000000 0x38 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) + .text.wctomb 0x0000000000000000 0xe d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) + .text.feof 0x0000000000000000 0x3a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + .text.locking_getc + 0x0000000000000000 0x82 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + .text.fgetc 0x0000000000000000 0x3e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) + .text.fgets 0x0000000000000000 0x124 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + .text.__fgetwc_unlocked + 0x0000000000000000 0x11a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + .text.fgetwc 0x0000000000000000 0x44 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) + .text.fread 0x0000000000000000 0xc8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .text.__fseeko_unlocked + 0x0000000000000000 0x98 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .text.__fseeko + 0x0000000000000000 0x50 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .text.fseek 0x0000000000000000 0xe d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .text.__ftello_unlocked + 0x0000000000000000 0x52 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .text.__ftello + 0x0000000000000000 0x4c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .text.ftell 0x0000000000000000 0x2c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) + .text.fwide 0x0000000000000000 0x76 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .bss.buf 0x0000000000000000 0x408 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .data.__stdin_FILE + 0x0000000000000000 0x90 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .sdata.__stdin_used + 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .sdata.stdin 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetc.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetc.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetc.o) + .text.ungetc 0x0000000000000000 0x86 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetc.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetc.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetwc.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetwc.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetwc.o) + .text.ungetwc 0x0000000000000000 0x108 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetwc.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetwc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetwc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetwc.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) + .text.vsprintf + 0x0000000000000000 0x14 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .text.strtox 0x0000000000000000 0xa2 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .text.strtof 0x0000000000000000 0x44 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .text.strtod 0x0000000000000000 0x44 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .text.strtold 0x0000000000000000 0x4e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .text.strtox 0x0000000000000000 0x7c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .text.strtoull + 0x0000000000000000 0xc d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .text.strtoll 0x0000000000000000 0xe d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .text.strtoul 0x0000000000000000 0x16 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .text.strtol 0x0000000000000000 0x18 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .text.strtoimax + 0x0000000000000000 0x8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .text.strtoumax + 0x0000000000000000 0x8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memchr.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memchr.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memchr.o) + .text.memchr 0x0000000000000000 0x78 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memchr.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memchr.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memchr.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memchr.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memcpy.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memcpy.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memcpy.o) + .text.memcpy 0x0000000000000000 0x362 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memcpy.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memcpy.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memcpy.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memcpy.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memmove.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memmove.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memmove.o) + .text.memmove 0x0000000000000000 0xf6 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memmove.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memmove.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memmove.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memmove.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memset.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memset.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memset.o) + .text.memset 0x0000000000000000 0xbe d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memset.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memset.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memset.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memset.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) + .text.strchr 0x0000000000000000 0x26 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchrnul.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchrnul.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchrnul.o) + .text.__strchrnul + 0x0000000000000000 0x84 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchrnul.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchrnul.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchrnul.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchrnul.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcmp.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcmp.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcmp.o) + .text.strcmp 0x0000000000000000 0x1c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcmp.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcmp.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcmp.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcmp.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strlen.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strlen.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strlen.o) + .text.strlen 0x0000000000000000 0x46 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strlen.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strlen.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strlen.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strlen.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strncmp.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strncmp.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strncmp.o) + .text.strncmp 0x0000000000000000 0x2c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strncmp.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strncmp.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strncmp.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strncmp.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) + .text.wcschr 0x0000000000000000 0x30 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcslen.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcslen.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcslen.o) + .text.wcslen 0x0000000000000000 0x12 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcslen.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcslen.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcslen.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcslen.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + .text.__lock 0x0000000000000000 0xa4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + .text.__unlock + 0x0000000000000000 0x3c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + .text.__init_ssp + 0x0000000000000000 0x44 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + .text.__stack_chk_fail + 0x0000000000000000 0x6 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + COMMON 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__errno_location.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__errno_location.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__errno_location.o) + .text.__errno_location + 0x0000000000000000 0x8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__errno_location.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__errno_location.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__errno_location.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__errno_location.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .text.scanexp 0x0000000000000000 0x1e0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .text.decfloat + 0x0000000000000000 0x111e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .text.__floatscan + 0x0000000000000000 0xb4c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .rodata.__floatscan.cst4 + 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .rodata.__floatscan.str1.4 + 0x0000000000000000 0x10 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .rodata.decfloat.cst16 + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .rodata.decfloat.cst8 + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .rodata.p10s.2022 + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .rodata.th.2003 + 0x0000000000000000 0x10 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .text.__intscan + 0x0000000000000000 0x4da d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .rodata 0x0000000000000000 0x9 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .rodata.table 0x0000000000000000 0x101 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + .sbss.__progname + 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + .sbss.__progname_full + 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + COMMON 0x0000000000000000 0x3c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + .text.__shlim 0x0000000000000000 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + .text.__shgetc + 0x0000000000000000 0xe6 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(syscall_ret.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(syscall_ret.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(syscall_ret.o) + .text.__syscall_ret + 0x0000000000000000 0x28 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(syscall_ret.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(syscall_ret.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(syscall_ret.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(syscall_ret.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .rodata.__c_dot_utf8 + 0x0000000000000000 0x24 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .rodata.__c_dot_utf8_locale + 0x0000000000000000 0x18 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .rodata.__c_locale + 0x0000000000000000 0x18 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .rodata.empty_mo + 0x0000000000000000 0x14 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(copysignl.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(copysignl.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(copysignl.o) + .text.copysignl + 0x0000000000000000 0x38 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(copysignl.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(copysignl.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(copysignl.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(copysignl.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fabsl.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fabsl.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fabsl.o) + .text.fabsl 0x0000000000000000 0x26 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fabsl.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fabsl.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fabsl.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fabsl.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) + .text.fmodl 0x0000000000000000 0x3b0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + .text.scalbn 0x0000000000000000 0xce d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + .rodata.scalbn.cst8 + 0x0000000000000000 0x10 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbnl.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbnl.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbnl.o) + .text.scalbnl 0x0000000000000000 0x154 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbnl.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbnl.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbnl.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbnl.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(internal.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(internal.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(internal.o) + .rodata.__fsmu8 + 0x0000000000000000 0xcc d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(internal.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(internal.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(internal.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(internal.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + .text.mbrtowc 0x0000000000000000 0x108 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + .sbss.internal_state.3006 + 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcrtomb.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcrtomb.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcrtomb.o) + .text.wcrtomb 0x0000000000000000 0xfc d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcrtomb.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcrtomb.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcrtomb.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcrtomb.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcsrtombs.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcsrtombs.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcsrtombs.o) + .text.wcsrtombs + 0x0000000000000000 0x134 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcsrtombs.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcsrtombs.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcsrtombs.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcsrtombs.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + .text.__lockfile + 0x0000000000000000 0x7c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + .text.__unlockfile + 0x0000000000000000 0x34 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + .text.dummy 0x0000000000000000 0x2 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + .text.__stdio_close + 0x0000000000000000 0x22 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_read.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_read.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_read.o) + .text.__stdio_read + 0x0000000000000000 0xac d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_read.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_read.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_read.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_read.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) + .text.__stdio_seek + 0x0000000000000000 0xa d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + .text.__toread + 0x0000000000000000 0x56 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + .text.__toread_needs_stdio_exit + 0x0000000000000000 0x8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__uflow.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__uflow.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__uflow.o) + .text.__uflow 0x0000000000000000 0x54 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__uflow.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__uflow.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__uflow.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__uflow.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + .text.sn_write + 0x0000000000000000 0x8a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + .text.vsnprintf + 0x0000000000000000 0xa2 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lseek.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lseek.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lseek.o) + .text.__lseek 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lseek.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lseek.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lseek.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lseek.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__fpclassifyl.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__fpclassifyl.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__fpclassifyl.o) + .text.__fpclassifyl + 0x0000000000000000 0x40 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__fpclassifyl.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__fpclassifyl.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__fpclassifyl.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__fpclassifyl.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .text.close_file + 0x0000000000000000 0x52 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .text.__stdio_exit + 0x0000000000000000 0x56 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .sbss.dummy_file + 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .text.__ofl_lock + 0x0000000000000000 0x22 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .text.__ofl_unlock + 0x0000000000000000 0x10 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .sbss.ofl_head + 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .sbss.ofl_lock + 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .sdata.__stdio_ofl_lockptr + 0x0000000000000000 0x4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text.pop_arg 0x0000000000000000 0xdc d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .rodata.pop_arg + 0x0000000000000000 0x48 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text.fmt_u 0x0000000000000000 0x6a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text.getint 0x0000000000000000 0x48 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text.out 0x0000000000000000 0x1a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text.pad 0x0000000000000000 0xba d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text.fmt_fp 0x0000000000000000 0xf4a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text.printf_core + 0x0000000000000000 0x74a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .rodata.printf_core + 0x0000000000000000 0x100 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text.vfprintf + 0x0000000000000000 0x14e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .rodata.fmt_fp.cst16 + 0x0000000000000000 0x10 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .rodata.fmt_fp.str1.4 + 0x0000000000000000 0x26 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .rodata.printf_core.str1.4 + 0x0000000000000000 0x13 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .rodata.states + 0x0000000000000000 0x1d0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .rodata.xdigits + 0x0000000000000000 0x10 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strnlen.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strnlen.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strnlen.o) + .text.strnlen 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strnlen.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strnlen.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strnlen.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strnlen.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .text.__strerror_l + 0x0000000000000000 0x30 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .text.strerror + 0x0000000000000000 0xe d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .rodata.errmsgidx + 0x0000000000000000 0x108 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .rodata.errmsgstr + 0x0000000000000000 0x77a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .text.dummy 0x0000000000000000 0x2 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .text.__lctrans + 0x0000000000000000 0x8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .text.__lctrans_cur + 0x0000000000000000 0x10 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__signbitl.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__signbitl.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__signbitl.o) + .text.__signbitl + 0x0000000000000000 0x8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__signbitl.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__signbitl.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__signbitl.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__signbitl.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(frexpl.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(frexpl.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(frexpl.o) + .text.frexpl 0x0000000000000000 0x11c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(frexpl.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(frexpl.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(frexpl.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(frexpl.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + .text.__towrite + 0x0000000000000000 0x34 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + .text.__towrite_needs_stdio_exit + 0x0000000000000000 0x8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + .text 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + .text.__fwritex + 0x0000000000000000 0xa4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + .text.fwrite 0x0000000000000000 0x6e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + .text 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_lshrdi3.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_lshrdi3.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_lshrdi3.o) + .debug_info 0x0000000000000000 0x3c7 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_lshrdi3.o) + .debug_abbrev 0x0000000000000000 0x17c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_lshrdi3.o) + .debug_loc 0x0000000000000000 0x89 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_lshrdi3.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_lshrdi3.o) + .debug_line 0x0000000000000000 0x39e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_lshrdi3.o) + .debug_str 0x0000000000000000 0x4d2 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_lshrdi3.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_lshrdi3.o) + .debug_frame 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_lshrdi3.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_lshrdi3.o) + .text 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_ashldi3.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_ashldi3.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_ashldi3.o) + .debug_info 0x0000000000000000 0x3c7 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_ashldi3.o) + .debug_abbrev 0x0000000000000000 0x17c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_ashldi3.o) + .debug_loc 0x0000000000000000 0x89 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_ashldi3.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_ashldi3.o) + .debug_line 0x0000000000000000 0x39e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_ashldi3.o) + .debug_str 0x0000000000000000 0x4d2 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_ashldi3.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_ashldi3.o) + .debug_frame 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_ashldi3.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_ashldi3.o) + .text 0x0000000000000000 0x39c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_divdi3.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_divdi3.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_divdi3.o) + .debug_info 0x0000000000000000 0x98f d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_divdi3.o) + .debug_abbrev 0x0000000000000000 0x1e7 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_divdi3.o) + .debug_loc 0x0000000000000000 0x986 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_divdi3.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_divdi3.o) + .debug_ranges 0x0000000000000000 0xe0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_divdi3.o) + .debug_line 0x0000000000000000 0x4f3 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_divdi3.o) + .debug_str 0x0000000000000000 0x53b d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_divdi3.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_divdi3.o) + .eh_frame 0x0000000000000000 0x28 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_divdi3.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_divdi3.o) + .text 0x0000000000000000 0x38a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_moddi3.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_moddi3.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_moddi3.o) + .debug_info 0x0000000000000000 0x9e4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_moddi3.o) + .debug_abbrev 0x0000000000000000 0x1f2 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_moddi3.o) + .debug_loc 0x0000000000000000 0xa36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_moddi3.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_moddi3.o) + .debug_ranges 0x0000000000000000 0xc8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_moddi3.o) + .debug_line 0x0000000000000000 0x4df d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_moddi3.o) + .debug_str 0x0000000000000000 0x53b d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_moddi3.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_moddi3.o) + .eh_frame 0x0000000000000000 0x28 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_moddi3.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_moddi3.o) + .text 0x0000000000000000 0x5c6 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) + .rodata 0x0000000000000000 0x3c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) + .debug_info 0x0000000000000000 0x748 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) + .debug_abbrev 0x0000000000000000 0x168 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) + .debug_loc 0x0000000000000000 0x1114 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) + .debug_ranges 0x0000000000000000 0x1e0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) + .debug_line 0x0000000000000000 0x570 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) + .debug_str 0x0000000000000000 0x515 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) + .debug_frame 0x0000000000000000 0x58 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) + .riscv.attributes + 0x0000000000000000 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) + .text 0x0000000000000000 0x86 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsidf.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsidf.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsidf.o) + .debug_info 0x0000000000000000 0x297 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsidf.o) + .debug_abbrev 0x0000000000000000 0x158 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsidf.o) + .debug_loc 0x0000000000000000 0x134 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsidf.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsidf.o) + .debug_ranges 0x0000000000000000 0x60 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsidf.o) + .debug_line 0x0000000000000000 0x1c1 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsidf.o) + .debug_str 0x0000000000000000 0x3a8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsidf.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsidf.o) + .debug_frame 0x0000000000000000 0x38 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsidf.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsidf.o) + .text 0x0000000000000000 0x1194 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(addtf3.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(addtf3.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(addtf3.o) + .debug_info 0x0000000000000000 0xd1d d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(addtf3.o) + .debug_abbrev 0x0000000000000000 0x19b d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(addtf3.o) + .debug_loc 0x0000000000000000 0x287f d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(addtf3.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(addtf3.o) + .debug_ranges 0x0000000000000000 0x418 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(addtf3.o) + .debug_line 0x0000000000000000 0x1013 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(addtf3.o) + .debug_str 0x0000000000000000 0x569 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(addtf3.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(addtf3.o) + .debug_frame 0x0000000000000000 0x54 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(addtf3.o) + .riscv.attributes + 0x0000000000000000 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(addtf3.o) + .text 0x0000000000000000 0xb80 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(divtf3.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(divtf3.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(divtf3.o) + .rodata 0x0000000000000000 0x3c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(divtf3.o) + .debug_info 0x0000000000000000 0xaf8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(divtf3.o) + .debug_abbrev 0x0000000000000000 0x177 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(divtf3.o) + .debug_loc 0x0000000000000000 0x2482 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(divtf3.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(divtf3.o) + .debug_ranges 0x0000000000000000 0x330 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(divtf3.o) + .debug_line 0x0000000000000000 0x9bb d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(divtf3.o) + .debug_str 0x0000000000000000 0x61c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(divtf3.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(divtf3.o) + .debug_frame 0x0000000000000000 0x64 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(divtf3.o) + .riscv.attributes + 0x0000000000000000 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(divtf3.o) + .text 0x0000000000000000 0xf6 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(eqtf2.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(eqtf2.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(eqtf2.o) + .debug_info 0x0000000000000000 0x295 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(eqtf2.o) + .debug_abbrev 0x0000000000000000 0x17c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(eqtf2.o) + .debug_loc 0x0000000000000000 0x18f d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(eqtf2.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(eqtf2.o) + .debug_ranges 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(eqtf2.o) + .debug_line 0x0000000000000000 0x25d d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(eqtf2.o) + .debug_str 0x0000000000000000 0x312 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(eqtf2.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(eqtf2.o) + .debug_frame 0x0000000000000000 0x2c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(eqtf2.o) + .riscv.attributes + 0x0000000000000000 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(eqtf2.o) + .text 0x0000000000000000 0x112 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(getf2.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(getf2.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(getf2.o) + .debug_info 0x0000000000000000 0x271 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(getf2.o) + .debug_abbrev 0x0000000000000000 0x17a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(getf2.o) + .debug_loc 0x0000000000000000 0xd4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(getf2.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(getf2.o) + .debug_ranges 0x0000000000000000 0x50 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(getf2.o) + .debug_line 0x0000000000000000 0x2b2 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(getf2.o) + .debug_str 0x0000000000000000 0x336 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(getf2.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(getf2.o) + .debug_frame 0x0000000000000000 0x2c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(getf2.o) + .riscv.attributes + 0x0000000000000000 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(getf2.o) + .text 0x0000000000000000 0x112 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(letf2.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(letf2.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(letf2.o) + .debug_info 0x0000000000000000 0x271 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(letf2.o) + .debug_abbrev 0x0000000000000000 0x17a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(letf2.o) + .debug_loc 0x0000000000000000 0xd4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(letf2.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(letf2.o) + .debug_ranges 0x0000000000000000 0x50 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(letf2.o) + .debug_line 0x0000000000000000 0x2b2 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(letf2.o) + .debug_str 0x0000000000000000 0x336 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(letf2.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(letf2.o) + .debug_frame 0x0000000000000000 0x2c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(letf2.o) + .riscv.attributes + 0x0000000000000000 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(letf2.o) + .text 0x0000000000000000 0xd8a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(multf3.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(multf3.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(multf3.o) + .rodata 0x0000000000000000 0x3c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(multf3.o) + .debug_info 0x0000000000000000 0x1230 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(multf3.o) + .debug_abbrev 0x0000000000000000 0x177 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(multf3.o) + .debug_loc 0x0000000000000000 0x96c6 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(multf3.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(multf3.o) + .debug_ranges 0x0000000000000000 0x620 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(multf3.o) + .debug_line 0x0000000000000000 0x835 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(multf3.o) + .debug_str 0x0000000000000000 0x69c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(multf3.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(multf3.o) + .debug_frame 0x0000000000000000 0x64 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(multf3.o) + .riscv.attributes + 0x0000000000000000 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(multf3.o) + .text 0x0000000000000000 0x11b2 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(subtf3.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(subtf3.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(subtf3.o) + .debug_info 0x0000000000000000 0xd18 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(subtf3.o) + .debug_abbrev 0x0000000000000000 0x19b d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(subtf3.o) + .debug_loc 0x0000000000000000 0x27b0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(subtf3.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(subtf3.o) + .debug_ranges 0x0000000000000000 0x430 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(subtf3.o) + .debug_line 0x0000000000000000 0x1047 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(subtf3.o) + .debug_str 0x0000000000000000 0x569 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(subtf3.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(subtf3.o) + .debug_frame 0x0000000000000000 0x50 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(subtf3.o) + .riscv.attributes + 0x0000000000000000 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(subtf3.o) + .text 0x0000000000000000 0x170 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixtfsi.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixtfsi.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixtfsi.o) + .debug_info 0x0000000000000000 0x2ac d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixtfsi.o) + .debug_abbrev 0x0000000000000000 0x173 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixtfsi.o) + .debug_loc 0x0000000000000000 0x572 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixtfsi.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixtfsi.o) + .debug_ranges 0x0000000000000000 0x90 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixtfsi.o) + .debug_line 0x0000000000000000 0x289 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixtfsi.o) + .debug_str 0x0000000000000000 0x37a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixtfsi.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixtfsi.o) + .debug_frame 0x0000000000000000 0x2c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixtfsi.o) + .riscv.attributes + 0x0000000000000000 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixtfsi.o) + .text 0x0000000000000000 0x13e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixunstfsi.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixunstfsi.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixunstfsi.o) + .debug_info 0x0000000000000000 0x28c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixunstfsi.o) + .debug_abbrev 0x0000000000000000 0x17f d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixunstfsi.o) + .debug_loc 0x0000000000000000 0x496 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixunstfsi.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixunstfsi.o) + .debug_ranges 0x0000000000000000 0x60 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixunstfsi.o) + .debug_line 0x0000000000000000 0x264 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixunstfsi.o) + .debug_str 0x0000000000000000 0x379 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixunstfsi.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixunstfsi.o) + .debug_frame 0x0000000000000000 0x2c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixunstfsi.o) + .riscv.attributes + 0x0000000000000000 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixunstfsi.o) + .text 0x0000000000000000 0xfe d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsitf.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsitf.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsitf.o) + .debug_info 0x0000000000000000 0x389 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsitf.o) + .debug_abbrev 0x0000000000000000 0x17d d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsitf.o) + .debug_loc 0x0000000000000000 0x211 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsitf.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsitf.o) + .debug_ranges 0x0000000000000000 0x98 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsitf.o) + .debug_line 0x0000000000000000 0x215 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsitf.o) + .debug_str 0x0000000000000000 0x441 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsitf.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsitf.o) + .debug_frame 0x0000000000000000 0x3c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsitf.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsitf.o) + .text 0x0000000000000000 0xe4 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatunsitf.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatunsitf.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatunsitf.o) + .debug_info 0x0000000000000000 0x37a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatunsitf.o) + .debug_abbrev 0x0000000000000000 0x18c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatunsitf.o) + .debug_loc 0x0000000000000000 0x1e0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatunsitf.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatunsitf.o) + .debug_ranges 0x0000000000000000 0x80 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatunsitf.o) + .debug_line 0x0000000000000000 0x1d9 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatunsitf.o) + .debug_str 0x0000000000000000 0x43e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatunsitf.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatunsitf.o) + .debug_frame 0x0000000000000000 0x34 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatunsitf.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatunsitf.o) + .text 0x0000000000000000 0x15c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsftf2.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsftf2.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsftf2.o) + .debug_info 0x0000000000000000 0x3b0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsftf2.o) + .debug_abbrev 0x0000000000000000 0x181 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsftf2.o) + .debug_loc 0x0000000000000000 0x3e3 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsftf2.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsftf2.o) + .debug_ranges 0x0000000000000000 0x50 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsftf2.o) + .debug_line 0x0000000000000000 0x25c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsftf2.o) + .debug_str 0x0000000000000000 0x388 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsftf2.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsftf2.o) + .debug_frame 0x0000000000000000 0x3c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsftf2.o) + .riscv.attributes + 0x0000000000000000 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsftf2.o) + .text 0x0000000000000000 0x194 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extenddftf2.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extenddftf2.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extenddftf2.o) + .debug_info 0x0000000000000000 0x3ca d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extenddftf2.o) + .debug_abbrev 0x0000000000000000 0x181 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extenddftf2.o) + .debug_loc 0x0000000000000000 0x482 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extenddftf2.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extenddftf2.o) + .debug_ranges 0x0000000000000000 0x78 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extenddftf2.o) + .debug_line 0x0000000000000000 0x2ac d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extenddftf2.o) + .debug_str 0x0000000000000000 0x38e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extenddftf2.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extenddftf2.o) + .debug_frame 0x0000000000000000 0x38 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extenddftf2.o) + .riscv.attributes + 0x0000000000000000 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extenddftf2.o) + .text 0x0000000000000000 0x2ee d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfsf2.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfsf2.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfsf2.o) + .debug_info 0x0000000000000000 0x481 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfsf2.o) + .debug_abbrev 0x0000000000000000 0x193 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfsf2.o) + .debug_loc 0x0000000000000000 0x903 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfsf2.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfsf2.o) + .debug_ranges 0x0000000000000000 0xc8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfsf2.o) + .debug_line 0x0000000000000000 0x472 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfsf2.o) + .debug_str 0x0000000000000000 0x4a8 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfsf2.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfsf2.o) + .debug_frame 0x0000000000000000 0x2c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfsf2.o) + .riscv.attributes + 0x0000000000000000 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfsf2.o) + .text 0x0000000000000000 0x368 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfdf2.o) + .data 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfdf2.o) + .bss 0x0000000000000000 0x0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfdf2.o) + .debug_info 0x0000000000000000 0x524 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfdf2.o) + .debug_abbrev 0x0000000000000000 0x193 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfdf2.o) + .debug_loc 0x0000000000000000 0x890 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfdf2.o) + .debug_aranges + 0x0000000000000000 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfdf2.o) + .debug_ranges 0x0000000000000000 0x100 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfdf2.o) + .debug_line 0x0000000000000000 0x4a0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfdf2.o) + .debug_str 0x0000000000000000 0x4c5 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfdf2.o) + .comment 0x0000000000000000 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfdf2.o) + .debug_frame 0x0000000000000000 0x2c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfdf2.o) + .riscv.attributes + 0x0000000000000000 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfdf2.o) + +Memory Configuration + +Name Origin Length Attributes +RAM_CODE 0x0000000002000000 0x0000000000000000 xr +RAM_RESERVE_DATA 0x0000000004000000 0x0000000000000000 rw +RAM_DIAGNOSE_BUF 0x0000000004000000 0x0000000000000020 rw +RAM_DATA 0x0000000004000020 0x0000000000004fd0 xrw +STACK_SRAM_BOUND 0x0000000004004ff0 0x0000000000000010 xrw +RAM_STACK 0x0000000004005000 0x0000000000003000 xrw +FLASH_MAGIC 0x0000000003000000 0x0000000000000004 rw +FLASH_CODE 0x0000000003000004 0x000000000001fffc xr +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +START GROUP +LOAD d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a +LOAD d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a +LOAD ..\middleware\thirdparty\sysroot\lib\libmcs_smo_4th.a +LOAD ..\middleware\thirdparty\sysroot\lib\libnostask.a +LOAD obj/chip/3061m/startup.o +LOAD obj/chip/3061m/chipinit/chipinit.o +LOAD obj/chip/3061m/chipinit/anatrim/anatrim.o +LOAD obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o +LOAD obj/chip/3061m/chipinit/crginit/crginit.o +LOAD obj/chip/3061m/chipinit/flashinit/flashinit.o +LOAD obj/chip/3061m/chipinit/systickinit/systickinit.o +LOAD obj/chip/3061m/fotp/fotp_info_read.o +LOAD obj/chip/3061m/ip_crg/ip_crg_common.o +LOAD obj/drivers/acmp/src/acmp.o +LOAD obj/drivers/acmp/src/acmp_ex.o +LOAD obj/drivers/adc/src/adc.o +LOAD obj/drivers/adc/src/adc_ex.o +LOAD obj/drivers/apt/src/apt.o +LOAD obj/drivers/base/src/assert.o +LOAD obj/drivers/base/src/base_math.o +LOAD obj/drivers/base/src/clock.o +LOAD obj/drivers/base/src/generalfunc.o +LOAD obj/drivers/base/src/interrupt.o +LOAD obj/drivers/base/src/lock.o +LOAD obj/drivers/base/src/reset.o +LOAD obj/drivers/can/src/can.o +LOAD obj/drivers/capm/src/capm.o +LOAD obj/drivers/cfd/src/cfd.o +LOAD obj/drivers/cmm/src/cmm.o +LOAD obj/drivers/crc/src/crc.o +LOAD obj/drivers/crg/src/crg.o +LOAD obj/drivers/dac/src/dac.o +LOAD obj/drivers/debug/log/src/app_command.o +LOAD obj/drivers/debug/log/src/cmd.o +LOAD obj/drivers/debug/log/src/cmd_common.o +LOAD obj/drivers/debug/log/src/config.o +LOAD obj/drivers/debug/log/src/console.o +LOAD obj/drivers/debug/log/src/dfx_debug.o +LOAD obj/drivers/debug/log/src/dfx_log.o +LOAD obj/drivers/debug/log/src/dfx_log_proc.o +LOAD obj/drivers/debug/log/src/event.o +LOAD obj/drivers/debug/log/src/ext_command.o +LOAD obj/drivers/debug/src/debug.o +LOAD obj/drivers/dma/src/dma.o +LOAD obj/drivers/dma/src/dma_ex.o +LOAD obj/drivers/flash/src/flash.o +LOAD obj/drivers/gpio/src/gpio.o +LOAD obj/drivers/gpt/src/gpt.o +LOAD obj/drivers/gpt/src/gpt_ex.o +LOAD obj/drivers/i2c/src/i2c.o +LOAD obj/drivers/i2c/src/i2c_ex.o +LOAD obj/drivers/iocmg/src/iocmg.o +LOAD obj/drivers/iwdg/src/iwdg.o +LOAD obj/drivers/iwdg/src/iwdg_ex.o +LOAD obj/drivers/pga/src/pga.o +LOAD obj/drivers/pmc/src/pmc.o +LOAD obj/drivers/qdm/src/qdm.o +LOAD obj/drivers/spi/src/spi.o +LOAD obj/drivers/spi/src/spi_ex.o +LOAD obj/drivers/timer/src/timer.o +LOAD obj/drivers/timer/src/timer_ex.o +LOAD obj/drivers/tsensor/src/tsensor.o +LOAD obj/drivers/uart/src/uart.o +LOAD obj/drivers/uart/src/uart_ex.o +LOAD obj/drivers/wwdg/src/wwdg.o +LOAD obj/drivers/wwdg/src/wwdg_ex.o +LOAD obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o +LOAD obj/middleware/control_library/brake/mcs_brake.o +LOAD obj/middleware/control_library/filter/mcs_filter.o +LOAD obj/middleware/control_library/filter/mcs_lpfRk4.o +LOAD obj/middleware/control_library/filter/mcs_pll.o +LOAD obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o +LOAD obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o +LOAD obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o +LOAD obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o +LOAD obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o +LOAD obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o +LOAD obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o +LOAD obj/middleware/control_library/math/mcs_math.o +LOAD obj/middleware/control_library/modulation/mcs_r1_svpwm.o +LOAD obj/middleware/control_library/modulation/mcs_svpwm.o +LOAD obj/middleware/control_library/observer/mcs_fosmo.o +LOAD obj/middleware/control_library/pfc/pfc_curr_ctrl.o +LOAD obj/middleware/control_library/pfc/pfc_volt_ctrl.o +LOAD obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o +LOAD obj/middleware/control_library/power/mcs_power_mgmt.o +LOAD obj/middleware/control_library/protection/mcs_openphs_det.o +LOAD obj/middleware/control_library/protection/mcs_stall_det.o +LOAD obj/middleware/control_library/protection/mcs_unbalance_det.o +LOAD obj/middleware/control_library/ramp/mcs_ramp_mgmt.o +LOAD obj/middleware/control_library/utilities/mcs_mtr_param.o +LOAD obj/middleware/control_library/vf/mcs_vf_ctrl.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o +LOAD obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o +LOAD obj/user/main.o +LOAD obj/user/generatecode/system_init.o +LOAD obj/user/generatecode/tim_adc.o +END GROUP + 0x0000000004000000 SRAM_START = 0x4000000 + 0x0000000004008000 SRAM_END = 0x4008000 + 0x0000000002000000 RAM_CODE_START = 0x2000000 + 0x0000000000000000 RAM_CODE_SIZE = 0x0 + 0x0000000004000000 RAM_RESERVE_DATA_START = (SRAM_START + RAM_CODE_SIZE) + 0x0000000000000000 RAM_RESERVE_DATA_SIZE = 0x0 + 0x0000000004000000 RAM_DIAGNOSE_BUF_START = (RAM_RESERVE_DATA_START + RAM_RESERVE_DATA_SIZE) + 0x0000000000000020 RAM_DIAGNOSE_BUF_SIZE = 0x20 + 0x0000000000000010 STACK_SRAM_BOUND_SIZE = 0x10 + 0x0000000004000020 RAM_START = ((RAM_RESERVE_DATA_START + RAM_RESERVE_DATA_SIZE) + RAM_DIAGNOSE_BUF_SIZE) + 0x0000000000004fd0 RAM_SIZE = ((((0x5000 - RAM_CODE_SIZE) - RAM_RESERVE_DATA_SIZE) - RAM_DIAGNOSE_BUF_SIZE) - STACK_SRAM_BOUND_SIZE) + 0x0000000004008000 RAM_END = SRAM_END + 0x0000000004004ff0 STACK_SRAM_BOUND_START = (RAM_START + RAM_SIZE) + 0x0000000004005000 STACK_START = (STACK_SRAM_BOUND_START + STACK_SRAM_BOUND_SIZE) + 0x0000000000000400 NMI_STACK_SIZE = 0x400 + 0x0000000000002c00 STACK_SIZE = (0x3000 - NMI_STACK_SIZE) + 0x0000000000000400 INIT_STACK_SIZE = 0x400 + 0x0000000003000000 FLASH_START = 0x3000000 + 0x000000000001fffc FLASH_SIZE = 0x1fffc + +.data.magic 0x0000000003000000 0x4 + *(.data.magic) + .data.magic 0x0000000003000000 0x4 obj/chip/3061m/startup.o + +.text.entry 0x0000000003000004 0x700 + *(.text.entry) + .text.entry 0x0000000003000004 0x700 obj/chip/3061m/startup.o + 0x0000000003000004 _start + +.rela.dyn 0x0000000003000704 0x0 + .rela.text.entry + 0x0000000003000704 0x0 obj/chip/3061m/startup.o + .rela.got 0x0000000003000704 0x0 obj/chip/3061m/startup.o + +.stacks 0x0000000004005000 0x400 + 0x0000000004005000 . = ALIGN (0x4) + 0x0000000004005000 __SYSTEM_STACK_BEGIN__ = ORIGIN (RAM_STACK) + *(.stacks) + 0x0000000004007c00 __SYSTEM_STACK_END__ = (ORIGIN (RAM_STACK) + STACK_SIZE) + 0x0000000004005000 . = ALIGN (0x20) + 0x0000000004007c00 __INTERRUPT_STACK_BEGIN__ = __SYSTEM_STACK_END__ + 0x0000000004005000 . = ALIGN (0x20) + 0x0000000004007c00 __NMI_STACK_BEGIN__ = __SYSTEM_STACK_END__ + 0x0000000004005000 __nmi_stack_bottom = . + 0x0000000004005400 . = (. + NMI_STACK_SIZE) + *fill* 0x0000000004005000 0x400 + 0x0000000004005400 __nmi_stack_top = . + 0x0000000004007c00 __stack_top = __SYSTEM_STACK_END__ + 0x0000000004005400 __init_stack_top = (__SYSTEM_STACK_BEGIN__ + INIT_STACK_SIZE) + 0x0000000004007c00 __irq_stack_top = __SYSTEM_STACK_END__ + +.text.sram 0x0000000002000000 0x0 load address 0x0000000003000704 + 0x0000000003000704 __sram_code_load_addr = LOADADDR (.text.sram) + 0x0000000002000000 __sram_code_start_addr = . + *(.text.sram) + 0x0000000002000000 . = ALIGN (0x4) + 0x0000000002000000 __sram_code_end_addr = . + +.reserved.data 0x0000000004000000 0x0 load address 0x0000000003000704 + 0x0000000003000704 __reserved_code_load_addr = LOADADDR (.reserved.data) + 0x0000000004000000 __reserved_code_start_addr = . + *(.reserved.data*) + 0x0000000004000000 . = ALIGN (0x4) + 0x0000000004000000 __reserved_code_end_addr = . + +.text 0x0000000003000704 0x60a0 + 0x0000000003000704 __start_addr = . + *(.text*) + .text.Chip_InitFail + 0x0000000003000704 0x8 obj/chip/3061m/chipinit/chipinit.o + .text.Chip_Init + 0x000000000300070c 0x40 obj/chip/3061m/chipinit/chipinit.o + 0x000000000300070c Chip_Init + .text.CalculateGain + 0x000000000300074c 0x2e obj/chip/3061m/chipinit/anatrim/anatrim.o + .text.CHIP_GetInfo + 0x000000000300077a 0x4a obj/chip/3061m/chipinit/anatrim/anatrim.o + .text.CHIP_AnalogTrim + 0x00000000030007c4 0x50c obj/chip/3061m/chipinit/anatrim/anatrim.o + .text.FOTP_InfoGet.trans.6 + 0x0000000003000cd0 0x4 _kmpl_trans + 0x0000000003000cd0 FOTP_InfoGet.trans.6 + .text.ANATRIM_Entry + 0x0000000003000cd4 0x52 obj/chip/3061m/chipinit/anatrim/anatrim.o + 0x0000000003000cd4 ANATRIM_Entry + .text.ANAVREF_Init + 0x0000000003000d26 0x5a obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o + 0x0000000003000d26 ANAVREF_Init + .text.HAL_CRG_IpEnableSet.trans.4 + 0x0000000003000d80 0x4 _kmpl_trans + 0x0000000003000d80 HAL_CRG_IpEnableSet.trans.4 + .text.CRG_SetCoreClockSelect + 0x0000000003000d84 0x42 obj/chip/3061m/chipinit/crginit/crginit.o + 0x0000000003000d84 CRG_SetCoreClockSelect + .text.BASE_FUNC_Delay.trans.8 + 0x0000000003000dc6 0x4 _kmpl_trans + 0x0000000003000dc6 BASE_FUNC_Delay.trans.8 + .text.SetFlashDiv + 0x0000000003000dca 0x92 obj/chip/3061m/chipinit/flashinit/flashinit.o + .text.GetFlashFreq + 0x0000000003000e5c 0x64 obj/chip/3061m/chipinit/flashinit/flashinit.o + .text.FLASH_ClockConfig + 0x0000000003000ec0 0xc4 obj/chip/3061m/chipinit/flashinit/flashinit.o + 0x0000000003000ec0 FLASH_ClockConfig + .text.SYSTICK_Init + 0x0000000003000f84 0x22 obj/chip/3061m/chipinit/systickinit/systickinit.o + 0x0000000003000f84 SYSTICK_Init + .text.SYSTICK_GetCRGHZ + 0x0000000003000fa6 0x1c obj/chip/3061m/chipinit/systickinit/systickinit.o + 0x0000000003000fa6 SYSTICK_GetCRGHZ + .text.FOTP_CheckReadStatus + 0x0000000003000fc2 0x84 obj/chip/3061m/fotp/fotp_info_read.o + .text.FOTP_InfoGet + 0x0000000003001046 0x162 obj/chip/3061m/fotp/fotp_info_read.o + 0x0000000003001046 FOTP_InfoGet + .text.GetCrgIpMatchInfo + 0x00000000030011a8 0x64 obj/chip/3061m/ip_crg/ip_crg_common.o + 0x00000000030011a8 GetCrgIpMatchInfo + .text.IsADCSampleChannel + 0x000000000300120c 0x1c obj/drivers/adc/src/adc.o + .text.IsADCSOCx + 0x0000000003001228 0x1c obj/drivers/adc/src/adc.o + .text.IsADCIntx + 0x0000000003001244 0x1c obj/drivers/adc/src/adc.o + .text.IsADCTrigSource + 0x0000000003001260 0x1c obj/drivers/adc/src/adc.o + .text.IsADCFinishMode + 0x000000000300127c 0x2c obj/drivers/adc/src/adc.o + .text.IsADCPriorityMode + 0x00000000030012a8 0x1e obj/drivers/adc/src/adc.o + .text.IsADCTotalTime + 0x00000000030012c6 0x1c obj/drivers/adc/src/adc.o + .text.DCL_ADC_EnableAvddChannel + 0x00000000030012e2 0x44 obj/drivers/adc/src/adc.o + .text.DCL_ADC_SetSOCxBlindInt0 + 0x0000000003001326 0x7c obj/drivers/adc/src/adc.o + .text.DCL_ADC_SetSOCxBlindInt1 + 0x00000000030013a2 0x7e obj/drivers/adc/src/adc.o + .text.DCL_ADC_SetSOCxBlindInt2 + 0x0000000003001420 0x7c obj/drivers/adc/src/adc.o + .text.DCL_ADC_SetSOCxBlindInt3 + 0x000000000300149c 0x7e obj/drivers/adc/src/adc.o + .text.DCL_ADC_EnableIntx + 0x000000000300151a 0x74 obj/drivers/adc/src/adc.o + .text.ADC_GetCTRLAddr + 0x000000000300158e 0x36 obj/drivers/adc/src/adc.o + .text.DCL_ADC_SOCxSelectChannel + 0x00000000030015c4 0xae obj/drivers/adc/src/adc.o + .text.DCL_ADC_SOCxSelcetTrigSource + 0x0000000003001672 0xa6 obj/drivers/adc/src/adc.o + .text.DCL_ADC_SOCxSetAcqps + 0x0000000003001718 0xae obj/drivers/adc/src/adc.o + .text.DCL_ADC_SOCxSoftTrigger + 0x00000000030017c6 0x74 obj/drivers/adc/src/adc.o + .text.AssertErrorLog.trans.0 + 0x000000000300183a 0x4 _kmpl_trans + 0x000000000300183a AssertErrorLog.trans.0 + .text.DCL_ADC_SOCxSetPriority + 0x000000000300183e 0x64 obj/drivers/adc/src/adc.o + .text.DCL_ADC_ReadSOCxResult + 0x00000000030018a2 0x7a obj/drivers/adc/src/adc.o + .text.DCL_ADC_EnableSOCxContinue + 0x000000000300191c 0x7e obj/drivers/adc/src/adc.o + .text.DCL_ADC_DisableSOCxContinue + 0x000000000300199a 0x80 obj/drivers/adc/src/adc.o + .text.HAL_ADC_Init + 0x0000000003001a1a 0xb2 obj/drivers/adc/src/adc.o + 0x0000000003001a1a HAL_ADC_Init + .text.HAL_ADC_ConfigureSoc + 0x0000000003001acc 0x1b2 obj/drivers/adc/src/adc.o + 0x0000000003001acc HAL_ADC_ConfigureSoc + .text.HAL_ADC_StartIt + 0x0000000003001c7e 0x12c obj/drivers/adc/src/adc.o + 0x0000000003001c7e HAL_ADC_StartIt + .text.HAL_ADC_SoftTrigSample + 0x0000000003001daa 0x82 obj/drivers/adc/src/adc.o + 0x0000000003001daa HAL_ADC_SoftTrigSample + .text.HAL_ADC_GetConvResult + 0x0000000003001e2c 0x82 obj/drivers/adc/src/adc.o + 0x0000000003001e2c HAL_ADC_GetConvResult + .text.AssertErrorLog + 0x0000000003001eae 0x16 obj/drivers/base/src/assert.o + 0x0000000003001eae AssertErrorLog + .text.DCL_SYSTICK_GetTick + 0x0000000003001ec4 0x14 obj/drivers/base/src/clock.o + .text.BASE_FUNC_DelayUs + 0x0000000003001ed8 0x5c obj/drivers/base/src/clock.o + 0x0000000003001ed8 BASE_FUNC_DelayUs + .text.BASE_FUNC_DelayMs + 0x0000000003001f34 0x38 obj/drivers/base/src/clock.o + 0x0000000003001f34 BASE_FUNC_DelayMs + .text.BASE_FUNC_DelaySeconds + 0x0000000003001f6c 0x38 obj/drivers/base/src/clock.o + 0x0000000003001f6c BASE_FUNC_DelaySeconds + .text.BASE_FUNC_Delay + 0x0000000003001fa4 0x52 obj/drivers/base/src/clock.o + 0x0000000003001fa4 BASE_FUNC_Delay + .text.IRQ_ClearN + 0x0000000003001ff6 0x20 obj/drivers/base/src/interrupt.o + .text.InterruptEntry + 0x0000000003002016 0x44 obj/drivers/base/src/interrupt.o + 0x0000000003002016 InterruptEntry + .text.IRQ_Init + 0x000000000300205a 0x58 obj/drivers/base/src/interrupt.o + 0x000000000300205a IRQ_Init + .text.IRQ_Register + 0x00000000030020b2 0x86 obj/drivers/base/src/interrupt.o + 0x00000000030020b2 IRQ_Register + .text.IRQ_EnableN + 0x0000000003002138 0x12e obj/drivers/base/src/interrupt.o + 0x0000000003002138 IRQ_EnableN + .text.SysErrPrint + 0x0000000003002266 0x12 obj/drivers/base/src/interrupt.o + 0x0000000003002266 SysErrPrint + .text.SysErrFinish + 0x0000000003002278 0xe obj/drivers/base/src/interrupt.o + .text.SysErrExcEntry + 0x0000000003002286 0x1e obj/drivers/base/src/interrupt.o + 0x0000000003002286 SysErrExcEntry + .text.SysErrNmiEntry + 0x00000000030022a4 0x34 obj/drivers/base/src/interrupt.o + 0x00000000030022a4 SysErrNmiEntry + .text.SetLocalIntNumPri + 0x00000000030022d8 0x2ca obj/drivers/base/src/interrupt.o + .text.IRQ_SetLocalPriority + 0x00000000030025a2 0x2e4 obj/drivers/base/src/interrupt.o + .text.IRQ_SetPriority + 0x0000000003002886 0x74 obj/drivers/base/src/interrupt.o + 0x0000000003002886 IRQ_SetPriority + .text.IRQ_DummyHandler + 0x00000000030028fa 0x12 obj/drivers/base/src/interrupt.o + .text.IRQ_SetCallBack + 0x000000000300290c 0x46 obj/drivers/base/src/interrupt.o + .text.DCL_SYSCTRL_CrgWriteProtectionDisable + 0x0000000003002952 0x28 obj/drivers/crg/src/crg.o + .text.DCL_SYSCTRL_CrgWriteProtectionEnable + 0x000000000300297a 0x2a obj/drivers/crg/src/crg.o + .text.IsCrgPllRefClkSelect + 0x00000000030029a4 0x2c obj/drivers/crg/src/crg.o + .text.IsCrgPllPreDiv + 0x00000000030029d0 0x1c obj/drivers/crg/src/crg.o + .text.IsCrgPllPostDiv + 0x00000000030029ec 0x1c obj/drivers/crg/src/crg.o + .text.IsCrgPllPostDiv2 + 0x0000000003002a08 0x1c obj/drivers/crg/src/crg.o + .text.IsCrgPllFbDiv + 0x0000000003002a24 0x1c obj/drivers/crg/src/crg.o + .text.IsCrgCoreCkSel + 0x0000000003002a40 0x36 obj/drivers/crg/src/crg.o + .text.IsCrg1MCkSel + 0x0000000003002a76 0x2c obj/drivers/crg/src/crg.o + .text.IsCrg1MCkDiv + 0x0000000003002aa2 0x1c obj/drivers/crg/src/crg.o + .text.IsCrgValidPreDiv + 0x0000000003002abe 0x5e obj/drivers/crg/src/crg.o + .text.IsCrgValidFdDiv + 0x0000000003002b1c 0x8a obj/drivers/crg/src/crg.o + .text.IsCrgValidPostDiv + 0x0000000003002ba6 0x48 obj/drivers/crg/src/crg.o + .text.IsCrgValidPostDiv2 + 0x0000000003002bee 0x48 obj/drivers/crg/src/crg.o + .text.IsCrgAdcClkModeSelect + 0x0000000003002c36 0x40 obj/drivers/crg/src/crg.o + .text.IsCrgAdcClkDiv + 0x0000000003002c76 0x40 obj/drivers/crg/src/crg.o + .text.DCL_CRG_SetCoreClkSel + 0x0000000003002cb6 0x70 obj/drivers/crg/src/crg.o + .text.AssertErrorLog.trans.1 + 0x0000000003002d26 0x4 _kmpl_trans + 0x0000000003002d26 AssertErrorLog.trans.1 + .text.HAL_CRG_Init + 0x0000000003002d2a 0x2c8 obj/drivers/crg/src/crg.o + 0x0000000003002d2a HAL_CRG_Init + .text.HAL_CRG_SetCoreClockSelect + 0x0000000003002ff2 0x8e obj/drivers/crg/src/crg.o + 0x0000000003002ff2 HAL_CRG_SetCoreClockSelect + .text.CRG_GetVcoFreq + 0x0000000003003080 0x94 obj/drivers/crg/src/crg.o + .text.HAL_CRG_GetPllFreq + 0x0000000003003114 0x6c obj/drivers/crg/src/crg.o + 0x0000000003003114 HAL_CRG_GetPllFreq + .text.HAL_CRG_GetCoreClkFreq + 0x0000000003003180 0x96 obj/drivers/crg/src/crg.o + 0x0000000003003180 HAL_CRG_GetCoreClkFreq + .text.HAL_CRG_GetIpFreq + 0x0000000003003216 0xe4 obj/drivers/crg/src/crg.o + 0x0000000003003216 HAL_CRG_GetIpFreq + .text.HAL_CRG_IpEnableSet + 0x00000000030032fa 0xd8 obj/drivers/crg/src/crg.o + 0x00000000030032fa HAL_CRG_IpEnableSet + .text.HAL_CRG_IpClkSelectSet + 0x00000000030033d2 0xb6 obj/drivers/crg/src/crg.o + 0x00000000030033d2 HAL_CRG_IpClkSelectSet + .text.HAL_CRG_IpClkDivSet + 0x0000000003003488 0xb6 obj/drivers/crg/src/crg.o + 0x0000000003003488 HAL_CRG_IpClkDivSet + .text.GetCrgIpMatchInfo.trans.7 + 0x000000000300353e 0x4 _kmpl_trans + 0x000000000300353e GetCrgIpMatchInfo.trans.7 + .text.CRG_GetAdcIpFreq + 0x0000000003003542 0x126 obj/drivers/crg/src/crg.o + .text.CRG_IsValidPllConfig + 0x0000000003003668 0xc2 obj/drivers/crg/src/crg.o + .text.CRG_IsValid1MHzConfig + 0x000000000300372a 0x52 obj/drivers/crg/src/crg.o + .text.CRG_GetPllRefIni + 0x000000000300377c 0x2a obj/drivers/crg/src/crg.o + .text.CRG_GetPreDivValue + 0x00000000030037a6 0x2e obj/drivers/crg/src/crg.o + .text.CRG_GetPllFbDivValue + 0x00000000030037d4 0x42 obj/drivers/crg/src/crg.o + .text.CRG_GetPllPostDivValue + 0x0000000003003816 0x3a obj/drivers/crg/src/crg.o + .text.CRG_IpWoClkSelEnableSet + 0x0000000003003850 0x18e obj/drivers/crg/src/crg.o + .text.CRG_IpWoClkSelEnableGet + 0x00000000030039de 0x88 obj/drivers/crg/src/crg.o + .text.AssertErrorLog.trans.2 + 0x0000000003003a66 0x4 _kmpl_trans + 0x0000000003003a66 AssertErrorLog.trans.2 + .text.CRG_IpWoClkSelResetSet + 0x0000000003003a6a 0x10a obj/drivers/crg/src/crg.o + .text.CRG_IpWoClkSelResetGet + 0x0000000003003b74 0x8a obj/drivers/crg/src/crg.o + .text.CRG_AdcEnableSet + 0x0000000003003bfe 0xb6 obj/drivers/crg/src/crg.o + .text.CRG_AdcEnableGet + 0x0000000003003cb4 0x7e obj/drivers/crg/src/crg.o + .text.CRG_AdcClkSelectSet + 0x0000000003003d32 0xfe obj/drivers/crg/src/crg.o + .text.CRG_AdcClkSelectGet + 0x0000000003003e30 0x8e obj/drivers/crg/src/crg.o + .text.CRG_AdcDivSet + 0x0000000003003ebe 0xd8 obj/drivers/crg/src/crg.o + .text.CRG_AdcDivGet + 0x0000000003003f96 0x96 obj/drivers/crg/src/crg.o + .text.CRG_EfcEnableSet + 0x000000000300402c 0x80 obj/drivers/crg/src/crg.o + .text.CRG_EfcEnableGet + 0x00000000030040ac 0x6e obj/drivers/crg/src/crg.o + .text.CRG_AnaEnableSet + 0x000000000300411a 0x188 obj/drivers/crg/src/crg.o + .text.CRG_AnaEnableGet + 0x00000000030042a2 0x82 obj/drivers/crg/src/crg.o + .text.DBG_PrintCh + 0x0000000003004324 0x42 obj/drivers/debug/src/debug.o + .text.DBG_PrintStr + 0x0000000003004366 0x4a obj/drivers/debug/src/debug.o + .text.DBG_Pow 0x00000000030043b0 0x40 obj/drivers/debug/src/debug.o + .text.DBG_CountDigits + 0x00000000030043f0 0x68 obj/drivers/debug/src/debug.o + .text.DBG_PutUnsignedNum + 0x0000000003004458 0xb2 obj/drivers/debug/src/debug.o + .text.DBG_PrintInt + 0x000000000300450a 0x5e obj/drivers/debug/src/debug.o + .text.DBG_PrintHex + 0x0000000003004568 0x44 obj/drivers/debug/src/debug.o + .text.DBG_PrintFlt + 0x00000000030045ac 0x13c obj/drivers/debug/src/debug.o + .text.ParseSpecifier + 0x00000000030046e8 0x19c obj/drivers/debug/src/debug.o + .text.DBG_PrintIntWithField + 0x0000000003004884 0x11a obj/drivers/debug/src/debug.o + .text.DBG_Atoi + 0x000000000300499e 0x6a obj/drivers/debug/src/debug.o + .text.DBG_UartPrintf + 0x0000000003004a08 0x168 obj/drivers/debug/src/debug.o + 0x0000000003004a08 DBG_UartPrintf + .text.DCL_IOCMG_SetRegValue + 0x0000000003004b70 0x44 obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_SetDriveRate + 0x0000000003004bb4 0x6e obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_SetPullMode + 0x0000000003004c22 0x8c obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_SetLevelShiftRate + 0x0000000003004cae 0x6e obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_SetSchmidtMode + 0x0000000003004d1c 0x6e obj/drivers/iocmg/src/iocmg.o + .text.IOCMG_GetRegAddr + 0x0000000003004d8a 0x52 obj/drivers/iocmg/src/iocmg.o + .text.HAL_IOCMG_SetPinAltFuncMode + 0x0000000003004ddc 0x3a obj/drivers/iocmg/src/iocmg.o + 0x0000000003004ddc HAL_IOCMG_SetPinAltFuncMode + .text.HAL_IOCMG_SetPinPullMode + 0x0000000003004e16 0x4c obj/drivers/iocmg/src/iocmg.o + 0x0000000003004e16 HAL_IOCMG_SetPinPullMode + .text.HAL_IOCMG_SetPinSchmidtMode + 0x0000000003004e62 0x4c obj/drivers/iocmg/src/iocmg.o + 0x0000000003004e62 HAL_IOCMG_SetPinSchmidtMode + .text.HAL_IOCMG_SetPinLevelShiftRate + 0x0000000003004eae 0x4c obj/drivers/iocmg/src/iocmg.o + 0x0000000003004eae HAL_IOCMG_SetPinLevelShiftRate + .text.HAL_IOCMG_SetPinDriveRate + 0x0000000003004efa 0x4c obj/drivers/iocmg/src/iocmg.o + 0x0000000003004efa HAL_IOCMG_SetPinDriveRate + .text.IsTimerMode + 0x0000000003004f46 0x36 obj/drivers/timer/src/timer.o + .text.IsTimerInterruptType + 0x0000000003004f7c 0x2c obj/drivers/timer/src/timer.o + .text.IsTimerSize + 0x0000000003004fa8 0x2c obj/drivers/timer/src/timer.o + .text.IsTimerPeriod + 0x0000000003004fd4 0x1c obj/drivers/timer/src/timer.o + .text.IsTimerDiv + 0x0000000003004ff0 0x36 obj/drivers/timer/src/timer.o + .text.HAL_TIMER_Init + 0x0000000003005026 0x252 obj/drivers/timer/src/timer.o + 0x0000000003005026 HAL_TIMER_Init + .text.AssertErrorLog.trans.3 + 0x0000000003005278 0x4 _kmpl_trans + 0x0000000003005278 AssertErrorLog.trans.3 + .text.HAL_TIMER_Start + 0x000000000300527c 0x82 obj/drivers/timer/src/timer.o + 0x000000000300527c HAL_TIMER_Start + .text.HAL_TIMER_IrqHandler + 0x00000000030052fe 0xe8 obj/drivers/timer/src/timer.o + 0x00000000030052fe HAL_TIMER_IrqHandler + .text.HAL_TIMER_RegisterCallback + 0x00000000030053e6 0x94 obj/drivers/timer/src/timer.o + 0x00000000030053e6 HAL_TIMER_RegisterCallback + .text.IsUartDatalength + 0x000000000300547a 0x1c obj/drivers/uart/src/uart.o + .text.IsUartStopbits + 0x0000000003005496 0x2c obj/drivers/uart/src/uart.o + .text.IsUartParitymode + 0x00000000030054c2 0x22 obj/drivers/uart/src/uart.o + .text.IsUartTransmode + 0x00000000030054e4 0x3c obj/drivers/uart/src/uart.o + .text.IsUartFIFOThreshold + 0x0000000003005520 0x1c obj/drivers/uart/src/uart.o + .text.IsUartOversampleMultiple + 0x000000000300553c 0x1c obj/drivers/uart/src/uart.o + .text.DivClosest + 0x0000000003005558 0x3e obj/drivers/uart/src/uart.o + .text.UART_SetParityBit + 0x0000000003005596 0x96 obj/drivers/uart/src/uart.o + .text.HAL_UART_Init + 0x000000000300562c 0x3be obj/drivers/uart/src/uart.o + 0x000000000300562c HAL_UART_Init + .text.main 0x00000000030059ea 0xc obj/user/main.o + 0x00000000030059ea main + .text.CRG_Config + 0x00000000030059f6 0x6a obj/user/generatecode/system_init.o + 0x00000000030059f6 CRG_Config + .text.ADC0_Init + 0x0000000003005a60 0x98 obj/user/generatecode/system_init.o + .text.TIMER3_Init + 0x0000000003005af8 0xfe obj/user/generatecode/system_init.o + .text.UART0_Init + 0x0000000003005bf6 0xc8 obj/user/generatecode/system_init.o + .text.HAL_CRG_IpEnableSet.trans.5 + 0x0000000003005cbe 0x4 _kmpl_trans + 0x0000000003005cbe HAL_CRG_IpEnableSet.trans.5 + .text.IOConfig + 0x0000000003005cc2 0xc0 obj/user/generatecode/system_init.o + .text.HAL_IOCMG_SetPinDriveRate.trans.13 + 0x0000000003005d82 0x4 _kmpl_trans + 0x0000000003005d82 HAL_IOCMG_SetPinDriveRate.trans.13 + .text.HAL_IOCMG_SetPinLevelShiftRate.trans.12 + 0x0000000003005d86 0x4 _kmpl_trans + 0x0000000003005d86 HAL_IOCMG_SetPinLevelShiftRate.trans.12 + .text.HAL_IOCMG_SetPinSchmidtMode.trans.11 + 0x0000000003005d8a 0x4 _kmpl_trans + 0x0000000003005d8a HAL_IOCMG_SetPinSchmidtMode.trans.11 + .text.HAL_IOCMG_SetPinPullMode.trans.10 + 0x0000000003005d8e 0x4 _kmpl_trans + 0x0000000003005d8e HAL_IOCMG_SetPinPullMode.trans.10 + .text.HAL_IOCMG_SetPinAltFuncMode.trans.9 + 0x0000000003005d92 0x4 _kmpl_trans + 0x0000000003005d92 HAL_IOCMG_SetPinAltFuncMode.trans.9 + .text.SystemInit + 0x0000000003005d96 0x40 obj/user/generatecode/system_init.o + 0x0000000003005d96 SystemInit + .text.TIMER3_InterruptProcess + 0x0000000003005dd6 0xe8 obj/user/generatecode/tim_adc.o + 0x0000000003005dd6 TIMER3_InterruptProcess + .text 0x0000000003005ebe 0xde d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsfdf2.o) + 0x0000000003005ebe __extendsfdf2 + .text 0x0000000003005f9c 0x222 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + 0x0000000003005f9c __truncdfsf2 + .text 0x00000000030061be 0x3c d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + 0x00000000030061be __clzsi2 + *(.ram.text*) + 0x00000000030061fc . = ALIGN (0x4) + *fill* 0x00000000030061fa 0x2 + 0x00000000030061fc __rodata_start = . + *(.rodata*) + .rodata 0x00000000030061fc 0x4 obj/chip/3061m/chipinit/anatrim/anatrim.o + .rodata.g_crgIpMatch + 0x0000000003006200 0x228 obj/chip/3061m/ip_crg/ip_crg_common.o + .rodata 0x0000000003006428 0x50 obj/drivers/adc/src/adc.o + .rodata 0x0000000003006478 0x20 obj/drivers/base/src/interrupt.o + .rodata.SetLocalIntNumPri + 0x0000000003006498 0x20 obj/drivers/base/src/interrupt.o + .rodata.IRQ_SetLocalPriority + 0x00000000030064b8 0x20 obj/drivers/base/src/interrupt.o + .rodata 0x00000000030064d8 0x58 obj/drivers/crg/src/crg.o + .rodata.HAL_CRG_GetIpFreq + 0x0000000003006530 0x18 obj/drivers/crg/src/crg.o + .rodata.ParseSpecifier + 0x0000000003006548 0x84 obj/drivers/debug/src/debug.o + .rodata 0x00000000030065cc 0x3d obj/drivers/iocmg/src/iocmg.o + *fill* 0x0000000003006609 0x3 + .rodata 0x000000000300660c 0x3d obj/drivers/timer/src/timer.o + *fill* 0x0000000003006649 0x3 + .rodata.UART_SetParityBit + 0x000000000300664c 0x14 obj/drivers/uart/src/uart.o + .rodata 0x0000000003006660 0x1b obj/drivers/uart/src/uart.o + *fill* 0x000000000300667b 0x1 + .rodata 0x000000000300667c 0x18 obj/user/generatecode/tim_adc.o + .rodata 0x0000000003006694 0x100 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + 0x0000000003006694 __clz_tab + 0x0000000003006794 . = ALIGN (0x4) + 0x0000000003006794 __rodata_end = . + *(.got*) + .got 0x0000000003006794 0x8 obj/chip/3061m/startup.o + 0x0000000003006794 _GLOBAL_OFFSET_TABLE_ + .got.plt 0x000000000300679c 0x8 obj/chip/3061m/startup.o + 0x00000000030067a4 __text_end = . + +.data 0x0000000004000020 0xdc load address 0x00000000030067a4 + 0x00000000030067a4 __data_load = LOADADDR (.data) + 0x0000000004000020 __data_start = . + *(.data*) + .data.g_tsensorGain + 0x0000000004000020 0x4 obj/chip/3061m/chipinit/anatrim/anatrim.o + 0x0000000004000020 g_tsensorGain + .data.g_ipClkProc + 0x0000000004000024 0xd8 obj/drivers/crg/src/crg.o + 0x00000000040000fc . = ALIGN (0x4) + 0x00000000040000fc __data_end = . + 0x00000000000000dc __data_size = (__data_end - __data_start) + +.stackBound 0x0000000004004ff0 0x0 load address 0x0000000003006880 + 0x0000000003006880 __stack_sram_bound_data_load = LOADADDR (.stackBound) + 0x0000000004004ff0 __stack_sram_bound_data_start = . + *(STACK_SRAM_BOUND) + 0x0000000004004ff0 . = ALIGN (0x4) + 0x0000000004004ff0 __stack_sram_bound_data_end = . + +.checkSum 0x0000000003006880 0x0 + 0x0000000003006880 __checksum_addr = . + *(CHECKSUM) + 0x0000000003006880 __checksum_end = . + +.bss 0x00000000040000fc 0x210c + 0x00000000040000fc __bss_begin__ = . + *(.bss*) + .bss.g_irqCallbackFunc + 0x00000000040000fc 0x398 obj/drivers/base/src/interrupt.o + 0x00000000040000fc g_irqCallbackFunc + .bss.g_crgBaseAddr + 0x0000000004000494 0x4 obj/drivers/crg/src/crg.o + .bss.g_anaEnableFlag + 0x0000000004000498 0x1 obj/drivers/crg/src/crg.o + *fill* 0x0000000004000499 0x3 + .bss.g_timer3 0x000000000400049c 0x28 obj/user/main.o + 0x000000000400049c g_timer3 + .bss.g_uart0 0x00000000040004c4 0x80 obj/user/main.o + 0x00000000040004c4 g_uart0 + .bss.g_adc0 0x0000000004000544 0xa0 obj/user/main.o + 0x0000000004000544 g_adc0 + .bss.adc_num 0x00000000040005e4 0x1c20 obj/user/generatecode/tim_adc.o + 0x00000000040005e4 adc_num + .bss.i 0x0000000004002204 0x4 obj/user/generatecode/tim_adc.o + 0x0000000004002204 i + *(COMMON) + 0x0000000004002208 . = ALIGN (0x4) + 0x0000000004002208 __bss_end__ = . + 0x000000000000210c __bss_size__ = (__bss_end__ - __bss_begin__) + 0x0000000004001114 __global_pointer$ = (__data_start + ((__data_size + __bss_size__) / 0x2)) + +.ramBuf + *(RAM_DIAGNOSE_BUF) +OUTPUT(./bin/target.elf elf32-littleriscv) + +.riscv.attributes + 0x0000000000000000 0x36 + .riscv.attributes + 0x0000000000000000 0x31 obj/chip/3061m/startup.o + .riscv.attributes + 0x0000000000000031 0x32 obj/chip/3061m/chipinit/chipinit.o + .riscv.attributes + 0x0000000000000063 0x32 obj/chip/3061m/chipinit/anatrim/anatrim.o + .riscv.attributes + 0x0000000000000095 0x32 obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o + .riscv.attributes + 0x00000000000000c7 0x32 obj/chip/3061m/chipinit/crginit/crginit.o + .riscv.attributes + 0x00000000000000f9 0x32 obj/chip/3061m/chipinit/flashinit/flashinit.o + .riscv.attributes + 0x000000000000012b 0x32 obj/chip/3061m/chipinit/systickinit/systickinit.o + .riscv.attributes + 0x000000000000015d 0x32 obj/chip/3061m/fotp/fotp_info_read.o + .riscv.attributes + 0x000000000000018f 0x32 obj/chip/3061m/ip_crg/ip_crg_common.o + .riscv.attributes + 0x00000000000001c1 0x32 obj/drivers/adc/src/adc.o + .riscv.attributes + 0x00000000000001f3 0x32 obj/drivers/base/src/assert.o + .riscv.attributes + 0x0000000000000225 0x32 obj/drivers/base/src/clock.o + .riscv.attributes + 0x0000000000000257 0x36 obj/drivers/base/src/interrupt.o + .riscv.attributes + 0x000000000000028d 0x32 obj/drivers/crg/src/crg.o + .riscv.attributes + 0x00000000000002bf 0x32 obj/drivers/debug/src/debug.o + .riscv.attributes + 0x00000000000002f1 0x32 obj/drivers/iocmg/src/iocmg.o + .riscv.attributes + 0x0000000000000323 0x32 obj/drivers/timer/src/timer.o + .riscv.attributes + 0x0000000000000355 0x32 obj/drivers/uart/src/uart.o + .riscv.attributes + 0x0000000000000387 0x32 obj/user/main.o + .riscv.attributes + 0x00000000000003b9 0x32 obj/user/generatecode/system_init.o + .riscv.attributes + 0x00000000000003eb 0x32 obj/user/generatecode/tim_adc.o + .riscv.attributes + 0x000000000000041d 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsfdf2.o) + .riscv.attributes + 0x0000000000000453 0x36 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + .riscv.attributes + 0x0000000000000489 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .riscv.attributes + 0x00000000000004bb 0x32 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + +.comment 0x0000000000000000 0x29 + .comment 0x0000000000000000 0x29 obj/chip/3061m/chipinit/chipinit.o + 0x2a (size before relaxing) + .comment 0x0000000000000029 0x2a obj/chip/3061m/chipinit/anatrim/anatrim.o + .comment 0x0000000000000029 0x2a obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o + .comment 0x0000000000000029 0x2a obj/chip/3061m/chipinit/crginit/crginit.o + .comment 0x0000000000000029 0x2a obj/chip/3061m/chipinit/flashinit/flashinit.o + .comment 0x0000000000000029 0x2a obj/chip/3061m/chipinit/systickinit/systickinit.o + .comment 0x0000000000000029 0x2a obj/chip/3061m/fotp/fotp_info_read.o + .comment 0x0000000000000029 0x2a obj/chip/3061m/ip_crg/ip_crg_common.o + .comment 0x0000000000000029 0x2a obj/drivers/adc/src/adc.o + .comment 0x0000000000000029 0x2a obj/drivers/base/src/assert.o + .comment 0x0000000000000029 0x2a obj/drivers/base/src/clock.o + .comment 0x0000000000000029 0x2a obj/drivers/base/src/interrupt.o + .comment 0x0000000000000029 0x2a obj/drivers/crg/src/crg.o + .comment 0x0000000000000029 0x2a obj/drivers/debug/src/debug.o + .comment 0x0000000000000029 0x2a obj/drivers/iocmg/src/iocmg.o + .comment 0x0000000000000029 0x2a obj/drivers/timer/src/timer.o + .comment 0x0000000000000029 0x2a obj/drivers/uart/src/uart.o + .comment 0x0000000000000029 0x2a obj/user/main.o + .comment 0x0000000000000029 0x2a obj/user/generatecode/system_init.o + .comment 0x0000000000000029 0x2a obj/user/generatecode/tim_adc.o + .comment 0x0000000000000029 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsfdf2.o) + .comment 0x0000000000000029 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + .comment 0x0000000000000029 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .comment 0x0000000000000029 0x2a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + +.debug_line 0x0000000000000000 0x9172 + .debug_line 0x0000000000000000 0x8cc obj/chip/3061m/startup.o + .debug_line 0x00000000000008cc 0x15b obj/chip/3061m/chipinit/chipinit.o + .debug_line 0x0000000000000a27 0x2d7 obj/chip/3061m/chipinit/anatrim/anatrim.o + .debug_line 0x0000000000000cfe 0xc5 obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o + .debug_line 0x0000000000000dc3 0x166 obj/chip/3061m/chipinit/crginit/crginit.o + .debug_line 0x0000000000000f29 0x192 obj/chip/3061m/chipinit/flashinit/flashinit.o + .debug_line 0x00000000000010bb 0xaa obj/chip/3061m/chipinit/systickinit/systickinit.o + .debug_line 0x0000000000001165 0x209 obj/chip/3061m/fotp/fotp_info_read.o + .debug_line 0x000000000000136e 0x9d obj/chip/3061m/ip_crg/ip_crg_common.o + .debug_line 0x000000000000140b 0x15ae obj/drivers/adc/src/adc.o + .debug_line 0x00000000000029b9 0x53 obj/drivers/base/src/assert.o + .debug_line 0x0000000000002a0c 0x1bf obj/drivers/base/src/clock.o + .debug_line 0x0000000000002bcb 0x6ff obj/drivers/base/src/interrupt.o + .debug_line 0x00000000000032ca 0x1984 obj/drivers/crg/src/crg.o + .debug_line 0x0000000000004c4e 0x6d4 obj/drivers/debug/src/debug.o + .debug_line 0x0000000000005322 0x7b5 obj/drivers/iocmg/src/iocmg.o + .debug_line 0x0000000000005ad7 0x904 obj/drivers/timer/src/timer.o + .debug_line 0x00000000000063db 0x17f0 obj/drivers/uart/src/uart.o + .debug_line 0x0000000000007bcb 0x1cf obj/user/main.o + .debug_line 0x0000000000007d9a 0x4ca obj/user/generatecode/system_init.o + .debug_line 0x0000000000008264 0x204 obj/user/generatecode/tim_adc.o + .debug_line 0x0000000000008468 0x22e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsfdf2.o) + .debug_line 0x0000000000008696 0x40a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + .debug_line 0x0000000000008aa0 0x345 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .debug_line 0x0000000000008de5 0x38d d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + +.debug_info 0x0000000000000000 0x37b01 + .debug_info 0x0000000000000000 0x26 obj/chip/3061m/startup.o + .debug_info 0x0000000000000026 0x3fcc obj/chip/3061m/chipinit/chipinit.o + .debug_info 0x0000000000003ff2 0x4d97 obj/chip/3061m/chipinit/anatrim/anatrim.o + .debug_info 0x0000000000008d89 0x2af obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o + .debug_info 0x0000000000009038 0x26d5 obj/chip/3061m/chipinit/crginit/crginit.o + .debug_info 0x000000000000b70d 0x111e obj/chip/3061m/chipinit/flashinit/flashinit.o + .debug_info 0x000000000000c82b 0x19e obj/chip/3061m/chipinit/systickinit/systickinit.o + .debug_info 0x000000000000c9c9 0x1152 obj/chip/3061m/fotp/fotp_info_read.o + .debug_info 0x000000000000db1b 0x130 obj/chip/3061m/ip_crg/ip_crg_common.o + .debug_info 0x000000000000dc4b 0x6633 obj/drivers/adc/src/adc.o + .debug_info 0x000000000001427e 0x81 obj/drivers/base/src/assert.o + .debug_info 0x00000000000142ff 0x2d1 obj/drivers/base/src/clock.o + .debug_info 0x00000000000145d0 0xe40 obj/drivers/base/src/interrupt.o + .debug_info 0x0000000000015410 0x41a4 obj/drivers/crg/src/crg.o + .debug_info 0x00000000000195b4 0x281c obj/drivers/debug/src/debug.o + .debug_info 0x000000000001bdd0 0x12ff obj/drivers/iocmg/src/iocmg.o + .debug_info 0x000000000001d0cf 0x80c obj/drivers/timer/src/timer.o + .debug_info 0x000000000001d8db 0x2e24 obj/drivers/uart/src/uart.o + .debug_info 0x00000000000206ff 0x68b6 obj/user/main.o + .debug_info 0x0000000000026fb5 0x973e obj/user/generatecode/system_init.o + .debug_info 0x00000000000306f3 0x68b1 obj/user/generatecode/tim_adc.o + .debug_info 0x0000000000036fa4 0x28b d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsfdf2.o) + .debug_info 0x000000000003722f 0x2cb d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + .debug_info 0x00000000000374fa 0x2d0 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .debug_info 0x00000000000377ca 0x337 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + +.debug_abbrev 0x0000000000000000 0x2c67 + .debug_abbrev 0x0000000000000000 0x14 obj/chip/3061m/startup.o + .debug_abbrev 0x0000000000000014 0x1c3 obj/chip/3061m/chipinit/chipinit.o + .debug_abbrev 0x00000000000001d7 0x249 obj/chip/3061m/chipinit/anatrim/anatrim.o + .debug_abbrev 0x0000000000000420 0xdf obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o + .debug_abbrev 0x00000000000004ff 0x172 obj/chip/3061m/chipinit/crginit/crginit.o + .debug_abbrev 0x0000000000000671 0x169 obj/chip/3061m/chipinit/flashinit/flashinit.o + .debug_abbrev 0x00000000000007da 0xd0 obj/chip/3061m/chipinit/systickinit/systickinit.o + .debug_abbrev 0x00000000000008aa 0x196 obj/chip/3061m/fotp/fotp_info_read.o + .debug_abbrev 0x0000000000000a40 0xd9 obj/chip/3061m/ip_crg/ip_crg_common.o + .debug_abbrev 0x0000000000000b19 0x32c obj/drivers/adc/src/adc.o + .debug_abbrev 0x0000000000000e45 0x5c obj/drivers/base/src/assert.o + .debug_abbrev 0x0000000000000ea1 0x15b obj/drivers/base/src/clock.o + .debug_abbrev 0x0000000000000ffc 0x275 obj/drivers/base/src/interrupt.o + .debug_abbrev 0x0000000000001271 0x2ba obj/drivers/crg/src/crg.o + .debug_abbrev 0x000000000000152b 0x31d obj/drivers/debug/src/debug.o + .debug_abbrev 0x0000000000001848 0x2be obj/drivers/iocmg/src/iocmg.o + .debug_abbrev 0x0000000000001b06 0x1f0 obj/drivers/timer/src/timer.o + .debug_abbrev 0x0000000000001cf6 0x32e obj/drivers/uart/src/uart.o + .debug_abbrev 0x0000000000002024 0x23f obj/user/main.o + .debug_abbrev 0x0000000000002263 0x2ec obj/user/generatecode/system_init.o + .debug_abbrev 0x000000000000254f 0x27b obj/user/generatecode/tim_adc.o + .debug_abbrev 0x00000000000027ca 0x14e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsfdf2.o) + .debug_abbrev 0x0000000000002918 0x159 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + .debug_abbrev 0x0000000000002a71 0xd2 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .debug_abbrev 0x0000000000002b43 0x124 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + +.debug_aranges 0x0000000000000000 0xae0 + .debug_aranges + 0x0000000000000000 0x20 obj/chip/3061m/startup.o + .debug_aranges + 0x0000000000000020 0x30 obj/chip/3061m/chipinit/chipinit.o + .debug_aranges + 0x0000000000000050 0x40 obj/chip/3061m/chipinit/anatrim/anatrim.o + .debug_aranges + 0x0000000000000090 0x20 obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o + .debug_aranges + 0x00000000000000b0 0x28 obj/chip/3061m/chipinit/crginit/crginit.o + .debug_aranges + 0x00000000000000d8 0x30 obj/chip/3061m/chipinit/flashinit/flashinit.o + .debug_aranges + 0x0000000000000108 0x28 obj/chip/3061m/chipinit/systickinit/systickinit.o + .debug_aranges + 0x0000000000000130 0x28 obj/chip/3061m/fotp/fotp_info_read.o + .debug_aranges + 0x0000000000000158 0x20 obj/chip/3061m/ip_crg/ip_crg_common.o + .debug_aranges + 0x0000000000000178 0x1c8 obj/drivers/adc/src/adc.o + .debug_aranges + 0x0000000000000340 0x20 obj/drivers/base/src/assert.o + .debug_aranges + 0x0000000000000360 0x48 obj/drivers/base/src/clock.o + .debug_aranges + 0x00000000000003a8 0xc8 obj/drivers/base/src/interrupt.o + .debug_aranges + 0x0000000000000470 0x1e8 obj/drivers/crg/src/crg.o + .debug_aranges + 0x0000000000000658 0x88 obj/drivers/debug/src/debug.o + .debug_aranges + 0x00000000000006e0 0x128 obj/drivers/iocmg/src/iocmg.o + .debug_aranges + 0x0000000000000808 0x98 obj/drivers/timer/src/timer.o + .debug_aranges + 0x00000000000008a0 0x120 obj/drivers/uart/src/uart.o + .debug_aranges + 0x00000000000009c0 0x28 obj/user/main.o + .debug_aranges + 0x00000000000009e8 0x58 obj/user/generatecode/system_init.o + .debug_aranges + 0x0000000000000a40 0x28 obj/user/generatecode/tim_adc.o + .debug_aranges + 0x0000000000000a68 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsfdf2.o) + .debug_aranges + 0x0000000000000a88 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + .debug_aranges + 0x0000000000000aa8 0x18 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .debug_aranges + 0x0000000000000ac0 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + +.debug_str 0x0000000000000000 0xac24 + .debug_str 0x0000000000000000 0x50 obj/chip/3061m/startup.o + .debug_str 0x0000000000000050 0x2f3d obj/chip/3061m/chipinit/chipinit.o + 0x2f86 (size before relaxing) + .debug_str 0x0000000000002f8d 0x63d obj/chip/3061m/chipinit/anatrim/anatrim.o + 0x34f8 (size before relaxing) + .debug_str 0x00000000000035ca 0x8d obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o + 0x623 (size before relaxing) + .debug_str 0x0000000000003657 0xfe4 obj/chip/3061m/chipinit/crginit/crginit.o + 0x1589 (size before relaxing) + .debug_str 0x000000000000463b 0x90a obj/chip/3061m/chipinit/flashinit/flashinit.o + 0xe3b (size before relaxing) + .debug_str 0x0000000000004f45 0xc8 obj/chip/3061m/chipinit/systickinit/systickinit.o + 0x51f (size before relaxing) + .debug_str 0x000000000000500d 0xb5 obj/chip/3061m/fotp/fotp_info_read.o + 0xebe (size before relaxing) + .debug_str 0x00000000000050c2 0xeb obj/chip/3061m/ip_crg/ip_crg_common.o + 0x526 (size before relaxing) + .debug_str 0x00000000000051ad 0x1f56 obj/drivers/adc/src/adc.o + 0x4f36 (size before relaxing) + .debug_str 0x0000000000007103 0x36 obj/drivers/base/src/assert.o + 0x471 (size before relaxing) + .debug_str 0x0000000000007139 0xd4 obj/drivers/base/src/clock.o + 0x5f3 (size before relaxing) + .debug_str 0x000000000000720d 0x4ce obj/drivers/base/src/interrupt.o + 0x99f (size before relaxing) + .debug_str 0x00000000000076db 0xb01 obj/drivers/crg/src/crg.o + 0x2135 (size before relaxing) + .debug_str 0x00000000000081dc 0xc0d obj/drivers/debug/src/debug.o + 0x1f47 (size before relaxing) + .debug_str 0x0000000000008de9 0xd36 obj/drivers/iocmg/src/iocmg.o + 0x124b (size before relaxing) + .debug_str 0x0000000000009b1f 0x571 obj/drivers/timer/src/timer.o + 0xa7b (size before relaxing) + .debug_str 0x000000000000a090 0x475 obj/drivers/uart/src/uart.o + 0x22f4 (size before relaxing) + .debug_str 0x000000000000a505 0x27 obj/user/main.o + 0x4d4c (size before relaxing) + .debug_str 0x000000000000a52c 0x70 obj/user/generatecode/system_init.o + 0x6a4f (size before relaxing) + .debug_str 0x000000000000a59c 0x27 obj/user/generatecode/tim_adc.o + 0x4d20 (size before relaxing) + .debug_str 0x000000000000a5c3 0x2b3 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsfdf2.o) + 0x336 (size before relaxing) + .debug_str 0x000000000000a876 0x13a d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + 0x394 (size before relaxing) + .debug_str 0x000000000000a9b0 0x25e d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + 0x483 (size before relaxing) + .debug_str 0x000000000000ac0e 0x16 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + 0x4a0 (size before relaxing) + +.debug_ranges 0x0000000000000000 0x9b8 + .debug_ranges 0x0000000000000000 0x20 obj/chip/3061m/chipinit/chipinit.o + .debug_ranges 0x0000000000000020 0x30 obj/chip/3061m/chipinit/anatrim/anatrim.o + .debug_ranges 0x0000000000000050 0x10 obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o + .debug_ranges 0x0000000000000060 0x18 obj/chip/3061m/chipinit/crginit/crginit.o + .debug_ranges 0x0000000000000078 0x20 obj/chip/3061m/chipinit/flashinit/flashinit.o + .debug_ranges 0x0000000000000098 0x18 obj/chip/3061m/chipinit/systickinit/systickinit.o + .debug_ranges 0x00000000000000b0 0x18 obj/chip/3061m/fotp/fotp_info_read.o + .debug_ranges 0x00000000000000c8 0x10 obj/chip/3061m/ip_crg/ip_crg_common.o + .debug_ranges 0x00000000000000d8 0x1b8 obj/drivers/adc/src/adc.o + .debug_ranges 0x0000000000000290 0x10 obj/drivers/base/src/assert.o + .debug_ranges 0x00000000000002a0 0x38 obj/drivers/base/src/clock.o + .debug_ranges 0x00000000000002d8 0xb8 obj/drivers/base/src/interrupt.o + .debug_ranges 0x0000000000000390 0x1d8 obj/drivers/crg/src/crg.o + .debug_ranges 0x0000000000000568 0x78 obj/drivers/debug/src/debug.o + .debug_ranges 0x00000000000005e0 0x118 obj/drivers/iocmg/src/iocmg.o + .debug_ranges 0x00000000000006f8 0x88 obj/drivers/timer/src/timer.o + .debug_ranges 0x0000000000000780 0x110 obj/drivers/uart/src/uart.o + .debug_ranges 0x0000000000000890 0x18 obj/user/main.o + .debug_ranges 0x00000000000008a8 0x48 obj/user/generatecode/system_init.o + .debug_ranges 0x00000000000008f0 0x18 obj/user/generatecode/tim_adc.o + .debug_ranges 0x0000000000000908 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsfdf2.o) + .debug_ranges 0x0000000000000928 0x78 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + .debug_ranges 0x00000000000009a0 0x18 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + +.debug_frame 0x0000000000000000 0x26f8 + .debug_frame 0x0000000000000000 0x70 obj/chip/3061m/chipinit/chipinit.o + .debug_frame 0x0000000000000070 0xc0 obj/chip/3061m/chipinit/anatrim/anatrim.o + .debug_frame 0x0000000000000130 0x34 obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o + .debug_frame 0x0000000000000164 0x58 obj/chip/3061m/chipinit/crginit/crginit.o + .debug_frame 0x00000000000001bc 0x78 obj/chip/3061m/chipinit/flashinit/flashinit.o + .debug_frame 0x0000000000000234 0x54 obj/chip/3061m/chipinit/systickinit/systickinit.o + .debug_frame 0x0000000000000288 0x58 obj/chip/3061m/fotp/fotp_info_read.o + .debug_frame 0x00000000000002e0 0x30 obj/chip/3061m/ip_crg/ip_crg_common.o + .debug_frame 0x0000000000000310 0x794 obj/drivers/adc/src/adc.o + .debug_frame 0x0000000000000aa4 0x30 obj/drivers/base/src/assert.o + .debug_frame 0x0000000000000ad4 0xe4 obj/drivers/base/src/clock.o + .debug_frame 0x0000000000000bb8 0x318 obj/drivers/base/src/interrupt.o + .debug_frame 0x0000000000000ed0 0x80c obj/drivers/crg/src/crg.o + .debug_frame 0x00000000000016dc 0x208 obj/drivers/debug/src/debug.o + .debug_frame 0x00000000000018e4 0x4cc obj/drivers/iocmg/src/iocmg.o + .debug_frame 0x0000000000001db0 0x248 obj/drivers/timer/src/timer.o + .debug_frame 0x0000000000001ff8 0x4b8 obj/drivers/uart/src/uart.o + .debug_frame 0x00000000000024b0 0x4c obj/user/main.o + .debug_frame 0x00000000000024fc 0x130 obj/user/generatecode/system_init.o + .debug_frame 0x000000000000262c 0x54 obj/user/generatecode/tim_adc.o + .debug_frame 0x0000000000002680 0x38 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsfdf2.o) + .debug_frame 0x00000000000026b8 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + .debug_frame 0x00000000000026d8 0x20 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + +.debug_loc 0x0000000000000000 0x8c6 + .debug_loc 0x0000000000000000 0x299 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsfdf2.o) + .debug_loc 0x0000000000000299 0x5c2 d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + .debug_loc 0x000000000000085b 0x6b d:/haisi/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) diff --git a/vendor/others/demo/5-tim_adc/demo/out/build.log b/vendor/others/demo/5-tim_adc/demo/out/build.log new file mode 100644 index 000000000..928bc56ed --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/out/build.log @@ -0,0 +1,12 @@ +Done. Made 1 targets from 4 files in 8ms +ninja: Entering directory `out' +[1/2] cross compiler obj/user/generatecode/tim_adc.o +../user/generatecode/tim_adc.c: In function 'TIMER3_InterruptProcess': + +../user/generatecode/tim_adc.c:9:36: warning: unused parameter 'handle' [-Wunused-parameter] + + +[2/2] LINK ./bin/target.elf + ^~~~~~ + + void TIMER3_InterruptProcess(void *handle) diff --git a/vendor/others/demo/5-tim_adc/demo/out/build.ninja b/vendor/others/demo/5-tim_adc/demo/out/build.ninja new file mode 100644 index 000000000..d0c18c4b4 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/out/build.ninja @@ -0,0 +1,20 @@ +ninja_required_version = 1.7.2 + +rule gn + command = "../../../../../HiSpark Studio/tools/Windows/gn/gn.exe" --root=./.. -q --dotfile=../build/.gn --regeneration gen . + pool = console + description = Regenerating ninja files + +build build.ninja: gn + generator = 1 + depfile = build.ninja.d + +subninja toolchain.ninja + +build target.elf: phony ./bin/target.elf +build build$:target.elf: phony ./bin/target.elf + +build all: phony $ + ./bin/target.elf + +default all diff --git a/vendor/others/demo/5-tim_adc/demo/out/build.ninja.d b/vendor/others/demo/5-tim_adc/demo/out/build.ninja.d new file mode 100644 index 000000000..0589c2f9b --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/out/build.ninja.d @@ -0,0 +1 @@ +build.ninja: ../build/BUILD.gn ../build/config/BUILDCONFIG.gn ../build/toolchain/BUILD.gn ../build/toolchain/config.gni ./args.gn ../build/.gn \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/out/log.xml b/vendor/others/demo/5-tim_adc/demo/out/log.xml new file mode 100644 index 000000000..56354dfb2 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/out/log.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/build/target.elf.ninja b/vendor/others/demo/5-tim_adc/demo/out/obj/build/target.elf.ninja new file mode 100644 index 000000000..6f86ff490 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/out/obj/build/target.elf.ninja @@ -0,0 +1,404 @@ +defines = -DFLOAT_SUPPORT +include_dirs = -I../chip/3061m -I../chip/3061m/chipinit -I../chip/3061m/chipinit/anatrim -I../chip/3061m/chipinit/anavrefinit -I../chip/3061m/chipinit/crginit -I../chip/3061m/chipinit/flashinit -I../chip/3061m/chipinit/systickinit -I../chip/3061m/fotp -I../chip/3061m/iomap -I../chip/3061m/ip_crg -I../drivers/acmp/common/inc -I../drivers/acmp/inc -I../drivers/adc/common/inc -I../drivers/adc/inc -I../drivers/apt/common/inc -I../drivers/apt/inc -I../drivers/base/common/inc -I../drivers/base/inc -I../drivers/can/common/inc -I../drivers/can/inc -I../drivers/capm/common/inc -I../drivers/capm/inc -I../drivers/cfd/common/inc -I../drivers/cfd/inc -I../drivers/cmm/common/inc -I../drivers/cmm/inc -I../drivers/crc/common/inc -I../drivers/crc/inc -I../drivers/crg/common/inc -I../drivers/crg/inc -I../drivers/dac/common/inc -I../drivers/dac/inc -I../drivers/debug/inc -I../drivers/debug/log/inc -I../drivers/dma/common/inc -I../drivers/dma/inc -I../drivers/flash/common/inc -I../drivers/flash/inc -I../drivers/gpio/common/inc -I../drivers/gpio/inc -I../drivers/gpt/common/inc -I../drivers/gpt/inc -I../drivers/i2c/common/inc -I../drivers/i2c/inc -I../drivers/iocmg/common -I../drivers/iocmg/inc -I../drivers/iwdg/common/inc -I../drivers/iwdg/inc -I../drivers/pga/common/inc -I../drivers/pga/inc -I../drivers/pmc/common/inc -I../drivers/pmc/inc -I../drivers/qdm/common/inc -I../drivers/qdm/inc -I../drivers/spi/common/inc -I../drivers/spi/inc -I../drivers/timer/common/inc -I../drivers/timer/inc -I../drivers/tsensor/common/inc -I../drivers/tsensor/inc -I../drivers/uart/common/inc -I../drivers/uart/inc -I../drivers/wwdg/common/inc -I../drivers/wwdg/inc -I../middleware/control_library/adc_calibra -I../middleware/control_library/brake -I../middleware/control_library/filter -I../middleware/control_library/foc_loop_ctrl -I../middleware/control_library/math -I../middleware/control_library/modulation -I../middleware/control_library/observer -I../middleware/control_library/pfc -I../middleware/control_library/pid_controller -I../middleware/control_library/power -I../middleware/control_library/protection -I../middleware/control_library/ramp -I../middleware/control_library/utilities -I../middleware/control_library/vf -I../middleware/hisilicon/libboundscheck_v1.1.16/include -I../middleware/hisilicon/libboundscheck_v1.1.16/src -I../middleware/thirdparty/sysroot/include -I../user/generatecode +asmflags = +cflags = -O0 -pipe -Wall -Wextra -Winit-self -Wmissing-include-dirs -Wtrampolines -Werror=undef -Wpointer-arith -Wlogical-op -Wstrict-prototypes -Wmissing-prototypes -Wjump-misses-init -Wformat=2 -Wfloat-equal -Wdate-time -Wswitch-default -Wimplicit-fallthrough=2 -Wno-missing-declarations -std=gnu11 -fsigned-char -fno-builtin -ffreestanding -nostdlib -fno-exceptions -fno-unwind-tables -fno-short-enums -fno-common -freg-struct-return -mabi=ilp32f -march=rv32imfc -fno-strict-aliasing -fdata-sections -ffunction-sections -falign-functions=2 -fno-schedule-insns -fno-optimize-strlen -fno-aggressive-loop-optimizations -Wa,-enable-c-lbu-sb -Wa,-enable-c-lhu-sh -msmall-data-limit=0 -fimm-compare -femit-muliadd -fmerge-immshf -femit-uxtb-uxth -femit-lli -fldm-stm-optimize -fno-inline-small-functions -mtune=size -mpush-pop -femit-clz -madjust-regorder -madjust-const-cost -freorder-commu-args -fimm-compare-expand -frmv-str-zero -mfp-const-opt -mswitch-jump-table -frtl-sequence-abstract -frtl-hoist-sink -fsafe-alias-multipointer -finline-optimize-size -fmuliadd-expand -mlli-expand -Wa,-mcjal-expand -foptimize-reg-alloc -fsplit-multi-zero-assignments -floop-optimize-size -mpattern-abstract -foptimize-pro-and-epilogue -fstrict-volatile-bitfields -Wcast-align -fstrong-eval-order -Wunused -Wvla -Wshadow -fvisibility=hidden -fsingle-precision-constant -g +target_output_name = target.elf + +build obj/chip/3061m/startup.o: asm ../chip/3061m/startup.S + source_file_part = startup.S + source_name_part = startup +build obj/chip/3061m/chipinit/chipinit.o: cc ../chip/3061m/chipinit/chipinit.c + source_file_part = chipinit.c + source_name_part = chipinit +build obj/chip/3061m/chipinit/anatrim/anatrim.o: cc ../chip/3061m/chipinit/anatrim/anatrim.c + source_file_part = anatrim.c + source_name_part = anatrim +build obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o: cc ../chip/3061m/chipinit/anavrefinit/anavrefinit.c + source_file_part = anavrefinit.c + source_name_part = anavrefinit +build obj/chip/3061m/chipinit/crginit/crginit.o: cc ../chip/3061m/chipinit/crginit/crginit.c + source_file_part = crginit.c + source_name_part = crginit +build obj/chip/3061m/chipinit/flashinit/flashinit.o: cc ../chip/3061m/chipinit/flashinit/flashinit.c + source_file_part = flashinit.c + source_name_part = flashinit +build obj/chip/3061m/chipinit/systickinit/systickinit.o: cc ../chip/3061m/chipinit/systickinit/systickinit.c + source_file_part = systickinit.c + source_name_part = systickinit +build obj/chip/3061m/fotp/fotp_info_read.o: cc ../chip/3061m/fotp/fotp_info_read.c + source_file_part = fotp_info_read.c + source_name_part = fotp_info_read +build obj/chip/3061m/ip_crg/ip_crg_common.o: cc ../chip/3061m/ip_crg/ip_crg_common.c + source_file_part = ip_crg_common.c + source_name_part = ip_crg_common +build obj/drivers/acmp/src/acmp.o: cc ../drivers/acmp/src/acmp.c + source_file_part = acmp.c + source_name_part = acmp +build obj/drivers/acmp/src/acmp_ex.o: cc ../drivers/acmp/src/acmp_ex.c + source_file_part = acmp_ex.c + source_name_part = acmp_ex +build obj/drivers/adc/src/adc.o: cc ../drivers/adc/src/adc.c + source_file_part = adc.c + source_name_part = adc +build obj/drivers/adc/src/adc_ex.o: cc ../drivers/adc/src/adc_ex.c + source_file_part = adc_ex.c + source_name_part = adc_ex +build obj/drivers/apt/src/apt.o: cc ../drivers/apt/src/apt.c + source_file_part = apt.c + source_name_part = apt +build obj/drivers/base/src/assert.o: cc ../drivers/base/src/assert.c + source_file_part = assert.c + source_name_part = assert +build obj/drivers/base/src/base_math.o: cc ../drivers/base/src/base_math.c + source_file_part = base_math.c + source_name_part = base_math +build obj/drivers/base/src/clock.o: cc ../drivers/base/src/clock.c + source_file_part = clock.c + source_name_part = clock +build obj/drivers/base/src/generalfunc.o: cc ../drivers/base/src/generalfunc.c + source_file_part = generalfunc.c + source_name_part = generalfunc +build obj/drivers/base/src/interrupt.o: cc ../drivers/base/src/interrupt.c + source_file_part = interrupt.c + source_name_part = interrupt +build obj/drivers/base/src/lock.o: cc ../drivers/base/src/lock.c + source_file_part = lock.c + source_name_part = lock +build obj/drivers/base/src/reset.o: cc ../drivers/base/src/reset.c + source_file_part = reset.c + source_name_part = reset +build obj/drivers/can/src/can.o: cc ../drivers/can/src/can.c + source_file_part = can.c + source_name_part = can +build obj/drivers/capm/src/capm.o: cc ../drivers/capm/src/capm.c + source_file_part = capm.c + source_name_part = capm +build obj/drivers/cfd/src/cfd.o: cc ../drivers/cfd/src/cfd.c + source_file_part = cfd.c + source_name_part = cfd +build obj/drivers/cmm/src/cmm.o: cc ../drivers/cmm/src/cmm.c + source_file_part = cmm.c + source_name_part = cmm +build obj/drivers/crc/src/crc.o: cc ../drivers/crc/src/crc.c + source_file_part = crc.c + source_name_part = crc +build obj/drivers/crg/src/crg.o: cc ../drivers/crg/src/crg.c + source_file_part = crg.c + source_name_part = crg +build obj/drivers/dac/src/dac.o: cc ../drivers/dac/src/dac.c + source_file_part = dac.c + source_name_part = dac +build obj/drivers/debug/log/src/app_command.o: cc ../drivers/debug/log/src/app_command.c + source_file_part = app_command.c + source_name_part = app_command +build obj/drivers/debug/log/src/cmd.o: cc ../drivers/debug/log/src/cmd.c + source_file_part = cmd.c + source_name_part = cmd +build obj/drivers/debug/log/src/cmd_common.o: cc ../drivers/debug/log/src/cmd_common.c + source_file_part = cmd_common.c + source_name_part = cmd_common +build obj/drivers/debug/log/src/config.o: cc ../drivers/debug/log/src/config.c + source_file_part = config.c + source_name_part = config +build obj/drivers/debug/log/src/console.o: cc ../drivers/debug/log/src/console.c + source_file_part = console.c + source_name_part = console +build obj/drivers/debug/log/src/dfx_debug.o: cc ../drivers/debug/log/src/dfx_debug.c + source_file_part = dfx_debug.c + source_name_part = dfx_debug +build obj/drivers/debug/log/src/dfx_log.o: cc ../drivers/debug/log/src/dfx_log.c + source_file_part = dfx_log.c + source_name_part = dfx_log +build obj/drivers/debug/log/src/dfx_log_proc.o: cc ../drivers/debug/log/src/dfx_log_proc.c + source_file_part = dfx_log_proc.c + source_name_part = dfx_log_proc +build obj/drivers/debug/log/src/event.o: cc ../drivers/debug/log/src/event.c + source_file_part = event.c + source_name_part = event +build obj/drivers/debug/log/src/ext_command.o: cc ../drivers/debug/log/src/ext_command.c + source_file_part = ext_command.c + source_name_part = ext_command +build obj/drivers/debug/src/debug.o: cc ../drivers/debug/src/debug.c + source_file_part = debug.c + source_name_part = debug +build obj/drivers/dma/src/dma.o: cc ../drivers/dma/src/dma.c + source_file_part = dma.c + source_name_part = dma +build obj/drivers/dma/src/dma_ex.o: cc ../drivers/dma/src/dma_ex.c + source_file_part = dma_ex.c + source_name_part = dma_ex +build obj/drivers/flash/src/flash.o: cc ../drivers/flash/src/flash.c + source_file_part = flash.c + source_name_part = flash +build obj/drivers/gpio/src/gpio.o: cc ../drivers/gpio/src/gpio.c + source_file_part = gpio.c + source_name_part = gpio +build obj/drivers/gpt/src/gpt.o: cc ../drivers/gpt/src/gpt.c + source_file_part = gpt.c + source_name_part = gpt +build obj/drivers/gpt/src/gpt_ex.o: cc ../drivers/gpt/src/gpt_ex.c + source_file_part = gpt_ex.c + source_name_part = gpt_ex +build obj/drivers/i2c/src/i2c.o: cc ../drivers/i2c/src/i2c.c + source_file_part = i2c.c + source_name_part = i2c +build obj/drivers/i2c/src/i2c_ex.o: cc ../drivers/i2c/src/i2c_ex.c + source_file_part = i2c_ex.c + source_name_part = i2c_ex +build obj/drivers/iocmg/src/iocmg.o: cc ../drivers/iocmg/src/iocmg.c + source_file_part = iocmg.c + source_name_part = iocmg +build obj/drivers/iwdg/src/iwdg.o: cc ../drivers/iwdg/src/iwdg.c + source_file_part = iwdg.c + source_name_part = iwdg +build obj/drivers/iwdg/src/iwdg_ex.o: cc ../drivers/iwdg/src/iwdg_ex.c + source_file_part = iwdg_ex.c + source_name_part = iwdg_ex +build obj/drivers/pga/src/pga.o: cc ../drivers/pga/src/pga.c + source_file_part = pga.c + source_name_part = pga +build obj/drivers/pmc/src/pmc.o: cc ../drivers/pmc/src/pmc.c + source_file_part = pmc.c + source_name_part = pmc +build obj/drivers/qdm/src/qdm.o: cc ../drivers/qdm/src/qdm.c + source_file_part = qdm.c + source_name_part = qdm +build obj/drivers/spi/src/spi.o: cc ../drivers/spi/src/spi.c + source_file_part = spi.c + source_name_part = spi +build obj/drivers/spi/src/spi_ex.o: cc ../drivers/spi/src/spi_ex.c + source_file_part = spi_ex.c + source_name_part = spi_ex +build obj/drivers/timer/src/timer.o: cc ../drivers/timer/src/timer.c + source_file_part = timer.c + source_name_part = timer +build obj/drivers/timer/src/timer_ex.o: cc ../drivers/timer/src/timer_ex.c + source_file_part = timer_ex.c + source_name_part = timer_ex +build obj/drivers/tsensor/src/tsensor.o: cc ../drivers/tsensor/src/tsensor.c + source_file_part = tsensor.c + source_name_part = tsensor +build obj/drivers/uart/src/uart.o: cc ../drivers/uart/src/uart.c + source_file_part = uart.c + source_name_part = uart +build obj/drivers/uart/src/uart_ex.o: cc ../drivers/uart/src/uart_ex.c + source_file_part = uart_ex.c + source_name_part = uart_ex +build obj/drivers/wwdg/src/wwdg.o: cc ../drivers/wwdg/src/wwdg.c + source_file_part = wwdg.c + source_name_part = wwdg +build obj/drivers/wwdg/src/wwdg_ex.o: cc ../drivers/wwdg/src/wwdg_ex.c + source_file_part = wwdg_ex.c + source_name_part = wwdg_ex +build obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o: cc ../middleware/control_library/adc_calibra/mcs_adcCalibr.c + source_file_part = mcs_adcCalibr.c + source_name_part = mcs_adcCalibr +build obj/middleware/control_library/brake/mcs_brake.o: cc ../middleware/control_library/brake/mcs_brake.c + source_file_part = mcs_brake.c + source_name_part = mcs_brake +build obj/middleware/control_library/filter/mcs_filter.o: cc ../middleware/control_library/filter/mcs_filter.c + source_file_part = mcs_filter.c + source_name_part = mcs_filter +build obj/middleware/control_library/filter/mcs_lpfRk4.o: cc ../middleware/control_library/filter/mcs_lpfRk4.c + source_file_part = mcs_lpfRk4.c + source_name_part = mcs_lpfRk4 +build obj/middleware/control_library/filter/mcs_pll.o: cc ../middleware/control_library/filter/mcs_pll.c + source_file_part = mcs_pll.c + source_name_part = mcs_pll +build obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o: cc ../middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.c + source_file_part = mcs_curr_ctrl.c + source_name_part = mcs_curr_ctrl +build obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o: cc ../middleware/control_library/foc_loop_ctrl/mcs_curr_ff.c + source_file_part = mcs_curr_ff.c + source_name_part = mcs_curr_ff +build obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o: cc ../middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.c + source_file_part = mcs_fw_ctrl.c + source_name_part = mcs_fw_ctrl +build obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o: cc ../middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.c + source_file_part = mcs_if_ctrl.c + source_name_part = mcs_if_ctrl +build obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o: cc ../middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.c + source_file_part = mcs_pos_ctrl.c + source_name_part = mcs_pos_ctrl +build obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o: cc ../middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.c + source_file_part = mcs_spd_ctrl.c + source_name_part = mcs_spd_ctrl +build obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o: cc ../middleware/control_library/foc_loop_ctrl/mcs_startup.c + source_file_part = mcs_startup.c + source_name_part = mcs_startup +build obj/middleware/control_library/math/mcs_math.o: cc ../middleware/control_library/math/mcs_math.c + source_file_part = mcs_math.c + source_name_part = mcs_math +build obj/middleware/control_library/modulation/mcs_r1_svpwm.o: cc ../middleware/control_library/modulation/mcs_r1_svpwm.c + source_file_part = mcs_r1_svpwm.c + source_name_part = mcs_r1_svpwm +build obj/middleware/control_library/modulation/mcs_svpwm.o: cc ../middleware/control_library/modulation/mcs_svpwm.c + source_file_part = mcs_svpwm.c + source_name_part = mcs_svpwm +build obj/middleware/control_library/observer/mcs_fosmo.o: cc ../middleware/control_library/observer/mcs_fosmo.c + source_file_part = mcs_fosmo.c + source_name_part = mcs_fosmo +build obj/middleware/control_library/pfc/pfc_curr_ctrl.o: cc ../middleware/control_library/pfc/pfc_curr_ctrl.c + source_file_part = pfc_curr_ctrl.c + source_name_part = pfc_curr_ctrl +build obj/middleware/control_library/pfc/pfc_volt_ctrl.o: cc ../middleware/control_library/pfc/pfc_volt_ctrl.c + source_file_part = pfc_volt_ctrl.c + source_name_part = pfc_volt_ctrl +build obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o: cc ../middleware/control_library/pid_controller/mcs_pid_ctrl.c + source_file_part = mcs_pid_ctrl.c + source_name_part = mcs_pid_ctrl +build obj/middleware/control_library/power/mcs_power_mgmt.o: cc ../middleware/control_library/power/mcs_power_mgmt.c + source_file_part = mcs_power_mgmt.c + source_name_part = mcs_power_mgmt +build obj/middleware/control_library/protection/mcs_openphs_det.o: cc ../middleware/control_library/protection/mcs_openphs_det.c + source_file_part = mcs_openphs_det.c + source_name_part = mcs_openphs_det +build obj/middleware/control_library/protection/mcs_stall_det.o: cc ../middleware/control_library/protection/mcs_stall_det.c + source_file_part = mcs_stall_det.c + source_name_part = mcs_stall_det +build obj/middleware/control_library/protection/mcs_unbalance_det.o: cc ../middleware/control_library/protection/mcs_unbalance_det.c + source_file_part = mcs_unbalance_det.c + source_name_part = mcs_unbalance_det +build obj/middleware/control_library/ramp/mcs_ramp_mgmt.o: cc ../middleware/control_library/ramp/mcs_ramp_mgmt.c + source_file_part = mcs_ramp_mgmt.c + source_name_part = mcs_ramp_mgmt +build obj/middleware/control_library/utilities/mcs_mtr_param.o: cc ../middleware/control_library/utilities/mcs_mtr_param.c + source_file_part = mcs_mtr_param.c + source_name_part = mcs_mtr_param +build obj/middleware/control_library/vf/mcs_vf_ctrl.o: cc ../middleware/control_library/vf/mcs_vf_ctrl.c + source_file_part = mcs_vf_ctrl.c + source_name_part = mcs_vf_ctrl +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.c + source_file_part = fscanf_s.c + source_name_part = fscanf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.c + source_file_part = fwscanf_s.c + source_name_part = fwscanf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.c + source_file_part = gets_s.c + source_name_part = gets_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.c + source_file_part = memcpy_s.c + source_name_part = memcpy_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.c + source_file_part = memmove_s.c + source_name_part = memmove_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.c + source_file_part = memset_s.c + source_name_part = memset_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.c + source_file_part = scanf_s.c + source_name_part = scanf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.c + source_file_part = securecutil.c + source_name_part = securecutil +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.c + source_file_part = secureinput_a.c + source_name_part = secureinput_a +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.c + source_file_part = secureinput_w.c + source_name_part = secureinput_w +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.c + source_file_part = secureprintoutput_a.c + source_name_part = secureprintoutput_a +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.c + source_file_part = secureprintoutput_w.c + source_name_part = secureprintoutput_w +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.c + source_file_part = snprintf_s.c + source_name_part = snprintf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.c + source_file_part = sprintf_s.c + source_name_part = sprintf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.c + source_file_part = sscanf_s.c + source_name_part = sscanf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.c + source_file_part = strcat_s.c + source_name_part = strcat_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.c + source_file_part = strcpy_s.c + source_name_part = strcpy_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.c + source_file_part = strncat_s.c + source_name_part = strncat_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.c + source_file_part = strncpy_s.c + source_name_part = strncpy_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.c + source_file_part = strtok_s.c + source_name_part = strtok_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.c + source_file_part = swprintf_s.c + source_name_part = swprintf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.c + source_file_part = swscanf_s.c + source_name_part = swscanf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.c + source_file_part = vfscanf_s.c + source_name_part = vfscanf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.c + source_file_part = vfwscanf_s.c + source_name_part = vfwscanf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.c + source_file_part = vscanf_s.c + source_name_part = vscanf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.c + source_file_part = vsnprintf_s.c + source_name_part = vsnprintf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.c + source_file_part = vsprintf_s.c + source_name_part = vsprintf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.c + source_file_part = vsscanf_s.c + source_name_part = vsscanf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.c + source_file_part = vswprintf_s.c + source_name_part = vswprintf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.c + source_file_part = vswscanf_s.c + source_name_part = vswscanf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.c + source_file_part = vwscanf_s.c + source_name_part = vwscanf_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.c + source_file_part = wcscat_s.c + source_name_part = wcscat_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.c + source_file_part = wcscpy_s.c + source_name_part = wcscpy_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.c + source_file_part = wcsncat_s.c + source_name_part = wcsncat_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.c + source_file_part = wcsncpy_s.c + source_name_part = wcsncpy_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.c + source_file_part = wcstok_s.c + source_name_part = wcstok_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.c + source_file_part = wmemcpy_s.c + source_name_part = wmemcpy_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.c + source_file_part = wmemmove_s.c + source_name_part = wmemmove_s +build obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o: cc ../middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.c + source_file_part = wscanf_s.c + source_name_part = wscanf_s +build obj/user/main.o: cc ../user/main.c + source_file_part = main.c + source_name_part = main +build obj/user/generatecode/system_init.o: cc ../user/generatecode/system_init.c + source_file_part = system_init.c + source_name_part = system_init +build obj/user/generatecode/tim_adc.o: cc ../user/generatecode/tim_adc.c + source_file_part = tim_adc.c + source_name_part = tim_adc + +build ./bin/target.elf: link obj/chip/3061m/startup.o obj/chip/3061m/chipinit/chipinit.o obj/chip/3061m/chipinit/anatrim/anatrim.o obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o obj/chip/3061m/chipinit/crginit/crginit.o obj/chip/3061m/chipinit/flashinit/flashinit.o obj/chip/3061m/chipinit/systickinit/systickinit.o obj/chip/3061m/fotp/fotp_info_read.o obj/chip/3061m/ip_crg/ip_crg_common.o obj/drivers/acmp/src/acmp.o obj/drivers/acmp/src/acmp_ex.o obj/drivers/adc/src/adc.o obj/drivers/adc/src/adc_ex.o obj/drivers/apt/src/apt.o obj/drivers/base/src/assert.o obj/drivers/base/src/base_math.o obj/drivers/base/src/clock.o obj/drivers/base/src/generalfunc.o obj/drivers/base/src/interrupt.o obj/drivers/base/src/lock.o obj/drivers/base/src/reset.o obj/drivers/can/src/can.o obj/drivers/capm/src/capm.o obj/drivers/cfd/src/cfd.o obj/drivers/cmm/src/cmm.o obj/drivers/crc/src/crc.o obj/drivers/crg/src/crg.o obj/drivers/dac/src/dac.o obj/drivers/debug/log/src/app_command.o obj/drivers/debug/log/src/cmd.o obj/drivers/debug/log/src/cmd_common.o obj/drivers/debug/log/src/config.o obj/drivers/debug/log/src/console.o obj/drivers/debug/log/src/dfx_debug.o obj/drivers/debug/log/src/dfx_log.o obj/drivers/debug/log/src/dfx_log_proc.o obj/drivers/debug/log/src/event.o obj/drivers/debug/log/src/ext_command.o obj/drivers/debug/src/debug.o obj/drivers/dma/src/dma.o obj/drivers/dma/src/dma_ex.o obj/drivers/flash/src/flash.o obj/drivers/gpio/src/gpio.o obj/drivers/gpt/src/gpt.o obj/drivers/gpt/src/gpt_ex.o obj/drivers/i2c/src/i2c.o obj/drivers/i2c/src/i2c_ex.o obj/drivers/iocmg/src/iocmg.o obj/drivers/iwdg/src/iwdg.o obj/drivers/iwdg/src/iwdg_ex.o obj/drivers/pga/src/pga.o obj/drivers/pmc/src/pmc.o obj/drivers/qdm/src/qdm.o obj/drivers/spi/src/spi.o obj/drivers/spi/src/spi_ex.o obj/drivers/timer/src/timer.o obj/drivers/timer/src/timer_ex.o obj/drivers/tsensor/src/tsensor.o obj/drivers/uart/src/uart.o obj/drivers/uart/src/uart_ex.o obj/drivers/wwdg/src/wwdg.o obj/drivers/wwdg/src/wwdg_ex.o obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o obj/middleware/control_library/brake/mcs_brake.o obj/middleware/control_library/filter/mcs_filter.o obj/middleware/control_library/filter/mcs_lpfRk4.o obj/middleware/control_library/filter/mcs_pll.o obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o obj/middleware/control_library/math/mcs_math.o obj/middleware/control_library/modulation/mcs_r1_svpwm.o obj/middleware/control_library/modulation/mcs_svpwm.o obj/middleware/control_library/observer/mcs_fosmo.o obj/middleware/control_library/pfc/pfc_curr_ctrl.o obj/middleware/control_library/pfc/pfc_volt_ctrl.o obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o obj/middleware/control_library/power/mcs_power_mgmt.o obj/middleware/control_library/protection/mcs_openphs_det.o obj/middleware/control_library/protection/mcs_stall_det.o obj/middleware/control_library/protection/mcs_unbalance_det.o obj/middleware/control_library/ramp/mcs_ramp_mgmt.o obj/middleware/control_library/utilities/mcs_mtr_param.o obj/middleware/control_library/vf/mcs_vf_ctrl.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o obj/user/main.o obj/user/generatecode/system_init.o obj/user/generatecode/tim_adc.o + ldflags = -Wl,-Map,bin/target.map -Wl,--enjal16 -Wl,--gc-section -Wl,--cjal-relax -Wl,--dslf -Wl,--jal-transfer -nostdlib -static -lgcc -lc -Wl,-Bsymbolic -rdynamic -Wl,--no-undefined -T..\chip\3061m\flash.lds -Wl,--whole-archive -L..\middleware\thirdparty\sysroot\lib -lmcs_smo_4th -lnostask -Wl,--no-whole-archive + libs = + frameworks = + swiftmodules = + output_extension = + output_dir = . diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/chipinit/anatrim/anatrim.o b/vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/chipinit/anatrim/anatrim.o new file mode 100644 index 0000000000000000000000000000000000000000..dbc0dd63a7a681d9c43ce09ae4cb4424444c0d07 GIT binary patch literal 73424 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 Ytk5f*ubkbE_KmYQayNwwZCS|w0=2j^tpET3 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o b/vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o new file mode 100644 index 0000000000000000000000000000000000000000..fbcba0da9f9a5c9f0ecfc1f373e271d39316d733 GIT binary patch literal 6760 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 Cp$aVk literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/chipinit/chipinit.o b/vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/chipinit/chipinit.o new file mode 100644 index 0000000000000000000000000000000000000000..2bc0c841a1f7f0b88458f424e2e99b54aa473157 GIT binary patch literal 58336 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/chipinit/flashinit/flashinit.o b/vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/chipinit/flashinit/flashinit.o new file mode 100644 index 0000000000000000000000000000000000000000..f9b026dc4c7bed5902c8246740a82f04fd4002c3 GIT binary patch literal 20932 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/chipinit/systickinit/systickinit.o b/vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/chipinit/systickinit/systickinit.o new file mode 100644 index 0000000000000000000000000000000000000000..e05a58b4a6f04e1f43d4442fcfec5c841d1db481 GIT binary patch literal 6040 zcma)ATZ|i589rlsbE!95=R%UwsC72!CWVY+d$UQJc9ZNSm!+GwY?9JTz>Mv&Jffv^;=76%;{LS|KXYz7+{1E)rEy1yrJyc&Wr2AXVZbKz#xp%J-d%J?mDY zzch2c|8oBSKmVMY{rIWn)0SlkLzZ|?3^^g**(yX9%0tp%zt|~uh`G&^Z-@;)S$}lf zo)^}OBWQOmJoD}jvFmk9R2S#0C$7(JUiZf2uf&EUV@J0=i=OXZ7vklojz9V8$w{gI z4npLl$D9l{F7e1KlUq+oHaF%4iO5*%$mMdGW=a(*s%)&81v4OA5BEulu-EX7a*z{IKW?6c;VY_yC zPO{sfhQp*M&di0oG3Fa6&s<~{8sAR`IVJxLJ#0|;0pf9m zA0#d){1EXrk^c`(@rcaBbeze^s%0!C%gHiltPCw=nXLotXvlhQ6QQ+xC=k|W>$Zul z`Rv5a6Bl=EwhBAob+5?hk3)p-p&|U|wp#i8vHYER3$tWwlgLhxS=yScoD!riqc zjvodfiq7d=T1k*YSP3=_HQr zdtEP?EwWeA58T<qI&QP? zyS5j^CP`EaAK;qHNWQD1I_-Ak#<92R+I|@JSW+4}CZ^ZzqSz>5gtE3=d_cR~M~Y1p zw$*i`HbQi}aR*;tY5P}_x{X)I2=FNY{bm<&yT(7AVa#6OdjS%Xb7U|G)3f1U1B_fb z7nnu2Z#z+&^-QHT_|C1UyUMZI*W4&%$HYga9__n9!%cmADer_H<`3$88HTabf&uH! zu_azF#B$^8Yw7%km6J2Jr7JLuJTTz5#e5Gj`CD<%SJg^9nUd|G&h4P<1__6dE;mY` zJP#c8qR_^Sv)!KOhwVP=r6D*}5Z3=N_Vc}SDKUZ6`xavlg@=U2* zDHp5d>LI&)*sdJCUF|jMsC*xk71kH5O&P&!Lz?C%3iD4}^Wz)D1HYb!zL-`5L%;YX z>*)+FR$iNzHggpyA}?;N3Tq$WnB2Xpy-KZH?Uie-YOh*r5MA>caRe~plPnI50p-NM z-XAak$TiJ^SErs4X5~%JaJ0{f8;2}V4i}0veNaz(c@dLlNUJ<3`rd#i~ zYfil$xvORHbLUT2?oe%2^VQ10E^>ml8&j_O@#xi7rnBy=nrYP>Qq7EN4y)#fYL2Q# z$E+APjLBT8y49X4+EqpSs%U2w?X9BSRoU-c z$Xo9RPNcJQ%Qc)$H5^e(z0;8^KR17RZ8^;XtFvWVLAjS&yA?wlOMiTRS!<7ye~fsq z!u&mB=^t?HW=$#ieqwG0pu>193P1~ZtlK3NE5x5r*dhL;!ad>x3V)B-R`|7){GY@n zCC^&G+-N{I5|%!Rcd^GmN z#(pPlbgW&p(K!&C8~_J?xMf&6F3%^^SIz<5H>8|O5ckzd`NLn~DJ_4T@;ohsAfD1T zPXbTU8HjjF+k6FhQXjy?Q`+Vmz?R-VzDpZ@5g?w@@)s%RWCRgUX`3GaPu@zY5X4j3 zhH9&b7f9AeUle40^ie45qvf2MGxF~UA&3ucWKZ?qlT{=Vf>Xib2LZ86d-Q=wyid!Q zfoJp~Pkd-AUZhfdwToYEXp=~_9fK103Vy2dSCA;x<5-j^D4De_7kVjjeP^wFa0^ws z;T{23sr^!<)sEU5*T_CZ#2wRkL6V}x-z2!suj$u{oGz^7ow9^qo{?AYCvL1p`;p!^ z!wS=WaHl&o(kr9+-P$gz`B6LiAaM)g)ck*T2VgTAcX;lZ|7(O;9I?9}d=ZZ!lOLB7 z*VIX^=-jC09H-(K9_l#NKaa=c3Mf|bJf9L6_%P&Yf7jvf+fdRUPhsQF2R3~G#Wp1L zHi0Iiad+Y%xBwaBa%r2m&j6b~fMOg4=NdC)bi7}s{rT`$ zhK&AL599A8VABUs?1jIV2{akqi{R7#o`b(%LPmdF(#GGb!0f|Vq~F2ct^5$0sN?es z-5R^UWAbqA8!~opLO^V2C-w%`#Sr6?-oTU2?-KT|uS3TCxQ&_o-T_8RJv5Sh_^TQQ yt%=3f%rUB8fL#wxxVv5`E`J(TY%C>9N} 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/startup.o b/vendor/others/demo/5-tim_adc/demo/out/obj/chip/3061m/startup.o new file mode 100644 index 0000000000000000000000000000000000000000..1a1c213ba4aeba1107b6f4106c4a0ff50d7b4ce7 GIT binary patch literal 24292 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 U2HV5={9b~u$JcNMU4q_!07vOOF#rGn literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/acmp/src/acmp.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/acmp/src/acmp.o new file mode 100644 index 0000000000000000000000000000000000000000..d7f46474beb4d280aadfe35a2c6be90b66c2d59f GIT binary patch literal 40904 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/acmp/src/acmp_ex.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/acmp/src/acmp_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..97e92785156e96a6a84cd1d30186aed2ad3f6ae6 GIT binary patch literal 14448 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
$jpHD`J_ZqLe= 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 Bb=d#_ literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/event.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/event.o new file mode 100644 index 0000000000000000000000000000000000000000..434ee452311a20899e537332e5984e21d4accab7 GIT binary patch literal 10092 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 X+XEFnf32_$+MRX2Qv5FTk_Z16z_^#& literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/src/debug.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/src/debug.o new file mode 100644 index 0000000000000000000000000000000000000000..812f3166024fa6c7b333f1484b84a34b01b41492 GIT binary patch literal 65420 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/dma/src/dma.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/dma/src/dma.o new file mode 100644 index 0000000000000000000000000000000000000000..cad865f81af4d3bf98ec13e5dfec61d76a177dcf GIT binary patch literal 95084 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 WzU@4ujos{t)rvpvqAxD4_x}Lidu>wy literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/dma/src/dma_ex.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/dma/src/dma_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..60fb89e495dd330bed000b02af4b79cc9fe02846 GIT binary patch literal 25088 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 E51HsX_W%F@ literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/gpt/src/gpt.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/gpt/src/gpt.o new file mode 100644 index 0000000000000000000000000000000000000000..2edddf2a9e3bc72e736dc5e46800bedfb85c32d4 GIT binary patch literal 60644 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

  • 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/i2c/src/i2c_ex.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/i2c/src/i2c_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..2945ebe133db213d8823db6becc1b092850001b8 GIT binary patch literal 58688 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/iocmg/src/iocmg.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/iocmg/src/iocmg.o new file mode 100644 index 0000000000000000000000000000000000000000..ac43d7a371083b5f0369ff8c0a3f4c32066db3b8 GIT binary patch literal 56484 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 z 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 Kv6zJVkp3^1I?Rm# literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/iwdg/src/iwdg.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/iwdg/src/iwdg.o new file mode 100644 index 0000000000000000000000000000000000000000..0ec1d0dc5fee567b99e2f3ff5b4fbe247f54929e GIT binary patch literal 38952 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/iwdg/src/iwdg_ex.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/iwdg/src/iwdg_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..58a764f33072b8ce0c0b1cfcd23397d35afa84e8 GIT binary patch literal 24292 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/pga/src/pga.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/pga/src/pga.o new file mode 100644 index 0000000000000000000000000000000000000000..0348e3ed31653203917a1b4b4a41b6e33db81ed0 GIT binary patch literal 17668 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/qdm/src/qdm.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/qdm/src/qdm.o new file mode 100644 index 0000000000000000000000000000000000000000..6ac0eb04f5c80eaeed005a856576dba5b66bd3c4 GIT binary patch literal 84848 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

    ~Np>D^B|kB>tUK-caH% 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/spi/src/spi.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/spi/src/spi.o new file mode 100644 index 0000000000000000000000000000000000000000..4ee7256a12150e2ab6d49a741f8c1511590b4936 GIT binary patch literal 142416 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�QLZZz?tH9P_i$7`|^uXK4h zUMxQ>D23UsFU)p*VYcyO9^>S<`-{negc4CT)$w<#<8Qj0{OuH2VY&5>xtAli{;_4JSv=w}q4o`=WR2`VNPGRVXImGj&F%53{9v+b|Uw!bpl{>p6oEA#TeC*~%H?fk;> z^^V-`*IB;Bk#BSO4u|h`_#ua%boeI@KjZN8f`cRyQ8mqJk7-VOq|3wY!E)Ok%(gw4 zZF?}=_F%T{!ED=u+0Gx#cK%>KH>eczjSfHR@LLXl?r^7IJh45yzBAkN4YR#3WiEE| z+wsqGyWTU~{Ty?flYgzl{+gvs`#tK&pL2MZ!&vCdi_070@N|bycDTXeiygki;maMq zTCnd4{fw%Uoc?%{ib;hG@^F9T{C0oJY}Z?6yMJLG9+bg6#o^-}p5^eV4%_*H?X4B^ zAc;g&73unJ2_CZkc870u*sg!9Z|4iGE*A-#k)uRZ&2`#quG3!W@^E{xd_Z88*{-L|!yWmt4o`P@ zhQsq5UgB`l;jcP;ox@ulzTe?T9k%Vo_1WpjKX7=z!?t}mzikg@JKr)73dS$9T~Fr* zmMIZc73xl-dn-5sruMO~3a35O<>B^Z`Qd>9=3Wkub~xW*+n$_%jw4_0ux&rqKi`pG z?C>=X+xF%BTO7GvZ&`k`Bd6H$tHMv{pHX#+dcef@b3BQF!|^@EiEp|*9AB2(_%hr0 zGTZnv+xRlu_%hr0GTZnvw*<9fUgz*74%_`G>)Y|de21fdufulyu>Nz7{3VBXIQ*`| zA340sVQL$Go#H3-�G#ZTm6X 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/spi/src/spi_ex.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/spi/src/spi_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..17fc235351c5e3fc72d73e2735865a63b12f9f3e GIT binary patch literal 32548 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%0DWld;9BanV_gO(v(IH5}_dpJD&zPTY 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 jAtVkJ;$_n8({LQ=^({r$_CtU}-&Hr^Z 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 C?8fx~ literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/tsensor/src/tsensor.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/tsensor/src/tsensor.o new file mode 100644 index 0000000000000000000000000000000000000000..851d96ab92f3707a464bdaaa38c9c1c4159b6fe6 GIT binary patch literal 97676 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�TPQDM4`kr^)b_mS)LZ(KOn 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%0Dym;BALOIaXLrpkxAP6NJs&XJ`GxspM_+@(n;o|M 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/uart/src/uart_ex.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/uart/src/uart_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..fc62b4f1bf4f716a7b71c404a24215d410839d5c GIT binary patch literal 52904 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

    OH?}m;7|Pn)Ru(s|u4^fF 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

    ~pQU%p0GR!IR$lZWr*&J^ORP2YTg8z+1fe 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 JuL7(0{{TqJj6VPX literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/wwdg/src/wwdg.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/wwdg/src/wwdg.o new file mode 100644 index 0000000000000000000000000000000000000000..1eea00cb203069c1341133a9a1247f7a08d5ec82 GIT binary patch literal 47772 zcmeIbd3;pW{XTwf5;oaFP}v1$$Qe-vk`O|)5JN%;C;|l(YiUEsLW0@Mf~aUgKomD{ zUr?#qO5N&$Yqg?McdJ%y)!Kga?a}(6|r@zln&qP}H(9r>d9ZLOR?z6wEB&sFNA>1s^-EcL~Y%7X#je;s>TWybY&dv4hf z-|yo+>4}|t?(R{%Z&lyj>Vj@9{qF9e)WG#U)Fo7Q*J`DLt#B+ZzhHNd4=&iXsN3Sl zz|)VuZqM-2hiX6H|HE^qt@!Y~m(Cmhi1>Ex?!Wl4Kz&rabb7bS(^mU6rq)&5zjIw{ zDfX7qA75RxzN_+GwfNS|&QYW#om*U<(qhvS>e<(B@umTt>oP4a-&>0#J5^(=Q`ylxA}d? z%37OPx95SgF8FkJf8-25;(?71T|q1Bsi?23wE>S?$G7g^xixFCwvKqJ$vWp_UON1!wb6y zJ(tiQ)7UE2jNcO) zi_h2m?SgK%rga`;t`(Hca%(d&!8n}CRf0~bhyZ3>5DVHeUdpqM}u9Ny)T{moq$M9;g4zs@J zjzzmw+^m3gd!{X`dTW<@XxZn3SfQSmnmv5OT5?yt%ROOj$X001hj^o}zHhy&hugh( zzNWlreOGh-C99X(8P^$RwRS77TDvQa9{;pU^(wDAV^><=@~YE!W!${gtkO#c?Z8;y zwhe2K6s+{j7eu{mt5p|}8m@R+nbxu2S2_aBD$QV5J&2FnPRHNQ&oBa5y*s*p_3C}D z3r~9Xbnp1(mAi&k?(3brKiG!4upa0L#j2%}U9VV_|DaR(E5EXQTz9#WXhza$9IzJ5 zO5*kHucUCr!sj6Ft9!F)FP^>C)73sXZ=WvfN!cft?8URC^ffwPv#%08XdV#DycW=Y ze&%D;7uplYnw`yWQ+y0o#=1S1y}73R6WSH9Yq;^}-NvX#(9yav<(SQ&WA?mV-A~!t zt=#NIgLbPIcK3J=b>n!&tJSP+E^h(l;Z+MqEowwt$u}6jo4pvm&-S6KG9&g9`^(A% z{JKdyi97bYTE8Fk>2fAg*01W@wZ|X7FJHg6?j?f1es}D}^VPNB+>mC@9FMEJct3$W zzot!Hde-gPjJ0E4aV~w<^(VT1<+YJ(+siwOl-l;

    B$o97oxv3=tk=Dplu`zB>vY#)CzwBzMH zGM{vuRt(G2V&2&e^Hy24yg!)IVcz`>^Oohj0iDd_??$i<{e9lpoVQ0Zmv>rz6x-MS zw;l4|nYS;SZ<)s_DE^VA*gk%i*KyvBY+pL&P0x>F-k;KOd5iTnY|eT4?_!~2`9s6J zrhKy??&o`=eNxQhZ$EUryzk_^FC)Cru?%#V4`bSwLEGwe9RIU@ z9?aisVD+LKn%&l%;iZ^&Vna9WGv>{6SFArPyOTF8{-w{wzb?zJ-{mv@!C@8$Ax zdo3>SEe-SjnKvrGb%QbO+s^6t8@ki?%GX~yTrUOQ-|%^-<$LFNF3;yZBR`7I`%J^U z!}o4#>RNoUvMc8Cw;eiOj-z^3nwI2!9rMoYFz=;?dE@uZ$4z;8i=~+N>xOwdv(w=$;aee-t+RKxc<84yu3~Et>3=9n0G22A4e3Im(vbcYg5;$dHc)u!t~4h sJ=QfjUoQCcHk#Pf>v#FMi5IxM6!Ulut+*|7)_{BiY&Ex~Sc>ld0fDJ2B>(^b literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o new file mode 100644 index 0000000000000000000000000000000000000000..50f588329b3f139497ee51350421ae907be9b35a GIT binary patch literal 6576 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o new file mode 100644 index 0000000000000000000000000000000000000000..2d4bc77caa84a5c05d092dfd315993aa1a70e930 GIT binary patch literal 9544 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 l7yS+3;%iT|HUPzyEkgWhe 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 NP9gr81$2sh{|%aMf8YQB literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o new file mode 100644 index 0000000000000000000000000000000000000000..c5a799e52faed6c8fc802f5ebaecf6b5e064003d GIT binary patch literal 12396 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 U=*MG@thB0r+{F0}>=z&Y4|ormj{pDw literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o new file mode 100644 index 0000000000000000000000000000000000000000..5d4202d83bca27cc5b857b3c8fce0af56cc5205a GIT binary patch literal 11112 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o new file mode 100644 index 0000000000000000000000000000000000000000..77292039de51d27aea52f04a20891fd414be5746 GIT binary patch literal 5432 zcmb_fYit}>6~5zHCrkm>@gm@$=-?@+7i9tLh z&T3}9@7#0Gx%b?A&&*z$UtG{MjVaOCJFLqXyS|Yz9gTar!7jFyZDF6fu;%C6-(n-9 z=8gNKdv4z!-F^4|vv)`CRql=MDQKhSW7?~03q9Z1Iy&~JhcE8D^6)#K)yL-^ytw1a z1AWKc2cL(h-(6;Gbo>Td?>;>8nOmo~KWkYpTs9E6z~dD75C%A2b?YJCQ<}tGFRUd} zDD=8P%JjZoV*J)~RQnk4nyzAAtAVWL?sbhf=zW~^k&%AnbGWZ7%;UcPdEA8dC}{

    !^in*N-!L^qbnz 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 IsDa);0q*8-!vFvP literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o new file mode 100644 index 0000000000000000000000000000000000000000..011ba40f23e961e628f1031d0c6f5f6c17b42791 GIT binary patch literal 6576 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 b>y#I<-<^w%KpI2FkkmU2LqF?`>gxR)#peY0 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o new file mode 100644 index 0000000000000000000000000000000000000000..efc6d9813831e270531546dc2f878879de3da020 GIT binary patch literal 6656 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 V=UAFjNFTC#d*Rq?sS@f`?;klD+_V4y literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o new file mode 100644 index 0000000000000000000000000000000000000000..80b48bce7cfceb8317018e8193b8369e9a41e510 GIT binary patch literal 8856 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o new file mode 100644 index 0000000000000000000000000000000000000000..915d274d7d354390939eac9e0df407d7bdd17b5d GIT binary patch literal 6272 zcmb_gTZ|k>6|J6`U2nYht{=gVB%q1c9@|NJJTrdA$=d7n?j}YiF*py9R*ZUjdS*KA z$E3SwZLcEY!~_KhQj8E$1VIEWgd!o4h!2o>1j!^wK|w$iLm z+5>_haaUb+&b_y8Ro!}Y&ptYTa=|bRk%}SyDh5o5KVC0H9>#srVVBq}Hi`2OkG{F> z4Y6gaeEI6sZ9lj=b<35jQ@h@{dU5C6%CoOs+<9f?F_fQO`TVOa?cc7-N!_odPFn0& zRtf5+F02wO4}SQ&7fXeed}(gw;*QU*+mitpC<;Qg`Hu zmriZFZ{B+R!VV0$AjembLti8DP?00gRVyg-g;gYl!iXCrB0n}lCX3urp+tqld9|JnLqLr%GHH=lw+Smp|nS-Rd9wdUyyy|*Xdwm(1~#t#_ofx zv>0E%3Dc01Fm@B>E-h-d11`BspVVxdwB4uK1JZVCEu$E>GGOkKhf#5~s|%r2uQzr~ zY#h%|+&FRn=Jm$9&G6YI@)L*0?-)O^5hL6##>bDqj^t>FL5^sb5xR_Sg#Vpek&;RH z(sQgNXt-`)KhV*wbXZLXTE@%9(XFbJom)?ATyJa`o!Ro$*{ud_YexF5a$AI0I|xE5 zZsIIBa=pG1{)ggQ$VgsnLTMQPm{^NaZf){%d5`Zlo1Sylikv+iH+DVO4ud_O+h~Nn zpc&g8$39bEs+RG0U{4&`qIr0+W5IC|-d!s?Q;d^d(+wAsF!bWZvu@A~&&G?kU60(@ zUfNr$`@Pt!x4Lzh7UT1A6o$!SFOC-7!1j7gXR+ZX@&7%l5KD14!cK10IRSA;(VQ#i}{y_~GJyGjaX8)wCCzq+u@+vAgWl6H%`> zdajqaL4C=pdu|K^CK-tTeU0~Ale?x9Cm*xUiTa6q>kB7N&Wm0UyY0Yf7VVA|p_6D1 z9zv44?zz8syjm?DEblE>il%Qh+-cYA?ya>*BD*skVN1Av%LWfZGxo78X46V6({p_{ znJ%(b(hHnv&I-8Oi#ujF?6Q6HpH?96UDEiho7f%m zp`PD06RY7drsuh)bFOOzO^~jYBu*5VRs%D!Y_w??&3iEnWN*41^e`KSj_HMAmno%_mG!w59DW14fSA3mk>tGp(r2d}fB# zU*}fjFL7?>vJ-`Dn0Uz4!#yXkoy^)xeJ8}}F_GspaEz@M9GG{`EpfXc&L?+YOOJ1m zIk{t7Is=2A`wm=N?Dr6xzZG{qm94~;LozMoxgGdUkZ=mwbRz{Saz9Wv3Qg=d)9Jci z*zPf3dV?&59##iSi(9qjI$o2(V8i8NI!l&k%5+U*6woi>8gJmnPtH$w@D`A(&fSIP z-N>;xQ$ta{1-i*W`u#aLn*Yxn9}+u3f+N_$44jHlH_uXY;|e z$>wVtcy@jz@a+5tYXt+we;DO22&GJlS=67>Oo&PGQQ*OtCNq80X`6s@F62r@)`5Ny?=73hEa#_OF2-Q%01N;@c=+&hQt2f0Xfm z5&U$<{zKsRGxnc>znbB%fIpw%uYY#ytj;+!VePb zfi{WNKR?77;{D2pcZb1bKpw$k9F$OenOMJ6o+G|p>3J>N>w4g{ zFXFT>dZs=FVm+QI#?&uq6L{NddSX3+OIm-3di}Z~E@_`x>bb}e;*$0`Nxgm@5tp>j zY3lWbPh8SIpQe6N#UU#ix1&ZIlu!1A>P5C=ah1M-p4OU)Jdf3PKpxeTq4T+ zMJCFPI2Pr|@vJhn<-u*NwSzkdEi(7-HD*iQwb$tWjfyvL8U&7C|*ar?_?Ayd{VcWp%Y{V@t%T_@p$c|@%VkjHXJ)8fnjt+ zVV1Ph@DR`7q5KMW&)ujwK3-e2aUbv- z5__+UO3GV^S4#H%z NyB-7k4S|-_@1N5)+ob>i literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o new file mode 100644 index 0000000000000000000000000000000000000000..fde388b5547074d056398b5800335e87f77dfd46 GIT binary patch literal 6784 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o new file mode 100644 index 0000000000000000000000000000000000000000..c60ddfdedba33b284fc5148adaea1957b34d2848 GIT binary patch literal 6368 zcmb_gTZ|k>6|J6`wbx$n`jwXxgU4Qb?S$>wneqA&$7`?G-i;khV(dJKv|-ZI(=*d{ zPxquB>xY7HZ~}ZpLIxCq1Sk@q@DZU9kb?37iWG?;ArU0_K#Gt;K2QWd36T(D?Ql+2 z^-Oz&h>)mJSD$n5ty{NlS65Zf7w1nd7=|IzVu-(sJ`>{j%|hg%oR$W=#I52MarYA| z{ATMFRm2h#SgEKZ!26M-(I+W zW#=2qPyOo3&cgL?zkBVGJuiG?W#L+W;_2lpJKk76^vt*5|1XyXebVx}{ri>T+9R7@ zAU^cW2dC-}ZneI2`I`u>AR{TrAlFDdQ02&Tl``sl0fC@NVaWAkkslr+lU44p@mb&% zeZjm@2U#iI=MAYCZbOnEmZDX(%pZCd_3FYr>ftY=QqseeDmY81B3QkTRxhH;7i6FL zb=vtbWMX7<;ovTeLXM#@!*De|L~&u%PC`*QTml|eHnTfuGTLp5!W=tar^H7ozDeO@ zuL9qO2pRe6LV#KZQ&{*7;217pOfs&t7~i>y4%U(ylZ3geCpCK*vfS0<>!hy4M!Bn= zVpG%7@)WvwMXJ{uJH|GST19Ei7hT`>l7_QbcjM^)?p27T^O0@&&018lxqeul7hmi;QK`+`MKMAK#6l7|w(ED3 z7z}2Z12VPwNh6=f3uNRC)*@FhR^<6c;g*x~f~*x*wX~Zwu%$qnTgy>4sbV# z+GaQCvVG%h62)fdw1TkVgnbE~A>?)t#gH|-K;%J}G&=9bcH2Cgbh>72)jj(3JlAwC zbS=LD(zW8)34PP5M{#J`Xwxd14(JC+?MY&OuKEN+a?09C$1N}K1efk zoG6Ab*GEI@oC~(oja>wxc;a)OsNS_GY6oF#I)2j80z2q*0=mQK&~upB9B7<`lrd3p z=t5+9t`(_{WYX|B(~g>nFR_`C!Mx?0sV17KYG;_|jl^?I*N@U5ku5xcOAdST9Nnwc zYK2Y|xl4}e1wof7rID5P>2^9uHc}WOtxX3H(Cj1#v4O-kJ5Ja_7oASj#?x2YYvUqX4m&z9|6fZ(i=qD()KO^hK`&IjG~j6R@h=bGhy|fb2IEL zact%#Ck)sy_K>M3634fl%(IvBcHm~;g}Wt@FY9bZ3la>h1w z2Kqhs4ESs@-vdnkX4LgmwqjR?WLn5`%kMaT%pqjcjT9))JxARzFfrpyr|Wt_D`CF$ z1X&6^JRLk*tTRp5@fvgnUEsG&XUXzRnXVZ`0r?UZwmR0p_~J|(>!N(>oLy+%4Y5!} zn8WI2vao$Kh*~U`teS`Pa8Yr>P^8?np(eNmsv zE|%xn5r!rE>x}~w=_ChPtLYcLmJVCTdB(995Ym}AbgYiBv3tmjxV{KNmzq;SB=7=1 zYs? z?^H{wJfVDqk{8C4#%N9yxrk@V+}P}~r;M-W=GF|0ocH?Nn{%VNBNZ6P{Ye-*0f*!o zTj(53 z#Tnh6F>S~d#A6wMY;6zl{#JnlaOq^ZD7Ig~y^3o$uD!VS;A%Maq*b%(_0U-=gC9Aw zP@UFy>d9%V>_W?LIT7s?=W!%$rHnPJD8`=XVV}CEj`u67{nI^+w2ju?t%Ue!mdc8D zSYiAyu4vB{?XseMRkX8;_EypED%xL__k}rnU6@ZJPw%>qs_vu8KGZl}zZsPK8I|7; zzQC4uf}aj&9zp)M;kx|KC?3RZ z!+m|6wrxPPuBhZ^aZBwvtBkEmzJ{2Apl~)B;}Xhs&)BXo*F0l~!fa+RKos8O#)v!n zG0g3Nuc_RG90TQBwFk@sz?(5|YrJl7dR{rMwaC)Nw^o5Xs<`vdVlR4DJ@GWJU-xJDRvE4jW)1CJl>cj;VZ;P6_(G74;+Q>aO(di;M6~H z>L0LYQy|tcl<9MrS|JVqZ(H5R6I#x(Y}4B&@r1VdH07KuD8v)m<}~Gc(0*=-E zz7(Z;6p2#kcvgwhQt#xfh5hvc4Ki!%4QflRqc_O@gNUnZ>II>Q62Iy2Idnt2W@vR_ zB~P;@e7T2iJ&B!259;G@OexaYJAq9PG|6ecRokUo{Gc6uu<$(1Dfe-9e9Z^@<=&Q- zv|lbIoa?h%@pH_Rr-AusDd)whxqvH;0Z{xH*Yg=c3XedZ^>+~S>t!hEk5eS|cN#ct z11J^{(AxyMq&f#Y#Z+y>z>5UBq`Jq!v;F=J^S2Bc`{fi&`@IO9wgD7#@TXr5(w;5` z&idPoInDV`e|&{gf6oGE{hfxtFJuHMY)4__#!*@%;iAL+s)v zO9TF@DZ!n6vhbeHG4khO_cEODyMTV_k9p^_fxlikj`hn=oj{sG#*nqUfWY4Bwd&jb E8#Z|9JOBUy literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o new file mode 100644 index 0000000000000000000000000000000000000000..e7936595f20c8bf3f72f06dd0ac8b9195e6943fc GIT binary patch literal 9588 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o new file mode 100644 index 0000000000000000000000000000000000000000..bdbf1ca89694f9e15e62989f83c2255dd5240a9a GIT binary patch literal 8476 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 j#eCzq_!)qFJ$n$1@%1jV#4!=urEZ<&L#G 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 V#gMNty5AqJ!}pii3D4N?zXAIifW-g+ literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o new file mode 100644 index 0000000000000000000000000000000000000000..95a844f5f5aa97ff27dcca16563050ec8137e81a GIT binary patch literal 9756 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 z


    BeG4mJ{v3cb^i^7oQ0SfuMUJ1>MXnSCBImoc zVvcGq`NrJM>3-!@=ISMtFKloXd(qY2w4`2Y*JwXS;;U}t1&tIre(c6~;x*+eez6WK z`MolSKWX@0sU5n3?(Y93;qifEME$WJsa|@WqL@w@xUFetD*7{a%wrfvS5R z>+Svqi~dxMcQDxT?ixpA*p7wtB2pf=)ERlz+=&?X_b|w1XirnzJwm(?4Q?#&Dd4!jD*T;*K!3c_nMZ%0N2EV}q>69iEZ7F0QD7e9S9BWL zy@x+D5&0Sw?F~RNjtc)OasnPfzQ)Auj_nlUpIAVL$nL)Z D^+|3f literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o new file mode 100644 index 0000000000000000000000000000000000000000..4d628d43902990b57d4027bd36421614123967cc GIT binary patch literal 11176 zcmcIqZEzLWc|Lou5JCtc32Y&MU?IT@6Wxoh_%N{%V1a~jsG-If+RBly?p;X>_lw=V z;v+Z)1F@5~j%i|p6Q-s!v`N$a=!ZM4J88$6Fl{>VB%Mx@=_H*=n@q=(cG{`q&Lo)_ zrO$KTvv>Diz-edN!|a~tdCq&@^PYFlp54{u*|ELjmSw51Sn6FBF{S>_Rw{|cjoM(X zx=*cCCy(`gTdn9%Uwf~A@b&l34V=HxZ~xbP=IXhD>+=^E5))n7dG>2kCkL+I_(9i? zjru1K{HHqm+O`YBPmE=sJ9F|_^SArH8TWQwd%IVAyR!4#n)5fdUATnN-#(+%7oI=+ z4f>Q(EG7Pb`m@ffg124xvzrPrB9>ZS9PrYR~KrZ;=fbd#%J`-yX+l}Vs$ou zz3(m6(QjXy?_d4;e1G5dd3c^ruDL!R#=P$Na|65PFMoySD?5|upIiQ8b#`};p5e9& zKiV<1Yr!ot(ZB9Gax2+D-y3KDhM9i#2WNM`p?kjiHq|RTsce!+jiRpr@)nPR5hm?j zHxON&{)OkG+1!~>s!3nxCcOmOG;TO0nif(?HZ5>Vfl9P2Ak)2)+pTe6EhMaF>WLQJ zB6!;oC<~h&#JMGplc?LN3fw`s2!~3x4&vN$0jEThIPB1#5>^Y_TY0i3-(zKpb%ks( znKUFWP8gQJY!Vj_8`h%P6MAx1mYot83y6z@Eo^#8pQ$dvp{$4N$9No_#gA@4Ps3!4 zS;J(Eyz#NV-p4C7AG)Cy=Xw*TM3xC7lQ>q^`}j`Hhi<6(SXt+zH}ui2=hDffhQ+$F zG&ifPPMza0Rh_1LM=mHRYniYD($HzGX(Etrjod1_@WoKwO%p zJ5{p%!Nm_P*s}~PVHwEQ9$emyqAuREY9B~~ca7C9zelD2Nsul?qhOQQ&6Dg3n{UJOhJ9q<>UYAdpZ zn*v3zK8^lAPiHV#QZ2{DwXC1DFTq)F&E)Cy`l6f97o6i+&sjg~`fkC^l}qaj?$lJd zTFU#mStoaNaxRm`zs>7?FQ@VkPRwRuI05TQ);rqk2i3e=o(Rh2fdC2sQTW7TgnxxdFTJ!;lz|1_(~nm`9b;Uq@T|5 z(c=e*F+Iz?XA6bkWX18p_zY4D^tDKKT1gArME&_$D%dTo<|OwJRLRH&2)PXVudMHR zv#)1#&t`p2+|JATTX~6Dn;1nosl6<^ov$xrGGZ8a5X0ygo51&KbJr$yvzFQ1PLJip z3>cfe3{ohUW_tCB8$8y~BU$%=JF(v@A8~SlKaol8a*E}NO{u^wPG-?Mj29dL5vSci{0esBou0H%|Hn%uK* zGHl)B?Rxw9nm-9qiqi$@D&u-jE*ZO%=0K?uc8cY#5#<@p7{x9u~D* zoX&xl$|=8y^_0qIgKSDiGSbUlLAB(J`0gnOxKj0JQ>+*vQwB!Hitel zy{UZ&1B-rSrc}jjQqz*e6z2$rz^AHiA#h6|)1HG&!Iz6`q}!YmIj0i12ts(Z#QR!C zH#P9N%~6oK&G)t}vxE%7$aQ z#Uhf86naSOw1cITDpnC<9*LbUI^GP1C>H%$TzzS+o(QH=IL(FvE(KsAU&Oe@&_A7F z&TgsTmJpC$Beh9{J#&RqfS#k*0;4EaQ(13@`HY2CyUx>IagK9KopQV~I|c=0>R8n& z<($~H*ZOSP#ri>>kHXN;PQ!qC=iCCfQpT;s)i-V8i!!HI?6k>1G;+;=*B0x&jKx3g zR|=A?z||q8vdHsHspymfP9dIdq(D5^996t>3M($Sh(%69aga!AHBCT3q6b!ObsA%&+CHXU^1 zE?4$uWD`=mckXcL}kkA&7e)$*M9KM}RZ_Up~#YDaD zSb-QloIw!!JwaImfD82AI$X(27KbZClhebM;mI7)DL3bP0I+E+c(~U}lX~apH3ERV z#3{JEcZFh7-T*=h)}(VvVK0sZczsTr)T){_!OiWo*IypmPTKXGa*W@pF;CKtmqb&9 z_l4B7uWR628u+dT{zwDoT%^>$aV8PzYSVHUbppJ8zReBuy}6zC`twQqk@gPblbK+9 zG(X{YHM9>m@U0DeTLX{gC;lF7Xn(AMKiNBIyQ#=y+dAHQy;2#>C}@bR$O*za%P(R{^zqM`li2F|%liLNYp65q(% zO^e(gtqu8UZOG5f?e+PQ_T|PWzroo)*ubOtOMA2)gpW4ZNBNNUX#MMN{F-$VcRR<6 zN?SwxH@DZvFYQtM!Xux;qx)I-+S-7^qxlMtuD|eT{=%dA3y;==@M!%DpK2KIL<2wF zz@Llp8U#qHXeXndRME;7-pQ&~k_unfv657G#2EW`>-4C8+MYrs){o7E(Ee80(qNB3*9a>3*KPZ2zR z|9RlidTde0!K3-LDCR!$*P_mXN8`7ukAaWkkkYDt9U#7bUILG=pO?W;h%wG>>N7Y; z{@T=Q;PLfwt!7KmpDIn{>TQ{bL=!L;Wjww0^tQ zJ9X{d>L=i{HLY9m0Ulk?ZnY4P@F>P^)eipMSUh)te=ElC0q@a&-J{cP)ervtSo=Eg zQ?cge=*j+A3Q2;>Phe@{x&rM{@I#Ax5|SbjPU~a(=i@^ z_r~Hs4gSN}c;~^R(yBfI9={)60_Pf((ycDn*|(_Q29MuQ*T9#>#`_}pf*60ju79)o z3-Dptz%dxv_}>J#A~1k8)Kc@3984>Z27r}qx4^xh3PHsW{yM}|UX2&WGcP|j@P zX){l>7-r*eh9`C$rpYi(hG{ZPle{xkotex|O?l27tsg!xu6wa&N7fui?7VDg#_?$< zoL`Zqm#Iu2x@K1n%UUYK7zRWJf{LM_+9DOF0;Z?MI*fsR#z*ye%=Fjur;Tx|GeB+z z*U1F{o zPUU1la1R{J3+C@g9gg4?s8VKu+rVATq7!crsD@Av&Is8>Y&M{A;1oA>6z%7T;P>@& zRBY%cRS^6nszGxT@_E!n2Pnj044Z*FN>r8pi*TwexEIx6MKHS!9uvF{Rf-Q26dk`W zcnhjQgSP^QHhg9b24cf_y3C`OIE;bAchLa~ai})~TUDy^jcLsZ=F{Ec0}O@ktP>jI zDGPj3@G4@n!SWhe9}%7NwN49ui1-=7+*_@W3Vw|ES;5>RtuumumH4b+rp7WGEL~gY zME@A^dBK;7F9_!I&SE3V@8PhX*HHZd@e6|gl=$O<-$2#>i3krE{W@*TM)&u`zacjN zMEskA|AY8N!Ar4ES)UZ#L;RB9dx85eMtH#JYiVQrZzeYWcM%)^2Z(=5`aVVcDZyFb z{!d4E!03Fogg#FZ8=o%_zby8bh+h%>JH(d+|1NMp6Ny4RVDvwvjfwNGh>g#;h>g$h z62B^a|AqK7f`16yZytuk14h3=8{y(?nhfhz2~960Pt9QIv78xtGvuP|ofFy>y` zn4GMpjmZ^pm@B+L(1h9Ig|5|~^DES!5}nvKHeAmZ6M%A* zHg`qXHu^E@cZ*JJ8=K?QnJ^S$+t@rq{a(?DZDVte`byD>ZDaFs>i3CGY#WO-Ov+s5Ww)H9+J+s20Xd*86=#I~{dXX+b7 zC$^2v+thi}pb*=}=HIAKicV}Bn|Fb&heV&J%}9i8qcZxfx^Ha4x)w~J0}8=DU5 zJ47e8jSc_5Lf^xp6Whk-F6vKSK46OvF_aW-_C(k=`UdKcicV}Bn{CuTBs#He zY{sbX6`j~NHXow?OQI9o#^y=tkBLrf8=I%7?-QNaHa0ox`$Z?Vjg3qFmqjPGjZK;Q zXBfat`wvH1w~CqyT!ga?ey<-WN~ zbmBFwg1KBmKU;|J6n!hIer}d1!~;fWnl|@SRf>2GUt~}Y;|Tps5D!q5@3elt$QV3e z^kd+gH)&ZBuURMfG^)_g8R8F$ejZi-&Ik_}{nL;(jfzgZk-?%|#S!|sMm&ZS%I9(P zKdGU{14e%X(&mGr6R&whuuA(Ui}(!@b>K-o8zTMlX_~*usq~cZtF-47vT3U6n?9@R zn)p+z`Le3-6a5BTuh;!P5^D;7SusP)rw=~?R673oRM(u9Po+BT77{<8LNA!GO7qt? z{7_ZbZ`#WiVWoeMNaHtE&z-6Uj&D-;KdJbrv2gGmhK1`fUa;hKS%ow0l0t8?V;c*X z7vCFxkzEEhjpLfF0WJJHwiG@NnsDq8st)6s$=l){9MpNV;b7mmzcb*xC&Ci?+YKS^ z?=<{zsnH*E5c+d~ThsLVr&~i2J)9^T#}d{+{~Sly2TZJZ$@G;P|*(@ow`bG>+S8+Boj_ zaD;sT)raBFJn~6vZQlWo`+E=mn0xx;_RTi>`w@<~zZc=}{4MhG@21ZV)GWb$N_`1V z=gjlW?+V|+b0!uVE0!@XOf4a-_w)M0`8jOJP$OM{w#T?ZB@Uq!FtpuY|ri*ST{ d0iY_ZP>SzKVF@9xVchQW8axleMzn?SzX6mq%Sr$M literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o new file mode 100644 index 0000000000000000000000000000000000000000..010edd65897437cc464522c0a2b21e2429aec1bf GIT binary patch literal 5956 zcmb_gX^b346|SD%wbx$TYww0QRuVGy+OrO%$2;RQPS#$p?M*BhViH9n(uhe5ee>mwXFoI@cXa)^+?k02rxB6CFIh$0dcDG(%%AOU|6Nc@Qs3H}5m5JKAUeO1-H z?EwLic&o1ZzE`haRlTZyU9+D)esa+;43UW;{vuYG5ErI|FwwY28tfFC#ihd7wCWez zekL|fSDsy--u|8C>20qqPnUnaeBaFZ<)>aZQGS25C_C=o#N(^WrLR9{&Wy-5=dW*- z?wfgS`KdQ(`S9vP58QLy-0|A-lkol4-GbI@_ddfuS3X0FsV8T|edzn}>Q^2xE60{! zy1!`s{DX(?|MPt7*rY;i*~2`PqG4?0ILb943Z*?vt%CD}YN)mQY4v#&=7@A|Zj_#6>qwog zrZI+6tYu;B|0XLf#+N6tlyNd+KVj)nU$Y(1l^*S_iz5eZm&vyFMQyiZiX3-r0WkZ6c$jcSuonyi|F{qfAYpcfLEz0-ImJ?H(jLB8=mwjPji-ETB(Y$l%G9lK1j;TqI ziYvG$*=Y+v7-)ptP zG-$_8&vou>F4d~|+qa9MY#(g&Y#26RJ+PxY%W;yny|9slp&vI+dqF!q9XA}O8F{g@ zw7cHyr?KDc44P^)Z-LfqB?jh(m+TJZ*<5U#h;W|m&s9DF{e%RP+C0@U2x1C0tG)xl_d*|FH zy0~#79Bg9pUSok>-c<|(J$=YNBitwoLU=yy^y~kNR%!vSf0+Dn|Cbw}DC zSc%>8>C^W;%RMu&gEq*(P7*f?EV~sak?o*Qw`|>nX<*mqx{6v@8_8Oo6Qc^xJ)m+t2*d8P@Ctz87FZ@{Ht*$a*^dIl#!3XMwZmra-14u2;e_$pe7C#PiDh;ujSyFtPw6vK@WD9^d0K@?gzah5yq z{IHucUiyG6g+6u%TZ{DC@m#-6XJ|uOvD_uww`92HFbn9Hkk4C4{mI$69zF+h*Lk|o zeSjo~)-X^nlZ|weXCTmA<7|9QjFlGQpW!9+=YR!IqFx%|Z2lb{ybk1|)2w=!3DZT=^jEHyM z%?SYJQl#MO!<;EiekuxL;%l+K!1)QE9OA?6?NonW1C%KK{)}q>9~j~*>r(dD z54A50@sAGij}7tm5PxWhKQhE0EASiwnCc3dtIWbmsg$44yp>#D;Bt*Q6iri1NKJ9P zi{rUTybryL@xkRx6ytLxcyT>j!HetVy|NgOtHD=fOk4}{!(1^TjsTx5@DsqeLTZ^1 zyhyLexUg3U(0al9^TAv1^#nz&Oyn9_zl2?jH3VVfnP4z zznQlYjEFy?Ebi|+;Eb`73GsITu35yr2`#u3WSQZrrh($e%UW=tNdQ05@KxqF6;` zl@&gKYU5Ug=TTj=P2p3hCXcS*-3p2Z>a1_8fIkI1c}y7*XZAb|#gHx4PxcOmn632^3akb z^%KeuaYfraO}%{4g&?kIn`fx!!GRE0w9VJ3pHzC{inh5x{gl!ZSG3KyslP($i7VQM zaWk$|dfo@rzhTtB2c~&QA?!A@Ni>FfqC7~#<@BV%q^sz509+OBd9a^F~C*Xq<}Mc1i0w$ZTLHdM*8Cs$^6}1 z=mRL;gw1mVS~7n!A7x6^pT)$>1)ka64qb8F132$YV;q-9FdO$QaMlM&^cE7{? Keo3Guv->Aj&dMkN literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o new file mode 100644 index 0000000000000000000000000000000000000000..17240bbc6798f3ed74c2588e0698deedc25443ee GIT binary patch literal 5968 zcmb_gYm8h~9Y1&O>~`t4-98Xnc@5om7LYsL*|u9KY`fjI3pG`$g!stB;m(~qGZ*gM zJKV?awh{#kwW3792O;nQm4ru9AB2c8fFWs6qk)*HAN=44qoRo)5ED%_S^WLZId}H% zU{n(Sn{&?Z|2Y5iKmYT%XZF)akIx&1Au=+=U&RV1#P_!dVM4h_8eAnV78eO))9`EC zeXL*7lf#k^dO}Q&JwDj*6yR#mr$8S>D=5XJxOhGidxec zK`qv@GN!-9Mw9XQW=v(2oH0#Uc*xh>PRI%mb=Jj^1Kn1sYp&AWju1KSNbxc0V3V

    2e&ET6Wfk$*<@@Up56Mjxork?qeK19g{?xY13RLEAS*8A z#2Bz%ObP!(^&F;dijSi)0@?!MbNhcb4KLZF*rX2}3`wEqXyST#RduQ;)pZS=c>Q z@20U|Z}sX>)#8(J6oyGHjiZ_uIDXo6YYi`n|LVpq5-SQtW7rgg!)Afas#@A8%Xi9Q zjWzPapk0y`4jiMlg)uPj}BeeBnx76p49X~44AokjU+bmHbWOdUAZz~lTE86`W}YDQ07})I=@L5gY<C$=a6;@Qy2I=+a+ErpXp%;hF;Pk6L1g=$ z9jk$4(y+C%fm&%Gv6Yj-yd7AXCZ3tn&Tv+nsqb1|5NAOmTUdZoE=TfRJ*wSqM{XQ@ z3$EpdVUH=Lk)4g{b-PG5QWznvEf))DbyI}cL}FWAH)>;uZa3~=^_4bVN*WfbPA0%o z0Q$`?#_eYQ=?ruB0^bV|klZ8vNn|}8{}f>4%DuoSx~XMHZRRrP4Z29cQ^c&kx%v^QAY)Lg-_4 zu(Y@~^#xG^pQpJEr6czmXA5)dMnvJh zSLS{^x4v+w3Jdu$62=7Jki4v>dewS&syA70P4%Yg4$&#ki6el#Lyhqv=u=VrmE2ZaCK#}4v&sgpMngM=gUdsN) z0sY(n|Iq>d69as6fImCHe_?=sILG%PfT^C5eUX`)DTVSY+SihokGQ_X6zlt#z!YOL zzxnZ2=X(=g=R)N3^Iq`z{4kgK`D_QDpKlp_J|8Q-pg{clQGcFL(wJaw+wz@2!I*eI z>Xn$r#D^*F)2L|lF~NG#LrtHG#>67PFLVArm8oPqChkXjKBwne@ExvbOne34OvWM} zzJJfM`*v)Jr-3 zH^9ep{2%(5peX)~I={Yefj>l*q%rXiv>(wN{TFaV=X3npRY!KXuOTqS#sPlQ0KY}> z*93_%Y%UbVc+MYtZyVrqFEBhSE5|2GV#gBNDU{tPdrwI;eZm-kr^?kd@4%%)^JJpXLSKW)w(K+*>IF1J4l$LT}upAo=hexAF(}Qs=2=R+h zwN>3}_tnfJ<@0m2nm?M^YWG#`zq&F%FKC66xwHtpyJHt$1Nrmj+RFhzWt5FqNGK|3 ztdhdlq1kw)!n0_uUoh_S_N1xRS3U-k~se zg25k_p!c8{3=o7LcCM6V~Bg zrzpnt5{lQ+jO$B?ctXp6O`98(%^!*NhlT%RFlLl|nDPS(^L%7JF9gnf5@$YXnc48# zF!Z=>`W&HFh`WHduU)}qEx(&`{fQthYn#)Qb1^~0Wo`30%JnCNxU6lyNV&eGiObsN ztCWu^Kg4Bi^BCov9EiBAZN5%9Hx7untZkm6e6x}hm$l6~%JqYQxU6lyOZlbBp17=S zm^b4xCErTSWP@lr&P@s;p3rh`uW5Dy5%1*hO;RO3*~O13v`M7ePKFY92~S1-I1!ab z9E(ci`gVoV%F1g{OVvHZ^Nk+4yKI%(R`=E_*}oC-Hp{#q7E$3Z0z9Ty^=n0T7gq9# zSHbVT$ZMpD8>>nEZ}lZGLrVKEkv#+53Yx!C+nJglw4)Ca-VEtPi00 zJ(#BnG-bLL_zY9^AObHDXv%ap`24uD*z>%~I4-wgHts3ltPh|#2Y>q5knQXEU&Oq> z9{lkP&>xR?=I=q^yuX*=?|V5x2G8m~vuH_Y;qO8y>5s=h^Y zo5~op9GAovsp!+2usealcx}v~a9rjc;{IL+6tlSVuF0H$&md#S_B`!=hxmR@peeKa E7jaa}+W-In literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o new file mode 100644 index 0000000000000000000000000000000000000000..dce15ff2e35b40bf86289cdcbc48417637c408b6 GIT binary patch literal 5224 zcmb_gON<;x8Lpn0wb$O4H*5SL0mfc?y@}nuGvoCmPS%fgytc)P7$p$`4H|lSx@X$% zSGu}q*H)AmlSClI!2&^~q)(fB&QYs`~4%zialTbE_+cVK7Yw`zsrAjQwUCV`V58g~2@A$#$?WKfmdNz3;PK zv(}sUSMO}Q`|RCa_nP-+4^@m=YrFC7&6U#4owNJ?_TXy=UViY4SIYbE{{4IC{fFy} z&Cb0E>D>n>U-`+Uz0cbAjq4AfsR-W{G3>a&8y=;~W|EXEBYu>z(&z|rqF3pZu>xEW zoHM=v!6vCSHj!m%RB+PA$rm6Qt(?GfOCJv@Jw;LpPZQjV#!6cc;kkt-U#f^9O522| zG140Iq}61+@gbm?y)jR)eDmioO-!b4#*D|vuyk{Eij0kepB3B%OyZUhOdI3@OA=@o;j9yz+e<2&Qj8nUXyRieiFV0LG4{bWV>$}Ul4H%A(3_O)~F*bq5CgFV) zgQGLariOzN%O0UM(Q4FY3ixjx%h>EP+m5GUd^kCQr^rF#Eo&k4JDtE?vr~7W=W{>s zoj6(u{B}FeqYig^u5+c;uUq&#y1-M1bxt&UHVm7vPVDqbm1lX!kDFN>2fVrFN1b?$ zHyx*y`rPRsZnVOj2Q4pYLDl3}c^b!AGv{g3kDMUyxXreo@&CJ5#@4uFM_!9t4xKSO z2(qh*%dH-Tj%S!LARRU~B4SydH_DYQ2uaxx&jJRIn6)lG-CDW0dX74~Y06rycJ2q6 zAGP{+EAV+nia5{M`OiI9JzK9=k6DMUTGb5gw!h>D$>D}aOzQNOQiR11JqLUgn>@ti z%#NMeX5fc@wp68FSsuAd+`r}mCpqt#Nt{ss&gGnEX6kn16w??=uxpSzG0!0L5+LH^ zgjl}jXHL(&oQH{-+3kRQ27zz7>xmt8z$A8-xoKqDZJwpJgFfA=`81}1B`tNM9IG)s z?sp@%V>&$>!+MywT0a;sbzPppmmi@c>D+b4O)?*okbE9dX2{W%i1*?&Gu`orI zrXO)VNkj`9aLuKW0#}V{ce|;}x!-rqAdV9XDH+*%Og{_}Y=kgHSUndTXofka*g;^u z&`rA-A`E#CyDzo*de%1a=xG7A0x;-=7&p}Z$r;w{M}Z$*s zgt=*_U5aO6T7!M|(y&i!Gq1U6OdYcTk$OINBgZZ5y^!}}q_l}RUx6XFJs42jX>FOG z#P~K)_IYZ4!^nw@^;86gBM%H{Z;|gYlHcP=AfuJ}VoIisICrDajWSw7G294&^gM8s zq_K&NGu^}w;%-jyQVG(J1MCjA7L~>G-JnCxpo^of>Gtiw6yaLJEFkZrl(kXyva3ry zR6?=qlwIhaq^<*P9Ld9E<8z4Ocft0b@tc>@_%ia2H|yq8ZWuR@n8=Ej-Eo>7VyO-k z%7Py;lm;9;_P-b0g+d_{^=FMvU@K!@oQ8JB@<<-cDt)d=#R4p}Djp=#-KCf$LZ#+| zY+0q+#m=8Sd!jl|N4it(yJ@|4#H!V6)kdwcXx5IJ_2ZAqf<_gSzPulS%FKAdm?*I- z2@AA5dFiRIZu$Dw7E{eaHZfvVC|yI*?7VL%=KIl19QQac>DfSj11TFX8!G!QKY{ zR)Oz4gTE%e;fR-3j7`Lw+s9|@I$JwUxOLOq{7|@f3sl!Tkszg_}>pZ18vNQ z;mXOZydj&*YzDtJB+-};l`8Bnil>+8t!oADOx9|x%J!|}-ErG_w`I56soSrCKl98= z{jhp3s`rtBU1~>Nmy@0BN1rd%OLvxi8mjA2`PLqfNme-~zZg&1DBW=>d|bZj+HGC& zq+VGj>B>2+)3!9IoR=SYagFu$idlnVa#RL{@L>r>lnuIdgT~PeT=t2mRv4cYkbQ#i z!xEF)pc^`951R2Q0U6Z=Llp}e#`uhsKS8*P2k1PSL7hOfM}|tqFA|<5DPvzjGxiZ; ztczys7mx*n=On&Cn2Icja^6ry={3UY0KY}}F+4y&Ml%iy$bLrnki>Tgn-br}Yt|a# z14{lL*(^x;p9t3^rtCE85>swzKU7n+AHv!XS!x?fc|(o02W8zDB`sqIf%l4EixST% zd7b2{+!3BrHpfU#n+760r)-u;J|X3V=akJElJAgm!gI=o=4s%kA`zv6{G}^@h|P*0 zni3ySN0P#K1iuoA2rud)V)3gXF5t|)2Y2+Cd{HcB(7f{>*u9*2rKdNw(v_K_1k&oaOn^X z;T%+~#SOhmir=H`#LqI|jdtXNh*F!j{y*7K`fVI{6*5hFT-qbbxzkGV2KJrynf9IJ z)W*@yq3JmQvg>H2f^6#kAwN&YBBw7<^->pp<&2AE$GP^5Jo@EViqJSJWx zph)Xl;EUt_5jjZ5k;bJI)Z?xL>pp<23xA^i69dvZ+TxtdV{ubfyWyolLbkwvz`X>-|SEYo#gN^r0{8_yN&r>0H*m(qv`p*1B@vpcnP`>fAr1JMB@_C8=)9b4V#dl nBYiK9ppn0AXtXyvmjT)Lk!<$~DAN9D4n;fa{GK+#Tig8u1UqOB literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/user/generatecode/system_init.o b/vendor/others/demo/5-tim_adc/demo/out/obj/user/generatecode/system_init.o new file mode 100644 index 0000000000000000000000000000000000000000..9ce34f6269fd0926de25bf30d870bec286f349fd GIT binary patch literal 150044 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®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 S+(-Vn0cT}1yXZo@O#DBcTYFvr literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/user/main.o b/vendor/others/demo/5-tim_adc/demo/out/obj/user/main.o new file mode 100644 index 0000000000000000000000000000000000000000..e0ce6d7a5c0a6c53a8c171c92d75c8b432626746 GIT binary patch literal 96848 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 S&4**;k83!kSg@g$P5eJlIqL5K literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/toolchain.ninja b/vendor/others/demo/5-tim_adc/demo/out/toolchain.ninja new file mode 100644 index 000000000..048af6ce1 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/out/toolchain.ninja @@ -0,0 +1,38 @@ +rule copy + command = cp -afd ${in} ${out} + description = COPY ${in} ${out} +rule stamp + command = cmd /c type nul > "${out}" + description = STAMP ${out} +rule cxx + command = riscv32-linux-musl-g++ -MMD -MF ${out}.d ${defines} ${include_dirs} ${cflags} -c ${in} -o ${out} + description = CXX ${out} + depfile = ${out}.d + deps = gcc +rule cc + command = riscv32-linux-musl-gcc -MMD -MF ${out}.d ${defines} ${include_dirs} ${cflags} -c ${in} -o ${out} + description = cross compiler ${out} + depfile = ${out}.d + deps = gcc +rule link + command = riscv32-linux-musl-gcc -Wl,--start-group ${ldflags} -Wl,--whole-archive @${output_dir}/bin/${target_output_name}${output_extension}.rsp -Wl,--no-whole-archive ${libs} -Wl,--end-group -o ${output_dir}/bin/${target_output_name}${output_extension} + description = LINK ${output_dir}/bin/${target_output_name}${output_extension} + rspfile = ${output_dir}/bin/${target_output_name}${output_extension}.rsp + rspfile_content = ${in} +rule solink + command = riscv32-linux-musl-gcc -shared -Wl,--start-group ${ldflags} ${in} ${libs} -Wl,--end-group -o ${output_dir}/${target_output_name}${output_extension} + description = SOLINK ${output_dir}/${target_output_name}${output_extension} + rspfile = ${out}.rsp + rspfile_content = ${in} +rule alink + command = riscv32-linux-musl-ar cr ${out} @"${out}.rsp" + description = AR ${out} + rspfile = ${out}.rsp + rspfile_content = ${in} +rule asm + command = riscv32-linux-musl-gcc -MMD -MF ${out}.d ${defines} ${include_dirs} ${cflags} ${asmflags} -c ${in} -o ${out} + description = cross compiler ${out} + depfile = ${out}.d + deps = gcc + +subninja obj/build/target.elf.ninja diff --git a/vendor/others/demo/5-tim_adc/demo/user/generatecode/feature.h b/vendor/others/demo/5-tim_adc/demo/user/generatecode/feature.h new file mode 100644 index 000000000..1e8331dc3 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/user/generatecode/feature.h @@ -0,0 +1,119 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file feature.h + * @author MCU Driver Team + * @brief This file contains macro configurations related to the project. This file is generated by the IDE tool. + */ + +#ifndef McuMagicTag_FEATURE_H +#define McuMagicTag_FEATURE_H + +/* Macro definitions --------------------------------------------------------- */ +#define CHIP_3061MNPICA MACRO_ENABLE + +#define MACRO_ENABLE 1 +#define MACRO_DISABLE 0 + +/* Macro switch */ +#define BASE_DEFINE_USE_ASSERT MACRO_ENABLE +#ifndef FLASH_CRC_CONFIG +#define FLASH_CRC_CONFIG +#endif /* #ifndef FLASH_CRC_CONFIG */ +#define BASE_MATH_SINCOS_MIDDLE_TABLE MACRO_ENABLE /**< This macro is used to control the table type when the + BASE_MATH_GetSinCos() queries the table. When the value of + this macro is MACRO_ENABLE, the error value obtained by the + BASE_MATH_GetSinCos() is relatively small, and the return + value of the function may be greater than or less than the + actual value. When the value of this macro is MACRO_DISABLE, + the error value obtained by the BASE_MATH_GetSinCos() is + relatively large. However, in the range [0°, 180°) and + [180°, 360°), the return value of the function is either + greater than or less than the actual value. */ + +#define MCS_PARAM_CHECK MACRO_ENABLE +#define APT_PARAM_CHECK MACRO_ENABLE +#define ADC_PARAM_CHECK MACRO_ENABLE +#define CAPM_PARAM_CHECK MACRO_ENABLE +#define CRG_PARAM_CHECK MACRO_ENABLE +#define I2C_PARAM_CHECK MACRO_ENABLE +#define UART_PARAM_CHECK MACRO_ENABLE +#define SPI_PARAM_CHECK MACRO_ENABLE +#define TIMER_PARAM_CHECK MACRO_ENABLE +#define IWDG_PARAM_CHECK MACRO_ENABLE +#define WWDG_PARAM_CHECK MACRO_ENABLE +#define GPIO_PARAM_CHECK MACRO_ENABLE +#define GPT_PARAM_CHECK MACRO_ENABLE +#define DMA_PARAM_CHECK MACRO_ENABLE +#define CRC_PARAM_CHECK MACRO_ENABLE +#define CFD_PARAM_CHECK MACRO_ENABLE +#define CMM_PARAM_CHECK MACRO_ENABLE +#define CAN_PARAM_CHECK MACRO_ENABLE +#define FLASH_PARAM_CHECK MACRO_ENABLE +#define PMC_PARAM_CHECK MACRO_ENABLE +#define ACMP_PARAM_CHECK MACRO_ENABLE +#define DAC_PARAM_CHECK MACRO_ENABLE +#define PGA_PARAM_CHECK MACRO_ENABLE +#define IOCMG_PARAM_CHECK MACRO_ENABLE +#define QDM_PARAM_CHECK MACRO_ENABLE + +/* Peripheral module macro switch--------------------------------------------- */ +#define BOARD_DIM_NUM 1 /**< Number of dimming handle arrays. */ + +#define BOARD_KEY_NUM 10 /**< Number of key handle arrays. */ +#define BOARD_KEY_PRESS_ON GPIO_HIGH_LEVEL /**< GPIO status corresponding to long press valid. */ +#define BOARD_KEY_PRESS_OFF GPIO_LOW_LEVEL /**< GPIO status corresponding to short press valid. */ + +#define BOARD_LED_SEG_NUM 4 /**< Number of segments. */ +#define BOARD_LED_SEGMENT_ON GPIO_HIGH_LEVEL /**< GPIO level status corresponding to valid segments. */ +#define BOARD_LED_SEGMENT_OFF GPIO_LOW_LEVEL /**< GPIO level status corresponding to invalid segments. */ + +#define BOARD_MKEY_SCHEME_NUMBER BOARD_MKEY_SCHEME_NUMBER_ONE /**< Define the scheme to be adopted. */ +#define BOARD_MKEY_OUT_NUM 4 /**< Number of GPIO pins used as output during scanning. */ +#define BOARD_MKEY_IN_NUM 4 /**< Number of GPIO pins used as input during scanning. */ +#define BOARD_MKEY_OUT_PIN_VALID GPIO_LOW_LEVEL /**< GPIO level status corresponding to the valid \ + status of the output GPIO in the key matrix. */ +#define BOARD_MKEY_OUT_PIN_INVALID GPIO_HIGH_LEVEL /**< GPIO level status corresponding to the \ + invalid status of the output GPIO in the key matrix. */ +#define BOARD_MKEY_IN_PIN_VALID GPIO_LOW_LEVEL /**< Indicates the GPIO level corresponding to the \ + valid status of the input GPIO in the key matrix. */ +#define BOARD_MKEY_IN_PIN_INVALID GPIO_HIGH_LEVEL /**< Indicates the GPIO level corresponding to the \ + invalid status of the input GPIO in the key matrix. */ + +#define BOARD_PULSES_NUM 2 /**< Number of pulse handles. */ + +#define BASE_DEFINE_SLIPAVERAGE_NUM 2 /**< Sliding average array length. */ + +#define LISTNODE_MAX 20 + +#define BASE_DEFINE_DMA_QUICKSTART + +#define XTRAIL_FREQ 30000000U + +#define DBG_USE_NO_PRINTF 0U +#define DBG_USE_UART_PRINTF 1U + +#define DBG_PRINTF_USE DBG_USE_UART_PRINTF +#if (DBG_PRINTF_USE == DBG_USE_UART_PRINTF) +#define DBG_PRINTF_UART_PORT UART0 +#endif + +/* USER CODE BEGIN 0 */ +/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */ +/* USER CODE END 0 */ + +#endif /* McuMagicTag_FEATURE_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/user/generatecode/main.h b/vendor/others/demo/5-tim_adc/demo/user/generatecode/main.h new file mode 100644 index 000000000..aed172665 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/user/generatecode/main.h @@ -0,0 +1,63 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "adc.h" +#include "adc_ex.h" +#include "uart.h" +#include "uart_ex.h" +#include "timer.h" +#include "timer_ex.h" +#include "crg.h" +#include "iocmg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern TIMER_Handle g_timer3; +extern UART_Handle g_uart0; +extern ADC_Handle g_adc0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void TIMER3_InterruptProcess(void *handle); +void TIMER3_DMAOverFlow_InterruptProcess(void *handle); + +/* USER CODE BEGIN 0 */ +/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */ +/* USER CODE END 0 */ + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/user/generatecode/system_init.c b/vendor/others/demo/5-tim_adc/demo/user/generatecode/system_init.c new file mode 100644 index 000000000..3bf5459fa --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/user/generatecode/system_init.c @@ -0,0 +1,152 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void ADC0_Init(void) +{ + HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); + HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_1); + + g_adc0.baseAddress = ADC0; + g_adc0.socPriority = ADC_PRIMODE_ALL_ROUND; + + HAL_ADC_Init(&g_adc0); + + SOC_Param socParam = {0}; + socParam.adcInput = ADC_CH_ADCINA6; /* PIN4(ADC AIN6) */ + socParam.sampleTotalTime = ADC_SOCSAMPLE_10CLK; /* adc sample total time 10 adc_clk */ + socParam.trigSource = ADC_TRIGSOC_SOFT; + socParam.continueMode = BASE_CFG_ENABLE; + socParam.finishMode = ADC_SOCFINISH_NONE; + HAL_ADC_ConfigureSoc(&g_adc0, ADC_SOC_NUM1, &socParam); +} + +__weak void TIMER3_InterruptProcess(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN TIMER3_InterruptProcess */ + /* USER CODE END TIMER3_InterruptProcess */ +} + +static void TIMER3_Init(void) +{ + HAL_CRG_IpEnableSet(TIMER3_BASE, IP_CLK_ENABLE); /* TIMER3 clock enable. */ + unsigned int load = (HAL_CRG_GetIpFreq((void *)TIMER3) / (1u << (TIMERPRESCALER_NO_DIV * 4)) / 1000000u) * 10; + + g_timer3.baseAddress = TIMER3; + g_timer3.load = load - 1; /* Set timer value immediately */ + g_timer3.bgLoad = load - 1; /* Set timer value */ + g_timer3.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ + g_timer3.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ + g_timer3.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ + g_timer3.interruptEn = BASE_CFG_ENABLE; + g_timer3.adcSocReqEnable = BASE_CFG_DISABLE; + g_timer3.dmaReqEnable = BASE_CFG_DISABLE; + HAL_TIMER_Init(&g_timer3); + IRQ_Register(IRQ_TIMER3, HAL_TIMER_IrqHandler, &g_timer3); + + HAL_TIMER_RegisterCallback(&g_timer3, TIMER_PERIOD_FIN, TIMER3_InterruptProcess); + IRQ_SetPriority(IRQ_TIMER3, 1); /* 1 is priority value */ + IRQ_EnableN(IRQ_TIMER3); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + /* Config PIN4 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_ADC_AIN6); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_ADC_AIN6, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_ADC_AIN6, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_ADC_AIN6, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_ADC_AIN6, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + ADC0_Init(); + TIMER3_Init(); + + /* USER CODE BEGIN system_init */ + HAL_TIMER_Start(&g_timer3); + HAL_ADC_StartIt(&g_adc0); + HAL_ADC_SoftTrigSample(&g_adc0, ADC_SOC_NUM1); + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/vendor/others/demo/5-tim_adc/demo/user/generatecode/tim_adc.c b/vendor/others/demo/5-tim_adc/demo/user/generatecode/tim_adc.c new file mode 100644 index 000000000..e3a50fd59 --- /dev/null +++ b/vendor/others/demo/5-tim_adc/demo/user/generatecode/tim_adc.c @@ -0,0 +1,27 @@ +#include "tim_adc.h" + +#define adc_shownum 1800 + +float adc_num[adc_shownum]={0}; +unsigned int i=0; + + +void TIMER3_InterruptProcess(void *handle) +{ + unsigned int ret = HAL_ADC_GetConvResult(&g_adc0, ADC_SOC_NUM1); + + + adc_num[i] = (float)ret / (float)4096 * 3.3; + i++; + if(i>adc_shownum){ + for(i=0;i

    ;ere5D+|+w9X@=3Zvnuw`y~ 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 Geg6lx(a#V7 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/wwdg/src/wwdg_ex.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/wwdg/src/wwdg_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..4ff9d0270ad7ab3c212b99053d59886da124eaab GIT binary patch literal 12792 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 z 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/brake/mcs_brake.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/brake/mcs_brake.o new file mode 100644 index 0000000000000000000000000000000000000000..e11e33428375b0c80a529d19addf162b7e0cec8a GIT binary patch literal 11372 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/filter/mcs_filter.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/filter/mcs_filter.o new file mode 100644 index 0000000000000000000000000000000000000000..3f15b001f2c0c4bf57124955068fff2c2d758f7f GIT binary patch literal 10552 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/filter/mcs_lpfRk4.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/filter/mcs_lpfRk4.o new file mode 100644 index 0000000000000000000000000000000000000000..1999f05187cbae2567debd8d2e2b681ce5c3f126 GIT binary patch literal 8324 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 U8#8bTh^X!eUg$GMgxcu-1E9>ZZ2$lO literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/filter/mcs_pll.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/filter/mcs_pll.o new file mode 100644 index 0000000000000000000000000000000000000000..34e335ac57a2ce0f31a628619184a59013fc1883 GIT binary patch literal 16100 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 CzC6wV literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o new file mode 100644 index 0000000000000000000000000000000000000000..abaad2740dddb490a2aacab063ed3169cc23dae2 GIT binary patch literal 6664 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o new file mode 100644 index 0000000000000000000000000000000000000000..7dd5fcdfdc754b731e60a28e47b898f3c98ee4d0 GIT binary patch literal 12632 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 Q!@3Oan||yvk>}w50B0mc7XSbN literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o new file mode 100644 index 0000000000000000000000000000000000000000..3d0bf9604724e5372f14cb7057cd519bb91ad5f3 GIT binary patch literal 11748 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o new file mode 100644 index 0000000000000000000000000000000000000000..e941161a0ac6713a0b6d9e0903de6ac654a425ae GIT binary patch literal 9268 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 i=x;L;_n3Jm0Yzq9h(9wT3z4y?sv~Ucd1*| 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/modulation/mcs_r1_svpwm.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/modulation/mcs_r1_svpwm.o new file mode 100644 index 0000000000000000000000000000000000000000..c390e475e7abea7b5d6b64529f3565971bb0ba0d GIT binary patch literal 20700 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 ICF&gfZ`#JZTmS$7 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/observer/mcs_fosmo.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/observer/mcs_fosmo.o new file mode 100644 index 0000000000000000000000000000000000000000..b97f9baf269d507db72fdc630ce2b75d5e5c3319 GIT binary patch literal 23472 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 AL;wH) literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o new file mode 100644 index 0000000000000000000000000000000000000000..7a08d0a70522d2f3bfd29a16a48c11dd5ee6020a GIT binary patch literal 18920 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 Kd^S=Uf&T+a=N<0= literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/protection/mcs_stall_det.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/protection/mcs_stall_det.o new file mode 100644 index 0000000000000000000000000000000000000000..44407492331dc901e1b9c9bb3075f9fdc5db3619 GIT binary patch literal 9940 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/protection/mcs_unbalance_det.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/protection/mcs_unbalance_det.o new file mode 100644 index 0000000000000000000000000000000000000000..718775a04dbab3592fadd52c82e6d7792206e2d3 GIT binary patch literal 19476 zcmch8eSBQSdG4HD$+D4U%QCTz>`RxGeb#_h))%%RF_9(N=EEf}Hu;fU2Yav^8C#ZzyqfGKrgtx{1`c51^?6<24d zmX>A1+5Y}qW-L|AEK3*iCBxklZErf=M!l(%nJ;=qZGHR{&~=O5ko#EM_5 z9bdWQ#rgQ$@q;_6pF4@aCeb^=HV4O!F4%b2{O1_^wQuorSE6d-@UH~zoEU$b=-xl5 zQQS9~JzE}ro1>_Cphkt`?ES9x?yFJJB?l%dV^oiCh;Lexy72~Y&b05xU-n;8^_=CS zJL%@UTC1kci*?68n!c@O9?{;hJzK}O9(?DWda}c%gGb+~#|-q?#*b2aZS2*phd;n^ zSUdJ!x2J!+{{vziV~p`Jj$_yTHOkI#<1L3`2dm$RZM^wt%+BXv&3!TL)=>}tr`pI! z#;^NN^`pmjc-`Dx^YwgRdr{AKogTx*X_JMfuhpoB_PI5;)TG~kL$|p13+5=oLq`*4 zc*F>vC-%M=?(^im+&U?)jVEioYN9E2 z1as`2Xo_>cbE0YSk>hvNR2~23%~;hZ>?%NpHuP;e1Nr&P)wjIx)dM$7M}FQze%?!* zwg0`Fmh3zR_c80nxR1TYTpvTOrycc)F!!gqA0Km9*G8-^y*hAy9jrOJZ#Oe?j7N9J ze(hej@#y?lh;SB+9j%w+aNyY9F`a9k)y`T?EZ&c!guYK+8<*O>*PXO&Olq6<*Qgrg zVHa|;5vz^Ii~GtbIf|Ae$9ZLOHMW6o`YyjJ&~e_1=6Ip)@^?<)%$#21ddF~%AAM)~ zLB?;E_@?jawjaboTVBzsCMw>u=;hke;|+O5uXvZzyYmFRydo+$cax5UWZHPEKHQ5n zgSf|cVUsZ)06uWsUbozS67l`;_Of1Im2p1t96PqRpl6A56{9=G5lf^hI5oFdz+>aQ zY9GUKis=3QX8)k}CZBb_PG>QNOrr-K#M+f-yZQC0Pr zimV`-uBNdjvhqC2ozc_V(2GR*oo3bujuD&aXAn;pJx)ARa1(L8;KdAcs^BHW9}(;m z&l8*=o-cSQ$Fe~1nZ%0(pG6$2E|*mFY{JFW*_4Vl6E3aJ_Ni!+u(>*$R?!y1Ru%Ok z*vqt{%W{BGPtP$Lk(l0e*6R=N5Fv{=FdOThbu zZ4&l?unlO}uDl0@tp{sW-b2DJn4KL|-orwArP(9Gy6l8A94m`AUW?T%Gt5ZZHX9~s zGou(}vLd^;O1L2jmow>GtwZT(t18h}PdW&zb^B|u8tL`U3|dHUXHIhK^;S7#hV>h# z^u2WsR-k99HY4O5Z^^8=wb5A%XI(abj#ob)!(FUuYtOHZVqHZI#PF-;dbPFZ)qb?r zn~T%0PDQ7aTsU_n7S*(QDmqIjPBYXQ!n)}#-p5Z9A#vIquVGr(fB zqkmAgwC^N2`=Geex3toD@=$O0Z0e^D)g87I;3S7<8V7$8-Hk96PwmlBCJ*x&3{wYi zGW6S5n1pfyN`@y5(#@rgKDpCFC+*Y?`CI2C!PZ@JS*)k6Ew-Yiqop;L98UFRS7mb} z9qj`o#q`js;XlW=p zQW#qih+U`DA3b|QW@I72oQN;gtRo4EvJW)SB?&kB+IG39AoBk z*<@z>NGjhCGLkBnGsS!|)mJJPQ)#prj3qyTVU)`Ks|NF!Fr_r5?Bue;!$>w#SVUR} zGB|+A;ZY2+ABi0p&J+jH#qe-x2uELPN4J;zlK2?10uBXWu74Q)4%_$)hB;^RxojQ- z(rctL3EMKAyB4sR(QARD7#>Zgii1prGpx#S9w-iPRerDK2pr2QCrB%$&|uZl`Y+c zLQdfwWDm$?mvpaQzvTi9BA0=dE2mUCm0O!j4VtRnOj+qSmuqw7ol z|Gdo?q_P{cn>Q2-S7HU1Hn$~vGsA_==OnSdwxs&goBK%%qh*Cmq{=EgxFJ(i+0kud zYx}NJINgfn(UD*r7v{5NrO&C@XkO0M7{6WdNDUTKIXbhKZ5vYvpOInpq9T)7&x_87 zJVAWO>sW@|G*ndS(PFVzCqfTTr()7zBxRQlmwMprN#)Wq5Re=bW4z6`9SXe%9eIRK~MDRWb*qGJD%Qhojc@^qd!4%1c{+Y+I(- z)_P7$Yg=oqy|ukF*}6R0w(?B5uUp4Dv#RLqvr+mx38tk!q4_K~(N!|fxjTL#)k+P9>MuFa-PMSxJhq8)xRWIM!&pguu4=_tB+Ws_tmN~#KZOE`kS@!lP{{Yk$CYC zUm4<;hWJ2;4~6(=L;Uk0{>LGHcZh#A#J?8eFNFB_L;Ob}{^Jn;nZqj(Ac}V@|IG+b z;ZQ}uC+D*!l<%qa^q*1*D)stHuhxXm3)S;AjTEV0ZmH@2@({l^#K%MYl@OQrR1_sX z-=RnmenE&|9^zX=yf4JdA9gVIU{sDr`FRSoIg?@98clFIVe21z6ozJW8j+>#tY6b;TMJKgX1mrTSN8v5Whae zcZT?FA-*TXgY_f*1?QXaZ-)HA`6uWm@!{wqWEH-`AW z5D)S%?SuRZ5ArK~dL>`NheCW$h(8zNZ-)2+kaWuA-*%jZwv7~AwC}B4~F=| zA!q-;@DST^)7eoBU z5D)H`(*EvH{g*@h{t$mK#Dnu&;yv!vS0F%C%?{;rb|{}y>nG<^>StDh3U3JUr6C^V zSNy^CQg~O$e?f?E2=U;0D(yFi>iZmCfdEl8$EDzSt?QJi3RVi`s0!}v!WTGh);H>W z2Is3hf4TQB=Fh#}k-O`i+&y08?)b@rvPfMV5TGi>+;mm6Ds>rfkl$+cDez!DSF6u} z2iLD^l>&F4|M*ivFE%Mvir2Q_cvPtZc(bYH^9Nqkst&j+`F zZ^b5MhWY})9!qh5{UhKv9eyXUd%xnjv%XSarM?0jtd}aaAAFNj{}6DneyY@?;KBN- zQcr-p*ROAYyVv(;!QJcG--5SdlTxQ%1PGoF>eS2N!T9Rb--El?lSAO{`TkGf?)m;Y z_=DJ_)Ty5XEVUHp^S=W74*yjJ6UtsWu8h*;tSL{ z;Ipf(qfvbf{8FcV5BR5@`isGTik}UnG^$I%w>$Np0{=s&{Z{Z1r+yH8z^TuJS3C8i z;CDKl&#HqCzX|-f)BhL1FLCPc0KdbV^fXlDXY}KgVn$*5dy$kMMPu>T=!WmCZ1V2VO zd^Y&wPW<`cL8(=zgS*$OCE%SEL#;X++&y2~!1p=v&jnxP@YUdFIQ&BJ%N_oE;5(i1 zd0KUj+KQ^g-jruIOdwsqc{A#ED7bp3v6`yT>RvAFGx(EE2 z;I`>U8zIY0ohcMRv6X^7z0@2NkhrB%!N)|gtn-MoEr--%6mdnJN?U)Hj|rxi_m+VIhi ztpi&pwsWxcQ0Squ0^3S#ZB*LWpp6aM=xkfg4_$jMP!F{p-JBIYY}&)xcA^djXlF$S zeI4|5Xv*47-8;i~GJGd%J6YSG=^Gu~lIrU#X11|<^~SZjJ@+(mANY!?{9vX;pS0sE zZ_~=`7#(feOj{0$A!Nsaftfmn1>^9r<3zCIM6uJE;NHeFf!a(YogdblAZ;d!&K7kO zr-S<1?shg`yGHL&+iqvdPEpHFP;2_C>`k9Ky>PJ+T-e+b-AD`O_MI-i7_&5fiH*p8FfdQJzn<0Q6v9N3PN z*y_wx@(FyPv}3D(QbYAs>>4>J6k_Y=bI?Mg6I-3BZ~RMqpb%S~XxM8Nu zk=W{d_OksFTm47CwqIha|CoLgpV;a@rQhhpR{ssK?U&f~&`z5yeCgA$N!az{?oRu{BAEEw~=zN!F^}DGX55EI6e_cFWs}|>o z`H+lqEjEj9bnxB8{{tT=&tPl*YYo*8iH*)YTg0Kh9u~pVaGta!w)1KQu76JS zwb(V(Api=o^;`(TT0T*zprveW~LowmRP- z+xWy*=kvXdPi*xKj-S}-Tw~TxZ1pnzJo!+Ft-hUpqZ35(7~vDIe++c?BlUkPmE5L^Azz>R++c_6m>6~GIP zPHgoBur_~7{HJ4QufxRF69=}}VPdQM!1g*!Y<1q7k_YgC(uuA4?=)0AwQPK1>pvgZ z#wWIVH?WOQZ1szPlP}-{<#KEd{6OK(dPabo`DGd9c5LIVh)5x**Ul=vS6?;t)T_>08CH@z|ze~(79w08ds(^~;f82zX8nDOxYvyF)#94aySz1aJWw4Dpw^mc#~ zM(2BU?}+GG;{Pw0-#NW^1V2iARPZ;6-xYj-m>Hi8fj9?+LhKvQ%fRtEs!G4l^o@s?t@tc0D`MYxenNe==)}J9a42z36ouF~9-hYW zIaHM*_KoKVaJ+%4QpCRTFg5YHRFxw3jfcxI&g8KG`^Gbk`bR`2_Kk6lw z;WKu8zUaih@hqUu1A;>A8_(&~PZOQkH=a24dqpSqjpr<2FD5$Qr^e#}_Kn^}y-9Rp z-+0zh=K)6{_Kki81TiGAbQNZl8m*f$d8xP<2#@j_F_KoMysCS4?>>JMm)H_8d_KoMysh=Y{v2Q$2P+u-O zv2Q$Ir@miwV&8cF2H0CA`b+eDJixxu`FtDi5}nvLo4wy zyhn6m-*|pWy;pQ%-*}EtUn4rPZ#?f&Un@GXZ#>lz=<7r$_Kk=4*7yaY6Z^(9kNSn8 z6Z^)qi26mM6Z^&!r+%^M#J=$?rM_NtV&8aLsQ<3$#J=%#QolrWV&8bqqy7oeiGAZ) zLw$qj#J=&Yr~Z4Q6Z^( z@1l>=^O*qqM!$~w6`~XS#4mO@d43^edGB{>Vu*a`^NKi>O-Ov`^Lln5Ejph zPV5`cx2Rt!I7l+ubYkCl zE~0*;=)}J9Y@mLV=)}J9e3JT3(TRQI*-ZUr(TRQI>7#y&=)}J93{l@DI?GWAUW4v>>JO$ z)c1%^>>JNR)bA9X*f*ZPp#CSK6Z^*VSJdwko!B>?r>XB1o!B>?=c#{5bYkClUZj4v z=)}J9e3$xzq7(bZb1Ee7A<_Am<<$u0vvJeH04I!|gtWX-bmAqa2wsVujl<`5?{v|- zuxnx^N*A_-(KiCGSb+}|V*d;c6)#UV4lgC%M@8pp-}K1;#24Vf60-FaH8nrHGeY zuc3MkI~(UP@$I6&j$PAufD=Z43)1p?L?>RdTd-;=T{DdT$%B2lDElFc%9-tD)x!T7 zqgwh(CDl?a2q|WAsTS6@$j^!T*PNEH>i!P-L6!W2`YCnt>tr|_fBl(i)qm$Na_}n? z2JQT6Xj&Obej%KsokZgAhBgY)p<4JqV(_0yCbb(VrttqCTJ&GAx8VOh6|;S#7t0j|0~bGiToYlYHX~ViH(n8ZaltEeu{!AHr_?xZoH+qFw~=x@p##= z@p8a!Jl>;XCy6&0innqZ{)Pb>p1nkCp0LkF*Uba~H zi;(YG4CVrBa_W8t?9O8+uJ6>?@2RGa^EiRc#s=hnGk5;RE~tAKb#A;N+(&pVXS{i) zj`8Xd%#F7S@m@JeUih=D8}D7j`!?=hjJLpvx5&h6g~n2cq&>?M!xZ+#EfMm)gh8EU zO~ykX-$`(9%MtiEH(NL+mR6YD@jcgr^$d;UTZD~uoNqTYOm75GmpA9j@4uGYzPPt* pjCCVwRee3PU#)hnk0Y<-7>{P99w%&%c2}}&OI~L!X=O<$juhD@N;a%!XL@E^ znV-9RRv%0vC6Z-`6Ko7g8J0u@Q-qZH6i(qv3KtHD!YQa2mrMwhiYjoxP*8=50a3(O zIOlz)dwMr^Lcyzg-RGQp-+lLe`c2R5er)>SUdytCDVBI$L`;axW+BorZj%nTh>W;d zdpBD|I`-0P-||f6@yuV*;=I*=8HmDt9!nY{WGy@ z#D3~pZWC(u%hx`UyL9dBzdq4DmU^~Vh_&Z?#b?pWt7qVS@j~w0wIjXawaYhLz4**+ zuZgptf8tMW!1e5lPjpW$6M9%*AYfoN`)SoY6Hs~)dUwCz?e;@tVf06$5yYdRr zl_FK8UAlJVl?%xI$oZ?8-#wJQZ#pq%t_M8TxVx7hH`n8bo5^_8-&rQ=TdnZ(%lI=x zwoxnmR_pmo*uY(Kzjn#3yi(%CCABJb^M|2vbBk1lP~(lnU0q=yQdz=2V-F{qmDu!saHby=w{>FGxavm`j)tP1`G+S+L9$Gt)9=dVp z{u@?Xt8T!E*IEMuI|grzKC{j5(5Kwp|ub_>)MW(eywB5 z`tsI$)~gV?^{cHlJyXM<*|nab`@7q*Qo};50M$K_4qS)O`{A}S9$^34ju3;}IzkM^ zUE7YBmpf5Ya(=qZEd9UUFJY0=Vg`L!)^~>nah0b!RO{`}Yax;cHrjPc^Xg-vTaGEc z(MntW2rW`wR!>?G_AF6gOc`5>F3Mx+6*lB6bnNl(8(X#P^xnCgcl!JErm|RK?Tq-6 zNwi~dO9s%{=&zP-l$@itoDmf;Ecg{Se4tPjt$N^9>TW5+W99wty=QiR-BVz9)h+l^ znm*|kMQO*(zJhnen>pk+j=RM$m>GBWxV6U2txo9GW(%d_Oo^0_c~EUMT~TtYVc~!C zInFfp73%oxkJ2m7BN=(2^@tlDk$nX74L{6u4C2(mLJ*2_wNX&xfbV^QxaZ#cGrPyf zGq>fp=EpKltuW_Jde!FEi86^_oS*a;woZ7pauK}VaDrN)T6Ic=u;5g^nio!H*eYz* z-O0c^?E*Jj!MxLKG}*p%ycL9w?^YUq$@L=zuPxAvjUa?pZUT`vnxw%AFD%YG$6K|g z6Bg#Gj9IOEj(f6+v4b=VVd(mGr!W_UexZmqm5lQ~q!EOr$x6M2(KuzbdJbm>42jRR zylUvxLCU`C1|ed3bu^^SJy~>{p@$?CZ`DtD^^)pcOL9UTx8AC0q1dR^8VrZgp=ZBU zW;AllM^~vao#Pps;=YJ1Cu0X z3kz`CWlvRC_gbh_d^ZTZ1=p!I8cj|qoeHK;uU5lkV+wstYuUvDI<*#3EMa2HH5a?z zflDxt)mPTm$#BlWW!?x_3czZqhJI@%K7(P*UcKtok&xUY?LnB9#p-E5-<5lTS=3q% zo;S{CEUorBm;KrT$L5@N{RSI`Rm{|bEw^5DV{0$<`G$x6gL(c49D_m`4xD$6E%cfV zJj2|5Wu0F%b8^R)^$bKkw;i~)*zXN&{&LW)s@V!XnUYh$JXh*9w;pl`@#)4CsL1U= zO~2t_$2o4(t2Qbv&X?XG3ymsP2TMEWg=NpJmKY4SM!n*=3x%p9r)v^fKwt0zZ_Yy= zrzYp|B|xq^cNdyBeYXf}qplvN0*)F zWtli*QJkmWK2B=i58!iB`P|L-Cf^H+3&P3)cFVJCqB%ZWn`n;BmM5AMvqhrQUNP_i zm~^7xv$tKk#J_#7O#m=AaSE8ILX z-)^J$h6InsrR)b1_Mb@bV+npd!Tkh(D8YX&!9SDWi!t7Y0BO;in2+AXd@Qwh&WEx` z-!T+l)9ys^TM|5)A7xkHuj!=tj+lQN0`PsRbA9>~`7X70=BwmQZuXvQd;!*yJN9(Eh2ir+09<8t9 z<%B(Y{*?Vp!v1iKw;@1UTo6U_`5`8AC$R9_CZmEJ?d{z z%!9}GOAS0KtHn=&e5Wl8i}S!AiSbVXZ;kO^Xk&uw#jkbnb>bOtx2+A!wY(DJUjv?v z@fU#qF2-L3{#=azCGd(E{~O?EWBl)dzaHcN0{j~>{yOmQ$M}D@F#*4NckZV?@PBOk z42$bJKEiQcfyejbP2kb|4~xwm{{3PUJiec|cG!o-PVh{uzug`7UU2|?N88>j4uj)I z7+r?N(GLG^aSVLXnDM?)>98lC=gy}kEjF}U5~RgDMN7A5%r&WQ@zGd3o@1ZVoH?$+ z?`WUZoMT>t@8K6U=bWuc4Tvvk&S!W{YB2fBMN#Arj%CEAleq65!({?>E9y4XTTyRA zy&ZL&#_@4nCM2SLLQ;B9NV=Vf4JO!P;tpI&?p&)fTbP^k-37M0`^esLcELLv^3Jx( z&o9&~Za_c9`E^CNGL2Om9l}IlqKL#mxM{|0z?cti%xLc}nepCfd4tFdAu={Z(*+yu z-8C+a)A9yaIey+bW>{ssX?df{UZBd`w7jVic=d8)Ec$`s?jUgeaN749{=r5?>WSYg z^v?wN>fiB$fxu62V)R3}pzw^{@IeVBHs=M;+8eb_Y;>NVYaUbn#75^?>&z&9A8w=i zr_pv62aGuy#cn5Ky@L^&u z4$3i9t3{+fE3E~E*~~hj@EPKh3SS^TrSPYTPb>Tc@lPuJB=JKE|1xeP{9s2R&T0Mk zfK3j6O8ik=P+mf{J|>~~3*1J|L^!AQHy~MOmEMCh-1@k}D}YBn5#gNHN9c1-=~Kk# z72Zqyu)_Ro8{yzkh;v#m(dQARA1D54h3oX^rbZ#oY5g(!=(&~a_(|o%XWX>q{x@xj zOjjb2vsHy%yW(qt}SotPx;4 z=PqJB-acYIKXQNSJmna5ZXB1TbCcuJ`EV@O8C*~@s3r&IZ|NNPnDG~I7H-+>fP@m; zTIY7jvU3z-Tl;Wnv-l`yA-1*8W5C%VszMOk+UFO6v-(wp*w#M3LY)IbA-1*8uLEcK zAfgc4+UGZcvumgdL2PTEXMnS7sS5c%YHOdbfM+>LD8#n*c@8*xA5|fUZSC{Nz}5z; zLcEBYY+uG+<;Oxy*@z--yTl@SoaQ1$xLJ-^9 z=XGFfGgTqpM9tw?6qY&HLCr8~;IQHX8r!*}287Nry0+UE}HV@fBswa+B=2b4~1YoBRg zYrE19(dYIE+gkq+^*fYKY-^u6>N}K9Y-^u+>iqJCLTqavo-^4yl}>DHAD{YXB#I9 z>BP47`3m&|N+-6p&mU0#F{KmR+UJj`e?aNPw)TrX=3KB;u#&9^E16mBNY7m25o{xohQ z?~QOy>(4>jeo*Pen|CWL^1-PZ{-%X{=&Sp@L7{sx6nXxQNaW{&K;->~BEDNK_|u;6&9y=|&@=V}-MDSAokfrK*2~#$o6?9|kbY^+lYX?Z zxDQ5jq&&>n|O1;@pyNEd=;80Cch6uh{t;x@g9T5c>UVO z{1#B-@%{_s0cfU}cn?B|$GdYwl;421G2SOp|+ycuk?7hq((>$HvWejC-a0Tclm{R4q6#`cHc2GevDi#kQ1 zi?KZi9`AP(I(!})`{k<-ZS41(sHP2|coOmSM=ELC_7ZSB-nS9xBs9jmUfUS&pHSoR zzK(btuPFw88$vwZ4BmN0Aut|4E@)%C|3GCMlhfnabl;#+7usY@T;hJSXslmVq^I#4 z(tf7>qwu?A2<|3yKm3TNwC$0sdIw;B*b?ph_)dgpys6#9A#4);@ggPm%ffp~B6T?j tzeCvYeAW9|RQ9zBmCt}VGXTZQn2cvl5O4$eS{wI!ZA86Su?>sy`yU0Uhv@(S literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/utilities/mcs_mtr_param.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/utilities/mcs_mtr_param.o new file mode 100644 index 0000000000000000000000000000000000000000..221b50d78fab47286af6b24f784c0128812f41b1 GIT binary patch literal 6060 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/vf/mcs_vf_ctrl.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/control_library/vf/mcs_vf_ctrl.o new file mode 100644 index 0000000000000000000000000000000000000000..92c36957dc2d8bbea1c4e7737b04ada3fc24b8a4 GIT binary patch literal 16776 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o new file mode 100644 index 0000000000000000000000000000000000000000..1b2f7fcfe534e397ef99384c16f9a53fb3aa474f GIT binary patch literal 5224 zcmb_fU5r#o6|UR22L|Sk*+G8XRT~BdkhyodhXF=*2ZjL#CQbz1U5(nC_V&HEyD!{7 z?oTtI5!OXC@h3rzJh+Lv*_fDp*_bs!qlqRH!-I(?u0H9Ti7&pa`XeQ)ot8boLUDh;>Dbm#>>(8z4dQg8bIbGH!&F$LPHpkAC<5&Eb*6&6swW#+B}_j-p}O^anY20c&u$ zU|icjIx(b=J~{gQ&T(zqPU!AqLqjJaf*A?1wDJz7kDeHMdSGP&yPg2^%x>&<47#Mb zd5TfT;GEDJTA4Vtn-sQ?0`+V)wNtyfg`oqxS0=`_CpIna`sUJZ4Shocy-}rIj18l( z5m*|;d>Bl!(Y|3~*;BL)+JHPm4*yNHgfrIJcGQ~o_t6p5JOGI|&6&V+9N)cWCGJee zOFiGSqj1Len$0K=oz(8Q_LWArX5x2jCQWSSoTzs!DAu7JTgjD5n&plc)w3w_)A}_p zbfRl%-L@Nvm)hMUvyC86{YEQppsSuUo;fz0me^$E`QLEd9S*WvrFjR@iE! zrcD>j^8M_3?51XiT$g58F(BPEHo$$UAJX*l7Pv&$cwNBY;j=VLTq|IWm5Yt#mDO`( z!%Y&_Xf$)r&%ChFwHm&cX4Dbo89V=>=PPGwwaRhxh*_-|fz|XDJU>1%+ae~hI|~WC z;{`1nd>9#NfHfM9m05=G1zxsLp;1{Lx(lgy!v&7>v}43kOyix)d72rC+l~?}qc6eX zL2gHB23acxB0h?VO|N;G-7zlbL2P7J(&003bv@6C% zECX9wXoop=W3*DQ9lDNTcPvcX!oubL!L$<@>rl%1i4`)ZSrSfS-o>^B|(?=X54U-hz4dpJasj9L)$H!J(qVPgtP%a zUx8w3wV*(Lr@duf9O27A(btme>wAtzY)g8eKXXrk&KB_=A^2Nq>WTEiN=T?P`cm~t7muW# zKxZR8Oh9L2eE-GyXn%bgXWRP>&>%nS{<(~?X-Mz!ml`RK@ptQRfq#a?JsM*Dy^?T* zeFAl}pl^Y{Rp2||KU&};@cdbdmgc*LdcM&AS@3wrNg88!fTBYGSHNE^@ZSKxQsBP@ z{t$|wG4=`op5&6o*!O|HTF`$Td{*G^gI_H0KLg*VGW!LXqQ8IH?*tlSZ=(KWVf^pG z|F*#Y@iG04@z7r>sp%V{S!WaYw;_nu@IAtl&mIo)MPY^SeF;JqAKgE9kY4z$uZ#&!bb$;w@#ynH;C?shPOQt zC>NUcLQGtGlqD^zieuQSy z=;H%YzD_!(kpG78jKFUZt_n=isnrCg*itqrrzo3*l}*xAIu!DnoOch>x;99?j2#Bv z%l{M#JSF8dlJh@-j1iuaI>$*qEXER^k~#|{m+6r3l+-y*@*P5-@RZb{b!sxPP$-E1 zxZ=OqBR?RoBrW|I|J%tJ;r%K#o9Xock8ft;B_i66LYcdkF_Rv%%xtD9GZWXh zOp=i*}o9c?NnB<5@yo-5l^qj# zQ?c*=rlzX_clN$ua~lTn2Lfb!q#plg2E0*^Y!Fds)6xGYJqo{#^Y-(v`X9~scZ_0g z5rybwoI9N}ojb{?P>7sEQELF?-P}~LaZyl z&{b0QzEl_k$THYlRz?bacYurb=3wtOWVAlGsAumUFb$Wfg#8!?{RbK-iTbF#B3q?* z4?)p?e+eDZdtK_G;j|9DdBvbrreBkIQTE-(`Yr&|`o>X6kK*8`C|FXAhSNjXn^g>2 ynv;lHxS~f@972qN^u0KWLiVHPx(foIA9 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o new file mode 100644 index 0000000000000000000000000000000000000000..6c55e56a945813c7e3c803537a48a29dd48f6c13 GIT binary patch literal 5296 zcmb_fTZ|i589v8$lD%Yiv)MKmTENXFyW2M7wVh3}q--vmWRr+3jd~FRjNI{f#-3zu zor`x91tqkltwceJ5R`|$K>LJv0U-nkAu0ta@Is{m;stmC^$7_CZ%tFa|6J^eg{Y7? z)|~nN`+xrP&zbS{v+HY|bEXGp|6~J-u|3m_6(L*_3JYvE+r_@{+}7Xk`z_luTY2-& z?7<)2*>UUXTYGLdZqFVp@!86K{Oj9Fg>Ubk-T$wl2f)oihFi*%fZCPmwKu^izU5kDR_E z7}NZ~=n!d~z=qJ_TLU z+_oge;}>R5>?O$vNl15ej?ryQ*$duyg`e0f+>Ougy)ZM)cWyno=bNj0ITW{V>3b^d zVQc~yn}qif1cx#4rUt=?WDnAsXfvFSKtKfHJF^MhKKGx`(P;5XuGULnTB+c4x*hs_B zOBx$)&<;0}hGjKlH?ew$>PwK zn@-ty0%>4LE1e+2Y78fFJAvIctgeZ$4iZ=E2jRrFouu&P1~4RLLkAX90DH zjILNoH;hxm4l-XctkCzv0Qy)RBFC9U3r(|_cvPq~cEK_|*Gyy}QMAOibRZ`S1U7O! zsCNQGOOlnka)u6XXP#}iL86mHwXgwKZHnaCDyrG(#CDRnJ=^fYFrt!@lBr|5zK>#~ zgfYtM*w{eB&yZppg>`&8?jVHkCtd8mlxCZ0%fQst3~U9U*Y*+D*Z#>F*6aqJ8z3Rk zBmG5aOUt_o7~7&3C<{L`%(z4K%%#=eXD9Z1v^L|a9fxF?dZ^TMnH^YmZtn%Z8=|ER z)cG1N%26dmK@*7l6bgZK)Fo@h&puI)EhiHB$i9A`Y)DK3HfrP1k!WgQ51&;I?k{o*9$ut)k`%`F2Xe=P8!#LVc<`7wK{n_aYNpHyW8X|!7RX1dOz&Y54bCv;A?dQ1 zNcg`W+l%?*uJg*1{IERI z#QXRIj3VRL_(Xy2A9@F^PF_6orO{W$R=1Co3uoS1y}i0!oV2HEP!w+m#^>q$73W|* zsx|$3RBbx-sNS>)U3IM_1{m^7Bu@1HD6xNh&?f+pPo4xV-qGRDIl2!4icEZX^;yMSCd4c>L zKBG9a+9I10oP4}{*E`Mb?^_cXVFxe|_GOA0puZwM-$*{i4rAV)qgROCALH!tJ|-~1 zK9AYV>9;_CF-N3<*euXFTIK);it-vXWF=wE>zj1v0|hw zQDGQS=F=3p;#mNYR z&J4a!K=xU}vl2f`c)!FQ!t}smc)0kSfb4m~^AdlRFa^i>7A~%upZc7ugN%BdKZ*(C zN4WSw0ogAI(*b~S3)gH#K!N8KpZc3GO8%b+S0$#t<28w?Yk6H_>N)N6K49&Wu=Yus zT8AD5uHx>)@z2%ad=Plw7-=#_cuw)_#8<~6;W?$VOnllv48n6t=Q!~vB%kn{(pe?` zF3Bf6r*tS!t_~n-3;ADJ{&$-d|4k*HSC1-{=?MN<(ja_bR6xcm$rT^p>bR$|ymvK9 z?M-|N(6=wEw338XV%sw-#H|ckRx$_u41?S=t85fYKA-pS{sW7iTI~g?unK)|;#2J& zJ0~`MXoT+=y*hNr;K`};fmoq>@2 zQHyAQl#8|jWUqnvB>^?G%m%G7i5e(anSdHv_AKap+$HoTJ(?7kT2RNm0<3KS*){kR z?*$?-v@8YA`)k9Wt_wX%+TW`=8$k9d{GHQIaC|CU!b>~qqXbrftSyZigF%2%5Pf9s1JUQ z3n@joiSZzctByKB>!s5jrRa}~(7ORc`u?K#0mVWHu{U7%$J+?9RXYJ!L&_nqcOJ%X J_pJtc{{{-YaUK8w literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o new file mode 100644 index 0000000000000000000000000000000000000000..9fe320edcea6ad844e747d9c468117b9a4b1b543 GIT binary patch literal 7220 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 RyjtXDZlvG#aE&VWzW}J~_v`=w literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o new file mode 100644 index 0000000000000000000000000000000000000000..09e3a2ff5e441f3ac135a1043567d9fc17ce929c GIT binary patch literal 6504 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 Xd3i_b1U!XYL)MNj^;bAROKSHoysZ1J literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o new file mode 100644 index 0000000000000000000000000000000000000000..dd51543b1932153caccb60252b8b0c3abc56f252 GIT binary patch literal 62772 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 RVi*^F5=9qVGR!mle*n`3a8m#P literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o new file mode 100644 index 0000000000000000000000000000000000000000..e68165a394c7b40df0b88c01fc25b4b3111f9391 GIT binary patch literal 5152 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 z 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 z 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 HQ|kU7B0U_4 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o new file mode 100644 index 0000000000000000000000000000000000000000..aff81c101a418063360f0a3561f6c93d8de7a61a GIT binary patch literal 135216 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o new file mode 100644 index 0000000000000000000000000000000000000000..7842500c71df7b258a6570b7331cd991a4303c78 GIT binary patch literal 108444 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o b/vendor/others/demo/5-tim_adc/demo/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o new file mode 100644 index 0000000000000000000000000000000000000000..732dca417a353056c50040e89231fb82e6d47ff4 GIT binary patch literal 108992 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

  • Ke$o>s?V*F{t`~x)c-*s;I8}TeSL;sOhRZ3_4+? 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/adc/src/adc_ex.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/adc/src/adc_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..b29d7c41a45e8014dec732491a56b5fab2961b46 GIT binary patch literal 142480 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 CK4(k- literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/apt/src/apt.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/apt/src/apt.o new file mode 100644 index 0000000000000000000000000000000000000000..3fce6230aaf9936fdae40afff1a0492019f8bef3 GIT binary patch literal 202308 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�DoUii%b8Q@u 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 Q+|BsCOhMHW&quQRe=-1D5dZ)H literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/base/src/assert.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/base/src/assert.o new file mode 100644 index 0000000000000000000000000000000000000000..3e446492048e529c97b6b7857a9ce90f3a2447d8 GIT binary patch literal 3972 zcma)9O^+N$8Lr-$b%NKKcw^_oIE3-q@j4MbJ2UH#;IOb>+v^yu5`<-OS+VqVSI?B` zFIRVO)+I%sC;>o)V%1Ii*j(fi4d zeh7=MvFe%taQshN=srbZr@N?tLK)T z=T2gKT*MQ-2~o*SuH z6&rne6=fnfa&;(yvofE#S(?#5cvR+vtK~G+fz)$}pC*v|X+Y+l>}AxT9nUHUAQtS<67XSahx(7R)@^G z^tsTY)ReJMg;o%Gk@E5?kttd(eVZsO6NBBB4Cd3swVHfmTnF=KGAJYIswB6QM76L1 zhmx5hS!ea8Q!Voxed9)Hnz5ub@@!5O$0#;Rs8QBXVguc{#1sP*HjJg7B1IhMGwgn) zEf0!`i=UYlU@HKlAV%KU#%D0BStXH5Fd@?;%_6L)9~}Z}X?lUPh)dVgQ`WOJt!AG? z9q)5(?xEBv9g7H+dR)rHm#w`w@>#0TKdAHfVVHX%3|M!rtx#EtZfEy}_59|QGaVb& z6_{sk47j)G_Y}<^=2=u#t59Z2F5W6^RxFc(OK6uHC8#1dfij)C=r~tqDoUp%>s2?% zei~tSu(cCagi1yMgF%-jQ&;YLk!#AefmuMluW~g}n8%ZinF<24>+CMLXIlEurb+cO zd3eE1&-RbJ^S8_aa#!nA@1#@F==h!pZk{kGxVih5ryi)?Z|U?AIyT=Oxp!oo?p|}z zPkUbA?*?SkvJm3l?b|o|SNMJfeVkXL;kChVH0+Ou8>lt5zf)cDkIz~v9KLNW598|iwl*E}RkIxRU2$^G0(Hf+$N1xV^7yjURQbPP z*<&AyPW1_Ev>jo-c`e?2{963cY#meKMveLQ%zWGVj(VIH&&|z&o)RngU29}L@mhlk zdV)2+TYbU}e}m$NPKtXCCO9P?;`d99tS5GXH(UPru8E}<{|LO>;va*5rNtkBpHo-7 z2d2HgpMrnAG3be30>9bv|4pMKFqecz(mA%99dWwR5p+JP;3yNukamW-i$!^@i=ue@bcrlLa7iB@Lc?|fd;SE^6x_A^zj3V z@YoBVnLis9#2vD6xC|SI*v0{DY}g7;ookc0ex<$%yuwQqi1>0Xe;as(g#i&?u5B3K zsb3zJqq?P5m%xiBApmjNtLF9!Fvy?8xY1xNbT!T_D&#>S2D~AN!6eVcfP%rXeH&;Q zd4u`J!lBh>qOJC-t~w(79FaNk>nNCt81So%584sGP_uIO?b;55A@2Q;Ys|ss zy#>tP*~CNo1by%^M!rToMX2Mu^ld!W2T=SK56?VHRwp5_n7UOkeS(^-?t9?dd4Gl8 z;u*}mtb@(_1laljihE$%r`}`fUOUp_zsu{1T|UR&%n3m z_jd&O8f1*edf0gH1Jj3dC;bV`V=8N+j?W+J(b}Cy4{sY)$5b!*>jEC_Um&b(dQ9$uB X1e~)a8;?gz+wKnL_lY&aXzl(Dhi8k~ literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/base/src/base_math.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/base/src/base_math.o new file mode 100644 index 0000000000000000000000000000000000000000..c86a68af97cf14207e20d00256e380a824021e14 GIT binary patch literal 23680 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 E0fRKpaR2}S literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/base/src/reset.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/base/src/reset.o new file mode 100644 index 0000000000000000000000000000000000000000..9bcb8a7a82bc05f6776dbfcf350488b67421fea5 GIT binary patch literal 37284 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 USv{W0T)$J+V_exnlv((H02^bD*8l(j literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/can/src/can.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/can/src/can.o new file mode 100644 index 0000000000000000000000000000000000000000..5ef66b7f7495d38a69a7b900cfbdc3807da58240 GIT binary patch literal 60404 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 JmyTe4{|^>Nm`MNt literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/capm/src/capm.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/capm/src/capm.o new file mode 100644 index 0000000000000000000000000000000000000000..feb774949b3a5f3070d646f39201b8c496f4ab11 GIT binary patch literal 126476 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%0AU;an%_f!o{# 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 U*0bIBZ*reLla%e9nU0wIe;ceh8~^|S literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/cfd/src/cfd.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/cfd/src/cfd.o new file mode 100644 index 0000000000000000000000000000000000000000..59c16cc8c16fe53fef24bce60d4e1cee6c5144c6 GIT binary patch literal 61104 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/cmm/src/cmm.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/cmm/src/cmm.o new file mode 100644 index 0000000000000000000000000000000000000000..4adb74780b84573635bcc8efbcec1236127ef0b6 GIT binary patch literal 53720 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/crc/src/crc.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/crc/src/crc.o new file mode 100644 index 0000000000000000000000000000000000000000..1c1518005b283b1b96b66d5bee31e0d89670ef09 GIT binary patch literal 70932 zcmeHwd3;pW{r0&t3HuT@SwsypsD8))>>CwYHjOYwbr^Xt*uL~Xsh^spY#2md(OQXEdGA_e%?Rc3zK=C=RD_o z)_d-~v)nnpYSy$M2$bCd^-txPQd>F&DoKfBjbTroqnHsTot7C=I!a>Tec@NTesiQd2Ro?p4-&<`Lp}n z(OIc}>pQE9sHC^ol7CY&vu^v3r`LV)Hl;7@kUrv?lPLYtGtU2HTW`b~T6yW|um0rO zvxh$T(d0!_^J`CB>z5cU?Y_RbO53`9LFM^x4^#^t4Ag&*(b_L}jG@yJW9TD06Jz!+ z9b=qCZP|F>r1iOK(6Qfc9+W!*`tJGP?o1sDhUAX0@sQkgxbc*$@;{D^-V-@upvO;| zwq^T*L)M>ua;JaM$Sn9n?)v14IC*HtTKN$_`$EKablUW~fYFbp*Y((@pq)Ftt}`Rr3;J(U>!bh|h!i9BtAug%w#gRy#T-PPUvv(%${Y&c9wmg(@N9TmH zCEU?DscZ>%bk0+@ggZLtD_g=Hoja+WDS>*j(6*m&NnQ7C>Le=f;zzhtYS({hKiro- zDDJ@3MI~HaRB~scTx>^1`kqGSzm(0T28HLJ(z&26v8@O51oLj&x=DJP(hDhFc#?Rg zgnF|Jr{^(GMEGP%@5JfGKbi7-d>r!2$Rw$}aYz@Ac*JEs&}bpOgwoA?qmiNX>9Z-_ z%rzP{N++JPt!s|%^jzv0H7Gr5^XDgJwtjKK`{(Dk=5?I^NZU~9R`s3{Ki-b|Z8(J5TJYJ~w~hNiVdaPR{DGt;SWEj_Aig{=Z=v`^+gN#0(bny* z&8813lhe0sziWL*b#qSjf}HBQ9O}ly)}PUD+qT}c(hfCi3iWr6Su(w&=FhkjXjE^V zovN;iomEiXw_{&e*f~BQf=x*C_l4FSc>Hp5AANAtw2;^Qoj7+> zQcvBEdeff0-R>t7bE?Cx$>j~qk>r2U&VuecZf9Z6v}ij^cHr^rlB>r4IQT1XdgPYR z(|c_VSKxvkIqPRu=fa$6(bc(R2cC_UPj*fZ|9E>^=WU;G4V_7Tfsw!Kq7CVj=&W+X zRbcBoV|_>xIw>>ti`SdCeI6*ghkR9?OM33O&XaSdMe96!2Ohu9`DWicxie~h*F~3@ zT3?c@*2{Oc*0X!ZY7&(K&o`4o|K*yVofvW%9OPeD?Ww;8?!nbp-7(D`r8idPU1_-GOIgC5`O% z4Li8Hu_Y9CxMJ+MCYS8M>NVJ&RF?hqr3q- zDo;t;qq1Kx2;U4|^tZ!sYj@FAvX~A`UsvG0i zhnR9E6U|{`8i$)Wd10@4H_P|Nhzx>jKj6v>2K$m=VjZ}lqEPWkHgj9DQ_o!bj>(iJPtj$yF0v+NRDb2-y$6 zvtb9X#$b<&w|#Q1*C8S!@7g}QgLewmXx;XHxc)r(?L6~*)HX%W1$ArRPSA5<-AQjJ zuDyoP-?Z6(q!xyrWEIK5V$-%F`H^LksJ zc`2@k!LdJyJbJxMsbmrT$-|%gy#45Jr|I;kGybS9d0q4J8=Kozx6a0pY(AFM?nvUl zfx!v$H);OnDN|OmeKvU#K_^%f2`=a?!g=_U2)aN|UJe0&5_zV!QcN)8ebTt>o&)S7v1Lj~sAW?&a zfJBfsNr`0Af;<6vA&{h`^(6C>oIPnhl*CG2ekabJm!Ho{J^`uLb*EFcdSejtf}8fC zS``2XH=}}fJZ>3Aq>l=2=i#}difG@w;E^BDb3bE$)a*6M-Gu(e(A_Ahe_rs=C1e}W z*04kc4?`bNF|%3)k5!YZ@(_Zf{uVZh`qY#3%u$~hY%d~RoE!%J7%&6cc7?n*k5rY1h+N3uVWUDm{*a!z>i>!s@=3IiZGIsi73ABN z{1ZC&`lr7#g&-mq@)>M>hX>m)rDq=cFE2+Q?m`dReS?1y$zu`(2U5N+OcDX2_F$4U zq<~4DA^n-;8#0JVr{HD^FqBE>U;q_asPYQwX`m^sOMqIKisg+hC&|pq!n_Hkv^1E? z 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 V$GoE5A>ykJ0=1CpVmDjv{{craQ-1&e literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/crg/src/crg.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/crg/src/crg.o new file mode 100644 index 0000000000000000000000000000000000000000..9833eaae17a0ce16b6d917ed6bb14b958f3d8039 GIT binary patch literal 150996 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 Pbr0jlzuZ*9H}Jm!d>rd9 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/app_command.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/app_command.o new file mode 100644 index 0000000000000000000000000000000000000000..e4fe523bd3aef1eada7211cb482a4c10147b0013 GIT binary patch literal 40952 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/cmd.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/cmd.o new file mode 100644 index 0000000000000000000000000000000000000000..99009945dce55dcd68dced270ab3f912a90237f5 GIT binary patch literal 7148 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 SZe4XZ*;Uc0e$yCq2L1;OM%$?X literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/cmd_common.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/cmd_common.o new file mode 100644 index 0000000000000000000000000000000000000000..94119332e3034683b81d3775ce370f2610ae23e4 GIT binary patch literal 5540 zcma)AU2Ggz6~42(wiBG#P68yRDJ<(`oR-Xby>Wh;#%<~(PD3MzNJ{}(GPAq0>j^uv z+nHI%j)0bisG(GXfKV$@L>~YlBqV+!K#0DOJ``R633z}9iV^`2ktjb>kVqZA@BZvg zmY;B>d+&G7J@=gZbMBeD`{c2c^Oj`^LzeiP=y5`9*epaAoikElm)I)aDpsE;{90_A zD1PPU#O}*CC+ytX?_WAU`N|s?h9-)Cze$vRW=MQ~NMx=K+*mXGSC3yExgmScqxTbk zhJ5YWq3q-*-}vG46E6)3@~gD7w&j_vV#2=G?ajjC3s~KlQp&#x;w=1@BbG%lhZYM$|H}uxD1W zI8}@MWiN`SYF?$&m}<5fQ*l%kq8ii|tF0htg~h6hyaDMmo42yodJN5GWSy1uldMH1 zXANcr;b3+^%9W<7b5f%8m85?Z3}o&!-ji1D?pX)IiaKHJH$tzL_rpXS32LX@DE1=M zZXk}o=dt{e>FNCb;+|qD?*wkepY@yVJ>@!?sJb*8E$=D&LA?q-Y&mh@Hk(e(OA&I4|D;w7iuYIA(;Oeap9$ZNEsniusX)m8|3wG}6j)!RViTWzxO zSwE>RIcGXS+ezF?lQx@8-|<%3Zde1;c9X=5LdUJdN#s^Brjd8vi)qA3ZMG41uo|bX zR_s)lT)3@c;+2lyO#Bc`J@ULbfh|A8K=yenRj-}+n1tdx;aNYdDeqboFSVk?@xo4^ z1?v2vkJZ6*)TwfzNhhKUZd4Na5V=j?jg=$0X|Y!|j_RFIVkaeodLwj9Pdr=J#;QwR zt<&@zKa9;Jv0FHRa~?f4J?+(PG$JpK5w%XU)oOD~spJ};eh^@@v4s(~weH~nouGp$ z*08blz>6Ai5d`rPPG9wQR+5T?YRL$26oAcI0Kb8;Ph(iKA2$6E6Ou8~U4$7~ZJq;+ zJQ)j|MbL5FsKNbAO{;s(^(a{8+MIJ<)Z)OTiJf|)J#IJEZY92)lH+2Z8)4vu373%G zZft?F+%?pWS`H%4@!CGJNQe8S17x|?#OdH@D}GY>(? zTwNB{B;bHdN9FePVo+|E7VG79d9g}#&acK1K-W?aq~8WP@t0e@9_IdZFM0L#FgjWF zbu=uvoWK_=MLEImPLKY*pZfB4bv8&;2h ze;>cl$McJ=NR3}HtRBy=z9QBCoMCnUi+%hz`uNLz{40I@Py6`a^zqmF_&@dW*ZcU_ zQ+yW!WK$UVq+gaD&ryTuXnao-GtYt5b5>24Sf21dA8~E zD1c9|&jz2~|9iow_m{DdKCd$P^nUIKpN^mV!S`sLcm&M$u3%KW4|s=s?NK-?K8X4s z@{y?c53}jgu;BZ!M;pb*dkoO1xPZF1YonqUJ5_yp!vLEFD%6%x)B~*J*@ zdYGT1Z2p+;(ap3{pnK@`9Q$FtRqB8Aaa}0RJ!+whr!iKb11JU`1>XHGN`?3kinCin z!Cc`u3O|cxw@yYpw=s=*Mq^V-=R4FXDf}uLW9K#CG3Iv=Psu7vD8CWb9))>2){Me$ zA>OO-IPpG(-$~3M2kk40Mu*{Q={cMr)@kT8aN$j;K*Y9|^9~ktDk8SE&LZU- zP=SbTt>Xa~^ra)VwN9IIouG(qt#g+0QB)veTkG)GTY-xM5!+hlJa9o@9b#MSe2Q`g z7l_!_I-db9=no~at#!UYIX4MJY-^n_0vCATAYxnVFs=$rs32ln>wF8iu$59Fh;6O& zec-}2N`)Y{wa&}Hg>g!SAhxy672pCBG>F*NIzIs}+(oGn#J1M?8E`=-Phwl^{EG6s zQGtkUt@B&pf=M_~jeHi~$sfU~h~-lj&OppSJe{*yBB*J*GNi?-H;X11L_y-ZcVE zrtdlMX?s71J+6iJmoQ z#!zNVe_P|j6oRf}Qyxak`7xE6`7t+PN^LZfuEU=Gd`g~vNo=vaF69xld|NSX9z~%& fxR7UKVi~MxBiMdHpvl^ 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/dfx_debug.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/dfx_debug.o new file mode 100644 index 0000000000000000000000000000000000000000..5d6b74ddfaaacb161060e4ce660a5dda3bed35b7 GIT binary patch literal 6172 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 literal 0 HcmV?d00001 diff --git a/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/dfx_log.o b/vendor/others/demo/5-tim_adc/demo/out/obj/drivers/debug/log/src/dfx_log.o new file mode 100644 index 0000000000000000000000000000000000000000..98ffc7c7c939966c584942df084a5758c6650dc0 GIT binary patch literal 40008 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

    E+bM$v^g9J_^l(AsX`ouL$}WWiX~8jq95+ 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: + + .section .text.entry + .global _start + .option norvc +_start: + j handle_reset + 3000004: 4fc0006f j 3000500 + +03000008 : +.endm + +/* The interrupt vector table must be aligned with 4 bytes */ +.align 2 +TrapHandler: + j TrapVector /* trap and INT 0 */ + 3000008: 4680006f j 3000470 + j TrapVector /* INT 1 */ + 300000c: 4640006f j 3000470 + j TrapVector /* INT 2 */ + 3000010: 4600006f j 3000470 + j TrapVector /* INT 3 */ + 3000014: 45c0006f j 3000470 + j TrapVector /* INT 4 */ + 3000018: 4580006f j 3000470 + j TrapVector /* INT 5 */ + 300001c: 4540006f j 3000470 + j TrapVector /* INT 6 */ + 3000020: 4500006f j 3000470 + j TrapVector /* INT 7 */ + 3000024: 44c0006f j 3000470 + j TrapVector /* INT 8 */ + 3000028: 4480006f j 3000470 + j TrapVector /* INT 9 */ + 300002c: 4440006f j 3000470 + j TrapVector /* INT 10 */ + 3000030: 4400006f j 3000470 + j TrapVector /* INT 11 */ + 3000034: 43c0006f j 3000470 + j TrapVector /* INT 12 */ + 3000038: 4380006f j 3000470 + j TrapVector /* INT 13 */ + 300003c: 4340006f j 3000470 + j TrapVector /* INT 14 */ + 3000040: 4300006f j 3000470 + j TrapVector /* INT 15 */ + 3000044: 42c0006f j 3000470 + j TrapVector /* INT 16 */ + 3000048: 4280006f j 3000470 + j TrapVector /* INT 17 */ + 300004c: 4240006f j 3000470 + j TrapVector /* INT 18 */ + 3000050: 4200006f j 3000470 + j TrapVector /* INT 19 */ + 3000054: 41c0006f j 3000470 + j TrapVector /* INT 20 */ + 3000058: 4180006f j 3000470 + j TrapVector /* INT 21 */ + 300005c: 4140006f j 3000470 + j TrapVector /* INT 22 */ + 3000060: 4100006f j 3000470 + j TrapVector /* INT 23 */ + 3000064: 40c0006f j 3000470 + j TrapVector /* INT 24 */ + 3000068: 4080006f j 3000470 + j TrapVector /* INT 25 */ + 300006c: 4040006f j 3000470 + + j IntHandler /* INT 26 */ + 3000070: 2640006f j 30002d4 + j IntHandler /* INT 27 */ + 3000074: 2600006f j 30002d4 + j IntHandler /* INT 28 */ + 3000078: 25c0006f j 30002d4 + j IntHandler /* INT 29 */ + 300007c: 2580006f j 30002d4 + j IntHandler /* INT 30 */ + 3000080: 2540006f j 30002d4 + j IntHandler /* INT 31 */ + 3000084: 2500006f j 30002d4 + j IntHandler /* INT 32 */ + 3000088: 24c0006f j 30002d4 + j IntHandler /* INT 33 */ + 300008c: 2480006f j 30002d4 + j IntHandler /* INT 34 */ + 3000090: 2440006f j 30002d4 + j IntHandler /* INT 35 */ + 3000094: 2400006f j 30002d4 + j IntHandler /* INT 36 */ + 3000098: 23c0006f j 30002d4 + j IntHandler /* INT 37 */ + 300009c: 2380006f j 30002d4 + j IntHandler /* INT 38 */ + 30000a0: 2340006f j 30002d4 + j IntHandler /* INT 39 */ + 30000a4: 2300006f j 30002d4 + j IntHandler /* INT 40 */ + 30000a8: 22c0006f j 30002d4 + j IntHandler /* INT 41 */ + 30000ac: 2280006f j 30002d4 + j IntHandler /* INT 42 */ + 30000b0: 2240006f j 30002d4 + j IntHandler /* INT 43 */ + 30000b4: 2200006f j 30002d4 + j IntHandler /* INT 44 */ + 30000b8: 21c0006f j 30002d4 + j IntHandler /* INT 45 */ + 30000bc: 2180006f j 30002d4 + j IntHandler /* INT 46 */ + 30000c0: 2140006f j 30002d4 + j IntHandler /* INT 47 */ + 30000c4: 2100006f j 30002d4 + j IntHandler /* INT 48 */ + 30000c8: 20c0006f j 30002d4 + j IntHandler /* INT 49 */ + 30000cc: 2080006f j 30002d4 + j IntHandler /* INT 50 */ + 30000d0: 2040006f j 30002d4 + j IntHandler /* INT 51 */ + 30000d4: 2000006f j 30002d4 + j IntHandler /* INT 52 */ + 30000d8: 1fc0006f j 30002d4 + j IntHandler /* INT 53 */ + 30000dc: 1f80006f j 30002d4 + j IntHandler /* INT 54 */ + 30000e0: 1f40006f j 30002d4 + j IntHandler /* INT 55 */ + 30000e4: 1f00006f j 30002d4 + j IntHandler /* INT 56 */ + 30000e8: 1ec0006f j 30002d4 + j IntHandler /* INT 57 */ + 30000ec: 1e80006f j 30002d4 + j IntHandler /* INT 58 */ + 30000f0: 1e40006f j 30002d4 + j IntHandler /* INT 59 */ + 30000f4: 1e00006f j 30002d4 + j IntHandler /* INT 60 */ + 30000f8: 1dc0006f j 30002d4 + j IntHandler /* INT 61 */ + 30000fc: 1d80006f j 30002d4 + j IntHandler /* INT 62 */ + 3000100: 1d40006f j 30002d4 + j IntHandler /* INT 63 */ + 3000104: 1d00006f j 30002d4 + j IntHandler /* INT 64 */ + 3000108: 1cc0006f j 30002d4 + j IntHandler /* INT 65 */ + 300010c: 1c80006f j 30002d4 + j IntHandler /* INT 66 */ + 3000110: 1c40006f j 30002d4 + j IntHandler /* INT 67 */ + 3000114: 1c00006f j 30002d4 + j IntHandler /* INT 68 */ + 3000118: 1bc0006f j 30002d4 + j IntHandler /* INT 69 */ + 300011c: 1b80006f j 30002d4 + j IntHandler /* INT 70 */ + 3000120: 1b40006f j 30002d4 + j IntHandler /* INT 71 */ + 3000124: 1b00006f j 30002d4 + j IntHandler /* INT 72 */ + 3000128: 1ac0006f j 30002d4 + j IntHandler /* INT 73 */ + 300012c: 1a80006f j 30002d4 + j IntHandler /* INT 74 */ + 3000130: 1a40006f j 30002d4 + j IntHandler /* INT 75 */ + 3000134: 1a00006f j 30002d4 + j IntHandler /* INT 76 */ + 3000138: 19c0006f j 30002d4 + j IntHandler /* INT 77 */ + 300013c: 1980006f j 30002d4 + j IntHandler /* INT 78 */ + 3000140: 1940006f j 30002d4 + j IntHandler /* INT 79 */ + 3000144: 1900006f j 30002d4 + j IntHandler /* INT 80 */ + 3000148: 18c0006f j 30002d4 + j IntHandler /* INT 81 */ + 300014c: 1880006f j 30002d4 + j IntHandler /* INT 82 */ + 3000150: 1840006f j 30002d4 + j IntHandler /* INT 83 */ + 3000154: 1800006f j 30002d4 + j IntHandler /* INT 84 */ + 3000158: 17c0006f j 30002d4 + j IntHandler /* INT 85 */ + 300015c: 1780006f j 30002d4 + j IntHandler /* INT 86 */ + 3000160: 1740006f j 30002d4 + j IntHandler /* INT 87 */ + 3000164: 1700006f j 30002d4 + j IntHandler /* INT 88 */ + 3000168: 16c0006f j 30002d4 + j IntHandler /* INT 89 */ + 300016c: 1680006f j 30002d4 + j IntHandler /* INT 90 */ + 3000170: 1640006f j 30002d4 + j IntHandler /* INT 91 */ + 3000174: 1600006f j 30002d4 + j IntHandler /* INT 92 */ + 3000178: 15c0006f j 30002d4 + j IntHandler /* INT 93 */ + 300017c: 1580006f j 30002d4 + j IntHandler /* INT 94 */ + 3000180: 1540006f j 30002d4 + j IntHandler /* INT 95 */ + 3000184: 1500006f j 30002d4 + j IntHandler /* INT 96 */ + 3000188: 14c0006f j 30002d4 + j IntHandler /* INT 97 */ + 300018c: 1480006f j 30002d4 + j IntHandler /* INT 98 */ + 3000190: 1440006f j 30002d4 + j IntHandler /* INT 99 */ + 3000194: 1400006f j 30002d4 + j IntHandler /* INT 100 */ + 3000198: 13c0006f j 30002d4 + j IntHandler /* INT 101 */ + 300019c: 1380006f j 30002d4 + j IntHandler /* INT 102 */ + 30001a0: 1340006f j 30002d4 + j IntHandler /* INT 103 */ + 30001a4: 1300006f j 30002d4 + j IntHandler /* INT 104 */ + 30001a8: 12c0006f j 30002d4 + j IntHandler /* INT 105 */ + 30001ac: 1280006f j 30002d4 + j IntHandler /* INT 106 */ + 30001b0: 1240006f j 30002d4 + j IntHandler /* INT 107 */ + 30001b4: 1200006f j 30002d4 + j IntHandler /* INT 108 */ + 30001b8: 11c0006f j 30002d4 + j IntHandler /* INT 109 */ + 30001bc: 1180006f j 30002d4 + j IntHandler /* INT 110 */ + 30001c0: 1140006f j 30002d4 + j IntHandler /* INT 111 */ + 30001c4: 1100006f j 30002d4 + j IntHandler /* INT 112 */ + 30001c8: 10c0006f j 30002d4 + j IntHandler /* INT 113 */ + 30001cc: 1080006f j 30002d4 + j IntHandler /* INT 114 */ + 30001d0: 1040006f j 30002d4 + j IntHandler /* INT 115 */ + 30001d4: 1000006f j 30002d4 + j IntHandler /* INT 116 */ + 30001d8: 0fc0006f j 30002d4 + j IntHandler /* INT 117 */ + 30001dc: 0f80006f j 30002d4 + j IntHandler /* INT 118 */ + 30001e0: 0f40006f j 30002d4 + j IntHandler /* INT 119 */ + 30001e4: 0f00006f j 30002d4 + j IntHandler /* INT 120 */ + 30001e8: 0ec0006f j 30002d4 + j IntHandler /* INT 121 */ + 30001ec: 0e80006f j 30002d4 + +030001f0 : + +.align 2 +NmiEntry: + SAVE_SYSERR_REGS + 30001f0: f9010113 addi sp,sp,-112 + 30001f4: 04812023 sw s0,64(sp) + 30001f8: 04912223 sw s1,68(sp) + 30001fc: 05212423 sw s2,72(sp) + 3000200: 05312623 sw s3,76(sp) + 3000204: 05412823 sw s4,80(sp) + 3000208: 05512a23 sw s5,84(sp) + 300020c: 05612c23 sw s6,88(sp) + 3000210: 05712e23 sw s7,92(sp) + 3000214: 07812023 sw s8,96(sp) + 3000218: 07912223 sw s9,100(sp) + 300021c: 07a12423 sw s10,104(sp) + 3000220: 07b12623 sw s11,108(sp) + 3000224: 11010593 addi a1,sp,272 + 3000228: 06b12823 sw a1,112(sp) + 300022c: 06312a23 sw gp,116(sp) + 3000230: 06412c23 sw tp,120(sp) + 3000234: 34102573 csrr a0,mepc + 3000238: 300025f3 csrr a1,mstatus + 300023c: 34302673 csrr a2,mtval + 3000240: 342026f3 csrr a3,mcause + 3000244: 06a12e23 sw a0,124(sp) + 3000248: 08b12023 sw a1,128(sp) + 300024c: 08c12223 sw a2,132(sp) + 3000250: 08d12423 sw a3,136(sp) + 3000254: 00010513 mv a0,sp + call SysErrNmiEntry + 3000258: 384020ef jal ra,30025dc + +0300025c : +deadLoop1: + tail deadLoop1 + 300025c: a001 j 300025c + nop + 300025e: 00000013 nop + +03000262 : + +.align 2 +TrapEntry: + SAVE_SYSERR_REGS + 3000262: f9010113 addi sp,sp,-112 + 3000266: 04812023 sw s0,64(sp) + 300026a: 04912223 sw s1,68(sp) + 300026e: 05212423 sw s2,72(sp) + 3000272: 05312623 sw s3,76(sp) + 3000276: 05412823 sw s4,80(sp) + 300027a: 05512a23 sw s5,84(sp) + 300027e: 05612c23 sw s6,88(sp) + 3000282: 05712e23 sw s7,92(sp) + 3000286: 07812023 sw s8,96(sp) + 300028a: 07912223 sw s9,100(sp) + 300028e: 07a12423 sw s10,104(sp) + 3000292: 07b12623 sw s11,108(sp) + 3000296: 11010593 addi a1,sp,272 + 300029a: 06b12823 sw a1,112(sp) + 300029e: 06312a23 sw gp,116(sp) + 30002a2: 06412c23 sw tp,120(sp) + 30002a6: 34102573 csrr a0,mepc + 30002aa: 300025f3 csrr a1,mstatus + 30002ae: 34302673 csrr a2,mtval + 30002b2: 342026f3 csrr a3,mcause + 30002b6: 06a12e23 sw a0,124(sp) + 30002ba: 08b12023 sw a1,128(sp) + 30002be: 08c12223 sw a2,132(sp) + 30002c2: 08d12423 sw a3,136(sp) + 30002c6: 00010513 mv a0,sp + /* Exception run with interrupts masked */ + csrc mstatus, MSTATUS_MIE + 30002ca: 30047073 csrci mstatus,8 + call SysErrExcEntry + 30002ce: 2f0020ef jal ra,30025be + +030002d2 : +deadLoop2: + tail deadLoop2 + 30002d2: a001 j 30002d2 + +030002d4 : + +.align 2 +IntHandler: + addi sp, sp, -(TOTAL_INT_SIZE_ON_STACK) + 30002d4: f6010113 addi sp,sp,-160 + + SREG a0, 3 * REGBYTES(sp) + 30002d8: 00a12623 sw a0,12(sp) + SREG a1, 4 * REGBYTES(sp) + 30002dc: 00b12823 sw a1,16(sp) +#endif + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + csrr a0, mcause +#else + csrr a0, cipri + 30002e0: 7ed02573 csrr a0,0x7ed + csrr a1, prithd + 30002e4: bfe025f3 csrr a1,0xbfe + csrw prithd, a0 /* read prithd */ + 30002e8: bfe51073 csrw 0xbfe,a0 + SREG a1, 6 * REGBYTES(sp) /* save prithd */ + 30002ec: 00b12c23 sw a1,24(sp) + csrr a1, mstatus /* read mstatus */ + 30002f0: 300025f3 csrr a1,mstatus + SREG a1, 7 * REGBYTES(sp) /* save mstatus */ + 30002f4: 00b12e23 sw a1,28(sp) + csrr a1, mepc /* read mepc */ + 30002f8: 341025f3 csrr a1,mepc + SREG a1, 8 * REGBYTES(sp) /* save mepc */ + 30002fc: 02b12023 sw a1,32(sp) + + csrr a0, mcause + 3000300: 34202573 csrr a0,mcause + + li a1, (3<<11) + 3000304: 000025b7 lui a1,0x2 + 3000308: 80058593 addi a1,a1,-2048 # 1800 + csrs mstatus, a1 + 300030c: 3005a073 csrs mstatus,a1 + la a1, custom_nested_irq_main_handler_entry + 3000310: 00000597 auipc a1,0x0 + 3000314: 01058593 addi a1,a1,16 # 3000320 + csrw mepc, a1 + 3000318: 34159073 csrw mepc,a1 + mret + 300031c: 30200073 mret + +03000320 : +#endif + +.align 2 +custom_nested_irq_main_handler_entry: + SREG t0, 0 * REGBYTES(sp) + 3000320: 00512023 sw t0,0(sp) + SREG t1, 1 * REGBYTES(sp) + 3000324: 00612223 sw t1,4(sp) + SREG t2, 2 * REGBYTES(sp) + 3000328: 00712423 sw t2,8(sp) + SREG a2, 5 * REGBYTES(sp) + 300032c: 00c12a23 sw a2,20(sp) + SREG ra, 9 * REGBYTES(sp) + 3000330: 02112223 sw ra,36(sp) + SREG a3, 10 * REGBYTES(sp) + 3000334: 02d12423 sw a3,40(sp) + SREG a4, 11 * REGBYTES(sp) + 3000338: 02e12623 sw a4,44(sp) + SREG a5, 12 * REGBYTES(sp) + 300033c: 02f12823 sw a5,48(sp) + SREG a6, 13 * REGBYTES(sp) + 3000340: 03012a23 sw a6,52(sp) + SREG a7, 14 * REGBYTES(sp) + 3000344: 03112c23 sw a7,56(sp) + SREG t3, 15 * REGBYTES(sp) + 3000348: 03c12e23 sw t3,60(sp) + SREG t4, 16 * REGBYTES(sp) + 300034c: 05d12023 sw t4,64(sp) + SREG t5, 17 * REGBYTES(sp) + 3000350: 05e12223 sw t5,68(sp) + SREG t6, 18 * REGBYTES(sp) + 3000354: 05f12423 sw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FSREG f0, 19 * REGBYTES(sp) + 3000358: 04012627 fsw ft0,76(sp) + FSREG f1, 20 * REGBYTES(sp) + 300035c: 04112827 fsw ft1,80(sp) + FSREG f2, 21 * REGBYTES(sp) + 3000360: 04212a27 fsw ft2,84(sp) + FSREG f3, 22 * REGBYTES(sp) + 3000364: 04312c27 fsw ft3,88(sp) + FSREG f4, 23 * REGBYTES(sp) + 3000368: 04412e27 fsw ft4,92(sp) + FSREG f5, 24 * REGBYTES(sp) + 300036c: 06512027 fsw ft5,96(sp) + FSREG f6, 25 * REGBYTES(sp) + 3000370: 06612227 fsw ft6,100(sp) + FSREG f7, 26 * REGBYTES(sp) + 3000374: 06712427 fsw ft7,104(sp) + FSREG f10, 27 * REGBYTES(sp) + 3000378: 06a12627 fsw fa0,108(sp) + FSREG f11, 28 * REGBYTES(sp) + 300037c: 06b12827 fsw fa1,112(sp) + FSREG f12, 29 * REGBYTES(sp) + 3000380: 06c12a27 fsw fa2,116(sp) + FSREG f13, 30 * REGBYTES(sp) + 3000384: 06d12c27 fsw fa3,120(sp) + FSREG f14, 31 * REGBYTES(sp) + 3000388: 06e12e27 fsw fa4,124(sp) + FSREG f15, 32 * REGBYTES(sp) + 300038c: 08f12027 fsw fa5,128(sp) + FSREG f16, 33 * REGBYTES(sp) + 3000390: 09012227 fsw fa6,132(sp) + FSREG f17, 34 * REGBYTES(sp) + 3000394: 09112427 fsw fa7,136(sp) + FSREG f28, 35 * REGBYTES(sp) + 3000398: 09c12627 fsw ft8,140(sp) + FSREG f29, 36 * REGBYTES(sp) + 300039c: 09d12827 fsw ft9,144(sp) + FSREG f30, 37 * REGBYTES(sp) + 30003a0: 09e12a27 fsw ft10,148(sp) + FSREG f31, 38 * REGBYTES(sp) + 30003a4: 09f12c27 fsw ft11,152(sp) +#endif + + andi a0, a0, MCAUSE_MASK_INT_NUM + 30003a8: 0ff57513 andi a0,a0,255 + call InterruptEntry + 30003ac: 7a3010ef jal ra,300234e + + LREG t1, 1 * REGBYTES(sp) + 30003b0: 00412303 lw t1,4(sp) + LREG t2, 2 * REGBYTES(sp) + 30003b4: 00812383 lw t2,8(sp) + LREG a2, 5 * REGBYTES(sp) + 30003b8: 01412603 lw a2,20(sp) + LREG ra, 9 * REGBYTES(sp) + 30003bc: 02412083 lw ra,36(sp) + LREG a3, 10 * REGBYTES(sp) + 30003c0: 02812683 lw a3,40(sp) + LREG a4, 11 * REGBYTES(sp) + 30003c4: 02c12703 lw a4,44(sp) + LREG a5, 12 * REGBYTES(sp) + 30003c8: 03012783 lw a5,48(sp) + LREG a6, 13 * REGBYTES(sp) + 30003cc: 03412803 lw a6,52(sp) + LREG a7, 14 * REGBYTES(sp) + 30003d0: 03812883 lw a7,56(sp) + LREG t3, 15 * REGBYTES(sp) + 30003d4: 03c12e03 lw t3,60(sp) + LREG t4, 16 * REGBYTES(sp) + 30003d8: 04012e83 lw t4,64(sp) + LREG t5, 17 * REGBYTES(sp) + 30003dc: 04412f03 lw t5,68(sp) + LREG t6, 18 * REGBYTES(sp) + 30003e0: 04812f83 lw t6,72(sp) + +#ifdef FLOAT_SUPPORT + FLREG f0, 19 * REGBYTES(sp) + 30003e4: 04c12007 flw ft0,76(sp) + FLREG f1, 20 * REGBYTES(sp) + 30003e8: 05012087 flw ft1,80(sp) + FLREG f2, 21 * REGBYTES(sp) + 30003ec: 05412107 flw ft2,84(sp) + FLREG f3, 22 * REGBYTES(sp) + 30003f0: 05812187 flw ft3,88(sp) + FLREG f4, 23 * REGBYTES(sp) + 30003f4: 05c12207 flw ft4,92(sp) + FLREG f5, 24 * REGBYTES(sp) + 30003f8: 06012287 flw ft5,96(sp) + FLREG f6, 25 * REGBYTES(sp) + 30003fc: 06412307 flw ft6,100(sp) + FLREG f7, 26 * REGBYTES(sp) + 3000400: 06812387 flw ft7,104(sp) + FLREG f10, 27 * REGBYTES(sp) + 3000404: 06c12507 flw fa0,108(sp) + FLREG f11, 28 * REGBYTES(sp) + 3000408: 07012587 flw fa1,112(sp) + FLREG f12, 29 * REGBYTES(sp) + 300040c: 07412607 flw fa2,116(sp) + FLREG f13, 30 * REGBYTES(sp) + 3000410: 07812687 flw fa3,120(sp) + FLREG f14, 31 * REGBYTES(sp) + 3000414: 07c12707 flw fa4,124(sp) + FLREG f15, 32 * REGBYTES(sp) + 3000418: 08012787 flw fa5,128(sp) + FLREG f16, 33 * REGBYTES(sp) + 300041c: 08412807 flw fa6,132(sp) + FLREG f17, 34 * REGBYTES(sp) + 3000420: 08812887 flw fa7,136(sp) + FLREG f28, 35 * REGBYTES(sp) + 3000424: 08c12e07 flw ft8,140(sp) + FLREG f29, 36 * REGBYTES(sp) + 3000428: 09012e87 flw ft9,144(sp) + FLREG f30, 37 * REGBYTES(sp) + 300042c: 09412f07 flw ft10,148(sp) + FLREG f31, 38 * REGBYTES(sp) + 3000430: 09812f87 flw ft11,152(sp) + +03000434 : + */ + +#if defined(HARD_NESTED_IRQ_SUPPORT) && (HARD_NESTED_IRQ_SUPPORT == 1) + LREG t0, 0 * REGBYTES(sp) +#else + LREG a0, 7 * REGBYTES(sp) /* load mstatus */ + 3000434: 01c12503 lw a0,28(sp) + csrr t0, mstatus + 3000438: 300022f3 csrr t0,mstatus + LREG a1, 8 * REGBYTES(sp) /* load mepc */ + 300043c: 02012583 lw a1,32(sp) + andi t0, t0, MSTATUS_MIE + 3000440: 0082f293 andi t0,t0,8 + bnei t0, 0, restore_mstatus + 3000444: 0002923b bnei t0,0,300044c + andi a0, a0, ~(MSTATUS_MIE | MSTATUS_MPIE) + 3000448: f7757513 andi a0,a0,-137 + +0300044c : +restore_mstatus: + csrw mstatus, a0 + 300044c: 30051073 csrw mstatus,a0 + + LREG t0, 0 * REGBYTES(sp) + 3000450: 00012283 lw t0,0(sp) + csrw mepc, a1 + 3000454: 34159073 csrw mepc,a1 + LREG a0, 6 * REGBYTES(sp) /* load prithd */ + 3000458: 01812503 lw a0,24(sp) + csrw prithd, a0 + 300045c: bfe51073 csrw 0xbfe,a0 + lw a1, (a0) + addi a1, a1, -1 + sw a1, (a0) +#endif + + LREG a1, 4 * REGBYTES(sp) /* 2 consecutive csrw instructions will have a bubble */ + 3000460: 01012583 lw a1,16(sp) + + LREG a0, 3 * REGBYTES(sp) + 3000464: 00c12503 lw a0,12(sp) + + addi sp, sp, TOTAL_INT_SIZE_ON_STACK + 3000468: 0a010113 addi sp,sp,160 + + mret + 300046c: 30200073 mret + +03000470 : + +.align 2 +TrapVector: + push_reg + 3000470: f6010113 addi sp,sp,-160 + 3000474: fff11f8b stmia {ra,t0-t6,a0-a7},(sp) + 3000478: f6010113 addi sp,sp,-160 + csrr a0, mcause + 300047c: 34202573 csrr a0,mcause + li t1, MCAUSE_ECALL_FROM_MMODE + 3000480: 00b00313 li t1,11 +#if defined(USER_MODE_ENABLE) && (USER_MODE_ENABLE == 1) + beq a0, t1, switch_to_umode +#else + beq a0, t1, switch_to_mmode + 3000484: 02650c63 beq a0,t1,30004bc +#endif + li t1, MCAUSE_ECALL_FROM_UMODE + 3000488: 00800313 li t1,8 + beq a0, t1, switch_to_mmode + 300048c: 02650863 beq a0,t1,30004bc + + li a1, MCAUSE_MASK_INT_BIT + 3000490: 800005b7 lui a1,0x80000 + li a2, MCAUSE_MASK_INT_NUM + 3000494: 0ff00613 li a2,255 + and a1, a0, a1 + 3000498: 00b575b3 and a1,a0,a1 + and a0, a0, a2 + 300049c: 00c57533 and a0,a0,a2 + + li a2, 0xc + 30004a0: 00c00613 li a2,12 + beq a0, a2, NmiEntry + 30004a4: d4c506e3 beq a0,a2,30001f0 + beqz a1, TrapEntry + 30004a8: da058de3 beqz a1,3000262 + pop_reg + 30004ac: 0a010113 addi sp,sp,160 + 30004b0: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004b4: 0a010113 addi sp,sp,160 + mret + 30004b8: 30200073 mret + +030004bc : + mret +#endif + +.align 2 +switch_to_mmode: + li t2, MSTATUS_MPP_MACHINE + 30004bc: 000023b7 lui t2,0x2 + 30004c0: 80038393 addi t2,t2,-2048 # 1800 + csrs mstatus, t2 + 30004c4: 3003a073 csrs mstatus,t2 + csrr t0, mepc + 30004c8: 341022f3 csrr t0,mepc + addi t0, t0, 4 + 30004cc: 00428293 addi t0,t0,4 + csrw mepc, t0 + 30004d0: 34129073 csrw mepc,t0 + pop_reg + 30004d4: 0a010113 addi sp,sp,160 + 30004d8: fff10f8b ldmia {ra,t0-t6,a0-a7},(sp) + 30004dc: 0a010113 addi sp,sp,160 + mret + 30004e0: 30200073 mret + +030004e4 : + +.align 2 +mem_cpy: + bge t0, t2, cpy_done + 30004e4: 0072dc63 bge t0,t2,30004fc + lw t3, (t1) + 30004e8: 00032e03 lw t3,0(t1) + sw t3, (t0) + 30004ec: 01c2a023 sw t3,0(t0) + addi t0, t0, 4 + 30004f0: 00428293 addi t0,t0,4 + addi t1, t1, 4 + 30004f4: 00430313 addi t1,t1,4 + j mem_cpy + 30004f8: fedff06f j 30004e4 + +030004fc : +cpy_done: + ret + 30004fc: 00008067 ret + +03000500 : + +.align 2 +handle_reset: + csrwi mstatus, 0 + 3000500: 30005073 csrwi mstatus,0 + csrwi mie, 0 + 3000504: 30405073 csrwi mie,0 + csrci mstatus, 0x08 + 3000508: 30047073 csrci mstatus,8 + la t0, TrapHandler + 300050c: 00000297 auipc t0,0x0 + 3000510: afc28293 addi t0,t0,-1284 # 3000008 + addi t0, t0, 1 + 3000514: 00128293 addi t0,t0,1 + csrw mtvec, t0 + 3000518: 30529073 csrw mtvec,t0 + csrwi 0x7EF, 0x1 /* lock mtvec */ + 300051c: 7ef0d073 csrwi 0x7ef,1 + +03000520 : + csrwi 0x7C8, 0x1 /* enable hardware nest interrupt support */ +#endif + +flash_init: +/* eflash prefetch enable */ + li t0, EFC_BASE_ADDR + 3000520: 147102b7 lui t0,0x14710 + lw t1, 0x120(t0) + 3000524: 1202a303 lw t1,288(t0) # 14710120 + ori t1, t1, 1 + 3000528: 00136313 ori t1,t1,1 + sw t1, 0x120(t0) + 300052c: 1262a023 sw t1,288(t0) + +/* eflash cache enable */ + lw t1, 0x124(t0) + 3000530: 1242a303 lw t1,292(t0) + ori t1, t1, 1 + 3000534: 00136313 ori t1,t1,1 + sw t1, 0x124(t0) + 3000538: 1262a223 sw t1,292(t0) + +/* enable flash cmd */ + li t0, EFC_MAGIC_NUMBER + 300053c: fedcc2b7 lui t0,0xfedcc + 3000540: a9828293 addi t0,t0,-1384 # fedcba98 + li t1, EFC_MAGIC_LOCK_RW + 3000544: 14710337 lui t1,0x14710 + 3000548: 20030313 addi t1,t1,512 # 14710200 + sw t0, (t1) + 300054c: 00532023 sw t0,0(t1) + +/* initialize global pointer */ + .option push + .option norelax + la gp, __global_pointer$ + 3000550: 01001197 auipc gp,0x1001 + 3000554: bc418193 addi gp,gp,-1084 # 4001114 <__global_pointer$> + .option pop + +/* initialize stack pointer */ + la sp, __stack_top + 3000558: 01007117 auipc sp,0x1007 + 300055c: 6a810113 addi sp,sp,1704 # 4007c00 <__INTERRUPT_STACK_BEGIN__> + +/* timer0 interrupt enable */ + li t0, TIMER0_CONTROL + 3000560: 143002b7 lui t0,0x14300 + 3000564: 00828293 addi t0,t0,8 # 14300008 + lw t1, (t0) + 3000568: 0002a303 lw t1,0(t0) + andi t1, t1, TIMER0_INTENABLE + 300056c: 02037313 andi t1,t1,32 + sw t1, (t0) + 3000570: 0062a023 sw t1,0(t0) + +/* uart0 deinit */ + li t0, 0x14000000 + 3000574: 140002b7 lui t0,0x14000 + li t1, 0 + 3000578: 00000313 li t1,0 + sw t1, IBRD_OFFSET(t0) + 300057c: 0262a223 sw t1,36(t0) # 14000024 + sw t1, FBRD_OFFSET(t0) + 3000580: 0262a423 sw t1,40(t0) + sw t1, LCR_H_OFFSET(t0) + 3000584: 0262a623 sw t1,44(t0) + sw t1, CR_OFFSET(t0) + 3000588: 0262a823 sw t1,48(t0) + sw t1, DMACR_OFFSET(t0) + 300058c: 0462a423 sw t1,72(t0) + +03000590 : + +/* perform the rest of initialization in C */ +clear_sram: + /* clear sysram parity error */ + li t0, SYSRAM_ERROR + 3000590: 101082b7 lui t0,0x10108 + 3000594: 30028293 addi t0,t0,768 # 10108300 + lw t1, (t0) + 3000598: 0002a303 lw t1,0(t0) + ori t1, t1, 1 + 300059c: 00136313 ori t1,t1,1 + sw t1, (t0) + 30005a0: 0062a023 sw t1,0(t0) + + la t0, SRAM_START + 30005a4: 01000297 auipc t0,0x1000 + 30005a8: a5c28293 addi t0,t0,-1444 # 4000000 + la t1, SRAM_END + 30005ac: 01008317 auipc t1,0x1008 + 30005b0: a5430313 addi t1,t1,-1452 # 4008000 + li t2, 0 + 30005b4: 00000393 li t2,0 + +030005b8 : + +clear_sram_loop: + sw t2, (t0) /* clear all sram */ + 30005b8: 0072a023 sw t2,0(t0) + addi t0, t0, 4 /* increment clear index pointer */ + 30005bc: 00428293 addi t0,t0,4 + blt t0, t1, clear_sram_loop /* are we at the end yet, if not , contiue till the end */ + 30005c0: fe62cce3 blt t0,t1,30005b8 + +030005c4 : + +start_coderom_code_copy: + la t0, __sram_code_start_addr /* SRAM addr */ + 30005c4: ff000297 auipc t0,0xff000 + 30005c8: a3c28293 addi t0,t0,-1476 # 2000000 + la t1, __sram_code_load_addr /* ROM addr */ + 30005cc: 00000317 auipc t1,0x0 + 30005d0: 13830313 addi t1,t1,312 # 3000704 + la t2, __sram_code_end_addr + 30005d4: ff000397 auipc t2,0xff000 + 30005d8: a2c38393 addi t2,t2,-1492 # 2000000 + jal mem_cpy + 30005dc: f09ff0ef jal ra,30004e4 + +030005e0 : + +start_reserved_data_copy: + la t0, __reserved_code_start_addr /* SRAM addr */ + 30005e0: 01000297 auipc t0,0x1000 + 30005e4: a2028293 addi t0,t0,-1504 # 4000000 + la t1, __reserved_code_load_addr /* ROM addr */ + 30005e8: 00000317 auipc t1,0x0 + 30005ec: 11c30313 addi t1,t1,284 # 3000704 + la t2, __reserved_code_end_addr + 30005f0: 01000397 auipc t2,0x1000 + 30005f4: a1038393 addi t2,t2,-1520 # 4000000 + jal mem_cpy + 30005f8: eedff0ef jal ra,30004e4 + +030005fc : + +start_coderom_data_copy: + la t0, __data_start /* SRAM addr */ + 30005fc: 01000297 auipc t0,0x1000 + 3000600: a2428293 addi t0,t0,-1500 # 4000020 + la t1, __data_load /* ROM addr */ + 3000604: 00006317 auipc t1,0x6 + 3000608: 55030313 addi t1,t1,1360 # 3006b54 <__data_load> + la t2, __data_end + 300060c: 01000397 auipc t2,0x1000 + 3000610: af038393 addi t2,t2,-1296 # 40000fc + jal mem_cpy + 3000614: ed1ff0ef jal ra,30004e4 + +03000618 : + +pmp_init: + li t0, 0xB00 + 3000618: 000012b7 lui t0,0x1 + 300061c: b0028293 addi t0,t0,-1280 # b00 + csrw pmpaddr0, t0 + 3000620: 3b029073 csrw pmpaddr0,t0 + li t0, 0x400400 /* 0x2C00~0x1000FFF, BOOTROM, enable R+X */ + 3000624: 004002b7 lui t0,0x400 + 3000628: 40028293 addi t0,t0,1024 # 400400 + csrw pmpaddr1, t0 + 300062c: 3b129073 csrw pmpaddr1,t0 + li t0, 0x800000 /* 0x1001000~0x1FFFFFF, Reserved: diable R+X+W */ + 3000630: 008002b7 lui t0,0x800 + csrw pmpaddr2, t0 + 3000634: 3b229073 csrw pmpaddr2,t0 + li t0, 0x802000 /* 0x2000000~0x2007FFF, SYSRAM_ITCM */ + 3000638: 008022b7 lui t0,0x802 + csrw pmpaddr3, t0 + 300063c: 3b329073 csrw pmpaddr3,t0 + li t0, 0xC00000 /* 0x2008000 ~ 0x2FFFFFF, Reserved: disable R+X+W */ + 3000640: 00c002b7 lui t0,0xc00 + csrw pmpaddr4, t0 + 3000644: 3b429073 csrw pmpaddr4,t0 + li t0, 0x1000000 /* 0x3000000 ~ 0x03FFFFFF: EFLASH: enable R+X */ + 3000648: 010002b7 lui t0,0x1000 + csrw pmpaddr5, t0 + 300064c: 3b529073 csrw pmpaddr5,t0 + li t0, 0x1002000 /* 0x4000000 ~ 0x04007FFF: SYSTEM_DTCM enable R+W */ + 3000650: 010022b7 lui t0,0x1002 + csrw pmpaddr6, t0 + 3000654: 3b629073 csrw pmpaddr6,t0 + li t0,0x7000400 /* 0x4008000 ~ 0x01C000FFF: REGISTER R+W */ + 3000658: 070002b7 lui t0,0x7000 + 300065c: 40028293 addi t0,t0,1024 # 7000400 + csrw pmpaddr7, t0 + 3000660: 3b729073 csrw pmpaddr7,t0 + + li t0,0xf3333333 /* register TOR-R-W */ + 3000664: f33332b7 lui t0,0xf3333 + 3000668: 33328293 addi t0,t0,819 # f3333333 + csrw 0x7d8,t0 + 300066c: 7d829073 csrw 0x7d8,t0 + li t0,0x0d080d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + csrw pmpcfg0,t0 + li t0,0x0b0b0d08 + csrw pmpcfg1,t0 +#else + li t0,0x8d888d8b /* 0x0d:TOR-R-X; 0x0b:TOR-R-W; 0x08:TOR; 0x0c:TOR-x; 0x09:TOR-R */ + 3000670: 8d8892b7 lui t0,0x8d889 + 3000674: d8b28293 addi t0,t0,-629 # 8d888d8b + csrw pmpcfg0,t0 + 3000678: 3a029073 csrw pmpcfg0,t0 + li t0,0x8b8b8d88 + 300067c: 8b8b92b7 lui t0,0x8b8b9 + 3000680: d8828293 addi t0,t0,-632 # 8b8b8d88 + csrw pmpcfg1,t0 + 3000684: 3a129073 csrw pmpcfg1,t0 +#endif + +/* disable Icache */ + csrwi 0x7C0, 0x0 /* disable ICACHE */ + 3000688: 7c005073 csrwi 0x7c0,0 + fence + 300068c: 0ff0000f fence + +/* disable Dcache */ + csrwi 0x7C1, 0x0 /* disable DCACHE */ + 3000690: 7c105073 csrwi 0x7c1,0 + fence + 3000694: 0ff0000f fence + +/* support float and mie */ + li t0,0x2008 + 3000698: 000022b7 lui t0,0x2 + 300069c: 00828293 addi t0,t0,8 # 2008 + csrs mstatus,t0 + 30006a0: 3002a073 csrs mstatus,t0 + li t0,0x20 + 30006a4: 02000293 li t0,32 + csrs misa,t0 + 30006a8: 3012a073 csrs misa,t0 + +/* Interrupt set default priority = 1*/ + li t0, 0x11111111 + 30006ac: 111112b7 lui t0,0x11111 + 30006b0: 11128293 addi t0,t0,273 # 11111111 + csrw locipri0, t0 + 30006b4: bc029073 csrw 0xbc0,t0 + csrw locipri1, t0 + 30006b8: bc129073 csrw 0xbc1,t0 + csrw locipri2, t0 + 30006bc: bc229073 csrw 0xbc2,t0 + csrw locipri3, t0 + 30006c0: bc329073 csrw 0xbc3,t0 + csrw locipri4, t0 + 30006c4: bc429073 csrw 0xbc4,t0 + csrw locipri5, t0 + 30006c8: bc529073 csrw 0xbc5,t0 + csrw locipri6, t0 + 30006cc: bc629073 csrw 0xbc6,t0 + csrw locipri7, t0 + 30006d0: bc729073 csrw 0xbc7,t0 + csrw locipri8, t0 + 30006d4: bc829073 csrw 0xbc8,t0 + csrw locipri9, t0 + 30006d8: bc929073 csrw 0xbc9,t0 + csrw locipri10, t0 + 30006dc: bca29073 csrw 0xbca,t0 + csrw locipri11, t0 + 30006e0: bcb29073 csrw 0xbcb,t0 + csrw locipri12, t0 + 30006e4: bcc29073 csrw 0xbcc,t0 + csrw locipri13, t0 + 30006e8: bcd29073 csrw 0xbcd,t0 + csrw locipri14, t0 + 30006ec: bce29073 csrw 0xbce,t0 + csrw locipri15, t0 + 30006f0: bcf29073 csrw 0xbcf,t0 + + ecall + 30006f4: 00000073 ecall + jal Chip_Init + 30006f8: 014000ef jal ra,300070c + +/* jump to C func. */ + jal main + 30006fc: 626050ef jal ra,3005d22